@qodalis/cli-stopwatch 2.0.0-beta.8 → 2.0.0-rc.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qodalis/cli-stopwatch",
3
- "version": "2.0.0-beta.8",
3
+ "version": "2.0.0-rc.1",
4
4
  "description": "Interactive stopwatch and countdown timer",
5
5
  "author": "Qodalis Solutions",
6
6
  "license": "MIT",
@@ -18,7 +18,7 @@
18
18
  "umd": "./umd/index.global.js",
19
19
  "unpkg": "./umd/index.global.js",
20
20
  "dependencies": {
21
- "@qodalis/cli-core": "2.0.0-beta.8"
21
+ "@qodalis/cli-core": "2.0.0-rc.1"
22
22
  },
23
23
  "sideEffects": false,
24
24
  "main": "./public-api.js",
package/public-api.d.mts CHANGED
@@ -1,11 +1,10 @@
1
- import * as _qodalis_cli_core from '@qodalis/cli-core';
2
1
  import { ICliCommandProcessor, CliProcessCommand, ICliExecutionContext, ICliModule } from '@qodalis/cli-core';
3
2
 
4
3
  declare class CliStopwatchCommandProcessor implements ICliCommandProcessor {
5
4
  command: string;
6
5
  description: string;
7
6
  aliases: string[];
8
- author: _qodalis_cli_core.ICliCommandAuthor;
7
+ author: any;
9
8
  version: string;
10
9
  processors: ICliCommandProcessor[];
11
10
  private startTime;
@@ -40,7 +39,7 @@ declare function parseDuration(input: string): number | null;
40
39
  */
41
40
  declare function formatDuration(ms: number): string;
42
41
 
43
- declare const LIBRARY_VERSION = "2.0.0-beta.8";
42
+ declare const LIBRARY_VERSION = "2.0.0-rc.1";
44
43
  declare const API_VERSION = 2;
45
44
 
46
45
  declare const stopwatchModule: ICliModule;
package/public-api.d.ts CHANGED
@@ -1,11 +1,10 @@
1
- import * as _qodalis_cli_core from '@qodalis/cli-core';
2
1
  import { ICliCommandProcessor, CliProcessCommand, ICliExecutionContext, ICliModule } from '@qodalis/cli-core';
3
2
 
4
3
  declare class CliStopwatchCommandProcessor implements ICliCommandProcessor {
5
4
  command: string;
6
5
  description: string;
7
6
  aliases: string[];
8
- author: _qodalis_cli_core.ICliCommandAuthor;
7
+ author: any;
9
8
  version: string;
10
9
  processors: ICliCommandProcessor[];
11
10
  private startTime;
@@ -40,7 +39,7 @@ declare function parseDuration(input: string): number | null;
40
39
  */
41
40
  declare function formatDuration(ms: number): string;
42
41
 
43
- declare const LIBRARY_VERSION = "2.0.0-beta.8";
42
+ declare const LIBRARY_VERSION = "2.0.0-rc.1";
44
43
  declare const API_VERSION = 2;
45
44
 
46
45
  declare const stopwatchModule: ICliModule;
package/public-api.js CHANGED
@@ -5,7 +5,7 @@ var cliCore = require('@qodalis/cli-core');
5
5
  // src/lib/processors/cli-stopwatch-command-processor.ts
6
6
 
7
7
  // src/lib/version.ts
8
- var LIBRARY_VERSION = "2.0.0-beta.8";
8
+ var LIBRARY_VERSION = "2.0.0-rc.1";
9
9
  var API_VERSION = 2;
10
10
 
11
11
  // src/lib/stopwatch-utils.ts
@@ -75,7 +75,7 @@ var CliStopwatchTimerCommandProcessor = class {
75
75
  this.context = null;
76
76
  }
77
77
  async processCommand(command, context) {
78
- const input = (command.value ?? "").trim();
78
+ const input = cliCore.joinShellWords(command.value ?? "");
79
79
  const durationMs = parseDuration(input);
80
80
  if (!durationMs) {
81
81
  context.writer.writeError(
package/public-api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../packages/plugins/stopwatch/src/lib/version.ts","../../packages/plugins/stopwatch/src/lib/stopwatch-utils.ts","../../packages/plugins/stopwatch/src/lib/processors/cli-stopwatch-command-processor.ts","../../packages/plugins/stopwatch/src/public-api.ts"],"names":["DefaultLibraryAuthor"],"mappings":"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","file":"public-api.js","sourcesContent":["\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-beta.8';\nexport const API_VERSION = 2;\n ","const MIN_INTERVAL_MS = 10_000; // 10 seconds minimum\n\n/**\n * Parse duration string: 30s, 5m, 1h, 2h30m, etc.\n * Returns null for invalid or too-short durations.\n */\nexport function parseDuration(input: string): number | null {\n if (!input.trim()) return null;\n // Plain number = seconds\n if (/^\\d+$/.test(input.trim())) {\n const ms = parseInt(input.trim(), 10) * 1000;\n return ms >= MIN_INTERVAL_MS ? ms : null;\n }\n const pattern = /^(?:(\\d+)h)?(?:(\\d+)m)?(?:(\\d+)s)?$/;\n const match = input.trim().match(pattern);\n if (!match || !match[0] || match[0] === '') return null;\n const h = parseInt(match[1] ?? '0', 10);\n const m = parseInt(match[2] ?? '0', 10);\n const s = parseInt(match[3] ?? '0', 10);\n const total = h * 3_600_000 + m * 60_000 + s * 1_000;\n return total >= MIN_INTERVAL_MS ? total : null;\n}\n\n/**\n * Format milliseconds as HH:MM:SS.mmm\n */\nexport function formatDuration(ms: number): string {\n const h = Math.floor(ms / 3_600_000);\n const m = Math.floor((ms % 3_600_000) / 60_000);\n const s = Math.floor((ms % 60_000) / 1_000);\n const millis = ms % 1_000;\n return [\n String(h).padStart(2, '0'),\n String(m).padStart(2, '0'),\n String(s).padStart(2, '0'),\n ].join(':') + '.' + String(millis).padStart(3, '0');\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\nimport { formatDuration, parseDuration } from '../stopwatch-utils';\n\n// -- ANSI helpers -----------------------------------------------------------\n\nconst ESC = '\\x1b';\nconst CSI = `${ESC}[`;\n\nconst ansi = {\n clearScreen: `${CSI}2J`,\n cursorHome: `${CSI}H`,\n hideCursor: `${CSI}?25l`,\n showCursor: `${CSI}?25h`,\n cursorTo: (row: number, col: number) => `${CSI}${row};${col}H`,\n bold: `${CSI}1m`,\n dim: `${CSI}2m`,\n reset: `${CSI}0m`,\n fg: {\n white: `${CSI}97m`,\n cyan: `${CSI}36m`,\n yellow: `${CSI}93m`,\n green: `${CSI}32m`,\n red: `${CSI}91m`,\n gray: `${CSI}90m`,\n brightGreen: `${CSI}92m`,\n brightCyan: `${CSI}96m`,\n },\n};\n\n// -- Timer sub-processor ----------------------------------------------------\n\nclass CliStopwatchTimerCommandProcessor implements ICliCommandProcessor {\n command = 'timer';\n description = 'Run a countdown timer (e.g. timer 5m, timer 1h30m, timer 90s)';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n\n private intervalId: ReturnType<typeof setInterval> | null = null;\n private remaining = 0;\n private total = 0;\n private running = false;\n private done = false;\n private context: ICliExecutionContext | null = null;\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const input = (command.value ?? '').trim();\n const durationMs = parseDuration(input);\n\n if (!durationMs) {\n context.writer.writeError(\n input\n ? `Invalid or too-short duration \"${input}\". Use formats like 30s, 5m, 1h, 2h30m (minimum 10s).`\n : 'Usage: stopwatch timer <duration> (e.g. timer 5m)',\n );\n return;\n }\n\n this.total = durationMs;\n this.remaining = durationMs;\n this.running = true;\n this.done = false;\n this.context = context;\n\n context.enterFullScreenMode(this);\n this.render(context);\n\n this.intervalId = setInterval(() => {\n if (!this.running) return;\n this.remaining = Math.max(0, this.remaining - 100);\n this.render(context);\n\n if (this.remaining === 0) {\n this.finishTimer(context);\n }\n }, 100);\n }\n\n async onData(data: string, context: ICliExecutionContext): Promise<void> {\n if (this.done) {\n // Any key exits\n this.exit(context);\n return;\n }\n\n switch (data) {\n case ' ':\n case 'p':\n case 'P':\n this.running = !this.running;\n this.render(context);\n break;\n case 'r':\n case 'R':\n this.remaining = this.total;\n this.running = false;\n this.render(context);\n break;\n // L=lap not applicable to countdown timer\n case 'q':\n case 'Q':\n case '\\x03': // Ctrl+C\n this.exit(context);\n break;\n }\n }\n\n onDispose(_context: ICliExecutionContext): void {\n this.clearInterval();\n }\n\n onResize(\n _cols: number,\n _rows: number,\n context: ICliExecutionContext,\n ): void {\n this.render(context);\n }\n\n private finishTimer(context: ICliExecutionContext): void {\n this.clearInterval();\n this.running = false;\n this.done = true;\n this.renderDone(context);\n }\n\n private exit(context: ICliExecutionContext): void {\n this.clearInterval();\n this.running = false;\n context.exitFullScreenMode();\n if (this.done) {\n context.writer.writeSuccess('Timer complete!');\n } else {\n const elapsed = this.total - this.remaining;\n context.writer.writeln(\n `Timer stopped. Elapsed: ${formatDuration(elapsed)} / ${formatDuration(this.total)}`,\n );\n }\n this.context = null;\n }\n\n private clearInterval(): void {\n if (this.intervalId !== null) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n }\n\n private render(context: ICliExecutionContext): void {\n const cols = context.terminal.cols;\n const rows = context.terminal.rows;\n const centerRow = Math.floor(rows / 2);\n const buf: string[] = [];\n\n buf.push(ansi.clearScreen, ansi.cursorHome, ansi.hideCursor);\n\n // Title\n const title = ' COUNTDOWN TIMER ';\n const titleCol = Math.max(1, Math.floor((cols - title.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow - 4, titleCol));\n buf.push(ansi.fg.cyan, ansi.bold, title, ansi.reset);\n\n // Time display\n const timeStr = formatDuration(this.remaining);\n const timeCol = Math.max(1, Math.floor((cols - timeStr.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow - 2, timeCol));\n buf.push(ansi.bold, ansi.fg.yellow, timeStr, ansi.reset);\n\n // Progress bar\n const barWidth = Math.min(50, cols - 6);\n const fraction = this.total > 0 ? (this.total - this.remaining) / this.total : 0;\n const filled = Math.round(fraction * barWidth);\n const empty = barWidth - filled;\n const barCol = Math.max(1, Math.floor((cols - barWidth - 2) / 2) + 1);\n\n buf.push(ansi.cursorTo(centerRow, barCol));\n buf.push(ansi.fg.gray, '[', ansi.reset);\n if (filled > 0) {\n buf.push(ansi.fg.brightGreen, '='.repeat(filled), ansi.reset);\n }\n if (empty > 0) {\n buf.push(ansi.fg.gray, ' '.repeat(empty), ansi.reset);\n }\n buf.push(ansi.fg.gray, ']', ansi.reset);\n\n // Percentage\n const pct = Math.round(fraction * 100);\n const pctStr = `${pct}%`;\n const pctCol = Math.max(1, Math.floor((cols - pctStr.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow + 1, pctCol));\n buf.push(ansi.fg.gray, pctStr, ansi.reset);\n\n // Status / paused indicator\n buf.push(ansi.cursorTo(centerRow + 2, Math.max(1, Math.floor((cols - 8) / 2) + 1)));\n if (!this.running) {\n buf.push(ansi.fg.yellow, ' PAUSED ', ansi.reset);\n } else {\n buf.push(' ');\n }\n\n // Controls hint\n const hint = '[Space/P] Pause [R] Reset [Q] Quit';\n const hintCol = Math.max(1, Math.floor((cols - hint.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow + 4, hintCol));\n buf.push(ansi.dim, hint, ansi.reset);\n\n context.terminal.write(buf.join(''));\n }\n\n private renderDone(context: ICliExecutionContext): void {\n const cols = context.terminal.cols;\n const rows = context.terminal.rows;\n const centerRow = Math.floor(rows / 2);\n const buf: string[] = [];\n\n buf.push(ansi.clearScreen, ansi.cursorHome, ansi.hideCursor);\n\n const msg1 = 'Timer complete!';\n const msg2 = formatDuration(this.total);\n const msg3 = 'Press any key to exit';\n\n buf.push(ansi.cursorTo(centerRow - 2, Math.max(1, Math.floor((cols - msg1.length) / 2) + 1)));\n buf.push(ansi.fg.brightGreen, ansi.bold, msg1, ansi.reset);\n\n buf.push(ansi.cursorTo(centerRow, Math.max(1, Math.floor((cols - msg2.length) / 2) + 1)));\n buf.push(ansi.fg.cyan, msg2, ansi.reset);\n\n buf.push(ansi.cursorTo(centerRow + 2, Math.max(1, Math.floor((cols - msg3.length) / 2) + 1)));\n buf.push(ansi.dim, msg3, ansi.reset);\n\n context.terminal.write(buf.join(''));\n }\n}\n\n// -- Stopwatch processor ----------------------------------------------------\n\nexport class CliStopwatchCommandProcessor implements ICliCommandProcessor {\n command = 'stopwatch';\n\n description = 'Interactive stopwatch and countdown timer';\n\n aliases = ['sw'];\n\n author = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n processors: ICliCommandProcessor[] = [\n new CliStopwatchTimerCommandProcessor(),\n ];\n\n // Stopwatch state\n private startTime = 0;\n private elapsed = 0;\n private running = false;\n private laps: number[] = [];\n private intervalId: ReturnType<typeof setInterval> | null = null;\n private context: ICliExecutionContext | null = null;\n\n async processCommand(\n _command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n this.reset();\n this.context = context;\n context.enterFullScreenMode(this);\n this.startTicking(context);\n this.render(context);\n }\n\n async onData(data: string, context: ICliExecutionContext): Promise<void> {\n switch (data) {\n case ' ':\n case 'p':\n case 'P':\n this.togglePause(context);\n break;\n case 'l':\n case 'L':\n this.recordLap(context);\n break;\n case 'r':\n case 'R':\n this.resetAndRestart(context);\n break;\n case 'q':\n case 'Q':\n case '\\x03': // Ctrl+C\n this.exit(context);\n break;\n }\n }\n\n onResize(\n _cols: number,\n _rows: number,\n context: ICliExecutionContext,\n ): void {\n this.render(context);\n }\n\n onDispose(_context: ICliExecutionContext): void {\n this.clearInterval();\n }\n\n writeDescription(context: ICliExecutionContext): void {\n const { writer } = context;\n writer.writeln(this.description!);\n writer.writeln();\n writer.writeln('Usage:');\n writer.writeln(' stopwatch Start interactive stopwatch');\n writer.writeln(' stopwatch timer <duration> Run countdown timer');\n writer.writeln();\n writer.writeln('Duration formats: 30s, 5m, 1h, 2h30m, 1h30m45s');\n writer.writeln();\n writer.writeln('Stopwatch controls:');\n writer.writeln(' [Space/P] Pause / resume');\n writer.writeln(' [L] Record lap');\n writer.writeln(' [R] Reset');\n writer.writeln(' [Q/Ctrl+C] Quit');\n }\n\n // -- Internal helpers ---------------------------------------------------\n\n private reset(): void {\n this.clearInterval();\n this.startTime = Date.now();\n this.elapsed = 0;\n this.running = true;\n this.laps = [];\n }\n\n private resetAndRestart(context: ICliExecutionContext): void {\n this.reset();\n this.startTicking(context);\n this.render(context);\n }\n\n private togglePause(context: ICliExecutionContext): void {\n if (this.running) {\n // Capture elapsed before pausing\n this.elapsed += Date.now() - this.startTime;\n this.running = false;\n this.clearInterval();\n } else {\n this.startTime = Date.now();\n this.running = true;\n this.startTicking(context);\n }\n this.render(context);\n }\n\n private recordLap(context: ICliExecutionContext): void {\n const current = this.currentElapsed();\n this.laps.push(current);\n this.render(context);\n }\n\n private exit(context: ICliExecutionContext): void {\n this.clearInterval();\n const finalTime = this.currentElapsed();\n context.exitFullScreenMode();\n context.writer.writeln(`Final time: ${formatDuration(finalTime)}`);\n if (this.laps.length > 0) {\n context.writer.writeln('Laps:');\n this.laps.forEach((lap, i) => {\n context.writer.writeln(` Lap ${i + 1}: ${formatDuration(lap)}`);\n });\n }\n this.context = null;\n }\n\n private startTicking(context: ICliExecutionContext): void {\n this.clearInterval();\n this.intervalId = setInterval(() => {\n this.render(context);\n }, 100);\n }\n\n private clearInterval(): void {\n if (this.intervalId !== null) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n }\n\n private currentElapsed(): number {\n if (this.running) {\n return this.elapsed + (Date.now() - this.startTime);\n }\n return this.elapsed;\n }\n\n // -- Rendering ----------------------------------------------------------\n\n private render(context: ICliExecutionContext): void {\n const cols = context.terminal.cols;\n const rows = context.terminal.rows;\n const centerRow = Math.floor(rows / 2);\n const buf: string[] = [];\n\n buf.push(ansi.clearScreen, ansi.cursorHome, ansi.hideCursor);\n\n // Title\n const title = ' STOPWATCH ';\n const titleCol = Math.max(1, Math.floor((cols - title.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow - 4, titleCol));\n buf.push(ansi.fg.cyan, ansi.bold, title, ansi.reset);\n\n // Main time display\n const timeStr = formatDuration(this.currentElapsed());\n const timeCol = Math.max(1, Math.floor((cols - timeStr.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow - 2, timeCol));\n buf.push(ansi.bold, ansi.fg.yellow, timeStr, ansi.reset);\n\n // Status line\n const statusStr = this.running ? ' RUNNING ' : ' PAUSED ';\n const statusColor = this.running ? ansi.fg.brightGreen : ansi.fg.yellow;\n const statusCol = Math.max(1, Math.floor((cols - statusStr.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow, statusCol));\n buf.push(statusColor, statusStr, ansi.reset);\n\n // Controls hint\n const hint = '[Space/P] Pause [L] Lap [R] Reset [Q/Ctrl+C] Quit';\n const hintCol = Math.max(1, Math.floor((cols - hint.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow + 2, hintCol));\n buf.push(ansi.dim, hint, ansi.reset);\n\n // Laps (show last 5)\n if (this.laps.length > 0) {\n const lapsToShow = this.laps.slice(-5);\n const startIndex = this.laps.length - lapsToShow.length;\n lapsToShow.forEach((lap, i) => {\n const lapIndex = startIndex + i + 1;\n const lapStr = `Lap ${lapIndex}: ${formatDuration(lap)}`;\n const lapCol = Math.max(1, Math.floor((cols - lapStr.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow + 4 + i, lapCol));\n buf.push(ansi.fg.gray, lapStr, ansi.reset);\n });\n }\n\n context.terminal.write(buf.join(''));\n }\n}\n","/*\n * Public API Surface of stopwatch\n */\n\nexport * from './lib/processors/cli-stopwatch-command-processor';\nexport * from './lib/stopwatch-utils';\nexport * from './lib/version';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliStopwatchCommandProcessor } from './lib/processors/cli-stopwatch-command-processor';\nimport { API_VERSION } from './lib/version';\n\nexport const stopwatchModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-stopwatch',\n processors: [new CliStopwatchCommandProcessor()],\n translations: {\n es: { 'cli.stopwatch.description': 'Cronómetro interactivo y temporizador' },\n fr: { 'cli.stopwatch.description': 'Chronomètre interactif et minuteur' },\n de: { 'cli.stopwatch.description': 'Interaktive Stoppuhr und Countdown-Timer' },\n pt: { 'cli.stopwatch.description': 'Cronômetro interativo e temporizador' },\n it: { 'cli.stopwatch.description': 'Cronometro interattivo e timer' },\n ja: { 'cli.stopwatch.description': 'インタラクティブなストップウォッチとタイマー' },\n ko: { 'cli.stopwatch.description': '대화형 스톱워치 및 타이머' },\n zh: { 'cli.stopwatch.description': '交互式秒表和倒计时器' },\n ru: { 'cli.stopwatch.description': 'Интерактивный секундомер и таймер обратного отсчёта' },\n ro: { 'cli.stopwatch.description': 'Cronometru interactiv și numărătoare inversă' },\n },\n};\n"]}
1
+ {"version":3,"sources":["../../packages/plugins/stopwatch/src/lib/version.ts","../../packages/plugins/stopwatch/src/lib/stopwatch-utils.ts","../../packages/plugins/stopwatch/src/lib/processors/cli-stopwatch-command-processor.ts","../../packages/plugins/stopwatch/src/public-api.ts"],"names":["DefaultLibraryAuthor","joinShellWords"],"mappings":"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","file":"public-api.js","sourcesContent":["\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-rc.1';\nexport const API_VERSION = 2;\n ","const MIN_INTERVAL_MS = 10_000; // 10 seconds minimum\n\n/**\n * Parse duration string: 30s, 5m, 1h, 2h30m, etc.\n * Returns null for invalid or too-short durations.\n */\nexport function parseDuration(input: string): number | null {\n if (!input.trim()) return null;\n // Plain number = seconds\n if (/^\\d+$/.test(input.trim())) {\n const ms = parseInt(input.trim(), 10) * 1000;\n return ms >= MIN_INTERVAL_MS ? ms : null;\n }\n const pattern = /^(?:(\\d+)h)?(?:(\\d+)m)?(?:(\\d+)s)?$/;\n const match = input.trim().match(pattern);\n if (!match || !match[0] || match[0] === '') return null;\n const h = parseInt(match[1] ?? '0', 10);\n const m = parseInt(match[2] ?? '0', 10);\n const s = parseInt(match[3] ?? '0', 10);\n const total = h * 3_600_000 + m * 60_000 + s * 1_000;\n return total >= MIN_INTERVAL_MS ? total : null;\n}\n\n/**\n * Format milliseconds as HH:MM:SS.mmm\n */\nexport function formatDuration(ms: number): string {\n const h = Math.floor(ms / 3_600_000);\n const m = Math.floor((ms % 3_600_000) / 60_000);\n const s = Math.floor((ms % 60_000) / 1_000);\n const millis = ms % 1_000;\n return [\n String(h).padStart(2, '0'),\n String(m).padStart(2, '0'),\n String(s).padStart(2, '0'),\n ].join(':') + '.' + String(millis).padStart(3, '0');\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n joinShellWords,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\nimport { formatDuration, parseDuration } from '../stopwatch-utils';\n\n// -- ANSI helpers -----------------------------------------------------------\n\nconst ESC = '\\x1b';\nconst CSI = `${ESC}[`;\n\nconst ansi = {\n clearScreen: `${CSI}2J`,\n cursorHome: `${CSI}H`,\n hideCursor: `${CSI}?25l`,\n showCursor: `${CSI}?25h`,\n cursorTo: (row: number, col: number) => `${CSI}${row};${col}H`,\n bold: `${CSI}1m`,\n dim: `${CSI}2m`,\n reset: `${CSI}0m`,\n fg: {\n white: `${CSI}97m`,\n cyan: `${CSI}36m`,\n yellow: `${CSI}93m`,\n green: `${CSI}32m`,\n red: `${CSI}91m`,\n gray: `${CSI}90m`,\n brightGreen: `${CSI}92m`,\n brightCyan: `${CSI}96m`,\n },\n};\n\n// -- Timer sub-processor ----------------------------------------------------\n\nclass CliStopwatchTimerCommandProcessor implements ICliCommandProcessor {\n command = 'timer';\n description = 'Run a countdown timer (e.g. timer 5m, timer 1h30m, timer 90s)';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n\n private intervalId: ReturnType<typeof setInterval> | null = null;\n private remaining = 0;\n private total = 0;\n private running = false;\n private done = false;\n private context: ICliExecutionContext | null = null;\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const input = joinShellWords(command.value ?? '');\n const durationMs = parseDuration(input);\n\n if (!durationMs) {\n context.writer.writeError(\n input\n ? `Invalid or too-short duration \"${input}\". Use formats like 30s, 5m, 1h, 2h30m (minimum 10s).`\n : 'Usage: stopwatch timer <duration> (e.g. timer 5m)',\n );\n return;\n }\n\n this.total = durationMs;\n this.remaining = durationMs;\n this.running = true;\n this.done = false;\n this.context = context;\n\n context.enterFullScreenMode(this);\n this.render(context);\n\n this.intervalId = setInterval(() => {\n if (!this.running) return;\n this.remaining = Math.max(0, this.remaining - 100);\n this.render(context);\n\n if (this.remaining === 0) {\n this.finishTimer(context);\n }\n }, 100);\n }\n\n async onData(data: string, context: ICliExecutionContext): Promise<void> {\n if (this.done) {\n // Any key exits\n this.exit(context);\n return;\n }\n\n switch (data) {\n case ' ':\n case 'p':\n case 'P':\n this.running = !this.running;\n this.render(context);\n break;\n case 'r':\n case 'R':\n this.remaining = this.total;\n this.running = false;\n this.render(context);\n break;\n // L=lap not applicable to countdown timer\n case 'q':\n case 'Q':\n case '\\x03': // Ctrl+C\n this.exit(context);\n break;\n }\n }\n\n onDispose(_context: ICliExecutionContext): void {\n this.clearInterval();\n }\n\n onResize(\n _cols: number,\n _rows: number,\n context: ICliExecutionContext,\n ): void {\n this.render(context);\n }\n\n private finishTimer(context: ICliExecutionContext): void {\n this.clearInterval();\n this.running = false;\n this.done = true;\n this.renderDone(context);\n }\n\n private exit(context: ICliExecutionContext): void {\n this.clearInterval();\n this.running = false;\n context.exitFullScreenMode();\n if (this.done) {\n context.writer.writeSuccess('Timer complete!');\n } else {\n const elapsed = this.total - this.remaining;\n context.writer.writeln(\n `Timer stopped. Elapsed: ${formatDuration(elapsed)} / ${formatDuration(this.total)}`,\n );\n }\n this.context = null;\n }\n\n private clearInterval(): void {\n if (this.intervalId !== null) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n }\n\n private render(context: ICliExecutionContext): void {\n const cols = context.terminal.cols;\n const rows = context.terminal.rows;\n const centerRow = Math.floor(rows / 2);\n const buf: string[] = [];\n\n buf.push(ansi.clearScreen, ansi.cursorHome, ansi.hideCursor);\n\n // Title\n const title = ' COUNTDOWN TIMER ';\n const titleCol = Math.max(1, Math.floor((cols - title.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow - 4, titleCol));\n buf.push(ansi.fg.cyan, ansi.bold, title, ansi.reset);\n\n // Time display\n const timeStr = formatDuration(this.remaining);\n const timeCol = Math.max(1, Math.floor((cols - timeStr.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow - 2, timeCol));\n buf.push(ansi.bold, ansi.fg.yellow, timeStr, ansi.reset);\n\n // Progress bar\n const barWidth = Math.min(50, cols - 6);\n const fraction = this.total > 0 ? (this.total - this.remaining) / this.total : 0;\n const filled = Math.round(fraction * barWidth);\n const empty = barWidth - filled;\n const barCol = Math.max(1, Math.floor((cols - barWidth - 2) / 2) + 1);\n\n buf.push(ansi.cursorTo(centerRow, barCol));\n buf.push(ansi.fg.gray, '[', ansi.reset);\n if (filled > 0) {\n buf.push(ansi.fg.brightGreen, '='.repeat(filled), ansi.reset);\n }\n if (empty > 0) {\n buf.push(ansi.fg.gray, ' '.repeat(empty), ansi.reset);\n }\n buf.push(ansi.fg.gray, ']', ansi.reset);\n\n // Percentage\n const pct = Math.round(fraction * 100);\n const pctStr = `${pct}%`;\n const pctCol = Math.max(1, Math.floor((cols - pctStr.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow + 1, pctCol));\n buf.push(ansi.fg.gray, pctStr, ansi.reset);\n\n // Status / paused indicator\n buf.push(ansi.cursorTo(centerRow + 2, Math.max(1, Math.floor((cols - 8) / 2) + 1)));\n if (!this.running) {\n buf.push(ansi.fg.yellow, ' PAUSED ', ansi.reset);\n } else {\n buf.push(' ');\n }\n\n // Controls hint\n const hint = '[Space/P] Pause [R] Reset [Q] Quit';\n const hintCol = Math.max(1, Math.floor((cols - hint.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow + 4, hintCol));\n buf.push(ansi.dim, hint, ansi.reset);\n\n context.terminal.write(buf.join(''));\n }\n\n private renderDone(context: ICliExecutionContext): void {\n const cols = context.terminal.cols;\n const rows = context.terminal.rows;\n const centerRow = Math.floor(rows / 2);\n const buf: string[] = [];\n\n buf.push(ansi.clearScreen, ansi.cursorHome, ansi.hideCursor);\n\n const msg1 = 'Timer complete!';\n const msg2 = formatDuration(this.total);\n const msg3 = 'Press any key to exit';\n\n buf.push(ansi.cursorTo(centerRow - 2, Math.max(1, Math.floor((cols - msg1.length) / 2) + 1)));\n buf.push(ansi.fg.brightGreen, ansi.bold, msg1, ansi.reset);\n\n buf.push(ansi.cursorTo(centerRow, Math.max(1, Math.floor((cols - msg2.length) / 2) + 1)));\n buf.push(ansi.fg.cyan, msg2, ansi.reset);\n\n buf.push(ansi.cursorTo(centerRow + 2, Math.max(1, Math.floor((cols - msg3.length) / 2) + 1)));\n buf.push(ansi.dim, msg3, ansi.reset);\n\n context.terminal.write(buf.join(''));\n }\n}\n\n// -- Stopwatch processor ----------------------------------------------------\n\nexport class CliStopwatchCommandProcessor implements ICliCommandProcessor {\n command = 'stopwatch';\n\n description = 'Interactive stopwatch and countdown timer';\n\n aliases = ['sw'];\n\n author = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n processors: ICliCommandProcessor[] = [\n new CliStopwatchTimerCommandProcessor(),\n ];\n\n // Stopwatch state\n private startTime = 0;\n private elapsed = 0;\n private running = false;\n private laps: number[] = [];\n private intervalId: ReturnType<typeof setInterval> | null = null;\n private context: ICliExecutionContext | null = null;\n\n async processCommand(\n _command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n this.reset();\n this.context = context;\n context.enterFullScreenMode(this);\n this.startTicking(context);\n this.render(context);\n }\n\n async onData(data: string, context: ICliExecutionContext): Promise<void> {\n switch (data) {\n case ' ':\n case 'p':\n case 'P':\n this.togglePause(context);\n break;\n case 'l':\n case 'L':\n this.recordLap(context);\n break;\n case 'r':\n case 'R':\n this.resetAndRestart(context);\n break;\n case 'q':\n case 'Q':\n case '\\x03': // Ctrl+C\n this.exit(context);\n break;\n }\n }\n\n onResize(\n _cols: number,\n _rows: number,\n context: ICliExecutionContext,\n ): void {\n this.render(context);\n }\n\n onDispose(_context: ICliExecutionContext): void {\n this.clearInterval();\n }\n\n writeDescription(context: ICliExecutionContext): void {\n const { writer } = context;\n writer.writeln(this.description!);\n writer.writeln();\n writer.writeln('Usage:');\n writer.writeln(' stopwatch Start interactive stopwatch');\n writer.writeln(' stopwatch timer <duration> Run countdown timer');\n writer.writeln();\n writer.writeln('Duration formats: 30s, 5m, 1h, 2h30m, 1h30m45s');\n writer.writeln();\n writer.writeln('Stopwatch controls:');\n writer.writeln(' [Space/P] Pause / resume');\n writer.writeln(' [L] Record lap');\n writer.writeln(' [R] Reset');\n writer.writeln(' [Q/Ctrl+C] Quit');\n }\n\n // -- Internal helpers ---------------------------------------------------\n\n private reset(): void {\n this.clearInterval();\n this.startTime = Date.now();\n this.elapsed = 0;\n this.running = true;\n this.laps = [];\n }\n\n private resetAndRestart(context: ICliExecutionContext): void {\n this.reset();\n this.startTicking(context);\n this.render(context);\n }\n\n private togglePause(context: ICliExecutionContext): void {\n if (this.running) {\n // Capture elapsed before pausing\n this.elapsed += Date.now() - this.startTime;\n this.running = false;\n this.clearInterval();\n } else {\n this.startTime = Date.now();\n this.running = true;\n this.startTicking(context);\n }\n this.render(context);\n }\n\n private recordLap(context: ICliExecutionContext): void {\n const current = this.currentElapsed();\n this.laps.push(current);\n this.render(context);\n }\n\n private exit(context: ICliExecutionContext): void {\n this.clearInterval();\n const finalTime = this.currentElapsed();\n context.exitFullScreenMode();\n context.writer.writeln(`Final time: ${formatDuration(finalTime)}`);\n if (this.laps.length > 0) {\n context.writer.writeln('Laps:');\n this.laps.forEach((lap, i) => {\n context.writer.writeln(` Lap ${i + 1}: ${formatDuration(lap)}`);\n });\n }\n this.context = null;\n }\n\n private startTicking(context: ICliExecutionContext): void {\n this.clearInterval();\n this.intervalId = setInterval(() => {\n this.render(context);\n }, 100);\n }\n\n private clearInterval(): void {\n if (this.intervalId !== null) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n }\n\n private currentElapsed(): number {\n if (this.running) {\n return this.elapsed + (Date.now() - this.startTime);\n }\n return this.elapsed;\n }\n\n // -- Rendering ----------------------------------------------------------\n\n private render(context: ICliExecutionContext): void {\n const cols = context.terminal.cols;\n const rows = context.terminal.rows;\n const centerRow = Math.floor(rows / 2);\n const buf: string[] = [];\n\n buf.push(ansi.clearScreen, ansi.cursorHome, ansi.hideCursor);\n\n // Title\n const title = ' STOPWATCH ';\n const titleCol = Math.max(1, Math.floor((cols - title.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow - 4, titleCol));\n buf.push(ansi.fg.cyan, ansi.bold, title, ansi.reset);\n\n // Main time display\n const timeStr = formatDuration(this.currentElapsed());\n const timeCol = Math.max(1, Math.floor((cols - timeStr.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow - 2, timeCol));\n buf.push(ansi.bold, ansi.fg.yellow, timeStr, ansi.reset);\n\n // Status line\n const statusStr = this.running ? ' RUNNING ' : ' PAUSED ';\n const statusColor = this.running ? ansi.fg.brightGreen : ansi.fg.yellow;\n const statusCol = Math.max(1, Math.floor((cols - statusStr.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow, statusCol));\n buf.push(statusColor, statusStr, ansi.reset);\n\n // Controls hint\n const hint = '[Space/P] Pause [L] Lap [R] Reset [Q/Ctrl+C] Quit';\n const hintCol = Math.max(1, Math.floor((cols - hint.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow + 2, hintCol));\n buf.push(ansi.dim, hint, ansi.reset);\n\n // Laps (show last 5)\n if (this.laps.length > 0) {\n const lapsToShow = this.laps.slice(-5);\n const startIndex = this.laps.length - lapsToShow.length;\n lapsToShow.forEach((lap, i) => {\n const lapIndex = startIndex + i + 1;\n const lapStr = `Lap ${lapIndex}: ${formatDuration(lap)}`;\n const lapCol = Math.max(1, Math.floor((cols - lapStr.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow + 4 + i, lapCol));\n buf.push(ansi.fg.gray, lapStr, ansi.reset);\n });\n }\n\n context.terminal.write(buf.join(''));\n }\n}\n","/*\n * Public API Surface of stopwatch\n */\n\nexport * from './lib/processors/cli-stopwatch-command-processor';\nexport * from './lib/stopwatch-utils';\nexport * from './lib/version';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliStopwatchCommandProcessor } from './lib/processors/cli-stopwatch-command-processor';\nimport { API_VERSION } from './lib/version';\n\nexport const stopwatchModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-stopwatch',\n processors: [new CliStopwatchCommandProcessor()],\n translations: {\n es: { 'cli.stopwatch.description': 'Cronómetro interactivo y temporizador' },\n fr: { 'cli.stopwatch.description': 'Chronomètre interactif et minuteur' },\n de: { 'cli.stopwatch.description': 'Interaktive Stoppuhr und Countdown-Timer' },\n pt: { 'cli.stopwatch.description': 'Cronômetro interativo e temporizador' },\n it: { 'cli.stopwatch.description': 'Cronometro interattivo e timer' },\n ja: { 'cli.stopwatch.description': 'インタラクティブなストップウォッチとタイマー' },\n ko: { 'cli.stopwatch.description': '대화형 스톱워치 및 타이머' },\n zh: { 'cli.stopwatch.description': '交互式秒表和倒计时器' },\n ru: { 'cli.stopwatch.description': 'Интерактивный секундомер и таймер обратного отсчёта' },\n ro: { 'cli.stopwatch.description': 'Cronometru interactiv și numărătoare inversă' },\n },\n};\n"]}
package/public-api.mjs CHANGED
@@ -1,9 +1,9 @@
1
- import { DefaultLibraryAuthor } from '@qodalis/cli-core';
1
+ import { DefaultLibraryAuthor, joinShellWords } from '@qodalis/cli-core';
2
2
 
3
3
  // src/lib/processors/cli-stopwatch-command-processor.ts
4
4
 
5
5
  // src/lib/version.ts
6
- var LIBRARY_VERSION = "2.0.0-beta.8";
6
+ var LIBRARY_VERSION = "2.0.0-rc.1";
7
7
  var API_VERSION = 2;
8
8
 
9
9
  // src/lib/stopwatch-utils.ts
@@ -73,7 +73,7 @@ var CliStopwatchTimerCommandProcessor = class {
73
73
  this.context = null;
74
74
  }
75
75
  async processCommand(command, context) {
76
- const input = (command.value ?? "").trim();
76
+ const input = joinShellWords(command.value ?? "");
77
77
  const durationMs = parseDuration(input);
78
78
  if (!durationMs) {
79
79
  context.writer.writeError(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../packages/plugins/stopwatch/src/lib/version.ts","../../packages/plugins/stopwatch/src/lib/stopwatch-utils.ts","../../packages/plugins/stopwatch/src/lib/processors/cli-stopwatch-command-processor.ts","../../packages/plugins/stopwatch/src/public-api.ts"],"names":[],"mappings":"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","file":"public-api.mjs","sourcesContent":["\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-beta.8';\nexport const API_VERSION = 2;\n ","const MIN_INTERVAL_MS = 10_000; // 10 seconds minimum\n\n/**\n * Parse duration string: 30s, 5m, 1h, 2h30m, etc.\n * Returns null for invalid or too-short durations.\n */\nexport function parseDuration(input: string): number | null {\n if (!input.trim()) return null;\n // Plain number = seconds\n if (/^\\d+$/.test(input.trim())) {\n const ms = parseInt(input.trim(), 10) * 1000;\n return ms >= MIN_INTERVAL_MS ? ms : null;\n }\n const pattern = /^(?:(\\d+)h)?(?:(\\d+)m)?(?:(\\d+)s)?$/;\n const match = input.trim().match(pattern);\n if (!match || !match[0] || match[0] === '') return null;\n const h = parseInt(match[1] ?? '0', 10);\n const m = parseInt(match[2] ?? '0', 10);\n const s = parseInt(match[3] ?? '0', 10);\n const total = h * 3_600_000 + m * 60_000 + s * 1_000;\n return total >= MIN_INTERVAL_MS ? total : null;\n}\n\n/**\n * Format milliseconds as HH:MM:SS.mmm\n */\nexport function formatDuration(ms: number): string {\n const h = Math.floor(ms / 3_600_000);\n const m = Math.floor((ms % 3_600_000) / 60_000);\n const s = Math.floor((ms % 60_000) / 1_000);\n const millis = ms % 1_000;\n return [\n String(h).padStart(2, '0'),\n String(m).padStart(2, '0'),\n String(s).padStart(2, '0'),\n ].join(':') + '.' + String(millis).padStart(3, '0');\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\nimport { formatDuration, parseDuration } from '../stopwatch-utils';\n\n// -- ANSI helpers -----------------------------------------------------------\n\nconst ESC = '\\x1b';\nconst CSI = `${ESC}[`;\n\nconst ansi = {\n clearScreen: `${CSI}2J`,\n cursorHome: `${CSI}H`,\n hideCursor: `${CSI}?25l`,\n showCursor: `${CSI}?25h`,\n cursorTo: (row: number, col: number) => `${CSI}${row};${col}H`,\n bold: `${CSI}1m`,\n dim: `${CSI}2m`,\n reset: `${CSI}0m`,\n fg: {\n white: `${CSI}97m`,\n cyan: `${CSI}36m`,\n yellow: `${CSI}93m`,\n green: `${CSI}32m`,\n red: `${CSI}91m`,\n gray: `${CSI}90m`,\n brightGreen: `${CSI}92m`,\n brightCyan: `${CSI}96m`,\n },\n};\n\n// -- Timer sub-processor ----------------------------------------------------\n\nclass CliStopwatchTimerCommandProcessor implements ICliCommandProcessor {\n command = 'timer';\n description = 'Run a countdown timer (e.g. timer 5m, timer 1h30m, timer 90s)';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n\n private intervalId: ReturnType<typeof setInterval> | null = null;\n private remaining = 0;\n private total = 0;\n private running = false;\n private done = false;\n private context: ICliExecutionContext | null = null;\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const input = (command.value ?? '').trim();\n const durationMs = parseDuration(input);\n\n if (!durationMs) {\n context.writer.writeError(\n input\n ? `Invalid or too-short duration \"${input}\". Use formats like 30s, 5m, 1h, 2h30m (minimum 10s).`\n : 'Usage: stopwatch timer <duration> (e.g. timer 5m)',\n );\n return;\n }\n\n this.total = durationMs;\n this.remaining = durationMs;\n this.running = true;\n this.done = false;\n this.context = context;\n\n context.enterFullScreenMode(this);\n this.render(context);\n\n this.intervalId = setInterval(() => {\n if (!this.running) return;\n this.remaining = Math.max(0, this.remaining - 100);\n this.render(context);\n\n if (this.remaining === 0) {\n this.finishTimer(context);\n }\n }, 100);\n }\n\n async onData(data: string, context: ICliExecutionContext): Promise<void> {\n if (this.done) {\n // Any key exits\n this.exit(context);\n return;\n }\n\n switch (data) {\n case ' ':\n case 'p':\n case 'P':\n this.running = !this.running;\n this.render(context);\n break;\n case 'r':\n case 'R':\n this.remaining = this.total;\n this.running = false;\n this.render(context);\n break;\n // L=lap not applicable to countdown timer\n case 'q':\n case 'Q':\n case '\\x03': // Ctrl+C\n this.exit(context);\n break;\n }\n }\n\n onDispose(_context: ICliExecutionContext): void {\n this.clearInterval();\n }\n\n onResize(\n _cols: number,\n _rows: number,\n context: ICliExecutionContext,\n ): void {\n this.render(context);\n }\n\n private finishTimer(context: ICliExecutionContext): void {\n this.clearInterval();\n this.running = false;\n this.done = true;\n this.renderDone(context);\n }\n\n private exit(context: ICliExecutionContext): void {\n this.clearInterval();\n this.running = false;\n context.exitFullScreenMode();\n if (this.done) {\n context.writer.writeSuccess('Timer complete!');\n } else {\n const elapsed = this.total - this.remaining;\n context.writer.writeln(\n `Timer stopped. Elapsed: ${formatDuration(elapsed)} / ${formatDuration(this.total)}`,\n );\n }\n this.context = null;\n }\n\n private clearInterval(): void {\n if (this.intervalId !== null) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n }\n\n private render(context: ICliExecutionContext): void {\n const cols = context.terminal.cols;\n const rows = context.terminal.rows;\n const centerRow = Math.floor(rows / 2);\n const buf: string[] = [];\n\n buf.push(ansi.clearScreen, ansi.cursorHome, ansi.hideCursor);\n\n // Title\n const title = ' COUNTDOWN TIMER ';\n const titleCol = Math.max(1, Math.floor((cols - title.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow - 4, titleCol));\n buf.push(ansi.fg.cyan, ansi.bold, title, ansi.reset);\n\n // Time display\n const timeStr = formatDuration(this.remaining);\n const timeCol = Math.max(1, Math.floor((cols - timeStr.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow - 2, timeCol));\n buf.push(ansi.bold, ansi.fg.yellow, timeStr, ansi.reset);\n\n // Progress bar\n const barWidth = Math.min(50, cols - 6);\n const fraction = this.total > 0 ? (this.total - this.remaining) / this.total : 0;\n const filled = Math.round(fraction * barWidth);\n const empty = barWidth - filled;\n const barCol = Math.max(1, Math.floor((cols - barWidth - 2) / 2) + 1);\n\n buf.push(ansi.cursorTo(centerRow, barCol));\n buf.push(ansi.fg.gray, '[', ansi.reset);\n if (filled > 0) {\n buf.push(ansi.fg.brightGreen, '='.repeat(filled), ansi.reset);\n }\n if (empty > 0) {\n buf.push(ansi.fg.gray, ' '.repeat(empty), ansi.reset);\n }\n buf.push(ansi.fg.gray, ']', ansi.reset);\n\n // Percentage\n const pct = Math.round(fraction * 100);\n const pctStr = `${pct}%`;\n const pctCol = Math.max(1, Math.floor((cols - pctStr.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow + 1, pctCol));\n buf.push(ansi.fg.gray, pctStr, ansi.reset);\n\n // Status / paused indicator\n buf.push(ansi.cursorTo(centerRow + 2, Math.max(1, Math.floor((cols - 8) / 2) + 1)));\n if (!this.running) {\n buf.push(ansi.fg.yellow, ' PAUSED ', ansi.reset);\n } else {\n buf.push(' ');\n }\n\n // Controls hint\n const hint = '[Space/P] Pause [R] Reset [Q] Quit';\n const hintCol = Math.max(1, Math.floor((cols - hint.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow + 4, hintCol));\n buf.push(ansi.dim, hint, ansi.reset);\n\n context.terminal.write(buf.join(''));\n }\n\n private renderDone(context: ICliExecutionContext): void {\n const cols = context.terminal.cols;\n const rows = context.terminal.rows;\n const centerRow = Math.floor(rows / 2);\n const buf: string[] = [];\n\n buf.push(ansi.clearScreen, ansi.cursorHome, ansi.hideCursor);\n\n const msg1 = 'Timer complete!';\n const msg2 = formatDuration(this.total);\n const msg3 = 'Press any key to exit';\n\n buf.push(ansi.cursorTo(centerRow - 2, Math.max(1, Math.floor((cols - msg1.length) / 2) + 1)));\n buf.push(ansi.fg.brightGreen, ansi.bold, msg1, ansi.reset);\n\n buf.push(ansi.cursorTo(centerRow, Math.max(1, Math.floor((cols - msg2.length) / 2) + 1)));\n buf.push(ansi.fg.cyan, msg2, ansi.reset);\n\n buf.push(ansi.cursorTo(centerRow + 2, Math.max(1, Math.floor((cols - msg3.length) / 2) + 1)));\n buf.push(ansi.dim, msg3, ansi.reset);\n\n context.terminal.write(buf.join(''));\n }\n}\n\n// -- Stopwatch processor ----------------------------------------------------\n\nexport class CliStopwatchCommandProcessor implements ICliCommandProcessor {\n command = 'stopwatch';\n\n description = 'Interactive stopwatch and countdown timer';\n\n aliases = ['sw'];\n\n author = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n processors: ICliCommandProcessor[] = [\n new CliStopwatchTimerCommandProcessor(),\n ];\n\n // Stopwatch state\n private startTime = 0;\n private elapsed = 0;\n private running = false;\n private laps: number[] = [];\n private intervalId: ReturnType<typeof setInterval> | null = null;\n private context: ICliExecutionContext | null = null;\n\n async processCommand(\n _command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n this.reset();\n this.context = context;\n context.enterFullScreenMode(this);\n this.startTicking(context);\n this.render(context);\n }\n\n async onData(data: string, context: ICliExecutionContext): Promise<void> {\n switch (data) {\n case ' ':\n case 'p':\n case 'P':\n this.togglePause(context);\n break;\n case 'l':\n case 'L':\n this.recordLap(context);\n break;\n case 'r':\n case 'R':\n this.resetAndRestart(context);\n break;\n case 'q':\n case 'Q':\n case '\\x03': // Ctrl+C\n this.exit(context);\n break;\n }\n }\n\n onResize(\n _cols: number,\n _rows: number,\n context: ICliExecutionContext,\n ): void {\n this.render(context);\n }\n\n onDispose(_context: ICliExecutionContext): void {\n this.clearInterval();\n }\n\n writeDescription(context: ICliExecutionContext): void {\n const { writer } = context;\n writer.writeln(this.description!);\n writer.writeln();\n writer.writeln('Usage:');\n writer.writeln(' stopwatch Start interactive stopwatch');\n writer.writeln(' stopwatch timer <duration> Run countdown timer');\n writer.writeln();\n writer.writeln('Duration formats: 30s, 5m, 1h, 2h30m, 1h30m45s');\n writer.writeln();\n writer.writeln('Stopwatch controls:');\n writer.writeln(' [Space/P] Pause / resume');\n writer.writeln(' [L] Record lap');\n writer.writeln(' [R] Reset');\n writer.writeln(' [Q/Ctrl+C] Quit');\n }\n\n // -- Internal helpers ---------------------------------------------------\n\n private reset(): void {\n this.clearInterval();\n this.startTime = Date.now();\n this.elapsed = 0;\n this.running = true;\n this.laps = [];\n }\n\n private resetAndRestart(context: ICliExecutionContext): void {\n this.reset();\n this.startTicking(context);\n this.render(context);\n }\n\n private togglePause(context: ICliExecutionContext): void {\n if (this.running) {\n // Capture elapsed before pausing\n this.elapsed += Date.now() - this.startTime;\n this.running = false;\n this.clearInterval();\n } else {\n this.startTime = Date.now();\n this.running = true;\n this.startTicking(context);\n }\n this.render(context);\n }\n\n private recordLap(context: ICliExecutionContext): void {\n const current = this.currentElapsed();\n this.laps.push(current);\n this.render(context);\n }\n\n private exit(context: ICliExecutionContext): void {\n this.clearInterval();\n const finalTime = this.currentElapsed();\n context.exitFullScreenMode();\n context.writer.writeln(`Final time: ${formatDuration(finalTime)}`);\n if (this.laps.length > 0) {\n context.writer.writeln('Laps:');\n this.laps.forEach((lap, i) => {\n context.writer.writeln(` Lap ${i + 1}: ${formatDuration(lap)}`);\n });\n }\n this.context = null;\n }\n\n private startTicking(context: ICliExecutionContext): void {\n this.clearInterval();\n this.intervalId = setInterval(() => {\n this.render(context);\n }, 100);\n }\n\n private clearInterval(): void {\n if (this.intervalId !== null) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n }\n\n private currentElapsed(): number {\n if (this.running) {\n return this.elapsed + (Date.now() - this.startTime);\n }\n return this.elapsed;\n }\n\n // -- Rendering ----------------------------------------------------------\n\n private render(context: ICliExecutionContext): void {\n const cols = context.terminal.cols;\n const rows = context.terminal.rows;\n const centerRow = Math.floor(rows / 2);\n const buf: string[] = [];\n\n buf.push(ansi.clearScreen, ansi.cursorHome, ansi.hideCursor);\n\n // Title\n const title = ' STOPWATCH ';\n const titleCol = Math.max(1, Math.floor((cols - title.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow - 4, titleCol));\n buf.push(ansi.fg.cyan, ansi.bold, title, ansi.reset);\n\n // Main time display\n const timeStr = formatDuration(this.currentElapsed());\n const timeCol = Math.max(1, Math.floor((cols - timeStr.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow - 2, timeCol));\n buf.push(ansi.bold, ansi.fg.yellow, timeStr, ansi.reset);\n\n // Status line\n const statusStr = this.running ? ' RUNNING ' : ' PAUSED ';\n const statusColor = this.running ? ansi.fg.brightGreen : ansi.fg.yellow;\n const statusCol = Math.max(1, Math.floor((cols - statusStr.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow, statusCol));\n buf.push(statusColor, statusStr, ansi.reset);\n\n // Controls hint\n const hint = '[Space/P] Pause [L] Lap [R] Reset [Q/Ctrl+C] Quit';\n const hintCol = Math.max(1, Math.floor((cols - hint.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow + 2, hintCol));\n buf.push(ansi.dim, hint, ansi.reset);\n\n // Laps (show last 5)\n if (this.laps.length > 0) {\n const lapsToShow = this.laps.slice(-5);\n const startIndex = this.laps.length - lapsToShow.length;\n lapsToShow.forEach((lap, i) => {\n const lapIndex = startIndex + i + 1;\n const lapStr = `Lap ${lapIndex}: ${formatDuration(lap)}`;\n const lapCol = Math.max(1, Math.floor((cols - lapStr.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow + 4 + i, lapCol));\n buf.push(ansi.fg.gray, lapStr, ansi.reset);\n });\n }\n\n context.terminal.write(buf.join(''));\n }\n}\n","/*\n * Public API Surface of stopwatch\n */\n\nexport * from './lib/processors/cli-stopwatch-command-processor';\nexport * from './lib/stopwatch-utils';\nexport * from './lib/version';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliStopwatchCommandProcessor } from './lib/processors/cli-stopwatch-command-processor';\nimport { API_VERSION } from './lib/version';\n\nexport const stopwatchModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-stopwatch',\n processors: [new CliStopwatchCommandProcessor()],\n translations: {\n es: { 'cli.stopwatch.description': 'Cronómetro interactivo y temporizador' },\n fr: { 'cli.stopwatch.description': 'Chronomètre interactif et minuteur' },\n de: { 'cli.stopwatch.description': 'Interaktive Stoppuhr und Countdown-Timer' },\n pt: { 'cli.stopwatch.description': 'Cronômetro interativo e temporizador' },\n it: { 'cli.stopwatch.description': 'Cronometro interattivo e timer' },\n ja: { 'cli.stopwatch.description': 'インタラクティブなストップウォッチとタイマー' },\n ko: { 'cli.stopwatch.description': '대화형 스톱워치 및 타이머' },\n zh: { 'cli.stopwatch.description': '交互式秒表和倒计时器' },\n ru: { 'cli.stopwatch.description': 'Интерактивный секундомер и таймер обратного отсчёта' },\n ro: { 'cli.stopwatch.description': 'Cronometru interactiv și numărătoare inversă' },\n },\n};\n"]}
1
+ {"version":3,"sources":["../../packages/plugins/stopwatch/src/lib/version.ts","../../packages/plugins/stopwatch/src/lib/stopwatch-utils.ts","../../packages/plugins/stopwatch/src/lib/processors/cli-stopwatch-command-processor.ts","../../packages/plugins/stopwatch/src/public-api.ts"],"names":[],"mappings":"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","file":"public-api.mjs","sourcesContent":["\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-rc.1';\nexport const API_VERSION = 2;\n ","const MIN_INTERVAL_MS = 10_000; // 10 seconds minimum\n\n/**\n * Parse duration string: 30s, 5m, 1h, 2h30m, etc.\n * Returns null for invalid or too-short durations.\n */\nexport function parseDuration(input: string): number | null {\n if (!input.trim()) return null;\n // Plain number = seconds\n if (/^\\d+$/.test(input.trim())) {\n const ms = parseInt(input.trim(), 10) * 1000;\n return ms >= MIN_INTERVAL_MS ? ms : null;\n }\n const pattern = /^(?:(\\d+)h)?(?:(\\d+)m)?(?:(\\d+)s)?$/;\n const match = input.trim().match(pattern);\n if (!match || !match[0] || match[0] === '') return null;\n const h = parseInt(match[1] ?? '0', 10);\n const m = parseInt(match[2] ?? '0', 10);\n const s = parseInt(match[3] ?? '0', 10);\n const total = h * 3_600_000 + m * 60_000 + s * 1_000;\n return total >= MIN_INTERVAL_MS ? total : null;\n}\n\n/**\n * Format milliseconds as HH:MM:SS.mmm\n */\nexport function formatDuration(ms: number): string {\n const h = Math.floor(ms / 3_600_000);\n const m = Math.floor((ms % 3_600_000) / 60_000);\n const s = Math.floor((ms % 60_000) / 1_000);\n const millis = ms % 1_000;\n return [\n String(h).padStart(2, '0'),\n String(m).padStart(2, '0'),\n String(s).padStart(2, '0'),\n ].join(':') + '.' + String(millis).padStart(3, '0');\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n joinShellWords,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\nimport { formatDuration, parseDuration } from '../stopwatch-utils';\n\n// -- ANSI helpers -----------------------------------------------------------\n\nconst ESC = '\\x1b';\nconst CSI = `${ESC}[`;\n\nconst ansi = {\n clearScreen: `${CSI}2J`,\n cursorHome: `${CSI}H`,\n hideCursor: `${CSI}?25l`,\n showCursor: `${CSI}?25h`,\n cursorTo: (row: number, col: number) => `${CSI}${row};${col}H`,\n bold: `${CSI}1m`,\n dim: `${CSI}2m`,\n reset: `${CSI}0m`,\n fg: {\n white: `${CSI}97m`,\n cyan: `${CSI}36m`,\n yellow: `${CSI}93m`,\n green: `${CSI}32m`,\n red: `${CSI}91m`,\n gray: `${CSI}90m`,\n brightGreen: `${CSI}92m`,\n brightCyan: `${CSI}96m`,\n },\n};\n\n// -- Timer sub-processor ----------------------------------------------------\n\nclass CliStopwatchTimerCommandProcessor implements ICliCommandProcessor {\n command = 'timer';\n description = 'Run a countdown timer (e.g. timer 5m, timer 1h30m, timer 90s)';\n author = DefaultLibraryAuthor;\n version = LIBRARY_VERSION;\n acceptsRawInput = true;\n\n private intervalId: ReturnType<typeof setInterval> | null = null;\n private remaining = 0;\n private total = 0;\n private running = false;\n private done = false;\n private context: ICliExecutionContext | null = null;\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const input = joinShellWords(command.value ?? '');\n const durationMs = parseDuration(input);\n\n if (!durationMs) {\n context.writer.writeError(\n input\n ? `Invalid or too-short duration \"${input}\". Use formats like 30s, 5m, 1h, 2h30m (minimum 10s).`\n : 'Usage: stopwatch timer <duration> (e.g. timer 5m)',\n );\n return;\n }\n\n this.total = durationMs;\n this.remaining = durationMs;\n this.running = true;\n this.done = false;\n this.context = context;\n\n context.enterFullScreenMode(this);\n this.render(context);\n\n this.intervalId = setInterval(() => {\n if (!this.running) return;\n this.remaining = Math.max(0, this.remaining - 100);\n this.render(context);\n\n if (this.remaining === 0) {\n this.finishTimer(context);\n }\n }, 100);\n }\n\n async onData(data: string, context: ICliExecutionContext): Promise<void> {\n if (this.done) {\n // Any key exits\n this.exit(context);\n return;\n }\n\n switch (data) {\n case ' ':\n case 'p':\n case 'P':\n this.running = !this.running;\n this.render(context);\n break;\n case 'r':\n case 'R':\n this.remaining = this.total;\n this.running = false;\n this.render(context);\n break;\n // L=lap not applicable to countdown timer\n case 'q':\n case 'Q':\n case '\\x03': // Ctrl+C\n this.exit(context);\n break;\n }\n }\n\n onDispose(_context: ICliExecutionContext): void {\n this.clearInterval();\n }\n\n onResize(\n _cols: number,\n _rows: number,\n context: ICliExecutionContext,\n ): void {\n this.render(context);\n }\n\n private finishTimer(context: ICliExecutionContext): void {\n this.clearInterval();\n this.running = false;\n this.done = true;\n this.renderDone(context);\n }\n\n private exit(context: ICliExecutionContext): void {\n this.clearInterval();\n this.running = false;\n context.exitFullScreenMode();\n if (this.done) {\n context.writer.writeSuccess('Timer complete!');\n } else {\n const elapsed = this.total - this.remaining;\n context.writer.writeln(\n `Timer stopped. Elapsed: ${formatDuration(elapsed)} / ${formatDuration(this.total)}`,\n );\n }\n this.context = null;\n }\n\n private clearInterval(): void {\n if (this.intervalId !== null) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n }\n\n private render(context: ICliExecutionContext): void {\n const cols = context.terminal.cols;\n const rows = context.terminal.rows;\n const centerRow = Math.floor(rows / 2);\n const buf: string[] = [];\n\n buf.push(ansi.clearScreen, ansi.cursorHome, ansi.hideCursor);\n\n // Title\n const title = ' COUNTDOWN TIMER ';\n const titleCol = Math.max(1, Math.floor((cols - title.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow - 4, titleCol));\n buf.push(ansi.fg.cyan, ansi.bold, title, ansi.reset);\n\n // Time display\n const timeStr = formatDuration(this.remaining);\n const timeCol = Math.max(1, Math.floor((cols - timeStr.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow - 2, timeCol));\n buf.push(ansi.bold, ansi.fg.yellow, timeStr, ansi.reset);\n\n // Progress bar\n const barWidth = Math.min(50, cols - 6);\n const fraction = this.total > 0 ? (this.total - this.remaining) / this.total : 0;\n const filled = Math.round(fraction * barWidth);\n const empty = barWidth - filled;\n const barCol = Math.max(1, Math.floor((cols - barWidth - 2) / 2) + 1);\n\n buf.push(ansi.cursorTo(centerRow, barCol));\n buf.push(ansi.fg.gray, '[', ansi.reset);\n if (filled > 0) {\n buf.push(ansi.fg.brightGreen, '='.repeat(filled), ansi.reset);\n }\n if (empty > 0) {\n buf.push(ansi.fg.gray, ' '.repeat(empty), ansi.reset);\n }\n buf.push(ansi.fg.gray, ']', ansi.reset);\n\n // Percentage\n const pct = Math.round(fraction * 100);\n const pctStr = `${pct}%`;\n const pctCol = Math.max(1, Math.floor((cols - pctStr.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow + 1, pctCol));\n buf.push(ansi.fg.gray, pctStr, ansi.reset);\n\n // Status / paused indicator\n buf.push(ansi.cursorTo(centerRow + 2, Math.max(1, Math.floor((cols - 8) / 2) + 1)));\n if (!this.running) {\n buf.push(ansi.fg.yellow, ' PAUSED ', ansi.reset);\n } else {\n buf.push(' ');\n }\n\n // Controls hint\n const hint = '[Space/P] Pause [R] Reset [Q] Quit';\n const hintCol = Math.max(1, Math.floor((cols - hint.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow + 4, hintCol));\n buf.push(ansi.dim, hint, ansi.reset);\n\n context.terminal.write(buf.join(''));\n }\n\n private renderDone(context: ICliExecutionContext): void {\n const cols = context.terminal.cols;\n const rows = context.terminal.rows;\n const centerRow = Math.floor(rows / 2);\n const buf: string[] = [];\n\n buf.push(ansi.clearScreen, ansi.cursorHome, ansi.hideCursor);\n\n const msg1 = 'Timer complete!';\n const msg2 = formatDuration(this.total);\n const msg3 = 'Press any key to exit';\n\n buf.push(ansi.cursorTo(centerRow - 2, Math.max(1, Math.floor((cols - msg1.length) / 2) + 1)));\n buf.push(ansi.fg.brightGreen, ansi.bold, msg1, ansi.reset);\n\n buf.push(ansi.cursorTo(centerRow, Math.max(1, Math.floor((cols - msg2.length) / 2) + 1)));\n buf.push(ansi.fg.cyan, msg2, ansi.reset);\n\n buf.push(ansi.cursorTo(centerRow + 2, Math.max(1, Math.floor((cols - msg3.length) / 2) + 1)));\n buf.push(ansi.dim, msg3, ansi.reset);\n\n context.terminal.write(buf.join(''));\n }\n}\n\n// -- Stopwatch processor ----------------------------------------------------\n\nexport class CliStopwatchCommandProcessor implements ICliCommandProcessor {\n command = 'stopwatch';\n\n description = 'Interactive stopwatch and countdown timer';\n\n aliases = ['sw'];\n\n author = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n processors: ICliCommandProcessor[] = [\n new CliStopwatchTimerCommandProcessor(),\n ];\n\n // Stopwatch state\n private startTime = 0;\n private elapsed = 0;\n private running = false;\n private laps: number[] = [];\n private intervalId: ReturnType<typeof setInterval> | null = null;\n private context: ICliExecutionContext | null = null;\n\n async processCommand(\n _command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n this.reset();\n this.context = context;\n context.enterFullScreenMode(this);\n this.startTicking(context);\n this.render(context);\n }\n\n async onData(data: string, context: ICliExecutionContext): Promise<void> {\n switch (data) {\n case ' ':\n case 'p':\n case 'P':\n this.togglePause(context);\n break;\n case 'l':\n case 'L':\n this.recordLap(context);\n break;\n case 'r':\n case 'R':\n this.resetAndRestart(context);\n break;\n case 'q':\n case 'Q':\n case '\\x03': // Ctrl+C\n this.exit(context);\n break;\n }\n }\n\n onResize(\n _cols: number,\n _rows: number,\n context: ICliExecutionContext,\n ): void {\n this.render(context);\n }\n\n onDispose(_context: ICliExecutionContext): void {\n this.clearInterval();\n }\n\n writeDescription(context: ICliExecutionContext): void {\n const { writer } = context;\n writer.writeln(this.description!);\n writer.writeln();\n writer.writeln('Usage:');\n writer.writeln(' stopwatch Start interactive stopwatch');\n writer.writeln(' stopwatch timer <duration> Run countdown timer');\n writer.writeln();\n writer.writeln('Duration formats: 30s, 5m, 1h, 2h30m, 1h30m45s');\n writer.writeln();\n writer.writeln('Stopwatch controls:');\n writer.writeln(' [Space/P] Pause / resume');\n writer.writeln(' [L] Record lap');\n writer.writeln(' [R] Reset');\n writer.writeln(' [Q/Ctrl+C] Quit');\n }\n\n // -- Internal helpers ---------------------------------------------------\n\n private reset(): void {\n this.clearInterval();\n this.startTime = Date.now();\n this.elapsed = 0;\n this.running = true;\n this.laps = [];\n }\n\n private resetAndRestart(context: ICliExecutionContext): void {\n this.reset();\n this.startTicking(context);\n this.render(context);\n }\n\n private togglePause(context: ICliExecutionContext): void {\n if (this.running) {\n // Capture elapsed before pausing\n this.elapsed += Date.now() - this.startTime;\n this.running = false;\n this.clearInterval();\n } else {\n this.startTime = Date.now();\n this.running = true;\n this.startTicking(context);\n }\n this.render(context);\n }\n\n private recordLap(context: ICliExecutionContext): void {\n const current = this.currentElapsed();\n this.laps.push(current);\n this.render(context);\n }\n\n private exit(context: ICliExecutionContext): void {\n this.clearInterval();\n const finalTime = this.currentElapsed();\n context.exitFullScreenMode();\n context.writer.writeln(`Final time: ${formatDuration(finalTime)}`);\n if (this.laps.length > 0) {\n context.writer.writeln('Laps:');\n this.laps.forEach((lap, i) => {\n context.writer.writeln(` Lap ${i + 1}: ${formatDuration(lap)}`);\n });\n }\n this.context = null;\n }\n\n private startTicking(context: ICliExecutionContext): void {\n this.clearInterval();\n this.intervalId = setInterval(() => {\n this.render(context);\n }, 100);\n }\n\n private clearInterval(): void {\n if (this.intervalId !== null) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n }\n\n private currentElapsed(): number {\n if (this.running) {\n return this.elapsed + (Date.now() - this.startTime);\n }\n return this.elapsed;\n }\n\n // -- Rendering ----------------------------------------------------------\n\n private render(context: ICliExecutionContext): void {\n const cols = context.terminal.cols;\n const rows = context.terminal.rows;\n const centerRow = Math.floor(rows / 2);\n const buf: string[] = [];\n\n buf.push(ansi.clearScreen, ansi.cursorHome, ansi.hideCursor);\n\n // Title\n const title = ' STOPWATCH ';\n const titleCol = Math.max(1, Math.floor((cols - title.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow - 4, titleCol));\n buf.push(ansi.fg.cyan, ansi.bold, title, ansi.reset);\n\n // Main time display\n const timeStr = formatDuration(this.currentElapsed());\n const timeCol = Math.max(1, Math.floor((cols - timeStr.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow - 2, timeCol));\n buf.push(ansi.bold, ansi.fg.yellow, timeStr, ansi.reset);\n\n // Status line\n const statusStr = this.running ? ' RUNNING ' : ' PAUSED ';\n const statusColor = this.running ? ansi.fg.brightGreen : ansi.fg.yellow;\n const statusCol = Math.max(1, Math.floor((cols - statusStr.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow, statusCol));\n buf.push(statusColor, statusStr, ansi.reset);\n\n // Controls hint\n const hint = '[Space/P] Pause [L] Lap [R] Reset [Q/Ctrl+C] Quit';\n const hintCol = Math.max(1, Math.floor((cols - hint.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow + 2, hintCol));\n buf.push(ansi.dim, hint, ansi.reset);\n\n // Laps (show last 5)\n if (this.laps.length > 0) {\n const lapsToShow = this.laps.slice(-5);\n const startIndex = this.laps.length - lapsToShow.length;\n lapsToShow.forEach((lap, i) => {\n const lapIndex = startIndex + i + 1;\n const lapStr = `Lap ${lapIndex}: ${formatDuration(lap)}`;\n const lapCol = Math.max(1, Math.floor((cols - lapStr.length) / 2) + 1);\n buf.push(ansi.cursorTo(centerRow + 4 + i, lapCol));\n buf.push(ansi.fg.gray, lapStr, ansi.reset);\n });\n }\n\n context.terminal.write(buf.join(''));\n }\n}\n","/*\n * Public API Surface of stopwatch\n */\n\nexport * from './lib/processors/cli-stopwatch-command-processor';\nexport * from './lib/stopwatch-utils';\nexport * from './lib/version';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliStopwatchCommandProcessor } from './lib/processors/cli-stopwatch-command-processor';\nimport { API_VERSION } from './lib/version';\n\nexport const stopwatchModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-stopwatch',\n processors: [new CliStopwatchCommandProcessor()],\n translations: {\n es: { 'cli.stopwatch.description': 'Cronómetro interactivo y temporizador' },\n fr: { 'cli.stopwatch.description': 'Chronomètre interactif et minuteur' },\n de: { 'cli.stopwatch.description': 'Interaktive Stoppuhr und Countdown-Timer' },\n pt: { 'cli.stopwatch.description': 'Cronômetro interativo e temporizador' },\n it: { 'cli.stopwatch.description': 'Cronometro interattivo e timer' },\n ja: { 'cli.stopwatch.description': 'インタラクティブなストップウォッチとタイマー' },\n ko: { 'cli.stopwatch.description': '대화형 스톱워치 및 타이머' },\n zh: { 'cli.stopwatch.description': '交互式秒表和倒计时器' },\n ru: { 'cli.stopwatch.description': 'Интерактивный секундомер и таймер обратного отсчёта' },\n ro: { 'cli.stopwatch.description': 'Cronometru interactiv și numărătoare inversă' },\n },\n};\n"]}
@@ -8,7 +8,11 @@ var stopwatch = (() => {
8
8
  var __getProtoOf = Object.getPrototypeOf;
9
9
  var __hasOwnProp = Object.prototype.hasOwnProperty;
10
10
  var __commonJS = (cb, mod) => function __require() {
11
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
11
+ try {
12
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
13
+ } catch (e) {
14
+ throw mod = 0, e;
15
+ }
12
16
  };
13
17
  var __copyProps = (to, from, except, desc) => {
14
18
  if (from && typeof from === "object" || typeof from === "function") {
@@ -27,7 +31,7 @@ var stopwatch = (() => {
27
31
  mod
28
32
  ));
29
33
  var require_constants = __commonJS({
30
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/internal/constants.js"(exports$1, module2) {
34
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/constants.js"(exports, module2) {
31
35
  var SEMVER_SPEC_VERSION = "2.0.0";
32
36
  var MAX_LENGTH = 256;
33
37
  var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || /* istanbul ignore next */
@@ -56,26 +60,26 @@ var stopwatch = (() => {
56
60
  }
57
61
  });
58
62
  var require_debug = __commonJS({
59
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/internal/debug.js"(exports$1, module2) {
63
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/debug.js"(exports, module2) {
60
64
  var debug = typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error("SEMVER", ...args) : () => {
61
65
  };
62
66
  module2.exports = debug;
63
67
  }
64
68
  });
65
69
  var require_re = __commonJS({
66
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/internal/re.js"(exports$1, module2) {
70
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/re.js"(exports, module2) {
67
71
  var {
68
72
  MAX_SAFE_COMPONENT_LENGTH,
69
73
  MAX_SAFE_BUILD_LENGTH,
70
74
  MAX_LENGTH
71
75
  } = require_constants();
72
76
  var debug = require_debug();
73
- exports$1 = module2.exports = {};
74
- var re = exports$1.re = [];
75
- var safeRe = exports$1.safeRe = [];
76
- var src = exports$1.src = [];
77
- var safeSrc = exports$1.safeSrc = [];
78
- var t = exports$1.t = {};
77
+ exports = module2.exports = {};
78
+ var re = exports.re = [];
79
+ var safeRe = exports.safeRe = [];
80
+ var src = exports.src = [];
81
+ var safeSrc = exports.safeSrc = [];
82
+ var t = exports.t = {};
79
83
  var R = 0;
80
84
  var LETTERDASHNUMBER = "[a-zA-Z0-9-]";
81
85
  var safeRegexReplacements = [
@@ -128,18 +132,18 @@ var stopwatch = (() => {
128
132
  createToken("COERCERTLFULL", src[t.COERCEFULL], true);
129
133
  createToken("LONETILDE", "(?:~>?)");
130
134
  createToken("TILDETRIM", `(\\s*)${src[t.LONETILDE]}\\s+`, true);
131
- exports$1.tildeTrimReplace = "$1~";
135
+ exports.tildeTrimReplace = "$1~";
132
136
  createToken("TILDE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`);
133
137
  createToken("TILDELOOSE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`);
134
138
  createToken("LONECARET", "(?:\\^)");
135
139
  createToken("CARETTRIM", `(\\s*)${src[t.LONECARET]}\\s+`, true);
136
- exports$1.caretTrimReplace = "$1^";
140
+ exports.caretTrimReplace = "$1^";
137
141
  createToken("CARET", `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`);
138
142
  createToken("CARETLOOSE", `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`);
139
143
  createToken("COMPARATORLOOSE", `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`);
140
144
  createToken("COMPARATOR", `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`);
141
145
  createToken("COMPARATORTRIM", `(\\s*)${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true);
142
- exports$1.comparatorTrimReplace = "$1$2$3";
146
+ exports.comparatorTrimReplace = "$1$2$3";
143
147
  createToken("HYPHENRANGE", `^\\s*(${src[t.XRANGEPLAIN]})\\s+-\\s+(${src[t.XRANGEPLAIN]})\\s*$`);
144
148
  createToken("HYPHENRANGELOOSE", `^\\s*(${src[t.XRANGEPLAINLOOSE]})\\s+-\\s+(${src[t.XRANGEPLAINLOOSE]})\\s*$`);
145
149
  createToken("STAR", "(<|>)?=?\\s*\\*");
@@ -148,7 +152,7 @@ var stopwatch = (() => {
148
152
  }
149
153
  });
150
154
  var require_parse_options = __commonJS({
151
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/internal/parse-options.js"(exports$1, module2) {
155
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/parse-options.js"(exports, module2) {
152
156
  var looseOption = Object.freeze({ loose: true });
153
157
  var emptyOpts = Object.freeze({});
154
158
  var parseOptions = (options) => {
@@ -164,7 +168,7 @@ var stopwatch = (() => {
164
168
  }
165
169
  });
166
170
  var require_identifiers = __commonJS({
167
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/internal/identifiers.js"(exports$1, module2) {
171
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/identifiers.js"(exports, module2) {
168
172
  var numeric = /^[0-9]+$/;
169
173
  var compareIdentifiers = (a, b) => {
170
174
  if (typeof a === "number" && typeof b === "number") {
@@ -186,12 +190,24 @@ var stopwatch = (() => {
186
190
  }
187
191
  });
188
192
  var require_semver = __commonJS({
189
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/classes/semver.js"(exports$1, module2) {
193
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/semver.js"(exports, module2) {
190
194
  var debug = require_debug();
191
195
  var { MAX_LENGTH, MAX_SAFE_INTEGER } = require_constants();
192
196
  var { safeRe: re, t } = require_re();
193
197
  var parseOptions = require_parse_options();
194
198
  var { compareIdentifiers } = require_identifiers();
199
+ var isPrereleaseIdentifier = (prerelease, identifier) => {
200
+ const identifiers = identifier.split(".");
201
+ if (identifiers.length > prerelease.length) {
202
+ return false;
203
+ }
204
+ for (let i = 0; i < identifiers.length; i++) {
205
+ if (compareIdentifiers(prerelease[i], identifiers[i]) !== 0) {
206
+ return false;
207
+ }
208
+ }
209
+ return true;
210
+ };
195
211
  var SemVer = class _SemVer {
196
212
  constructor(version, options) {
197
213
  options = parseOptions(options);
@@ -438,8 +454,9 @@ var stopwatch = (() => {
438
454
  if (identifierBase === false) {
439
455
  prerelease = [identifier];
440
456
  }
441
- if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
442
- if (isNaN(this.prerelease[1])) {
457
+ if (isPrereleaseIdentifier(this.prerelease, identifier)) {
458
+ const prereleaseBase = this.prerelease[identifier.split(".").length];
459
+ if (isNaN(prereleaseBase)) {
443
460
  this.prerelease = prerelease;
444
461
  }
445
462
  } else {
@@ -462,7 +479,7 @@ var stopwatch = (() => {
462
479
  }
463
480
  });
464
481
  var require_parse = __commonJS({
465
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/parse.js"(exports$1, module2) {
482
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/parse.js"(exports, module2) {
466
483
  var SemVer = require_semver();
467
484
  var parse = (version, options, throwErrors = false) => {
468
485
  if (version instanceof SemVer) {
@@ -481,7 +498,7 @@ var stopwatch = (() => {
481
498
  }
482
499
  });
483
500
  var require_valid = __commonJS({
484
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/valid.js"(exports$1, module2) {
501
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/valid.js"(exports, module2) {
485
502
  var parse = require_parse();
486
503
  var valid2 = (version, options) => {
487
504
  const v = parse(version, options);
@@ -491,7 +508,7 @@ var stopwatch = (() => {
491
508
  }
492
509
  });
493
510
  var require_clean = __commonJS({
494
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/clean.js"(exports$1, module2) {
511
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/clean.js"(exports, module2) {
495
512
  var parse = require_parse();
496
513
  var clean = (version, options) => {
497
514
  const s = parse(version.trim().replace(/^[=v]+/, ""), options);
@@ -501,7 +518,7 @@ var stopwatch = (() => {
501
518
  }
502
519
  });
503
520
  var require_inc = __commonJS({
504
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/inc.js"(exports$1, module2) {
521
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/inc.js"(exports, module2) {
505
522
  var SemVer = require_semver();
506
523
  var inc = (version, release, options, identifier, identifierBase) => {
507
524
  if (typeof options === "string") {
@@ -522,7 +539,7 @@ var stopwatch = (() => {
522
539
  }
523
540
  });
524
541
  var require_diff = __commonJS({
525
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/diff.js"(exports$1, module2) {
542
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/diff.js"(exports, module2) {
526
543
  var parse = require_parse();
527
544
  var diff = (version1, version2) => {
528
545
  const v1 = parse(version1, null, true);
@@ -563,28 +580,28 @@ var stopwatch = (() => {
563
580
  }
564
581
  });
565
582
  var require_major = __commonJS({
566
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/major.js"(exports$1, module2) {
583
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/major.js"(exports, module2) {
567
584
  var SemVer = require_semver();
568
585
  var major = (a, loose) => new SemVer(a, loose).major;
569
586
  module2.exports = major;
570
587
  }
571
588
  });
572
589
  var require_minor = __commonJS({
573
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/minor.js"(exports$1, module2) {
590
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/minor.js"(exports, module2) {
574
591
  var SemVer = require_semver();
575
592
  var minor = (a, loose) => new SemVer(a, loose).minor;
576
593
  module2.exports = minor;
577
594
  }
578
595
  });
579
596
  var require_patch = __commonJS({
580
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/patch.js"(exports$1, module2) {
597
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/patch.js"(exports, module2) {
581
598
  var SemVer = require_semver();
582
599
  var patch = (a, loose) => new SemVer(a, loose).patch;
583
600
  module2.exports = patch;
584
601
  }
585
602
  });
586
603
  var require_prerelease = __commonJS({
587
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/prerelease.js"(exports$1, module2) {
604
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/prerelease.js"(exports, module2) {
588
605
  var parse = require_parse();
589
606
  var prerelease = (version, options) => {
590
607
  const parsed = parse(version, options);
@@ -594,28 +611,28 @@ var stopwatch = (() => {
594
611
  }
595
612
  });
596
613
  var require_compare = __commonJS({
597
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/compare.js"(exports$1, module2) {
614
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/compare.js"(exports, module2) {
598
615
  var SemVer = require_semver();
599
616
  var compare2 = (a, b, loose) => new SemVer(a, loose).compare(new SemVer(b, loose));
600
617
  module2.exports = compare2;
601
618
  }
602
619
  });
603
620
  var require_rcompare = __commonJS({
604
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/rcompare.js"(exports$1, module2) {
621
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/rcompare.js"(exports, module2) {
605
622
  var compare2 = require_compare();
606
623
  var rcompare = (a, b, loose) => compare2(b, a, loose);
607
624
  module2.exports = rcompare;
608
625
  }
609
626
  });
610
627
  var require_compare_loose = __commonJS({
611
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/compare-loose.js"(exports$1, module2) {
628
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/compare-loose.js"(exports, module2) {
612
629
  var compare2 = require_compare();
613
630
  var compareLoose = (a, b) => compare2(a, b, true);
614
631
  module2.exports = compareLoose;
615
632
  }
616
633
  });
617
634
  var require_compare_build = __commonJS({
618
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/compare-build.js"(exports$1, module2) {
635
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/compare-build.js"(exports, module2) {
619
636
  var SemVer = require_semver();
620
637
  var compareBuild = (a, b, loose) => {
621
638
  const versionA = new SemVer(a, loose);
@@ -626,63 +643,63 @@ var stopwatch = (() => {
626
643
  }
627
644
  });
628
645
  var require_sort = __commonJS({
629
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/sort.js"(exports$1, module2) {
646
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/sort.js"(exports, module2) {
630
647
  var compareBuild = require_compare_build();
631
- var sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose));
648
+ var sort = (list2, loose) => list2.sort((a, b) => compareBuild(a, b, loose));
632
649
  module2.exports = sort;
633
650
  }
634
651
  });
635
652
  var require_rsort = __commonJS({
636
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/rsort.js"(exports$1, module2) {
653
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/rsort.js"(exports, module2) {
637
654
  var compareBuild = require_compare_build();
638
- var rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose));
655
+ var rsort = (list2, loose) => list2.sort((a, b) => compareBuild(b, a, loose));
639
656
  module2.exports = rsort;
640
657
  }
641
658
  });
642
659
  var require_gt = __commonJS({
643
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/gt.js"(exports$1, module2) {
660
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/gt.js"(exports, module2) {
644
661
  var compare2 = require_compare();
645
662
  var gt = (a, b, loose) => compare2(a, b, loose) > 0;
646
663
  module2.exports = gt;
647
664
  }
648
665
  });
649
666
  var require_lt = __commonJS({
650
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/lt.js"(exports$1, module2) {
667
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/lt.js"(exports, module2) {
651
668
  var compare2 = require_compare();
652
669
  var lt = (a, b, loose) => compare2(a, b, loose) < 0;
653
670
  module2.exports = lt;
654
671
  }
655
672
  });
656
673
  var require_eq = __commonJS({
657
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/eq.js"(exports$1, module2) {
674
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/eq.js"(exports, module2) {
658
675
  var compare2 = require_compare();
659
676
  var eq = (a, b, loose) => compare2(a, b, loose) === 0;
660
677
  module2.exports = eq;
661
678
  }
662
679
  });
663
680
  var require_neq = __commonJS({
664
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/neq.js"(exports$1, module2) {
681
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/neq.js"(exports, module2) {
665
682
  var compare2 = require_compare();
666
683
  var neq = (a, b, loose) => compare2(a, b, loose) !== 0;
667
684
  module2.exports = neq;
668
685
  }
669
686
  });
670
687
  var require_gte = __commonJS({
671
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/gte.js"(exports$1, module2) {
688
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/gte.js"(exports, module2) {
672
689
  var compare2 = require_compare();
673
690
  var gte2 = (a, b, loose) => compare2(a, b, loose) >= 0;
674
691
  module2.exports = gte2;
675
692
  }
676
693
  });
677
694
  var require_lte = __commonJS({
678
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/lte.js"(exports$1, module2) {
695
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/lte.js"(exports, module2) {
679
696
  var compare2 = require_compare();
680
697
  var lte = (a, b, loose) => compare2(a, b, loose) <= 0;
681
698
  module2.exports = lte;
682
699
  }
683
700
  });
684
701
  var require_cmp = __commonJS({
685
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/cmp.js"(exports$1, module2) {
702
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/cmp.js"(exports, module2) {
686
703
  var eq = require_eq();
687
704
  var neq = require_neq();
688
705
  var gt = require_gt();
@@ -729,7 +746,7 @@ var stopwatch = (() => {
729
746
  }
730
747
  });
731
748
  var require_coerce = __commonJS({
732
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/coerce.js"(exports$1, module2) {
749
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/coerce.js"(exports, module2) {
733
750
  var SemVer = require_semver();
734
751
  var parse = require_parse();
735
752
  var { safeRe: re, t } = require_re();
@@ -771,8 +788,46 @@ var stopwatch = (() => {
771
788
  module2.exports = coerce2;
772
789
  }
773
790
  });
791
+ var require_truncate = __commonJS({
792
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/truncate.js"(exports, module2) {
793
+ var parse = require_parse();
794
+ var constants2 = require_constants();
795
+ var SemVer = require_semver();
796
+ var truncate = (version, truncation, options) => {
797
+ if (!constants2.RELEASE_TYPES.includes(truncation)) {
798
+ return null;
799
+ }
800
+ const clonedVersion = cloneInputVersion(version, options);
801
+ return clonedVersion && doTruncation(clonedVersion, truncation);
802
+ };
803
+ var cloneInputVersion = (version, options) => {
804
+ const versionStringToParse = version instanceof SemVer ? version.version : version;
805
+ return parse(versionStringToParse, options);
806
+ };
807
+ var doTruncation = (version, truncation) => {
808
+ if (isPrerelease(truncation)) {
809
+ return version.version;
810
+ }
811
+ version.prerelease = [];
812
+ switch (truncation) {
813
+ case "major":
814
+ version.minor = 0;
815
+ version.patch = 0;
816
+ break;
817
+ case "minor":
818
+ version.patch = 0;
819
+ break;
820
+ }
821
+ return version.format();
822
+ };
823
+ var isPrerelease = (type) => {
824
+ return type.startsWith("pre");
825
+ };
826
+ module2.exports = truncate;
827
+ }
828
+ });
774
829
  var require_lrucache = __commonJS({
775
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/internal/lrucache.js"(exports$1, module2) {
830
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/lrucache.js"(exports, module2) {
776
831
  var LRUCache = class {
777
832
  constructor() {
778
833
  this.max = 1e3;
@@ -807,7 +862,7 @@ var stopwatch = (() => {
807
862
  }
808
863
  });
809
864
  var require_range = __commonJS({
810
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/classes/range.js"(exports$1, module2) {
865
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/range.js"(exports, module2) {
811
866
  var SPACE_CHARACTERS = /\s+/g;
812
867
  var Range = class _Range {
813
868
  constructor(range, options) {
@@ -874,6 +929,7 @@ var stopwatch = (() => {
874
929
  return this.range;
875
930
  }
876
931
  parseRange(range) {
932
+ range = range.replace(BUILDSTRIPRE, "");
877
933
  const memoOpts = (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) | (this.options.loose && FLAG_LOOSE);
878
934
  const memoKey = memoOpts + ":" + range;
879
935
  const cached = cache.get(memoKey);
@@ -956,12 +1012,14 @@ var stopwatch = (() => {
956
1012
  var SemVer = require_semver();
957
1013
  var {
958
1014
  safeRe: re,
1015
+ src,
959
1016
  t,
960
1017
  comparatorTrimReplace,
961
1018
  tildeTrimReplace,
962
1019
  caretTrimReplace
963
1020
  } = require_re();
964
1021
  var { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require_constants();
1022
+ var BUILDSTRIPRE = new RegExp(src[t.BUILD], "g");
965
1023
  var isNullSet = (c) => c.value === "<0.0.0-0";
966
1024
  var isAny = (c) => c.value === "";
967
1025
  var isSatisfiable = (comparators, options) => {
@@ -990,20 +1048,22 @@ var stopwatch = (() => {
990
1048
  return comp;
991
1049
  };
992
1050
  var isX = (id) => !id || id.toLowerCase() === "x" || id === "*";
1051
+ var invalidXRangeOrder = (M, m, p) => isX(M) && !isX(m) || isX(m) && p && !isX(p);
993
1052
  var replaceTildes = (comp, options) => {
994
1053
  return comp.trim().split(/\s+/).map((c) => replaceTilde(c, options)).join(" ");
995
1054
  };
996
1055
  var replaceTilde = (comp, options) => {
997
1056
  const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE];
1057
+ const z = options.includePrerelease ? "-0" : "";
998
1058
  return comp.replace(r, (_, M, m, p, pr) => {
999
1059
  debug("tilde", comp, _, M, m, p, pr);
1000
1060
  let ret;
1001
1061
  if (isX(M)) {
1002
1062
  ret = "";
1003
1063
  } else if (isX(m)) {
1004
- ret = `>=${M}.0.0 <${+M + 1}.0.0-0`;
1064
+ ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`;
1005
1065
  } else if (isX(p)) {
1006
- ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`;
1066
+ ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`;
1007
1067
  } else if (pr) {
1008
1068
  debug("replaceTilde pr", pr);
1009
1069
  ret = `>=${M}.${m}.${p}-${pr} <${M}.${+m + 1}.0-0`;
@@ -1049,9 +1109,9 @@ var stopwatch = (() => {
1049
1109
  debug("no pr");
1050
1110
  if (M === "0") {
1051
1111
  if (m === "0") {
1052
- ret = `>=${M}.${m}.${p}${z} <${M}.${m}.${+p + 1}-0`;
1112
+ ret = `>=${M}.${m}.${p} <${M}.${m}.${+p + 1}-0`;
1053
1113
  } else {
1054
- ret = `>=${M}.${m}.${p}${z} <${M}.${+m + 1}.0-0`;
1114
+ ret = `>=${M}.${m}.${p} <${M}.${+m + 1}.0-0`;
1055
1115
  }
1056
1116
  } else {
1057
1117
  ret = `>=${M}.${m}.${p} <${+M + 1}.0.0-0`;
@@ -1070,6 +1130,9 @@ var stopwatch = (() => {
1070
1130
  const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE];
1071
1131
  return comp.replace(r, (ret, gtlt, M, m, p, pr) => {
1072
1132
  debug("xRange", comp, ret, gtlt, M, m, p, pr);
1133
+ if (invalidXRangeOrder(M, m, p)) {
1134
+ return comp;
1135
+ }
1073
1136
  const xM = isX(M);
1074
1137
  const xm = xM || isX(m);
1075
1138
  const xp = xm || isX(p);
@@ -1181,7 +1244,7 @@ var stopwatch = (() => {
1181
1244
  }
1182
1245
  });
1183
1246
  var require_comparator = __commonJS({
1184
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/classes/comparator.js"(exports$1, module2) {
1247
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/comparator.js"(exports, module2) {
1185
1248
  var ANY = /* @__PURE__ */ Symbol("SemVer ANY");
1186
1249
  var Comparator = class _Comparator {
1187
1250
  static get ANY() {
@@ -1291,7 +1354,7 @@ var stopwatch = (() => {
1291
1354
  }
1292
1355
  });
1293
1356
  var require_satisfies = __commonJS({
1294
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/satisfies.js"(exports$1, module2) {
1357
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/satisfies.js"(exports, module2) {
1295
1358
  var Range = require_range();
1296
1359
  var satisfies2 = (version, range, options) => {
1297
1360
  try {
@@ -1305,14 +1368,14 @@ var stopwatch = (() => {
1305
1368
  }
1306
1369
  });
1307
1370
  var require_to_comparators = __commonJS({
1308
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/to-comparators.js"(exports$1, module2) {
1371
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/to-comparators.js"(exports, module2) {
1309
1372
  var Range = require_range();
1310
1373
  var toComparators = (range, options) => new Range(range, options).set.map((comp) => comp.map((c) => c.value).join(" ").trim().split(" "));
1311
1374
  module2.exports = toComparators;
1312
1375
  }
1313
1376
  });
1314
1377
  var require_max_satisfying = __commonJS({
1315
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/max-satisfying.js"(exports$1, module2) {
1378
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/max-satisfying.js"(exports, module2) {
1316
1379
  var SemVer = require_semver();
1317
1380
  var Range = require_range();
1318
1381
  var maxSatisfying = (versions, range, options) => {
@@ -1338,7 +1401,7 @@ var stopwatch = (() => {
1338
1401
  }
1339
1402
  });
1340
1403
  var require_min_satisfying = __commonJS({
1341
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/min-satisfying.js"(exports$1, module2) {
1404
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/min-satisfying.js"(exports, module2) {
1342
1405
  var SemVer = require_semver();
1343
1406
  var Range = require_range();
1344
1407
  var minSatisfying = (versions, range, options) => {
@@ -1364,7 +1427,7 @@ var stopwatch = (() => {
1364
1427
  }
1365
1428
  });
1366
1429
  var require_min_version = __commonJS({
1367
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/min-version.js"(exports$1, module2) {
1430
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/min-version.js"(exports, module2) {
1368
1431
  var SemVer = require_semver();
1369
1432
  var Range = require_range();
1370
1433
  var gt = require_gt();
@@ -1420,7 +1483,7 @@ var stopwatch = (() => {
1420
1483
  }
1421
1484
  });
1422
1485
  var require_valid2 = __commonJS({
1423
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/valid.js"(exports$1, module2) {
1486
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/valid.js"(exports, module2) {
1424
1487
  var Range = require_range();
1425
1488
  var validRange = (range, options) => {
1426
1489
  try {
@@ -1433,7 +1496,7 @@ var stopwatch = (() => {
1433
1496
  }
1434
1497
  });
1435
1498
  var require_outside = __commonJS({
1436
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/outside.js"(exports$1, module2) {
1499
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/outside.js"(exports, module2) {
1437
1500
  var SemVer = require_semver();
1438
1501
  var Comparator = require_comparator();
1439
1502
  var { ANY } = Comparator;
@@ -1499,21 +1562,21 @@ var stopwatch = (() => {
1499
1562
  }
1500
1563
  });
1501
1564
  var require_gtr = __commonJS({
1502
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/gtr.js"(exports$1, module2) {
1565
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/gtr.js"(exports, module2) {
1503
1566
  var outside = require_outside();
1504
1567
  var gtr = (version, range, options) => outside(version, range, ">", options);
1505
1568
  module2.exports = gtr;
1506
1569
  }
1507
1570
  });
1508
1571
  var require_ltr = __commonJS({
1509
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/ltr.js"(exports$1, module2) {
1572
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/ltr.js"(exports, module2) {
1510
1573
  var outside = require_outside();
1511
1574
  var ltr = (version, range, options) => outside(version, range, "<", options);
1512
1575
  module2.exports = ltr;
1513
1576
  }
1514
1577
  });
1515
1578
  var require_intersects = __commonJS({
1516
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/intersects.js"(exports$1, module2) {
1579
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/intersects.js"(exports, module2) {
1517
1580
  var Range = require_range();
1518
1581
  var intersects = (r1, r2, options) => {
1519
1582
  r1 = new Range(r1, options);
@@ -1524,7 +1587,7 @@ var stopwatch = (() => {
1524
1587
  }
1525
1588
  });
1526
1589
  var require_simplify = __commonJS({
1527
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/simplify.js"(exports$1, module2) {
1590
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/simplify.js"(exports, module2) {
1528
1591
  var satisfies2 = require_satisfies();
1529
1592
  var compare2 = require_compare();
1530
1593
  module2.exports = (versions, range, options) => {
@@ -1571,7 +1634,7 @@ var stopwatch = (() => {
1571
1634
  }
1572
1635
  });
1573
1636
  var require_subset = __commonJS({
1574
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/subset.js"(exports$1, module2) {
1637
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/subset.js"(exports, module2) {
1575
1638
  var Range = require_range();
1576
1639
  var Comparator = require_comparator();
1577
1640
  var { ANY } = Comparator;
@@ -1678,7 +1741,7 @@ var stopwatch = (() => {
1678
1741
  if (higher === c && higher !== gt) {
1679
1742
  return false;
1680
1743
  }
1681
- } else if (gt.operator === ">=" && !satisfies2(gt.semver, String(c), options)) {
1744
+ } else if (gt.operator === ">=" && !c.test(gt.semver)) {
1682
1745
  return false;
1683
1746
  }
1684
1747
  }
@@ -1693,7 +1756,7 @@ var stopwatch = (() => {
1693
1756
  if (lower === c && lower !== lt) {
1694
1757
  return false;
1695
1758
  }
1696
- } else if (lt.operator === "<=" && !satisfies2(lt.semver, String(c), options)) {
1759
+ } else if (lt.operator === "<=" && !c.test(lt.semver)) {
1697
1760
  return false;
1698
1761
  }
1699
1762
  }
@@ -1730,7 +1793,7 @@ var stopwatch = (() => {
1730
1793
  }
1731
1794
  });
1732
1795
  var require_semver2 = __commonJS({
1733
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/index.js"(exports$1, module2) {
1796
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/index.js"(exports, module2) {
1734
1797
  var internalRe = require_re();
1735
1798
  var constants2 = require_constants();
1736
1799
  var SemVer = require_semver();
@@ -1758,6 +1821,7 @@ var stopwatch = (() => {
1758
1821
  var lte = require_lte();
1759
1822
  var cmp = require_cmp();
1760
1823
  var coerce2 = require_coerce();
1824
+ var truncate = require_truncate();
1761
1825
  var Comparator = require_comparator();
1762
1826
  var Range = require_range();
1763
1827
  var satisfies2 = require_satisfies();
@@ -1796,6 +1860,7 @@ var stopwatch = (() => {
1796
1860
  lte,
1797
1861
  cmp,
1798
1862
  coerce: coerce2,
1863
+ truncate,
1799
1864
  Comparator,
1800
1865
  Range,
1801
1866
  satisfies: satisfies2,
@@ -1821,14 +1886,89 @@ var stopwatch = (() => {
1821
1886
  };
1822
1887
  }
1823
1888
  });
1889
+ function createCliToken(name) {
1890
+ return name;
1891
+ }
1892
+ var ICliUserSessionService_TOKEN = createCliToken("cli-user-session-service");
1893
+ var ICliUsersStoreService_TOKEN = createCliToken("cli-users-store-service");
1894
+ var ICliGroupsStoreService_TOKEN = createCliToken("cli-groups-store-service");
1895
+ var ICliAuthService_TOKEN = createCliToken("cli-auth-service");
1896
+ var ICliCompletionProvider_TOKEN = createCliToken("cli-completion-provider");
1897
+ var ICliDragDropService_TOKEN = createCliToken("cli-drag-drop-service");
1898
+ var ICliFileTransferService_TOKEN = createCliToken("cli-file-transfer-service");
1899
+ var ICliTranslationService_TOKEN = createCliToken("cli-translation-service");
1900
+ var ICliPermissionService_TOKEN = createCliToken("cli-permission-service");
1901
+ var ICliFilePickerProvider_TOKEN = createCliToken("cli-file-picker-provider");
1902
+ var ICliHttpClient_TOKEN = createCliToken("cli-http-client");
1903
+ var ICliUserEventService_TOKEN = createCliToken("cli-user-event-service");
1904
+ var ICliAuditService_TOKEN = createCliToken("cli-audit-service");
1905
+ var ICliAuthorizationService_TOKEN = createCliToken("cli-authorization-service");
1906
+ var ICliPermissionRegistry_TOKEN = createCliToken("cli-permission-registry");
1907
+ var ICliSessionsService_TOKEN = createCliToken("cli-sessions-service");
1908
+ var ICliKeyValueStore_TOKEN = createCliToken("cli-key-value-store");
1909
+ var ICliServerAuthTokenProvider_TOKEN = createCliToken("cli-server-auth-token-provider");
1910
+ var ICliServerAuthService_TOKEN = createCliToken("cli-server-auth-service");
1911
+ var ICliServerManager_TOKEN = createCliToken("cli-server-manager");
1912
+ function resolveHeaders(provider) {
1913
+ if (!provider) return {};
1914
+ return typeof provider === "function" ? provider() : provider;
1915
+ }
1916
+ var ICliCommandGuard_TOKEN = createCliToken("cli-command-guard");
1917
+ var ICliEventBus_TOKEN = createCliToken("cli-event-bus");
1824
1918
  var DefaultLibraryAuthor = {
1825
1919
  name: "Nicolae Lupei",
1826
1920
  email: "nicolae.lupei@qodalis.com"
1827
1921
  };
1922
+ function splitShellWords(text) {
1923
+ const words = [];
1924
+ let current = "";
1925
+ let inWord = false;
1926
+ for (let i = 0; i < text.length; i++) {
1927
+ const ch = text[i];
1928
+ if (ch === "\\" && i + 1 < text.length) {
1929
+ current += text[++i];
1930
+ inWord = true;
1931
+ } else if (ch === "'" && text.indexOf("'", i + 1) !== -1) {
1932
+ const end = text.indexOf("'", i + 1);
1933
+ current += text.slice(i + 1, end);
1934
+ inWord = true;
1935
+ i = end;
1936
+ } else if (ch === '"' && closingDoubleQuote(text, i) !== -1) {
1937
+ const end = closingDoubleQuote(text, i);
1938
+ current += unescapeDoubleQuoted(text.slice(i + 1, end));
1939
+ inWord = true;
1940
+ i = end;
1941
+ } else if (/\s/.test(ch)) {
1942
+ if (inWord) words.push(current);
1943
+ current = "";
1944
+ inWord = false;
1945
+ } else {
1946
+ current += ch;
1947
+ inWord = true;
1948
+ }
1949
+ }
1950
+ if (inWord) words.push(current);
1951
+ return words;
1952
+ }
1953
+ function joinShellWords(text) {
1954
+ return splitShellWords(text).join(" ");
1955
+ }
1956
+ function closingDoubleQuote(text, start) {
1957
+ for (let i = start + 1; i < text.length; i++) {
1958
+ if (text[i] === "\\") i++;
1959
+ else if (text[i] === '"') return i;
1960
+ }
1961
+ return -1;
1962
+ }
1963
+ function unescapeDoubleQuoted(text) {
1964
+ return text.replace(/\\(["\\$`])/g, "$1");
1965
+ }
1828
1966
  var semver = __toESM(require_semver2());
1967
+ var API_VERSION = 2;
1968
+ var VERSIONS_ENDPOINT = "/api/qcli/versions";
1829
1969
  var ServerVersionNegotiator = class {
1830
1970
  static {
1831
- this.CLIENT_SUPPORTED_VERSIONS = [2];
1971
+ this.CLIENT_SUPPORTED_VERSIONS = [API_VERSION];
1832
1972
  }
1833
1973
  /**
1834
1974
  * Given a server's version info, pick the highest mutually compatible version.
@@ -1845,9 +1985,18 @@ var stopwatch = (() => {
1845
1985
  * Returns the negotiated API version and the base path for all subsequent calls,
1846
1986
  * or null if the server is unreachable or incompatible.
1847
1987
  */
1848
- static async discover(baseUrl) {
1988
+ static async discover(baseUrl, headers, options) {
1989
+ let response;
1990
+ try {
1991
+ const resolved = resolveHeaders(headers);
1992
+ response = await fetch(`${baseUrl}${VERSIONS_ENDPOINT}`, {
1993
+ headers: Object.keys(resolved).length > 0 ? resolved : void 0
1994
+ });
1995
+ } catch (e) {
1996
+ if (options?.rethrowNetworkErrors) throw e;
1997
+ return null;
1998
+ }
1849
1999
  try {
1850
- const response = await fetch(`${baseUrl}/api/qcli/versions`);
1851
2000
  if (!response.ok) return null;
1852
2001
  const info = await response.json();
1853
2002
  const version = this.negotiate(info);
@@ -2679,8 +2828,8 @@ var stopwatch = (() => {
2679
2828
  };
2680
2829
 
2681
2830
  // src/lib/version.ts
2682
- var LIBRARY_VERSION = "2.0.0-beta.8";
2683
- var API_VERSION = 2;
2831
+ var LIBRARY_VERSION = "2.0.0-rc.1";
2832
+ var API_VERSION2 = 2;
2684
2833
 
2685
2834
  // src/lib/stopwatch-utils.ts
2686
2835
  var MIN_INTERVAL_MS = 1e4;
@@ -2749,7 +2898,7 @@ var stopwatch = (() => {
2749
2898
  this.context = null;
2750
2899
  }
2751
2900
  async processCommand(command, context) {
2752
- const input = (command.value ?? "").trim();
2901
+ const input = joinShellWords(command.value ?? "");
2753
2902
  const durationMs = parseDuration(input);
2754
2903
  if (!durationMs) {
2755
2904
  context.writer.writeError(
@@ -3065,7 +3214,7 @@ var stopwatch = (() => {
3065
3214
 
3066
3215
  // src/cli-entrypoint.ts
3067
3216
  var module = {
3068
- apiVersion: API_VERSION,
3217
+ apiVersion: API_VERSION2,
3069
3218
  name: "@qodalis/cli-stopwatch",
3070
3219
  processors: [new CliStopwatchCommandProcessor()]
3071
3220
  };