Repository navigation
Expand file tree
/
Copy pathcreate-path-helpers.mjs
More file actions
84 lines (79 loc) · 2.57 KB
/
Copy pathcreate-path-helpers.mjs
File metadata and controls
84 lines (79 loc) · 2.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import { log as defaultLogger } from "@eliware/log";
import { path, relativePath, resolvePath } from "./current-path.mjs";
import { pathUrl } from "./conversions.mjs";
import { fileUrlToPath } from "./file-url-to-path.mjs";
import { getCurrentDirname, getCurrentFilename } from "./path-base.mjs";
export const createPathHelpers = ({ logger = defaultLogger } = {}) => {
if (!logger || typeof logger.log !== "function") {
throw new TypeError("logger must provide a log(info) function");
}
const execute = (operation, inputType, context, action) => {
let result;
try {
result = action();
} catch (error) {
logger.log({
level: "error",
message: "Path operation failed",
operation,
inputType,
...context,
});
throw error;
}
logger.log({
level: "debug",
message: "Path operation completed",
operation,
inputType,
...context,
resultType: typeof result,
});
return result;
};
const directoryInputType = (metaOrDir) =>
typeof metaOrDir === "string" ? "directory" : "import-meta";
return {
getCurrentFilename: (metaOrDir) =>
execute("getCurrentFilename", directoryInputType(metaOrDir), {}, () =>
getCurrentFilename(metaOrDir),
),
getCurrentDirname: (metaOrDir, dirnameFn) =>
execute(
"getCurrentDirname",
directoryInputType(metaOrDir),
{ customDirname: typeof dirnameFn === "function" },
() => getCurrentDirname(metaOrDir, dirnameFn),
),
path: (metaOrDir, ...segments) =>
execute("path", directoryInputType(metaOrDir), { segmentCount: segments.length }, () =>
path(metaOrDir, ...segments),
),
pathUrl: (metaOrDir, ...segments) =>
execute("pathUrl", directoryInputType(metaOrDir), { segmentCount: segments.length }, () =>
pathUrl(metaOrDir, ...segments),
),
resolvePath: (metaOrDir, ...segments) =>
execute("resolvePath", directoryInputType(metaOrDir), { segmentCount: segments.length }, () =>
resolvePath(metaOrDir, ...segments),
),
relativePath: (metaOrDir, ...segments) =>
execute(
"relativePath",
directoryInputType(metaOrDir),
{ segmentCount: segments.length },
() => relativePath(metaOrDir, ...segments),
),
fileUrlToPath: (fileUrl) =>
execute(
"fileUrlToPath",
fileUrl instanceof URL
? "url-object"
: typeof fileUrl === "string"
? "url-string"
: "other",
{},
() => fileUrlToPath(fileUrl),
),
};
};