jtcsv 2.2.8 → 3.1.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 (246) hide show
  1. package/README.md +204 -115
  2. package/bin/jtcsv.ts +2612 -0
  3. package/browser.d.ts +142 -0
  4. package/dist/benchmark.js +446 -0
  5. package/dist/benchmark.js.map +1 -0
  6. package/dist/bin/jtcsv.js +1940 -0
  7. package/dist/bin/jtcsv.js.map +1 -0
  8. package/dist/csv-to-json.js +1262 -0
  9. package/dist/csv-to-json.js.map +1 -0
  10. package/dist/errors.js +291 -0
  11. package/dist/errors.js.map +1 -0
  12. package/dist/eslint.config.js +147 -0
  13. package/dist/eslint.config.js.map +1 -0
  14. package/dist/index-core.js +95 -0
  15. package/dist/index-core.js.map +1 -0
  16. package/dist/index.js +93 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/json-save.js +229 -0
  19. package/dist/json-save.js.map +1 -0
  20. package/dist/json-to-csv.js +576 -0
  21. package/dist/json-to-csv.js.map +1 -0
  22. package/dist/jtcsv-core.cjs.js +1736 -0
  23. package/dist/jtcsv-core.cjs.js.map +1 -0
  24. package/dist/jtcsv-core.esm.js +1708 -0
  25. package/dist/jtcsv-core.esm.js.map +1 -0
  26. package/dist/jtcsv-core.umd.js +1742 -0
  27. package/dist/jtcsv-core.umd.js.map +1 -0
  28. package/dist/jtcsv-full.cjs.js +2241 -0
  29. package/dist/jtcsv-full.cjs.js.map +1 -0
  30. package/dist/jtcsv-full.esm.js +2209 -0
  31. package/dist/jtcsv-full.esm.js.map +1 -0
  32. package/dist/jtcsv-full.umd.js +2247 -0
  33. package/dist/jtcsv-full.umd.js.map +1 -0
  34. package/dist/jtcsv-workers.esm.js +768 -0
  35. package/dist/jtcsv-workers.esm.js.map +1 -0
  36. package/dist/jtcsv-workers.umd.js +782 -0
  37. package/dist/jtcsv-workers.umd.js.map +1 -0
  38. package/dist/jtcsv.cjs.js +1996 -2048
  39. package/dist/jtcsv.cjs.js.map +1 -1
  40. package/dist/jtcsv.esm.js +1992 -2048
  41. package/dist/jtcsv.esm.js.map +1 -1
  42. package/dist/jtcsv.umd.js +2157 -2209
  43. package/dist/jtcsv.umd.js.map +1 -1
  44. package/dist/plugins/express-middleware/index.js +350 -0
  45. package/dist/plugins/express-middleware/index.js.map +1 -0
  46. package/dist/plugins/fastify-plugin/index.js +315 -0
  47. package/dist/plugins/fastify-plugin/index.js.map +1 -0
  48. package/dist/plugins/hono/index.js +111 -0
  49. package/dist/plugins/hono/index.js.map +1 -0
  50. package/dist/plugins/nestjs/index.js +112 -0
  51. package/dist/plugins/nestjs/index.js.map +1 -0
  52. package/dist/plugins/nuxt/index.js +53 -0
  53. package/dist/plugins/nuxt/index.js.map +1 -0
  54. package/dist/plugins/remix/index.js +133 -0
  55. package/dist/plugins/remix/index.js.map +1 -0
  56. package/dist/plugins/sveltekit/index.js +155 -0
  57. package/dist/plugins/sveltekit/index.js.map +1 -0
  58. package/dist/plugins/trpc/index.js +136 -0
  59. package/dist/plugins/trpc/index.js.map +1 -0
  60. package/dist/run-demo.js +49 -0
  61. package/dist/run-demo.js.map +1 -0
  62. package/dist/src/browser/browser-functions.js +193 -0
  63. package/dist/src/browser/browser-functions.js.map +1 -0
  64. package/dist/src/browser/core.js +123 -0
  65. package/dist/src/browser/core.js.map +1 -0
  66. package/dist/src/browser/csv-to-json-browser.js +353 -0
  67. package/dist/src/browser/csv-to-json-browser.js.map +1 -0
  68. package/dist/src/browser/errors-browser.js +219 -0
  69. package/dist/src/browser/errors-browser.js.map +1 -0
  70. package/dist/src/browser/extensions/plugins.js +106 -0
  71. package/dist/src/browser/extensions/plugins.js.map +1 -0
  72. package/dist/src/browser/extensions/workers.js +66 -0
  73. package/dist/src/browser/extensions/workers.js.map +1 -0
  74. package/dist/src/browser/index.js +140 -0
  75. package/dist/src/browser/index.js.map +1 -0
  76. package/dist/src/browser/json-to-csv-browser.js +225 -0
  77. package/dist/src/browser/json-to-csv-browser.js.map +1 -0
  78. package/dist/src/browser/streams.js +340 -0
  79. package/dist/src/browser/streams.js.map +1 -0
  80. package/dist/src/browser/workers/csv-parser.worker.js +264 -0
  81. package/dist/src/browser/workers/csv-parser.worker.js.map +1 -0
  82. package/dist/src/browser/workers/worker-pool.js +338 -0
  83. package/dist/src/browser/workers/worker-pool.js.map +1 -0
  84. package/dist/src/core/delimiter-cache.js +196 -0
  85. package/dist/src/core/delimiter-cache.js.map +1 -0
  86. package/dist/src/core/node-optimizations.js +279 -0
  87. package/dist/src/core/node-optimizations.js.map +1 -0
  88. package/dist/src/core/plugin-system.js +399 -0
  89. package/dist/src/core/plugin-system.js.map +1 -0
  90. package/dist/src/core/transform-hooks.js +348 -0
  91. package/dist/src/core/transform-hooks.js.map +1 -0
  92. package/dist/src/engines/fast-path-engine-new.js +262 -0
  93. package/dist/src/engines/fast-path-engine-new.js.map +1 -0
  94. package/dist/src/engines/fast-path-engine.js +671 -0
  95. package/dist/src/engines/fast-path-engine.js.map +1 -0
  96. package/dist/src/errors.js +18 -0
  97. package/dist/src/errors.js.map +1 -0
  98. package/dist/src/formats/ndjson-parser.js +332 -0
  99. package/dist/src/formats/ndjson-parser.js.map +1 -0
  100. package/dist/src/formats/tsv-parser.js +230 -0
  101. package/dist/src/formats/tsv-parser.js.map +1 -0
  102. package/dist/src/index-with-plugins.js +259 -0
  103. package/dist/src/index-with-plugins.js.map +1 -0
  104. package/dist/src/types/index.js +3 -0
  105. package/dist/src/types/index.js.map +1 -0
  106. package/dist/src/utils/bom-utils.js +267 -0
  107. package/dist/src/utils/bom-utils.js.map +1 -0
  108. package/dist/src/utils/encoding-support.js +77 -0
  109. package/dist/src/utils/encoding-support.js.map +1 -0
  110. package/dist/src/utils/schema-validator.js +609 -0
  111. package/dist/src/utils/schema-validator.js.map +1 -0
  112. package/dist/src/utils/transform-loader.js +281 -0
  113. package/dist/src/utils/transform-loader.js.map +1 -0
  114. package/dist/src/utils/validators.js +40 -0
  115. package/dist/src/utils/validators.js.map +1 -0
  116. package/dist/src/utils/zod-adapter.js +144 -0
  117. package/dist/src/utils/zod-adapter.js.map +1 -0
  118. package/dist/src/web-server/index.js +648 -0
  119. package/dist/src/web-server/index.js.map +1 -0
  120. package/dist/src/workers/csv-multithreaded.js +211 -0
  121. package/dist/src/workers/csv-multithreaded.js.map +1 -0
  122. package/dist/src/workers/csv-parser.worker.js +179 -0
  123. package/dist/src/workers/csv-parser.worker.js.map +1 -0
  124. package/dist/src/workers/worker-pool.js +228 -0
  125. package/dist/src/workers/worker-pool.js.map +1 -0
  126. package/dist/stream-csv-to-json.js +665 -0
  127. package/dist/stream-csv-to-json.js.map +1 -0
  128. package/dist/stream-json-to-csv.js +389 -0
  129. package/dist/stream-json-to-csv.js.map +1 -0
  130. package/examples/advanced/conditional-transformations.ts +446 -0
  131. package/examples/advanced/csv-parser.worker.ts +89 -0
  132. package/examples/advanced/nested-objects-example.ts +306 -0
  133. package/examples/advanced/performance-optimization.ts +504 -0
  134. package/examples/advanced/run-demo-server.ts +116 -0
  135. package/examples/advanced/web-worker-usage.html +874 -0
  136. package/examples/async-multithreaded-example.ts +335 -0
  137. package/examples/cli-advanced-usage.md +290 -0
  138. package/examples/{cli-batch-processing.js → cli-batch-processing.ts} +38 -38
  139. package/examples/{cli-tool.js → cli-tool.ts} +5 -8
  140. package/examples/{error-handling.js → error-handling.ts} +356 -324
  141. package/examples/{express-api.js → express-api.ts} +161 -164
  142. package/examples/{large-dataset-example.js → large-dataset-example.ts} +201 -182
  143. package/examples/{ndjson-processing.js → ndjson-processing.ts} +456 -434
  144. package/examples/{plugin-excel-exporter.js → plugin-excel-exporter.ts} +6 -7
  145. package/examples/react-integration.tsx +637 -0
  146. package/examples/{schema-validation.js → schema-validation.ts} +2 -2
  147. package/examples/simple-usage.ts +194 -0
  148. package/examples/{streaming-example.js → streaming-example.ts} +12 -12
  149. package/index.d.ts +187 -18
  150. package/package.json +75 -81
  151. package/plugins.d.ts +37 -0
  152. package/schema.d.ts +103 -0
  153. package/src/browser/browser-functions.ts +402 -0
  154. package/src/browser/core.ts +152 -0
  155. package/src/browser/csv-to-json-browser.d.ts +3 -0
  156. package/src/browser/csv-to-json-browser.ts +494 -0
  157. package/src/browser/{errors-browser.js → errors-browser.ts} +305 -197
  158. package/src/browser/extensions/plugins.ts +93 -0
  159. package/src/browser/extensions/workers.ts +39 -0
  160. package/src/browser/globals.d.ts +5 -0
  161. package/src/browser/index.ts +192 -0
  162. package/src/browser/json-to-csv-browser.d.ts +3 -0
  163. package/src/browser/json-to-csv-browser.ts +338 -0
  164. package/src/browser/streams.ts +403 -0
  165. package/src/browser/workers/{csv-parser.worker.js → csv-parser.worker.ts} +3 -3
  166. package/src/browser/workers/{worker-pool.js → worker-pool.ts} +51 -30
  167. package/src/core/delimiter-cache.ts +320 -0
  168. package/src/core/{node-optimizations.js → node-optimizations.ts} +448 -407
  169. package/src/core/plugin-system.ts +588 -0
  170. package/src/core/transform-hooks.ts +566 -0
  171. package/src/engines/{fast-path-engine-new.js → fast-path-engine-new.ts} +11 -2
  172. package/src/engines/{fast-path-engine.js → fast-path-engine.ts} +79 -53
  173. package/src/errors.ts +1 -0
  174. package/src/formats/{ndjson-parser.js → ndjson-parser.ts} +24 -16
  175. package/src/formats/{tsv-parser.js → tsv-parser.ts} +18 -17
  176. package/src/{index-with-plugins.js → index-with-plugins.ts} +381 -357
  177. package/src/types/index.ts +275 -0
  178. package/src/utils/bom-utils.ts +373 -0
  179. package/src/utils/encoding-support.ts +155 -0
  180. package/src/utils/{schema-validator.js → schema-validator.ts} +814 -589
  181. package/src/utils/transform-loader.ts +389 -0
  182. package/src/utils/validators.ts +35 -0
  183. package/src/utils/zod-adapter.ts +280 -0
  184. package/src/web-server/{index.js → index.ts} +19 -19
  185. package/src/workers/csv-multithreaded.ts +310 -0
  186. package/src/workers/csv-parser.worker.ts +227 -0
  187. package/src/workers/worker-pool.ts +409 -0
  188. package/bin/jtcsv.js +0 -2462
  189. package/csv-to-json.js +0 -688
  190. package/errors.js +0 -208
  191. package/examples/simple-usage.js +0 -282
  192. package/index.js +0 -68
  193. package/json-save.js +0 -254
  194. package/json-to-csv.js +0 -526
  195. package/plugins/README.md +0 -91
  196. package/plugins/express-middleware/README.md +0 -64
  197. package/plugins/express-middleware/example.js +0 -136
  198. package/plugins/express-middleware/index.d.ts +0 -114
  199. package/plugins/express-middleware/index.js +0 -360
  200. package/plugins/express-middleware/package.json +0 -52
  201. package/plugins/fastify-plugin/index.js +0 -406
  202. package/plugins/fastify-plugin/package.json +0 -55
  203. package/plugins/hono/README.md +0 -28
  204. package/plugins/hono/index.d.ts +0 -12
  205. package/plugins/hono/index.js +0 -36
  206. package/plugins/hono/package.json +0 -35
  207. package/plugins/nestjs/README.md +0 -35
  208. package/plugins/nestjs/index.d.ts +0 -25
  209. package/plugins/nestjs/index.js +0 -77
  210. package/plugins/nestjs/package.json +0 -37
  211. package/plugins/nextjs-api/README.md +0 -57
  212. package/plugins/nextjs-api/examples/ConverterComponent.jsx +0 -386
  213. package/plugins/nextjs-api/examples/api-convert.js +0 -69
  214. package/plugins/nextjs-api/index.js +0 -387
  215. package/plugins/nextjs-api/package.json +0 -63
  216. package/plugins/nextjs-api/route.js +0 -371
  217. package/plugins/nuxt/README.md +0 -24
  218. package/plugins/nuxt/index.js +0 -21
  219. package/plugins/nuxt/package.json +0 -35
  220. package/plugins/nuxt/runtime/composables/useJtcsv.js +0 -6
  221. package/plugins/nuxt/runtime/plugin.js +0 -6
  222. package/plugins/remix/README.md +0 -26
  223. package/plugins/remix/index.d.ts +0 -16
  224. package/plugins/remix/index.js +0 -62
  225. package/plugins/remix/package.json +0 -35
  226. package/plugins/sveltekit/README.md +0 -28
  227. package/plugins/sveltekit/index.d.ts +0 -17
  228. package/plugins/sveltekit/index.js +0 -54
  229. package/plugins/sveltekit/package.json +0 -33
  230. package/plugins/trpc/README.md +0 -25
  231. package/plugins/trpc/index.d.ts +0 -7
  232. package/plugins/trpc/index.js +0 -32
  233. package/plugins/trpc/package.json +0 -34
  234. package/src/browser/browser-functions.js +0 -219
  235. package/src/browser/csv-to-json-browser.js +0 -700
  236. package/src/browser/index.js +0 -113
  237. package/src/browser/json-to-csv-browser.js +0 -309
  238. package/src/browser/streams.js +0 -393
  239. package/src/core/delimiter-cache.js +0 -186
  240. package/src/core/plugin-system.js +0 -476
  241. package/src/core/transform-hooks.js +0 -350
  242. package/src/errors.js +0 -26
  243. package/src/utils/transform-loader.js +0 -205
  244. package/stream-csv-to-json.js +0 -542
  245. package/stream-json-to-csv.js +0 -464
  246. /package/examples/{web-workers-advanced.js → web-workers-advanced.ts} +0 -0
@@ -0,0 +1,320 @@
1
+ /**
2
+ * Кэширование результатов авто-детектирования разделителя
3
+ * Использует WeakMap и LRU кэш для оптимизации производительности
4
+ *
5
+ * @version 1.0.0
6
+ * @date 2026-01-23
7
+ */
8
+
9
+ interface CacheStats {
10
+ hits: number;
11
+ misses: number;
12
+ evictions: number;
13
+ size: number;
14
+ }
15
+
16
+ interface CacheStatsWithRates extends CacheStats {
17
+ hitRate: number;
18
+ totalRequests: number;
19
+ }
20
+
21
+ export class DelimiterCache {
22
+ private weakMap: WeakMap<object, string>;
23
+ private lruCache: Map<string, string>;
24
+ private maxSize: number;
25
+ private stats: CacheStats;
26
+
27
+ constructor(maxSize: number = 100) {
28
+ this.weakMap = new WeakMap();
29
+ this.lruCache = new Map();
30
+ this.maxSize = maxSize;
31
+ this.stats = {
32
+ hits: 0,
33
+ misses: 0,
34
+ evictions: 0,
35
+ size: 0
36
+ };
37
+ }
38
+
39
+ /**
40
+ * Генерирует ключ кэша на основе строки и кандидатов
41
+ * @private
42
+ */
43
+ private _generateKey(csv: string, candidates: string[]): string {
44
+ // Используем хэш первых 1000 символов для производительности
45
+ const sample = csv.substring(0, Math.min(1000, csv.length));
46
+ const candidatesKey = candidates.join(',');
47
+ return `${this._hashString(sample)}:${candidatesKey}`;
48
+ }
49
+
50
+ /**
51
+ * Простая хэш-функция для строк
52
+ * @private
53
+ */
54
+ private _hashString(str: string): string {
55
+ let hash = 0;
56
+ for (let i = 0; i < str.length; i++) {
57
+ const char = str.charCodeAt(i);
58
+ hash = ((hash << 5) - hash) + char;
59
+ hash = hash & hash; // Convert to 32bit integer
60
+ }
61
+ return hash.toString(36);
62
+ }
63
+
64
+ /**
65
+ * Получает значение из кэша
66
+ * @param csv - CSV строка
67
+ * @param candidates - Кандидаты разделителей
68
+ * @returns Найденный разделитель или undefined
69
+ */
70
+ get(csv: string, candidates: string[]): string | null {
71
+ // Сначала проверяем WeakMap (для объектов)
72
+ if (typeof csv === 'object' && csv !== null) {
73
+ const result = this.weakMap.get(csv as any);
74
+ if (result !== undefined) {
75
+ this.stats.hits++;
76
+ return result;
77
+ }
78
+ }
79
+
80
+ // Проверяем LRU кэш
81
+ const key = this._generateKey(csv, candidates);
82
+ const result = this.lruCache.get(key);
83
+
84
+ if (result !== undefined) {
85
+ // Обновляем позицию в LRU (перемещаем в конец)
86
+ this.lruCache.delete(key);
87
+ this.lruCache.set(key, result);
88
+ this.stats.hits++;
89
+ return result;
90
+ }
91
+
92
+ this.stats.misses++;
93
+ return null;
94
+ }
95
+
96
+ /**
97
+ * Сохраняет значение в кэш
98
+ * @param csv - CSV строка
99
+ * @param candidates - Кандидаты разделителей
100
+ * @param delimiter - Найденный разделитель
101
+ */
102
+ set(csv: string, candidates: string[], delimiter: string): void {
103
+ // Сохраняем в WeakMap для объектов
104
+ if (typeof csv === 'object' && csv !== null) {
105
+ this.weakMap.set(csv as any, delimiter);
106
+ }
107
+
108
+ // Сохраняем в LRU кэш
109
+ const key = this._generateKey(csv, candidates);
110
+
111
+ // Проверяем размер кэша
112
+ if (this.lruCache.size >= this.maxSize) {
113
+ // Удаляем самый старый элемент (первый в Map)
114
+ const firstKey = this.lruCache.keys().next().value;
115
+ if (firstKey) {
116
+ this.lruCache.delete(firstKey);
117
+ this.stats.evictions++;
118
+ }
119
+ }
120
+
121
+ this.lruCache.set(key, delimiter);
122
+ this.stats.size = this.lruCache.size;
123
+ }
124
+
125
+ /**
126
+ * Очищает кэш
127
+ */
128
+ clear(): void {
129
+ this.weakMap = new WeakMap();
130
+ this.lruCache.clear();
131
+ this.stats = {
132
+ hits: 0,
133
+ misses: 0,
134
+ evictions: 0,
135
+ size: 0
136
+ };
137
+ }
138
+
139
+ /**
140
+ * Возвращает статистику кэша
141
+ */
142
+ getStats(): CacheStatsWithRates {
143
+ const totalRequests = this.stats.hits + this.stats.misses;
144
+ return {
145
+ ...this.stats,
146
+ totalRequests,
147
+ hitRate: totalRequests > 0 ? (this.stats.hits / totalRequests) * 100 : 0
148
+ };
149
+ }
150
+
151
+ /**
152
+ * Проверяет наличие значения в кэше
153
+ */
154
+ has(csv: string, candidates: string[]): boolean {
155
+ if (typeof csv === 'object' && csv !== null) {
156
+ return this.weakMap.has(csv as any);
157
+ }
158
+
159
+ const key = this._generateKey(csv, candidates);
160
+ return this.lruCache.has(key);
161
+ }
162
+
163
+ /**
164
+ * Удаляет значение из кэша
165
+ */
166
+ delete(csv: string, candidates: string[]): boolean {
167
+ let deleted = false;
168
+
169
+ if (typeof csv === 'object' && csv !== null) {
170
+ deleted = this.weakMap.delete(csv as any);
171
+ }
172
+
173
+ const key = this._generateKey(csv, candidates);
174
+ if (this.lruCache.delete(key)) {
175
+ deleted = true;
176
+ this.stats.size = this.lruCache.size;
177
+ }
178
+
179
+ return deleted;
180
+ }
181
+
182
+ /**
183
+ * Возвращает размер кэша
184
+ */
185
+ get size(): number {
186
+ return this.lruCache.size;
187
+ }
188
+
189
+ /**
190
+ * Асинхронная версия get
191
+ */
192
+ async getAsync(csv: string, candidates: string[]): Promise<string | null> {
193
+ return this.get(csv, candidates);
194
+ }
195
+
196
+ /**
197
+ * Асинхронная версия set
198
+ */
199
+ async setAsync(csv: string, candidates: string[], delimiter: string): Promise<void> {
200
+ return this.set(csv, candidates, delimiter);
201
+ }
202
+
203
+ /**
204
+ * Асинхронная версия clear
205
+ */
206
+ async clearAsync(): Promise<void> {
207
+ return this.clear();
208
+ }
209
+
210
+ /**
211
+ * Оптимизированная версия autoDetectDelimiter с кэшированием
212
+ */
213
+ static autoDetectDelimiter(
214
+ csv: string,
215
+ candidates: string[] = [';', ',', '\t', '|'],
216
+ cache: DelimiterCache | null = null
217
+ ): string {
218
+ if (!csv || typeof csv !== 'string') {
219
+ return ';';
220
+ }
221
+
222
+ // Проверяем кэш если он предоставлен
223
+ if (cache) {
224
+ const cached = cache.get(csv, candidates);
225
+ if (cached !== null) {
226
+ return cached;
227
+ }
228
+ }
229
+
230
+ const lines = csv.split('\n').filter(line => line.trim().length > 0);
231
+
232
+ if (lines.length === 0) {
233
+ return ';';
234
+ }
235
+
236
+ // Используем первую непустую строку для детектирования
237
+ const firstLine = lines[0];
238
+
239
+ // Быстрый подсчёт вхождений кандидатов за один проход
240
+ const counts: Record<string, number> = {};
241
+ const candidateSet = new Set(candidates);
242
+ for (let i = 0; i < firstLine.length; i++) {
243
+ const char = firstLine[i];
244
+ if (candidateSet.has(char)) {
245
+ counts[char] = (counts[char] || 0) + 1;
246
+ }
247
+ }
248
+
249
+ for (const delim of candidates) {
250
+ if (!(delim in counts)) {
251
+ counts[delim] = 0;
252
+ }
253
+ }
254
+
255
+ let maxCount = -1;
256
+ let detectedDelimiter = ';';
257
+ const maxDelimiters: string[] = [];
258
+
259
+ for (const [delim, count] of Object.entries(counts)) {
260
+ if (count > maxCount) {
261
+ maxCount = count;
262
+ maxDelimiters.length = 0;
263
+ maxDelimiters.push(delim);
264
+ } else if (count === maxCount) {
265
+ maxDelimiters.push(delim);
266
+ }
267
+ }
268
+
269
+ if (maxCount === 0 || maxDelimiters.length > 1) {
270
+ detectedDelimiter = ';';
271
+ } else {
272
+ detectedDelimiter = maxDelimiters[0];
273
+ }
274
+
275
+ if (cache) {
276
+ cache.set(csv, candidates, detectedDelimiter);
277
+ }
278
+
279
+ return detectedDelimiter;
280
+ }
281
+ }
282
+
283
+ // Создание глобального экземпляра кэша
284
+ let globalCache: DelimiterCache | null = null;
285
+
286
+ /**
287
+ * Возвращает глобальный экземпляр кэша разделителей
288
+ */
289
+ export function getGlobalDelimiterCache(maxSize: number = 100): DelimiterCache {
290
+ if (!globalCache) {
291
+ globalCache = new DelimiterCache(maxSize);
292
+ }
293
+ return globalCache;
294
+ }
295
+
296
+ /**
297
+ * Асинхронная версия getGlobalDelimiterCache
298
+ */
299
+ export async function getGlobalDelimiterCacheAsync(maxSize: number = 100): Promise<DelimiterCache> {
300
+ return getGlobalDelimiterCache(maxSize);
301
+ }
302
+
303
+ export default DelimiterCache;
304
+
305
+ // Экспорт для CommonJS
306
+ if (typeof module !== 'undefined' && module.exports) {
307
+ const current = module.exports;
308
+ if (current && current.__esModule) {
309
+ current.DelimiterCache = DelimiterCache;
310
+ current.getGlobalDelimiterCache = getGlobalDelimiterCache;
311
+ current.getGlobalDelimiterCacheAsync = getGlobalDelimiterCacheAsync;
312
+ current.default = DelimiterCache;
313
+ } else {
314
+ module.exports = DelimiterCache;
315
+ module.exports.DelimiterCache = DelimiterCache;
316
+ module.exports.getGlobalDelimiterCache = getGlobalDelimiterCache;
317
+ module.exports.getGlobalDelimiterCacheAsync = getGlobalDelimiterCacheAsync;
318
+ module.exports.default = DelimiterCache;
319
+ }
320
+ }