shell-dsl 0.0.6 → 0.0.8

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.
Files changed (197) hide show
  1. package/README.md +3 -1
  2. package/dist/cjs/index.cjs +14 -4
  3. package/dist/cjs/index.cjs.map +3 -3
  4. package/dist/cjs/package.json +1 -1
  5. package/dist/cjs/src/commands/awk/awk.cjs +276 -0
  6. package/dist/cjs/src/commands/awk/awk.cjs.map +10 -0
  7. package/dist/cjs/src/commands/break-continue/break-continue.cjs +56 -0
  8. package/dist/cjs/src/commands/break-continue/break-continue.cjs.map +10 -0
  9. package/dist/cjs/src/commands/cat/cat.cjs +57 -0
  10. package/dist/cjs/src/commands/cat/cat.cjs.map +10 -0
  11. package/dist/cjs/src/commands/cp/cp.cjs +126 -0
  12. package/dist/cjs/src/commands/cp/cp.cjs.map +10 -0
  13. package/dist/cjs/src/commands/echo/echo.cjs +50 -0
  14. package/dist/cjs/src/commands/echo/echo.cjs.map +10 -0
  15. package/dist/cjs/src/commands/find/find.cjs +251 -0
  16. package/dist/cjs/src/commands/find/find.cjs.map +10 -0
  17. package/dist/cjs/src/commands/grep/grep.cjs +510 -0
  18. package/dist/cjs/src/commands/grep/grep.cjs.map +10 -0
  19. package/dist/cjs/src/commands/head/head.cjs +95 -0
  20. package/dist/cjs/src/commands/head/head.cjs.map +10 -0
  21. package/dist/cjs/src/commands/index.cjs +136 -0
  22. package/dist/cjs/src/commands/index.cjs.map +10 -0
  23. package/dist/cjs/src/commands/ls/ls.cjs +119 -0
  24. package/dist/cjs/src/commands/ls/ls.cjs.map +10 -0
  25. package/dist/cjs/src/commands/mkdir/mkdir.cjs +64 -0
  26. package/dist/cjs/src/commands/mkdir/mkdir.cjs.map +10 -0
  27. package/dist/cjs/src/commands/mv/mv.cjs +118 -0
  28. package/dist/cjs/src/commands/mv/mv.cjs.map +10 -0
  29. package/dist/cjs/src/commands/pwd/pwd.cjs +41 -0
  30. package/dist/cjs/src/commands/pwd/pwd.cjs.map +10 -0
  31. package/dist/cjs/src/commands/rm/rm.cjs +82 -0
  32. package/dist/cjs/src/commands/rm/rm.cjs.map +10 -0
  33. package/dist/cjs/src/commands/sed/sed.cjs +218 -0
  34. package/dist/cjs/src/commands/sed/sed.cjs.map +10 -0
  35. package/dist/cjs/src/commands/sort/sort.cjs +105 -0
  36. package/dist/cjs/src/commands/sort/sort.cjs.map +10 -0
  37. package/dist/cjs/src/commands/tail/tail.cjs +95 -0
  38. package/dist/cjs/src/commands/tail/tail.cjs.map +10 -0
  39. package/dist/cjs/src/commands/tee/tee.cjs +65 -0
  40. package/dist/cjs/src/commands/tee/tee.cjs.map +10 -0
  41. package/dist/cjs/src/commands/test/test.cjs +148 -0
  42. package/dist/cjs/src/commands/test/test.cjs.map +10 -0
  43. package/dist/cjs/src/commands/touch/touch.cjs +70 -0
  44. package/dist/cjs/src/commands/touch/touch.cjs.map +10 -0
  45. package/dist/cjs/src/commands/tree/tree.cjs +161 -0
  46. package/dist/cjs/src/commands/tree/tree.cjs.map +10 -0
  47. package/dist/cjs/src/commands/true-false/true-false.cjs +43 -0
  48. package/dist/cjs/src/commands/true-false/true-false.cjs.map +10 -0
  49. package/dist/cjs/src/commands/uniq/uniq.cjs +116 -0
  50. package/dist/cjs/src/commands/uniq/uniq.cjs.map +10 -0
  51. package/dist/cjs/src/commands/wc/wc.cjs +116 -0
  52. package/dist/cjs/src/commands/wc/wc.cjs.map +10 -0
  53. package/dist/cjs/src/index.cjs +10 -2
  54. package/dist/cjs/src/index.cjs.map +3 -3
  55. package/dist/cjs/src/interpreter/index.cjs +4 -2
  56. package/dist/cjs/src/interpreter/index.cjs.map +3 -3
  57. package/dist/cjs/src/interpreter/interpreter.cjs +390 -2
  58. package/dist/cjs/src/interpreter/interpreter.cjs.map +3 -3
  59. package/dist/cjs/src/lexer/index.cjs +3 -2
  60. package/dist/cjs/src/lexer/index.cjs.map +3 -3
  61. package/dist/cjs/src/lexer/lexer.cjs +359 -8
  62. package/dist/cjs/src/lexer/lexer.cjs.map +3 -3
  63. package/dist/cjs/src/lexer/tokens.cjs +35 -2
  64. package/dist/cjs/src/lexer/tokens.cjs.map +3 -3
  65. package/dist/cjs/src/parser/ast.cjs +25 -1
  66. package/dist/cjs/src/parser/ast.cjs.map +3 -3
  67. package/dist/cjs/src/parser/index.cjs +7 -1
  68. package/dist/cjs/src/parser/index.cjs.map +3 -3
  69. package/dist/cjs/src/parser/parser.cjs +280 -8
  70. package/dist/cjs/src/parser/parser.cjs.map +3 -3
  71. package/dist/cjs/src/shell-dsl.cjs +2 -2
  72. package/dist/cjs/src/shell-dsl.cjs.map +3 -3
  73. package/dist/mjs/index.mjs +25 -5
  74. package/dist/mjs/index.mjs.map +3 -3
  75. package/dist/mjs/package.json +1 -1
  76. package/dist/mjs/src/commands/awk/awk.mjs +246 -0
  77. package/dist/mjs/src/commands/awk/awk.mjs.map +10 -0
  78. package/dist/mjs/src/commands/break-continue/break-continue.mjs +26 -0
  79. package/dist/mjs/src/commands/break-continue/break-continue.mjs.map +10 -0
  80. package/dist/mjs/src/commands/cat/cat.mjs +27 -0
  81. package/dist/mjs/src/commands/cat/cat.mjs.map +10 -0
  82. package/dist/mjs/src/commands/cp/cp.mjs +96 -0
  83. package/dist/mjs/src/commands/cp/cp.mjs.map +10 -0
  84. package/dist/mjs/src/commands/echo/echo.mjs +20 -0
  85. package/dist/mjs/src/commands/echo/echo.mjs.map +10 -0
  86. package/dist/mjs/src/commands/find/find.mjs +221 -0
  87. package/dist/mjs/src/commands/find/find.mjs.map +10 -0
  88. package/dist/mjs/src/commands/grep/grep.mjs +480 -0
  89. package/dist/mjs/src/commands/grep/grep.mjs.map +10 -0
  90. package/dist/mjs/src/commands/head/head.mjs +65 -0
  91. package/dist/mjs/src/commands/head/head.mjs.map +10 -0
  92. package/dist/mjs/src/commands/index.mjs +106 -0
  93. package/dist/mjs/src/commands/index.mjs.map +10 -0
  94. package/dist/mjs/src/commands/ls/ls.mjs +89 -0
  95. package/dist/mjs/src/commands/ls/ls.mjs.map +10 -0
  96. package/dist/mjs/src/commands/mkdir/mkdir.mjs +34 -0
  97. package/dist/mjs/src/commands/mkdir/mkdir.mjs.map +10 -0
  98. package/dist/mjs/src/commands/mv/mv.mjs +88 -0
  99. package/dist/mjs/src/commands/mv/mv.mjs.map +10 -0
  100. package/dist/mjs/src/commands/pwd/pwd.mjs +11 -0
  101. package/dist/mjs/src/commands/pwd/pwd.mjs.map +10 -0
  102. package/dist/mjs/src/commands/rm/rm.mjs +52 -0
  103. package/dist/mjs/src/commands/rm/rm.mjs.map +10 -0
  104. package/dist/mjs/src/commands/sed/sed.mjs +188 -0
  105. package/dist/mjs/src/commands/sed/sed.mjs.map +10 -0
  106. package/dist/mjs/src/commands/sort/sort.mjs +75 -0
  107. package/dist/mjs/src/commands/sort/sort.mjs.map +10 -0
  108. package/dist/mjs/src/commands/tail/tail.mjs +65 -0
  109. package/dist/mjs/src/commands/tail/tail.mjs.map +10 -0
  110. package/dist/mjs/src/commands/tee/tee.mjs +35 -0
  111. package/dist/mjs/src/commands/tee/tee.mjs.map +10 -0
  112. package/dist/mjs/src/commands/test/test.mjs +118 -0
  113. package/dist/mjs/src/commands/test/test.mjs.map +10 -0
  114. package/dist/mjs/src/commands/touch/touch.mjs +40 -0
  115. package/dist/mjs/src/commands/touch/touch.mjs.map +10 -0
  116. package/dist/mjs/src/commands/tree/tree.mjs +131 -0
  117. package/dist/mjs/src/commands/tree/tree.mjs.map +10 -0
  118. package/dist/mjs/src/commands/true-false/true-false.mjs +13 -0
  119. package/dist/mjs/src/commands/true-false/true-false.mjs.map +10 -0
  120. package/dist/mjs/src/commands/uniq/uniq.mjs +86 -0
  121. package/dist/mjs/src/commands/uniq/uniq.mjs.map +10 -0
  122. package/dist/mjs/src/commands/wc/wc.mjs +86 -0
  123. package/dist/mjs/src/commands/wc/wc.mjs.map +10 -0
  124. package/dist/mjs/src/index.mjs +18 -4
  125. package/dist/mjs/src/index.mjs.map +3 -3
  126. package/dist/mjs/src/interpreter/index.mjs +5 -3
  127. package/dist/mjs/src/interpreter/index.mjs.map +2 -2
  128. package/dist/mjs/src/interpreter/interpreter.mjs +390 -2
  129. package/dist/mjs/src/interpreter/interpreter.mjs.map +3 -3
  130. package/dist/mjs/src/lexer/index.mjs +4 -3
  131. package/dist/mjs/src/lexer/index.mjs.map +2 -2
  132. package/dist/mjs/src/lexer/lexer.mjs +359 -8
  133. package/dist/mjs/src/lexer/lexer.mjs.map +3 -3
  134. package/dist/mjs/src/lexer/tokens.mjs +35 -2
  135. package/dist/mjs/src/lexer/tokens.mjs.map +3 -3
  136. package/dist/mjs/src/parser/ast.mjs +25 -1
  137. package/dist/mjs/src/parser/ast.mjs.map +3 -3
  138. package/dist/mjs/src/parser/index.mjs +14 -2
  139. package/dist/mjs/src/parser/index.mjs.map +3 -3
  140. package/dist/mjs/src/parser/parser.mjs +280 -8
  141. package/dist/mjs/src/parser/parser.mjs.map +3 -3
  142. package/dist/mjs/src/shell-dsl.mjs +2 -2
  143. package/dist/mjs/src/shell-dsl.mjs.map +3 -3
  144. package/dist/types/index.d.ts +2 -2
  145. package/dist/types/src/commands/awk/awk.d.ts +2 -0
  146. package/dist/types/src/commands/break-continue/break-continue.d.ts +3 -0
  147. package/dist/types/src/commands/cat/cat.d.ts +2 -0
  148. package/dist/types/src/commands/cp/cp.d.ts +2 -0
  149. package/dist/types/src/commands/echo/echo.d.ts +2 -0
  150. package/dist/types/src/commands/find/find.d.ts +2 -0
  151. package/dist/types/src/commands/grep/grep.d.ts +2 -0
  152. package/dist/types/src/commands/head/head.d.ts +2 -0
  153. package/dist/types/src/commands/index.d.ts +25 -0
  154. package/dist/types/src/commands/ls/ls.d.ts +2 -0
  155. package/dist/types/src/commands/mkdir/mkdir.d.ts +2 -0
  156. package/dist/types/src/commands/mv/mv.d.ts +2 -0
  157. package/dist/types/src/commands/pwd/pwd.d.ts +2 -0
  158. package/dist/types/src/commands/rm/rm.d.ts +2 -0
  159. package/dist/types/src/commands/sed/sed.d.ts +2 -0
  160. package/dist/types/src/commands/sort/sort.d.ts +2 -0
  161. package/dist/types/src/commands/tail/tail.d.ts +2 -0
  162. package/dist/types/src/commands/tee/tee.d.ts +2 -0
  163. package/dist/types/{commands → src/commands/test}/test.d.ts +1 -1
  164. package/dist/types/src/commands/touch/touch.d.ts +2 -0
  165. package/dist/types/src/commands/tree/tree.d.ts +2 -0
  166. package/dist/types/{commands → src/commands/true-false}/true-false.d.ts +1 -1
  167. package/dist/types/src/commands/uniq/uniq.d.ts +2 -0
  168. package/dist/types/src/commands/wc/wc.d.ts +2 -0
  169. package/dist/types/src/index.d.ts +3 -3
  170. package/dist/types/src/interpreter/index.d.ts +1 -1
  171. package/dist/types/src/interpreter/interpreter.d.ts +18 -0
  172. package/dist/types/src/lexer/index.d.ts +2 -2
  173. package/dist/types/src/lexer/lexer.d.ts +16 -2
  174. package/dist/types/src/lexer/tokens.d.ts +20 -0
  175. package/dist/types/src/parser/ast.d.ts +47 -1
  176. package/dist/types/src/parser/index.d.ts +2 -2
  177. package/dist/types/src/parser/parser.d.ts +15 -0
  178. package/package.json +1 -1
  179. package/dist/types/commands/cat.d.ts +0 -2
  180. package/dist/types/commands/cp.d.ts +0 -2
  181. package/dist/types/commands/echo.d.ts +0 -2
  182. package/dist/types/commands/find.d.ts +0 -2
  183. package/dist/types/commands/grep.d.ts +0 -2
  184. package/dist/types/commands/head.d.ts +0 -2
  185. package/dist/types/commands/index.d.ts +0 -22
  186. package/dist/types/commands/ls.d.ts +0 -2
  187. package/dist/types/commands/mkdir.d.ts +0 -2
  188. package/dist/types/commands/mv.d.ts +0 -2
  189. package/dist/types/commands/pwd.d.ts +0 -2
  190. package/dist/types/commands/rm.d.ts +0 -2
  191. package/dist/types/commands/sort.d.ts +0 -2
  192. package/dist/types/commands/tail.d.ts +0 -2
  193. package/dist/types/commands/tee.d.ts +0 -2
  194. package/dist/types/commands/touch.d.ts +0 -2
  195. package/dist/types/commands/tree.d.ts +0 -2
  196. package/dist/types/commands/uniq.d.ts +0 -2
  197. package/dist/types/commands/wc.d.ts +0 -2
@@ -0,0 +1,221 @@
1
+ // src/commands/find/find.ts
2
+ function matchGlob(pattern, str, caseInsensitive = false) {
3
+ if (caseInsensitive) {
4
+ pattern = pattern.toLowerCase();
5
+ str = str.toLowerCase();
6
+ }
7
+ let regex = "^";
8
+ for (let i = 0;i < pattern.length; i++) {
9
+ const c = pattern[i];
10
+ switch (c) {
11
+ case "*":
12
+ regex += ".*";
13
+ break;
14
+ case "?":
15
+ regex += ".";
16
+ break;
17
+ case "[": {
18
+ let j = i + 1;
19
+ if (pattern[j] === "!" || pattern[j] === "^")
20
+ j++;
21
+ if (pattern[j] === "]")
22
+ j++;
23
+ while (j < pattern.length && pattern[j] !== "]")
24
+ j++;
25
+ if (j >= pattern.length) {
26
+ regex += "\\[";
27
+ } else {
28
+ let charClass = pattern.slice(i, j + 1);
29
+ charClass = charClass.replace(/^\[!/, "[^");
30
+ regex += charClass;
31
+ i = j;
32
+ }
33
+ break;
34
+ }
35
+ case ".":
36
+ case "^":
37
+ case "$":
38
+ case "+":
39
+ case "{":
40
+ case "}":
41
+ case "(":
42
+ case ")":
43
+ case "|":
44
+ case "\\":
45
+ regex += "\\" + c;
46
+ break;
47
+ default:
48
+ regex += c;
49
+ }
50
+ }
51
+ regex += "$";
52
+ try {
53
+ return new RegExp(regex).test(str);
54
+ } catch {
55
+ return false;
56
+ }
57
+ }
58
+ var find = async (ctx) => {
59
+ const args = [...ctx.args];
60
+ const paths = [];
61
+ const options = {};
62
+ let i = 0;
63
+ while (i < args.length && !args[i].startsWith("-")) {
64
+ paths.push(args[i]);
65
+ i++;
66
+ }
67
+ if (paths.length === 0) {
68
+ paths.push(".");
69
+ }
70
+ while (i < args.length) {
71
+ const arg = args[i];
72
+ if (arg === "-name") {
73
+ i++;
74
+ if (i >= args.length) {
75
+ await ctx.stderr.writeText(`find: missing argument to '-name'
76
+ `);
77
+ return 1;
78
+ }
79
+ options.namePattern = args[i];
80
+ options.nameIgnoreCase = false;
81
+ } else if (arg === "-iname") {
82
+ i++;
83
+ if (i >= args.length) {
84
+ await ctx.stderr.writeText(`find: missing argument to '-iname'
85
+ `);
86
+ return 1;
87
+ }
88
+ options.namePattern = args[i];
89
+ options.nameIgnoreCase = true;
90
+ } else if (arg === "-type") {
91
+ i++;
92
+ if (i >= args.length) {
93
+ await ctx.stderr.writeText(`find: missing argument to '-type'
94
+ `);
95
+ return 1;
96
+ }
97
+ const typeArg = args[i];
98
+ if (typeArg !== "f" && typeArg !== "d") {
99
+ await ctx.stderr.writeText(`find: Unknown argument to -type: ${typeArg}
100
+ `);
101
+ return 1;
102
+ }
103
+ options.type = typeArg;
104
+ } else if (arg === "-maxdepth") {
105
+ i++;
106
+ if (i >= args.length) {
107
+ await ctx.stderr.writeText(`find: missing argument to '-maxdepth'
108
+ `);
109
+ return 1;
110
+ }
111
+ const depth = parseInt(args[i], 10);
112
+ if (isNaN(depth) || depth < 0) {
113
+ await ctx.stderr.writeText(`find: Invalid argument '${args[i]}' to -maxdepth
114
+ `);
115
+ return 1;
116
+ }
117
+ options.maxDepth = depth;
118
+ } else if (arg === "-mindepth") {
119
+ i++;
120
+ if (i >= args.length) {
121
+ await ctx.stderr.writeText(`find: missing argument to '-mindepth'
122
+ `);
123
+ return 1;
124
+ }
125
+ const depth = parseInt(args[i], 10);
126
+ if (isNaN(depth) || depth < 0) {
127
+ await ctx.stderr.writeText(`find: Invalid argument '${args[i]}' to -mindepth
128
+ `);
129
+ return 1;
130
+ }
131
+ options.minDepth = depth;
132
+ } else if (arg.startsWith("-")) {
133
+ await ctx.stderr.writeText(`find: unknown predicate '${arg}'
134
+ `);
135
+ return 1;
136
+ } else {
137
+ paths.push(arg);
138
+ }
139
+ i++;
140
+ }
141
+ let hasError = false;
142
+ for (const startPath of paths) {
143
+ const resolvedStart = ctx.fs.resolve(ctx.cwd, startPath);
144
+ let stat;
145
+ try {
146
+ stat = await ctx.fs.stat(resolvedStart);
147
+ } catch {
148
+ await ctx.stderr.writeText(`find: '${startPath}': No such file or directory
149
+ `);
150
+ hasError = true;
151
+ continue;
152
+ }
153
+ async function traverse(path, displayPath, depth) {
154
+ if (options.maxDepth !== undefined && depth > options.maxDepth) {
155
+ return;
156
+ }
157
+ let entryStat;
158
+ try {
159
+ entryStat = await ctx.fs.stat(path);
160
+ } catch {
161
+ return;
162
+ }
163
+ const isDir = entryStat.isDirectory();
164
+ const isFile = entryStat.isFile();
165
+ const basename = ctx.fs.basename(path);
166
+ let matches = true;
167
+ if (options.type === "f" && !isFile) {
168
+ matches = false;
169
+ } else if (options.type === "d" && !isDir) {
170
+ matches = false;
171
+ }
172
+ if (matches && options.namePattern !== undefined) {
173
+ if (!matchGlob(options.namePattern, basename, options.nameIgnoreCase)) {
174
+ matches = false;
175
+ }
176
+ }
177
+ if (matches && (options.minDepth === undefined || depth >= options.minDepth)) {
178
+ await ctx.stdout.writeText(displayPath + `
179
+ `);
180
+ }
181
+ if (isDir) {
182
+ try {
183
+ const entries = await ctx.fs.readdir(path);
184
+ entries.sort();
185
+ for (const entry of entries) {
186
+ const childPath = ctx.fs.resolve(path, entry);
187
+ const childDisplayPath = displayPath === "." ? entry : `${displayPath}/${entry}`;
188
+ await traverse(childPath, childDisplayPath, depth + 1);
189
+ }
190
+ } catch {}
191
+ }
192
+ }
193
+ if (stat.isFile()) {
194
+ let matches = true;
195
+ if (options.type === "d") {
196
+ matches = false;
197
+ }
198
+ if (matches && options.namePattern !== undefined) {
199
+ const basename = ctx.fs.basename(resolvedStart);
200
+ if (!matchGlob(options.namePattern, basename, options.nameIgnoreCase)) {
201
+ matches = false;
202
+ }
203
+ }
204
+ if (options.maxDepth !== undefined && options.maxDepth < 0) {
205
+ matches = false;
206
+ }
207
+ if (matches && (options.minDepth === undefined || options.minDepth <= 0)) {
208
+ await ctx.stdout.writeText(startPath + `
209
+ `);
210
+ }
211
+ } else {
212
+ await traverse(resolvedStart, startPath, 0);
213
+ }
214
+ }
215
+ return hasError ? 1 : 0;
216
+ };
217
+ export {
218
+ find
219
+ };
220
+
221
+ //# debugId=0DD0859E30BDE7B964756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/commands/find/find.ts"],
4
+ "sourcesContent": [
5
+ "import type { Command } from \"../../types.mjs\";\n\n/**\n * Simple glob pattern matching (fnmatch-style)\n * Supports: * (any chars), ? (single char), [...] (character class)\n */\nfunction matchGlob(pattern: string, str: string, caseInsensitive = false): boolean {\n if (caseInsensitive) {\n pattern = pattern.toLowerCase();\n str = str.toLowerCase();\n }\n\n // Convert glob to regex\n let regex = \"^\";\n for (let i = 0; i < pattern.length; i++) {\n const c = pattern[i]!;\n switch (c) {\n case \"*\":\n regex += \".*\";\n break;\n case \"?\":\n regex += \".\";\n break;\n case \"[\": {\n // Find closing bracket\n let j = i + 1;\n // Handle negation\n if (pattern[j] === \"!\" || pattern[j] === \"^\") j++;\n // Handle ] as first char in class\n if (pattern[j] === \"]\") j++;\n while (j < pattern.length && pattern[j] !== \"]\") j++;\n if (j >= pattern.length) {\n // No closing bracket, treat [ as literal\n regex += \"\\\\[\";\n } else {\n let charClass = pattern.slice(i, j + 1);\n // Convert ! to ^ for negation in regex\n charClass = charClass.replace(/^\\[!/, \"[^\");\n regex += charClass;\n i = j;\n }\n break;\n }\n case \".\":\n case \"^\":\n case \"$\":\n case \"+\":\n case \"{\":\n case \"}\":\n case \"(\":\n case \")\":\n case \"|\":\n case \"\\\\\":\n regex += \"\\\\\" + c;\n break;\n default:\n regex += c;\n }\n }\n regex += \"$\";\n\n try {\n return new RegExp(regex).test(str);\n } catch {\n return false;\n }\n}\n\ninterface FindOptions {\n namePattern?: string;\n nameIgnoreCase?: boolean;\n type?: \"f\" | \"d\";\n maxDepth?: number;\n minDepth?: number;\n}\n\nexport const find: Command = async (ctx) => {\n const args = [...ctx.args];\n const paths: string[] = [];\n const options: FindOptions = {};\n\n // Parse arguments: paths come before first flag, then expressions\n let i = 0;\n\n // Collect paths (args before first -)\n while (i < args.length && !args[i]!.startsWith(\"-\")) {\n paths.push(args[i]!);\n i++;\n }\n\n // Default to current directory if no paths\n if (paths.length === 0) {\n paths.push(\".\");\n }\n\n // Parse expression flags\n while (i < args.length) {\n const arg = args[i]!;\n\n if (arg === \"-name\") {\n i++;\n if (i >= args.length) {\n await ctx.stderr.writeText(\"find: missing argument to '-name'\\n\");\n return 1;\n }\n options.namePattern = args[i]!;\n options.nameIgnoreCase = false;\n } else if (arg === \"-iname\") {\n i++;\n if (i >= args.length) {\n await ctx.stderr.writeText(\"find: missing argument to '-iname'\\n\");\n return 1;\n }\n options.namePattern = args[i]!;\n options.nameIgnoreCase = true;\n } else if (arg === \"-type\") {\n i++;\n if (i >= args.length) {\n await ctx.stderr.writeText(\"find: missing argument to '-type'\\n\");\n return 1;\n }\n const typeArg = args[i]!;\n if (typeArg !== \"f\" && typeArg !== \"d\") {\n await ctx.stderr.writeText(`find: Unknown argument to -type: ${typeArg}\\n`);\n return 1;\n }\n options.type = typeArg;\n } else if (arg === \"-maxdepth\") {\n i++;\n if (i >= args.length) {\n await ctx.stderr.writeText(\"find: missing argument to '-maxdepth'\\n\");\n return 1;\n }\n const depth = parseInt(args[i]!, 10);\n if (isNaN(depth) || depth < 0) {\n await ctx.stderr.writeText(`find: Invalid argument '${args[i]}' to -maxdepth\\n`);\n return 1;\n }\n options.maxDepth = depth;\n } else if (arg === \"-mindepth\") {\n i++;\n if (i >= args.length) {\n await ctx.stderr.writeText(\"find: missing argument to '-mindepth'\\n\");\n return 1;\n }\n const depth = parseInt(args[i]!, 10);\n if (isNaN(depth) || depth < 0) {\n await ctx.stderr.writeText(`find: Invalid argument '${args[i]}' to -mindepth\\n`);\n return 1;\n }\n options.minDepth = depth;\n } else if (arg.startsWith(\"-\")) {\n await ctx.stderr.writeText(`find: unknown predicate '${arg}'\\n`);\n return 1;\n } else {\n // This shouldn't happen since paths are parsed first, but treat as path\n paths.push(arg);\n }\n\n i++;\n }\n\n let hasError = false;\n\n // Process each starting path\n for (const startPath of paths) {\n const resolvedStart = ctx.fs.resolve(ctx.cwd, startPath);\n\n // Check if path exists\n let stat;\n try {\n stat = await ctx.fs.stat(resolvedStart);\n } catch {\n await ctx.stderr.writeText(`find: '${startPath}': No such file or directory\\n`);\n hasError = true;\n continue;\n }\n\n // Recursive traversal function\n async function traverse(path: string, displayPath: string, depth: number): Promise<void> {\n // Check maxdepth\n if (options.maxDepth !== undefined && depth > options.maxDepth) {\n return;\n }\n\n let entryStat;\n try {\n entryStat = await ctx.fs.stat(path);\n } catch {\n return;\n }\n\n const isDir = entryStat.isDirectory();\n const isFile = entryStat.isFile();\n const basename = ctx.fs.basename(path);\n\n // Check if this entry matches filters\n let matches = true;\n\n // Type filter\n if (options.type === \"f\" && !isFile) {\n matches = false;\n } else if (options.type === \"d\" && !isDir) {\n matches = false;\n }\n\n // Name filter (only check basename)\n if (matches && options.namePattern !== undefined) {\n if (!matchGlob(options.namePattern, basename, options.nameIgnoreCase)) {\n matches = false;\n }\n }\n\n // Output if matches and above mindepth\n if (matches && (options.minDepth === undefined || depth >= options.minDepth)) {\n await ctx.stdout.writeText(displayPath + \"\\n\");\n }\n\n // Recurse into directories\n if (isDir) {\n try {\n const entries = await ctx.fs.readdir(path);\n entries.sort();\n for (const entry of entries) {\n const childPath = ctx.fs.resolve(path, entry);\n const childDisplayPath = displayPath === \".\" ? entry : `${displayPath}/${entry}`;\n await traverse(childPath, childDisplayPath, depth + 1);\n }\n } catch {\n // Ignore errors reading directory contents\n }\n }\n }\n\n // Start traversal\n // For a single file, it's at depth 0\n // For a directory, the directory itself is depth 0, contents are depth 1+\n if (stat.isFile()) {\n // Starting from a file - depth 0\n let matches = true;\n\n if (options.type === \"d\") {\n matches = false;\n }\n\n if (matches && options.namePattern !== undefined) {\n const basename = ctx.fs.basename(resolvedStart);\n if (!matchGlob(options.namePattern, basename, options.nameIgnoreCase)) {\n matches = false;\n }\n }\n\n if (options.maxDepth !== undefined && options.maxDepth < 0) {\n matches = false;\n }\n\n if (matches && (options.minDepth === undefined || options.minDepth <= 0)) {\n await ctx.stdout.writeText(startPath + \"\\n\");\n }\n } else {\n await traverse(resolvedStart, startPath, 0);\n }\n }\n\n return hasError ? 1 : 0;\n};\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "0DD0859E30BDE7B964756E2164756E21",
9
+ "names": []
10
+ }