stimeo-ui 0.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +72 -0
- package/dist/controllers/accordion_controller.d.ts +59 -0
- package/dist/controllers/accordion_controller.js +76 -0
- package/dist/controllers/accordion_controller.js.map +1 -0
- package/dist/controllers/announcer_controller.d.ts +78 -0
- package/dist/controllers/announcer_controller.js +184 -0
- package/dist/controllers/announcer_controller.js.map +1 -0
- package/dist/controllers/aspect_ratio_controller.d.ts +39 -0
- package/dist/controllers/aspect_ratio_controller.js +36 -0
- package/dist/controllers/aspect_ratio_controller.js.map +1 -0
- package/dist/controllers/auto_submit_controller.d.ts +74 -0
- package/dist/controllers/auto_submit_controller.js +147 -0
- package/dist/controllers/auto_submit_controller.js.map +1 -0
- package/dist/controllers/avatar_controller.d.ts +50 -0
- package/dist/controllers/avatar_controller.js +66 -0
- package/dist/controllers/avatar_controller.js.map +1 -0
- package/dist/controllers/breadcrumb_controller.d.ts +60 -0
- package/dist/controllers/breadcrumb_controller.js +123 -0
- package/dist/controllers/breadcrumb_controller.js.map +1 -0
- package/dist/controllers/bulk_select_controller.d.ts +67 -0
- package/dist/controllers/bulk_select_controller.js +104 -0
- package/dist/controllers/bulk_select_controller.js.map +1 -0
- package/dist/controllers/calendar_controller.d.ts +100 -0
- package/dist/controllers/calendar_controller.js +394 -0
- package/dist/controllers/calendar_controller.js.map +1 -0
- package/dist/controllers/character_counter_controller.d.ts +63 -0
- package/dist/controllers/character_counter_controller.js +179 -0
- package/dist/controllers/character_counter_controller.js.map +1 -0
- package/dist/controllers/checkbox_controller.d.ts +52 -0
- package/dist/controllers/checkbox_controller.js +73 -0
- package/dist/controllers/checkbox_controller.js.map +1 -0
- package/dist/controllers/combobox_controller.d.ts +76 -0
- package/dist/controllers/combobox_controller.js +186 -0
- package/dist/controllers/combobox_controller.js.map +1 -0
- package/dist/controllers/command_palette_controller.d.ts +103 -0
- package/dist/controllers/command_palette_controller.js +381 -0
- package/dist/controllers/command_palette_controller.js.map +1 -0
- package/dist/controllers/conditional_fields_controller.d.ts +56 -0
- package/dist/controllers/conditional_fields_controller.js +112 -0
- package/dist/controllers/conditional_fields_controller.js.map +1 -0
- package/dist/controllers/confirm_controller.d.ts +83 -0
- package/dist/controllers/confirm_controller.js +276 -0
- package/dist/controllers/confirm_controller.js.map +1 -0
- package/dist/controllers/context_menu_controller.d.ts +81 -0
- package/dist/controllers/context_menu_controller.js +112 -0
- package/dist/controllers/context_menu_controller.js.map +1 -0
- package/dist/controllers/countdown_controller.d.ts +93 -0
- package/dist/controllers/countdown_controller.js +202 -0
- package/dist/controllers/countdown_controller.js.map +1 -0
- package/dist/controllers/dialog_controller.d.ts +57 -0
- package/dist/controllers/dialog_controller.js +207 -0
- package/dist/controllers/dialog_controller.js.map +1 -0
- package/dist/controllers/direct_upload_controller.d.ts +77 -0
- package/dist/controllers/direct_upload_controller.js +212 -0
- package/dist/controllers/direct_upload_controller.js.map +1 -0
- package/dist/controllers/dirty_form_controller.d.ts +52 -0
- package/dist/controllers/dirty_form_controller.js +128 -0
- package/dist/controllers/dirty_form_controller.js.map +1 -0
- package/dist/controllers/dropdown_controller.d.ts +49 -0
- package/dist/controllers/dropdown_controller.js +66 -0
- package/dist/controllers/dropdown_controller.js.map +1 -0
- package/dist/controllers/empty_state_controller.d.ts +60 -0
- package/dist/controllers/empty_state_controller.js +67 -0
- package/dist/controllers/empty_state_controller.js.map +1 -0
- package/dist/controllers/flash_controller.d.ts +63 -0
- package/dist/controllers/flash_controller.js +221 -0
- package/dist/controllers/flash_controller.js.map +1 -0
- package/dist/controllers/focus_controller.d.ts +69 -0
- package/dist/controllers/focus_controller.js +216 -0
- package/dist/controllers/focus_controller.js.map +1 -0
- package/dist/controllers/form_field_controller.d.ts +79 -0
- package/dist/controllers/form_field_controller.js +154 -0
- package/dist/controllers/form_field_controller.js.map +1 -0
- package/dist/controllers/form_validation_controller.d.ts +114 -0
- package/dist/controllers/form_validation_controller.js +202 -0
- package/dist/controllers/form_validation_controller.js.map +1 -0
- package/dist/controllers/frame_loading_controller.d.ts +58 -0
- package/dist/controllers/frame_loading_controller.js +177 -0
- package/dist/controllers/frame_loading_controller.js.map +1 -0
- package/dist/controllers/highlight_controller.d.ts +50 -0
- package/dist/controllers/highlight_controller.js +107 -0
- package/dist/controllers/highlight_controller.js.map +1 -0
- package/dist/controllers/hover_card_controller.d.ts +79 -0
- package/dist/controllers/hover_card_controller.js +165 -0
- package/dist/controllers/hover_card_controller.js.map +1 -0
- package/dist/controllers/idle_controller.d.ts +51 -0
- package/dist/controllers/idle_controller.js +141 -0
- package/dist/controllers/idle_controller.js.map +1 -0
- package/dist/controllers/input_mask_controller.d.ts +74 -0
- package/dist/controllers/input_mask_controller.js +166 -0
- package/dist/controllers/input_mask_controller.js.map +1 -0
- package/dist/controllers/lazy_frame_controller.d.ts +53 -0
- package/dist/controllers/lazy_frame_controller.js +68 -0
- package/dist/controllers/lazy_frame_controller.js.map +1 -0
- package/dist/controllers/listbox_controller.d.ts +88 -0
- package/dist/controllers/listbox_controller.js +256 -0
- package/dist/controllers/listbox_controller.js.map +1 -0
- package/dist/controllers/local_time_controller.d.ts +60 -0
- package/dist/controllers/local_time_controller.js +81 -0
- package/dist/controllers/local_time_controller.js.map +1 -0
- package/dist/controllers/menu_controller.d.ts +81 -0
- package/dist/controllers/menu_controller.js +134 -0
- package/dist/controllers/menu_controller.js.map +1 -0
- package/dist/controllers/meter_controller.d.ts +93 -0
- package/dist/controllers/meter_controller.js +96 -0
- package/dist/controllers/meter_controller.js.map +1 -0
- package/dist/controllers/nested_form_controller.d.ts +85 -0
- package/dist/controllers/nested_form_controller.js +131 -0
- package/dist/controllers/nested_form_controller.js.map +1 -0
- package/dist/controllers/network_status_controller.d.ts +49 -0
- package/dist/controllers/network_status_controller.js +126 -0
- package/dist/controllers/network_status_controller.js.map +1 -0
- package/dist/controllers/number_input_controller.d.ts +93 -0
- package/dist/controllers/number_input_controller.js +306 -0
- package/dist/controllers/number_input_controller.js.map +1 -0
- package/dist/controllers/otp_controller.d.ts +68 -0
- package/dist/controllers/otp_controller.js +201 -0
- package/dist/controllers/otp_controller.js.map +1 -0
- package/dist/controllers/overflow_indicator_controller.d.ts +62 -0
- package/dist/controllers/overflow_indicator_controller.js +169 -0
- package/dist/controllers/overflow_indicator_controller.js.map +1 -0
- package/dist/controllers/overflow_menu_controller.d.ts +64 -0
- package/dist/controllers/overflow_menu_controller.js +274 -0
- package/dist/controllers/overflow_menu_controller.js.map +1 -0
- package/dist/controllers/pagination_controller.d.ts +69 -0
- package/dist/controllers/pagination_controller.js +89 -0
- package/dist/controllers/pagination_controller.js.map +1 -0
- package/dist/controllers/password_strength_controller.d.ts +67 -0
- package/dist/controllers/password_strength_controller.js +175 -0
- package/dist/controllers/password_strength_controller.js.map +1 -0
- package/dist/controllers/persist_controller.d.ts +63 -0
- package/dist/controllers/persist_controller.js +259 -0
- package/dist/controllers/persist_controller.js.map +1 -0
- package/dist/controllers/popover_controller.d.ts +63 -0
- package/dist/controllers/popover_controller.js +94 -0
- package/dist/controllers/popover_controller.js.map +1 -0
- package/dist/controllers/portal_controller.d.ts +58 -0
- package/dist/controllers/portal_controller.js +63 -0
- package/dist/controllers/portal_controller.js.map +1 -0
- package/dist/controllers/preview_guard_controller.d.ts +47 -0
- package/dist/controllers/preview_guard_controller.js +69 -0
- package/dist/controllers/preview_guard_controller.js.map +1 -0
- package/dist/controllers/progress_controller.d.ts +85 -0
- package/dist/controllers/progress_controller.js +93 -0
- package/dist/controllers/progress_controller.js.map +1 -0
- package/dist/controllers/radio_group_controller.d.ts +49 -0
- package/dist/controllers/radio_group_controller.js +128 -0
- package/dist/controllers/radio_group_controller.js.map +1 -0
- package/dist/controllers/rating_controller.d.ts +82 -0
- package/dist/controllers/rating_controller.js +179 -0
- package/dist/controllers/rating_controller.js.map +1 -0
- package/dist/controllers/relative_time_controller.d.ts +48 -0
- package/dist/controllers/relative_time_controller.js +129 -0
- package/dist/controllers/relative_time_controller.js.map +1 -0
- package/dist/controllers/reset_before_cache_controller.d.ts +54 -0
- package/dist/controllers/reset_before_cache_controller.js +62 -0
- package/dist/controllers/reset_before_cache_controller.js.map +1 -0
- package/dist/controllers/resizable_controller.d.ts +81 -0
- package/dist/controllers/resizable_controller.js +163 -0
- package/dist/controllers/resizable_controller.js.map +1 -0
- package/dist/controllers/roving_controller.d.ts +63 -0
- package/dist/controllers/roving_controller.js +116 -0
- package/dist/controllers/roving_controller.js.map +1 -0
- package/dist/controllers/scroll_area_controller.d.ts +45 -0
- package/dist/controllers/scroll_area_controller.js +183 -0
- package/dist/controllers/scroll_area_controller.js.map +1 -0
- package/dist/controllers/scroll_visibility_controller.d.ts +72 -0
- package/dist/controllers/scroll_visibility_controller.js +103 -0
- package/dist/controllers/scroll_visibility_controller.js.map +1 -0
- package/dist/controllers/scrollspy_controller.d.ts +65 -0
- package/dist/controllers/scrollspy_controller.js +171 -0
- package/dist/controllers/scrollspy_controller.js.map +1 -0
- package/dist/controllers/skeleton_controller.d.ts +50 -0
- package/dist/controllers/skeleton_controller.js +125 -0
- package/dist/controllers/skeleton_controller.js.map +1 -0
- package/dist/controllers/slider_controller.d.ts +76 -0
- package/dist/controllers/slider_controller.js +109 -0
- package/dist/controllers/slider_controller.js.map +1 -0
- package/dist/controllers/spinner_controller.d.ts +62 -0
- package/dist/controllers/spinner_controller.js +164 -0
- package/dist/controllers/spinner_controller.js.map +1 -0
- package/dist/controllers/step_indicator_controller.d.ts +55 -0
- package/dist/controllers/step_indicator_controller.js +55 -0
- package/dist/controllers/step_indicator_controller.js.map +1 -0
- package/dist/controllers/stepper_controller.d.ts +66 -0
- package/dist/controllers/stepper_controller.js +78 -0
- package/dist/controllers/stepper_controller.js.map +1 -0
- package/dist/controllers/stick_to_bottom_controller.d.ts +61 -0
- package/dist/controllers/stick_to_bottom_controller.js +100 -0
- package/dist/controllers/stick_to_bottom_controller.js.map +1 -0
- package/dist/controllers/sticky_observer_controller.d.ts +54 -0
- package/dist/controllers/sticky_observer_controller.js +53 -0
- package/dist/controllers/sticky_observer_controller.js.map +1 -0
- package/dist/controllers/submit_once_controller.d.ts +66 -0
- package/dist/controllers/submit_once_controller.js +206 -0
- package/dist/controllers/submit_once_controller.js.map +1 -0
- package/dist/controllers/switch_controller.d.ts +43 -0
- package/dist/controllers/switch_controller.js +50 -0
- package/dist/controllers/switch_controller.js.map +1 -0
- package/dist/controllers/tabs_controller.d.ts +48 -0
- package/dist/controllers/tabs_controller.js +63 -0
- package/dist/controllers/tabs_controller.js.map +1 -0
- package/dist/controllers/textarea_autosize_controller.d.ts +47 -0
- package/dist/controllers/textarea_autosize_controller.js +72 -0
- package/dist/controllers/textarea_autosize_controller.js.map +1 -0
- package/dist/controllers/theme_controller.d.ts +70 -0
- package/dist/controllers/theme_controller.js +154 -0
- package/dist/controllers/theme_controller.js.map +1 -0
- package/dist/controllers/toast_controller.d.ts +123 -0
- package/dist/controllers/toast_controller.js +310 -0
- package/dist/controllers/toast_controller.js.map +1 -0
- package/dist/controllers/toggle_group_controller.d.ts +56 -0
- package/dist/controllers/toggle_group_controller.js +130 -0
- package/dist/controllers/toggle_group_controller.js.map +1 -0
- package/dist/controllers/toolbar_controller.d.ts +59 -0
- package/dist/controllers/toolbar_controller.js +113 -0
- package/dist/controllers/toolbar_controller.js.map +1 -0
- package/dist/controllers/tooltip_controller.d.ts +74 -0
- package/dist/controllers/tooltip_controller.js +165 -0
- package/dist/controllers/tooltip_controller.js.map +1 -0
- package/dist/controllers/transition_controller.d.ts +86 -0
- package/dist/controllers/transition_controller.js +203 -0
- package/dist/controllers/transition_controller.js.map +1 -0
- package/dist/index.d.ts +1931 -0
- package/dist/index.js +12241 -0
- package/dist/index.js.map +1 -0
- package/dist/inspector/cli.d.ts +149 -0
- package/dist/inspector/cli.js +663 -0
- package/dist/inspector/cli.js.map +1 -0
- package/dist/inspector/cli_bin.d.ts +2 -0
- package/dist/inspector/cli_bin.js +665 -0
- package/dist/inspector/cli_bin.js.map +1 -0
- package/dist/inspector/manifest.json +2235 -0
- package/dist/positioning/index.d.ts +226 -0
- package/dist/positioning/index.js +145 -0
- package/dist/positioning/index.js.map +1 -0
- package/package.json +93 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/inspector/erb.ts","../../src/inspector/extract.ts","../../src/inspector/html_parser.ts","../../src/inspector/check.ts","../../src/inspector/cli.ts","../../src/inspector/cli_bin.ts"],"names":["j","manifest","process"],"mappings":"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","file":"cli_bin.js","sourcesContent":["/**\n * Neutralizes ERB so the HTML parser only ever sees static markup.\n *\n * Every ERB tag — `<% %>`, `<%= %>`, `<%# %>`, plus the whitespace-trimming\n * variants `<%- -%>` — is replaced with spaces. Newlines inside the tag are\n * preserved so that 1-based line/column positions used in diagnostics line up\n * with the original source.\n *\n * Because ERB is blanked rather than interpreted, dynamically-generated markup\n * is naturally excluded from checking: a dynamic identifier such as\n * `data-controller=\"<%= id %>\"` collapses to an empty attribute value and a\n * dynamic attribute name such as `data-<%= x %>-target` no longer matches the\n * `stimeo--*` patterns. This is the intended \"dynamic attributes are out of\n * scope\" behavior.\n *\n * @param source - Raw HTML/ERB source.\n * @returns The source with all ERB tags replaced by position-preserving spaces.\n */\nexport function neutralizeErb(source: string): string {\n return source.replace(/<%[\\s\\S]*?%>/g, (match) => match.replace(/[^\\n]/g, \" \"));\n}\n","/**\n * Pure helpers for recognizing `stimeo--*` attributes within parsed markup.\n *\n * These functions know nothing about files or the manifest — they only decode\n * Stimulus's attribute conventions, scoped strictly to the `stimeo--`\n * namespace so a consumer's own controllers are never inspected.\n */\n\nconst NAMESPACE_PREFIX = \"stimeo--\";\n\n/**\n * Converts a Stimulus value name to its attribute token, mirroring Stimulus's\n * own dasherize (e.g. `rootMargin` → `root-margin`).\n */\nexport function dasherize(value: string): string {\n return value.replace(/([A-Z])/g, (_match, char: string) => `-${char.toLowerCase()}`);\n}\n\n/** Extracts the `stimeo--*` identifiers listed in a `data-controller` value.\n * Duplicates are collapsed (Stimulus connects a repeated identifier once), which\n * keeps downstream scope-based diagnostics from being reported multiple times. */\nexport function controllerIdentifiers(dataControllerValue: string): string[] {\n const seen = new Set<string>();\n for (const token of dataControllerValue.split(/\\s+/)) {\n if (token.startsWith(NAMESPACE_PREFIX)) seen.add(token);\n }\n return [...seen];\n}\n\n/**\n * If `attrName` is an Stimeo target attribute (`data-{identifier}-target`),\n * returns the controller identifier; otherwise `null`.\n */\nexport function parseTargetAttr(attrName: string): string | null {\n const match = /^data-(stimeo--[a-z0-9][a-z0-9-]*)-target$/.exec(attrName);\n return match?.[1] ?? null;\n}\n\n/** Result of decoding a `data-{identifier}-{value}-value` attribute. */\nexport interface ParsedValueAttr {\n /** Resolved identifier, or `null` when it matches no known controller. */\n readonly identifier: string | null;\n /** The dasherized value token (e.g. `root-margin`), best-effort when unresolved. */\n readonly valueToken: string;\n}\n\n/**\n * Decodes an Stimeo value attribute (`data-{identifier}-{value}-value`).\n *\n * Identifiers may themselves contain hyphens (e.g. `stimeo--command-palette`),\n * so the boundary between identifier and value name is ambiguous from the\n * attribute name alone. We disambiguate against the set of known identifiers,\n * preferring the longest match.\n *\n * @param attrName - The lowercased attribute name.\n * @param knownIdentifiers - All identifiers present in the manifest.\n * @returns The decoded attribute, or `null` if it is not an Stimeo value attr.\n */\nexport function parseValueAttr(\n attrName: string,\n knownIdentifiers: readonly string[],\n): ParsedValueAttr | null {\n const match = /^data-(stimeo--[a-z0-9-]+)-value$/.exec(attrName);\n if (!match) return null;\n const inner = match[1] ?? \"\"; // identifier + \"-\" + valueToken\n\n let best: { identifier: string; valueToken: string } | null = null;\n for (const id of knownIdentifiers) {\n if (inner.startsWith(`${id}-`)) {\n const valueToken = inner.slice(id.length + 1);\n if (valueToken.length > 0 && (!best || id.length > best.identifier.length)) {\n best = { identifier: id, valueToken };\n }\n }\n }\n if (best) return best;\n\n // Unknown identifier: best-effort split at the first segment after the prefix.\n const rest = inner.slice(NAMESPACE_PREFIX.length);\n const dash = rest.indexOf(\"-\");\n const identifierGuess = dash === -1 ? inner : `${NAMESPACE_PREFIX}${rest.slice(0, dash)}`;\n const valueGuess = dash === -1 ? \"\" : rest.slice(dash + 1);\n return { identifier: null, valueToken: valueGuess || identifierGuess };\n}\n\n/** An Stimeo `data-action` descriptor decoded into its controller and method. */\nexport interface ActionDescriptor {\n /** The `stimeo--*` controller identifier (e.g. `stimeo--menu`). */\n readonly identifier: string;\n /** The action method name after `#` (e.g. `toggle`), or `\"\"` if absent. */\n readonly method: string;\n}\n\n/**\n * Decodes the Stimeo `data-action` descriptors in an attribute value, e.g.\n * `click->stimeo--menu#toggle keydown->stimeo--menu#onItemKeydown` yields one\n * entry per descriptor. Non-`stimeo--` controllers are skipped (their action\n * surface is out of scope). The method name is read up to the first action\n * option (`:prevent`, `:stop`, …), mirroring Stimulus's descriptor grammar.\n */\nexport function actionDescriptors(dataActionValue: string): ActionDescriptor[] {\n const descriptors: ActionDescriptor[] = [];\n for (const descriptor of dataActionValue.split(/\\s+/)) {\n const hash = descriptor.indexOf(\"#\");\n if (hash === -1) continue;\n let lhs = descriptor.slice(0, hash);\n const arrow = lhs.indexOf(\"->\");\n if (arrow !== -1) lhs = lhs.slice(arrow + 2);\n if (!lhs.startsWith(NAMESPACE_PREFIX)) continue;\n const method = /^[a-zA-Z_$][\\w$]*/.exec(descriptor.slice(hash + 1))?.[0] ?? \"\";\n descriptors.push({ identifier: lhs, method });\n }\n return descriptors;\n}\n\n/**\n * Extracts the `stimeo--*` controller identifiers referenced in a\n * `data-action` value, e.g. `click->stimeo--menu#toggle` yields\n * `[\"stimeo--menu\"]`. Convenience wrapper over {@link actionDescriptors}.\n */\nexport function actionIdentifiers(dataActionValue: string): string[] {\n return actionDescriptors(dataActionValue).map((d) => d.identifier);\n}\n\n/** Whether an attribute name belongs to the Stimeo namespace. */\nexport function isStimeoDataAttr(attrName: string): boolean {\n return attrName.startsWith(`data-${NAMESPACE_PREFIX}`);\n}\n","/**\n * A minimal, dependency-free HTML tokenizer/tree builder.\n *\n * The Inspector deliberately ships **zero runtime dependencies** beyond the\n * Stimulus peer (see project invariants), so rather than pull in a DOM library\n * we build just enough of a tree to answer the only questions the checker asks:\n * \"which `stimeo--*` attributes exist, where, and inside which controller\n * scope?\". The parser is intentionally lenient — real-world ERB output has\n * unclosed tags and stray markup — and never throws.\n *\n * It is **not** a spec-compliant HTML parser and should not be used for\n * anything beyond static attribute inspection.\n */\n\n/** A parsed attribute, with the source position of its name. */\nexport interface ParsedAttr {\n /** Lowercased attribute name (HTML attribute names are case-insensitive). */\n readonly name: string;\n /** Attribute value (without surrounding quotes); empty for boolean attrs. */\n readonly value: string;\n /** 1-based line of the attribute name. */\n readonly line: number;\n /** 1-based column of the attribute name. */\n readonly column: number;\n}\n\n/** An element node in the lenient tree. */\nexport interface ElementNode {\n /** Lowercased tag name; the synthetic root uses `#root`. */\n readonly tag: string;\n readonly attrs: readonly ParsedAttr[];\n readonly children: ElementNode[];\n parent: ElementNode | null;\n /** 1-based line of the tag's `<`. */\n readonly line: number;\n /** 1-based column of the tag's `<`. */\n readonly column: number;\n}\n\n/** Elements that never have children and so are never pushed onto the stack. */\nconst VOID_ELEMENTS = new Set([\n \"area\",\n \"base\",\n \"br\",\n \"col\",\n \"embed\",\n \"hr\",\n \"img\",\n \"input\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n]);\n\n/** Elements whose content is raw text (no nested elements to parse). */\nconst RAW_TEXT_ELEMENTS = new Set([\"script\", \"style\", \"textarea\", \"title\"]);\n\nconst WHITESPACE = new Set([\" \", \"\\t\", \"\\n\", \"\\r\", \"\\f\"]);\n\n/** Maps absolute string offsets to 1-based line/column positions. */\nclass PositionIndex {\n readonly #lineStarts: number[] = [0];\n\n constructor(source: string) {\n for (let i = 0; i < source.length; i++) {\n if (source[i] === \"\\n\") this.#lineStarts.push(i + 1);\n }\n }\n\n at(offset: number): { line: number; column: number } {\n // Binary search for the last line start that is <= offset.\n let lo = 0;\n let hi = this.#lineStarts.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if ((this.#lineStarts[mid] ?? 0) <= offset) lo = mid;\n else hi = mid - 1;\n }\n return { line: lo + 1, column: offset - (this.#lineStarts[lo] ?? 0) + 1 };\n }\n}\n\n/**\n * Parses HTML (already ERB-neutralized) into a lenient element tree.\n *\n * @param source - HTML source to parse.\n * @returns The synthetic `#root` node whose children are the top-level elements.\n */\nexport function parseHtml(source: string): ElementNode {\n const pos = new PositionIndex(source);\n const len = source.length;\n /** Bounds-safe character access (out of range yields an empty string). */\n const ch = (k: number): string => (k >= 0 && k < len ? (source[k] as string) : \"\");\n\n const root: ElementNode = {\n tag: \"#root\",\n attrs: [],\n children: [],\n parent: null,\n line: 1,\n column: 1,\n };\n const stack: ElementNode[] = [root];\n let i = 0;\n\n const top = (): ElementNode => stack[stack.length - 1] as ElementNode;\n\n while (i < len) {\n if (ch(i) !== \"<\") {\n i++;\n continue;\n }\n\n const next = ch(i + 1);\n\n // Comment: <!-- ... -->\n if (source.startsWith(\"<!--\", i)) {\n const end = source.indexOf(\"-->\", i + 4);\n i = end === -1 ? len : end + 3;\n continue;\n }\n // Markup declaration (<!DOCTYPE ...>) or processing instruction (<? ... ?>).\n if (next === \"!\" || next === \"?\") {\n const end = source.indexOf(\">\", i);\n i = end === -1 ? len : end + 1;\n continue;\n }\n // End tag: </name>\n if (next === \"/\") {\n let j = i + 2;\n let name = \"\";\n while (j < len && ch(j) !== \">\" && !WHITESPACE.has(ch(j))) {\n name += ch(j);\n j++;\n }\n const end = source.indexOf(\">\", j);\n i = end === -1 ? len : end + 1;\n closeTag(stack, name.toLowerCase());\n continue;\n }\n // Not a tag start (e.g. a stray \"<\"); treat as text.\n if (!/[a-zA-Z]/.test(next)) {\n i++;\n continue;\n }\n\n // Start tag.\n const tagStart = i;\n let j = i + 1;\n let tagName = \"\";\n while (j < len && !WHITESPACE.has(ch(j)) && ch(j) !== \">\" && ch(j) !== \"/\") {\n tagName += ch(j);\n j++;\n }\n const lowerTag = tagName.toLowerCase();\n const attrs: ParsedAttr[] = [];\n\n // Parse attributes until the tag closes.\n let selfClosing = false;\n while (j < len) {\n while (j < len && WHITESPACE.has(ch(j))) j++;\n if (j >= len) break;\n if (ch(j) === \">\") {\n j++;\n break;\n }\n if (ch(j) === \"/\") {\n selfClosing = true;\n j++;\n continue;\n }\n\n // Attribute name.\n const nameStart = j;\n let attrName = \"\";\n while (j < len && !WHITESPACE.has(ch(j)) && ch(j) !== \"=\" && ch(j) !== \">\" && ch(j) !== \"/\") {\n attrName += ch(j);\n j++;\n }\n\n let attrValue = \"\";\n // Optional value.\n let k = j;\n while (k < len && WHITESPACE.has(ch(k))) k++;\n if (ch(k) === \"=\") {\n k++;\n while (k < len && WHITESPACE.has(ch(k))) k++;\n const quote = ch(k);\n if (quote === '\"' || quote === \"'\") {\n k++;\n const valStart = k;\n while (k < len && ch(k) !== quote) k++;\n attrValue = source.slice(valStart, k);\n k++; // skip closing quote\n } else {\n const valStart = k;\n while (k < len && !WHITESPACE.has(ch(k)) && ch(k) !== \">\") k++;\n attrValue = source.slice(valStart, k);\n }\n j = k;\n }\n\n if (attrName.length > 0) {\n const p = pos.at(nameStart);\n attrs.push({\n name: attrName.toLowerCase(),\n value: attrValue,\n line: p.line,\n column: p.column,\n });\n }\n }\n\n const startPos = pos.at(tagStart);\n const node: ElementNode = {\n tag: lowerTag,\n attrs,\n children: [],\n parent: top(),\n line: startPos.line,\n column: startPos.column,\n };\n top().children.push(node);\n\n i = j;\n\n if (selfClosing || VOID_ELEMENTS.has(lowerTag)) {\n continue;\n }\n\n if (RAW_TEXT_ELEMENTS.has(lowerTag)) {\n // Skip raw-text content so `<` inside scripts/styles is not parsed as markup.\n const closeNeedle = `</${lowerTag}`;\n const idx = source.toLowerCase().indexOf(closeNeedle, i);\n if (idx === -1) {\n i = len;\n } else {\n const gt = source.indexOf(\">\", idx);\n i = gt === -1 ? len : gt + 1;\n }\n continue;\n }\n\n stack.push(node);\n }\n\n return root;\n}\n\n/** Pops the stack down to (and including) the nearest matching open tag. */\nfunction closeTag(stack: ElementNode[], name: string): void {\n for (let depth = stack.length - 1; depth >= 1; depth--) {\n if (stack[depth]?.tag === name) {\n stack.length = depth;\n return;\n }\n }\n // No matching open tag — ignore the stray end tag.\n}\n\n/** Depth-first walk over every element node (excluding the synthetic root). */\nexport function walk(root: ElementNode, visit: (node: ElementNode) => void): void {\n for (const child of root.children) {\n visit(child);\n walk(child, visit);\n }\n}\n","import { neutralizeErb } from \"./erb\";\nimport {\n actionDescriptors,\n controllerIdentifiers,\n dasherize,\n isStimeoDataAttr,\n parseTargetAttr,\n parseValueAttr,\n} from \"./extract\";\nimport { type ElementNode, type ParsedAttr, parseHtml, walk } from \"./html_parser\";\nimport type {\n A11yRequirement,\n Diagnostic,\n DiagnosticCode,\n DiagnosticSeverity,\n Manifest,\n} from \"./types\";\n\n/**\n * The core Inspector engine: checks a single HTML/ERB source string against the\n * manifest and returns diagnostics. It is **input-path agnostic** — the same\n * function backs both internal CI contract checks and the user-facing CLI.\n *\n * The check runs in three stages:\n * - **Stage 1 (names/spelling):** every `stimeo--*` controller, target, value,\n * and `data-action` controller **and method** must exist in the manifest.\n * - **Stage 2 (structure):** required targets must be present within their\n * controller scope, and targets must have an owning controller.\n * - **Stage 3 (accessibility):** ARIA the controller relies on but does not set\n * itself (e.g. a dialog's `role`/`aria-modal`/name) must be present on the\n * relevant target, with the expected value.\n * - **Stage 4 (fix suggestions):** diagnostics carry a `suggestion` — the\n * nearest known name for a likely typo, or the exact ARIA to add.\n *\n * @remarks\n * Scope is resolved within a single source string. A controller and its targets\n * split across separate Rails partials cannot be correlated, so stage-2 checks\n * assume self-contained markup (Stimeo's recommended demo/partial structure).\n * ERB is neutralized first, so dynamically-generated attributes are skipped.\n *\n * @param source - Raw HTML/ERB source.\n * @param manifest - The bundled controller manifest to check against.\n * @returns Diagnostics sorted by line then column.\n */\nexport function checkSource(source: string, manifest: Manifest): Diagnostic[] {\n const diagnostics: Diagnostic[] = [];\n const tree = parseHtml(neutralizeErb(source));\n const known = manifest.controllers;\n const knownIdentifiers = Object.keys(known);\n\n /** Controller scope registrations: a node declaring `data-controller`. */\n const scopes: Array<{ node: ElementNode; identifier: string }> = [];\n /** Target names found within each scope, keyed by scope node then identifier. */\n const presence = new Map<ElementNode, Map<string, Set<string>>>();\n /** Target *elements* per scope/identifier/target name, for stage-3 ARIA checks. */\n const targetNodes = new Map<ElementNode, Map<string, Map<string, ElementNode[]>>>();\n\n const recordPresence = (owner: ElementNode, identifier: string, target: string): void => {\n let byId = presence.get(owner);\n if (!byId) {\n byId = new Map();\n presence.set(owner, byId);\n }\n let set = byId.get(identifier);\n if (!set) {\n set = new Set();\n byId.set(identifier, set);\n }\n set.add(target);\n };\n\n const recordTargetNode = (\n owner: ElementNode,\n identifier: string,\n target: string,\n el: ElementNode,\n ): void => {\n let byId = targetNodes.get(owner);\n if (!byId) {\n byId = new Map();\n targetNodes.set(owner, byId);\n }\n let byName = byId.get(identifier);\n if (!byName) {\n byName = new Map();\n byId.set(identifier, byName);\n }\n const found = byName.get(target);\n if (found) found.push(el);\n else byName.set(target, [el]);\n };\n\n walk(tree, (node) => {\n for (const attr of node.attrs) {\n // --- data-controller -------------------------------------------------\n if (attr.name === \"data-controller\") {\n for (const identifier of controllerIdentifiers(attr.value)) {\n if (identifier in known) {\n scopes.push({ node, identifier });\n } else {\n push(\n diagnostics,\n \"unknown-controller\",\n \"error\",\n `Unknown Stimeo controller \"${identifier}\".`,\n attr,\n didYouMean(identifier, knownIdentifiers),\n );\n }\n }\n continue;\n }\n\n // --- target attribute: data-{identifier}-target ----------------------\n const targetIdentifier = parseTargetAttr(attr.name);\n if (targetIdentifier) {\n const controller = known[targetIdentifier];\n if (!controller) {\n push(\n diagnostics,\n \"unknown-controller\",\n \"error\",\n `Target attribute \"${attr.name}\" references unknown Stimeo controller \"${targetIdentifier}\".`,\n attr,\n didYouMean(targetIdentifier, knownIdentifiers),\n );\n continue;\n }\n const targetName = attr.value.trim();\n if (targetName.length > 0 && !controller.targets.includes(targetName)) {\n push(\n diagnostics,\n \"unknown-target\",\n \"error\",\n `Unknown target \"${targetName}\" for \"${targetIdentifier}\". Known targets: ${list(controller.targets)}.`,\n attr,\n didYouMean(targetName, controller.targets),\n );\n }\n const owner = findOwner(node, targetIdentifier);\n if (owner) {\n if (targetName.length > 0) {\n recordPresence(owner, targetIdentifier, targetName);\n recordTargetNode(owner, targetIdentifier, targetName, node);\n }\n } else {\n push(\n diagnostics,\n \"orphan-target\",\n \"error\",\n `Target \"${attr.name}\" has no enclosing controller \"${targetIdentifier}\".`,\n attr,\n );\n }\n continue;\n }\n\n // --- value attribute: data-{identifier}-{value}-value ----------------\n if (isStimeoDataAttr(attr.name) && attr.name.endsWith(\"-value\")) {\n const parsed = parseValueAttr(attr.name, knownIdentifiers);\n if (parsed) {\n if (parsed.identifier === null) {\n push(\n diagnostics,\n \"unknown-controller\",\n \"error\",\n `Value attribute \"${attr.name}\" references unknown Stimeo controller.`,\n attr,\n );\n } else {\n const controller = known[parsed.identifier];\n const valid =\n controller?.values.some((v) => dasherize(v) === parsed.valueToken) ?? false;\n if (!valid) {\n push(\n diagnostics,\n \"unknown-value\",\n \"error\",\n `Unknown value \"${parsed.valueToken}\" for \"${parsed.identifier}\". Known values: ${list((controller?.values ?? []).map(dasherize))}.`,\n attr,\n didYouMean(parsed.valueToken, (controller?.values ?? []).map(dasherize)),\n );\n }\n }\n continue;\n }\n }\n\n // --- data-action descriptors: controller + method --------------------\n if (attr.name === \"data-action\") {\n for (const { identifier, method } of actionDescriptors(attr.value)) {\n const controller = known[identifier];\n if (!controller) {\n push(\n diagnostics,\n \"unknown-action-controller\",\n \"error\",\n `Action references unknown Stimeo controller \"${identifier}\".`,\n attr,\n didYouMean(identifier, knownIdentifiers),\n );\n } else if (method.length > 0 && !controller.actions.includes(method)) {\n push(\n diagnostics,\n \"unknown-action-method\",\n \"error\",\n `Unknown action \"${method}\" for \"${identifier}\". Known actions: ${list(controller.actions)}.`,\n attr,\n didYouMean(method, controller.actions),\n );\n }\n }\n }\n }\n });\n\n // --- Stage 2: required targets per scope ---------------------------------\n for (const { node, identifier } of scopes) {\n const controller = known[identifier];\n if (!controller) continue;\n const present = presence.get(node)?.get(identifier) ?? new Set<string>();\n for (const required of controller.requiredTargets) {\n if (!present.has(required)) {\n push(\n diagnostics,\n \"missing-required-target\",\n \"error\",\n `\"${identifier}\" is missing required target \"${required}\".`,\n node,\n );\n }\n }\n }\n\n // --- Stage 3: accessibility (ARIA) per scope -----------------------------\n for (const { node, identifier } of scopes) {\n const controller = known[identifier];\n if (!controller) continue;\n for (const req of controller.a11y) {\n // The root scope (\"\") is the controller element; otherwise the target's\n // own element(s). Targets that are absent are stage 2's concern, not ours\n // — we only judge accessibility of markup that is actually present.\n const elements =\n req.target === \"\"\n ? [node]\n : (targetNodes.get(node)?.get(identifier)?.get(req.target) ?? []);\n for (const el of elements) {\n checkA11y(diagnostics, el, identifier, req);\n }\n }\n }\n\n diagnostics.sort((a, b) => a.line - b.line || a.column - b.column);\n return diagnostics;\n}\n\n/**\n * Checks one accessibility requirement against a present element: at least one\n * candidate attribute must exist, and (when constrained) carry an allowed value.\n */\nfunction checkA11y(\n out: Diagnostic[],\n el: ElementNode,\n identifier: string,\n req: A11yRequirement,\n): void {\n const present = req.attrs\n .map((name) => el.attrs.find((a) => a.name === name))\n .filter((a): a is ParsedAttr => a !== undefined);\n const where = req.target === \"\" ? \"scope element\" : `\"${req.target}\" target`;\n\n if (present.length === 0) {\n push(\n out,\n \"missing-aria\",\n \"error\",\n `\"${identifier}\" requires ${describeAttrs(req.attrs)} on its ${where}.`,\n el,\n req.suggestion,\n );\n return;\n }\n if (!req.values) return;\n for (const attr of present) {\n if (!req.values.includes(attr.value.trim())) {\n // The attribute exists but holds a wrong value, so the rule's \"Add …\"\n // suggestion would mislead — point at the value fix instead.\n push(\n out,\n \"invalid-aria-value\",\n \"error\",\n `${attr.name}=\"${attr.value}\" is not valid on the ${where} of \"${identifier}\". Expected ${list(req.values)}.`,\n attr,\n `Set ${attr.name} to ${list(req.values)}.`,\n );\n }\n }\n}\n\n/** Climbs the ancestor chain (including `node`) for the nearest owning scope. */\nfunction findOwner(node: ElementNode, identifier: string): ElementNode | null {\n let current: ElementNode | null = node;\n while (current && current.tag !== \"#root\") {\n const dataController = current.attrs.find((a) => a.name === \"data-controller\");\n if (dataController && controllerIdentifiers(dataController.value).includes(identifier)) {\n return current;\n }\n current = current.parent;\n }\n return null;\n}\n\n/** Appends a diagnostic positioned at the given source location. */\nfunction push(\n out: Diagnostic[],\n code: DiagnosticCode,\n severity: DiagnosticSeverity,\n message: string,\n at: { line: number; column: number },\n suggestion?: string,\n): void {\n out.push({ code, severity, message, line: at.line, column: at.column, suggestion });\n}\n\n/** Formats a name list for human-readable messages. */\nfunction list(names: readonly string[]): string {\n return names.length > 0 ? names.map((n) => `\"${n}\"`).join(\", \") : \"(none)\";\n}\n\n/** Describes a set of \"any of\" attributes, e.g. `aria-labelledby or aria-label`. */\nfunction describeAttrs(attrs: readonly string[]): string {\n return attrs.length === 1 ? (attrs[0] as string) : attrs.join(\" or \");\n}\n\n/**\n * Stage-4 typo suggestion: returns `Did you mean \"x\"?` for the nearest known\n * name when it is close enough to be a plausible misspelling, else undefined.\n * The threshold scales with name length but is capped, so unrelated names never\n * produce a misleading \"did you mean\".\n */\nfunction didYouMean(name: string, candidates: readonly string[]): string | undefined {\n if (name.length === 0) return undefined;\n let best: string | undefined;\n let bestDistance = Number.POSITIVE_INFINITY;\n for (const candidate of candidates) {\n const distance = levenshtein(name, candidate);\n if (distance < bestDistance) {\n bestDistance = distance;\n best = candidate;\n }\n }\n const threshold = Math.min(3, Math.floor(name.length / 2) + 1);\n return best !== undefined && bestDistance <= threshold ? `Did you mean \"${best}\"?` : undefined;\n}\n\n/** Classic dynamic-programming Levenshtein edit distance. */\nfunction levenshtein(a: string, b: string): number {\n const rows = a.length;\n const cols = b.length;\n if (rows === 0) return cols;\n if (cols === 0) return rows;\n let prev = Array.from({ length: cols + 1 }, (_, j) => j);\n for (let i = 1; i <= rows; i++) {\n const curr = [i];\n for (let j = 1; j <= cols; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n curr[j] = Math.min(\n (curr[j - 1] as number) + 1,\n (prev[j] as number) + 1,\n (prev[j - 1] as number) + cost,\n );\n }\n prev = curr;\n }\n return prev[cols] as number;\n}\n","import { readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { dirname, extname, join, relative } from \"node:path\";\nimport process from \"node:process\";\nimport { fileURLToPath } from \"node:url\";\nimport { checkSource } from \"./check\";\nimport type { CheckReport, Diagnostic, FileReport, Manifest } from \"./types\";\n\n/**\n * `stimeo check <path...>` / `stimeo catalog` — static checker and catalog\n * for `stimeo--*` markup.\n *\n * This is the executable entry point bundled as the `stimeo` npm bin. It is a\n * thin shell around {@link checkSource} and the bundled manifest: discover\n * files, run the engine, format the report, and set the exit code. All checking\n * logic lives in the engine so the CLI and internal CI use exactly the same\n * code path. Both commands accept `--json` to emit machine-readable output for\n * editor tooling and CI.\n */\n\nconst FILE_EXTENSIONS = new Set([\".erb\", \".html\", \".htm\"]);\n\n/** Loads the manifest bundled next to this file (`dist/inspector/manifest.json`). */\nfunction loadManifest(): Manifest {\n const here = dirname(fileURLToPath(import.meta.url));\n const manifestPath = join(here, \"manifest.json\");\n const raw = readFileSync(manifestPath, \"utf8\");\n return JSON.parse(raw) as Manifest;\n}\n\n/** Recursively collects checkable files under the given path. */\nfunction collectFiles(target: string, out: string[]): void {\n const stat = statSync(target);\n if (stat.isDirectory()) {\n for (const entry of readdirSync(target)) {\n collectFiles(join(target, entry), out);\n }\n return;\n }\n // `.html.erb` ends with `.erb`; `extname` returns the final extension only.\n if (FILE_EXTENSIONS.has(extname(target))) out.push(target);\n}\n\n/** Builds a report for a single file. */\nfunction checkFile(file: string, manifest: Manifest): FileReport {\n const source = readFileSync(file, \"utf8\");\n return { file, diagnostics: checkSource(source, manifest) };\n}\n\n/**\n * Formats one diagnostic, e.g. ` 13:5 error message [code]`. A stage-4\n * suggestion, when present, is appended on its own indented `→` line.\n */\nfunction formatDiagnostic(d: Diagnostic): string {\n const where = `${d.line}:${d.column}`.padEnd(7);\n const head = ` ${where} ${d.severity.padEnd(7)} ${d.message} [${d.code}]`;\n return d.suggestion ? `${head}\\n → ${d.suggestion}` : head;\n}\n\n/**\n * Aggregates per-file reports into the structured {@link CheckReport}, keeping\n * only files that produced diagnostics and tallying severities. Pure (no I/O),\n * so the JSON output contract is unit-tested directly.\n */\nexport function buildCheckReport(\n reports: readonly FileReport[],\n checkedFiles: number,\n): CheckReport {\n let errorCount = 0;\n let warningCount = 0;\n const files: FileReport[] = [];\n for (const report of reports) {\n if (report.diagnostics.length === 0) continue;\n files.push(report);\n for (const d of report.diagnostics) {\n if (d.severity === \"error\") errorCount++;\n else warningCount++;\n }\n }\n return { ok: errorCount === 0, checkedFiles, errorCount, warningCount, files };\n}\n\n/**\n * Renders the manifest as a human-readable catalog: one block per controller\n * listing its non-empty target/value/action/event names. `--json` emits the\n * raw manifest instead, for machine consumption.\n */\nexport function catalogSummary(manifest: Manifest): string[] {\n const ids = Object.keys(manifest.controllers).sort();\n const lines = [\n `Stimeo UI catalog — ${ids.length} controller(s) (schema v${manifest.schemaVersion}, package ${manifest.packageVersion})`,\n \"\",\n ];\n for (const id of ids) {\n const c = manifest.controllers[id];\n if (!c) continue;\n lines.push(id);\n if (c.targets.length > 0) lines.push(` targets: ${c.targets.join(\", \")}`);\n if (c.values.length > 0) lines.push(` values: ${c.values.join(\", \")}`);\n if (c.actions.length > 0) lines.push(` actions: ${c.actions.join(\", \")}`);\n if (c.events.length > 0) lines.push(` events: ${c.events.join(\", \")}`);\n }\n return lines;\n}\n\nconst USAGE = `stimeo — static checker and catalog for Stimeo UI markup\n\nUsage:\n stimeo check [--json] <path...> Check HTML/ERB files (or directories) for\n unknown or misused stimeo--* controllers,\n targets, values and action methods.\n stimeo catalog [--json] Print the official controller catalog\n (identifiers, targets, values, actions,\n events).\n\n--json makes either command emit machine-readable JSON (for tooling / MCP):\ncheck prints a CheckReport, catalog prints the raw manifest.\nExit code is 1 when any error is found.`;\n\n/**\n * Runs the CLI.\n *\n * @param argv - Arguments after the node executable and script (`process.argv.slice(2)`).\n * @param write - Output sink (defaults to stdout); injectable for tests.\n * @param load - Manifest loader (defaults to the bundled manifest); injectable for tests.\n * @returns Process exit code (0 = clean, 1 = errors found, 2 = usage error).\n */\nexport function runCli(\n argv: readonly string[],\n write: (line: string) => void = console.log,\n load: () => Manifest = loadManifest,\n): number {\n const [command, ...rest] = argv;\n\n if (command === undefined || command === \"--help\" || command === \"-h\") {\n write(USAGE);\n return command === undefined ? 2 : 0;\n }\n\n const json = rest.includes(\"--json\");\n\n if (command === \"catalog\") {\n const manifest = load();\n if (json) {\n write(JSON.stringify(manifest, null, 2));\n } else {\n for (const line of catalogSummary(manifest)) write(line);\n }\n return 0;\n }\n\n if (command !== \"check\") {\n write(`Unknown command \"${command}\".\\n\\n${USAGE}`);\n return 2;\n }\n\n const paths = rest.filter((arg) => !arg.startsWith(\"-\"));\n if (paths.length === 0) {\n write(`No paths given.\\n\\n${USAGE}`);\n return 2;\n }\n\n const files: string[] = [];\n for (const path of paths) {\n try {\n collectFiles(path, files);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n const reason =\n code === \"ENOENT\"\n ? \"no such file or directory\"\n : code === \"EACCES\"\n ? \"permission denied\"\n : ((err as Error).message ?? \"cannot access path\");\n write(`Cannot read path \"${path}\": ${reason}.\\n\\n${USAGE}`);\n return 2;\n }\n }\n\n const manifest = load();\n const cwd = process.cwd();\n const reports: FileReport[] = [];\n for (const file of files.sort()) {\n reports.push({\n file: relative(cwd, file) || file,\n diagnostics: checkFile(file, manifest).diagnostics,\n });\n }\n const summary = buildCheckReport(reports, files.length);\n\n if (json) {\n write(JSON.stringify(summary, null, 2));\n return summary.errorCount > 0 ? 1 : 0;\n }\n\n for (const report of summary.files) {\n write(report.file);\n for (const d of report.diagnostics) write(formatDiagnostic(d));\n write(\"\");\n }\n\n const total = summary.errorCount + summary.warningCount;\n if (total === 0) {\n write(`✓ Checked ${summary.checkedFiles} file(s); no problems found.`);\n return 0;\n }\n write(\n `✖ ${total} problem(s) (${summary.errorCount} error(s), ${summary.warningCount} warning(s)).`,\n );\n return summary.errorCount > 0 ? 1 : 0;\n}\n","import process from \"node:process\";\nimport { runCli } from \"./cli\";\n\n/**\n * Executable entry point for the `stimeo` bin. Kept separate from {@link runCli}\n * so the CLI logic can be imported by tests without triggering `process.exit`.\n * A Node shebang is prepended to the built file by `scripts/postbuild.ts`.\n */\nprocess.exit(runCli(process.argv.slice(2)));\n"]}
|