@n8n/utils 1.37.1 → 1.38.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.
Files changed (231) hide show
  1. package/dist/assert.cjs +11 -2
  2. package/dist/assert.cjs.map +1 -0
  3. package/dist/assert.d.cts +5 -2
  4. package/dist/assert.d.mts +5 -2
  5. package/dist/assert.mjs +10 -2
  6. package/dist/assert.mjs.map +1 -0
  7. package/dist/client-assertion.cjs +49 -0
  8. package/dist/client-assertion.cjs.map +1 -0
  9. package/dist/client-assertion.d.cts +12 -0
  10. package/dist/client-assertion.d.mts +12 -0
  11. package/dist/client-assertion.mjs +48 -0
  12. package/dist/client-assertion.mjs.map +1 -0
  13. package/dist/create-event-queue.cjs +40 -2
  14. package/dist/create-event-queue.cjs.map +1 -0
  15. package/dist/create-event-queue.d.cts +7 -2
  16. package/dist/create-event-queue.d.mts +7 -2
  17. package/dist/create-event-queue.mjs +39 -2
  18. package/dist/create-event-queue.mjs.map +1 -0
  19. package/dist/ensure-error.cjs +15 -0
  20. package/dist/ensure-error.cjs.map +1 -0
  21. package/dist/ensure-error.mjs +9 -0
  22. package/dist/ensure-error.mjs.map +1 -0
  23. package/dist/errors/ensure-error.cjs +3 -0
  24. package/dist/errors/ensure-error.d.cts +5 -0
  25. package/dist/errors/ensure-error.d.mts +5 -0
  26. package/dist/errors/ensure-error.mjs +3 -0
  27. package/dist/event-bus.cjs +43 -2
  28. package/dist/event-bus.cjs.map +1 -0
  29. package/dist/event-bus.d.cts +14 -2
  30. package/dist/event-bus.d.mts +14 -2
  31. package/dist/event-bus.mjs +42 -2
  32. package/dist/event-bus.mjs.map +1 -0
  33. package/dist/files/is-windows-file-path.cjs +11 -2
  34. package/dist/files/is-windows-file-path.cjs.map +1 -0
  35. package/dist/files/is-windows-file-path.d.cts +5 -2
  36. package/dist/files/is-windows-file-path.d.mts +5 -2
  37. package/dist/files/is-windows-file-path.mjs +10 -2
  38. package/dist/files/is-windows-file-path.mjs.map +1 -0
  39. package/dist/files/sanitize-filename.cjs +61 -2
  40. package/dist/files/sanitize-filename.cjs.map +1 -0
  41. package/dist/files/sanitize-filename.d.cts +5 -2
  42. package/dist/files/sanitize-filename.d.mts +5 -2
  43. package/dist/files/sanitize-filename.mjs +60 -2
  44. package/dist/files/sanitize-filename.mjs.map +1 -0
  45. package/dist/format-pem-block.d.cts +5 -2
  46. package/dist/format-pem-block.d.mts +5 -2
  47. package/dist/generate-nano-id.cjs +28 -2
  48. package/dist/generate-nano-id.cjs.map +1 -0
  49. package/dist/generate-nano-id.d.cts +5 -2
  50. package/dist/generate-nano-id.d.mts +5 -2
  51. package/dist/generate-nano-id.mjs +28 -2
  52. package/dist/generate-nano-id.mjs.map +1 -0
  53. package/dist/get-jwt-expiry.cjs +22 -2
  54. package/dist/get-jwt-expiry.cjs.map +1 -0
  55. package/dist/get-jwt-expiry.d.cts +5 -2
  56. package/dist/get-jwt-expiry.d.mts +5 -2
  57. package/dist/get-jwt-expiry.mjs +21 -2
  58. package/dist/get-jwt-expiry.mjs.map +1 -0
  59. package/dist/is-record.cjs +8 -2
  60. package/dist/is-record.cjs.map +1 -0
  61. package/dist/is-record.d.cts +5 -2
  62. package/dist/is-record.d.mts +5 -2
  63. package/dist/is-record.mjs +7 -2
  64. package/dist/is-record.mjs.map +1 -0
  65. package/dist/number/smart-decimal.cjs +10 -2
  66. package/dist/number/smart-decimal.cjs.map +1 -0
  67. package/dist/number/smart-decimal.d.cts +5 -2
  68. package/dist/number/smart-decimal.d.mts +5 -2
  69. package/dist/number/smart-decimal.mjs +9 -2
  70. package/dist/number/smart-decimal.mjs.map +1 -0
  71. package/dist/placeholder.cjs +80 -7
  72. package/dist/placeholder.cjs.map +1 -0
  73. package/dist/placeholder.d.cts +14 -2
  74. package/dist/placeholder.d.mts +14 -2
  75. package/dist/placeholder.mjs +74 -2
  76. package/dist/placeholder.mjs.map +1 -0
  77. package/dist/promise/deferred-promise.cjs +14 -0
  78. package/dist/promise/deferred-promise.cjs.map +1 -0
  79. package/dist/promise/deferred-promise.d.cts +12 -0
  80. package/dist/promise/deferred-promise.d.mts +12 -0
  81. package/dist/promise/deferred-promise.mjs +13 -0
  82. package/dist/promise/deferred-promise.mjs.map +1 -0
  83. package/dist/result.cjs +30 -0
  84. package/dist/result.cjs.map +1 -0
  85. package/dist/result.d.cts +16 -0
  86. package/dist/result.d.mts +16 -0
  87. package/dist/result.mjs +28 -0
  88. package/dist/result.mjs.map +1 -0
  89. package/dist/retry.cjs +39 -2
  90. package/dist/retry.cjs.map +1 -0
  91. package/dist/retry.d.cts +6 -2
  92. package/dist/retry.d.mts +6 -2
  93. package/dist/retry.mjs +38 -2
  94. package/dist/retry.mjs.map +1 -0
  95. package/dist/scrub-secrets.cjs +44 -4
  96. package/dist/scrub-secrets.cjs.map +1 -0
  97. package/dist/scrub-secrets.d.cts +7 -2
  98. package/dist/scrub-secrets.d.mts +7 -2
  99. package/dist/scrub-secrets.mjs +41 -2
  100. package/dist/scrub-secrets.mjs.map +1 -0
  101. package/dist/search/re-rank-search-results.cjs +19 -2
  102. package/dist/search/re-rank-search-results.cjs.map +1 -0
  103. package/dist/search/re-rank-search-results.d.cts +13 -2
  104. package/dist/search/re-rank-search-results.d.mts +13 -2
  105. package/dist/search/re-rank-search-results.mjs +18 -2
  106. package/dist/search/re-rank-search-results.mjs.map +1 -0
  107. package/dist/search/sublime-search.cjs +182 -3
  108. package/dist/search/sublime-search.cjs.map +1 -0
  109. package/dist/search/sublime-search.d.cts +15 -2
  110. package/dist/search/sublime-search.d.mts +15 -2
  111. package/dist/search/sublime-search.mjs +180 -2
  112. package/dist/search/sublime-search.mjs.map +1 -0
  113. package/dist/sort/sort-by-property.cjs +12 -2
  114. package/dist/sort/sort-by-property.cjs.map +1 -0
  115. package/dist/sort/sort-by-property.d.cts +5 -2
  116. package/dist/sort/sort-by-property.d.mts +5 -2
  117. package/dist/sort/sort-by-property.mjs +11 -2
  118. package/dist/sort/sort-by-property.mjs.map +1 -0
  119. package/dist/string/truncate.cjs +32 -3
  120. package/dist/string/truncate.cjs.map +1 -0
  121. package/dist/string/truncate.d.cts +6 -2
  122. package/dist/string/truncate.d.mts +6 -2
  123. package/dist/string/truncate.mjs +30 -2
  124. package/dist/string/truncate.mjs.map +1 -0
  125. package/dist/types.d.cts +5 -2
  126. package/dist/types.d.mts +5 -2
  127. package/package.json +11 -12
  128. package/dist/assert2.cjs +0 -17
  129. package/dist/assert2.cjs.map +0 -1
  130. package/dist/assert2.d.cts +0 -5
  131. package/dist/assert2.d.mts +0 -5
  132. package/dist/assert2.mjs +0 -11
  133. package/dist/assert2.mjs.map +0 -1
  134. package/dist/create-event-queue2.cjs +0 -46
  135. package/dist/create-event-queue2.cjs.map +0 -1
  136. package/dist/create-event-queue2.d.cts +0 -7
  137. package/dist/create-event-queue2.d.mts +0 -7
  138. package/dist/create-event-queue2.mjs +0 -40
  139. package/dist/create-event-queue2.mjs.map +0 -1
  140. package/dist/event-bus2.cjs +0 -49
  141. package/dist/event-bus2.cjs.map +0 -1
  142. package/dist/event-bus2.d.cts +0 -14
  143. package/dist/event-bus2.d.mts +0 -14
  144. package/dist/event-bus2.mjs +0 -43
  145. package/dist/event-bus2.mjs.map +0 -1
  146. package/dist/format-pem-block2.d.cts +0 -5
  147. package/dist/format-pem-block2.d.mts +0 -5
  148. package/dist/generate-nano-id2.cjs +0 -34
  149. package/dist/generate-nano-id2.cjs.map +0 -1
  150. package/dist/generate-nano-id2.d.cts +0 -5
  151. package/dist/generate-nano-id2.d.mts +0 -5
  152. package/dist/generate-nano-id2.mjs +0 -29
  153. package/dist/generate-nano-id2.mjs.map +0 -1
  154. package/dist/get-jwt-expiry2.cjs +0 -28
  155. package/dist/get-jwt-expiry2.cjs.map +0 -1
  156. package/dist/get-jwt-expiry2.d.cts +0 -5
  157. package/dist/get-jwt-expiry2.d.mts +0 -5
  158. package/dist/get-jwt-expiry2.mjs +0 -22
  159. package/dist/get-jwt-expiry2.mjs.map +0 -1
  160. package/dist/index.cjs +0 -44
  161. package/dist/index.d.cts +0 -19
  162. package/dist/index.d.mts +0 -19
  163. package/dist/index.mjs +0 -19
  164. package/dist/is-record2.cjs +0 -14
  165. package/dist/is-record2.cjs.map +0 -1
  166. package/dist/is-record2.d.cts +0 -5
  167. package/dist/is-record2.d.mts +0 -5
  168. package/dist/is-record2.mjs +0 -8
  169. package/dist/is-record2.mjs.map +0 -1
  170. package/dist/is-windows-file-path.cjs +0 -17
  171. package/dist/is-windows-file-path.cjs.map +0 -1
  172. package/dist/is-windows-file-path.d.cts +0 -5
  173. package/dist/is-windows-file-path.d.mts +0 -5
  174. package/dist/is-windows-file-path.mjs +0 -11
  175. package/dist/is-windows-file-path.mjs.map +0 -1
  176. package/dist/placeholder2.cjs +0 -111
  177. package/dist/placeholder2.cjs.map +0 -1
  178. package/dist/placeholder2.d.cts +0 -14
  179. package/dist/placeholder2.d.mts +0 -14
  180. package/dist/placeholder2.mjs +0 -75
  181. package/dist/placeholder2.mjs.map +0 -1
  182. package/dist/re-rank-search-results.cjs +0 -25
  183. package/dist/re-rank-search-results.cjs.map +0 -1
  184. package/dist/re-rank-search-results.d.cts +0 -13
  185. package/dist/re-rank-search-results.d.mts +0 -13
  186. package/dist/re-rank-search-results.mjs +0 -19
  187. package/dist/re-rank-search-results.mjs.map +0 -1
  188. package/dist/retry2.cjs +0 -45
  189. package/dist/retry2.cjs.map +0 -1
  190. package/dist/retry2.d.cts +0 -6
  191. package/dist/retry2.d.mts +0 -6
  192. package/dist/retry2.mjs +0 -39
  193. package/dist/retry2.mjs.map +0 -1
  194. package/dist/sanitize-filename.cjs +0 -67
  195. package/dist/sanitize-filename.cjs.map +0 -1
  196. package/dist/sanitize-filename.d.cts +0 -5
  197. package/dist/sanitize-filename.d.mts +0 -5
  198. package/dist/sanitize-filename.mjs +0 -61
  199. package/dist/sanitize-filename.mjs.map +0 -1
  200. package/dist/scrub-secrets2.cjs +0 -59
  201. package/dist/scrub-secrets2.cjs.map +0 -1
  202. package/dist/scrub-secrets2.d.cts +0 -7
  203. package/dist/scrub-secrets2.d.mts +0 -7
  204. package/dist/scrub-secrets2.mjs +0 -41
  205. package/dist/scrub-secrets2.mjs.map +0 -1
  206. package/dist/smart-decimal.cjs +0 -16
  207. package/dist/smart-decimal.cjs.map +0 -1
  208. package/dist/smart-decimal.d.cts +0 -5
  209. package/dist/smart-decimal.d.mts +0 -5
  210. package/dist/smart-decimal.mjs +0 -10
  211. package/dist/smart-decimal.mjs.map +0 -1
  212. package/dist/sort-by-property.cjs +0 -18
  213. package/dist/sort-by-property.cjs.map +0 -1
  214. package/dist/sort-by-property.d.cts +0 -5
  215. package/dist/sort-by-property.d.mts +0 -5
  216. package/dist/sort-by-property.mjs +0 -12
  217. package/dist/sort-by-property.mjs.map +0 -1
  218. package/dist/sublime-search.cjs +0 -193
  219. package/dist/sublime-search.cjs.map +0 -1
  220. package/dist/sublime-search.d.cts +0 -15
  221. package/dist/sublime-search.d.mts +0 -15
  222. package/dist/sublime-search.mjs +0 -181
  223. package/dist/sublime-search.mjs.map +0 -1
  224. package/dist/truncate.cjs +0 -43
  225. package/dist/truncate.cjs.map +0 -1
  226. package/dist/truncate.d.cts +0 -6
  227. package/dist/truncate.d.mts +0 -6
  228. package/dist/truncate.mjs +0 -31
  229. package/dist/truncate.mjs.map +0 -1
  230. package/dist/types2.d.cts +0 -5
  231. package/dist/types2.d.mts +0 -5
@@ -1 +0,0 @@
1
- {"version":3,"file":"sanitize-filename.cjs","names":[],"sources":["../src/files/sanitize-filename.ts"],"sourcesContent":["// Constants definition\n/* eslint-disable no-control-regex */\nconst INVALID_CHARS_REGEX = /[<>:\"/\\\\|?*\\u0000-\\u001F\\u007F-\\u009F]/g;\nconst ZERO_WIDTH_CHARS_REGEX = /[\\u200B-\\u200D\\u2060\\uFEFF]/g;\nconst UNICODE_SPACES_REGEX = /[\\u00A0\\u2000-\\u200A]/g;\nconst LEADING_TRAILING_DOTS_SPACES_REGEX = /^[\\s.]+|[\\s.]+$/g;\n/* eslint-enable no-control-regex */\n\nconst WINDOWS_RESERVED_NAMES = new Set([\n\t'CON',\n\t'PRN',\n\t'AUX',\n\t'NUL',\n\t'COM1',\n\t'COM2',\n\t'COM3',\n\t'COM4',\n\t'COM5',\n\t'COM6',\n\t'COM7',\n\t'COM8',\n\t'COM9',\n\t'LPT1',\n\t'LPT2',\n\t'LPT3',\n\t'LPT4',\n\t'LPT5',\n\t'LPT6',\n\t'LPT7',\n\t'LPT8',\n\t'LPT9',\n]);\n\nconst DEFAULT_FALLBACK_NAME = 'untitled';\nconst MAX_FILENAME_LENGTH = 200;\n\n/**\n * Sanitizes a filename to be compatible with Mac, Linux, and Windows file systems\n *\n * Main features:\n * - Replace invalid characters (e.g. \":\" in hello:world)\n * - Handle Windows reserved names\n * - Limit filename length\n * - Normalize Unicode characters\n *\n * @param filename - The filename to sanitize (without extension)\n * @param maxLength - Maximum filename length (default: 200)\n * @returns A sanitized filename (without extension)\n *\n * @example\n * sanitizeFilename('hello:world') // returns 'hello_world'\n * sanitizeFilename('CON') // returns '_CON'\n * sanitizeFilename('') // returns 'untitled'\n */\nexport const sanitizeFilename = (\n\tfilename: string,\n\tmaxLength: number = MAX_FILENAME_LENGTH,\n): string => {\n\t// Input validation\n\tif (!filename) {\n\t\treturn DEFAULT_FALLBACK_NAME;\n\t}\n\n\tlet baseName = filename\n\t\t.trim()\n\t\t.replace(INVALID_CHARS_REGEX, '_')\n\t\t.replace(ZERO_WIDTH_CHARS_REGEX, '')\n\t\t.replace(UNICODE_SPACES_REGEX, ' ')\n\t\t.replace(LEADING_TRAILING_DOTS_SPACES_REGEX, '');\n\n\t// Handle empty or invalid filenames after cleaning\n\tif (!baseName) {\n\t\tbaseName = DEFAULT_FALLBACK_NAME;\n\t}\n\n\t// Handle Windows reserved names\n\tif (WINDOWS_RESERVED_NAMES.has(baseName.toUpperCase())) {\n\t\tbaseName = `_${baseName}`;\n\t}\n\n\t// Truncate if too long\n\tif (baseName.length > maxLength) {\n\t\tbaseName = baseName.slice(0, maxLength);\n\t}\n\n\treturn baseName;\n};\n"],"mappings":";;AAEA,MAAM,sBAAsB;AAC5B,MAAM,yBAAyB;AAC/B,MAAM,uBAAuB;AAC7B,MAAM,qCAAqC;AAG3C,MAAM,yBAAyB,IAAI,IAAI;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,CAAC;AAEF,MAAM,wBAAwB;AAC9B,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;AAoB5B,MAAa,oBACZ,UACA,YAAoB,wBACR;AAEZ,KAAI,CAAC,SACJ,QAAO;CAGR,IAAI,WAAW,SACb,MAAM,CACN,QAAQ,qBAAqB,IAAI,CACjC,QAAQ,wBAAwB,GAAG,CACnC,QAAQ,sBAAsB,IAAI,CAClC,QAAQ,oCAAoC,GAAG;AAGjD,KAAI,CAAC,SACJ,YAAW;AAIZ,KAAI,uBAAuB,IAAI,SAAS,aAAa,CAAC,CACrD,YAAW,IAAI;AAIhB,KAAI,SAAS,SAAS,UACrB,YAAW,SAAS,MAAM,GAAG,UAAU;AAGxC,QAAO"}
@@ -1,5 +0,0 @@
1
- //#region src/files/sanitize-filename.d.ts
2
- declare const sanitizeFilename: (filename: string, maxLength?: number) => string;
3
- //#endregion
4
- export { sanitizeFilename as t };
5
- //# sourceMappingURL=sanitize-filename.d.cts.map
@@ -1,5 +0,0 @@
1
- //#region src/files/sanitize-filename.d.ts
2
- declare const sanitizeFilename: (filename: string, maxLength?: number) => string;
3
- //#endregion
4
- export { sanitizeFilename as t };
5
- //# sourceMappingURL=sanitize-filename.d.mts.map
@@ -1,61 +0,0 @@
1
- //#region src/files/sanitize-filename.ts
2
- const INVALID_CHARS_REGEX = /[<>:"/\\|?*\u0000-\u001F\u007F-\u009F]/g;
3
- const ZERO_WIDTH_CHARS_REGEX = /[\u200B-\u200D\u2060\uFEFF]/g;
4
- const UNICODE_SPACES_REGEX = /[\u00A0\u2000-\u200A]/g;
5
- const LEADING_TRAILING_DOTS_SPACES_REGEX = /^[\s.]+|[\s.]+$/g;
6
- const WINDOWS_RESERVED_NAMES = new Set([
7
- "CON",
8
- "PRN",
9
- "AUX",
10
- "NUL",
11
- "COM1",
12
- "COM2",
13
- "COM3",
14
- "COM4",
15
- "COM5",
16
- "COM6",
17
- "COM7",
18
- "COM8",
19
- "COM9",
20
- "LPT1",
21
- "LPT2",
22
- "LPT3",
23
- "LPT4",
24
- "LPT5",
25
- "LPT6",
26
- "LPT7",
27
- "LPT8",
28
- "LPT9"
29
- ]);
30
- const DEFAULT_FALLBACK_NAME = "untitled";
31
- const MAX_FILENAME_LENGTH = 200;
32
- /**
33
- * Sanitizes a filename to be compatible with Mac, Linux, and Windows file systems
34
- *
35
- * Main features:
36
- * - Replace invalid characters (e.g. ":" in hello:world)
37
- * - Handle Windows reserved names
38
- * - Limit filename length
39
- * - Normalize Unicode characters
40
- *
41
- * @param filename - The filename to sanitize (without extension)
42
- * @param maxLength - Maximum filename length (default: 200)
43
- * @returns A sanitized filename (without extension)
44
- *
45
- * @example
46
- * sanitizeFilename('hello:world') // returns 'hello_world'
47
- * sanitizeFilename('CON') // returns '_CON'
48
- * sanitizeFilename('') // returns 'untitled'
49
- */
50
- const sanitizeFilename = (filename, maxLength = MAX_FILENAME_LENGTH) => {
51
- if (!filename) return DEFAULT_FALLBACK_NAME;
52
- let baseName = filename.trim().replace(INVALID_CHARS_REGEX, "_").replace(ZERO_WIDTH_CHARS_REGEX, "").replace(UNICODE_SPACES_REGEX, " ").replace(LEADING_TRAILING_DOTS_SPACES_REGEX, "");
53
- if (!baseName) baseName = DEFAULT_FALLBACK_NAME;
54
- if (WINDOWS_RESERVED_NAMES.has(baseName.toUpperCase())) baseName = `_${baseName}`;
55
- if (baseName.length > maxLength) baseName = baseName.slice(0, maxLength);
56
- return baseName;
57
- };
58
-
59
- //#endregion
60
- export { sanitizeFilename as t };
61
- //# sourceMappingURL=sanitize-filename.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sanitize-filename.mjs","names":[],"sources":["../src/files/sanitize-filename.ts"],"sourcesContent":["// Constants definition\n/* eslint-disable no-control-regex */\nconst INVALID_CHARS_REGEX = /[<>:\"/\\\\|?*\\u0000-\\u001F\\u007F-\\u009F]/g;\nconst ZERO_WIDTH_CHARS_REGEX = /[\\u200B-\\u200D\\u2060\\uFEFF]/g;\nconst UNICODE_SPACES_REGEX = /[\\u00A0\\u2000-\\u200A]/g;\nconst LEADING_TRAILING_DOTS_SPACES_REGEX = /^[\\s.]+|[\\s.]+$/g;\n/* eslint-enable no-control-regex */\n\nconst WINDOWS_RESERVED_NAMES = new Set([\n\t'CON',\n\t'PRN',\n\t'AUX',\n\t'NUL',\n\t'COM1',\n\t'COM2',\n\t'COM3',\n\t'COM4',\n\t'COM5',\n\t'COM6',\n\t'COM7',\n\t'COM8',\n\t'COM9',\n\t'LPT1',\n\t'LPT2',\n\t'LPT3',\n\t'LPT4',\n\t'LPT5',\n\t'LPT6',\n\t'LPT7',\n\t'LPT8',\n\t'LPT9',\n]);\n\nconst DEFAULT_FALLBACK_NAME = 'untitled';\nconst MAX_FILENAME_LENGTH = 200;\n\n/**\n * Sanitizes a filename to be compatible with Mac, Linux, and Windows file systems\n *\n * Main features:\n * - Replace invalid characters (e.g. \":\" in hello:world)\n * - Handle Windows reserved names\n * - Limit filename length\n * - Normalize Unicode characters\n *\n * @param filename - The filename to sanitize (without extension)\n * @param maxLength - Maximum filename length (default: 200)\n * @returns A sanitized filename (without extension)\n *\n * @example\n * sanitizeFilename('hello:world') // returns 'hello_world'\n * sanitizeFilename('CON') // returns '_CON'\n * sanitizeFilename('') // returns 'untitled'\n */\nexport const sanitizeFilename = (\n\tfilename: string,\n\tmaxLength: number = MAX_FILENAME_LENGTH,\n): string => {\n\t// Input validation\n\tif (!filename) {\n\t\treturn DEFAULT_FALLBACK_NAME;\n\t}\n\n\tlet baseName = filename\n\t\t.trim()\n\t\t.replace(INVALID_CHARS_REGEX, '_')\n\t\t.replace(ZERO_WIDTH_CHARS_REGEX, '')\n\t\t.replace(UNICODE_SPACES_REGEX, ' ')\n\t\t.replace(LEADING_TRAILING_DOTS_SPACES_REGEX, '');\n\n\t// Handle empty or invalid filenames after cleaning\n\tif (!baseName) {\n\t\tbaseName = DEFAULT_FALLBACK_NAME;\n\t}\n\n\t// Handle Windows reserved names\n\tif (WINDOWS_RESERVED_NAMES.has(baseName.toUpperCase())) {\n\t\tbaseName = `_${baseName}`;\n\t}\n\n\t// Truncate if too long\n\tif (baseName.length > maxLength) {\n\t\tbaseName = baseName.slice(0, maxLength);\n\t}\n\n\treturn baseName;\n};\n"],"mappings":";AAEA,MAAM,sBAAsB;AAC5B,MAAM,yBAAyB;AAC/B,MAAM,uBAAuB;AAC7B,MAAM,qCAAqC;AAG3C,MAAM,yBAAyB,IAAI,IAAI;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,CAAC;AAEF,MAAM,wBAAwB;AAC9B,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;AAoB5B,MAAa,oBACZ,UACA,YAAoB,wBACR;AAEZ,KAAI,CAAC,SACJ,QAAO;CAGR,IAAI,WAAW,SACb,MAAM,CACN,QAAQ,qBAAqB,IAAI,CACjC,QAAQ,wBAAwB,GAAG,CACnC,QAAQ,sBAAsB,IAAI,CAClC,QAAQ,oCAAoC,GAAG;AAGjD,KAAI,CAAC,SACJ,YAAW;AAIZ,KAAI,uBAAuB,IAAI,SAAS,aAAa,CAAC,CACrD,YAAW,IAAI;AAIhB,KAAI,SAAS,SAAS,UACrB,YAAW,SAAS,MAAM,GAAG,UAAU;AAGxC,QAAO"}
@@ -1,59 +0,0 @@
1
-
2
- //#region src/scrub-secrets.ts
3
- /**
4
- * Replace common credential patterns in free-form text with `[REDACTED]`.
5
- *
6
- * Used before persisting or transmitting user-supplied text (telemetry
7
- * excerpts, eval report HTML, free-form feedback) where keys/tokens
8
- * accidentally pasted into prompts or command lines could otherwise leak
9
- * downstream.
10
- *
11
- * Conservative by design: matches well-known prefixed tokens, explicit
12
- * `key=value` pairs, and quoted JSON/JS-object fields with sensitive
13
- * names. We don't attempt to redact arbitrary long opaque strings — false
14
- * positives on file paths, IDs, or base64 payloads would make the output
15
- * unreadable.
16
- */
17
- const SECRET_KEYS = "password|passwd|secret|credentials?|api[_-]?key|authorization|access[_-]?token|refresh[_-]?token|id[_-]?token|session[_-]?token|auth[_-]?token";
18
- const SECRET_VALUE_PATTERNS = [
19
- /-----BEGIN (?:RSA |EC |DSA |OPENSSH |PGP )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |DSA |OPENSSH |PGP )?PRIVATE KEY-----/g,
20
- /\beyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g,
21
- /\b(?:Bearer|Basic|Token)\s+[A-Za-z0-9._~+/=-]{12,}/gi,
22
- /\bsk-(?:ant-|proj-)?[A-Za-z0-9_-]{16,}/g,
23
- /\b(?:sk|rk|pk)_(?:live|test)_[A-Za-z0-9]{16,}/g,
24
- /\bAIza[0-9A-Za-z_-]{35}\b/g,
25
- /\bxox[abprso]-[A-Za-z0-9-]{10,}/g,
26
- /\bgh[psoru]_[A-Za-z0-9]{20,}/g,
27
- /\bgithub_pat_[A-Za-z0-9_]{22,}/g,
28
- /\bAKIA[0-9A-Z]{16}\b/g,
29
- /(?<=:\/\/)[^\s:/@]+:[^\s:/@]+(?=@)/g,
30
- new RegExp(`"(?:${SECRET_KEYS})"\\s*:\\s*"(?!\\[(?:redacted|REDACTED)(?::[^"\\]]*)?\\]")(?:\\\\.|[^"\\r\\n])*"`, "gi"),
31
- new RegExp(`'(?:${SECRET_KEYS})'\\s*:\\s*'(?!\\[(?:redacted|REDACTED)(?::[^'\\]]*)?\\]')(?:\\\\.|[^'\\r\\n])*'`, "gi"),
32
- new RegExp(`(?<!\\[(?:redacted|REDACTED):)\\b(?:${SECRET_KEYS})\\s*[:=]\\s*\\S+`, "gi")
33
- ];
34
- function scrubSecretsInText(input) {
35
- let out = input;
36
- for (const pattern of SECRET_VALUE_PATTERNS) out = out.replace(pattern, "[REDACTED]");
37
- return out;
38
- }
39
-
40
- //#endregion
41
- Object.defineProperty(exports, 'SECRET_KEYS', {
42
- enumerable: true,
43
- get: function () {
44
- return SECRET_KEYS;
45
- }
46
- });
47
- Object.defineProperty(exports, 'SECRET_VALUE_PATTERNS', {
48
- enumerable: true,
49
- get: function () {
50
- return SECRET_VALUE_PATTERNS;
51
- }
52
- });
53
- Object.defineProperty(exports, 'scrubSecretsInText', {
54
- enumerable: true,
55
- get: function () {
56
- return scrubSecretsInText;
57
- }
58
- });
59
- //# sourceMappingURL=scrub-secrets2.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scrub-secrets2.cjs","names":["SECRET_VALUE_PATTERNS: readonly RegExp[]"],"sources":["../src/scrub-secrets.ts"],"sourcesContent":["/**\n * Replace common credential patterns in free-form text with `[REDACTED]`.\n *\n * Used before persisting or transmitting user-supplied text (telemetry\n * excerpts, eval report HTML, free-form feedback) where keys/tokens\n * accidentally pasted into prompts or command lines could otherwise leak\n * downstream.\n *\n * Conservative by design: matches well-known prefixed tokens, explicit\n * `key=value` pairs, and quoted JSON/JS-object fields with sensitive\n * names. We don't attempt to redact arbitrary long opaque strings — false\n * positives on file paths, IDs, or base64 payloads would make the output\n * unreadable.\n */\nexport const SECRET_KEYS =\n\t'password|passwd|secret|credentials?|api[_-]?key|authorization|access[_-]?token|refresh[_-]?token|id[_-]?token|session[_-]?token|auth[_-]?token';\n\nexport const SECRET_VALUE_PATTERNS: readonly RegExp[] = [\n\t// PEM private-key blocks (RSA/EC/DSA/OpenSSH/PGP). Whole block, multiline.\n\t/-----BEGIN (?:RSA |EC |DSA |OPENSSH |PGP )?PRIVATE KEY-----[\\s\\S]*?-----END (?:RSA |EC |DSA |OPENSSH |PGP )?PRIVATE KEY-----/g,\n\t// JWTs: `eyJ<header>.eyJ<payload>.<signature>` (both leading segments are\n\t// base64url of a `{\"` object, which makes this highly distinctive).\n\t/\\beyJ[A-Za-z0-9_-]+\\.eyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+/g,\n\t// Authorization-header substrings: `Bearer <token>`, `Basic <token>`, `Token <token>`\n\t/\\b(?:Bearer|Basic|Token)\\s+[A-Za-z0-9._~+/=-]{12,}/gi,\n\t// OpenAI / Anthropic API keys\n\t/\\bsk-(?:ant-|proj-)?[A-Za-z0-9_-]{16,}/g,\n\t// Stripe secret/restricted/publishable keys (`sk_live_…`, `rk_test_…`, …)\n\t/\\b(?:sk|rk|pk)_(?:live|test)_[A-Za-z0-9]{16,}/g,\n\t// Google API keys\n\t/\\bAIza[0-9A-Za-z_-]{35}\\b/g,\n\t// Slack tokens (xoxb, xoxp, xoxa, xoxr, xoxs, xoxo)\n\t/\\bxox[abprso]-[A-Za-z0-9-]{10,}/g,\n\t// GitHub tokens (ghp, ghs, gho, ghr, ghu)\n\t/\\bgh[psoru]_[A-Za-z0-9]{20,}/g,\n\t// GitHub fine-grained personal access tokens\n\t/\\bgithub_pat_[A-Za-z0-9_]{22,}/g,\n\t// AWS access key id\n\t/\\bAKIA[0-9A-Z]{16}\\b/g,\n\t// Credentials embedded in a URL: `scheme://user:password@` — redact the userinfo.\n\t/(?<=:\\/\\/)[^\\s:/@]+:[^\\s:/@]+(?=@)/g,\n\t// JSON-shaped `\"key\": \"value\"` — matches the quoted field as a whole.\n\t// Run before the loose pattern so nested objects like\n\t// `{\"credentials\": {\"apiKey\": \"...\"}}` don't have the outer key consume\n\t// the inner key on its way to a non-quoted (object) value. The value\n\t// body uses the standard JSON-string idiom `(?:\\\\.|[^\"\\r\\n])*` so an\n\t// escaped quote inside the value (`\"abc\\\"def\"`) doesn't end the match\n\t// early and leak the rest of the secret. The negative lookahead skips\n\t// values that are already a `[redacted]` / `[REDACTED]` / typed\n\t// `[REDACTED:<type>:<index>]` placeholder so this stays idempotent when\n\t// chained behind upstream object-walking redaction (langsmith trace\n\t// payloads, mcp-browser markers).\n\tnew RegExp(\n\t\t`\"(?:${SECRET_KEYS})\"\\\\s*:\\\\s*\"(?!\\\\[(?:redacted|REDACTED)(?::[^\"\\\\]]*)?\\\\]\")(?:\\\\\\\\.|[^\"\\\\r\\\\n])*\"`,\n\t\t'gi',\n\t),\n\t// JS-object-shaped `'key': 'value'`\n\tnew RegExp(\n\t\t`'(?:${SECRET_KEYS})'\\\\s*:\\\\s*'(?!\\\\[(?:redacted|REDACTED)(?::[^'\\\\]]*)?\\\\]')(?:\\\\\\\\.|[^'\\\\r\\\\n])*'`,\n\t\t'gi',\n\t),\n\t// Generic `password=...` / `api_key=...` / `secret=...` style assignments.\n\t// The negative lookbehind skips a keyword sitting at the `<type>` position of\n\t// an upstream `[REDACTED:<type>:<index>]` marker (e.g. mcp-browser output), so\n\t// the `secret:1]` tail isn't re-matched into a nested `[REDACTED:[REDACTED]`.\n\t// Checking only the `[REDACTED:` prefix suffices: inside a marker a keyword can\n\t// only start a `\\b` match right after that prefix — every other keyword-shaped\n\t// substring is preceded by `_` (snake_case type slug) or a digit, so no word\n\t// boundary opens there.\n\tnew RegExp(`(?<!\\\\[(?:redacted|REDACTED):)\\\\b(?:${SECRET_KEYS})\\\\s*[:=]\\\\s*\\\\S+`, 'gi'),\n];\n\nexport function scrubSecretsInText(input: string): string {\n\tlet out = input;\n\tfor (const pattern of SECRET_VALUE_PATTERNS) {\n\t\tout = out.replace(pattern, '[REDACTED]');\n\t}\n\treturn out;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAcA,MAAa,cACZ;AAED,MAAaA,wBAA2C;CAEvD;CAGA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAYA,IAAI,OACH,OAAO,YAAY,mFACnB,KACA;CAED,IAAI,OACH,OAAO,YAAY,mFACnB,KACA;CASD,IAAI,OAAO,uCAAuC,YAAY,oBAAoB,KAAK;CACvF;AAED,SAAgB,mBAAmB,OAAuB;CACzD,IAAI,MAAM;AACV,MAAK,MAAM,WAAW,sBACrB,OAAM,IAAI,QAAQ,SAAS,aAAa;AAEzC,QAAO"}
@@ -1,7 +0,0 @@
1
- //#region src/scrub-secrets.d.ts
2
- declare const SECRET_KEYS = "password|passwd|secret|credentials?|api[_-]?key|authorization|access[_-]?token|refresh[_-]?token|id[_-]?token|session[_-]?token|auth[_-]?token";
3
- declare const SECRET_VALUE_PATTERNS: readonly RegExp[];
4
- declare function scrubSecretsInText(input: string): string;
5
- //#endregion
6
- export { SECRET_VALUE_PATTERNS as n, scrubSecretsInText as r, SECRET_KEYS as t };
7
- //# sourceMappingURL=scrub-secrets2.d.cts.map
@@ -1,7 +0,0 @@
1
- //#region src/scrub-secrets.d.ts
2
- declare const SECRET_KEYS = "password|passwd|secret|credentials?|api[_-]?key|authorization|access[_-]?token|refresh[_-]?token|id[_-]?token|session[_-]?token|auth[_-]?token";
3
- declare const SECRET_VALUE_PATTERNS: readonly RegExp[];
4
- declare function scrubSecretsInText(input: string): string;
5
- //#endregion
6
- export { SECRET_VALUE_PATTERNS as n, scrubSecretsInText as r, SECRET_KEYS as t };
7
- //# sourceMappingURL=scrub-secrets2.d.mts.map
@@ -1,41 +0,0 @@
1
- //#region src/scrub-secrets.ts
2
- /**
3
- * Replace common credential patterns in free-form text with `[REDACTED]`.
4
- *
5
- * Used before persisting or transmitting user-supplied text (telemetry
6
- * excerpts, eval report HTML, free-form feedback) where keys/tokens
7
- * accidentally pasted into prompts or command lines could otherwise leak
8
- * downstream.
9
- *
10
- * Conservative by design: matches well-known prefixed tokens, explicit
11
- * `key=value` pairs, and quoted JSON/JS-object fields with sensitive
12
- * names. We don't attempt to redact arbitrary long opaque strings — false
13
- * positives on file paths, IDs, or base64 payloads would make the output
14
- * unreadable.
15
- */
16
- const SECRET_KEYS = "password|passwd|secret|credentials?|api[_-]?key|authorization|access[_-]?token|refresh[_-]?token|id[_-]?token|session[_-]?token|auth[_-]?token";
17
- const SECRET_VALUE_PATTERNS = [
18
- /-----BEGIN (?:RSA |EC |DSA |OPENSSH |PGP )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |DSA |OPENSSH |PGP )?PRIVATE KEY-----/g,
19
- /\beyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g,
20
- /\b(?:Bearer|Basic|Token)\s+[A-Za-z0-9._~+/=-]{12,}/gi,
21
- /\bsk-(?:ant-|proj-)?[A-Za-z0-9_-]{16,}/g,
22
- /\b(?:sk|rk|pk)_(?:live|test)_[A-Za-z0-9]{16,}/g,
23
- /\bAIza[0-9A-Za-z_-]{35}\b/g,
24
- /\bxox[abprso]-[A-Za-z0-9-]{10,}/g,
25
- /\bgh[psoru]_[A-Za-z0-9]{20,}/g,
26
- /\bgithub_pat_[A-Za-z0-9_]{22,}/g,
27
- /\bAKIA[0-9A-Z]{16}\b/g,
28
- /(?<=:\/\/)[^\s:/@]+:[^\s:/@]+(?=@)/g,
29
- new RegExp(`"(?:${SECRET_KEYS})"\\s*:\\s*"(?!\\[(?:redacted|REDACTED)(?::[^"\\]]*)?\\]")(?:\\\\.|[^"\\r\\n])*"`, "gi"),
30
- new RegExp(`'(?:${SECRET_KEYS})'\\s*:\\s*'(?!\\[(?:redacted|REDACTED)(?::[^'\\]]*)?\\]')(?:\\\\.|[^'\\r\\n])*'`, "gi"),
31
- new RegExp(`(?<!\\[(?:redacted|REDACTED):)\\b(?:${SECRET_KEYS})\\s*[:=]\\s*\\S+`, "gi")
32
- ];
33
- function scrubSecretsInText(input) {
34
- let out = input;
35
- for (const pattern of SECRET_VALUE_PATTERNS) out = out.replace(pattern, "[REDACTED]");
36
- return out;
37
- }
38
-
39
- //#endregion
40
- export { SECRET_VALUE_PATTERNS as n, scrubSecretsInText as r, SECRET_KEYS as t };
41
- //# sourceMappingURL=scrub-secrets2.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scrub-secrets2.mjs","names":["SECRET_VALUE_PATTERNS: readonly RegExp[]"],"sources":["../src/scrub-secrets.ts"],"sourcesContent":["/**\n * Replace common credential patterns in free-form text with `[REDACTED]`.\n *\n * Used before persisting or transmitting user-supplied text (telemetry\n * excerpts, eval report HTML, free-form feedback) where keys/tokens\n * accidentally pasted into prompts or command lines could otherwise leak\n * downstream.\n *\n * Conservative by design: matches well-known prefixed tokens, explicit\n * `key=value` pairs, and quoted JSON/JS-object fields with sensitive\n * names. We don't attempt to redact arbitrary long opaque strings — false\n * positives on file paths, IDs, or base64 payloads would make the output\n * unreadable.\n */\nexport const SECRET_KEYS =\n\t'password|passwd|secret|credentials?|api[_-]?key|authorization|access[_-]?token|refresh[_-]?token|id[_-]?token|session[_-]?token|auth[_-]?token';\n\nexport const SECRET_VALUE_PATTERNS: readonly RegExp[] = [\n\t// PEM private-key blocks (RSA/EC/DSA/OpenSSH/PGP). Whole block, multiline.\n\t/-----BEGIN (?:RSA |EC |DSA |OPENSSH |PGP )?PRIVATE KEY-----[\\s\\S]*?-----END (?:RSA |EC |DSA |OPENSSH |PGP )?PRIVATE KEY-----/g,\n\t// JWTs: `eyJ<header>.eyJ<payload>.<signature>` (both leading segments are\n\t// base64url of a `{\"` object, which makes this highly distinctive).\n\t/\\beyJ[A-Za-z0-9_-]+\\.eyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+/g,\n\t// Authorization-header substrings: `Bearer <token>`, `Basic <token>`, `Token <token>`\n\t/\\b(?:Bearer|Basic|Token)\\s+[A-Za-z0-9._~+/=-]{12,}/gi,\n\t// OpenAI / Anthropic API keys\n\t/\\bsk-(?:ant-|proj-)?[A-Za-z0-9_-]{16,}/g,\n\t// Stripe secret/restricted/publishable keys (`sk_live_…`, `rk_test_…`, …)\n\t/\\b(?:sk|rk|pk)_(?:live|test)_[A-Za-z0-9]{16,}/g,\n\t// Google API keys\n\t/\\bAIza[0-9A-Za-z_-]{35}\\b/g,\n\t// Slack tokens (xoxb, xoxp, xoxa, xoxr, xoxs, xoxo)\n\t/\\bxox[abprso]-[A-Za-z0-9-]{10,}/g,\n\t// GitHub tokens (ghp, ghs, gho, ghr, ghu)\n\t/\\bgh[psoru]_[A-Za-z0-9]{20,}/g,\n\t// GitHub fine-grained personal access tokens\n\t/\\bgithub_pat_[A-Za-z0-9_]{22,}/g,\n\t// AWS access key id\n\t/\\bAKIA[0-9A-Z]{16}\\b/g,\n\t// Credentials embedded in a URL: `scheme://user:password@` — redact the userinfo.\n\t/(?<=:\\/\\/)[^\\s:/@]+:[^\\s:/@]+(?=@)/g,\n\t// JSON-shaped `\"key\": \"value\"` — matches the quoted field as a whole.\n\t// Run before the loose pattern so nested objects like\n\t// `{\"credentials\": {\"apiKey\": \"...\"}}` don't have the outer key consume\n\t// the inner key on its way to a non-quoted (object) value. The value\n\t// body uses the standard JSON-string idiom `(?:\\\\.|[^\"\\r\\n])*` so an\n\t// escaped quote inside the value (`\"abc\\\"def\"`) doesn't end the match\n\t// early and leak the rest of the secret. The negative lookahead skips\n\t// values that are already a `[redacted]` / `[REDACTED]` / typed\n\t// `[REDACTED:<type>:<index>]` placeholder so this stays idempotent when\n\t// chained behind upstream object-walking redaction (langsmith trace\n\t// payloads, mcp-browser markers).\n\tnew RegExp(\n\t\t`\"(?:${SECRET_KEYS})\"\\\\s*:\\\\s*\"(?!\\\\[(?:redacted|REDACTED)(?::[^\"\\\\]]*)?\\\\]\")(?:\\\\\\\\.|[^\"\\\\r\\\\n])*\"`,\n\t\t'gi',\n\t),\n\t// JS-object-shaped `'key': 'value'`\n\tnew RegExp(\n\t\t`'(?:${SECRET_KEYS})'\\\\s*:\\\\s*'(?!\\\\[(?:redacted|REDACTED)(?::[^'\\\\]]*)?\\\\]')(?:\\\\\\\\.|[^'\\\\r\\\\n])*'`,\n\t\t'gi',\n\t),\n\t// Generic `password=...` / `api_key=...` / `secret=...` style assignments.\n\t// The negative lookbehind skips a keyword sitting at the `<type>` position of\n\t// an upstream `[REDACTED:<type>:<index>]` marker (e.g. mcp-browser output), so\n\t// the `secret:1]` tail isn't re-matched into a nested `[REDACTED:[REDACTED]`.\n\t// Checking only the `[REDACTED:` prefix suffices: inside a marker a keyword can\n\t// only start a `\\b` match right after that prefix — every other keyword-shaped\n\t// substring is preceded by `_` (snake_case type slug) or a digit, so no word\n\t// boundary opens there.\n\tnew RegExp(`(?<!\\\\[(?:redacted|REDACTED):)\\\\b(?:${SECRET_KEYS})\\\\s*[:=]\\\\s*\\\\S+`, 'gi'),\n];\n\nexport function scrubSecretsInText(input: string): string {\n\tlet out = input;\n\tfor (const pattern of SECRET_VALUE_PATTERNS) {\n\t\tout = out.replace(pattern, '[REDACTED]');\n\t}\n\treturn out;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAcA,MAAa,cACZ;AAED,MAAaA,wBAA2C;CAEvD;CAGA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAYA,IAAI,OACH,OAAO,YAAY,mFACnB,KACA;CAED,IAAI,OACH,OAAO,YAAY,mFACnB,KACA;CASD,IAAI,OAAO,uCAAuC,YAAY,oBAAoB,KAAK;CACvF;AAED,SAAgB,mBAAmB,OAAuB;CACzD,IAAI,MAAM;AACV,MAAK,MAAM,WAAW,sBACrB,OAAM,IAAI,QAAQ,SAAS,aAAa;AAEzC,QAAO"}
@@ -1,16 +0,0 @@
1
-
2
- //#region src/number/smart-decimal.ts
3
- const smartDecimal = (value, decimals = 2) => {
4
- if (Number.isInteger(value)) return value;
5
- if (value.toString().split(".")[1].length <= decimals) return value;
6
- return Number(value.toFixed(decimals));
7
- };
8
-
9
- //#endregion
10
- Object.defineProperty(exports, 'smartDecimal', {
11
- enumerable: true,
12
- get: function () {
13
- return smartDecimal;
14
- }
15
- });
16
- //# sourceMappingURL=smart-decimal.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"smart-decimal.cjs","names":[],"sources":["../src/number/smart-decimal.ts"],"sourcesContent":["export const smartDecimal = (value: number, decimals = 2): number => {\n\t// Check if integer\n\tif (Number.isInteger(value)) {\n\t\treturn value;\n\t}\n\n\t// Check if it has only one decimal place\n\tif (value.toString().split('.')[1].length <= decimals) {\n\t\treturn value;\n\t}\n\n\treturn Number(value.toFixed(decimals));\n};\n"],"mappings":";;AAAA,MAAa,gBAAgB,OAAe,WAAW,MAAc;AAEpE,KAAI,OAAO,UAAU,MAAM,CAC1B,QAAO;AAIR,KAAI,MAAM,UAAU,CAAC,MAAM,IAAI,CAAC,GAAG,UAAU,SAC5C,QAAO;AAGR,QAAO,OAAO,MAAM,QAAQ,SAAS,CAAC"}
@@ -1,5 +0,0 @@
1
- //#region src/number/smart-decimal.d.ts
2
- declare const smartDecimal: (value: number, decimals?: number) => number;
3
- //#endregion
4
- export { smartDecimal as t };
5
- //# sourceMappingURL=smart-decimal.d.cts.map
@@ -1,5 +0,0 @@
1
- //#region src/number/smart-decimal.d.ts
2
- declare const smartDecimal: (value: number, decimals?: number) => number;
3
- //#endregion
4
- export { smartDecimal as t };
5
- //# sourceMappingURL=smart-decimal.d.mts.map
@@ -1,10 +0,0 @@
1
- //#region src/number/smart-decimal.ts
2
- const smartDecimal = (value, decimals = 2) => {
3
- if (Number.isInteger(value)) return value;
4
- if (value.toString().split(".")[1].length <= decimals) return value;
5
- return Number(value.toFixed(decimals));
6
- };
7
-
8
- //#endregion
9
- export { smartDecimal as t };
10
- //# sourceMappingURL=smart-decimal.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"smart-decimal.mjs","names":[],"sources":["../src/number/smart-decimal.ts"],"sourcesContent":["export const smartDecimal = (value: number, decimals = 2): number => {\n\t// Check if integer\n\tif (Number.isInteger(value)) {\n\t\treturn value;\n\t}\n\n\t// Check if it has only one decimal place\n\tif (value.toString().split('.')[1].length <= decimals) {\n\t\treturn value;\n\t}\n\n\treturn Number(value.toFixed(decimals));\n};\n"],"mappings":";AAAA,MAAa,gBAAgB,OAAe,WAAW,MAAc;AAEpE,KAAI,OAAO,UAAU,MAAM,CAC1B,QAAO;AAIR,KAAI,MAAM,UAAU,CAAC,MAAM,IAAI,CAAC,GAAG,UAAU,SAC5C,QAAO;AAGR,QAAO,OAAO,MAAM,QAAQ,SAAS,CAAC"}
@@ -1,18 +0,0 @@
1
-
2
- //#region src/sort/sort-by-property.ts
3
- const sortByProperty = (property, arr, order = "asc") => arr.sort((a, b) => {
4
- const result = String(a[property]).localeCompare(String(b[property]), void 0, {
5
- numeric: true,
6
- sensitivity: "base"
7
- });
8
- return order === "asc" ? result : -result;
9
- });
10
-
11
- //#endregion
12
- Object.defineProperty(exports, 'sortByProperty', {
13
- enumerable: true,
14
- get: function () {
15
- return sortByProperty;
16
- }
17
- });
18
- //# sourceMappingURL=sort-by-property.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sort-by-property.cjs","names":[],"sources":["../src/sort/sort-by-property.ts"],"sourcesContent":["export const sortByProperty = <T>(\n\tproperty: keyof T,\n\tarr: T[],\n\torder: 'asc' | 'desc' = 'asc',\n): T[] =>\n\tarr.sort((a, b) => {\n\t\tconst result = String(a[property]).localeCompare(String(b[property]), undefined, {\n\t\t\tnumeric: true,\n\t\t\tsensitivity: 'base',\n\t\t});\n\t\treturn order === 'asc' ? result : -result;\n\t});\n"],"mappings":";;AAAA,MAAa,kBACZ,UACA,KACA,QAAwB,UAExB,IAAI,MAAM,GAAG,MAAM;CAClB,MAAM,SAAS,OAAO,EAAE,UAAU,CAAC,cAAc,OAAO,EAAE,UAAU,EAAE,QAAW;EAChF,SAAS;EACT,aAAa;EACb,CAAC;AACF,QAAO,UAAU,QAAQ,SAAS,CAAC;EAClC"}
@@ -1,5 +0,0 @@
1
- //#region src/sort/sort-by-property.d.ts
2
- declare const sortByProperty: <T>(property: keyof T, arr: T[], order?: "asc" | "desc") => T[];
3
- //#endregion
4
- export { sortByProperty as t };
5
- //# sourceMappingURL=sort-by-property.d.cts.map
@@ -1,5 +0,0 @@
1
- //#region src/sort/sort-by-property.d.ts
2
- declare const sortByProperty: <T>(property: keyof T, arr: T[], order?: "asc" | "desc") => T[];
3
- //#endregion
4
- export { sortByProperty as t };
5
- //# sourceMappingURL=sort-by-property.d.mts.map
@@ -1,12 +0,0 @@
1
- //#region src/sort/sort-by-property.ts
2
- const sortByProperty = (property, arr, order = "asc") => arr.sort((a, b) => {
3
- const result = String(a[property]).localeCompare(String(b[property]), void 0, {
4
- numeric: true,
5
- sensitivity: "base"
6
- });
7
- return order === "asc" ? result : -result;
8
- });
9
-
10
- //#endregion
11
- export { sortByProperty as t };
12
- //# sourceMappingURL=sort-by-property.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sort-by-property.mjs","names":[],"sources":["../src/sort/sort-by-property.ts"],"sourcesContent":["export const sortByProperty = <T>(\n\tproperty: keyof T,\n\tarr: T[],\n\torder: 'asc' | 'desc' = 'asc',\n): T[] =>\n\tarr.sort((a, b) => {\n\t\tconst result = String(a[property]).localeCompare(String(b[property]), undefined, {\n\t\t\tnumeric: true,\n\t\t\tsensitivity: 'base',\n\t\t});\n\t\treturn order === 'asc' ? result : -result;\n\t});\n"],"mappings":";AAAA,MAAa,kBACZ,UACA,KACA,QAAwB,UAExB,IAAI,MAAM,GAAG,MAAM;CAClB,MAAM,SAAS,OAAO,EAAE,UAAU,CAAC,cAAc,OAAO,EAAE,UAAU,EAAE,QAAW;EAChF,SAAS;EACT,aAAa;EACb,CAAC;AACF,QAAO,UAAU,QAAQ,SAAS,CAAC;EAClC"}
@@ -1,193 +0,0 @@
1
-
2
- //#region src/search/sublime-search.ts
3
- const SEQUENTIAL_BONUS = 60;
4
- const SEPARATOR_BONUS = 38;
5
- const CAMEL_BONUS = 30;
6
- const FIRST_LETTER_BONUS = 15;
7
- const LEADING_LETTER_PENALTY = -20;
8
- const MAX_LEADING_LETTER_PENALTY = -200;
9
- const UNMATCHED_LETTER_PENALTY = -2.5;
10
- const DEFAULT_KEYS = [{
11
- key: "properties.displayName",
12
- weight: 1.3
13
- }, {
14
- key: "properties.codex.alias",
15
- weight: 1
16
- }];
17
- /**
18
- * Returns true if each character in pattern is found sequentially within target
19
- * @param {*} pattern string
20
- * @param {*} target string
21
- */
22
- function fuzzyMatchSimple(pattern, target) {
23
- let patternIdx = 0;
24
- let strIdx = 0;
25
- while (patternIdx < pattern.length && strIdx < target.length) {
26
- if (pattern.charAt(patternIdx).toLowerCase() === target.charAt(strIdx).toLowerCase()) patternIdx++;
27
- ++strIdx;
28
- }
29
- return pattern.length !== 0 && target.length !== 0 && patternIdx === pattern.length;
30
- }
31
- function fuzzyMatchRecursive(pattern, target, patternCurIndex, targetCurrIndex, targetMatches, matches, maxMatches, nextMatch, recursionCount, recursionLimit) {
32
- let outScore = 0;
33
- if (++recursionCount >= recursionLimit) return {
34
- matched: false,
35
- outScore
36
- };
37
- if (patternCurIndex === pattern.length || targetCurrIndex === target.length) return {
38
- matched: false,
39
- outScore
40
- };
41
- let recursiveMatch = false;
42
- let bestRecursiveMatches = [];
43
- let bestRecursiveScore = 0;
44
- let firstMatch = true;
45
- while (patternCurIndex < pattern.length && targetCurrIndex < target.length) {
46
- if (pattern[patternCurIndex].toLowerCase() === target[targetCurrIndex].toLowerCase()) {
47
- if (nextMatch >= maxMatches) return {
48
- matched: false,
49
- outScore
50
- };
51
- if (firstMatch && targetMatches) {
52
- matches = [...targetMatches];
53
- firstMatch = false;
54
- }
55
- const recursiveMatches = [];
56
- const recursiveResult = fuzzyMatchRecursive(pattern, target, patternCurIndex, targetCurrIndex + 1, matches, recursiveMatches, maxMatches, nextMatch, recursionCount, recursionLimit);
57
- const recursiveScore = recursiveResult.outScore;
58
- if (recursiveResult.matched) {
59
- if (!recursiveMatch || recursiveScore > bestRecursiveScore) {
60
- bestRecursiveMatches = [...recursiveMatches];
61
- bestRecursiveScore = recursiveScore;
62
- }
63
- recursiveMatch = true;
64
- }
65
- matches[nextMatch++] = targetCurrIndex;
66
- ++patternCurIndex;
67
- }
68
- ++targetCurrIndex;
69
- }
70
- const matched = patternCurIndex === pattern.length;
71
- if (matched) {
72
- outScore = 100;
73
- if (!target.toLowerCase().startsWith("n8n")) {
74
- let penalty = LEADING_LETTER_PENALTY * matches[0];
75
- penalty = penalty < MAX_LEADING_LETTER_PENALTY ? MAX_LEADING_LETTER_PENALTY : penalty;
76
- outScore += penalty;
77
- }
78
- const unmatched = target.length - nextMatch;
79
- outScore += UNMATCHED_LETTER_PENALTY * unmatched;
80
- for (let i = 0; i < nextMatch; i++) {
81
- const currIdx = matches[i];
82
- if (i > 0) {
83
- if (currIdx === matches[i - 1] + 1) outScore += SEQUENTIAL_BONUS;
84
- }
85
- if (currIdx > 0) {
86
- const neighbor = target[currIdx - 1];
87
- const curr = target[currIdx];
88
- if (neighbor !== neighbor.toUpperCase() && curr !== curr.toLowerCase()) outScore += CAMEL_BONUS;
89
- if (neighbor === "_" || neighbor === " ") outScore += SEPARATOR_BONUS;
90
- } else outScore += FIRST_LETTER_BONUS;
91
- }
92
- if (recursiveMatch && (!matched || bestRecursiveScore > outScore)) {
93
- matches = [...bestRecursiveMatches];
94
- outScore = bestRecursiveScore;
95
- return {
96
- matched: true,
97
- outScore
98
- };
99
- } else if (matched) return {
100
- matched: true,
101
- outScore
102
- };
103
- else return {
104
- matched: false,
105
- outScore
106
- };
107
- }
108
- return {
109
- matched: false,
110
- outScore
111
- };
112
- }
113
- /**
114
- * Does a fuzzy search to find pattern inside a string.
115
- * @param {*} pattern string pattern to search for
116
- * @param {*} target string string which is being searched
117
- * @returns [boolean, number] a boolean which tells if pattern was
118
- * found or not and a search score
119
- */
120
- function fuzzyMatch(pattern, target) {
121
- return fuzzyMatchRecursive(pattern, target, 0, 0, null, [], 256, 0, 0, 5);
122
- }
123
- function getValue(obj, prop) {
124
- if (obj.hasOwnProperty(prop)) return obj[prop];
125
- const segments = prop.split(".");
126
- let result = obj;
127
- let i = 0;
128
- while (result && i < segments.length) {
129
- const key = segments[i];
130
- result = result[key];
131
- i++;
132
- }
133
- return result;
134
- }
135
- function scoreSearchValue(filter, value, weight) {
136
- if (!fuzzyMatchSimple(filter, value)) return void 0;
137
- const match = fuzzyMatch(filter, value);
138
- if (!match.matched) return void 0;
139
- return match.outScore * weight;
140
- }
141
- function sublimeSearch(filter, data, keys = DEFAULT_KEYS, limit) {
142
- const results = [];
143
- for (const item of data) {
144
- let itemMatchScore;
145
- for (const { key, weight } of keys) {
146
- const value = getValue(item, key);
147
- if (Array.isArray(value)) for (const entry of value) {
148
- if (typeof entry !== "string") continue;
149
- const score = scoreSearchValue(filter, entry, weight);
150
- if (score !== void 0 && (itemMatchScore === void 0 || score > itemMatchScore)) itemMatchScore = score;
151
- }
152
- else if (typeof value === "string") {
153
- const score = scoreSearchValue(filter, value, weight);
154
- if (score !== void 0 && (itemMatchScore === void 0 || score > itemMatchScore)) itemMatchScore = score;
155
- }
156
- }
157
- if (itemMatchScore !== void 0) {
158
- const result = {
159
- score: itemMatchScore,
160
- item
161
- };
162
- if (limit === void 0 || results.length < limit) results.push(result);
163
- else {
164
- let lowestIndex = 0;
165
- let lowestScore = results[0].score;
166
- for (let i = 1; i < results.length; i++) if (results[i].score < lowestScore) {
167
- lowestIndex = i;
168
- lowestScore = results[i].score;
169
- }
170
- if (result.score > lowestScore) results[lowestIndex] = result;
171
- }
172
- }
173
- }
174
- results.sort((a, b) => {
175
- return b.score - a.score;
176
- });
177
- return results;
178
- }
179
-
180
- //#endregion
181
- Object.defineProperty(exports, 'DEFAULT_KEYS', {
182
- enumerable: true,
183
- get: function () {
184
- return DEFAULT_KEYS;
185
- }
186
- });
187
- Object.defineProperty(exports, 'sublimeSearch', {
188
- enumerable: true,
189
- get: function () {
190
- return sublimeSearch;
191
- }
192
- });
193
- //# sourceMappingURL=sublime-search.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sublime-search.cjs","names":["bestRecursiveMatches: number[]","recursiveMatches: number[]","results: Array<{ score: number; item: T }>","itemMatchScore: number | undefined","result: { score: number; item: T }"],"sources":["../src/search/sublime-search.ts"],"sourcesContent":["/*\n * Constants and utility functions used for searching for node types in node creator component\n * based on https://github.com/forrestthewoods/lib_fts/blob/master/code/fts_fuzzy_match.js\n */\n\nconst SEQUENTIAL_BONUS = 60; // bonus for adjacent matches\nconst SEPARATOR_BONUS = 38; // bonus if match occurs after a separator\nconst CAMEL_BONUS = 30; // bonus if match is uppercase and prev is lower\nconst FIRST_LETTER_BONUS = 15; // bonus if the first letter is matched\n\nconst LEADING_LETTER_PENALTY = -20; // penalty applied for every letter in str before the first match\nconst MAX_LEADING_LETTER_PENALTY = -200; // maximum penalty for leading letters\nconst UNMATCHED_LETTER_PENALTY = -2.5;\n\nexport const DEFAULT_KEYS = [\n\t{ key: 'properties.displayName', weight: 1.3 },\n\t{ key: 'properties.codex.alias', weight: 1 },\n];\n\n/**\n * Returns true if each character in pattern is found sequentially within target\n * @param {*} pattern string\n * @param {*} target string\n */\nfunction fuzzyMatchSimple(pattern: string, target: string): boolean {\n\tlet patternIdx = 0;\n\tlet strIdx = 0;\n\n\twhile (patternIdx < pattern.length && strIdx < target.length) {\n\t\tconst patternChar = pattern.charAt(patternIdx).toLowerCase();\n\t\tconst targetChar = target.charAt(strIdx).toLowerCase();\n\t\tif (patternChar === targetChar) {\n\t\t\tpatternIdx++;\n\t\t}\n\t\t++strIdx;\n\t}\n\n\treturn pattern.length !== 0 && target.length !== 0 && patternIdx === pattern.length;\n}\n\nfunction fuzzyMatchRecursive(\n\tpattern: string,\n\ttarget: string,\n\tpatternCurIndex: number,\n\ttargetCurrIndex: number,\n\ttargetMatches: null | number[],\n\tmatches: number[],\n\tmaxMatches: number,\n\tnextMatch: number,\n\trecursionCount: number,\n\trecursionLimit: number,\n): { matched: boolean; outScore: number } {\n\tlet outScore = 0;\n\n\t// Return if recursion limit is reached.\n\tif (++recursionCount >= recursionLimit) {\n\t\treturn { matched: false, outScore };\n\t}\n\n\t// Return if we reached ends of strings.\n\tif (patternCurIndex === pattern.length || targetCurrIndex === target.length) {\n\t\treturn { matched: false, outScore };\n\t}\n\n\t// Recursion params\n\tlet recursiveMatch = false;\n\tlet bestRecursiveMatches: number[] = [];\n\tlet bestRecursiveScore = 0;\n\n\t// Loop through pattern and str looking for a match.\n\tlet firstMatch = true;\n\twhile (patternCurIndex < pattern.length && targetCurrIndex < target.length) {\n\t\t// Match found.\n\t\tif (pattern[patternCurIndex].toLowerCase() === target[targetCurrIndex].toLowerCase()) {\n\t\t\tif (nextMatch >= maxMatches) {\n\t\t\t\treturn { matched: false, outScore };\n\t\t\t}\n\n\t\t\tif (firstMatch && targetMatches) {\n\t\t\t\tmatches = [...targetMatches];\n\t\t\t\tfirstMatch = false;\n\t\t\t}\n\n\t\t\tconst recursiveMatches: number[] = [];\n\t\t\tconst recursiveResult = fuzzyMatchRecursive(\n\t\t\t\tpattern,\n\t\t\t\ttarget,\n\t\t\t\tpatternCurIndex,\n\t\t\t\ttargetCurrIndex + 1,\n\t\t\t\tmatches,\n\t\t\t\trecursiveMatches,\n\t\t\t\tmaxMatches,\n\t\t\t\tnextMatch,\n\t\t\t\trecursionCount,\n\t\t\t\trecursionLimit,\n\t\t\t);\n\n\t\t\tconst recursiveScore = recursiveResult.outScore;\n\t\t\tif (recursiveResult.matched) {\n\t\t\t\t// Pick best recursive score.\n\t\t\t\tif (!recursiveMatch || recursiveScore > bestRecursiveScore) {\n\t\t\t\t\tbestRecursiveMatches = [...recursiveMatches];\n\t\t\t\t\tbestRecursiveScore = recursiveScore;\n\t\t\t\t}\n\t\t\t\trecursiveMatch = true;\n\t\t\t}\n\n\t\t\tmatches[nextMatch++] = targetCurrIndex;\n\t\t\t++patternCurIndex;\n\t\t}\n\t\t++targetCurrIndex;\n\t}\n\n\tconst matched = patternCurIndex === pattern.length;\n\n\tif (matched) {\n\t\toutScore = 100;\n\n\t\t// Apply leading letter penalty (if not n8n-prefixed)\n\t\tif (!target.toLowerCase().startsWith('n8n')) {\n\t\t\tlet penalty = LEADING_LETTER_PENALTY * matches[0];\n\t\t\tpenalty = penalty < MAX_LEADING_LETTER_PENALTY ? MAX_LEADING_LETTER_PENALTY : penalty;\n\t\t\toutScore += penalty;\n\t\t}\n\n\t\t//Apply unmatched penalty\n\t\tconst unmatched = target.length - nextMatch;\n\t\toutScore += UNMATCHED_LETTER_PENALTY * unmatched;\n\n\t\t// Apply ordering bonuses\n\t\tfor (let i = 0; i < nextMatch; i++) {\n\t\t\tconst currIdx = matches[i];\n\n\t\t\tif (i > 0) {\n\t\t\t\tconst prevIdx = matches[i - 1];\n\t\t\t\tif (currIdx === prevIdx + 1) {\n\t\t\t\t\toutScore += SEQUENTIAL_BONUS;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check for bonuses based on neighbor character value.\n\t\t\tif (currIdx > 0) {\n\t\t\t\t// Camel case\n\t\t\t\tconst neighbor = target[currIdx - 1];\n\t\t\t\tconst curr = target[currIdx];\n\t\t\t\tif (neighbor !== neighbor.toUpperCase() && curr !== curr.toLowerCase()) {\n\t\t\t\t\toutScore += CAMEL_BONUS;\n\t\t\t\t}\n\t\t\t\tconst isNeighbourSeparator = neighbor === '_' || neighbor === ' ';\n\t\t\t\tif (isNeighbourSeparator) {\n\t\t\t\t\toutScore += SEPARATOR_BONUS;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// First letter\n\t\t\t\toutScore += FIRST_LETTER_BONUS;\n\t\t\t}\n\t\t}\n\n\t\t// Return best result\n\t\tif (recursiveMatch && (!matched || bestRecursiveScore > outScore)) {\n\t\t\t// Recursive score is better than \"this\"\n\t\t\tmatches = [...bestRecursiveMatches];\n\t\t\toutScore = bestRecursiveScore;\n\t\t\treturn { matched: true, outScore };\n\t\t} else if (matched) {\n\t\t\t// \"this\" score is better than recursive\n\t\t\treturn { matched: true, outScore };\n\t\t} else {\n\t\t\treturn { matched: false, outScore };\n\t\t}\n\t}\n\treturn { matched: false, outScore };\n}\n\n/**\n * Does a fuzzy search to find pattern inside a string.\n * @param {*} pattern string pattern to search for\n * @param {*} target string string which is being searched\n * @returns [boolean, number] a boolean which tells if pattern was\n * found or not and a search score\n */\nfunction fuzzyMatch(pattern: string, target: string): { matched: boolean; outScore: number } {\n\tconst recursionCount = 0;\n\tconst recursionLimit = 5;\n\tconst matches: number[] = [];\n\tconst maxMatches = 256;\n\n\treturn fuzzyMatchRecursive(\n\t\tpattern,\n\t\ttarget,\n\t\t0 /* patternCurIndex */,\n\t\t0 /* strCurrIndex */,\n\t\tnull /* srcMatces */,\n\t\tmatches,\n\t\tmaxMatches,\n\t\t0 /* nextMatch */,\n\t\trecursionCount,\n\t\trecursionLimit,\n\t);\n}\n\n// prop = 'key'\n// prop = 'key1.key2'\n// prop = ['key1', 'key2']\nfunction getValue<T extends object>(obj: T, prop: string): unknown {\n\tif (obj.hasOwnProperty(prop)) {\n\t\treturn obj[prop as keyof T];\n\t}\n\n\tconst segments = prop.split('.');\n\n\tlet result = obj;\n\tlet i = 0;\n\twhile (result && i < segments.length) {\n\t\tconst key = segments[i] as keyof T;\n\t\tresult = result[key] as T;\n\t\ti++;\n\t}\n\treturn result;\n}\n\nfunction scoreSearchValue(filter: string, value: string, weight: number): number | undefined {\n\tif (!fuzzyMatchSimple(filter, value)) return undefined;\n\n\tconst match = fuzzyMatch(filter, value);\n\tif (!match.matched) return undefined;\n\n\treturn match.outScore * weight;\n}\n\nexport function sublimeSearch<T extends object>(\n\tfilter: string,\n\tdata: readonly T[],\n\tkeys: Array<{ key: string; weight: number }> = DEFAULT_KEYS,\n\tlimit?: number,\n): Array<{ score: number; item: T }> {\n\tconst results: Array<{ score: number; item: T }> = [];\n\n\tfor (const item of data) {\n\t\tlet itemMatchScore: number | undefined;\n\n\t\tfor (const { key, weight } of keys) {\n\t\t\tconst value = getValue(item, key);\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tfor (const entry of value) {\n\t\t\t\t\tif (typeof entry !== 'string') continue;\n\n\t\t\t\t\tconst score = scoreSearchValue(filter, entry, weight);\n\t\t\t\t\tif (score !== undefined && (itemMatchScore === undefined || score > itemMatchScore)) {\n\t\t\t\t\t\titemMatchScore = score;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (typeof value === 'string') {\n\t\t\t\tconst score = scoreSearchValue(filter, value, weight);\n\t\t\t\tif (score !== undefined && (itemMatchScore === undefined || score > itemMatchScore)) {\n\t\t\t\t\titemMatchScore = score;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (itemMatchScore !== undefined) {\n\t\t\tconst result: { score: number; item: T } = {\n\t\t\t\tscore: itemMatchScore,\n\t\t\t\titem,\n\t\t\t};\n\n\t\t\tif (limit === undefined || results.length < limit) {\n\t\t\t\tresults.push(result);\n\t\t\t} else {\n\t\t\t\tlet lowestIndex = 0;\n\t\t\t\tlet lowestScore = results[0].score;\n\t\t\t\tfor (let i = 1; i < results.length; i++) {\n\t\t\t\t\tif (results[i].score < lowestScore) {\n\t\t\t\t\t\tlowestIndex = i;\n\t\t\t\t\t\tlowestScore = results[i].score;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (result.score > lowestScore) {\n\t\t\t\t\tresults[lowestIndex] = result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tresults.sort((a, b) => {\n\t\treturn b.score - a.score;\n\t});\n\n\treturn results;\n}\n"],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- //#region src/search/sublime-search.d.ts
2
- declare const DEFAULT_KEYS: {
3
- key: string;
4
- weight: number;
5
- }[];
6
- declare function sublimeSearch<T extends object>(filter: string, data: readonly T[], keys?: Array<{
7
- key: string;
8
- weight: number;
9
- }>, limit?: number): Array<{
10
- score: number;
11
- item: T;
12
- }>;
13
- //#endregion
14
- export { sublimeSearch as n, DEFAULT_KEYS as t };
15
- //# sourceMappingURL=sublime-search.d.cts.map
@@ -1,15 +0,0 @@
1
- //#region src/search/sublime-search.d.ts
2
- declare const DEFAULT_KEYS: {
3
- key: string;
4
- weight: number;
5
- }[];
6
- declare function sublimeSearch<T extends object>(filter: string, data: readonly T[], keys?: Array<{
7
- key: string;
8
- weight: number;
9
- }>, limit?: number): Array<{
10
- score: number;
11
- item: T;
12
- }>;
13
- //#endregion
14
- export { sublimeSearch as n, DEFAULT_KEYS as t };
15
- //# sourceMappingURL=sublime-search.d.mts.map