@commentray/core 0.0.2 → 0.0.5

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.
Files changed (109) hide show
  1. package/dist/anchors.d.ts +6 -0
  2. package/dist/anchors.d.ts.map +1 -1
  3. package/dist/anchors.js +11 -0
  4. package/dist/anchors.js.map +1 -1
  5. package/dist/angles-toml.d.ts +14 -0
  6. package/dist/angles-toml.d.ts.map +1 -1
  7. package/dist/angles-toml.js +51 -0
  8. package/dist/angles-toml.js.map +1 -1
  9. package/dist/block-scroll-pickers.d.ts +22 -0
  10. package/dist/block-scroll-pickers.d.ts.map +1 -0
  11. package/dist/block-scroll-pickers.js +41 -0
  12. package/dist/block-scroll-pickers.js.map +1 -0
  13. package/dist/block-snippet.d.ts +13 -0
  14. package/dist/block-snippet.d.ts.map +1 -0
  15. package/dist/block-snippet.js +30 -0
  16. package/dist/block-snippet.js.map +1 -0
  17. package/dist/blocks.d.ts.map +1 -1
  18. package/dist/blocks.js +13 -13
  19. package/dist/blocks.js.map +1 -1
  20. package/dist/commentray-disk-pairs.d.ts +14 -0
  21. package/dist/commentray-disk-pairs.d.ts.map +1 -0
  22. package/dist/commentray-disk-pairs.js +51 -0
  23. package/dist/commentray-disk-pairs.js.map +1 -0
  24. package/dist/commentray-index-renames.d.ts +21 -0
  25. package/dist/commentray-index-renames.d.ts.map +1 -0
  26. package/dist/commentray-index-renames.js +85 -0
  27. package/dist/commentray-index-renames.js.map +1 -0
  28. package/dist/commentray-path-resolution.js +1 -1
  29. package/dist/commentray-path-resolution.js.map +1 -1
  30. package/dist/config.d.ts.map +1 -1
  31. package/dist/config.js +6 -4
  32. package/dist/config.js.map +1 -1
  33. package/dist/git-relocation-scan.d.ts +9 -0
  34. package/dist/git-relocation-scan.d.ts.map +1 -0
  35. package/dist/git-relocation-scan.js +96 -0
  36. package/dist/git-relocation-scan.js.map +1 -0
  37. package/dist/index-normalize.d.ts +10 -0
  38. package/dist/index-normalize.d.ts.map +1 -0
  39. package/dist/index-normalize.js +60 -0
  40. package/dist/index-normalize.js.map +1 -0
  41. package/dist/index-schema-messages.d.ts +6 -0
  42. package/dist/index-schema-messages.d.ts.map +1 -0
  43. package/dist/index-schema-messages.js +26 -0
  44. package/dist/index-schema-messages.js.map +1 -0
  45. package/dist/index.d.ts +23 -8
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +14 -5
  48. package/dist/index.js.map +1 -1
  49. package/dist/marker-ids.d.ts +19 -0
  50. package/dist/marker-ids.d.ts.map +1 -0
  51. package/dist/marker-ids.js +38 -0
  52. package/dist/marker-ids.js.map +1 -0
  53. package/dist/marker-validation.d.ts +22 -0
  54. package/dist/marker-validation.d.ts.map +1 -0
  55. package/dist/marker-validation.js +138 -0
  56. package/dist/marker-validation.js.map +1 -0
  57. package/dist/metadata.d.ts.map +1 -1
  58. package/dist/metadata.js +54 -25
  59. package/dist/metadata.js.map +1 -1
  60. package/dist/migrate-angles-layout.d.ts +27 -0
  61. package/dist/migrate-angles-layout.d.ts.map +1 -0
  62. package/dist/migrate-angles-layout.js +72 -0
  63. package/dist/migrate-angles-layout.js.map +1 -0
  64. package/dist/migrate.d.ts.map +1 -1
  65. package/dist/migrate.js +20 -4
  66. package/dist/migrate.js.map +1 -1
  67. package/dist/model.d.ts +13 -26
  68. package/dist/model.d.ts.map +1 -1
  69. package/dist/model.js +16 -0
  70. package/dist/model.js.map +1 -1
  71. package/dist/paths.d.ts +7 -1
  72. package/dist/paths.d.ts.map +1 -1
  73. package/dist/paths.js +18 -2
  74. package/dist/paths.js.map +1 -1
  75. package/dist/region-marker-convert.d.ts +27 -0
  76. package/dist/region-marker-convert.d.ts.map +1 -0
  77. package/dist/region-marker-convert.js +78 -0
  78. package/dist/region-marker-convert.js.map +1 -0
  79. package/dist/relocation-hints.d.ts +18 -0
  80. package/dist/relocation-hints.d.ts.map +1 -0
  81. package/dist/relocation-hints.js +170 -0
  82. package/dist/relocation-hints.js.map +1 -0
  83. package/dist/scm/git-scm-provider.d.ts +7 -1
  84. package/dist/scm/git-scm-provider.d.ts.map +1 -1
  85. package/dist/scm/git-scm-provider.js +42 -20
  86. package/dist/scm/git-scm-provider.js.map +1 -1
  87. package/dist/scm/git-spawn.d.ts +10 -0
  88. package/dist/scm/git-spawn.d.ts.map +1 -0
  89. package/dist/scm/git-spawn.js +26 -0
  90. package/dist/scm/git-spawn.js.map +1 -0
  91. package/dist/scm/scm-provider.d.ts +10 -0
  92. package/dist/scm/scm-provider.d.ts.map +1 -1
  93. package/dist/scroll-sync.d.ts +8 -23
  94. package/dist/scroll-sync.d.ts.map +1 -1
  95. package/dist/scroll-sync.js +31 -52
  96. package/dist/scroll-sync.js.map +1 -1
  97. package/dist/source-markers.d.ts +28 -0
  98. package/dist/source-markers.d.ts.map +1 -0
  99. package/dist/source-markers.js +241 -0
  100. package/dist/source-markers.js.map +1 -0
  101. package/dist/validate-project.d.ts +9 -1
  102. package/dist/validate-project.d.ts.map +1 -1
  103. package/dist/validate-project.js +107 -16
  104. package/dist/validate-project.js.map +1 -1
  105. package/dist/walk-commentray-source-md.d.ts +5 -0
  106. package/dist/walk-commentray-source-md.d.ts.map +1 -0
  107. package/dist/walk-commentray-source-md.js +33 -0
  108. package/dist/walk-commentray-source-md.js.map +1 -0
  109. package/package.json +6 -2
package/dist/paths.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,yBAAyB,CAAC,YAAoB;IAC5D,MAAM,KAAK,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACjD,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,mDAAmD,YAAY,GAAG,CAAC,CAAC;IACtF,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IAC1E,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,iCAAiC,YAAY,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,sBAAsB,CAAC,sBAA8B;IACnE,MAAM,UAAU,GAAG,yBAAyB,CAAC,sBAAsB,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,GAAG,UAAU,KAAK,CAAC,CAAC;AACtE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAAC,UAAU,GAAG,aAAa;IACrE,MAAM,IAAI,GAAG,yBAAyB,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACzE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,6BAA6B,CAC3C,QAAgB,EAChB,UAAU,GAAG,aAAa;IAE1B,MAAM,QAAQ,GAAG,4BAA4B,CAAC,UAAU,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,OAAO,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,8BAA8B,CAC5C,sBAA8B,EAC9B,OAAe,EACf,UAAU,GAAG,aAAa;IAE1B,MAAM,UAAU,GAAG,yBAAyB,CAAC,sBAAsB,CAAC,CAAC;IACrE,MAAM,GAAG,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,yBAAyB,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACzE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,GAAG,KAAK,CAAC,CAAC;AAClE,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,wBAAwB;IACtC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;AAClE,CAAC"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /** One paired Commentray delimiter span in source (0-based line indices). */
2
+ export type CommentrayMarkerPair = {
3
+ id: string;
4
+ /** Line index of the opening delimiter. */
5
+ startLine0: number;
6
+ /** Line index of the closing delimiter. */
7
+ endLine0: number;
8
+ };
9
+ /** Leading tabs/spaces on a line (used when rewriting markers). */
10
+ export declare function leadingIndentOfLine(line: string): string;
11
+ /**
12
+ * Finds well-formed start/end pairs in source order. Unmatched starts (same id
13
+ * opened twice without an end) keep the first start; orphan ends are ignored.
14
+ */
15
+ export declare function findCommentrayMarkerPairs(sourceText: string): CommentrayMarkerPair[];
16
+ /**
17
+ * Rewrites every detected Commentray marker pair to the delimiter style for
18
+ * `targetLanguageId` (see {@link commentrayRegionInsertions}). Processes from
19
+ * the bottom of the file upward so line indices stay valid. Preserves inner
20
+ * lines exactly; normalises CRLF to LF in the result.
21
+ */
22
+ export declare function convertCommentraySourceMarkersToLanguage(sourceText: string, targetLanguageId: string): {
23
+ sourceText: string;
24
+ changed: boolean;
25
+ convertedPairs: number;
26
+ };
27
+ //# sourceMappingURL=region-marker-convert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"region-marker-convert.d.ts","sourceRoot":"","sources":["../src/region-marker-convert.ts"],"names":[],"mappings":"AAEA,6EAA6E;AAC7E,MAAM,MAAM,oBAAoB,GAAG;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,mEAAmE;AACnE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAkBpF;AAoBD;;;;;GAKG;AACH,wBAAgB,wCAAwC,CACtD,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,MAAM,GACvB;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAsBlE"}
@@ -0,0 +1,78 @@
1
+ import { commentrayRegionInsertions, parseCommentrayRegionBoundary } from "./source-markers.js";
2
+ /** Leading tabs/spaces on a line (used when rewriting markers). */
3
+ export function leadingIndentOfLine(line) {
4
+ const m = /^[\t ]*/.exec(line);
5
+ return m ? m[0] : "";
6
+ }
7
+ /**
8
+ * Finds well-formed start/end pairs in source order. Unmatched starts (same id
9
+ * opened twice without an end) keep the first start; orphan ends are ignored.
10
+ */
11
+ export function findCommentrayMarkerPairs(sourceText) {
12
+ const lines = sourceText.replaceAll("\r\n", "\n").split("\n");
13
+ const pending = new Map();
14
+ const pairs = [];
15
+ for (let i = 0; i < lines.length; i++) {
16
+ const hit = parseCommentrayRegionBoundary(lines[i]);
17
+ if (!hit)
18
+ continue;
19
+ if (hit.kind === "start") {
20
+ if (!pending.has(hit.id))
21
+ pending.set(hit.id, i);
22
+ continue;
23
+ }
24
+ const start0 = pending.get(hit.id);
25
+ if (start0 === undefined)
26
+ continue;
27
+ if (i <= start0)
28
+ continue;
29
+ pairs.push({ id: hit.id, startLine0: start0, endLine0: i });
30
+ pending.delete(hit.id);
31
+ }
32
+ return pairs;
33
+ }
34
+ function replaceOnePair(lines, pair, targetLanguageId) {
35
+ if (pair.endLine0 <= pair.startLine0)
36
+ return null;
37
+ const indent = leadingIndentOfLine(lines[pair.startLine0] ?? "");
38
+ const { start, end } = commentrayRegionInsertions(targetLanguageId, pair.id, indent);
39
+ const innerLines = lines.slice(pair.startLine0 + 1, pair.endLine0);
40
+ const inner = innerLines.join("\n");
41
+ const combined = innerLines.length === 0 ? `${start.replace(/\n$/, "")}${end}` : `${start}${inner}${end}`;
42
+ const inserted = combined.split("\n");
43
+ const before = lines.slice(0, pair.startLine0);
44
+ const after = lines.slice(pair.endLine0 + 1);
45
+ return [...before, ...inserted, ...after];
46
+ }
47
+ /**
48
+ * Rewrites every detected Commentray marker pair to the delimiter style for
49
+ * `targetLanguageId` (see {@link commentrayRegionInsertions}). Processes from
50
+ * the bottom of the file upward so line indices stay valid. Preserves inner
51
+ * lines exactly; normalises CRLF to LF in the result.
52
+ */
53
+ export function convertCommentraySourceMarkersToLanguage(sourceText, targetLanguageId) {
54
+ const normalised = sourceText.replaceAll("\r\n", "\n");
55
+ const pairs = findCommentrayMarkerPairs(normalised);
56
+ if (pairs.length === 0) {
57
+ return { sourceText: normalised, changed: normalised !== sourceText, convertedPairs: 0 };
58
+ }
59
+ let lines = normalised.split("\n");
60
+ let converted = 0;
61
+ for (const pair of [...pairs].sort((a, b) => b.startLine0 - a.startLine0)) {
62
+ const snapshot = lines.join("\n");
63
+ const next = replaceOnePair(lines, pair, targetLanguageId);
64
+ if (next === null)
65
+ continue;
66
+ const nextStr = next.join("\n");
67
+ if (nextStr !== snapshot)
68
+ converted++;
69
+ lines = next;
70
+ }
71
+ const out = lines.join("\n");
72
+ return {
73
+ sourceText: out,
74
+ changed: out !== normalised,
75
+ convertedPairs: converted,
76
+ };
77
+ }
78
+ //# sourceMappingURL=region-marker-convert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"region-marker-convert.js","sourceRoot":"","sources":["../src/region-marker-convert.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { CommentrayIndex } from "./model.js";
2
+ import type { ScmPathRename } from "./scm/scm-provider.js";
3
+ export type RelocationHintsInput = {
4
+ index: CommentrayIndex;
5
+ /** Normalized repo-relative paths that are indexed but not readable on disk */
6
+ missingSourcePathsNorm: ReadonlySet<string>;
7
+ /** Optional Git renames (same shape as `sync-moved-paths`, e.g. `HEAD~1` → `HEAD`) */
8
+ gitRenames?: readonly ScmPathRename[];
9
+ /** Readable indexed primaries: normalized path → LF source text */
10
+ indexedSourceTextsByPath: ReadonlyMap<string, string>;
11
+ };
12
+ /**
13
+ * Non-authoritative hints when indexed primary files are missing: Git renames,
14
+ * marker ids found under other indexed sources, and snippet-shaped matches.
15
+ * Intended for validation / doctor output — does not modify the index.
16
+ */
17
+ export declare function relocationHintMessages(input: RelocationHintsInput): string[];
18
+ //# sourceMappingURL=relocation-hints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relocation-hints.d.ts","sourceRoot":"","sources":["../src/relocation-hints.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAmB,eAAe,EAAwB,MAAM,YAAY,CAAC;AAGzF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,eAAe,CAAC;IACvB,+EAA+E;IAC/E,sBAAsB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC5C,sFAAsF;IACtF,UAAU,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IACtC,mEAAmE;IACnE,wBAAwB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvD,CAAC;AA2MF;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAG5E"}
@@ -0,0 +1,170 @@
1
+ import { parseAnchor } from "./anchors.js";
2
+ import { parseCommentraySnippetV1 } from "./block-snippet.js";
3
+ import { normalizeRepoRelativePath } from "./paths.js";
4
+ import { findCommentrayMarkerPairs } from "./region-marker-convert.js";
5
+ function entriesForNormalizedSource(index, missingNorm) {
6
+ return Object.values(index.byCommentrayPath).filter((e) => normalizeRepoRelativePath(e.sourcePath) === missingNorm);
7
+ }
8
+ function markerPathsContainingId(markerId, textsByPath, excludeNorm) {
9
+ const out = [];
10
+ for (const [p, text] of textsByPath) {
11
+ if (p === excludeNorm)
12
+ continue;
13
+ const pairs = findCommentrayMarkerPairs(text);
14
+ if (pairs.some((pair) => pair.id === markerId))
15
+ out.push(p);
16
+ }
17
+ return [...new Set(out)].sort((a, b) => a.localeCompare(b));
18
+ }
19
+ function snippetNeedleFromBlock(block) {
20
+ if (!block.snippet)
21
+ return null;
22
+ const lines = parseCommentraySnippetV1(block.snippet);
23
+ if (!lines || lines.length === 0)
24
+ return null;
25
+ const substantive = lines.map((l) => l.trim()).filter((l) => l.length >= 3);
26
+ if (substantive.length === 0)
27
+ return null;
28
+ const needle = substantive.slice(0, 4).join("\n");
29
+ return needle.length >= 12 ? needle : null;
30
+ }
31
+ function pathsContainingSnippetNeedle(needle, textsByPath, excludeNorm) {
32
+ const out = [];
33
+ for (const [p, text] of textsByPath) {
34
+ if (p === excludeNorm)
35
+ continue;
36
+ if (text.includes(needle))
37
+ out.push(p);
38
+ }
39
+ return [...new Set(out)].sort((a, b) => a.localeCompare(b));
40
+ }
41
+ function markerIdFromBlock(block) {
42
+ try {
43
+ const a = parseAnchor(block.anchor);
44
+ if (a.kind === "marker")
45
+ return a.id;
46
+ }
47
+ catch {
48
+ /* ignore */
49
+ }
50
+ return null;
51
+ }
52
+ function collectMarkerIds(entries) {
53
+ const markerIds = new Set();
54
+ for (const e of entries) {
55
+ for (const b of e.blocks) {
56
+ const mid = markerIdFromBlock(b);
57
+ if (mid)
58
+ markerIds.add(mid);
59
+ }
60
+ }
61
+ return markerIds;
62
+ }
63
+ function gitRenameHint(prefix, gitHit) {
64
+ const to = normalizeRepoRelativePath(gitHit.to);
65
+ return (`${prefix}: Git lists a rename to "${to}". Run: commentray sync-moved-paths --from HEAD~1 --to HEAD ` +
66
+ `(adjust --from/--to to the commit range that contains the rename).`);
67
+ }
68
+ function markerHintsForMissing(prefix, markerIds, texts, missingNorm) {
69
+ const out = [];
70
+ for (const mid of [...markerIds].sort((a, b) => a.localeCompare(b))) {
71
+ const paths = markerPathsContainingId(mid, texts, missingNorm);
72
+ if (paths.length === 1) {
73
+ out.push(`${prefix}: marker id "${mid}" appears in indexed source "${paths[0]}". ` +
74
+ `If commentary should follow that file, update index sourcePath (e.g. apply renames then sync-moved-paths, or edit index.json).`);
75
+ }
76
+ else if (paths.length > 1) {
77
+ out.push(`${prefix}: marker id "${mid}" appears in several indexed sources (${paths.join(", ")}); pick the intended file and update the index.`);
78
+ }
79
+ }
80
+ return out;
81
+ }
82
+ function snippetHintLineForBlock(prefix, block, texts, missingNorm) {
83
+ let anchorKind;
84
+ try {
85
+ anchorKind = parseAnchor(block.anchor).kind;
86
+ }
87
+ catch {
88
+ return null;
89
+ }
90
+ if (anchorKind !== "lines")
91
+ return null;
92
+ const needle = snippetNeedleFromBlock(block);
93
+ if (!needle)
94
+ return null;
95
+ const hits = pathsContainingSnippetNeedle(needle, texts, missingNorm);
96
+ if (hits.length === 1) {
97
+ return (`${prefix}: block "${block.id}" snippet text matches indexed source "${hits[0]}" ` +
98
+ `(lines: anchor may need new line numbers after the move).`);
99
+ }
100
+ if (hits.length > 1) {
101
+ return `${prefix}: block "${block.id}" snippet text matches multiple indexed sources (${hits.join(", ")}); narrow manually.`;
102
+ }
103
+ return null;
104
+ }
105
+ function snippetHintsForMissing(prefix, entries, texts, missingNorm) {
106
+ const out = [];
107
+ for (const e of entries) {
108
+ for (const b of e.blocks) {
109
+ const line = snippetHintLineForBlock(prefix, b, texts, missingNorm);
110
+ if (line)
111
+ out.push(line);
112
+ }
113
+ }
114
+ return out;
115
+ }
116
+ function symbolOpaqueHints(prefix, entries, affectedMd) {
117
+ let needsSymbolNote = false;
118
+ let needsOpaqueNote = false;
119
+ for (const e of entries) {
120
+ for (const b of e.blocks) {
121
+ try {
122
+ const k = parseAnchor(b.anchor).kind;
123
+ if (k === "symbol")
124
+ needsSymbolNote = true;
125
+ if (k === "opaque")
126
+ needsOpaqueNote = true;
127
+ }
128
+ catch {
129
+ /* handled elsewhere */
130
+ }
131
+ }
132
+ }
133
+ const out = [];
134
+ if (needsSymbolNote) {
135
+ out.push(`${prefix}: one or more blocks use symbol: anchors (${affectedMd.join(", ")}). ` +
136
+ `After a cross-file move, re-point anchors with language tooling or by hand — Commentray does not resolve symbols across files yet.`);
137
+ }
138
+ if (needsOpaqueNote) {
139
+ out.push(`${prefix}: one or more blocks use opaque anchors; update those anchors manually after the move.`);
140
+ }
141
+ return out;
142
+ }
143
+ function hintsForOneMissingPath(missingNorm, input) {
144
+ const entries = entriesForNormalizedSource(input.index, missingNorm);
145
+ const affectedMd = [...new Set(entries.map((e) => e.commentrayPath))].sort((a, b) => a.localeCompare(b));
146
+ const prefix = `Missing primary "${missingNorm}"`;
147
+ const gitHit = input.gitRenames?.find((r) => normalizeRepoRelativePath(r.from) === missingNorm);
148
+ const markerIds = collectMarkerIds(entries);
149
+ const parts = [
150
+ ...(gitHit ? [gitRenameHint(prefix, gitHit)] : []),
151
+ ...markerHintsForMissing(prefix, markerIds, input.indexedSourceTextsByPath, missingNorm),
152
+ ...snippetHintsForMissing(prefix, entries, input.indexedSourceTextsByPath, missingNorm),
153
+ ...symbolOpaqueHints(prefix, entries, affectedMd),
154
+ ];
155
+ if (parts.length === 0) {
156
+ parts.push(`${prefix}: no Git rename in the supplied range and no marker/snippet matches in other indexed primaries. ` +
157
+ `Remove stale index rows, restore the file, or point sourcePath at the new primary.`);
158
+ }
159
+ return parts;
160
+ }
161
+ /**
162
+ * Non-authoritative hints when indexed primary files are missing: Git renames,
163
+ * marker ids found under other indexed sources, and snippet-shaped matches.
164
+ * Intended for validation / doctor output — does not modify the index.
165
+ */
166
+ export function relocationHintMessages(input) {
167
+ const sortedMissing = [...input.missingSourcePathsNorm].sort((a, b) => a.localeCompare(b));
168
+ return sortedMissing.flatMap((m) => hintsForOneMissingPath(m, input));
169
+ }
170
+ //# sourceMappingURL=relocation-hints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relocation-hints.js","sourceRoot":"","sources":["../src/relocation-hints.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,12 @@
1
- import type { ScmProvider } from "./scm-provider.js";
1
+ import type { ScmPathRename, ScmProvider } from "./scm-provider.js";
2
+ /**
3
+ * Parses `git diff --name-status` output for `R` (rename) lines. Tab-separated
4
+ * `R086\told/path\tnew/path` (score optional).
5
+ */
6
+ export declare function parseGitRenameLines(stdout: string): ScmPathRename[];
2
7
  export declare class GitScmProvider implements ScmProvider {
3
8
  getBlobIdAtHead(repoRoot: string, repoRelativePath: string): Promise<string | null>;
4
9
  isAncestor(repoRoot: string, possibleAncestor: string, commit: string): Promise<boolean>;
10
+ listPathRenamesBetweenTreeishes(repoRoot: string, fromTreeish: string, toTreeish: string): Promise<ScmPathRename[]>;
5
11
  }
6
12
  //# sourceMappingURL=git-scm-provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"git-scm-provider.d.ts","sourceRoot":"","sources":["../../src/scm/git-scm-provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA0BrD,qBAAa,cAAe,YAAW,WAAW;IAC1C,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgBnF,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAW/F"}
1
+ {"version":3,"file":"git-scm-provider.d.ts","sourceRoot":"","sources":["../../src/scm/git-scm-provider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEpE;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,EAAE,CAmBnE;AAED,qBAAa,cAAe,YAAW,WAAW;IAC1C,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgBnF,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYxF,+BAA+B,CACnC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,EAAE,CAAC;CAa5B"}
@@ -1,23 +1,32 @@
1
- import { spawn } from "node:child_process";
2
- function runGit(repoRoot, args) {
3
- return new Promise((resolve, reject) => {
4
- const child = spawn("git", args, {
5
- cwd: repoRoot,
6
- env: process.env,
7
- });
8
- let stdout = "";
9
- let stderr = "";
10
- child.stdout.on("data", (d) => {
11
- stdout += String(d);
12
- });
13
- child.stderr.on("data", (d) => {
14
- stderr += String(d);
15
- });
16
- child.on("error", reject);
17
- child.on("close", (code) => {
18
- resolve({ code: code ?? 1, stdout, stderr });
19
- });
20
- });
1
+ import { normalizeRepoRelativePath } from "../paths.js";
2
+ import { runGit } from "./git-spawn.js";
3
+ /**
4
+ * Parses `git diff --name-status` output for `R` (rename) lines. Tab-separated
5
+ * `R086\told/path\tnew/path` (score optional).
6
+ */
7
+ export function parseGitRenameLines(stdout) {
8
+ const out = [];
9
+ for (const line of stdout.split("\n")) {
10
+ const t = line.trim();
11
+ if (!t)
12
+ continue;
13
+ const parts = t.split("\t");
14
+ if (parts.length < 3)
15
+ continue;
16
+ const status = parts[0] ?? "";
17
+ if (!status.startsWith("R"))
18
+ continue;
19
+ try {
20
+ out.push({
21
+ from: normalizeRepoRelativePath(parts[1] ?? ""),
22
+ to: normalizeRepoRelativePath(parts[2] ?? ""),
23
+ });
24
+ }
25
+ catch {
26
+ continue;
27
+ }
28
+ }
29
+ return out;
21
30
  }
22
31
  export class GitScmProvider {
23
32
  async getBlobIdAtHead(repoRoot, repoRelativePath) {
@@ -46,5 +55,18 @@ export class GitScmProvider {
46
55
  return false;
47
56
  throw new Error(`git merge-base failed (${code}): ${stderr.trim()}`);
48
57
  }
58
+ async listPathRenamesBetweenTreeishes(repoRoot, fromTreeish, toTreeish) {
59
+ const { code, stdout, stderr } = await runGit(repoRoot, [
60
+ "diff",
61
+ "--name-status",
62
+ "-M30%",
63
+ fromTreeish,
64
+ toTreeish,
65
+ ]);
66
+ if (code !== 0) {
67
+ throw new Error(`git diff --name-status failed (${code}): ${stderr.trim() || stdout.trim()}`);
68
+ }
69
+ return parseGitRenameLines(stdout);
70
+ }
49
71
  }
50
72
  //# sourceMappingURL=git-scm-provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"git-scm-provider.js","sourceRoot":"","sources":["../../src/scm/git-scm-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG3C,SAAS,MAAM,CACb,QAAgB,EAChB,IAAc;IAEd,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE;YAC/B,GAAG,EAAE,QAAQ;YACb,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAC,CAAC;QACH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAkB,EAAE,EAAE;YAC7C,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAkB,EAAE,EAAE;YAC7C,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAmB,EAAE,EAAE;YACxC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,OAAO,cAAc;IACzB,KAAK,CAAC,eAAe,CAAC,QAAgB,EAAE,gBAAwB;QAC9D,MAAM,SAAS,GAAG,gBAAgB,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC7E,MAAM,IAAI,GAAG,QAAQ,SAAS,EAAE,CAAC;QACjC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;QAC7E,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,IACE,gCAAgC,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC7C,+BAA+B,CAAC,IAAI,CAAC,MAAM,CAAC,EAC5C,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,gBAAwB,EAAE,MAAc;QACzE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE;YAC9C,YAAY;YACZ,eAAe;YACf,gBAAgB;YAChB,MAAM;SACP,CAAC,CAAC;QACH,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5B,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACvE,CAAC;CACF"}
1
+ {"version":3,"file":"git-scm-provider.js","sourceRoot":"","sources":["../../src/scm/git-scm-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Runs `git` with `args` in `repoRoot`; collects stdout/stderr as strings.
3
+ * Resolves with exit code (defaults to 1 when null).
4
+ */
5
+ export declare function runGit(repoRoot: string, args: string[]): Promise<{
6
+ code: number;
7
+ stdout: string;
8
+ stderr: string;
9
+ }>;
10
+ //# sourceMappingURL=git-spawn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-spawn.d.ts","sourceRoot":"","sources":["../../src/scm/git-spawn.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,MAAM,CACpB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAmB3D"}
@@ -0,0 +1,26 @@
1
+ import { spawn } from "node:child_process";
2
+ /**
3
+ * Runs `git` with `args` in `repoRoot`; collects stdout/stderr as strings.
4
+ * Resolves with exit code (defaults to 1 when null).
5
+ */
6
+ export function runGit(repoRoot, args) {
7
+ return new Promise((resolve, reject) => {
8
+ const child = spawn("git", args, {
9
+ cwd: repoRoot,
10
+ env: process.env,
11
+ });
12
+ let stdout = "";
13
+ let stderr = "";
14
+ child.stdout.on("data", (d) => {
15
+ stdout += String(d);
16
+ });
17
+ child.stderr.on("data", (d) => {
18
+ stderr += String(d);
19
+ });
20
+ child.on("error", reject);
21
+ child.on("close", (code) => {
22
+ resolve({ code: code ?? 1, stdout, stderr });
23
+ });
24
+ });
25
+ }
26
+ //# sourceMappingURL=git-spawn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-spawn.js","sourceRoot":"","sources":["../../src/scm/git-spawn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C;;;GAGG;AACH,MAAM,UAAU,MAAM,CACpB,QAAgB,EAChB,IAAc;IAEd,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE;YAC/B,GAAG,EAAE,QAAQ;YACb,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAC,CAAC;QACH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAkB,EAAE,EAAE;YAC7C,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAkB,EAAE,EAAE;YAC7C,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAmB,EAAE,EAAE;YACxC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,8 +1,18 @@
1
+ /** A path Git detected as renamed between two tree-ish objects (`git diff --name-status -M`). */
2
+ export type ScmPathRename = {
3
+ from: string;
4
+ to: string;
5
+ };
1
6
  /** Pluggable SCM integration; Git is the default implementation. */
2
7
  export type ScmProvider = {
3
8
  /** Object id for file at HEAD (Git blob), or null if unknown/untracked. */
4
9
  getBlobIdAtHead(repoRoot: string, repoRelativePath: string): Promise<string | null>;
5
10
  /** True if `possibleAncestor` is an ancestor of `commit` (inclusive). */
6
11
  isAncestor(repoRoot: string, possibleAncestor: string, commit: string): Promise<boolean>;
12
+ /**
13
+ * Optional: list file renames Git detected between `fromTreeish` and `toTreeish`
14
+ * (same semantics as `git diff --name-status -M30% fromTreeish toTreeish`).
15
+ */
16
+ listPathRenamesBetweenTreeishes?: (repoRoot: string, fromTreeish: string, toTreeish: string) => Promise<ScmPathRename[]>;
7
17
  };
8
18
  //# sourceMappingURL=scm-provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scm-provider.d.ts","sourceRoot":"","sources":["../../src/scm/scm-provider.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,MAAM,MAAM,WAAW,GAAG;IACxB,2EAA2E;IAC3E,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACpF,yEAAyE;IACzE,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1F,CAAC"}
1
+ {"version":3,"file":"scm-provider.d.ts","sourceRoot":"","sources":["../../src/scm/scm-provider.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD,oEAAoE;AACpE,MAAM,MAAM,WAAW,GAAG;IACxB,2EAA2E;IAC3E,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACpF,yEAAyE;IACzE,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzF;;;OAGG;IACH,+BAA+B,CAAC,EAAE,CAChC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,KACd,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;CAC/B,CAAC"}
@@ -1,27 +1,12 @@
1
+ import type { BlockScrollLink } from "./block-scroll-pickers.js";
1
2
  import type { CommentrayIndex } from "./model.js";
2
- /** One block as needed for scroll correlation (0-based commentray line, 1-based source range). */
3
- export type BlockScrollLink = {
4
- commentrayLine: number;
5
- sourceStart: number;
6
- sourceEnd: number;
7
- };
3
+ export type { BlockScrollLink } from "./block-scroll-pickers.js";
4
+ export { pickCommentrayLineForSourceScroll, pickSourceLine0ForCommentrayScroll, } from "./block-scroll-pickers.js";
8
5
  /**
9
- * Correlate index blocks (line anchors + ids) with `<!-- commentray:block id=… -->`
10
- * markers in commentray. Only `lines:` anchors with a visible
11
- * marker participate. Sorted by `sourceStart`.
6
+ * Correlate index blocks with `<!-- commentray:block id=… -->` markers in
7
+ * commentray. Supports legacy `lines:` anchors and `marker:` anchors (the
8
+ * latter needs `sourceText` to resolve marker comments in the primary file).
9
+ * Sorted by `sourceStart`.
12
10
  */
13
- export declare function buildBlockScrollLinks(index: CommentrayIndex | null | undefined, sourceRelative: string, commentrayPath: string, commentrayMarkdown: string): BlockScrollLink[];
14
- /**
15
- * Choose which commentray line (0-based) to reveal so the commentary matches
16
- * the top of the source viewport. Prefers the block whose source range
17
- * **contains** the top line; otherwise the nearest preceding block; if above
18
- * all blocks, the first block.
19
- */
20
- export declare function pickCommentrayLineForSourceScroll(blocks: BlockScrollLink[], topSourceLine1Based: number): number | null;
21
- /**
22
- * Choose a 0-based source line to reveal from the top of the commentray
23
- * viewport: the block whose marker is at or above that line wins; reveal the
24
- * start of its source range.
25
- */
26
- export declare function pickSourceLine0ForCommentrayScroll(blocks: BlockScrollLink[], topCommentrayLine0Based: number): number | null;
11
+ export declare function buildBlockScrollLinks(index: CommentrayIndex | null | undefined, sourceRelative: string, commentrayPath: string, commentrayMarkdown: string, sourceText?: string): BlockScrollLink[];
27
12
  //# sourceMappingURL=scroll-sync.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scroll-sync.d.ts","sourceRoot":"","sources":["../src/scroll-sync.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,kGAAkG;AAClG,MAAM,MAAM,eAAe,GAAG;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAcF;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EACzC,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,kBAAkB,EAAE,MAAM,GACzB,eAAe,EAAE,CAkBnB;AAED;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,eAAe,EAAE,EACzB,mBAAmB,EAAE,MAAM,GAC1B,MAAM,GAAG,IAAI,CAaf;AAED;;;;GAIG;AACH,wBAAgB,kCAAkC,CAChD,MAAM,EAAE,eAAe,EAAE,EACzB,uBAAuB,EAAE,MAAM,GAC9B,MAAM,GAAG,IAAI,CAQf"}
1
+ {"version":3,"file":"scroll-sync.d.ts","sourceRoot":"","sources":["../src/scroll-sync.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,YAAY,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EACL,iCAAiC,EACjC,kCAAkC,GACnC,MAAM,2BAA2B,CAAC;AAcnC;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EACzC,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,kBAAkB,EAAE,MAAM,EAC1B,UAAU,CAAC,EAAE,MAAM,GAClB,eAAe,EAAE,CAgCnB"}