@frictionless-ts/table 1.0.1

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 (317) hide show
  1. package/LICENSE.md +9 -0
  2. package/README.md +3 -0
  3. package/build/assets/geojson.json +216 -0
  4. package/build/assets/topojson.json +259 -0
  5. package/build/data/index.d.ts +2 -0
  6. package/build/data/index.js +2 -0
  7. package/build/data/record.d.ts +4 -0
  8. package/build/data/record.js +84 -0
  9. package/build/data/record.spec.d.ts +1 -0
  10. package/build/data/record.spec.js +269 -0
  11. package/build/dialect/Options.d.ts +3 -0
  12. package/build/dialect/Options.js +3 -0
  13. package/build/dialect/index.d.ts +2 -0
  14. package/build/dialect/index.js +2 -0
  15. package/build/dialect/infer.d.ts +4 -0
  16. package/build/dialect/infer.js +2 -0
  17. package/build/field/Field.d.ts +5 -0
  18. package/build/field/Field.js +2 -0
  19. package/build/field/Mapping.d.ts +11 -0
  20. package/build/field/Mapping.js +2 -0
  21. package/build/field/checks/enum.d.ts +8 -0
  22. package/build/field/checks/enum.js +71 -0
  23. package/build/field/checks/enum.spec.d.ts +1 -0
  24. package/build/field/checks/enum.spec.js +327 -0
  25. package/build/field/checks/maxLength.d.ts +7 -0
  26. package/build/field/checks/maxLength.js +17 -0
  27. package/build/field/checks/maxLength.spec.d.ts +1 -0
  28. package/build/field/checks/maxLength.spec.js +49 -0
  29. package/build/field/checks/maximum.d.ts +11 -0
  30. package/build/field/checks/maximum.js +73 -0
  31. package/build/field/checks/maximum.spec.d.ts +1 -0
  32. package/build/field/checks/maximum.spec.js +476 -0
  33. package/build/field/checks/minLength.d.ts +7 -0
  34. package/build/field/checks/minLength.js +17 -0
  35. package/build/field/checks/minLength.spec.d.ts +1 -0
  36. package/build/field/checks/minLength.spec.js +56 -0
  37. package/build/field/checks/minimum.d.ts +11 -0
  38. package/build/field/checks/minimum.js +73 -0
  39. package/build/field/checks/minimum.spec.d.ts +1 -0
  40. package/build/field/checks/minimum.spec.js +476 -0
  41. package/build/field/checks/pattern.d.ts +7 -0
  42. package/build/field/checks/pattern.js +17 -0
  43. package/build/field/checks/pattern.spec.d.ts +1 -0
  44. package/build/field/checks/pattern.spec.js +66 -0
  45. package/build/field/checks/required.d.ts +7 -0
  46. package/build/field/checks/required.js +14 -0
  47. package/build/field/checks/required.spec.d.ts +1 -0
  48. package/build/field/checks/required.spec.js +24 -0
  49. package/build/field/checks/type.d.ts +7 -0
  50. package/build/field/checks/type.js +14 -0
  51. package/build/field/checks/type.spec.d.ts +1 -0
  52. package/build/field/checks/type.spec.js +255 -0
  53. package/build/field/checks/unique.d.ts +7 -0
  54. package/build/field/checks/unique.js +17 -0
  55. package/build/field/checks/unique.spec.d.ts +1 -0
  56. package/build/field/checks/unique.spec.js +97 -0
  57. package/build/field/denormalize.d.ts +6 -0
  58. package/build/field/denormalize.js +13 -0
  59. package/build/field/desubstitute.d.ts +3 -0
  60. package/build/field/desubstitute.js +13 -0
  61. package/build/field/index.d.ts +8 -0
  62. package/build/field/index.js +6 -0
  63. package/build/field/inspect.d.ts +6 -0
  64. package/build/field/inspect.js +131 -0
  65. package/build/field/inspect.spec.d.ts +1 -0
  66. package/build/field/inspect.spec.js +385 -0
  67. package/build/field/narrow.d.ts +3 -0
  68. package/build/field/narrow.js +14 -0
  69. package/build/field/narrow.spec.d.ts +1 -0
  70. package/build/field/narrow.spec.js +52 -0
  71. package/build/field/normalize.d.ts +5 -0
  72. package/build/field/normalize.js +14 -0
  73. package/build/field/parse.d.ts +3 -0
  74. package/build/field/parse.js +47 -0
  75. package/build/field/parse.spec.d.ts +1 -0
  76. package/build/field/parse.spec.js +33 -0
  77. package/build/field/stringify.d.ts +3 -0
  78. package/build/field/stringify.js +43 -0
  79. package/build/field/stringify.spec.d.ts +1 -0
  80. package/build/field/stringify.spec.js +41 -0
  81. package/build/field/substitute.d.ts +3 -0
  82. package/build/field/substitute.js +16 -0
  83. package/build/field/types/array.d.ts +3 -0
  84. package/build/field/types/array.js +5 -0
  85. package/build/field/types/array.spec.d.ts +1 -0
  86. package/build/field/types/array.spec.js +358 -0
  87. package/build/field/types/boolean.d.ts +4 -0
  88. package/build/field/types/boolean.js +31 -0
  89. package/build/field/types/boolean.spec.d.ts +1 -0
  90. package/build/field/types/boolean.spec.js +76 -0
  91. package/build/field/types/date.d.ts +4 -0
  92. package/build/field/types/date.js +14 -0
  93. package/build/field/types/date.spec.d.ts +1 -0
  94. package/build/field/types/date.spec.js +52 -0
  95. package/build/field/types/datetime.d.ts +4 -0
  96. package/build/field/types/datetime.js +15 -0
  97. package/build/field/types/datetime.spec.d.ts +1 -0
  98. package/build/field/types/datetime.spec.js +62 -0
  99. package/build/field/types/duration.d.ts +4 -0
  100. package/build/field/types/duration.js +9 -0
  101. package/build/field/types/duration.spec.d.ts +1 -0
  102. package/build/field/types/duration.spec.js +37 -0
  103. package/build/field/types/geojson.d.ts +3 -0
  104. package/build/field/types/geojson.js +9 -0
  105. package/build/field/types/geojson.spec.d.ts +1 -0
  106. package/build/field/types/geojson.spec.js +522 -0
  107. package/build/field/types/geopoint.d.ts +4 -0
  108. package/build/field/types/geopoint.js +59 -0
  109. package/build/field/types/geopoint.spec.d.ts +1 -0
  110. package/build/field/types/geopoint.spec.js +173 -0
  111. package/build/field/types/integer.d.ts +4 -0
  112. package/build/field/types/integer.js +41 -0
  113. package/build/field/types/integer.spec.d.ts +1 -0
  114. package/build/field/types/integer.spec.js +102 -0
  115. package/build/field/types/json.d.ts +6 -0
  116. package/build/field/types/json.js +68 -0
  117. package/build/field/types/list.d.ts +4 -0
  118. package/build/field/types/list.js +30 -0
  119. package/build/field/types/list.spec.d.ts +1 -0
  120. package/build/field/types/list.spec.js +230 -0
  121. package/build/field/types/number.d.ts +4 -0
  122. package/build/field/types/number.js +50 -0
  123. package/build/field/types/number.spec.d.ts +1 -0
  124. package/build/field/types/number.spec.js +101 -0
  125. package/build/field/types/object.d.ts +3 -0
  126. package/build/field/types/object.js +5 -0
  127. package/build/field/types/object.spec.d.ts +1 -0
  128. package/build/field/types/object.spec.js +393 -0
  129. package/build/field/types/string.d.ts +4 -0
  130. package/build/field/types/string.js +32 -0
  131. package/build/field/types/string.spec.d.ts +1 -0
  132. package/build/field/types/string.spec.js +162 -0
  133. package/build/field/types/time.d.ts +4 -0
  134. package/build/field/types/time.js +18 -0
  135. package/build/field/types/time.spec.d.ts +1 -0
  136. package/build/field/types/time.spec.js +53 -0
  137. package/build/field/types/year.d.ts +4 -0
  138. package/build/field/types/year.js +16 -0
  139. package/build/field/types/year.spec.d.ts +1 -0
  140. package/build/field/types/year.spec.js +50 -0
  141. package/build/field/types/yearmonth.d.ts +4 -0
  142. package/build/field/types/yearmonth.js +14 -0
  143. package/build/field/types/yearmonth.spec.d.ts +1 -0
  144. package/build/field/types/yearmonth.spec.js +36 -0
  145. package/build/helpers.d.ts +4 -0
  146. package/build/helpers.js +12 -0
  147. package/build/index.d.ts +40 -0
  148. package/build/index.js +27 -0
  149. package/build/plugin.d.ts +27 -0
  150. package/build/plugin.js +2 -0
  151. package/build/plugins/arrow/index.d.ts +2 -0
  152. package/build/plugins/arrow/index.js +3 -0
  153. package/build/plugins/arrow/plugin.d.ts +7 -0
  154. package/build/plugins/arrow/plugin.js +22 -0
  155. package/build/plugins/arrow/plugin.spec.d.ts +1 -0
  156. package/build/plugins/arrow/plugin.spec.js +161 -0
  157. package/build/plugins/arrow/table/index.d.ts +2 -0
  158. package/build/plugins/arrow/table/index.js +3 -0
  159. package/build/plugins/arrow/table/load.d.ts +4 -0
  160. package/build/plugins/arrow/table/load.js +23 -0
  161. package/build/plugins/arrow/table/load.spec.d.ts +1 -0
  162. package/build/plugins/arrow/table/load.spec.js +56 -0
  163. package/build/plugins/arrow/table/save.d.ts +3 -0
  164. package/build/plugins/arrow/table/save.js +31 -0
  165. package/build/plugins/arrow/table/save.spec.d.ts +1 -0
  166. package/build/plugins/arrow/table/save.spec.js +81 -0
  167. package/build/plugins/csv/dialect/index.d.ts +1 -0
  168. package/build/plugins/csv/dialect/index.js +2 -0
  169. package/build/plugins/csv/dialect/infer.d.ts +4 -0
  170. package/build/plugins/csv/dialect/infer.js +44 -0
  171. package/build/plugins/csv/dialect/infer.spec.d.ts +1 -0
  172. package/build/plugins/csv/dialect/infer.spec.js +54 -0
  173. package/build/plugins/csv/index.d.ts +2 -0
  174. package/build/plugins/csv/index.js +3 -0
  175. package/build/plugins/csv/plugin.d.ts +8 -0
  176. package/build/plugins/csv/plugin.js +22 -0
  177. package/build/plugins/csv/plugin.spec.d.ts +1 -0
  178. package/build/plugins/csv/plugin.spec.js +161 -0
  179. package/build/plugins/csv/table/index.d.ts +2 -0
  180. package/build/plugins/csv/table/index.js +3 -0
  181. package/build/plugins/csv/table/load.d.ts +6 -0
  182. package/build/plugins/csv/table/load.js +86 -0
  183. package/build/plugins/csv/table/load.spec.d.ts +1 -0
  184. package/build/plugins/csv/table/load.spec.js +293 -0
  185. package/build/plugins/csv/table/save.d.ts +5 -0
  186. package/build/plugins/csv/table/save.js +29 -0
  187. package/build/plugins/csv/table/save.spec.d.ts +1 -0
  188. package/build/plugins/csv/table/save.spec.js +137 -0
  189. package/build/plugins/inline/index.d.ts +2 -0
  190. package/build/plugins/inline/index.js +3 -0
  191. package/build/plugins/inline/plugin.d.ts +7 -0
  192. package/build/plugins/inline/plugin.js +14 -0
  193. package/build/plugins/inline/table/index.d.ts +1 -0
  194. package/build/plugins/inline/table/index.js +2 -0
  195. package/build/plugins/inline/table/load.d.ts +6 -0
  196. package/build/plugins/inline/table/load.js +24 -0
  197. package/build/plugins/inline/table/load.spec.d.ts +1 -0
  198. package/build/plugins/inline/table/load.spec.js +160 -0
  199. package/build/plugins/json/buffer/decode.d.ts +4 -0
  200. package/build/plugins/json/buffer/decode.js +10 -0
  201. package/build/plugins/json/buffer/encode.d.ts +4 -0
  202. package/build/plugins/json/buffer/encode.js +8 -0
  203. package/build/plugins/json/buffer/index.d.ts +2 -0
  204. package/build/plugins/json/buffer/index.js +3 -0
  205. package/build/plugins/json/index.d.ts +2 -0
  206. package/build/plugins/json/index.js +3 -0
  207. package/build/plugins/json/plugin.d.ts +7 -0
  208. package/build/plugins/json/plugin.js +25 -0
  209. package/build/plugins/json/plugin.spec.d.ts +1 -0
  210. package/build/plugins/json/plugin.spec.js +163 -0
  211. package/build/plugins/json/table/index.d.ts +2 -0
  212. package/build/plugins/json/table/index.js +3 -0
  213. package/build/plugins/json/table/load.d.ts +6 -0
  214. package/build/plugins/json/table/load.js +55 -0
  215. package/build/plugins/json/table/load.spec.d.ts +1 -0
  216. package/build/plugins/json/table/load.spec.js +200 -0
  217. package/build/plugins/json/table/parse.d.ts +3 -0
  218. package/build/plugins/json/table/parse.js +6 -0
  219. package/build/plugins/json/table/save.d.ts +5 -0
  220. package/build/plugins/json/table/save.js +45 -0
  221. package/build/plugins/json/table/save.spec.d.ts +1 -0
  222. package/build/plugins/json/table/save.spec.js +147 -0
  223. package/build/plugins/ods/index.d.ts +2 -0
  224. package/build/plugins/ods/index.js +3 -0
  225. package/build/plugins/ods/plugin.d.ts +7 -0
  226. package/build/plugins/ods/plugin.js +23 -0
  227. package/build/plugins/ods/plugin.spec.d.ts +1 -0
  228. package/build/plugins/ods/plugin.spec.js +142 -0
  229. package/build/plugins/ods/table/index.d.ts +2 -0
  230. package/build/plugins/ods/table/index.js +3 -0
  231. package/build/plugins/ods/table/load.d.ts +4 -0
  232. package/build/plugins/ods/table/load.js +41 -0
  233. package/build/plugins/ods/table/load.spec.d.ts +1 -0
  234. package/build/plugins/ods/table/load.spec.js +167 -0
  235. package/build/plugins/ods/table/save.d.ts +3 -0
  236. package/build/plugins/ods/table/save.js +26 -0
  237. package/build/plugins/ods/table/save.spec.d.ts +1 -0
  238. package/build/plugins/ods/table/save.spec.js +75 -0
  239. package/build/plugins/ods/table/test.d.ts +5 -0
  240. package/build/plugins/ods/table/test.js +23 -0
  241. package/build/plugins/parquet/index.d.ts +2 -0
  242. package/build/plugins/parquet/index.js +3 -0
  243. package/build/plugins/parquet/plugin.d.ts +7 -0
  244. package/build/plugins/parquet/plugin.js +23 -0
  245. package/build/plugins/parquet/plugin.spec.d.ts +1 -0
  246. package/build/plugins/parquet/plugin.spec.js +142 -0
  247. package/build/plugins/parquet/table/index.d.ts +2 -0
  248. package/build/plugins/parquet/table/index.js +3 -0
  249. package/build/plugins/parquet/table/load.d.ts +4 -0
  250. package/build/plugins/parquet/table/load.js +23 -0
  251. package/build/plugins/parquet/table/load.spec.d.ts +1 -0
  252. package/build/plugins/parquet/table/load.spec.js +56 -0
  253. package/build/plugins/parquet/table/save.d.ts +3 -0
  254. package/build/plugins/parquet/table/save.js +32 -0
  255. package/build/plugins/parquet/table/save.spec.d.ts +1 -0
  256. package/build/plugins/parquet/table/save.spec.js +81 -0
  257. package/build/plugins/xlxs/index.d.ts +2 -0
  258. package/build/plugins/xlxs/index.js +3 -0
  259. package/build/plugins/xlxs/plugin.d.ts +7 -0
  260. package/build/plugins/xlxs/plugin.js +23 -0
  261. package/build/plugins/xlxs/plugin.spec.d.ts +1 -0
  262. package/build/plugins/xlxs/plugin.spec.js +142 -0
  263. package/build/plugins/xlxs/table/index.d.ts +2 -0
  264. package/build/plugins/xlxs/table/index.js +3 -0
  265. package/build/plugins/xlxs/table/load.d.ts +4 -0
  266. package/build/plugins/xlxs/table/load.js +43 -0
  267. package/build/plugins/xlxs/table/load.spec.d.ts +1 -0
  268. package/build/plugins/xlxs/table/load.spec.js +167 -0
  269. package/build/plugins/xlxs/table/save.d.ts +3 -0
  270. package/build/plugins/xlxs/table/save.js +28 -0
  271. package/build/plugins/xlxs/table/save.spec.d.ts +1 -0
  272. package/build/plugins/xlxs/table/save.spec.js +75 -0
  273. package/build/plugins/xlxs/table/test.d.ts +5 -0
  274. package/build/plugins/xlxs/table/test.js +23 -0
  275. package/build/schema/Mapping.d.ts +6 -0
  276. package/build/schema/Mapping.js +2 -0
  277. package/build/schema/Options.d.ts +22 -0
  278. package/build/schema/Options.js +2 -0
  279. package/build/schema/Schema.d.ts +4 -0
  280. package/build/schema/Schema.js +2 -0
  281. package/build/schema/helpers.d.ts +3 -0
  282. package/build/schema/helpers.js +6 -0
  283. package/build/schema/index.d.ts +8 -0
  284. package/build/schema/index.js +5 -0
  285. package/build/schema/infer.d.ts +13 -0
  286. package/build/schema/infer.js +199 -0
  287. package/build/schema/infer.spec.d.ts +1 -0
  288. package/build/schema/infer.spec.js +304 -0
  289. package/build/schema/match.d.ts +6 -0
  290. package/build/schema/match.js +8 -0
  291. package/build/table/Frame.d.ts +2 -0
  292. package/build/table/Frame.js +2 -0
  293. package/build/table/Table.d.ts +2 -0
  294. package/build/table/Table.js +2 -0
  295. package/build/table/checks/unique.d.ts +7 -0
  296. package/build/table/checks/unique.js +23 -0
  297. package/build/table/checks/unique.spec.d.ts +1 -0
  298. package/build/table/checks/unique.spec.js +187 -0
  299. package/build/table/denormalize.d.ts +6 -0
  300. package/build/table/denormalize.js +15 -0
  301. package/build/table/helpers.d.ts +19 -0
  302. package/build/table/helpers.js +62 -0
  303. package/build/table/helpers.spec.d.ts +1 -0
  304. package/build/table/helpers.spec.js +352 -0
  305. package/build/table/index.d.ts +9 -0
  306. package/build/table/index.js +8 -0
  307. package/build/table/inspect.d.ts +8 -0
  308. package/build/table/inspect.js +165 -0
  309. package/build/table/inspect.spec.d.ts +1 -0
  310. package/build/table/inspect.spec.js +335 -0
  311. package/build/table/normalize.d.ts +6 -0
  312. package/build/table/normalize.js +27 -0
  313. package/build/table/normalize.spec.d.ts +1 -0
  314. package/build/table/normalize.spec.js +222 -0
  315. package/build/table/query.d.ts +3 -0
  316. package/build/table/query.js +6 -0
  317. package/package.json +45 -0
@@ -0,0 +1,293 @@
1
+ import { Buffer } from "node:buffer";
2
+ import { writeTempFile } from "@frictionless-ts/dataset";
3
+ import { describe, expect, it } from "vitest";
4
+ import { useRecording } from "vitest-polly";
5
+ import { loadCsvTable } from "./load.js";
6
+ useRecording();
7
+ describe("loadCsvTable", () => {
8
+ it("should load local file", async () => {
9
+ const path = await writeTempFile("id,name\n1,english\n2,中文");
10
+ const table = await loadCsvTable({ path });
11
+ expect((await table.collect()).toRecords()).toEqual([
12
+ { id: 1, name: "english" },
13
+ { id: 2, name: "中文" },
14
+ ]);
15
+ });
16
+ it("should load local file (multipart)", async () => {
17
+ const path1 = await writeTempFile("id,name\n1,english");
18
+ const path2 = await writeTempFile("id,name\n2,中文\n3,german");
19
+ const table = await loadCsvTable({ path: [path1, path2] });
20
+ expect((await table.collect()).toRecords()).toEqual([
21
+ { id: 1, name: "english" },
22
+ { id: 2, name: "中文" },
23
+ { id: 3, name: "german" },
24
+ ]);
25
+ });
26
+ it.fails("should load remote file", async () => {
27
+ const table = await loadCsvTable({
28
+ path: "https://raw.githubusercontent.com/datisthq/dpkit/refs/heads/main/csv/table/fixtures/table.csv",
29
+ });
30
+ expect((await table.collect()).toRecords()).toEqual([
31
+ { id: 1, name: "english" },
32
+ { id: 2, name: "中文" },
33
+ ]);
34
+ });
35
+ it.fails("should load remote file (multipart)", async () => {
36
+ const table = await loadCsvTable({
37
+ path: [
38
+ "https://raw.githubusercontent.com/datisthq/dpkit/refs/heads/main/csv/table/fixtures/table.csv",
39
+ "https://raw.githubusercontent.com/datisthq/dpkit/refs/heads/main/csv/table/fixtures/table.csv",
40
+ ],
41
+ });
42
+ expect((await table.collect()).toRecords()).toEqual([
43
+ { id: 1, name: "english" },
44
+ { id: 2, name: "中文" },
45
+ { id: 1, name: "english" },
46
+ { id: 2, name: "中文" },
47
+ ]);
48
+ });
49
+ it("should handle windows line terminator by default", async () => {
50
+ const path = await writeTempFile("id,name\r\n1,english\r\n2,中文");
51
+ const table = await loadCsvTable({ path });
52
+ expect((await table.collect()).toRecords()).toEqual([
53
+ { id: 1, name: "english" },
54
+ { id: 2, name: "中文" },
55
+ ]);
56
+ });
57
+ it("should handle custom delimiter", async () => {
58
+ const path = await writeTempFile("id|name\n1|alice\n2|bob");
59
+ const table = await loadCsvTable({
60
+ path,
61
+ dialect: { delimiter: "|" },
62
+ });
63
+ expect((await table.collect()).toRecords()).toEqual([
64
+ { id: 1, name: "alice" },
65
+ { id: 2, name: "bob" },
66
+ ]);
67
+ });
68
+ it("should handle files without header", async () => {
69
+ const path = await writeTempFile("1,alice\n2,bob");
70
+ const table = await loadCsvTable({
71
+ path,
72
+ dialect: { header: false },
73
+ });
74
+ const records = (await table.collect()).toRecords();
75
+ expect(records).toEqual([
76
+ { field1: 1, field2: "alice" },
77
+ { field1: 2, field2: "bob" },
78
+ ]);
79
+ });
80
+ it("should handle custom line terminator", async () => {
81
+ const path = await writeTempFile("id,name|1,alice|2,bob");
82
+ const table = await loadCsvTable({
83
+ path,
84
+ dialect: { lineTerminator: "|" },
85
+ });
86
+ expect((await table.collect()).toRecords()).toEqual([
87
+ { id: 1, name: "alice" },
88
+ { id: 2, name: "bob" },
89
+ ]);
90
+ });
91
+ it.skip("should handle escape char", async () => {
92
+ const path = await writeTempFile("id,name\n1,apple|,fruits\n2,orange|,fruits");
93
+ const table = await loadCsvTable({
94
+ path,
95
+ dialect: { escapeChar: "|" },
96
+ });
97
+ expect((await table.collect()).toRecords()).toEqual([
98
+ { id: 1, name: "apple,fruits" },
99
+ { id: 2, name: "orange,fruits" },
100
+ ]);
101
+ });
102
+ it("should handle custom quote character", async () => {
103
+ const path = await writeTempFile("id,name\n1,'alice smith'\n2,'bob jones'");
104
+ const table = await loadCsvTable({
105
+ path,
106
+ dialect: { quoteChar: "'" },
107
+ });
108
+ expect((await table.collect()).toRecords()).toEqual([
109
+ { id: 1, name: "alice smith" },
110
+ { id: 2, name: "bob jones" },
111
+ ]);
112
+ });
113
+ it("should handle double quote by default", async () => {
114
+ const path = await writeTempFile('id,name\n1,"alice""smith"\n2,"bob""jones"');
115
+ const table = await loadCsvTable({
116
+ path,
117
+ dialect: { doubleQuote: true },
118
+ });
119
+ expect((await table.collect()).toRecords()).toEqual([
120
+ { id: 1, name: 'alice"smith' },
121
+ { id: 2, name: 'bob"jones' },
122
+ ]);
123
+ });
124
+ it.skip("should handle disabling double quote", async () => {
125
+ const path = await writeTempFile('id,name\n1,"alice""smith"\n2,"bob""jones"');
126
+ const table = await loadCsvTable({
127
+ path,
128
+ dialect: { doubleQuote: false },
129
+ });
130
+ expect((await table.collect()).toRecords()).toEqual([
131
+ { id: 1, name: "alicesmith" },
132
+ { id: 2, name: "bobjones" },
133
+ ]);
134
+ });
135
+ it("should handle comment character", async () => {
136
+ const path = await writeTempFile("# This is a comment\nid,name\n1,alice\n# Another comment\n2,bob");
137
+ const table = await loadCsvTable({
138
+ path,
139
+ dialect: { commentChar: "#" },
140
+ });
141
+ const records = (await table.collect()).toRecords();
142
+ expect(records).toEqual([
143
+ { id: 1, name: "alice" },
144
+ { id: 2, name: "bob" },
145
+ ]);
146
+ });
147
+ it("should support headerRows", async () => {
148
+ const path = await writeTempFile("#comment\nid,name\n1,alice\n2,bob");
149
+ const table = await loadCsvTable({
150
+ path,
151
+ dialect: { headerRows: [2] },
152
+ });
153
+ const records = (await table.collect()).toRecords();
154
+ expect(records).toEqual([
155
+ { id: 1, name: "alice" },
156
+ { id: 2, name: "bob" },
157
+ ]);
158
+ });
159
+ it("should support headerJoin", async () => {
160
+ const path = await writeTempFile("#comment\nid,name\nint,str\n1,alice\n2,bob");
161
+ const table = await loadCsvTable({
162
+ path,
163
+ dialect: { headerRows: [2, 3], headerJoin: "_" },
164
+ });
165
+ const records = (await table.collect()).toRecords();
166
+ expect(records).toEqual([
167
+ { id_int: 1, name_str: "alice" },
168
+ { id_int: 2, name_str: "bob" },
169
+ ]);
170
+ });
171
+ it("should support commentRows", async () => {
172
+ const path = await writeTempFile("id,name\n1,alice\ncomment\n2,bob");
173
+ const table = await loadCsvTable({
174
+ path,
175
+ dialect: { commentRows: [3] },
176
+ });
177
+ const records = (await table.collect()).toRecords();
178
+ expect(records).toEqual([
179
+ { id: 1, name: "alice" },
180
+ { id: 2, name: "bob" },
181
+ ]);
182
+ });
183
+ it("should support headerRows and commentRows", async () => {
184
+ const path = await writeTempFile("#comment\nid,name\n1,alice\n#comment\n2,bob");
185
+ const table = await loadCsvTable({
186
+ path,
187
+ dialect: { headerRows: [2], commentRows: [4] },
188
+ });
189
+ const records = (await table.collect()).toRecords();
190
+ expect(records).toEqual([
191
+ { id: 1, name: "alice" },
192
+ { id: 2, name: "bob" },
193
+ ]);
194
+ });
195
+ it("should support headerJoin and commentRows", async () => {
196
+ const path = await writeTempFile("#comment\nid,name\nint,str\n1,alice\n#comment\n2,bob");
197
+ const table = await loadCsvTable({
198
+ path,
199
+ dialect: { headerRows: [2, 3], headerJoin: "_", commentRows: [5] },
200
+ });
201
+ const records = (await table.collect()).toRecords();
202
+ expect(records).toEqual([
203
+ { id_int: 1, name_str: "alice" },
204
+ { id_int: 2, name_str: "bob" },
205
+ ]);
206
+ });
207
+ it("should handle null sequence", async () => {
208
+ const path = await writeTempFile("id,name,age\n1,alice,25\n2,N/A,30\n3,bob,N/A");
209
+ const table = await loadCsvTable({
210
+ path,
211
+ dialect: { nullSequence: "N/A" },
212
+ });
213
+ expect((await table.collect()).toRecords()).toEqual([
214
+ { id: 1, name: "alice", age: 25 },
215
+ { id: 2, name: null, age: 30 },
216
+ { id: 3, name: "bob", age: null },
217
+ ]);
218
+ });
219
+ it("should handle skip initial space", async () => {
220
+ const path = await writeTempFile("id,name,category\n1, alice, fruits\n2, bob, vegetables\n3,charlie,grains");
221
+ const table = await loadCsvTable({
222
+ path,
223
+ dialect: { skipInitialSpace: true },
224
+ });
225
+ expect((await table.collect()).toRecords()).toEqual([
226
+ { id: 1, name: "alice", category: "fruits" },
227
+ { id: 2, name: "bob", category: "vegetables" },
228
+ { id: 3, name: "charlie", category: "grains" },
229
+ ]);
230
+ });
231
+ it("should handle multiple dialect options together", async () => {
232
+ const path = await writeTempFile("#comment\nid|'full name'|age\n1|'alice smith'|25\n2|'bob jones'|30");
233
+ const table = await loadCsvTable({
234
+ path,
235
+ dialect: {
236
+ delimiter: "|",
237
+ quoteChar: "'",
238
+ commentChar: "#",
239
+ header: true,
240
+ },
241
+ });
242
+ expect((await table.collect()).toRecords()).toEqual([
243
+ { id: 1, "full name": "alice smith", age: 25 },
244
+ { id: 2, "full name": "bob jones", age: 30 },
245
+ ]);
246
+ });
247
+ it("should handle utf8 encoding", async () => {
248
+ const path = await writeTempFile(Buffer.from("id,name\n1,café\n2,naïve", "utf8"));
249
+ const table = await loadCsvTable({
250
+ path,
251
+ encoding: "utf8",
252
+ });
253
+ expect((await table.collect()).toRecords()).toEqual([
254
+ { id: 1, name: "café" },
255
+ { id: 2, name: "naïve" },
256
+ ]);
257
+ });
258
+ // TODO: currently not supported by nodejs-polars
259
+ it.skip("should handle utf16 encoding", async () => {
260
+ const path = await writeTempFile(Buffer.from("id,name\n1,café\n2,naïve", "utf16le"));
261
+ const table = await loadCsvTable({
262
+ path,
263
+ encoding: "utf16",
264
+ });
265
+ expect((await table.collect()).toRecords()).toEqual([
266
+ { id: 1, name: "café" },
267
+ { id: 2, name: "naïve" },
268
+ ]);
269
+ });
270
+ // TODO: currently not supported by nodejs-polars
271
+ it.skip("should handle latin1 encoding", async () => {
272
+ const path = await writeTempFile(Buffer.from("id,name\n1,café\n2,résumé", "latin1"));
273
+ const table = await loadCsvTable({
274
+ path,
275
+ encoding: "latin1",
276
+ });
277
+ expect((await table.collect()).toRecords()).toEqual([
278
+ { id: 1, name: "café" },
279
+ { id: 2, name: "résumé" },
280
+ ]);
281
+ });
282
+ });
283
+ describe("loadCsvTable (format=tsv)", () => {
284
+ it("should load local file", async () => {
285
+ const path = await writeTempFile("id\tname\n1\tenglish\n2\t中文");
286
+ const table = await loadCsvTable({ path, format: "tsv" });
287
+ expect((await table.collect()).toRecords()).toEqual([
288
+ { id: 1, name: "english" },
289
+ { id: 2, name: "中文" },
290
+ ]);
291
+ });
292
+ });
293
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGx1Z2lucy9jc3YvdGFibGUvbG9hZC5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDcEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQ3hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQzNDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFFeEMsWUFBWSxFQUFFLENBQUE7QUFFZCxRQUFRLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRTtJQUM1QixFQUFFLENBQUMsd0JBQXdCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDdEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxhQUFhLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtRQUM1RCxNQUFNLEtBQUssR0FBRyxNQUFNLFlBQVksQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7UUFFMUMsTUFBTSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUNsRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtZQUMxQixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRTtTQUN0QixDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNsRCxNQUFNLEtBQUssR0FBRyxNQUFNLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1FBQ3ZELE1BQU0s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QUFFLElBQUksRUFBRSxTQUFTLEVBQUU7WUFDMUIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7U0FDdEIsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gXCJub2RlOmJ1ZmZlclwiXG5pbXBvcnQgeyB3cml0ZVRlbXBGaWxlIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvZGF0YXNldFwiXG5pbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlc3RcIlxuaW1wb3J0IHsgdXNlUmVjb3JkaW5nIH0gZnJvbSBcInZpdGVzdC1wb2xseVwiXG5pbXBvcnQgeyBsb2FkQ3N2VGFibGUgfSBmcm9tIFwiLi9sb2FkLnRzXCJcblxudXNlUmVjb3JkaW5nKClcblxuZGVzY3JpYmUoXCJsb2FkQ3N2VGFibGVcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCBsb2FkIGxvY2FsIGZpbGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWQsbmFtZVxcbjEsZW5nbGlzaFxcbjIs5Lit5paHXCIpXG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkQ3N2VGFibGUoeyBwYXRoIH0pXG5cbiAgICBleHBlY3QoKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAgeyBpZDogMSwgbmFtZTogXCJlbmdsaXNoXCIgfSxcbiAgICAgIHsgaWQ6IDIsIG5hbWU6IFwi5Lit5paHXCIgfSxcbiAgICBdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGxvYWQgbG9jYWwgZmlsZSAobXVsdGlwYXJ0KVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aDEgPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWQsbmFtZVxcbjEsZW5nbGlzaFwiKVxuICAgIGNvbnN0IHBhdGgyID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkLG5hbWVcXG4yLOS4reaWh1xcbjMsZ2VybWFuXCIpXG5cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRDc3ZUYWJsZSh7IHBhdGg6IFtwYXRoMSwgcGF0aDJdIH0pXG5cbiAgICBleHBlY3QoKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAgeyBpZDogMSwgbmFtZTogXCJlbmdsaXNoXCIgfSxcbiAgICAgIHsgaWQ6IDIsIG5hbWU6IFwi5Lit5paHXCIgfSxcbiAgICAgIHsgaWQ6IDMsIG5hbWU6IFwiZ2VybWFuXCIgfSxcbiAgICBdKVxuICB9KVxuXG4gIGl0LmZhaWxzKFwic2hvdWxkIGxvYWQgcmVtb3RlIGZpbGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgbG9hZENzdlRhYmxlKHtcbiAgICAgIHBhdGg6IFwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2RhdGlzdGhxL2Rwa2l0L3JlZnMvaGVhZHMvbWFpbi9jc3YvdGFibGUvZml4dHVyZXMvdGFibGUuY3N2XCIsXG4gICAgfSlcblxuICAgIGV4cGVjdCgoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKSkudG9FcXVhbChbXG4gICAgICB7IGlkOiAxLCBuYW1lOiBcImVuZ2xpc2hcIiB9LFxuICAgICAgeyBpZDogMiwgbmFtZTogXCLkuK3mlodcIiB9LFxuICAgIF0pXG4gIH0pXG5cbiAgaXQuZmFpbHMoXCJzaG91bGQgbG9hZCByZW1vdGUgZmlsZSAobXVsdGlwYXJ0KVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkQ3N2VGFibGUoe1xuICAgICAgcGF0aDogW1xuICAgICAgICBcImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kYXRpc3RocS9kcGtpdC9yZWZzL2hlYWRzL21haW4vY3N2L3RhYmxlL2ZpeHR1cmVzL3RhYmxlLmNzdlwiLFxuICAgICAgICBcImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kYXRpc3RocS9kcGtpdC9yZWZzL2hlYWRzL21haW4vY3N2L3RhYmxlL2ZpeHR1cmVzL3RhYmxlLmNzdlwiLFxuICAgICAgXSxcbiAgICB9KVxuXG4gICAgZXhwZWN0KChhd2FpdCB0YWJsZS5jb2xsZWN0KCkpLnRvUmVjb3JkcygpKS50b0VxdWFsKFtcbiAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiZW5nbGlzaFwiIH0sXG4gICAgICB7IGlkOiAyLCBuYW1lOiBcIuS4reaWh1wiIH0sXG4gICAgICB7IGlkOiAxLCBuYW1lOiBcImVuZ2xpc2hcIiB9LFxuICAgICAgeyBpZDogMiwgbmFtZTogXCLkuK3mlodcIiB9LFxuICAgIF0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIHdpbmRvd3MgbGluZSB0ZXJtaW5hdG9yIGJ5IGRlZmF1bHRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWQsbmFtZVxcclxcbjEsZW5nbGlzaFxcclxcbjIs5Lit5paHXCIpXG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkQ3N2VGFibGUoeyBwYXRoIH0pXG5cbiAgICBleHBlY3QoKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAgeyBpZDogMSwgbmFtZTogXCJlbmdsaXNoXCIgfSxcbiAgICAgIHsgaWQ6IDIsIG5hbWU6IFwi5Lit5paHXCIgfSxcbiAgICBdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBjdXN0b20gZGVsaW1pdGVyXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkfG5hbWVcXG4xfGFsaWNlXFxuMnxib2JcIilcbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRDc3ZUYWJsZSh7XG4gICAgICBwYXRoLFxuICAgICAgZGlhbGVjdDogeyBkZWxpbWl0ZXI6IFwifFwiIH0sXG4gICAgfSlcblxuICAgIGV4cGVjdCgoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKSkudG9FcXVhbChbXG4gICAgICB7IGlkOiAxLCBuYW1lOiBcImFsaWNlXCIgfSxcbiAgICAgIHsgaWQ6IDIsIG5hbWU6IFwiYm9iXCIgfSxcbiAgICBdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBmaWxlcyB3aXRob3V0IGhlYWRlclwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCIxLGFsaWNlXFxuMixib2JcIilcbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRDc3ZUYWJsZSh7XG4gICAgICBwYXRoLFxuICAgICAgZGlhbGVjdDogeyBoZWFkZXI6IGZhbHNlIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IHJlY29yZHMgPSAoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKVxuICAgIGV4cGVjdChyZWNvcmRzKS50b0VxdWFsKFtcbiAgICAgIHsgZmllbGQxOiAxLCBmaWVsZDI6IFwiYWxpY2VcIiB9LFxuICAgICAgeyBmaWVsZDE6IDIsIGZpZWxkMjogXCJib2JcIiB9LFxuICAgIF0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIGN1c3RvbSBsaW5lIHRlcm1pbmF0b3JcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWQsbmFtZXwxLGFsaWNlfDIsYm9iXCIpXG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkQ3N2VGFibGUoe1xuICAgICAgcGF0aCxcbiAgICAgIGRpYWxlY3Q6IHsgbGluZVRlcm1pbmF0b3I6IFwifFwiIH0sXG4gICAgfSlcblxuICAgIGV4cGVjdCgoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKSkudG9FcXVhbChbXG4gICAgICB7IGlkOiAxLCBuYW1lOiBcImFsaWNlXCIgfSxcbiAgICAgIHsgaWQ6IDIsIG5hbWU6IFwiYm9iXCIgfSxcbiAgICBdKVxuICB9KVxuXG4gIGl0LnNraXAoXCJzaG91bGQgaGFuZGxlIGVzY2FwZSBjaGFyXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcbiAgICAgIFwiaWQsbmFtZVxcbjEsYXBwbGV8LGZydWl0c1xcbjIsb3JhbmdlfCxmcnVpdHNcIixcbiAgICApXG5cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRDc3ZUYWJsZSh7XG4gICAgICBwYXRoLFxuICAgICAgZGlhbGVjdDogeyBlc2NhcGVDaGFyOiBcInxcIiB9LFxuICAgIH0pXG5cbiAgICBleHBlY3QoKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAgeyBpZDogMSwgbmFtZTogXCJhcHBsZSxmcnVpdHNcIiB9LFxuICAgICAgeyBpZDogMiwgbmFtZTogXCJvcmFuZ2UsZnJ1aXRzXCIgfSxcbiAgICBdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBjdXN0b20gcXVvdGUgY2hhcmFjdGVyXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkLG5hbWVcXG4xLCdhbGljZSBzbWl0aCdcXG4yLCdib2Igam9uZXMnXCIpXG5cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRDc3ZUYWJsZSh7XG4gICAgICBwYXRoLFxuICAgICAgZGlhbGVjdDogeyBxdW90ZUNoYXI6IFwiJ1wiIH0sXG4gICAgfSlcblxuICAgIGV4cGVjdCgoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKSkudG9FcXVhbChbXG4gICAgICB7IGlkOiAxLCBuYW1lOiBcImFsaWNlIHNtaXRoXCIgfSxcbiAgICAgIHsgaWQ6IDIsIG5hbWU6IFwiYm9iIGpvbmVzXCIgfSxcbiAgICBdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBkb3VibGUgcXVvdGUgYnkgZGVmYXVsdFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXG4gICAgICAnaWQsbmFtZVxcbjEsXCJhbGljZVwiXCJzbWl0aFwiXFxuMixcImJvYlwiXCJqb25lc1wiJyxcbiAgICApXG5cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRDc3ZUYWJsZSh7XG4gICAgICBwYXRoLFxuICAgICAgZGlhbGVjdDogeyBkb3VibGVRdW90ZTogdHJ1ZSB9LFxuICAgIH0pXG5cbiAgICBleHBlY3QoKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAgeyBpZDogMSwgbmFtZTogJ2FsaWNlXCJzbWl0aCcgfSxcbiAgICAgIHsgaWQ6IDIsIG5hbWU6ICdib2JcImpvbmVzJyB9LFxuICAgIF0pXG4gIH0pXG5cbiAgaXQuc2tpcChcInNob3VsZCBoYW5kbGUgZGlzYWJsaW5nIGRvdWJsZSBxdW90ZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXG4gICAgICAnaWQsbmFtZVxcbjEsXCJhbGljZVwiXCJzbWl0aFwiXFxuMixcImJvYlwiXCJqb25lc1wiJyxcbiAgICApXG5cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRDc3ZUYWJsZSh7XG4gICAgICBwYXRoLFxuICAgICAgZGlhbGVjdDogeyBkb3VibGVRdW90ZTogZmFsc2UgfSxcbiAgICB9KVxuXG4gICAgZXhwZWN0KChhd2FpdCB0YWJsZS5jb2xsZWN0KCkpLnRvUmVjb3JkcygpKS50b0VxdWFsKFtcbiAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiYWxpY2VzbWl0aFwiIH0sXG4gICAgICB7IGlkOiAyLCBuYW1lOiBcImJvYmpvbmVzXCIgfSxcbiAgICBdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBjb21tZW50IGNoYXJhY3RlclwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXG4gICAgICBcIiMgVGhpcyBpcyBhIGNvbW1lbnRcXG5pZCxuYW1lXFxuMSxhbGljZVxcbiMgQW5vdGhlciBjb21tZW50XFxuMixib2JcIixcbiAgICApXG5cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRDc3ZUYWJsZSh7XG4gICAgICBwYXRoLFxuICAgICAgZGlhbGVjdDogeyBjb21tZW50Q2hhcjogXCIjXCIgfSxcbiAgICB9KVxuXG4gICAgY29uc3QgcmVjb3JkcyA9IChhd2FpdCB0YWJsZS5jb2xsZWN0KCkpLnRvUmVjb3JkcygpXG4gICAgZXhwZWN0KHJlY29yZHMpLnRvRXF1YWwoW1xuICAgICAgeyBpZDogMSwgbmFtZTogXCJhbGljZVwiIH0sXG4gICAgICB7IGlkOiAyLCBuYW1lOiBcImJvYlwiIH0sXG4gICAgXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBzdXBwb3J0IGhlYWRlclJvd3NcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiI2NvbW1lbnRcXG5pZCxuYW1lXFxuMSxhbGljZVxcbjIsYm9iXCIpXG5cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRDc3ZUYWJsZSh7XG4gICAgICBwYXRoLFxuICAgICAgZGlhbGVjdDogeyBoZWFkZXJSb3dzOiBbMl0gfSxcbiAgICB9KVxuXG4gICAgY29uc3QgcmVjb3JkcyA9IChhd2FpdCB0YWJsZS5jb2xsZWN0KCkpLnRvUmVjb3JkcygpXG4gICAgZXhwZWN0KHJlY29yZHMpLnRvRXF1YWwoW1xuICAgICAgeyBpZDogMSwgbmFtZTogXCJhbGljZVwiIH0sXG4gICAgICB7IGlkOiAyLCBuYW1lOiBcImJvYlwiIH0sXG4gICAgXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBzdXBwb3J0IGhlYWRlckpvaW5cIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFxuICAgICAgXCIjY29tbWVudFxcbmlkLG5hbWVcXG5pbnQsc3RyXFxuMSxhbGljZVxcbjIsYm9iXCIsXG4gICAgKVxuXG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkQ3N2VGFibGUoe1xuICAgICAgcGF0aCxcbiAgICAgIGRpYWxlY3Q6IHsgaGVhZGVyUm93czogWzIsIDNdLCBoZWFkZXJKb2luOiBcIl9cIiB9LFxuICAgIH0pXG5cbiAgICBjb25zdCByZWNvcmRzID0gKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKClcbiAgICBleHBlY3QocmVjb3JkcykudG9FcXVhbChbXG4gICAgICB7IGlkX2ludDogMSwgbmFtZV9zdHI6IFwiYWxpY2VcIiB9LFxuICAgICAgeyBpZF9pbnQ6IDIsIG5hbWVfc3RyOiBcImJvYlwiIH0sXG4gICAgXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBzdXBwb3J0IGNvbW1lbnRSb3dzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkLG5hbWVcXG4xLGFsaWNlXFxuY29tbWVudFxcbjIsYm9iXCIpXG5cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRDc3ZUYWJsZSh7XG4gICAgICBwYXRoLFxuICAgICAgZGlhbGVjdDogeyBjb21tZW50Um93czogWzNdIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IHJlY29yZHMgPSAoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKVxuICAgIGV4cGVjdChyZWNvcmRzKS50b0VxdWFsKFtcbiAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiYWxpY2VcIiB9LFxuICAgICAgeyBpZDogMiwgbmFtZTogXCJib2JcIiB9LFxuICAgIF0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgc3VwcG9ydCBoZWFkZXJSb3dzIGFuZCBjb21tZW50Um93c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXG4gICAgICBcIiNjb21tZW50XFxuaWQsbmFtZVxcbjEsYWxpY2VcXG4jY29tbWVudFxcbjIsYm9iXCIsXG4gICAgKVxuXG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkQ3N2VGFibGUoe1xuICAgICAgcGF0aCxcbiAgICAgIGRpYWxlY3Q6IHsgaGVhZGVyUm93czogWzJdLCBjb21tZW50Um93czogWzRdIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IHJlY29yZHMgPSAoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKVxuICAgIGV4cGVjdChyZWNvcmRzKS50b0VxdWFsKFtcbiAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiYWxpY2VcIiB9LFxuICAgICAgeyBpZDogMiwgbmFtZTogXCJib2JcIiB9LFxuICAgIF0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgc3VwcG9ydCBoZWFkZXJKb2luIGFuZCBjb21tZW50Um93c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXG4gICAgICBcIiNjb21tZW50XFxuaWQsbmFtZVxcbmludCxzdHJcXG4xLGFsaWNlXFxuI2NvbW1lbnRcXG4yLGJvYlwiLFxuICAgIClcblxuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgbG9hZENzdlRhYmxlKHtcbiAgICAgIHBhdGgsXG4gICAgICBkaWFsZWN0OiB7IGhlYWRlclJvd3M6IFsyLCAzXSwgaGVhZGVySm9pbjogXCJfXCIsIGNvbW1lbnRSb3dzOiBbNV0gfSxcbiAgICB9KVxuXG4gICAgY29uc3QgcmVjb3JkcyA9IChhd2FpdCB0YWJsZS5jb2xsZWN0KCkpLnRvUmVjb3JkcygpXG4gICAgZXhwZWN0KHJlY29yZHMpLnRvRXF1YWwoW1xuICAgICAgeyBpZF9pbnQ6IDEsIG5hbWVfc3RyOiBcImFsaWNlXCIgfSxcbiAgICAgIHsgaWRfaW50OiAyLCBuYW1lX3N0cjogXCJib2JcIiB9LFxuICAgIF0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIG51bGwgc2VxdWVuY2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFxuICAgICAgXCJpZCxuYW1lLGFnZVxcbjEsYWxpY2UsMjVcXG4yLE4vQSwzMFxcbjMsYm9iLE4vQVwiLFxuICAgIClcbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRDc3ZUYWJsZSh7XG4gICAgICBwYXRoLFxuICAgICAgZGlhbGVjdDogeyBudWxsU2VxdWVuY2U6IFwiTi9BXCIgfSxcbiAgICB9KVxuXG4gICAgZXhwZWN0KChhd2FpdCB0YWJsZS5jb2xsZWN0KCkpLnRvUmVjb3JkcygpKS50b0VxdWFsKFtcbiAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiYWxpY2VcIiwgYWdlOiAyNSB9LFxuICAgICAgeyBpZDogMiwgbmFtZTogbnVsbCwgYWdlOiAzMCB9LFxuICAgICAgeyBpZDogMywgbmFtZTogXCJib2JcIiwgYWdlOiBudWxsIH0sXG4gICAgXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgc2tpcCBpbml0aWFsIHNwYWNlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcbiAgICAgIFwiaWQsbmFtZSxjYXRlZ29yeVxcbjEsIGFsaWNlLCBmcnVpdHNcXG4yLCAgYm9iLCAgdmVnZXRhYmxlc1xcbjMsY2hhcmxpZSxncmFpbnNcIixcbiAgICApXG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkQ3N2VGFibGUoe1xuICAgICAgcGF0aCxcbiAgICAgIGRpYWxlY3Q6IHsgc2tpcEluaXRpYWxTcGFjZTogdHJ1ZSB9LFxuICAgIH0pXG5cbiAgICBleHBlY3QoKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAgeyBpZDogMSwgbmFtZTogXCJhbGljZVwiLCBjYXRlZ29yeTogXCJmcnVpdHNcIiB9LFxuICAgICAgeyBpZDogMiwgbmFtZTogXCJib2JcIiwgY2F0ZWdvcnk6IFwidmVnZXRhYmxlc1wiIH0sXG4gICAgICB7IGlkOiAzLCBuYW1lOiBcImNoYXJsaWVcIiwgY2F0ZWdvcnk6IFwiZ3JhaW5zXCIgfSxcbiAgICBdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBtdWx0aXBsZSBkaWFsZWN0IG9wdGlvbnMgdG9nZXRoZXJcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFxuICAgICAgXCIjY29tbWVudFxcbmlkfCdmdWxsIG5hbWUnfGFnZVxcbjF8J2FsaWNlIHNtaXRoJ3wyNVxcbjJ8J2JvYiBqb25lcyd8MzBcIixcbiAgICApXG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkQ3N2VGFibGUoe1xuICAgICAgcGF0aCxcbiAgICAgIGRpYWxlY3Q6IHtcbiAgICAgICAgZGVsaW1pdGVyOiBcInxcIixcbiAgICAgICAgcXVvdGVDaGFyOiBcIidcIixcbiAgICAgICAgY29tbWVudENoYXI6IFwiI1wiLFxuICAgICAgICBoZWFkZXI6IHRydWUsXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBleHBlY3QoKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAgeyBpZDogMSwgXCJmdWxsIG5hbWVcIjogXCJhbGljZSBzbWl0aFwiLCBhZ2U6IDI1IH0sXG4gICAgICB7IGlkOiAyLCBcImZ1bGwgbmFtZVwiOiBcImJvYiBqb25lc1wiLCBhZ2U6IDMwIH0sXG4gICAgXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgdXRmOCBlbmNvZGluZ1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXG4gICAgICBCdWZmZXIuZnJvbShcImlkLG5hbWVcXG4xLGNhZsOpXFxuMixuYcOvdmVcIiwgXCJ1dGY4XCIpLFxuICAgIClcblxuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgbG9hZENzdlRhYmxlKHtcbiAgICAgIHBhdGgsXG4gICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgfSlcblxuICAgIGV4cGVjdCgoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKSkudG9FcXVhbChbXG4gICAgICB7IGlkOiAxLCBuYW1lOiBcImNhZsOpXCIgfSxcbiAgICAgIHsgaWQ6IDIsIG5hbWU6IFwibmHDr3ZlXCIgfSxcbiAgICBdKVxuICB9KVxuXG4gIC8vIFRPRE86IGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIGJ5IG5vZGVqcy1wb2xhcnNcbiAgaXQuc2tpcChcInNob3VsZCBoYW5kbGUgdXRmMTYgZW5jb2RpbmdcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFxuICAgICAgQnVmZmVyLmZyb20oXCJpZCxuYW1lXFxuMSxjYWbDqVxcbjIsbmHDr3ZlXCIsIFwidXRmMTZsZVwiKSxcbiAgICApXG5cbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRDc3ZUYWJsZSh7XG4gICAgICBwYXRoLFxuICAgICAgZW5jb2Rpbmc6IFwidXRmMTZcIixcbiAgICB9KVxuXG4gICAgZXhwZWN0KChhd2FpdCB0YWJsZS5jb2xsZWN0KCkpLnRvUmVjb3JkcygpKS50b0VxdWFsKFtcbiAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiY2Fmw6lcIiB9LFxuICAgICAgeyBpZDogMiwgbmFtZTogXCJuYcOvdmVcIiB9LFxuICAgIF0pXG4gIH0pXG5cbiAgLy8gVE9ETzogY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgYnkgbm9kZWpzLXBvbGFyc1xuICBpdC5za2lwKFwic2hvdWxkIGhhbmRsZSBsYXRpbjEgZW5jb2RpbmdcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFxuICAgICAgQnVmZmVyLmZyb20oXCJpZCxuYW1lXFxuMSxjYWbDqVxcbjIscsOpc3Vtw6lcIiwgXCJsYXRpbjFcIiksXG4gICAgKVxuXG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkQ3N2VGFibGUoe1xuICAgICAgcGF0aCxcbiAgICAgIGVuY29kaW5nOiBcImxhdGluMVwiLFxuICAgIH0pXG5cbiAgICBleHBlY3QoKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAgeyBpZDogMSwgbmFtZTogXCJjYWbDqVwiIH0sXG4gICAgICB7IGlkOiAyLCBuYW1lOiBcInLDqXN1bcOpXCIgfSxcbiAgICBdKVxuICB9KVxufSlcblxuZGVzY3JpYmUoXCJsb2FkQ3N2VGFibGUgKGZvcm1hdD10c3YpXCIsICgpID0+IHtcbiAgaXQoXCJzaG91bGQgbG9hZCBsb2NhbCBmaWxlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkXFx0bmFtZVxcbjFcXHRlbmdsaXNoXFxuMlxcdOS4reaWh1wiKVxuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgbG9hZENzdlRhYmxlKHsgcGF0aCwgZm9ybWF0OiBcInRzdlwiIH0pXG5cbiAgICBleHBlY3QoKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAgeyBpZDogMSwgbmFtZTogXCJlbmdsaXNoXCIgfSxcbiAgICAgIHsgaWQ6IDIsIG5hbWU6IFwi5Lit5paHXCIgfSxcbiAgICBdKVxuICB9KVxufSlcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ import type { SaveTableOptions } from "../../../plugin.ts";
2
+ import type { Table } from "../../../table/index.ts";
3
+ export declare function saveCsvTable(table: Table, options: SaveTableOptions & {
4
+ format?: "csv" | "tsv";
5
+ }): Promise<string>;
@@ -0,0 +1,29 @@
1
+ import { assertLocalPathVacant } from "@frictionless-ts/dataset";
2
+ import { inferSchemaFromTable } from "../../../schema/index.js";
3
+ import { denormalizeTable } from "../../../table/index.js";
4
+ export async function saveCsvTable(table, options) {
5
+ const { path, format, overwrite } = options;
6
+ const isTabs = format === "tsv";
7
+ if (!overwrite) {
8
+ await assertLocalPathVacant(path);
9
+ }
10
+ const schema = options.schema ??
11
+ (await inferSchemaFromTable(table, {
12
+ ...options,
13
+ keepStrings: true,
14
+ }));
15
+ table = await denormalizeTable(table, schema, {
16
+ nativeTypes: ["string"],
17
+ });
18
+ await table
19
+ .sinkCSV(path, {
20
+ maintainOrder: true,
21
+ includeHeader: options.dialect?.header ?? true,
22
+ separator: options.dialect?.delimiter ?? (isTabs ? "\t" : ","),
23
+ //lineTerminator: options.dialect?.lineTerminator ?? "\r\n",
24
+ quoteChar: options.dialect?.quoteChar ?? '"',
25
+ })
26
+ .collect();
27
+ return path;
28
+ }
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BsdWdpbnMvY3N2L3RhYmxlL3NhdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFFaEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFDL0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFHMUQsTUFBTSxDQUFDLEtBQUssVUFBVSxZQUFZLENBQ2hDLEtBQVksRUFDWixPQUFzRDtJQUV0RCxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxPQUFPLENBQUE7SUFDM0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxLQUFLLEtBQUssQ0FBQTtJQUUvQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixNQUFNLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ25DLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FDVixPQUFPLENBQUMsTUFBTTtRQUNkLENBQUMsTUFBTSxvQkFBb0IsQ0FBQyxLQUFLLEVBQUU7WUFDakMsR0FBRyxPQUFPO1lBQ1YsV0FBVyxFQUFFLElBQUk7U0FDbEIsQ0FBQyxDQUFDLENBQUE7SUFFTCxLQUFLLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFO1FBQzVDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQztLQUN4QixDQUFDLENBQUE7SUFFRixNQUFNLEtBQUs7U0FDUixPQUFPLENBQUMsSUFBSSxFQUFFO1FBQ2IsYUFBYSxFQUFFLElBQUk7UUFDbkIsYUFBYSxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxJQUFJLElBQUk7UUFDOUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsU0FBUyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUM5RCw0REFBNEQ7UUFDNUQsU0FBUyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsU0FBUyxJQUFJLEdBQUc7S0FDN0MsQ0FBQztTQUNELE9BQU8sRUFBRSxDQUFBO0lBRVosT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXNzZXJ0TG9jYWxQYXRoVmFjYW50IH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvZGF0YXNldFwiXG5pbXBvcnQgdHlwZSB7IFNhdmVUYWJsZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vLi4vcGx1Z2luLnRzXCJcbmltcG9ydCB7IGluZmVyU2NoZW1hRnJvbVRhYmxlIH0gZnJvbSBcIi4uLy4uLy4uL3NjaGVtYS9pbmRleC50c1wiXG5pbXBvcnQgeyBkZW5vcm1hbGl6ZVRhYmxlIH0gZnJvbSBcIi4uLy4uLy4uL3RhYmxlL2luZGV4LnRzXCJcbmltcG9ydCB0eXBlIHsgVGFibGUgfSBmcm9tIFwiLi4vLi4vLi4vdGFibGUvaW5kZXgudHNcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZUNzdlRhYmxlKFxuICB0YWJsZTogVGFibGUsXG4gIG9wdGlvbnM6IFNhdmVUYWJsZU9wdGlvbnMgJiB7IGZvcm1hdD86IFwiY3N2XCIgfCBcInRzdlwiIH0sXG4pIHtcbiAgY29uc3QgeyBwYXRoLCBmb3JtYXQsIG92ZXJ3cml0ZSB9ID0gb3B0aW9uc1xuICBjb25zdCBpc1RhYnMgPSBmb3JtYXQgPT09IFwidHN2XCJcblxuICBpZiAoIW92ZXJ3cml0ZSkge1xuICAgIGF3YWl0IGFzc2VydExvY2FsUGF0aFZhY2FudChwYXRoKVxuICB9XG5cbiAgY29uc3Qgc2NoZW1hID1cbiAgICBvcHRpb25zLnNjaGVtYSA/P1xuICAgIChhd2FpdCBpbmZlclNjaGVtYUZyb21UYWJsZSh0YWJsZSwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGtlZXBTdHJpbmdzOiB0cnVlLFxuICAgIH0pKVxuXG4gIHRhYmxlID0gYXdhaXQgZGVub3JtYWxpemVUYWJsZSh0YWJsZSwgc2NoZW1hLCB7XG4gICAgbmF0aXZlVHlwZXM6IFtcInN0cmluZ1wiXSxcbiAgfSlcblxuICBhd2FpdCB0YWJsZVxuICAgIC5zaW5rQ1NWKHBhdGgsIHtcbiAgICAgIG1haW50YWluT3JkZXI6IHRydWUsXG4gICAgICBpbmNsdWRlSGVhZGVyOiBvcHRpb25zLmRpYWxlY3Q/LmhlYWRlciA/PyB0cnVlLFxuICAgICAgc2VwYXJhdG9yOiBvcHRpb25zLmRpYWxlY3Q/LmRlbGltaXRlciA/PyAoaXNUYWJzID8gXCJcXHRcIiA6IFwiLFwiKSxcbiAgICAgIC8vbGluZVRlcm1pbmF0b3I6IG9wdGlvbnMuZGlhbGVjdD8ubGluZVRlcm1pbmF0b3IgPz8gXCJcXHJcXG5cIixcbiAgICAgIHF1b3RlQ2hhcjogb3B0aW9ucy5kaWFsZWN0Py5xdW90ZUNoYXIgPz8gJ1wiJyxcbiAgICB9KVxuICAgIC5jb2xsZWN0KClcblxuICByZXR1cm4gcGF0aFxufVxuIl19
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,137 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { getTempFilePath } from "@frictionless-ts/dataset";
3
+ import * as pl from "nodejs-polars";
4
+ import { describe, expect, it } from "vitest";
5
+ import { loadCsvTable } from "./load.js";
6
+ import { saveCsvTable } from "./save.js";
7
+ describe("saveCsvTable", () => {
8
+ it("should save table to file", async () => {
9
+ const path = getTempFilePath();
10
+ const table = pl
11
+ .DataFrame({
12
+ id: [1.0, 2.0, 3.0],
13
+ name: ["Alice", "Bob", "Charlie"],
14
+ })
15
+ .lazy();
16
+ await saveCsvTable(table, { path });
17
+ const content = await readFile(path, "utf-8");
18
+ expect(content).toEqual("id,name\n1.0,Alice\n2.0,Bob\n3.0,Charlie\n");
19
+ });
20
+ it("should save with custom delimiter", async () => {
21
+ const path = getTempFilePath();
22
+ const table = pl
23
+ .DataFrame({
24
+ id: [1.0, 2.0, 3.0],
25
+ name: ["Alice", "Bob", "Charlie"],
26
+ })
27
+ .lazy();
28
+ await saveCsvTable(table, {
29
+ path,
30
+ dialect: { delimiter: ";" },
31
+ });
32
+ const content = await readFile(path, "utf-8");
33
+ expect(content).toEqual("id;name\n1.0;Alice\n2.0;Bob\n3.0;Charlie\n");
34
+ });
35
+ it("should save without header", async () => {
36
+ const path = getTempFilePath();
37
+ const table = pl
38
+ .DataFrame({
39
+ id: [1.0, 2.0, 3.0],
40
+ name: ["Alice", "Bob", "Charlie"],
41
+ })
42
+ .lazy();
43
+ await saveCsvTable(table, {
44
+ path,
45
+ dialect: { header: false },
46
+ });
47
+ const content = await readFile(path, "utf-8");
48
+ expect(content).toEqual("1.0,Alice\n2.0,Bob\n3.0,Charlie\n");
49
+ });
50
+ it("should save with custom quote char", async () => {
51
+ const path = getTempFilePath();
52
+ const table = pl
53
+ .DataFrame({
54
+ id: [1.0, 2.0, 3.0],
55
+ name: ["Alice,Smith", "Bob,Jones", "Charlie,Brown"],
56
+ })
57
+ .lazy();
58
+ await saveCsvTable(table, {
59
+ path,
60
+ dialect: { quoteChar: "'" },
61
+ });
62
+ const content = await readFile(path, "utf-8");
63
+ expect(content).toEqual("id,name\n1.0,'Alice,Smith'\n2.0,'Bob,Jones'\n3.0,'Charlie,Brown'\n");
64
+ });
65
+ it("should save and load various data types", async () => {
66
+ const path = getTempFilePath();
67
+ const source = pl
68
+ .DataFrame([
69
+ pl.Series("array", ["[1, 2, 3]"], pl.String),
70
+ pl.Series("boolean", [true], pl.Bool),
71
+ pl.Series("date", [new Date(Date.UTC(2025, 0, 1))], pl.Date),
72
+ pl.Series("datetime", [new Date(Date.UTC(2025, 0, 1))], pl.Datetime),
73
+ pl.Series("duration", ["P23DT23H"], pl.String),
74
+ pl.Series("geojson", ['{"value": 1}'], pl.String),
75
+ pl.Series("geopoint", [[40.0, 50.0]], pl.List(pl.Float32)),
76
+ pl.Series("integer", [1], pl.Int32),
77
+ pl.Series("list", [[1.0, 2.0, 3.0]], pl.List(pl.Float32)),
78
+ pl.Series("number", [1.1], pl.Float64),
79
+ pl.Series("object", ['{"value": 1}']),
80
+ pl.Series("string", ["string"], pl.String),
81
+ pl.Series("time", [new Date(Date.UTC(2025, 0, 1))], pl.Time),
82
+ pl.Series("year", [2025], pl.Int32),
83
+ pl.Series("yearmonth", [[2025, 1]], pl.List(pl.Int16)),
84
+ ])
85
+ .lazy();
86
+ await saveCsvTable(source, {
87
+ path,
88
+ fieldTypes: {
89
+ array: "array",
90
+ geojson: "geojson",
91
+ geopoint: "geopoint",
92
+ list: "list",
93
+ object: "object",
94
+ // TODO: Remove time after:
95
+ // https://github.com/pola-rs/nodejs-polars/issues/364
96
+ time: "time",
97
+ year: "year",
98
+ yearmonth: "yearmonth",
99
+ },
100
+ });
101
+ const target = await loadCsvTable({ path }, { denormalized: true });
102
+ expect((await target.collect()).toRecords()).toEqual([
103
+ {
104
+ array: "[1, 2, 3]",
105
+ boolean: "true",
106
+ date: "2025-01-01",
107
+ datetime: "2025-01-01T00:00:00",
108
+ duration: "P23DT23H",
109
+ geojson: '{"value": 1}',
110
+ geopoint: "40.0,50.0",
111
+ integer: "1",
112
+ list: "1.0,2.0,3.0",
113
+ number: "1.1",
114
+ object: '{"value": 1}',
115
+ string: "string",
116
+ time: "00:00:00",
117
+ year: "2025",
118
+ yearmonth: "2025-01",
119
+ },
120
+ ]);
121
+ });
122
+ });
123
+ describe("saveCsvTable (format=tsv)", () => {
124
+ it("should save table to file", async () => {
125
+ const path = getTempFilePath();
126
+ const table = pl
127
+ .DataFrame({
128
+ id: [1.0, 2.0, 3.0],
129
+ name: ["Alice", "Bob", "Charlie"],
130
+ })
131
+ .lazy();
132
+ await saveCsvTable(table, { path, format: "tsv" });
133
+ const content = await readFile(path, "utf-8");
134
+ expect(content).toEqual("id\tname\n1.0\tAlice\n2.0\tBob\n3.0\tCharlie\n");
135
+ });
136
+ });
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGx1Z2lucy9jc3YvdGFibGUvc2F2ZS5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFDMUQsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDbkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUV4QyxRQUFRLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRTtJQUM1QixFQUFFLENBQUMsMkJBQTJCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDekMsTUFBTSxJQUFJLEdBQUcsZUFBZSxFQUFFLENBQUE7UUFDOUIsTUFBTSxLQUFLLEdBQUcsRUFBRTthQUNiLFNBQVMsQ0FBQztZQUNULEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO1lBQ25CLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDO1NBQ2xDLENBQUM7YUFDRCxJQUFJLEVBQUUsQ0FBQTtRQUVULE1BQU0sWUFBWSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7UUFFbkMsTUFBTSxPQUFPLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQzdDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsNENBQTRDLENBQUMsQ0FBQTtJQUN2RSxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyxtQ0FBbUMs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LEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDNUQsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDcEUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQzlDLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNqRCxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUQsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25DLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDekQsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ3RDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDckMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQzFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQzVELEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQyxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDdkQsQ0FBQzthQUNELElBQUksRUFBRSxDQUFBO1FBRVQsTUFBTSxZQUFZLENBQUMsTUFBTSxFQUFFO1lBQ3pCLElBQUk7WUFDSixVQUFVLEVBQUU7Z0JBQ1YsS0FBSyxFQUFFLE9BQU87Z0JBQ2QsT0FBTyxFQUFFLFNBQVM7Z0JBQ2xCLFFBQVEsRUFBRSxVQUFVO2dCQUNwQixJQUFJLEVBQUUsTUFBTTtnQkFDWixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsMkJBQTJCO2dCQUMzQixzREFBc0Q7Z0JBQ3RELElBQUksRUFBRSxNQUFNO2dCQUNaLElBQUksRUFBRSxNQUFNO2dCQUNaLFNBQVMsRUFBRSxXQUFXO2FBQ3ZCO1NBQ0YsQ0FBQyxDQUFBO1FBRUYsTUFBTSxNQUFNLEdBQUcsTUFBTSxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ25FLE1BQU0sQ0FBQyxDQUFDLE1BQU0sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDbkQ7Z0JBQ0UsS0FBSyxFQUFFLFdBQVc7Z0JBQ2xCLE9BQU8sRUFBRSxNQUFNO2dCQUNmLElBQUksRUFBRSxZQUFZO2dCQUNsQixRQUFRLEVBQUUscUJBQXFCO2dCQUMvQixRQUFRLEVBQUUsVUFBVTtnQkFDcEIsT0FBTyxFQUFFLGNBQWM7Z0JBQ3ZCLFFBQVEsRUFBRSxXQUFXO2dCQUNyQixPQUFPLEVBQUUsR0FBRztnQkFDWixJQUFJLEVBQUUsYUFBYTtnQkFDbkIsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsTUFBTSxFQUFFLGNBQWM7Z0JBQ3RCLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixJQUFJLEVBQUUsVUFBVTtnQkFDaEIsSUFBSSxFQUFFLE1BQU07Z0JBQ1osU0FBUyxFQUFFLFNBQVM7YUFDckI7U0FDRixDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBO0FBRUYsUUFBUSxDQUFDLDJCQUEyQixFQUFFLEdBQUcsRUFBRTtJQUN6QyxFQUFFLENBQUMsMkJBQTJCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDekMsTUFBTSxJQUFJLEdBQUcsZUFBZSxFQUFFLENBQUE7UUFDOUIsTUFBTSxLQUFLLEdBQUcsRUFBRTthQUNiLFNBQVMsQ0FBQztZQUNULEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO1lBQ25CLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDO1NBQ2xDLENBQUM7YUFDRCxJQUFJLEVBQUUsQ0FBQTtRQUVULE1BQU0sWUFBWSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUVsRCxNQUFNLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDN0MsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnREFBZ0QsQ0FBQyxDQUFBO0lBQzNFLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCB7IGdldFRlbXBGaWxlUGF0aCB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL2RhdGFzZXRcIlxuaW1wb3J0ICogYXMgcGwgZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IGxvYWRDc3ZUYWJsZSB9IGZyb20gXCIuL2xvYWQudHNcIlxuaW1wb3J0IHsgc2F2ZUNzdlRhYmxlIH0gZnJvbSBcIi4vc2F2ZS50c1wiXG5cbmRlc2NyaWJlKFwic2F2ZUNzdlRhYmxlXCIsICgpID0+IHtcbiAgaXQoXCJzaG91bGQgc2F2ZSB0YWJsZSB0byBmaWxlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXRoID0gZ2V0VGVtcEZpbGVQYXRoKClcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgaWQ6IFsxLjAsIDIuMCwgMy4wXSxcbiAgICAgICAgbmFtZTogW1wiQWxpY2VcIiwgXCJCb2JcIiwgXCJDaGFybGllXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGF3YWl0IHNhdmVDc3ZUYWJsZSh0YWJsZSwgeyBwYXRoIH0pXG5cbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUocGF0aCwgXCJ1dGYtOFwiKVxuICAgIGV4cGVjdChjb250ZW50KS50b0VxdWFsKFwiaWQsbmFtZVxcbjEuMCxBbGljZVxcbjIuMCxCb2JcXG4zLjAsQ2hhcmxpZVxcblwiKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHNhdmUgd2l0aCBjdXN0b20gZGVsaW1pdGVyXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXRoID0gZ2V0VGVtcEZpbGVQYXRoKClcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgaWQ6IFsxLjAsIDIuMCwgMy4wXSxcbiAgICAgICAgbmFtZTogW1wiQWxpY2VcIiwgXCJCb2JcIiwgXCJDaGFybGllXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGF3YWl0IHNhdmVDc3ZUYWJsZSh0YWJsZSwge1xuICAgICAgcGF0aCxcbiAgICAgIGRpYWxlY3Q6IHsgZGVsaW1pdGVyOiBcIjtcIiB9LFxuICAgIH0pXG5cbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUocGF0aCwgXCJ1dGYtOFwiKVxuICAgIGV4cGVjdChjb250ZW50KS50b0VxdWFsKFwiaWQ7bmFtZVxcbjEuMDtBbGljZVxcbjIuMDtCb2JcXG4zLjA7Q2hhcmxpZVxcblwiKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHNhdmUgd2l0aG91dCBoZWFkZXJcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBnZXRUZW1wRmlsZVBhdGgoKVxuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBpZDogWzEuMCwgMi4wLCAzLjBdLFxuICAgICAgICBuYW1lOiBbXCJBbGljZVwiLCBcIkJvYlwiLCBcIkNoYXJsaWVcIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgYXdhaXQgc2F2ZUNzdlRhYmxlKHRhYmxlLCB7XG4gICAgICBwYXRoLFxuICAgICAgZGlhbGVjdDogeyBoZWFkZXI6IGZhbHNlIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShwYXRoLCBcInV0Zi04XCIpXG4gICAgZXhwZWN0KGNvbnRlbnQpLnRvRXF1YWwoXCIxLjAsQWxpY2VcXG4yLjAsQm9iXFxuMy4wLENoYXJsaWVcXG5cIilcbiAgfSlcblxuICBpdChcInNob3VsZCBzYXZlIHdpdGggY3VzdG9tIHF1b3RlIGNoYXJcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBnZXRUZW1wRmlsZVBhdGgoKVxuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBpZDogWzEuMCwgMi4wLCAzLjBdLFxuICAgICAgICBuYW1lOiBbXCJBbGljZSxTbWl0aFwiLCBcIkJvYixKb25lc1wiLCBcIkNoYXJsaWUsQnJvd25cIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgYXdhaXQgc2F2ZUNzdlRhYmxlKHRhYmxlLCB7XG4gICAgICBwYXRoLFxuICAgICAgZGlhbGVjdDogeyBxdW90ZUNoYXI6IFwiJ1wiIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShwYXRoLCBcInV0Zi04XCIpXG4gICAgZXhwZWN0KGNvbnRlbnQpLnRvRXF1YWwoXG4gICAgICBcImlkLG5hbWVcXG4xLjAsJ0FsaWNlLFNtaXRoJ1xcbjIuMCwnQm9iLEpvbmVzJ1xcbjMuMCwnQ2hhcmxpZSxCcm93bidcXG5cIixcbiAgICApXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgc2F2ZSBhbmQgbG9hZCB2YXJpb3VzIGRhdGEgdHlwZXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBnZXRUZW1wRmlsZVBhdGgoKVxuXG4gICAgY29uc3Qgc291cmNlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoW1xuICAgICAgICBwbC5TZXJpZXMoXCJhcnJheVwiLCBbXCJbMSwgMiwgM11cIl0sIHBsLlN0cmluZyksXG4gICAgICAgIHBsLlNlcmllcyhcImJvb2xlYW5cIiwgW3RydWVdLCBwbC5Cb29sKSxcbiAgICAgICAgcGwuU2VyaWVzKFwiZGF0ZVwiLCBbbmV3IERhdGUoRGF0ZS5VVEMoMjAyNSwgMCwgMSkpXSwgcGwuRGF0ZSksXG4gICAgICAgIHBsLlNlcmllcyhcImRhdGV0aW1lXCIsIFtuZXcgRGF0ZShEYXRlLlVUQygyMDI1LCAwLCAxKSldLCBwbC5EYXRldGltZSksXG4gICAgICAgIHBsLlNlcmllcyhcImR1cmF0aW9uXCIsIFtcIlAyM0RUMjNIXCJdLCBwbC5TdHJpbmcpLFxuICAgICAgICBwbC5TZXJpZXMoXCJnZW9qc29uXCIsIFsne1widmFsdWVcIjogMX0nXSwgcGwuU3RyaW5nKSxcbiAgICAgICAgcGwuU2VyaWVzKFwiZ2VvcG9pbnRcIiwgW1s0MC4wLCA1MC4wXV0sIHBsLkxpc3QocGwuRmxvYXQzMikpLFxuICAgICAgICBwbC5TZXJpZXMoXCJpbnRlZ2VyXCIsIFsxXSwgcGwuSW50MzIpLFxuICAgICAgICBwbC5TZXJpZXMoXCJsaXN0XCIsIFtbMS4wLCAyLjAsIDMuMF1dLCBwbC5MaXN0KHBsLkZsb2F0MzIpKSxcbiAgICAgICAgcGwuU2VyaWVzKFwibnVtYmVyXCIsIFsxLjFdLCBwbC5GbG9hdDY0KSxcbiAgICAgICAgcGwuU2VyaWVzKFwib2JqZWN0XCIsIFsne1widmFsdWVcIjogMX0nXSksXG4gICAgICAgIHBsLlNlcmllcyhcInN0cmluZ1wiLCBbXCJzdHJpbmdcIl0sIHBsLlN0cmluZyksXG4gICAgICAgIHBsLlNlcmllcyhcInRpbWVcIiwgW25ldyBEYXRlKERhdGUuVVRDKDIwMjUsIDAsIDEpKV0sIHBsLlRpbWUpLFxuICAgICAgICBwbC5TZXJpZXMoXCJ5ZWFyXCIsIFsyMDI1XSwgcGwuSW50MzIpLFxuICAgICAgICBwbC5TZXJpZXMoXCJ5ZWFybW9udGhcIiwgW1syMDI1LCAxXV0sIHBsLkxpc3QocGwuSW50MTYpKSxcbiAgICAgIF0pXG4gICAgICAubGF6eSgpXG5cbiAgICBhd2FpdCBzYXZlQ3N2VGFibGUoc291cmNlLCB7XG4gICAgICBwYXRoLFxuICAgICAgZmllbGRUeXBlczoge1xuICAgICAgICBhcnJheTogXCJhcnJheVwiLFxuICAgICAgICBnZW9qc29uOiBcImdlb2pzb25cIixcbiAgICAgICAgZ2VvcG9pbnQ6IFwiZ2VvcG9pbnRcIixcbiAgICAgICAgbGlzdDogXCJsaXN0XCIsXG4gICAgICAgIG9iamVjdDogXCJvYmplY3RcIixcbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRpbWUgYWZ0ZXI6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb2xhLXJzL25vZGVqcy1wb2xhcnMvaXNzdWVzLzM2NFxuICAgICAgICB0aW1lOiBcInRpbWVcIixcbiAgICAgICAgeWVhcjogXCJ5ZWFyXCIsXG4gICAgICAgIHllYXJtb250aDogXCJ5ZWFybW9udGhcIixcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IHRhcmdldCA9IGF3YWl0IGxvYWRDc3ZUYWJsZSh7IHBhdGggfSwgeyBkZW5vcm1hbGl6ZWQ6IHRydWUgfSlcbiAgICBleHBlY3QoKGF3YWl0IHRhcmdldC5jb2xsZWN0KCkpLnRvUmVjb3JkcygpKS50b0VxdWFsKFtcbiAgICAgIHtcbiAgICAgICAgYXJyYXk6IFwiWzEsIDIsIDNdXCIsXG4gICAgICAgIGJvb2xlYW46IFwidHJ1ZVwiLFxuICAgICAgICBkYXRlOiBcIjIwMjUtMDEtMDFcIixcbiAgICAgICAgZGF0ZXRpbWU6IFwiMjAyNS0wMS0wMVQwMDowMDowMFwiLFxuICAgICAgICBkdXJhdGlvbjogXCJQMjNEVDIzSFwiLFxuICAgICAgICBnZW9qc29uOiAne1widmFsdWVcIjogMX0nLFxuICAgICAgICBnZW9wb2ludDogXCI0MC4wLDUwLjBcIixcbiAgICAgICAgaW50ZWdlcjogXCIxXCIsXG4gICAgICAgIGxpc3Q6IFwiMS4wLDIuMCwzLjBcIixcbiAgICAgICAgbnVtYmVyOiBcIjEuMVwiLFxuICAgICAgICBvYmplY3Q6ICd7XCJ2YWx1ZVwiOiAxfScsXG4gICAgICAgIHN0cmluZzogXCJzdHJpbmdcIixcbiAgICAgICAgdGltZTogXCIwMDowMDowMFwiLFxuICAgICAgICB5ZWFyOiBcIjIwMjVcIixcbiAgICAgICAgeWVhcm1vbnRoOiBcIjIwMjUtMDFcIixcbiAgICAgIH0sXG4gICAgXSlcbiAgfSlcbn0pXG5cbmRlc2NyaWJlKFwic2F2ZUNzdlRhYmxlIChmb3JtYXQ9dHN2KVwiLCAoKSA9PiB7XG4gIGl0KFwic2hvdWxkIHNhdmUgdGFibGUgdG8gZmlsZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGdldFRlbXBGaWxlUGF0aCgpXG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIGlkOiBbMS4wLCAyLjAsIDMuMF0sXG4gICAgICAgIG5hbWU6IFtcIkFsaWNlXCIsIFwiQm9iXCIsIFwiQ2hhcmxpZVwiXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBhd2FpdCBzYXZlQ3N2VGFibGUodGFibGUsIHsgcGF0aCwgZm9ybWF0OiBcInRzdlwiIH0pXG5cbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUocGF0aCwgXCJ1dGYtOFwiKVxuICAgIGV4cGVjdChjb250ZW50KS50b0VxdWFsKFwiaWRcXHRuYW1lXFxuMS4wXFx0QWxpY2VcXG4yLjBcXHRCb2JcXG4zLjBcXHRDaGFybGllXFxuXCIpXG4gIH0pXG59KVxuIl19
@@ -0,0 +1,2 @@
1
+ export * from "./table/index.ts";
2
+ export * from "./plugin.ts";
@@ -0,0 +1,3 @@
1
+ export * from "./table/index.js";
2
+ export * from "./plugin.js";
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbHVnaW5zL2lubGluZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGtCQUFrQixDQUFBO0FBQ2hDLGNBQWMsYUFBYSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vdGFibGUvaW5kZXgudHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vcGx1Z2luLnRzXCJcbiJdfQ==
@@ -0,0 +1,7 @@
1
+ import type { Resource } from "@frictionless-ts/metadata";
2
+ import type { LoadTableOptions, TablePlugin } from "../../plugin.ts";
3
+ export declare class InlinePlugin implements TablePlugin {
4
+ loadTable(resource: Resource, options?: LoadTableOptions): Promise<import("nodejs-polars").LazyDataFrame<{
5
+ [x: string]: any;
6
+ }> | undefined>;
7
+ }
@@ -0,0 +1,14 @@
1
+ import { loadInlineTable } from "./table/index.js";
2
+ export class InlinePlugin {
3
+ async loadTable(resource, options) {
4
+ const isInline = getIsInline(resource);
5
+ if (!isInline)
6
+ return undefined;
7
+ return await loadInlineTable(resource, options);
8
+ }
9
+ }
10
+ function getIsInline(resource) {
11
+ const isTable = resource.type === "table" || !!resource.schema;
12
+ return isTable && !!resource.data;
13
+ }
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2lucy9pbmxpbmUvcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUVsRCxNQUFNLE9BQU8sWUFBWTtJQUN2QixLQUFLLENBQUMsU0FBUyxDQUFDLFFBQWtCLEVBQUUsT0FBMEI7UUFDNUQsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3RDLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTyxTQUFTLENBQUE7UUFFL0IsT0FBTyxNQUFNLGVBQWUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDakQsQ0FBQztDQUNGO0FBRUQsU0FBUyxXQUFXLENBQUMsUUFBa0I7SUFDckMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUE7SUFDOUQsT0FBTyxPQUFPLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUE7QUFDbkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUmVzb3VyY2UgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgdHlwZSB7IExvYWRUYWJsZU9wdGlvbnMsIFRhYmxlUGx1Z2luIH0gZnJvbSBcIi4uLy4uL3BsdWdpbi50c1wiXG5pbXBvcnQgeyBsb2FkSW5saW5lVGFibGUgfSBmcm9tIFwiLi90YWJsZS9pbmRleC50c1wiXG5cbmV4cG9ydCBjbGFzcyBJbmxpbmVQbHVnaW4gaW1wbGVtZW50cyBUYWJsZVBsdWdpbiB7XG4gIGFzeW5jIGxvYWRUYWJsZShyZXNvdXJjZTogUmVzb3VyY2UsIG9wdGlvbnM/OiBMb2FkVGFibGVPcHRpb25zKSB7XG4gICAgY29uc3QgaXNJbmxpbmUgPSBnZXRJc0lubGluZShyZXNvdXJjZSlcbiAgICBpZiAoIWlzSW5saW5lKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICByZXR1cm4gYXdhaXQgbG9hZElubGluZVRhYmxlKHJlc291cmNlLCBvcHRpb25zKVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldElzSW5saW5lKHJlc291cmNlOiBSZXNvdXJjZSkge1xuICBjb25zdCBpc1RhYmxlID0gcmVzb3VyY2UudHlwZSA9PT0gXCJ0YWJsZVwiIHx8ICEhcmVzb3VyY2Uuc2NoZW1hXG4gIHJldHVybiBpc1RhYmxlICYmICEhcmVzb3VyY2UuZGF0YVxufVxuIl19
@@ -0,0 +1 @@
1
+ export { loadInlineTable } from "./load.ts";
@@ -0,0 +1,2 @@
1
+ export { loadInlineTable } from "./load.js";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wbHVnaW5zL2lubGluZS90YWJsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgbG9hZElubGluZVRhYmxlIH0gZnJvbSBcIi4vbG9hZC50c1wiXG4iXX0=
@@ -0,0 +1,6 @@
1
+ import type { Resource } from "@frictionless-ts/metadata";
2
+ import type { LoadTableOptions } from "../../../plugin.ts";
3
+ import * as pl from "nodejs-polars";
4
+ export declare function loadInlineTable(resource: Partial<Resource>, options?: LoadTableOptions): Promise<pl.LazyDataFrame<{
5
+ [x: string]: any;
6
+ }>>;