@utilix-tech/sdk 0.86.0 → 0.87.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/CHANGELOG.md CHANGED
@@ -2,6 +2,9 @@
2
2
 
3
3
  Full release notes for all Utilix surfaces (browser tools, REST API, SDKs, MCP server) live at [utilix.tech/changelog](https://utilix.tech/changelog). This file tracks just this package.
4
4
 
5
+ ## 0.87.0
6
+ - Add `validateMarkdownHeadingHierarchy` (markdown-heading-hierarchy-validator): scan a Markdown document's ATX headings and flag heading-structure issues: skipped levels, multiple H1s, empty headings, duplicate headings at the same level, and a document that doesn't start at H1.
7
+
5
8
  ## 0.86.0
6
9
  - Add `calculateSalesCommission` (sales-commission-calculator): compute a flat or tiered (marginal) sales commission from a sale amount, where tiered mode applies each rate only to the slice of sales within that tier, plus an optional base salary added to the total payout.
7
10
  - Add `buildCharacterClass` (regex-character-class-builder): assemble a `[...]` regex character class from named building blocks (lowercase, uppercase, digits, whitespace), custom ranges, and literal custom characters, with optional negation.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @utilix-tech/sdk
2
2
 
3
- **724 developer utility functions for Node.js: runs locally, no API key required.**
3
+ **725 developer utility functions for Node.js: runs locally, no API key required.**
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/@utilix-tech/sdk?style=flat-square&color=cb3837)](https://www.npmjs.com/package/@utilix-tech/sdk)
6
6
  [![npm downloads](https://img.shields.io/npm/dm/@utilix-tech/sdk?style=flat-square)](https://www.npmjs.com/package/@utilix-tech/sdk)
@@ -1049,7 +1049,7 @@ readMidiInfo(new Uint8Array(midiBytes));
1049
1049
  | `@utilix-tech/sdk/encoding` | Base64, URL, HTML entities, Base32/Base58/Base62 encode/decode |
1050
1050
  | `@utilix-tech/sdk/hashing` | MD5, SHA-1/256/512, bcrypt, HMAC, .htpasswd, SRI hashes, content-hash ETag generation |
1051
1051
  | `@utilix-tech/sdk/text` | Case convert, slugify, word count, lorem ipsum, line ops, HTML→Markdown, Levenshtein/Damerau string distance, readability scoring, sentence length distribution, emoji lookup |
1052
- | `@utilix-tech/sdk/data` | CSV, YAML, TOML, XML, INI, NDJSON parse and convert, NDJSON record deduplicator, SRT/WebVTT subtitles, Markdown front matter parser, YAML anchor/alias resolver, CSV column type inferencer, Markdown table column aligner |
1052
+ | `@utilix-tech/sdk/data` | CSV, YAML, TOML, XML, INI, NDJSON parse and convert, NDJSON record deduplicator, SRT/WebVTT subtitles, Markdown front matter parser, YAML anchor/alias resolver, CSV column type inferencer, Markdown table column aligner, Markdown heading hierarchy validator |
1053
1053
  | `@utilix-tech/sdk/generators` | UUID v4/v7, ULID, passwords, strength check, entropy estimator, fake data, CSP nonce generator |
1054
1054
  | `@utilix-tech/sdk/time` | Date diff, timezone convert, cron parse, relative time |
1055
1055
  | `@utilix-tech/sdk/units` | Bytes, CSS px/rem, number bases, currency format, credit card/IBAN/barcode/ISBN/VIN/ISIN validation, loan calculator, EMI calculator, compound/simple interest calculators, VAT/sales tax calculator, tip/bill split calculator, break-even point calculator, Rule of 72 calculator, savings goal calculator, ROI calculator, cash denomination/till calculator, payback period calculator, CD maturity calculator, debt-to-income ratio calculator, freelancer hourly rate calculator, debt snowball/avalanche payoff planner, tax-equivalent yield calculator, mortgage discount points break-even calculator, loan prepayment penalty calculator, data transfer time / required bandwidth estimator, real rate of return (Fisher equation) calculator, sales commission calculator (flat or tiered) |
@@ -54,6 +54,7 @@ __export(data_exports, {
54
54
  tomlToJson: () => tomlToJson,
55
55
  validateEnvKey: () => validateEnvKey,
56
56
  validateIni: () => validateIni,
57
+ validateMarkdownHeadingHierarchy: () => validateMarkdownHeadingHierarchy,
57
58
  validateNdjson: () => validateNdjson,
58
59
  validateToml: () => validateToml,
59
60
  validateXml: () => validateXml,
@@ -1580,6 +1581,84 @@ function generateMarkdownToc(markdown, options = {}) {
1580
1581
  });
1581
1582
  return { toc: tocLines.join("\n"), entries };
1582
1583
  }
1584
+ var HEADING_HIERARCHY_RE = /^(#{1,6})(?!#)(?:[ \t]+(.*?))?[ \t]*#*[ \t]*$/;
1585
+ function validateMarkdownHeadingHierarchy(markdown) {
1586
+ const lines = markdown.replace(/\r\n/g, "\n").split("\n");
1587
+ const headings = [];
1588
+ let inFence = false;
1589
+ let fenceMarker = "";
1590
+ for (let i = 0; i < lines.length; i++) {
1591
+ const line = lines[i];
1592
+ const fenceMatch = line.match(/^\s*(```+|~~~+)/);
1593
+ if (fenceMatch) {
1594
+ if (!inFence) {
1595
+ inFence = true;
1596
+ fenceMarker = fenceMatch[1][0];
1597
+ } else if (fenceMatch[1][0] === fenceMarker) {
1598
+ inFence = false;
1599
+ }
1600
+ continue;
1601
+ }
1602
+ if (inFence) continue;
1603
+ const match = line.match(HEADING_HIERARCHY_RE);
1604
+ if (!match) continue;
1605
+ const level = match[1].length;
1606
+ const text = stripInlineMarkdown(match[2] ?? "");
1607
+ headings.push({ line: i + 1, level, text });
1608
+ }
1609
+ const issues = [];
1610
+ const seen = /* @__PURE__ */ new Map();
1611
+ let h1Count = 0;
1612
+ let firstH1Line = null;
1613
+ let prevLevel = null;
1614
+ headings.forEach((h, idx) => {
1615
+ if (h.text === "") {
1616
+ issues.push({ line: h.line, type: "empty-heading", message: `Heading at line ${h.line} has no text` });
1617
+ }
1618
+ if (idx === 0 && h.level !== 1) {
1619
+ issues.push({
1620
+ line: h.line,
1621
+ type: "starts-below-h1",
1622
+ message: `Document starts with an H${h.level} heading instead of H1`
1623
+ });
1624
+ }
1625
+ if (h.level === 1) {
1626
+ h1Count++;
1627
+ if (h1Count === 1) {
1628
+ firstH1Line = h.line;
1629
+ } else {
1630
+ issues.push({
1631
+ line: h.line,
1632
+ type: "multiple-h1",
1633
+ message: `Multiple H1 headings found: another H1 at line ${h.line} (first was at line ${firstH1Line})`
1634
+ });
1635
+ }
1636
+ }
1637
+ if (prevLevel !== null && h.level > prevLevel + 1) {
1638
+ const skipped = h.level - prevLevel > 2 ? `H${prevLevel + 1}-H${h.level - 1}` : `H${prevLevel + 1}`;
1639
+ issues.push({
1640
+ line: h.line,
1641
+ type: "skipped-level",
1642
+ message: `Heading level jumps from H${prevLevel} to H${h.level} at line ${h.line}, skipping ${skipped}`
1643
+ });
1644
+ }
1645
+ prevLevel = h.level;
1646
+ if (h.text !== "") {
1647
+ const key = `${h.level}:${h.text.toLowerCase()}`;
1648
+ const earlierLine = seen.get(key);
1649
+ if (earlierLine !== void 0) {
1650
+ issues.push({
1651
+ line: h.line,
1652
+ type: "duplicate-heading",
1653
+ message: `Heading "${h.text}" at line ${h.line} duplicates an H${h.level} heading at line ${earlierLine}`
1654
+ });
1655
+ } else {
1656
+ seen.set(key, h.line);
1657
+ }
1658
+ }
1659
+ });
1660
+ return { headings, issues, h1Count };
1661
+ }
1583
1662
  function quoteSqlIdentifier(name, dialect) {
1584
1663
  if (dialect === "mysql") return "`" + name.replace(/`/g, "``") + "`";
1585
1664
  return '"' + name.replace(/"/g, '""') + '"';
@@ -1976,4 +2055,4 @@ function alignMarkdownTables(markdown) {
1976
2055
  return { output: outputLines.join("\n"), tables, warnings };
1977
2056
  }
1978
2057
 
1979
- export { alignMarkdownTables, analyzeCaptionSpeed, calculateMarkdownTaskListProgress, convertSubtitles, csvToJson, csvToSqlInsert, data_exports, dedupeNdjson, detectDelimiter, detectSubtitleFormat, diffEnvExample, envToExport, envToJson, findCsvDuplicateRows, formatNdjson, formatSubtitleTimestamp, formatToml, formatXml, generateMarkdownToc, getSection, getSectionNames, getTomlStats, getXmlStats, getYamlStats, inferCsvColumnTypes, iniToJson, jsonArrayToNdjson, jsonToIni, jsonToToml, jsonToXml, minifyNdjson, minifyToml, minifyXml, ndjsonToCsv, ndjsonToJsonArray, parseCsv, parseEnv, parseFrontMatter, parseIni, parseSubtitleTimestamp, parseSubtitles, parseXmlToObject, resolveYamlAnchors, serializeSubtitles, shiftSubtitles, stringifyIni, toCsvString, tomlToJson, validateEnvKey, validateIni, validateNdjson, validateToml, validateXml, validateYaml, xmlToJson };
2058
+ export { alignMarkdownTables, analyzeCaptionSpeed, calculateMarkdownTaskListProgress, convertSubtitles, csvToJson, csvToSqlInsert, data_exports, dedupeNdjson, detectDelimiter, detectSubtitleFormat, diffEnvExample, envToExport, envToJson, findCsvDuplicateRows, formatNdjson, formatSubtitleTimestamp, formatToml, formatXml, generateMarkdownToc, getSection, getSectionNames, getTomlStats, getXmlStats, getYamlStats, inferCsvColumnTypes, iniToJson, jsonArrayToNdjson, jsonToIni, jsonToToml, jsonToXml, minifyNdjson, minifyToml, minifyXml, ndjsonToCsv, ndjsonToJsonArray, parseCsv, parseEnv, parseFrontMatter, parseIni, parseSubtitleTimestamp, parseSubtitles, parseXmlToObject, resolveYamlAnchors, serializeSubtitles, shiftSubtitles, stringifyIni, toCsvString, tomlToJson, validateEnvKey, validateIni, validateMarkdownHeadingHierarchy, validateNdjson, validateToml, validateXml, validateYaml, xmlToJson };
@@ -21,6 +21,7 @@
21
21
  * - csv-duplicate-row-finder: findCsvDuplicateRows
22
22
  * - yaml-anchor-resolver: resolveYamlAnchors
23
23
  * - markdown-table-aligner: alignMarkdownTables
24
+ * - markdown-heading-hierarchy-validator: validateMarkdownHeadingHierarchy
24
25
  */
25
26
  interface ValidationResult {
26
27
  valid: boolean;
@@ -384,6 +385,30 @@ interface MarkdownTocResult {
384
385
  declare function generateMarkdownToc(markdown: string, options?: MarkdownTocOptions): MarkdownTocResult | {
385
386
  error: string;
386
387
  };
388
+ type HeadingIssueType = 'empty-heading' | 'multiple-h1' | 'skipped-level' | 'duplicate-heading' | 'starts-below-h1';
389
+ interface HeadingEntry {
390
+ line: number;
391
+ level: number;
392
+ text: string;
393
+ }
394
+ interface HeadingIssue {
395
+ line: number;
396
+ type: HeadingIssueType;
397
+ message: string;
398
+ }
399
+ interface HeadingHierarchyResult {
400
+ headings: HeadingEntry[];
401
+ issues: HeadingIssue[];
402
+ h1Count: number;
403
+ }
404
+ /**
405
+ * Scans a Markdown document's ATX headings and validates the overall
406
+ * heading hierarchy: a level that skips one or more levels going deeper,
407
+ * more than one H1, an empty heading, a duplicate heading at the same
408
+ * level, or a document that doesn't start at H1. Setext-style headings are
409
+ * not recognized, and headings inside fenced code blocks are ignored.
410
+ */
411
+ declare function validateMarkdownHeadingHierarchy(markdown: string): HeadingHierarchyResult;
387
412
  interface CsvToSqlOptions {
388
413
  tableName?: string;
389
414
  dialect?: 'ansi' | 'mysql';
@@ -563,6 +588,10 @@ type data_EnvEntry = EnvEntry;
563
588
  type data_EnvParseResult = EnvParseResult;
564
589
  type data_FrontMatterError = FrontMatterError;
565
590
  type data_FrontMatterResult = FrontMatterResult;
591
+ type data_HeadingEntry = HeadingEntry;
592
+ type data_HeadingHierarchyResult = HeadingHierarchyResult;
593
+ type data_HeadingIssue = HeadingIssue;
594
+ type data_HeadingIssueType = HeadingIssueType;
566
595
  type data_IniSection = IniSection;
567
596
  type data_MarkdownTableAlignResult = MarkdownTableAlignResult;
568
597
  type data_MarkdownTableColumnAlignment = MarkdownTableColumnAlignment;
@@ -637,13 +666,14 @@ declare const data_toCsvString: typeof toCsvString;
637
666
  declare const data_tomlToJson: typeof tomlToJson;
638
667
  declare const data_validateEnvKey: typeof validateEnvKey;
639
668
  declare const data_validateIni: typeof validateIni;
669
+ declare const data_validateMarkdownHeadingHierarchy: typeof validateMarkdownHeadingHierarchy;
640
670
  declare const data_validateNdjson: typeof validateNdjson;
641
671
  declare const data_validateToml: typeof validateToml;
642
672
  declare const data_validateXml: typeof validateXml;
643
673
  declare const data_validateYaml: typeof validateYaml;
644
674
  declare const data_xmlToJson: typeof xmlToJson;
645
675
  declare namespace data {
646
- export { type data_CaptionSpeedCue as CaptionSpeedCue, type data_CaptionSpeedResult as CaptionSpeedResult, type data_ConvertedSubtitles as ConvertedSubtitles, type data_CsvColumnType as CsvColumnType, type data_CsvColumnTypeInfo as CsvColumnTypeInfo, type data_CsvColumnTypeOptions as CsvColumnTypeOptions, type data_CsvColumnTypeResult as CsvColumnTypeResult, type data_CsvDuplicateGroup as CsvDuplicateGroup, type data_CsvDuplicateOptions as CsvDuplicateOptions, type data_CsvDuplicateResult as CsvDuplicateResult, type data_CsvParseResult as CsvParseResult, type data_CsvToSqlOptions as CsvToSqlOptions, type data_CsvToSqlResult as CsvToSqlResult, type data_EnvDiffError as EnvDiffError, type data_EnvDiffResult as EnvDiffResult, type data_EnvEntry as EnvEntry, type data_EnvParseResult as EnvParseResult, type data_FrontMatterError as FrontMatterError, type data_FrontMatterResult as FrontMatterResult, type data_IniSection as IniSection, type data_MarkdownTableAlignResult as MarkdownTableAlignResult, type data_MarkdownTableColumnAlignment as MarkdownTableColumnAlignment, type data_MarkdownTableInfo as MarkdownTableInfo, type data_MarkdownTaskListItem as MarkdownTaskListItem, type data_MarkdownTaskListProgressResult as MarkdownTaskListProgressResult, type data_MarkdownTaskListSectionSummary as MarkdownTaskListSectionSummary, type data_MarkdownTocEntry as MarkdownTocEntry, type data_MarkdownTocOptions as MarkdownTocOptions, type data_MarkdownTocResult as MarkdownTocResult, type data_NdjsonDedupeResult as NdjsonDedupeResult, type data_NdjsonLineResult as NdjsonLineResult, type data_NdjsonValidateResult as NdjsonValidateResult, type data_ParseOptions as ParseOptions, type data_ParsedIni as ParsedIni, type data_ParsedSubtitles as ParsedSubtitles, type data_SubtitleCue as SubtitleCue, type data_SubtitleFormat as SubtitleFormat, type data_TomlFormatResult as TomlFormatResult, type data_ValidationResult as ValidationResult, type data_XmlFormatResult as XmlFormatResult, type data_XmlToJsonOptions as XmlToJsonOptions, type data_YamlAnchorInfo as YamlAnchorInfo, type data_YamlAnchorResolveError as YamlAnchorResolveError, type data_YamlAnchorResolveResult as YamlAnchorResolveResult, data_alignMarkdownTables as alignMarkdownTables, data_analyzeCaptionSpeed as analyzeCaptionSpeed, data_calculateMarkdownTaskListProgress as calculateMarkdownTaskListProgress, data_convertSubtitles as convertSubtitles, data_csvToJson as csvToJson, data_csvToSqlInsert as csvToSqlInsert, data_dedupeNdjson as dedupeNdjson, data_detectDelimiter as detectDelimiter, data_detectSubtitleFormat as detectSubtitleFormat, data_diffEnvExample as diffEnvExample, data_envToExport as envToExport, data_envToJson as envToJson, data_findCsvDuplicateRows as findCsvDuplicateRows, data_formatNdjson as formatNdjson, data_formatSubtitleTimestamp as formatSubtitleTimestamp, data_formatToml as formatToml, data_formatXml as formatXml, data_generateMarkdownToc as generateMarkdownToc, data_getSection as getSection, data_getSectionNames as getSectionNames, data_getTomlStats as getTomlStats, data_getXmlStats as getXmlStats, data_getYamlStats as getYamlStats, data_inferCsvColumnTypes as inferCsvColumnTypes, data_iniToJson as iniToJson, data_jsonArrayToNdjson as jsonArrayToNdjson, data_jsonToIni as jsonToIni, data_jsonToToml as jsonToToml, data_jsonToXml as jsonToXml, data_minifyNdjson as minifyNdjson, data_minifyToml as minifyToml, data_minifyXml as minifyXml, data_ndjsonToCsv as ndjsonToCsv, data_ndjsonToJsonArray as ndjsonToJsonArray, data_parseCsv as parseCsv, data_parseEnv as parseEnv, data_parseFrontMatter as parseFrontMatter, data_parseIni as parseIni, data_parseSubtitleTimestamp as parseSubtitleTimestamp, data_parseSubtitles as parseSubtitles, data_parseXmlToObject as parseXmlToObject, data_resolveYamlAnchors as resolveYamlAnchors, data_serializeSubtitles as serializeSubtitles, data_shiftSubtitles as shiftSubtitles, data_stringifyIni as stringifyIni, data_toCsvString as toCsvString, data_tomlToJson as tomlToJson, data_validateEnvKey as validateEnvKey, data_validateIni as validateIni, data_validateNdjson as validateNdjson, data_validateToml as validateToml, data_validateXml as validateXml, data_validateYaml as validateYaml, data_xmlToJson as xmlToJson };
676
+ export { type data_CaptionSpeedCue as CaptionSpeedCue, type data_CaptionSpeedResult as CaptionSpeedResult, type data_ConvertedSubtitles as ConvertedSubtitles, type data_CsvColumnType as CsvColumnType, type data_CsvColumnTypeInfo as CsvColumnTypeInfo, type data_CsvColumnTypeOptions as CsvColumnTypeOptions, type data_CsvColumnTypeResult as CsvColumnTypeResult, type data_CsvDuplicateGroup as CsvDuplicateGroup, type data_CsvDuplicateOptions as CsvDuplicateOptions, type data_CsvDuplicateResult as CsvDuplicateResult, type data_CsvParseResult as CsvParseResult, type data_CsvToSqlOptions as CsvToSqlOptions, type data_CsvToSqlResult as CsvToSqlResult, type data_EnvDiffError as EnvDiffError, type data_EnvDiffResult as EnvDiffResult, type data_EnvEntry as EnvEntry, type data_EnvParseResult as EnvParseResult, type data_FrontMatterError as FrontMatterError, type data_FrontMatterResult as FrontMatterResult, type data_HeadingEntry as HeadingEntry, type data_HeadingHierarchyResult as HeadingHierarchyResult, type data_HeadingIssue as HeadingIssue, type data_HeadingIssueType as HeadingIssueType, type data_IniSection as IniSection, type data_MarkdownTableAlignResult as MarkdownTableAlignResult, type data_MarkdownTableColumnAlignment as MarkdownTableColumnAlignment, type data_MarkdownTableInfo as MarkdownTableInfo, type data_MarkdownTaskListItem as MarkdownTaskListItem, type data_MarkdownTaskListProgressResult as MarkdownTaskListProgressResult, type data_MarkdownTaskListSectionSummary as MarkdownTaskListSectionSummary, type data_MarkdownTocEntry as MarkdownTocEntry, type data_MarkdownTocOptions as MarkdownTocOptions, type data_MarkdownTocResult as MarkdownTocResult, type data_NdjsonDedupeResult as NdjsonDedupeResult, type data_NdjsonLineResult as NdjsonLineResult, type data_NdjsonValidateResult as NdjsonValidateResult, type data_ParseOptions as ParseOptions, type data_ParsedIni as ParsedIni, type data_ParsedSubtitles as ParsedSubtitles, type data_SubtitleCue as SubtitleCue, type data_SubtitleFormat as SubtitleFormat, type data_TomlFormatResult as TomlFormatResult, type data_ValidationResult as ValidationResult, type data_XmlFormatResult as XmlFormatResult, type data_XmlToJsonOptions as XmlToJsonOptions, type data_YamlAnchorInfo as YamlAnchorInfo, type data_YamlAnchorResolveError as YamlAnchorResolveError, type data_YamlAnchorResolveResult as YamlAnchorResolveResult, data_alignMarkdownTables as alignMarkdownTables, data_analyzeCaptionSpeed as analyzeCaptionSpeed, data_calculateMarkdownTaskListProgress as calculateMarkdownTaskListProgress, data_convertSubtitles as convertSubtitles, data_csvToJson as csvToJson, data_csvToSqlInsert as csvToSqlInsert, data_dedupeNdjson as dedupeNdjson, data_detectDelimiter as detectDelimiter, data_detectSubtitleFormat as detectSubtitleFormat, data_diffEnvExample as diffEnvExample, data_envToExport as envToExport, data_envToJson as envToJson, data_findCsvDuplicateRows as findCsvDuplicateRows, data_formatNdjson as formatNdjson, data_formatSubtitleTimestamp as formatSubtitleTimestamp, data_formatToml as formatToml, data_formatXml as formatXml, data_generateMarkdownToc as generateMarkdownToc, data_getSection as getSection, data_getSectionNames as getSectionNames, data_getTomlStats as getTomlStats, data_getXmlStats as getXmlStats, data_getYamlStats as getYamlStats, data_inferCsvColumnTypes as inferCsvColumnTypes, data_iniToJson as iniToJson, data_jsonArrayToNdjson as jsonArrayToNdjson, data_jsonToIni as jsonToIni, data_jsonToToml as jsonToToml, data_jsonToXml as jsonToXml, data_minifyNdjson as minifyNdjson, data_minifyToml as minifyToml, data_minifyXml as minifyXml, data_ndjsonToCsv as ndjsonToCsv, data_ndjsonToJsonArray as ndjsonToJsonArray, data_parseCsv as parseCsv, data_parseEnv as parseEnv, data_parseFrontMatter as parseFrontMatter, data_parseIni as parseIni, data_parseSubtitleTimestamp as parseSubtitleTimestamp, data_parseSubtitles as parseSubtitles, data_parseXmlToObject as parseXmlToObject, data_resolveYamlAnchors as resolveYamlAnchors, data_serializeSubtitles as serializeSubtitles, data_shiftSubtitles as shiftSubtitles, data_stringifyIni as stringifyIni, data_toCsvString as toCsvString, data_tomlToJson as tomlToJson, data_validateEnvKey as validateEnvKey, data_validateIni as validateIni, data_validateMarkdownHeadingHierarchy as validateMarkdownHeadingHierarchy, data_validateNdjson as validateNdjson, data_validateToml as validateToml, data_validateXml as validateXml, data_validateYaml as validateYaml, data_xmlToJson as xmlToJson };
647
677
  }
648
678
 
649
- export { detectSubtitleFormat as $, type NdjsonValidateResult as A, type ParsedIni as B, type CaptionSpeedCue as C, type ParsedSubtitles as D, type EnvDiffError as E, type FrontMatterError as F, type SubtitleFormat as G, type XmlToJsonOptions as H, type IniSection as I, type YamlAnchorResolveError as J, type YamlAnchorResolveResult as K, alignMarkdownTables as L, type MarkdownTableAlignResult as M, type NdjsonDedupeResult as N, analyzeCaptionSpeed as O, type ParseOptions as P, calculateMarkdownTaskListProgress as Q, convertSubtitles as R, type SubtitleCue as S, type TomlFormatResult as T, csvToJson as U, type ValidationResult as V, csvToSqlInsert as W, type XmlFormatResult as X, type YamlAnchorInfo as Y, dedupeNdjson as Z, detectDelimiter as _, type CaptionSpeedResult as a, diffEnvExample as a0, envToExport as a1, envToJson as a2, findCsvDuplicateRows as a3, formatNdjson as a4, formatSubtitleTimestamp as a5, formatToml as a6, formatXml as a7, generateMarkdownToc as a8, getSection as a9, toCsvString as aA, tomlToJson as aB, validateEnvKey as aC, validateIni as aD, validateNdjson as aE, validateToml as aF, validateXml as aG, validateYaml as aH, xmlToJson as aI, getSectionNames as aa, getTomlStats as ab, getXmlStats as ac, getYamlStats as ad, inferCsvColumnTypes as ae, iniToJson as af, jsonArrayToNdjson as ag, jsonToIni as ah, jsonToToml as ai, jsonToXml as aj, minifyNdjson as ak, minifyToml as al, minifyXml as am, ndjsonToCsv as an, ndjsonToJsonArray as ao, parseCsv as ap, parseEnv as aq, parseFrontMatter as ar, parseIni as as, parseSubtitleTimestamp as at, parseSubtitles as au, parseXmlToObject as av, resolveYamlAnchors as aw, serializeSubtitles as ax, shiftSubtitles as ay, stringifyIni as az, type ConvertedSubtitles as b, type CsvColumnType as c, data as d, type CsvColumnTypeInfo as e, type CsvColumnTypeOptions as f, type CsvColumnTypeResult as g, type CsvDuplicateGroup as h, type CsvDuplicateOptions as i, type CsvDuplicateResult as j, type CsvParseResult as k, type CsvToSqlOptions as l, type CsvToSqlResult as m, type EnvDiffResult as n, type EnvEntry as o, type EnvParseResult as p, type FrontMatterResult as q, type MarkdownTableColumnAlignment as r, type MarkdownTableInfo as s, type MarkdownTaskListItem as t, type MarkdownTaskListProgressResult as u, type MarkdownTaskListSectionSummary as v, type MarkdownTocEntry as w, type MarkdownTocOptions as x, type MarkdownTocResult as y, type NdjsonLineResult as z };
679
+ export { csvToJson as $, type MarkdownTocOptions as A, type MarkdownTocResult as B, type CaptionSpeedCue as C, type NdjsonLineResult as D, type EnvDiffError as E, type FrontMatterError as F, type NdjsonValidateResult as G, type HeadingEntry as H, type IniSection as I, type ParsedIni as J, type ParsedSubtitles as K, type SubtitleFormat as L, type MarkdownTableAlignResult as M, type NdjsonDedupeResult as N, type XmlToJsonOptions as O, type ParseOptions as P, type YamlAnchorResolveError as Q, type YamlAnchorResolveResult as R, type SubtitleCue as S, type TomlFormatResult as T, alignMarkdownTables as U, type ValidationResult as V, analyzeCaptionSpeed as W, type XmlFormatResult as X, type YamlAnchorInfo as Y, calculateMarkdownTaskListProgress as Z, convertSubtitles as _, type CaptionSpeedResult as a, csvToSqlInsert as a0, dedupeNdjson as a1, detectDelimiter as a2, detectSubtitleFormat as a3, diffEnvExample as a4, envToExport as a5, envToJson as a6, findCsvDuplicateRows as a7, formatNdjson as a8, formatSubtitleTimestamp as a9, resolveYamlAnchors as aA, serializeSubtitles as aB, shiftSubtitles as aC, stringifyIni as aD, toCsvString as aE, tomlToJson as aF, validateEnvKey as aG, validateIni as aH, validateMarkdownHeadingHierarchy as aI, validateNdjson as aJ, validateToml as aK, validateXml as aL, validateYaml as aM, xmlToJson as aN, formatToml as aa, formatXml as ab, generateMarkdownToc as ac, getSection as ad, getSectionNames as ae, getTomlStats as af, getXmlStats as ag, getYamlStats as ah, inferCsvColumnTypes as ai, iniToJson as aj, jsonArrayToNdjson as ak, jsonToIni as al, jsonToToml as am, jsonToXml as an, minifyNdjson as ao, minifyToml as ap, minifyXml as aq, ndjsonToCsv as ar, ndjsonToJsonArray as as, parseCsv as at, parseEnv as au, parseFrontMatter as av, parseIni as aw, parseSubtitleTimestamp as ax, parseSubtitles as ay, parseXmlToObject as az, type ConvertedSubtitles as b, type CsvColumnType as c, data as d, type CsvColumnTypeInfo as e, type CsvColumnTypeOptions as f, type CsvColumnTypeResult as g, type CsvDuplicateGroup as h, type CsvDuplicateOptions as i, type CsvDuplicateResult as j, type CsvParseResult as k, type CsvToSqlOptions as l, type CsvToSqlResult as m, type EnvDiffResult as n, type EnvEntry as o, type EnvParseResult as p, type FrontMatterResult as q, type HeadingHierarchyResult as r, type HeadingIssue as s, type HeadingIssueType as t, type MarkdownTableColumnAlignment as u, type MarkdownTableInfo as v, type MarkdownTaskListItem as w, type MarkdownTaskListProgressResult as x, type MarkdownTaskListSectionSummary as y, type MarkdownTocEntry as z };
@@ -21,6 +21,7 @@
21
21
  * - csv-duplicate-row-finder: findCsvDuplicateRows
22
22
  * - yaml-anchor-resolver: resolveYamlAnchors
23
23
  * - markdown-table-aligner: alignMarkdownTables
24
+ * - markdown-heading-hierarchy-validator: validateMarkdownHeadingHierarchy
24
25
  */
25
26
  interface ValidationResult {
26
27
  valid: boolean;
@@ -384,6 +385,30 @@ interface MarkdownTocResult {
384
385
  declare function generateMarkdownToc(markdown: string, options?: MarkdownTocOptions): MarkdownTocResult | {
385
386
  error: string;
386
387
  };
388
+ type HeadingIssueType = 'empty-heading' | 'multiple-h1' | 'skipped-level' | 'duplicate-heading' | 'starts-below-h1';
389
+ interface HeadingEntry {
390
+ line: number;
391
+ level: number;
392
+ text: string;
393
+ }
394
+ interface HeadingIssue {
395
+ line: number;
396
+ type: HeadingIssueType;
397
+ message: string;
398
+ }
399
+ interface HeadingHierarchyResult {
400
+ headings: HeadingEntry[];
401
+ issues: HeadingIssue[];
402
+ h1Count: number;
403
+ }
404
+ /**
405
+ * Scans a Markdown document's ATX headings and validates the overall
406
+ * heading hierarchy: a level that skips one or more levels going deeper,
407
+ * more than one H1, an empty heading, a duplicate heading at the same
408
+ * level, or a document that doesn't start at H1. Setext-style headings are
409
+ * not recognized, and headings inside fenced code blocks are ignored.
410
+ */
411
+ declare function validateMarkdownHeadingHierarchy(markdown: string): HeadingHierarchyResult;
387
412
  interface CsvToSqlOptions {
388
413
  tableName?: string;
389
414
  dialect?: 'ansi' | 'mysql';
@@ -563,6 +588,10 @@ type data_EnvEntry = EnvEntry;
563
588
  type data_EnvParseResult = EnvParseResult;
564
589
  type data_FrontMatterError = FrontMatterError;
565
590
  type data_FrontMatterResult = FrontMatterResult;
591
+ type data_HeadingEntry = HeadingEntry;
592
+ type data_HeadingHierarchyResult = HeadingHierarchyResult;
593
+ type data_HeadingIssue = HeadingIssue;
594
+ type data_HeadingIssueType = HeadingIssueType;
566
595
  type data_IniSection = IniSection;
567
596
  type data_MarkdownTableAlignResult = MarkdownTableAlignResult;
568
597
  type data_MarkdownTableColumnAlignment = MarkdownTableColumnAlignment;
@@ -637,13 +666,14 @@ declare const data_toCsvString: typeof toCsvString;
637
666
  declare const data_tomlToJson: typeof tomlToJson;
638
667
  declare const data_validateEnvKey: typeof validateEnvKey;
639
668
  declare const data_validateIni: typeof validateIni;
669
+ declare const data_validateMarkdownHeadingHierarchy: typeof validateMarkdownHeadingHierarchy;
640
670
  declare const data_validateNdjson: typeof validateNdjson;
641
671
  declare const data_validateToml: typeof validateToml;
642
672
  declare const data_validateXml: typeof validateXml;
643
673
  declare const data_validateYaml: typeof validateYaml;
644
674
  declare const data_xmlToJson: typeof xmlToJson;
645
675
  declare namespace data {
646
- export { type data_CaptionSpeedCue as CaptionSpeedCue, type data_CaptionSpeedResult as CaptionSpeedResult, type data_ConvertedSubtitles as ConvertedSubtitles, type data_CsvColumnType as CsvColumnType, type data_CsvColumnTypeInfo as CsvColumnTypeInfo, type data_CsvColumnTypeOptions as CsvColumnTypeOptions, type data_CsvColumnTypeResult as CsvColumnTypeResult, type data_CsvDuplicateGroup as CsvDuplicateGroup, type data_CsvDuplicateOptions as CsvDuplicateOptions, type data_CsvDuplicateResult as CsvDuplicateResult, type data_CsvParseResult as CsvParseResult, type data_CsvToSqlOptions as CsvToSqlOptions, type data_CsvToSqlResult as CsvToSqlResult, type data_EnvDiffError as EnvDiffError, type data_EnvDiffResult as EnvDiffResult, type data_EnvEntry as EnvEntry, type data_EnvParseResult as EnvParseResult, type data_FrontMatterError as FrontMatterError, type data_FrontMatterResult as FrontMatterResult, type data_IniSection as IniSection, type data_MarkdownTableAlignResult as MarkdownTableAlignResult, type data_MarkdownTableColumnAlignment as MarkdownTableColumnAlignment, type data_MarkdownTableInfo as MarkdownTableInfo, type data_MarkdownTaskListItem as MarkdownTaskListItem, type data_MarkdownTaskListProgressResult as MarkdownTaskListProgressResult, type data_MarkdownTaskListSectionSummary as MarkdownTaskListSectionSummary, type data_MarkdownTocEntry as MarkdownTocEntry, type data_MarkdownTocOptions as MarkdownTocOptions, type data_MarkdownTocResult as MarkdownTocResult, type data_NdjsonDedupeResult as NdjsonDedupeResult, type data_NdjsonLineResult as NdjsonLineResult, type data_NdjsonValidateResult as NdjsonValidateResult, type data_ParseOptions as ParseOptions, type data_ParsedIni as ParsedIni, type data_ParsedSubtitles as ParsedSubtitles, type data_SubtitleCue as SubtitleCue, type data_SubtitleFormat as SubtitleFormat, type data_TomlFormatResult as TomlFormatResult, type data_ValidationResult as ValidationResult, type data_XmlFormatResult as XmlFormatResult, type data_XmlToJsonOptions as XmlToJsonOptions, type data_YamlAnchorInfo as YamlAnchorInfo, type data_YamlAnchorResolveError as YamlAnchorResolveError, type data_YamlAnchorResolveResult as YamlAnchorResolveResult, data_alignMarkdownTables as alignMarkdownTables, data_analyzeCaptionSpeed as analyzeCaptionSpeed, data_calculateMarkdownTaskListProgress as calculateMarkdownTaskListProgress, data_convertSubtitles as convertSubtitles, data_csvToJson as csvToJson, data_csvToSqlInsert as csvToSqlInsert, data_dedupeNdjson as dedupeNdjson, data_detectDelimiter as detectDelimiter, data_detectSubtitleFormat as detectSubtitleFormat, data_diffEnvExample as diffEnvExample, data_envToExport as envToExport, data_envToJson as envToJson, data_findCsvDuplicateRows as findCsvDuplicateRows, data_formatNdjson as formatNdjson, data_formatSubtitleTimestamp as formatSubtitleTimestamp, data_formatToml as formatToml, data_formatXml as formatXml, data_generateMarkdownToc as generateMarkdownToc, data_getSection as getSection, data_getSectionNames as getSectionNames, data_getTomlStats as getTomlStats, data_getXmlStats as getXmlStats, data_getYamlStats as getYamlStats, data_inferCsvColumnTypes as inferCsvColumnTypes, data_iniToJson as iniToJson, data_jsonArrayToNdjson as jsonArrayToNdjson, data_jsonToIni as jsonToIni, data_jsonToToml as jsonToToml, data_jsonToXml as jsonToXml, data_minifyNdjson as minifyNdjson, data_minifyToml as minifyToml, data_minifyXml as minifyXml, data_ndjsonToCsv as ndjsonToCsv, data_ndjsonToJsonArray as ndjsonToJsonArray, data_parseCsv as parseCsv, data_parseEnv as parseEnv, data_parseFrontMatter as parseFrontMatter, data_parseIni as parseIni, data_parseSubtitleTimestamp as parseSubtitleTimestamp, data_parseSubtitles as parseSubtitles, data_parseXmlToObject as parseXmlToObject, data_resolveYamlAnchors as resolveYamlAnchors, data_serializeSubtitles as serializeSubtitles, data_shiftSubtitles as shiftSubtitles, data_stringifyIni as stringifyIni, data_toCsvString as toCsvString, data_tomlToJson as tomlToJson, data_validateEnvKey as validateEnvKey, data_validateIni as validateIni, data_validateNdjson as validateNdjson, data_validateToml as validateToml, data_validateXml as validateXml, data_validateYaml as validateYaml, data_xmlToJson as xmlToJson };
676
+ export { type data_CaptionSpeedCue as CaptionSpeedCue, type data_CaptionSpeedResult as CaptionSpeedResult, type data_ConvertedSubtitles as ConvertedSubtitles, type data_CsvColumnType as CsvColumnType, type data_CsvColumnTypeInfo as CsvColumnTypeInfo, type data_CsvColumnTypeOptions as CsvColumnTypeOptions, type data_CsvColumnTypeResult as CsvColumnTypeResult, type data_CsvDuplicateGroup as CsvDuplicateGroup, type data_CsvDuplicateOptions as CsvDuplicateOptions, type data_CsvDuplicateResult as CsvDuplicateResult, type data_CsvParseResult as CsvParseResult, type data_CsvToSqlOptions as CsvToSqlOptions, type data_CsvToSqlResult as CsvToSqlResult, type data_EnvDiffError as EnvDiffError, type data_EnvDiffResult as EnvDiffResult, type data_EnvEntry as EnvEntry, type data_EnvParseResult as EnvParseResult, type data_FrontMatterError as FrontMatterError, type data_FrontMatterResult as FrontMatterResult, type data_HeadingEntry as HeadingEntry, type data_HeadingHierarchyResult as HeadingHierarchyResult, type data_HeadingIssue as HeadingIssue, type data_HeadingIssueType as HeadingIssueType, type data_IniSection as IniSection, type data_MarkdownTableAlignResult as MarkdownTableAlignResult, type data_MarkdownTableColumnAlignment as MarkdownTableColumnAlignment, type data_MarkdownTableInfo as MarkdownTableInfo, type data_MarkdownTaskListItem as MarkdownTaskListItem, type data_MarkdownTaskListProgressResult as MarkdownTaskListProgressResult, type data_MarkdownTaskListSectionSummary as MarkdownTaskListSectionSummary, type data_MarkdownTocEntry as MarkdownTocEntry, type data_MarkdownTocOptions as MarkdownTocOptions, type data_MarkdownTocResult as MarkdownTocResult, type data_NdjsonDedupeResult as NdjsonDedupeResult, type data_NdjsonLineResult as NdjsonLineResult, type data_NdjsonValidateResult as NdjsonValidateResult, type data_ParseOptions as ParseOptions, type data_ParsedIni as ParsedIni, type data_ParsedSubtitles as ParsedSubtitles, type data_SubtitleCue as SubtitleCue, type data_SubtitleFormat as SubtitleFormat, type data_TomlFormatResult as TomlFormatResult, type data_ValidationResult as ValidationResult, type data_XmlFormatResult as XmlFormatResult, type data_XmlToJsonOptions as XmlToJsonOptions, type data_YamlAnchorInfo as YamlAnchorInfo, type data_YamlAnchorResolveError as YamlAnchorResolveError, type data_YamlAnchorResolveResult as YamlAnchorResolveResult, data_alignMarkdownTables as alignMarkdownTables, data_analyzeCaptionSpeed as analyzeCaptionSpeed, data_calculateMarkdownTaskListProgress as calculateMarkdownTaskListProgress, data_convertSubtitles as convertSubtitles, data_csvToJson as csvToJson, data_csvToSqlInsert as csvToSqlInsert, data_dedupeNdjson as dedupeNdjson, data_detectDelimiter as detectDelimiter, data_detectSubtitleFormat as detectSubtitleFormat, data_diffEnvExample as diffEnvExample, data_envToExport as envToExport, data_envToJson as envToJson, data_findCsvDuplicateRows as findCsvDuplicateRows, data_formatNdjson as formatNdjson, data_formatSubtitleTimestamp as formatSubtitleTimestamp, data_formatToml as formatToml, data_formatXml as formatXml, data_generateMarkdownToc as generateMarkdownToc, data_getSection as getSection, data_getSectionNames as getSectionNames, data_getTomlStats as getTomlStats, data_getXmlStats as getXmlStats, data_getYamlStats as getYamlStats, data_inferCsvColumnTypes as inferCsvColumnTypes, data_iniToJson as iniToJson, data_jsonArrayToNdjson as jsonArrayToNdjson, data_jsonToIni as jsonToIni, data_jsonToToml as jsonToToml, data_jsonToXml as jsonToXml, data_minifyNdjson as minifyNdjson, data_minifyToml as minifyToml, data_minifyXml as minifyXml, data_ndjsonToCsv as ndjsonToCsv, data_ndjsonToJsonArray as ndjsonToJsonArray, data_parseCsv as parseCsv, data_parseEnv as parseEnv, data_parseFrontMatter as parseFrontMatter, data_parseIni as parseIni, data_parseSubtitleTimestamp as parseSubtitleTimestamp, data_parseSubtitles as parseSubtitles, data_parseXmlToObject as parseXmlToObject, data_resolveYamlAnchors as resolveYamlAnchors, data_serializeSubtitles as serializeSubtitles, data_shiftSubtitles as shiftSubtitles, data_stringifyIni as stringifyIni, data_toCsvString as toCsvString, data_tomlToJson as tomlToJson, data_validateEnvKey as validateEnvKey, data_validateIni as validateIni, data_validateMarkdownHeadingHierarchy as validateMarkdownHeadingHierarchy, data_validateNdjson as validateNdjson, data_validateToml as validateToml, data_validateXml as validateXml, data_validateYaml as validateYaml, data_xmlToJson as xmlToJson };
647
677
  }
648
678
 
649
- export { detectSubtitleFormat as $, type NdjsonValidateResult as A, type ParsedIni as B, type CaptionSpeedCue as C, type ParsedSubtitles as D, type EnvDiffError as E, type FrontMatterError as F, type SubtitleFormat as G, type XmlToJsonOptions as H, type IniSection as I, type YamlAnchorResolveError as J, type YamlAnchorResolveResult as K, alignMarkdownTables as L, type MarkdownTableAlignResult as M, type NdjsonDedupeResult as N, analyzeCaptionSpeed as O, type ParseOptions as P, calculateMarkdownTaskListProgress as Q, convertSubtitles as R, type SubtitleCue as S, type TomlFormatResult as T, csvToJson as U, type ValidationResult as V, csvToSqlInsert as W, type XmlFormatResult as X, type YamlAnchorInfo as Y, dedupeNdjson as Z, detectDelimiter as _, type CaptionSpeedResult as a, diffEnvExample as a0, envToExport as a1, envToJson as a2, findCsvDuplicateRows as a3, formatNdjson as a4, formatSubtitleTimestamp as a5, formatToml as a6, formatXml as a7, generateMarkdownToc as a8, getSection as a9, toCsvString as aA, tomlToJson as aB, validateEnvKey as aC, validateIni as aD, validateNdjson as aE, validateToml as aF, validateXml as aG, validateYaml as aH, xmlToJson as aI, getSectionNames as aa, getTomlStats as ab, getXmlStats as ac, getYamlStats as ad, inferCsvColumnTypes as ae, iniToJson as af, jsonArrayToNdjson as ag, jsonToIni as ah, jsonToToml as ai, jsonToXml as aj, minifyNdjson as ak, minifyToml as al, minifyXml as am, ndjsonToCsv as an, ndjsonToJsonArray as ao, parseCsv as ap, parseEnv as aq, parseFrontMatter as ar, parseIni as as, parseSubtitleTimestamp as at, parseSubtitles as au, parseXmlToObject as av, resolveYamlAnchors as aw, serializeSubtitles as ax, shiftSubtitles as ay, stringifyIni as az, type ConvertedSubtitles as b, type CsvColumnType as c, data as d, type CsvColumnTypeInfo as e, type CsvColumnTypeOptions as f, type CsvColumnTypeResult as g, type CsvDuplicateGroup as h, type CsvDuplicateOptions as i, type CsvDuplicateResult as j, type CsvParseResult as k, type CsvToSqlOptions as l, type CsvToSqlResult as m, type EnvDiffResult as n, type EnvEntry as o, type EnvParseResult as p, type FrontMatterResult as q, type MarkdownTableColumnAlignment as r, type MarkdownTableInfo as s, type MarkdownTaskListItem as t, type MarkdownTaskListProgressResult as u, type MarkdownTaskListSectionSummary as v, type MarkdownTocEntry as w, type MarkdownTocOptions as x, type MarkdownTocResult as y, type NdjsonLineResult as z };
679
+ export { csvToJson as $, type MarkdownTocOptions as A, type MarkdownTocResult as B, type CaptionSpeedCue as C, type NdjsonLineResult as D, type EnvDiffError as E, type FrontMatterError as F, type NdjsonValidateResult as G, type HeadingEntry as H, type IniSection as I, type ParsedIni as J, type ParsedSubtitles as K, type SubtitleFormat as L, type MarkdownTableAlignResult as M, type NdjsonDedupeResult as N, type XmlToJsonOptions as O, type ParseOptions as P, type YamlAnchorResolveError as Q, type YamlAnchorResolveResult as R, type SubtitleCue as S, type TomlFormatResult as T, alignMarkdownTables as U, type ValidationResult as V, analyzeCaptionSpeed as W, type XmlFormatResult as X, type YamlAnchorInfo as Y, calculateMarkdownTaskListProgress as Z, convertSubtitles as _, type CaptionSpeedResult as a, csvToSqlInsert as a0, dedupeNdjson as a1, detectDelimiter as a2, detectSubtitleFormat as a3, diffEnvExample as a4, envToExport as a5, envToJson as a6, findCsvDuplicateRows as a7, formatNdjson as a8, formatSubtitleTimestamp as a9, resolveYamlAnchors as aA, serializeSubtitles as aB, shiftSubtitles as aC, stringifyIni as aD, toCsvString as aE, tomlToJson as aF, validateEnvKey as aG, validateIni as aH, validateMarkdownHeadingHierarchy as aI, validateNdjson as aJ, validateToml as aK, validateXml as aL, validateYaml as aM, xmlToJson as aN, formatToml as aa, formatXml as ab, generateMarkdownToc as ac, getSection as ad, getSectionNames as ae, getTomlStats as af, getXmlStats as ag, getYamlStats as ah, inferCsvColumnTypes as ai, iniToJson as aj, jsonArrayToNdjson as ak, jsonToIni as al, jsonToToml as am, jsonToXml as an, minifyNdjson as ao, minifyToml as ap, minifyXml as aq, ndjsonToCsv as ar, ndjsonToJsonArray as as, parseCsv as at, parseEnv as au, parseFrontMatter as av, parseIni as aw, parseSubtitleTimestamp as ax, parseSubtitles as ay, parseXmlToObject as az, type ConvertedSubtitles as b, type CsvColumnType as c, data as d, type CsvColumnTypeInfo as e, type CsvColumnTypeOptions as f, type CsvColumnTypeResult as g, type CsvDuplicateGroup as h, type CsvDuplicateOptions as i, type CsvDuplicateResult as j, type CsvParseResult as k, type CsvToSqlOptions as l, type CsvToSqlResult as m, type EnvDiffResult as n, type EnvEntry as o, type EnvParseResult as p, type FrontMatterResult as q, type HeadingHierarchyResult as r, type HeadingIssue as s, type HeadingIssueType as t, type MarkdownTableColumnAlignment as u, type MarkdownTableInfo as v, type MarkdownTaskListItem as w, type MarkdownTaskListProgressResult as x, type MarkdownTaskListSectionSummary as y, type MarkdownTocEntry as z };
package/dist/index.cjs CHANGED
@@ -5621,6 +5621,7 @@ __export(data_exports, {
5621
5621
  tomlToJson: () => tomlToJson,
5622
5622
  validateEnvKey: () => validateEnvKey,
5623
5623
  validateIni: () => validateIni,
5624
+ validateMarkdownHeadingHierarchy: () => validateMarkdownHeadingHierarchy,
5624
5625
  validateNdjson: () => validateNdjson,
5625
5626
  validateToml: () => validateToml,
5626
5627
  validateXml: () => validateXml,
@@ -7147,6 +7148,84 @@ function generateMarkdownToc(markdown, options = {}) {
7147
7148
  });
7148
7149
  return { toc: tocLines.join("\n"), entries };
7149
7150
  }
7151
+ var HEADING_HIERARCHY_RE = /^(#{1,6})(?!#)(?:[ \t]+(.*?))?[ \t]*#*[ \t]*$/;
7152
+ function validateMarkdownHeadingHierarchy(markdown) {
7153
+ const lines = markdown.replace(/\r\n/g, "\n").split("\n");
7154
+ const headings = [];
7155
+ let inFence = false;
7156
+ let fenceMarker = "";
7157
+ for (let i = 0; i < lines.length; i++) {
7158
+ const line = lines[i];
7159
+ const fenceMatch = line.match(/^\s*(```+|~~~+)/);
7160
+ if (fenceMatch) {
7161
+ if (!inFence) {
7162
+ inFence = true;
7163
+ fenceMarker = fenceMatch[1][0];
7164
+ } else if (fenceMatch[1][0] === fenceMarker) {
7165
+ inFence = false;
7166
+ }
7167
+ continue;
7168
+ }
7169
+ if (inFence) continue;
7170
+ const match = line.match(HEADING_HIERARCHY_RE);
7171
+ if (!match) continue;
7172
+ const level = match[1].length;
7173
+ const text = stripInlineMarkdown(match[2] ?? "");
7174
+ headings.push({ line: i + 1, level, text });
7175
+ }
7176
+ const issues = [];
7177
+ const seen = /* @__PURE__ */ new Map();
7178
+ let h1Count = 0;
7179
+ let firstH1Line = null;
7180
+ let prevLevel = null;
7181
+ headings.forEach((h, idx) => {
7182
+ if (h.text === "") {
7183
+ issues.push({ line: h.line, type: "empty-heading", message: `Heading at line ${h.line} has no text` });
7184
+ }
7185
+ if (idx === 0 && h.level !== 1) {
7186
+ issues.push({
7187
+ line: h.line,
7188
+ type: "starts-below-h1",
7189
+ message: `Document starts with an H${h.level} heading instead of H1`
7190
+ });
7191
+ }
7192
+ if (h.level === 1) {
7193
+ h1Count++;
7194
+ if (h1Count === 1) {
7195
+ firstH1Line = h.line;
7196
+ } else {
7197
+ issues.push({
7198
+ line: h.line,
7199
+ type: "multiple-h1",
7200
+ message: `Multiple H1 headings found: another H1 at line ${h.line} (first was at line ${firstH1Line})`
7201
+ });
7202
+ }
7203
+ }
7204
+ if (prevLevel !== null && h.level > prevLevel + 1) {
7205
+ const skipped = h.level - prevLevel > 2 ? `H${prevLevel + 1}-H${h.level - 1}` : `H${prevLevel + 1}`;
7206
+ issues.push({
7207
+ line: h.line,
7208
+ type: "skipped-level",
7209
+ message: `Heading level jumps from H${prevLevel} to H${h.level} at line ${h.line}, skipping ${skipped}`
7210
+ });
7211
+ }
7212
+ prevLevel = h.level;
7213
+ if (h.text !== "") {
7214
+ const key = `${h.level}:${h.text.toLowerCase()}`;
7215
+ const earlierLine = seen.get(key);
7216
+ if (earlierLine !== void 0) {
7217
+ issues.push({
7218
+ line: h.line,
7219
+ type: "duplicate-heading",
7220
+ message: `Heading "${h.text}" at line ${h.line} duplicates an H${h.level} heading at line ${earlierLine}`
7221
+ });
7222
+ } else {
7223
+ seen.set(key, h.line);
7224
+ }
7225
+ }
7226
+ });
7227
+ return { headings, issues, h1Count };
7228
+ }
7150
7229
  function quoteSqlIdentifier(name, dialect) {
7151
7230
  if (dialect === "mysql") return "`" + name.replace(/`/g, "``") + "`";
7152
7231
  return '"' + name.replace(/"/g, '""') + '"';
package/dist/index.d.cts CHANGED
@@ -2,7 +2,7 @@ export { j as json } from './json-Ca6gZCNB.cjs';
2
2
  export { e as encoding } from './encoding-Dk3wpmb3.cjs';
3
3
  export { h as hashing } from './hashing-CJjlvqS_.cjs';
4
4
  export { t as text } from './text-xY5MJwr0.cjs';
5
- export { d as data } from './data-DIyBrJ6l.cjs';
5
+ export { d as data } from './data-Cz1Q0sg0.cjs';
6
6
  export { g as generators } from './generators-DAXXrMvG.cjs';
7
7
  export { t as time } from './time-VMAy_SrV.cjs';
8
8
  export { u as units } from './units-gLm_pq6U.cjs';
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ export { j as json } from './json-Ca6gZCNB.js';
2
2
  export { e as encoding } from './encoding-Dk3wpmb3.js';
3
3
  export { h as hashing } from './hashing-CJjlvqS_.js';
4
4
  export { t as text } from './text-xY5MJwr0.js';
5
- export { d as data } from './data-DIyBrJ6l.js';
5
+ export { d as data } from './data-Cz1Q0sg0.js';
6
6
  export { g as generators } from './generators-DAXXrMvG.js';
7
7
  export { t as time } from './time-VMAy_SrV.js';
8
8
  export { u as units } from './units-gLm_pq6U.js';
package/dist/index.js CHANGED
@@ -11,7 +11,7 @@ export { json_exports as json } from './chunk-WUOZHCIC.js';
11
11
  export { encoding_exports as encoding } from './chunk-DOWQZUTP.js';
12
12
  export { hashing_exports as hashing } from './chunk-PET2CGTH.js';
13
13
  export { text_exports as text } from './chunk-FB6CCFR5.js';
14
- export { data_exports as data } from './chunk-XOUS3M5Z.js';
14
+ export { data_exports as data } from './chunk-CUQDHXUX.js';
15
15
  export { generators_exports as generators } from './chunk-422ICOZX.js';
16
16
  export { time_exports as time } from './chunk-6EJVNQSY.js';
17
17
  import './chunk-MLKGABMK.js';
@@ -1544,6 +1544,84 @@ function generateMarkdownToc(markdown, options = {}) {
1544
1544
  });
1545
1545
  return { toc: tocLines.join("\n"), entries };
1546
1546
  }
1547
+ var HEADING_HIERARCHY_RE = /^(#{1,6})(?!#)(?:[ \t]+(.*?))?[ \t]*#*[ \t]*$/;
1548
+ function validateMarkdownHeadingHierarchy(markdown) {
1549
+ const lines = markdown.replace(/\r\n/g, "\n").split("\n");
1550
+ const headings = [];
1551
+ let inFence = false;
1552
+ let fenceMarker = "";
1553
+ for (let i = 0; i < lines.length; i++) {
1554
+ const line = lines[i];
1555
+ const fenceMatch = line.match(/^\s*(```+|~~~+)/);
1556
+ if (fenceMatch) {
1557
+ if (!inFence) {
1558
+ inFence = true;
1559
+ fenceMarker = fenceMatch[1][0];
1560
+ } else if (fenceMatch[1][0] === fenceMarker) {
1561
+ inFence = false;
1562
+ }
1563
+ continue;
1564
+ }
1565
+ if (inFence) continue;
1566
+ const match = line.match(HEADING_HIERARCHY_RE);
1567
+ if (!match) continue;
1568
+ const level = match[1].length;
1569
+ const text = stripInlineMarkdown(match[2] ?? "");
1570
+ headings.push({ line: i + 1, level, text });
1571
+ }
1572
+ const issues = [];
1573
+ const seen = /* @__PURE__ */ new Map();
1574
+ let h1Count = 0;
1575
+ let firstH1Line = null;
1576
+ let prevLevel = null;
1577
+ headings.forEach((h, idx) => {
1578
+ if (h.text === "") {
1579
+ issues.push({ line: h.line, type: "empty-heading", message: `Heading at line ${h.line} has no text` });
1580
+ }
1581
+ if (idx === 0 && h.level !== 1) {
1582
+ issues.push({
1583
+ line: h.line,
1584
+ type: "starts-below-h1",
1585
+ message: `Document starts with an H${h.level} heading instead of H1`
1586
+ });
1587
+ }
1588
+ if (h.level === 1) {
1589
+ h1Count++;
1590
+ if (h1Count === 1) {
1591
+ firstH1Line = h.line;
1592
+ } else {
1593
+ issues.push({
1594
+ line: h.line,
1595
+ type: "multiple-h1",
1596
+ message: `Multiple H1 headings found: another H1 at line ${h.line} (first was at line ${firstH1Line})`
1597
+ });
1598
+ }
1599
+ }
1600
+ if (prevLevel !== null && h.level > prevLevel + 1) {
1601
+ const skipped = h.level - prevLevel > 2 ? `H${prevLevel + 1}-H${h.level - 1}` : `H${prevLevel + 1}`;
1602
+ issues.push({
1603
+ line: h.line,
1604
+ type: "skipped-level",
1605
+ message: `Heading level jumps from H${prevLevel} to H${h.level} at line ${h.line}, skipping ${skipped}`
1606
+ });
1607
+ }
1608
+ prevLevel = h.level;
1609
+ if (h.text !== "") {
1610
+ const key = `${h.level}:${h.text.toLowerCase()}`;
1611
+ const earlierLine = seen.get(key);
1612
+ if (earlierLine !== void 0) {
1613
+ issues.push({
1614
+ line: h.line,
1615
+ type: "duplicate-heading",
1616
+ message: `Heading "${h.text}" at line ${h.line} duplicates an H${h.level} heading at line ${earlierLine}`
1617
+ });
1618
+ } else {
1619
+ seen.set(key, h.line);
1620
+ }
1621
+ }
1622
+ });
1623
+ return { headings, issues, h1Count };
1624
+ }
1547
1625
  function quoteSqlIdentifier(name, dialect) {
1548
1626
  if (dialect === "mysql") return "`" + name.replace(/`/g, "``") + "`";
1549
1627
  return '"' + name.replace(/"/g, '""') + '"';
@@ -1989,6 +2067,7 @@ exports.toCsvString = toCsvString;
1989
2067
  exports.tomlToJson = tomlToJson;
1990
2068
  exports.validateEnvKey = validateEnvKey;
1991
2069
  exports.validateIni = validateIni;
2070
+ exports.validateMarkdownHeadingHierarchy = validateMarkdownHeadingHierarchy;
1992
2071
  exports.validateNdjson = validateNdjson;
1993
2072
  exports.validateToml = validateToml;
1994
2073
  exports.validateXml = validateXml;
@@ -1 +1 @@
1
- export { C as CaptionSpeedCue, a as CaptionSpeedResult, b as ConvertedSubtitles, c as CsvColumnType, e as CsvColumnTypeInfo, f as CsvColumnTypeOptions, g as CsvColumnTypeResult, h as CsvDuplicateGroup, i as CsvDuplicateOptions, j as CsvDuplicateResult, k as CsvParseResult, l as CsvToSqlOptions, m as CsvToSqlResult, E as EnvDiffError, n as EnvDiffResult, o as EnvEntry, p as EnvParseResult, F as FrontMatterError, q as FrontMatterResult, I as IniSection, M as MarkdownTableAlignResult, r as MarkdownTableColumnAlignment, s as MarkdownTableInfo, t as MarkdownTaskListItem, u as MarkdownTaskListProgressResult, v as MarkdownTaskListSectionSummary, w as MarkdownTocEntry, x as MarkdownTocOptions, y as MarkdownTocResult, N as NdjsonDedupeResult, z as NdjsonLineResult, A as NdjsonValidateResult, P as ParseOptions, B as ParsedIni, D as ParsedSubtitles, S as SubtitleCue, G as SubtitleFormat, T as TomlFormatResult, V as ValidationResult, X as XmlFormatResult, H as XmlToJsonOptions, Y as YamlAnchorInfo, J as YamlAnchorResolveError, K as YamlAnchorResolveResult, L as alignMarkdownTables, O as analyzeCaptionSpeed, Q as calculateMarkdownTaskListProgress, R as convertSubtitles, U as csvToJson, W as csvToSqlInsert, Z as dedupeNdjson, _ as detectDelimiter, $ as detectSubtitleFormat, a0 as diffEnvExample, a1 as envToExport, a2 as envToJson, a3 as findCsvDuplicateRows, a4 as formatNdjson, a5 as formatSubtitleTimestamp, a6 as formatToml, a7 as formatXml, a8 as generateMarkdownToc, a9 as getSection, aa as getSectionNames, ab as getTomlStats, ac as getXmlStats, ad as getYamlStats, ae as inferCsvColumnTypes, af as iniToJson, ag as jsonArrayToNdjson, ah as jsonToIni, ai as jsonToToml, aj as jsonToXml, ak as minifyNdjson, al as minifyToml, am as minifyXml, an as ndjsonToCsv, ao as ndjsonToJsonArray, ap as parseCsv, aq as parseEnv, ar as parseFrontMatter, as as parseIni, at as parseSubtitleTimestamp, au as parseSubtitles, av as parseXmlToObject, aw as resolveYamlAnchors, ax as serializeSubtitles, ay as shiftSubtitles, az as stringifyIni, aA as toCsvString, aB as tomlToJson, aC as validateEnvKey, aD as validateIni, aE as validateNdjson, aF as validateToml, aG as validateXml, aH as validateYaml, aI as xmlToJson } from '../data-DIyBrJ6l.cjs';
1
+ export { C as CaptionSpeedCue, a as CaptionSpeedResult, b as ConvertedSubtitles, c as CsvColumnType, e as CsvColumnTypeInfo, f as CsvColumnTypeOptions, g as CsvColumnTypeResult, h as CsvDuplicateGroup, i as CsvDuplicateOptions, j as CsvDuplicateResult, k as CsvParseResult, l as CsvToSqlOptions, m as CsvToSqlResult, E as EnvDiffError, n as EnvDiffResult, o as EnvEntry, p as EnvParseResult, F as FrontMatterError, q as FrontMatterResult, H as HeadingEntry, r as HeadingHierarchyResult, s as HeadingIssue, t as HeadingIssueType, I as IniSection, M as MarkdownTableAlignResult, u as MarkdownTableColumnAlignment, v as MarkdownTableInfo, w as MarkdownTaskListItem, x as MarkdownTaskListProgressResult, y as MarkdownTaskListSectionSummary, z as MarkdownTocEntry, A as MarkdownTocOptions, B as MarkdownTocResult, N as NdjsonDedupeResult, D as NdjsonLineResult, G as NdjsonValidateResult, P as ParseOptions, J as ParsedIni, K as ParsedSubtitles, S as SubtitleCue, L as SubtitleFormat, T as TomlFormatResult, V as ValidationResult, X as XmlFormatResult, O as XmlToJsonOptions, Y as YamlAnchorInfo, Q as YamlAnchorResolveError, R as YamlAnchorResolveResult, U as alignMarkdownTables, W as analyzeCaptionSpeed, Z as calculateMarkdownTaskListProgress, _ as convertSubtitles, $ as csvToJson, a0 as csvToSqlInsert, a1 as dedupeNdjson, a2 as detectDelimiter, a3 as detectSubtitleFormat, a4 as diffEnvExample, a5 as envToExport, a6 as envToJson, a7 as findCsvDuplicateRows, a8 as formatNdjson, a9 as formatSubtitleTimestamp, aa as formatToml, ab as formatXml, ac as generateMarkdownToc, ad as getSection, ae as getSectionNames, af as getTomlStats, ag as getXmlStats, ah as getYamlStats, ai as inferCsvColumnTypes, aj as iniToJson, ak as jsonArrayToNdjson, al as jsonToIni, am as jsonToToml, an as jsonToXml, ao as minifyNdjson, ap as minifyToml, aq as minifyXml, ar as ndjsonToCsv, as as ndjsonToJsonArray, at as parseCsv, au as parseEnv, av as parseFrontMatter, aw as parseIni, ax as parseSubtitleTimestamp, ay as parseSubtitles, az as parseXmlToObject, aA as resolveYamlAnchors, aB as serializeSubtitles, aC as shiftSubtitles, aD as stringifyIni, aE as toCsvString, aF as tomlToJson, aG as validateEnvKey, aH as validateIni, aI as validateMarkdownHeadingHierarchy, aJ as validateNdjson, aK as validateToml, aL as validateXml, aM as validateYaml, aN as xmlToJson } from '../data-Cz1Q0sg0.cjs';
@@ -1 +1 @@
1
- export { C as CaptionSpeedCue, a as CaptionSpeedResult, b as ConvertedSubtitles, c as CsvColumnType, e as CsvColumnTypeInfo, f as CsvColumnTypeOptions, g as CsvColumnTypeResult, h as CsvDuplicateGroup, i as CsvDuplicateOptions, j as CsvDuplicateResult, k as CsvParseResult, l as CsvToSqlOptions, m as CsvToSqlResult, E as EnvDiffError, n as EnvDiffResult, o as EnvEntry, p as EnvParseResult, F as FrontMatterError, q as FrontMatterResult, I as IniSection, M as MarkdownTableAlignResult, r as MarkdownTableColumnAlignment, s as MarkdownTableInfo, t as MarkdownTaskListItem, u as MarkdownTaskListProgressResult, v as MarkdownTaskListSectionSummary, w as MarkdownTocEntry, x as MarkdownTocOptions, y as MarkdownTocResult, N as NdjsonDedupeResult, z as NdjsonLineResult, A as NdjsonValidateResult, P as ParseOptions, B as ParsedIni, D as ParsedSubtitles, S as SubtitleCue, G as SubtitleFormat, T as TomlFormatResult, V as ValidationResult, X as XmlFormatResult, H as XmlToJsonOptions, Y as YamlAnchorInfo, J as YamlAnchorResolveError, K as YamlAnchorResolveResult, L as alignMarkdownTables, O as analyzeCaptionSpeed, Q as calculateMarkdownTaskListProgress, R as convertSubtitles, U as csvToJson, W as csvToSqlInsert, Z as dedupeNdjson, _ as detectDelimiter, $ as detectSubtitleFormat, a0 as diffEnvExample, a1 as envToExport, a2 as envToJson, a3 as findCsvDuplicateRows, a4 as formatNdjson, a5 as formatSubtitleTimestamp, a6 as formatToml, a7 as formatXml, a8 as generateMarkdownToc, a9 as getSection, aa as getSectionNames, ab as getTomlStats, ac as getXmlStats, ad as getYamlStats, ae as inferCsvColumnTypes, af as iniToJson, ag as jsonArrayToNdjson, ah as jsonToIni, ai as jsonToToml, aj as jsonToXml, ak as minifyNdjson, al as minifyToml, am as minifyXml, an as ndjsonToCsv, ao as ndjsonToJsonArray, ap as parseCsv, aq as parseEnv, ar as parseFrontMatter, as as parseIni, at as parseSubtitleTimestamp, au as parseSubtitles, av as parseXmlToObject, aw as resolveYamlAnchors, ax as serializeSubtitles, ay as shiftSubtitles, az as stringifyIni, aA as toCsvString, aB as tomlToJson, aC as validateEnvKey, aD as validateIni, aE as validateNdjson, aF as validateToml, aG as validateXml, aH as validateYaml, aI as xmlToJson } from '../data-DIyBrJ6l.js';
1
+ export { C as CaptionSpeedCue, a as CaptionSpeedResult, b as ConvertedSubtitles, c as CsvColumnType, e as CsvColumnTypeInfo, f as CsvColumnTypeOptions, g as CsvColumnTypeResult, h as CsvDuplicateGroup, i as CsvDuplicateOptions, j as CsvDuplicateResult, k as CsvParseResult, l as CsvToSqlOptions, m as CsvToSqlResult, E as EnvDiffError, n as EnvDiffResult, o as EnvEntry, p as EnvParseResult, F as FrontMatterError, q as FrontMatterResult, H as HeadingEntry, r as HeadingHierarchyResult, s as HeadingIssue, t as HeadingIssueType, I as IniSection, M as MarkdownTableAlignResult, u as MarkdownTableColumnAlignment, v as MarkdownTableInfo, w as MarkdownTaskListItem, x as MarkdownTaskListProgressResult, y as MarkdownTaskListSectionSummary, z as MarkdownTocEntry, A as MarkdownTocOptions, B as MarkdownTocResult, N as NdjsonDedupeResult, D as NdjsonLineResult, G as NdjsonValidateResult, P as ParseOptions, J as ParsedIni, K as ParsedSubtitles, S as SubtitleCue, L as SubtitleFormat, T as TomlFormatResult, V as ValidationResult, X as XmlFormatResult, O as XmlToJsonOptions, Y as YamlAnchorInfo, Q as YamlAnchorResolveError, R as YamlAnchorResolveResult, U as alignMarkdownTables, W as analyzeCaptionSpeed, Z as calculateMarkdownTaskListProgress, _ as convertSubtitles, $ as csvToJson, a0 as csvToSqlInsert, a1 as dedupeNdjson, a2 as detectDelimiter, a3 as detectSubtitleFormat, a4 as diffEnvExample, a5 as envToExport, a6 as envToJson, a7 as findCsvDuplicateRows, a8 as formatNdjson, a9 as formatSubtitleTimestamp, aa as formatToml, ab as formatXml, ac as generateMarkdownToc, ad as getSection, ae as getSectionNames, af as getTomlStats, ag as getXmlStats, ah as getYamlStats, ai as inferCsvColumnTypes, aj as iniToJson, ak as jsonArrayToNdjson, al as jsonToIni, am as jsonToToml, an as jsonToXml, ao as minifyNdjson, ap as minifyToml, aq as minifyXml, ar as ndjsonToCsv, as as ndjsonToJsonArray, at as parseCsv, au as parseEnv, av as parseFrontMatter, aw as parseIni, ax as parseSubtitleTimestamp, ay as parseSubtitles, az as parseXmlToObject, aA as resolveYamlAnchors, aB as serializeSubtitles, aC as shiftSubtitles, aD as stringifyIni, aE as toCsvString, aF as tomlToJson, aG as validateEnvKey, aH as validateIni, aI as validateMarkdownHeadingHierarchy, aJ as validateNdjson, aK as validateToml, aL as validateXml, aM as validateYaml, aN as xmlToJson } from '../data-Cz1Q0sg0.js';
@@ -1,2 +1,2 @@
1
- export { alignMarkdownTables, analyzeCaptionSpeed, calculateMarkdownTaskListProgress, convertSubtitles, csvToJson, csvToSqlInsert, dedupeNdjson, detectDelimiter, detectSubtitleFormat, diffEnvExample, envToExport, envToJson, findCsvDuplicateRows, formatNdjson, formatSubtitleTimestamp, formatToml, formatXml, generateMarkdownToc, getSection, getSectionNames, getTomlStats, getXmlStats, getYamlStats, inferCsvColumnTypes, iniToJson, jsonArrayToNdjson, jsonToIni, jsonToToml, jsonToXml, minifyNdjson, minifyToml, minifyXml, ndjsonToCsv, ndjsonToJsonArray, parseCsv, parseEnv, parseFrontMatter, parseIni, parseSubtitleTimestamp, parseSubtitles, parseXmlToObject, resolveYamlAnchors, serializeSubtitles, shiftSubtitles, stringifyIni, toCsvString, tomlToJson, validateEnvKey, validateIni, validateNdjson, validateToml, validateXml, validateYaml, xmlToJson } from '../chunk-XOUS3M5Z.js';
1
+ export { alignMarkdownTables, analyzeCaptionSpeed, calculateMarkdownTaskListProgress, convertSubtitles, csvToJson, csvToSqlInsert, dedupeNdjson, detectDelimiter, detectSubtitleFormat, diffEnvExample, envToExport, envToJson, findCsvDuplicateRows, formatNdjson, formatSubtitleTimestamp, formatToml, formatXml, generateMarkdownToc, getSection, getSectionNames, getTomlStats, getXmlStats, getYamlStats, inferCsvColumnTypes, iniToJson, jsonArrayToNdjson, jsonToIni, jsonToToml, jsonToXml, minifyNdjson, minifyToml, minifyXml, ndjsonToCsv, ndjsonToJsonArray, parseCsv, parseEnv, parseFrontMatter, parseIni, parseSubtitleTimestamp, parseSubtitles, parseXmlToObject, resolveYamlAnchors, serializeSubtitles, shiftSubtitles, stringifyIni, toCsvString, tomlToJson, validateEnvKey, validateIni, validateMarkdownHeadingHierarchy, validateNdjson, validateToml, validateXml, validateYaml, xmlToJson } from '../chunk-CUQDHXUX.js';
2
2
  import '../chunk-MLKGABMK.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@utilix-tech/sdk",
3
- "version": "0.86.0",
3
+ "version": "0.87.0",
4
4
  "description": "154+ developer utility tools for Node.js: JSON, encoding, hashing, color, CSS, network and more. Runs locally, no API key required.",
5
5
  "author": "Utilix <hello@utilix.tech>",
6
6
  "license": "MIT",