workshell 0.4.0 → 0.5.1
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 +76 -39
- package/dist/index.js +1618 -66
- package/package.json +3 -1
package/dist/index.js
CHANGED
|
@@ -97,6 +97,1524 @@ var require_picocolors = __commonJS({
|
|
|
97
97
|
}
|
|
98
98
|
});
|
|
99
99
|
|
|
100
|
+
// node_modules/.pnpm/picomatch@4.0.3/node_modules/picomatch/lib/constants.js
|
|
101
|
+
var require_constants = __commonJS({
|
|
102
|
+
"node_modules/.pnpm/picomatch@4.0.3/node_modules/picomatch/lib/constants.js"(exports, module) {
|
|
103
|
+
"use strict";
|
|
104
|
+
var WIN_SLASH = "\\\\/";
|
|
105
|
+
var WIN_NO_SLASH = `[^${WIN_SLASH}]`;
|
|
106
|
+
var DOT_LITERAL = "\\.";
|
|
107
|
+
var PLUS_LITERAL = "\\+";
|
|
108
|
+
var QMARK_LITERAL = "\\?";
|
|
109
|
+
var SLASH_LITERAL = "\\/";
|
|
110
|
+
var ONE_CHAR = "(?=.)";
|
|
111
|
+
var QMARK = "[^/]";
|
|
112
|
+
var END_ANCHOR = `(?:${SLASH_LITERAL}|$)`;
|
|
113
|
+
var START_ANCHOR = `(?:^|${SLASH_LITERAL})`;
|
|
114
|
+
var DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`;
|
|
115
|
+
var NO_DOT = `(?!${DOT_LITERAL})`;
|
|
116
|
+
var NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`;
|
|
117
|
+
var NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`;
|
|
118
|
+
var NO_DOTS_SLASH = `(?!${DOTS_SLASH})`;
|
|
119
|
+
var QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`;
|
|
120
|
+
var STAR = `${QMARK}*?`;
|
|
121
|
+
var SEP = "/";
|
|
122
|
+
var POSIX_CHARS = {
|
|
123
|
+
DOT_LITERAL,
|
|
124
|
+
PLUS_LITERAL,
|
|
125
|
+
QMARK_LITERAL,
|
|
126
|
+
SLASH_LITERAL,
|
|
127
|
+
ONE_CHAR,
|
|
128
|
+
QMARK,
|
|
129
|
+
END_ANCHOR,
|
|
130
|
+
DOTS_SLASH,
|
|
131
|
+
NO_DOT,
|
|
132
|
+
NO_DOTS,
|
|
133
|
+
NO_DOT_SLASH,
|
|
134
|
+
NO_DOTS_SLASH,
|
|
135
|
+
QMARK_NO_DOT,
|
|
136
|
+
STAR,
|
|
137
|
+
START_ANCHOR,
|
|
138
|
+
SEP
|
|
139
|
+
};
|
|
140
|
+
var WINDOWS_CHARS = {
|
|
141
|
+
...POSIX_CHARS,
|
|
142
|
+
SLASH_LITERAL: `[${WIN_SLASH}]`,
|
|
143
|
+
QMARK: WIN_NO_SLASH,
|
|
144
|
+
STAR: `${WIN_NO_SLASH}*?`,
|
|
145
|
+
DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`,
|
|
146
|
+
NO_DOT: `(?!${DOT_LITERAL})`,
|
|
147
|
+
NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,
|
|
148
|
+
NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`,
|
|
149
|
+
NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,
|
|
150
|
+
QMARK_NO_DOT: `[^.${WIN_SLASH}]`,
|
|
151
|
+
START_ANCHOR: `(?:^|[${WIN_SLASH}])`,
|
|
152
|
+
END_ANCHOR: `(?:[${WIN_SLASH}]|$)`,
|
|
153
|
+
SEP: "\\"
|
|
154
|
+
};
|
|
155
|
+
var POSIX_REGEX_SOURCE = {
|
|
156
|
+
alnum: "a-zA-Z0-9",
|
|
157
|
+
alpha: "a-zA-Z",
|
|
158
|
+
ascii: "\\x00-\\x7F",
|
|
159
|
+
blank: " \\t",
|
|
160
|
+
cntrl: "\\x00-\\x1F\\x7F",
|
|
161
|
+
digit: "0-9",
|
|
162
|
+
graph: "\\x21-\\x7E",
|
|
163
|
+
lower: "a-z",
|
|
164
|
+
print: "\\x20-\\x7E ",
|
|
165
|
+
punct: "\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",
|
|
166
|
+
space: " \\t\\r\\n\\v\\f",
|
|
167
|
+
upper: "A-Z",
|
|
168
|
+
word: "A-Za-z0-9_",
|
|
169
|
+
xdigit: "A-Fa-f0-9"
|
|
170
|
+
};
|
|
171
|
+
module.exports = {
|
|
172
|
+
MAX_LENGTH: 1024 * 64,
|
|
173
|
+
POSIX_REGEX_SOURCE,
|
|
174
|
+
// regular expressions
|
|
175
|
+
REGEX_BACKSLASH: /\\(?![*+?^${}(|)[\]])/g,
|
|
176
|
+
REGEX_NON_SPECIAL_CHARS: /^[^@![\].,$*+?^{}()|\\/]+/,
|
|
177
|
+
REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\]]/,
|
|
178
|
+
REGEX_SPECIAL_CHARS_BACKREF: /(\\?)((\W)(\3*))/g,
|
|
179
|
+
REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\]])/g,
|
|
180
|
+
REGEX_REMOVE_BACKSLASH: /(?:\[.*?[^\\]\]|\\(?=.))/g,
|
|
181
|
+
// Replace globs with equivalent patterns to reduce parsing time.
|
|
182
|
+
REPLACEMENTS: {
|
|
183
|
+
__proto__: null,
|
|
184
|
+
"***": "*",
|
|
185
|
+
"**/**": "**",
|
|
186
|
+
"**/**/**": "**"
|
|
187
|
+
},
|
|
188
|
+
// Digits
|
|
189
|
+
CHAR_0: 48,
|
|
190
|
+
/* 0 */
|
|
191
|
+
CHAR_9: 57,
|
|
192
|
+
/* 9 */
|
|
193
|
+
// Alphabet chars.
|
|
194
|
+
CHAR_UPPERCASE_A: 65,
|
|
195
|
+
/* A */
|
|
196
|
+
CHAR_LOWERCASE_A: 97,
|
|
197
|
+
/* a */
|
|
198
|
+
CHAR_UPPERCASE_Z: 90,
|
|
199
|
+
/* Z */
|
|
200
|
+
CHAR_LOWERCASE_Z: 122,
|
|
201
|
+
/* z */
|
|
202
|
+
CHAR_LEFT_PARENTHESES: 40,
|
|
203
|
+
/* ( */
|
|
204
|
+
CHAR_RIGHT_PARENTHESES: 41,
|
|
205
|
+
/* ) */
|
|
206
|
+
CHAR_ASTERISK: 42,
|
|
207
|
+
/* * */
|
|
208
|
+
// Non-alphabetic chars.
|
|
209
|
+
CHAR_AMPERSAND: 38,
|
|
210
|
+
/* & */
|
|
211
|
+
CHAR_AT: 64,
|
|
212
|
+
/* @ */
|
|
213
|
+
CHAR_BACKWARD_SLASH: 92,
|
|
214
|
+
/* \ */
|
|
215
|
+
CHAR_CARRIAGE_RETURN: 13,
|
|
216
|
+
/* \r */
|
|
217
|
+
CHAR_CIRCUMFLEX_ACCENT: 94,
|
|
218
|
+
/* ^ */
|
|
219
|
+
CHAR_COLON: 58,
|
|
220
|
+
/* : */
|
|
221
|
+
CHAR_COMMA: 44,
|
|
222
|
+
/* , */
|
|
223
|
+
CHAR_DOT: 46,
|
|
224
|
+
/* . */
|
|
225
|
+
CHAR_DOUBLE_QUOTE: 34,
|
|
226
|
+
/* " */
|
|
227
|
+
CHAR_EQUAL: 61,
|
|
228
|
+
/* = */
|
|
229
|
+
CHAR_EXCLAMATION_MARK: 33,
|
|
230
|
+
/* ! */
|
|
231
|
+
CHAR_FORM_FEED: 12,
|
|
232
|
+
/* \f */
|
|
233
|
+
CHAR_FORWARD_SLASH: 47,
|
|
234
|
+
/* / */
|
|
235
|
+
CHAR_GRAVE_ACCENT: 96,
|
|
236
|
+
/* ` */
|
|
237
|
+
CHAR_HASH: 35,
|
|
238
|
+
/* # */
|
|
239
|
+
CHAR_HYPHEN_MINUS: 45,
|
|
240
|
+
/* - */
|
|
241
|
+
CHAR_LEFT_ANGLE_BRACKET: 60,
|
|
242
|
+
/* < */
|
|
243
|
+
CHAR_LEFT_CURLY_BRACE: 123,
|
|
244
|
+
/* { */
|
|
245
|
+
CHAR_LEFT_SQUARE_BRACKET: 91,
|
|
246
|
+
/* [ */
|
|
247
|
+
CHAR_LINE_FEED: 10,
|
|
248
|
+
/* \n */
|
|
249
|
+
CHAR_NO_BREAK_SPACE: 160,
|
|
250
|
+
/* \u00A0 */
|
|
251
|
+
CHAR_PERCENT: 37,
|
|
252
|
+
/* % */
|
|
253
|
+
CHAR_PLUS: 43,
|
|
254
|
+
/* + */
|
|
255
|
+
CHAR_QUESTION_MARK: 63,
|
|
256
|
+
/* ? */
|
|
257
|
+
CHAR_RIGHT_ANGLE_BRACKET: 62,
|
|
258
|
+
/* > */
|
|
259
|
+
CHAR_RIGHT_CURLY_BRACE: 125,
|
|
260
|
+
/* } */
|
|
261
|
+
CHAR_RIGHT_SQUARE_BRACKET: 93,
|
|
262
|
+
/* ] */
|
|
263
|
+
CHAR_SEMICOLON: 59,
|
|
264
|
+
/* ; */
|
|
265
|
+
CHAR_SINGLE_QUOTE: 39,
|
|
266
|
+
/* ' */
|
|
267
|
+
CHAR_SPACE: 32,
|
|
268
|
+
/* */
|
|
269
|
+
CHAR_TAB: 9,
|
|
270
|
+
/* \t */
|
|
271
|
+
CHAR_UNDERSCORE: 95,
|
|
272
|
+
/* _ */
|
|
273
|
+
CHAR_VERTICAL_LINE: 124,
|
|
274
|
+
/* | */
|
|
275
|
+
CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279,
|
|
276
|
+
/* \uFEFF */
|
|
277
|
+
/**
|
|
278
|
+
* Create EXTGLOB_CHARS
|
|
279
|
+
*/
|
|
280
|
+
extglobChars(chars) {
|
|
281
|
+
return {
|
|
282
|
+
"!": { type: "negate", open: "(?:(?!(?:", close: `))${chars.STAR})` },
|
|
283
|
+
"?": { type: "qmark", open: "(?:", close: ")?" },
|
|
284
|
+
"+": { type: "plus", open: "(?:", close: ")+" },
|
|
285
|
+
"*": { type: "star", open: "(?:", close: ")*" },
|
|
286
|
+
"@": { type: "at", open: "(?:", close: ")" }
|
|
287
|
+
};
|
|
288
|
+
},
|
|
289
|
+
/**
|
|
290
|
+
* Create GLOB_CHARS
|
|
291
|
+
*/
|
|
292
|
+
globChars(win32) {
|
|
293
|
+
return win32 === true ? WINDOWS_CHARS : POSIX_CHARS;
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
// node_modules/.pnpm/picomatch@4.0.3/node_modules/picomatch/lib/utils.js
|
|
300
|
+
var require_utils = __commonJS({
|
|
301
|
+
"node_modules/.pnpm/picomatch@4.0.3/node_modules/picomatch/lib/utils.js"(exports) {
|
|
302
|
+
"use strict";
|
|
303
|
+
var {
|
|
304
|
+
REGEX_BACKSLASH,
|
|
305
|
+
REGEX_REMOVE_BACKSLASH,
|
|
306
|
+
REGEX_SPECIAL_CHARS,
|
|
307
|
+
REGEX_SPECIAL_CHARS_GLOBAL
|
|
308
|
+
} = require_constants();
|
|
309
|
+
exports.isObject = (val) => val !== null && typeof val === "object" && !Array.isArray(val);
|
|
310
|
+
exports.hasRegexChars = (str) => REGEX_SPECIAL_CHARS.test(str);
|
|
311
|
+
exports.isRegexChar = (str) => str.length === 1 && exports.hasRegexChars(str);
|
|
312
|
+
exports.escapeRegex = (str) => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, "\\$1");
|
|
313
|
+
exports.toPosixSlashes = (str) => str.replace(REGEX_BACKSLASH, "/");
|
|
314
|
+
exports.isWindows = () => {
|
|
315
|
+
if (typeof navigator !== "undefined" && navigator.platform) {
|
|
316
|
+
const platform = navigator.platform.toLowerCase();
|
|
317
|
+
return platform === "win32" || platform === "windows";
|
|
318
|
+
}
|
|
319
|
+
if (typeof process !== "undefined" && process.platform) {
|
|
320
|
+
return process.platform === "win32";
|
|
321
|
+
}
|
|
322
|
+
return false;
|
|
323
|
+
};
|
|
324
|
+
exports.removeBackslashes = (str) => {
|
|
325
|
+
return str.replace(REGEX_REMOVE_BACKSLASH, (match2) => {
|
|
326
|
+
return match2 === "\\" ? "" : match2;
|
|
327
|
+
});
|
|
328
|
+
};
|
|
329
|
+
exports.escapeLast = (input, char, lastIdx) => {
|
|
330
|
+
const idx = input.lastIndexOf(char, lastIdx);
|
|
331
|
+
if (idx === -1) return input;
|
|
332
|
+
if (input[idx - 1] === "\\") return exports.escapeLast(input, char, idx - 1);
|
|
333
|
+
return `${input.slice(0, idx)}\\${input.slice(idx)}`;
|
|
334
|
+
};
|
|
335
|
+
exports.removePrefix = (input, state = {}) => {
|
|
336
|
+
let output = input;
|
|
337
|
+
if (output.startsWith("./")) {
|
|
338
|
+
output = output.slice(2);
|
|
339
|
+
state.prefix = "./";
|
|
340
|
+
}
|
|
341
|
+
return output;
|
|
342
|
+
};
|
|
343
|
+
exports.wrapOutput = (input, state = {}, options = {}) => {
|
|
344
|
+
const prepend = options.contains ? "" : "^";
|
|
345
|
+
const append = options.contains ? "" : "$";
|
|
346
|
+
let output = `${prepend}(?:${input})${append}`;
|
|
347
|
+
if (state.negated === true) {
|
|
348
|
+
output = `(?:^(?!${output}).*$)`;
|
|
349
|
+
}
|
|
350
|
+
return output;
|
|
351
|
+
};
|
|
352
|
+
exports.basename = (path, { windows } = {}) => {
|
|
353
|
+
const segs = path.split(windows ? /[\\/]/ : "/");
|
|
354
|
+
const last = segs[segs.length - 1];
|
|
355
|
+
if (last === "") {
|
|
356
|
+
return segs[segs.length - 2];
|
|
357
|
+
}
|
|
358
|
+
return last;
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
// node_modules/.pnpm/picomatch@4.0.3/node_modules/picomatch/lib/scan.js
|
|
364
|
+
var require_scan = __commonJS({
|
|
365
|
+
"node_modules/.pnpm/picomatch@4.0.3/node_modules/picomatch/lib/scan.js"(exports, module) {
|
|
366
|
+
"use strict";
|
|
367
|
+
var utils = require_utils();
|
|
368
|
+
var {
|
|
369
|
+
CHAR_ASTERISK,
|
|
370
|
+
/* * */
|
|
371
|
+
CHAR_AT,
|
|
372
|
+
/* @ */
|
|
373
|
+
CHAR_BACKWARD_SLASH,
|
|
374
|
+
/* \ */
|
|
375
|
+
CHAR_COMMA,
|
|
376
|
+
/* , */
|
|
377
|
+
CHAR_DOT,
|
|
378
|
+
/* . */
|
|
379
|
+
CHAR_EXCLAMATION_MARK,
|
|
380
|
+
/* ! */
|
|
381
|
+
CHAR_FORWARD_SLASH,
|
|
382
|
+
/* / */
|
|
383
|
+
CHAR_LEFT_CURLY_BRACE,
|
|
384
|
+
/* { */
|
|
385
|
+
CHAR_LEFT_PARENTHESES,
|
|
386
|
+
/* ( */
|
|
387
|
+
CHAR_LEFT_SQUARE_BRACKET,
|
|
388
|
+
/* [ */
|
|
389
|
+
CHAR_PLUS,
|
|
390
|
+
/* + */
|
|
391
|
+
CHAR_QUESTION_MARK,
|
|
392
|
+
/* ? */
|
|
393
|
+
CHAR_RIGHT_CURLY_BRACE,
|
|
394
|
+
/* } */
|
|
395
|
+
CHAR_RIGHT_PARENTHESES,
|
|
396
|
+
/* ) */
|
|
397
|
+
CHAR_RIGHT_SQUARE_BRACKET
|
|
398
|
+
/* ] */
|
|
399
|
+
} = require_constants();
|
|
400
|
+
var isPathSeparator = (code) => {
|
|
401
|
+
return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;
|
|
402
|
+
};
|
|
403
|
+
var depth = (token) => {
|
|
404
|
+
if (token.isPrefix !== true) {
|
|
405
|
+
token.depth = token.isGlobstar ? Infinity : 1;
|
|
406
|
+
}
|
|
407
|
+
};
|
|
408
|
+
var scan = (input, options) => {
|
|
409
|
+
const opts = options || {};
|
|
410
|
+
const length = input.length - 1;
|
|
411
|
+
const scanToEnd = opts.parts === true || opts.scanToEnd === true;
|
|
412
|
+
const slashes = [];
|
|
413
|
+
const tokens = [];
|
|
414
|
+
const parts = [];
|
|
415
|
+
let str = input;
|
|
416
|
+
let index = -1;
|
|
417
|
+
let start = 0;
|
|
418
|
+
let lastIndex = 0;
|
|
419
|
+
let isBrace = false;
|
|
420
|
+
let isBracket = false;
|
|
421
|
+
let isGlob = false;
|
|
422
|
+
let isExtglob = false;
|
|
423
|
+
let isGlobstar = false;
|
|
424
|
+
let braceEscaped = false;
|
|
425
|
+
let backslashes = false;
|
|
426
|
+
let negated = false;
|
|
427
|
+
let negatedExtglob = false;
|
|
428
|
+
let finished = false;
|
|
429
|
+
let braces = 0;
|
|
430
|
+
let prev;
|
|
431
|
+
let code;
|
|
432
|
+
let token = { value: "", depth: 0, isGlob: false };
|
|
433
|
+
const eos = () => index >= length;
|
|
434
|
+
const peek = () => str.charCodeAt(index + 1);
|
|
435
|
+
const advance = () => {
|
|
436
|
+
prev = code;
|
|
437
|
+
return str.charCodeAt(++index);
|
|
438
|
+
};
|
|
439
|
+
while (index < length) {
|
|
440
|
+
code = advance();
|
|
441
|
+
let next;
|
|
442
|
+
if (code === CHAR_BACKWARD_SLASH) {
|
|
443
|
+
backslashes = token.backslashes = true;
|
|
444
|
+
code = advance();
|
|
445
|
+
if (code === CHAR_LEFT_CURLY_BRACE) {
|
|
446
|
+
braceEscaped = true;
|
|
447
|
+
}
|
|
448
|
+
continue;
|
|
449
|
+
}
|
|
450
|
+
if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) {
|
|
451
|
+
braces++;
|
|
452
|
+
while (eos() !== true && (code = advance())) {
|
|
453
|
+
if (code === CHAR_BACKWARD_SLASH) {
|
|
454
|
+
backslashes = token.backslashes = true;
|
|
455
|
+
advance();
|
|
456
|
+
continue;
|
|
457
|
+
}
|
|
458
|
+
if (code === CHAR_LEFT_CURLY_BRACE) {
|
|
459
|
+
braces++;
|
|
460
|
+
continue;
|
|
461
|
+
}
|
|
462
|
+
if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) {
|
|
463
|
+
isBrace = token.isBrace = true;
|
|
464
|
+
isGlob = token.isGlob = true;
|
|
465
|
+
finished = true;
|
|
466
|
+
if (scanToEnd === true) {
|
|
467
|
+
continue;
|
|
468
|
+
}
|
|
469
|
+
break;
|
|
470
|
+
}
|
|
471
|
+
if (braceEscaped !== true && code === CHAR_COMMA) {
|
|
472
|
+
isBrace = token.isBrace = true;
|
|
473
|
+
isGlob = token.isGlob = true;
|
|
474
|
+
finished = true;
|
|
475
|
+
if (scanToEnd === true) {
|
|
476
|
+
continue;
|
|
477
|
+
}
|
|
478
|
+
break;
|
|
479
|
+
}
|
|
480
|
+
if (code === CHAR_RIGHT_CURLY_BRACE) {
|
|
481
|
+
braces--;
|
|
482
|
+
if (braces === 0) {
|
|
483
|
+
braceEscaped = false;
|
|
484
|
+
isBrace = token.isBrace = true;
|
|
485
|
+
finished = true;
|
|
486
|
+
break;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
if (scanToEnd === true) {
|
|
491
|
+
continue;
|
|
492
|
+
}
|
|
493
|
+
break;
|
|
494
|
+
}
|
|
495
|
+
if (code === CHAR_FORWARD_SLASH) {
|
|
496
|
+
slashes.push(index);
|
|
497
|
+
tokens.push(token);
|
|
498
|
+
token = { value: "", depth: 0, isGlob: false };
|
|
499
|
+
if (finished === true) continue;
|
|
500
|
+
if (prev === CHAR_DOT && index === start + 1) {
|
|
501
|
+
start += 2;
|
|
502
|
+
continue;
|
|
503
|
+
}
|
|
504
|
+
lastIndex = index + 1;
|
|
505
|
+
continue;
|
|
506
|
+
}
|
|
507
|
+
if (opts.noext !== true) {
|
|
508
|
+
const isExtglobChar = code === CHAR_PLUS || code === CHAR_AT || code === CHAR_ASTERISK || code === CHAR_QUESTION_MARK || code === CHAR_EXCLAMATION_MARK;
|
|
509
|
+
if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES) {
|
|
510
|
+
isGlob = token.isGlob = true;
|
|
511
|
+
isExtglob = token.isExtglob = true;
|
|
512
|
+
finished = true;
|
|
513
|
+
if (code === CHAR_EXCLAMATION_MARK && index === start) {
|
|
514
|
+
negatedExtglob = true;
|
|
515
|
+
}
|
|
516
|
+
if (scanToEnd === true) {
|
|
517
|
+
while (eos() !== true && (code = advance())) {
|
|
518
|
+
if (code === CHAR_BACKWARD_SLASH) {
|
|
519
|
+
backslashes = token.backslashes = true;
|
|
520
|
+
code = advance();
|
|
521
|
+
continue;
|
|
522
|
+
}
|
|
523
|
+
if (code === CHAR_RIGHT_PARENTHESES) {
|
|
524
|
+
isGlob = token.isGlob = true;
|
|
525
|
+
finished = true;
|
|
526
|
+
break;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
continue;
|
|
530
|
+
}
|
|
531
|
+
break;
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
if (code === CHAR_ASTERISK) {
|
|
535
|
+
if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true;
|
|
536
|
+
isGlob = token.isGlob = true;
|
|
537
|
+
finished = true;
|
|
538
|
+
if (scanToEnd === true) {
|
|
539
|
+
continue;
|
|
540
|
+
}
|
|
541
|
+
break;
|
|
542
|
+
}
|
|
543
|
+
if (code === CHAR_QUESTION_MARK) {
|
|
544
|
+
isGlob = token.isGlob = true;
|
|
545
|
+
finished = true;
|
|
546
|
+
if (scanToEnd === true) {
|
|
547
|
+
continue;
|
|
548
|
+
}
|
|
549
|
+
break;
|
|
550
|
+
}
|
|
551
|
+
if (code === CHAR_LEFT_SQUARE_BRACKET) {
|
|
552
|
+
while (eos() !== true && (next = advance())) {
|
|
553
|
+
if (next === CHAR_BACKWARD_SLASH) {
|
|
554
|
+
backslashes = token.backslashes = true;
|
|
555
|
+
advance();
|
|
556
|
+
continue;
|
|
557
|
+
}
|
|
558
|
+
if (next === CHAR_RIGHT_SQUARE_BRACKET) {
|
|
559
|
+
isBracket = token.isBracket = true;
|
|
560
|
+
isGlob = token.isGlob = true;
|
|
561
|
+
finished = true;
|
|
562
|
+
break;
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
if (scanToEnd === true) {
|
|
566
|
+
continue;
|
|
567
|
+
}
|
|
568
|
+
break;
|
|
569
|
+
}
|
|
570
|
+
if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) {
|
|
571
|
+
negated = token.negated = true;
|
|
572
|
+
start++;
|
|
573
|
+
continue;
|
|
574
|
+
}
|
|
575
|
+
if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) {
|
|
576
|
+
isGlob = token.isGlob = true;
|
|
577
|
+
if (scanToEnd === true) {
|
|
578
|
+
while (eos() !== true && (code = advance())) {
|
|
579
|
+
if (code === CHAR_LEFT_PARENTHESES) {
|
|
580
|
+
backslashes = token.backslashes = true;
|
|
581
|
+
code = advance();
|
|
582
|
+
continue;
|
|
583
|
+
}
|
|
584
|
+
if (code === CHAR_RIGHT_PARENTHESES) {
|
|
585
|
+
finished = true;
|
|
586
|
+
break;
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
continue;
|
|
590
|
+
}
|
|
591
|
+
break;
|
|
592
|
+
}
|
|
593
|
+
if (isGlob === true) {
|
|
594
|
+
finished = true;
|
|
595
|
+
if (scanToEnd === true) {
|
|
596
|
+
continue;
|
|
597
|
+
}
|
|
598
|
+
break;
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
if (opts.noext === true) {
|
|
602
|
+
isExtglob = false;
|
|
603
|
+
isGlob = false;
|
|
604
|
+
}
|
|
605
|
+
let base = str;
|
|
606
|
+
let prefix = "";
|
|
607
|
+
let glob = "";
|
|
608
|
+
if (start > 0) {
|
|
609
|
+
prefix = str.slice(0, start);
|
|
610
|
+
str = str.slice(start);
|
|
611
|
+
lastIndex -= start;
|
|
612
|
+
}
|
|
613
|
+
if (base && isGlob === true && lastIndex > 0) {
|
|
614
|
+
base = str.slice(0, lastIndex);
|
|
615
|
+
glob = str.slice(lastIndex);
|
|
616
|
+
} else if (isGlob === true) {
|
|
617
|
+
base = "";
|
|
618
|
+
glob = str;
|
|
619
|
+
} else {
|
|
620
|
+
base = str;
|
|
621
|
+
}
|
|
622
|
+
if (base && base !== "" && base !== "/" && base !== str) {
|
|
623
|
+
if (isPathSeparator(base.charCodeAt(base.length - 1))) {
|
|
624
|
+
base = base.slice(0, -1);
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
if (opts.unescape === true) {
|
|
628
|
+
if (glob) glob = utils.removeBackslashes(glob);
|
|
629
|
+
if (base && backslashes === true) {
|
|
630
|
+
base = utils.removeBackslashes(base);
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
const state = {
|
|
634
|
+
prefix,
|
|
635
|
+
input,
|
|
636
|
+
start,
|
|
637
|
+
base,
|
|
638
|
+
glob,
|
|
639
|
+
isBrace,
|
|
640
|
+
isBracket,
|
|
641
|
+
isGlob,
|
|
642
|
+
isExtglob,
|
|
643
|
+
isGlobstar,
|
|
644
|
+
negated,
|
|
645
|
+
negatedExtglob
|
|
646
|
+
};
|
|
647
|
+
if (opts.tokens === true) {
|
|
648
|
+
state.maxDepth = 0;
|
|
649
|
+
if (!isPathSeparator(code)) {
|
|
650
|
+
tokens.push(token);
|
|
651
|
+
}
|
|
652
|
+
state.tokens = tokens;
|
|
653
|
+
}
|
|
654
|
+
if (opts.parts === true || opts.tokens === true) {
|
|
655
|
+
let prevIndex;
|
|
656
|
+
for (let idx = 0; idx < slashes.length; idx++) {
|
|
657
|
+
const n = prevIndex ? prevIndex + 1 : start;
|
|
658
|
+
const i = slashes[idx];
|
|
659
|
+
const value = input.slice(n, i);
|
|
660
|
+
if (opts.tokens) {
|
|
661
|
+
if (idx === 0 && start !== 0) {
|
|
662
|
+
tokens[idx].isPrefix = true;
|
|
663
|
+
tokens[idx].value = prefix;
|
|
664
|
+
} else {
|
|
665
|
+
tokens[idx].value = value;
|
|
666
|
+
}
|
|
667
|
+
depth(tokens[idx]);
|
|
668
|
+
state.maxDepth += tokens[idx].depth;
|
|
669
|
+
}
|
|
670
|
+
if (idx !== 0 || value !== "") {
|
|
671
|
+
parts.push(value);
|
|
672
|
+
}
|
|
673
|
+
prevIndex = i;
|
|
674
|
+
}
|
|
675
|
+
if (prevIndex && prevIndex + 1 < input.length) {
|
|
676
|
+
const value = input.slice(prevIndex + 1);
|
|
677
|
+
parts.push(value);
|
|
678
|
+
if (opts.tokens) {
|
|
679
|
+
tokens[tokens.length - 1].value = value;
|
|
680
|
+
depth(tokens[tokens.length - 1]);
|
|
681
|
+
state.maxDepth += tokens[tokens.length - 1].depth;
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
state.slashes = slashes;
|
|
685
|
+
state.parts = parts;
|
|
686
|
+
}
|
|
687
|
+
return state;
|
|
688
|
+
};
|
|
689
|
+
module.exports = scan;
|
|
690
|
+
}
|
|
691
|
+
});
|
|
692
|
+
|
|
693
|
+
// node_modules/.pnpm/picomatch@4.0.3/node_modules/picomatch/lib/parse.js
|
|
694
|
+
var require_parse = __commonJS({
|
|
695
|
+
"node_modules/.pnpm/picomatch@4.0.3/node_modules/picomatch/lib/parse.js"(exports, module) {
|
|
696
|
+
"use strict";
|
|
697
|
+
var constants = require_constants();
|
|
698
|
+
var utils = require_utils();
|
|
699
|
+
var {
|
|
700
|
+
MAX_LENGTH,
|
|
701
|
+
POSIX_REGEX_SOURCE,
|
|
702
|
+
REGEX_NON_SPECIAL_CHARS,
|
|
703
|
+
REGEX_SPECIAL_CHARS_BACKREF,
|
|
704
|
+
REPLACEMENTS
|
|
705
|
+
} = constants;
|
|
706
|
+
var expandRange = (args2, options) => {
|
|
707
|
+
if (typeof options.expandRange === "function") {
|
|
708
|
+
return options.expandRange(...args2, options);
|
|
709
|
+
}
|
|
710
|
+
args2.sort();
|
|
711
|
+
const value = `[${args2.join("-")}]`;
|
|
712
|
+
try {
|
|
713
|
+
new RegExp(value);
|
|
714
|
+
} catch (ex) {
|
|
715
|
+
return args2.map((v) => utils.escapeRegex(v)).join("..");
|
|
716
|
+
}
|
|
717
|
+
return value;
|
|
718
|
+
};
|
|
719
|
+
var syntaxError = (type, char) => {
|
|
720
|
+
return `Missing ${type}: "${char}" - use "\\\\${char}" to match literal characters`;
|
|
721
|
+
};
|
|
722
|
+
var parse2 = (input, options) => {
|
|
723
|
+
if (typeof input !== "string") {
|
|
724
|
+
throw new TypeError("Expected a string");
|
|
725
|
+
}
|
|
726
|
+
input = REPLACEMENTS[input] || input;
|
|
727
|
+
const opts = { ...options };
|
|
728
|
+
const max = typeof opts.maxLength === "number" ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;
|
|
729
|
+
let len = input.length;
|
|
730
|
+
if (len > max) {
|
|
731
|
+
throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);
|
|
732
|
+
}
|
|
733
|
+
const bos = { type: "bos", value: "", output: opts.prepend || "" };
|
|
734
|
+
const tokens = [bos];
|
|
735
|
+
const capture = opts.capture ? "" : "?:";
|
|
736
|
+
const PLATFORM_CHARS = constants.globChars(opts.windows);
|
|
737
|
+
const EXTGLOB_CHARS = constants.extglobChars(PLATFORM_CHARS);
|
|
738
|
+
const {
|
|
739
|
+
DOT_LITERAL,
|
|
740
|
+
PLUS_LITERAL,
|
|
741
|
+
SLASH_LITERAL,
|
|
742
|
+
ONE_CHAR,
|
|
743
|
+
DOTS_SLASH,
|
|
744
|
+
NO_DOT,
|
|
745
|
+
NO_DOT_SLASH,
|
|
746
|
+
NO_DOTS_SLASH,
|
|
747
|
+
QMARK,
|
|
748
|
+
QMARK_NO_DOT,
|
|
749
|
+
STAR,
|
|
750
|
+
START_ANCHOR
|
|
751
|
+
} = PLATFORM_CHARS;
|
|
752
|
+
const globstar = (opts2) => {
|
|
753
|
+
return `(${capture}(?:(?!${START_ANCHOR}${opts2.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;
|
|
754
|
+
};
|
|
755
|
+
const nodot = opts.dot ? "" : NO_DOT;
|
|
756
|
+
const qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT;
|
|
757
|
+
let star = opts.bash === true ? globstar(opts) : STAR;
|
|
758
|
+
if (opts.capture) {
|
|
759
|
+
star = `(${star})`;
|
|
760
|
+
}
|
|
761
|
+
if (typeof opts.noext === "boolean") {
|
|
762
|
+
opts.noextglob = opts.noext;
|
|
763
|
+
}
|
|
764
|
+
const state = {
|
|
765
|
+
input,
|
|
766
|
+
index: -1,
|
|
767
|
+
start: 0,
|
|
768
|
+
dot: opts.dot === true,
|
|
769
|
+
consumed: "",
|
|
770
|
+
output: "",
|
|
771
|
+
prefix: "",
|
|
772
|
+
backtrack: false,
|
|
773
|
+
negated: false,
|
|
774
|
+
brackets: 0,
|
|
775
|
+
braces: 0,
|
|
776
|
+
parens: 0,
|
|
777
|
+
quotes: 0,
|
|
778
|
+
globstar: false,
|
|
779
|
+
tokens
|
|
780
|
+
};
|
|
781
|
+
input = utils.removePrefix(input, state);
|
|
782
|
+
len = input.length;
|
|
783
|
+
const extglobs = [];
|
|
784
|
+
const braces = [];
|
|
785
|
+
const stack = [];
|
|
786
|
+
let prev = bos;
|
|
787
|
+
let value;
|
|
788
|
+
const eos = () => state.index === len - 1;
|
|
789
|
+
const peek = state.peek = (n = 1) => input[state.index + n];
|
|
790
|
+
const advance = state.advance = () => input[++state.index] || "";
|
|
791
|
+
const remaining = () => input.slice(state.index + 1);
|
|
792
|
+
const consume = (value2 = "", num = 0) => {
|
|
793
|
+
state.consumed += value2;
|
|
794
|
+
state.index += num;
|
|
795
|
+
};
|
|
796
|
+
const append = (token) => {
|
|
797
|
+
state.output += token.output != null ? token.output : token.value;
|
|
798
|
+
consume(token.value);
|
|
799
|
+
};
|
|
800
|
+
const negate = () => {
|
|
801
|
+
let count = 1;
|
|
802
|
+
while (peek() === "!" && (peek(2) !== "(" || peek(3) === "?")) {
|
|
803
|
+
advance();
|
|
804
|
+
state.start++;
|
|
805
|
+
count++;
|
|
806
|
+
}
|
|
807
|
+
if (count % 2 === 0) {
|
|
808
|
+
return false;
|
|
809
|
+
}
|
|
810
|
+
state.negated = true;
|
|
811
|
+
state.start++;
|
|
812
|
+
return true;
|
|
813
|
+
};
|
|
814
|
+
const increment = (type) => {
|
|
815
|
+
state[type]++;
|
|
816
|
+
stack.push(type);
|
|
817
|
+
};
|
|
818
|
+
const decrement = (type) => {
|
|
819
|
+
state[type]--;
|
|
820
|
+
stack.pop();
|
|
821
|
+
};
|
|
822
|
+
const push = (tok) => {
|
|
823
|
+
if (prev.type === "globstar") {
|
|
824
|
+
const isBrace = state.braces > 0 && (tok.type === "comma" || tok.type === "brace");
|
|
825
|
+
const isExtglob = tok.extglob === true || extglobs.length && (tok.type === "pipe" || tok.type === "paren");
|
|
826
|
+
if (tok.type !== "slash" && tok.type !== "paren" && !isBrace && !isExtglob) {
|
|
827
|
+
state.output = state.output.slice(0, -prev.output.length);
|
|
828
|
+
prev.type = "star";
|
|
829
|
+
prev.value = "*";
|
|
830
|
+
prev.output = star;
|
|
831
|
+
state.output += prev.output;
|
|
832
|
+
}
|
|
833
|
+
}
|
|
834
|
+
if (extglobs.length && tok.type !== "paren") {
|
|
835
|
+
extglobs[extglobs.length - 1].inner += tok.value;
|
|
836
|
+
}
|
|
837
|
+
if (tok.value || tok.output) append(tok);
|
|
838
|
+
if (prev && prev.type === "text" && tok.type === "text") {
|
|
839
|
+
prev.output = (prev.output || prev.value) + tok.value;
|
|
840
|
+
prev.value += tok.value;
|
|
841
|
+
return;
|
|
842
|
+
}
|
|
843
|
+
tok.prev = prev;
|
|
844
|
+
tokens.push(tok);
|
|
845
|
+
prev = tok;
|
|
846
|
+
};
|
|
847
|
+
const extglobOpen = (type, value2) => {
|
|
848
|
+
const token = { ...EXTGLOB_CHARS[value2], conditions: 1, inner: "" };
|
|
849
|
+
token.prev = prev;
|
|
850
|
+
token.parens = state.parens;
|
|
851
|
+
token.output = state.output;
|
|
852
|
+
const output = (opts.capture ? "(" : "") + token.open;
|
|
853
|
+
increment("parens");
|
|
854
|
+
push({ type, value: value2, output: state.output ? "" : ONE_CHAR });
|
|
855
|
+
push({ type: "paren", extglob: true, value: advance(), output });
|
|
856
|
+
extglobs.push(token);
|
|
857
|
+
};
|
|
858
|
+
const extglobClose = (token) => {
|
|
859
|
+
let output = token.close + (opts.capture ? ")" : "");
|
|
860
|
+
let rest;
|
|
861
|
+
if (token.type === "negate") {
|
|
862
|
+
let extglobStar = star;
|
|
863
|
+
if (token.inner && token.inner.length > 1 && token.inner.includes("/")) {
|
|
864
|
+
extglobStar = globstar(opts);
|
|
865
|
+
}
|
|
866
|
+
if (extglobStar !== star || eos() || /^\)+$/.test(remaining())) {
|
|
867
|
+
output = token.close = `)$))${extglobStar}`;
|
|
868
|
+
}
|
|
869
|
+
if (token.inner.includes("*") && (rest = remaining()) && /^\.[^\\/.]+$/.test(rest)) {
|
|
870
|
+
const expression = parse2(rest, { ...options, fastpaths: false }).output;
|
|
871
|
+
output = token.close = `)${expression})${extglobStar})`;
|
|
872
|
+
}
|
|
873
|
+
if (token.prev.type === "bos") {
|
|
874
|
+
state.negatedExtglob = true;
|
|
875
|
+
}
|
|
876
|
+
}
|
|
877
|
+
push({ type: "paren", extglob: true, value, output });
|
|
878
|
+
decrement("parens");
|
|
879
|
+
};
|
|
880
|
+
if (opts.fastpaths !== false && !/(^[*!]|[/()[\]{}"])/.test(input)) {
|
|
881
|
+
let backslashes = false;
|
|
882
|
+
let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => {
|
|
883
|
+
if (first === "\\") {
|
|
884
|
+
backslashes = true;
|
|
885
|
+
return m;
|
|
886
|
+
}
|
|
887
|
+
if (first === "?") {
|
|
888
|
+
if (esc) {
|
|
889
|
+
return esc + first + (rest ? QMARK.repeat(rest.length) : "");
|
|
890
|
+
}
|
|
891
|
+
if (index === 0) {
|
|
892
|
+
return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : "");
|
|
893
|
+
}
|
|
894
|
+
return QMARK.repeat(chars.length);
|
|
895
|
+
}
|
|
896
|
+
if (first === ".") {
|
|
897
|
+
return DOT_LITERAL.repeat(chars.length);
|
|
898
|
+
}
|
|
899
|
+
if (first === "*") {
|
|
900
|
+
if (esc) {
|
|
901
|
+
return esc + first + (rest ? star : "");
|
|
902
|
+
}
|
|
903
|
+
return star;
|
|
904
|
+
}
|
|
905
|
+
return esc ? m : `\\${m}`;
|
|
906
|
+
});
|
|
907
|
+
if (backslashes === true) {
|
|
908
|
+
if (opts.unescape === true) {
|
|
909
|
+
output = output.replace(/\\/g, "");
|
|
910
|
+
} else {
|
|
911
|
+
output = output.replace(/\\+/g, (m) => {
|
|
912
|
+
return m.length % 2 === 0 ? "\\\\" : m ? "\\" : "";
|
|
913
|
+
});
|
|
914
|
+
}
|
|
915
|
+
}
|
|
916
|
+
if (output === input && opts.contains === true) {
|
|
917
|
+
state.output = input;
|
|
918
|
+
return state;
|
|
919
|
+
}
|
|
920
|
+
state.output = utils.wrapOutput(output, state, options);
|
|
921
|
+
return state;
|
|
922
|
+
}
|
|
923
|
+
while (!eos()) {
|
|
924
|
+
value = advance();
|
|
925
|
+
if (value === "\0") {
|
|
926
|
+
continue;
|
|
927
|
+
}
|
|
928
|
+
if (value === "\\") {
|
|
929
|
+
const next = peek();
|
|
930
|
+
if (next === "/" && opts.bash !== true) {
|
|
931
|
+
continue;
|
|
932
|
+
}
|
|
933
|
+
if (next === "." || next === ";") {
|
|
934
|
+
continue;
|
|
935
|
+
}
|
|
936
|
+
if (!next) {
|
|
937
|
+
value += "\\";
|
|
938
|
+
push({ type: "text", value });
|
|
939
|
+
continue;
|
|
940
|
+
}
|
|
941
|
+
const match2 = /^\\+/.exec(remaining());
|
|
942
|
+
let slashes = 0;
|
|
943
|
+
if (match2 && match2[0].length > 2) {
|
|
944
|
+
slashes = match2[0].length;
|
|
945
|
+
state.index += slashes;
|
|
946
|
+
if (slashes % 2 !== 0) {
|
|
947
|
+
value += "\\";
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
if (opts.unescape === true) {
|
|
951
|
+
value = advance();
|
|
952
|
+
} else {
|
|
953
|
+
value += advance();
|
|
954
|
+
}
|
|
955
|
+
if (state.brackets === 0) {
|
|
956
|
+
push({ type: "text", value });
|
|
957
|
+
continue;
|
|
958
|
+
}
|
|
959
|
+
}
|
|
960
|
+
if (state.brackets > 0 && (value !== "]" || prev.value === "[" || prev.value === "[^")) {
|
|
961
|
+
if (opts.posix !== false && value === ":") {
|
|
962
|
+
const inner = prev.value.slice(1);
|
|
963
|
+
if (inner.includes("[")) {
|
|
964
|
+
prev.posix = true;
|
|
965
|
+
if (inner.includes(":")) {
|
|
966
|
+
const idx = prev.value.lastIndexOf("[");
|
|
967
|
+
const pre = prev.value.slice(0, idx);
|
|
968
|
+
const rest2 = prev.value.slice(idx + 2);
|
|
969
|
+
const posix = POSIX_REGEX_SOURCE[rest2];
|
|
970
|
+
if (posix) {
|
|
971
|
+
prev.value = pre + posix;
|
|
972
|
+
state.backtrack = true;
|
|
973
|
+
advance();
|
|
974
|
+
if (!bos.output && tokens.indexOf(prev) === 1) {
|
|
975
|
+
bos.output = ONE_CHAR;
|
|
976
|
+
}
|
|
977
|
+
continue;
|
|
978
|
+
}
|
|
979
|
+
}
|
|
980
|
+
}
|
|
981
|
+
}
|
|
982
|
+
if (value === "[" && peek() !== ":" || value === "-" && peek() === "]") {
|
|
983
|
+
value = `\\${value}`;
|
|
984
|
+
}
|
|
985
|
+
if (value === "]" && (prev.value === "[" || prev.value === "[^")) {
|
|
986
|
+
value = `\\${value}`;
|
|
987
|
+
}
|
|
988
|
+
if (opts.posix === true && value === "!" && prev.value === "[") {
|
|
989
|
+
value = "^";
|
|
990
|
+
}
|
|
991
|
+
prev.value += value;
|
|
992
|
+
append({ value });
|
|
993
|
+
continue;
|
|
994
|
+
}
|
|
995
|
+
if (state.quotes === 1 && value !== '"') {
|
|
996
|
+
value = utils.escapeRegex(value);
|
|
997
|
+
prev.value += value;
|
|
998
|
+
append({ value });
|
|
999
|
+
continue;
|
|
1000
|
+
}
|
|
1001
|
+
if (value === '"') {
|
|
1002
|
+
state.quotes = state.quotes === 1 ? 0 : 1;
|
|
1003
|
+
if (opts.keepQuotes === true) {
|
|
1004
|
+
push({ type: "text", value });
|
|
1005
|
+
}
|
|
1006
|
+
continue;
|
|
1007
|
+
}
|
|
1008
|
+
if (value === "(") {
|
|
1009
|
+
increment("parens");
|
|
1010
|
+
push({ type: "paren", value });
|
|
1011
|
+
continue;
|
|
1012
|
+
}
|
|
1013
|
+
if (value === ")") {
|
|
1014
|
+
if (state.parens === 0 && opts.strictBrackets === true) {
|
|
1015
|
+
throw new SyntaxError(syntaxError("opening", "("));
|
|
1016
|
+
}
|
|
1017
|
+
const extglob = extglobs[extglobs.length - 1];
|
|
1018
|
+
if (extglob && state.parens === extglob.parens + 1) {
|
|
1019
|
+
extglobClose(extglobs.pop());
|
|
1020
|
+
continue;
|
|
1021
|
+
}
|
|
1022
|
+
push({ type: "paren", value, output: state.parens ? ")" : "\\)" });
|
|
1023
|
+
decrement("parens");
|
|
1024
|
+
continue;
|
|
1025
|
+
}
|
|
1026
|
+
if (value === "[") {
|
|
1027
|
+
if (opts.nobracket === true || !remaining().includes("]")) {
|
|
1028
|
+
if (opts.nobracket !== true && opts.strictBrackets === true) {
|
|
1029
|
+
throw new SyntaxError(syntaxError("closing", "]"));
|
|
1030
|
+
}
|
|
1031
|
+
value = `\\${value}`;
|
|
1032
|
+
} else {
|
|
1033
|
+
increment("brackets");
|
|
1034
|
+
}
|
|
1035
|
+
push({ type: "bracket", value });
|
|
1036
|
+
continue;
|
|
1037
|
+
}
|
|
1038
|
+
if (value === "]") {
|
|
1039
|
+
if (opts.nobracket === true || prev && prev.type === "bracket" && prev.value.length === 1) {
|
|
1040
|
+
push({ type: "text", value, output: `\\${value}` });
|
|
1041
|
+
continue;
|
|
1042
|
+
}
|
|
1043
|
+
if (state.brackets === 0) {
|
|
1044
|
+
if (opts.strictBrackets === true) {
|
|
1045
|
+
throw new SyntaxError(syntaxError("opening", "["));
|
|
1046
|
+
}
|
|
1047
|
+
push({ type: "text", value, output: `\\${value}` });
|
|
1048
|
+
continue;
|
|
1049
|
+
}
|
|
1050
|
+
decrement("brackets");
|
|
1051
|
+
const prevValue = prev.value.slice(1);
|
|
1052
|
+
if (prev.posix !== true && prevValue[0] === "^" && !prevValue.includes("/")) {
|
|
1053
|
+
value = `/${value}`;
|
|
1054
|
+
}
|
|
1055
|
+
prev.value += value;
|
|
1056
|
+
append({ value });
|
|
1057
|
+
if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) {
|
|
1058
|
+
continue;
|
|
1059
|
+
}
|
|
1060
|
+
const escaped = utils.escapeRegex(prev.value);
|
|
1061
|
+
state.output = state.output.slice(0, -prev.value.length);
|
|
1062
|
+
if (opts.literalBrackets === true) {
|
|
1063
|
+
state.output += escaped;
|
|
1064
|
+
prev.value = escaped;
|
|
1065
|
+
continue;
|
|
1066
|
+
}
|
|
1067
|
+
prev.value = `(${capture}${escaped}|${prev.value})`;
|
|
1068
|
+
state.output += prev.value;
|
|
1069
|
+
continue;
|
|
1070
|
+
}
|
|
1071
|
+
if (value === "{" && opts.nobrace !== true) {
|
|
1072
|
+
increment("braces");
|
|
1073
|
+
const open = {
|
|
1074
|
+
type: "brace",
|
|
1075
|
+
value,
|
|
1076
|
+
output: "(",
|
|
1077
|
+
outputIndex: state.output.length,
|
|
1078
|
+
tokensIndex: state.tokens.length
|
|
1079
|
+
};
|
|
1080
|
+
braces.push(open);
|
|
1081
|
+
push(open);
|
|
1082
|
+
continue;
|
|
1083
|
+
}
|
|
1084
|
+
if (value === "}") {
|
|
1085
|
+
const brace = braces[braces.length - 1];
|
|
1086
|
+
if (opts.nobrace === true || !brace) {
|
|
1087
|
+
push({ type: "text", value, output: value });
|
|
1088
|
+
continue;
|
|
1089
|
+
}
|
|
1090
|
+
let output = ")";
|
|
1091
|
+
if (brace.dots === true) {
|
|
1092
|
+
const arr = tokens.slice();
|
|
1093
|
+
const range = [];
|
|
1094
|
+
for (let i = arr.length - 1; i >= 0; i--) {
|
|
1095
|
+
tokens.pop();
|
|
1096
|
+
if (arr[i].type === "brace") {
|
|
1097
|
+
break;
|
|
1098
|
+
}
|
|
1099
|
+
if (arr[i].type !== "dots") {
|
|
1100
|
+
range.unshift(arr[i].value);
|
|
1101
|
+
}
|
|
1102
|
+
}
|
|
1103
|
+
output = expandRange(range, opts);
|
|
1104
|
+
state.backtrack = true;
|
|
1105
|
+
}
|
|
1106
|
+
if (brace.comma !== true && brace.dots !== true) {
|
|
1107
|
+
const out = state.output.slice(0, brace.outputIndex);
|
|
1108
|
+
const toks = state.tokens.slice(brace.tokensIndex);
|
|
1109
|
+
brace.value = brace.output = "\\{";
|
|
1110
|
+
value = output = "\\}";
|
|
1111
|
+
state.output = out;
|
|
1112
|
+
for (const t of toks) {
|
|
1113
|
+
state.output += t.output || t.value;
|
|
1114
|
+
}
|
|
1115
|
+
}
|
|
1116
|
+
push({ type: "brace", value, output });
|
|
1117
|
+
decrement("braces");
|
|
1118
|
+
braces.pop();
|
|
1119
|
+
continue;
|
|
1120
|
+
}
|
|
1121
|
+
if (value === "|") {
|
|
1122
|
+
if (extglobs.length > 0) {
|
|
1123
|
+
extglobs[extglobs.length - 1].conditions++;
|
|
1124
|
+
}
|
|
1125
|
+
push({ type: "text", value });
|
|
1126
|
+
continue;
|
|
1127
|
+
}
|
|
1128
|
+
if (value === ",") {
|
|
1129
|
+
let output = value;
|
|
1130
|
+
const brace = braces[braces.length - 1];
|
|
1131
|
+
if (brace && stack[stack.length - 1] === "braces") {
|
|
1132
|
+
brace.comma = true;
|
|
1133
|
+
output = "|";
|
|
1134
|
+
}
|
|
1135
|
+
push({ type: "comma", value, output });
|
|
1136
|
+
continue;
|
|
1137
|
+
}
|
|
1138
|
+
if (value === "/") {
|
|
1139
|
+
if (prev.type === "dot" && state.index === state.start + 1) {
|
|
1140
|
+
state.start = state.index + 1;
|
|
1141
|
+
state.consumed = "";
|
|
1142
|
+
state.output = "";
|
|
1143
|
+
tokens.pop();
|
|
1144
|
+
prev = bos;
|
|
1145
|
+
continue;
|
|
1146
|
+
}
|
|
1147
|
+
push({ type: "slash", value, output: SLASH_LITERAL });
|
|
1148
|
+
continue;
|
|
1149
|
+
}
|
|
1150
|
+
if (value === ".") {
|
|
1151
|
+
if (state.braces > 0 && prev.type === "dot") {
|
|
1152
|
+
if (prev.value === ".") prev.output = DOT_LITERAL;
|
|
1153
|
+
const brace = braces[braces.length - 1];
|
|
1154
|
+
prev.type = "dots";
|
|
1155
|
+
prev.output += value;
|
|
1156
|
+
prev.value += value;
|
|
1157
|
+
brace.dots = true;
|
|
1158
|
+
continue;
|
|
1159
|
+
}
|
|
1160
|
+
if (state.braces + state.parens === 0 && prev.type !== "bos" && prev.type !== "slash") {
|
|
1161
|
+
push({ type: "text", value, output: DOT_LITERAL });
|
|
1162
|
+
continue;
|
|
1163
|
+
}
|
|
1164
|
+
push({ type: "dot", value, output: DOT_LITERAL });
|
|
1165
|
+
continue;
|
|
1166
|
+
}
|
|
1167
|
+
if (value === "?") {
|
|
1168
|
+
const isGroup = prev && prev.value === "(";
|
|
1169
|
+
if (!isGroup && opts.noextglob !== true && peek() === "(" && peek(2) !== "?") {
|
|
1170
|
+
extglobOpen("qmark", value);
|
|
1171
|
+
continue;
|
|
1172
|
+
}
|
|
1173
|
+
if (prev && prev.type === "paren") {
|
|
1174
|
+
const next = peek();
|
|
1175
|
+
let output = value;
|
|
1176
|
+
if (prev.value === "(" && !/[!=<:]/.test(next) || next === "<" && !/<([!=]|\w+>)/.test(remaining())) {
|
|
1177
|
+
output = `\\${value}`;
|
|
1178
|
+
}
|
|
1179
|
+
push({ type: "text", value, output });
|
|
1180
|
+
continue;
|
|
1181
|
+
}
|
|
1182
|
+
if (opts.dot !== true && (prev.type === "slash" || prev.type === "bos")) {
|
|
1183
|
+
push({ type: "qmark", value, output: QMARK_NO_DOT });
|
|
1184
|
+
continue;
|
|
1185
|
+
}
|
|
1186
|
+
push({ type: "qmark", value, output: QMARK });
|
|
1187
|
+
continue;
|
|
1188
|
+
}
|
|
1189
|
+
if (value === "!") {
|
|
1190
|
+
if (opts.noextglob !== true && peek() === "(") {
|
|
1191
|
+
if (peek(2) !== "?" || !/[!=<:]/.test(peek(3))) {
|
|
1192
|
+
extglobOpen("negate", value);
|
|
1193
|
+
continue;
|
|
1194
|
+
}
|
|
1195
|
+
}
|
|
1196
|
+
if (opts.nonegate !== true && state.index === 0) {
|
|
1197
|
+
negate();
|
|
1198
|
+
continue;
|
|
1199
|
+
}
|
|
1200
|
+
}
|
|
1201
|
+
if (value === "+") {
|
|
1202
|
+
if (opts.noextglob !== true && peek() === "(" && peek(2) !== "?") {
|
|
1203
|
+
extglobOpen("plus", value);
|
|
1204
|
+
continue;
|
|
1205
|
+
}
|
|
1206
|
+
if (prev && prev.value === "(" || opts.regex === false) {
|
|
1207
|
+
push({ type: "plus", value, output: PLUS_LITERAL });
|
|
1208
|
+
continue;
|
|
1209
|
+
}
|
|
1210
|
+
if (prev && (prev.type === "bracket" || prev.type === "paren" || prev.type === "brace") || state.parens > 0) {
|
|
1211
|
+
push({ type: "plus", value });
|
|
1212
|
+
continue;
|
|
1213
|
+
}
|
|
1214
|
+
push({ type: "plus", value: PLUS_LITERAL });
|
|
1215
|
+
continue;
|
|
1216
|
+
}
|
|
1217
|
+
if (value === "@") {
|
|
1218
|
+
if (opts.noextglob !== true && peek() === "(" && peek(2) !== "?") {
|
|
1219
|
+
push({ type: "at", extglob: true, value, output: "" });
|
|
1220
|
+
continue;
|
|
1221
|
+
}
|
|
1222
|
+
push({ type: "text", value });
|
|
1223
|
+
continue;
|
|
1224
|
+
}
|
|
1225
|
+
if (value !== "*") {
|
|
1226
|
+
if (value === "$" || value === "^") {
|
|
1227
|
+
value = `\\${value}`;
|
|
1228
|
+
}
|
|
1229
|
+
const match2 = REGEX_NON_SPECIAL_CHARS.exec(remaining());
|
|
1230
|
+
if (match2) {
|
|
1231
|
+
value += match2[0];
|
|
1232
|
+
state.index += match2[0].length;
|
|
1233
|
+
}
|
|
1234
|
+
push({ type: "text", value });
|
|
1235
|
+
continue;
|
|
1236
|
+
}
|
|
1237
|
+
if (prev && (prev.type === "globstar" || prev.star === true)) {
|
|
1238
|
+
prev.type = "star";
|
|
1239
|
+
prev.star = true;
|
|
1240
|
+
prev.value += value;
|
|
1241
|
+
prev.output = star;
|
|
1242
|
+
state.backtrack = true;
|
|
1243
|
+
state.globstar = true;
|
|
1244
|
+
consume(value);
|
|
1245
|
+
continue;
|
|
1246
|
+
}
|
|
1247
|
+
let rest = remaining();
|
|
1248
|
+
if (opts.noextglob !== true && /^\([^?]/.test(rest)) {
|
|
1249
|
+
extglobOpen("star", value);
|
|
1250
|
+
continue;
|
|
1251
|
+
}
|
|
1252
|
+
if (prev.type === "star") {
|
|
1253
|
+
if (opts.noglobstar === true) {
|
|
1254
|
+
consume(value);
|
|
1255
|
+
continue;
|
|
1256
|
+
}
|
|
1257
|
+
const prior = prev.prev;
|
|
1258
|
+
const before = prior.prev;
|
|
1259
|
+
const isStart = prior.type === "slash" || prior.type === "bos";
|
|
1260
|
+
const afterStar = before && (before.type === "star" || before.type === "globstar");
|
|
1261
|
+
if (opts.bash === true && (!isStart || rest[0] && rest[0] !== "/")) {
|
|
1262
|
+
push({ type: "star", value, output: "" });
|
|
1263
|
+
continue;
|
|
1264
|
+
}
|
|
1265
|
+
const isBrace = state.braces > 0 && (prior.type === "comma" || prior.type === "brace");
|
|
1266
|
+
const isExtglob = extglobs.length && (prior.type === "pipe" || prior.type === "paren");
|
|
1267
|
+
if (!isStart && prior.type !== "paren" && !isBrace && !isExtglob) {
|
|
1268
|
+
push({ type: "star", value, output: "" });
|
|
1269
|
+
continue;
|
|
1270
|
+
}
|
|
1271
|
+
while (rest.slice(0, 3) === "/**") {
|
|
1272
|
+
const after = input[state.index + 4];
|
|
1273
|
+
if (after && after !== "/") {
|
|
1274
|
+
break;
|
|
1275
|
+
}
|
|
1276
|
+
rest = rest.slice(3);
|
|
1277
|
+
consume("/**", 3);
|
|
1278
|
+
}
|
|
1279
|
+
if (prior.type === "bos" && eos()) {
|
|
1280
|
+
prev.type = "globstar";
|
|
1281
|
+
prev.value += value;
|
|
1282
|
+
prev.output = globstar(opts);
|
|
1283
|
+
state.output = prev.output;
|
|
1284
|
+
state.globstar = true;
|
|
1285
|
+
consume(value);
|
|
1286
|
+
continue;
|
|
1287
|
+
}
|
|
1288
|
+
if (prior.type === "slash" && prior.prev.type !== "bos" && !afterStar && eos()) {
|
|
1289
|
+
state.output = state.output.slice(0, -(prior.output + prev.output).length);
|
|
1290
|
+
prior.output = `(?:${prior.output}`;
|
|
1291
|
+
prev.type = "globstar";
|
|
1292
|
+
prev.output = globstar(opts) + (opts.strictSlashes ? ")" : "|$)");
|
|
1293
|
+
prev.value += value;
|
|
1294
|
+
state.globstar = true;
|
|
1295
|
+
state.output += prior.output + prev.output;
|
|
1296
|
+
consume(value);
|
|
1297
|
+
continue;
|
|
1298
|
+
}
|
|
1299
|
+
if (prior.type === "slash" && prior.prev.type !== "bos" && rest[0] === "/") {
|
|
1300
|
+
const end = rest[1] !== void 0 ? "|$" : "";
|
|
1301
|
+
state.output = state.output.slice(0, -(prior.output + prev.output).length);
|
|
1302
|
+
prior.output = `(?:${prior.output}`;
|
|
1303
|
+
prev.type = "globstar";
|
|
1304
|
+
prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`;
|
|
1305
|
+
prev.value += value;
|
|
1306
|
+
state.output += prior.output + prev.output;
|
|
1307
|
+
state.globstar = true;
|
|
1308
|
+
consume(value + advance());
|
|
1309
|
+
push({ type: "slash", value: "/", output: "" });
|
|
1310
|
+
continue;
|
|
1311
|
+
}
|
|
1312
|
+
if (prior.type === "bos" && rest[0] === "/") {
|
|
1313
|
+
prev.type = "globstar";
|
|
1314
|
+
prev.value += value;
|
|
1315
|
+
prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`;
|
|
1316
|
+
state.output = prev.output;
|
|
1317
|
+
state.globstar = true;
|
|
1318
|
+
consume(value + advance());
|
|
1319
|
+
push({ type: "slash", value: "/", output: "" });
|
|
1320
|
+
continue;
|
|
1321
|
+
}
|
|
1322
|
+
state.output = state.output.slice(0, -prev.output.length);
|
|
1323
|
+
prev.type = "globstar";
|
|
1324
|
+
prev.output = globstar(opts);
|
|
1325
|
+
prev.value += value;
|
|
1326
|
+
state.output += prev.output;
|
|
1327
|
+
state.globstar = true;
|
|
1328
|
+
consume(value);
|
|
1329
|
+
continue;
|
|
1330
|
+
}
|
|
1331
|
+
const token = { type: "star", value, output: star };
|
|
1332
|
+
if (opts.bash === true) {
|
|
1333
|
+
token.output = ".*?";
|
|
1334
|
+
if (prev.type === "bos" || prev.type === "slash") {
|
|
1335
|
+
token.output = nodot + token.output;
|
|
1336
|
+
}
|
|
1337
|
+
push(token);
|
|
1338
|
+
continue;
|
|
1339
|
+
}
|
|
1340
|
+
if (prev && (prev.type === "bracket" || prev.type === "paren") && opts.regex === true) {
|
|
1341
|
+
token.output = value;
|
|
1342
|
+
push(token);
|
|
1343
|
+
continue;
|
|
1344
|
+
}
|
|
1345
|
+
if (state.index === state.start || prev.type === "slash" || prev.type === "dot") {
|
|
1346
|
+
if (prev.type === "dot") {
|
|
1347
|
+
state.output += NO_DOT_SLASH;
|
|
1348
|
+
prev.output += NO_DOT_SLASH;
|
|
1349
|
+
} else if (opts.dot === true) {
|
|
1350
|
+
state.output += NO_DOTS_SLASH;
|
|
1351
|
+
prev.output += NO_DOTS_SLASH;
|
|
1352
|
+
} else {
|
|
1353
|
+
state.output += nodot;
|
|
1354
|
+
prev.output += nodot;
|
|
1355
|
+
}
|
|
1356
|
+
if (peek() !== "*") {
|
|
1357
|
+
state.output += ONE_CHAR;
|
|
1358
|
+
prev.output += ONE_CHAR;
|
|
1359
|
+
}
|
|
1360
|
+
}
|
|
1361
|
+
push(token);
|
|
1362
|
+
}
|
|
1363
|
+
while (state.brackets > 0) {
|
|
1364
|
+
if (opts.strictBrackets === true) throw new SyntaxError(syntaxError("closing", "]"));
|
|
1365
|
+
state.output = utils.escapeLast(state.output, "[");
|
|
1366
|
+
decrement("brackets");
|
|
1367
|
+
}
|
|
1368
|
+
while (state.parens > 0) {
|
|
1369
|
+
if (opts.strictBrackets === true) throw new SyntaxError(syntaxError("closing", ")"));
|
|
1370
|
+
state.output = utils.escapeLast(state.output, "(");
|
|
1371
|
+
decrement("parens");
|
|
1372
|
+
}
|
|
1373
|
+
while (state.braces > 0) {
|
|
1374
|
+
if (opts.strictBrackets === true) throw new SyntaxError(syntaxError("closing", "}"));
|
|
1375
|
+
state.output = utils.escapeLast(state.output, "{");
|
|
1376
|
+
decrement("braces");
|
|
1377
|
+
}
|
|
1378
|
+
if (opts.strictSlashes !== true && (prev.type === "star" || prev.type === "bracket")) {
|
|
1379
|
+
push({ type: "maybe_slash", value: "", output: `${SLASH_LITERAL}?` });
|
|
1380
|
+
}
|
|
1381
|
+
if (state.backtrack === true) {
|
|
1382
|
+
state.output = "";
|
|
1383
|
+
for (const token of state.tokens) {
|
|
1384
|
+
state.output += token.output != null ? token.output : token.value;
|
|
1385
|
+
if (token.suffix) {
|
|
1386
|
+
state.output += token.suffix;
|
|
1387
|
+
}
|
|
1388
|
+
}
|
|
1389
|
+
}
|
|
1390
|
+
return state;
|
|
1391
|
+
};
|
|
1392
|
+
parse2.fastpaths = (input, options) => {
|
|
1393
|
+
const opts = { ...options };
|
|
1394
|
+
const max = typeof opts.maxLength === "number" ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;
|
|
1395
|
+
const len = input.length;
|
|
1396
|
+
if (len > max) {
|
|
1397
|
+
throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);
|
|
1398
|
+
}
|
|
1399
|
+
input = REPLACEMENTS[input] || input;
|
|
1400
|
+
const {
|
|
1401
|
+
DOT_LITERAL,
|
|
1402
|
+
SLASH_LITERAL,
|
|
1403
|
+
ONE_CHAR,
|
|
1404
|
+
DOTS_SLASH,
|
|
1405
|
+
NO_DOT,
|
|
1406
|
+
NO_DOTS,
|
|
1407
|
+
NO_DOTS_SLASH,
|
|
1408
|
+
STAR,
|
|
1409
|
+
START_ANCHOR
|
|
1410
|
+
} = constants.globChars(opts.windows);
|
|
1411
|
+
const nodot = opts.dot ? NO_DOTS : NO_DOT;
|
|
1412
|
+
const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT;
|
|
1413
|
+
const capture = opts.capture ? "" : "?:";
|
|
1414
|
+
const state = { negated: false, prefix: "" };
|
|
1415
|
+
let star = opts.bash === true ? ".*?" : STAR;
|
|
1416
|
+
if (opts.capture) {
|
|
1417
|
+
star = `(${star})`;
|
|
1418
|
+
}
|
|
1419
|
+
const globstar = (opts2) => {
|
|
1420
|
+
if (opts2.noglobstar === true) return star;
|
|
1421
|
+
return `(${capture}(?:(?!${START_ANCHOR}${opts2.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;
|
|
1422
|
+
};
|
|
1423
|
+
const create = (str) => {
|
|
1424
|
+
switch (str) {
|
|
1425
|
+
case "*":
|
|
1426
|
+
return `${nodot}${ONE_CHAR}${star}`;
|
|
1427
|
+
case ".*":
|
|
1428
|
+
return `${DOT_LITERAL}${ONE_CHAR}${star}`;
|
|
1429
|
+
case "*.*":
|
|
1430
|
+
return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;
|
|
1431
|
+
case "*/*":
|
|
1432
|
+
return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;
|
|
1433
|
+
case "**":
|
|
1434
|
+
return nodot + globstar(opts);
|
|
1435
|
+
case "**/*":
|
|
1436
|
+
return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;
|
|
1437
|
+
case "**/*.*":
|
|
1438
|
+
return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;
|
|
1439
|
+
case "**/.*":
|
|
1440
|
+
return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;
|
|
1441
|
+
default: {
|
|
1442
|
+
const match2 = /^(.*?)\.(\w+)$/.exec(str);
|
|
1443
|
+
if (!match2) return;
|
|
1444
|
+
const source2 = create(match2[1]);
|
|
1445
|
+
if (!source2) return;
|
|
1446
|
+
return source2 + DOT_LITERAL + match2[2];
|
|
1447
|
+
}
|
|
1448
|
+
}
|
|
1449
|
+
};
|
|
1450
|
+
const output = utils.removePrefix(input, state);
|
|
1451
|
+
let source = create(output);
|
|
1452
|
+
if (source && opts.strictSlashes !== true) {
|
|
1453
|
+
source += `${SLASH_LITERAL}?`;
|
|
1454
|
+
}
|
|
1455
|
+
return source;
|
|
1456
|
+
};
|
|
1457
|
+
module.exports = parse2;
|
|
1458
|
+
}
|
|
1459
|
+
});
|
|
1460
|
+
|
|
1461
|
+
// node_modules/.pnpm/picomatch@4.0.3/node_modules/picomatch/lib/picomatch.js
|
|
1462
|
+
var require_picomatch = __commonJS({
|
|
1463
|
+
"node_modules/.pnpm/picomatch@4.0.3/node_modules/picomatch/lib/picomatch.js"(exports, module) {
|
|
1464
|
+
"use strict";
|
|
1465
|
+
var scan = require_scan();
|
|
1466
|
+
var parse2 = require_parse();
|
|
1467
|
+
var utils = require_utils();
|
|
1468
|
+
var constants = require_constants();
|
|
1469
|
+
var isObject = (val) => val && typeof val === "object" && !Array.isArray(val);
|
|
1470
|
+
var picomatch2 = (glob, options, returnState = false) => {
|
|
1471
|
+
if (Array.isArray(glob)) {
|
|
1472
|
+
const fns = glob.map((input) => picomatch2(input, options, returnState));
|
|
1473
|
+
const arrayMatcher = (str) => {
|
|
1474
|
+
for (const isMatch of fns) {
|
|
1475
|
+
const state2 = isMatch(str);
|
|
1476
|
+
if (state2) return state2;
|
|
1477
|
+
}
|
|
1478
|
+
return false;
|
|
1479
|
+
};
|
|
1480
|
+
return arrayMatcher;
|
|
1481
|
+
}
|
|
1482
|
+
const isState = isObject(glob) && glob.tokens && glob.input;
|
|
1483
|
+
if (glob === "" || typeof glob !== "string" && !isState) {
|
|
1484
|
+
throw new TypeError("Expected pattern to be a non-empty string");
|
|
1485
|
+
}
|
|
1486
|
+
const opts = options || {};
|
|
1487
|
+
const posix = opts.windows;
|
|
1488
|
+
const regex = isState ? picomatch2.compileRe(glob, options) : picomatch2.makeRe(glob, options, false, true);
|
|
1489
|
+
const state = regex.state;
|
|
1490
|
+
delete regex.state;
|
|
1491
|
+
let isIgnored = () => false;
|
|
1492
|
+
if (opts.ignore) {
|
|
1493
|
+
const ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null };
|
|
1494
|
+
isIgnored = picomatch2(opts.ignore, ignoreOpts, returnState);
|
|
1495
|
+
}
|
|
1496
|
+
const matcher = (input, returnObject = false) => {
|
|
1497
|
+
const { isMatch, match: match2, output } = picomatch2.test(input, regex, options, { glob, posix });
|
|
1498
|
+
const result = { glob, state, regex, posix, input, output, match: match2, isMatch };
|
|
1499
|
+
if (typeof opts.onResult === "function") {
|
|
1500
|
+
opts.onResult(result);
|
|
1501
|
+
}
|
|
1502
|
+
if (isMatch === false) {
|
|
1503
|
+
result.isMatch = false;
|
|
1504
|
+
return returnObject ? result : false;
|
|
1505
|
+
}
|
|
1506
|
+
if (isIgnored(input)) {
|
|
1507
|
+
if (typeof opts.onIgnore === "function") {
|
|
1508
|
+
opts.onIgnore(result);
|
|
1509
|
+
}
|
|
1510
|
+
result.isMatch = false;
|
|
1511
|
+
return returnObject ? result : false;
|
|
1512
|
+
}
|
|
1513
|
+
if (typeof opts.onMatch === "function") {
|
|
1514
|
+
opts.onMatch(result);
|
|
1515
|
+
}
|
|
1516
|
+
return returnObject ? result : true;
|
|
1517
|
+
};
|
|
1518
|
+
if (returnState) {
|
|
1519
|
+
matcher.state = state;
|
|
1520
|
+
}
|
|
1521
|
+
return matcher;
|
|
1522
|
+
};
|
|
1523
|
+
picomatch2.test = (input, regex, options, { glob, posix } = {}) => {
|
|
1524
|
+
if (typeof input !== "string") {
|
|
1525
|
+
throw new TypeError("Expected input to be a string");
|
|
1526
|
+
}
|
|
1527
|
+
if (input === "") {
|
|
1528
|
+
return { isMatch: false, output: "" };
|
|
1529
|
+
}
|
|
1530
|
+
const opts = options || {};
|
|
1531
|
+
const format = opts.format || (posix ? utils.toPosixSlashes : null);
|
|
1532
|
+
let match2 = input === glob;
|
|
1533
|
+
let output = match2 && format ? format(input) : input;
|
|
1534
|
+
if (match2 === false) {
|
|
1535
|
+
output = format ? format(input) : input;
|
|
1536
|
+
match2 = output === glob;
|
|
1537
|
+
}
|
|
1538
|
+
if (match2 === false || opts.capture === true) {
|
|
1539
|
+
if (opts.matchBase === true || opts.basename === true) {
|
|
1540
|
+
match2 = picomatch2.matchBase(input, regex, options, posix);
|
|
1541
|
+
} else {
|
|
1542
|
+
match2 = regex.exec(output);
|
|
1543
|
+
}
|
|
1544
|
+
}
|
|
1545
|
+
return { isMatch: Boolean(match2), match: match2, output };
|
|
1546
|
+
};
|
|
1547
|
+
picomatch2.matchBase = (input, glob, options) => {
|
|
1548
|
+
const regex = glob instanceof RegExp ? glob : picomatch2.makeRe(glob, options);
|
|
1549
|
+
return regex.test(utils.basename(input));
|
|
1550
|
+
};
|
|
1551
|
+
picomatch2.isMatch = (str, patterns, options) => picomatch2(patterns, options)(str);
|
|
1552
|
+
picomatch2.parse = (pattern, options) => {
|
|
1553
|
+
if (Array.isArray(pattern)) return pattern.map((p) => picomatch2.parse(p, options));
|
|
1554
|
+
return parse2(pattern, { ...options, fastpaths: false });
|
|
1555
|
+
};
|
|
1556
|
+
picomatch2.scan = (input, options) => scan(input, options);
|
|
1557
|
+
picomatch2.compileRe = (state, options, returnOutput = false, returnState = false) => {
|
|
1558
|
+
if (returnOutput === true) {
|
|
1559
|
+
return state.output;
|
|
1560
|
+
}
|
|
1561
|
+
const opts = options || {};
|
|
1562
|
+
const prepend = opts.contains ? "" : "^";
|
|
1563
|
+
const append = opts.contains ? "" : "$";
|
|
1564
|
+
let source = `${prepend}(?:${state.output})${append}`;
|
|
1565
|
+
if (state && state.negated === true) {
|
|
1566
|
+
source = `^(?!${source}).*$`;
|
|
1567
|
+
}
|
|
1568
|
+
const regex = picomatch2.toRegex(source, options);
|
|
1569
|
+
if (returnState === true) {
|
|
1570
|
+
regex.state = state;
|
|
1571
|
+
}
|
|
1572
|
+
return regex;
|
|
1573
|
+
};
|
|
1574
|
+
picomatch2.makeRe = (input, options = {}, returnOutput = false, returnState = false) => {
|
|
1575
|
+
if (!input || typeof input !== "string") {
|
|
1576
|
+
throw new TypeError("Expected a non-empty string");
|
|
1577
|
+
}
|
|
1578
|
+
let parsed = { negated: false, fastpaths: true };
|
|
1579
|
+
if (options.fastpaths !== false && (input[0] === "." || input[0] === "*")) {
|
|
1580
|
+
parsed.output = parse2.fastpaths(input, options);
|
|
1581
|
+
}
|
|
1582
|
+
if (!parsed.output) {
|
|
1583
|
+
parsed = parse2(input, options);
|
|
1584
|
+
}
|
|
1585
|
+
return picomatch2.compileRe(parsed, options, returnOutput, returnState);
|
|
1586
|
+
};
|
|
1587
|
+
picomatch2.toRegex = (source, options) => {
|
|
1588
|
+
try {
|
|
1589
|
+
const opts = options || {};
|
|
1590
|
+
return new RegExp(source, opts.flags || (opts.nocase ? "i" : ""));
|
|
1591
|
+
} catch (err) {
|
|
1592
|
+
if (options && options.debug === true) throw err;
|
|
1593
|
+
return /$^/;
|
|
1594
|
+
}
|
|
1595
|
+
};
|
|
1596
|
+
picomatch2.constants = constants;
|
|
1597
|
+
module.exports = picomatch2;
|
|
1598
|
+
}
|
|
1599
|
+
});
|
|
1600
|
+
|
|
1601
|
+
// node_modules/.pnpm/picomatch@4.0.3/node_modules/picomatch/index.js
|
|
1602
|
+
var require_picomatch2 = __commonJS({
|
|
1603
|
+
"node_modules/.pnpm/picomatch@4.0.3/node_modules/picomatch/index.js"(exports, module) {
|
|
1604
|
+
"use strict";
|
|
1605
|
+
var pico = require_picomatch();
|
|
1606
|
+
var utils = require_utils();
|
|
1607
|
+
function picomatch2(glob, options, returnState = false) {
|
|
1608
|
+
if (options && (options.windows === null || options.windows === void 0)) {
|
|
1609
|
+
options = { ...options, windows: utils.isWindows() };
|
|
1610
|
+
}
|
|
1611
|
+
return pico(glob, options, returnState);
|
|
1612
|
+
}
|
|
1613
|
+
Object.assign(picomatch2, pico);
|
|
1614
|
+
module.exports = picomatch2;
|
|
1615
|
+
}
|
|
1616
|
+
});
|
|
1617
|
+
|
|
100
1618
|
// node_modules/.pnpm/ansi-regex@5.0.1/node_modules/ansi-regex/index.js
|
|
101
1619
|
var require_ansi_regex = __commonJS({
|
|
102
1620
|
"node_modules/.pnpm/ansi-regex@5.0.1/node_modules/ansi-regex/index.js"(exports, module) {
|
|
@@ -1511,7 +3029,7 @@ var require_getBorderCharacters = __commonJS({
|
|
|
1511
3029
|
});
|
|
1512
3030
|
|
|
1513
3031
|
// node_modules/.pnpm/table@6.9.0/node_modules/table/dist/src/utils.js
|
|
1514
|
-
var
|
|
3032
|
+
var require_utils2 = __commonJS({
|
|
1515
3033
|
"node_modules/.pnpm/table@6.9.0/node_modules/table/dist/src/utils.js"(exports) {
|
|
1516
3034
|
"use strict";
|
|
1517
3035
|
var __importDefault = exports && exports.__importDefault || function(mod) {
|
|
@@ -1623,7 +3141,7 @@ var require_alignString = __commonJS({
|
|
|
1623
3141
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
1624
3142
|
exports.alignString = void 0;
|
|
1625
3143
|
var string_width_1 = __importDefault(require_string_width());
|
|
1626
|
-
var utils_1 =
|
|
3144
|
+
var utils_1 = require_utils2();
|
|
1627
3145
|
var alignLeft = (subject, width) => {
|
|
1628
3146
|
return subject + " ".repeat(width);
|
|
1629
3147
|
};
|
|
@@ -1776,7 +3294,7 @@ var require_wrapCell = __commonJS({
|
|
|
1776
3294
|
"use strict";
|
|
1777
3295
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
1778
3296
|
exports.wrapCell = void 0;
|
|
1779
|
-
var utils_1 =
|
|
3297
|
+
var utils_1 = require_utils2();
|
|
1780
3298
|
var wrapString_1 = require_wrapString();
|
|
1781
3299
|
var wrapWord_1 = require_wrapWord();
|
|
1782
3300
|
var wrapCell = (cellValue, cellWidth, useWrapWord) => {
|
|
@@ -1818,7 +3336,7 @@ var require_calculateRowHeights = __commonJS({
|
|
|
1818
3336
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
1819
3337
|
exports.calculateRowHeights = void 0;
|
|
1820
3338
|
var calculateCellHeight_1 = require_calculateCellHeight();
|
|
1821
|
-
var utils_1 =
|
|
3339
|
+
var utils_1 = require_utils2();
|
|
1822
3340
|
var calculateRowHeights = (rows, config) => {
|
|
1823
3341
|
const rowHeights = [];
|
|
1824
3342
|
for (const [rowIndex, row] of rows.entries()) {
|
|
@@ -4749,7 +6267,7 @@ var require_makeStreamConfig = __commonJS({
|
|
|
4749
6267
|
"use strict";
|
|
4750
6268
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4751
6269
|
exports.makeStreamConfig = void 0;
|
|
4752
|
-
var utils_1 =
|
|
6270
|
+
var utils_1 = require_utils2();
|
|
4753
6271
|
var validateConfig_1 = require_validateConfig();
|
|
4754
6272
|
var makeColumnsConfig = (columnCount, columns = {}, columnDefault) => {
|
|
4755
6273
|
return Array.from({ length: columnCount }).map((_, index) => {
|
|
@@ -4789,7 +6307,7 @@ var require_mapDataUsingRowHeights = __commonJS({
|
|
|
4789
6307
|
"use strict";
|
|
4790
6308
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4791
6309
|
exports.mapDataUsingRowHeights = exports.padCellVertically = void 0;
|
|
4792
|
-
var utils_1 =
|
|
6310
|
+
var utils_1 = require_utils2();
|
|
4793
6311
|
var wrapCell_1 = require_wrapCell();
|
|
4794
6312
|
var createEmptyStrings = (length) => {
|
|
4795
6313
|
return new Array(length).fill("");
|
|
@@ -4878,7 +6396,7 @@ var require_stringifyTableData = __commonJS({
|
|
|
4878
6396
|
"use strict";
|
|
4879
6397
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4880
6398
|
exports.stringifyTableData = void 0;
|
|
4881
|
-
var utils_1 =
|
|
6399
|
+
var utils_1 = require_utils2();
|
|
4882
6400
|
var stringifyTableData = (rows) => {
|
|
4883
6401
|
return rows.map((cells) => {
|
|
4884
6402
|
return cells.map((cell) => {
|
|
@@ -5153,7 +6671,7 @@ var require_createStream = __commonJS({
|
|
|
5153
6671
|
var padTableData_1 = require_padTableData();
|
|
5154
6672
|
var stringifyTableData_1 = require_stringifyTableData();
|
|
5155
6673
|
var truncateTableData_1 = require_truncateTableData();
|
|
5156
|
-
var utils_1 =
|
|
6674
|
+
var utils_1 = require_utils2();
|
|
5157
6675
|
var prepareData = (data, config) => {
|
|
5158
6676
|
let rows = (0, stringifyTableData_1.stringifyTableData)(data);
|
|
5159
6677
|
rows = (0, truncateTableData_1.truncateTableData)(rows, (0, utils_1.extractTruncates)(config));
|
|
@@ -5240,7 +6758,7 @@ var require_drawTable = __commonJS({
|
|
|
5240
6758
|
var drawBorder_1 = require_drawBorder();
|
|
5241
6759
|
var drawContent_1 = require_drawContent();
|
|
5242
6760
|
var drawRow_1 = require_drawRow();
|
|
5243
|
-
var utils_1 =
|
|
6761
|
+
var utils_1 = require_utils2();
|
|
5244
6762
|
var drawTable = (rows, outputColumnWidths, rowHeights, config) => {
|
|
5245
6763
|
const { drawHorizontalLine, singleLine } = config;
|
|
5246
6764
|
const contents = (0, utils_1.groupBySizes)(rows, rowHeights).map((group, groupIndex) => {
|
|
@@ -5322,7 +6840,7 @@ var require_calculateMaximumColumnWidths = __commonJS({
|
|
|
5322
6840
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5323
6841
|
exports.calculateMaximumColumnWidths = exports.calculateMaximumCellWidth = void 0;
|
|
5324
6842
|
var string_width_1 = __importDefault(require_string_width());
|
|
5325
|
-
var utils_1 =
|
|
6843
|
+
var utils_1 = require_utils2();
|
|
5326
6844
|
var calculateMaximumCellWidth = (cell) => {
|
|
5327
6845
|
return Math.max(...cell.split("\n").map(string_width_1.default));
|
|
5328
6846
|
};
|
|
@@ -5366,7 +6884,7 @@ var require_alignSpanningCell = __commonJS({
|
|
|
5366
6884
|
var mapDataUsingRowHeights_1 = require_mapDataUsingRowHeights();
|
|
5367
6885
|
var padTableData_1 = require_padTableData();
|
|
5368
6886
|
var truncateTableData_1 = require_truncateTableData();
|
|
5369
|
-
var utils_1 =
|
|
6887
|
+
var utils_1 = require_utils2();
|
|
5370
6888
|
var wrapCell_1 = require_wrapCell();
|
|
5371
6889
|
var wrapRangeContent = (rangeConfig, rangeWidth, context) => {
|
|
5372
6890
|
const { topLeft, paddingRight, paddingLeft, truncate, wrapWord, alignment } = rangeConfig;
|
|
@@ -5407,7 +6925,7 @@ var require_calculateSpanningCellWidth = __commonJS({
|
|
|
5407
6925
|
"use strict";
|
|
5408
6926
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5409
6927
|
exports.calculateSpanningCellWidth = void 0;
|
|
5410
|
-
var utils_1 =
|
|
6928
|
+
var utils_1 = require_utils2();
|
|
5411
6929
|
var calculateSpanningCellWidth = (rangeConfig, dependencies) => {
|
|
5412
6930
|
const { columnsConfig, drawVerticalLine } = dependencies;
|
|
5413
6931
|
const { topLeft, bottomRight } = rangeConfig;
|
|
@@ -5433,7 +6951,7 @@ var require_makeRangeConfig = __commonJS({
|
|
|
5433
6951
|
"use strict";
|
|
5434
6952
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5435
6953
|
exports.makeRangeConfig = void 0;
|
|
5436
|
-
var utils_1 =
|
|
6954
|
+
var utils_1 = require_utils2();
|
|
5437
6955
|
var makeRangeConfig = (spanningCellConfig, columnsConfig) => {
|
|
5438
6956
|
var _a;
|
|
5439
6957
|
const { topLeft, bottomRight } = (0, utils_1.calculateRangeCoordinate)(spanningCellConfig);
|
|
@@ -5461,7 +6979,7 @@ var require_spanningCellManager = __commonJS({
|
|
|
5461
6979
|
var alignSpanningCell_1 = require_alignSpanningCell();
|
|
5462
6980
|
var calculateSpanningCellWidth_1 = require_calculateSpanningCellWidth();
|
|
5463
6981
|
var makeRangeConfig_1 = require_makeRangeConfig();
|
|
5464
|
-
var utils_1 =
|
|
6982
|
+
var utils_1 = require_utils2();
|
|
5465
6983
|
var findRangeConfig = (cell, rangeConfigs) => {
|
|
5466
6984
|
return rangeConfigs.find((rangeCoordinate) => {
|
|
5467
6985
|
return (0, utils_1.isCellInRange)(cell, rangeCoordinate);
|
|
@@ -5565,7 +7083,7 @@ var require_validateSpanningCellConfig = __commonJS({
|
|
|
5565
7083
|
"use strict";
|
|
5566
7084
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5567
7085
|
exports.validateSpanningCellConfig = void 0;
|
|
5568
|
-
var utils_1 =
|
|
7086
|
+
var utils_1 = require_utils2();
|
|
5569
7087
|
var inRange = (start, end, value) => {
|
|
5570
7088
|
return start <= value && value <= end;
|
|
5571
7089
|
};
|
|
@@ -5615,7 +7133,7 @@ var require_makeTableConfig = __commonJS({
|
|
|
5615
7133
|
exports.makeTableConfig = void 0;
|
|
5616
7134
|
var calculateMaximumColumnWidths_1 = require_calculateMaximumColumnWidths();
|
|
5617
7135
|
var spanningCellManager_1 = require_spanningCellManager();
|
|
5618
|
-
var utils_1 =
|
|
7136
|
+
var utils_1 = require_utils2();
|
|
5619
7137
|
var validateConfig_1 = require_validateConfig();
|
|
5620
7138
|
var validateSpanningCellConfig_1 = require_validateSpanningCellConfig();
|
|
5621
7139
|
var makeColumnsConfig = (rows, columns, columnDefault, spanningCellConfigs) => {
|
|
@@ -5672,7 +7190,7 @@ var require_validateTableData = __commonJS({
|
|
|
5672
7190
|
"use strict";
|
|
5673
7191
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5674
7192
|
exports.validateTableData = void 0;
|
|
5675
|
-
var utils_1 =
|
|
7193
|
+
var utils_1 = require_utils2();
|
|
5676
7194
|
var validateTableData = (rows) => {
|
|
5677
7195
|
if (!Array.isArray(rows)) {
|
|
5678
7196
|
throw new TypeError("Table data must be an array.");
|
|
@@ -5718,7 +7236,7 @@ var require_table = __commonJS({
|
|
|
5718
7236
|
var padTableData_1 = require_padTableData();
|
|
5719
7237
|
var stringifyTableData_1 = require_stringifyTableData();
|
|
5720
7238
|
var truncateTableData_1 = require_truncateTableData();
|
|
5721
|
-
var utils_1 =
|
|
7239
|
+
var utils_1 = require_utils2();
|
|
5722
7240
|
var validateTableData_1 = require_validateTableData();
|
|
5723
7241
|
var table2 = (data, userConfig = {}) => {
|
|
5724
7242
|
(0, validateTableData_1.validateTableData)(data);
|
|
@@ -6534,7 +8052,8 @@ function loadGlobalStore() {
|
|
|
6534
8052
|
return raw;
|
|
6535
8053
|
}
|
|
6536
8054
|
return { repos: {} };
|
|
6537
|
-
} catch {
|
|
8055
|
+
} catch (err) {
|
|
8056
|
+
console.error(`Warning: failed to load store: ${err instanceof Error ? err.message : String(err)}`);
|
|
6538
8057
|
return { repos: {} };
|
|
6539
8058
|
}
|
|
6540
8059
|
}
|
|
@@ -6598,13 +8117,15 @@ function loadConfig() {
|
|
|
6598
8117
|
const content = readFileSync(configPath, "utf-8");
|
|
6599
8118
|
const parsed = parse(content);
|
|
6600
8119
|
return parsed;
|
|
6601
|
-
} catch {
|
|
8120
|
+
} catch (err) {
|
|
8121
|
+
console.error(`Warning: failed to load ${configPath}: ${err instanceof Error ? err.message : String(err)}`);
|
|
6602
8122
|
return null;
|
|
6603
8123
|
}
|
|
6604
8124
|
}
|
|
6605
8125
|
|
|
6606
8126
|
// utils.ts
|
|
6607
8127
|
var import_picocolors = __toESM(require_picocolors(), 1);
|
|
8128
|
+
var import_picomatch = __toESM(require_picomatch2(), 1);
|
|
6608
8129
|
import { execSync as execSync2, execFileSync, spawnSync } from "child_process";
|
|
6609
8130
|
import { existsSync as existsSync2, readSync, openSync, mkdirSync as mkdirSync2, writeFileSync as writeFileSync2, rmSync, lstatSync, readdirSync, readlinkSync } from "fs";
|
|
6610
8131
|
import { basename as basename2, dirname as dirname2, join as join2 } from "path";
|
|
@@ -6737,7 +8258,8 @@ function getWorktreeForBranch(branch) {
|
|
|
6737
8258
|
}
|
|
6738
8259
|
}
|
|
6739
8260
|
return null;
|
|
6740
|
-
} catch {
|
|
8261
|
+
} catch (err) {
|
|
8262
|
+
console.error(warn(`git worktree list failed: ${err instanceof Error ? err.message : String(err)}`));
|
|
6741
8263
|
return null;
|
|
6742
8264
|
}
|
|
6743
8265
|
}
|
|
@@ -6780,7 +8302,8 @@ function removeGitWorktree(path) {
|
|
|
6780
8302
|
function pruneWorktrees() {
|
|
6781
8303
|
try {
|
|
6782
8304
|
execSync2("git worktree prune", { stdio: "ignore" });
|
|
6783
|
-
} catch {
|
|
8305
|
+
} catch (err) {
|
|
8306
|
+
console.error(warn(`git worktree prune failed: ${err instanceof Error ? err.message : String(err)}`));
|
|
6784
8307
|
}
|
|
6785
8308
|
}
|
|
6786
8309
|
function deleteBranch(name) {
|
|
@@ -6796,6 +8319,16 @@ function branchHasRemote(name) {
|
|
|
6796
8319
|
return false;
|
|
6797
8320
|
}
|
|
6798
8321
|
}
|
|
8322
|
+
function branchHasCommitsAheadOf(baseBranch, branch) {
|
|
8323
|
+
try {
|
|
8324
|
+
const count = execSync2(`git rev-list --count "${baseBranch}".."${branch}"`, {
|
|
8325
|
+
encoding: "utf-8"
|
|
8326
|
+
}).trim();
|
|
8327
|
+
return parseInt(count, 10) > 0;
|
|
8328
|
+
} catch {
|
|
8329
|
+
return false;
|
|
8330
|
+
}
|
|
8331
|
+
}
|
|
6799
8332
|
function canFastForward(baseBranch, targetBranch) {
|
|
6800
8333
|
try {
|
|
6801
8334
|
const baseCommit = execSync2(`git rev-parse "${baseBranch}"`, { encoding: "utf-8" }).trim();
|
|
@@ -7013,8 +8546,19 @@ var installCmds = {
|
|
|
7013
8546
|
pipenv: "pipenv install",
|
|
7014
8547
|
pdm: "pdm install"
|
|
7015
8548
|
};
|
|
8549
|
+
var lockfileNames = {
|
|
8550
|
+
npm: "package-lock.json",
|
|
8551
|
+
yarn: "yarn.lock",
|
|
8552
|
+
pnpm: "pnpm-lock.yaml",
|
|
8553
|
+
bun: "bun.lock",
|
|
8554
|
+
uv: "uv.lock",
|
|
8555
|
+
poetry: "poetry.lock",
|
|
8556
|
+
pipenv: "Pipfile.lock",
|
|
8557
|
+
pdm: "pdm.lock"
|
|
8558
|
+
};
|
|
7016
8559
|
function runPackageManagerInstall(pm, cwd) {
|
|
7017
8560
|
const cmd2 = installCmds[pm];
|
|
8561
|
+
console.log(dim(`Detected ${lockfileNames[pm]}`));
|
|
7018
8562
|
console.log(dim(`Running ${cmd2}...`));
|
|
7019
8563
|
try {
|
|
7020
8564
|
execSync2(cmd2, { cwd, stdio: "inherit" });
|
|
@@ -7052,41 +8596,43 @@ function cpCow(src, dest) {
|
|
|
7052
8596
|
console.error(warn(`Failed to copy ${src}: ${err instanceof Error ? err.message : String(err)}`));
|
|
7053
8597
|
}
|
|
7054
8598
|
}
|
|
7055
|
-
|
|
8599
|
+
var DEFAULT_COPY_PATTERNS = [
|
|
8600
|
+
".env*",
|
|
8601
|
+
".npmrc*",
|
|
8602
|
+
".yarnrc*",
|
|
8603
|
+
".pnpmfile.*",
|
|
8604
|
+
".pnpmrc*",
|
|
8605
|
+
".tool-versions",
|
|
8606
|
+
".node-version",
|
|
8607
|
+
".nvmrc",
|
|
8608
|
+
".ruby-version",
|
|
8609
|
+
".python-version",
|
|
8610
|
+
".mise*.toml",
|
|
8611
|
+
".dir-locals.el",
|
|
8612
|
+
".editorconfig.local"
|
|
8613
|
+
];
|
|
8614
|
+
function getIgnoredFiles(repoPath) {
|
|
7056
8615
|
try {
|
|
7057
8616
|
const output = execFileSync(
|
|
7058
8617
|
"git",
|
|
7059
8618
|
["ls-files", "--others", "--ignored", "--exclude-standard", "--directory"],
|
|
7060
|
-
{ cwd: repoPath, encoding: "utf-8" }
|
|
8619
|
+
{ cwd: repoPath, encoding: "utf-8", maxBuffer: 10 * 1024 * 1024 }
|
|
7061
8620
|
);
|
|
7062
|
-
|
|
7063
|
-
|
|
7064
|
-
|
|
7065
|
-
for (const path of paths) {
|
|
7066
|
-
if (prev && path.startsWith(prev + "/")) continue;
|
|
7067
|
-
minimal.push(path);
|
|
7068
|
-
prev = path;
|
|
7069
|
-
}
|
|
7070
|
-
return minimal;
|
|
7071
|
-
} catch {
|
|
8621
|
+
return output.split("\n").map((p) => p.replace(/\/$/, "")).filter((p) => p.length > 0 && p !== ".git");
|
|
8622
|
+
} catch (err) {
|
|
8623
|
+
console.error(warn(`Failed to list ignored files: ${err instanceof Error ? err.message : String(err)}`));
|
|
7072
8624
|
return [];
|
|
7073
8625
|
}
|
|
7074
8626
|
}
|
|
7075
|
-
|
|
7076
|
-
|
|
7077
|
-
|
|
7078
|
-
|
|
7079
|
-
}
|
|
7080
|
-
|
|
7081
|
-
|
|
7082
|
-
items = items.filter((item) => !isJunkFile(item));
|
|
7083
|
-
if (skipDirs && skipDirs.length > 0) {
|
|
7084
|
-
items = items.filter(
|
|
7085
|
-
(item) => !skipDirs.some((dir) => item.split("/").includes(dir))
|
|
7086
|
-
);
|
|
7087
|
-
}
|
|
8627
|
+
function copyIgnoredFiles(repoPath, worktreePath, patterns) {
|
|
8628
|
+
const raw = patterns ?? DEFAULT_COPY_PATTERNS;
|
|
8629
|
+
if (raw.length === 0) return;
|
|
8630
|
+
const globs = raw.map((p) => p.includes("/") ? p : `**/${p}`);
|
|
8631
|
+
const isMatch = (0, import_picomatch.default)(globs, { dot: true });
|
|
8632
|
+
const allFiles = getIgnoredFiles(repoPath);
|
|
8633
|
+
const items = allFiles.filter((file) => isMatch(file));
|
|
7088
8634
|
if (items.length === 0) return;
|
|
7089
|
-
console.log(dim(`Copying
|
|
8635
|
+
console.log(dim(`Copying config files:`));
|
|
7090
8636
|
for (const item of items) {
|
|
7091
8637
|
console.log(dim(` ${item}`));
|
|
7092
8638
|
const dest = join2(worktreePath, item);
|
|
@@ -7106,14 +8652,20 @@ function autoCleanupWorktree(worktreeId, path, store, saveStore2) {
|
|
|
7106
8652
|
console.log(" Pruning worktree...");
|
|
7107
8653
|
try {
|
|
7108
8654
|
removeGitWorktree(path);
|
|
7109
|
-
} catch {
|
|
8655
|
+
} catch (err) {
|
|
8656
|
+
console.error(dim(` git worktree remove failed: ${err instanceof Error ? err.message : String(err)}`));
|
|
7110
8657
|
}
|
|
7111
8658
|
pruneWorktrees();
|
|
7112
8659
|
removeWorktreeMeta(store, worktreeId);
|
|
7113
8660
|
saveStore2(store);
|
|
7114
8661
|
const canMergeBranch = branch !== "[missing]" && branch !== "[detached]" && currentBranch !== "HEAD";
|
|
7115
8662
|
if (!canMergeBranch) {
|
|
7116
|
-
|
|
8663
|
+
const branchNote = branch !== "[missing]" && branch !== "[detached]" ? ` Branch '${cyan(branch)}' still exists.` : "";
|
|
8664
|
+
console.log(` Pruned '${branch}' worktree.${branchNote}`);
|
|
8665
|
+
return;
|
|
8666
|
+
}
|
|
8667
|
+
if (!branchHasCommitsAheadOf(currentBranch, branch)) {
|
|
8668
|
+
console.log(` Pruned worktree. Branch '${cyan(branch)}' still exists.`);
|
|
7117
8669
|
return;
|
|
7118
8670
|
}
|
|
7119
8671
|
if (branchHasRemote(branch)) {
|
|
@@ -7184,15 +8736,13 @@ function newCommand(branchName, fromBranch) {
|
|
|
7184
8736
|
const worktreeId = `${repoName}@${slugify(branch)}`;
|
|
7185
8737
|
const worktreePath = join3(getWorktreesDir(), worktreeId);
|
|
7186
8738
|
mkdirSync3(dirname3(worktreePath), { recursive: true });
|
|
8739
|
+
console.log(dim(`Creating worktree for ${cyan(branch)}...`));
|
|
7187
8740
|
createWorktree(branch, worktreePath, fromBranch);
|
|
7188
8741
|
initSubmodules(worktreePath);
|
|
7189
8742
|
const config = loadConfig();
|
|
8743
|
+
copyIgnoredFiles(mainWorktree, worktreePath, config?.copy);
|
|
7190
8744
|
const jsPm = config?.setup ? null : detectJsPackageManager(mainWorktree);
|
|
7191
8745
|
const pyPm = config?.setup ? null : detectPythonPackageManager(mainWorktree);
|
|
7192
|
-
const skipDirs = [];
|
|
7193
|
-
if (jsPm) skipDirs.push("node_modules");
|
|
7194
|
-
if (pyPm) skipDirs.push(".venv", "venv");
|
|
7195
|
-
copyIgnoredFiles(mainWorktree, worktreePath, skipDirs);
|
|
7196
8746
|
if (jsPm) runPackageManagerInstall(jsPm, worktreePath);
|
|
7197
8747
|
if (pyPm) runPackageManagerInstall(pyPm, worktreePath);
|
|
7198
8748
|
setWorktreeMeta(store, worktreeId, {
|
|
@@ -7202,7 +8752,8 @@ function newCommand(branchName, fromBranch) {
|
|
|
7202
8752
|
const parentBranch = getCurrentBranch();
|
|
7203
8753
|
console.log();
|
|
7204
8754
|
console.log(success(bold(branch)), dim(`(from ${cyan(baseBranch)})`));
|
|
7205
|
-
console.log(dim(
|
|
8755
|
+
console.log(dim(worktreePath));
|
|
8756
|
+
console.log(dim(`Opening branch in ephemeral subshell`));
|
|
7206
8757
|
console.log(dim("Type 'wk close' to return."));
|
|
7207
8758
|
console.log();
|
|
7208
8759
|
spawnShell(worktreePath, {
|
|
@@ -7259,7 +8810,8 @@ function fetchPRBranch(prRef, prInfo) {
|
|
|
7259
8810
|
execSync3(`gh pr checkout ${prRef}`, { stdio: "pipe" });
|
|
7260
8811
|
execSync3(`git checkout "${currentBranch}"`, { stdio: "pipe" });
|
|
7261
8812
|
return true;
|
|
7262
|
-
} catch {
|
|
8813
|
+
} catch (err) {
|
|
8814
|
+
console.error(`Warning: gh pr checkout failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
7263
8815
|
try {
|
|
7264
8816
|
execSync3(`git checkout "${currentBranch}"`, { stdio: "pipe" });
|
|
7265
8817
|
} catch {
|
|
@@ -7306,12 +8858,9 @@ function openBranch(branch, prNumber) {
|
|
|
7306
8858
|
createWorktreeForExistingBranch(branch, worktreePath);
|
|
7307
8859
|
initSubmodules(worktreePath);
|
|
7308
8860
|
const config = loadConfig();
|
|
8861
|
+
copyIgnoredFiles(mainWorktree, worktreePath, config?.copy);
|
|
7309
8862
|
const jsPm = config?.setup ? null : detectJsPackageManager(mainWorktree);
|
|
7310
8863
|
const pyPm = config?.setup ? null : detectPythonPackageManager(mainWorktree);
|
|
7311
|
-
const skipDirs = [];
|
|
7312
|
-
if (jsPm) skipDirs.push("node_modules");
|
|
7313
|
-
if (pyPm) skipDirs.push(".venv", "venv");
|
|
7314
|
-
copyIgnoredFiles(mainWorktree, worktreePath, skipDirs);
|
|
7315
8864
|
if (jsPm) runPackageManagerInstall(jsPm, worktreePath);
|
|
7316
8865
|
if (pyPm) runPackageManagerInstall(pyPm, worktreePath);
|
|
7317
8866
|
setWorktreeMeta(store, worktreeId, {
|
|
@@ -7321,10 +8870,10 @@ function openBranch(branch, prNumber) {
|
|
|
7321
8870
|
console.log();
|
|
7322
8871
|
if (prNumber) {
|
|
7323
8872
|
console.log(success(bold(`PR #${prNumber}`)), dim(`branch: ${cyan(branch)}`));
|
|
7324
|
-
console.log(dim(`
|
|
8873
|
+
console.log(dim(`Opening PR in ephemeral subshell`));
|
|
7325
8874
|
} else {
|
|
7326
8875
|
console.log(success(bold(branch)));
|
|
7327
|
-
console.log(dim(`
|
|
8876
|
+
console.log(dim(`Opening branch in ephemeral subshell`));
|
|
7328
8877
|
}
|
|
7329
8878
|
console.log(dim("Type 'exit' or 'wk close' to return."));
|
|
7330
8879
|
console.log();
|
|
@@ -8271,12 +9820,14 @@ function rmCommand(branch, force = false) {
|
|
|
8271
9820
|
try {
|
|
8272
9821
|
execSync4(`git -C "${worktreePath}" reset --hard HEAD`, { stdio: "ignore" });
|
|
8273
9822
|
execSync4(`git -C "${worktreePath}" clean -fd`, { stdio: "ignore" });
|
|
8274
|
-
} catch {
|
|
9823
|
+
} catch (err) {
|
|
9824
|
+
console.error(warn(`Failed to discard changes: ${err instanceof Error ? err.message : String(err)}`));
|
|
8275
9825
|
}
|
|
8276
9826
|
}
|
|
8277
9827
|
try {
|
|
8278
9828
|
removeGitWorktree(worktreePath);
|
|
8279
|
-
} catch {
|
|
9829
|
+
} catch (err) {
|
|
9830
|
+
console.error(dim(`git worktree remove failed: ${err instanceof Error ? err.message : String(err)}`));
|
|
8280
9831
|
}
|
|
8281
9832
|
pruneWorktrees();
|
|
8282
9833
|
const store = loadStore();
|
|
@@ -8373,7 +9924,8 @@ function precloseCommand(force) {
|
|
|
8373
9924
|
execSync6("git clean -ffd", { stdio: "ignore" });
|
|
8374
9925
|
execSync6("git submodule foreach --recursive 'git reset --hard HEAD; git clean -ffd'", { stdio: "ignore" });
|
|
8375
9926
|
execSync6("git submodule update --init --recursive --force", { stdio: "ignore" });
|
|
8376
|
-
} catch {
|
|
9927
|
+
} catch (err) {
|
|
9928
|
+
console.error(`Warning: failed to discard changes: ${err instanceof Error ? err.message : String(err)}`);
|
|
8377
9929
|
}
|
|
8378
9930
|
process.exit(0);
|
|
8379
9931
|
}
|
|
@@ -8445,7 +9997,7 @@ function promptChoice() {
|
|
|
8445
9997
|
}
|
|
8446
9998
|
|
|
8447
9999
|
// index.ts
|
|
8448
|
-
var VERSION = "0.
|
|
10000
|
+
var VERSION = "0.5.1";
|
|
8449
10001
|
function printHelp() {
|
|
8450
10002
|
const dim2 = import_picocolors4.default.dim;
|
|
8451
10003
|
const cyan2 = import_picocolors4.default.cyan;
|