@hardlydifficult/text 1.0.15 → 1.0.17

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
@@ -8,14 +8,24 @@ Text utilities for error formatting, template replacement, text chunking, slugif
8
8
  npm install @hardlydifficult/text
9
9
  ```
10
10
 
11
- ## Usage
11
+ ## Quick Start
12
12
 
13
13
  ```typescript
14
14
  import * as text from "@hardlydifficult/text";
15
15
 
16
- // Quick example
17
- const output = text.replaceTemplate("Hello {{name}}!", { name: "World" });
18
- console.log(output); // "Hello World!"
16
+ // Template replacement
17
+ const greeting = text.replaceTemplate("Hello {{name}}!", { name: "World" });
18
+ console.log(greeting); // "Hello World!"
19
+
20
+ // Text chunking
21
+ const chunks = text.chunkText("Line 1\nLine 2\nLong line", 15);
22
+ console.log(chunks); // ["Line 1\nLine 2", "Long line"]
23
+
24
+ // Slugification
25
+ console.log(text.slugify("My Feature Name!")); // "my-feature-name"
26
+
27
+ // Duration formatting
28
+ console.log(text.formatDuration(125_000)); // "2m 5s"
19
29
  ```
20
30
 
21
31
  ## Error Handling
@@ -85,7 +95,7 @@ extractPlaceholders("{{name}} is in {{place}}"); // ["name", "place"]
85
95
 
86
96
  ### `chunkText(text: string, maxLength: number): string[]`
87
97
 
88
- Split text into chunks of at most `maxLength` characters, preferring line breaks and spaces.
98
+ Split text into chunks of at most `maxLength` characters, preferring line breaks and spaces for natural breaks.
89
99
 
90
100
  ```typescript
91
101
  import { chunkText } from "@hardlydifficult/text";
@@ -97,7 +107,7 @@ const chunks = chunkText(text, 20);
97
107
 
98
108
  ### `slugify(input: string, maxLength?: number): string`
99
109
 
100
- Convert a string to a URL/filename-safe slug.
110
+ Convert a string to a URL/filename-safe slug by lowercasing, replacing non-alphanumeric characters with hyphens, and optionally truncating at hyphen boundaries.
101
111
 
102
112
  ```typescript
103
113
  import { slugify } from "@hardlydifficult/text";
@@ -123,7 +133,7 @@ formatWithLineNumbers("hello\nworld", 10);
123
133
 
124
134
  ### `formatDuration(ms: number): string`
125
135
 
126
- Format milliseconds as a human-readable duration string.
136
+ Format milliseconds as a human-readable duration string, showing up to two units and using "<1s" for sub-second values.
127
137
 
128
138
  ```typescript
129
139
  import { formatDuration } from "@hardlydifficult/text";
@@ -138,7 +148,7 @@ formatDuration(90_000_000); // "1d 1h"
138
148
 
139
149
  ### `convertFormat(content: string, to: "json" | "yaml"): string`
140
150
 
141
- Convert between JSON and YAML string formats with automatic input detection.
151
+ Convert between JSON and YAML string formats with automatic input format detection.
142
152
 
143
153
  ```typescript
144
154
  import { convertFormat } from "@hardlydifficult/text";
@@ -169,25 +179,20 @@ formatYaml({ message: "Hello: World" });
169
179
 
170
180
  ### `healYaml(dirtyYaml: string): string`
171
181
 
172
- Clean malformed YAML by stripping code fences and quoting problematic scalars containing colons.
182
+ Clean malformed YAML by stripping markdown code fences and quoting problematic scalar values containing colons.
173
183
 
174
184
  ```typescript
175
185
  import { healYaml } from "@hardlydifficult/text";
176
186
 
177
- healYaml('message: "Hello: World"'); // "message: >\n Hello: World"
187
+ healYaml('```yaml\nmessage: Hello: World\n```');
188
+ // "message: >\n Hello: World"
178
189
  ```
179
190
 
180
191
  ## Link Generation
181
192
 
182
- ### `createLinker(rules?: LinkRule[]): { linkText(text: string, options?: LinkOptions): string; apply: typeof linkText }`
193
+ ### `createLinker(initialRules?: LinkRule[]): Linker`
183
194
 
184
- Create a configurable linker to transform text patterns into platform-specific links.
185
-
186
- Supports:
187
- - Plain strings
188
- - Idempotent re-runs
189
- - Automatic skipping of code spans and existing links
190
- - Deterministic conflict resolution (priority, then longest match, then rule order)
195
+ Create a configurable linker to transform text patterns into platform-specific links. The linker is idempotent by default, skips code spans and existing links, and resolves overlapping matches deterministically.
191
196
 
192
197
  ```typescript
193
198
  import { createLinker } from "@hardlydifficult/text";
@@ -203,20 +208,80 @@ linker.linkText("Fix ENG-533 and PR#42", { format: "markdown" });
203
208
  // "[ENG-533](https://linear.app/fairmint/issue/ENG-533) and [PR#42](https://github.com/Fairmint/api/pull/42)"
204
209
  ```
205
210
 
206
- Supported formats: `slack` (`<url|text>`), `markdown`/`discord` (`[text](url)`), `plaintext` (raw URL).
211
+ #### Linker Methods
212
+
213
+ **`.linear(workspace: string, options?: { name?: string; priority?: number }): Linker`**
214
+
215
+ Add a rule for Linear issue references (e.g., `ENG-533`).
216
+
217
+ ```typescript
218
+ const linker = createLinker().linear("fairmint");
219
+ linker.linkText("Fix ENG-533", { format: "markdown" });
220
+ // "[ENG-533](https://linear.app/fairmint/issue/ENG-533)"
221
+ ```
222
+
223
+ **`.githubPr(repository: string, options?: { name?: string; priority?: number }): Linker`**
224
+
225
+ Add a rule for GitHub pull request references (e.g., `PR#42`).
226
+
227
+ ```typescript
228
+ const linker = createLinker().githubPr("Fairmint/api");
229
+ linker.linkText("Merge PR#42", { format: "markdown" });
230
+ // "[PR#42](https://github.com/Fairmint/api/pull/42)"
231
+ ```
232
+
233
+ **`.custom(pattern: RegExp, toHref: string | LinkHrefBuilder, options?: { name?: string; priority?: number }): Linker`**
234
+
235
+ Add a custom rule with a regex pattern and URL template or callback.
236
+
237
+ ```typescript
238
+ const linker = createLinker().custom(
239
+ /\bINC-\d+\b/g,
240
+ ({ match }) => `https://incident.io/${match}`
241
+ );
242
+ linker.linkText("Resolve INC-99", { format: "markdown" });
243
+ // "[INC-99](https://incident.io/INC-99)"
244
+ ```
245
+
246
+ **`.linkText(input: string, options?: LinkerApplyOptions): string`**
247
+
248
+ Apply all configured rules to the input text and return formatted links.
249
+
250
+ **`.apply(input: string, options?: LinkerApplyOptions): string`**
251
+
252
+ Alias for `linkText()`.
253
+
254
+ #### Link Options
207
255
 
208
- | Option | Description | Default |
209
- |--------|-------------|---------|
210
- | `format` | Target output format | `"markdown"` |
211
- | `platform` | Alias for `format` | `"markdown"` |
212
- | `skipCode` | Skip linkification inside code spans | `true` |
213
- | `skipExistingLinks` | Skip linkification inside existing links | `true` |
256
+ | Option | Type | Default | Description |
257
+ |--------|------|---------|-------------|
258
+ | `format` | `"slack" \| "discord" \| "markdown" \| "plaintext"` | `"markdown"` | Target output format |
259
+ | `platform` | `"slack" \| "discord" \| "markdown" \| "plaintext"` | `"markdown"` | Alias for `format` |
260
+ | `skipCode` | `boolean` | `true` | Skip linkification inside code spans (backticks and fenced blocks) |
261
+ | `skipExistingLinks` | `boolean` | `true` | Skip linkification inside existing links (Slack, Markdown, and plain URLs) |
262
+
263
+ #### URL Template Syntax
264
+
265
+ When using a string template for `href` or `toHref`, the following substitutions are available:
266
+
267
+ - `$0` or `$&` — Full regex match
268
+ - `$1`, `$2`, etc. — Capture groups
269
+ - `$$` — Literal `$`
270
+
271
+ ```typescript
272
+ const linker = createLinker().custom(
273
+ /\b([A-Z]{2,6})-(\d+)\b/g,
274
+ "https://example.com/issues/$1/$2"
275
+ );
276
+ linker.linkText("ENG-533", { format: "markdown" });
277
+ // "[ENG-533](https://example.com/issues/ENG/533)"
278
+ ```
214
279
 
215
280
  ## File Tree Rendering
216
281
 
217
- ### `buildFileTree(files: string[], options?: FileTreeOptions): string`
282
+ ### `buildFileTree(files: string[], options?: BuildTreeOptions): string`
218
283
 
219
- Build and render a hierarchical file tree with depth-based truncation and directory collapsing.
284
+ Build and render a hierarchical file tree with depth-based truncation and optional annotations.
220
285
 
221
286
  ```typescript
222
287
  import { buildFileTree } from "@hardlydifficult/text";
@@ -225,10 +290,88 @@ const files = [
225
290
  "src/index.ts",
226
291
  "src/utils.ts",
227
292
  "src/components/Button.tsx",
293
+ "README.md",
228
294
  ];
229
295
 
230
296
  buildFileTree(files);
231
- // "src/\n├── index.ts\n├── utils.ts\n└── components/\n └── Button.tsx"
297
+ // src/
298
+ // index.ts
299
+ // utils.ts
300
+ // components/
301
+ // Button.tsx
302
+ //
303
+ // README.md
304
+ ```
305
+
306
+ #### Tree Options
307
+
308
+ | Option | Type | Default | Description |
309
+ |--------|------|---------|-------------|
310
+ | `maxLevel2` | `number` | `10` | Maximum children to show at depth 2 |
311
+ | `maxLevel3` | `number` | `3` | Maximum children to show at depth 3+ |
312
+ | `annotations` | `Map<string, string>` | — | Descriptions to append to entries (e.g., `"src/index.ts" → "Main entry point"`) |
313
+ | `details` | `Map<string, string[]>` | — | Extra indented lines to show under file entries (e.g., key sections) |
314
+ | `collapseDirs` | `string[]` | — | Directory names to collapse with a summary instead of expanding |
315
+
316
+ #### Annotations Example
317
+
318
+ ```typescript
319
+ const annotations = new Map([
320
+ ["src", "Source code"],
321
+ ["src/index.ts", "Main entry point"],
322
+ ]);
323
+
324
+ buildFileTree(["src/index.ts", "src/utils.ts"], { annotations });
325
+ // src/ — Source code
326
+ // index.ts — Main entry point
327
+ // utils.ts
232
328
  ```
233
329
 
234
- Options include `maxDepth`, `maxDirectories`, and `collapseDirectories` for controlling tree rendering behavior.
330
+ #### Details Example
331
+
332
+ ```typescript
333
+ const details = new Map([
334
+ [
335
+ "src/index.ts",
336
+ [
337
+ "> main (5-20): App entry point.",
338
+ "> shutdown (22-35): Cleanup handler.",
339
+ ],
340
+ ],
341
+ ]);
342
+
343
+ buildFileTree(["src/index.ts"], { details });
344
+ // src/
345
+ // index.ts
346
+ // > main (5-20): App entry point.
347
+ // > shutdown (22-35): Cleanup handler.
348
+ ```
349
+
350
+ #### Collapsed Directories Example
351
+
352
+ ```typescript
353
+ buildFileTree(
354
+ [
355
+ "node_modules/package-a/index.js",
356
+ "node_modules/package-b/index.js",
357
+ "src/index.ts",
358
+ ],
359
+ { collapseDirs: ["node_modules"] }
360
+ );
361
+ // node_modules/
362
+ // (2 files across 2 dirs)
363
+ //
364
+ // src/
365
+ // index.ts
366
+ ```
367
+
368
+ ### `FILE_TREE_DEFAULTS`
369
+
370
+ Default truncation limits for file tree rendering.
371
+
372
+ ```typescript
373
+ import { FILE_TREE_DEFAULTS } from "@hardlydifficult/text";
374
+
375
+ console.log(FILE_TREE_DEFAULTS.maxLevel2); // 10
376
+ console.log(FILE_TREE_DEFAULTS.maxLevel3); // 3
377
+ ```
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Escapes markdown code fences by wrapping content with more backticks than it contains.
3
+ * If content has ```, wraps with ````. If content has ````, wraps with `````, etc.
4
+ */
5
+ export declare function escapeFence(content: string): {
6
+ fence: string;
7
+ content: string;
8
+ };
9
+ //# sourceMappingURL=escapeFence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escapeFence.d.ts","sourceRoot":"","sources":["../src/escapeFence.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB,CAeA"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.escapeFence = escapeFence;
4
+ /**
5
+ * Escapes markdown code fences by wrapping content with more backticks than it contains.
6
+ * If content has ```, wraps with ````. If content has ````, wraps with `````, etc.
7
+ */
8
+ function escapeFence(content) {
9
+ let maxBackticks = 3; // Start with triple backticks (standard markdown fence)
10
+ // Find the longest sequence of consecutive backticks in the content
11
+ const backtickMatches = content.match(/`+/g);
12
+ if (backtickMatches) {
13
+ for (const match of backtickMatches) {
14
+ if (match.length >= maxBackticks) {
15
+ maxBackticks = match.length + 1;
16
+ }
17
+ }
18
+ }
19
+ const fence = "`".repeat(maxBackticks);
20
+ return { fence, content };
21
+ }
22
+ //# sourceMappingURL=escapeFence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escapeFence.js","sourceRoot":"","sources":["../src/escapeFence.ts"],"names":[],"mappings":";;AAIA,kCAkBC;AAtBD;;;GAGG;AACH,SAAgB,WAAW,CAAC,OAAe;IAIzC,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC,wDAAwD;IAE9E,oEAAoE;IACpE,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,eAAe,EAAE,CAAC;QACpB,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;YACpC,IAAI,KAAK,CAAC,MAAM,IAAI,YAAY,EAAE,CAAC;gBACjC,YAAY,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACvC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC5B,CAAC"}
package/dist/index.d.ts CHANGED
@@ -11,4 +11,5 @@ export { formatWithLineNumbers } from "./formatWithLineNumbers.js";
11
11
  export { formatYaml } from "./formatYaml.js";
12
12
  export { healYaml } from "./healYaml.js";
13
13
  export { Linker, createLinker, type LinkRule, type LinkHrefBuilder, type LinkMatchContext, type LinkerApplyOptions, type LinkerPlatform, } from "./linker.js";
14
+ export { escapeFence } from "./escapeFence.js";
14
15
  //# 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;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EACL,MAAM,EACN,YAAY,EACZ,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,cAAc,GACpB,MAAM,aAAa,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;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EACL,MAAM,EACN,YAAY,EACZ,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,cAAc,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createLinker = exports.Linker = exports.healYaml = exports.formatYaml = 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;
3
+ exports.escapeFence = exports.createLinker = exports.Linker = exports.healYaml = exports.formatYaml = 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; } });
@@ -28,4 +28,6 @@ Object.defineProperty(exports, "healYaml", { enumerable: true, get: function ()
28
28
  var linker_js_1 = require("./linker.js");
29
29
  Object.defineProperty(exports, "Linker", { enumerable: true, get: function () { return linker_js_1.Linker; } });
30
30
  Object.defineProperty(exports, "createLinker", { enumerable: true, get: function () { return linker_js_1.createLinker; } });
31
+ var escapeFence_js_1 = require("./escapeFence.js");
32
+ Object.defineProperty(exports, "escapeFence", { enumerable: true, get: function () { return escapeFence_js_1.escapeFence; } });
31
33
  //# 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;AAEtB,uEAAmE;AAA1D,iIAAA,qBAAqB,OAAA;AAC9B,iDAA6C;AAApC,2GAAA,UAAU,OAAA;AACnB,6CAAyC;AAAhC,uGAAA,QAAQ,OAAA;AACjB,yCAQqB;AAPnB,mGAAA,MAAM,OAAA;AACN,yGAAA,YAAY,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;AAC9B,iDAA6C;AAApC,2GAAA,UAAU,OAAA;AACnB,6CAAyC;AAAhC,uGAAA,QAAQ,OAAA;AACjB,yCAQqB;AAPnB,mGAAA,MAAM,OAAA;AACN,yGAAA,YAAY,OAAA;AAOd,mDAA+C;AAAtC,6GAAA,WAAW,OAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hardlydifficult/text",
3
- "version": "1.0.15",
3
+ "version": "1.0.17",
4
4
  "main": "./dist/index.js",
5
5
  "types": "./dist/index.d.ts",
6
6
  "files": [