@dev-pi2pie/word-counter 0.1.0-canary.4 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +113 -70
- package/dist/cjs/index.cjs +104 -22
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/esm/bin.mjs +1216 -784
- package/dist/esm/bin.mjs.map +1 -1
- package/dist/esm/index.d.mts +9 -2
- package/dist/esm/index.mjs +104 -22
- package/dist/esm/index.mjs.map +1 -1
- package/package.json +9 -6
package/dist/esm/bin.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.mjs","names":["frontmatter","analyzed","total","wordCounter","resolvePath","wordCounter","pc","relative","relativePath","resolveTotalOfOverride","pc","resolve","wordCounter","labels"],"sources":["../../src/markdown/toml/arrays.ts","../../src/markdown/toml/keys.ts","../../src/markdown/toml/strings.ts","../../src/markdown/toml/values.ts","../../src/markdown/toml/parse-frontmatter.ts","../../src/markdown/parse-markdown.ts","../../src/wc/segmenter.ts","../../src/utils/append-all.ts","../../src/wc/non-words.ts","../../src/wc/analyze.ts","../../src/wc/mode.ts","../../src/wc/locale-detect.ts","../../src/wc/segment.ts","../../src/wc/wc.ts","../../src/wc/index.ts","../../src/markdown/section-count.ts","../../src/cli/path/filter.ts","../../src/cli/path/load.ts","../../src/cli/path/resolve.ts","../../src/cli/progress/reporter.ts","../../src/cli/batch/aggregate.ts","../../src/cli/batch/run.ts","../../src/cli/debug/channel.ts","../../src/utils/show-singular-or-plural-word.ts","../../src/cli/total-of.ts","../../node_modules/picocolors/picocolors.js","../../src/cli/output/render.ts","../../src/command.ts","../../src/bin.ts"],"sourcesContent":["export function ensureArrayContainer(\n result: Record<string, unknown>,\n key: string,\n): Record<string, unknown>[] {\n const existing = result[key];\n if (Array.isArray(existing)) {\n return existing as Record<string, unknown>[];\n }\n const list: Record<string, unknown>[] = [];\n result[key] = list;\n return list;\n}\n\nexport function flattenArrayTables(result: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(result)) {\n if (!Array.isArray(value)) {\n continue;\n }\n const flattened = value\n .map((entry) =>\n Object.entries(entry)\n .map(([entryKey, entryValue]) => `${entryKey}=${entryValue}`)\n .join(\", \"),\n )\n .join(\" | \");\n result[key] = flattened;\n }\n}\n","function stripKeyQuotes(key: string): string {\n const trimmed = key.trim();\n if (\n (trimmed.startsWith(\"\\\"\") && trimmed.endsWith(\"\\\"\")) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))\n ) {\n return trimmed.slice(1, -1);\n }\n return trimmed;\n}\n\nexport function normalizeKeyPath(key: string): string | null {\n const trimmed = key.trim();\n if (!trimmed) {\n return null;\n }\n\n if (\n (trimmed.startsWith(\"\\\"\") && trimmed.endsWith(\"\\\"\")) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))\n ) {\n const unquoted = stripKeyQuotes(trimmed);\n return unquoted ? unquoted : null;\n }\n\n const segments = trimmed.split(\".\").map((segment) => segment.trim());\n if (segments.some((segment) => !segment)) {\n return null;\n }\n return segments.join(\".\");\n}\n","export function stripInlineComment(line: string): string {\n let inString: \"single\" | \"double\" | null = null;\n let escaped = false;\n\n for (let i = 0; i < line.length; i += 1) {\n const char = line[i] ?? \"\";\n\n if (inString) {\n if (escaped) {\n escaped = false;\n continue;\n }\n\n if (char === \"\\\\\" && inString === \"double\") {\n escaped = true;\n continue;\n }\n\n if (inString === \"double\" && char === \"\\\"\") {\n inString = null;\n continue;\n }\n\n if (inString === \"single\" && char === \"'\") {\n inString = null;\n continue;\n }\n\n continue;\n }\n\n if (char === \"\\\"\") {\n inString = \"double\";\n continue;\n }\n\n if (char === \"'\") {\n inString = \"single\";\n continue;\n }\n\n if (char === \"#\") {\n return line.slice(0, i).trimEnd();\n }\n }\n\n return line;\n}\n\nfunction unescapeBasic(input: string): string {\n return input\n .replace(/\\\\\\\\/g, \"\\\\\")\n .replace(/\\\\\"/g, \"\\\"\")\n .replace(/\\\\n/g, \"\\n\")\n .replace(/\\\\t/g, \"\\t\")\n .replace(/\\\\r/g, \"\\r\");\n}\n\nexport function parseStringLiteral(value: string): string | null {\n if (value.startsWith('\"\"\"') && value.endsWith('\"\"\"')) {\n const inner = value.slice(3, -3);\n return unescapeBasic(inner);\n }\n\n if (value.startsWith(\"'''\") && value.endsWith(\"'''\")) {\n return value.slice(3, -3);\n }\n\n if (value.startsWith(\"\\\"\") && value.endsWith(\"\\\"\")) {\n return unescapeBasic(value.slice(1, -1));\n }\n\n if (value.startsWith(\"'\") && value.endsWith(\"'\")) {\n return value.slice(1, -1);\n }\n\n return null;\n}\n","import { normalizeKeyPath } from \"./keys\";\nimport { parseStringLiteral } from \"./strings\";\nimport type { TomlValue } from \"./types\";\n\nfunction parsePrimitive(raw: string): string | number | boolean | null {\n const value = raw.trim();\n if (!value) {\n return null;\n }\n\n const stringLiteral = parseStringLiteral(value);\n if (stringLiteral !== null) {\n return stringLiteral;\n }\n\n if (value === \"true\") {\n return true;\n }\n\n if (value === \"false\") {\n return false;\n }\n\n if (/^[+-]?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/.test(value)) {\n return Number(value);\n }\n\n if (/^\\d{4}-\\d{2}-\\d{2}/.test(value)) {\n return value;\n }\n\n return value;\n}\n\nfunction parseArray(raw: string): Array<string | number | boolean> | null {\n const value = raw.trim();\n if (!value.startsWith(\"[\") || !value.endsWith(\"]\")) {\n return null;\n }\n\n const inner = value.slice(1, -1).trim();\n if (!inner) {\n return [];\n }\n\n const items: Array<string | number | boolean> = [];\n let current = \"\";\n let inString: \"single\" | \"double\" | null = null;\n let escaped = false;\n\n for (let i = 0; i < inner.length; i += 1) {\n const char = inner[i] ?? \"\";\n\n if (inString) {\n current += char;\n if (escaped) {\n escaped = false;\n continue;\n }\n\n if (char === \"\\\\\" && inString === \"double\") {\n escaped = true;\n continue;\n }\n\n if (inString === \"double\" && char === \"\\\"\") {\n inString = null;\n } else if (inString === \"single\" && char === \"'\") {\n inString = null;\n }\n continue;\n }\n\n if (char === \"\\\"\") {\n inString = \"double\";\n current += char;\n continue;\n }\n\n if (char === \"'\") {\n inString = \"single\";\n current += char;\n continue;\n }\n\n if (char === \",\") {\n const item = parsePrimitive(current);\n if (item === null) {\n return null;\n }\n items.push(item);\n current = \"\";\n continue;\n }\n\n current += char;\n }\n\n const finalItem = parsePrimitive(current);\n if (finalItem === null) {\n return null;\n }\n items.push(finalItem);\n\n return items;\n}\n\nfunction parseInlineTable(raw: string): Record<string, TomlValue> | null {\n const trimmed = raw.trim();\n if (!trimmed.startsWith(\"{\") || !trimmed.endsWith(\"}\")) {\n return null;\n }\n\n const inner = trimmed.slice(1, -1).trim();\n if (!inner) {\n return {};\n }\n\n const pairs: string[] = [];\n let current = \"\";\n let inString: \"single\" | \"double\" | null = null;\n let escaped = false;\n let bracketDepth = 0;\n let braceDepth = 0;\n\n for (let i = 0; i < inner.length; i += 1) {\n const char = inner[i] ?? \"\";\n\n if (inString) {\n current += char;\n if (escaped) {\n escaped = false;\n continue;\n }\n\n if (char === \"\\\\\" && inString === \"double\") {\n escaped = true;\n continue;\n }\n\n if (inString === \"double\" && char === \"\\\"\") {\n inString = null;\n } else if (inString === \"single\" && char === \"'\") {\n inString = null;\n }\n continue;\n }\n\n if (char === \"\\\"\") {\n inString = \"double\";\n current += char;\n continue;\n }\n\n if (char === \"'\") {\n inString = \"single\";\n current += char;\n continue;\n }\n\n if (char === \"[\") {\n bracketDepth += 1;\n current += char;\n continue;\n }\n\n if (char === \"]\") {\n if (bracketDepth > 0) {\n bracketDepth -= 1;\n }\n current += char;\n continue;\n }\n\n if (char === \"{\") {\n braceDepth += 1;\n current += char;\n continue;\n }\n\n if (char === \"}\") {\n if (braceDepth > 0) {\n braceDepth -= 1;\n }\n current += char;\n continue;\n }\n\n if (char === \",\" && bracketDepth === 0 && braceDepth === 0) {\n pairs.push(current);\n current = \"\";\n continue;\n }\n\n current += char;\n }\n\n if (current.trim()) {\n pairs.push(current);\n }\n\n const output: Record<string, TomlValue> = {};\n for (const pair of pairs) {\n const separatorIndex = pair.indexOf(\"=\");\n if (separatorIndex === -1) {\n return null;\n }\n const key = normalizeKeyPath(pair.slice(0, separatorIndex));\n if (!key) {\n return null;\n }\n const valueRaw = pair.slice(separatorIndex + 1).trim();\n if (!valueRaw) {\n return null;\n }\n if (valueRaw.startsWith(\"{\")) {\n return null;\n }\n const normalized = normalizeValue(valueRaw);\n if (normalized === null) {\n return null;\n }\n if (typeof normalized === \"object\" && !Array.isArray(normalized)) {\n return null;\n }\n output[key] = normalized;\n }\n\n return output;\n}\n\nexport function normalizeValue(value: string): TomlValue | null {\n if (!value) {\n return null;\n }\n\n const trimmed = value.trim();\n if (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) {\n return parseInlineTable(trimmed);\n }\n\n const array = parseArray(trimmed);\n if (array) {\n return array;\n }\n\n if (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\")) {\n return null;\n }\n\n return parsePrimitive(trimmed);\n}\n\nexport function toPlainText(value: unknown): string {\n if (value == null) {\n return \"\";\n }\n if (Array.isArray(value)) {\n return value.map((item) => String(item)).join(\", \");\n }\n return String(value);\n}\n","import { ensureArrayContainer, flattenArrayTables } from \"./arrays\";\nimport { normalizeKeyPath } from \"./keys\";\nimport { stripInlineComment } from \"./strings\";\nimport { normalizeValue, toPlainText } from \"./values\";\n\nexport function parseTomlFrontmatter(frontmatter: string): Record<string, unknown> | null {\n const result: Record<string, unknown> = {};\n const lines = frontmatter.split(\"\\n\");\n let tablePrefix = \"\";\n let tableTarget: Record<string, unknown> | null = null;\n let tablePrefixInList = false;\n\n for (let index = 0; index < lines.length; index += 1) {\n const rawLine = lines[index] ?? \"\";\n const trimmedLine = rawLine.trim();\n if (!trimmedLine || trimmedLine.startsWith(\"#\")) {\n continue;\n }\n\n if (trimmedLine.startsWith(\"[[\")) {\n const match = trimmedLine.match(/^\\[\\[([^\\]]+)]]$/);\n if (!match) {\n return null;\n }\n const normalizedTable = normalizeKeyPath(match[1] ?? \"\");\n if (!normalizedTable) {\n return null;\n }\n const list = ensureArrayContainer(result, normalizedTable);\n const newEntry: Record<string, unknown> = {};\n list.push(newEntry);\n tableTarget = newEntry;\n tablePrefix = normalizedTable;\n tablePrefixInList = true;\n continue;\n }\n\n const tableMatch = trimmedLine.match(/^\\[([^\\]]+)]$/);\n if (tableMatch) {\n const normalizedTable = normalizeKeyPath(tableMatch[1] ?? \"\");\n if (!normalizedTable) {\n return null;\n }\n tablePrefix = normalizedTable;\n tablePrefixInList = false;\n tableTarget = null;\n continue;\n }\n\n const lineForParsing = /(\"\"\"|''')/.test(rawLine) ? rawLine : stripInlineComment(rawLine);\n const separatorIndex = lineForParsing.indexOf(\"=\");\n if (separatorIndex === -1) {\n return null;\n }\n\n const keyRaw = lineForParsing.slice(0, separatorIndex);\n const key = normalizeKeyPath(keyRaw);\n let valueRaw = lineForParsing.slice(separatorIndex + 1).trim();\n if (!key) {\n return null;\n }\n\n const tripleDelimiter = valueRaw.startsWith('\"\"\"') ? '\"\"\"' : valueRaw.startsWith(\"'''\") ? \"'''\" : null;\n if (tripleDelimiter) {\n const closingIndex = valueRaw.indexOf(tripleDelimiter, tripleDelimiter.length);\n if (closingIndex !== -1) {\n const after = valueRaw.slice(closingIndex + tripleDelimiter.length);\n const strippedAfter = stripInlineComment(after);\n valueRaw = `${valueRaw.slice(0, closingIndex + tripleDelimiter.length)}${strippedAfter}`;\n } else {\n const delimiter = tripleDelimiter;\n let combined = valueRaw;\n let closed = false;\n while (index + 1 < lines.length) {\n index += 1;\n const nextLine = lines[index] ?? \"\";\n combined += `\\n${nextLine}`;\n if (new RegExp(`${delimiter}\\\\s*$`).test(nextLine)) {\n closed = true;\n break;\n }\n }\n if (!closed) {\n return null;\n }\n valueRaw = combined;\n }\n }\n\n const normalized = normalizeValue(valueRaw);\n if (normalized === null) {\n return null;\n }\n\n const fullKey = tablePrefix ? `${tablePrefix}.${key}` : key;\n if (typeof normalized === \"object\" && !Array.isArray(normalized)) {\n for (const [inlineKey, inlineValue] of Object.entries(normalized)) {\n const entryKey = tablePrefixInList ? `${key}.${inlineKey}` : `${fullKey}.${inlineKey}`;\n if (tablePrefixInList && tableTarget) {\n tableTarget[entryKey] = toPlainText(inlineValue);\n } else {\n result[entryKey] = toPlainText(inlineValue);\n }\n }\n continue;\n }\n\n if (tablePrefixInList && tableTarget) {\n tableTarget[key] = toPlainText(normalized);\n continue;\n }\n\n result[fullKey] = toPlainText(normalized);\n }\n\n flattenArrayTables(result);\n\n return result;\n}\n","import { parseDocument } from \"yaml\";\nimport { parseTomlFrontmatter } from \"./toml-simple\";\nimport type { FrontmatterType, ParsedMarkdown } from \"./types\";\n\nconst FENCE_TO_TYPE: Record<string, FrontmatterType> = {\n \"---\": \"yaml\",\n \"+++\": \"toml\",\n \";;;\": \"json\",\n};\n\nfunction normalizeNewlines(input: string): string {\n return input.replace(/\\r\\n/g, \"\\n\");\n}\n\nfunction stripBom(line: string): string {\n return line.startsWith(\"\\uFEFF\") ? line.slice(1) : line;\n}\n\nfunction getFenceType(line: string): FrontmatterType | null {\n const match = line.match(/^[\\t ]*(---|\\+\\+\\+|;;;)[\\t ]*$/);\n if (!match) {\n return null;\n }\n return FENCE_TO_TYPE[match[1] ?? \"\"] ?? null;\n}\n\nfunction parseFrontmatter(frontmatter: string, type: FrontmatterType | null): Record<string, unknown> | null {\n if (!type) {\n return null;\n }\n\n if (type === \"json\") {\n try {\n return JSON.parse(frontmatter) as Record<string, unknown>;\n } catch {\n return null;\n }\n }\n\n if (type === \"yaml\") {\n const doc = parseDocument(frontmatter, { prettyErrors: false });\n if (doc.errors.length > 0) {\n return null;\n }\n const data = doc.toJSON();\n if (!data || typeof data !== \"object\" || Array.isArray(data)) {\n return null;\n }\n return data as Record<string, unknown>;\n }\n\n if (type === \"toml\") {\n return parseTomlFrontmatter(frontmatter);\n }\n\n return null;\n}\n\nfunction extractJsonBlock(text: string, startIndex: number): { jsonText: string; endIndex: number } | null {\n let depth = 0;\n let inString = false;\n let escaped = false;\n\n for (let i = startIndex; i < text.length; i += 1) {\n const char = text[i] ?? \"\";\n\n if (inString) {\n if (escaped) {\n escaped = false;\n continue;\n }\n\n if (char === \"\\\\\") {\n escaped = true;\n continue;\n }\n\n if (char === \"\\\"\") {\n inString = false;\n }\n\n continue;\n }\n\n if (char === \"\\\"\") {\n inString = true;\n continue;\n }\n\n if (char === \"{\") {\n depth += 1;\n continue;\n }\n\n if (char === \"}\") {\n depth -= 1;\n if (depth === 0) {\n const jsonText = text.slice(startIndex, i + 1);\n return { jsonText, endIndex: i };\n }\n }\n }\n\n return null;\n}\n\nexport function parseMarkdown(input: string): ParsedMarkdown {\n const normalized = normalizeNewlines(input);\n const lines = normalized.split(\"\\n\");\n if (lines.length === 0) {\n return { frontmatter: null, content: normalized, data: null, frontmatterType: null };\n }\n\n lines[0] = stripBom(lines[0] ?? \"\");\n const normalizedWithoutBom = lines.join(\"\\n\");\n\n const openingType = getFenceType(lines[0] ?? \"\");\n if (!openingType) {\n const leadingWhitespace = normalizedWithoutBom.match(/^[\\t \\n]*/)?.[0] ?? \"\";\n const jsonStart = leadingWhitespace.length;\n if (normalizedWithoutBom[jsonStart] !== \"{\") {\n return { frontmatter: null, content: normalizedWithoutBom, data: null, frontmatterType: null };\n }\n\n const jsonBlock = extractJsonBlock(normalizedWithoutBom, jsonStart);\n if (!jsonBlock) {\n return { frontmatter: null, content: normalizedWithoutBom, data: null, frontmatterType: null };\n }\n\n const frontmatter = jsonBlock.jsonText;\n let content = normalizedWithoutBom.slice(jsonBlock.endIndex + 1);\n if (content.startsWith(\"\\n\")) {\n content = content.slice(1);\n }\n const data = parseFrontmatter(frontmatter, \"json\");\n if (!data) {\n return { frontmatter: null, content: normalizedWithoutBom, data: null, frontmatterType: null };\n }\n\n return {\n frontmatter,\n content,\n data,\n frontmatterType: \"json\",\n };\n }\n\n let closingIndex = -1;\n for (let i = 1; i < lines.length; i += 1) {\n if (getFenceType(lines[i] ?? \"\") === openingType) {\n closingIndex = i;\n break;\n }\n }\n\n if (closingIndex === -1) {\n return { frontmatter: null, content: normalizedWithoutBom, data: null, frontmatterType: null };\n }\n\n const frontmatter = lines.slice(1, closingIndex).join(\"\\n\");\n const content = lines.slice(closingIndex + 1).join(\"\\n\");\n const data = parseFrontmatter(frontmatter, openingType);\n\n return {\n frontmatter,\n content,\n data,\n frontmatterType: openingType,\n };\n}\n","const segmenterCache = new Map<string, Intl.Segmenter>();\nconst graphemeSegmenterCache = new Map<string, Intl.Segmenter>();\n\nexport function getSegmenter(locale: string): Intl.Segmenter {\n const cached = segmenterCache.get(locale);\n if (cached) {\n return cached;\n }\n const segmenter = new Intl.Segmenter(locale, { granularity: \"word\" });\n segmenterCache.set(locale, segmenter);\n return segmenter;\n}\n\nexport function getGraphemeSegmenter(locale: string): Intl.Segmenter {\n const cached = graphemeSegmenterCache.get(locale);\n if (cached) {\n return cached;\n }\n const segmenter = new Intl.Segmenter(locale, { granularity: \"grapheme\" });\n graphemeSegmenterCache.set(locale, segmenter);\n return segmenter;\n}\n\nfunction supportsSegmenter(): boolean {\n return typeof Intl !== \"undefined\" && typeof Intl.Segmenter === \"function\";\n}\n\nexport function countWordsForLocale(text: string, locale: string): number {\n const segmenter = getSegmenter(locale);\n let count = 0;\n for (const segment of segmenter.segment(text)) {\n if (segment.isWordLike) {\n count++;\n }\n }\n return count;\n}\n\nexport function countCharsForLocale(text: string, locale: string): number {\n if (!supportsSegmenter()) {\n return Array.from(text).length;\n }\n const segmenter = getGraphemeSegmenter(locale);\n let count = 0;\n for (const _segment of segmenter.segment(text)) {\n count++;\n }\n return count;\n}\n","export function appendAll<T>(target: T[], source: readonly T[]): void {\n for (const item of source) {\n target.push(item);\n }\n}\n","import type { NonWordCollection, WhitespaceCounts } from \"./types\";\nimport { appendAll } from \"../utils/append-all\";\n\nconst emojiRegex = /(?:\\p{Extended_Pictographic}|\\p{Emoji_Presentation})/u;\nconst emojiPresentationRegex = /\\p{Emoji_Presentation}/u;\nconst keycapEmojiRegex = /[0-9#*]\\uFE0F?\\u20E3/u;\nconst symbolRegex = /\\p{S}/u;\nconst punctuationRegex = /\\p{P}/u;\nconst whitespaceRegex = /\\s/u;\nconst newlineChars = new Set([\"\\n\", \"\\r\", \"\\u2028\", \"\\u2029\"]);\n\nexport function createNonWordCollection(): NonWordCollection {\n return {\n emoji: [],\n symbols: [],\n punctuation: [],\n counts: {\n emoji: 0,\n symbols: 0,\n punctuation: 0,\n },\n };\n}\n\nexport function addNonWord(\n collection: NonWordCollection,\n category: \"emoji\" | \"symbol\" | \"punctuation\",\n segment: string,\n): void {\n if (category === \"emoji\") {\n collection.emoji.push(segment);\n collection.counts.emoji += 1;\n return;\n }\n if (category === \"symbol\") {\n collection.symbols.push(segment);\n collection.counts.symbols += 1;\n return;\n }\n collection.punctuation.push(segment);\n collection.counts.punctuation += 1;\n}\n\nexport function addWhitespace(\n collection: NonWordCollection,\n segment: string,\n): number {\n let whitespace = collection.whitespace;\n let count = 0;\n for (const char of segment) {\n if (char === \" \") {\n whitespace = whitespace ?? createWhitespaceCounts();\n whitespace.spaces += 1;\n count += 1;\n continue;\n }\n if (char === \"\\t\") {\n whitespace = whitespace ?? createWhitespaceCounts();\n whitespace.tabs += 1;\n count += 1;\n continue;\n }\n if (newlineChars.has(char)) {\n whitespace = whitespace ?? createWhitespaceCounts();\n whitespace.newlines += 1;\n count += 1;\n continue;\n }\n if (whitespaceRegex.test(char)) {\n whitespace = whitespace ?? createWhitespaceCounts();\n whitespace.other += 1;\n count += 1;\n }\n }\n\n if (count > 0) {\n collection.whitespace = whitespace ?? createWhitespaceCounts();\n collection.counts.whitespace = (collection.counts.whitespace ?? 0) + count;\n }\n\n return count;\n}\n\nexport function classifyNonWordSegment(\n segment: string,\n): \"emoji\" | \"symbol\" | \"punctuation\" | null {\n const hasEmojiVariationSelector = segment.includes(\"\\uFE0F\");\n if (\n keycapEmojiRegex.test(segment) ||\n emojiPresentationRegex.test(segment) ||\n (hasEmojiVariationSelector && emojiRegex.test(segment))\n ) {\n return \"emoji\";\n }\n if (symbolRegex.test(segment)) {\n return \"symbol\";\n }\n if (punctuationRegex.test(segment)) {\n return \"punctuation\";\n }\n return null;\n}\n\nexport function mergeNonWordCollections(\n target: NonWordCollection,\n source: NonWordCollection,\n): NonWordCollection {\n if (source.counts.emoji > 0) {\n appendAll(target.emoji, source.emoji);\n target.counts.emoji += source.counts.emoji;\n }\n if (source.counts.symbols > 0) {\n appendAll(target.symbols, source.symbols);\n target.counts.symbols += source.counts.symbols;\n }\n if (source.counts.punctuation > 0) {\n appendAll(target.punctuation, source.punctuation);\n target.counts.punctuation += source.counts.punctuation;\n }\n if (source.counts.whitespace && source.counts.whitespace > 0 && source.whitespace) {\n const whitespace = target.whitespace ?? createWhitespaceCounts();\n whitespace.spaces += source.whitespace.spaces;\n whitespace.tabs += source.whitespace.tabs;\n whitespace.newlines += source.whitespace.newlines;\n whitespace.other += source.whitespace.other;\n target.whitespace = whitespace;\n target.counts.whitespace = (target.counts.whitespace ?? 0) + source.counts.whitespace;\n }\n return target;\n}\n\nfunction createWhitespaceCounts(): WhitespaceCounts {\n return { spaces: 0, tabs: 0, newlines: 0, other: 0 };\n}\n","import { countCharsForLocale, getSegmenter } from \"./segmenter\";\nimport {\n addNonWord,\n addWhitespace,\n classifyNonWordSegment,\n createNonWordCollection,\n} from \"./non-words\";\nimport { appendAll } from \"../utils/append-all\";\nimport type {\n ChunkAnalysis,\n CollectorBreakdown,\n LocaleChunk,\n NonWordCollection,\n} from \"./types\";\n\ntype CharAnalysis = LocaleChunk & { chars: number; nonWords?: NonWordCollection };\n\nexport function analyzeChunk(\n chunk: LocaleChunk,\n collectNonWords?: boolean,\n includeWhitespace?: boolean,\n): ChunkAnalysis {\n const segmenter = getSegmenter(chunk.locale);\n const segments: string[] = [];\n const nonWords: NonWordCollection | null = collectNonWords\n ? createNonWordCollection()\n : null;\n for (const part of segmenter.segment(chunk.text)) {\n if (part.isWordLike) {\n segments.push(part.segment);\n } else if (collectNonWords && nonWords) {\n if (includeWhitespace) {\n addWhitespace(nonWords, part.segment);\n }\n const category = classifyNonWordSegment(part.segment);\n if (category) {\n addNonWord(nonWords, category, part.segment);\n }\n }\n }\n return {\n locale: chunk.locale,\n text: chunk.text,\n segments,\n words: segments.length,\n nonWords: nonWords ?? undefined,\n };\n}\n\nexport function analyzeCharChunk(\n chunk: LocaleChunk,\n collectNonWords?: boolean,\n includeWhitespace?: boolean,\n): CharAnalysis & { wordChars: number; nonWordChars: number } {\n const segmenter = getSegmenter(chunk.locale);\n const nonWords: NonWordCollection | null = collectNonWords\n ? createNonWordCollection()\n : null;\n let chars = 0;\n let wordChars = 0;\n let nonWordChars = 0;\n\n for (const part of segmenter.segment(chunk.text)) {\n if (part.isWordLike) {\n const count = countCharsForLocale(part.segment, chunk.locale);\n chars += count;\n wordChars += count;\n continue;\n }\n\n if (collectNonWords && nonWords) {\n let whitespaceCount = 0;\n if (includeWhitespace) {\n whitespaceCount = addWhitespace(nonWords, part.segment);\n }\n const category = classifyNonWordSegment(part.segment);\n if (category) {\n addNonWord(nonWords, category, part.segment);\n }\n if (category || whitespaceCount > 0) {\n const count = countCharsForLocale(part.segment, chunk.locale);\n chars += count;\n nonWordChars += count;\n }\n }\n }\n\n return {\n locale: chunk.locale,\n text: chunk.text,\n chars,\n wordChars,\n nonWordChars,\n nonWords: nonWords ?? undefined,\n };\n}\n\nexport function aggregateByLocale(\n chunks: ChunkAnalysis[]\n): CollectorBreakdown[] {\n const order: string[] = [];\n const map = new Map<string, CollectorBreakdown>();\n\n for (const chunk of chunks) {\n const existing = map.get(chunk.locale);\n if (existing) {\n existing.words += chunk.words;\n appendAll(existing.segments, chunk.segments);\n continue;\n }\n\n order.push(chunk.locale);\n map.set(chunk.locale, {\n locale: chunk.locale,\n words: chunk.words,\n segments: [...chunk.segments],\n });\n }\n\n return order.map((locale) => map.get(locale)!);\n}\n","import type { WordCounterMode } from \"./types\";\n\nconst MODE_ALIASES: Record<string, WordCounterMode> = {\n chunk: \"chunk\",\n chunks: \"chunk\",\n segments: \"segments\",\n segment: \"segments\",\n seg: \"segments\",\n collector: \"collector\",\n collect: \"collector\",\n colle: \"collector\",\n char: \"char\",\n chars: \"char\",\n character: \"char\",\n characters: \"char\",\n};\n\nexport function normalizeMode(input?: string | null): WordCounterMode | null {\n if (!input) {\n return null;\n }\n const normalized = input.trim().toLowerCase();\n return MODE_ALIASES[normalized] ?? null;\n}\n\nexport function resolveMode(\n input?: string | null,\n fallback: WordCounterMode = \"chunk\",\n): WordCounterMode {\n return normalizeMode(input) ?? fallback;\n}\n","export const DEFAULT_LOCALE = \"und-Latn\";\nexport const DEFAULT_HAN_TAG = \"zh-Hani\";\n\nexport interface LocaleDetectOptions {\n latinLanguageHint?: string;\n latinTagHint?: string;\n latinLocaleHint?: string;\n hanLanguageHint?: string;\n hanTagHint?: string;\n}\n\nconst regex = {\n hiragana: /\\p{Script=Hiragana}/u,\n katakana: /\\p{Script=Katakana}/u,\n hangul: /\\p{Script=Hangul}/u,\n han: /\\p{Script=Han}/u,\n latin: /\\p{Script=Latin}/u,\n arabic: /\\p{Script=Arabic}/u,\n cyrillic: /\\p{Script=Cyrillic}/u,\n devanagari: /\\p{Script=Devanagari}/u,\n thai: /\\p{Script=Thai}/u,\n};\n\nconst latinLocaleHints: Array<{ locale: string; regex: RegExp }> = [\n { locale: \"de\", regex: /[äöüÄÖÜß]/ },\n { locale: \"es\", regex: /[ñÑ¿¡]/ },\n { locale: \"pt\", regex: /[ãõÃÕ]/ },\n { locale: \"fr\", regex: /[œŒæÆ]/ },\n];\n\nconst latinLocales = new Set<string>([\n DEFAULT_LOCALE,\n ...latinLocaleHints.map((hint) => hint.locale),\n]);\n\nexport function isLatinLocale(locale: string): boolean {\n return latinLocales.has(locale);\n}\n\nfunction detectLatinLocale(char: string): string {\n for (const hint of latinLocaleHints) {\n if (hint.regex.test(char)) {\n return hint.locale;\n }\n }\n return DEFAULT_LOCALE;\n}\n\nfunction resolveLatinHint(options: LocaleDetectOptions): string | undefined {\n const latinTagHint = options.latinTagHint?.trim();\n if (latinTagHint) {\n return latinTagHint;\n }\n\n const latinLanguageHint = options.latinLanguageHint?.trim();\n if (latinLanguageHint) {\n return latinLanguageHint;\n }\n\n const latinLocaleHint = options.latinLocaleHint?.trim();\n if (latinLocaleHint) {\n return latinLocaleHint;\n }\n\n return undefined;\n}\n\nfunction resolveHanHint(options: LocaleDetectOptions): string | undefined {\n const hanTagHint = options.hanTagHint?.trim();\n if (hanTagHint) {\n return hanTagHint;\n }\n\n const hanLanguageHint = options.hanLanguageHint?.trim();\n if (hanLanguageHint) {\n return hanLanguageHint;\n }\n\n return undefined;\n}\n\nexport function detectLocaleForChar(\n char: string,\n previousLocale?: string | null,\n options: LocaleDetectOptions = {}\n): string | null {\n if (regex.hiragana.test(char) || regex.katakana.test(char)) {\n return \"ja\";\n }\n if (regex.hangul.test(char)) {\n return \"ko\";\n }\n if (regex.arabic.test(char)) {\n return \"ar\";\n }\n if (regex.cyrillic.test(char)) {\n return \"ru\";\n }\n if (regex.devanagari.test(char)) {\n return \"hi\";\n }\n if (regex.thai.test(char)) {\n return \"th\";\n }\n\n if (regex.han.test(char)) {\n if (previousLocale && previousLocale.startsWith(\"ja\")) {\n return previousLocale;\n }\n return resolveHanHint(options) ?? DEFAULT_HAN_TAG;\n }\n\n if (regex.latin.test(char)) {\n const hintedLocale = detectLatinLocale(char);\n if (hintedLocale !== DEFAULT_LOCALE) {\n return hintedLocale;\n }\n if (previousLocale && isLatinLocale(previousLocale) && previousLocale !== DEFAULT_LOCALE) {\n return previousLocale;\n }\n const latinHint = resolveLatinHint(options);\n if (latinHint) {\n return latinHint;\n }\n return DEFAULT_LOCALE;\n }\n\n return null;\n}\n","import {\n DEFAULT_LOCALE,\n detectLocaleForChar,\n isLatinLocale,\n type LocaleDetectOptions,\n} from \"./locale-detect\";\nimport type { LocaleChunk } from \"./types\";\n\nexport function segmentTextByLocale(\n text: string,\n options: LocaleDetectOptions = {}\n): LocaleChunk[] {\n const chunks: LocaleChunk[] = [];\n // Keep currentLocale as a non-null string to simplify type-narrowing.\n let currentLocale: string = DEFAULT_LOCALE;\n let buffer = \"\";\n let bufferHasScript = false;\n\n for (const char of text) {\n const detected = detectLocaleForChar(char, currentLocale, options);\n const targetLocale = detected ?? currentLocale;\n\n // If buffer is empty, this is the first character for a new chunk.\n if (buffer === \"\") {\n currentLocale = targetLocale;\n buffer = char;\n bufferHasScript = detected !== null;\n continue;\n }\n\n if (detected !== null && !bufferHasScript) {\n currentLocale = targetLocale;\n buffer += char;\n bufferHasScript = true;\n continue;\n }\n\n if (targetLocale !== currentLocale && detected !== null) {\n if (currentLocale === DEFAULT_LOCALE && isLatinLocale(targetLocale)) {\n currentLocale = targetLocale;\n buffer += char;\n bufferHasScript = true;\n continue;\n }\n // currentLocale is guaranteed to be a string here.\n chunks.push({ locale: currentLocale, text: buffer });\n currentLocale = targetLocale;\n buffer = char;\n bufferHasScript = true;\n continue;\n }\n\n buffer += char;\n if (detected !== null) {\n bufferHasScript = true;\n }\n }\n\n if (buffer.length > 0) {\n chunks.push({ locale: currentLocale, text: buffer });\n }\n\n return mergeAdjacentChunks(chunks);\n}\n\nfunction mergeAdjacentChunks(chunks: LocaleChunk[]): LocaleChunk[] {\n if (chunks.length === 0) {\n return chunks;\n }\n\n const merged: LocaleChunk[] = [];\n // We already returned for empty arrays above, so the first element is present.\n let last = chunks[0]!;\n\n for (let i = 1; i < chunks.length; i++) {\n const chunk = chunks[i]!;\n if (chunk.locale === last.locale) {\n last = { locale: last.locale, text: last.text + chunk.text };\n } else {\n merged.push(last);\n last = chunk;\n }\n }\n\n merged.push(last);\n return merged;\n}\n","import { analyzeCharChunk, analyzeChunk, aggregateByLocale } from \"./analyze\";\nimport { resolveMode } from \"./mode\";\nimport { segmentTextByLocale } from \"./segment\";\nimport { countCharsForLocale, countWordsForLocale } from \"./segmenter\";\nimport { createNonWordCollection, mergeNonWordCollections } from \"./non-words\";\nimport type {\n CharBreakdown,\n ChunkBreakdown,\n ChunkWithSegments,\n NonWordCollection,\n WordCounterMode,\n WordCounterOptions,\n WordCounterResult,\n} from \"./types\";\n\nexport type {\n NonWordCollection,\n WordCounterMode,\n WordCounterOptions,\n WordCounterResult,\n WordCounterBreakdown,\n} from \"./types\";\n\nexport { countCharsForLocale, countWordsForLocale, segmentTextByLocale };\n\nexport function wordCounter(\n text: string,\n options: WordCounterOptions = {}\n): WordCounterResult {\n const mode: WordCounterMode = resolveMode(options.mode, \"chunk\");\n const collectNonWords = Boolean(options.nonWords);\n const includeWhitespace = Boolean(options.includeWhitespace);\n const chunks = segmentTextByLocale(text, {\n latinLanguageHint: options.latinLanguageHint,\n latinTagHint: options.latinTagHint,\n latinLocaleHint: options.latinLocaleHint,\n hanLanguageHint: options.hanLanguageHint,\n hanTagHint: options.hanTagHint,\n });\n\n if (mode === \"char\") {\n const analyzed = chunks.map((chunk) =>\n analyzeCharChunk(chunk, collectNonWords, includeWhitespace),\n );\n const total = analyzed.reduce((sum, chunk) => sum + chunk.chars, 0);\n const items: CharBreakdown[] = analyzed.map((chunk) => ({\n locale: chunk.locale,\n text: chunk.text,\n chars: chunk.chars,\n nonWords: chunk.nonWords,\n }));\n const counts = collectNonWords\n ? {\n words: analyzed.reduce((sum, chunk) => sum + chunk.wordChars, 0),\n nonWords: analyzed.reduce((sum, chunk) => sum + chunk.nonWordChars, 0),\n total,\n }\n : undefined;\n return {\n total,\n counts,\n breakdown: {\n mode,\n items,\n },\n };\n }\n\n const analyzed = chunks.map((chunk) =>\n analyzeChunk(chunk, collectNonWords, includeWhitespace),\n );\n const wordsTotal = analyzed.reduce((sum, chunk) => sum + chunk.words, 0);\n const nonWordsTotal = collectNonWords\n ? analyzed.reduce((sum, chunk) => {\n if (!chunk.nonWords) {\n return sum;\n }\n return sum + getNonWordTotal(chunk.nonWords);\n }, 0)\n : 0;\n const total = analyzed.reduce((sum, chunk) => {\n let chunkTotal = chunk.words;\n if (collectNonWords && chunk.nonWords) {\n chunkTotal += getNonWordTotal(chunk.nonWords);\n }\n return sum + chunkTotal;\n }, 0);\n\n const counts = collectNonWords ? { words: wordsTotal, nonWords: nonWordsTotal, total } : undefined;\n\n if (mode === \"segments\") {\n const items: ChunkWithSegments[] = analyzed.map((chunk) => ({\n locale: chunk.locale,\n text: chunk.text,\n words: chunk.words,\n segments: chunk.segments,\n nonWords: chunk.nonWords,\n }));\n return {\n total,\n counts,\n breakdown: {\n mode,\n items,\n },\n };\n }\n\n if (mode === \"collector\") {\n const items = aggregateByLocale(analyzed);\n const nonWords = collectNonWordsAggregate(analyzed, collectNonWords);\n return {\n total,\n counts,\n breakdown: {\n mode,\n items,\n nonWords,\n },\n };\n }\n\n const items: ChunkBreakdown[] = analyzed.map((chunk) => ({\n locale: chunk.locale,\n text: chunk.text,\n words: chunk.words,\n nonWords: chunk.nonWords,\n }));\n\n return {\n total,\n counts,\n breakdown: {\n mode,\n items,\n },\n };\n}\n\nfunction getNonWordTotal(nonWords: NonWordCollection): number {\n return (\n nonWords.counts.emoji +\n nonWords.counts.symbols +\n nonWords.counts.punctuation +\n (nonWords.counts.whitespace ?? 0)\n );\n}\n\n\nfunction collectNonWordsAggregate(\n analyzed: Array<{ nonWords?: NonWordCollection }>,\n enabled: boolean,\n): NonWordCollection | undefined {\n if (!enabled) {\n return undefined;\n }\n const collection = createNonWordCollection();\n for (const chunk of analyzed) {\n if (!chunk.nonWords) {\n continue;\n }\n mergeNonWordCollections(collection, chunk.nonWords);\n }\n return collection;\n}\n","import { wordCounter } from \"./wc\";\n\nexport default wordCounter;\nexport { countCharsForLocale, countWordsForLocale, segmentTextByLocale } from \"./wc\";\nexport type {\n NonWordCollection,\n WordCounterMode,\n WordCounterOptions,\n WordCounterResult,\n WordCounterBreakdown,\n} from \"./wc\";\n","import type { WordCounterMode, WordCounterOptions, WordCounterResult } from \"../wc/types\";\nimport wordCounter from \"../wc\";\nimport { parseMarkdown } from \"./parse-markdown\";\nimport type { SectionMode, SectionedResult } from \"./types\";\n\nfunction normalizeText(value: unknown): string {\n if (value == null) {\n return \"\";\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction buildPerKeyItems(\n data: Record<string, unknown> | null,\n mode: WordCounterMode,\n options: WordCounterOptions,\n): Array<{ name: string; source: \"frontmatter\"; result: WordCounterResult }> {\n if (!data || typeof data !== \"object\" || Array.isArray(data)) {\n return [];\n }\n\n return Object.entries(data).map(([key, value]) => {\n const valueText = normalizeText(value);\n const text = valueText ? `${key}: ${valueText}` : key;\n return {\n name: key,\n source: \"frontmatter\",\n result: wordCounter(text, options),\n };\n });\n}\n\nfunction buildSingleItem(\n name: string,\n text: string,\n mode: WordCounterMode,\n options: WordCounterOptions,\n source: \"frontmatter\" | \"content\",\n) {\n return [{ name, source, result: wordCounter(text, options) }];\n}\n\nfunction sumTotals(items: Array<{ result: WordCounterResult }>): number {\n return items.reduce((sum, item) => sum + item.result.total, 0);\n}\n\nexport function countSections(\n input: string,\n section: SectionMode,\n options: WordCounterOptions = {},\n): SectionedResult {\n const mode: WordCounterMode = options.mode ?? \"chunk\";\n if (section === \"all\") {\n const result = wordCounter(input, options);\n return {\n section,\n total: result.total,\n frontmatterType: null,\n items: [{ name: \"all\", source: \"content\", result }],\n };\n }\n\n const parsed = parseMarkdown(input);\n const frontmatterText = parsed.frontmatter ?? \"\";\n const contentText = parsed.content ?? \"\";\n\n let items: Array<{ name: string; source: \"frontmatter\" | \"content\"; result: WordCounterResult }> = [];\n\n if (section === \"frontmatter\") {\n items = buildSingleItem(\"frontmatter\", frontmatterText, mode, options, \"frontmatter\");\n } else if (section === \"content\") {\n items = buildSingleItem(\"content\", contentText, mode, options, \"content\");\n } else if (section === \"split\") {\n items = [\n ...buildSingleItem(\"frontmatter\", frontmatterText, mode, options, \"frontmatter\"),\n ...buildSingleItem(\"content\", contentText, mode, options, \"content\"),\n ];\n } else if (section === \"per-key\") {\n items = buildPerKeyItems(parsed.data, mode, options);\n } else if (section === \"split-per-key\") {\n items = [\n ...buildPerKeyItems(parsed.data, mode, options),\n ...buildSingleItem(\"content\", contentText, mode, options, \"content\"),\n ];\n }\n\n return {\n section,\n total: sumTotals(items),\n frontmatterType: parsed.frontmatterType,\n items,\n };\n}\n","import { extname } from \"node:path\";\n\nexport type DirectoryExtensionFilter = {\n includeExtensions: Set<string>;\n excludeExtensions: Set<string>;\n effectiveIncludeExtensions: Set<string>;\n};\n\nexport const DEFAULT_INCLUDE_EXTENSIONS = new Set([\n \".md\",\n \".markdown\",\n \".mdx\",\n \".mdc\",\n \".txt\",\n]);\n\nexport function collectExtensionOption(value: string, previous: string[] = []): string[] {\n return [...previous, value];\n}\n\nexport function normalizeExtensionToken(value: string): string | null {\n const trimmed = value.trim().toLowerCase();\n if (!trimmed) {\n return null;\n }\n\n const normalized = trimmed.startsWith(\".\") ? trimmed : `.${trimmed}`;\n if (normalized === \".\") {\n return null;\n }\n\n return normalized;\n}\n\nfunction parseExtensionValues(values: string[] | undefined): Set<string> {\n const parsed = new Set<string>();\n if (!values || values.length === 0) {\n return parsed;\n }\n\n for (const value of values) {\n for (const token of value.split(\",\")) {\n const normalized = normalizeExtensionToken(token);\n if (!normalized) {\n continue;\n }\n parsed.add(normalized);\n }\n }\n\n return parsed;\n}\n\nexport function buildDirectoryExtensionFilter(\n includeValues: string[] | undefined,\n excludeValues: string[] | undefined,\n): DirectoryExtensionFilter {\n const includeFromFlags = parseExtensionValues(includeValues);\n const excludeExtensions = parseExtensionValues(excludeValues);\n\n const includeExtensions =\n includeFromFlags.size > 0 ? includeFromFlags : new Set(DEFAULT_INCLUDE_EXTENSIONS);\n\n const effectiveIncludeExtensions = new Set<string>();\n for (const extension of includeExtensions) {\n if (excludeExtensions.has(extension)) {\n continue;\n }\n effectiveIncludeExtensions.add(extension);\n }\n\n return {\n includeExtensions,\n excludeExtensions,\n effectiveIncludeExtensions,\n };\n}\n\nexport function shouldIncludeFromDirectory(\n filePath: string,\n filter: DirectoryExtensionFilter,\n): boolean {\n const extension = extname(filePath).toLowerCase();\n return filter.effectiveIncludeExtensions.has(extension);\n}\n","import { readFile } from \"node:fs/promises\";\nimport type { BatchFileInput, BatchSkip } from \"../types\";\n\nexport function isProbablyBinary(buffer: Buffer): boolean {\n if (buffer.length === 0) {\n return false;\n }\n\n const sampleSize = Math.min(buffer.length, 1024);\n let suspicious = 0;\n\n for (let index = 0; index < sampleSize; index += 1) {\n const byte = buffer[index] ?? 0;\n\n if (byte === 0) {\n return true;\n }\n\n if (byte === 9 || byte === 10 || byte === 13) {\n continue;\n }\n\n if (byte >= 32 && byte <= 126) {\n continue;\n }\n\n if (byte >= 128) {\n continue;\n }\n\n suspicious += 1;\n }\n\n return suspicious / sampleSize > 0.3;\n}\n\nexport async function loadBatchInputs(\n filePaths: string[],\n): Promise<{ files: BatchFileInput[]; skipped: BatchSkip[] }> {\n const files: BatchFileInput[] = [];\n const skipped: BatchSkip[] = [];\n\n for (const filePath of filePaths) {\n let buffer: Buffer;\n try {\n buffer = await readFile(filePath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n skipped.push({ path: filePath, reason: `not readable: ${message}` });\n continue;\n }\n\n if (isProbablyBinary(buffer)) {\n skipped.push({ path: filePath, reason: \"binary file\" });\n continue;\n }\n\n files.push({\n path: filePath,\n content: buffer.toString(\"utf8\"),\n });\n }\n\n return { files, skipped };\n}\n","import { type Dirent } from \"node:fs\";\nimport { readdir, stat } from \"node:fs/promises\";\nimport { resolve as resolvePath } from \"node:path\";\nimport { appendAll } from \"../../utils/append-all\";\nimport type { BatchSkip, PathMode } from \"../types\";\nimport {\n buildDirectoryExtensionFilter,\n type DirectoryExtensionFilter,\n shouldIncludeFromDirectory,\n} from \"./filter\";\n\ntype ResolveBatchFilePathOptions = {\n pathMode: PathMode;\n recursive: boolean;\n extensionFilter?: DirectoryExtensionFilter;\n};\n\nasync function expandDirectory(\n directoryPath: string,\n recursive: boolean,\n filter: DirectoryExtensionFilter,\n skipped: BatchSkip[],\n): Promise<string[]> {\n let entries: Dirent[];\n try {\n entries = await readdir(directoryPath, { withFileTypes: true, encoding: \"utf8\" });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n skipped.push({ path: directoryPath, reason: `directory read failed: ${message}` });\n return [];\n }\n\n const sortedEntries = entries.slice().sort((left, right) => left.name.localeCompare(right.name));\n const files: string[] = [];\n\n for (const entry of sortedEntries) {\n const entryPath = resolvePath(directoryPath, entry.name);\n\n if (entry.isFile()) {\n if (!shouldIncludeFromDirectory(entryPath, filter)) {\n skipped.push({ path: entryPath, reason: \"extension excluded\" });\n continue;\n }\n\n files.push(entryPath);\n continue;\n }\n\n if (!entry.isDirectory() || !recursive) {\n continue;\n }\n\n const nestedFiles = await expandDirectory(entryPath, recursive, filter, skipped);\n appendAll(files, nestedFiles);\n }\n\n return files;\n}\n\nexport async function resolveBatchFilePaths(\n pathInputs: string[],\n options: ResolveBatchFilePathOptions,\n): Promise<{ files: string[]; skipped: BatchSkip[] }> {\n const skipped: BatchSkip[] = [];\n const resolvedFiles = new Set<string>();\n const extensionFilter =\n options.extensionFilter ?? buildDirectoryExtensionFilter(undefined, undefined);\n\n for (const rawPath of pathInputs) {\n const targetPath = resolvePath(rawPath);\n let metadata: Awaited<ReturnType<typeof stat>>;\n\n try {\n metadata = await stat(targetPath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n skipped.push({ path: targetPath, reason: `not readable: ${message}` });\n continue;\n }\n\n if (metadata.isDirectory() && options.pathMode === \"auto\") {\n const files = await expandDirectory(targetPath, options.recursive, extensionFilter, skipped);\n for (const file of files) {\n resolvedFiles.add(file);\n }\n continue;\n }\n\n if (!metadata.isFile()) {\n skipped.push({ path: targetPath, reason: \"not a regular file\" });\n continue;\n }\n\n resolvedFiles.add(targetPath);\n }\n\n const files = [...resolvedFiles].sort((left, right) => left.localeCompare(right));\n\n return { files, skipped };\n}\n","export type ProgressOutputStream = {\n isTTY?: boolean;\n write: (chunk: string) => unknown;\n};\n\nexport type BatchProgressSnapshot = {\n completed: number;\n total: number;\n};\n\nexport type BatchProgressReporter = {\n enabled: boolean;\n start: (total: number, startedAtMs?: number) => void;\n advance: (snapshot: BatchProgressSnapshot) => void;\n startFinalizing: () => void;\n finish: () => void;\n};\n\ntype BatchProgressReporterOptions = {\n enabled: boolean;\n stream: ProgressOutputStream;\n clearOnFinish?: boolean;\n};\n\nconst PROGRESS_BAR_WIDTH = 20;\nconst FILLED_BAR_CHAR = \"█\";\nconst EMPTY_BAR_CHAR = \"░\";\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction buildProgressBar(completed: number, total: number): string {\n const safeTotal = Math.max(total, 1);\n const ratio = clamp(completed / safeTotal, 0, 1);\n const filled = completed >= safeTotal ? PROGRESS_BAR_WIDTH : Math.floor(ratio * PROGRESS_BAR_WIDTH);\n const empty = PROGRESS_BAR_WIDTH - filled;\n return `${FILLED_BAR_CHAR.repeat(filled)}${EMPTY_BAR_CHAR.repeat(empty)}`;\n}\n\nfunction formatElapsed(startedAtMs: number): string {\n const elapsedMs = Date.now() - startedAtMs;\n const totalSeconds = Math.max(0, Math.floor(elapsedMs / 1000));\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n const tenths = Math.floor((Math.max(0, elapsedMs) % 1000) / 100);\n return `${String(minutes).padStart(2, \"0\")}:${String(seconds).padStart(2, \"0\")}.${tenths}`;\n}\n\nfunction buildProgressLine(completed: number, total: number, startedAtMs: number): string {\n const safeTotal = Math.max(total, 1);\n const percent = completed >= safeTotal ? 100 : Math.floor((completed / safeTotal) * 100);\n const bar = buildProgressBar(completed, safeTotal);\n const percentText = `${String(percent).padStart(3, \" \")}%`;\n const completedText = String(completed).padStart(String(safeTotal).length, \" \");\n const elapsed = formatElapsed(startedAtMs);\n return `Counting files [${bar}] ${percentText} ${completedText}/${safeTotal} elapsed ${elapsed}`;\n}\n\nfunction buildFinalizingLine(startedAtMs: number): string {\n const elapsed = formatElapsed(startedAtMs);\n return `Finalizing aggregate... elapsed ${elapsed}`;\n}\n\nexport function createBatchProgressReporter(\n options: BatchProgressReporterOptions,\n): BatchProgressReporter {\n const enabled = options.enabled;\n const isTTY = Boolean(options.stream.isTTY);\n const clearOnFinish = options.clearOnFinish ?? true;\n let active = false;\n let total = 0;\n let lastLineLength = 0;\n let startedAtMs = 0;\n let lastRenderedPercent = -1;\n let finalizingStarted = false;\n\n const writeTTYLine = (line: string): void => {\n const trailingPadding =\n lastLineLength > line.length ? \" \".repeat(lastLineLength - line.length) : \"\";\n options.stream.write(`\\r${line}${trailingPadding}`);\n lastLineLength = line.length;\n };\n\n const render = (completed: number): void => {\n const line = buildProgressLine(completed, total, startedAtMs);\n const safeTotal = Math.max(total, 1);\n const percent = completed >= safeTotal ? 100 : Math.floor((completed / safeTotal) * 100);\n if (!isTTY && percent === lastRenderedPercent && completed < safeTotal) {\n return;\n }\n\n lastRenderedPercent = percent;\n\n if (isTTY) {\n writeTTYLine(line);\n return;\n }\n\n lastLineLength = line.length;\n options.stream.write(`${line}\\n`);\n };\n\n const clearLine = (): void => {\n if (lastLineLength === 0) {\n return;\n }\n options.stream.write(`\\r${\" \".repeat(lastLineLength)}\\r`);\n lastLineLength = 0;\n };\n\n return {\n enabled,\n start(nextTotal, nextStartedAtMs) {\n if (!enabled || nextTotal <= 1) {\n return;\n }\n\n total = nextTotal;\n active = true;\n startedAtMs = nextStartedAtMs ?? Date.now();\n lastRenderedPercent = -1;\n finalizingStarted = false;\n render(0);\n },\n advance(snapshot) {\n if (!active) {\n return;\n }\n\n render(snapshot.completed);\n },\n startFinalizing() {\n if (!active || finalizingStarted) {\n return;\n }\n\n finalizingStarted = true;\n const line = buildFinalizingLine(startedAtMs);\n if (isTTY) {\n if (!clearOnFinish) {\n options.stream.write(`\\n${line}`);\n lastLineLength = line.length;\n return;\n }\n writeTTYLine(line);\n return;\n }\n\n lastLineLength = line.length;\n options.stream.write(`${line}\\n`);\n },\n finish() {\n if (!active) {\n return;\n }\n\n if (isTTY) {\n if (clearOnFinish) {\n clearLine();\n } else {\n options.stream.write(\"\\n\");\n }\n }\n active = false;\n },\n };\n}\n","import { countSections } from \"../../markdown\";\nimport type { SectionMode, SectionedResult } from \"../../markdown\";\nimport { appendAll } from \"../../utils/append-all\";\nimport wordCounter, { type NonWordCollection, type WordCounterResult } from \"../../wc\";\nimport { createNonWordCollection, mergeNonWordCollections } from \"../../wc/non-words\";\nimport type { BatchFileInput, BatchFileResult, BatchSummary } from \"../types\";\nimport type { BatchProgressSnapshot } from \"../progress/reporter\";\n\ntype BuildBatchSummaryOptions = {\n onFileCounted?: (snapshot: BatchProgressSnapshot) => void;\n onFinalizeStart?: () => void;\n preserveCollectorSegments?: boolean;\n};\n\nfunction mergeWordCounterResult(\n left: WordCounterResult,\n right: WordCounterResult,\n preserveCollectorSegments: boolean,\n): WordCounterResult {\n if (left.breakdown.mode !== right.breakdown.mode) {\n throw new Error(\"Cannot merge different breakdown modes.\");\n }\n\n const total = left.total + right.total;\n const counts =\n left.counts || right.counts\n ? {\n words: (left.counts?.words ?? 0) + (right.counts?.words ?? 0),\n nonWords: (left.counts?.nonWords ?? 0) + (right.counts?.nonWords ?? 0),\n total: (left.counts?.total ?? 0) + (right.counts?.total ?? 0),\n }\n : undefined;\n\n if (left.breakdown.mode === \"chunk\" && right.breakdown.mode === \"chunk\") {\n return {\n total,\n counts,\n breakdown: {\n mode: \"chunk\",\n items: [...left.breakdown.items, ...right.breakdown.items],\n },\n };\n }\n\n if (left.breakdown.mode === \"segments\" && right.breakdown.mode === \"segments\") {\n return {\n total,\n counts,\n breakdown: {\n mode: \"segments\",\n items: [...left.breakdown.items, ...right.breakdown.items],\n },\n };\n }\n\n if (left.breakdown.mode === \"char\" && right.breakdown.mode === \"char\") {\n return {\n total,\n counts,\n breakdown: {\n mode: \"char\",\n items: [...left.breakdown.items, ...right.breakdown.items],\n },\n };\n }\n\n if (left.breakdown.mode === \"collector\" && right.breakdown.mode === \"collector\") {\n const localeOrder: string[] = [];\n const mergedByLocale = new Map<\n string,\n {\n locale: string;\n words: number;\n segments: string[];\n }\n >();\n\n const addItems = (items: typeof left.breakdown.items): void => {\n for (const item of items) {\n const existing = mergedByLocale.get(item.locale);\n if (existing) {\n existing.words += item.words;\n if (preserveCollectorSegments) {\n appendAll(existing.segments, item.segments);\n }\n continue;\n }\n\n localeOrder.push(item.locale);\n mergedByLocale.set(item.locale, {\n locale: item.locale,\n words: item.words,\n segments: preserveCollectorSegments ? [...item.segments] : [],\n });\n }\n };\n\n addItems(left.breakdown.items);\n addItems(right.breakdown.items);\n\n let mergedNonWords: NonWordCollection | undefined;\n if (left.breakdown.nonWords || right.breakdown.nonWords) {\n mergedNonWords = createNonWordCollection();\n if (left.breakdown.nonWords) {\n mergeNonWordCollections(mergedNonWords, left.breakdown.nonWords);\n }\n if (right.breakdown.nonWords) {\n mergeNonWordCollections(mergedNonWords, right.breakdown.nonWords);\n }\n }\n\n return {\n total,\n counts,\n breakdown: {\n mode: \"collector\",\n items: localeOrder.map((locale) => {\n const value = mergedByLocale.get(locale);\n if (!value) {\n throw new Error(`Missing collector entry for locale: ${locale}`);\n }\n return value;\n }),\n nonWords: mergedNonWords,\n },\n };\n }\n\n return {\n total,\n counts,\n breakdown: left.breakdown,\n };\n}\n\nfunction aggregateWordCounterResults(\n results: WordCounterResult[],\n preserveCollectorSegments: boolean,\n): WordCounterResult {\n if (results.length === 0) {\n return wordCounter(\"\", { mode: \"chunk\" });\n }\n\n const first = results[0];\n if (!first) {\n return wordCounter(\"\", { mode: \"chunk\" });\n }\n\n let aggregate = first;\n for (let index = 1; index < results.length; index += 1) {\n const current = results[index];\n if (!current) {\n continue;\n }\n aggregate = mergeWordCounterResult(aggregate, current, preserveCollectorSegments);\n }\n\n return aggregate;\n}\n\nfunction buildSectionKey(name: string, source: \"frontmatter\" | \"content\"): string {\n return `${source}:${name}`;\n}\n\nfunction aggregateSectionedResults(\n results: SectionedResult[],\n preserveCollectorSegments: boolean,\n): SectionedResult {\n if (results.length === 0) {\n return {\n section: \"all\",\n total: 0,\n frontmatterType: null,\n items: [],\n };\n }\n\n const section = results[0]?.section ?? \"all\";\n const grouped = new Map<\n string,\n {\n name: string;\n source: \"frontmatter\" | \"content\";\n items: WordCounterResult[];\n }\n >();\n let total = 0;\n let frontmatterType = results[0]?.frontmatterType ?? null;\n\n for (const result of results) {\n total += result.total;\n\n if (result.section !== section) {\n throw new Error(\"Cannot aggregate section results with different section modes.\");\n }\n\n if (frontmatterType !== result.frontmatterType) {\n frontmatterType = null;\n }\n\n for (const item of result.items) {\n const key = buildSectionKey(item.name, item.source);\n const existing = grouped.get(key);\n if (!existing) {\n grouped.set(key, {\n name: item.name,\n source: item.source,\n items: [item.result],\n });\n continue;\n }\n\n existing.items.push(item.result);\n }\n }\n\n const sourceOrder = new Map<\"frontmatter\" | \"content\", number>([\n [\"frontmatter\", 0],\n [\"content\", 1],\n ]);\n\n const items = [...grouped.values()]\n .sort((left, right) => {\n const sourceDiff = (sourceOrder.get(left.source) ?? 0) - (sourceOrder.get(right.source) ?? 0);\n if (sourceDiff !== 0) {\n return sourceDiff;\n }\n return left.name.localeCompare(right.name);\n })\n .map((entry) => ({\n name: entry.name,\n source: entry.source,\n result: aggregateWordCounterResults(entry.items, preserveCollectorSegments),\n }));\n\n return {\n section,\n total,\n frontmatterType,\n items,\n };\n}\n\nfunction stripCollectorSegmentsFromWordCounterResult(result: WordCounterResult): void {\n if (result.breakdown.mode !== \"collector\") {\n return;\n }\n\n for (const item of result.breakdown.items) {\n item.segments = [];\n }\n}\n\nfunction stripCollectorSegmentsFromSectionedResult(result: SectionedResult): void {\n for (const item of result.items) {\n stripCollectorSegmentsFromWordCounterResult(item.result);\n }\n}\n\nexport async function buildBatchSummary(\n inputs: BatchFileInput[],\n section: SectionMode,\n wcOptions: Parameters<typeof wordCounter>[1],\n options: BuildBatchSummaryOptions = {},\n): Promise<BatchSummary> {\n const preserveCollectorSegments = options.preserveCollectorSegments ?? true;\n const files: BatchFileResult[] = [];\n\n for (const input of inputs) {\n const result =\n section === \"all\"\n ? wordCounter(input.content, wcOptions)\n : countSections(input.content, section, wcOptions);\n\n if (!preserveCollectorSegments) {\n if (\"section\" in result) {\n stripCollectorSegmentsFromSectionedResult(result);\n } else {\n stripCollectorSegmentsFromWordCounterResult(result);\n }\n }\n\n files.push({\n path: input.path,\n result,\n });\n\n options.onFileCounted?.({\n completed: files.length,\n total: inputs.length,\n });\n }\n\n options.onFinalizeStart?.();\n\n if (files.length === 0) {\n return {\n files,\n skipped: [],\n aggregate:\n section === \"all\"\n ? wordCounter(\"\", wcOptions)\n : {\n section,\n total: 0,\n frontmatterType: null,\n items: [],\n },\n };\n }\n\n const aggregate =\n section === \"all\"\n ? aggregateWordCounterResults(\n files.map((file) => file.result as WordCounterResult),\n preserveCollectorSegments,\n )\n : aggregateSectionedResults(\n files.map((file) => file.result as SectionedResult),\n preserveCollectorSegments,\n );\n\n return {\n files,\n skipped: [],\n aggregate,\n };\n}\n","import type { SectionMode } from \"../../markdown\";\nimport { appendAll } from \"../../utils/append-all\";\nimport type wordCounter from \"../../wc\";\nimport type { DebugChannel } from \"../debug/channel\";\nimport { type DirectoryExtensionFilter } from \"../path/filter\";\nimport { loadBatchInputs } from \"../path/load\";\nimport { resolveBatchFilePaths } from \"../path/resolve\";\nimport { type BatchProgressReporter } from \"../progress/reporter\";\nimport type { BatchOptions, BatchSummary } from \"../types\";\nimport { buildBatchSummary } from \"./aggregate\";\n\ntype RunBatchCountOptions = {\n pathInputs: string[];\n batchOptions: BatchOptions;\n extensionFilter: DirectoryExtensionFilter;\n section: SectionMode;\n wcOptions: Parameters<typeof wordCounter>[1];\n preserveCollectorSegments: boolean;\n debug: DebugChannel;\n progressReporter: BatchProgressReporter;\n};\n\nexport async function runBatchCount(options: RunBatchCountOptions): Promise<BatchSummary> {\n const batchStartedAtMs = Date.now();\n const resolveStartedAtMs = Date.now();\n\n options.debug.emit(\"batch.resolve.start\", {\n inputs: options.pathInputs.length,\n pathMode: options.batchOptions.pathMode,\n recursive: options.batchOptions.recursive,\n });\n\n const resolved = await resolveBatchFilePaths(options.pathInputs, {\n pathMode: options.batchOptions.pathMode,\n recursive: options.batchOptions.recursive,\n extensionFilter: options.extensionFilter,\n });\n const resolveElapsedMs = Date.now() - resolveStartedAtMs;\n options.debug.emit(\"batch.resolve.complete\", {\n files: resolved.files.length,\n skipped: resolved.skipped.length,\n elapsedMs: resolveElapsedMs,\n });\n options.debug.emit(\"batch.stage.timing\", {\n stage: \"resolve\",\n elapsedMs: resolveElapsedMs,\n });\n\n const loadStartedAtMs = Date.now();\n options.debug.emit(\"batch.load.start\", {\n files: resolved.files.length,\n });\n const loaded = await loadBatchInputs(resolved.files);\n const loadElapsedMs = Date.now() - loadStartedAtMs;\n options.debug.emit(\"batch.load.complete\", {\n files: loaded.files.length,\n skipped: loaded.skipped.length,\n elapsedMs: loadElapsedMs,\n });\n options.debug.emit(\"batch.stage.timing\", {\n stage: \"load\",\n elapsedMs: loadElapsedMs,\n });\n\n const progressEnabled = options.progressReporter.enabled && loaded.files.length > 1;\n options.debug.emit(\"batch.progress.start\", {\n enabled: progressEnabled,\n total: loaded.files.length,\n });\n\n if (progressEnabled) {\n options.progressReporter.start(loaded.files.length, batchStartedAtMs);\n }\n\n let summary: BatchSummary;\n const countStartedAtMs = Date.now();\n let finalizeStartedAtMs: number | null = null;\n let emittedCountTiming = false;\n try {\n summary = await buildBatchSummary(loaded.files, options.section, options.wcOptions, {\n onFileCounted: (snapshot) => {\n if (progressEnabled) {\n options.progressReporter.advance(snapshot);\n }\n },\n onFinalizeStart: () => {\n finalizeStartedAtMs = Date.now();\n if (progressEnabled) {\n options.progressReporter.startFinalizing();\n }\n\n const countElapsedMs = finalizeStartedAtMs - countStartedAtMs;\n options.debug.emit(\"batch.stage.timing\", {\n stage: \"count\",\n elapsedMs: countElapsedMs,\n });\n emittedCountTiming = true;\n },\n preserveCollectorSegments: options.preserveCollectorSegments,\n });\n } finally {\n if (progressEnabled) {\n options.progressReporter.finish();\n }\n options.debug.emit(\"batch.progress.complete\", {\n enabled: progressEnabled,\n total: loaded.files.length,\n });\n }\n\n if (!emittedCountTiming) {\n const countElapsedMs = Date.now() - countStartedAtMs;\n options.debug.emit(\"batch.stage.timing\", {\n stage: \"count\",\n elapsedMs: countElapsedMs,\n });\n }\n\n const finalizeElapsedMs = finalizeStartedAtMs === null ? 0 : Date.now() - finalizeStartedAtMs;\n options.debug.emit(\"batch.stage.timing\", {\n stage: \"finalize\",\n elapsedMs: finalizeElapsedMs,\n });\n\n appendAll(summary.skipped, resolved.skipped);\n appendAll(summary.skipped, loaded.skipped);\n options.debug.emit(\"batch.aggregate.complete\", {\n files: summary.files.length,\n skipped: summary.skipped.length,\n total: summary.aggregate.total,\n });\n\n return summary;\n}\n","type DebugDetails = Record<string, unknown>;\n\nexport type DebugChannel = {\n enabled: boolean;\n emit: (event: string, details?: DebugDetails) => void;\n};\n\nexport function createDebugChannel(enabled: boolean): DebugChannel {\n return {\n enabled,\n emit(event, details = {}) {\n if (!enabled) {\n return;\n }\n\n const payload = {\n event,\n ...details,\n };\n console.error(`[debug] ${JSON.stringify(payload)}`);\n },\n };\n}\n","export function showSingularOrPluralWord(count: number, word: string): string {\n return `${count} ${word}${count === 1 ? \"\" : \"s\"}`;\n}\n","import type { SectionedResult } from \"../markdown\";\nimport type { NonWordCollection, WordCounterResult } from \"../wc\";\n\nexport const TOTAL_OF_PARTS = [\n \"words\",\n \"emoji\",\n \"symbols\",\n \"punctuation\",\n \"whitespace\",\n] as const;\n\nexport type TotalOfPart = (typeof TOTAL_OF_PARTS)[number];\n\nexport type TotalOfOverride = {\n parts: TotalOfPart[];\n total: number;\n};\n\ntype TotalOfCounts = Record<TotalOfPart, number>;\n\nconst TOTAL_OF_PART_ALIASES: Record<string, TotalOfPart> = {\n word: \"words\",\n words: \"words\",\n emoji: \"emoji\",\n emojis: \"emoji\",\n symbol: \"symbols\",\n symbols: \"symbols\",\n punction: \"punctuation\",\n punctuation: \"punctuation\",\n whitespace: \"whitespace\",\n};\n\nfunction createTotalOfCounts(): TotalOfCounts {\n return {\n words: 0,\n emoji: 0,\n symbols: 0,\n punctuation: 0,\n whitespace: 0,\n };\n}\n\nfunction collectNonWordCounts(target: TotalOfCounts, nonWords: NonWordCollection | undefined): void {\n if (!nonWords) {\n return;\n }\n\n target.emoji += nonWords.counts.emoji;\n target.symbols += nonWords.counts.symbols;\n target.punctuation += nonWords.counts.punctuation;\n target.whitespace += nonWords.counts.whitespace ?? 0;\n}\n\nfunction collectFromWordCounterResult(result: WordCounterResult): TotalOfCounts {\n const counts = createTotalOfCounts();\n counts.words += result.counts?.words ?? result.total;\n\n if (result.breakdown.mode === \"collector\") {\n collectNonWordCounts(counts, result.breakdown.nonWords);\n return counts;\n }\n\n for (const item of result.breakdown.items) {\n collectNonWordCounts(counts, item.nonWords);\n }\n\n return counts;\n}\n\nfunction collectTotalOfCounts(result: WordCounterResult | SectionedResult): TotalOfCounts {\n if (!(\"section\" in result)) {\n return collectFromWordCounterResult(result);\n }\n\n const counts = createTotalOfCounts();\n for (const item of result.items) {\n const itemCounts = collectFromWordCounterResult(item.result);\n for (const part of TOTAL_OF_PARTS) {\n counts[part] += itemCounts[part];\n }\n }\n return counts;\n}\n\nfunction parseTotalOfToken(token: string): TotalOfPart {\n const normalized = token.trim().toLowerCase();\n const canonical = TOTAL_OF_PART_ALIASES[normalized];\n if (canonical) {\n return canonical;\n }\n throw new Error(\n `Invalid --total-of part: ${token}. Allowed: ${TOTAL_OF_PARTS.join(\", \")}.`,\n );\n}\n\nexport function parseTotalOfOption(value: string): TotalOfPart[] {\n const rawTokens = value\n .split(\",\")\n .map((token) => token.trim())\n .filter((token) => token.length > 0);\n\n if (rawTokens.length === 0) {\n throw new Error(\n `Invalid --total-of value: \"${value}\". Use comma-separated parts from: ${TOTAL_OF_PARTS.join(\", \")}.`,\n );\n }\n\n const parts: TotalOfPart[] = [];\n const seen = new Set<TotalOfPart>();\n for (const token of rawTokens) {\n const parsed = parseTotalOfToken(token);\n if (seen.has(parsed)) {\n continue;\n }\n seen.add(parsed);\n parts.push(parsed);\n }\n\n return parts;\n}\n\nexport function requiresNonWordCollection(parts: readonly TotalOfPart[] | undefined): boolean {\n if (!parts || parts.length === 0) {\n return false;\n }\n return parts.some((part) => part !== \"words\");\n}\n\nexport function requiresWhitespaceCollection(parts: readonly TotalOfPart[] | undefined): boolean {\n if (!parts || parts.length === 0) {\n return false;\n }\n return parts.includes(\"whitespace\");\n}\n\nexport function resolveTotalOfOverride(\n result: WordCounterResult | SectionedResult,\n parts: readonly TotalOfPart[] | undefined,\n): TotalOfOverride | undefined {\n if (!parts || parts.length === 0) {\n return undefined;\n }\n\n const counts = collectTotalOfCounts(result);\n let total = 0;\n for (const part of parts) {\n total += counts[part];\n }\n\n return {\n parts: [...parts],\n total,\n };\n}\n\nexport function formatTotalOfParts(parts: readonly TotalOfPart[]): string {\n return parts.join(\", \");\n}\n","let p = process || {}, argv = p.argv || [], env = p.env || {}\nlet isColorSupported =\n\t!(!!env.NO_COLOR || argv.includes(\"--no-color\")) &&\n\t(!!env.FORCE_COLOR || argv.includes(\"--color\") || p.platform === \"win32\" || ((p.stdout || {}).isTTY && env.TERM !== \"dumb\") || !!env.CI)\n\nlet formatter = (open, close, replace = open) =>\n\tinput => {\n\t\tlet string = \"\" + input, index = string.indexOf(close, open.length)\n\t\treturn ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close\n\t}\n\nlet replaceClose = (string, close, replace, index) => {\n\tlet result = \"\", cursor = 0\n\tdo {\n\t\tresult += string.substring(cursor, index) + replace\n\t\tcursor = index + close.length\n\t\tindex = string.indexOf(close, cursor)\n\t} while (~index)\n\treturn result + string.substring(cursor)\n}\n\nlet createColors = (enabled = isColorSupported) => {\n\tlet f = enabled ? formatter : () => String\n\treturn {\n\t\tisColorSupported: enabled,\n\t\treset: f(\"\\x1b[0m\", \"\\x1b[0m\"),\n\t\tbold: f(\"\\x1b[1m\", \"\\x1b[22m\", \"\\x1b[22m\\x1b[1m\"),\n\t\tdim: f(\"\\x1b[2m\", \"\\x1b[22m\", \"\\x1b[22m\\x1b[2m\"),\n\t\titalic: f(\"\\x1b[3m\", \"\\x1b[23m\"),\n\t\tunderline: f(\"\\x1b[4m\", \"\\x1b[24m\"),\n\t\tinverse: f(\"\\x1b[7m\", \"\\x1b[27m\"),\n\t\thidden: f(\"\\x1b[8m\", \"\\x1b[28m\"),\n\t\tstrikethrough: f(\"\\x1b[9m\", \"\\x1b[29m\"),\n\n\t\tblack: f(\"\\x1b[30m\", \"\\x1b[39m\"),\n\t\tred: f(\"\\x1b[31m\", \"\\x1b[39m\"),\n\t\tgreen: f(\"\\x1b[32m\", \"\\x1b[39m\"),\n\t\tyellow: f(\"\\x1b[33m\", \"\\x1b[39m\"),\n\t\tblue: f(\"\\x1b[34m\", \"\\x1b[39m\"),\n\t\tmagenta: f(\"\\x1b[35m\", \"\\x1b[39m\"),\n\t\tcyan: f(\"\\x1b[36m\", \"\\x1b[39m\"),\n\t\twhite: f(\"\\x1b[37m\", \"\\x1b[39m\"),\n\t\tgray: f(\"\\x1b[90m\", \"\\x1b[39m\"),\n\n\t\tbgBlack: f(\"\\x1b[40m\", \"\\x1b[49m\"),\n\t\tbgRed: f(\"\\x1b[41m\", \"\\x1b[49m\"),\n\t\tbgGreen: f(\"\\x1b[42m\", \"\\x1b[49m\"),\n\t\tbgYellow: f(\"\\x1b[43m\", \"\\x1b[49m\"),\n\t\tbgBlue: f(\"\\x1b[44m\", \"\\x1b[49m\"),\n\t\tbgMagenta: f(\"\\x1b[45m\", \"\\x1b[49m\"),\n\t\tbgCyan: f(\"\\x1b[46m\", \"\\x1b[49m\"),\n\t\tbgWhite: f(\"\\x1b[47m\", \"\\x1b[49m\"),\n\n\t\tblackBright: f(\"\\x1b[90m\", \"\\x1b[39m\"),\n\t\tredBright: f(\"\\x1b[91m\", \"\\x1b[39m\"),\n\t\tgreenBright: f(\"\\x1b[92m\", \"\\x1b[39m\"),\n\t\tyellowBright: f(\"\\x1b[93m\", \"\\x1b[39m\"),\n\t\tblueBright: f(\"\\x1b[94m\", \"\\x1b[39m\"),\n\t\tmagentaBright: f(\"\\x1b[95m\", \"\\x1b[39m\"),\n\t\tcyanBright: f(\"\\x1b[96m\", \"\\x1b[39m\"),\n\t\twhiteBright: f(\"\\x1b[97m\", \"\\x1b[39m\"),\n\n\t\tbgBlackBright: f(\"\\x1b[100m\", \"\\x1b[49m\"),\n\t\tbgRedBright: f(\"\\x1b[101m\", \"\\x1b[49m\"),\n\t\tbgGreenBright: f(\"\\x1b[102m\", \"\\x1b[49m\"),\n\t\tbgYellowBright: f(\"\\x1b[103m\", \"\\x1b[49m\"),\n\t\tbgBlueBright: f(\"\\x1b[104m\", \"\\x1b[49m\"),\n\t\tbgMagentaBright: f(\"\\x1b[105m\", \"\\x1b[49m\"),\n\t\tbgCyanBright: f(\"\\x1b[106m\", \"\\x1b[49m\"),\n\t\tbgWhiteBright: f(\"\\x1b[107m\", \"\\x1b[49m\"),\n\t}\n}\n\nmodule.exports = createColors()\nmodule.exports.createColors = createColors\n","import { relative as relativePath } from \"node:path\";\nimport type { SectionMode, SectionedResult } from \"../../markdown\";\nimport { showSingularOrPluralWord } from \"../../utils\";\nimport type { NonWordCollection, WordCounterMode, WordCounterResult } from \"../../wc\";\nimport { formatTotalOfParts, type TotalOfOverride } from \"../total-of\";\nimport type { BatchSkip, BatchSummary } from \"../types\";\nimport pc from \"picocolors\";\n\ntype CountUnit = \"word\" | \"character\";\n\ntype CountBreakdownItem = {\n locale: string;\n count: number;\n nonWords?: NonWordCollection;\n};\n\nexport type TotalLabels = {\n overall: string;\n section: string;\n};\n\nfunction getCountUnit(mode: WordCounterMode): CountUnit {\n return mode === \"char\" ? \"character\" : \"word\";\n}\n\nexport function getTotalLabels(mode: WordCounterMode, includeNonWords: boolean): TotalLabels {\n const unit = mode === \"char\" ? \"characters\" : \"words\";\n if (includeNonWords) {\n return { overall: \"Total count\", section: \"total count\" };\n }\n return { overall: `Total ${unit}`, section: `total ${unit}` };\n}\n\nfunction hasNonWords(nonWords: NonWordCollection): boolean {\n const whitespaceCount = nonWords.counts.whitespace ?? 0;\n return (\n nonWords.counts.emoji > 0 ||\n nonWords.counts.symbols > 0 ||\n nonWords.counts.punctuation > 0 ||\n whitespaceCount > 0\n );\n}\n\nfunction renderNonWords(nonWords: NonWordCollection | undefined, verbose: boolean): void {\n if (!nonWords || !hasNonWords(nonWords)) {\n return;\n }\n\n if (verbose) {\n const whitespace = nonWords.whitespace ? ` whitespace=${JSON.stringify(nonWords.whitespace)}` : \"\";\n console.log(\n pc.yellow(\n `Non-words: emoji=${JSON.stringify(nonWords.emoji)} symbols=${JSON.stringify(\n nonWords.symbols,\n )} punctuation=${JSON.stringify(nonWords.punctuation)}${whitespace}`,\n ),\n );\n return;\n }\n\n const whitespaceCount = nonWords.counts.whitespace ?? 0;\n const whitespaceLabel = whitespaceCount > 0 ? `, whitespace ${whitespaceCount}` : \"\";\n console.log(\n pc.yellow(\n `Non-words: emoji ${nonWords.counts.emoji}, symbols ${nonWords.counts.symbols}, punctuation ${nonWords.counts.punctuation}${whitespaceLabel}`,\n ),\n );\n}\n\nfunction renderCountBreakdown(items: CountBreakdownItem[], unit: CountUnit): void {\n for (const item of items) {\n console.log(`Locale ${item.locale}: ${showSingularOrPluralWord(item.count, unit)}`);\n renderNonWords(item.nonWords, false);\n }\n}\n\nfunction renderSegmentBreakdown(\n items: Array<{ locale: string; words: number; segments: string[]; nonWords?: NonWordCollection }>,\n): void {\n for (const item of items) {\n console.log(\n `Locale ${item.locale}: ${JSON.stringify(item.segments)} (${showSingularOrPluralWord(item.words, \"word\")})`,\n );\n renderNonWords(item.nonWords, true);\n }\n}\n\nfunction renderCollectorBreakdown(items: Array<{ locale: string; words: number }>): void {\n for (const item of items) {\n console.log(`Locale ${item.locale}: ${showSingularOrPluralWord(item.words, \"word\")}`);\n }\n}\n\nfunction renderTotalOfOverride(baseTotal: number, override: TotalOfOverride | undefined): void {\n if (!override || override.total === baseTotal) {\n return;\n }\n\n console.log(`Total-of (override: ${formatTotalOfParts(override.parts)}): ${override.total}`);\n}\n\nexport function renderStandardResult(\n result: WordCounterResult,\n totalLabel: string,\n totalOfOverride?: TotalOfOverride,\n): void {\n console.log(`${totalLabel}: ${result.total}`);\n renderTotalOfOverride(result.total, totalOfOverride);\n\n if (result.breakdown.mode === \"segments\") {\n renderSegmentBreakdown(result.breakdown.items);\n return;\n }\n\n if (result.breakdown.mode === \"collector\") {\n renderCollectorBreakdown(result.breakdown.items);\n renderNonWords(result.breakdown.nonWords, false);\n return;\n }\n\n if (result.breakdown.mode === \"char\") {\n renderCountBreakdown(\n result.breakdown.items.map((item) => ({\n locale: item.locale,\n count: item.chars,\n nonWords: item.nonWords,\n })),\n getCountUnit(result.breakdown.mode),\n );\n return;\n }\n\n renderCountBreakdown(\n result.breakdown.items.map((item) => ({\n locale: item.locale,\n count: item.words,\n nonWords: item.nonWords,\n })),\n getCountUnit(result.breakdown.mode),\n );\n}\n\nfunction buildSectionLabel(\n sectionName: string,\n sectionMode: SectionMode,\n source: \"frontmatter\" | \"content\",\n totalLabel: string,\n): string {\n if (sectionMode === \"frontmatter\") {\n return `[Frontmatter] (${totalLabel})`;\n }\n\n if (sectionMode === \"content\") {\n return `[Content] (${totalLabel})`;\n }\n\n if (sectionMode === \"split\") {\n return source === \"frontmatter\"\n ? `[Frontmatter] (${totalLabel})`\n : `[Content] (${totalLabel})`;\n }\n\n if (sectionMode === \"per-key\") {\n return `[Frontmatter] ${sectionName} (${totalLabel})`;\n }\n\n if (sectionMode === \"split-per-key\") {\n return source === \"content\"\n ? `[Content] (${totalLabel})`\n : `[Frontmatter] ${sectionName} (${totalLabel})`;\n }\n\n return `[Section] ${sectionName} (${totalLabel})`;\n}\n\nexport function renderStandardSectionedResult(\n result: SectionedResult,\n labels: TotalLabels,\n totalOfOverride?: TotalOfOverride,\n): void {\n console.log(`${labels.overall}: ${result.total}`);\n renderTotalOfOverride(result.total, totalOfOverride);\n\n for (const item of result.items) {\n const label = buildSectionLabel(item.name, result.section, item.source, labels.section);\n const unit = getCountUnit(item.result.breakdown.mode);\n console.log(pc.cyan(pc.bold(`${label}: ${showSingularOrPluralWord(item.result.total, unit)}`)));\n\n if (item.result.breakdown.mode === \"segments\") {\n renderSegmentBreakdown(item.result.breakdown.items);\n continue;\n }\n\n if (item.result.breakdown.mode === \"collector\") {\n renderCollectorBreakdown(item.result.breakdown.items);\n renderNonWords(item.result.breakdown.nonWords, false);\n continue;\n }\n\n if (item.result.breakdown.mode === \"char\") {\n renderCountBreakdown(\n item.result.breakdown.items.map((chunk) => ({\n locale: chunk.locale,\n count: chunk.chars,\n nonWords: chunk.nonWords,\n })),\n unit,\n );\n continue;\n }\n\n renderCountBreakdown(\n item.result.breakdown.items.map((chunk) => ({\n locale: chunk.locale,\n count: chunk.words,\n nonWords: chunk.nonWords,\n })),\n unit,\n );\n }\n}\n\nexport function isSectionedResult(\n result: WordCounterResult | SectionedResult,\n): result is SectionedResult {\n return \"section\" in result;\n}\n\nfunction toDisplayPath(inputPath: string): string {\n const relative = relativePath(process.cwd(), inputPath);\n if (relative && !relative.startsWith(\"..\")) {\n return relative || \".\";\n }\n return inputPath;\n}\n\nexport function reportSkipped(skipped: BatchSkip[]): void {\n if (skipped.length === 0) {\n return;\n }\n\n console.error(pc.yellow(`Skipped ${skipped.length} path(s):`));\n for (const item of skipped) {\n console.error(pc.yellow(`- ${toDisplayPath(item.path)} (${item.reason})`));\n }\n}\n\nexport function renderPerFileStandard(\n summary: BatchSummary,\n labels: TotalLabels,\n resolveTotalOfOverride?: (result: WordCounterResult | SectionedResult) => TotalOfOverride | undefined,\n): void {\n for (const file of summary.files) {\n console.log(pc.bold(`[File] ${toDisplayPath(file.path)}`));\n if (isSectionedResult(file.result)) {\n renderStandardSectionedResult(\n file.result,\n labels,\n resolveTotalOfOverride?.(file.result),\n );\n continue;\n }\n\n renderStandardResult(file.result, labels.overall, resolveTotalOfOverride?.(file.result));\n }\n\n console.log(pc.bold(`[Merged] ${summary.files.length} file(s)`));\n if (isSectionedResult(summary.aggregate)) {\n renderStandardSectionedResult(\n summary.aggregate,\n labels,\n resolveTotalOfOverride?.(summary.aggregate),\n );\n return;\n }\n\n renderStandardResult(summary.aggregate, labels.overall, resolveTotalOfOverride?.(summary.aggregate));\n}\n","import { Command, Option } from \"commander\";\nimport { readFileSync } from \"node:fs\";\nimport type { SectionMode, SectionedResult } from \"./markdown\";\nimport { countSections } from \"./markdown\";\nimport { runBatchCount } from \"./cli/batch/run\";\nimport { createDebugChannel } from \"./cli/debug/channel\";\nimport {\n buildDirectoryExtensionFilter,\n collectExtensionOption,\n} from \"./cli/path/filter\";\nimport { createBatchProgressReporter, type ProgressOutputStream } from \"./cli/progress/reporter\";\nimport type { BatchOptions, BatchScope, BatchSummary, PathMode } from \"./cli/types\";\nimport {\n getTotalLabels,\n isSectionedResult,\n renderPerFileStandard,\n renderStandardResult,\n renderStandardSectionedResult,\n reportSkipped,\n} from \"./cli/output/render\";\nimport {\n parseTotalOfOption,\n requiresNonWordCollection,\n requiresWhitespaceCollection,\n resolveTotalOfOverride,\n type TotalOfOverride,\n type TotalOfPart,\n} from \"./cli/total-of\";\nimport wordCounter, {\n type WordCounterMode,\n type WordCounterResult,\n} from \"./wc\";\nimport { normalizeMode } from \"./wc/mode\";\nimport pc from \"picocolors\";\n\ntype OutputFormat = \"standard\" | \"raw\" | \"json\";\n\nconst MODE_CHOICES: WordCounterMode[] = [\"chunk\", \"segments\", \"collector\", \"char\"];\nconst FORMAT_CHOICES: OutputFormat[] = [\"standard\", \"raw\", \"json\"];\nconst SECTION_CHOICES: SectionMode[] = [\n \"all\",\n \"split\",\n \"frontmatter\",\n \"content\",\n \"per-key\",\n \"split-per-key\",\n];\nconst PATH_MODE_CHOICES: PathMode[] = [\"auto\", \"manual\"];\n\nfunction getPackageVersion(): string {\n const packageCandidates = [\n new URL(\"../package.json\", import.meta.url),\n new URL(\"../../package.json\", import.meta.url),\n ];\n\n let version = \"0.0.0\";\n for (const packageUrl of packageCandidates) {\n try {\n const raw = readFileSync(packageUrl, \"utf8\");\n const data = JSON.parse(raw) as { version?: string };\n if (data.version) {\n version = data.version;\n break;\n }\n } catch {\n continue;\n }\n }\n\n return pc.bgBlack(pc.bold(pc.italic(` word-counter ${pc.cyanBright(`ver.${version}`)} `)));\n}\n\nasync function readStdin(): Promise<string> {\n if (process.stdin.isTTY) {\n return \"\";\n }\n\n return new Promise<string>((resolve, reject) => {\n const chunks: string[] = [];\n process.stdin.setEncoding(\"utf8\");\n process.stdin.on(\"data\", (chunk) => chunks.push(String(chunk)));\n process.stdin.on(\"end\", () => resolve(chunks.join(\"\")));\n process.stdin.on(\"error\", (error) => reject(error));\n process.stdin.resume();\n });\n}\n\nasync function resolveInput(textTokens: string[]): Promise<string> {\n if (textTokens.length > 0) {\n return textTokens.join(\" \");\n }\n\n return readStdin();\n}\n\nfunction collectPathValue(value: string, previous: string[] = []): string[] {\n return [...previous, value];\n}\n\nfunction resolveBatchScope(argv: string[]): BatchScope {\n let scope: BatchScope = \"merged\";\n for (const token of argv) {\n if (token === \"--merged\") {\n scope = \"merged\";\n continue;\n }\n\n if (token === \"--per-file\") {\n scope = \"per-file\";\n }\n }\n\n return scope;\n}\n\nfunction hasPathInput(pathValues: string[] | undefined): pathValues is string[] {\n return Array.isArray(pathValues) && pathValues.length > 0;\n}\n\nfunction normalizeWordCounterResultBase(result: WordCounterResult): WordCounterResult {\n result.total = result.counts?.words ?? result.total;\n delete result.counts;\n\n if (result.breakdown.mode === \"collector\") {\n delete result.breakdown.nonWords;\n return result;\n }\n\n if (result.breakdown.mode === \"char\") {\n for (const item of result.breakdown.items) {\n const nonWordCount =\n (item.nonWords?.counts.emoji ?? 0) +\n (item.nonWords?.counts.symbols ?? 0) +\n (item.nonWords?.counts.punctuation ?? 0) +\n (item.nonWords?.counts.whitespace ?? 0);\n item.chars = Math.max(0, item.chars - nonWordCount);\n delete item.nonWords;\n }\n return result;\n }\n\n for (const item of result.breakdown.items) {\n delete item.nonWords;\n }\n\n return result;\n}\n\nfunction normalizeSectionedResultBase(result: SectionedResult): SectionedResult {\n let total = 0;\n for (const item of result.items) {\n normalizeWordCounterResultBase(item.result);\n total += item.result.total;\n }\n result.total = total;\n return result;\n}\n\nfunction normalizeResultBase(\n result: WordCounterResult | SectionedResult,\n): WordCounterResult | SectionedResult {\n if (\"section\" in result) {\n return normalizeSectionedResultBase(result);\n }\n return normalizeWordCounterResultBase(result);\n}\n\nfunction normalizeBatchSummaryBase(summary: BatchSummary): BatchSummary {\n for (const file of summary.files) {\n normalizeResultBase(file.result);\n }\n normalizeResultBase(summary.aggregate);\n return summary;\n}\n\ntype RunCliOptions = {\n stderr?: ProgressOutputStream;\n};\n\nexport async function runCli(argv: string[] = process.argv, runtime: RunCliOptions = {}): Promise<void> {\n const program = new Command();\n const parseMode = (value: string): WordCounterMode => {\n const normalized = normalizeMode(value);\n if (!normalized) {\n throw new Error(`Invalid mode: ${value}`);\n }\n return normalized;\n };\n\n program\n .name(\"word-counter\")\n .description(\"Locale-aware word counting powered by Intl.Segmenter.\")\n .version(getPackageVersion(), \"-v, --version\", \"output the version number\")\n .addOption(\n new Option(\"-m, --mode <mode>\", \"breakdown mode\")\n .choices(MODE_CHOICES)\n .argParser(parseMode)\n .default(\"chunk\"),\n )\n .addOption(\n new Option(\"-f, --format <format>\", \"output format\")\n .choices(FORMAT_CHOICES)\n .default(\"standard\"),\n )\n .addOption(\n new Option(\"--section <section>\", \"document section mode\")\n .choices(SECTION_CHOICES)\n .default(\"all\"),\n )\n .addOption(\n new Option(\"--path-mode <mode>\", \"path resolution mode\")\n .choices(PATH_MODE_CHOICES)\n .default(\"auto\"),\n )\n .option(\"--latin-language <language>\", \"hint a language tag for Latin script text\")\n .option(\"--latin-tag <tag>\", \"hint a BCP 47 tag for Latin script text\")\n .option(\"--latin-locale <locale>\", \"legacy alias of --latin-language\")\n .option(\"--han-language <language>\", \"hint a language tag for Han script text\")\n .option(\"--han-tag <tag>\", \"hint a BCP 47 tag for Han script text\")\n .option(\"--non-words\", \"collect emoji, symbols, and punctuation (excludes whitespace)\")\n .option(\n \"--include-whitespace\",\n \"include whitespace counts (implies with --non-words; same as --misc)\",\n )\n .option(\"--misc\", \"collect non-words plus whitespace (alias for --include-whitespace)\")\n .option(\n \"--total-of <parts>\",\n \"override total composition (comma-separated): words,emoji,symbols,punctuation,whitespace\",\n parseTotalOfOption,\n )\n .option(\"--pretty\", \"pretty print JSON output\", false)\n .option(\"--debug\", \"enable debug diagnostics on stderr\")\n .option(\"--merged\", \"show merged aggregate output (default)\")\n .option(\"--per-file\", \"show per-file output plus merged summary\")\n .option(\"--no-progress\", \"disable batch progress indicator\")\n .option(\"--keep-progress\", \"keep final batch progress line visible in standard mode\")\n .option(\"--no-recursive\", \"disable recursive directory traversal\")\n .option(\"--quiet-skips\", \"hide skip diagnostics (applies when --debug is enabled)\")\n .option(\n \"--include-ext <exts>\",\n \"comma-separated extensions to include during directory scanning\",\n collectExtensionOption,\n [],\n )\n .option(\n \"--exclude-ext <exts>\",\n \"comma-separated extensions to exclude during directory scanning\",\n collectExtensionOption,\n [],\n )\n .option(\"-p, --path <path>\", \"read input from file or directory\", collectPathValue, [])\n .argument(\"[text...]\", \"text to count\")\n .showHelpAfterError();\n\n program.action(\n async (\n textTokens: string[],\n options: {\n mode: WordCounterMode;\n format: OutputFormat;\n pretty: boolean;\n section: SectionMode;\n latinLanguage?: string;\n latinTag?: string;\n latinLocale?: string;\n hanLanguage?: string;\n hanTag?: string;\n nonWords?: boolean;\n includeWhitespace?: boolean;\n misc?: boolean;\n totalOf?: TotalOfPart[];\n path?: string[];\n pathMode: PathMode;\n recursive: boolean;\n progress: boolean;\n keepProgress?: boolean;\n quietSkips?: boolean;\n debug?: boolean;\n includeExt?: string[];\n excludeExt?: string[];\n },\n ) => {\n const useSection = options.section !== \"all\";\n const totalOfParts = options.totalOf;\n const requestedNonWords = Boolean(options.nonWords || options.includeWhitespace || options.misc);\n const collectNonWordsForOverride = requiresNonWordCollection(totalOfParts);\n const collectWhitespaceForOverride = requiresWhitespaceCollection(totalOfParts);\n const enableNonWords = Boolean(\n options.nonWords ||\n options.includeWhitespace ||\n options.misc ||\n collectNonWordsForOverride,\n );\n const enableWhitespace = Boolean(\n options.includeWhitespace ||\n options.misc ||\n collectWhitespaceForOverride,\n );\n const shouldNormalizeBaseOutput = !requestedNonWords && enableNonWords;\n const wcOptions = {\n mode: options.mode,\n latinLanguageHint: options.latinLanguage,\n latinTagHint: options.latinTag,\n latinLocaleHint: options.latinLocale,\n hanLanguageHint: options.hanLanguage,\n hanTagHint: options.hanTag,\n nonWords: enableNonWords,\n includeWhitespace: enableWhitespace,\n };\n\n if (!hasPathInput(options.path)) {\n let input: string;\n try {\n input = await resolveInput(textTokens);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n program.error(`Failed to read input: ${message}`);\n return;\n }\n\n const trimmed = input.trim();\n if (!trimmed) {\n program.error(pc.red(\"No input provided. Pass text, pipe stdin, or use --path.\"));\n return;\n }\n\n const result: WordCounterResult | SectionedResult = useSection\n ? countSections(trimmed, options.section, wcOptions)\n : wordCounter(trimmed, wcOptions);\n const totalOfOverride = resolveTotalOfOverride(result, totalOfParts);\n const displayResult = shouldNormalizeBaseOutput ? normalizeResultBase(result) : result;\n\n if (options.format === \"raw\") {\n console.log(totalOfOverride?.total ?? displayResult.total);\n return;\n }\n\n if (options.format === \"json\") {\n const spacing = options.pretty ? 2 : 0;\n if (!totalOfOverride) {\n console.log(JSON.stringify(displayResult, null, spacing));\n return;\n }\n console.log(\n JSON.stringify(\n {\n ...displayResult,\n meta: {\n totalOf: totalOfOverride.parts,\n totalOfOverride: totalOfOverride.total,\n },\n },\n null,\n spacing,\n ),\n );\n return;\n }\n\n const labels = getTotalLabels(options.mode, requestedNonWords);\n if (isSectionedResult(displayResult)) {\n renderStandardSectionedResult(displayResult, labels, totalOfOverride);\n return;\n }\n\n renderStandardResult(displayResult, labels.overall, totalOfOverride);\n return;\n }\n\n const batchOptions: BatchOptions = {\n scope: resolveBatchScope(argv),\n pathMode: options.pathMode,\n recursive: options.recursive,\n quietSkips: Boolean(options.quietSkips),\n };\n\n const debug = createDebugChannel(Boolean(options.debug));\n const extensionFilter = buildDirectoryExtensionFilter(options.includeExt, options.excludeExt);\n const summary = await runBatchCount({\n pathInputs: options.path,\n batchOptions,\n extensionFilter,\n section: options.section,\n wcOptions,\n preserveCollectorSegments: options.format === \"json\",\n debug,\n progressReporter: createBatchProgressReporter({\n enabled: options.format === \"standard\" && options.progress,\n stream: runtime.stderr ?? (process.stderr as unknown as ProgressOutputStream),\n clearOnFinish: !Boolean(options.debug || options.keepProgress),\n }),\n });\n\n const showSkipDiagnostics = Boolean(options.debug) && !batchOptions.quietSkips;\n debug.emit(\"batch.skips.policy\", {\n enabled: showSkipDiagnostics,\n quietSkips: batchOptions.quietSkips,\n });\n if (showSkipDiagnostics) {\n debug.emit(\"batch.skips.report\", {\n count: summary.skipped.length,\n });\n reportSkipped(summary.skipped);\n }\n\n if (summary.files.length === 0) {\n program.error(pc.red(\"No readable text-like inputs were found from --path.\"));\n return;\n }\n\n let aggregateTotalOfOverride: TotalOfOverride | undefined;\n let totalOfOverridesByResult: WeakMap<object, TotalOfOverride> | undefined;\n if (totalOfParts && totalOfParts.length > 0) {\n totalOfOverridesByResult = new WeakMap<object, TotalOfOverride>();\n const aggregateOverride = resolveTotalOfOverride(summary.aggregate, totalOfParts);\n if (aggregateOverride) {\n totalOfOverridesByResult.set(summary.aggregate as object, aggregateOverride);\n aggregateTotalOfOverride = aggregateOverride;\n }\n\n for (const file of summary.files) {\n const fileOverride = resolveTotalOfOverride(file.result, totalOfParts);\n if (!fileOverride) {\n continue;\n }\n totalOfOverridesByResult.set(file.result as object, fileOverride);\n }\n } else {\n aggregateTotalOfOverride = resolveTotalOfOverride(summary.aggregate, totalOfParts);\n }\n\n if (shouldNormalizeBaseOutput) {\n normalizeBatchSummaryBase(summary);\n }\n\n if (!aggregateTotalOfOverride && totalOfOverridesByResult) {\n aggregateTotalOfOverride = totalOfOverridesByResult.get(summary.aggregate as object);\n }\n\n if (options.format === \"raw\") {\n console.log(aggregateTotalOfOverride?.total ?? summary.aggregate.total);\n return;\n }\n\n if (options.format === \"json\") {\n const spacing = options.pretty ? 2 : 0;\n\n if (batchOptions.scope === \"per-file\") {\n const skipped = showSkipDiagnostics ? summary.skipped : undefined;\n const meta =\n totalOfParts && totalOfParts.length > 0\n ? {\n totalOf: totalOfParts,\n aggregateTotalOfOverride:\n aggregateTotalOfOverride?.total ?? summary.aggregate.total,\n }\n : undefined;\n const payload = {\n scope: \"per-file\",\n files: summary.files.map((file) => ({\n path: file.path,\n result: file.result,\n })),\n ...(skipped ? { skipped } : {}),\n aggregate: summary.aggregate,\n ...(meta ? { meta } : {}),\n };\n console.log(JSON.stringify(payload, null, spacing));\n return;\n }\n\n if (!aggregateTotalOfOverride) {\n console.log(JSON.stringify(summary.aggregate, null, spacing));\n return;\n }\n console.log(\n JSON.stringify(\n {\n ...summary.aggregate,\n meta: {\n totalOf: aggregateTotalOfOverride.parts,\n totalOfOverride: aggregateTotalOfOverride.total,\n },\n },\n null,\n spacing,\n ),\n );\n return;\n }\n\n const labels = getTotalLabels(options.mode, requestedNonWords);\n const totalOfResolver =\n totalOfParts && totalOfParts.length > 0\n ? (result: WordCounterResult | SectionedResult) =>\n totalOfOverridesByResult?.get(result as object) ??\n resolveTotalOfOverride(result, totalOfParts)\n : undefined;\n\n if (batchOptions.scope === \"per-file\") {\n renderPerFileStandard(summary, labels, totalOfResolver);\n return;\n }\n\n if (isSectionedResult(summary.aggregate)) {\n renderStandardSectionedResult(summary.aggregate, labels, aggregateTotalOfOverride);\n return;\n }\n\n renderStandardResult(summary.aggregate, labels.overall, aggregateTotalOfOverride);\n },\n );\n\n await program.parseAsync(argv);\n}\n\nexport { buildBatchSummary } from \"./cli/batch/aggregate\";\nexport { loadBatchInputs } from \"./cli/path/load\";\nexport { resolveBatchFilePaths } from \"./cli/path/resolve\";\n","import { runCli } from \"./command\";\n\nrunCli().catch((error) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"Failed to run CLI:\", message);\n process.exitCode = 1;\n});\n"],"x_google_ignoreList":[25],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bin.mjs","names":["resolvePath","resolvePath","pc","resolvePath","wordCounter","wordCounter","pc","relative","relativePath","wordCounter","pc"],"sources":["../../src/cli/debug/channel.ts","../../src/cli/path/filter.ts","../../src/cli/total-of.ts","../../src/cli/program/options.ts","../../node_modules/picocolors/picocolors.js","../../src/cli/program/version.ts","../../src/utils/append-all.ts","../../src/cli/path/load.ts","../../src/cli/path/resolve.ts","../../src/cli/progress/reporter.ts","../../src/markdown/toml/arrays.ts","../../src/markdown/toml/keys.ts","../../src/markdown/toml/strings.ts","../../src/markdown/toml/values.ts","../../src/markdown/toml/parse-frontmatter.ts","../../src/markdown/parse-markdown.ts","../../src/wc/segmenter.ts","../../src/wc/non-words.ts","../../src/wc/analyze.ts","../../src/wc/mode.ts","../../src/wc/locale-detect.ts","../../src/wc/segment.ts","../../src/wc/wc.ts","../../src/wc/index.ts","../../src/markdown/section-count.ts","../../src/cli/batch/aggregate.ts","../../src/cli/batch/run.ts","../../src/utils/show-singular-or-plural-word.ts","../../src/cli/output/render.ts","../../src/cli/output/normalize-base.ts","../../src/cli/runtime/options.ts","../../src/cli/runtime/batch.ts","../../src/cli/runtime/input.ts","../../src/cli/runtime/single.ts","../../src/command.ts","../../src/bin.ts"],"sourcesContent":["import { closeSync, createWriteStream, existsSync, mkdirSync, openSync, statSync } from \"node:fs\";\nimport { basename, dirname, extname, join, resolve as resolvePath } from \"node:path\";\n\ntype DebugDetails = Record<string, unknown>;\nexport type DebugVerbosity = \"compact\" | \"verbose\";\n\ntype DebugEventOptions = {\n verbosity?: DebugVerbosity;\n};\n\ntype DebugReportOptions = {\n path?: string;\n tee: boolean;\n cwd?: string;\n};\n\nexport type CreateDebugChannelOptions = {\n enabled: boolean;\n verbosity?: DebugVerbosity;\n report?: DebugReportOptions;\n now?: () => Date;\n pid?: number;\n};\n\nexport type DebugChannel = {\n enabled: boolean;\n verbosity: DebugVerbosity;\n reportPath?: string;\n emit: (event: string, details?: DebugDetails, options?: DebugEventOptions) => void;\n close: () => Promise<void>;\n};\n\ntype DebugSink = {\n write: (line: string) => void;\n close: () => Promise<void>;\n};\n\nconst NOOP_CLOSE = async (): Promise<void> => {\n return;\n};\n\nfunction shouldEmitAtVerbosity(\n channelVerbosity: DebugVerbosity,\n eventVerbosity: DebugVerbosity,\n): boolean {\n return channelVerbosity === \"verbose\" || eventVerbosity === \"compact\";\n}\n\nfunction formatTimestampPart(value: number): string {\n return String(value).padStart(2, \"0\");\n}\n\nfunction formatDebugReportTimestamp(now: Date): string {\n return [\n `${now.getFullYear()}${formatTimestampPart(now.getMonth() + 1)}${formatTimestampPart(now.getDate())}`,\n `${formatTimestampPart(now.getHours())}${formatTimestampPart(now.getMinutes())}${formatTimestampPart(now.getSeconds())}`,\n ].join(\"-\");\n}\n\nfunction withCollisionSuffix(pathValue: string, sequence: number): string {\n if (sequence <= 0) {\n return pathValue;\n }\n\n const extension = extname(pathValue);\n const baseName = basename(pathValue, extension);\n const parent = dirname(pathValue);\n return join(parent, `${baseName}-${sequence}${extension}`);\n}\n\nfunction resolveReportPath(report: DebugReportOptions, now: Date, pid: number): string {\n const cwd = report.cwd ?? process.cwd();\n const defaultName = `wc-debug-${formatDebugReportTimestamp(now)}-${pid}.jsonl`;\n const explicitPath = typeof report.path === \"string\";\n const basePath = explicitPath ? resolvePath(cwd, report.path) : resolvePath(cwd, defaultName);\n mkdirSync(dirname(basePath), { recursive: true });\n\n if (explicitPath) {\n if (existsSync(basePath) && statSync(basePath).isDirectory()) {\n throw new Error(`debug report path must be a file: ${basePath}`);\n }\n return basePath;\n }\n\n let candidate = basePath;\n let sequence = 0;\n while (existsSync(candidate)) {\n sequence += 1;\n candidate = withCollisionSuffix(basePath, sequence);\n }\n\n return candidate;\n}\n\nfunction createTerminalSink(): DebugSink {\n return {\n write(line) {\n console.error(`[debug] ${line}`);\n },\n close: NOOP_CLOSE,\n };\n}\n\nfunction createFileSink(pathValue: string): DebugSink {\n try {\n const fd = openSync(pathValue, \"a\");\n closeSync(fd);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`debug report path is not writable: ${pathValue} (${message})`);\n }\n\n const stream = createWriteStream(pathValue, { flags: \"a\", encoding: \"utf8\" });\n let streamError: Error | undefined;\n stream.on(\"error\", (error) => {\n streamError = error;\n });\n\n return {\n write(line) {\n if (streamError || stream.destroyed) {\n return;\n }\n stream.write(`${line}\\n`);\n },\n close() {\n if (streamError || stream.destroyed || stream.writableEnded) {\n return Promise.resolve();\n }\n\n return new Promise<void>((resolve) => {\n stream.end(() => {\n resolve();\n });\n });\n },\n };\n}\n\nexport function createDebugChannel(options: CreateDebugChannelOptions): DebugChannel {\n if (!options.enabled) {\n return {\n enabled: false,\n verbosity: options.verbosity ?? \"compact\",\n emit() {\n return;\n },\n close: NOOP_CLOSE,\n };\n }\n\n const verbosity = options.verbosity ?? \"compact\";\n const sinks: DebugSink[] = [];\n let reportPath: string | undefined;\n\n if (options.report) {\n const now = options.now?.() ?? new Date();\n const pid = options.pid ?? process.pid;\n reportPath = resolveReportPath(options.report, now, pid);\n sinks.push(createFileSink(reportPath));\n\n if (options.report.tee) {\n sinks.push(createTerminalSink());\n }\n } else {\n sinks.push(createTerminalSink());\n }\n\n return {\n enabled: true,\n verbosity,\n reportPath,\n emit(event, details = {}, eventOptions = {}) {\n const eventVerbosity = eventOptions.verbosity ?? \"compact\";\n if (!shouldEmitAtVerbosity(verbosity, eventVerbosity)) {\n return;\n }\n\n const payload = JSON.stringify({\n event,\n ...details,\n });\n for (const sink of sinks) {\n sink.write(payload);\n }\n },\n async close() {\n for (const sink of sinks) {\n await sink.close();\n }\n },\n };\n}\n","import { extname } from \"node:path\";\n\nexport type DirectoryExtensionFilter = {\n includeExtensions: Set<string>;\n excludeExtensions: Set<string>;\n effectiveIncludeExtensions: Set<string>;\n};\n\nexport const DEFAULT_INCLUDE_EXTENSIONS = new Set([\n \".md\",\n \".markdown\",\n \".mdx\",\n \".mdc\",\n \".txt\",\n]);\n\nexport function collectExtensionOption(value: string, previous: string[] = []): string[] {\n return [...previous, value];\n}\n\nexport function normalizeExtensionToken(value: string): string | null {\n const trimmed = value.trim().toLowerCase();\n if (!trimmed) {\n return null;\n }\n\n const normalized = trimmed.startsWith(\".\") ? trimmed : `.${trimmed}`;\n if (normalized === \".\") {\n return null;\n }\n\n return normalized;\n}\n\nfunction parseExtensionValues(values: string[] | undefined): Set<string> {\n const parsed = new Set<string>();\n if (!values || values.length === 0) {\n return parsed;\n }\n\n for (const value of values) {\n for (const token of value.split(\",\")) {\n const normalized = normalizeExtensionToken(token);\n if (!normalized) {\n continue;\n }\n parsed.add(normalized);\n }\n }\n\n return parsed;\n}\n\nexport function buildDirectoryExtensionFilter(\n includeValues: string[] | undefined,\n excludeValues: string[] | undefined,\n): DirectoryExtensionFilter {\n const includeFromFlags = parseExtensionValues(includeValues);\n const excludeExtensions = parseExtensionValues(excludeValues);\n\n const includeExtensions =\n includeFromFlags.size > 0 ? includeFromFlags : new Set(DEFAULT_INCLUDE_EXTENSIONS);\n\n const effectiveIncludeExtensions = new Set<string>();\n for (const extension of includeExtensions) {\n if (excludeExtensions.has(extension)) {\n continue;\n }\n effectiveIncludeExtensions.add(extension);\n }\n\n return {\n includeExtensions,\n excludeExtensions,\n effectiveIncludeExtensions,\n };\n}\n\nexport function shouldIncludeFromDirectory(\n filePath: string,\n filter: DirectoryExtensionFilter,\n): boolean {\n const extension = extname(filePath).toLowerCase();\n return filter.effectiveIncludeExtensions.has(extension);\n}\n","import type { SectionedResult } from \"../markdown\";\nimport type { NonWordCollection, WordCounterResult } from \"../wc\";\n\nexport const TOTAL_OF_PARTS = [\n \"words\",\n \"emoji\",\n \"symbols\",\n \"punctuation\",\n \"whitespace\",\n] as const;\n\nexport type TotalOfPart = (typeof TOTAL_OF_PARTS)[number];\n\nexport type TotalOfOverride = {\n parts: TotalOfPart[];\n total: number;\n};\n\ntype TotalOfCounts = Record<TotalOfPart, number>;\n\nconst TOTAL_OF_PART_ALIASES: Record<string, TotalOfPart> = {\n word: \"words\",\n words: \"words\",\n emoji: \"emoji\",\n emojis: \"emoji\",\n symbol: \"symbols\",\n symbols: \"symbols\",\n punction: \"punctuation\",\n punctuation: \"punctuation\",\n whitespace: \"whitespace\",\n};\n\nfunction createTotalOfCounts(): TotalOfCounts {\n return {\n words: 0,\n emoji: 0,\n symbols: 0,\n punctuation: 0,\n whitespace: 0,\n };\n}\n\nfunction collectNonWordCounts(target: TotalOfCounts, nonWords: NonWordCollection | undefined): void {\n if (!nonWords) {\n return;\n }\n\n target.emoji += nonWords.counts.emoji;\n target.symbols += nonWords.counts.symbols;\n target.punctuation += nonWords.counts.punctuation;\n target.whitespace += nonWords.counts.whitespace ?? 0;\n}\n\nfunction collectFromWordCounterResult(result: WordCounterResult): TotalOfCounts {\n const counts = createTotalOfCounts();\n counts.words += result.counts?.words ?? result.total;\n\n if (result.breakdown.mode === \"collector\") {\n collectNonWordCounts(counts, result.breakdown.nonWords);\n return counts;\n }\n\n for (const item of result.breakdown.items) {\n collectNonWordCounts(counts, item.nonWords);\n }\n\n return counts;\n}\n\nfunction collectTotalOfCounts(result: WordCounterResult | SectionedResult): TotalOfCounts {\n if (!(\"section\" in result)) {\n return collectFromWordCounterResult(result);\n }\n\n const counts = createTotalOfCounts();\n for (const item of result.items) {\n const itemCounts = collectFromWordCounterResult(item.result);\n for (const part of TOTAL_OF_PARTS) {\n counts[part] += itemCounts[part];\n }\n }\n return counts;\n}\n\nfunction parseTotalOfToken(token: string): TotalOfPart {\n const normalized = token.trim().toLowerCase();\n const canonical = TOTAL_OF_PART_ALIASES[normalized];\n if (canonical) {\n return canonical;\n }\n throw new Error(\n `Invalid --total-of part: ${token}. Allowed: ${TOTAL_OF_PARTS.join(\", \")}.`,\n );\n}\n\nexport function parseTotalOfOption(value: string): TotalOfPart[] {\n const rawTokens = value\n .split(\",\")\n .map((token) => token.trim())\n .filter((token) => token.length > 0);\n\n if (rawTokens.length === 0) {\n throw new Error(\n `Invalid --total-of value: \"${value}\". Use comma-separated parts from: ${TOTAL_OF_PARTS.join(\", \")}.`,\n );\n }\n\n const parts: TotalOfPart[] = [];\n const seen = new Set<TotalOfPart>();\n for (const token of rawTokens) {\n const parsed = parseTotalOfToken(token);\n if (seen.has(parsed)) {\n continue;\n }\n seen.add(parsed);\n parts.push(parsed);\n }\n\n return parts;\n}\n\nexport function requiresNonWordCollection(parts: readonly TotalOfPart[] | undefined): boolean {\n if (!parts || parts.length === 0) {\n return false;\n }\n return parts.some((part) => part !== \"words\");\n}\n\nexport function requiresWhitespaceCollection(parts: readonly TotalOfPart[] | undefined): boolean {\n if (!parts || parts.length === 0) {\n return false;\n }\n return parts.includes(\"whitespace\");\n}\n\nexport function resolveTotalOfOverride(\n result: WordCounterResult | SectionedResult,\n parts: readonly TotalOfPart[] | undefined,\n): TotalOfOverride | undefined {\n if (!parts || parts.length === 0) {\n return undefined;\n }\n\n const counts = collectTotalOfCounts(result);\n let total = 0;\n for (const part of parts) {\n total += counts[part];\n }\n\n return {\n parts: [...parts],\n total,\n };\n}\n\nexport function formatTotalOfParts(parts: readonly TotalOfPart[]): string {\n return parts.join(\", \");\n}\n","import { Command, Option } from \"commander\";\nimport type { SectionMode } from \"../../markdown\";\nimport { collectExtensionOption } from \"../path/filter\";\nimport { parseTotalOfOption } from \"../total-of\";\nimport type { PathMode } from \"../types\";\nimport type { OutputFormat } from \"../runtime/types\";\nimport type { WordCounterMode } from \"../../wc\";\n\nconst MODE_CHOICES: WordCounterMode[] = [\"chunk\", \"segments\", \"collector\", \"char\", \"char-collector\"];\nconst FORMAT_CHOICES: OutputFormat[] = [\"standard\", \"raw\", \"json\"];\nconst SECTION_CHOICES: SectionMode[] = [\n \"all\",\n \"split\",\n \"frontmatter\",\n \"content\",\n \"per-key\",\n \"split-per-key\",\n];\nconst PATH_MODE_CHOICES: PathMode[] = [\"auto\", \"manual\"];\n\nfunction collectPathValue(value: string, previous: string[] = []): string[] {\n return [...previous, value];\n}\n\nexport function configureProgramOptions(\n program: Command,\n parseMode: (value: string) => WordCounterMode,\n): void {\n program\n .addOption(\n new Option(\"-m, --mode <mode>\", \"breakdown mode\")\n .choices(MODE_CHOICES)\n .argParser(parseMode)\n .default(\"chunk\"),\n )\n .addOption(\n new Option(\"-f, --format <format>\", \"output format\")\n .choices(FORMAT_CHOICES)\n .default(\"standard\"),\n )\n .addOption(\n new Option(\"--section <section>\", \"document section mode\")\n .choices(SECTION_CHOICES)\n .default(\"all\"),\n )\n .addOption(\n new Option(\"--path-mode <mode>\", \"path resolution mode\")\n .choices(PATH_MODE_CHOICES)\n .default(\"auto\"),\n )\n .option(\"--latin-language <language>\", \"hint a language tag for Latin script text\")\n .option(\"--latin-tag <tag>\", \"hint a BCP 47 tag for Latin script text\")\n .option(\"--latin-locale <locale>\", \"legacy alias of --latin-language\")\n .option(\"--han-language <language>\", \"hint a language tag for Han script text\")\n .option(\"--han-tag <tag>\", \"hint a BCP 47 tag for Han script text\")\n .option(\"--non-words\", \"collect emoji, symbols, and punctuation (excludes whitespace)\")\n .option(\n \"--include-whitespace\",\n \"include whitespace counts (implies with --non-words; same as --misc)\",\n )\n .option(\"--misc\", \"collect non-words plus whitespace (alias for --include-whitespace)\")\n .option(\n \"--total-of <parts>\",\n \"override total composition (comma-separated): words,emoji,symbols,punctuation,whitespace\",\n parseTotalOfOption,\n )\n .option(\"--pretty\", \"pretty print JSON output\", false)\n .option(\"--debug\", \"enable debug diagnostics on stderr\")\n .option(\"--verbose\", \"emit verbose per-file debug diagnostics (requires --debug)\")\n .option(\"--debug-report [path]\", \"write debug diagnostics to a report file\")\n .option(\"--debug-report-tee\", \"mirror debug diagnostics to both report file and stderr\")\n .option(\"--debug-tee\", \"alias of --debug-report-tee\")\n .option(\"--merged\", \"show merged aggregate output (default)\")\n .option(\"--per-file\", \"show per-file output plus merged summary\")\n .option(\"--no-progress\", \"disable batch progress indicator\")\n .option(\"--keep-progress\", \"keep final batch progress line visible in standard mode\")\n .option(\"--no-recursive\", \"disable recursive directory traversal\")\n .option(\"--quiet-skips\", \"hide skip diagnostics (applies when --debug is enabled)\")\n .option(\n \"--include-ext <exts>\",\n \"comma-separated extensions to include during directory scanning\",\n collectExtensionOption,\n [],\n )\n .option(\n \"--exclude-ext <exts>\",\n \"comma-separated extensions to exclude during directory scanning\",\n collectExtensionOption,\n [],\n )\n .option(\"-p, --path <path>\", \"read input from file or directory\", collectPathValue, [])\n .argument(\"[text...]\", \"text to count\")\n .showHelpAfterError();\n}\n","let p = process || {}, argv = p.argv || [], env = p.env || {}\nlet isColorSupported =\n\t!(!!env.NO_COLOR || argv.includes(\"--no-color\")) &&\n\t(!!env.FORCE_COLOR || argv.includes(\"--color\") || p.platform === \"win32\" || ((p.stdout || {}).isTTY && env.TERM !== \"dumb\") || !!env.CI)\n\nlet formatter = (open, close, replace = open) =>\n\tinput => {\n\t\tlet string = \"\" + input, index = string.indexOf(close, open.length)\n\t\treturn ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close\n\t}\n\nlet replaceClose = (string, close, replace, index) => {\n\tlet result = \"\", cursor = 0\n\tdo {\n\t\tresult += string.substring(cursor, index) + replace\n\t\tcursor = index + close.length\n\t\tindex = string.indexOf(close, cursor)\n\t} while (~index)\n\treturn result + string.substring(cursor)\n}\n\nlet createColors = (enabled = isColorSupported) => {\n\tlet f = enabled ? formatter : () => String\n\treturn {\n\t\tisColorSupported: enabled,\n\t\treset: f(\"\\x1b[0m\", \"\\x1b[0m\"),\n\t\tbold: f(\"\\x1b[1m\", \"\\x1b[22m\", \"\\x1b[22m\\x1b[1m\"),\n\t\tdim: f(\"\\x1b[2m\", \"\\x1b[22m\", \"\\x1b[22m\\x1b[2m\"),\n\t\titalic: f(\"\\x1b[3m\", \"\\x1b[23m\"),\n\t\tunderline: f(\"\\x1b[4m\", \"\\x1b[24m\"),\n\t\tinverse: f(\"\\x1b[7m\", \"\\x1b[27m\"),\n\t\thidden: f(\"\\x1b[8m\", \"\\x1b[28m\"),\n\t\tstrikethrough: f(\"\\x1b[9m\", \"\\x1b[29m\"),\n\n\t\tblack: f(\"\\x1b[30m\", \"\\x1b[39m\"),\n\t\tred: f(\"\\x1b[31m\", \"\\x1b[39m\"),\n\t\tgreen: f(\"\\x1b[32m\", \"\\x1b[39m\"),\n\t\tyellow: f(\"\\x1b[33m\", \"\\x1b[39m\"),\n\t\tblue: f(\"\\x1b[34m\", \"\\x1b[39m\"),\n\t\tmagenta: f(\"\\x1b[35m\", \"\\x1b[39m\"),\n\t\tcyan: f(\"\\x1b[36m\", \"\\x1b[39m\"),\n\t\twhite: f(\"\\x1b[37m\", \"\\x1b[39m\"),\n\t\tgray: f(\"\\x1b[90m\", \"\\x1b[39m\"),\n\n\t\tbgBlack: f(\"\\x1b[40m\", \"\\x1b[49m\"),\n\t\tbgRed: f(\"\\x1b[41m\", \"\\x1b[49m\"),\n\t\tbgGreen: f(\"\\x1b[42m\", \"\\x1b[49m\"),\n\t\tbgYellow: f(\"\\x1b[43m\", \"\\x1b[49m\"),\n\t\tbgBlue: f(\"\\x1b[44m\", \"\\x1b[49m\"),\n\t\tbgMagenta: f(\"\\x1b[45m\", \"\\x1b[49m\"),\n\t\tbgCyan: f(\"\\x1b[46m\", \"\\x1b[49m\"),\n\t\tbgWhite: f(\"\\x1b[47m\", \"\\x1b[49m\"),\n\n\t\tblackBright: f(\"\\x1b[90m\", \"\\x1b[39m\"),\n\t\tredBright: f(\"\\x1b[91m\", \"\\x1b[39m\"),\n\t\tgreenBright: f(\"\\x1b[92m\", \"\\x1b[39m\"),\n\t\tyellowBright: f(\"\\x1b[93m\", \"\\x1b[39m\"),\n\t\tblueBright: f(\"\\x1b[94m\", \"\\x1b[39m\"),\n\t\tmagentaBright: f(\"\\x1b[95m\", \"\\x1b[39m\"),\n\t\tcyanBright: f(\"\\x1b[96m\", \"\\x1b[39m\"),\n\t\twhiteBright: f(\"\\x1b[97m\", \"\\x1b[39m\"),\n\n\t\tbgBlackBright: f(\"\\x1b[100m\", \"\\x1b[49m\"),\n\t\tbgRedBright: f(\"\\x1b[101m\", \"\\x1b[49m\"),\n\t\tbgGreenBright: f(\"\\x1b[102m\", \"\\x1b[49m\"),\n\t\tbgYellowBright: f(\"\\x1b[103m\", \"\\x1b[49m\"),\n\t\tbgBlueBright: f(\"\\x1b[104m\", \"\\x1b[49m\"),\n\t\tbgMagentaBright: f(\"\\x1b[105m\", \"\\x1b[49m\"),\n\t\tbgCyanBright: f(\"\\x1b[106m\", \"\\x1b[49m\"),\n\t\tbgWhiteBright: f(\"\\x1b[107m\", \"\\x1b[49m\"),\n\t}\n}\n\nmodule.exports = createColors()\nmodule.exports.createColors = createColors\n","import { readFileSync } from \"node:fs\";\nimport { dirname, join, resolve as resolvePath } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport pc from \"picocolors\";\n\nfunction* candidateSearchRoots(): Generator<string> {\n yield dirname(fileURLToPath(import.meta.url));\n\n const argvPath = process.argv[1];\n if (typeof argvPath === \"string\" && argvPath.length > 0) {\n yield dirname(resolvePath(argvPath));\n }\n\n yield process.cwd();\n}\n\nfunction* walkUpDirectories(start: string, maxLevels: number): Generator<string> {\n let current = start;\n for (let depth = 0; depth < maxLevels; depth += 1) {\n yield current;\n const parent = dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n}\n\nfunction resolveVersionFromPath(start: string, maxLevels: number): string | null {\n for (const directory of walkUpDirectories(start, maxLevels)) {\n try {\n const raw = readFileSync(join(directory, \"package.json\"), \"utf8\");\n const data = JSON.parse(raw) as { version?: string };\n if (data.version) {\n return data.version;\n }\n } catch {\n // Try parent directories.\n }\n }\n return null;\n}\n\nfunction resolvePackageVersion(): string {\n const maxLevels = 8;\n\n const seen = new Set<string>();\n for (const root of candidateSearchRoots()) {\n if (seen.has(root)) {\n continue;\n }\n seen.add(root);\n const version = resolveVersionFromPath(root, maxLevels);\n if (version) {\n return version;\n }\n }\n\n return \"0.0.0\";\n}\n\nexport function getFormattedVersionLabel(): string {\n const version = resolvePackageVersion();\n\n return pc.bgBlack(pc.bold(pc.italic(` word-counter ${pc.cyanBright(`ver.${version}`)} `)));\n}\n","export function appendAll<T>(target: T[], source: readonly T[]): void {\n for (const item of source) {\n target.push(item);\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport type { BatchFileInput, BatchSkip } from \"../types\";\n\nexport function isProbablyBinary(buffer: Buffer): boolean {\n if (buffer.length === 0) {\n return false;\n }\n\n const sampleSize = Math.min(buffer.length, 1024);\n let suspicious = 0;\n\n for (let index = 0; index < sampleSize; index += 1) {\n const byte = buffer[index] ?? 0;\n\n if (byte === 0) {\n return true;\n }\n\n if (byte === 9 || byte === 10 || byte === 13) {\n continue;\n }\n\n if (byte >= 32 && byte <= 126) {\n continue;\n }\n\n if (byte >= 128) {\n continue;\n }\n\n suspicious += 1;\n }\n\n return suspicious / sampleSize > 0.3;\n}\n\nexport async function loadBatchInputs(\n filePaths: string[],\n): Promise<{ files: BatchFileInput[]; skipped: BatchSkip[] }> {\n const files: BatchFileInput[] = [];\n const skipped: BatchSkip[] = [];\n\n for (const filePath of filePaths) {\n let buffer: Buffer;\n try {\n buffer = await readFile(filePath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n skipped.push({ path: filePath, reason: `not readable: ${message}` });\n continue;\n }\n\n if (isProbablyBinary(buffer)) {\n skipped.push({ path: filePath, reason: \"binary file\" });\n continue;\n }\n\n files.push({\n path: filePath,\n content: buffer.toString(\"utf8\"),\n });\n }\n\n return { files, skipped };\n}\n","import { type Dirent } from \"node:fs\";\nimport { readdir, stat } from \"node:fs/promises\";\nimport { resolve as resolvePath } from \"node:path\";\nimport { appendAll } from \"../../utils/append-all\";\nimport type { DebugChannel } from \"../debug/channel\";\nimport type { BatchSkip, PathMode } from \"../types\";\nimport {\n buildDirectoryExtensionFilter,\n type DirectoryExtensionFilter,\n shouldIncludeFromDirectory,\n} from \"./filter\";\n\ntype ResolveBatchFilePathOptions = {\n pathMode: PathMode;\n recursive: boolean;\n extensionFilter?: DirectoryExtensionFilter;\n debug?: DebugChannel;\n};\n\ntype PathResolveDebugStats = {\n dedupeAccepted: number;\n dedupeDuplicates: number;\n filterExcluded: number;\n directoryIncluded: number;\n};\n\nasync function expandDirectory(\n directoryPath: string,\n recursive: boolean,\n filter: DirectoryExtensionFilter,\n skipped: BatchSkip[],\n debug: DebugChannel,\n stats: PathResolveDebugStats,\n): Promise<string[]> {\n let entries: Dirent[];\n try {\n entries = await readdir(directoryPath, { withFileTypes: true, encoding: \"utf8\" });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n skipped.push({ path: directoryPath, reason: `directory read failed: ${message}` });\n debug.emit(\"path.resolve.expand.read_failed\", {\n directory: directoryPath,\n reason: `directory read failed: ${message}`,\n });\n return [];\n }\n\n const sortedEntries = entries.slice().sort((left, right) => left.name.localeCompare(right.name));\n const files: string[] = [];\n debug.emit(\"path.resolve.expand.start\", {\n directory: directoryPath,\n entries: sortedEntries.length,\n recursive,\n });\n\n for (const entry of sortedEntries) {\n const entryPath = resolvePath(directoryPath, entry.name);\n\n if (entry.isFile()) {\n if (!shouldIncludeFromDirectory(entryPath, filter)) {\n skipped.push({ path: entryPath, reason: \"extension excluded\" });\n debug.emit(\n \"path.resolve.filter.excluded\",\n {\n path: entryPath,\n reason: \"extension excluded\",\n },\n { verbosity: \"verbose\" },\n );\n stats.filterExcluded += 1;\n continue;\n }\n\n files.push(entryPath);\n stats.directoryIncluded += 1;\n debug.emit(\n \"path.resolve.expand.include\",\n {\n path: entryPath,\n source: \"directory\",\n },\n { verbosity: \"verbose\" },\n );\n continue;\n }\n\n if (!entry.isDirectory() || !recursive) {\n continue;\n }\n\n const nestedFiles = await expandDirectory(entryPath, recursive, filter, skipped, debug, stats);\n appendAll(files, nestedFiles);\n }\n\n debug.emit(\"path.resolve.expand.complete\", {\n directory: directoryPath,\n files: files.length,\n });\n\n return files;\n}\n\nexport async function resolveBatchFilePaths(\n pathInputs: string[],\n options: ResolveBatchFilePathOptions,\n): Promise<{ files: string[]; skipped: BatchSkip[] }> {\n const skipped: BatchSkip[] = [];\n const resolvedFiles = new Set<string>();\n const stats: PathResolveDebugStats = {\n dedupeAccepted: 0,\n dedupeDuplicates: 0,\n filterExcluded: 0,\n directoryIncluded: 0,\n };\n const extensionFilter =\n options.extensionFilter ?? buildDirectoryExtensionFilter(undefined, undefined);\n const debug =\n options.debug ??\n ({\n enabled: false,\n verbosity: \"compact\",\n emit() {\n return;\n },\n close: async () => {\n return;\n },\n } satisfies DebugChannel);\n\n debug.emit(\"path.resolve.inputs\", {\n inputs: pathInputs.length,\n pathMode: options.pathMode,\n recursive: options.recursive,\n });\n\n const addResolvedFile = (\n filePath: string,\n details: { source: \"direct\" | \"directory\"; input: string },\n ): void => {\n if (resolvedFiles.has(filePath)) {\n stats.dedupeDuplicates += 1;\n debug.emit(\n \"path.resolve.dedupe.duplicate\",\n {\n path: filePath,\n source: details.source,\n input: details.input,\n },\n { verbosity: \"verbose\" },\n );\n return;\n }\n\n resolvedFiles.add(filePath);\n stats.dedupeAccepted += 1;\n debug.emit(\n \"path.resolve.dedupe.accept\",\n {\n path: filePath,\n source: details.source,\n input: details.input,\n },\n { verbosity: \"verbose\" },\n );\n };\n\n for (const rawPath of pathInputs) {\n const targetPath = resolvePath(rawPath);\n debug.emit(\"path.resolve.input\", {\n rawPath,\n resolvedPath: targetPath,\n });\n let metadata: Awaited<ReturnType<typeof stat>>;\n\n try {\n metadata = await stat(targetPath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n skipped.push({ path: targetPath, reason: `not readable: ${message}` });\n debug.emit(\"path.resolve.skip\", {\n path: targetPath,\n reason: `not readable: ${message}`,\n });\n continue;\n }\n\n if (metadata.isDirectory() && options.pathMode === \"auto\") {\n debug.emit(\"path.resolve.root.expand\", {\n root: targetPath,\n recursive: options.recursive,\n });\n const files = await expandDirectory(\n targetPath,\n options.recursive,\n extensionFilter,\n skipped,\n debug,\n stats,\n );\n for (const file of files) {\n addResolvedFile(file, { source: \"directory\", input: targetPath });\n }\n continue;\n }\n\n if (!metadata.isFile()) {\n skipped.push({ path: targetPath, reason: \"not a regular file\" });\n debug.emit(\"path.resolve.skip\", {\n path: targetPath,\n reason: \"not a regular file\",\n });\n continue;\n }\n\n addResolvedFile(targetPath, { source: \"direct\", input: targetPath });\n }\n\n const files = [...resolvedFiles].sort((left, right) => left.localeCompare(right));\n debug.emit(\"path.resolve.filter.summary\", {\n excluded: stats.filterExcluded,\n included: stats.directoryIncluded,\n });\n debug.emit(\"path.resolve.dedupe.summary\", {\n accepted: stats.dedupeAccepted,\n duplicates: stats.dedupeDuplicates,\n });\n debug.emit(\"path.resolve.complete\", {\n files: files.length,\n skipped: skipped.length,\n ordering: \"absolute-path-ascending\",\n });\n\n return { files, skipped };\n}\n","export type ProgressOutputStream = {\n isTTY?: boolean;\n write: (chunk: string) => unknown;\n};\n\nexport type BatchProgressSnapshot = {\n completed: number;\n total: number;\n};\n\nexport type BatchProgressReporter = {\n enabled: boolean;\n start: (total: number, startedAtMs?: number) => void;\n advance: (snapshot: BatchProgressSnapshot) => void;\n startFinalizing: () => void;\n finish: () => void;\n};\n\ntype BatchProgressReporterOptions = {\n enabled: boolean;\n stream: ProgressOutputStream;\n clearOnFinish?: boolean;\n};\n\nconst PROGRESS_BAR_WIDTH = 20;\nconst FILLED_BAR_CHAR = \"█\";\nconst EMPTY_BAR_CHAR = \"░\";\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction buildProgressBar(completed: number, total: number): string {\n const safeTotal = Math.max(total, 1);\n const ratio = clamp(completed / safeTotal, 0, 1);\n const filled = completed >= safeTotal ? PROGRESS_BAR_WIDTH : Math.floor(ratio * PROGRESS_BAR_WIDTH);\n const empty = PROGRESS_BAR_WIDTH - filled;\n return `${FILLED_BAR_CHAR.repeat(filled)}${EMPTY_BAR_CHAR.repeat(empty)}`;\n}\n\nfunction formatElapsed(startedAtMs: number): string {\n const elapsedMs = Date.now() - startedAtMs;\n const totalSeconds = Math.max(0, Math.floor(elapsedMs / 1000));\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n const tenths = Math.floor((Math.max(0, elapsedMs) % 1000) / 100);\n return `${String(minutes).padStart(2, \"0\")}:${String(seconds).padStart(2, \"0\")}.${tenths}`;\n}\n\nfunction buildProgressLine(completed: number, total: number, startedAtMs: number): string {\n const safeTotal = Math.max(total, 1);\n const percent = completed >= safeTotal ? 100 : Math.floor((completed / safeTotal) * 100);\n const bar = buildProgressBar(completed, safeTotal);\n const percentText = `${String(percent).padStart(3, \" \")}%`;\n const completedText = String(completed).padStart(String(safeTotal).length, \" \");\n const elapsed = formatElapsed(startedAtMs);\n return `Counting files [${bar}] ${percentText} ${completedText}/${safeTotal} elapsed ${elapsed}`;\n}\n\nfunction buildFinalizingLine(startedAtMs: number): string {\n const elapsed = formatElapsed(startedAtMs);\n return `Finalizing aggregate... elapsed ${elapsed}`;\n}\n\nexport function createBatchProgressReporter(\n options: BatchProgressReporterOptions,\n): BatchProgressReporter {\n const enabled = options.enabled;\n const isTTY = Boolean(options.stream.isTTY);\n const clearOnFinish = options.clearOnFinish ?? true;\n let active = false;\n let total = 0;\n let lastLineLength = 0;\n let startedAtMs = 0;\n let lastRenderedPercent = -1;\n let finalizingStarted = false;\n\n const writeTTYLine = (line: string): void => {\n const trailingPadding =\n lastLineLength > line.length ? \" \".repeat(lastLineLength - line.length) : \"\";\n options.stream.write(`\\r${line}${trailingPadding}`);\n lastLineLength = line.length;\n };\n\n const render = (completed: number): void => {\n const line = buildProgressLine(completed, total, startedAtMs);\n const safeTotal = Math.max(total, 1);\n const percent = completed >= safeTotal ? 100 : Math.floor((completed / safeTotal) * 100);\n if (!isTTY && percent === lastRenderedPercent && completed < safeTotal) {\n return;\n }\n\n lastRenderedPercent = percent;\n\n if (isTTY) {\n writeTTYLine(line);\n return;\n }\n\n lastLineLength = line.length;\n options.stream.write(`${line}\\n`);\n };\n\n const clearLine = (): void => {\n if (lastLineLength === 0) {\n return;\n }\n options.stream.write(`\\r${\" \".repeat(lastLineLength)}\\r`);\n lastLineLength = 0;\n };\n\n return {\n enabled,\n start(nextTotal, nextStartedAtMs) {\n if (!enabled || nextTotal <= 1) {\n return;\n }\n\n total = nextTotal;\n active = true;\n startedAtMs = nextStartedAtMs ?? Date.now();\n lastRenderedPercent = -1;\n finalizingStarted = false;\n render(0);\n },\n advance(snapshot) {\n if (!active) {\n return;\n }\n\n render(snapshot.completed);\n },\n startFinalizing() {\n if (!active || finalizingStarted) {\n return;\n }\n\n finalizingStarted = true;\n const line = buildFinalizingLine(startedAtMs);\n if (isTTY) {\n if (!clearOnFinish) {\n options.stream.write(`\\n${line}`);\n lastLineLength = line.length;\n return;\n }\n writeTTYLine(line);\n return;\n }\n\n lastLineLength = line.length;\n options.stream.write(`${line}\\n`);\n },\n finish() {\n if (!active) {\n return;\n }\n\n if (isTTY) {\n if (clearOnFinish) {\n clearLine();\n } else {\n options.stream.write(\"\\n\");\n }\n }\n active = false;\n },\n };\n}\n","export function ensureArrayContainer(\n result: Record<string, unknown>,\n key: string,\n): Record<string, unknown>[] {\n const existing = result[key];\n if (Array.isArray(existing)) {\n return existing as Record<string, unknown>[];\n }\n const list: Record<string, unknown>[] = [];\n result[key] = list;\n return list;\n}\n\nexport function flattenArrayTables(result: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(result)) {\n if (!Array.isArray(value)) {\n continue;\n }\n const flattened = value\n .map((entry) =>\n Object.entries(entry)\n .map(([entryKey, entryValue]) => `${entryKey}=${entryValue}`)\n .join(\", \"),\n )\n .join(\" | \");\n result[key] = flattened;\n }\n}\n","function stripKeyQuotes(key: string): string {\n const trimmed = key.trim();\n if (\n (trimmed.startsWith(\"\\\"\") && trimmed.endsWith(\"\\\"\")) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))\n ) {\n return trimmed.slice(1, -1);\n }\n return trimmed;\n}\n\nexport function normalizeKeyPath(key: string): string | null {\n const trimmed = key.trim();\n if (!trimmed) {\n return null;\n }\n\n if (\n (trimmed.startsWith(\"\\\"\") && trimmed.endsWith(\"\\\"\")) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))\n ) {\n const unquoted = stripKeyQuotes(trimmed);\n return unquoted ? unquoted : null;\n }\n\n const segments = trimmed.split(\".\").map((segment) => segment.trim());\n if (segments.some((segment) => !segment)) {\n return null;\n }\n return segments.join(\".\");\n}\n","export function stripInlineComment(line: string): string {\n let inString: \"single\" | \"double\" | null = null;\n let escaped = false;\n\n for (let i = 0; i < line.length; i += 1) {\n const char = line[i] ?? \"\";\n\n if (inString) {\n if (escaped) {\n escaped = false;\n continue;\n }\n\n if (char === \"\\\\\" && inString === \"double\") {\n escaped = true;\n continue;\n }\n\n if (inString === \"double\" && char === \"\\\"\") {\n inString = null;\n continue;\n }\n\n if (inString === \"single\" && char === \"'\") {\n inString = null;\n continue;\n }\n\n continue;\n }\n\n if (char === \"\\\"\") {\n inString = \"double\";\n continue;\n }\n\n if (char === \"'\") {\n inString = \"single\";\n continue;\n }\n\n if (char === \"#\") {\n return line.slice(0, i).trimEnd();\n }\n }\n\n return line;\n}\n\nfunction unescapeBasic(input: string): string {\n return input\n .replace(/\\\\\\\\/g, \"\\\\\")\n .replace(/\\\\\"/g, \"\\\"\")\n .replace(/\\\\n/g, \"\\n\")\n .replace(/\\\\t/g, \"\\t\")\n .replace(/\\\\r/g, \"\\r\");\n}\n\nexport function parseStringLiteral(value: string): string | null {\n if (value.startsWith('\"\"\"') && value.endsWith('\"\"\"')) {\n const inner = value.slice(3, -3);\n return unescapeBasic(inner);\n }\n\n if (value.startsWith(\"'''\") && value.endsWith(\"'''\")) {\n return value.slice(3, -3);\n }\n\n if (value.startsWith(\"\\\"\") && value.endsWith(\"\\\"\")) {\n return unescapeBasic(value.slice(1, -1));\n }\n\n if (value.startsWith(\"'\") && value.endsWith(\"'\")) {\n return value.slice(1, -1);\n }\n\n return null;\n}\n","import { normalizeKeyPath } from \"./keys\";\nimport { parseStringLiteral } from \"./strings\";\nimport type { TomlValue } from \"./types\";\n\nfunction parsePrimitive(raw: string): string | number | boolean | null {\n const value = raw.trim();\n if (!value) {\n return null;\n }\n\n const stringLiteral = parseStringLiteral(value);\n if (stringLiteral !== null) {\n return stringLiteral;\n }\n\n if (value === \"true\") {\n return true;\n }\n\n if (value === \"false\") {\n return false;\n }\n\n if (/^[+-]?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/.test(value)) {\n return Number(value);\n }\n\n if (/^\\d{4}-\\d{2}-\\d{2}/.test(value)) {\n return value;\n }\n\n return value;\n}\n\nfunction parseArray(raw: string): Array<string | number | boolean> | null {\n const value = raw.trim();\n if (!value.startsWith(\"[\") || !value.endsWith(\"]\")) {\n return null;\n }\n\n const inner = value.slice(1, -1).trim();\n if (!inner) {\n return [];\n }\n\n const items: Array<string | number | boolean> = [];\n let current = \"\";\n let inString: \"single\" | \"double\" | null = null;\n let escaped = false;\n\n for (let i = 0; i < inner.length; i += 1) {\n const char = inner[i] ?? \"\";\n\n if (inString) {\n current += char;\n if (escaped) {\n escaped = false;\n continue;\n }\n\n if (char === \"\\\\\" && inString === \"double\") {\n escaped = true;\n continue;\n }\n\n if (inString === \"double\" && char === \"\\\"\") {\n inString = null;\n } else if (inString === \"single\" && char === \"'\") {\n inString = null;\n }\n continue;\n }\n\n if (char === \"\\\"\") {\n inString = \"double\";\n current += char;\n continue;\n }\n\n if (char === \"'\") {\n inString = \"single\";\n current += char;\n continue;\n }\n\n if (char === \",\") {\n const item = parsePrimitive(current);\n if (item === null) {\n return null;\n }\n items.push(item);\n current = \"\";\n continue;\n }\n\n current += char;\n }\n\n const finalItem = parsePrimitive(current);\n if (finalItem === null) {\n return null;\n }\n items.push(finalItem);\n\n return items;\n}\n\nfunction parseInlineTable(raw: string): Record<string, TomlValue> | null {\n const trimmed = raw.trim();\n if (!trimmed.startsWith(\"{\") || !trimmed.endsWith(\"}\")) {\n return null;\n }\n\n const inner = trimmed.slice(1, -1).trim();\n if (!inner) {\n return {};\n }\n\n const pairs: string[] = [];\n let current = \"\";\n let inString: \"single\" | \"double\" | null = null;\n let escaped = false;\n let bracketDepth = 0;\n let braceDepth = 0;\n\n for (let i = 0; i < inner.length; i += 1) {\n const char = inner[i] ?? \"\";\n\n if (inString) {\n current += char;\n if (escaped) {\n escaped = false;\n continue;\n }\n\n if (char === \"\\\\\" && inString === \"double\") {\n escaped = true;\n continue;\n }\n\n if (inString === \"double\" && char === \"\\\"\") {\n inString = null;\n } else if (inString === \"single\" && char === \"'\") {\n inString = null;\n }\n continue;\n }\n\n if (char === \"\\\"\") {\n inString = \"double\";\n current += char;\n continue;\n }\n\n if (char === \"'\") {\n inString = \"single\";\n current += char;\n continue;\n }\n\n if (char === \"[\") {\n bracketDepth += 1;\n current += char;\n continue;\n }\n\n if (char === \"]\") {\n if (bracketDepth > 0) {\n bracketDepth -= 1;\n }\n current += char;\n continue;\n }\n\n if (char === \"{\") {\n braceDepth += 1;\n current += char;\n continue;\n }\n\n if (char === \"}\") {\n if (braceDepth > 0) {\n braceDepth -= 1;\n }\n current += char;\n continue;\n }\n\n if (char === \",\" && bracketDepth === 0 && braceDepth === 0) {\n pairs.push(current);\n current = \"\";\n continue;\n }\n\n current += char;\n }\n\n if (current.trim()) {\n pairs.push(current);\n }\n\n const output: Record<string, TomlValue> = {};\n for (const pair of pairs) {\n const separatorIndex = pair.indexOf(\"=\");\n if (separatorIndex === -1) {\n return null;\n }\n const key = normalizeKeyPath(pair.slice(0, separatorIndex));\n if (!key) {\n return null;\n }\n const valueRaw = pair.slice(separatorIndex + 1).trim();\n if (!valueRaw) {\n return null;\n }\n if (valueRaw.startsWith(\"{\")) {\n return null;\n }\n const normalized = normalizeValue(valueRaw);\n if (normalized === null) {\n return null;\n }\n if (typeof normalized === \"object\" && !Array.isArray(normalized)) {\n return null;\n }\n output[key] = normalized;\n }\n\n return output;\n}\n\nexport function normalizeValue(value: string): TomlValue | null {\n if (!value) {\n return null;\n }\n\n const trimmed = value.trim();\n if (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) {\n return parseInlineTable(trimmed);\n }\n\n const array = parseArray(trimmed);\n if (array) {\n return array;\n }\n\n if (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\")) {\n return null;\n }\n\n return parsePrimitive(trimmed);\n}\n\nexport function toPlainText(value: unknown): string {\n if (value == null) {\n return \"\";\n }\n if (Array.isArray(value)) {\n return value.map((item) => String(item)).join(\", \");\n }\n return String(value);\n}\n","import { ensureArrayContainer, flattenArrayTables } from \"./arrays\";\nimport { normalizeKeyPath } from \"./keys\";\nimport { stripInlineComment } from \"./strings\";\nimport { normalizeValue, toPlainText } from \"./values\";\n\nexport function parseTomlFrontmatter(frontmatter: string): Record<string, unknown> | null {\n const result: Record<string, unknown> = {};\n const lines = frontmatter.split(\"\\n\");\n let tablePrefix = \"\";\n let tableTarget: Record<string, unknown> | null = null;\n let tablePrefixInList = false;\n\n for (let index = 0; index < lines.length; index += 1) {\n const rawLine = lines[index] ?? \"\";\n const trimmedLine = rawLine.trim();\n if (!trimmedLine || trimmedLine.startsWith(\"#\")) {\n continue;\n }\n\n if (trimmedLine.startsWith(\"[[\")) {\n const match = trimmedLine.match(/^\\[\\[([^\\]]+)]]$/);\n if (!match) {\n return null;\n }\n const normalizedTable = normalizeKeyPath(match[1] ?? \"\");\n if (!normalizedTable) {\n return null;\n }\n const list = ensureArrayContainer(result, normalizedTable);\n const newEntry: Record<string, unknown> = {};\n list.push(newEntry);\n tableTarget = newEntry;\n tablePrefix = normalizedTable;\n tablePrefixInList = true;\n continue;\n }\n\n const tableMatch = trimmedLine.match(/^\\[([^\\]]+)]$/);\n if (tableMatch) {\n const normalizedTable = normalizeKeyPath(tableMatch[1] ?? \"\");\n if (!normalizedTable) {\n return null;\n }\n tablePrefix = normalizedTable;\n tablePrefixInList = false;\n tableTarget = null;\n continue;\n }\n\n const lineForParsing = /(\"\"\"|''')/.test(rawLine) ? rawLine : stripInlineComment(rawLine);\n const separatorIndex = lineForParsing.indexOf(\"=\");\n if (separatorIndex === -1) {\n return null;\n }\n\n const keyRaw = lineForParsing.slice(0, separatorIndex);\n const key = normalizeKeyPath(keyRaw);\n let valueRaw = lineForParsing.slice(separatorIndex + 1).trim();\n if (!key) {\n return null;\n }\n\n const tripleDelimiter = valueRaw.startsWith('\"\"\"') ? '\"\"\"' : valueRaw.startsWith(\"'''\") ? \"'''\" : null;\n if (tripleDelimiter) {\n const closingIndex = valueRaw.indexOf(tripleDelimiter, tripleDelimiter.length);\n if (closingIndex !== -1) {\n const after = valueRaw.slice(closingIndex + tripleDelimiter.length);\n const strippedAfter = stripInlineComment(after);\n valueRaw = `${valueRaw.slice(0, closingIndex + tripleDelimiter.length)}${strippedAfter}`;\n } else {\n const delimiter = tripleDelimiter;\n let combined = valueRaw;\n let closed = false;\n while (index + 1 < lines.length) {\n index += 1;\n const nextLine = lines[index] ?? \"\";\n combined += `\\n${nextLine}`;\n if (new RegExp(`${delimiter}\\\\s*$`).test(nextLine)) {\n closed = true;\n break;\n }\n }\n if (!closed) {\n return null;\n }\n valueRaw = combined;\n }\n }\n\n const normalized = normalizeValue(valueRaw);\n if (normalized === null) {\n return null;\n }\n\n const fullKey = tablePrefix ? `${tablePrefix}.${key}` : key;\n if (typeof normalized === \"object\" && !Array.isArray(normalized)) {\n for (const [inlineKey, inlineValue] of Object.entries(normalized)) {\n const entryKey = tablePrefixInList ? `${key}.${inlineKey}` : `${fullKey}.${inlineKey}`;\n if (tablePrefixInList && tableTarget) {\n tableTarget[entryKey] = toPlainText(inlineValue);\n } else {\n result[entryKey] = toPlainText(inlineValue);\n }\n }\n continue;\n }\n\n if (tablePrefixInList && tableTarget) {\n tableTarget[key] = toPlainText(normalized);\n continue;\n }\n\n result[fullKey] = toPlainText(normalized);\n }\n\n flattenArrayTables(result);\n\n return result;\n}\n","import { parseDocument } from \"yaml\";\nimport { parseTomlFrontmatter } from \"./toml-simple\";\nimport type { FrontmatterType, ParsedMarkdown } from \"./types\";\n\nconst FENCE_TO_TYPE: Record<string, FrontmatterType> = {\n \"---\": \"yaml\",\n \"+++\": \"toml\",\n \";;;\": \"json\",\n};\n\nfunction normalizeNewlines(input: string): string {\n return input.replace(/\\r\\n/g, \"\\n\");\n}\n\nfunction stripBom(line: string): string {\n return line.startsWith(\"\\uFEFF\") ? line.slice(1) : line;\n}\n\nfunction getFenceType(line: string): FrontmatterType | null {\n const match = line.match(/^[\\t ]*(---|\\+\\+\\+|;;;)[\\t ]*$/);\n if (!match) {\n return null;\n }\n return FENCE_TO_TYPE[match[1] ?? \"\"] ?? null;\n}\n\nfunction parseFrontmatter(frontmatter: string, type: FrontmatterType | null): Record<string, unknown> | null {\n if (!type) {\n return null;\n }\n\n if (type === \"json\") {\n try {\n return JSON.parse(frontmatter) as Record<string, unknown>;\n } catch {\n return null;\n }\n }\n\n if (type === \"yaml\") {\n const doc = parseDocument(frontmatter, { prettyErrors: false });\n if (doc.errors.length > 0) {\n return null;\n }\n const data = doc.toJSON();\n if (!data || typeof data !== \"object\" || Array.isArray(data)) {\n return null;\n }\n return data as Record<string, unknown>;\n }\n\n if (type === \"toml\") {\n return parseTomlFrontmatter(frontmatter);\n }\n\n return null;\n}\n\nfunction extractJsonBlock(text: string, startIndex: number): { jsonText: string; endIndex: number } | null {\n let depth = 0;\n let inString = false;\n let escaped = false;\n\n for (let i = startIndex; i < text.length; i += 1) {\n const char = text[i] ?? \"\";\n\n if (inString) {\n if (escaped) {\n escaped = false;\n continue;\n }\n\n if (char === \"\\\\\") {\n escaped = true;\n continue;\n }\n\n if (char === \"\\\"\") {\n inString = false;\n }\n\n continue;\n }\n\n if (char === \"\\\"\") {\n inString = true;\n continue;\n }\n\n if (char === \"{\") {\n depth += 1;\n continue;\n }\n\n if (char === \"}\") {\n depth -= 1;\n if (depth === 0) {\n const jsonText = text.slice(startIndex, i + 1);\n return { jsonText, endIndex: i };\n }\n }\n }\n\n return null;\n}\n\nexport function parseMarkdown(input: string): ParsedMarkdown {\n const normalized = normalizeNewlines(input);\n const lines = normalized.split(\"\\n\");\n if (lines.length === 0) {\n return { frontmatter: null, content: normalized, data: null, frontmatterType: null };\n }\n\n lines[0] = stripBom(lines[0] ?? \"\");\n const normalizedWithoutBom = lines.join(\"\\n\");\n\n const openingType = getFenceType(lines[0] ?? \"\");\n if (!openingType) {\n const leadingWhitespace = normalizedWithoutBom.match(/^[\\t \\n]*/)?.[0] ?? \"\";\n const jsonStart = leadingWhitespace.length;\n if (normalizedWithoutBom[jsonStart] !== \"{\") {\n return { frontmatter: null, content: normalizedWithoutBom, data: null, frontmatterType: null };\n }\n\n const jsonBlock = extractJsonBlock(normalizedWithoutBom, jsonStart);\n if (!jsonBlock) {\n return { frontmatter: null, content: normalizedWithoutBom, data: null, frontmatterType: null };\n }\n\n const frontmatter = jsonBlock.jsonText;\n let content = normalizedWithoutBom.slice(jsonBlock.endIndex + 1);\n if (content.startsWith(\"\\n\")) {\n content = content.slice(1);\n }\n const data = parseFrontmatter(frontmatter, \"json\");\n if (!data) {\n return { frontmatter: null, content: normalizedWithoutBom, data: null, frontmatterType: null };\n }\n\n return {\n frontmatter,\n content,\n data,\n frontmatterType: \"json\",\n };\n }\n\n let closingIndex = -1;\n for (let i = 1; i < lines.length; i += 1) {\n if (getFenceType(lines[i] ?? \"\") === openingType) {\n closingIndex = i;\n break;\n }\n }\n\n if (closingIndex === -1) {\n return { frontmatter: null, content: normalizedWithoutBom, data: null, frontmatterType: null };\n }\n\n const frontmatter = lines.slice(1, closingIndex).join(\"\\n\");\n const content = lines.slice(closingIndex + 1).join(\"\\n\");\n const data = parseFrontmatter(frontmatter, openingType);\n\n return {\n frontmatter,\n content,\n data,\n frontmatterType: openingType,\n };\n}\n","const segmenterCache = new Map<string, Intl.Segmenter>();\nconst graphemeSegmenterCache = new Map<string, Intl.Segmenter>();\n\nexport function getSegmenter(locale: string): Intl.Segmenter {\n const cached = segmenterCache.get(locale);\n if (cached) {\n return cached;\n }\n const segmenter = new Intl.Segmenter(locale, { granularity: \"word\" });\n segmenterCache.set(locale, segmenter);\n return segmenter;\n}\n\nexport function getGraphemeSegmenter(locale: string): Intl.Segmenter {\n const cached = graphemeSegmenterCache.get(locale);\n if (cached) {\n return cached;\n }\n const segmenter = new Intl.Segmenter(locale, { granularity: \"grapheme\" });\n graphemeSegmenterCache.set(locale, segmenter);\n return segmenter;\n}\n\nfunction supportsSegmenter(): boolean {\n return typeof Intl !== \"undefined\" && typeof Intl.Segmenter === \"function\";\n}\n\nexport function countWordsForLocale(text: string, locale: string): number {\n const segmenter = getSegmenter(locale);\n let count = 0;\n for (const segment of segmenter.segment(text)) {\n if (segment.isWordLike) {\n count++;\n }\n }\n return count;\n}\n\nexport function countCharsForLocale(text: string, locale: string): number {\n if (!supportsSegmenter()) {\n return Array.from(text).length;\n }\n const segmenter = getGraphemeSegmenter(locale);\n let count = 0;\n for (const _segment of segmenter.segment(text)) {\n count++;\n }\n return count;\n}\n","import type { NonWordCollection, WhitespaceCounts } from \"./types\";\nimport { appendAll } from \"../utils/append-all\";\n\nconst emojiRegex = /(?:\\p{Extended_Pictographic}|\\p{Emoji_Presentation})/u;\nconst emojiPresentationRegex = /\\p{Emoji_Presentation}/u;\nconst keycapEmojiRegex = /[0-9#*]\\uFE0F?\\u20E3/u;\nconst symbolRegex = /\\p{S}/u;\nconst punctuationRegex = /\\p{P}/u;\nconst whitespaceRegex = /\\s/u;\nconst newlineChars = new Set([\"\\n\", \"\\r\", \"\\u2028\", \"\\u2029\"]);\n\nexport function createNonWordCollection(): NonWordCollection {\n return {\n emoji: [],\n symbols: [],\n punctuation: [],\n counts: {\n emoji: 0,\n symbols: 0,\n punctuation: 0,\n },\n };\n}\n\nexport function addNonWord(\n collection: NonWordCollection,\n category: \"emoji\" | \"symbol\" | \"punctuation\",\n segment: string,\n): void {\n if (category === \"emoji\") {\n collection.emoji.push(segment);\n collection.counts.emoji += 1;\n return;\n }\n if (category === \"symbol\") {\n collection.symbols.push(segment);\n collection.counts.symbols += 1;\n return;\n }\n collection.punctuation.push(segment);\n collection.counts.punctuation += 1;\n}\n\nexport function addWhitespace(\n collection: NonWordCollection,\n segment: string,\n): number {\n let whitespace = collection.whitespace;\n let count = 0;\n for (const char of segment) {\n if (char === \" \") {\n whitespace = whitespace ?? createWhitespaceCounts();\n whitespace.spaces += 1;\n count += 1;\n continue;\n }\n if (char === \"\\t\") {\n whitespace = whitespace ?? createWhitespaceCounts();\n whitespace.tabs += 1;\n count += 1;\n continue;\n }\n if (newlineChars.has(char)) {\n whitespace = whitespace ?? createWhitespaceCounts();\n whitespace.newlines += 1;\n count += 1;\n continue;\n }\n if (whitespaceRegex.test(char)) {\n whitespace = whitespace ?? createWhitespaceCounts();\n whitespace.other += 1;\n count += 1;\n }\n }\n\n if (count > 0) {\n collection.whitespace = whitespace ?? createWhitespaceCounts();\n collection.counts.whitespace = (collection.counts.whitespace ?? 0) + count;\n }\n\n return count;\n}\n\nexport function classifyNonWordSegment(\n segment: string,\n): \"emoji\" | \"symbol\" | \"punctuation\" | null {\n const hasEmojiVariationSelector = segment.includes(\"\\uFE0F\");\n if (\n keycapEmojiRegex.test(segment) ||\n emojiPresentationRegex.test(segment) ||\n (hasEmojiVariationSelector && emojiRegex.test(segment))\n ) {\n return \"emoji\";\n }\n if (symbolRegex.test(segment)) {\n return \"symbol\";\n }\n if (punctuationRegex.test(segment)) {\n return \"punctuation\";\n }\n return null;\n}\n\nexport function mergeNonWordCollections(\n target: NonWordCollection,\n source: NonWordCollection,\n): NonWordCollection {\n if (source.counts.emoji > 0) {\n appendAll(target.emoji, source.emoji);\n target.counts.emoji += source.counts.emoji;\n }\n if (source.counts.symbols > 0) {\n appendAll(target.symbols, source.symbols);\n target.counts.symbols += source.counts.symbols;\n }\n if (source.counts.punctuation > 0) {\n appendAll(target.punctuation, source.punctuation);\n target.counts.punctuation += source.counts.punctuation;\n }\n if (source.counts.whitespace && source.counts.whitespace > 0 && source.whitespace) {\n const whitespace = target.whitespace ?? createWhitespaceCounts();\n whitespace.spaces += source.whitespace.spaces;\n whitespace.tabs += source.whitespace.tabs;\n whitespace.newlines += source.whitespace.newlines;\n whitespace.other += source.whitespace.other;\n target.whitespace = whitespace;\n target.counts.whitespace = (target.counts.whitespace ?? 0) + source.counts.whitespace;\n }\n return target;\n}\n\nfunction createWhitespaceCounts(): WhitespaceCounts {\n return { spaces: 0, tabs: 0, newlines: 0, other: 0 };\n}\n","import { countCharsForLocale, getSegmenter } from \"./segmenter\";\nimport {\n addNonWord,\n addWhitespace,\n classifyNonWordSegment,\n createNonWordCollection,\n mergeNonWordCollections,\n} from \"./non-words\";\nimport { appendAll } from \"../utils/append-all\";\nimport type {\n CharCollectorBreakdown,\n ChunkAnalysis,\n CollectorBreakdown,\n LocaleChunk,\n NonWordCollection,\n} from \"./types\";\n\ntype CharAnalysis = LocaleChunk & { chars: number; nonWords?: NonWordCollection };\ntype CharChunkAnalysis = CharAnalysis & { wordChars: number; nonWordChars: number };\n\nexport function analyzeChunk(\n chunk: LocaleChunk,\n collectNonWords?: boolean,\n includeWhitespace?: boolean,\n): ChunkAnalysis {\n const segmenter = getSegmenter(chunk.locale);\n const segments: string[] = [];\n const nonWords: NonWordCollection | null = collectNonWords\n ? createNonWordCollection()\n : null;\n for (const part of segmenter.segment(chunk.text)) {\n if (part.isWordLike) {\n segments.push(part.segment);\n } else if (collectNonWords && nonWords) {\n if (includeWhitespace) {\n addWhitespace(nonWords, part.segment);\n }\n const category = classifyNonWordSegment(part.segment);\n if (category) {\n addNonWord(nonWords, category, part.segment);\n }\n }\n }\n return {\n locale: chunk.locale,\n text: chunk.text,\n segments,\n words: segments.length,\n nonWords: nonWords ?? undefined,\n };\n}\n\nexport function analyzeCharChunk(\n chunk: LocaleChunk,\n collectNonWords?: boolean,\n includeWhitespace?: boolean,\n): CharChunkAnalysis {\n const segmenter = getSegmenter(chunk.locale);\n const nonWords: NonWordCollection | null = collectNonWords\n ? createNonWordCollection()\n : null;\n let chars = 0;\n let wordChars = 0;\n let nonWordChars = 0;\n\n for (const part of segmenter.segment(chunk.text)) {\n if (part.isWordLike) {\n const count = countCharsForLocale(part.segment, chunk.locale);\n chars += count;\n wordChars += count;\n continue;\n }\n\n if (collectNonWords && nonWords) {\n let whitespaceCount = 0;\n if (includeWhitespace) {\n whitespaceCount = addWhitespace(nonWords, part.segment);\n }\n const category = classifyNonWordSegment(part.segment);\n if (category) {\n addNonWord(nonWords, category, part.segment);\n }\n if (category || whitespaceCount > 0) {\n const count = countCharsForLocale(part.segment, chunk.locale);\n chars += count;\n nonWordChars += count;\n }\n }\n }\n\n return {\n locale: chunk.locale,\n text: chunk.text,\n chars,\n wordChars,\n nonWordChars,\n nonWords: nonWords ?? undefined,\n };\n}\n\nexport function aggregateCharsByLocale(\n chunks: CharChunkAnalysis[],\n): Array<CharCollectorBreakdown & { wordChars: number; nonWordChars: number }> {\n const order: string[] = [];\n const map = new Map<\n string,\n CharCollectorBreakdown & { wordChars: number; nonWordChars: number }\n >();\n\n for (const chunk of chunks) {\n const existing = map.get(chunk.locale);\n if (existing) {\n existing.chars += chunk.chars;\n existing.wordChars += chunk.wordChars;\n existing.nonWordChars += chunk.nonWordChars;\n if (chunk.nonWords) {\n if (!existing.nonWords) {\n existing.nonWords = createNonWordCollection();\n }\n mergeNonWordCollections(existing.nonWords, chunk.nonWords);\n }\n continue;\n }\n\n order.push(chunk.locale);\n map.set(chunk.locale, {\n locale: chunk.locale,\n chars: chunk.chars,\n wordChars: chunk.wordChars,\n nonWordChars: chunk.nonWordChars,\n nonWords: chunk.nonWords\n ? mergeNonWordCollections(createNonWordCollection(), chunk.nonWords)\n : undefined,\n });\n }\n\n return order.map((locale) => map.get(locale)!);\n}\n\nexport function aggregateByLocale(\n chunks: ChunkAnalysis[]\n): CollectorBreakdown[] {\n const order: string[] = [];\n const map = new Map<string, CollectorBreakdown>();\n\n for (const chunk of chunks) {\n const existing = map.get(chunk.locale);\n if (existing) {\n existing.words += chunk.words;\n appendAll(existing.segments, chunk.segments);\n continue;\n }\n\n order.push(chunk.locale);\n map.set(chunk.locale, {\n locale: chunk.locale,\n words: chunk.words,\n segments: [...chunk.segments],\n });\n }\n\n return order.map((locale) => map.get(locale)!);\n}\n","import type { WordCounterMode } from \"./types\";\n\nconst MODE_ALIASES: Record<string, WordCounterMode> = {\n chunk: \"chunk\",\n chunks: \"chunk\",\n segments: \"segments\",\n segment: \"segments\",\n seg: \"segments\",\n collector: \"collector\",\n collect: \"collector\",\n colle: \"collector\",\n char: \"char\",\n chars: \"char\",\n character: \"char\",\n characters: \"char\",\n \"char-collector\": \"char-collector\",\n};\n\nconst CHAR_MODE_ALIASES = new Set([\"char\", \"chars\", \"character\", \"characters\"]);\nconst COLLECTOR_MODE_ALIASES = new Set([\"collector\", \"collect\", \"colle\", \"col\"]);\n\nfunction collapseSeparators(value: string): string {\n return value.replace(/[-_\\s]+/g, \"\");\n}\n\nfunction isComposedCharCollectorFromTokens(value: string): boolean {\n const tokens = value\n .split(/[-_\\s]+/)\n .map((token) => token.trim())\n .filter((token) => token.length > 0);\n if (tokens.length < 2) {\n return false;\n }\n\n let hasCharAlias = false;\n let hasCollectorAlias = false;\n for (const token of tokens) {\n if (CHAR_MODE_ALIASES.has(token)) {\n hasCharAlias = true;\n continue;\n }\n if (COLLECTOR_MODE_ALIASES.has(token)) {\n hasCollectorAlias = true;\n continue;\n }\n return false;\n }\n\n return hasCharAlias && hasCollectorAlias;\n}\n\nfunction isComposedCharCollectorCompact(value: string): boolean {\n for (const charAlias of CHAR_MODE_ALIASES) {\n for (const collectorAlias of COLLECTOR_MODE_ALIASES) {\n if (value === `${charAlias}${collectorAlias}` || value === `${collectorAlias}${charAlias}`) {\n return true;\n }\n }\n }\n return false;\n}\n\nexport function normalizeMode(input?: string | null): WordCounterMode | null {\n if (!input) {\n return null;\n }\n const normalized = input.trim().toLowerCase();\n const direct = MODE_ALIASES[normalized];\n if (direct) {\n return direct;\n }\n\n if (isComposedCharCollectorFromTokens(normalized)) {\n return \"char-collector\";\n }\n\n const compact = collapseSeparators(normalized);\n if (isComposedCharCollectorCompact(compact)) {\n return \"char-collector\";\n }\n\n return MODE_ALIASES[compact] ?? null;\n}\n\nexport function resolveMode(\n input?: string | null,\n fallback: WordCounterMode = \"chunk\",\n): WordCounterMode {\n return normalizeMode(input) ?? fallback;\n}\n","export const DEFAULT_LOCALE = \"und-Latn\";\nexport const DEFAULT_HAN_TAG = \"zh-Hani\";\n\nexport interface LocaleDetectOptions {\n latinLanguageHint?: string;\n latinTagHint?: string;\n latinLocaleHint?: string;\n hanLanguageHint?: string;\n hanTagHint?: string;\n}\n\nconst regex = {\n hiragana: /\\p{Script=Hiragana}/u,\n katakana: /\\p{Script=Katakana}/u,\n hangul: /\\p{Script=Hangul}/u,\n han: /\\p{Script=Han}/u,\n latin: /\\p{Script=Latin}/u,\n arabic: /\\p{Script=Arabic}/u,\n cyrillic: /\\p{Script=Cyrillic}/u,\n devanagari: /\\p{Script=Devanagari}/u,\n thai: /\\p{Script=Thai}/u,\n};\n\nconst latinLocaleHints: Array<{ locale: string; regex: RegExp }> = [\n { locale: \"de\", regex: /[äöüÄÖÜß]/ },\n { locale: \"es\", regex: /[ñÑ¿¡]/ },\n { locale: \"pt\", regex: /[ãõÃÕ]/ },\n { locale: \"fr\", regex: /[œŒæÆ]/ },\n];\n\nconst latinLocales = new Set<string>([\n DEFAULT_LOCALE,\n ...latinLocaleHints.map((hint) => hint.locale),\n]);\n\nexport function isLatinLocale(locale: string): boolean {\n return latinLocales.has(locale);\n}\n\nfunction detectLatinLocale(char: string): string {\n for (const hint of latinLocaleHints) {\n if (hint.regex.test(char)) {\n return hint.locale;\n }\n }\n return DEFAULT_LOCALE;\n}\n\nfunction resolveLatinHint(options: LocaleDetectOptions): string | undefined {\n const latinTagHint = options.latinTagHint?.trim();\n if (latinTagHint) {\n return latinTagHint;\n }\n\n const latinLanguageHint = options.latinLanguageHint?.trim();\n if (latinLanguageHint) {\n return latinLanguageHint;\n }\n\n const latinLocaleHint = options.latinLocaleHint?.trim();\n if (latinLocaleHint) {\n return latinLocaleHint;\n }\n\n return undefined;\n}\n\nfunction resolveHanHint(options: LocaleDetectOptions): string | undefined {\n const hanTagHint = options.hanTagHint?.trim();\n if (hanTagHint) {\n return hanTagHint;\n }\n\n const hanLanguageHint = options.hanLanguageHint?.trim();\n if (hanLanguageHint) {\n return hanLanguageHint;\n }\n\n return undefined;\n}\n\nexport function detectLocaleForChar(\n char: string,\n previousLocale?: string | null,\n options: LocaleDetectOptions = {}\n): string | null {\n if (regex.hiragana.test(char) || regex.katakana.test(char)) {\n return \"ja\";\n }\n if (regex.hangul.test(char)) {\n return \"ko\";\n }\n if (regex.arabic.test(char)) {\n return \"ar\";\n }\n if (regex.cyrillic.test(char)) {\n return \"ru\";\n }\n if (regex.devanagari.test(char)) {\n return \"hi\";\n }\n if (regex.thai.test(char)) {\n return \"th\";\n }\n\n if (regex.han.test(char)) {\n if (previousLocale && previousLocale.startsWith(\"ja\")) {\n return previousLocale;\n }\n return resolveHanHint(options) ?? DEFAULT_HAN_TAG;\n }\n\n if (regex.latin.test(char)) {\n const hintedLocale = detectLatinLocale(char);\n if (hintedLocale !== DEFAULT_LOCALE) {\n return hintedLocale;\n }\n if (previousLocale && isLatinLocale(previousLocale) && previousLocale !== DEFAULT_LOCALE) {\n return previousLocale;\n }\n const latinHint = resolveLatinHint(options);\n if (latinHint) {\n return latinHint;\n }\n return DEFAULT_LOCALE;\n }\n\n return null;\n}\n","import {\n DEFAULT_LOCALE,\n detectLocaleForChar,\n isLatinLocale,\n type LocaleDetectOptions,\n} from \"./locale-detect\";\nimport type { LocaleChunk } from \"./types\";\n\nexport function segmentTextByLocale(\n text: string,\n options: LocaleDetectOptions = {}\n): LocaleChunk[] {\n const chunks: LocaleChunk[] = [];\n // Keep currentLocale as a non-null string to simplify type-narrowing.\n let currentLocale: string = DEFAULT_LOCALE;\n let buffer = \"\";\n let bufferHasScript = false;\n\n for (const char of text) {\n const detected = detectLocaleForChar(char, currentLocale, options);\n const targetLocale = detected ?? currentLocale;\n\n // If buffer is empty, this is the first character for a new chunk.\n if (buffer === \"\") {\n currentLocale = targetLocale;\n buffer = char;\n bufferHasScript = detected !== null;\n continue;\n }\n\n if (detected !== null && !bufferHasScript) {\n currentLocale = targetLocale;\n buffer += char;\n bufferHasScript = true;\n continue;\n }\n\n if (targetLocale !== currentLocale && detected !== null) {\n if (currentLocale === DEFAULT_LOCALE && isLatinLocale(targetLocale)) {\n currentLocale = targetLocale;\n buffer += char;\n bufferHasScript = true;\n continue;\n }\n // currentLocale is guaranteed to be a string here.\n chunks.push({ locale: currentLocale, text: buffer });\n currentLocale = targetLocale;\n buffer = char;\n bufferHasScript = true;\n continue;\n }\n\n buffer += char;\n if (detected !== null) {\n bufferHasScript = true;\n }\n }\n\n if (buffer.length > 0) {\n chunks.push({ locale: currentLocale, text: buffer });\n }\n\n return mergeAdjacentChunks(chunks);\n}\n\nfunction mergeAdjacentChunks(chunks: LocaleChunk[]): LocaleChunk[] {\n if (chunks.length === 0) {\n return chunks;\n }\n\n const merged: LocaleChunk[] = [];\n // We already returned for empty arrays above, so the first element is present.\n let last = chunks[0]!;\n\n for (let i = 1; i < chunks.length; i++) {\n const chunk = chunks[i]!;\n if (chunk.locale === last.locale) {\n last = { locale: last.locale, text: last.text + chunk.text };\n } else {\n merged.push(last);\n last = chunk;\n }\n }\n\n merged.push(last);\n return merged;\n}\n","import {\n analyzeCharChunk,\n analyzeChunk,\n aggregateByLocale,\n aggregateCharsByLocale,\n} from \"./analyze\";\nimport { resolveMode } from \"./mode\";\nimport { segmentTextByLocale } from \"./segment\";\nimport { countCharsForLocale, countWordsForLocale } from \"./segmenter\";\nimport { createNonWordCollection, mergeNonWordCollections } from \"./non-words\";\nimport type {\n CharBreakdown,\n CharCollectorBreakdown,\n ChunkBreakdown,\n ChunkWithSegments,\n NonWordCollection,\n WordCounterMode,\n WordCounterOptions,\n WordCounterResult,\n} from \"./types\";\n\nexport type {\n NonWordCollection,\n WordCounterMode,\n WordCounterOptions,\n WordCounterResult,\n WordCounterBreakdown,\n} from \"./types\";\n\nexport { countCharsForLocale, countWordsForLocale, segmentTextByLocale };\n\nexport function wordCounter(\n text: string,\n options: WordCounterOptions = {}\n): WordCounterResult {\n const mode: WordCounterMode = resolveMode(options.mode, \"chunk\");\n const collectNonWords = Boolean(options.nonWords);\n const includeWhitespace = Boolean(options.includeWhitespace);\n const chunks = segmentTextByLocale(text, {\n latinLanguageHint: options.latinLanguageHint,\n latinTagHint: options.latinTagHint,\n latinLocaleHint: options.latinLocaleHint,\n hanLanguageHint: options.hanLanguageHint,\n hanTagHint: options.hanTagHint,\n });\n\n if (mode === \"char\" || mode === \"char-collector\") {\n const analyzed = chunks.map((chunk) =>\n analyzeCharChunk(chunk, collectNonWords, includeWhitespace),\n );\n const total = analyzed.reduce((sum, chunk) => sum + chunk.chars, 0);\n const counts = collectNonWords\n ? {\n words: analyzed.reduce((sum, chunk) => sum + chunk.wordChars, 0),\n nonWords: analyzed.reduce((sum, chunk) => sum + chunk.nonWordChars, 0),\n total,\n }\n : undefined;\n\n if (mode === \"char\") {\n const items: CharBreakdown[] = analyzed.map((chunk) => ({\n locale: chunk.locale,\n text: chunk.text,\n chars: chunk.chars,\n nonWords: chunk.nonWords,\n }));\n return {\n total,\n counts,\n breakdown: {\n mode,\n items,\n },\n };\n }\n\n const aggregated = aggregateCharsByLocale(analyzed);\n const items: CharCollectorBreakdown[] = aggregated.map((chunk) => ({\n locale: chunk.locale,\n chars: chunk.chars,\n nonWords: chunk.nonWords,\n }));\n return {\n total,\n counts,\n breakdown: {\n mode,\n items,\n },\n };\n }\n\n const analyzed = chunks.map((chunk) =>\n analyzeChunk(chunk, collectNonWords, includeWhitespace),\n );\n const wordsTotal = analyzed.reduce((sum, chunk) => sum + chunk.words, 0);\n const nonWordsTotal = collectNonWords\n ? analyzed.reduce((sum, chunk) => {\n if (!chunk.nonWords) {\n return sum;\n }\n return sum + getNonWordTotal(chunk.nonWords);\n }, 0)\n : 0;\n const total = analyzed.reduce((sum, chunk) => {\n let chunkTotal = chunk.words;\n if (collectNonWords && chunk.nonWords) {\n chunkTotal += getNonWordTotal(chunk.nonWords);\n }\n return sum + chunkTotal;\n }, 0);\n\n const counts = collectNonWords ? { words: wordsTotal, nonWords: nonWordsTotal, total } : undefined;\n\n if (mode === \"segments\") {\n const items: ChunkWithSegments[] = analyzed.map((chunk) => ({\n locale: chunk.locale,\n text: chunk.text,\n words: chunk.words,\n segments: chunk.segments,\n nonWords: chunk.nonWords,\n }));\n return {\n total,\n counts,\n breakdown: {\n mode,\n items,\n },\n };\n }\n\n if (mode === \"collector\") {\n const items = aggregateByLocale(analyzed);\n const nonWords = collectNonWordsAggregate(analyzed, collectNonWords);\n return {\n total,\n counts,\n breakdown: {\n mode,\n items,\n nonWords,\n },\n };\n }\n\n const items: ChunkBreakdown[] = analyzed.map((chunk) => ({\n locale: chunk.locale,\n text: chunk.text,\n words: chunk.words,\n nonWords: chunk.nonWords,\n }));\n\n return {\n total,\n counts,\n breakdown: {\n mode,\n items,\n },\n };\n}\n\nfunction getNonWordTotal(nonWords: NonWordCollection): number {\n return (\n nonWords.counts.emoji +\n nonWords.counts.symbols +\n nonWords.counts.punctuation +\n (nonWords.counts.whitespace ?? 0)\n );\n}\n\n\nfunction collectNonWordsAggregate(\n analyzed: Array<{ nonWords?: NonWordCollection }>,\n enabled: boolean,\n): NonWordCollection | undefined {\n if (!enabled) {\n return undefined;\n }\n const collection = createNonWordCollection();\n for (const chunk of analyzed) {\n if (!chunk.nonWords) {\n continue;\n }\n mergeNonWordCollections(collection, chunk.nonWords);\n }\n return collection;\n}\n","import { wordCounter } from \"./wc\";\n\nexport default wordCounter;\nexport { countCharsForLocale, countWordsForLocale, segmentTextByLocale } from \"./wc\";\nexport type {\n NonWordCollection,\n WordCounterMode,\n WordCounterOptions,\n WordCounterResult,\n WordCounterBreakdown,\n} from \"./wc\";\n","import type { WordCounterMode, WordCounterOptions, WordCounterResult } from \"../wc/types\";\nimport wordCounter from \"../wc\";\nimport { parseMarkdown } from \"./parse-markdown\";\nimport type { SectionMode, SectionedResult } from \"./types\";\n\nfunction normalizeText(value: unknown): string {\n if (value == null) {\n return \"\";\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction buildPerKeyItems(\n data: Record<string, unknown> | null,\n mode: WordCounterMode,\n options: WordCounterOptions,\n): Array<{ name: string; source: \"frontmatter\"; result: WordCounterResult }> {\n if (!data || typeof data !== \"object\" || Array.isArray(data)) {\n return [];\n }\n\n return Object.entries(data).map(([key, value]) => {\n const valueText = normalizeText(value);\n const text = valueText ? `${key}: ${valueText}` : key;\n return {\n name: key,\n source: \"frontmatter\",\n result: wordCounter(text, options),\n };\n });\n}\n\nfunction buildSingleItem(\n name: string,\n text: string,\n mode: WordCounterMode,\n options: WordCounterOptions,\n source: \"frontmatter\" | \"content\",\n) {\n return [{ name, source, result: wordCounter(text, options) }];\n}\n\nfunction sumTotals(items: Array<{ result: WordCounterResult }>): number {\n return items.reduce((sum, item) => sum + item.result.total, 0);\n}\n\nexport function countSections(\n input: string,\n section: SectionMode,\n options: WordCounterOptions = {},\n): SectionedResult {\n const mode: WordCounterMode = options.mode ?? \"chunk\";\n if (section === \"all\") {\n const result = wordCounter(input, options);\n return {\n section,\n total: result.total,\n frontmatterType: null,\n items: [{ name: \"all\", source: \"content\", result }],\n };\n }\n\n const parsed = parseMarkdown(input);\n const frontmatterText = parsed.frontmatter ?? \"\";\n const contentText = parsed.content ?? \"\";\n\n let items: Array<{ name: string; source: \"frontmatter\" | \"content\"; result: WordCounterResult }> = [];\n\n if (section === \"frontmatter\") {\n items = buildSingleItem(\"frontmatter\", frontmatterText, mode, options, \"frontmatter\");\n } else if (section === \"content\") {\n items = buildSingleItem(\"content\", contentText, mode, options, \"content\");\n } else if (section === \"split\") {\n items = [\n ...buildSingleItem(\"frontmatter\", frontmatterText, mode, options, \"frontmatter\"),\n ...buildSingleItem(\"content\", contentText, mode, options, \"content\"),\n ];\n } else if (section === \"per-key\") {\n items = buildPerKeyItems(parsed.data, mode, options);\n } else if (section === \"split-per-key\") {\n items = [\n ...buildPerKeyItems(parsed.data, mode, options),\n ...buildSingleItem(\"content\", contentText, mode, options, \"content\"),\n ];\n }\n\n return {\n section,\n total: sumTotals(items),\n frontmatterType: parsed.frontmatterType,\n items,\n };\n}\n","import { countSections } from \"../../markdown\";\nimport type { SectionMode, SectionedResult } from \"../../markdown\";\nimport { appendAll } from \"../../utils/append-all\";\nimport wordCounter, { type NonWordCollection, type WordCounterResult } from \"../../wc\";\nimport { createNonWordCollection, mergeNonWordCollections } from \"../../wc/non-words\";\nimport type { BatchFileInput, BatchFileResult, BatchSummary } from \"../types\";\nimport type { BatchProgressSnapshot } from \"../progress/reporter\";\n\ntype BuildBatchSummaryOptions = {\n onFileCounted?: (snapshot: BatchProgressSnapshot) => void;\n onFinalizeStart?: () => void;\n preserveCollectorSegments?: boolean;\n};\n\nfunction mergeWordCounterResult(\n left: WordCounterResult,\n right: WordCounterResult,\n preserveCollectorSegments: boolean,\n): WordCounterResult {\n if (left.breakdown.mode !== right.breakdown.mode) {\n throw new Error(\"Cannot merge different breakdown modes.\");\n }\n\n const total = left.total + right.total;\n const counts =\n left.counts || right.counts\n ? {\n words: (left.counts?.words ?? 0) + (right.counts?.words ?? 0),\n nonWords: (left.counts?.nonWords ?? 0) + (right.counts?.nonWords ?? 0),\n total: (left.counts?.total ?? 0) + (right.counts?.total ?? 0),\n }\n : undefined;\n\n if (left.breakdown.mode === \"chunk\" && right.breakdown.mode === \"chunk\") {\n return {\n total,\n counts,\n breakdown: {\n mode: \"chunk\",\n items: [...left.breakdown.items, ...right.breakdown.items],\n },\n };\n }\n\n if (left.breakdown.mode === \"segments\" && right.breakdown.mode === \"segments\") {\n return {\n total,\n counts,\n breakdown: {\n mode: \"segments\",\n items: [...left.breakdown.items, ...right.breakdown.items],\n },\n };\n }\n\n if (left.breakdown.mode === \"char\" && right.breakdown.mode === \"char\") {\n return {\n total,\n counts,\n breakdown: {\n mode: \"char\",\n items: [...left.breakdown.items, ...right.breakdown.items],\n },\n };\n }\n\n if (\n left.breakdown.mode === \"char-collector\" &&\n right.breakdown.mode === \"char-collector\"\n ) {\n const localeOrder: string[] = [];\n const mergedByLocale = new Map<\n string,\n {\n locale: string;\n chars: number;\n nonWords?: NonWordCollection;\n }\n >();\n\n const addItems = (items: typeof left.breakdown.items): void => {\n for (const item of items) {\n const existing = mergedByLocale.get(item.locale);\n if (existing) {\n existing.chars += item.chars;\n if (item.nonWords) {\n if (!existing.nonWords) {\n existing.nonWords = createNonWordCollection();\n }\n mergeNonWordCollections(existing.nonWords, item.nonWords);\n }\n continue;\n }\n\n localeOrder.push(item.locale);\n mergedByLocale.set(item.locale, {\n locale: item.locale,\n chars: item.chars,\n nonWords: item.nonWords\n ? mergeNonWordCollections(createNonWordCollection(), item.nonWords)\n : undefined,\n });\n }\n };\n\n addItems(left.breakdown.items);\n addItems(right.breakdown.items);\n\n return {\n total,\n counts,\n breakdown: {\n mode: \"char-collector\",\n items: localeOrder.map((locale) => {\n const value = mergedByLocale.get(locale);\n if (!value) {\n throw new Error(`Missing char-collector entry for locale: ${locale}`);\n }\n return value;\n }),\n },\n };\n }\n\n if (left.breakdown.mode === \"collector\" && right.breakdown.mode === \"collector\") {\n const localeOrder: string[] = [];\n const mergedByLocale = new Map<\n string,\n {\n locale: string;\n words: number;\n segments: string[];\n }\n >();\n\n const addItems = (items: typeof left.breakdown.items): void => {\n for (const item of items) {\n const existing = mergedByLocale.get(item.locale);\n if (existing) {\n existing.words += item.words;\n if (preserveCollectorSegments) {\n appendAll(existing.segments, item.segments);\n }\n continue;\n }\n\n localeOrder.push(item.locale);\n mergedByLocale.set(item.locale, {\n locale: item.locale,\n words: item.words,\n segments: preserveCollectorSegments ? [...item.segments] : [],\n });\n }\n };\n\n addItems(left.breakdown.items);\n addItems(right.breakdown.items);\n\n let mergedNonWords: NonWordCollection | undefined;\n if (left.breakdown.nonWords || right.breakdown.nonWords) {\n mergedNonWords = createNonWordCollection();\n if (left.breakdown.nonWords) {\n mergeNonWordCollections(mergedNonWords, left.breakdown.nonWords);\n }\n if (right.breakdown.nonWords) {\n mergeNonWordCollections(mergedNonWords, right.breakdown.nonWords);\n }\n }\n\n return {\n total,\n counts,\n breakdown: {\n mode: \"collector\",\n items: localeOrder.map((locale) => {\n const value = mergedByLocale.get(locale);\n if (!value) {\n throw new Error(`Missing collector entry for locale: ${locale}`);\n }\n return value;\n }),\n nonWords: mergedNonWords,\n },\n };\n }\n\n return {\n total,\n counts,\n breakdown: left.breakdown,\n };\n}\n\nfunction aggregateWordCounterResults(\n results: WordCounterResult[],\n preserveCollectorSegments: boolean,\n): WordCounterResult {\n if (results.length === 0) {\n return wordCounter(\"\", { mode: \"chunk\" });\n }\n\n const first = results[0];\n if (!first) {\n return wordCounter(\"\", { mode: \"chunk\" });\n }\n\n let aggregate = first;\n for (let index = 1; index < results.length; index += 1) {\n const current = results[index];\n if (!current) {\n continue;\n }\n aggregate = mergeWordCounterResult(aggregate, current, preserveCollectorSegments);\n }\n\n return aggregate;\n}\n\nfunction buildSectionKey(name: string, source: \"frontmatter\" | \"content\"): string {\n return `${source}:${name}`;\n}\n\nfunction aggregateSectionedResults(\n results: SectionedResult[],\n preserveCollectorSegments: boolean,\n): SectionedResult {\n if (results.length === 0) {\n return {\n section: \"all\",\n total: 0,\n frontmatterType: null,\n items: [],\n };\n }\n\n const section = results[0]?.section ?? \"all\";\n const grouped = new Map<\n string,\n {\n name: string;\n source: \"frontmatter\" | \"content\";\n items: WordCounterResult[];\n }\n >();\n let total = 0;\n let frontmatterType = results[0]?.frontmatterType ?? null;\n\n for (const result of results) {\n total += result.total;\n\n if (result.section !== section) {\n throw new Error(\"Cannot aggregate section results with different section modes.\");\n }\n\n if (frontmatterType !== result.frontmatterType) {\n frontmatterType = null;\n }\n\n for (const item of result.items) {\n const key = buildSectionKey(item.name, item.source);\n const existing = grouped.get(key);\n if (!existing) {\n grouped.set(key, {\n name: item.name,\n source: item.source,\n items: [item.result],\n });\n continue;\n }\n\n existing.items.push(item.result);\n }\n }\n\n const sourceOrder = new Map<\"frontmatter\" | \"content\", number>([\n [\"frontmatter\", 0],\n [\"content\", 1],\n ]);\n\n const items = [...grouped.values()]\n .sort((left, right) => {\n const sourceDiff = (sourceOrder.get(left.source) ?? 0) - (sourceOrder.get(right.source) ?? 0);\n if (sourceDiff !== 0) {\n return sourceDiff;\n }\n return left.name.localeCompare(right.name);\n })\n .map((entry) => ({\n name: entry.name,\n source: entry.source,\n result: aggregateWordCounterResults(entry.items, preserveCollectorSegments),\n }));\n\n return {\n section,\n total,\n frontmatterType,\n items,\n };\n}\n\nfunction stripCollectorSegmentsFromWordCounterResult(result: WordCounterResult): void {\n if (result.breakdown.mode !== \"collector\") {\n return;\n }\n\n for (const item of result.breakdown.items) {\n item.segments = [];\n }\n}\n\nfunction stripCollectorSegmentsFromSectionedResult(result: SectionedResult): void {\n for (const item of result.items) {\n stripCollectorSegmentsFromWordCounterResult(item.result);\n }\n}\n\nexport async function buildBatchSummary(\n inputs: BatchFileInput[],\n section: SectionMode,\n wcOptions: Parameters<typeof wordCounter>[1],\n options: BuildBatchSummaryOptions = {},\n): Promise<BatchSummary> {\n const preserveCollectorSegments = options.preserveCollectorSegments ?? true;\n const files: BatchFileResult[] = [];\n\n for (const input of inputs) {\n const result =\n section === \"all\"\n ? wordCounter(input.content, wcOptions)\n : countSections(input.content, section, wcOptions);\n\n if (!preserveCollectorSegments) {\n if (\"section\" in result) {\n stripCollectorSegmentsFromSectionedResult(result);\n } else {\n stripCollectorSegmentsFromWordCounterResult(result);\n }\n }\n\n files.push({\n path: input.path,\n result,\n });\n\n options.onFileCounted?.({\n completed: files.length,\n total: inputs.length,\n });\n }\n\n options.onFinalizeStart?.();\n\n if (files.length === 0) {\n return {\n files,\n skipped: [],\n aggregate:\n section === \"all\"\n ? wordCounter(\"\", wcOptions)\n : {\n section,\n total: 0,\n frontmatterType: null,\n items: [],\n },\n };\n }\n\n const aggregate =\n section === \"all\"\n ? aggregateWordCounterResults(\n files.map((file) => file.result as WordCounterResult),\n preserveCollectorSegments,\n )\n : aggregateSectionedResults(\n files.map((file) => file.result as SectionedResult),\n preserveCollectorSegments,\n );\n\n return {\n files,\n skipped: [],\n aggregate,\n };\n}\n","import type { SectionMode } from \"../../markdown\";\nimport { appendAll } from \"../../utils/append-all\";\nimport type wordCounter from \"../../wc\";\nimport type { DebugChannel } from \"../debug/channel\";\nimport { type DirectoryExtensionFilter } from \"../path/filter\";\nimport { loadBatchInputs } from \"../path/load\";\nimport { resolveBatchFilePaths } from \"../path/resolve\";\nimport { type BatchProgressReporter } from \"../progress/reporter\";\nimport type { BatchOptions, BatchSummary } from \"../types\";\nimport { buildBatchSummary } from \"./aggregate\";\n\ntype RunBatchCountOptions = {\n pathInputs: string[];\n batchOptions: BatchOptions;\n extensionFilter: DirectoryExtensionFilter;\n section: SectionMode;\n wcOptions: Parameters<typeof wordCounter>[1];\n preserveCollectorSegments: boolean;\n debug: DebugChannel;\n progressReporter: BatchProgressReporter;\n};\n\nexport async function runBatchCount(options: RunBatchCountOptions): Promise<BatchSummary> {\n const batchStartedAtMs = Date.now();\n const resolveStartedAtMs = Date.now();\n\n options.debug.emit(\"batch.resolve.start\", {\n inputs: options.pathInputs.length,\n pathMode: options.batchOptions.pathMode,\n recursive: options.batchOptions.recursive,\n });\n\n const resolved = await resolveBatchFilePaths(options.pathInputs, {\n pathMode: options.batchOptions.pathMode,\n recursive: options.batchOptions.recursive,\n extensionFilter: options.extensionFilter,\n debug: options.debug,\n });\n const resolveElapsedMs = Date.now() - resolveStartedAtMs;\n options.debug.emit(\"batch.resolve.complete\", {\n files: resolved.files.length,\n skipped: resolved.skipped.length,\n elapsedMs: resolveElapsedMs,\n });\n options.debug.emit(\"batch.stage.timing\", {\n stage: \"resolve\",\n elapsedMs: resolveElapsedMs,\n });\n\n const loadStartedAtMs = Date.now();\n options.debug.emit(\"batch.load.start\", {\n files: resolved.files.length,\n });\n const loaded = await loadBatchInputs(resolved.files);\n const loadElapsedMs = Date.now() - loadStartedAtMs;\n options.debug.emit(\"batch.load.complete\", {\n files: loaded.files.length,\n skipped: loaded.skipped.length,\n elapsedMs: loadElapsedMs,\n });\n options.debug.emit(\"batch.stage.timing\", {\n stage: \"load\",\n elapsedMs: loadElapsedMs,\n });\n\n const progressEnabled = options.progressReporter.enabled && loaded.files.length > 1;\n options.debug.emit(\"batch.progress.start\", {\n enabled: progressEnabled,\n total: loaded.files.length,\n });\n\n if (progressEnabled) {\n options.progressReporter.start(loaded.files.length, batchStartedAtMs);\n }\n\n let summary: BatchSummary;\n const countStartedAtMs = Date.now();\n let finalizeStartedAtMs: number | null = null;\n let emittedCountTiming = false;\n try {\n summary = await buildBatchSummary(loaded.files, options.section, options.wcOptions, {\n onFileCounted: (snapshot) => {\n if (progressEnabled) {\n options.progressReporter.advance(snapshot);\n }\n },\n onFinalizeStart: () => {\n finalizeStartedAtMs = Date.now();\n if (progressEnabled) {\n options.progressReporter.startFinalizing();\n }\n\n const countElapsedMs = finalizeStartedAtMs - countStartedAtMs;\n options.debug.emit(\"batch.stage.timing\", {\n stage: \"count\",\n elapsedMs: countElapsedMs,\n });\n emittedCountTiming = true;\n },\n preserveCollectorSegments: options.preserveCollectorSegments,\n });\n } finally {\n if (progressEnabled) {\n options.progressReporter.finish();\n }\n options.debug.emit(\"batch.progress.complete\", {\n enabled: progressEnabled,\n total: loaded.files.length,\n });\n }\n\n if (!emittedCountTiming) {\n const countElapsedMs = Date.now() - countStartedAtMs;\n options.debug.emit(\"batch.stage.timing\", {\n stage: \"count\",\n elapsedMs: countElapsedMs,\n });\n }\n\n const finalizeElapsedMs = finalizeStartedAtMs === null ? 0 : Date.now() - finalizeStartedAtMs;\n options.debug.emit(\"batch.stage.timing\", {\n stage: \"finalize\",\n elapsedMs: finalizeElapsedMs,\n });\n\n appendAll(summary.skipped, resolved.skipped);\n appendAll(summary.skipped, loaded.skipped);\n options.debug.emit(\"batch.aggregate.complete\", {\n files: summary.files.length,\n skipped: summary.skipped.length,\n total: summary.aggregate.total,\n });\n\n return summary;\n}\n","export function showSingularOrPluralWord(count: number, word: string): string {\n return `${count} ${word}${count === 1 ? \"\" : \"s\"}`;\n}\n","import { relative as relativePath } from \"node:path\";\nimport type { SectionMode, SectionedResult } from \"../../markdown\";\nimport { showSingularOrPluralWord } from \"../../utils\";\nimport type { NonWordCollection, WordCounterMode, WordCounterResult } from \"../../wc\";\nimport { formatTotalOfParts, type TotalOfOverride } from \"../total-of\";\nimport type { BatchSkip, BatchSummary } from \"../types\";\nimport pc from \"picocolors\";\n\ntype CountUnit = \"word\" | \"character\";\n\ntype CountBreakdownItem = {\n locale: string;\n count: number;\n nonWords?: NonWordCollection;\n};\n\nexport type TotalLabels = {\n overall: string;\n section: string;\n};\n\nfunction getCountUnit(mode: WordCounterMode): CountUnit {\n return mode === \"char\" || mode === \"char-collector\" ? \"character\" : \"word\";\n}\n\nexport function getTotalLabels(mode: WordCounterMode, includeNonWords: boolean): TotalLabels {\n const unit = mode === \"char\" || mode === \"char-collector\" ? \"characters\" : \"words\";\n if (includeNonWords) {\n return { overall: \"Total count\", section: \"total count\" };\n }\n return { overall: `Total ${unit}`, section: `total ${unit}` };\n}\n\nfunction hasNonWords(nonWords: NonWordCollection): boolean {\n const whitespaceCount = nonWords.counts.whitespace ?? 0;\n return (\n nonWords.counts.emoji > 0 ||\n nonWords.counts.symbols > 0 ||\n nonWords.counts.punctuation > 0 ||\n whitespaceCount > 0\n );\n}\n\nfunction renderNonWords(nonWords: NonWordCollection | undefined, verbose: boolean): void {\n if (!nonWords || !hasNonWords(nonWords)) {\n return;\n }\n\n if (verbose) {\n const whitespace = nonWords.whitespace ? ` whitespace=${JSON.stringify(nonWords.whitespace)}` : \"\";\n console.log(\n pc.yellow(\n `Non-words: emoji=${JSON.stringify(nonWords.emoji)} symbols=${JSON.stringify(\n nonWords.symbols,\n )} punctuation=${JSON.stringify(nonWords.punctuation)}${whitespace}`,\n ),\n );\n return;\n }\n\n const whitespaceCount = nonWords.counts.whitespace ?? 0;\n const whitespaceLabel = whitespaceCount > 0 ? `, whitespace ${whitespaceCount}` : \"\";\n console.log(\n pc.yellow(\n `Non-words: emoji ${nonWords.counts.emoji}, symbols ${nonWords.counts.symbols}, punctuation ${nonWords.counts.punctuation}${whitespaceLabel}`,\n ),\n );\n}\n\nfunction renderCountBreakdown(items: CountBreakdownItem[], unit: CountUnit): void {\n for (const item of items) {\n console.log(`Locale ${item.locale}: ${showSingularOrPluralWord(item.count, unit)}`);\n renderNonWords(item.nonWords, false);\n }\n}\n\nfunction renderSegmentBreakdown(\n items: Array<{ locale: string; words: number; segments: string[]; nonWords?: NonWordCollection }>,\n): void {\n for (const item of items) {\n console.log(\n `Locale ${item.locale}: ${JSON.stringify(item.segments)} (${showSingularOrPluralWord(item.words, \"word\")})`,\n );\n renderNonWords(item.nonWords, true);\n }\n}\n\nfunction renderCollectorBreakdown(items: Array<{ locale: string; words: number }>): void {\n for (const item of items) {\n console.log(`Locale ${item.locale}: ${showSingularOrPluralWord(item.words, \"word\")}`);\n }\n}\n\nfunction renderTotalOfOverride(baseTotal: number, override: TotalOfOverride | undefined): void {\n if (!override || override.total === baseTotal) {\n return;\n }\n\n console.log(`Total-of (override: ${formatTotalOfParts(override.parts)}): ${override.total}`);\n}\n\nexport function renderStandardResult(\n result: WordCounterResult,\n totalLabel: string,\n totalOfOverride?: TotalOfOverride,\n): void {\n console.log(`${totalLabel}: ${result.total}`);\n renderTotalOfOverride(result.total, totalOfOverride);\n\n if (result.breakdown.mode === \"segments\") {\n renderSegmentBreakdown(result.breakdown.items);\n return;\n }\n\n if (result.breakdown.mode === \"collector\") {\n renderCollectorBreakdown(result.breakdown.items);\n renderNonWords(result.breakdown.nonWords, false);\n return;\n }\n\n if (result.breakdown.mode === \"char\" || result.breakdown.mode === \"char-collector\") {\n renderCountBreakdown(\n result.breakdown.items.map((item) => ({\n locale: item.locale,\n count: item.chars,\n nonWords: item.nonWords,\n })),\n getCountUnit(result.breakdown.mode),\n );\n return;\n }\n\n renderCountBreakdown(\n result.breakdown.items.map((item) => ({\n locale: item.locale,\n count: item.words,\n nonWords: item.nonWords,\n })),\n getCountUnit(result.breakdown.mode),\n );\n}\n\nfunction buildSectionLabel(\n sectionName: string,\n sectionMode: SectionMode,\n source: \"frontmatter\" | \"content\",\n totalLabel: string,\n): string {\n if (sectionMode === \"frontmatter\") {\n return `[Frontmatter] (${totalLabel})`;\n }\n\n if (sectionMode === \"content\") {\n return `[Content] (${totalLabel})`;\n }\n\n if (sectionMode === \"split\") {\n return source === \"frontmatter\"\n ? `[Frontmatter] (${totalLabel})`\n : `[Content] (${totalLabel})`;\n }\n\n if (sectionMode === \"per-key\") {\n return `[Frontmatter] ${sectionName} (${totalLabel})`;\n }\n\n if (sectionMode === \"split-per-key\") {\n return source === \"content\"\n ? `[Content] (${totalLabel})`\n : `[Frontmatter] ${sectionName} (${totalLabel})`;\n }\n\n return `[Section] ${sectionName} (${totalLabel})`;\n}\n\nexport function renderStandardSectionedResult(\n result: SectionedResult,\n labels: TotalLabels,\n totalOfOverride?: TotalOfOverride,\n): void {\n console.log(`${labels.overall}: ${result.total}`);\n renderTotalOfOverride(result.total, totalOfOverride);\n\n for (const item of result.items) {\n const label = buildSectionLabel(item.name, result.section, item.source, labels.section);\n const unit = getCountUnit(item.result.breakdown.mode);\n console.log(pc.cyan(pc.bold(`${label}: ${showSingularOrPluralWord(item.result.total, unit)}`)));\n\n if (item.result.breakdown.mode === \"segments\") {\n renderSegmentBreakdown(item.result.breakdown.items);\n continue;\n }\n\n if (item.result.breakdown.mode === \"collector\") {\n renderCollectorBreakdown(item.result.breakdown.items);\n renderNonWords(item.result.breakdown.nonWords, false);\n continue;\n }\n\n if (item.result.breakdown.mode === \"char\" || item.result.breakdown.mode === \"char-collector\") {\n renderCountBreakdown(\n item.result.breakdown.items.map((chunk) => ({\n locale: chunk.locale,\n count: chunk.chars,\n nonWords: chunk.nonWords,\n })),\n unit,\n );\n continue;\n }\n\n renderCountBreakdown(\n item.result.breakdown.items.map((chunk) => ({\n locale: chunk.locale,\n count: chunk.words,\n nonWords: chunk.nonWords,\n })),\n unit,\n );\n }\n}\n\nexport function isSectionedResult(\n result: WordCounterResult | SectionedResult,\n): result is SectionedResult {\n return \"section\" in result;\n}\n\nfunction toDisplayPath(inputPath: string): string {\n const relative = relativePath(process.cwd(), inputPath);\n if (relative && !relative.startsWith(\"..\")) {\n return relative || \".\";\n }\n return inputPath;\n}\n\nexport function reportSkipped(skipped: BatchSkip[]): void {\n if (skipped.length === 0) {\n return;\n }\n\n console.error(pc.yellow(`Skipped ${skipped.length} path(s):`));\n for (const item of skipped) {\n console.error(pc.yellow(`- ${toDisplayPath(item.path)} (${item.reason})`));\n }\n}\n\nexport function renderPerFileStandard(\n summary: BatchSummary,\n labels: TotalLabels,\n resolveTotalOfOverride?: (result: WordCounterResult | SectionedResult) => TotalOfOverride | undefined,\n): void {\n for (const file of summary.files) {\n console.log(pc.bold(`[File] ${toDisplayPath(file.path)}`));\n if (isSectionedResult(file.result)) {\n renderStandardSectionedResult(\n file.result,\n labels,\n resolveTotalOfOverride?.(file.result),\n );\n continue;\n }\n\n renderStandardResult(file.result, labels.overall, resolveTotalOfOverride?.(file.result));\n }\n\n console.log(pc.bold(`[Merged] ${summary.files.length} file(s)`));\n if (isSectionedResult(summary.aggregate)) {\n renderStandardSectionedResult(\n summary.aggregate,\n labels,\n resolveTotalOfOverride?.(summary.aggregate),\n );\n return;\n }\n\n renderStandardResult(summary.aggregate, labels.overall, resolveTotalOfOverride?.(summary.aggregate));\n}\n","import type { SectionedResult } from \"../../markdown\";\nimport type { BatchSummary } from \"../types\";\nimport type { WordCounterResult } from \"../../wc\";\n\nfunction normalizeWordCounterResultBase(result: WordCounterResult): WordCounterResult {\n result.total = result.counts?.words ?? result.total;\n delete result.counts;\n\n if (result.breakdown.mode === \"collector\") {\n delete result.breakdown.nonWords;\n return result;\n }\n\n if (result.breakdown.mode === \"char\" || result.breakdown.mode === \"char-collector\") {\n for (const item of result.breakdown.items) {\n const nonWordCount =\n (item.nonWords?.counts.emoji ?? 0) +\n (item.nonWords?.counts.symbols ?? 0) +\n (item.nonWords?.counts.punctuation ?? 0) +\n (item.nonWords?.counts.whitespace ?? 0);\n item.chars = Math.max(0, item.chars - nonWordCount);\n delete item.nonWords;\n }\n return result;\n }\n\n for (const item of result.breakdown.items) {\n delete item.nonWords;\n }\n\n return result;\n}\n\nfunction normalizeSectionedResultBase(result: SectionedResult): SectionedResult {\n let total = 0;\n for (const item of result.items) {\n normalizeWordCounterResultBase(item.result);\n total += item.result.total;\n }\n result.total = total;\n return result;\n}\n\nexport function normalizeResultBase(\n result: WordCounterResult | SectionedResult,\n): WordCounterResult | SectionedResult {\n if (\"section\" in result) {\n return normalizeSectionedResultBase(result);\n }\n return normalizeWordCounterResultBase(result);\n}\n\nexport function normalizeBatchSummaryBase(summary: BatchSummary): BatchSummary {\n for (const file of summary.files) {\n normalizeResultBase(file.result);\n }\n normalizeResultBase(summary.aggregate);\n return summary;\n}\n","import {\n requiresNonWordCollection,\n requiresWhitespaceCollection,\n} from \"../total-of\";\nimport type { BatchScope } from \"../types\";\nimport type { CliActionOptions, ResolvedCountRunOptions } from \"./types\";\n\nexport function hasPathInput(pathValues: string[] | undefined): pathValues is string[] {\n return Array.isArray(pathValues) && pathValues.length > 0;\n}\n\nexport function resolveBatchScope(argv: string[]): BatchScope {\n let scope: BatchScope = \"merged\";\n for (const token of argv) {\n if (token === \"--merged\") {\n scope = \"merged\";\n continue;\n }\n\n if (token === \"--per-file\") {\n scope = \"per-file\";\n }\n }\n\n return scope;\n}\n\nexport function resolveDebugReportPathOption(rawValue: string | boolean | undefined): string | undefined {\n if (rawValue === undefined || rawValue === false) {\n return undefined;\n }\n\n if (typeof rawValue === \"string\") {\n return rawValue;\n }\n\n return undefined;\n}\n\nexport function resolveCountRunOptions(options: CliActionOptions): ResolvedCountRunOptions {\n const useSection = options.section !== \"all\";\n const totalOfParts = options.totalOf;\n const requestedNonWords = Boolean(options.nonWords || options.includeWhitespace || options.misc);\n const collectNonWordsForOverride = requiresNonWordCollection(totalOfParts);\n const collectWhitespaceForOverride = requiresWhitespaceCollection(totalOfParts);\n const enableNonWords = Boolean(\n options.nonWords || options.includeWhitespace || options.misc || collectNonWordsForOverride,\n );\n const enableWhitespace = Boolean(\n options.includeWhitespace || options.misc || collectWhitespaceForOverride,\n );\n const shouldNormalizeBaseOutput = !requestedNonWords && enableNonWords;\n\n return {\n useSection,\n totalOfParts,\n requestedNonWords,\n shouldNormalizeBaseOutput,\n wcOptions: {\n mode: options.mode,\n latinLanguageHint: options.latinLanguage,\n latinTagHint: options.latinTag,\n latinLocaleHint: options.latinLocale,\n hanLanguageHint: options.hanLanguage,\n hanTagHint: options.hanTag,\n nonWords: enableNonWords,\n includeWhitespace: enableWhitespace,\n },\n };\n}\n\nexport function formatInputReadError(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error);\n return `Failed to read input: ${message}`;\n}\n","import type { SectionedResult } from \"../../markdown\";\nimport { runBatchCount } from \"../batch/run\";\nimport type { DebugChannel } from \"../debug/channel\";\nimport {\n getTotalLabels,\n isSectionedResult,\n renderPerFileStandard,\n renderStandardResult,\n renderStandardSectionedResult,\n reportSkipped,\n} from \"../output/render\";\nimport { normalizeBatchSummaryBase } from \"../output/normalize-base\";\nimport { buildDirectoryExtensionFilter } from \"../path/filter\";\nimport { createBatchProgressReporter } from \"../progress/reporter\";\nimport { resolveTotalOfOverride, type TotalOfOverride } from \"../total-of\";\nimport type { BatchOptions } from \"../types\";\nimport type { WordCounterResult } from \"../../wc\";\nimport { resolveBatchScope } from \"./options\";\nimport type { CliActionOptions, ResolvedCountRunOptions, RunCliOptions } from \"./types\";\n\ntype ExecuteBatchCountOptions = {\n argv: string[];\n options: CliActionOptions;\n runtime: RunCliOptions;\n resolved: ResolvedCountRunOptions;\n debug: DebugChannel;\n teeEnabled: boolean;\n};\n\nexport async function executeBatchCount({\n argv,\n options,\n runtime,\n resolved,\n debug,\n teeEnabled,\n}: ExecuteBatchCountOptions): Promise<void> {\n const batchOptions: BatchOptions = {\n scope: resolveBatchScope(argv),\n pathMode: options.pathMode,\n recursive: options.recursive,\n quietSkips: Boolean(options.quietSkips),\n };\n\n const extensionFilter = buildDirectoryExtensionFilter(options.includeExt, options.excludeExt);\n const debugEnabled = Boolean(options.debug);\n const mirrorDebugToTerminal = debugEnabled && (!debug.reportPath || teeEnabled);\n const summary = await runBatchCount({\n pathInputs: options.path ?? [],\n batchOptions,\n extensionFilter,\n section: options.section,\n wcOptions: resolved.wcOptions,\n preserveCollectorSegments: options.format === \"json\",\n debug,\n progressReporter: createBatchProgressReporter({\n enabled: options.format === \"standard\" && options.progress,\n stream: runtime.stderr ?? process.stderr,\n clearOnFinish: !(mirrorDebugToTerminal || options.keepProgress),\n }),\n });\n\n const showSkipDiagnostics = debugEnabled && !batchOptions.quietSkips;\n debug.emit(\"batch.skips.policy\", {\n enabled: showSkipDiagnostics,\n quietSkips: batchOptions.quietSkips,\n });\n if (showSkipDiagnostics) {\n debug.emit(\"batch.skips.report\", {\n count: summary.skipped.length,\n });\n if (options.verbose) {\n for (const skip of summary.skipped) {\n debug.emit(\n \"batch.skips.item\",\n {\n path: skip.path,\n reason: skip.reason,\n },\n { verbosity: \"verbose\" },\n );\n }\n }\n\n if (mirrorDebugToTerminal) {\n reportSkipped(summary.skipped);\n }\n }\n\n if (summary.files.length === 0) {\n throw new Error(\"No readable text-like inputs were found from --path.\");\n }\n\n let aggregateTotalOfOverride: TotalOfOverride | undefined;\n let totalOfOverridesByResult: WeakMap<object, TotalOfOverride> | undefined;\n if (resolved.totalOfParts && resolved.totalOfParts.length > 0) {\n totalOfOverridesByResult = new WeakMap<object, TotalOfOverride>();\n const aggregateOverride = resolveTotalOfOverride(summary.aggregate, resolved.totalOfParts);\n if (aggregateOverride) {\n totalOfOverridesByResult.set(summary.aggregate as object, aggregateOverride);\n aggregateTotalOfOverride = aggregateOverride;\n }\n\n for (const file of summary.files) {\n const fileOverride = resolveTotalOfOverride(file.result, resolved.totalOfParts);\n if (!fileOverride) {\n continue;\n }\n totalOfOverridesByResult.set(file.result as object, fileOverride);\n }\n } else {\n aggregateTotalOfOverride = resolveTotalOfOverride(summary.aggregate, resolved.totalOfParts);\n }\n\n if (resolved.shouldNormalizeBaseOutput) {\n normalizeBatchSummaryBase(summary);\n }\n\n if (!aggregateTotalOfOverride && totalOfOverridesByResult) {\n aggregateTotalOfOverride = totalOfOverridesByResult.get(summary.aggregate as object);\n }\n\n if (options.format === \"raw\") {\n console.log(aggregateTotalOfOverride?.total ?? summary.aggregate.total);\n return;\n }\n\n if (options.format === \"json\") {\n const spacing = options.pretty ? 2 : 0;\n\n if (batchOptions.scope === \"per-file\") {\n const skipped = showSkipDiagnostics ? summary.skipped : undefined;\n const meta =\n resolved.totalOfParts && resolved.totalOfParts.length > 0\n ? {\n totalOf: resolved.totalOfParts,\n aggregateTotalOfOverride: aggregateTotalOfOverride?.total ?? summary.aggregate.total,\n }\n : undefined;\n const payload = {\n scope: \"per-file\",\n files: summary.files.map((file) => ({\n path: file.path,\n result: file.result,\n })),\n ...(skipped ? { skipped } : {}),\n aggregate: summary.aggregate,\n ...(meta ? { meta } : {}),\n };\n console.log(JSON.stringify(payload, null, spacing));\n return;\n }\n\n if (!aggregateTotalOfOverride) {\n console.log(JSON.stringify(summary.aggregate, null, spacing));\n return;\n }\n console.log(\n JSON.stringify(\n {\n ...summary.aggregate,\n meta: {\n totalOf: aggregateTotalOfOverride.parts,\n totalOfOverride: aggregateTotalOfOverride.total,\n },\n },\n null,\n spacing,\n ),\n );\n return;\n }\n\n const labels = getTotalLabels(options.mode, resolved.requestedNonWords);\n const totalOfResolver =\n resolved.totalOfParts && resolved.totalOfParts.length > 0\n ? (result: WordCounterResult | SectionedResult) =>\n totalOfOverridesByResult?.get(result as object) ??\n resolveTotalOfOverride(result, resolved.totalOfParts)\n : undefined;\n\n if (batchOptions.scope === \"per-file\") {\n renderPerFileStandard(summary, labels, totalOfResolver);\n return;\n }\n\n if (isSectionedResult(summary.aggregate)) {\n renderStandardSectionedResult(summary.aggregate, labels, aggregateTotalOfOverride);\n return;\n }\n\n renderStandardResult(summary.aggregate, labels.overall, aggregateTotalOfOverride);\n}\n","async function readStdin(): Promise<string> {\n if (process.stdin.isTTY) {\n return \"\";\n }\n\n return new Promise<string>((resolve, reject) => {\n const chunks: string[] = [];\n process.stdin.setEncoding(\"utf8\");\n process.stdin.on(\"data\", (chunk) => chunks.push(String(chunk)));\n process.stdin.on(\"end\", () => resolve(chunks.join(\"\")));\n process.stdin.on(\"error\", (error) => reject(error));\n process.stdin.resume();\n });\n}\n\nexport async function resolveInput(textTokens: string[]): Promise<string> {\n if (textTokens.length > 0) {\n return textTokens.join(\" \");\n }\n\n return readStdin();\n}\n","import type { SectionedResult } from \"../../markdown\";\nimport { countSections } from \"../../markdown\";\nimport {\n getTotalLabels,\n isSectionedResult,\n renderStandardResult,\n renderStandardSectionedResult,\n} from \"../output/render\";\nimport { normalizeResultBase } from \"../output/normalize-base\";\nimport { resolveTotalOfOverride } from \"../total-of\";\nimport wordCounter, { type WordCounterResult } from \"../../wc\";\nimport { resolveInput } from \"./input\";\nimport { formatInputReadError } from \"./options\";\nimport type { CliActionOptions, ResolvedCountRunOptions } from \"./types\";\n\ntype ExecuteSingleCountOptions = {\n textTokens: string[];\n options: CliActionOptions;\n resolved: ResolvedCountRunOptions;\n};\n\nexport async function executeSingleCount({\n textTokens,\n options,\n resolved,\n}: ExecuteSingleCountOptions): Promise<void> {\n let input: string;\n try {\n input = await resolveInput(textTokens);\n } catch (error) {\n throw new Error(formatInputReadError(error));\n }\n\n const trimmed = input.trim();\n if (!trimmed) {\n throw new Error(\"No input provided. Pass text, pipe stdin, or use --path.\");\n }\n\n const result: WordCounterResult | SectionedResult = resolved.useSection\n ? countSections(trimmed, options.section, resolved.wcOptions)\n : wordCounter(trimmed, resolved.wcOptions);\n const totalOfOverride = resolveTotalOfOverride(result, resolved.totalOfParts);\n const displayResult = resolved.shouldNormalizeBaseOutput ? normalizeResultBase(result) : result;\n\n if (options.format === \"raw\") {\n console.log(totalOfOverride?.total ?? displayResult.total);\n return;\n }\n\n if (options.format === \"json\") {\n const spacing = options.pretty ? 2 : 0;\n if (!totalOfOverride) {\n console.log(JSON.stringify(displayResult, null, spacing));\n return;\n }\n console.log(\n JSON.stringify(\n {\n ...displayResult,\n meta: {\n totalOf: totalOfOverride.parts,\n totalOfOverride: totalOfOverride.total,\n },\n },\n null,\n spacing,\n ),\n );\n return;\n }\n\n const labels = getTotalLabels(options.mode, resolved.requestedNonWords);\n if (isSectionedResult(displayResult)) {\n renderStandardSectionedResult(displayResult, labels, totalOfOverride);\n return;\n }\n\n renderStandardResult(displayResult, labels.overall, totalOfOverride);\n}\n","import { Command } from \"commander\";\nimport { createDebugChannel } from \"./cli/debug/channel\";\nimport { configureProgramOptions } from \"./cli/program/options\";\nimport { getFormattedVersionLabel } from \"./cli/program/version\";\nimport { executeBatchCount } from \"./cli/runtime/batch\";\nimport {\n hasPathInput,\n resolveCountRunOptions,\n resolveDebugReportPathOption,\n} from \"./cli/runtime/options\";\nimport { executeSingleCount } from \"./cli/runtime/single\";\nimport type { CliActionOptions, RunCliOptions } from \"./cli/runtime/types\";\nimport type { WordCounterMode } from \"./wc\";\nimport { normalizeMode } from \"./wc/mode\";\nimport pc from \"picocolors\";\n\nexport async function runCli(\n argv: string[] = process.argv,\n runtime: RunCliOptions = {},\n): Promise<void> {\n const program = new Command();\n const parseMode = (value: string): WordCounterMode => {\n const normalized = normalizeMode(value);\n if (!normalized) {\n throw new Error(`Invalid mode: ${value}`);\n }\n return normalized;\n };\n\n program\n .name(\"word-counter\")\n .description(\"Locale-aware word counting powered by Intl.Segmenter.\")\n .version(getFormattedVersionLabel(), \"-v, --version\", \"output the version number\");\n configureProgramOptions(program, parseMode);\n\n program.action(\n async (textTokens: string[], options: CliActionOptions) => {\n const debugEnabled = Boolean(options.debug);\n const debugReportPath = resolveDebugReportPathOption(options.debugReport);\n const debugReportEnabled = options.debugReport !== undefined && options.debugReport !== false;\n\n if (options.verbose && !debugEnabled) {\n program.error(pc.red(\"`--verbose` requires `--debug`.\"));\n return;\n }\n\n if (debugReportEnabled && !debugEnabled) {\n program.error(pc.red(\"`--debug-report` requires `--debug`.\"));\n return;\n }\n\n const teeEnabled = Boolean(options.debugReportTee || options.debugTee);\n\n if (teeEnabled && !debugReportEnabled) {\n program.error(\n pc.red(\"`--debug-report-tee` (alias: `--debug-tee`) requires `--debug-report`.\"),\n );\n return;\n }\n\n let debug;\n try {\n debug = createDebugChannel({\n enabled: debugEnabled,\n verbosity: options.verbose ? \"verbose\" : \"compact\",\n report: debugReportEnabled\n ? {\n path: debugReportPath,\n tee: teeEnabled,\n }\n : undefined,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n program.error(pc.red(`Failed to initialize debug diagnostics: ${message}`));\n return;\n }\n\n try {\n const resolved = resolveCountRunOptions(options);\n if (hasPathInput(options.path)) {\n await executeBatchCount({\n argv,\n options,\n runtime,\n resolved,\n debug,\n teeEnabled,\n });\n return;\n }\n\n await executeSingleCount({\n textTokens,\n options,\n resolved,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message === \"No input provided. Pass text, pipe stdin, or use --path.\") {\n program.error(pc.red(message));\n return;\n }\n if (message === \"No readable text-like inputs were found from --path.\") {\n program.error(pc.red(message));\n return;\n }\n program.error(message);\n } finally {\n await debug.close();\n }\n },\n );\n\n await program.parseAsync(argv);\n}\n\nexport { buildBatchSummary } from \"./cli/batch/aggregate\";\nexport { loadBatchInputs } from \"./cli/path/load\";\nexport { resolveBatchFilePaths } from \"./cli/path/resolve\";\n","import { runCli } from \"./command\";\n\nrunCli().catch((error) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"Failed to run CLI:\", message);\n process.exitCode = 1;\n});\n"],"x_google_ignoreList":[4],"mappings":"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"}
|