@photostructure/fs-metadata 0.1.3 → 0.1.4
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/dist/cjs/{async.js → async.cjs} +2 -2
- package/dist/cjs/{debuglog.js → debuglog.cjs} +1 -1
- package/dist/cjs/{error.js → error.cjs} +3 -3
- package/dist/cjs/{exports.js → exports.cjs} +2 -2
- package/dist/cjs/{fs.js → fs.cjs} +1 -1
- package/dist/cjs/{glob.js → glob.cjs} +2 -2
- package/dist/cjs/{hidden.js → hidden.cjs} +4 -4
- package/dist/cjs/index.cjs +2 -2
- package/dist/cjs/linux/{dev_disk.js → dev_disk.cjs} +2 -2
- package/dist/cjs/linux/{mount_points.js → mount_points.cjs} +7 -7
- package/dist/cjs/linux/{mtab.js → mtab.cjs} +5 -5
- package/dist/cjs/{mount_point.js → mount_point.cjs} +9 -9
- package/dist/cjs/{object.js → object.cjs} +1 -1
- package/dist/cjs/{options.js → options.cjs} +2 -2
- package/dist/cjs/{path.js → path.cjs} +2 -2
- package/dist/cjs/{remote_info.js → remote_info.cjs} +4 -4
- package/dist/cjs/{setup.js → setup.cjs} +7 -7
- package/dist/cjs/{system_volume.js → system_volume.cjs} +6 -6
- package/dist/cjs/{unc.js → unc.cjs} +1 -1
- package/dist/cjs/{uuid.js → uuid.cjs} +1 -1
- package/dist/cjs/{volume_health_status.js → volume_health_status.cjs} +6 -6
- package/dist/cjs/{volume_metadata.js → volume_metadata.cjs} +17 -17
- package/dist/{esm/array.d.ts → types/array.js} +25 -6
- package/dist/types/array.js.map +1 -0
- package/dist/types/async.js +109 -0
- package/dist/types/async.js.map +1 -0
- package/dist/types/cache.js +25 -0
- package/dist/types/cache.js.map +1 -0
- package/dist/types/debuglog.js +30 -0
- package/dist/types/debuglog.js.map +1 -0
- package/dist/types/defer.js +23 -0
- package/dist/types/defer.js.map +1 -0
- package/dist/types/error.js +58 -0
- package/dist/types/error.js.map +1 -0
- package/dist/types/exports.js +4 -0
- package/dist/types/exports.js.map +1 -0
- package/dist/types/fs.js +73 -0
- package/dist/types/fs.js.map +1 -0
- package/dist/types/glob.js +113 -0
- package/dist/types/glob.js.map +1 -0
- package/dist/types/hidden.js +155 -0
- package/dist/types/hidden.js.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/linux/dev_disk.js +61 -0
- package/dist/types/linux/dev_disk.js.map +1 -0
- package/dist/types/linux/mount_points.js +77 -0
- package/dist/types/linux/mount_points.js.map +1 -0
- package/dist/types/linux/mtab.js +82 -0
- package/dist/types/linux/mtab.js.map +1 -0
- package/dist/types/mount_point.js +63 -0
- package/dist/types/mount_point.js.map +1 -0
- package/dist/types/number.js +32 -0
- package/dist/types/number.js.map +1 -0
- package/dist/types/object.js +52 -0
- package/dist/types/object.js.map +1 -0
- package/dist/types/options.js +111 -0
- package/dist/types/options.js.map +1 -0
- package/dist/types/path.js +44 -0
- package/dist/types/path.js.map +1 -0
- package/dist/types/platform.js +7 -0
- package/dist/types/platform.js.map +1 -0
- package/dist/types/random.js +37 -0
- package/dist/types/random.js.map +1 -0
- package/dist/types/remote_info.js +116 -0
- package/dist/types/remote_info.js.map +1 -0
- package/dist/types/setup.js +41 -0
- package/dist/types/setup.js.map +1 -0
- package/dist/types/string.js +78 -0
- package/dist/types/string.js.map +1 -0
- package/dist/types/string_enum.js +24 -0
- package/dist/types/string_enum.js.map +1 -0
- package/dist/types/system_volume.js +40 -0
- package/dist/types/system_volume.js.map +1 -0
- package/dist/types/types/native_bindings.js +3 -0
- package/dist/types/types/native_bindings.js.map +1 -0
- package/dist/types/unc.js +49 -0
- package/dist/types/unc.js.map +1 -0
- package/dist/types/units.js +31 -0
- package/dist/types/units.js.map +1 -0
- package/dist/{esm/uuid.d.ts → types/uuid.js} +7 -2
- package/dist/types/uuid.js.map +1 -0
- package/dist/types/volume_health_status.js +46 -0
- package/dist/types/volume_health_status.js.map +1 -0
- package/dist/types/volume_metadata.js +164 -0
- package/dist/types/volume_metadata.js.map +1 -0
- package/package.json +10 -10
- package/prebuilds/darwin-arm64/@photostructure+fs-metadata.glibc.node +0 -0
- package/prebuilds/win32-x64/@photostructure+fs-metadata.glibc.node +0 -0
- package/scripts/fix-cjs.mjs +35 -0
- package/dist/cjs/index.d.cts.map +0 -1
- package/dist/esm/array.d.ts.map +0 -1
- package/dist/esm/async.d.ts +0 -43
- package/dist/esm/async.d.ts.map +0 -1
- package/dist/esm/cache.d.ts +0 -5
- package/dist/esm/cache.d.ts.map +0 -1
- package/dist/esm/debuglog.d.ts +0 -9
- package/dist/esm/debuglog.d.ts.map +0 -1
- package/dist/esm/defer.d.ts +0 -12
- package/dist/esm/defer.d.ts.map +0 -1
- package/dist/esm/error.d.ts +0 -18
- package/dist/esm/error.d.ts.map +0 -1
- package/dist/esm/exports.d.ts +0 -99
- package/dist/esm/exports.d.ts.map +0 -1
- package/dist/esm/fs.d.ts +0 -23
- package/dist/esm/fs.d.ts.map +0 -1
- package/dist/esm/glob.d.ts +0 -18
- package/dist/esm/glob.d.ts.map +0 -1
- package/dist/esm/hidden.d.ts +0 -67
- package/dist/esm/hidden.d.ts.map +0 -1
- package/dist/esm/linux/dev_disk.d.ts +0 -14
- package/dist/esm/linux/dev_disk.d.ts.map +0 -1
- package/dist/esm/linux/mount_points.d.ts +0 -7
- package/dist/esm/linux/mount_points.d.ts.map +0 -1
- package/dist/esm/linux/mtab.d.ts +0 -48
- package/dist/esm/linux/mtab.d.ts.map +0 -1
- package/dist/esm/mount_point.d.ts +0 -56
- package/dist/esm/mount_point.d.ts.map +0 -1
- package/dist/esm/number.d.ts +0 -8
- package/dist/esm/number.d.ts.map +0 -1
- package/dist/esm/object.d.ts +0 -18
- package/dist/esm/object.d.ts.map +0 -1
- package/dist/esm/options.d.ts +0 -80
- package/dist/esm/options.d.ts.map +0 -1
- package/dist/esm/path.d.ts +0 -18
- package/dist/esm/path.d.ts.map +0 -1
- package/dist/esm/platform.d.ts +0 -4
- package/dist/esm/platform.d.ts.map +0 -1
- package/dist/esm/random.d.ts +0 -13
- package/dist/esm/random.d.ts.map +0 -1
- package/dist/esm/remote_info.d.ts +0 -39
- package/dist/esm/remote_info.d.ts.map +0 -1
- package/dist/esm/setup.d.ts +0 -3
- package/dist/esm/setup.d.ts.map +0 -1
- package/dist/esm/string.d.ts +0 -38
- package/dist/esm/string.d.ts.map +0 -1
- package/dist/esm/string_enum.d.ts +0 -20
- package/dist/esm/string_enum.d.ts.map +0 -1
- package/dist/esm/system_volume.d.ts +0 -15
- package/dist/esm/system_volume.d.ts.map +0 -1
- package/dist/esm/types/native_bindings.d.ts +0 -52
- package/dist/esm/types/native_bindings.d.ts.map +0 -1
- package/dist/esm/unc.d.ts +0 -12
- package/dist/esm/unc.d.ts.map +0 -1
- package/dist/esm/units.d.ts +0 -17
- package/dist/esm/units.d.ts.map +0 -1
- package/dist/esm/uuid.d.ts.map +0 -1
- package/dist/esm/volume_health_status.d.ts +0 -25
- package/dist/esm/volume_health_status.d.ts.map +0 -1
- package/dist/esm/volume_metadata.d.ts +0 -55
- package/dist/esm/volume_metadata.d.ts.map +0 -1
- /package/dist/cjs/{array.js → array.cjs} +0 -0
- /package/dist/cjs/{cache.js → cache.cjs} +0 -0
- /package/dist/cjs/{defer.js → defer.cjs} +0 -0
- /package/dist/cjs/{number.js → number.cjs} +0 -0
- /package/dist/cjs/{platform.js → platform.cjs} +0 -0
- /package/dist/cjs/{random.js → random.cjs} +0 -0
- /package/dist/cjs/{string.js → string.cjs} +0 -0
- /package/dist/cjs/{string_enum.js → string_enum.cjs} +0 -0
- /package/dist/cjs/types/{native_bindings.js → native_bindings.cjs} +0 -0
- /package/dist/cjs/{units.js → units.cjs} +0 -0
- /package/dist/{cjs → types}/array.d.ts +0 -0
- /package/dist/{cjs → types}/array.d.ts.map +0 -0
- /package/dist/{cjs → types}/async.d.ts +0 -0
- /package/dist/{cjs → types}/async.d.ts.map +0 -0
- /package/dist/{cjs → types}/cache.d.ts +0 -0
- /package/dist/{cjs → types}/cache.d.ts.map +0 -0
- /package/dist/{cjs → types}/debuglog.d.ts +0 -0
- /package/dist/{cjs → types}/debuglog.d.ts.map +0 -0
- /package/dist/{cjs → types}/defer.d.ts +0 -0
- /package/dist/{cjs → types}/defer.d.ts.map +0 -0
- /package/dist/{cjs → types}/error.d.ts +0 -0
- /package/dist/{cjs → types}/error.d.ts.map +0 -0
- /package/dist/{cjs → types}/exports.d.ts +0 -0
- /package/dist/{cjs → types}/exports.d.ts.map +0 -0
- /package/dist/{cjs → types}/fs.d.ts +0 -0
- /package/dist/{cjs → types}/fs.d.ts.map +0 -0
- /package/dist/{cjs → types}/glob.d.ts +0 -0
- /package/dist/{cjs → types}/glob.d.ts.map +0 -0
- /package/dist/{cjs → types}/hidden.d.ts +0 -0
- /package/dist/{cjs → types}/hidden.d.ts.map +0 -0
- /package/dist/{esm → types}/index.d.ts +0 -0
- /package/dist/{esm → types}/index.d.ts.map +0 -0
- /package/dist/{cjs → types}/linux/dev_disk.d.ts +0 -0
- /package/dist/{cjs → types}/linux/dev_disk.d.ts.map +0 -0
- /package/dist/{cjs → types}/linux/mount_points.d.ts +0 -0
- /package/dist/{cjs → types}/linux/mount_points.d.ts.map +0 -0
- /package/dist/{cjs → types}/linux/mtab.d.ts +0 -0
- /package/dist/{cjs → types}/linux/mtab.d.ts.map +0 -0
- /package/dist/{cjs → types}/mount_point.d.ts +0 -0
- /package/dist/{cjs → types}/mount_point.d.ts.map +0 -0
- /package/dist/{cjs → types}/number.d.ts +0 -0
- /package/dist/{cjs → types}/number.d.ts.map +0 -0
- /package/dist/{cjs → types}/object.d.ts +0 -0
- /package/dist/{cjs → types}/object.d.ts.map +0 -0
- /package/dist/{cjs → types}/options.d.ts +0 -0
- /package/dist/{cjs → types}/options.d.ts.map +0 -0
- /package/dist/{cjs → types}/path.d.ts +0 -0
- /package/dist/{cjs → types}/path.d.ts.map +0 -0
- /package/dist/{cjs → types}/platform.d.ts +0 -0
- /package/dist/{cjs → types}/platform.d.ts.map +0 -0
- /package/dist/{cjs → types}/random.d.ts +0 -0
- /package/dist/{cjs → types}/random.d.ts.map +0 -0
- /package/dist/{cjs → types}/remote_info.d.ts +0 -0
- /package/dist/{cjs → types}/remote_info.d.ts.map +0 -0
- /package/dist/{cjs → types}/setup.d.ts +0 -0
- /package/dist/{cjs → types}/setup.d.ts.map +0 -0
- /package/dist/{cjs → types}/string.d.ts +0 -0
- /package/dist/{cjs → types}/string.d.ts.map +0 -0
- /package/dist/{cjs → types}/string_enum.d.ts +0 -0
- /package/dist/{cjs → types}/string_enum.d.ts.map +0 -0
- /package/dist/{cjs → types}/system_volume.d.ts +0 -0
- /package/dist/{cjs → types}/system_volume.d.ts.map +0 -0
- /package/dist/{cjs → types}/types/native_bindings.d.ts +0 -0
- /package/dist/{cjs → types}/types/native_bindings.d.ts.map +0 -0
- /package/dist/{cjs → types}/unc.d.ts +0 -0
- /package/dist/{cjs → types}/unc.d.ts.map +0 -0
- /package/dist/{cjs → types}/units.d.ts +0 -0
- /package/dist/{cjs → types}/units.d.ts.map +0 -0
- /package/dist/{cjs → types}/uuid.d.ts +0 -0
- /package/dist/{cjs → types}/uuid.d.ts.map +0 -0
- /package/dist/{cjs → types}/volume_health_status.d.ts +0 -0
- /package/dist/{cjs → types}/volume_health_status.d.ts.map +0 -0
- /package/dist/{cjs → types}/volume_metadata.d.ts +0 -0
- /package/dist/{cjs → types}/volume_metadata.d.ts.map +0 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// src/linux/mtab.ts
|
|
2
|
+
import { toInt } from "../number.js";
|
|
3
|
+
import { normalizePosixPath } from "../path.js";
|
|
4
|
+
import { extractRemoteInfo } from "../remote_info.js";
|
|
5
|
+
import { decodeEscapeSequences, encodeEscapeSequences, isBlank, toNotBlank, } from "../string.js";
|
|
6
|
+
import { isSystemVolume } from "../system_volume.js";
|
|
7
|
+
export function mountEntryToMountPoint(entry) {
|
|
8
|
+
const mountPoint = normalizePosixPath(entry.fs_file);
|
|
9
|
+
const fstype = toNotBlank(entry.fs_vfstype) ?? toNotBlank(entry.fs_spec);
|
|
10
|
+
return mountPoint == null || fstype == null
|
|
11
|
+
? undefined
|
|
12
|
+
: {
|
|
13
|
+
mountPoint,
|
|
14
|
+
fstype,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export function mountEntryToPartialVolumeMetadata(entry, options = {}) {
|
|
18
|
+
return {
|
|
19
|
+
mountPoint: entry.fs_file,
|
|
20
|
+
fstype: entry.fs_vfstype,
|
|
21
|
+
mountFrom: entry.fs_spec,
|
|
22
|
+
isSystemVolume: isSystemVolume(entry.fs_file, entry.fs_vfstype, options),
|
|
23
|
+
remote: false, // < default to false
|
|
24
|
+
...extractRemoteInfo(entry.fs_spec),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Parses an mtab/fstab file content into structured mount entries
|
|
29
|
+
* @param content - Raw content of the mtab/fstab file
|
|
30
|
+
* @returns Array of parsed mount entries
|
|
31
|
+
*/
|
|
32
|
+
export function parseMtab(content) {
|
|
33
|
+
const entries = [];
|
|
34
|
+
const lines = content.split("\n");
|
|
35
|
+
for (const line of lines) {
|
|
36
|
+
// Skip comments and empty lines
|
|
37
|
+
if (isBlank(line) || line.trim().startsWith("#")) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const fields = line
|
|
41
|
+
.trim()
|
|
42
|
+
.match(/(?:[^\s\\]+|\\.)+/g)
|
|
43
|
+
?.map(decodeEscapeSequences);
|
|
44
|
+
if (!fields || fields.length < 3) {
|
|
45
|
+
continue; // Skip malformed lines
|
|
46
|
+
}
|
|
47
|
+
const fs_file = normalizePosixPath(fields[1]);
|
|
48
|
+
if (fs_file != null) {
|
|
49
|
+
entries.push({
|
|
50
|
+
fs_spec: fields[0],
|
|
51
|
+
// normalizeLinuxPath DOES NOT resolve()!
|
|
52
|
+
fs_file,
|
|
53
|
+
fs_vfstype: fields[2],
|
|
54
|
+
fs_mntops: fields[3],
|
|
55
|
+
fs_freq: toInt(fields[4]),
|
|
56
|
+
fs_passno: toInt(fields[5]),
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return entries;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Formats mount entries back into mtab file format
|
|
64
|
+
* @param entries - Array of mount entries
|
|
65
|
+
* @returns Formatted mtab file content
|
|
66
|
+
*/
|
|
67
|
+
export function formatMtab(entries) {
|
|
68
|
+
return entries
|
|
69
|
+
.map((entry) => {
|
|
70
|
+
const fields = [
|
|
71
|
+
entry.fs_spec,
|
|
72
|
+
encodeEscapeSequences(entry.fs_file),
|
|
73
|
+
entry.fs_vfstype,
|
|
74
|
+
entry.fs_mntops,
|
|
75
|
+
entry.fs_freq?.toString(),
|
|
76
|
+
entry.fs_passno?.toString(),
|
|
77
|
+
];
|
|
78
|
+
return fields.join("\t");
|
|
79
|
+
})
|
|
80
|
+
.join("\n");
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=mtab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mtab.js","sourceRoot":"","sources":["../../../src/linux/mtab.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// src/mount_point.ts
|
|
2
|
+
import { uniqBy } from "./array.js";
|
|
3
|
+
import { mapConcurrent, withTimeout } from "./async.js";
|
|
4
|
+
import { debug } from "./debuglog.js";
|
|
5
|
+
import { getLinuxMountPoints } from "./linux/mount_points.js";
|
|
6
|
+
import { compactValues, isObject } from "./object.js";
|
|
7
|
+
import { isMacOS, isWindows } from "./platform.js";
|
|
8
|
+
import { isNotBlank, sortObjectsByLocale, toNotBlank } from "./string.js";
|
|
9
|
+
import { assignSystemVolume } from "./system_volume.js";
|
|
10
|
+
import { directoryStatus } from "./volume_health_status.js";
|
|
11
|
+
export function isMountPoint(obj) {
|
|
12
|
+
if (!isObject(obj))
|
|
13
|
+
return false;
|
|
14
|
+
return "mountPoint" in obj && isNotBlank(obj.mountPoint);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Helper function for {@link getVolumeMountPoints}.
|
|
18
|
+
*/
|
|
19
|
+
export async function getVolumeMountPoints(opts, nativeFn) {
|
|
20
|
+
const p = _getVolumeMountPoints(opts, nativeFn);
|
|
21
|
+
// we rely on the native bindings on Windows to do proper timeouts
|
|
22
|
+
return isWindows
|
|
23
|
+
? p
|
|
24
|
+
: withTimeout({ desc: "getVolumeMountPoints", ...opts, promise: p });
|
|
25
|
+
}
|
|
26
|
+
async function _getVolumeMountPoints(o, nativeFn) {
|
|
27
|
+
debug("[getVolumeMountPoints] gathering mount points with options: %o", o);
|
|
28
|
+
const result = await (isWindows || isMacOS
|
|
29
|
+
? (async () => {
|
|
30
|
+
debug("[getVolumeMountPoints] using native implementation");
|
|
31
|
+
const points = await (await nativeFn()).getVolumeMountPoints(o);
|
|
32
|
+
debug("[getVolumeMountPoints] native returned %d mount points", points.length);
|
|
33
|
+
return points;
|
|
34
|
+
})()
|
|
35
|
+
: getLinuxMountPoints(nativeFn, o));
|
|
36
|
+
debug("[getVolumeMountPoints] raw mount points: %o", result);
|
|
37
|
+
const compacted = result
|
|
38
|
+
.map((ea) => compactValues(ea))
|
|
39
|
+
.filter((ea) => isNotBlank(ea.mountPoint));
|
|
40
|
+
const filtered = o.includeSystemVolumes
|
|
41
|
+
? compacted
|
|
42
|
+
: compacted.filter((ea) => !ea.isSystemVolume);
|
|
43
|
+
const uniq = uniqBy(filtered, (ea) => toNotBlank(ea.mountPoint));
|
|
44
|
+
debug("[getVolumeMountPoints] found %d unique mount points", uniq.length);
|
|
45
|
+
const results = sortObjectsByLocale(uniq, (ea) => ea.mountPoint);
|
|
46
|
+
debug("[getVolumeMountPoints] getting status for %d mount points", results.length);
|
|
47
|
+
await mapConcurrent({
|
|
48
|
+
maxConcurrency: o.maxConcurrency,
|
|
49
|
+
items: results,
|
|
50
|
+
fn: async (mp) => {
|
|
51
|
+
assignSystemVolume(mp, o);
|
|
52
|
+
if ((toNotBlank(mp.status) ?? "healthy") === "healthy") {
|
|
53
|
+
// trust but verify
|
|
54
|
+
debug("[getVolumeMountPoints] checking status of %s", mp.mountPoint);
|
|
55
|
+
mp.status = (await directoryStatus(mp.mountPoint, o.timeoutMs)).status;
|
|
56
|
+
debug("[getVolumeMountPoints] status for %s: %s", mp.mountPoint, mp.status);
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
debug("[getVolumeMountPoints] completed with %d mount points", results.length);
|
|
61
|
+
return results;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=mount_point.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mount_point.js","sourceRoot":"","sources":["../../src/mount_point.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// src/number.ts
|
|
2
|
+
export function isNumber(value) {
|
|
3
|
+
return typeof value === "number" && isFinite(value);
|
|
4
|
+
}
|
|
5
|
+
const INTEGER_REGEX = /^-?\d+$/;
|
|
6
|
+
export function toInt(value) {
|
|
7
|
+
try {
|
|
8
|
+
if (value == null)
|
|
9
|
+
return;
|
|
10
|
+
const s = String(value).trim();
|
|
11
|
+
return INTEGER_REGEX.test(s) ? parseInt(s) : undefined;
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function gt0(value) {
|
|
18
|
+
return isNumber(value) && value > 0;
|
|
19
|
+
}
|
|
20
|
+
export function gte0(value) {
|
|
21
|
+
return isNumber(value) && value >= 0;
|
|
22
|
+
}
|
|
23
|
+
export function toGt0(value) {
|
|
24
|
+
return gt0(value) ? value : undefined;
|
|
25
|
+
}
|
|
26
|
+
export function toGte0(value) {
|
|
27
|
+
return gte0(value) ? value : undefined;
|
|
28
|
+
}
|
|
29
|
+
export function lte(a, b) {
|
|
30
|
+
return isNumber(a) && isNumber(b) && a <= b;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=number.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"number.js","sourceRoot":"","sources":["../../src/number.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAEhB,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,aAAa,GAAG,SAAS,CAAC;AAEhC,MAAM,UAAU,KAAK,CAAC,KAAc;IAClC,IAAI,CAAC;QACH,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO;QAC1B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/B,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;AACH,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,KAAc;IAChC,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,KAAc;IACjC,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,KAAc;IAClC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAc;IACnC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,CAAqB,EAAE,CAAqB;IAC9D,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// src/object.js
|
|
2
|
+
import { isNotBlank, isString } from "./string.js";
|
|
3
|
+
/**
|
|
4
|
+
* Check if a value is an object
|
|
5
|
+
*/
|
|
6
|
+
export function isObject(value) {
|
|
7
|
+
// typeof null is 'object', so we need to check for that case YAY JAVASCRIPT
|
|
8
|
+
return value != null && typeof value === "object" && !Array.isArray(value);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Map a value to another value, or undefined if the value is undefined
|
|
12
|
+
*/
|
|
13
|
+
export function map(obj, fn) {
|
|
14
|
+
return obj == null ? undefined : fn(obj);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Omit the specified fields from an object
|
|
18
|
+
*/
|
|
19
|
+
export function omit(obj, ...keys) {
|
|
20
|
+
const result = {};
|
|
21
|
+
const keysSet = new Set(keys);
|
|
22
|
+
// OH THE TYPING HUGEMANATEE
|
|
23
|
+
for (const key of Object.keys(obj)) {
|
|
24
|
+
if (!keysSet.has(key)) {
|
|
25
|
+
result[key] = obj[key];
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Pick the specified fields from an object
|
|
32
|
+
*/
|
|
33
|
+
export function pick(obj, ...keys) {
|
|
34
|
+
const copy = {};
|
|
35
|
+
for (const key of keys) {
|
|
36
|
+
copy[key] = obj[key];
|
|
37
|
+
}
|
|
38
|
+
return copy;
|
|
39
|
+
}
|
|
40
|
+
export function compactValues(obj) {
|
|
41
|
+
const result = {};
|
|
42
|
+
if (obj == null || !isObject(obj))
|
|
43
|
+
return {};
|
|
44
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
45
|
+
// skip blank strings and nullish values:
|
|
46
|
+
if (value != null && (!isString(value) || isNotBlank(value))) {
|
|
47
|
+
result[key] = value;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=object.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object.js","sourceRoot":"","sources":["../../src/object.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAEhB,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEnD;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,4EAA4E;IAC5E,OAAO,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG,CACjB,GAAkB,EAClB,EAAmB;IAEnB,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,IAAI,CAClB,GAAM,EACN,GAAG,IAAS;IAEZ,MAAM,MAAM,GAAG,EAAgB,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IAE9B,4BAA4B;IAC5B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAA4B,EAAE,CAAC;QAC9D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAmB,CAAC,EAAE,CAAC;YACtC,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AACD;;GAEG;AACH,MAAM,UAAU,IAAI,CAClB,GAAM,EACN,GAAG,IAAS;IAEZ,MAAM,IAAI,GAAG,EAAgB,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AACD,MAAM,UAAU,aAAa,CAC3B,GAAkB;IAElB,MAAM,MAAM,GAAG,EAAgB,CAAC;IAChC,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,yCAAyC;QACzC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC7D,MAAM,CAAC,GAAc,CAAC,GAAG,KAAmB,CAAC;QAC/C,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// src/options.ts
|
|
2
|
+
import { availableParallelism } from "node:os";
|
|
3
|
+
import { compactValues, isObject } from "./object.js";
|
|
4
|
+
import { isWindows } from "./platform.js";
|
|
5
|
+
/**
|
|
6
|
+
* Default timeout in milliseconds for {@link Options.timeoutMs}.
|
|
7
|
+
*
|
|
8
|
+
* Note that this timeout may be insufficient for some devices, like spun-down
|
|
9
|
+
* optical drives or network shares that need to spin up or reconnect.
|
|
10
|
+
*/
|
|
11
|
+
export const TimeoutMsDefault = 5_000;
|
|
12
|
+
/**
|
|
13
|
+
* System paths and globs that indicate system volumes
|
|
14
|
+
*/
|
|
15
|
+
export const SystemPathPatternsDefault = [
|
|
16
|
+
"/boot",
|
|
17
|
+
"/boot/efi",
|
|
18
|
+
"/dev",
|
|
19
|
+
"/dev/**",
|
|
20
|
+
"/proc/**",
|
|
21
|
+
"/run",
|
|
22
|
+
"/run/credentials/**",
|
|
23
|
+
"/run/lock",
|
|
24
|
+
"/run/snapd/**",
|
|
25
|
+
"/run/user/*/doc",
|
|
26
|
+
"/run/user/*/gvfs",
|
|
27
|
+
"/snap/**",
|
|
28
|
+
"/sys/**",
|
|
29
|
+
// windows for linux:
|
|
30
|
+
"/mnt/wslg/distro",
|
|
31
|
+
"/mnt/wslg/doc",
|
|
32
|
+
"/mnt/wslg/versions.txt",
|
|
33
|
+
"/usr/lib/wsl/drivers",
|
|
34
|
+
// MacOS stuff:
|
|
35
|
+
"/private/var/vm", // macOS swap
|
|
36
|
+
"/System/Volumes/Hardware",
|
|
37
|
+
"/System/Volumes/iSCPreboot",
|
|
38
|
+
"/System/Volumes/Preboot",
|
|
39
|
+
"/System/Volumes/Recovery",
|
|
40
|
+
"/System/Volumes/Reserved",
|
|
41
|
+
"/System/Volumes/Update",
|
|
42
|
+
"/System/Volumes/VM",
|
|
43
|
+
"/System/Volumes/xarts",
|
|
44
|
+
];
|
|
45
|
+
/**
|
|
46
|
+
* Filesystem types that indicate system volumes
|
|
47
|
+
*/
|
|
48
|
+
export const SystemFsTypesDefault = new Set([
|
|
49
|
+
"autofs",
|
|
50
|
+
"binfmt_misc",
|
|
51
|
+
"cgroup",
|
|
52
|
+
"cgroup2",
|
|
53
|
+
"configfs",
|
|
54
|
+
"debugfs",
|
|
55
|
+
"devpts",
|
|
56
|
+
"devtmpfs",
|
|
57
|
+
"efivarfs",
|
|
58
|
+
"fusectl",
|
|
59
|
+
"fuse.snapfuse",
|
|
60
|
+
"hugetlbfs",
|
|
61
|
+
"mqueue",
|
|
62
|
+
"none",
|
|
63
|
+
"proc",
|
|
64
|
+
"pstore",
|
|
65
|
+
"rootfs",
|
|
66
|
+
"securityfs",
|
|
67
|
+
"snap*",
|
|
68
|
+
"squashfs",
|
|
69
|
+
"sysfs",
|
|
70
|
+
"tmpfs",
|
|
71
|
+
]);
|
|
72
|
+
export const LinuxMountTablePathsDefault = [
|
|
73
|
+
"/proc/self/mounts",
|
|
74
|
+
"/proc/mounts",
|
|
75
|
+
"/etc/mtab",
|
|
76
|
+
];
|
|
77
|
+
/**
|
|
78
|
+
* Should {@link getAllVolumeMetadata()} include system volumes by
|
|
79
|
+
* default?
|
|
80
|
+
*/
|
|
81
|
+
export const IncludeSystemVolumesDefault = isWindows;
|
|
82
|
+
/**
|
|
83
|
+
* Default {@link Options} object.
|
|
84
|
+
*
|
|
85
|
+
* @see {@link optionsWithDefaults} for creating an options object with default values
|
|
86
|
+
*/
|
|
87
|
+
export const OptionsDefault = {
|
|
88
|
+
timeoutMs: TimeoutMsDefault,
|
|
89
|
+
maxConcurrency: availableParallelism(),
|
|
90
|
+
systemPathPatterns: [...SystemPathPatternsDefault],
|
|
91
|
+
systemFsTypes: new Set(SystemFsTypesDefault),
|
|
92
|
+
linuxMountTablePaths: LinuxMountTablePathsDefault,
|
|
93
|
+
includeSystemVolumes: IncludeSystemVolumesDefault,
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* Create an {@link Options} object using default values from
|
|
97
|
+
* {@link OptionsDefault} for missing fields.
|
|
98
|
+
*/
|
|
99
|
+
export function optionsWithDefaults(overrides = {}) {
|
|
100
|
+
if (!isObject(overrides)) {
|
|
101
|
+
throw new TypeError("options(): expected an object, got " +
|
|
102
|
+
typeof overrides +
|
|
103
|
+
": " +
|
|
104
|
+
JSON.stringify(overrides));
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
...OptionsDefault,
|
|
108
|
+
...compactValues(overrides),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/options.ts"],"names":[],"mappings":"AAAA,iBAAiB;AAEjB,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAuD1C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAc,CAAC;AAE/C;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,OAAO;IACP,WAAW;IACX,MAAM;IACN,SAAS;IACT,UAAU;IACV,MAAM;IACN,qBAAqB;IACrB,WAAW;IACX,eAAe;IACf,iBAAiB;IACjB,kBAAkB;IAClB,UAAU;IACV,SAAS;IAET,qBAAqB;IACrB,kBAAkB;IAClB,eAAe;IACf,wBAAwB;IACxB,sBAAsB;IAEtB,eAAe;IACf,iBAAiB,EAAE,aAAa;IAChC,0BAA0B;IAC1B,4BAA4B;IAC5B,yBAAyB;IACzB,0BAA0B;IAC1B,0BAA0B;IAC1B,wBAAwB;IACxB,oBAAoB;IACpB,uBAAuB;CACxB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IAC1C,QAAQ;IACR,aAAa;IACb,QAAQ;IACR,SAAS;IACT,UAAU;IACV,SAAS;IACT,QAAQ;IACR,UAAU;IACV,UAAU;IACV,SAAS;IACT,eAAe;IACf,WAAW;IACX,QAAQ;IACR,MAAM;IACN,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,YAAY;IACZ,OAAO;IACP,UAAU;IACV,OAAO;IACP,OAAO;CACR,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,mBAAmB;IACnB,cAAc;IACd,WAAW;CACZ,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,SAAS,CAAC;AAErD;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAY;IACrC,SAAS,EAAE,gBAAgB;IAC3B,cAAc,EAAE,oBAAoB,EAAE;IACtC,kBAAkB,EAAE,CAAC,GAAG,yBAAyB,CAAC;IAClD,aAAa,EAAE,IAAI,GAAG,CAAC,oBAAoB,CAAC;IAC5C,oBAAoB,EAAE,2BAA2B;IACjD,oBAAoB,EAAE,2BAA2B;CACzC,CAAC;AAEX;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,YAAwB,EAAE;IAE1B,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,SAAS,CACjB,qCAAqC;YACnC,OAAO,SAAS;YAChB,IAAI;YACJ,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAC5B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,GAAG,cAAc;QACjB,GAAI,aAAa,CAAC,SAAS,CAAO;KACnC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// src/path.ts
|
|
2
|
+
import { dirname, resolve } from "node:path";
|
|
3
|
+
import { isWindows } from "./platform.js";
|
|
4
|
+
import { isBlank } from "./string.js";
|
|
5
|
+
export function normalizePath(mountPoint) {
|
|
6
|
+
if (isBlank(mountPoint))
|
|
7
|
+
return undefined;
|
|
8
|
+
const result = isWindows
|
|
9
|
+
? normalizeWindowsPath(mountPoint)
|
|
10
|
+
: normalizePosixPath(mountPoint);
|
|
11
|
+
// Make sure the native code doesn't see anything weird:
|
|
12
|
+
return result != null ? resolve(result) : undefined;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Normalizes a Linux or macOS mount point by removing any trailing slashes.
|
|
16
|
+
* This is a no-op for root mount points.
|
|
17
|
+
*/
|
|
18
|
+
export function normalizePosixPath(mountPoint) {
|
|
19
|
+
return isBlank(mountPoint)
|
|
20
|
+
? undefined
|
|
21
|
+
: mountPoint === "/"
|
|
22
|
+
? mountPoint
|
|
23
|
+
: mountPoint.replace(/\/+$/, "");
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Normalizes a Windows mount point by ensuring drive letters end with a
|
|
27
|
+
* backslash.
|
|
28
|
+
*/
|
|
29
|
+
export function normalizeWindowsPath(mountPoint) {
|
|
30
|
+
// Terrible things happen if we give syscalls "C:" instead of "C:\"
|
|
31
|
+
return /^[a-z]:$/i.test(mountPoint)
|
|
32
|
+
? mountPoint.toUpperCase() + "\\"
|
|
33
|
+
: mountPoint;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* @return true if `path` is the root directory--this is platform-specific. Only
|
|
37
|
+
* "/" on linux/macOS is considered a root directory. On Windows, the root
|
|
38
|
+
* directory is a drive letter followed by a colon, e.g. "C:\".
|
|
39
|
+
*/
|
|
40
|
+
export function isRootDirectory(path) {
|
|
41
|
+
const n = normalizePath(path);
|
|
42
|
+
return n == null ? false : isWindows ? dirname(n) === n : n === "/";
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/path.ts"],"names":[],"mappings":"AAAA,cAAc;AAEd,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,UAAU,aAAa,CAC3B,UAA8B;IAE9B,IAAI,OAAO,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IAE1C,MAAM,MAAM,GAAG,SAAS;QACtB,CAAC,CAAC,oBAAoB,CAAC,UAAU,CAAC;QAClC,CAAC,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAEnC,wDAAwD;IACxD,OAAO,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACtD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,UAA8B;IAE9B,OAAO,OAAO,CAAC,UAAU,CAAC;QACxB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,UAAU,KAAK,GAAG;YAClB,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,UAAkB;IACrD,mEAAmE;IAEnE,OAAO,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC;QACjC,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE,GAAG,IAAI;QACjC,CAAC,CAAC,UAAU,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/platform.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAElB,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;AAErB,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAK,OAAO,CAAC;AACrC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAK,OAAO,CAAC;AACvC,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAK,QAAQ,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// src/random.ts
|
|
2
|
+
import { randomInt } from "node:crypto";
|
|
3
|
+
const CharCode_a = "a".charCodeAt(0);
|
|
4
|
+
/**
|
|
5
|
+
* @return a random character `[a-z]`
|
|
6
|
+
*/
|
|
7
|
+
export function randomLetter() {
|
|
8
|
+
return String.fromCharCode(CharCode_a + randomInt(0, 26));
|
|
9
|
+
}
|
|
10
|
+
export function randomLetters(length) {
|
|
11
|
+
return Array.from({ length }, randomLetter).join("");
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Shuffle an array using the Fisher-Yates (Knuth) algorithm.
|
|
15
|
+
* @param a The array to shuffle
|
|
16
|
+
* @returns A shallow shuffled copy of `a`
|
|
17
|
+
*/
|
|
18
|
+
export function shuffle(a) {
|
|
19
|
+
if (a.length <= 1)
|
|
20
|
+
return a;
|
|
21
|
+
a = [...a]; // Copy the array
|
|
22
|
+
for (let i = a.length - 1; i > 0; i--) {
|
|
23
|
+
// Pick a random index from 0 to i
|
|
24
|
+
const j = Math.floor(Math.random() * (i + 1));
|
|
25
|
+
// Swap elements at indices i and j
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
27
|
+
[a[i], a[j]] = [a[j], a[i]];
|
|
28
|
+
}
|
|
29
|
+
return a;
|
|
30
|
+
}
|
|
31
|
+
export function pickRandom(a) {
|
|
32
|
+
if (a == null || a.length === 0) {
|
|
33
|
+
throw new Error("Cannot pick from an empty array");
|
|
34
|
+
}
|
|
35
|
+
return a[randomInt(0, a.length)];
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=random.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"random.js","sourceRoot":"","sources":["../../src/random.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAEhB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACrC;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,MAAM,CAAC,YAAY,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACvD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAI,CAAM;IAC/B,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAC5B,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,kCAAkC;QAClC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC9C,mCAAmC;QACnC,oEAAoE;QACpE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AACD,MAAM,UAAU,UAAU,CAAI,CAAM;IAClC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAM,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// src/remote_info.ts
|
|
2
|
+
import { debug } from "./debuglog.js";
|
|
3
|
+
import { compactValues, isObject } from "./object.js";
|
|
4
|
+
import { isWindows } from "./platform.js";
|
|
5
|
+
import { isBlank, isNotBlank } from "./string.js";
|
|
6
|
+
export function isRemoteInfo(obj) {
|
|
7
|
+
if (!isObject(obj))
|
|
8
|
+
return false;
|
|
9
|
+
const { remoteHost, remoteShare } = obj;
|
|
10
|
+
return isNotBlank(remoteHost) && isNotBlank(remoteShare);
|
|
11
|
+
}
|
|
12
|
+
const NETWORK_FS_TYPES = new Set([
|
|
13
|
+
"9p",
|
|
14
|
+
"afp",
|
|
15
|
+
"afs",
|
|
16
|
+
"beegfs",
|
|
17
|
+
"ceph",
|
|
18
|
+
"cifs",
|
|
19
|
+
"ftp",
|
|
20
|
+
"fuse.cephfs",
|
|
21
|
+
"fuse.glusterfs",
|
|
22
|
+
"fuse.sshfs",
|
|
23
|
+
"fuse",
|
|
24
|
+
"gfs2",
|
|
25
|
+
"glusterfs",
|
|
26
|
+
"lustre",
|
|
27
|
+
"ncpfs",
|
|
28
|
+
"nfs",
|
|
29
|
+
"nfs4",
|
|
30
|
+
"smb",
|
|
31
|
+
"smbfs",
|
|
32
|
+
"sshfs",
|
|
33
|
+
"webdav",
|
|
34
|
+
]);
|
|
35
|
+
export function normalizeProtocol(protocol) {
|
|
36
|
+
return (protocol ?? "").toLowerCase().replace(/:$/, "");
|
|
37
|
+
}
|
|
38
|
+
export function isRemoteFsType(fstype) {
|
|
39
|
+
return isNotBlank(fstype) && NETWORK_FS_TYPES.has(normalizeProtocol(fstype));
|
|
40
|
+
}
|
|
41
|
+
export function parseURL(s) {
|
|
42
|
+
try {
|
|
43
|
+
return isBlank(s) ? undefined : new URL(s);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export function extractRemoteInfo(fsSpec) {
|
|
50
|
+
if (fsSpec == null || isBlank(fsSpec))
|
|
51
|
+
return;
|
|
52
|
+
if (isWindows) {
|
|
53
|
+
fsSpec = fsSpec.replace(/\\/g, "/");
|
|
54
|
+
}
|
|
55
|
+
const url = parseURL(fsSpec);
|
|
56
|
+
if (url?.protocol === "file:") {
|
|
57
|
+
return {
|
|
58
|
+
remote: false,
|
|
59
|
+
uri: fsSpec,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
const patterns = [
|
|
63
|
+
// CIFS/SMB pattern: //hostname/share or //user@host/share
|
|
64
|
+
{
|
|
65
|
+
regex: /^\/\/(?:(?<remoteUser>[^/@]+)@)?(?<remoteHost>[^/@]+)\/(?<remoteShare>.+)$/,
|
|
66
|
+
},
|
|
67
|
+
// NFS pattern: hostname:/share
|
|
68
|
+
{
|
|
69
|
+
protocol: "nfs",
|
|
70
|
+
regex: /^(?<remoteHost>[^:]+):\/(?!\/)(?<remoteShare>.+)$/,
|
|
71
|
+
},
|
|
72
|
+
];
|
|
73
|
+
for (const { protocol, regex } of patterns) {
|
|
74
|
+
const o = compactValues({
|
|
75
|
+
protocol,
|
|
76
|
+
remote: true,
|
|
77
|
+
...(fsSpec.match(regex)?.groups ?? {}),
|
|
78
|
+
});
|
|
79
|
+
if (isRemoteInfo(o)) {
|
|
80
|
+
debug("[extractRemoteInfo] matched pattern: %o", o);
|
|
81
|
+
return o;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Let's try URL last, as nfs mounts are URI-ish
|
|
85
|
+
try {
|
|
86
|
+
// try to parse fsSpec as a uri:
|
|
87
|
+
const parsed = new URL(fsSpec);
|
|
88
|
+
if (parsed != null) {
|
|
89
|
+
debug("[extractRemoteInfo] parsed URL: %o", parsed);
|
|
90
|
+
const protocol = normalizeProtocol(parsed.protocol);
|
|
91
|
+
if (!isRemoteFsType(protocol)) {
|
|
92
|
+
// don't set remoteUser, remoteHost, or remoteShare, it's not remote!
|
|
93
|
+
return {
|
|
94
|
+
uri: fsSpec,
|
|
95
|
+
remote: false,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
return compactValues({
|
|
100
|
+
uri: fsSpec,
|
|
101
|
+
protocol,
|
|
102
|
+
remote: true,
|
|
103
|
+
remoteUser: parsed.username,
|
|
104
|
+
remoteHost: parsed.hostname,
|
|
105
|
+
// URL pathname includes leading slash:
|
|
106
|
+
remoteShare: parsed.pathname.replace(/^\//, ""),
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// ignore
|
|
113
|
+
}
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=remote_info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote_info.js","sourceRoot":"","sources":["../../src/remote_info.ts"],"names":[],"mappings":"AAAA,qBAAqB;AAErB,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAoClD,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACjC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,GAA0B,CAAC;IAC/D,OAAO,UAAU,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,IAAI;IACJ,KAAK;IACL,KAAK;IACL,QAAQ;IACR,MAAM;IACN,MAAM;IACN,KAAK;IACL,aAAa;IACb,gBAAgB;IAChB,YAAY;IACZ,MAAM;IACN,MAAM;IACN,WAAW;IACX,QAAQ;IACR,OAAO;IACP,KAAK;IACL,MAAM;IACN,KAAK;IACL,OAAO;IACP,OAAO;IACP,QAAQ;CACT,CAAC,CAAC;AAEH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAA0B;IACvD,OAAO,UAAU,CAAC,MAAM,CAAC,IAAI,gBAAgB,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,CAAS;IAChC,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,MAA0B;IAE1B,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO;IAE9C,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE7B,IAAI,GAAG,EAAE,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC9B,OAAO;YACL,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,MAAM;SACZ,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG;QACf,0DAA0D;QAC1D;YACE,KAAK,EACH,4EAA4E;SAC/E;QACD,+BAA+B;QAC/B;YACE,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,mDAAmD;SAC3D;KACF,CAAC;IAEF,KAAK,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC3C,MAAM,CAAC,GAAG,aAAa,CAAC;YACtB,QAAQ;YACR,MAAM,EAAE,IAAI;YACZ,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC;SACvC,CAAC,CAAC;QACH,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;YACpB,KAAK,CAAC,yCAAyC,EAAE,CAAC,CAAC,CAAC;YACpD,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,gDAAgD;IAChD,IAAI,CAAC;QACH,gCAAgC;QAChC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,KAAK,CAAC,oCAAoC,EAAE,MAAM,CAAC,CAAC;YACpD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACpD,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9B,qEAAqE;gBACrE,OAAO;oBACL,GAAG,EAAE,MAAM;oBACX,MAAM,EAAE,KAAK;iBACd,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,aAAa,CAAC;oBACnB,GAAG,EAAE,MAAM;oBACX,QAAQ;oBACR,MAAM,EAAE,IAAI;oBACZ,UAAU,EAAE,MAAM,CAAC,QAAQ;oBAC3B,UAAU,EAAE,MAAM,CAAC,QAAQ;oBAC3B,uCAAuC;oBACvC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;iBAChD,CAA0B,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IAED,OAAO;AACT,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// src/exports.ts
|
|
2
|
+
import NodeGypBuild from "node-gyp-build";
|
|
3
|
+
import { debug, debugLogContext, isDebugEnabled } from "./debuglog.js";
|
|
4
|
+
import { defer } from "./defer.js";
|
|
5
|
+
import { findAncestorDir } from "./fs.js";
|
|
6
|
+
import { getHiddenMetadata, isHidden, isHiddenRecursive, setHidden, } from "./hidden.js";
|
|
7
|
+
import { getVolumeMountPoints, } from "./mount_point.js";
|
|
8
|
+
import { optionsWithDefaults } from "./options.js";
|
|
9
|
+
import { getAllVolumeMetadata, getVolumeMetadata } from "./volume_metadata.js";
|
|
10
|
+
export function setup(dirname) {
|
|
11
|
+
const nativeFn = defer(async () => {
|
|
12
|
+
const start = Date.now();
|
|
13
|
+
try {
|
|
14
|
+
const dir = await findAncestorDir(dirname, "binding.gyp");
|
|
15
|
+
if (dir == null) {
|
|
16
|
+
throw new Error("Could not find bindings.gyp in any ancestor directory of " + dirname);
|
|
17
|
+
}
|
|
18
|
+
const bindings = NodeGypBuild(dir);
|
|
19
|
+
bindings.setDebugLogging(isDebugEnabled());
|
|
20
|
+
bindings.setDebugPrefix(debugLogContext() + ":native");
|
|
21
|
+
return bindings;
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
debug("Loading native bindings failed: %s", error);
|
|
25
|
+
throw error;
|
|
26
|
+
}
|
|
27
|
+
finally {
|
|
28
|
+
debug(`Native bindings took %d ms to load`, Date.now() - start);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
return {
|
|
32
|
+
getVolumeMountPoints: (opts = {}) => getVolumeMountPoints(optionsWithDefaults(opts), nativeFn),
|
|
33
|
+
getVolumeMetadata: (mountPoint, opts = {}) => getVolumeMetadata({ ...optionsWithDefaults(opts), mountPoint }, nativeFn),
|
|
34
|
+
getAllVolumeMetadata: (opts = {}) => getAllVolumeMetadata(optionsWithDefaults(opts), nativeFn),
|
|
35
|
+
isHidden: (pathname) => isHidden(pathname, nativeFn),
|
|
36
|
+
isHiddenRecursive: (pathname) => isHiddenRecursive(pathname, nativeFn),
|
|
37
|
+
getHiddenMetadata: (pathname) => getHiddenMetadata(pathname, nativeFn),
|
|
38
|
+
setHidden: (pathname, hidden, method = "auto") => setHidden(pathname, hidden, method, nativeFn),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/setup.ts"],"names":[],"mappings":"AAAA,iBAAiB;AAEjB,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EACL,iBAAiB,EAEjB,QAAQ,EACR,iBAAiB,EACjB,SAAS,GACV,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,oBAAoB,GAErB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE/E,MAAM,UAAU,KAAK,CAAC,OAAe;IACnC,MAAM,QAAQ,GAAG,KAAK,CAA0B,KAAK,IAAI,EAAE;QACzD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YAC1D,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CACb,2DAA2D,GAAG,OAAO,CACtE,CAAC;YACJ,CAAC;YACD,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAmB,CAAC;YACrD,QAAQ,CAAC,eAAe,CAAC,cAAc,EAAE,CAAC,CAAC;YAC3C,QAAQ,CAAC,cAAc,CAAC,eAAe,EAAE,GAAG,SAAS,CAAC,CAAC;YACvD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;YACnD,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,KAAK,CAAC,oCAAoC,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;QAClE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,oBAAoB,EAAE,CAAC,OAA4C,EAAE,EAAE,EAAE,CACvE,oBAAoB,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;QAE3D,iBAAiB,EAAE,CAAC,UAAkB,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,CACnD,iBAAiB,CAAC,EAAE,GAAG,mBAAmB,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,EAAE,QAAQ,CAAC;QAE3E,oBAAoB,EAAE,CAAC,IAAI,GAAG,EAAE,EAAE,EAAE,CAClC,oBAAoB,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;QAE3D,QAAQ,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAE5D,iBAAiB,EAAE,CAAC,QAAgB,EAAE,EAAE,CACtC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAEvC,iBAAiB,EAAE,CAAC,QAAgB,EAAE,EAAE,CACtC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAEvC,SAAS,EAAE,CACT,QAAgB,EAChB,MAAe,EACf,SAAqB,MAAM,EAC3B,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;KAC1C,CAAC;AACb,CAAC"}
|