@hardlydifficult/text 1.0.5 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @hardlydifficult/text
2
2
 
3
- Text utilities for error formatting, template replacement, and chunking.
3
+ Text utilities for error formatting, template replacement, chunking, and line numbering.
4
4
 
5
5
  ## Installation
6
6
 
@@ -121,3 +121,31 @@ convertFormat("name: Alice\nage: 30", "json");
121
121
  ```
122
122
 
123
123
  The function tries to parse as JSON first, then falls back to YAML. Returns pretty-printed JSON with 2-space indent or clean YAML. Throws a descriptive error if the input is neither valid JSON nor YAML.
124
+
125
+ ### `formatWithLineNumbers(content: string, startLine?: number): string`
126
+
127
+ Format text content with right-aligned line numbers. Each line is prefixed with its line number, padded to align properly based on the maximum line number.
128
+
129
+ ```typescript
130
+ import { formatWithLineNumbers } from "@hardlydifficult/text";
131
+
132
+ // Default: starts at line 1
133
+ formatWithLineNumbers("foo\nbar\nbaz");
134
+ // 1: foo
135
+ // 2: bar
136
+ // 3: baz
137
+
138
+ // Custom starting line for displaying file ranges
139
+ formatWithLineNumbers("hello\nworld", 10);
140
+ // 10: hello
141
+ // 11: world
142
+
143
+ // Proper alignment for larger line numbers
144
+ formatWithLineNumbers("line 1\nline 2\n...\nline 100", 98);
145
+ // 98: line 1
146
+ // 99: line 2
147
+ // 100: ...
148
+ // 101: line 100
149
+ ```
150
+
151
+ This is useful for displaying code snippets, file contents, or log output with line numbers for reference.
@@ -2,6 +2,8 @@ export interface BuildTreeOptions {
2
2
  maxLevel2?: number;
3
3
  maxLevel3?: number;
4
4
  annotations?: ReadonlyMap<string, string>;
5
+ /** Directory names to collapse. Matched dirs show a content summary instead of expanding children. */
6
+ collapseDirs?: readonly string[];
5
7
  }
6
8
  /** Default truncation limits for file tree rendering. */
7
9
  export declare const FILE_TREE_DEFAULTS: Required<Pick<BuildTreeOptions, "maxLevel2" | "maxLevel3">>;
@@ -1 +1 @@
1
- {"version":3,"file":"buildFileTree.d.ts","sourceRoot":"","sources":["../src/buildFileTree.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AAED,yDAAyD;AACzD,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CACvC,IAAI,CAAC,gBAAgB,EAAE,WAAW,GAAG,WAAW,CAAC,CAIlD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,OAAO,GAAE,gBAAqB,GAC7B,MAAM,CAkFR"}
1
+ {"version":3,"file":"buildFileTree.d.ts","sourceRoot":"","sources":["../src/buildFileTree.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,sGAAsG;IACtG,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED,yDAAyD;AACzD,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CACvC,IAAI,CAAC,gBAAgB,EAAE,WAAW,GAAG,WAAW,CAAC,CAIlD,CAAC;AAiCF;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,OAAO,GAAE,gBAAqB,GAC7B,MAAM,CAyFR"}
@@ -7,12 +7,43 @@ exports.FILE_TREE_DEFAULTS = {
7
7
  maxLevel2: 10,
8
8
  maxLevel3: 3,
9
9
  };
10
+ /**
11
+ * Count all descendant files and directories within a node.
12
+ */
13
+ function countDescendants(node) {
14
+ let files = 0;
15
+ let dirs = 0;
16
+ for (const child of node.children ?? []) {
17
+ if (child.isDir) {
18
+ dirs++;
19
+ const sub = countDescendants(child);
20
+ files += sub.files;
21
+ dirs += sub.dirs;
22
+ }
23
+ else {
24
+ files++;
25
+ }
26
+ }
27
+ return { files, dirs };
28
+ }
29
+ /**
30
+ * Format a collapsed directory summary, e.g. "(42 files across 3 dirs)".
31
+ */
32
+ function formatCollapsedSummary(files, dirs) {
33
+ const filePart = `${String(files)} ${files === 1 ? "file" : "files"}`;
34
+ if (dirs === 0) {
35
+ return `(${filePart})`;
36
+ }
37
+ const dirPart = `${String(dirs)} ${dirs === 1 ? "dir" : "dirs"}`;
38
+ return `(${filePart} across ${dirPart})`;
39
+ }
10
40
  /**
11
41
  * Builds a hierarchical file tree from flat paths with depth-based truncation.
12
42
  * Optionally annotates entries with short descriptions from the annotations map.
13
43
  */
14
44
  function buildFileTree(filePaths, options = {}) {
15
- const { maxLevel2 = exports.FILE_TREE_DEFAULTS.maxLevel2, maxLevel3 = exports.FILE_TREE_DEFAULTS.maxLevel3, annotations, } = options;
45
+ const { maxLevel2 = exports.FILE_TREE_DEFAULTS.maxLevel2, maxLevel3 = exports.FILE_TREE_DEFAULTS.maxLevel3, annotations, collapseDirs, } = options;
46
+ const collapseSet = collapseDirs ? new Set(collapseDirs) : undefined;
16
47
  // Build tree structure
17
48
  const root = { name: "", isDir: true, children: [], fullPath: "" };
18
49
  for (const filePath of filePaths) {
@@ -67,7 +98,13 @@ function buildFileTree(filePaths, options = {}) {
67
98
  const annotation = annotations?.get(child.fullPath) ?? "";
68
99
  const suffix = annotation !== "" ? ` — ${annotation}` : "";
69
100
  lines.push(`${prefix}${child.name}${marker}${suffix}`);
70
- if (child.children && child.children.length > 0) {
101
+ if (child.isDir && collapseSet?.has(child.name) === true) {
102
+ const { files, dirs } = countDescendants(child);
103
+ if (files > 0 || dirs > 0) {
104
+ lines.push(`${prefix} ${formatCollapsedSummary(files, dirs)}`);
105
+ }
106
+ }
107
+ else if (child.children && child.children.length > 0) {
71
108
  renderNode(child, depth + 1, `${prefix} `);
72
109
  }
73
110
  }
@@ -1 +1 @@
1
- {"version":3,"file":"buildFileTree.js","sourceRoot":"","sources":["../src/buildFileTree.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"buildFileTree.js","sourceRoot":"","sources":["../src/buildFileTree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Format text content with right-aligned line numbers.
3
+ *
4
+ * @param content - The text content to format
5
+ * @param startLine - The starting line number (default: 1)
6
+ * @returns The formatted text with line numbers
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * formatWithLineNumbers("foo\nbar\nbaz")
11
+ * // Returns:
12
+ * // "1: foo\n2: bar\n3: baz"
13
+ *
14
+ * formatWithLineNumbers("hello\nworld", 10)
15
+ * // Returns:
16
+ * // "10: hello\n11: world"
17
+ * ```
18
+ */
19
+ export declare function formatWithLineNumbers(content: string, startLine?: number): string;
20
+ //# sourceMappingURL=formatWithLineNumbers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatWithLineNumbers.d.ts","sourceRoot":"","sources":["../src/formatWithLineNumbers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,SAAI,GAAG,MAAM,CAO5E"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatWithLineNumbers = formatWithLineNumbers;
4
+ /**
5
+ * Format text content with right-aligned line numbers.
6
+ *
7
+ * @param content - The text content to format
8
+ * @param startLine - The starting line number (default: 1)
9
+ * @returns The formatted text with line numbers
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * formatWithLineNumbers("foo\nbar\nbaz")
14
+ * // Returns:
15
+ * // "1: foo\n2: bar\n3: baz"
16
+ *
17
+ * formatWithLineNumbers("hello\nworld", 10)
18
+ * // Returns:
19
+ * // "10: hello\n11: world"
20
+ * ```
21
+ */
22
+ function formatWithLineNumbers(content, startLine = 1) {
23
+ const lines = content.split("\n");
24
+ const maxNum = startLine + lines.length - 1;
25
+ const width = String(maxNum).length;
26
+ return lines
27
+ .map((line, i) => `${String(startLine + i).padStart(width)}: ${line}`)
28
+ .join("\n");
29
+ }
30
+ //# sourceMappingURL=formatWithLineNumbers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatWithLineNumbers.js","sourceRoot":"","sources":["../src/formatWithLineNumbers.ts"],"names":[],"mappings":";;AAkBA,sDAOC;AAzBD;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAgB,qBAAqB,CAAC,OAAe,EAAE,SAAS,GAAG,CAAC;IAClE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IACpC,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;SACrE,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -7,4 +7,5 @@ export { buildFileTree, FILE_TREE_DEFAULTS } from "./buildFileTree.js";
7
7
  export type { BuildTreeOptions } from "./buildFileTree.js";
8
8
  export { convertFormat } from "./convertFormat.js";
9
9
  export type { TextFormat } from "./convertFormat.js";
10
+ export { formatWithLineNumbers } from "./formatWithLineNumbers.js";
10
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACvE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACvE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.convertFormat = exports.FILE_TREE_DEFAULTS = exports.buildFileTree = exports.formatDuration = exports.slugify = exports.chunkText = exports.extractPlaceholders = exports.replaceTemplate = exports.formatErrorForLog = exports.formatError = exports.getErrorMessage = void 0;
3
+ exports.formatWithLineNumbers = exports.convertFormat = exports.FILE_TREE_DEFAULTS = exports.buildFileTree = exports.formatDuration = exports.slugify = exports.chunkText = exports.extractPlaceholders = exports.replaceTemplate = exports.formatErrorForLog = exports.formatError = exports.getErrorMessage = void 0;
4
4
  var errors_js_1 = require("./errors.js");
5
5
  Object.defineProperty(exports, "getErrorMessage", { enumerable: true, get: function () { return errors_js_1.getErrorMessage; } });
6
6
  Object.defineProperty(exports, "formatError", { enumerable: true, get: function () { return errors_js_1.formatError; } });
@@ -19,4 +19,6 @@ Object.defineProperty(exports, "buildFileTree", { enumerable: true, get: functio
19
19
  Object.defineProperty(exports, "FILE_TREE_DEFAULTS", { enumerable: true, get: function () { return buildFileTree_js_1.FILE_TREE_DEFAULTS; } });
20
20
  var convertFormat_js_1 = require("./convertFormat.js");
21
21
  Object.defineProperty(exports, "convertFormat", { enumerable: true, get: function () { return convertFormat_js_1.convertFormat; } });
22
+ var formatWithLineNumbers_js_1 = require("./formatWithLineNumbers.js");
23
+ Object.defineProperty(exports, "formatWithLineNumbers", { enumerable: true, get: function () { return formatWithLineNumbers_js_1.formatWithLineNumbers; } });
22
24
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,yCAA8E;AAArE,4GAAA,eAAe,OAAA;AAAE,wGAAA,WAAW,OAAA;AAAE,8GAAA,iBAAiB,OAAA;AACxD,6CAAqE;AAA5D,8GAAA,eAAe,OAAA;AAAE,kHAAA,mBAAmB,OAAA;AAC7C,+CAA2C;AAAlC,yGAAA,SAAS,OAAA;AAClB,2CAAuC;AAA9B,qGAAA,OAAO,OAAA;AAChB,yDAAqD;AAA5C,mHAAA,cAAc,OAAA;AACvB,uDAAuE;AAA9D,iHAAA,aAAa,OAAA;AAAE,sHAAA,kBAAkB,OAAA;AAE1C,uDAAmD;AAA1C,iHAAA,aAAa,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,yCAA8E;AAArE,4GAAA,eAAe,OAAA;AAAE,wGAAA,WAAW,OAAA;AAAE,8GAAA,iBAAiB,OAAA;AACxD,6CAAqE;AAA5D,8GAAA,eAAe,OAAA;AAAE,kHAAA,mBAAmB,OAAA;AAC7C,+CAA2C;AAAlC,yGAAA,SAAS,OAAA;AAClB,2CAAuC;AAA9B,qGAAA,OAAO,OAAA;AAChB,yDAAqD;AAA5C,mHAAA,cAAc,OAAA;AACvB,uDAAuE;AAA9D,iHAAA,aAAa,OAAA;AAAE,sHAAA,kBAAkB,OAAA;AAE1C,uDAAmD;AAA1C,iHAAA,aAAa,OAAA;AAEtB,uEAAmE;AAA1D,iIAAA,qBAAqB,OAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hardlydifficult/text",
3
- "version": "1.0.5",
3
+ "version": "1.0.7",
4
4
  "main": "./dist/index.js",
5
5
  "types": "./dist/index.d.ts",
6
6
  "files": [