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,306 @@
1
+ /**
2
+ * Пример обработки вложенных объектов в jtcsv
3
+ * Демонстрирует улучшенную поддержку сложных JSON структур
4
+ */
5
+
6
+ const { jsonToCsv, preprocessData, deepUnwrap } = await import("../../index");
7
+
8
+ // Пример 1: Простые вложенные объекты
9
+ const simpleNestedData = [
10
+ {
11
+ id: 1,
12
+ name: 'John Doe',
13
+ profile: {
14
+ age: 30,
15
+ email: 'john@example.com',
16
+ address: {
17
+ city: 'New York',
18
+ country: 'USA'
19
+ }
20
+ },
21
+ tags: ['developer', 'javascript', 'nodejs']
22
+ },
23
+ {
24
+ id: 2,
25
+ name: 'Jane Smith',
26
+ profile: {
27
+ age: 25,
28
+ email: 'jane@example.com',
29
+ address: {
30
+ city: 'London',
31
+ country: 'UK'
32
+ }
33
+ },
34
+ tags: ['designer', 'ui', 'ux']
35
+ }
36
+ ];
37
+
38
+ console.log('=== Пример 1: Простые вложенные объекты ===\n');
39
+
40
+ // Текущая реализация (deepUnwrap)
41
+ console.log('Текущая реализация (deepUnwrap):');
42
+ const processed1 = preprocessData(simpleNestedData);
43
+ console.log('Обработанные данные:', JSON.stringify(processed1, null, 2));
44
+
45
+ const csv1 = jsonToCsv(processed1);
46
+ console.log('\nCSV результат:');
47
+ console.log(csv1);
48
+
49
+ // Пример 2: Сложные вложенные структуры
50
+ const complexNestedData = [
51
+ {
52
+ orderId: 'ORD-001',
53
+ customer: {
54
+ id: 'CUST-001',
55
+ name: 'Acme Corp',
56
+ contact: {
57
+ primary: {
58
+ name: 'Alice Johnson',
59
+ phone: '+1-555-1234',
60
+ email: 'alice@acme.com'
61
+ },
62
+ secondary: {
63
+ name: 'Bob Smith',
64
+ phone: '+1-555-5678',
65
+ email: 'bob@acme.com'
66
+ }
67
+ }
68
+ },
69
+ items: [
70
+ {
71
+ productId: 'PROD-001',
72
+ name: 'Laptop',
73
+ quantity: 2,
74
+ price: 999.99,
75
+ specifications: {
76
+ cpu: 'Intel i7',
77
+ ram: '16GB',
78
+ storage: '512GB SSD'
79
+ }
80
+ },
81
+ {
82
+ productId: 'PROD-002',
83
+ name: 'Mouse',
84
+ quantity: 1,
85
+ price: 49.99
86
+ }
87
+ ],
88
+ metadata: {
89
+ createdAt: '2024-01-15T10:30:00Z',
90
+ updatedAt: '2024-01-16T14:45:00Z',
91
+ status: 'completed',
92
+ notes: ['Urgent delivery', 'Gift wrapping requested']
93
+ }
94
+ }
95
+ ];
96
+
97
+ console.log('\n\n=== Пример 2: Сложные вложенные структуры ===\n');
98
+
99
+ console.log('Текущая реализация (ограничения):');
100
+ const processed2 = preprocessData(complexNestedData);
101
+ console.log('Обработанные данные (первые 500 символов):');
102
+ console.log(JSON.stringify(processed2, null, 2).substring(0, 500) + '...');
103
+
104
+ // Пример 3: Предлагаемые улучшения
105
+ console.log('\n\n=== Пример 3: Предлагаемые улучшения ===\n');
106
+
107
+ /**
108
+ * Улучшенная функция flattenObject для автоматического разворачивания вложенных структур
109
+ */
110
+ function flattenObject(obj, prefix = '', separator = '.', maxDepth = 3, currentDepth = 0) {
111
+ if (currentDepth >= maxDepth) {
112
+ return { [prefix || 'value']: JSON.stringify(obj) };
113
+ }
114
+
115
+ const result = {};
116
+
117
+ for (const key in obj) {
118
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
119
+ const value = obj[key];
120
+ const newKey = prefix ? `${prefix}${separator}${key}` : key;
121
+
122
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
123
+ // Рекурсивно разворачиваем объекты
124
+ const flattened = flattenObject(
125
+ value,
126
+ newKey,
127
+ separator,
128
+ maxDepth,
129
+ currentDepth + 1
130
+ );
131
+ Object.assign(result, flattened);
132
+ } else if (Array.isArray(value)) {
133
+ // Обработка массивов
134
+ if (value.length === 0) {
135
+ result[newKey] = '';
136
+ } else if (value.every(item => typeof item === 'string' || typeof item === 'number')) {
137
+ // Простые массивы - объединяем через запятую
138
+ result[newKey] = value.join(', ');
139
+ } else {
140
+ // Сложные массивы - сериализуем
141
+ result[newKey] = JSON.stringify(value);
142
+ }
143
+ } else {
144
+ // Примитивные значения
145
+ result[newKey] = value;
146
+ }
147
+ }
148
+ }
149
+
150
+ return result;
151
+ }
152
+
153
+ /**
154
+ * Улучшенная функция preprocessData с поддержкой flattening
155
+ */
156
+ function preprocessDataWithFlattening(data, options = {}) {
157
+ const {
158
+ flatten = false,
159
+ separator = '.',
160
+ maxDepth = 3,
161
+ arrayHandling = 'stringify' // 'stringify', 'join', 'expand'
162
+ } = options;
163
+
164
+ if (!Array.isArray(data)) {
165
+ return [];
166
+ }
167
+
168
+ return data.map(item => {
169
+ if (!item || typeof item !== 'object') {
170
+ return {};
171
+ }
172
+
173
+ if (flatten) {
174
+ return flattenObject(item, '', separator, maxDepth);
175
+ }
176
+
177
+ // Стандартная обработка (совместимость)
178
+ const processed = {};
179
+ for (const key in item) {
180
+ if (Object.prototype.hasOwnProperty.call(item, key)) {
181
+ const value = item[key];
182
+ if (value && typeof value === 'object') {
183
+ processed[key] = deepUnwrap(value);
184
+ } else {
185
+ processed[key] = value;
186
+ }
187
+ }
188
+ }
189
+ return processed;
190
+ });
191
+ }
192
+
193
+ // Демонстрация улучшенной обработки
194
+ console.log('Улучшенная обработка с flattening:');
195
+ const flattened = preprocessDataWithFlattening(simpleNestedData, { flatten: true });
196
+ console.log('Развернутые данные:');
197
+ console.log(JSON.stringify(flattened, null, 2));
198
+
199
+ const csvFlattened = jsonToCsv(flattened);
200
+ console.log('\nCSV с развернутыми полями:');
201
+ console.log(csvFlattened);
202
+
203
+ // Пример 4: Разные стратегии обработки массивов
204
+ console.log('\n\n=== Пример 4: Обработка массивов ===\n');
205
+
206
+ const arrayData = [
207
+ {
208
+ id: 1,
209
+ name: 'Product A',
210
+ categories: ['Electronics', 'Computers', 'Laptops'],
211
+ reviews: [
212
+ { user: 'Alice', rating: 5, comment: 'Great product!' },
213
+ { user: 'Bob', rating: 4, comment: 'Good value' }
214
+ ],
215
+ attributes: {
216
+ colors: ['Black', 'Silver', 'Space Gray'],
217
+ sizes: ['13"', '15"', '17"']
218
+ }
219
+ }
220
+ ];
221
+
222
+ console.log('Разные стратегии обработки массивов:');
223
+
224
+ // Стратегия 1: Объединение через запятую (по умолчанию)
225
+ const strategy1 = preprocessDataWithFlattening(arrayData, {
226
+ flatten: true,
227
+ arrayHandling: 'join'
228
+ });
229
+ console.log('\n1. Объединение через запятую:');
230
+ console.log(JSON.stringify(strategy1, null, 2));
231
+
232
+ // Стратегия 2: Сериализация JSON
233
+ const strategy2 = preprocessDataWithFlattening(arrayData, {
234
+ flatten: true,
235
+ arrayHandling: 'stringify'
236
+ });
237
+ console.log('\n2. Сериализация JSON:');
238
+ console.log(JSON.stringify(strategy2, null, 2));
239
+
240
+ // Пример 5: Интеграция с существующим API
241
+ console.log('\n\n=== Пример 5: Интеграция с существующим API ===\n');
242
+
243
+ /**
244
+ * Расширенная версия jsonToCsv с поддержкой flattening
245
+ */
246
+ function jsonToCsvWithFlattening(data, options = {}) {
247
+ const {
248
+ flatten = false,
249
+ flattenSeparator = '.',
250
+ flattenMaxDepth = 3,
251
+ arrayHandling = 'stringify',
252
+ ...csvOptions
253
+ } = options;
254
+
255
+ // Предобработка с flattening
256
+ const processedData = preprocessDataWithFlattening(data, {
257
+ flatten,
258
+ separator: flattenSeparator,
259
+ maxDepth: flattenMaxDepth,
260
+ arrayHandling
261
+ });
262
+
263
+ // Используем существующую функцию jsonToCsv
264
+ return jsonToCsv(processedData, csvOptions);
265
+ }
266
+
267
+ // Демонстрация
268
+ const complexData = [
269
+ {
270
+ id: 'USER-001',
271
+ personal: {
272
+ name: 'Charlie Brown',
273
+ birth: {
274
+ date: '1990-05-15',
275
+ place: 'Springfield'
276
+ }
277
+ },
278
+ employment: {
279
+ company: 'Tech Corp',
280
+ position: 'Senior Developer',
281
+ skills: ['JavaScript', 'TypeScript', 'Node.js', 'React']
282
+ }
283
+ }
284
+ ];
285
+
286
+ console.log('Без flattening:');
287
+ const csvWithout = jsonToCsvWithFlattening(complexData, { flatten: false });
288
+ console.log(csvWithout);
289
+
290
+ console.log('\nС flattening:');
291
+ const csvWith = jsonToCsvWithFlattening(complexData, {
292
+ flatten: true,
293
+ flattenSeparator: '_',
294
+ flattenMaxDepth: 4
295
+ });
296
+ console.log(csvWith);
297
+
298
+ console.log('\n\n=== Рекомендации по улучшению jtcsv ===\n');
299
+ console.log('1. Добавить опцию "flatten" в jsonToCsv для автоматического разворачивания вложенных объектов');
300
+ console.log('2. Добавить параметры для контроля flattening:');
301
+ console.log(' - flattenSeparator: разделитель для вложенных ключей (по умолчанию ".")');
302
+ console.log(' - flattenMaxDepth: максимальная глубина разворачивания');
303
+ console.log(' - arrayHandling: стратегия обработки массивов');
304
+ console.log('3. Добавить функцию flattenObject в публичное API');
305
+ console.log('4. Обновить документацию с примерами обработки сложных JSON структур');
306
+ console.log('5. Добавить тесты для edge cases вложенных объектов');