@utilix-tech/sdk 0.75.0 → 0.76.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,10 @@
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.76.0
6
+ - Add `detectWordyPhrases` (wordy-phrase-detector): scan text against a curated table of wordy/redundant phrases ("due to the fact that", "in order to") and flag each occurrence with a suggested concise replacement, an occurrence count, and character offsets.
7
+ - Add `checkOxfordCommaConsistency` (oxford-comma-checker): scan a document for comma-before-and/or usage in three-or-more-item lists and flag documents that mix Oxford comma styles.
8
+
5
9
  ## 0.75.0
6
10
  - Add `verifyWebhookSignature` (webhook-signature-verifier): recompute an HMAC over a raw webhook payload and compare it to a provided signature, supporting the `sha256=` prefix style (Stripe/GitHub-style webhooks) plus raw hex or base64 encoding.
7
11
  - Add `calculateTransferTime` and `calculateRequiredBandwidth` (data-transfer-time-estimator): estimate the theoretical time to transfer a file over a connection of a given speed, or the reverse: the bandwidth required to hit a target time.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @utilix-tech/sdk
2
2
 
3
- **702 developer utility functions for Node.js: runs locally, no API key required.**
3
+ **703 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)
@@ -152,7 +152,8 @@ generateEtag("console.log(1)");
152
152
  ```ts
153
153
  import { convertCase, slugify, countWords, generateWords, generateParagraphs,
154
154
  escapeString, htmlToMarkdown, applyOps, detectPassiveVoice, scoreReadability,
155
- detectFillerWords, calculateStringDistance, analyzeSentenceLengths,
155
+ detectFillerWords, detectWordyPhrases, checkOxfordCommaConsistency,
156
+ calculateStringDistance, analyzeSentenceLengths,
156
157
  analyzeKeywordDensity, searchEmoji, getEmojiByShortcode } from "@utilix-tech/sdk/text";
157
158
 
158
159
  convertCase("hello world", "camelCase"); // "helloWorld"
@@ -183,6 +184,14 @@ scoreReadability("The cat sat on the mat. It was a sunny day.");
183
184
  detectFillerWords("At the end of the day, I just really think we should circle back.");
184
185
  // { totalMatches: 4, fillerCount: 2, clicheCount: 2, density: 28.6, matches: [...] }
185
186
 
187
+ // Flag wordy/redundant phrases with a suggested concise replacement
188
+ detectWordyPhrases("Due to the fact that it was late, we decided, in order to save time, to skip the meeting.");
189
+ // { totalMatches: 2, density: 10.5, matches: [{ phrase: "due to the fact that", suggestion: "because", ... }, ...] }
190
+
191
+ // Flag a document that mixes Oxford-comma and non-Oxford-comma lists
192
+ checkOxfordCommaConsistency("I bought apples, bananas, and pears. Then I bought milk, eggs and bread.");
193
+ // { totalLists: 2, withOxfordComma: 1, withoutOxfordComma: 1, consistent: false, instances: [...] }
194
+
186
195
  // Levenshtein edit distance + similarity ratio; pass mode: "damerau" to count a transposition as 1 edit
187
196
  calculateStringDistance("kitten", "sitting");
188
197
  // { distance: 3, similarity: 0.5714, maxLength: 7, mode: "levenshtein" }
@@ -18,6 +18,7 @@ __export(text_exports, {
18
18
  applyOps: () => applyOps,
19
19
  calculateStringDistance: () => calculateStringDistance,
20
20
  centerText: () => centerText,
21
+ checkOxfordCommaConsistency: () => checkOxfordCommaConsistency,
21
22
  convertAll: () => convertAll,
22
23
  convertCase: () => convertCase,
23
24
  countWords: () => countWords,
@@ -26,6 +27,7 @@ __export(text_exports, {
26
27
  detectDelimiter: () => detectDelimiter,
27
28
  detectFillerWords: () => detectFillerWords,
28
29
  detectPassiveVoice: () => detectPassiveVoice,
30
+ detectWordyPhrases: () => detectWordyPhrases,
29
31
  diffLines: () => diffLines,
30
32
  diffLinesSimple: () => diffLinesSimple,
31
33
  diffStats: () => diffStats,
@@ -3095,5 +3097,99 @@ function getEmojiByCategory(category) {
3095
3097
  function getEmojiCategories() {
3096
3098
  return Array.from(new Set(EMOJI_TABLE.map((e) => e.category)));
3097
3099
  }
3100
+ var WORDY_PHRASES = [
3101
+ { phrase: "due to the fact that", suggestion: "because" },
3102
+ { phrase: "in spite of the fact that", suggestion: "although" },
3103
+ { phrase: "despite the fact that", suggestion: "although" },
3104
+ { phrase: "in order to", suggestion: "to" },
3105
+ { phrase: "for the purpose of", suggestion: "for" },
3106
+ { phrase: "in the event that", suggestion: "if" },
3107
+ { phrase: "in the near future", suggestion: "soon" },
3108
+ { phrase: "at this point in time", suggestion: "now" },
3109
+ { phrase: "at the present time", suggestion: "now" },
3110
+ { phrase: "on a daily basis", suggestion: "daily" },
3111
+ { phrase: "on a regular basis", suggestion: "regularly" },
3112
+ { phrase: "in a timely manner", suggestion: "promptly" },
3113
+ { phrase: "with regard to", suggestion: "regarding" },
3114
+ { phrase: "with respect to", suggestion: "regarding" },
3115
+ { phrase: "in regards to", suggestion: "regarding" },
3116
+ { phrase: "with the exception of", suggestion: "except" },
3117
+ { phrase: "in close proximity to", suggestion: "near" },
3118
+ { phrase: "take into consideration", suggestion: "consider" },
3119
+ { phrase: "give consideration to", suggestion: "consider" },
3120
+ { phrase: "make a decision", suggestion: "decide" },
3121
+ { phrase: "is able to", suggestion: "can" },
3122
+ { phrase: "are able to", suggestion: "can" },
3123
+ { phrase: "a large number of", suggestion: "many" },
3124
+ { phrase: "a majority of", suggestion: "most" },
3125
+ { phrase: "each and every", suggestion: "each" },
3126
+ { phrase: "first and foremost", suggestion: "first" },
3127
+ { phrase: "last but not least", suggestion: "finally" },
3128
+ { phrase: "null and void", suggestion: "void" },
3129
+ { phrase: "whether or not", suggestion: "whether" },
3130
+ { phrase: "the reason why", suggestion: "the reason" },
3131
+ { phrase: "end result", suggestion: "result" },
3132
+ { phrase: "future plans", suggestion: "plans" },
3133
+ { phrase: "past history", suggestion: "history" },
3134
+ { phrase: "basic fundamentals", suggestion: "fundamentals" },
3135
+ { phrase: "absolutely essential", suggestion: "essential" },
3136
+ { phrase: "it is important to note that", suggestion: "(often removable)" },
3137
+ { phrase: "as a matter of fact", suggestion: "in fact" },
3138
+ { phrase: "in the process of", suggestion: "(often removable)" }
3139
+ ];
3140
+ function _wordyRegex(phrase) {
3141
+ const tokens = phrase.split(/\s+/).map((t) => t.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"));
3142
+ return new RegExp("\\b" + tokens.join("\\s+") + "\\b", "gi");
3143
+ }
3144
+ function detectWordyPhrases(text) {
3145
+ const totalWords = (text.match(/[A-Za-z0-9']+/g) ?? []).length;
3146
+ const matches = [];
3147
+ for (const entry of WORDY_PHRASES) {
3148
+ const re = _wordyRegex(entry.phrase);
3149
+ const indices = [];
3150
+ let m;
3151
+ while ((m = re.exec(text)) !== null) {
3152
+ indices.push(m.index);
3153
+ if (m.index === re.lastIndex) re.lastIndex++;
3154
+ }
3155
+ if (indices.length > 0) {
3156
+ matches.push({ phrase: entry.phrase, suggestion: entry.suggestion, count: indices.length, indices });
3157
+ }
3158
+ }
3159
+ matches.sort((a, b) => b.count - a.count || a.phrase.localeCompare(b.phrase));
3160
+ const totalMatches = matches.reduce((s, m) => s + m.count, 0);
3161
+ const density = totalWords > 0 ? Math.round(totalMatches / totalWords * 1e3) / 10 : 0;
3162
+ return { totalWords, totalMatches, density, matches };
3163
+ }
3164
+ var _OXFORD_CONJ_RE = /(,)?\s+\b(?:and|or)\b\s+/gi;
3165
+ function checkOxfordCommaConsistency(text) {
3166
+ const instances = [];
3167
+ _OXFORD_CONJ_RE.lastIndex = 0;
3168
+ let m;
3169
+ while ((m = _OXFORD_CONJ_RE.exec(text)) !== null) {
3170
+ const matchStart = m.index;
3171
+ const hasCommaBefore = !!m[1];
3172
+ let clauseStart = -1;
3173
+ for (const ch of [".", "!", "?", "\n"]) {
3174
+ const idx = text.lastIndexOf(ch, matchStart - 1);
3175
+ if (idx > clauseStart) clauseStart = idx;
3176
+ }
3177
+ clauseStart += 1;
3178
+ const clause = text.slice(clauseStart, matchStart);
3179
+ const commaCount = (clause.match(/,/g) ?? []).length;
3180
+ if (commaCount < 1) continue;
3181
+ const snippetStart = Math.max(clauseStart, matchStart - 60);
3182
+ const afterConjEnd = _OXFORD_CONJ_RE.lastIndex;
3183
+ const tail = text.slice(afterConjEnd);
3184
+ const boundaryOffset = tail.search(/[.!?\n,]/);
3185
+ const snippetEnd = boundaryOffset === -1 ? Math.min(text.length, afterConjEnd + 40) : afterConjEnd + boundaryOffset;
3186
+ const snippet = text.slice(snippetStart, snippetEnd).trim();
3187
+ instances.push({ snippet, hasOxfordComma: hasCommaBefore, index: matchStart });
3188
+ }
3189
+ const withOxfordComma = instances.filter((i) => i.hasOxfordComma).length;
3190
+ const withoutOxfordComma = instances.length - withOxfordComma;
3191
+ const consistent = withOxfordComma === 0 || withoutOxfordComma === 0;
3192
+ return { totalLists: instances.length, withOxfordComma, withoutOxfordComma, consistent, instances };
3193
+ }
3098
3194
 
3099
- export { CASE_FORMATS, DEFAULT_CONVERT_OPTIONS, EMOJI_TABLE, ESCAPE_MODES, LINE_OPS, MORSE_CODE, addBorder, analyzeKeywordDensity, analyzeSentenceLengths, analyzeText, applyOp, applyOps, calculateStringDistance, centerText, convertAll, convertCase, countWords, csvToHtml, csvToMarkdown, detectDelimiter, detectFillerWords, detectPassiveVoice, diffLines, diffLinesSimple, diffStats, escapeAll, escapeString, extractHeadings, formatReadingTime, generate, generateDiff, generateHtmlTable, generateMarkdownTable, generateParagraphs, generateSentences, generateWords, getAvailableFonts, getEmojiByCategory, getEmojiByChar, getEmojiByShortcode, getEmojiCategories, getMorseForChar, getMorseTiming, htmlToMarkdown, isValidMorse, markdownToHtml, morseToText, numberToOrdinal, numberToRoman, numberToWords, ordinalWords, parseDiff, parseTableData, readabilityScore, renderMarkdown, romanToNumber, scoreReadability, searchEmoji, sentenceCount, slugify, slugifyAll, syllableCount, textToAscii, textToMorse, text_exports, unescapeString, wordFrequency };
3195
+ export { CASE_FORMATS, DEFAULT_CONVERT_OPTIONS, EMOJI_TABLE, ESCAPE_MODES, LINE_OPS, MORSE_CODE, addBorder, analyzeKeywordDensity, analyzeSentenceLengths, analyzeText, applyOp, applyOps, calculateStringDistance, centerText, checkOxfordCommaConsistency, convertAll, convertCase, countWords, csvToHtml, csvToMarkdown, detectDelimiter, detectFillerWords, detectPassiveVoice, detectWordyPhrases, diffLines, diffLinesSimple, diffStats, escapeAll, escapeString, extractHeadings, formatReadingTime, generate, generateDiff, generateHtmlTable, generateMarkdownTable, generateParagraphs, generateSentences, generateWords, getAvailableFonts, getEmojiByCategory, getEmojiByChar, getEmojiByShortcode, getEmojiCategories, getMorseForChar, getMorseTiming, htmlToMarkdown, isValidMorse, markdownToHtml, morseToText, numberToOrdinal, numberToRoman, numberToWords, ordinalWords, parseDiff, parseTableData, readabilityScore, renderMarkdown, romanToNumber, scoreReadability, searchEmoji, sentenceCount, slugify, slugifyAll, syllableCount, textToAscii, textToMorse, text_exports, unescapeString, wordFrequency };
package/dist/index.cjs CHANGED
@@ -2103,6 +2103,7 @@ __export(text_exports, {
2103
2103
  applyOps: () => applyOps,
2104
2104
  calculateStringDistance: () => calculateStringDistance,
2105
2105
  centerText: () => centerText,
2106
+ checkOxfordCommaConsistency: () => checkOxfordCommaConsistency,
2106
2107
  convertAll: () => convertAll,
2107
2108
  convertCase: () => convertCase,
2108
2109
  countWords: () => countWords,
@@ -2111,6 +2112,7 @@ __export(text_exports, {
2111
2112
  detectDelimiter: () => detectDelimiter,
2112
2113
  detectFillerWords: () => detectFillerWords,
2113
2114
  detectPassiveVoice: () => detectPassiveVoice,
2115
+ detectWordyPhrases: () => detectWordyPhrases,
2114
2116
  diffLines: () => diffLines,
2115
2117
  diffLinesSimple: () => diffLinesSimple,
2116
2118
  diffStats: () => diffStats,
@@ -5180,6 +5182,100 @@ function getEmojiByCategory(category) {
5180
5182
  function getEmojiCategories() {
5181
5183
  return Array.from(new Set(EMOJI_TABLE.map((e) => e.category)));
5182
5184
  }
5185
+ var WORDY_PHRASES = [
5186
+ { phrase: "due to the fact that", suggestion: "because" },
5187
+ { phrase: "in spite of the fact that", suggestion: "although" },
5188
+ { phrase: "despite the fact that", suggestion: "although" },
5189
+ { phrase: "in order to", suggestion: "to" },
5190
+ { phrase: "for the purpose of", suggestion: "for" },
5191
+ { phrase: "in the event that", suggestion: "if" },
5192
+ { phrase: "in the near future", suggestion: "soon" },
5193
+ { phrase: "at this point in time", suggestion: "now" },
5194
+ { phrase: "at the present time", suggestion: "now" },
5195
+ { phrase: "on a daily basis", suggestion: "daily" },
5196
+ { phrase: "on a regular basis", suggestion: "regularly" },
5197
+ { phrase: "in a timely manner", suggestion: "promptly" },
5198
+ { phrase: "with regard to", suggestion: "regarding" },
5199
+ { phrase: "with respect to", suggestion: "regarding" },
5200
+ { phrase: "in regards to", suggestion: "regarding" },
5201
+ { phrase: "with the exception of", suggestion: "except" },
5202
+ { phrase: "in close proximity to", suggestion: "near" },
5203
+ { phrase: "take into consideration", suggestion: "consider" },
5204
+ { phrase: "give consideration to", suggestion: "consider" },
5205
+ { phrase: "make a decision", suggestion: "decide" },
5206
+ { phrase: "is able to", suggestion: "can" },
5207
+ { phrase: "are able to", suggestion: "can" },
5208
+ { phrase: "a large number of", suggestion: "many" },
5209
+ { phrase: "a majority of", suggestion: "most" },
5210
+ { phrase: "each and every", suggestion: "each" },
5211
+ { phrase: "first and foremost", suggestion: "first" },
5212
+ { phrase: "last but not least", suggestion: "finally" },
5213
+ { phrase: "null and void", suggestion: "void" },
5214
+ { phrase: "whether or not", suggestion: "whether" },
5215
+ { phrase: "the reason why", suggestion: "the reason" },
5216
+ { phrase: "end result", suggestion: "result" },
5217
+ { phrase: "future plans", suggestion: "plans" },
5218
+ { phrase: "past history", suggestion: "history" },
5219
+ { phrase: "basic fundamentals", suggestion: "fundamentals" },
5220
+ { phrase: "absolutely essential", suggestion: "essential" },
5221
+ { phrase: "it is important to note that", suggestion: "(often removable)" },
5222
+ { phrase: "as a matter of fact", suggestion: "in fact" },
5223
+ { phrase: "in the process of", suggestion: "(often removable)" }
5224
+ ];
5225
+ function _wordyRegex(phrase) {
5226
+ const tokens = phrase.split(/\s+/).map((t) => t.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"));
5227
+ return new RegExp("\\b" + tokens.join("\\s+") + "\\b", "gi");
5228
+ }
5229
+ function detectWordyPhrases(text) {
5230
+ const totalWords = (text.match(/[A-Za-z0-9']+/g) ?? []).length;
5231
+ const matches = [];
5232
+ for (const entry of WORDY_PHRASES) {
5233
+ const re = _wordyRegex(entry.phrase);
5234
+ const indices = [];
5235
+ let m;
5236
+ while ((m = re.exec(text)) !== null) {
5237
+ indices.push(m.index);
5238
+ if (m.index === re.lastIndex) re.lastIndex++;
5239
+ }
5240
+ if (indices.length > 0) {
5241
+ matches.push({ phrase: entry.phrase, suggestion: entry.suggestion, count: indices.length, indices });
5242
+ }
5243
+ }
5244
+ matches.sort((a, b) => b.count - a.count || a.phrase.localeCompare(b.phrase));
5245
+ const totalMatches = matches.reduce((s, m) => s + m.count, 0);
5246
+ const density = totalWords > 0 ? Math.round(totalMatches / totalWords * 1e3) / 10 : 0;
5247
+ return { totalWords, totalMatches, density, matches };
5248
+ }
5249
+ var _OXFORD_CONJ_RE = /(,)?\s+\b(?:and|or)\b\s+/gi;
5250
+ function checkOxfordCommaConsistency(text) {
5251
+ const instances = [];
5252
+ _OXFORD_CONJ_RE.lastIndex = 0;
5253
+ let m;
5254
+ while ((m = _OXFORD_CONJ_RE.exec(text)) !== null) {
5255
+ const matchStart = m.index;
5256
+ const hasCommaBefore = !!m[1];
5257
+ let clauseStart = -1;
5258
+ for (const ch of [".", "!", "?", "\n"]) {
5259
+ const idx = text.lastIndexOf(ch, matchStart - 1);
5260
+ if (idx > clauseStart) clauseStart = idx;
5261
+ }
5262
+ clauseStart += 1;
5263
+ const clause = text.slice(clauseStart, matchStart);
5264
+ const commaCount = (clause.match(/,/g) ?? []).length;
5265
+ if (commaCount < 1) continue;
5266
+ const snippetStart = Math.max(clauseStart, matchStart - 60);
5267
+ const afterConjEnd = _OXFORD_CONJ_RE.lastIndex;
5268
+ const tail = text.slice(afterConjEnd);
5269
+ const boundaryOffset = tail.search(/[.!?\n,]/);
5270
+ const snippetEnd = boundaryOffset === -1 ? Math.min(text.length, afterConjEnd + 40) : afterConjEnd + boundaryOffset;
5271
+ const snippet = text.slice(snippetStart, snippetEnd).trim();
5272
+ instances.push({ snippet, hasOxfordComma: hasCommaBefore, index: matchStart });
5273
+ }
5274
+ const withOxfordComma = instances.filter((i) => i.hasOxfordComma).length;
5275
+ const withoutOxfordComma = instances.length - withOxfordComma;
5276
+ const consistent = withOxfordComma === 0 || withoutOxfordComma === 0;
5277
+ return { totalLists: instances.length, withOxfordComma, withoutOxfordComma, consistent, instances };
5278
+ }
5183
5279
 
5184
5280
  // src/tools/data.ts
5185
5281
  var data_exports = {};
package/dist/index.d.cts CHANGED
@@ -1,7 +1,7 @@
1
1
  export { j as json } from './json-CaiYsGDQ.cjs';
2
2
  export { e as encoding } from './encoding-Dk3wpmb3.cjs';
3
3
  export { h as hashing } from './hashing-CJjlvqS_.cjs';
4
- export { t as text } from './text-DWUcY8H1.cjs';
4
+ export { t as text } from './text-CNn3whZA.cjs';
5
5
  export { d as data } from './data-26TALa9U.cjs';
6
6
  export { g as generators } from './generators-DAXXrMvG.cjs';
7
7
  export { t as time } from './time-KqJjdqII.cjs';
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export { j as json } from './json-CaiYsGDQ.js';
2
2
  export { e as encoding } from './encoding-Dk3wpmb3.js';
3
3
  export { h as hashing } from './hashing-CJjlvqS_.js';
4
- export { t as text } from './text-DWUcY8H1.js';
4
+ export { t as text } from './text-CNn3whZA.js';
5
5
  export { d as data } from './data-26TALa9U.js';
6
6
  export { g as generators } from './generators-DAXXrMvG.js';
7
7
  export { t as time } from './time-KqJjdqII.js';
package/dist/index.js CHANGED
@@ -10,7 +10,7 @@ export { ai_agent_exports as ai_agent } from './chunk-EKIXOA7B.js';
10
10
  export { json_exports as json } from './chunk-34C6GXCC.js';
11
11
  export { encoding_exports as encoding } from './chunk-DOWQZUTP.js';
12
12
  export { hashing_exports as hashing } from './chunk-PET2CGTH.js';
13
- export { text_exports as text } from './chunk-P7TXG7CI.js';
13
+ export { text_exports as text } from './chunk-QVOK3BXM.js';
14
14
  export { data_exports as data } from './chunk-HJVSH7FQ.js';
15
15
  export { generators_exports as generators } from './chunk-422ICOZX.js';
16
16
  export { time_exports as time } from './chunk-IEPWZERQ.js';
@@ -409,6 +409,53 @@ declare function getEmojiByChar(char: string): EmojiEntry | undefined;
409
409
  declare function getEmojiByCategory(category: string): EmojiEntry[];
410
410
  /** All distinct category names present in the table, in table order. */
411
411
  declare function getEmojiCategories(): string[];
412
+ interface WordyPhraseMatch {
413
+ phrase: string;
414
+ suggestion: string;
415
+ count: number;
416
+ indices: number[];
417
+ }
418
+ interface WordyPhraseResult {
419
+ totalWords: number;
420
+ totalMatches: number;
421
+ /** Matches per 100 words, to one decimal place. */
422
+ density: number;
423
+ matches: WordyPhraseMatch[];
424
+ }
425
+ /**
426
+ * Scan text against a curated table of wordy/redundant phrases ("due to the
427
+ * fact that", "in order to", "at this point in time") and flag each
428
+ * occurrence with a suggested concise replacement and character offsets.
429
+ * Dictionary-based heuristic, same shape as detectFillerWords: a flagged
430
+ * phrase is a candidate to tighten, not always wrong in context.
431
+ */
432
+ declare function detectWordyPhrases(text: string): WordyPhraseResult;
433
+ interface OxfordCommaInstance {
434
+ /** A short readable window of text around the matched "and"/"or". */
435
+ snippet: string;
436
+ hasOxfordComma: boolean;
437
+ index: number;
438
+ }
439
+ interface OxfordCommaResult {
440
+ totalLists: number;
441
+ withOxfordComma: number;
442
+ withoutOxfordComma: number;
443
+ /** True when every detected list uses the same Oxford-comma style, or when no lists were found. */
444
+ consistent: boolean;
445
+ instances: OxfordCommaInstance[];
446
+ }
447
+ /**
448
+ * Scan a document for comma-before-and/or usage in three-or-more-item lists
449
+ * and flag inconsistency: some lists using the Oxford (serial) comma while
450
+ * others in the same document don't. For each "and"/"or" conjunction found,
451
+ * it counts the commas since the start of the enclosing sentence; one or
452
+ * more prior commas means the conjunction is closing a list of at least
453
+ * three items, which is where the Oxford comma question applies. This is a
454
+ * heuristic over punctuation, not a grammar parser, so an unrelated comma
455
+ * earlier in the same sentence (e.g. an introductory clause) can occasionally
456
+ * be counted as part of a list.
457
+ */
458
+ declare function checkOxfordCommaConsistency(text: string): OxfordCommaResult;
412
459
 
413
460
  type text_AsciiFont = AsciiFont;
414
461
  type text_AsciiOptions = AsciiOptions;
@@ -439,6 +486,8 @@ type text_LoremUnit = LoremUnit;
439
486
  declare const text_MORSE_CODE: typeof MORSE_CODE;
440
487
  type text_MarkdownResult = MarkdownResult;
441
488
  type text_MorseOptions = MorseOptions;
489
+ type text_OxfordCommaInstance = OxfordCommaInstance;
490
+ type text_OxfordCommaResult = OxfordCommaResult;
442
491
  type text_ParsedDiff = ParsedDiff;
443
492
  type text_ParsedTable = ParsedTable;
444
493
  type text_PassiveVoiceMatch = PassiveVoiceMatch;
@@ -454,6 +503,8 @@ type text_StringDistanceResult = StringDistanceResult;
454
503
  type text_TableOptions = TableOptions;
455
504
  type text_TextAnalysis = TextAnalysis;
456
505
  type text_WordCountResult = WordCountResult;
506
+ type text_WordyPhraseMatch = WordyPhraseMatch;
507
+ type text_WordyPhraseResult = WordyPhraseResult;
457
508
  declare const text_addBorder: typeof addBorder;
458
509
  declare const text_analyzeKeywordDensity: typeof analyzeKeywordDensity;
459
510
  declare const text_analyzeSentenceLengths: typeof analyzeSentenceLengths;
@@ -462,6 +513,7 @@ declare const text_applyOp: typeof applyOp;
462
513
  declare const text_applyOps: typeof applyOps;
463
514
  declare const text_calculateStringDistance: typeof calculateStringDistance;
464
515
  declare const text_centerText: typeof centerText;
516
+ declare const text_checkOxfordCommaConsistency: typeof checkOxfordCommaConsistency;
465
517
  declare const text_convertAll: typeof convertAll;
466
518
  declare const text_convertCase: typeof convertCase;
467
519
  declare const text_countWords: typeof countWords;
@@ -470,6 +522,7 @@ declare const text_csvToMarkdown: typeof csvToMarkdown;
470
522
  declare const text_detectDelimiter: typeof detectDelimiter;
471
523
  declare const text_detectFillerWords: typeof detectFillerWords;
472
524
  declare const text_detectPassiveVoice: typeof detectPassiveVoice;
525
+ declare const text_detectWordyPhrases: typeof detectWordyPhrases;
473
526
  declare const text_diffLines: typeof diffLines;
474
527
  declare const text_diffLinesSimple: typeof diffLinesSimple;
475
528
  declare const text_diffStats: typeof diffStats;
@@ -515,7 +568,7 @@ declare const text_textToMorse: typeof textToMorse;
515
568
  declare const text_unescapeString: typeof unescapeString;
516
569
  declare const text_wordFrequency: typeof wordFrequency;
517
570
  declare namespace text {
518
- export { type text_AsciiFont as AsciiFont, type text_AsciiOptions as AsciiOptions, text_CASE_FORMATS as CASE_FORMATS, type text_CaseFormat as CaseFormat, type text_ConvertOptions as ConvertOptions, text_DEFAULT_CONVERT_OPTIONS as DEFAULT_CONVERT_OPTIONS, type text_DiffFile as DiffFile, type text_DiffHunk as DiffHunk, type text_DiffLine as DiffLine, type text_DiffResult as DiffResult, type text_DiffType as DiffType, type text_DiffViewerLine as DiffViewerLine, text_EMOJI_TABLE as EMOJI_TABLE, text_ESCAPE_MODES as ESCAPE_MODES, type text_EmojiEntry as EmojiEntry, type text_EscapeMode as EscapeMode, type text_FillerCategory as FillerCategory, type text_FillerMatch as FillerMatch, type text_FillerWordResult as FillerWordResult, type text_KeywordDensityEntry as KeywordDensityEntry, type text_KeywordDensityOptions as KeywordDensityOptions, type text_KeywordDensityResult as KeywordDensityResult, text_LINE_OPS as LINE_OPS, type text_LineOp as LineOp, type text_LineType as LineType, type text_LoremUnit as LoremUnit, text_MORSE_CODE as MORSE_CODE, type text_MarkdownResult as MarkdownResult, type text_MorseOptions as MorseOptions, type text_ParsedDiff as ParsedDiff, type text_ParsedTable as ParsedTable, type text_PassiveVoiceMatch as PassiveVoiceMatch, type text_PassiveVoiceResult as PassiveVoiceResult, type text_PassiveVoiceSentence as PassiveVoiceSentence, type text_ReadabilityResult as ReadabilityResult, type text_ReadabilityScore as ReadabilityScore, type text_SentenceLengthBucket as SentenceLengthBucket, type text_SentenceLengthDistribution as SentenceLengthDistribution, type text_SlugSeparator as SlugSeparator, type text_StringDistanceMode as StringDistanceMode, type text_StringDistanceResult as StringDistanceResult, type text_TableOptions as TableOptions, type text_TextAnalysis as TextAnalysis, type text_WordCountResult as WordCountResult, text_addBorder as addBorder, text_analyzeKeywordDensity as analyzeKeywordDensity, text_analyzeSentenceLengths as analyzeSentenceLengths, text_analyzeText as analyzeText, text_applyOp as applyOp, text_applyOps as applyOps, text_calculateStringDistance as calculateStringDistance, text_centerText as centerText, text_convertAll as convertAll, text_convertCase as convertCase, text_countWords as countWords, text_csvToHtml as csvToHtml, text_csvToMarkdown as csvToMarkdown, text_detectDelimiter as detectDelimiter, text_detectFillerWords as detectFillerWords, text_detectPassiveVoice as detectPassiveVoice, text_diffLines as diffLines, text_diffLinesSimple as diffLinesSimple, text_diffStats as diffStats, text_escapeAll as escapeAll, text_escapeString as escapeString, text_extractHeadings as extractHeadings, text_formatReadingTime as formatReadingTime, text_generate as generate, text_generateDiff as generateDiff, text_generateHtmlTable as generateHtmlTable, text_generateMarkdownTable as generateMarkdownTable, text_generateParagraphs as generateParagraphs, text_generateSentences as generateSentences, text_generateWords as generateWords, text_getAvailableFonts as getAvailableFonts, text_getEmojiByCategory as getEmojiByCategory, text_getEmojiByChar as getEmojiByChar, text_getEmojiByShortcode as getEmojiByShortcode, text_getEmojiCategories as getEmojiCategories, text_getMorseForChar as getMorseForChar, text_getMorseTiming as getMorseTiming, text_htmlToMarkdown as htmlToMarkdown, text_isValidMorse as isValidMorse, text_markdownToHtml as markdownToHtml, text_morseToText as morseToText, text_numberToOrdinal as numberToOrdinal, text_numberToRoman as numberToRoman, text_numberToWords as numberToWords, text_ordinalWords as ordinalWords, text_parseDiff as parseDiff, text_parseTableData as parseTableData, text_readabilityScore as readabilityScore, text_renderMarkdown as renderMarkdown, text_romanToNumber as romanToNumber, text_scoreReadability as scoreReadability, text_searchEmoji as searchEmoji, text_sentenceCount as sentenceCount, text_slugify as slugify, text_slugifyAll as slugifyAll, text_syllableCount as syllableCount, text_textToAscii as textToAscii, text_textToMorse as textToMorse, text_unescapeString as unescapeString, text_wordFrequency as wordFrequency };
571
+ export { type text_AsciiFont as AsciiFont, type text_AsciiOptions as AsciiOptions, text_CASE_FORMATS as CASE_FORMATS, type text_CaseFormat as CaseFormat, type text_ConvertOptions as ConvertOptions, text_DEFAULT_CONVERT_OPTIONS as DEFAULT_CONVERT_OPTIONS, type text_DiffFile as DiffFile, type text_DiffHunk as DiffHunk, type text_DiffLine as DiffLine, type text_DiffResult as DiffResult, type text_DiffType as DiffType, type text_DiffViewerLine as DiffViewerLine, text_EMOJI_TABLE as EMOJI_TABLE, text_ESCAPE_MODES as ESCAPE_MODES, type text_EmojiEntry as EmojiEntry, type text_EscapeMode as EscapeMode, type text_FillerCategory as FillerCategory, type text_FillerMatch as FillerMatch, type text_FillerWordResult as FillerWordResult, type text_KeywordDensityEntry as KeywordDensityEntry, type text_KeywordDensityOptions as KeywordDensityOptions, type text_KeywordDensityResult as KeywordDensityResult, text_LINE_OPS as LINE_OPS, type text_LineOp as LineOp, type text_LineType as LineType, type text_LoremUnit as LoremUnit, text_MORSE_CODE as MORSE_CODE, type text_MarkdownResult as MarkdownResult, type text_MorseOptions as MorseOptions, type text_OxfordCommaInstance as OxfordCommaInstance, type text_OxfordCommaResult as OxfordCommaResult, type text_ParsedDiff as ParsedDiff, type text_ParsedTable as ParsedTable, type text_PassiveVoiceMatch as PassiveVoiceMatch, type text_PassiveVoiceResult as PassiveVoiceResult, type text_PassiveVoiceSentence as PassiveVoiceSentence, type text_ReadabilityResult as ReadabilityResult, type text_ReadabilityScore as ReadabilityScore, type text_SentenceLengthBucket as SentenceLengthBucket, type text_SentenceLengthDistribution as SentenceLengthDistribution, type text_SlugSeparator as SlugSeparator, type text_StringDistanceMode as StringDistanceMode, type text_StringDistanceResult as StringDistanceResult, type text_TableOptions as TableOptions, type text_TextAnalysis as TextAnalysis, type text_WordCountResult as WordCountResult, type text_WordyPhraseMatch as WordyPhraseMatch, type text_WordyPhraseResult as WordyPhraseResult, text_addBorder as addBorder, text_analyzeKeywordDensity as analyzeKeywordDensity, text_analyzeSentenceLengths as analyzeSentenceLengths, text_analyzeText as analyzeText, text_applyOp as applyOp, text_applyOps as applyOps, text_calculateStringDistance as calculateStringDistance, text_centerText as centerText, text_checkOxfordCommaConsistency as checkOxfordCommaConsistency, text_convertAll as convertAll, text_convertCase as convertCase, text_countWords as countWords, text_csvToHtml as csvToHtml, text_csvToMarkdown as csvToMarkdown, text_detectDelimiter as detectDelimiter, text_detectFillerWords as detectFillerWords, text_detectPassiveVoice as detectPassiveVoice, text_detectWordyPhrases as detectWordyPhrases, text_diffLines as diffLines, text_diffLinesSimple as diffLinesSimple, text_diffStats as diffStats, text_escapeAll as escapeAll, text_escapeString as escapeString, text_extractHeadings as extractHeadings, text_formatReadingTime as formatReadingTime, text_generate as generate, text_generateDiff as generateDiff, text_generateHtmlTable as generateHtmlTable, text_generateMarkdownTable as generateMarkdownTable, text_generateParagraphs as generateParagraphs, text_generateSentences as generateSentences, text_generateWords as generateWords, text_getAvailableFonts as getAvailableFonts, text_getEmojiByCategory as getEmojiByCategory, text_getEmojiByChar as getEmojiByChar, text_getEmojiByShortcode as getEmojiByShortcode, text_getEmojiCategories as getEmojiCategories, text_getMorseForChar as getMorseForChar, text_getMorseTiming as getMorseTiming, text_htmlToMarkdown as htmlToMarkdown, text_isValidMorse as isValidMorse, text_markdownToHtml as markdownToHtml, text_morseToText as morseToText, text_numberToOrdinal as numberToOrdinal, text_numberToRoman as numberToRoman, text_numberToWords as numberToWords, text_ordinalWords as ordinalWords, text_parseDiff as parseDiff, text_parseTableData as parseTableData, text_readabilityScore as readabilityScore, text_renderMarkdown as renderMarkdown, text_romanToNumber as romanToNumber, text_scoreReadability as scoreReadability, text_searchEmoji as searchEmoji, text_sentenceCount as sentenceCount, text_slugify as slugify, text_slugifyAll as slugifyAll, text_syllableCount as syllableCount, text_textToAscii as textToAscii, text_textToMorse as textToMorse, text_unescapeString as unescapeString, text_wordFrequency as wordFrequency };
519
572
  }
520
573
 
521
- export { convertAll as $, type AsciiFont as A, type ReadabilityScore as B, CASE_FORMATS as C, DEFAULT_CONVERT_OPTIONS as D, EMOJI_TABLE as E, type FillerCategory as F, type SentenceLengthDistribution as G, type SlugSeparator as H, type StringDistanceMode as I, type StringDistanceResult as J, type KeywordDensityEntry as K, LINE_OPS as L, MORSE_CODE as M, type TextAnalysis as N, addBorder as O, type ParsedDiff as P, analyzeKeywordDensity as Q, type ReadabilityResult as R, type SentenceLengthBucket as S, type TableOptions as T, analyzeSentenceLengths as U, analyzeText as V, type WordCountResult as W, applyOp as X, applyOps as Y, calculateStringDistance as Z, centerText as _, type AsciiOptions as a, convertCase as a0, countWords as a1, csvToHtml as a2, csvToMarkdown as a3, detectDelimiter as a4, detectFillerWords as a5, detectPassiveVoice as a6, diffLines as a7, diffLinesSimple as a8, diffStats as a9, parseDiff as aA, parseTableData as aB, readabilityScore as aC, renderMarkdown as aD, romanToNumber as aE, scoreReadability as aF, searchEmoji as aG, sentenceCount as aH, slugify as aI, slugifyAll as aJ, syllableCount as aK, textToAscii as aL, textToMorse as aM, unescapeString as aN, wordFrequency as aO, escapeAll as aa, escapeString as ab, extractHeadings as ac, formatReadingTime as ad, generate as ae, generateDiff as af, generateHtmlTable as ag, generateMarkdownTable as ah, generateParagraphs as ai, generateSentences as aj, generateWords as ak, getAvailableFonts as al, getEmojiByCategory as am, getEmojiByChar as an, getEmojiByShortcode as ao, getEmojiCategories as ap, getMorseForChar as aq, getMorseTiming as ar, htmlToMarkdown as as, isValidMorse as at, markdownToHtml as au, morseToText as av, numberToOrdinal as aw, numberToRoman as ax, numberToWords as ay, ordinalWords as az, type CaseFormat as b, type ConvertOptions as c, type DiffFile as d, type DiffHunk as e, type DiffLine as f, type DiffResult as g, type DiffType as h, type DiffViewerLine as i, ESCAPE_MODES as j, type EmojiEntry as k, type EscapeMode as l, type FillerMatch as m, type FillerWordResult as n, type KeywordDensityOptions as o, type KeywordDensityResult as p, type LineOp as q, type LineType as r, type LoremUnit as s, text as t, type MarkdownResult as u, type MorseOptions as v, type ParsedTable as w, type PassiveVoiceMatch as x, type PassiveVoiceResult as y, type PassiveVoiceSentence as z };
574
+ export { applyOp as $, type AsciiFont as A, type PassiveVoiceSentence as B, CASE_FORMATS as C, DEFAULT_CONVERT_OPTIONS as D, EMOJI_TABLE as E, type FillerCategory as F, type ReadabilityScore as G, type SentenceLengthDistribution as H, type SlugSeparator as I, type StringDistanceMode as J, type KeywordDensityEntry as K, LINE_OPS as L, MORSE_CODE as M, type StringDistanceResult as N, type OxfordCommaInstance as O, type ParsedDiff as P, type TextAnalysis as Q, type ReadabilityResult as R, type SentenceLengthBucket as S, type TableOptions as T, type WordyPhraseMatch as U, type WordyPhraseResult as V, type WordCountResult as W, addBorder as X, analyzeKeywordDensity as Y, analyzeSentenceLengths as Z, analyzeText as _, type AsciiOptions as a, applyOps as a0, calculateStringDistance as a1, centerText as a2, checkOxfordCommaConsistency as a3, convertAll as a4, convertCase as a5, countWords as a6, csvToHtml as a7, csvToMarkdown as a8, detectDelimiter as a9, markdownToHtml as aA, morseToText as aB, numberToOrdinal as aC, numberToRoman as aD, numberToWords as aE, ordinalWords as aF, parseDiff as aG, parseTableData as aH, readabilityScore as aI, renderMarkdown as aJ, romanToNumber as aK, scoreReadability as aL, searchEmoji as aM, sentenceCount as aN, slugify as aO, slugifyAll as aP, syllableCount as aQ, textToAscii as aR, textToMorse as aS, unescapeString as aT, wordFrequency as aU, detectFillerWords as aa, detectPassiveVoice as ab, detectWordyPhrases as ac, diffLines as ad, diffLinesSimple as ae, diffStats as af, escapeAll as ag, escapeString as ah, extractHeadings as ai, formatReadingTime as aj, generate as ak, generateDiff as al, generateHtmlTable as am, generateMarkdownTable as an, generateParagraphs as ao, generateSentences as ap, generateWords as aq, getAvailableFonts as ar, getEmojiByCategory as as, getEmojiByChar as at, getEmojiByShortcode as au, getEmojiCategories as av, getMorseForChar as aw, getMorseTiming as ax, htmlToMarkdown as ay, isValidMorse as az, type CaseFormat as b, type ConvertOptions as c, type DiffFile as d, type DiffHunk as e, type DiffLine as f, type DiffResult as g, type DiffType as h, type DiffViewerLine as i, ESCAPE_MODES as j, type EmojiEntry as k, type EscapeMode as l, type FillerMatch as m, type FillerWordResult as n, type KeywordDensityOptions as o, type KeywordDensityResult as p, type LineOp as q, type LineType as r, type LoremUnit as s, text as t, type MarkdownResult as u, type MorseOptions as v, type OxfordCommaResult as w, type ParsedTable as x, type PassiveVoiceMatch as y, type PassiveVoiceResult as z };
@@ -409,6 +409,53 @@ declare function getEmojiByChar(char: string): EmojiEntry | undefined;
409
409
  declare function getEmojiByCategory(category: string): EmojiEntry[];
410
410
  /** All distinct category names present in the table, in table order. */
411
411
  declare function getEmojiCategories(): string[];
412
+ interface WordyPhraseMatch {
413
+ phrase: string;
414
+ suggestion: string;
415
+ count: number;
416
+ indices: number[];
417
+ }
418
+ interface WordyPhraseResult {
419
+ totalWords: number;
420
+ totalMatches: number;
421
+ /** Matches per 100 words, to one decimal place. */
422
+ density: number;
423
+ matches: WordyPhraseMatch[];
424
+ }
425
+ /**
426
+ * Scan text against a curated table of wordy/redundant phrases ("due to the
427
+ * fact that", "in order to", "at this point in time") and flag each
428
+ * occurrence with a suggested concise replacement and character offsets.
429
+ * Dictionary-based heuristic, same shape as detectFillerWords: a flagged
430
+ * phrase is a candidate to tighten, not always wrong in context.
431
+ */
432
+ declare function detectWordyPhrases(text: string): WordyPhraseResult;
433
+ interface OxfordCommaInstance {
434
+ /** A short readable window of text around the matched "and"/"or". */
435
+ snippet: string;
436
+ hasOxfordComma: boolean;
437
+ index: number;
438
+ }
439
+ interface OxfordCommaResult {
440
+ totalLists: number;
441
+ withOxfordComma: number;
442
+ withoutOxfordComma: number;
443
+ /** True when every detected list uses the same Oxford-comma style, or when no lists were found. */
444
+ consistent: boolean;
445
+ instances: OxfordCommaInstance[];
446
+ }
447
+ /**
448
+ * Scan a document for comma-before-and/or usage in three-or-more-item lists
449
+ * and flag inconsistency: some lists using the Oxford (serial) comma while
450
+ * others in the same document don't. For each "and"/"or" conjunction found,
451
+ * it counts the commas since the start of the enclosing sentence; one or
452
+ * more prior commas means the conjunction is closing a list of at least
453
+ * three items, which is where the Oxford comma question applies. This is a
454
+ * heuristic over punctuation, not a grammar parser, so an unrelated comma
455
+ * earlier in the same sentence (e.g. an introductory clause) can occasionally
456
+ * be counted as part of a list.
457
+ */
458
+ declare function checkOxfordCommaConsistency(text: string): OxfordCommaResult;
412
459
 
413
460
  type text_AsciiFont = AsciiFont;
414
461
  type text_AsciiOptions = AsciiOptions;
@@ -439,6 +486,8 @@ type text_LoremUnit = LoremUnit;
439
486
  declare const text_MORSE_CODE: typeof MORSE_CODE;
440
487
  type text_MarkdownResult = MarkdownResult;
441
488
  type text_MorseOptions = MorseOptions;
489
+ type text_OxfordCommaInstance = OxfordCommaInstance;
490
+ type text_OxfordCommaResult = OxfordCommaResult;
442
491
  type text_ParsedDiff = ParsedDiff;
443
492
  type text_ParsedTable = ParsedTable;
444
493
  type text_PassiveVoiceMatch = PassiveVoiceMatch;
@@ -454,6 +503,8 @@ type text_StringDistanceResult = StringDistanceResult;
454
503
  type text_TableOptions = TableOptions;
455
504
  type text_TextAnalysis = TextAnalysis;
456
505
  type text_WordCountResult = WordCountResult;
506
+ type text_WordyPhraseMatch = WordyPhraseMatch;
507
+ type text_WordyPhraseResult = WordyPhraseResult;
457
508
  declare const text_addBorder: typeof addBorder;
458
509
  declare const text_analyzeKeywordDensity: typeof analyzeKeywordDensity;
459
510
  declare const text_analyzeSentenceLengths: typeof analyzeSentenceLengths;
@@ -462,6 +513,7 @@ declare const text_applyOp: typeof applyOp;
462
513
  declare const text_applyOps: typeof applyOps;
463
514
  declare const text_calculateStringDistance: typeof calculateStringDistance;
464
515
  declare const text_centerText: typeof centerText;
516
+ declare const text_checkOxfordCommaConsistency: typeof checkOxfordCommaConsistency;
465
517
  declare const text_convertAll: typeof convertAll;
466
518
  declare const text_convertCase: typeof convertCase;
467
519
  declare const text_countWords: typeof countWords;
@@ -470,6 +522,7 @@ declare const text_csvToMarkdown: typeof csvToMarkdown;
470
522
  declare const text_detectDelimiter: typeof detectDelimiter;
471
523
  declare const text_detectFillerWords: typeof detectFillerWords;
472
524
  declare const text_detectPassiveVoice: typeof detectPassiveVoice;
525
+ declare const text_detectWordyPhrases: typeof detectWordyPhrases;
473
526
  declare const text_diffLines: typeof diffLines;
474
527
  declare const text_diffLinesSimple: typeof diffLinesSimple;
475
528
  declare const text_diffStats: typeof diffStats;
@@ -515,7 +568,7 @@ declare const text_textToMorse: typeof textToMorse;
515
568
  declare const text_unescapeString: typeof unescapeString;
516
569
  declare const text_wordFrequency: typeof wordFrequency;
517
570
  declare namespace text {
518
- export { type text_AsciiFont as AsciiFont, type text_AsciiOptions as AsciiOptions, text_CASE_FORMATS as CASE_FORMATS, type text_CaseFormat as CaseFormat, type text_ConvertOptions as ConvertOptions, text_DEFAULT_CONVERT_OPTIONS as DEFAULT_CONVERT_OPTIONS, type text_DiffFile as DiffFile, type text_DiffHunk as DiffHunk, type text_DiffLine as DiffLine, type text_DiffResult as DiffResult, type text_DiffType as DiffType, type text_DiffViewerLine as DiffViewerLine, text_EMOJI_TABLE as EMOJI_TABLE, text_ESCAPE_MODES as ESCAPE_MODES, type text_EmojiEntry as EmojiEntry, type text_EscapeMode as EscapeMode, type text_FillerCategory as FillerCategory, type text_FillerMatch as FillerMatch, type text_FillerWordResult as FillerWordResult, type text_KeywordDensityEntry as KeywordDensityEntry, type text_KeywordDensityOptions as KeywordDensityOptions, type text_KeywordDensityResult as KeywordDensityResult, text_LINE_OPS as LINE_OPS, type text_LineOp as LineOp, type text_LineType as LineType, type text_LoremUnit as LoremUnit, text_MORSE_CODE as MORSE_CODE, type text_MarkdownResult as MarkdownResult, type text_MorseOptions as MorseOptions, type text_ParsedDiff as ParsedDiff, type text_ParsedTable as ParsedTable, type text_PassiveVoiceMatch as PassiveVoiceMatch, type text_PassiveVoiceResult as PassiveVoiceResult, type text_PassiveVoiceSentence as PassiveVoiceSentence, type text_ReadabilityResult as ReadabilityResult, type text_ReadabilityScore as ReadabilityScore, type text_SentenceLengthBucket as SentenceLengthBucket, type text_SentenceLengthDistribution as SentenceLengthDistribution, type text_SlugSeparator as SlugSeparator, type text_StringDistanceMode as StringDistanceMode, type text_StringDistanceResult as StringDistanceResult, type text_TableOptions as TableOptions, type text_TextAnalysis as TextAnalysis, type text_WordCountResult as WordCountResult, text_addBorder as addBorder, text_analyzeKeywordDensity as analyzeKeywordDensity, text_analyzeSentenceLengths as analyzeSentenceLengths, text_analyzeText as analyzeText, text_applyOp as applyOp, text_applyOps as applyOps, text_calculateStringDistance as calculateStringDistance, text_centerText as centerText, text_convertAll as convertAll, text_convertCase as convertCase, text_countWords as countWords, text_csvToHtml as csvToHtml, text_csvToMarkdown as csvToMarkdown, text_detectDelimiter as detectDelimiter, text_detectFillerWords as detectFillerWords, text_detectPassiveVoice as detectPassiveVoice, text_diffLines as diffLines, text_diffLinesSimple as diffLinesSimple, text_diffStats as diffStats, text_escapeAll as escapeAll, text_escapeString as escapeString, text_extractHeadings as extractHeadings, text_formatReadingTime as formatReadingTime, text_generate as generate, text_generateDiff as generateDiff, text_generateHtmlTable as generateHtmlTable, text_generateMarkdownTable as generateMarkdownTable, text_generateParagraphs as generateParagraphs, text_generateSentences as generateSentences, text_generateWords as generateWords, text_getAvailableFonts as getAvailableFonts, text_getEmojiByCategory as getEmojiByCategory, text_getEmojiByChar as getEmojiByChar, text_getEmojiByShortcode as getEmojiByShortcode, text_getEmojiCategories as getEmojiCategories, text_getMorseForChar as getMorseForChar, text_getMorseTiming as getMorseTiming, text_htmlToMarkdown as htmlToMarkdown, text_isValidMorse as isValidMorse, text_markdownToHtml as markdownToHtml, text_morseToText as morseToText, text_numberToOrdinal as numberToOrdinal, text_numberToRoman as numberToRoman, text_numberToWords as numberToWords, text_ordinalWords as ordinalWords, text_parseDiff as parseDiff, text_parseTableData as parseTableData, text_readabilityScore as readabilityScore, text_renderMarkdown as renderMarkdown, text_romanToNumber as romanToNumber, text_scoreReadability as scoreReadability, text_searchEmoji as searchEmoji, text_sentenceCount as sentenceCount, text_slugify as slugify, text_slugifyAll as slugifyAll, text_syllableCount as syllableCount, text_textToAscii as textToAscii, text_textToMorse as textToMorse, text_unescapeString as unescapeString, text_wordFrequency as wordFrequency };
571
+ export { type text_AsciiFont as AsciiFont, type text_AsciiOptions as AsciiOptions, text_CASE_FORMATS as CASE_FORMATS, type text_CaseFormat as CaseFormat, type text_ConvertOptions as ConvertOptions, text_DEFAULT_CONVERT_OPTIONS as DEFAULT_CONVERT_OPTIONS, type text_DiffFile as DiffFile, type text_DiffHunk as DiffHunk, type text_DiffLine as DiffLine, type text_DiffResult as DiffResult, type text_DiffType as DiffType, type text_DiffViewerLine as DiffViewerLine, text_EMOJI_TABLE as EMOJI_TABLE, text_ESCAPE_MODES as ESCAPE_MODES, type text_EmojiEntry as EmojiEntry, type text_EscapeMode as EscapeMode, type text_FillerCategory as FillerCategory, type text_FillerMatch as FillerMatch, type text_FillerWordResult as FillerWordResult, type text_KeywordDensityEntry as KeywordDensityEntry, type text_KeywordDensityOptions as KeywordDensityOptions, type text_KeywordDensityResult as KeywordDensityResult, text_LINE_OPS as LINE_OPS, type text_LineOp as LineOp, type text_LineType as LineType, type text_LoremUnit as LoremUnit, text_MORSE_CODE as MORSE_CODE, type text_MarkdownResult as MarkdownResult, type text_MorseOptions as MorseOptions, type text_OxfordCommaInstance as OxfordCommaInstance, type text_OxfordCommaResult as OxfordCommaResult, type text_ParsedDiff as ParsedDiff, type text_ParsedTable as ParsedTable, type text_PassiveVoiceMatch as PassiveVoiceMatch, type text_PassiveVoiceResult as PassiveVoiceResult, type text_PassiveVoiceSentence as PassiveVoiceSentence, type text_ReadabilityResult as ReadabilityResult, type text_ReadabilityScore as ReadabilityScore, type text_SentenceLengthBucket as SentenceLengthBucket, type text_SentenceLengthDistribution as SentenceLengthDistribution, type text_SlugSeparator as SlugSeparator, type text_StringDistanceMode as StringDistanceMode, type text_StringDistanceResult as StringDistanceResult, type text_TableOptions as TableOptions, type text_TextAnalysis as TextAnalysis, type text_WordCountResult as WordCountResult, type text_WordyPhraseMatch as WordyPhraseMatch, type text_WordyPhraseResult as WordyPhraseResult, text_addBorder as addBorder, text_analyzeKeywordDensity as analyzeKeywordDensity, text_analyzeSentenceLengths as analyzeSentenceLengths, text_analyzeText as analyzeText, text_applyOp as applyOp, text_applyOps as applyOps, text_calculateStringDistance as calculateStringDistance, text_centerText as centerText, text_checkOxfordCommaConsistency as checkOxfordCommaConsistency, text_convertAll as convertAll, text_convertCase as convertCase, text_countWords as countWords, text_csvToHtml as csvToHtml, text_csvToMarkdown as csvToMarkdown, text_detectDelimiter as detectDelimiter, text_detectFillerWords as detectFillerWords, text_detectPassiveVoice as detectPassiveVoice, text_detectWordyPhrases as detectWordyPhrases, text_diffLines as diffLines, text_diffLinesSimple as diffLinesSimple, text_diffStats as diffStats, text_escapeAll as escapeAll, text_escapeString as escapeString, text_extractHeadings as extractHeadings, text_formatReadingTime as formatReadingTime, text_generate as generate, text_generateDiff as generateDiff, text_generateHtmlTable as generateHtmlTable, text_generateMarkdownTable as generateMarkdownTable, text_generateParagraphs as generateParagraphs, text_generateSentences as generateSentences, text_generateWords as generateWords, text_getAvailableFonts as getAvailableFonts, text_getEmojiByCategory as getEmojiByCategory, text_getEmojiByChar as getEmojiByChar, text_getEmojiByShortcode as getEmojiByShortcode, text_getEmojiCategories as getEmojiCategories, text_getMorseForChar as getMorseForChar, text_getMorseTiming as getMorseTiming, text_htmlToMarkdown as htmlToMarkdown, text_isValidMorse as isValidMorse, text_markdownToHtml as markdownToHtml, text_morseToText as morseToText, text_numberToOrdinal as numberToOrdinal, text_numberToRoman as numberToRoman, text_numberToWords as numberToWords, text_ordinalWords as ordinalWords, text_parseDiff as parseDiff, text_parseTableData as parseTableData, text_readabilityScore as readabilityScore, text_renderMarkdown as renderMarkdown, text_romanToNumber as romanToNumber, text_scoreReadability as scoreReadability, text_searchEmoji as searchEmoji, text_sentenceCount as sentenceCount, text_slugify as slugify, text_slugifyAll as slugifyAll, text_syllableCount as syllableCount, text_textToAscii as textToAscii, text_textToMorse as textToMorse, text_unescapeString as unescapeString, text_wordFrequency as wordFrequency };
519
572
  }
520
573
 
521
- export { convertAll as $, type AsciiFont as A, type ReadabilityScore as B, CASE_FORMATS as C, DEFAULT_CONVERT_OPTIONS as D, EMOJI_TABLE as E, type FillerCategory as F, type SentenceLengthDistribution as G, type SlugSeparator as H, type StringDistanceMode as I, type StringDistanceResult as J, type KeywordDensityEntry as K, LINE_OPS as L, MORSE_CODE as M, type TextAnalysis as N, addBorder as O, type ParsedDiff as P, analyzeKeywordDensity as Q, type ReadabilityResult as R, type SentenceLengthBucket as S, type TableOptions as T, analyzeSentenceLengths as U, analyzeText as V, type WordCountResult as W, applyOp as X, applyOps as Y, calculateStringDistance as Z, centerText as _, type AsciiOptions as a, convertCase as a0, countWords as a1, csvToHtml as a2, csvToMarkdown as a3, detectDelimiter as a4, detectFillerWords as a5, detectPassiveVoice as a6, diffLines as a7, diffLinesSimple as a8, diffStats as a9, parseDiff as aA, parseTableData as aB, readabilityScore as aC, renderMarkdown as aD, romanToNumber as aE, scoreReadability as aF, searchEmoji as aG, sentenceCount as aH, slugify as aI, slugifyAll as aJ, syllableCount as aK, textToAscii as aL, textToMorse as aM, unescapeString as aN, wordFrequency as aO, escapeAll as aa, escapeString as ab, extractHeadings as ac, formatReadingTime as ad, generate as ae, generateDiff as af, generateHtmlTable as ag, generateMarkdownTable as ah, generateParagraphs as ai, generateSentences as aj, generateWords as ak, getAvailableFonts as al, getEmojiByCategory as am, getEmojiByChar as an, getEmojiByShortcode as ao, getEmojiCategories as ap, getMorseForChar as aq, getMorseTiming as ar, htmlToMarkdown as as, isValidMorse as at, markdownToHtml as au, morseToText as av, numberToOrdinal as aw, numberToRoman as ax, numberToWords as ay, ordinalWords as az, type CaseFormat as b, type ConvertOptions as c, type DiffFile as d, type DiffHunk as e, type DiffLine as f, type DiffResult as g, type DiffType as h, type DiffViewerLine as i, ESCAPE_MODES as j, type EmojiEntry as k, type EscapeMode as l, type FillerMatch as m, type FillerWordResult as n, type KeywordDensityOptions as o, type KeywordDensityResult as p, type LineOp as q, type LineType as r, type LoremUnit as s, text as t, type MarkdownResult as u, type MorseOptions as v, type ParsedTable as w, type PassiveVoiceMatch as x, type PassiveVoiceResult as y, type PassiveVoiceSentence as z };
574
+ export { applyOp as $, type AsciiFont as A, type PassiveVoiceSentence as B, CASE_FORMATS as C, DEFAULT_CONVERT_OPTIONS as D, EMOJI_TABLE as E, type FillerCategory as F, type ReadabilityScore as G, type SentenceLengthDistribution as H, type SlugSeparator as I, type StringDistanceMode as J, type KeywordDensityEntry as K, LINE_OPS as L, MORSE_CODE as M, type StringDistanceResult as N, type OxfordCommaInstance as O, type ParsedDiff as P, type TextAnalysis as Q, type ReadabilityResult as R, type SentenceLengthBucket as S, type TableOptions as T, type WordyPhraseMatch as U, type WordyPhraseResult as V, type WordCountResult as W, addBorder as X, analyzeKeywordDensity as Y, analyzeSentenceLengths as Z, analyzeText as _, type AsciiOptions as a, applyOps as a0, calculateStringDistance as a1, centerText as a2, checkOxfordCommaConsistency as a3, convertAll as a4, convertCase as a5, countWords as a6, csvToHtml as a7, csvToMarkdown as a8, detectDelimiter as a9, markdownToHtml as aA, morseToText as aB, numberToOrdinal as aC, numberToRoman as aD, numberToWords as aE, ordinalWords as aF, parseDiff as aG, parseTableData as aH, readabilityScore as aI, renderMarkdown as aJ, romanToNumber as aK, scoreReadability as aL, searchEmoji as aM, sentenceCount as aN, slugify as aO, slugifyAll as aP, syllableCount as aQ, textToAscii as aR, textToMorse as aS, unescapeString as aT, wordFrequency as aU, detectFillerWords as aa, detectPassiveVoice as ab, detectWordyPhrases as ac, diffLines as ad, diffLinesSimple as ae, diffStats as af, escapeAll as ag, escapeString as ah, extractHeadings as ai, formatReadingTime as aj, generate as ak, generateDiff as al, generateHtmlTable as am, generateMarkdownTable as an, generateParagraphs as ao, generateSentences as ap, generateWords as aq, getAvailableFonts as ar, getEmojiByCategory as as, getEmojiByChar as at, getEmojiByShortcode as au, getEmojiCategories as av, getMorseForChar as aw, getMorseTiming as ax, htmlToMarkdown as ay, isValidMorse as az, type CaseFormat as b, type ConvertOptions as c, type DiffFile as d, type DiffHunk as e, type DiffLine as f, type DiffResult as g, type DiffType as h, type DiffViewerLine as i, ESCAPE_MODES as j, type EmojiEntry as k, type EscapeMode as l, type FillerMatch as m, type FillerWordResult as n, type KeywordDensityOptions as o, type KeywordDensityResult as p, type LineOp as q, type LineType as r, type LoremUnit as s, text as t, type MarkdownResult as u, type MorseOptions as v, type OxfordCommaResult as w, type ParsedTable as x, type PassiveVoiceMatch as y, type PassiveVoiceResult as z };
@@ -3027,6 +3027,100 @@ function getEmojiByCategory(category) {
3027
3027
  function getEmojiCategories() {
3028
3028
  return Array.from(new Set(EMOJI_TABLE.map((e) => e.category)));
3029
3029
  }
3030
+ var WORDY_PHRASES = [
3031
+ { phrase: "due to the fact that", suggestion: "because" },
3032
+ { phrase: "in spite of the fact that", suggestion: "although" },
3033
+ { phrase: "despite the fact that", suggestion: "although" },
3034
+ { phrase: "in order to", suggestion: "to" },
3035
+ { phrase: "for the purpose of", suggestion: "for" },
3036
+ { phrase: "in the event that", suggestion: "if" },
3037
+ { phrase: "in the near future", suggestion: "soon" },
3038
+ { phrase: "at this point in time", suggestion: "now" },
3039
+ { phrase: "at the present time", suggestion: "now" },
3040
+ { phrase: "on a daily basis", suggestion: "daily" },
3041
+ { phrase: "on a regular basis", suggestion: "regularly" },
3042
+ { phrase: "in a timely manner", suggestion: "promptly" },
3043
+ { phrase: "with regard to", suggestion: "regarding" },
3044
+ { phrase: "with respect to", suggestion: "regarding" },
3045
+ { phrase: "in regards to", suggestion: "regarding" },
3046
+ { phrase: "with the exception of", suggestion: "except" },
3047
+ { phrase: "in close proximity to", suggestion: "near" },
3048
+ { phrase: "take into consideration", suggestion: "consider" },
3049
+ { phrase: "give consideration to", suggestion: "consider" },
3050
+ { phrase: "make a decision", suggestion: "decide" },
3051
+ { phrase: "is able to", suggestion: "can" },
3052
+ { phrase: "are able to", suggestion: "can" },
3053
+ { phrase: "a large number of", suggestion: "many" },
3054
+ { phrase: "a majority of", suggestion: "most" },
3055
+ { phrase: "each and every", suggestion: "each" },
3056
+ { phrase: "first and foremost", suggestion: "first" },
3057
+ { phrase: "last but not least", suggestion: "finally" },
3058
+ { phrase: "null and void", suggestion: "void" },
3059
+ { phrase: "whether or not", suggestion: "whether" },
3060
+ { phrase: "the reason why", suggestion: "the reason" },
3061
+ { phrase: "end result", suggestion: "result" },
3062
+ { phrase: "future plans", suggestion: "plans" },
3063
+ { phrase: "past history", suggestion: "history" },
3064
+ { phrase: "basic fundamentals", suggestion: "fundamentals" },
3065
+ { phrase: "absolutely essential", suggestion: "essential" },
3066
+ { phrase: "it is important to note that", suggestion: "(often removable)" },
3067
+ { phrase: "as a matter of fact", suggestion: "in fact" },
3068
+ { phrase: "in the process of", suggestion: "(often removable)" }
3069
+ ];
3070
+ function _wordyRegex(phrase) {
3071
+ const tokens = phrase.split(/\s+/).map((t) => t.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"));
3072
+ return new RegExp("\\b" + tokens.join("\\s+") + "\\b", "gi");
3073
+ }
3074
+ function detectWordyPhrases(text) {
3075
+ const totalWords = (text.match(/[A-Za-z0-9']+/g) ?? []).length;
3076
+ const matches = [];
3077
+ for (const entry of WORDY_PHRASES) {
3078
+ const re = _wordyRegex(entry.phrase);
3079
+ const indices = [];
3080
+ let m;
3081
+ while ((m = re.exec(text)) !== null) {
3082
+ indices.push(m.index);
3083
+ if (m.index === re.lastIndex) re.lastIndex++;
3084
+ }
3085
+ if (indices.length > 0) {
3086
+ matches.push({ phrase: entry.phrase, suggestion: entry.suggestion, count: indices.length, indices });
3087
+ }
3088
+ }
3089
+ matches.sort((a, b) => b.count - a.count || a.phrase.localeCompare(b.phrase));
3090
+ const totalMatches = matches.reduce((s, m) => s + m.count, 0);
3091
+ const density = totalWords > 0 ? Math.round(totalMatches / totalWords * 1e3) / 10 : 0;
3092
+ return { totalWords, totalMatches, density, matches };
3093
+ }
3094
+ var _OXFORD_CONJ_RE = /(,)?\s+\b(?:and|or)\b\s+/gi;
3095
+ function checkOxfordCommaConsistency(text) {
3096
+ const instances = [];
3097
+ _OXFORD_CONJ_RE.lastIndex = 0;
3098
+ let m;
3099
+ while ((m = _OXFORD_CONJ_RE.exec(text)) !== null) {
3100
+ const matchStart = m.index;
3101
+ const hasCommaBefore = !!m[1];
3102
+ let clauseStart = -1;
3103
+ for (const ch of [".", "!", "?", "\n"]) {
3104
+ const idx = text.lastIndexOf(ch, matchStart - 1);
3105
+ if (idx > clauseStart) clauseStart = idx;
3106
+ }
3107
+ clauseStart += 1;
3108
+ const clause = text.slice(clauseStart, matchStart);
3109
+ const commaCount = (clause.match(/,/g) ?? []).length;
3110
+ if (commaCount < 1) continue;
3111
+ const snippetStart = Math.max(clauseStart, matchStart - 60);
3112
+ const afterConjEnd = _OXFORD_CONJ_RE.lastIndex;
3113
+ const tail = text.slice(afterConjEnd);
3114
+ const boundaryOffset = tail.search(/[.!?\n,]/);
3115
+ const snippetEnd = boundaryOffset === -1 ? Math.min(text.length, afterConjEnd + 40) : afterConjEnd + boundaryOffset;
3116
+ const snippet = text.slice(snippetStart, snippetEnd).trim();
3117
+ instances.push({ snippet, hasOxfordComma: hasCommaBefore, index: matchStart });
3118
+ }
3119
+ const withOxfordComma = instances.filter((i) => i.hasOxfordComma).length;
3120
+ const withoutOxfordComma = instances.length - withOxfordComma;
3121
+ const consistent = withOxfordComma === 0 || withoutOxfordComma === 0;
3122
+ return { totalLists: instances.length, withOxfordComma, withoutOxfordComma, consistent, instances };
3123
+ }
3030
3124
 
3031
3125
  exports.CASE_FORMATS = CASE_FORMATS;
3032
3126
  exports.DEFAULT_CONVERT_OPTIONS = DEFAULT_CONVERT_OPTIONS;
@@ -3042,6 +3136,7 @@ exports.applyOp = applyOp;
3042
3136
  exports.applyOps = applyOps;
3043
3137
  exports.calculateStringDistance = calculateStringDistance;
3044
3138
  exports.centerText = centerText;
3139
+ exports.checkOxfordCommaConsistency = checkOxfordCommaConsistency;
3045
3140
  exports.convertAll = convertAll;
3046
3141
  exports.convertCase = convertCase;
3047
3142
  exports.countWords = countWords;
@@ -3050,6 +3145,7 @@ exports.csvToMarkdown = csvToMarkdown;
3050
3145
  exports.detectDelimiter = detectDelimiter;
3051
3146
  exports.detectFillerWords = detectFillerWords;
3052
3147
  exports.detectPassiveVoice = detectPassiveVoice;
3148
+ exports.detectWordyPhrases = detectWordyPhrases;
3053
3149
  exports.diffLines = diffLines;
3054
3150
  exports.diffLinesSimple = diffLinesSimple;
3055
3151
  exports.diffStats = diffStats;
@@ -1 +1 @@
1
- export { A as AsciiFont, a as AsciiOptions, C as CASE_FORMATS, b as CaseFormat, c as ConvertOptions, D as DEFAULT_CONVERT_OPTIONS, d as DiffFile, e as DiffHunk, f as DiffLine, g as DiffResult, h as DiffType, i as DiffViewerLine, E as EMOJI_TABLE, j as ESCAPE_MODES, k as EmojiEntry, l as EscapeMode, F as FillerCategory, m as FillerMatch, n as FillerWordResult, K as KeywordDensityEntry, o as KeywordDensityOptions, p as KeywordDensityResult, L as LINE_OPS, q as LineOp, r as LineType, s as LoremUnit, M as MORSE_CODE, u as MarkdownResult, v as MorseOptions, P as ParsedDiff, w as ParsedTable, x as PassiveVoiceMatch, y as PassiveVoiceResult, z as PassiveVoiceSentence, R as ReadabilityResult, B as ReadabilityScore, S as SentenceLengthBucket, G as SentenceLengthDistribution, H as SlugSeparator, I as StringDistanceMode, J as StringDistanceResult, T as TableOptions, N as TextAnalysis, W as WordCountResult, O as addBorder, Q as analyzeKeywordDensity, U as analyzeSentenceLengths, V as analyzeText, X as applyOp, Y as applyOps, Z as calculateStringDistance, _ as centerText, $ as convertAll, a0 as convertCase, a1 as countWords, a2 as csvToHtml, a3 as csvToMarkdown, a4 as detectDelimiter, a5 as detectFillerWords, a6 as detectPassiveVoice, a7 as diffLines, a8 as diffLinesSimple, a9 as diffStats, aa as escapeAll, ab as escapeString, ac as extractHeadings, ad as formatReadingTime, ae as generate, af as generateDiff, ag as generateHtmlTable, ah as generateMarkdownTable, ai as generateParagraphs, aj as generateSentences, ak as generateWords, al as getAvailableFonts, am as getEmojiByCategory, an as getEmojiByChar, ao as getEmojiByShortcode, ap as getEmojiCategories, aq as getMorseForChar, ar as getMorseTiming, as as htmlToMarkdown, at as isValidMorse, au as markdownToHtml, av as morseToText, aw as numberToOrdinal, ax as numberToRoman, ay as numberToWords, az as ordinalWords, aA as parseDiff, aB as parseTableData, aC as readabilityScore, aD as renderMarkdown, aE as romanToNumber, aF as scoreReadability, aG as searchEmoji, aH as sentenceCount, aI as slugify, aJ as slugifyAll, aK as syllableCount, aL as textToAscii, aM as textToMorse, aN as unescapeString, aO as wordFrequency } from '../text-DWUcY8H1.cjs';
1
+ export { A as AsciiFont, a as AsciiOptions, C as CASE_FORMATS, b as CaseFormat, c as ConvertOptions, D as DEFAULT_CONVERT_OPTIONS, d as DiffFile, e as DiffHunk, f as DiffLine, g as DiffResult, h as DiffType, i as DiffViewerLine, E as EMOJI_TABLE, j as ESCAPE_MODES, k as EmojiEntry, l as EscapeMode, F as FillerCategory, m as FillerMatch, n as FillerWordResult, K as KeywordDensityEntry, o as KeywordDensityOptions, p as KeywordDensityResult, L as LINE_OPS, q as LineOp, r as LineType, s as LoremUnit, M as MORSE_CODE, u as MarkdownResult, v as MorseOptions, O as OxfordCommaInstance, w as OxfordCommaResult, P as ParsedDiff, x as ParsedTable, y as PassiveVoiceMatch, z as PassiveVoiceResult, B as PassiveVoiceSentence, R as ReadabilityResult, G as ReadabilityScore, S as SentenceLengthBucket, H as SentenceLengthDistribution, I as SlugSeparator, J as StringDistanceMode, N as StringDistanceResult, T as TableOptions, Q as TextAnalysis, W as WordCountResult, U as WordyPhraseMatch, V as WordyPhraseResult, X as addBorder, Y as analyzeKeywordDensity, Z as analyzeSentenceLengths, _ as analyzeText, $ as applyOp, a0 as applyOps, a1 as calculateStringDistance, a2 as centerText, a3 as checkOxfordCommaConsistency, a4 as convertAll, a5 as convertCase, a6 as countWords, a7 as csvToHtml, a8 as csvToMarkdown, a9 as detectDelimiter, aa as detectFillerWords, ab as detectPassiveVoice, ac as detectWordyPhrases, ad as diffLines, ae as diffLinesSimple, af as diffStats, ag as escapeAll, ah as escapeString, ai as extractHeadings, aj as formatReadingTime, ak as generate, al as generateDiff, am as generateHtmlTable, an as generateMarkdownTable, ao as generateParagraphs, ap as generateSentences, aq as generateWords, ar as getAvailableFonts, as as getEmojiByCategory, at as getEmojiByChar, au as getEmojiByShortcode, av as getEmojiCategories, aw as getMorseForChar, ax as getMorseTiming, ay as htmlToMarkdown, az as isValidMorse, aA as markdownToHtml, aB as morseToText, aC as numberToOrdinal, aD as numberToRoman, aE as numberToWords, aF as ordinalWords, aG as parseDiff, aH as parseTableData, aI as readabilityScore, aJ as renderMarkdown, aK as romanToNumber, aL as scoreReadability, aM as searchEmoji, aN as sentenceCount, aO as slugify, aP as slugifyAll, aQ as syllableCount, aR as textToAscii, aS as textToMorse, aT as unescapeString, aU as wordFrequency } from '../text-CNn3whZA.cjs';
@@ -1 +1 @@
1
- export { A as AsciiFont, a as AsciiOptions, C as CASE_FORMATS, b as CaseFormat, c as ConvertOptions, D as DEFAULT_CONVERT_OPTIONS, d as DiffFile, e as DiffHunk, f as DiffLine, g as DiffResult, h as DiffType, i as DiffViewerLine, E as EMOJI_TABLE, j as ESCAPE_MODES, k as EmojiEntry, l as EscapeMode, F as FillerCategory, m as FillerMatch, n as FillerWordResult, K as KeywordDensityEntry, o as KeywordDensityOptions, p as KeywordDensityResult, L as LINE_OPS, q as LineOp, r as LineType, s as LoremUnit, M as MORSE_CODE, u as MarkdownResult, v as MorseOptions, P as ParsedDiff, w as ParsedTable, x as PassiveVoiceMatch, y as PassiveVoiceResult, z as PassiveVoiceSentence, R as ReadabilityResult, B as ReadabilityScore, S as SentenceLengthBucket, G as SentenceLengthDistribution, H as SlugSeparator, I as StringDistanceMode, J as StringDistanceResult, T as TableOptions, N as TextAnalysis, W as WordCountResult, O as addBorder, Q as analyzeKeywordDensity, U as analyzeSentenceLengths, V as analyzeText, X as applyOp, Y as applyOps, Z as calculateStringDistance, _ as centerText, $ as convertAll, a0 as convertCase, a1 as countWords, a2 as csvToHtml, a3 as csvToMarkdown, a4 as detectDelimiter, a5 as detectFillerWords, a6 as detectPassiveVoice, a7 as diffLines, a8 as diffLinesSimple, a9 as diffStats, aa as escapeAll, ab as escapeString, ac as extractHeadings, ad as formatReadingTime, ae as generate, af as generateDiff, ag as generateHtmlTable, ah as generateMarkdownTable, ai as generateParagraphs, aj as generateSentences, ak as generateWords, al as getAvailableFonts, am as getEmojiByCategory, an as getEmojiByChar, ao as getEmojiByShortcode, ap as getEmojiCategories, aq as getMorseForChar, ar as getMorseTiming, as as htmlToMarkdown, at as isValidMorse, au as markdownToHtml, av as morseToText, aw as numberToOrdinal, ax as numberToRoman, ay as numberToWords, az as ordinalWords, aA as parseDiff, aB as parseTableData, aC as readabilityScore, aD as renderMarkdown, aE as romanToNumber, aF as scoreReadability, aG as searchEmoji, aH as sentenceCount, aI as slugify, aJ as slugifyAll, aK as syllableCount, aL as textToAscii, aM as textToMorse, aN as unescapeString, aO as wordFrequency } from '../text-DWUcY8H1.js';
1
+ export { A as AsciiFont, a as AsciiOptions, C as CASE_FORMATS, b as CaseFormat, c as ConvertOptions, D as DEFAULT_CONVERT_OPTIONS, d as DiffFile, e as DiffHunk, f as DiffLine, g as DiffResult, h as DiffType, i as DiffViewerLine, E as EMOJI_TABLE, j as ESCAPE_MODES, k as EmojiEntry, l as EscapeMode, F as FillerCategory, m as FillerMatch, n as FillerWordResult, K as KeywordDensityEntry, o as KeywordDensityOptions, p as KeywordDensityResult, L as LINE_OPS, q as LineOp, r as LineType, s as LoremUnit, M as MORSE_CODE, u as MarkdownResult, v as MorseOptions, O as OxfordCommaInstance, w as OxfordCommaResult, P as ParsedDiff, x as ParsedTable, y as PassiveVoiceMatch, z as PassiveVoiceResult, B as PassiveVoiceSentence, R as ReadabilityResult, G as ReadabilityScore, S as SentenceLengthBucket, H as SentenceLengthDistribution, I as SlugSeparator, J as StringDistanceMode, N as StringDistanceResult, T as TableOptions, Q as TextAnalysis, W as WordCountResult, U as WordyPhraseMatch, V as WordyPhraseResult, X as addBorder, Y as analyzeKeywordDensity, Z as analyzeSentenceLengths, _ as analyzeText, $ as applyOp, a0 as applyOps, a1 as calculateStringDistance, a2 as centerText, a3 as checkOxfordCommaConsistency, a4 as convertAll, a5 as convertCase, a6 as countWords, a7 as csvToHtml, a8 as csvToMarkdown, a9 as detectDelimiter, aa as detectFillerWords, ab as detectPassiveVoice, ac as detectWordyPhrases, ad as diffLines, ae as diffLinesSimple, af as diffStats, ag as escapeAll, ah as escapeString, ai as extractHeadings, aj as formatReadingTime, ak as generate, al as generateDiff, am as generateHtmlTable, an as generateMarkdownTable, ao as generateParagraphs, ap as generateSentences, aq as generateWords, ar as getAvailableFonts, as as getEmojiByCategory, at as getEmojiByChar, au as getEmojiByShortcode, av as getEmojiCategories, aw as getMorseForChar, ax as getMorseTiming, ay as htmlToMarkdown, az as isValidMorse, aA as markdownToHtml, aB as morseToText, aC as numberToOrdinal, aD as numberToRoman, aE as numberToWords, aF as ordinalWords, aG as parseDiff, aH as parseTableData, aI as readabilityScore, aJ as renderMarkdown, aK as romanToNumber, aL as scoreReadability, aM as searchEmoji, aN as sentenceCount, aO as slugify, aP as slugifyAll, aQ as syllableCount, aR as textToAscii, aS as textToMorse, aT as unescapeString, aU as wordFrequency } from '../text-CNn3whZA.js';
@@ -1,2 +1,2 @@
1
- export { CASE_FORMATS, DEFAULT_CONVERT_OPTIONS, EMOJI_TABLE, ESCAPE_MODES, LINE_OPS, MORSE_CODE, addBorder, analyzeKeywordDensity, analyzeSentenceLengths, analyzeText, applyOp, applyOps, calculateStringDistance, centerText, convertAll, convertCase, countWords, csvToHtml, csvToMarkdown, detectDelimiter, detectFillerWords, detectPassiveVoice, diffLines, diffLinesSimple, diffStats, escapeAll, escapeString, extractHeadings, formatReadingTime, generate, generateDiff, generateHtmlTable, generateMarkdownTable, generateParagraphs, generateSentences, generateWords, getAvailableFonts, getEmojiByCategory, getEmojiByChar, getEmojiByShortcode, getEmojiCategories, getMorseForChar, getMorseTiming, htmlToMarkdown, isValidMorse, markdownToHtml, morseToText, numberToOrdinal, numberToRoman, numberToWords, ordinalWords, parseDiff, parseTableData, readabilityScore, renderMarkdown, romanToNumber, scoreReadability, searchEmoji, sentenceCount, slugify, slugifyAll, syllableCount, textToAscii, textToMorse, unescapeString, wordFrequency } from '../chunk-P7TXG7CI.js';
1
+ export { CASE_FORMATS, DEFAULT_CONVERT_OPTIONS, EMOJI_TABLE, ESCAPE_MODES, LINE_OPS, MORSE_CODE, addBorder, analyzeKeywordDensity, analyzeSentenceLengths, analyzeText, applyOp, applyOps, calculateStringDistance, centerText, checkOxfordCommaConsistency, convertAll, convertCase, countWords, csvToHtml, csvToMarkdown, detectDelimiter, detectFillerWords, detectPassiveVoice, detectWordyPhrases, diffLines, diffLinesSimple, diffStats, escapeAll, escapeString, extractHeadings, formatReadingTime, generate, generateDiff, generateHtmlTable, generateMarkdownTable, generateParagraphs, generateSentences, generateWords, getAvailableFonts, getEmojiByCategory, getEmojiByChar, getEmojiByShortcode, getEmojiCategories, getMorseForChar, getMorseTiming, htmlToMarkdown, isValidMorse, markdownToHtml, morseToText, numberToOrdinal, numberToRoman, numberToWords, ordinalWords, parseDiff, parseTableData, readabilityScore, renderMarkdown, romanToNumber, scoreReadability, searchEmoji, sentenceCount, slugify, slugifyAll, syllableCount, textToAscii, textToMorse, unescapeString, wordFrequency } from '../chunk-QVOK3BXM.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.75.0",
3
+ "version": "0.76.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",