@dbx-tools/fs 0.6.10
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/README.md +60 -0
- package/index.ts +12 -0
- package/lib/index.d.ts +8 -0
- package/lib/index.js +10 -0
- package/lib/src/local-fs.d.ts +154 -0
- package/lib/src/local-fs.js +330 -0
- package/lib/src/local-path.d.ts +23 -0
- package/lib/src/local-path.js +30 -0
- package/lib/src/os-path.d.ts +50 -0
- package/lib/src/os-path.js +143 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/package.json +55 -0
- package/src/local-fs.ts +461 -0
- package/src/local-path.ts +42 -0
- package/src/os-path.ts +167 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local host path helpers for {@link LocalFileSystem}.
|
|
3
|
+
*
|
|
4
|
+
* Home / temp directory resolution lives in {@link ./os-path.ts}; this module
|
|
5
|
+
* owns `~` expansion and root resolution against that home.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import { posixPath } from "@dbx-tools/shared-fs";
|
|
10
|
+
import { type ResolveOsPathsOptions } from "./os-path.ts";
|
|
11
|
+
export { APP_HOME, clearOsPathsCache, resolveLocalHome, resolveLocalTemp, resolveOsPaths, type OsPaths, type ResolveOsPathsOptions, } from "./os-path.ts";
|
|
12
|
+
/** True when {@link input} is `~` or a path under `~/`. See {@link posixPath.isHomeRelativePath}. */
|
|
13
|
+
export declare const isHomeRelativePath: typeof posixPath.isHomeRelativePath;
|
|
14
|
+
/**
|
|
15
|
+
* Expand `~` / `~/...` against {@link home}, joining with the HOST separator.
|
|
16
|
+
* Non-home inputs are returned trimmed and unchanged.
|
|
17
|
+
*/
|
|
18
|
+
export declare function expandLocalHomePath(input: string, home?: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Resolve a local filesystem root: expand `~` when needed, then `path.resolve`
|
|
21
|
+
* (so relative roots still land under `process.cwd()`).
|
|
22
|
+
*/
|
|
23
|
+
export declare function resolveLocalRoot(root: string, options?: ResolveOsPathsOptions): string;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local host path helpers for {@link LocalFileSystem}.
|
|
3
|
+
*
|
|
4
|
+
* Home / temp directory resolution lives in {@link ./os-path.ts}; this module
|
|
5
|
+
* owns `~` expansion and root resolution against that home.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import path from "node:path";
|
|
10
|
+
import { posixPath } from "@dbx-tools/shared-fs";
|
|
11
|
+
import { resolveLocalHome } from "./os-path.js";
|
|
12
|
+
export { APP_HOME, clearOsPathsCache, resolveLocalHome, resolveLocalTemp, resolveOsPaths, } from "./os-path.js";
|
|
13
|
+
/** True when {@link input} is `~` or a path under `~/`. See {@link posixPath.isHomeRelativePath}. */
|
|
14
|
+
export const isHomeRelativePath = posixPath.isHomeRelativePath;
|
|
15
|
+
/**
|
|
16
|
+
* Expand `~` / `~/...` against {@link home}, joining with the HOST separator.
|
|
17
|
+
* Non-home inputs are returned trimmed and unchanged.
|
|
18
|
+
*/
|
|
19
|
+
export function expandLocalHomePath(input, home = resolveLocalHome()) {
|
|
20
|
+
return posixPath.expandHome(input, home, path.join);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Resolve a local filesystem root: expand `~` when needed, then `path.resolve`
|
|
24
|
+
* (so relative roots still land under `process.cwd()`).
|
|
25
|
+
*/
|
|
26
|
+
export function resolveLocalRoot(root, options = {}) {
|
|
27
|
+
const cwd = options.cwd ?? process.cwd();
|
|
28
|
+
return path.resolve(cwd, expandLocalHomePath(root, resolveLocalHome(options)));
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtcGF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sb2NhbC1wYXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFFSCxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBOEIsTUFBTSxjQUFjLENBQUM7QUFFNUUsT0FBTyxFQUNMLFFBQVEsRUFDUixpQkFBaUIsRUFDakIsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixjQUFjLEdBR2YsTUFBTSxjQUFjLENBQUM7QUFFdEIscUdBQXFHO0FBQ3JHLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQztBQUUvRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsS0FBYSxFQUFFLE9BQWUsZ0JBQWdCLEVBQUU7SUFDbEYsT0FBTyxTQUFTLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsSUFBWSxFQUFFLFVBQWlDLEVBQUU7SUFDaEYsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDekMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIExvY2FsIGhvc3QgcGF0aCBoZWxwZXJzIGZvciB7QGxpbmsgTG9jYWxGaWxlU3lzdGVtfS5cbiAqXG4gKiBIb21lIC8gdGVtcCBkaXJlY3RvcnkgcmVzb2x1dGlvbiBsaXZlcyBpbiB7QGxpbmsgLi9vcy1wYXRoLnRzfTsgdGhpcyBtb2R1bGVcbiAqIG93bnMgYH5gIGV4cGFuc2lvbiBhbmQgcm9vdCByZXNvbHV0aW9uIGFnYWluc3QgdGhhdCBob21lLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBwb3NpeFBhdGggfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtZnNcIjtcbmltcG9ydCB7IHJlc29sdmVMb2NhbEhvbWUsIHR5cGUgUmVzb2x2ZU9zUGF0aHNPcHRpb25zIH0gZnJvbSBcIi4vb3MtcGF0aC50c1wiO1xuXG5leHBvcnQge1xuICBBUFBfSE9NRSxcbiAgY2xlYXJPc1BhdGhzQ2FjaGUsXG4gIHJlc29sdmVMb2NhbEhvbWUsXG4gIHJlc29sdmVMb2NhbFRlbXAsXG4gIHJlc29sdmVPc1BhdGhzLFxuICB0eXBlIE9zUGF0aHMsXG4gIHR5cGUgUmVzb2x2ZU9zUGF0aHNPcHRpb25zLFxufSBmcm9tIFwiLi9vcy1wYXRoLnRzXCI7XG5cbi8qKiBUcnVlIHdoZW4ge0BsaW5rIGlucHV0fSBpcyBgfmAgb3IgYSBwYXRoIHVuZGVyIGB+L2AuIFNlZSB7QGxpbmsgcG9zaXhQYXRoLmlzSG9tZVJlbGF0aXZlUGF0aH0uICovXG5leHBvcnQgY29uc3QgaXNIb21lUmVsYXRpdmVQYXRoID0gcG9zaXhQYXRoLmlzSG9tZVJlbGF0aXZlUGF0aDtcblxuLyoqXG4gKiBFeHBhbmQgYH5gIC8gYH4vLi4uYCBhZ2FpbnN0IHtAbGluayBob21lfSwgam9pbmluZyB3aXRoIHRoZSBIT1NUIHNlcGFyYXRvci5cbiAqIE5vbi1ob21lIGlucHV0cyBhcmUgcmV0dXJuZWQgdHJpbW1lZCBhbmQgdW5jaGFuZ2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhwYW5kTG9jYWxIb21lUGF0aChpbnB1dDogc3RyaW5nLCBob21lOiBzdHJpbmcgPSByZXNvbHZlTG9jYWxIb21lKCkpOiBzdHJpbmcge1xuICByZXR1cm4gcG9zaXhQYXRoLmV4cGFuZEhvbWUoaW5wdXQsIGhvbWUsIHBhdGguam9pbik7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGxvY2FsIGZpbGVzeXN0ZW0gcm9vdDogZXhwYW5kIGB+YCB3aGVuIG5lZWRlZCwgdGhlbiBgcGF0aC5yZXNvbHZlYFxuICogKHNvIHJlbGF0aXZlIHJvb3RzIHN0aWxsIGxhbmQgdW5kZXIgYHByb2Nlc3MuY3dkKClgKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVMb2NhbFJvb3Qocm9vdDogc3RyaW5nLCBvcHRpb25zOiBSZXNvbHZlT3NQYXRoc09wdGlvbnMgPSB7fSk6IHN0cmluZyB7XG4gIGNvbnN0IGN3ZCA9IG9wdGlvbnMuY3dkID8/IHByb2Nlc3MuY3dkKCk7XG4gIHJldHVybiBwYXRoLnJlc29sdmUoY3dkLCBleHBhbmRMb2NhbEhvbWVQYXRoKHJvb3QsIHJlc29sdmVMb2NhbEhvbWUob3B0aW9ucykpKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve durable local home and temp directories for Node hosts.
|
|
3
|
+
*
|
|
4
|
+
* Home order (mkdir + write/delete probe; failure skips):
|
|
5
|
+
* 1. `os.homedir()`
|
|
6
|
+
* 2. `HOME` / `USERPROFILE`
|
|
7
|
+
* 3. `/home/app` when {@link databricks.isAppEnv}
|
|
8
|
+
* 4. `./.home` under cwd
|
|
9
|
+
*
|
|
10
|
+
* Temp order (same ensure/probe/skip):
|
|
11
|
+
* 1. `os.tmpdir()`
|
|
12
|
+
* 2. `TMPDIR` / `TMP` / `TEMP`
|
|
13
|
+
* 3. `.tmp` under the resolved home
|
|
14
|
+
*
|
|
15
|
+
* Both paths are memoized per resolved cwd (same idea as
|
|
16
|
+
* `@dbx-tools/core` `project` command caching): cwd is part of the key because
|
|
17
|
+
* the `./.home` / `<home>/.tmp` fallbacks depend on it.
|
|
18
|
+
*
|
|
19
|
+
* @module
|
|
20
|
+
*/
|
|
21
|
+
/** Databricks Apps container home when {@link databricks.isAppEnv}. */
|
|
22
|
+
export declare const APP_HOME = "/home/app";
|
|
23
|
+
/** Resolved home + temp for one cwd. */
|
|
24
|
+
export interface OsPaths {
|
|
25
|
+
readonly home: string;
|
|
26
|
+
readonly tmp: string;
|
|
27
|
+
}
|
|
28
|
+
/** Injectable knobs for {@link resolveOsPaths} (mostly tests). */
|
|
29
|
+
export interface ResolveOsPathsOptions {
|
|
30
|
+
env?: NodeJS.ProcessEnv;
|
|
31
|
+
cwd?: string;
|
|
32
|
+
/** Defaults to `os.homedir`. */
|
|
33
|
+
homeDir?: () => string;
|
|
34
|
+
/** Defaults to `os.tmpdir`. */
|
|
35
|
+
tmpDir?: () => string;
|
|
36
|
+
/** App-env candidate; defaults to {@link APP_HOME}. */
|
|
37
|
+
appHome?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Resolve home + temp for {@link cwd}, memoized when {@link cwd} is the process
|
|
41
|
+
* cwd (an explicit other cwd is computed fresh, matching core `project`
|
|
42
|
+
* caching).
|
|
43
|
+
*/
|
|
44
|
+
export declare function resolveOsPaths(options?: ResolveOsPathsOptions): OsPaths;
|
|
45
|
+
/** {@link resolveOsPaths}.home */
|
|
46
|
+
export declare function resolveLocalHome(options?: ResolveOsPathsOptions): string;
|
|
47
|
+
/** {@link resolveOsPaths}.tmp */
|
|
48
|
+
export declare function resolveLocalTemp(options?: ResolveOsPathsOptions): string;
|
|
49
|
+
/** Drop memoized entries (tests). */
|
|
50
|
+
export declare function clearOsPathsCache(): void;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve durable local home and temp directories for Node hosts.
|
|
3
|
+
*
|
|
4
|
+
* Home order (mkdir + write/delete probe; failure skips):
|
|
5
|
+
* 1. `os.homedir()`
|
|
6
|
+
* 2. `HOME` / `USERPROFILE`
|
|
7
|
+
* 3. `/home/app` when {@link databricks.isAppEnv}
|
|
8
|
+
* 4. `./.home` under cwd
|
|
9
|
+
*
|
|
10
|
+
* Temp order (same ensure/probe/skip):
|
|
11
|
+
* 1. `os.tmpdir()`
|
|
12
|
+
* 2. `TMPDIR` / `TMP` / `TEMP`
|
|
13
|
+
* 3. `.tmp` under the resolved home
|
|
14
|
+
*
|
|
15
|
+
* Both paths are memoized per resolved cwd (same idea as
|
|
16
|
+
* `@dbx-tools/core` `project` command caching): cwd is part of the key because
|
|
17
|
+
* the `./.home` / `<home>/.tmp` fallbacks depend on it.
|
|
18
|
+
*
|
|
19
|
+
* @module
|
|
20
|
+
*/
|
|
21
|
+
import { mkdirSync, unlinkSync, writeFileSync } from "node:fs";
|
|
22
|
+
import { homedir, tmpdir } from "node:os";
|
|
23
|
+
import path from "node:path";
|
|
24
|
+
import { databricks } from "@dbx-tools/appkit";
|
|
25
|
+
/** Databricks Apps container home when {@link databricks.isAppEnv}. */
|
|
26
|
+
export const APP_HOME = "/home/app";
|
|
27
|
+
/** Memoized {@link OsPaths} keyed by resolved cwd. */
|
|
28
|
+
const osPathsCache = new Map();
|
|
29
|
+
/**
|
|
30
|
+
* Resolve home + temp for {@link cwd}, memoized when {@link cwd} is the process
|
|
31
|
+
* cwd (an explicit other cwd is computed fresh, matching core `project`
|
|
32
|
+
* caching).
|
|
33
|
+
*/
|
|
34
|
+
export function resolveOsPaths(options = {}) {
|
|
35
|
+
const cwd = path.resolve(options.cwd ?? process.cwd());
|
|
36
|
+
const cacheEnabled = cwd === path.resolve(process.cwd());
|
|
37
|
+
if (cacheEnabled) {
|
|
38
|
+
const hit = osPathsCache.get(cwd);
|
|
39
|
+
if (hit)
|
|
40
|
+
return hit;
|
|
41
|
+
}
|
|
42
|
+
const env = options.env ?? process.env;
|
|
43
|
+
const home = resolveHome(env, cwd, options);
|
|
44
|
+
const tmp = resolveTemp(env, home, options);
|
|
45
|
+
const resolved = { home, tmp };
|
|
46
|
+
if (cacheEnabled)
|
|
47
|
+
osPathsCache.set(cwd, resolved);
|
|
48
|
+
return resolved;
|
|
49
|
+
}
|
|
50
|
+
/** {@link resolveOsPaths}.home */
|
|
51
|
+
export function resolveLocalHome(options = {}) {
|
|
52
|
+
return resolveOsPaths(options).home;
|
|
53
|
+
}
|
|
54
|
+
/** {@link resolveOsPaths}.tmp */
|
|
55
|
+
export function resolveLocalTemp(options = {}) {
|
|
56
|
+
return resolveOsPaths(options).tmp;
|
|
57
|
+
}
|
|
58
|
+
/** Drop memoized entries (tests). */
|
|
59
|
+
export function clearOsPathsCache() {
|
|
60
|
+
osPathsCache.clear();
|
|
61
|
+
}
|
|
62
|
+
function resolveHome(env, cwd, options) {
|
|
63
|
+
const tried = new Set();
|
|
64
|
+
const candidates = [
|
|
65
|
+
tryCall(options.homeDir ?? homedir),
|
|
66
|
+
env.HOME?.trim(),
|
|
67
|
+
env.USERPROFILE?.trim(),
|
|
68
|
+
databricks.isAppEnv(env) ? (options.appHome ?? APP_HOME) : undefined,
|
|
69
|
+
];
|
|
70
|
+
for (const candidate of candidates) {
|
|
71
|
+
if (!candidate || tried.has(candidate))
|
|
72
|
+
continue;
|
|
73
|
+
tried.add(candidate);
|
|
74
|
+
if (isUsableDir(candidate))
|
|
75
|
+
return candidate;
|
|
76
|
+
}
|
|
77
|
+
const fallback = path.resolve(cwd, ".home");
|
|
78
|
+
if (!isUsableDir(fallback)) {
|
|
79
|
+
throw new Error(`Unable to create a writable home directory at ${fallback}`);
|
|
80
|
+
}
|
|
81
|
+
return fallback;
|
|
82
|
+
}
|
|
83
|
+
function resolveTemp(env, home, options) {
|
|
84
|
+
const tried = new Set();
|
|
85
|
+
// os.tmpdir first, then the standard override env vars (Node checks
|
|
86
|
+
// TMPDIR/TMP/TEMP on POSIX and TEMP/TMP on Windows inside tmpdir itself;
|
|
87
|
+
// listing them again lets a failed create/write fall through to the next).
|
|
88
|
+
const candidates = [
|
|
89
|
+
tryCall(options.tmpDir ?? tmpdir),
|
|
90
|
+
env.TMPDIR?.trim(),
|
|
91
|
+
env.TMP?.trim(),
|
|
92
|
+
env.TEMP?.trim(),
|
|
93
|
+
];
|
|
94
|
+
for (const candidate of candidates) {
|
|
95
|
+
if (!candidate || tried.has(candidate))
|
|
96
|
+
continue;
|
|
97
|
+
tried.add(candidate);
|
|
98
|
+
if (isUsableDir(candidate))
|
|
99
|
+
return candidate;
|
|
100
|
+
}
|
|
101
|
+
const fallback = path.join(home, ".tmp");
|
|
102
|
+
if (!isUsableDir(fallback)) {
|
|
103
|
+
throw new Error(`Unable to create a writable temp directory at ${fallback}`);
|
|
104
|
+
}
|
|
105
|
+
return fallback;
|
|
106
|
+
}
|
|
107
|
+
function tryCall(fn) {
|
|
108
|
+
try {
|
|
109
|
+
return fn().trim() || undefined;
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* True when {@link dir} can be created (if missing) and a probe file can be
|
|
117
|
+
* written then deleted. Read-only or otherwise unusable dirs return false.
|
|
118
|
+
*/
|
|
119
|
+
function isUsableDir(dir) {
|
|
120
|
+
try {
|
|
121
|
+
mkdirSync(dir, { recursive: true });
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
const probe = path.join(dir, `.dbx-os-path-probe-${process.pid}-${process.hrtime.bigint()}`);
|
|
127
|
+
try {
|
|
128
|
+
writeFileSync(probe, "");
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
finally {
|
|
135
|
+
try {
|
|
136
|
+
unlinkSync(probe);
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// Probe cleanup is best-effort; usability already decided by the write.
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3MtcGF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcy1wYXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzFDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFL0MsdUVBQXVFO0FBQ3ZFLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUM7QUFvQnBDLHNEQUFzRDtBQUN0RCxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztBQUVoRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxVQUFpQyxFQUFFO0lBQ2hFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUN2RCxNQUFNLFlBQVksR0FBRyxHQUFHLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUN6RCxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pCLE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsSUFBSSxHQUFHO1lBQUUsT0FBTyxHQUFHLENBQUM7SUFDdEIsQ0FBQztJQUVELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUN2QyxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLENB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QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXNvbHZlIGR1cmFibGUgbG9jYWwgaG9tZSBhbmQgdGVtcCBkaXJlY3RvcmllcyBmb3IgTm9kZSBob3N0cy5cbiAqXG4gKiBIb21lIG9yZGVyIChta2RpciArIHdyaXRlL2RlbGV0ZSBwcm9iZTsgZmFpbHVyZSBza2lwcyk6XG4gKiAxLiBgb3MuaG9tZWRpcigpYFxuICogMi4gYEhPTUVgIC8gYFVTRVJQUk9GSUxFYFxuICogMy4gYC9ob21lL2FwcGAgd2hlbiB7QGxpbmsgZGF0YWJyaWNrcy5pc0FwcEVudn1cbiAqIDQuIGAuLy5ob21lYCB1bmRlciBjd2RcbiAqXG4gKiBUZW1wIG9yZGVyIChzYW1lIGVuc3VyZS9wcm9iZS9za2lwKTpcbiAqIDEuIGBvcy50bXBkaXIoKWBcbiAqIDIuIGBUTVBESVJgIC8gYFRNUGAgLyBgVEVNUGBcbiAqIDMuIGAudG1wYCB1bmRlciB0aGUgcmVzb2x2ZWQgaG9tZVxuICpcbiAqIEJvdGggcGF0aHMgYXJlIG1lbW9pemVkIHBlciByZXNvbHZlZCBjd2QgKHNhbWUgaWRlYSBhc1xuICogYEBkYngtdG9vbHMvY29yZWAgYHByb2plY3RgIGNvbW1hbmQgY2FjaGluZyk6IGN3ZCBpcyBwYXJ0IG9mIHRoZSBrZXkgYmVjYXVzZVxuICogdGhlIGAuLy5ob21lYCAvIGA8aG9tZT4vLnRtcGAgZmFsbGJhY2tzIGRlcGVuZCBvbiBpdC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbWtkaXJTeW5jLCB1bmxpbmtTeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGhvbWVkaXIsIHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBkYXRhYnJpY2tzIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5cbi8qKiBEYXRhYnJpY2tzIEFwcHMgY29udGFpbmVyIGhvbWUgd2hlbiB7QGxpbmsgZGF0YWJyaWNrcy5pc0FwcEVudn0uICovXG5leHBvcnQgY29uc3QgQVBQX0hPTUUgPSBcIi9ob21lL2FwcFwiO1xuXG4vKiogUmVzb2x2ZWQgaG9tZSArIHRlbXAgZm9yIG9uZSBjd2QuICovXG5leHBvcnQgaW50ZXJmYWNlIE9zUGF0aHMge1xuICByZWFkb25seSBob21lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRtcDogc3RyaW5nO1xufVxuXG4vKiogSW5qZWN0YWJsZSBrbm9icyBmb3Ige0BsaW5rIHJlc29sdmVPc1BhdGhzfSAobW9zdGx5IHRlc3RzKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZU9zUGF0aHNPcHRpb25zIHtcbiAgZW52PzogTm9kZUpTLlByb2Nlc3NFbnY7XG4gIGN3ZD86IHN0cmluZztcbiAgLyoqIERlZmF1bHRzIHRvIGBvcy5ob21lZGlyYC4gKi9cbiAgaG9tZURpcj86ICgpID0+IHN0cmluZztcbiAgLyoqIERlZmF1bHRzIHRvIGBvcy50bXBkaXJgLiAqL1xuICB0bXBEaXI/OiAoKSA9PiBzdHJpbmc7XG4gIC8qKiBBcHAtZW52IGNhbmRpZGF0ZTsgZGVmYXVsdHMgdG8ge0BsaW5rIEFQUF9IT01FfS4gKi9cbiAgYXBwSG9tZT86IHN0cmluZztcbn1cblxuLyoqIE1lbW9pemVkIHtAbGluayBPc1BhdGhzfSBrZXllZCBieSByZXNvbHZlZCBjd2QuICovXG5jb25zdCBvc1BhdGhzQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgT3NQYXRocz4oKTtcblxuLyoqXG4gKiBSZXNvbHZlIGhvbWUgKyB0ZW1wIGZvciB7QGxpbmsgY3dkfSwgbWVtb2l6ZWQgd2hlbiB7QGxpbmsgY3dkfSBpcyB0aGUgcHJvY2Vzc1xuICogY3dkIChhbiBleHBsaWNpdCBvdGhlciBjd2QgaXMgY29tcHV0ZWQgZnJlc2gsIG1hdGNoaW5nIGNvcmUgYHByb2plY3RgXG4gKiBjYWNoaW5nKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVPc1BhdGhzKG9wdGlvbnM6IFJlc29sdmVPc1BhdGhzT3B0aW9ucyA9IHt9KTogT3NQYXRocyB7XG4gIGNvbnN0IGN3ZCA9IHBhdGgucmVzb2x2ZShvcHRpb25zLmN3ZCA/PyBwcm9jZXNzLmN3ZCgpKTtcbiAgY29uc3QgY2FjaGVFbmFibGVkID0gY3dkID09PSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSk7XG4gIGlmIChjYWNoZUVuYWJsZWQpIHtcbiAgICBjb25zdCBoaXQgPSBvc1BhdGhzQ2FjaGUuZ2V0KGN3ZCk7XG4gICAgaWYgKGhpdCkgcmV0dXJuIGhpdDtcbiAgfVxuXG4gIGNvbnN0IGVudiA9IG9wdGlvbnMuZW52ID8/IHByb2Nlc3MuZW52O1xuICBjb25zdCBob21lID0gcmVzb2x2ZUhvbWUoZW52LCBjd2QsIG9wdGlvbnMpO1xuICBjb25zdCB0bXAgPSByZXNvbHZlVGVtcChlbnYsIGhvbWUsIG9wdGlvbnMpO1xuICBjb25zdCByZXNvbHZlZDogT3NQYXRocyA9IHsgaG9tZSwgdG1wIH07XG5cbiAgaWYgKGNhY2hlRW5hYmxlZCkgb3NQYXRoc0NhY2hlLnNldChjd2QsIHJlc29sdmVkKTtcbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuXG4vKioge0BsaW5rIHJlc29sdmVPc1BhdGhzfS5ob21lICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUxvY2FsSG9tZShvcHRpb25zOiBSZXNvbHZlT3NQYXRoc09wdGlvbnMgPSB7fSk6IHN0cmluZyB7XG4gIHJldHVybiByZXNvbHZlT3NQYXRocyhvcHRpb25zKS5ob21lO1xufVxuXG4vKioge0BsaW5rIHJlc29sdmVPc1BhdGhzfS50bXAgKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTG9jYWxUZW1wKG9wdGlvbnM6IFJlc29sdmVPc1BhdGhzT3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlc29sdmVPc1BhdGhzKG9wdGlvbnMpLnRtcDtcbn1cblxuLyoqIERyb3AgbWVtb2l6ZWQgZW50cmllcyAodGVzdHMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyT3NQYXRoc0NhY2hlKCk6IHZvaWQge1xuICBvc1BhdGhzQ2FjaGUuY2xlYXIoKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUhvbWUoZW52OiBOb2RlSlMuUHJvY2Vzc0VudiwgY3dkOiBzdHJpbmcsIG9wdGlvbnM6IFJlc29sdmVPc1BhdGhzT3B0aW9ucyk6IHN0cmluZyB7XG4gIGNvbnN0IHRyaWVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGNhbmRpZGF0ZXM6IEFycmF5PHN0cmluZyB8IHVuZGVmaW5lZD4gPSBbXG4gICAgdHJ5Q2FsbChvcHRpb25zLmhvbWVEaXIgPz8gaG9tZWRpciksXG4gICAgZW52LkhPTUU/LnRyaW0oKSxcbiAgICBlbnYuVVNFUlBST0ZJTEU/LnRyaW0oKSxcbiAgICBkYXRhYnJpY2tzLmlzQXBwRW52KGVudikgPyAob3B0aW9ucy5hcHBIb21lID8/IEFQUF9IT01FKSA6IHVuZGVmaW5lZCxcbiAgXTtcblxuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgaWYgKCFjYW5kaWRhdGUgfHwgdHJpZWQuaGFzKGNhbmRpZGF0ZSkpIGNvbnRpbnVlO1xuICAgIHRyaWVkLmFkZChjYW5kaWRhdGUpO1xuICAgIGlmIChpc1VzYWJsZURpcihjYW5kaWRhdGUpKSByZXR1cm4gY2FuZGlkYXRlO1xuICB9XG5cbiAgY29uc3QgZmFsbGJhY2sgPSBwYXRoLnJlc29sdmUoY3dkLCBcIi5ob21lXCIpO1xuICBpZiAoIWlzVXNhYmxlRGlyKGZhbGxiYWNrKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGNyZWF0ZSBhIHdyaXRhYmxlIGhvbWUgZGlyZWN0b3J5IGF0ICR7ZmFsbGJhY2t9YCk7XG4gIH1cbiAgcmV0dXJuIGZhbGxiYWNrO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlVGVtcChlbnY6IE5vZGVKUy5Qcm9jZXNzRW52LCBob21lOiBzdHJpbmcsIG9wdGlvbnM6IFJlc29sdmVPc1BhdGhzT3B0aW9ucyk6IHN0cmluZyB7XG4gIGNvbnN0IHRyaWVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8vIG9zLnRtcGRpciBmaXJzdCwgdGhlbiB0aGUgc3RhbmRhcmQgb3ZlcnJpZGUgZW52IHZhcnMgKE5vZGUgY2hlY2tzXG4gIC8vIFRNUERJUi9UTVAvVEVNUCBvbiBQT1NJWCBhbmQgVEVNUC9UTVAgb24gV2luZG93cyBpbnNpZGUgdG1wZGlyIGl0c2VsZjtcbiAgLy8gbGlzdGluZyB0aGVtIGFnYWluIGxldHMgYSBmYWlsZWQgY3JlYXRlL3dyaXRlIGZhbGwgdGhyb3VnaCB0byB0aGUgbmV4dCkuXG4gIGNvbnN0IGNhbmRpZGF0ZXM6IEFycmF5PHN0cmluZyB8IHVuZGVmaW5lZD4gPSBbXG4gICAgdHJ5Q2FsbChvcHRpb25zLnRtcERpciA/PyB0bXBkaXIpLFxuICAgIGVudi5UTVBESVI/LnRyaW0oKSxcbiAgICBlbnYuVE1QPy50cmltKCksXG4gICAgZW52LlRFTVA/LnRyaW0oKSxcbiAgXTtcblxuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgaWYgKCFjYW5kaWRhdGUgfHwgdHJpZWQuaGFzKGNhbmRpZGF0ZSkpIGNvbnRpbnVlO1xuICAgIHRyaWVkLmFkZChjYW5kaWRhdGUpO1xuICAgIGlmIChpc1VzYWJsZURpcihjYW5kaWRhdGUpKSByZXR1cm4gY2FuZGlkYXRlO1xuICB9XG5cbiAgY29uc3QgZmFsbGJhY2sgPSBwYXRoLmpvaW4oaG9tZSwgXCIudG1wXCIpO1xuICBpZiAoIWlzVXNhYmxlRGlyKGZhbGxiYWNrKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGNyZWF0ZSBhIHdyaXRhYmxlIHRlbXAgZGlyZWN0b3J5IGF0ICR7ZmFsbGJhY2t9YCk7XG4gIH1cbiAgcmV0dXJuIGZhbGxiYWNrO1xufVxuXG5mdW5jdGlvbiB0cnlDYWxsKGZuOiAoKSA9PiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpLnRyaW0oKSB8fCB1bmRlZmluZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBUcnVlIHdoZW4ge0BsaW5rIGRpcn0gY2FuIGJlIGNyZWF0ZWQgKGlmIG1pc3NpbmcpIGFuZCBhIHByb2JlIGZpbGUgY2FuIGJlXG4gKiB3cml0dGVuIHRoZW4gZGVsZXRlZC4gUmVhZC1vbmx5IG9yIG90aGVyd2lzZSB1bnVzYWJsZSBkaXJzIHJldHVybiBmYWxzZS5cbiAqL1xuZnVuY3Rpb24gaXNVc2FibGVEaXIoZGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgcHJvYmUgPSBwYXRoLmpvaW4oZGlyLCBgLmRieC1vcy1wYXRoLXByb2JlLSR7cHJvY2Vzcy5waWR9LSR7cHJvY2Vzcy5ocnRpbWUuYmlnaW50KCl9YCk7XG4gIHRyeSB7XG4gICAgd3JpdGVGaWxlU3luYyhwcm9iZSwgXCJcIik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgdW5saW5rU3luYyhwcm9iZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBQcm9iZSBjbGVhbnVwIGlzIGJlc3QtZWZmb3J0OyB1c2FiaWxpdHkgYWxyZWFkeSBkZWNpZGVkIGJ5IHRoZSB3cml0ZS5cbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"root":["../src/local-fs.ts","../src/local-path.ts","../src/os-path.ts","../index.ts"],"version":"5.9.3"}
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@dbx-tools/fs",
|
|
3
|
+
"repository": {
|
|
4
|
+
"type": "git",
|
|
5
|
+
"url": "git+https://github.com/reggie-db/dbx-tools.git",
|
|
6
|
+
"directory": "packages/node/fs"
|
|
7
|
+
},
|
|
8
|
+
"devDependencies": {
|
|
9
|
+
"@types/node": "^24.6.0",
|
|
10
|
+
"tsx": "^4.23.0",
|
|
11
|
+
"typescript": "^5.9.3"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@dbx-tools/appkit": "0.6.10",
|
|
15
|
+
"@dbx-tools/shared-core": "0.6.10",
|
|
16
|
+
"@dbx-tools/shared-fs": "0.6.10"
|
|
17
|
+
},
|
|
18
|
+
"main": "./lib/index.js",
|
|
19
|
+
"license": "UNLICENSED",
|
|
20
|
+
"publishConfig": {
|
|
21
|
+
"access": "public"
|
|
22
|
+
},
|
|
23
|
+
"version": "0.6.10",
|
|
24
|
+
"types": "./lib/index.d.ts",
|
|
25
|
+
"type": "module",
|
|
26
|
+
"exports": {
|
|
27
|
+
".": {
|
|
28
|
+
"types": "./lib/index.d.ts",
|
|
29
|
+
"default": "./lib/index.js"
|
|
30
|
+
},
|
|
31
|
+
"./package.json": "./package.json"
|
|
32
|
+
},
|
|
33
|
+
"files": [
|
|
34
|
+
"index.ts",
|
|
35
|
+
"src",
|
|
36
|
+
"lib"
|
|
37
|
+
],
|
|
38
|
+
"dbxToolsConfig": {
|
|
39
|
+
"tags": [
|
|
40
|
+
"node"
|
|
41
|
+
]
|
|
42
|
+
},
|
|
43
|
+
"//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"pnpm exec projen\".",
|
|
44
|
+
"scripts": {
|
|
45
|
+
"build": "projen build",
|
|
46
|
+
"compile": "projen compile",
|
|
47
|
+
"default": "projen default",
|
|
48
|
+
"package": "projen package",
|
|
49
|
+
"post-compile": "projen post-compile",
|
|
50
|
+
"pre-compile": "projen pre-compile",
|
|
51
|
+
"test": "projen test",
|
|
52
|
+
"watch": "projen watch",
|
|
53
|
+
"projen": "projen"
|
|
54
|
+
}
|
|
55
|
+
}
|