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
@@ -1,212 +1,320 @@
1
- // Система ошибок для браузерной версии jtcsv
2
- // Адаптирована для работы без Node.js специфичных API
3
-
4
- /**
5
- * Базовый класс ошибки jtcsv
6
- */
1
+ // Система ошибок для браузерной версии jtcsv
2
+ // Адаптирована для работы без Node.js специфичных API
3
+
4
+ /**
5
+ * Детали ошибки
6
+ */
7
+ export interface ErrorDetails {
8
+ [key: string]: any;
9
+ originalError?: Error;
10
+ lineNumber?: number;
11
+ limit?: any;
12
+ actual?: any;
13
+ hint?: string;
14
+ docs?: string;
15
+ context?: any;
16
+ }
17
+
18
+ /**
19
+ * Базовый класс ошибки jtcsv
20
+ */
7
21
  export class JTCSVError extends Error {
8
- constructor(message, code = 'JTCSV_ERROR', details = {}) {
22
+ code: string;
23
+ details: ErrorDetails;
24
+ hint?: string;
25
+ docs?: string;
26
+ context?: any;
27
+
28
+ constructor(message: string, code: string = 'JTCSV_ERROR', details: ErrorDetails = {}) {
9
29
  super(message);
10
30
  this.name = 'JTCSVError';
11
31
  this.code = code;
12
32
  this.details = details;
33
+ this.hint = details.hint;
34
+ this.docs = details.docs;
35
+ this.context = details.context;
36
+
37
+ // Сохранение stack trace
38
+ if (Error.captureStackTrace) {
39
+ Error.captureStackTrace(this, JTCSVError);
40
+ }
41
+ }
42
+ }
43
+
44
+ /**
45
+ * Ошибка валидации
46
+ */
47
+ export class ValidationError extends JTCSVError {
48
+ constructor(message: string, details: ErrorDetails = {}) {
49
+ super(message, 'VALIDATION_ERROR', details);
50
+ this.name = 'ValidationError';
51
+ }
52
+ }
53
+
54
+ /**
55
+ * Ошибка безопасности
56
+ */
57
+ export class SecurityError extends JTCSVError {
58
+ constructor(message: string, details: ErrorDetails = {}) {
59
+ super(message, 'SECURITY_ERROR', details);
60
+ this.name = 'SecurityError';
61
+ }
62
+ }
63
+
64
+ /**
65
+ * Ошибка файловой системы (адаптирована для браузера)
66
+ */
67
+ export class FileSystemError extends JTCSVError {
68
+ constructor(message: string, originalError?: Error, details: ErrorDetails = {}) {
69
+ super(message, 'FILE_SYSTEM_ERROR', { ...details, originalError });
70
+ this.name = 'FileSystemError';
71
+
72
+ if (originalError && (originalError as any).code) {
73
+ this.code = (originalError as any).code;
74
+ }
75
+ }
76
+ }
77
+
78
+ /**
79
+ * Ошибка парсинга
80
+ */
81
+ export class ParsingError extends JTCSVError {
82
+ lineNumber?: number;
83
+
84
+ constructor(message: string, lineNumber?: number, details: ErrorDetails = {}) {
85
+ super(message, 'PARSING_ERROR', { ...details, lineNumber });
86
+ this.name = 'ParsingError';
87
+ this.lineNumber = lineNumber;
88
+ }
89
+ }
90
+
91
+ /**
92
+ * Ошибка превышения лимита
93
+ */
94
+ export class LimitError extends JTCSVError {
95
+ limit: any;
96
+ actual: any;
97
+
98
+ constructor(message: string, limit: any, actual: any, details: ErrorDetails = {}) {
99
+ super(message, 'LIMIT_ERROR', { ...details, limit, actual });
100
+ this.name = 'LimitError';
101
+ this.limit = limit;
102
+ this.actual = actual;
103
+ }
104
+ }
105
+
106
+ /**
107
+ * Ошибка конфигурации
108
+ */
109
+ export class ConfigurationError extends JTCSVError {
110
+ constructor(message: string, details: ErrorDetails = {}) {
111
+ super(message, 'CONFIGURATION_ERROR', details);
112
+ this.name = 'ConfigurationError';
113
+ }
114
+ }
115
+
116
+ /**
117
+ * Коды ошибок
118
+ */
119
+ export const ERROR_CODES = {
120
+ JTCSV_ERROR: 'JTCSV_ERROR',
121
+ VALIDATION_ERROR: 'VALIDATION_ERROR',
122
+ SECURITY_ERROR: 'SECURITY_ERROR',
123
+ FILE_SYSTEM_ERROR: 'FILE_SYSTEM_ERROR',
124
+ PARSING_ERROR: 'PARSING_ERROR',
125
+ LIMIT_ERROR: 'LIMIT_ERROR',
126
+ CONFIGURATION_ERROR: 'CONFIGURATION_ERROR',
127
+ INVALID_INPUT: 'INVALID_INPUT',
128
+ SECURITY_VIOLATION: 'SECURITY_VIOLATION',
129
+ FILE_NOT_FOUND: 'FILE_NOT_FOUND',
130
+ PARSE_FAILED: 'PARSE_FAILED',
131
+ SIZE_LIMIT: 'SIZE_LIMIT',
132
+ INVALID_CONFIG: 'INVALID_CONFIG',
133
+ UNKNOWN_ERROR: 'UNKNOWN_ERROR'
134
+ } as const;
135
+
136
+ export type ErrorCode = typeof ERROR_CODES[keyof typeof ERROR_CODES];
137
+
138
+ /**
139
+ * Безопасное выполнение функции с обработкой ошибок
140
+ *
141
+ * @param fn - Функция для выполнения
142
+ * @param errorCode - Код ошибки по умолчанию
143
+ * @param errorDetails - Детали ошибки
144
+ * @returns Результат выполнения функции
145
+ */
146
+ export function safeExecute<T>(
147
+ fn: () => T,
148
+ errorCode: ErrorCode = 'UNKNOWN_ERROR',
149
+ errorDetails: ErrorDetails = {}
150
+ ): T {
151
+ try {
152
+ if (typeof fn === 'function') {
153
+ return fn();
154
+ }
155
+ throw new ValidationError('Function expected');
156
+ } catch (error) {
157
+ // Если ошибка уже является JTCSVError, перебросить её
158
+ if (error instanceof JTCSVError) {
159
+ throw error;
160
+ }
161
+
162
+ // Определить тип ошибки на основе сообщения или кода
163
+ let enhancedError: JTCSVError;
164
+ const errorMessage = (error as Error).message || String(error);
165
+
166
+ if (errorMessage.includes('validation') || errorMessage.includes('Validation')) {
167
+ enhancedError = new ValidationError(errorMessage, { ...errorDetails, originalError: error as Error });
168
+ } else if (errorMessage.includes('security') || errorMessage.includes('Security')) {
169
+ enhancedError = new SecurityError(errorMessage, { ...errorDetails, originalError: error as Error });
170
+ } else if (errorMessage.includes('parsing') || errorMessage.includes('Parsing')) {
171
+ enhancedError = new ParsingError(errorMessage, undefined, { ...errorDetails, originalError: error as Error });
172
+ } else if (errorMessage.includes('limit') || errorMessage.includes('Limit')) {
173
+ enhancedError = new LimitError(errorMessage, null, null, { ...errorDetails, originalError: error as Error });
174
+ } else if (errorMessage.includes('configuration') || errorMessage.includes('Configuration')) {
175
+ enhancedError = new ConfigurationError(errorMessage, { ...errorDetails, originalError: error as Error });
176
+ } else if (errorMessage.includes('file') || errorMessage.includes('File')) {
177
+ enhancedError = new FileSystemError(errorMessage, error as Error, errorDetails);
178
+ } else {
179
+ // Общая ошибка
180
+ enhancedError = new JTCSVError(errorMessage, errorCode, { ...errorDetails, originalError: error as Error });
181
+ }
182
+
183
+ // Сохранить оригинальный stack trace если возможно
184
+ if ((error as Error).stack) {
185
+ enhancedError.stack = (error as Error).stack;
186
+ }
187
+
188
+ throw enhancedError;
189
+ }
190
+ }
191
+
192
+ /**
193
+ * Асинхронная версия safeExecute
194
+ */
195
+ export async function safeExecuteAsync<T>(
196
+ fn: () => Promise<T> | T,
197
+ errorCode: ErrorCode = 'UNKNOWN_ERROR',
198
+ errorDetails: ErrorDetails = {}
199
+ ): Promise<T> {
200
+ try {
201
+ if (typeof fn === 'function') {
202
+ return await fn();
203
+ }
204
+ throw new ValidationError('Function expected');
205
+ } catch (error) {
206
+ // Если ошибка уже является JTCSVError, перебросить её
207
+ if (error instanceof JTCSVError) {
208
+ throw error;
209
+ }
210
+
211
+ // Определить тип ошибки
212
+ let enhancedError: JTCSVError;
213
+ const errorMessage = (error as Error).message || String(error);
214
+
215
+ if (errorMessage.includes('validation') || errorMessage.includes('Validation')) {
216
+ enhancedError = new ValidationError(errorMessage, { ...errorDetails, originalError: error as Error });
217
+ } else if (errorMessage.includes('security') || errorMessage.includes('Security')) {
218
+ enhancedError = new SecurityError(errorMessage, { ...errorDetails, originalError: error as Error });
219
+ } else if (errorMessage.includes('parsing') || errorMessage.includes('Parsing')) {
220
+ enhancedError = new ParsingError(errorMessage, undefined, { ...errorDetails, originalError: error as Error });
221
+ } else if (errorMessage.includes('limit') || errorMessage.includes('Limit')) {
222
+ enhancedError = new LimitError(errorMessage, null, null, { ...errorDetails, originalError: error as Error });
223
+ } else if (errorMessage.includes('configuration') || errorMessage.includes('Configuration')) {
224
+ enhancedError = new ConfigurationError(errorMessage, { ...errorDetails, originalError: error as Error });
225
+ } else if (errorMessage.includes('file') || errorMessage.includes('File')) {
226
+ enhancedError = new FileSystemError(errorMessage, error as Error, errorDetails);
227
+ } else {
228
+ enhancedError = new JTCSVError(errorMessage, errorCode, { ...errorDetails, originalError: error as Error });
229
+ }
230
+
231
+ if ((error as Error).stack) {
232
+ enhancedError.stack = (error as Error).stack;
233
+ }
234
+
235
+ throw enhancedError;
236
+ }
237
+ }
238
+
239
+ /**
240
+ * Создать сообщение об ошибке
241
+ */
242
+ export function createErrorMessage(
243
+ error: Error | JTCSVError,
244
+ includeStack: boolean = false
245
+ ): string {
246
+ let message = error.message || 'Unknown error';
247
+
248
+ if (error instanceof JTCSVError) {
249
+ message = `[${error.code}] ${message}`;
13
250
 
14
- // Сохранение stack trace
15
- if (Error.captureStackTrace) {
16
- Error.captureStackTrace(this, JTCSVError);
251
+ if (error instanceof ParsingError && error.lineNumber) {
252
+ message += ` (line ${error.lineNumber})`;
17
253
  }
18
- }
19
- }
20
-
21
- /**
22
- * Ошибка валидации
23
- */
24
- export class ValidationError extends JTCSVError {
25
- constructor(message, details = {}) {
26
- super(message, 'VALIDATION_ERROR', details);
27
- this.name = 'ValidationError';
28
- }
29
- }
30
-
31
- /**
32
- * Ошибка безопасности
33
- */
34
- export class SecurityError extends JTCSVError {
35
- constructor(message, details = {}) {
36
- super(message, 'SECURITY_ERROR', details);
37
- this.name = 'SecurityError';
38
- }
39
- }
40
-
41
- /**
42
- * Ошибка файловой системы (адаптирована для браузера)
43
- */
44
- export class FileSystemError extends JTCSVError {
45
- constructor(message, originalError = null, details = {}) {
46
- super(message, 'FILE_SYSTEM_ERROR', { ...details, originalError });
47
- this.name = 'FileSystemError';
48
254
 
49
- if (originalError && originalError.code) {
50
- this.code = originalError.code;
255
+ if (error instanceof LimitError && error.limit && error.actual) {
256
+ message += ` (limit: ${error.limit}, actual: ${error.actual})`;
51
257
  }
52
- }
53
- }
54
-
55
- /**
56
- * Ошибка парсинга
57
- */
58
- export class ParsingError extends JTCSVError {
59
- constructor(message, lineNumber = null, details = {}) {
60
- super(message, 'PARSING_ERROR', { ...details, lineNumber });
61
- this.name = 'ParsingError';
62
- this.lineNumber = lineNumber;
63
- }
64
- }
65
-
66
- /**
67
- * Ошибка превышения лимита
68
- */
69
- export class LimitError extends JTCSVError {
70
- constructor(message, limit, actual, details = {}) {
71
- super(message, 'LIMIT_ERROR', { ...details, limit, actual });
72
- this.name = 'LimitError';
73
- this.limit = limit;
74
- this.actual = actual;
75
- }
76
- }
77
-
78
- /**
79
- * Ошибка конфигурации
80
- */
81
- export class ConfigurationError extends JTCSVError {
82
- constructor(message, details = {}) {
83
- super(message, 'CONFIGURATION_ERROR', details);
84
- this.name = 'ConfigurationError';
85
- }
86
- }
87
-
88
- export const ERROR_CODES = {
89
- JTCSV_ERROR: 'JTCSV_ERROR',
90
- VALIDATION_ERROR: 'VALIDATION_ERROR',
91
- SECURITY_ERROR: 'SECURITY_ERROR',
92
- FILE_SYSTEM_ERROR: 'FILE_SYSTEM_ERROR',
93
- PARSING_ERROR: 'PARSING_ERROR',
94
- LIMIT_ERROR: 'LIMIT_ERROR',
95
- CONFIGURATION_ERROR: 'CONFIGURATION_ERROR',
96
- INVALID_INPUT: 'INVALID_INPUT',
97
- SECURITY_VIOLATION: 'SECURITY_VIOLATION',
98
- FILE_NOT_FOUND: 'FILE_NOT_FOUND',
99
- PARSE_FAILED: 'PARSE_FAILED',
100
- SIZE_LIMIT: 'SIZE_LIMIT',
101
- INVALID_CONFIG: 'INVALID_CONFIG',
102
- UNKNOWN_ERROR: 'UNKNOWN_ERROR'
103
- };
104
258
 
105
- /**
106
- * Безопасное выполнение функции с обработкой ошибок
107
- *
108
- * @param {Function} fn - Функция для выполнения
109
- * @param {string} errorCode - Код ошибки по умолчанию
110
- * @param {Object} errorDetails - Детали ошибки
111
- * @returns {*} Результат выполнения функции
112
- */
113
- export function safeExecute(fn, errorCode = 'UNKNOWN_ERROR', errorDetails = {}) {
114
- try {
115
- if (typeof fn === 'function') {
116
- return fn();
259
+ if (error.hint) {
260
+ message += `\nHint: ${error.hint}`;
117
261
  }
118
- throw new ValidationError('Function expected');
119
- } catch (error) {
120
- // Если ошибка уже является JTCSVError, перебросить её
121
- if (error instanceof JTCSVError) {
122
- throw error;
123
- }
124
-
125
- // Определить тип ошибки на основе сообщения или кода
126
- let enhancedError;
127
- const errorMessage = error.message || String(error);
128
-
129
- if (errorMessage.includes('validation') || errorMessage.includes('Validation')) {
130
- enhancedError = new ValidationError(errorMessage, { ...errorDetails, originalError: error });
131
- } else if (errorMessage.includes('security') || errorMessage.includes('Security')) {
132
- enhancedError = new SecurityError(errorMessage, { ...errorDetails, originalError: error });
133
- } else if (errorMessage.includes('parsing') || errorMessage.includes('Parsing')) {
134
- enhancedError = new ParsingError(errorMessage, null, { ...errorDetails, originalError: error });
135
- } else if (errorMessage.includes('limit') || errorMessage.includes('Limit')) {
136
- enhancedError = new LimitError(errorMessage, null, null, { ...errorDetails, originalError: error });
137
- } else if (errorMessage.includes('configuration') || errorMessage.includes('Configuration')) {
138
- enhancedError = new ConfigurationError(errorMessage, { ...errorDetails, originalError: error });
139
- } else if (errorMessage.includes('file') || errorMessage.includes('File')) {
140
- enhancedError = new FileSystemError(errorMessage, error, errorDetails);
141
- } else {
142
- // Общая ошибка
143
- enhancedError = new JTCSVError(errorMessage, errorCode, { ...errorDetails, originalError: error });
144
- }
145
-
146
- // Сохранить оригинальный stack trace если возможно
147
- if (error.stack) {
148
- enhancedError.stack = error.stack;
149
- }
150
-
151
- throw enhancedError;
152
- }
153
- }
154
262
 
155
- /**
156
- * Асинхронная версия safeExecute
157
- */
158
- export async function safeExecuteAsync(fn, errorCode = 'UNKNOWN_ERROR', errorDetails = {}) {
159
- try {
160
- if (typeof fn === 'function') {
161
- return await fn();
162
- }
163
- throw new ValidationError('Function expected');
164
- } catch (error) {
165
- // Если ошибка уже является JTCSVError, перебросить её
166
- if (error instanceof JTCSVError) {
167
- throw error;
168
- }
169
-
170
- // Определить тип ошибки
171
- let enhancedError;
172
- const errorMessage = error.message || String(error);
173
-
174
- if (errorMessage.includes('validation') || errorMessage.includes('Validation')) {
175
- enhancedError = new ValidationError(errorMessage, { ...errorDetails, originalError: error });
176
- } else if (errorMessage.includes('security') || errorMessage.includes('Security')) {
177
- enhancedError = new SecurityError(errorMessage, { ...errorDetails, originalError: error });
178
- } else if (errorMessage.includes('parsing') || errorMessage.includes('Parsing')) {
179
- enhancedError = new ParsingError(errorMessage, null, { ...errorDetails, originalError: error });
180
- } else if (errorMessage.includes('limit') || errorMessage.includes('Limit')) {
181
- enhancedError = new LimitError(errorMessage, null, null, { ...errorDetails, originalError: error });
182
- } else if (errorMessage.includes('configuration') || errorMessage.includes('Configuration')) {
183
- enhancedError = new ConfigurationError(errorMessage, { ...errorDetails, originalError: error });
184
- } else if (errorMessage.includes('file') || errorMessage.includes('File')) {
185
- enhancedError = new FileSystemError(errorMessage, error, errorDetails);
186
- } else {
187
- enhancedError = new JTCSVError(errorMessage, errorCode, { ...errorDetails, originalError: error });
263
+ if (error.docs) {
264
+ message += `\nDocs: ${error.docs}`;
188
265
  }
189
-
190
- if (error.stack) {
191
- enhancedError.stack = error.stack;
192
- }
193
-
194
- throw enhancedError;
195
266
  }
196
- }
197
-
198
- // Экспорт для Node.js совместимости
199
- if (typeof module !== 'undefined' && module.exports) {
200
- module.exports = {
201
- JTCSVError,
202
- ValidationError,
203
- SecurityError,
204
- FileSystemError,
205
- ParsingError,
206
- LimitError,
207
- ConfigurationError,
208
- ERROR_CODES,
209
- safeExecute,
210
- safeExecuteAsync
211
- };
267
+
268
+ if (includeStack && error.stack) {
269
+ message += `\n${error.stack}`;
270
+ }
271
+
272
+ return message;
273
+ }
274
+
275
+ /**
276
+ * Обработка ошибки
277
+ */
278
+ export function handleError(
279
+ error: Error | JTCSVError,
280
+ options: {
281
+ log?: boolean;
282
+ throw?: boolean;
283
+ format?: boolean;
284
+ } = {}
285
+ ): string {
286
+ const { log = true, throw: shouldThrow = false, format = true } = options;
287
+ const message = format ? createErrorMessage(error) : error.message;
288
+
289
+ if (log) {
290
+ console.error(`[jtcsv] ${message}`);
291
+
292
+ if (error instanceof JTCSVError && error.details) {
293
+ console.error('Error details:', error.details);
294
+ }
295
+ }
296
+
297
+ if (shouldThrow) {
298
+ throw error;
299
+ }
300
+
301
+ return message;
302
+ }
303
+
304
+ // Экспорт для Node.js совместимости
305
+ if (typeof module !== 'undefined' && module.exports) {
306
+ module.exports = {
307
+ JTCSVError,
308
+ ValidationError,
309
+ SecurityError,
310
+ FileSystemError,
311
+ ParsingError,
312
+ LimitError,
313
+ ConfigurationError,
314
+ ERROR_CODES,
315
+ safeExecute,
316
+ safeExecuteAsync,
317
+ createErrorMessage,
318
+ handleError
319
+ };
212
320
  }
@@ -0,0 +1,93 @@
1
+ // Расширение плагинов для jtcsv
2
+ // Подключает все плагины (express, fastify, nextjs и т.д.)
3
+
4
+ const jtcsvPlugins = {
5
+ // Плагины будут добавлены динамически при импорте
6
+ // Это placeholder для будущей реализации
7
+ };
8
+
9
+ // Динамический импорт плагинов (ленивая загрузка)
10
+ // Пути относительно корня проекта (плагины находятся в plugins/)
11
+ async function loadExpressPlugin() {
12
+ const mod = await import('../../../plugins/express-middleware/index.js');
13
+ return mod.default || mod;
14
+ }
15
+
16
+ async function loadFastifyPlugin() {
17
+ const mod = await import('../../../plugins/fastify-plugin/index.js');
18
+ return mod.default || mod;
19
+ }
20
+
21
+ async function loadNextJsPlugin() {
22
+ // @ts-ignore - the TS source lives in .tsx, use runtime JS
23
+ const mod = await import('../../../plugins/nextjs-api/index.js');
24
+ return mod.default || mod;
25
+ }
26
+
27
+ async function loadNestJsPlugin() {
28
+ const mod = await import('../../../plugins/nestjs/index.js');
29
+ return mod.default || mod;
30
+ }
31
+
32
+ async function loadRemixPlugin() {
33
+ const mod = await import('../../../plugins/remix/index.js');
34
+ return mod.default || mod;
35
+ }
36
+
37
+ async function loadNuxtPlugin() {
38
+ const mod = await import('../../../plugins/nuxt/index.js');
39
+ return mod.default || mod;
40
+ }
41
+
42
+ async function loadSvelteKitPlugin() {
43
+ const mod = await import('../../../plugins/sveltekit/index.js');
44
+ return mod.default || mod;
45
+ }
46
+
47
+ async function loadHonoPlugin() {
48
+ const mod = await import('../../../plugins/hono/index.js');
49
+ return mod.default || mod;
50
+ }
51
+
52
+ async function loadTrpcPlugin() {
53
+ const mod = await import('../../../plugins/trpc/index.js');
54
+ return mod.default || mod;
55
+ }
56
+
57
+ Object.assign(jtcsvPlugins, {
58
+ loadExpressPlugin,
59
+ loadFastifyPlugin,
60
+ loadNextJsPlugin,
61
+ loadNestJsPlugin,
62
+ loadRemixPlugin,
63
+ loadNuxtPlugin,
64
+ loadSvelteKitPlugin,
65
+ loadHonoPlugin,
66
+ loadTrpcPlugin
67
+ });
68
+
69
+ // Экспорт
70
+ if (typeof module !== 'undefined' && module.exports) {
71
+ module.exports = jtcsvPlugins;
72
+ } else if (typeof define === 'function' && define.amd) {
73
+ define([], () => jtcsvPlugins);
74
+ } else if (typeof window !== 'undefined' && window.jtcsv) {
75
+ // Расширяем глобальный jtcsv, если он существует
76
+ if (!window.jtcsv.plugins) {
77
+ window.jtcsv.plugins = {};
78
+ }
79
+ Object.assign(window.jtcsv.plugins, jtcsvPlugins);
80
+ }
81
+
82
+ export default jtcsvPlugins;
83
+ export {
84
+ loadExpressPlugin,
85
+ loadFastifyPlugin,
86
+ loadNextJsPlugin,
87
+ loadNestJsPlugin,
88
+ loadRemixPlugin,
89
+ loadNuxtPlugin,
90
+ loadSvelteKitPlugin,
91
+ loadHonoPlugin,
92
+ loadTrpcPlugin
93
+ };
@@ -0,0 +1,39 @@
1
+ // Расширение Web Workers для jtcsv
2
+ // Дополнительный модуль для параллельной обработки больших CSV
3
+
4
+ import { createWorkerPool, parseCSVWithWorker } from '../workers/worker-pool';
5
+
6
+ async function createWorkerPoolLazy(options = {}) {
7
+ const mod = await import('../workers/worker-pool');
8
+ return mod.createWorkerPool(options);
9
+ }
10
+
11
+ async function parseCSVWithWorkerLazy(csvInput, options = {}, onProgress = null) {
12
+ const mod = await import('../workers/worker-pool');
13
+ return mod.parseCSVWithWorker(csvInput, options, onProgress);
14
+ }
15
+
16
+ const jtcsvWorkers = {
17
+ createWorkerPool,
18
+ parseCSVWithWorker,
19
+ createWorkerPoolLazy,
20
+ parseCSVWithWorkerLazy
21
+ };
22
+
23
+ // Экспорт
24
+ if (typeof module !== 'undefined' && module.exports) {
25
+ module.exports = jtcsvWorkers;
26
+ } else if (typeof define === 'function' && define.amd) {
27
+ define([], () => jtcsvWorkers);
28
+ } else if (typeof window !== 'undefined' && window.jtcsv) {
29
+ // Расширяем глобальный jtcsv, если он существует
30
+ Object.assign(window.jtcsv, jtcsvWorkers);
31
+ }
32
+
33
+ export default jtcsvWorkers;
34
+ export {
35
+ createWorkerPool,
36
+ parseCSVWithWorker,
37
+ createWorkerPoolLazy,
38
+ parseCSVWithWorkerLazy
39
+ };
@@ -0,0 +1,5 @@
1
+ declare const define: any;
2
+
3
+ interface Window {
4
+ jtcsv: any;
5
+ }