shell-dsl 0.0.1 → 0.0.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/README.md +568 -28
- package/dist/cjs/index.cjs +72 -0
- package/dist/cjs/index.cjs.map +10 -0
- package/dist/cjs/package.json +5 -0
- package/dist/cjs/src/errors.cjs +73 -0
- package/dist/cjs/src/errors.cjs.map +10 -0
- package/dist/cjs/src/fs/index.cjs +37 -0
- package/dist/cjs/src/fs/index.cjs.map +10 -0
- package/dist/cjs/src/fs/memfs-adapter.cjs +221 -0
- package/dist/cjs/src/fs/memfs-adapter.cjs.map +10 -0
- package/dist/cjs/src/index.cjs +80 -0
- package/dist/cjs/src/index.cjs.map +10 -0
- package/dist/cjs/src/interpreter/context.cjs +47 -0
- package/dist/cjs/src/interpreter/context.cjs.map +10 -0
- package/dist/cjs/src/interpreter/index.cjs +39 -0
- package/dist/cjs/src/interpreter/index.cjs.map +10 -0
- package/dist/cjs/src/interpreter/interpreter.cjs +321 -0
- package/dist/cjs/src/interpreter/interpreter.cjs.map +10 -0
- package/dist/cjs/src/io/index.cjs +44 -0
- package/dist/cjs/src/io/index.cjs.map +10 -0
- package/dist/cjs/src/io/stdin.cjs +99 -0
- package/dist/cjs/src/io/stdin.cjs.map +10 -0
- package/dist/cjs/src/io/stdout.cjs +158 -0
- package/dist/cjs/src/io/stdout.cjs.map +10 -0
- package/dist/cjs/src/lexer/index.cjs +40 -0
- package/dist/cjs/src/lexer/index.cjs.map +10 -0
- package/dist/cjs/src/lexer/lexer.cjs +335 -0
- package/dist/cjs/src/lexer/lexer.cjs.map +10 -0
- package/dist/cjs/src/lexer/tokens.cjs +66 -0
- package/dist/cjs/src/lexer/tokens.cjs.map +10 -0
- package/dist/cjs/src/parser/ast.cjs +75 -0
- package/dist/cjs/src/parser/ast.cjs.map +10 -0
- package/dist/cjs/src/parser/index.cjs +49 -0
- package/dist/cjs/src/parser/index.cjs.map +10 -0
- package/dist/cjs/src/parser/parser.cjs +216 -0
- package/dist/cjs/src/parser/parser.cjs.map +10 -0
- package/dist/cjs/src/shell-dsl.cjs +162 -0
- package/dist/cjs/src/shell-dsl.cjs.map +10 -0
- package/dist/cjs/src/shell-promise.cjs +159 -0
- package/dist/cjs/src/shell-promise.cjs.map +10 -0
- package/dist/cjs/src/types.cjs +39 -0
- package/dist/cjs/src/types.cjs.map +10 -0
- package/dist/cjs/src/utils/escape.cjs +53 -0
- package/dist/cjs/src/utils/escape.cjs.map +10 -0
- package/dist/cjs/src/utils/index.cjs +38 -0
- package/dist/cjs/src/utils/index.cjs.map +10 -0
- package/dist/mjs/index.mjs +42 -0
- package/dist/mjs/index.mjs.map +10 -0
- package/dist/mjs/package.json +5 -0
- package/dist/mjs/src/errors.mjs +42 -0
- package/dist/mjs/src/errors.mjs.map +10 -0
- package/dist/mjs/src/fs/index.mjs +7 -0
- package/dist/mjs/src/fs/index.mjs.map +10 -0
- package/dist/mjs/src/fs/memfs-adapter.mjs +178 -0
- package/dist/mjs/src/fs/memfs-adapter.mjs.map +10 -0
- package/dist/mjs/src/index.mjs +61 -0
- package/dist/mjs/src/index.mjs.map +10 -0
- package/dist/mjs/src/interpreter/context.mjs +17 -0
- package/dist/mjs/src/interpreter/context.mjs.map +10 -0
- package/dist/mjs/src/interpreter/index.mjs +9 -0
- package/dist/mjs/src/interpreter/index.mjs.map +10 -0
- package/dist/mjs/src/interpreter/interpreter.mjs +291 -0
- package/dist/mjs/src/interpreter/interpreter.mjs.map +10 -0
- package/dist/mjs/src/io/index.mjs +14 -0
- package/dist/mjs/src/io/index.mjs.map +10 -0
- package/dist/mjs/src/io/stdin.mjs +68 -0
- package/dist/mjs/src/io/stdin.mjs.map +10 -0
- package/dist/mjs/src/io/stdout.mjs +127 -0
- package/dist/mjs/src/io/stdout.mjs.map +10 -0
- package/dist/mjs/src/lexer/index.mjs +10 -0
- package/dist/mjs/src/lexer/index.mjs.map +10 -0
- package/dist/mjs/src/lexer/lexer.mjs +305 -0
- package/dist/mjs/src/lexer/lexer.mjs.map +10 -0
- package/dist/mjs/src/lexer/tokens.mjs +36 -0
- package/dist/mjs/src/lexer/tokens.mjs.map +10 -0
- package/dist/mjs/src/parser/ast.mjs +45 -0
- package/dist/mjs/src/parser/ast.mjs.map +10 -0
- package/dist/mjs/src/parser/index.mjs +30 -0
- package/dist/mjs/src/parser/index.mjs.map +10 -0
- package/dist/mjs/src/parser/parser.mjs +189 -0
- package/dist/mjs/src/parser/parser.mjs.map +10 -0
- package/dist/mjs/src/shell-dsl.mjs +132 -0
- package/dist/mjs/src/shell-dsl.mjs.map +10 -0
- package/dist/mjs/src/shell-promise.mjs +129 -0
- package/dist/mjs/src/shell-promise.mjs.map +10 -0
- package/dist/mjs/src/types.mjs +9 -0
- package/dist/mjs/src/types.mjs.map +10 -0
- package/dist/mjs/src/utils/escape.mjs +23 -0
- package/dist/mjs/src/utils/escape.mjs.map +10 -0
- package/dist/mjs/src/utils/index.mjs +8 -0
- package/dist/mjs/src/utils/index.mjs.map +10 -0
- package/dist/types/commands/cat.d.ts +2 -0
- package/dist/types/commands/echo.d.ts +2 -0
- package/dist/types/commands/grep.d.ts +2 -0
- package/dist/types/commands/head.d.ts +2 -0
- package/dist/types/commands/index.d.ts +16 -0
- package/dist/types/commands/ls.d.ts +2 -0
- package/dist/types/commands/mkdir.d.ts +2 -0
- package/dist/types/commands/pwd.d.ts +2 -0
- package/dist/types/commands/rm.d.ts +2 -0
- package/dist/types/commands/sort.d.ts +2 -0
- package/dist/types/commands/tail.d.ts +2 -0
- package/dist/types/commands/test.d.ts +3 -0
- package/dist/types/commands/true-false.d.ts +3 -0
- package/dist/types/commands/uniq.d.ts +2 -0
- package/dist/types/commands/wc.d.ts +2 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/src/errors.d.ts +16 -0
- package/dist/types/src/fs/index.d.ts +1 -0
- package/dist/types/src/fs/memfs-adapter.d.ts +3 -0
- package/dist/types/src/index.d.ts +15 -0
- package/dist/types/src/interpreter/context.d.ts +11 -0
- package/dist/types/src/interpreter/index.d.ts +2 -0
- package/dist/types/src/interpreter/interpreter.d.ts +28 -0
- package/dist/types/src/io/index.d.ts +2 -0
- package/dist/types/src/io/stdin.d.ts +11 -0
- package/dist/types/src/io/stdout.d.ts +27 -0
- package/dist/types/src/lexer/index.d.ts +3 -0
- package/dist/types/src/lexer/lexer.d.ts +24 -0
- package/dist/types/src/lexer/tokens.d.ts +38 -0
- package/dist/types/src/parser/ast.d.ts +64 -0
- package/dist/types/src/parser/index.d.ts +3 -0
- package/dist/types/src/parser/parser.d.ts +23 -0
- package/dist/types/src/shell-dsl.d.ts +31 -0
- package/dist/types/src/shell-promise.d.ts +39 -0
- package/dist/types/src/types.d.ts +71 -0
- package/dist/types/src/utils/escape.d.ts +2 -0
- package/dist/types/src/utils/index.d.ts +1 -0
- package/package.json +46 -6
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __moduleCache = /* @__PURE__ */ new WeakMap;
|
|
6
|
+
var __toCommonJS = (from) => {
|
|
7
|
+
var entry = __moduleCache.get(from), desc;
|
|
8
|
+
if (entry)
|
|
9
|
+
return entry;
|
|
10
|
+
entry = __defProp({}, "__esModule", { value: true });
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function")
|
|
12
|
+
__getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
|
|
13
|
+
get: () => from[key],
|
|
14
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
15
|
+
}));
|
|
16
|
+
__moduleCache.set(from, entry);
|
|
17
|
+
return entry;
|
|
18
|
+
};
|
|
19
|
+
var __export = (target, all) => {
|
|
20
|
+
for (var name in all)
|
|
21
|
+
__defProp(target, name, {
|
|
22
|
+
get: all[name],
|
|
23
|
+
enumerable: true,
|
|
24
|
+
configurable: true,
|
|
25
|
+
set: (newValue) => all[name] = () => newValue
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
// src/shell-promise.ts
|
|
30
|
+
var exports_shell_promise = {};
|
|
31
|
+
__export(exports_shell_promise, {
|
|
32
|
+
ShellPromise: () => ShellPromise
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(exports_shell_promise);
|
|
35
|
+
var import_errors = require("./errors.cjs");
|
|
36
|
+
|
|
37
|
+
class ShellPromise {
|
|
38
|
+
executor;
|
|
39
|
+
cwdOverride;
|
|
40
|
+
envOverride;
|
|
41
|
+
shouldThrow;
|
|
42
|
+
isQuiet;
|
|
43
|
+
cachedResult;
|
|
44
|
+
constructor(options) {
|
|
45
|
+
this.executor = options.execute;
|
|
46
|
+
this.cwdOverride = options.cwdOverride;
|
|
47
|
+
this.envOverride = options.envOverride;
|
|
48
|
+
this.shouldThrow = options.shouldThrow ?? true;
|
|
49
|
+
this.isQuiet = options.quiet ?? false;
|
|
50
|
+
}
|
|
51
|
+
async run() {
|
|
52
|
+
if (!this.cachedResult) {
|
|
53
|
+
this.cachedResult = this.executor({
|
|
54
|
+
cwd: this.cwdOverride,
|
|
55
|
+
env: this.envOverride
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
const result = await this.cachedResult;
|
|
59
|
+
if (this.shouldThrow && result.exitCode !== 0) {
|
|
60
|
+
throw new import_errors.ShellError(`Command failed with exit code ${result.exitCode}`, result.stdout, result.stderr, result.exitCode);
|
|
61
|
+
}
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
then(onfulfilled, onrejected) {
|
|
65
|
+
return this.run().then(onfulfilled, onrejected);
|
|
66
|
+
}
|
|
67
|
+
catch(onrejected) {
|
|
68
|
+
return this.run().catch(onrejected);
|
|
69
|
+
}
|
|
70
|
+
finally(onfinally) {
|
|
71
|
+
return this.run().finally(onfinally);
|
|
72
|
+
}
|
|
73
|
+
async text() {
|
|
74
|
+
const result = await this.run();
|
|
75
|
+
return result.stdout.toString("utf-8");
|
|
76
|
+
}
|
|
77
|
+
async json() {
|
|
78
|
+
const text = await this.text();
|
|
79
|
+
return JSON.parse(text);
|
|
80
|
+
}
|
|
81
|
+
async* lines() {
|
|
82
|
+
const text = await this.text();
|
|
83
|
+
const lines = text.split(`
|
|
84
|
+
`);
|
|
85
|
+
if (lines[lines.length - 1] === "") {
|
|
86
|
+
lines.pop();
|
|
87
|
+
}
|
|
88
|
+
for (const line of lines) {
|
|
89
|
+
yield line;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async blob() {
|
|
93
|
+
const result = await this.run();
|
|
94
|
+
return new Blob([result.stdout]);
|
|
95
|
+
}
|
|
96
|
+
async buffer() {
|
|
97
|
+
const result = await this.run();
|
|
98
|
+
return result.stdout;
|
|
99
|
+
}
|
|
100
|
+
quiet() {
|
|
101
|
+
return new ShellPromise({
|
|
102
|
+
execute: this.executor,
|
|
103
|
+
cwdOverride: this.cwdOverride,
|
|
104
|
+
envOverride: this.envOverride,
|
|
105
|
+
shouldThrow: this.shouldThrow,
|
|
106
|
+
quiet: true
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
nothrow() {
|
|
110
|
+
return new ShellPromise({
|
|
111
|
+
execute: this.executor,
|
|
112
|
+
cwdOverride: this.cwdOverride,
|
|
113
|
+
envOverride: this.envOverride,
|
|
114
|
+
shouldThrow: false,
|
|
115
|
+
quiet: this.isQuiet
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
throws(enable) {
|
|
119
|
+
return new ShellPromise({
|
|
120
|
+
execute: this.executor,
|
|
121
|
+
cwdOverride: this.cwdOverride,
|
|
122
|
+
envOverride: this.envOverride,
|
|
123
|
+
shouldThrow: enable,
|
|
124
|
+
quiet: this.isQuiet
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
cwd(path) {
|
|
128
|
+
return new ShellPromise({
|
|
129
|
+
execute: this.executor,
|
|
130
|
+
cwdOverride: path,
|
|
131
|
+
envOverride: this.envOverride,
|
|
132
|
+
shouldThrow: this.shouldThrow,
|
|
133
|
+
quiet: this.isQuiet
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
env(vars) {
|
|
137
|
+
return new ShellPromise({
|
|
138
|
+
execute: this.executor,
|
|
139
|
+
cwdOverride: this.cwdOverride,
|
|
140
|
+
envOverride: { ...this.envOverride, ...vars },
|
|
141
|
+
shouldThrow: this.shouldThrow,
|
|
142
|
+
quiet: this.isQuiet
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
getCwdOverride() {
|
|
146
|
+
return this.cwdOverride;
|
|
147
|
+
}
|
|
148
|
+
getEnvOverride() {
|
|
149
|
+
return this.envOverride;
|
|
150
|
+
}
|
|
151
|
+
getShouldThrow() {
|
|
152
|
+
return this.shouldThrow;
|
|
153
|
+
}
|
|
154
|
+
getIsQuiet() {
|
|
155
|
+
return this.isQuiet;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
//# debugId=EB0C45A42A4FCC6464756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/shell-promise.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { ExecResult } from \"./types.cjs\";\nimport { ShellError } from \"./errors.cjs\";\n\nexport interface ExecuteOverrides {\n cwd?: string;\n env?: Record<string, string>;\n}\n\nexport interface ShellPromiseOptions {\n execute: (overrides: ExecuteOverrides) => Promise<ExecResult>;\n cwdOverride?: string;\n envOverride?: Record<string, string>;\n shouldThrow?: boolean;\n quiet?: boolean;\n}\n\nexport class ShellPromise implements PromiseLike<ExecResult> {\n private executor: (overrides: ExecuteOverrides) => Promise<ExecResult>;\n private cwdOverride?: string;\n private envOverride?: Record<string, string>;\n private shouldThrow: boolean;\n private isQuiet: boolean;\n private cachedResult?: Promise<ExecResult>;\n\n constructor(options: ShellPromiseOptions) {\n this.executor = options.execute;\n this.cwdOverride = options.cwdOverride;\n this.envOverride = options.envOverride;\n this.shouldThrow = options.shouldThrow ?? true;\n this.isQuiet = options.quiet ?? false;\n }\n\n private async run(): Promise<ExecResult> {\n if (!this.cachedResult) {\n this.cachedResult = this.executor({\n cwd: this.cwdOverride,\n env: this.envOverride,\n });\n }\n\n const result = await this.cachedResult;\n\n if (this.shouldThrow && result.exitCode !== 0) {\n throw new ShellError(\n `Command failed with exit code ${result.exitCode}`,\n result.stdout,\n result.stderr,\n result.exitCode\n );\n }\n\n return result;\n }\n\n then<TResult1 = ExecResult, TResult2 = never>(\n onfulfilled?: ((value: ExecResult) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\n ): Promise<TResult1 | TResult2> {\n return this.run().then(onfulfilled, onrejected);\n }\n\n catch<TResult = never>(\n onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null\n ): Promise<ExecResult | TResult> {\n return this.run().catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<ExecResult> {\n return this.run().finally(onfinally);\n }\n\n // Output formats\n async text(): Promise<string> {\n const result = await this.run();\n return result.stdout.toString(\"utf-8\");\n }\n\n async json<T = unknown>(): Promise<T> {\n const text = await this.text();\n return JSON.parse(text);\n }\n\n async *lines(): AsyncIterable<string> {\n const text = await this.text();\n const lines = text.split(\"\\n\");\n // Remove trailing empty line if present\n if (lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n for (const line of lines) {\n yield line;\n }\n }\n\n async blob(): Promise<Blob> {\n const result = await this.run();\n return new Blob([result.stdout]);\n }\n\n async buffer(): Promise<Buffer> {\n const result = await this.run();\n return result.stdout;\n }\n\n // Behavior modifiers - return new ShellPromise with modified options\n quiet(): ShellPromise {\n return new ShellPromise({\n execute: this.executor,\n cwdOverride: this.cwdOverride,\n envOverride: this.envOverride,\n shouldThrow: this.shouldThrow,\n quiet: true,\n });\n }\n\n nothrow(): ShellPromise {\n return new ShellPromise({\n execute: this.executor,\n cwdOverride: this.cwdOverride,\n envOverride: this.envOverride,\n shouldThrow: false,\n quiet: this.isQuiet,\n });\n }\n\n throws(enable: boolean): ShellPromise {\n return new ShellPromise({\n execute: this.executor,\n cwdOverride: this.cwdOverride,\n envOverride: this.envOverride,\n shouldThrow: enable,\n quiet: this.isQuiet,\n });\n }\n\n // Context overrides - these need to be handled by the shell\n cwd(path: string): ShellPromise {\n return new ShellPromise({\n execute: this.executor,\n cwdOverride: path,\n envOverride: this.envOverride,\n shouldThrow: this.shouldThrow,\n quiet: this.isQuiet,\n });\n }\n\n env(vars: Record<string, string>): ShellPromise {\n return new ShellPromise({\n execute: this.executor,\n cwdOverride: this.cwdOverride,\n envOverride: { ...this.envOverride, ...vars },\n shouldThrow: this.shouldThrow,\n quiet: this.isQuiet,\n });\n }\n\n // Getters for internal state (used by ShellDSL)\n getCwdOverride(): string | undefined {\n return this.cwdOverride;\n }\n\n getEnvOverride(): Record<string, string> | undefined {\n return this.envOverride;\n }\n\n getShouldThrow(): boolean {\n return this.shouldThrow;\n }\n\n getIsQuiet(): boolean {\n return this.isQuiet;\n }\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "EB0C45A42A4FCC6464756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __moduleCache = /* @__PURE__ */ new WeakMap;
|
|
6
|
+
var __toCommonJS = (from) => {
|
|
7
|
+
var entry = __moduleCache.get(from), desc;
|
|
8
|
+
if (entry)
|
|
9
|
+
return entry;
|
|
10
|
+
entry = __defProp({}, "__esModule", { value: true });
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function")
|
|
12
|
+
__getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
|
|
13
|
+
get: () => from[key],
|
|
14
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
15
|
+
}));
|
|
16
|
+
__moduleCache.set(from, entry);
|
|
17
|
+
return entry;
|
|
18
|
+
};
|
|
19
|
+
var __export = (target, all) => {
|
|
20
|
+
for (var name in all)
|
|
21
|
+
__defProp(target, name, {
|
|
22
|
+
get: all[name],
|
|
23
|
+
enumerable: true,
|
|
24
|
+
configurable: true,
|
|
25
|
+
set: (newValue) => all[name] = () => newValue
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
// src/types.ts
|
|
30
|
+
var exports_types = {};
|
|
31
|
+
__export(exports_types, {
|
|
32
|
+
isRawValue: () => isRawValue
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(exports_types);
|
|
35
|
+
function isRawValue(value) {
|
|
36
|
+
return typeof value === "object" && value !== null && "raw" in value && typeof value.raw === "string";
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
//# debugId=113D0A18F6A625F664756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/types.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"// Virtual Filesystem Interface\nexport interface VirtualFS {\n readFile(path: string): Promise<Buffer>;\n readdir(path: string): Promise<string[]>;\n stat(path: string): Promise<FileStat>;\n exists(path: string): Promise<boolean>;\n\n writeFile(path: string, data: Buffer | string): Promise<void>;\n appendFile(path: string, data: Buffer | string): Promise<void>;\n mkdir(path: string, opts?: { recursive?: boolean }): Promise<void>;\n\n rm(path: string, opts?: { recursive?: boolean; force?: boolean }): Promise<void>;\n\n resolve(...paths: string[]): string;\n dirname(path: string): string;\n basename(path: string): string;\n glob(pattern: string, opts?: { cwd?: string }): Promise<string[]>;\n}\n\nexport interface FileStat {\n isFile(): boolean;\n isDirectory(): boolean;\n size: number;\n mtime: Date;\n}\n\n// Command Interfaces\nexport type Command = (ctx: CommandContext) => Promise<number>;\n\nexport interface CommandContext {\n args: string[];\n stdin: Stdin;\n stdout: Stdout;\n stderr: Stderr;\n fs: VirtualFS;\n cwd: string;\n env: Record<string, string>;\n}\n\nexport interface Stdin {\n stream(): AsyncIterable<Uint8Array>;\n buffer(): Promise<Buffer>;\n text(): Promise<string>;\n lines(): AsyncIterable<string>;\n}\n\nexport interface Stdout {\n write(chunk: Uint8Array): Promise<void>;\n writeText(str: string): Promise<void>;\n}\n\nexport interface Stderr {\n write(chunk: Uint8Array): Promise<void>;\n writeText(str: string): Promise<void>;\n}\n\nexport interface OutputCollector extends Stdout {\n close(): void;\n collect(): Promise<Buffer>;\n getReadableStream(): AsyncIterable<Uint8Array>;\n}\n\n// Execution Result\nexport interface ExecResult {\n stdout: Buffer;\n stderr: Buffer;\n exitCode: number;\n}\n\n// Shell Configuration\nexport interface ShellConfig {\n fs: VirtualFS;\n cwd: string;\n env: Record<string, string>;\n commands: Record<string, Command>;\n}\n\n// Raw escape hatch type\nexport interface RawValue {\n raw: string;\n}\n\nexport function isRawValue(value: unknown): value is RawValue {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"raw\" in value &&\n typeof (value as RawValue).raw === \"string\"\n );\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkFO,SAAS,UAAU,CAAC,OAAmC;AAAA,EAC5D,OACE,OAAO,UAAU,YACjB,UAAU,QACV,SAAS,SACT,OAAQ,MAAmB,QAAQ;AAAA;",
|
|
8
|
+
"debugId": "113D0A18F6A625F664756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __moduleCache = /* @__PURE__ */ new WeakMap;
|
|
6
|
+
var __toCommonJS = (from) => {
|
|
7
|
+
var entry = __moduleCache.get(from), desc;
|
|
8
|
+
if (entry)
|
|
9
|
+
return entry;
|
|
10
|
+
entry = __defProp({}, "__esModule", { value: true });
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function")
|
|
12
|
+
__getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
|
|
13
|
+
get: () => from[key],
|
|
14
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
15
|
+
}));
|
|
16
|
+
__moduleCache.set(from, entry);
|
|
17
|
+
return entry;
|
|
18
|
+
};
|
|
19
|
+
var __export = (target, all) => {
|
|
20
|
+
for (var name in all)
|
|
21
|
+
__defProp(target, name, {
|
|
22
|
+
get: all[name],
|
|
23
|
+
enumerable: true,
|
|
24
|
+
configurable: true,
|
|
25
|
+
set: (newValue) => all[name] = () => newValue
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
// src/utils/escape.ts
|
|
30
|
+
var exports_escape = {};
|
|
31
|
+
__export(exports_escape, {
|
|
32
|
+
escapeForInterpolation: () => escapeForInterpolation,
|
|
33
|
+
escape: () => escape
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(exports_escape);
|
|
36
|
+
var SHELL_SPECIAL_CHARS = /[|&;<>()$`\\\"' \t\n*?[\]#~=%]/;
|
|
37
|
+
function escape(str) {
|
|
38
|
+
if (str === "")
|
|
39
|
+
return "''";
|
|
40
|
+
if (!SHELL_SPECIAL_CHARS.test(str)) {
|
|
41
|
+
return str;
|
|
42
|
+
}
|
|
43
|
+
return "'" + str.replace(/'/g, "'\\''") + "'";
|
|
44
|
+
}
|
|
45
|
+
function escapeForInterpolation(value) {
|
|
46
|
+
if (value === null || value === undefined) {
|
|
47
|
+
return "";
|
|
48
|
+
}
|
|
49
|
+
const str = String(value);
|
|
50
|
+
return str.replace(/([|&;<>()$`\\\"' \t\n*?[\]#~=%])/g, "\\$1");
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
//# debugId=5EB64E92B679686C64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/utils/escape.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"const SHELL_SPECIAL_CHARS = /[|&;<>()$`\\\\\\\"' \\t\\n*?[\\]#~=%]/;\n\nexport function escape(str: string): string {\n if (str === \"\") return \"''\";\n\n if (!SHELL_SPECIAL_CHARS.test(str)) {\n return str;\n }\n\n // Escape using single quotes, handling embedded single quotes\n return \"'\" + str.replace(/'/g, \"'\\\\''\") + \"'\";\n}\n\nexport function escapeForInterpolation(value: unknown): string {\n if (value === null || value === undefined) {\n return \"\";\n }\n\n const str = String(value);\n\n // Escape shell special characters\n return str.replace(/([|&;<>()$`\\\\\\\"' \\t\\n*?[\\]#~=%])/g, \"\\\\$1\");\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAM,sBAAsB;AAErB,SAAS,MAAM,CAAC,KAAqB;AAAA,EAC1C,IAAI,QAAQ;AAAA,IAAI,OAAO;AAAA,EAEvB,IAAI,CAAC,oBAAoB,KAAK,GAAG,GAAG;AAAA,IAClC,OAAO;AAAA,EACT;AAAA,EAGA,OAAO,MAAM,IAAI,QAAQ,MAAM,OAAO,IAAI;AAAA;AAGrC,SAAS,sBAAsB,CAAC,OAAwB;AAAA,EAC7D,IAAI,UAAU,QAAQ,UAAU,WAAW;AAAA,IACzC,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,MAAM,OAAO,KAAK;AAAA,EAGxB,OAAO,IAAI,QAAQ,qCAAqC,MAAM;AAAA;",
|
|
8
|
+
"debugId": "5EB64E92B679686C64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __moduleCache = /* @__PURE__ */ new WeakMap;
|
|
6
|
+
var __toCommonJS = (from) => {
|
|
7
|
+
var entry = __moduleCache.get(from), desc;
|
|
8
|
+
if (entry)
|
|
9
|
+
return entry;
|
|
10
|
+
entry = __defProp({}, "__esModule", { value: true });
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function")
|
|
12
|
+
__getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
|
|
13
|
+
get: () => from[key],
|
|
14
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
15
|
+
}));
|
|
16
|
+
__moduleCache.set(from, entry);
|
|
17
|
+
return entry;
|
|
18
|
+
};
|
|
19
|
+
var __export = (target, all) => {
|
|
20
|
+
for (var name in all)
|
|
21
|
+
__defProp(target, name, {
|
|
22
|
+
get: all[name],
|
|
23
|
+
enumerable: true,
|
|
24
|
+
configurable: true,
|
|
25
|
+
set: (newValue) => all[name] = () => newValue
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
// src/utils/index.ts
|
|
30
|
+
var exports_utils = {};
|
|
31
|
+
__export(exports_utils, {
|
|
32
|
+
escapeForInterpolation: () => import_escape.escapeForInterpolation,
|
|
33
|
+
escape: () => import_escape.escape
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(exports_utils);
|
|
36
|
+
var import_escape = require("./escape.cjs");
|
|
37
|
+
|
|
38
|
+
//# debugId=FEDAA6A2654D061F64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/utils/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"export { escape, escapeForInterpolation } from \"./escape.cjs\";\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAA+C,IAA/C;",
|
|
8
|
+
"debugId": "FEDAA6A2654D061F64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// index.ts
|
|
2
|
+
export * from "./src/index.mjs";
|
|
3
|
+
import { builtinCommands } from "./commands/index.mjs";
|
|
4
|
+
import {
|
|
5
|
+
echo,
|
|
6
|
+
cat,
|
|
7
|
+
grep,
|
|
8
|
+
wc,
|
|
9
|
+
head,
|
|
10
|
+
tail,
|
|
11
|
+
sort,
|
|
12
|
+
uniq,
|
|
13
|
+
pwd,
|
|
14
|
+
ls,
|
|
15
|
+
mkdir,
|
|
16
|
+
rm,
|
|
17
|
+
test,
|
|
18
|
+
bracket,
|
|
19
|
+
trueCmd,
|
|
20
|
+
falseCmd
|
|
21
|
+
} from "./commands/index.mjs";
|
|
22
|
+
export {
|
|
23
|
+
wc,
|
|
24
|
+
uniq,
|
|
25
|
+
trueCmd,
|
|
26
|
+
test,
|
|
27
|
+
tail,
|
|
28
|
+
sort,
|
|
29
|
+
rm,
|
|
30
|
+
pwd,
|
|
31
|
+
mkdir,
|
|
32
|
+
ls,
|
|
33
|
+
head,
|
|
34
|
+
grep,
|
|
35
|
+
falseCmd,
|
|
36
|
+
echo,
|
|
37
|
+
cat,
|
|
38
|
+
builtinCommands,
|
|
39
|
+
bracket
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
//# debugId=8985A8E9C45DB77F64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"// Re-export everything from src\nexport * from \"./src/index.mjs\";\n\n// Re-export built-in commands\nexport { builtinCommands } from \"./commands/index.mjs\";\nexport {\n echo,\n cat,\n grep,\n wc,\n head,\n tail,\n sort,\n uniq,\n pwd,\n ls,\n mkdir,\n rm,\n test,\n bracket,\n trueCmd,\n falseCmd,\n} from \"./commands/index.mjs\";\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";AACA;AAGA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
|
|
8
|
+
"debugId": "8985A8E9C45DB77F64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// src/errors.ts
|
|
2
|
+
class ShellError extends Error {
|
|
3
|
+
stdout;
|
|
4
|
+
stderr;
|
|
5
|
+
exitCode;
|
|
6
|
+
constructor(message, stdout, stderr, exitCode) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = "ShellError";
|
|
9
|
+
this.stdout = stdout;
|
|
10
|
+
this.stderr = stderr;
|
|
11
|
+
this.exitCode = exitCode;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
class LexError extends Error {
|
|
16
|
+
position;
|
|
17
|
+
line;
|
|
18
|
+
column;
|
|
19
|
+
constructor(message, position, line, column) {
|
|
20
|
+
super(`Lex error at line ${line}, column ${column}: ${message}`);
|
|
21
|
+
this.name = "LexError";
|
|
22
|
+
this.position = position;
|
|
23
|
+
this.line = line;
|
|
24
|
+
this.column = column;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
class ParseError extends Error {
|
|
29
|
+
position;
|
|
30
|
+
constructor(message, position) {
|
|
31
|
+
super(message);
|
|
32
|
+
this.name = "ParseError";
|
|
33
|
+
this.position = position;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export {
|
|
37
|
+
ShellError,
|
|
38
|
+
ParseError,
|
|
39
|
+
LexError
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
//# debugId=A9B170F479E4EAA464756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/errors.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"export class ShellError extends Error {\n stdout: Buffer;\n stderr: Buffer;\n exitCode: number;\n\n constructor(message: string, stdout: Buffer, stderr: Buffer, exitCode: number) {\n super(message);\n this.name = \"ShellError\";\n this.stdout = stdout;\n this.stderr = stderr;\n this.exitCode = exitCode;\n }\n}\n\nexport class LexError extends Error {\n position: number;\n line: number;\n column: number;\n\n constructor(message: string, position: number, line: number, column: number) {\n super(`Lex error at line ${line}, column ${column}: ${message}`);\n this.name = \"LexError\";\n this.position = position;\n this.line = line;\n this.column = column;\n }\n}\n\nexport class ParseError extends Error {\n position?: number;\n\n constructor(message: string, position?: number) {\n super(message);\n this.name = \"ParseError\";\n this.position = position;\n }\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";AAAO,MAAM,mBAAmB,MAAM;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EAEA,WAAW,CAAC,SAAiB,QAAgB,QAAgB,UAAkB;AAAA,IAC7E,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA,IACZ,KAAK,SAAS;AAAA,IACd,KAAK,SAAS;AAAA,IACd,KAAK,WAAW;AAAA;AAEpB;AAAA;AAEO,MAAM,iBAAiB,MAAM;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EAEA,WAAW,CAAC,SAAiB,UAAkB,MAAc,QAAgB;AAAA,IAC3E,MAAM,qBAAqB,gBAAgB,WAAW,SAAS;AAAA,IAC/D,KAAK,OAAO;AAAA,IACZ,KAAK,WAAW;AAAA,IAChB,KAAK,OAAO;AAAA,IACZ,KAAK,SAAS;AAAA;AAElB;AAAA;AAEO,MAAM,mBAAmB,MAAM;AAAA,EACpC;AAAA,EAEA,WAAW,CAAC,SAAiB,UAAmB;AAAA,IAC9C,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA,IACZ,KAAK,WAAW;AAAA;AAEpB;",
|
|
8
|
+
"debugId": "A9B170F479E4EAA464756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
// src/fs/memfs-adapter.ts
|
|
2
|
+
import * as pathModule from "path";
|
|
3
|
+
function createVirtualFS(memfs) {
|
|
4
|
+
const { promises: fs } = memfs;
|
|
5
|
+
return {
|
|
6
|
+
async readFile(path) {
|
|
7
|
+
const content = await fs.readFile(path);
|
|
8
|
+
return Buffer.from(content);
|
|
9
|
+
},
|
|
10
|
+
async readdir(path) {
|
|
11
|
+
const entries = await fs.readdir(path);
|
|
12
|
+
return entries.map(String);
|
|
13
|
+
},
|
|
14
|
+
async stat(path) {
|
|
15
|
+
const stats = await fs.stat(path);
|
|
16
|
+
return {
|
|
17
|
+
isFile: () => stats.isFile(),
|
|
18
|
+
isDirectory: () => stats.isDirectory(),
|
|
19
|
+
size: Number(stats.size),
|
|
20
|
+
mtime: new Date(stats.mtime)
|
|
21
|
+
};
|
|
22
|
+
},
|
|
23
|
+
async exists(path) {
|
|
24
|
+
try {
|
|
25
|
+
await fs.stat(path);
|
|
26
|
+
return true;
|
|
27
|
+
} catch {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
async writeFile(path, data) {
|
|
32
|
+
await fs.writeFile(path, data);
|
|
33
|
+
},
|
|
34
|
+
async appendFile(path, data) {
|
|
35
|
+
await fs.appendFile(path, data);
|
|
36
|
+
},
|
|
37
|
+
async mkdir(path, opts) {
|
|
38
|
+
await fs.mkdir(path, opts);
|
|
39
|
+
},
|
|
40
|
+
async rm(path, opts) {
|
|
41
|
+
try {
|
|
42
|
+
const stats = await fs.stat(path);
|
|
43
|
+
if (stats.isDirectory()) {
|
|
44
|
+
await fs.rmdir(path, { recursive: opts?.recursive });
|
|
45
|
+
} else {
|
|
46
|
+
await fs.unlink(path);
|
|
47
|
+
}
|
|
48
|
+
} catch (err) {
|
|
49
|
+
if (!opts?.force)
|
|
50
|
+
throw err;
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
resolve(...paths) {
|
|
54
|
+
return pathModule.resolve(...paths);
|
|
55
|
+
},
|
|
56
|
+
dirname(path) {
|
|
57
|
+
return pathModule.dirname(path);
|
|
58
|
+
},
|
|
59
|
+
basename(path) {
|
|
60
|
+
return pathModule.basename(path);
|
|
61
|
+
},
|
|
62
|
+
async glob(pattern, opts) {
|
|
63
|
+
const cwd = opts?.cwd ?? "/";
|
|
64
|
+
return expandGlob(memfs, pattern, cwd);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
async function expandGlob(memfs, pattern, cwd) {
|
|
69
|
+
const { promises: fs } = memfs;
|
|
70
|
+
const patterns = expandBraces(pattern);
|
|
71
|
+
const allMatches = [];
|
|
72
|
+
for (const pat of patterns) {
|
|
73
|
+
const matches = await matchPattern(fs, pat, cwd);
|
|
74
|
+
allMatches.push(...matches);
|
|
75
|
+
}
|
|
76
|
+
return [...new Set(allMatches)].sort();
|
|
77
|
+
}
|
|
78
|
+
function expandBraces(pattern) {
|
|
79
|
+
const braceMatch = pattern.match(/\{([^{}]+)\}/);
|
|
80
|
+
if (!braceMatch)
|
|
81
|
+
return [pattern];
|
|
82
|
+
const before = pattern.slice(0, braceMatch.index);
|
|
83
|
+
const after = pattern.slice(braceMatch.index + braceMatch[0].length);
|
|
84
|
+
const options = braceMatch[1].split(",");
|
|
85
|
+
const results = [];
|
|
86
|
+
for (const opt of options) {
|
|
87
|
+
const expanded = expandBraces(before + opt + after);
|
|
88
|
+
results.push(...expanded);
|
|
89
|
+
}
|
|
90
|
+
return results;
|
|
91
|
+
}
|
|
92
|
+
async function matchPattern(fs, pattern, cwd) {
|
|
93
|
+
const parts = pattern.split("/").filter((p) => p !== "");
|
|
94
|
+
const isAbsolute = pattern.startsWith("/");
|
|
95
|
+
const startDir = isAbsolute ? "/" : cwd;
|
|
96
|
+
return matchParts(fs, parts, startDir, isAbsolute);
|
|
97
|
+
}
|
|
98
|
+
async function matchParts(fs, parts, currentPath, isAbsolute) {
|
|
99
|
+
if (parts.length === 0) {
|
|
100
|
+
return [currentPath];
|
|
101
|
+
}
|
|
102
|
+
const [part, ...rest] = parts;
|
|
103
|
+
if (part === "**") {
|
|
104
|
+
const results = [];
|
|
105
|
+
const withoutStar = await matchParts(fs, rest, currentPath, isAbsolute);
|
|
106
|
+
results.push(...withoutStar);
|
|
107
|
+
try {
|
|
108
|
+
const entries = await fs.readdir(currentPath);
|
|
109
|
+
for (const entry of entries) {
|
|
110
|
+
const entryPath = pathModule.join(currentPath, String(entry));
|
|
111
|
+
try {
|
|
112
|
+
const stat = await fs.stat(entryPath);
|
|
113
|
+
if (stat.isDirectory()) {
|
|
114
|
+
const subMatches = await matchParts(fs, parts, entryPath, isAbsolute);
|
|
115
|
+
results.push(...subMatches);
|
|
116
|
+
}
|
|
117
|
+
} catch {}
|
|
118
|
+
}
|
|
119
|
+
} catch {}
|
|
120
|
+
return results;
|
|
121
|
+
}
|
|
122
|
+
const regex = globToRegex(part);
|
|
123
|
+
try {
|
|
124
|
+
const entries = await fs.readdir(currentPath);
|
|
125
|
+
const results = [];
|
|
126
|
+
for (const entry of entries) {
|
|
127
|
+
const entryName = String(entry);
|
|
128
|
+
if (regex.test(entryName)) {
|
|
129
|
+
const entryPath = pathModule.join(currentPath, entryName);
|
|
130
|
+
if (rest.length === 0) {
|
|
131
|
+
results.push(entryPath);
|
|
132
|
+
} else {
|
|
133
|
+
try {
|
|
134
|
+
const stat = await fs.stat(entryPath);
|
|
135
|
+
if (stat.isDirectory()) {
|
|
136
|
+
const subMatches = await matchParts(fs, rest, entryPath, isAbsolute);
|
|
137
|
+
results.push(...subMatches);
|
|
138
|
+
}
|
|
139
|
+
} catch {}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return results;
|
|
144
|
+
} catch {
|
|
145
|
+
return [];
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
function globToRegex(pattern) {
|
|
149
|
+
let regex = "^";
|
|
150
|
+
for (let i = 0;i < pattern.length; i++) {
|
|
151
|
+
const char = pattern[i];
|
|
152
|
+
if (char === "*") {
|
|
153
|
+
regex += "[^/]*";
|
|
154
|
+
} else if (char === "?") {
|
|
155
|
+
regex += "[^/]";
|
|
156
|
+
} else if (char === "[") {
|
|
157
|
+
let j = i + 1;
|
|
158
|
+
let classContent = "";
|
|
159
|
+
while (j < pattern.length && pattern[j] !== "]") {
|
|
160
|
+
classContent += pattern[j];
|
|
161
|
+
j++;
|
|
162
|
+
}
|
|
163
|
+
regex += `[${classContent}]`;
|
|
164
|
+
i = j;
|
|
165
|
+
} else if (".+^${}()|\\".includes(char)) {
|
|
166
|
+
regex += "\\" + char;
|
|
167
|
+
} else {
|
|
168
|
+
regex += char;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
regex += "$";
|
|
172
|
+
return new RegExp(regex);
|
|
173
|
+
}
|
|
174
|
+
export {
|
|
175
|
+
createVirtualFS
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
//# debugId=018A285E726F353D64756E2164756E21
|