@optique/core 1.0.0-dev.1533 → 1.0.0-dev.1536

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/dist/parser.cjs CHANGED
@@ -52,7 +52,7 @@ function parseSync(parser, args, options) {
52
52
  };
53
53
  const previousBuffer = context.buffer;
54
54
  context = result.next;
55
- if (context.buffer.length > 0 && context.buffer.length === previousBuffer.length && context.buffer.every((item, i) => item === previousBuffer[i])) return {
55
+ if (isBufferUnchanged(previousBuffer, context.buffer)) return {
56
56
  success: false,
57
57
  error: require_message.message`Unexpected option or argument: ${context.buffer[0]}.`
58
58
  };
@@ -69,6 +69,13 @@ function parseSync(parser, args, options) {
69
69
  };
70
70
  }
71
71
  /**
72
+ * Returns `true` when the buffer has not changed between iterations,
73
+ * indicating a parser is stalling without consuming input.
74
+ */
75
+ function isBufferUnchanged(previous, current) {
76
+ return current.length > 0 && current.length === previous.length && current.every((item, i) => item === previous[i]);
77
+ }
78
+ /**
72
79
  * Parses an array of command-line arguments using the provided combined parser.
73
80
  * This function processes the input arguments, applying the parser to each
74
81
  * argument until all arguments are consumed or an error occurs.
@@ -104,7 +111,7 @@ async function parseAsync(parser, args, options) {
104
111
  };
105
112
  const previousBuffer = context.buffer;
106
113
  context = result.next;
107
- if (context.buffer.length > 0 && context.buffer.length === previousBuffer.length && context.buffer.every((item, i) => item === previousBuffer[i])) return {
114
+ if (isBufferUnchanged(previousBuffer, context.buffer)) return {
108
115
  success: false,
109
116
  error: require_message.message`Unexpected option or argument: ${context.buffer[0]}.`
110
117
  };
@@ -196,7 +203,7 @@ function suggestSync(parser, args, options) {
196
203
  if (!result.success) return Array.from(parser.suggest(context, prefix));
197
204
  const previousBuffer = context.buffer;
198
205
  context = result.next;
199
- if (context.buffer.length > 0 && context.buffer.length === previousBuffer.length && context.buffer.every((item, i) => item === previousBuffer[i])) return [];
206
+ if (isBufferUnchanged(previousBuffer, context.buffer)) return [];
200
207
  }
201
208
  return Array.from(parser.suggest(context, prefix));
202
209
  }
@@ -239,7 +246,7 @@ async function suggestAsync(parser, args, options) {
239
246
  }
240
247
  const previousBuffer = context.buffer;
241
248
  context = result.next;
242
- if (context.buffer.length > 0 && context.buffer.length === previousBuffer.length && context.buffer.every((item, i) => item === previousBuffer[i])) return [];
249
+ if (isBufferUnchanged(previousBuffer, context.buffer)) return [];
243
250
  }
244
251
  const suggestions = [];
245
252
  for await (const suggestion of parser.suggest(context, prefix)) suggestions.push(suggestion);
@@ -359,7 +366,9 @@ function getDocPageSyncImpl(parser, args, options) {
359
366
  while (context.buffer.length > 0) {
360
367
  const result = parser.parse(context);
361
368
  if (!result.success) break;
369
+ const previousBuffer = context.buffer;
362
370
  context = result.next;
371
+ if (isBufferUnchanged(previousBuffer, context.buffer)) break;
363
372
  }
364
373
  return buildDocPage(parser, context, args);
365
374
  }
@@ -377,7 +386,9 @@ async function getDocPageAsyncImpl(parser, args, options) {
377
386
  while (context.buffer.length > 0) {
378
387
  const result = await parser.parse(context);
379
388
  if (!result.success) break;
389
+ const previousBuffer = context.buffer;
380
390
  context = result.next;
391
+ if (isBufferUnchanged(previousBuffer, context.buffer)) break;
381
392
  }
382
393
  return buildDocPage(parser, context, args);
383
394
  }
package/dist/parser.js CHANGED
@@ -52,7 +52,7 @@ function parseSync(parser, args, options) {
52
52
  };
53
53
  const previousBuffer = context.buffer;
54
54
  context = result.next;
55
- if (context.buffer.length > 0 && context.buffer.length === previousBuffer.length && context.buffer.every((item, i) => item === previousBuffer[i])) return {
55
+ if (isBufferUnchanged(previousBuffer, context.buffer)) return {
56
56
  success: false,
57
57
  error: message`Unexpected option or argument: ${context.buffer[0]}.`
58
58
  };
@@ -69,6 +69,13 @@ function parseSync(parser, args, options) {
69
69
  };
70
70
  }
71
71
  /**
72
+ * Returns `true` when the buffer has not changed between iterations,
73
+ * indicating a parser is stalling without consuming input.
74
+ */
75
+ function isBufferUnchanged(previous, current) {
76
+ return current.length > 0 && current.length === previous.length && current.every((item, i) => item === previous[i]);
77
+ }
78
+ /**
72
79
  * Parses an array of command-line arguments using the provided combined parser.
73
80
  * This function processes the input arguments, applying the parser to each
74
81
  * argument until all arguments are consumed or an error occurs.
@@ -104,7 +111,7 @@ async function parseAsync(parser, args, options) {
104
111
  };
105
112
  const previousBuffer = context.buffer;
106
113
  context = result.next;
107
- if (context.buffer.length > 0 && context.buffer.length === previousBuffer.length && context.buffer.every((item, i) => item === previousBuffer[i])) return {
114
+ if (isBufferUnchanged(previousBuffer, context.buffer)) return {
108
115
  success: false,
109
116
  error: message`Unexpected option or argument: ${context.buffer[0]}.`
110
117
  };
@@ -196,7 +203,7 @@ function suggestSync(parser, args, options) {
196
203
  if (!result.success) return Array.from(parser.suggest(context, prefix));
197
204
  const previousBuffer = context.buffer;
198
205
  context = result.next;
199
- if (context.buffer.length > 0 && context.buffer.length === previousBuffer.length && context.buffer.every((item, i) => item === previousBuffer[i])) return [];
206
+ if (isBufferUnchanged(previousBuffer, context.buffer)) return [];
200
207
  }
201
208
  return Array.from(parser.suggest(context, prefix));
202
209
  }
@@ -239,7 +246,7 @@ async function suggestAsync(parser, args, options) {
239
246
  }
240
247
  const previousBuffer = context.buffer;
241
248
  context = result.next;
242
- if (context.buffer.length > 0 && context.buffer.length === previousBuffer.length && context.buffer.every((item, i) => item === previousBuffer[i])) return [];
249
+ if (isBufferUnchanged(previousBuffer, context.buffer)) return [];
243
250
  }
244
251
  const suggestions = [];
245
252
  for await (const suggestion of parser.suggest(context, prefix)) suggestions.push(suggestion);
@@ -359,7 +366,9 @@ function getDocPageSyncImpl(parser, args, options) {
359
366
  while (context.buffer.length > 0) {
360
367
  const result = parser.parse(context);
361
368
  if (!result.success) break;
369
+ const previousBuffer = context.buffer;
362
370
  context = result.next;
371
+ if (isBufferUnchanged(previousBuffer, context.buffer)) break;
363
372
  }
364
373
  return buildDocPage(parser, context, args);
365
374
  }
@@ -377,7 +386,9 @@ async function getDocPageAsyncImpl(parser, args, options) {
377
386
  while (context.buffer.length > 0) {
378
387
  const result = await parser.parse(context);
379
388
  if (!result.success) break;
389
+ const previousBuffer = context.buffer;
380
390
  context = result.next;
391
+ if (isBufferUnchanged(previousBuffer, context.buffer)) break;
381
392
  }
382
393
  return buildDocPage(parser, context, args);
383
394
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@optique/core",
3
- "version": "1.0.0-dev.1533+25e020de",
3
+ "version": "1.0.0-dev.1536+1f9feab6",
4
4
  "description": "Type-safe combinatorial command-line interface parser",
5
5
  "keywords": [
6
6
  "CLI",