@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,200 @@
1
+ import { writeTempFile } from "@frictionless-ts/dataset";
2
+ import { describe, expect, it } from "vitest";
3
+ import { useRecording } from "vitest-polly";
4
+ import { loadJsonTable } from "./load.js";
5
+ useRecording();
6
+ describe("loadJsonTable", () => {
7
+ describe("file variations", () => {
8
+ it("should load local file", async () => {
9
+ const body = '[{"id":1,"name":"english"},{"id":2,"name":"中文"}]';
10
+ const path = await writeTempFile(body);
11
+ const table = await loadJsonTable({ path });
12
+ expect((await table.collect()).toRecords()).toEqual([
13
+ { id: 1, name: "english" },
14
+ { id: 2, name: "中文" },
15
+ ]);
16
+ });
17
+ it("should load local file (multipart)", async () => {
18
+ const body = '[{"id":1,"name":"english"},{"id":2,"name":"中文"}]';
19
+ const path1 = await writeTempFile(body);
20
+ const path2 = await writeTempFile(body);
21
+ const table = await loadJsonTable({
22
+ path: [path1, path2],
23
+ });
24
+ expect((await table.collect()).toRecords()).toEqual([
25
+ { id: 1, name: "english" },
26
+ { id: 2, name: "中文" },
27
+ { id: 1, name: "english" },
28
+ { id: 2, name: "中文" },
29
+ ]);
30
+ });
31
+ it("should load remote file", async () => {
32
+ const table = await loadJsonTable({
33
+ path: "https://raw.githubusercontent.com/datisthq/dpkit/refs/heads/main/json/table/fixtures/table.json",
34
+ });
35
+ expect((await table.collect()).toRecords()).toEqual([
36
+ { id: 1, name: "english" },
37
+ { id: 2, name: "中文" },
38
+ ]);
39
+ });
40
+ it("should load remote file (multipart)", async () => {
41
+ const table = await loadJsonTable({
42
+ path: [
43
+ "https://raw.githubusercontent.com/datisthq/dpkit/refs/heads/main/json/table/fixtures/table.json",
44
+ "https://raw.githubusercontent.com/datisthq/dpkit/refs/heads/main/json/table/fixtures/table.json",
45
+ ],
46
+ });
47
+ expect((await table.collect()).toRecords()).toEqual([
48
+ { id: 1, name: "english" },
49
+ { id: 2, name: "中文" },
50
+ { id: 1, name: "english" },
51
+ { id: 2, name: "中文" },
52
+ ]);
53
+ });
54
+ });
55
+ describe("dialect variations", () => {
56
+ it("should handle property", async () => {
57
+ const body = '{"key": [{"id":1,"name":"english"},{"id":2,"name":"中文"}]}';
58
+ const path = await writeTempFile(body);
59
+ const table = await loadJsonTable({
60
+ path,
61
+ dialect: { property: "key" },
62
+ });
63
+ expect((await table.collect()).toRecords()).toEqual([
64
+ { id: 1, name: "english" },
65
+ { id: 2, name: "中文" },
66
+ ]);
67
+ });
68
+ it("should handle item keys", async () => {
69
+ const body = '[{"id":1,"name":"english"},{"id":2,"name":"中文"}]';
70
+ const path = await writeTempFile(body);
71
+ const table = await loadJsonTable({
72
+ path,
73
+ dialect: { itemKeys: ["name"] },
74
+ });
75
+ expect((await table.collect()).toRecords()).toEqual([
76
+ { name: "english" },
77
+ { name: "中文" },
78
+ ]);
79
+ });
80
+ it("should handle item type (array)", async () => {
81
+ const body = '[["id","name"],[1,"english"],[2,"中文"]]';
82
+ const path = await writeTempFile(body);
83
+ const table = await loadJsonTable({
84
+ path,
85
+ dialect: { itemType: "array" },
86
+ });
87
+ expect((await table.collect()).toRecords()).toEqual([
88
+ { id: 1, name: "english" },
89
+ { id: 2, name: "中文" },
90
+ ]);
91
+ });
92
+ it("should load item type (object)", async () => {
93
+ const body = '[{"id":1,"name":"english"},{"id":2,"name":"中文"}]';
94
+ const path = await writeTempFile(body);
95
+ const table = await loadJsonTable({
96
+ path,
97
+ dialect: { itemType: "object" },
98
+ });
99
+ expect((await table.collect()).toRecords()).toEqual([
100
+ { id: 1, name: "english" },
101
+ { id: 2, name: "中文" },
102
+ ]);
103
+ });
104
+ });
105
+ });
106
+ describe("loadJsonTable (format=jsonl)", () => {
107
+ describe("file variations", () => {
108
+ it("should load local file", async () => {
109
+ const body = '{"id":1,"name":"english"}\n{"id":2,"name":"中文"}';
110
+ const path = await writeTempFile(body);
111
+ const table = await loadJsonTable({ path, format: "jsonl" });
112
+ expect((await table.collect()).toRecords()).toEqual([
113
+ { id: 1, name: "english" },
114
+ { id: 2, name: "中文" },
115
+ ]);
116
+ });
117
+ it("should load local file (multipart)", async () => {
118
+ const body = '{"id":1,"name":"english"}\n{"id":2,"name":"中文"}';
119
+ const path1 = await writeTempFile(body);
120
+ const path2 = await writeTempFile(body);
121
+ const table = await loadJsonTable({
122
+ path: [path1, path2],
123
+ format: "jsonl",
124
+ });
125
+ expect((await table.collect()).toRecords()).toEqual([
126
+ { id: 1, name: "english" },
127
+ { id: 2, name: "中文" },
128
+ { id: 1, name: "english" },
129
+ { id: 2, name: "中文" },
130
+ ]);
131
+ });
132
+ it("should load remote file", async () => {
133
+ const table = await loadJsonTable({
134
+ path: "https://raw.githubusercontent.com/datisthq/dpkit/refs/heads/main/json/table/fixtures/table.jsonl",
135
+ format: "jsonl",
136
+ });
137
+ expect((await table.collect()).toRecords()).toEqual([
138
+ { id: 1, name: "english" },
139
+ { id: 2, name: "中文" },
140
+ ]);
141
+ });
142
+ it("should load remote file (multipart)", async () => {
143
+ const table = await loadJsonTable({
144
+ path: [
145
+ "https://raw.githubusercontent.com/datisthq/dpkit/refs/heads/main/json/table/fixtures/table.jsonl",
146
+ "https://raw.githubusercontent.com/datisthq/dpkit/refs/heads/main/json/table/fixtures/table.jsonl",
147
+ ],
148
+ format: "jsonl",
149
+ });
150
+ expect((await table.collect()).toRecords()).toEqual([
151
+ { id: 1, name: "english" },
152
+ { id: 2, name: "中文" },
153
+ { id: 1, name: "english" },
154
+ { id: 2, name: "中文" },
155
+ ]);
156
+ });
157
+ });
158
+ describe("dialect variations", () => {
159
+ it("should handle item keys", async () => {
160
+ const body = '{"id":1,"name":"english"}\n{"id":2,"name":"中文"}';
161
+ const path = await writeTempFile(body);
162
+ const table = await loadJsonTable({
163
+ path,
164
+ format: "jsonl",
165
+ dialect: { itemKeys: ["name"] },
166
+ });
167
+ expect((await table.collect()).toRecords()).toEqual([
168
+ { name: "english" },
169
+ { name: "中文" },
170
+ ]);
171
+ });
172
+ it("should handle item type (array)", async () => {
173
+ const body = '["id","name"]\n[1,"english"]\n[2,"中文"]';
174
+ const path = await writeTempFile(body);
175
+ const table = await loadJsonTable({
176
+ path,
177
+ format: "jsonl",
178
+ dialect: { itemType: "array" },
179
+ });
180
+ expect((await table.collect()).toRecords()).toEqual([
181
+ { id: 1, name: "english" },
182
+ { id: 2, name: "中文" },
183
+ ]);
184
+ });
185
+ it("should load item type (object)", async () => {
186
+ const body = '{"id":1,"name":"english"}\n{"id":2,"name":"中文"}';
187
+ const path = await writeTempFile(body);
188
+ const table = await loadJsonTable({
189
+ path,
190
+ format: "jsonl",
191
+ dialect: { itemType: "object" },
192
+ });
193
+ expect((await table.collect()).toRecords()).toEqual([
194
+ { id: 1, name: "english" },
195
+ { id: 2, name: "中文" },
196
+ ]);
197
+ });
198
+ });
199
+ });
200
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGx1Z2lucy9qc29uL3RhYmxlL2xvYWQuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFDeEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUV6QyxZQUFZLEVBQUUsQ0FBQTtBQUVkLFFBQVEsQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFO0lBQzdCLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUU7UUFDL0IsRUFBRSxDQUFDLHdCQUF3QixFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3RDLE1BQU0sSUFBSSxHQUFHLGtEQUFrRCxDQUFBO1lBQy9ELE1BQU0sSUFBSSxHQUFHLE1BQU0sYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBRXRDLE1BQU0sS0FBSyxHQUFHLE1BQU0sYUFBYSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtZQUUzQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDO2dCQUNsRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtnQkFDMUIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7YUFDdEIsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUE7UUFFRixFQUFFLENBQUMsb0NBQW9DLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDbEQsTUFBTSxJQUFJLEdBQUcsa0RBQWtELENBQUE7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TUFBTSxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUE7WUFFdEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxhQUFhLENBQUM7Z0JBQ2hDLElBQUk7Z0JBQ0osTUFBTSxFQUFFLE9BQU87Z0JBQ2YsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTthQUNoQyxDQUFDLENBQUE7WUFFRixNQUFNLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDO2dCQUNsRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtnQkFDMUIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7YUFDdEIsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgd3JpdGVUZW1wRmlsZSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL2RhdGFzZXRcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IHVzZVJlY29yZGluZyB9IGZyb20gXCJ2aXRlc3QtcG9sbHlcIlxuaW1wb3J0IHsgbG9hZEpzb25UYWJsZSB9IGZyb20gXCIuL2xvYWQudHNcIlxuXG51c2VSZWNvcmRpbmcoKVxuXG5kZXNjcmliZShcImxvYWRKc29uVGFibGVcIiwgKCkgPT4ge1xuICBkZXNjcmliZShcImZpbGUgdmFyaWF0aW9uc1wiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgbG9hZCBsb2NhbCBmaWxlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJvZHkgPSAnW3tcImlkXCI6MSxcIm5hbWVcIjpcImVuZ2xpc2hcIn0se1wiaWRcIjoyLFwibmFtZVwiOlwi5Lit5paHXCJ9XSdcbiAgICAgIGNvbnN0IHBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKGJvZHkpXG5cbiAgICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgbG9hZEpzb25UYWJsZSh7IHBhdGggfSlcblxuICAgICAgZXhwZWN0KChhd2FpdCB0YWJsZS5jb2xsZWN0KCkpLnRvUmVjb3JkcygpKS50b0VxdWFsKFtcbiAgICAgICAgeyBpZDogMSwgbmFtZTogXCJlbmdsaXNoXCIgfSxcbiAgICAgICAgeyBpZDogMiwgbmFtZTogXCLkuK3mlodcIiB9LFxuICAgICAgXSlcbiAgICB9KVxuXG4gICAgaXQoXCJzaG91bGQgbG9hZCBsb2NhbCBmaWxlIChtdWx0aXBhcnQpXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJvZHkgPSAnW3tcImlkXCI6MSxcIm5hbWVcIjpcImVuZ2xpc2hcIn0se1wiaWRcIjoyLFwibmFtZVwiOlwi5Lit5paHXCJ9XSdcbiAgICAgIGNvbnN0IHBhdGgxID0gYXdhaXQgd3JpdGVUZW1wRmlsZShib2R5KVxuICAgICAgY29uc3QgcGF0aDIgPSBhd2FpdCB3cml0ZVRlbXBGaWxlKGJvZHkpXG5cbiAgICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgbG9hZEpzb25UYWJsZSh7XG4gICAgICAgIHBhdGg6IFtwYXRoMSwgcGF0aDJdLFxuICAgICAgfSlcblxuICAgICAgZXhwZWN0KChhd2FpdCB0YWJsZS5jb2xsZWN0KCkpLnRvUmVjb3JkcygpKS50b0VxdWFsKFtcbiAgICAgICAgeyBpZDogMSwgbmFtZTogXCJlbmdsaXNoXCIgfSxcbiAgICAgICAgeyBpZDogMiwgbmFtZTogXCLkuK3mlodcIiB9LFxuICAgICAgICB7IGlkOiAxLCBuYW1lOiBcImVuZ2xpc2hcIiB9LFxuICAgICAgICB7IGlkOiAyLCBuYW1lOiBcIuS4reaWh1wiIH0sXG4gICAgICBdKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBsb2FkIHJlbW90ZSBmaWxlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgbG9hZEpzb25UYWJsZSh7XG4gICAgICAgIHBhdGg6IFwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2RhdGlzdGhxL2Rwa2l0L3JlZnMvaGVhZHMvbWFpbi9qc29uL3RhYmxlL2ZpeHR1cmVzL3RhYmxlLmpzb25cIixcbiAgICAgIH0pXG5cbiAgICAgIGV4cGVjdCgoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKSkudG9FcXVhbChbXG4gICAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiZW5nbGlzaFwiIH0sXG4gICAgICAgIHsgaWQ6IDIsIG5hbWU6IFwi5Lit5paHXCIgfSxcbiAgICAgIF0pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIGxvYWQgcmVtb3RlIGZpbGUgKG11bHRpcGFydClcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkSnNvblRhYmxlKHtcbiAgICAgICAgcGF0aDogW1xuICAgICAgICAgIFwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2RhdGlzdGhxL2Rwa2l0L3JlZnMvaGVhZHMvbWFpbi9qc29uL3RhYmxlL2ZpeHR1cmVzL3RhYmxlLmpzb25cIixcbiAgICAgICAgICBcImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kYXRpc3RocS9kcGtpdC9yZWZzL2hlYWRzL21haW4vanNvbi90YWJsZS9maXh0dXJlcy90YWJsZS5qc29uXCIsXG4gICAgICAgIF0sXG4gICAgICB9KVxuXG4gICAgICBleHBlY3QoKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAgICB7IGlkOiAxLCBuYW1lOiBcImVuZ2xpc2hcIiB9LFxuICAgICAgICB7IGlkOiAyLCBuYW1lOiBcIuS4reaWh1wiIH0sXG4gICAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiZW5nbGlzaFwiIH0sXG4gICAgICAgIHsgaWQ6IDIsIG5hbWU6IFwi5Lit5paHXCIgfSxcbiAgICAgIF0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZShcImRpYWxlY3QgdmFyaWF0aW9uc1wiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgaGFuZGxlIHByb3BlcnR5XCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJvZHkgPSAne1wia2V5XCI6IFt7XCJpZFwiOjEsXCJuYW1lXCI6XCJlbmdsaXNoXCJ9LHtcImlkXCI6MixcIm5hbWVcIjpcIuS4reaWh1wifV19J1xuICAgICAgY29uc3QgcGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoYm9keSlcblxuICAgICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkSnNvblRhYmxlKHtcbiAgICAgICAgcGF0aCxcbiAgICAgICAgZGlhbGVjdDogeyBwcm9wZXJ0eTogXCJrZXlcIiB9LFxuICAgICAgfSlcblxuICAgICAgZXhwZWN0KChhd2FpdCB0YWJsZS5jb2xsZWN0KCkpLnRvUmVjb3JkcygpKS50b0VxdWFsKFtcbiAgICAgICAgeyBpZDogMSwgbmFtZTogXCJlbmdsaXNoXCIgfSxcbiAgICAgICAgeyBpZDogMiwgbmFtZTogXCLkuK3mlodcIiB9LFxuICAgICAgXSlcbiAgICB9KVxuXG4gICAgaXQoXCJzaG91bGQgaGFuZGxlIGl0ZW0ga2V5c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBib2R5ID0gJ1t7XCJpZFwiOjEsXCJuYW1lXCI6XCJlbmdsaXNoXCJ9LHtcImlkXCI6MixcIm5hbWVcIjpcIuS4reaWh1wifV0nXG4gICAgICBjb25zdCBwYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShib2R5KVxuXG4gICAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRKc29uVGFibGUoe1xuICAgICAgICBwYXRoLFxuICAgICAgICBkaWFsZWN0OiB7IGl0ZW1LZXlzOiBbXCJuYW1lXCJdIH0sXG4gICAgICB9KVxuXG4gICAgICBleHBlY3QoKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAgICB7IG5hbWU6IFwiZW5nbGlzaFwiIH0sXG4gICAgICAgIHsgbmFtZTogXCLkuK3mlodcIiB9LFxuICAgICAgXSlcbiAgICB9KVxuXG4gICAgaXQoXCJzaG91bGQgaGFuZGxlIGl0ZW0gdHlwZSAoYXJyYXkpXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJvZHkgPSAnW1tcImlkXCIsXCJuYW1lXCJdLFsxLFwiZW5nbGlzaFwiXSxbMixcIuS4reaWh1wiXV0nXG4gICAgICBjb25zdCBwYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShib2R5KVxuXG4gICAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRKc29uVGFibGUoe1xuICAgICAgICBwYXRoLFxuICAgICAgICBkaWFsZWN0OiB7IGl0ZW1UeXBlOiBcImFycmF5XCIgfSxcbiAgICAgIH0pXG5cbiAgICAgIGV4cGVjdCgoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKSkudG9FcXVhbChbXG4gICAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiZW5nbGlzaFwiIH0sXG4gICAgICAgIHsgaWQ6IDIsIG5hbWU6IFwi5Lit5paHXCIgfSxcbiAgICAgIF0pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIGxvYWQgaXRlbSB0eXBlIChvYmplY3QpXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJvZHkgPSAnW3tcImlkXCI6MSxcIm5hbWVcIjpcImVuZ2xpc2hcIn0se1wiaWRcIjoyLFwibmFtZVwiOlwi5Lit5paHXCJ9XSdcbiAgICAgIGNvbnN0IHBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKGJvZHkpXG5cbiAgICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgbG9hZEpzb25UYWJsZSh7XG4gICAgICAgIHBhdGgsXG4gICAgICAgIGRpYWxlY3Q6IHsgaXRlbVR5cGU6IFwib2JqZWN0XCIgfSxcbiAgICAgIH0pXG5cbiAgICAgIGV4cGVjdCgoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKSkudG9FcXVhbChbXG4gICAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiZW5nbGlzaFwiIH0sXG4gICAgICAgIHsgaWQ6IDIsIG5hbWU6IFwi5Lit5paHXCIgfSxcbiAgICAgIF0pXG4gICAgfSlcbiAgfSlcbn0pXG5cbmRlc2NyaWJlKFwibG9hZEpzb25UYWJsZSAoZm9ybWF0PWpzb25sKVwiLCAoKSA9PiB7XG4gIGRlc2NyaWJlKFwiZmlsZSB2YXJpYXRpb25zXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBsb2FkIGxvY2FsIGZpbGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYm9keSA9ICd7XCJpZFwiOjEsXCJuYW1lXCI6XCJlbmdsaXNoXCJ9XFxue1wiaWRcIjoyLFwibmFtZVwiOlwi5Lit5paHXCJ9J1xuICAgICAgY29uc3QgcGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoYm9keSlcblxuICAgICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkSnNvblRhYmxlKHsgcGF0aCwgZm9ybWF0OiBcImpzb25sXCIgfSlcbiAgICAgIGV4cGVjdCgoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKSkudG9FcXVhbChbXG4gICAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiZW5nbGlzaFwiIH0sXG4gICAgICAgIHsgaWQ6IDIsIG5hbWU6IFwi5Lit5paHXCIgfSxcbiAgICAgIF0pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIGxvYWQgbG9jYWwgZmlsZSAobXVsdGlwYXJ0KVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBib2R5ID0gJ3tcImlkXCI6MSxcIm5hbWVcIjpcImVuZ2xpc2hcIn1cXG57XCJpZFwiOjIsXCJuYW1lXCI6XCLkuK3mlodcIn0nXG4gICAgICBjb25zdCBwYXRoMSA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoYm9keSlcbiAgICAgIGNvbnN0IHBhdGgyID0gYXdhaXQgd3JpdGVUZW1wRmlsZShib2R5KVxuXG4gICAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGxvYWRKc29uVGFibGUoe1xuICAgICAgICBwYXRoOiBbcGF0aDEsIHBhdGgyXSxcbiAgICAgICAgZm9ybWF0OiBcImpzb25sXCIsXG4gICAgICB9KVxuXG4gICAgICBleHBlY3QoKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAgICB7IGlkOiAxLCBuYW1lOiBcImVuZ2xpc2hcIiB9LFxuICAgICAgICB7IGlkOiAyLCBuYW1lOiBcIuS4reaWh1wiIH0sXG4gICAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiZW5nbGlzaFwiIH0sXG4gICAgICAgIHsgaWQ6IDIsIG5hbWU6IFwi5Lit5paHXCIgfSxcbiAgICAgIF0pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIGxvYWQgcmVtb3RlIGZpbGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkSnNvblRhYmxlKHtcbiAgICAgICAgcGF0aDogXCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZGF0aXN0aHEvZHBraXQvcmVmcy9oZWFkcy9tYWluL2pzb24vdGFibGUvZml4dHVyZXMvdGFibGUuanNvbmxcIixcbiAgICAgICAgZm9ybWF0OiBcImpzb25sXCIsXG4gICAgICB9KVxuXG4gICAgICBleHBlY3QoKGF3YWl0IHRhYmxlLmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAgICB7IGlkOiAxLCBuYW1lOiBcImVuZ2xpc2hcIiB9LFxuICAgICAgICB7IGlkOiAyLCBuYW1lOiBcIuS4reaWh1wiIH0sXG4gICAgICBdKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBsb2FkIHJlbW90ZSBmaWxlIChtdWx0aXBhcnQpXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgbG9hZEpzb25UYWJsZSh7XG4gICAgICAgIHBhdGg6IFtcbiAgICAgICAgICBcImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kYXRpc3RocS9kcGtpdC9yZWZzL2hlYWRzL21haW4vanNvbi90YWJsZS9maXh0dXJlcy90YWJsZS5qc29ubFwiLFxuICAgICAgICAgIFwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2RhdGlzdGhxL2Rwa2l0L3JlZnMvaGVhZHMvbWFpbi9qc29uL3RhYmxlL2ZpeHR1cmVzL3RhYmxlLmpzb25sXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGZvcm1hdDogXCJqc29ubFwiLFxuICAgICAgfSlcblxuICAgICAgZXhwZWN0KChhd2FpdCB0YWJsZS5jb2xsZWN0KCkpLnRvUmVjb3JkcygpKS50b0VxdWFsKFtcbiAgICAgICAgeyBpZDogMSwgbmFtZTogXCJlbmdsaXNoXCIgfSxcbiAgICAgICAgeyBpZDogMiwgbmFtZTogXCLkuK3mlodcIiB9LFxuICAgICAgICB7IGlkOiAxLCBuYW1lOiBcImVuZ2xpc2hcIiB9LFxuICAgICAgICB7IGlkOiAyLCBuYW1lOiBcIuS4reaWh1wiIH0sXG4gICAgICBdKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoXCJkaWFsZWN0IHZhcmlhdGlvbnNcIiwgKCkgPT4ge1xuICAgIGl0KFwic2hvdWxkIGhhbmRsZSBpdGVtIGtleXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYm9keSA9ICd7XCJpZFwiOjEsXCJuYW1lXCI6XCJlbmdsaXNoXCJ9XFxue1wiaWRcIjoyLFwibmFtZVwiOlwi5Lit5paHXCJ9J1xuICAgICAgY29uc3QgcGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoYm9keSlcblxuICAgICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkSnNvblRhYmxlKHtcbiAgICAgICAgcGF0aCxcbiAgICAgICAgZm9ybWF0OiBcImpzb25sXCIsXG4gICAgICAgIGRpYWxlY3Q6IHsgaXRlbUtleXM6IFtcIm5hbWVcIl0gfSxcbiAgICAgIH0pXG5cbiAgICAgIGV4cGVjdCgoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKSkudG9FcXVhbChbXG4gICAgICAgIHsgbmFtZTogXCJlbmdsaXNoXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIuS4reaWh1wiIH0sXG4gICAgICBdKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgaXRlbSB0eXBlIChhcnJheSlcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYm9keSA9ICdbXCJpZFwiLFwibmFtZVwiXVxcblsxLFwiZW5nbGlzaFwiXVxcblsyLFwi5Lit5paHXCJdJ1xuICAgICAgY29uc3QgcGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoYm9keSlcblxuICAgICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkSnNvblRhYmxlKHtcbiAgICAgICAgcGF0aCxcbiAgICAgICAgZm9ybWF0OiBcImpzb25sXCIsXG4gICAgICAgIGRpYWxlY3Q6IHsgaXRlbVR5cGU6IFwiYXJyYXlcIiB9LFxuICAgICAgfSlcblxuICAgICAgZXhwZWN0KChhd2FpdCB0YWJsZS5jb2xsZWN0KCkpLnRvUmVjb3JkcygpKS50b0VxdWFsKFtcbiAgICAgICAgeyBpZDogMSwgbmFtZTogXCJlbmdsaXNoXCIgfSxcbiAgICAgICAgeyBpZDogMiwgbmFtZTogXCLkuK3mlodcIiB9LFxuICAgICAgXSlcbiAgICB9KVxuXG4gICAgaXQoXCJzaG91bGQgbG9hZCBpdGVtIHR5cGUgKG9iamVjdClcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYm9keSA9ICd7XCJpZFwiOjEsXCJuYW1lXCI6XCJlbmdsaXNoXCJ9XFxue1wiaWRcIjoyLFwibmFtZVwiOlwi5Lit5paHXCJ9J1xuICAgICAgY29uc3QgcGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoYm9keSlcblxuICAgICAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkSnNvblRhYmxlKHtcbiAgICAgICAgcGF0aCxcbiAgICAgICAgZm9ybWF0OiBcImpzb25sXCIsXG4gICAgICAgIGRpYWxlY3Q6IHsgaXRlbVR5cGU6IFwib2JqZWN0XCIgfSxcbiAgICAgIH0pXG5cbiAgICAgIGV4cGVjdCgoYXdhaXQgdGFibGUuY29sbGVjdCgpKS50b1JlY29yZHMoKSkudG9FcXVhbChbXG4gICAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiZW5nbGlzaFwiIH0sXG4gICAgICAgIHsgaWQ6IDIsIG5hbWU6IFwi5Lit5paHXCIgfSxcbiAgICAgIF0pXG4gICAgfSlcbiAgfSlcbn0pXG4iXX0=
@@ -0,0 +1,3 @@
1
+ export declare function parseJson(string: string, options: {
2
+ isLines: boolean;
3
+ }): any;
@@ -0,0 +1,6 @@
1
+ export function parseJson(string, options) {
2
+ return options.isLines
3
+ ? string.split("\n").map(line => JSON.parse(line))
4
+ : JSON.parse(string);
5
+ }
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wbHVnaW5zL2pzb24vdGFibGUvcGFyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxVQUFVLFNBQVMsQ0FBQyxNQUFjLEVBQUUsT0FBNkI7SUFDckUsT0FBTyxPQUFPLENBQUMsT0FBTztRQUNwQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xELENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gcGFyc2VKc29uKHN0cmluZzogc3RyaW5nLCBvcHRpb25zOiB7IGlzTGluZXM6IGJvb2xlYW4gfSkge1xuICByZXR1cm4gb3B0aW9ucy5pc0xpbmVzXG4gICAgPyBzdHJpbmcuc3BsaXQoXCJcXG5cIikubWFwKGxpbmUgPT4gSlNPTi5wYXJzZShsaW5lKSlcbiAgICA6IEpTT04ucGFyc2Uoc3RyaW5nKVxufVxuIl19
@@ -0,0 +1,5 @@
1
+ import type { SaveTableOptions } from "../../../plugin.ts";
2
+ import type { Table } from "../../../table/index.ts";
3
+ export declare function saveJsonTable(table: Table, options: SaveTableOptions & {
4
+ format?: "json" | "jsonl" | "ndjson";
5
+ }): Promise<string>;
@@ -0,0 +1,45 @@
1
+ import { saveFile } from "@frictionless-ts/dataset";
2
+ import { inferSchemaFromTable } from "../../../schema/index.js";
3
+ import { denormalizeTable } from "../../../table/index.js";
4
+ import { decodeJsonBuffer, encodeJsonBuffer } from "../buffer/index.js";
5
+ // TODO: rebase on sinkJSON when it is available
6
+ // https://github.com/pola-rs/nodejs-polars/issues/353
7
+ export async function saveJsonTable(table, options) {
8
+ const { path, dialect, overwrite, format } = options;
9
+ const isLines = format === "jsonl" || format === "ndjson";
10
+ const schema = options.schema ??
11
+ (await inferSchemaFromTable(table, {
12
+ ...options,
13
+ keepStrings: true,
14
+ }));
15
+ table = await denormalizeTable(table, schema, {
16
+ nativeTypes: ["boolean", "integer", "list", "number", "string", "year"],
17
+ });
18
+ // We use polars to serialize the data
19
+ // But encode it manually to support dialects/formatting
20
+ const frame = await table.collect();
21
+ let buffer = frame.writeJSON({ format: isLines ? "lines" : "json" });
22
+ let data = decodeJsonBuffer(buffer, { isLines });
23
+ if (dialect) {
24
+ data = processData(data, dialect);
25
+ }
26
+ buffer = encodeJsonBuffer(data, { isLines });
27
+ await saveFile(path, buffer, { overwrite });
28
+ return path;
29
+ }
30
+ function processData(records, dialect) {
31
+ let data = records;
32
+ if (dialect.itemKeys) {
33
+ const keys = dialect.itemKeys;
34
+ data = data.map((row) => Object.fromEntries(keys.map((key) => [key, row[key]])));
35
+ }
36
+ if (dialect.itemType === "array") {
37
+ const keys = dialect.itemKeys ?? Object.keys(data[0]);
38
+ data = [keys, ...data.map((row) => keys.map((key) => row[key]))];
39
+ }
40
+ if (dialect.property) {
41
+ data = { [dialect.property]: data };
42
+ }
43
+ return data;
44
+ }
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BsdWdpbnMvanNvbi90YWJsZS9zYXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUduRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUMvRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQUUxRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUV2RSxnREFBZ0Q7QUFDaEQsc0RBQXNEO0FBRXRELE1BQU0sQ0FBQyxLQUFLLFVBQVUsYUFBYSxDQUNqQyxLQUFZLEVBQ1osT0FBb0U7SUFFcEUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQTtJQUNwRCxNQUFNLE9BQU8sR0FBRyxNQUFNLEtBQUssT0FBTyxJQUFJLE1BQU0sS0FBSyxRQUFRLENBQUE7SUFFekQsTUFBTSxNQUFNLEdBQ1YsT0FBTyxDQUFDLE1BQU07UUFDZCxDQUFDLE1BQU0sb0JBQW9CLENBQUMsS0FBSyxFQUFFO1lBQ2pDLEdBQUcsT0FBTztZQUNWLFdBQVcsRUFBRSxJQUFJO1NBQ2xCLENBQUMsQ0FBQyxDQUFBO0lBRUwsS0FBSyxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRTtRQUM1QyxXQUFXLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQztLQUN4RSxDQUFDLENBQUE7SUFFRixzQ0FBc0M7SUFDdEMsd0RBQXdEO0lBQ3hELE1BQU0sS0FBSyxHQUFHLE1BQU0sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBQ25DLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7SUFDcEUsSUFBSSxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQTtJQUVoRCxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ1osSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDbkMsQ0FBQztJQUVELE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFBO0lBQzVDLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFBO0lBRTNDLE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLE9BQThCLEVBQUUsT0FBZ0I7SUFDbkUsSUFBSSxJQUFJLEdBQVEsT0FBTyxDQUFBO0lBRXZCLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3JCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUE7UUFDN0IsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUMzQixNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDNUQsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssT0FBTyxFQUFFLENBQUM7UUFDakMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3JELElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUM1RSxDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDckIsSUFBSSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUE7SUFDckMsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNhdmVGaWxlIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvZGF0YXNldFwiXG5pbXBvcnQgdHlwZSB7IERpYWxlY3QgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgdHlwZSB7IFNhdmVUYWJsZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vLi4vcGx1Z2luLnRzXCJcbmltcG9ydCB7IGluZmVyU2NoZW1hRnJvbVRhYmxlIH0gZnJvbSBcIi4uLy4uLy4uL3NjaGVtYS9pbmRleC50c1wiXG5pbXBvcnQgeyBkZW5vcm1hbGl6ZVRhYmxlIH0gZnJvbSBcIi4uLy4uLy4uL3RhYmxlL2luZGV4LnRzXCJcbmltcG9ydCB0eXBlIHsgVGFibGUgfSBmcm9tIFwiLi4vLi4vLi4vdGFibGUvaW5kZXgudHNcIlxuaW1wb3J0IHsgZGVjb2RlSnNvbkJ1ZmZlciwgZW5jb2RlSnNvbkJ1ZmZlciB9IGZyb20gXCIuLi9idWZmZXIvaW5kZXgudHNcIlxuXG4vLyBUT0RPOiByZWJhc2Ugb24gc2lua0pTT04gd2hlbiBpdCBpcyBhdmFpbGFibGVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb2xhLXJzL25vZGVqcy1wb2xhcnMvaXNzdWVzLzM1M1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZUpzb25UYWJsZShcbiAgdGFibGU6IFRhYmxlLFxuICBvcHRpb25zOiBTYXZlVGFibGVPcHRpb25zICYgeyBmb3JtYXQ/OiBcImpzb25cIiB8IFwianNvbmxcIiB8IFwibmRqc29uXCIgfSxcbikge1xuICBjb25zdCB7IHBhdGgsIGRpYWxlY3QsIG92ZXJ3cml0ZSwgZm9ybWF0IH0gPSBvcHRpb25zXG4gIGNvbnN0IGlzTGluZXMgPSBmb3JtYXQgPT09IFwianNvbmxcIiB8fCBmb3JtYXQgPT09IFwibmRqc29uXCJcblxuICBjb25zdCBzY2hlbWEgPVxuICAgIG9wdGlvbnMuc2NoZW1hID8/XG4gICAgKGF3YWl0IGluZmVyU2NoZW1hRnJvbVRhYmxlKHRhYmxlLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAga2VlcFN0cmluZ3M6IHRydWUsXG4gICAgfSkpXG5cbiAgdGFibGUgPSBhd2FpdCBkZW5vcm1hbGl6ZVRhYmxlKHRhYmxlLCBzY2hlbWEsIHtcbiAgICBuYXRpdmVUeXBlczogW1wiYm9vbGVhblwiLCBcImludGVnZXJcIiwgXCJsaXN0XCIsIFwibnVtYmVyXCIsIFwic3RyaW5nXCIsIFwieWVhclwiXSxcbiAgfSlcblxuICAvLyBXZSB1c2UgcG9sYXJzIHRvIHNlcmlhbGl6ZSB0aGUgZGF0YVxuICAvLyBCdXQgZW5jb2RlIGl0IG1hbnVhbGx5IHRvIHN1cHBvcnQgZGlhbGVjdHMvZm9ybWF0dGluZ1xuICBjb25zdCBmcmFtZSA9IGF3YWl0IHRhYmxlLmNvbGxlY3QoKVxuICBsZXQgYnVmZmVyID0gZnJhbWUud3JpdGVKU09OKHsgZm9ybWF0OiBpc0xpbmVzID8gXCJsaW5lc1wiIDogXCJqc29uXCIgfSlcbiAgbGV0IGRhdGEgPSBkZWNvZGVKc29uQnVmZmVyKGJ1ZmZlciwgeyBpc0xpbmVzIH0pXG5cbiAgaWYgKGRpYWxlY3QpIHtcbiAgICBkYXRhID0gcHJvY2Vzc0RhdGEoZGF0YSwgZGlhbGVjdClcbiAgfVxuXG4gIGJ1ZmZlciA9IGVuY29kZUpzb25CdWZmZXIoZGF0YSwgeyBpc0xpbmVzIH0pXG4gIGF3YWl0IHNhdmVGaWxlKHBhdGgsIGJ1ZmZlciwgeyBvdmVyd3JpdGUgfSlcblxuICByZXR1cm4gcGF0aFxufVxuXG5mdW5jdGlvbiBwcm9jZXNzRGF0YShyZWNvcmRzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sIGRpYWxlY3Q6IERpYWxlY3QpIHtcbiAgbGV0IGRhdGE6IGFueSA9IHJlY29yZHNcblxuICBpZiAoZGlhbGVjdC5pdGVtS2V5cykge1xuICAgIGNvbnN0IGtleXMgPSBkaWFsZWN0Lml0ZW1LZXlzXG4gICAgZGF0YSA9IGRhdGEubWFwKChyb3c6IGFueSkgPT5cbiAgICAgIE9iamVjdC5mcm9tRW50cmllcyhrZXlzLm1hcCgoa2V5OiBhbnkpID0+IFtrZXksIHJvd1trZXldXSkpLFxuICAgIClcbiAgfVxuXG4gIGlmIChkaWFsZWN0Lml0ZW1UeXBlID09PSBcImFycmF5XCIpIHtcbiAgICBjb25zdCBrZXlzID0gZGlhbGVjdC5pdGVtS2V5cyA/PyBPYmplY3Qua2V5cyhkYXRhWzBdKVxuICAgIGRhdGEgPSBba2V5cywgLi4uZGF0YS5tYXAoKHJvdzogYW55KSA9PiBrZXlzLm1hcCgoa2V5OiBhbnkpID0+IHJvd1trZXldKSldXG4gIH1cblxuICBpZiAoZGlhbGVjdC5wcm9wZXJ0eSkge1xuICAgIGRhdGEgPSB7IFtkaWFsZWN0LnByb3BlcnR5XTogZGF0YSB9XG4gIH1cblxuICByZXR1cm4gZGF0YVxufVxuIl19
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,147 @@
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 { loadJsonTable } from "./load.js";
6
+ import { saveJsonTable } from "./save.js";
7
+ const row1 = { id: 1, name: "english" };
8
+ const row2 = { id: 2, name: "中文" };
9
+ const table = pl.readRecords([row1, row2]).lazy();
10
+ describe("saveJsonTable", () => {
11
+ it("should save table to file", async () => {
12
+ const path = getTempFilePath();
13
+ await saveJsonTable(table, { path });
14
+ const content = await readFile(path, "utf-8");
15
+ expect(content).toEqual(JSON.stringify([row1, row2], null, 2));
16
+ });
17
+ it("should handle property", async () => {
18
+ const path = getTempFilePath();
19
+ await saveJsonTable(table, {
20
+ path,
21
+ dialect: { property: "key" },
22
+ });
23
+ const content = await readFile(path, "utf-8");
24
+ expect(content).toEqual(JSON.stringify({ key: [row1, row2] }, null, 2));
25
+ });
26
+ it("should handle item keys", async () => {
27
+ const path = getTempFilePath();
28
+ await saveJsonTable(table, {
29
+ path,
30
+ dialect: { itemKeys: ["name"] },
31
+ });
32
+ const content = await readFile(path, "utf-8");
33
+ expect(content).toEqual(JSON.stringify([{ name: row1.name }, { name: row2.name }], null, 2));
34
+ });
35
+ it("should handle item type (array)", async () => {
36
+ const path = getTempFilePath();
37
+ await saveJsonTable(table, {
38
+ path,
39
+ dialect: { itemType: "array" },
40
+ });
41
+ const content = await readFile(path, "utf-8");
42
+ expect(content).toEqual(JSON.stringify([Object.keys(row1), Object.values(row1), Object.values(row2)], null, 2));
43
+ });
44
+ it("should save and load various data types", async () => {
45
+ const path = getTempFilePath();
46
+ const source = pl
47
+ .DataFrame([
48
+ pl.Series("array", ["[1, 2, 3]"], pl.String),
49
+ pl.Series("boolean", [true], pl.Bool),
50
+ pl.Series("date", [new Date(Date.UTC(2025, 0, 1))], pl.Date),
51
+ pl.Series("datetime", [new Date(Date.UTC(2025, 0, 1))], pl.Datetime),
52
+ pl.Series("duration", ["P23DT23H"], pl.String),
53
+ pl.Series("geojson", ['{"value": 1}'], pl.String),
54
+ pl.Series("geopoint", [[40.0, 50.0]], pl.List(pl.Float32)),
55
+ pl.Series("integer", [1], pl.Int32),
56
+ pl.Series("list", [[1.0, 2.0, 3.0]], pl.List(pl.Float32)),
57
+ pl.Series("number", [1.1], pl.Float64),
58
+ pl.Series("object", ['{"value": 1}']),
59
+ pl.Series("string", ["string"], pl.String),
60
+ pl.Series("time", [new Date(Date.UTC(2025, 0, 1))], pl.Time),
61
+ pl.Series("year", [2025], pl.Int32),
62
+ pl.Series("yearmonth", [[2025, 1]], pl.List(pl.Int16)),
63
+ ])
64
+ .lazy();
65
+ await saveJsonTable(source, {
66
+ path,
67
+ fieldTypes: {
68
+ array: "array",
69
+ geojson: "geojson",
70
+ geopoint: "geopoint",
71
+ list: "list",
72
+ object: "object",
73
+ // TODO: Remove time after:
74
+ // https://github.com/pola-rs/nodejs-polars/issues/364
75
+ time: "time",
76
+ year: "year",
77
+ yearmonth: "yearmonth",
78
+ },
79
+ });
80
+ const target = await loadJsonTable({ path }, { denormalized: true });
81
+ expect((await target.collect()).toRecords()).toEqual([
82
+ {
83
+ array: "[1, 2, 3]",
84
+ boolean: true,
85
+ date: "2025-01-01",
86
+ datetime: "2025-01-01T00:00:00",
87
+ duration: "P23DT23H",
88
+ geojson: '{"value": 1}',
89
+ geopoint: "40.0,50.0",
90
+ integer: 1,
91
+ list: [1.0, 2.0, 3.0],
92
+ number: 1.1,
93
+ object: '{"value": 1}',
94
+ string: "string",
95
+ time: "00:00:00",
96
+ year: 2025,
97
+ yearmonth: "2025-01",
98
+ },
99
+ ]);
100
+ });
101
+ });
102
+ describe("saveJsonTable (format=jsonl)", () => {
103
+ it("should save table to file", async () => {
104
+ const path = getTempFilePath();
105
+ await saveJsonTable(table, { path, format: "jsonl" });
106
+ const content = await readFile(path, "utf-8");
107
+ expect(content).toEqual([JSON.stringify(row1), JSON.stringify(row2)].join("\n"));
108
+ });
109
+ it("should handle item keys", async () => {
110
+ const path = getTempFilePath();
111
+ await saveJsonTable(table, {
112
+ path,
113
+ format: "jsonl",
114
+ dialect: { itemKeys: ["name"] },
115
+ });
116
+ const content = await readFile(path, "utf-8");
117
+ expect(content).toEqual([
118
+ JSON.stringify({ name: row1.name }),
119
+ JSON.stringify({ name: row2.name }),
120
+ ].join("\n"));
121
+ });
122
+ it("should handle item type (array)", async () => {
123
+ const path = getTempFilePath();
124
+ await saveJsonTable(table, {
125
+ path,
126
+ format: "jsonl",
127
+ dialect: { itemType: "array" },
128
+ });
129
+ const content = await readFile(path, "utf-8");
130
+ expect(content).toEqual([
131
+ JSON.stringify(Object.keys(row1)),
132
+ JSON.stringify(Object.values(row1)),
133
+ JSON.stringify(Object.values(row2)),
134
+ ].join("\n"));
135
+ });
136
+ it("should handle item type (object)", async () => {
137
+ const path = getTempFilePath();
138
+ await saveJsonTable(table, {
139
+ path,
140
+ format: "jsonl",
141
+ dialect: { itemType: "object" },
142
+ });
143
+ const content = await readFile(path, "utf-8");
144
+ expect(content).toEqual([JSON.stringify(row1), JSON.stringify(row2)].join("\n"));
145
+ });
146
+ });
147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGx1Z2lucy9qc29uL3RhYmxlL3NhdmUuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQzFELE9BQU8sS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ3pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFFekMsTUFBTSxJQUFJLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQTtBQUN2QyxNQUFNLElBQUksR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFBO0FBQ2xDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtBQUVqRCxRQUFRLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRTtJQUM3QixFQUFFLENBQUMsMkJBQTJCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDekMsTUFBTSxJQUFJLEdBQUcsZUFBZSxFQUFFLENBQUE7UUFDOUIsTUFBTSxhQUFhLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUVwQyxNQUFNLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDN0MsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FB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RUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQzVELEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BFLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUM5QyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDakQsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFELEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pELEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUN0QyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3JDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUMxQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUks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QUksRUFBRTtRQUNoRCxNQUFNLElBQUksR0FBRyxlQUFlLEVBQUUsQ0FBQTtRQUM5QixNQUFNLGFBQWEsQ0FBQyxLQUFLLEVBQUU7WUFDekIsSUFBSTtZQUNKLE1BQU0sRUFBRSxPQUFPO1lBQ2YsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtTQUNoQyxDQUFDLENBQUE7UUFFRixNQUFNLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDN0MsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FDckIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQ3hELENBQUE7SUFDSCxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5pbXBvcnQgeyBnZXRUZW1wRmlsZVBhdGggfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9kYXRhc2V0XCJcbmltcG9ydCAqIGFzIHBsIGZyb20gXCJub2RlanMtcG9sYXJzXCJcbmltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGVzdFwiXG5pbXBvcnQgeyBsb2FkSnNvblRhYmxlIH0gZnJvbSBcIi4vbG9hZC50c1wiXG5pbXBvcnQgeyBzYXZlSnNvblRhYmxlIH0gZnJvbSBcIi4vc2F2ZS50c1wiXG5cbmNvbnN0IHJvdzEgPSB7IGlkOiAxLCBuYW1lOiBcImVuZ2xpc2hcIiB9XG5jb25zdCByb3cyID0geyBpZDogMiwgbmFtZTogXCLkuK3mlodcIiB9XG5jb25zdCB0YWJsZSA9IHBsLnJlYWRSZWNvcmRzKFtyb3cxLCByb3cyXSkubGF6eSgpXG5cbmRlc2NyaWJlKFwic2F2ZUpzb25UYWJsZVwiLCAoKSA9PiB7XG4gIGl0KFwic2hvdWxkIHNhdmUgdGFibGUgdG8gZmlsZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGdldFRlbXBGaWxlUGF0aCgpXG4gICAgYXdhaXQgc2F2ZUpzb25UYWJsZSh0YWJsZSwgeyBwYXRoIH0pXG5cbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUocGF0aCwgXCJ1dGYtOFwiKVxuICAgIGV4cGVjdChjb250ZW50KS50b0VxdWFsKEpTT04uc3RyaW5naWZ5KFtyb3cxLCByb3cyXSwgbnVsbCwgMikpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIHByb3BlcnR5XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXRoID0gZ2V0VGVtcEZpbGVQYXRoKClcblxuICAgIGF3YWl0IHNhdmVKc29uVGFibGUodGFibGUsIHtcbiAgICAgIHBhdGgsXG4gICAgICBkaWFsZWN0OiB7IHByb3BlcnR5OiBcImtleVwiIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShwYXRoLCBcInV0Zi04XCIpXG4gICAgZXhwZWN0KGNvbnRlbnQpLnRvRXF1YWwoSlNPTi5zdHJpbmdpZnkoeyBrZXk6IFtyb3cxLCByb3cyXSB9LCBudWxsLCAyKSlcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgaXRlbSBrZXlzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXRoID0gZ2V0VGVtcEZpbGVQYXRoKClcblxuICAgIGF3YWl0IHNhdmVKc29uVGFibGUodGFibGUsIHtcbiAgICAgIHBhdGgsXG4gICAgICBkaWFsZWN0OiB7IGl0ZW1LZXlzOiBbXCJuYW1lXCJdIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShwYXRoLCBcInV0Zi04XCIpXG4gICAgZXhwZWN0KGNvbnRlbnQpLnRvRXF1YWwoXG4gICAgICBKU09OLnN0cmluZ2lmeShbeyBuYW1lOiByb3cxLm5hbWUgfSwgeyBuYW1lOiByb3cyLm5hbWUgfV0sIG51bGwsIDIpLFxuICAgIClcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgaXRlbSB0eXBlIChhcnJheSlcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBnZXRUZW1wRmlsZVBhdGgoKVxuXG4gICAgYXdhaXQgc2F2ZUpzb25UYWJsZSh0YWJsZSwge1xuICAgICAgcGF0aCxcbiAgICAgIGRpYWxlY3Q6IHsgaXRlbVR5cGU6IFwiYXJyYXlcIiB9LFxuICAgIH0pXG5cbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUocGF0aCwgXCJ1dGYtOFwiKVxuICAgIGV4cGVjdChjb250ZW50KS50b0VxdWFsKFxuICAgICAgSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIFtPYmplY3Qua2V5cyhyb3cxKSwgT2JqZWN0LnZhbHVlcyhyb3cxKSwgT2JqZWN0LnZhbHVlcyhyb3cyKV0sXG4gICAgICAgIG51bGwsXG4gICAgICAgIDIsXG4gICAgICApLFxuICAgIClcbiAgfSlcblxuICBpdChcInNob3VsZCBzYXZlIGFuZCBsb2FkIHZhcmlvdXMgZGF0YSB0eXBlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGdldFRlbXBGaWxlUGF0aCgpXG5cbiAgICBjb25zdCBzb3VyY2UgPSBwbFxuICAgICAgLkRhdGFGcmFtZShbXG4gICAgICAgIHBsLlNlcmllcyhcImFycmF5XCIsIFtcIlsxLCAyLCAzXVwiXSwgcGwuU3RyaW5nKSxcbiAgICAgICAgcGwuU2VyaWVzKFwiYm9vbGVhblwiLCBbdHJ1ZV0sIHBsLkJvb2wpLFxuICAgICAgICBwbC5TZXJpZXMoXCJkYXRlXCIsIFtuZXcgRGF0ZShEYXRlLlVUQygyMDI1LCAwLCAxKSldLCBwbC5EYXRlKSxcbiAgICAgICAgcGwuU2VyaWVzKFwiZGF0ZXRpbWVcIiwgW25ldyBEYXRlKERhdGUuVVRDKDIwMjUsIDAsIDEpKV0sIHBsLkRhdGV0aW1lKSxcbiAgICAgICAgcGwuU2VyaWVzKFwiZHVyYXRpb25cIiwgW1wiUDIzRFQyM0hcIl0sIHBsLlN0cmluZyksXG4gICAgICAgIHBsLlNlcmllcyhcImdlb2pzb25cIiwgWyd7XCJ2YWx1ZVwiOiAxfSddLCBwbC5TdHJpbmcpLFxuICAgICAgICBwbC5TZXJpZXMoXCJnZW9wb2ludFwiLCBbWzQwLjAsIDUwLjBdXSwgcGwuTGlzdChwbC5GbG9hdDMyKSksXG4gICAgICAgIHBsLlNlcmllcyhcImludGVnZXJcIiwgWzFdLCBwbC5JbnQzMiksXG4gICAgICAgIHBsLlNlcmllcyhcImxpc3RcIiwgW1sxLjAsIDIuMCwgMy4wXV0sIHBsLkxpc3QocGwuRmxvYXQzMikpLFxuICAgICAgICBwbC5TZXJpZXMoXCJudW1iZXJcIiwgWzEuMV0sIHBsLkZsb2F0NjQpLFxuICAgICAgICBwbC5TZXJpZXMoXCJvYmplY3RcIiwgWyd7XCJ2YWx1ZVwiOiAxfSddKSxcbiAgICAgICAgcGwuU2VyaWVzKFwic3RyaW5nXCIsIFtcInN0cmluZ1wiXSwgcGwuU3RyaW5nKSxcbiAgICAgICAgcGwuU2VyaWVzKFwidGltZVwiLCBbbmV3IERhdGUoRGF0ZS5VVEMoMjAyNSwgMCwgMSkpXSwgcGwuVGltZSksXG4gICAgICAgIHBsLlNlcmllcyhcInllYXJcIiwgWzIwMjVdLCBwbC5JbnQzMiksXG4gICAgICAgIHBsLlNlcmllcyhcInllYXJtb250aFwiLCBbWzIwMjUsIDFdXSwgcGwuTGlzdChwbC5JbnQxNikpLFxuICAgICAgXSlcbiAgICAgIC5sYXp5KClcblxuICAgIGF3YWl0IHNhdmVKc29uVGFibGUoc291cmNlLCB7XG4gICAgICBwYXRoLFxuICAgICAgZmllbGRUeXBlczoge1xuICAgICAgICBhcnJheTogXCJhcnJheVwiLFxuICAgICAgICBnZW9qc29uOiBcImdlb2pzb25cIixcbiAgICAgICAgZ2VvcG9pbnQ6IFwiZ2VvcG9pbnRcIixcbiAgICAgICAgbGlzdDogXCJsaXN0XCIsXG4gICAgICAgIG9iamVjdDogXCJvYmplY3RcIixcbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRpbWUgYWZ0ZXI6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb2xhLXJzL25vZGVqcy1wb2xhcnMvaXNzdWVzLzM2NFxuICAgICAgICB0aW1lOiBcInRpbWVcIixcbiAgICAgICAgeWVhcjogXCJ5ZWFyXCIsXG4gICAgICAgIHllYXJtb250aDogXCJ5ZWFybW9udGhcIixcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IHRhcmdldCA9IGF3YWl0IGxvYWRKc29uVGFibGUoeyBwYXRoIH0sIHsgZGVub3JtYWxpemVkOiB0cnVlIH0pXG4gICAgZXhwZWN0KChhd2FpdCB0YXJnZXQuY29sbGVjdCgpKS50b1JlY29yZHMoKSkudG9FcXVhbChbXG4gICAgICB7XG4gICAgICAgIGFycmF5OiBcIlsxLCAyLCAzXVwiLFxuICAgICAgICBib29sZWFuOiB0cnVlLFxuICAgICAgICBkYXRlOiBcIjIwMjUtMDEtMDFcIixcbiAgICAgICAgZGF0ZXRpbWU6IFwiMjAyNS0wMS0wMVQwMDowMDowMFwiLFxuICAgICAgICBkdXJhdGlvbjogXCJQMjNEVDIzSFwiLFxuICAgICAgICBnZW9qc29uOiAne1widmFsdWVcIjogMX0nLFxuICAgICAgICBnZW9wb2ludDogXCI0MC4wLDUwLjBcIixcbiAgICAgICAgaW50ZWdlcjogMSxcbiAgICAgICAgbGlzdDogWzEuMCwgMi4wLCAzLjBdLFxuICAgICAgICBudW1iZXI6IDEuMSxcbiAgICAgICAgb2JqZWN0OiAne1widmFsdWVcIjogMX0nLFxuICAgICAgICBzdHJpbmc6IFwic3RyaW5nXCIsXG4gICAgICAgIHRpbWU6IFwiMDA6MDA6MDBcIixcbiAgICAgICAgeWVhcjogMjAyNSxcbiAgICAgICAgeWVhcm1vbnRoOiBcIjIwMjUtMDFcIixcbiAgICAgIH0sXG4gICAgXSlcbiAgfSlcbn0pXG5cbmRlc2NyaWJlKFwic2F2ZUpzb25UYWJsZSAoZm9ybWF0PWpzb25sKVwiLCAoKSA9PiB7XG4gIGl0KFwic2hvdWxkIHNhdmUgdGFibGUgdG8gZmlsZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGdldFRlbXBGaWxlUGF0aCgpXG5cbiAgICBhd2FpdCBzYXZlSnNvblRhYmxlKHRhYmxlLCB7IHBhdGgsIGZvcm1hdDogXCJqc29ubFwiIH0pXG5cbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUocGF0aCwgXCJ1dGYtOFwiKVxuICAgIGV4cGVjdChjb250ZW50KS50b0VxdWFsKFxuICAgICAgW0pTT04uc3RyaW5naWZ5KHJvdzEpLCBKU09OLnN0cmluZ2lmeShyb3cyKV0uam9pbihcIlxcblwiKSxcbiAgICApXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIGl0ZW0ga2V5c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGdldFRlbXBGaWxlUGF0aCgpXG4gICAgYXdhaXQgc2F2ZUpzb25UYWJsZSh0YWJsZSwge1xuICAgICAgcGF0aCxcbiAgICAgIGZvcm1hdDogXCJqc29ubFwiLFxuICAgICAgZGlhbGVjdDogeyBpdGVtS2V5czogW1wibmFtZVwiXSB9LFxuICAgIH0pXG5cbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUocGF0aCwgXCJ1dGYtOFwiKVxuICAgIGV4cGVjdChjb250ZW50KS50b0VxdWFsKFxuICAgICAgW1xuICAgICAgICBKU09OLnN0cmluZ2lmeSh7IG5hbWU6IHJvdzEubmFtZSB9KSxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoeyBuYW1lOiByb3cyLm5hbWUgfSksXG4gICAgICBdLmpvaW4oXCJcXG5cIiksXG4gICAgKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBpdGVtIHR5cGUgKGFycmF5KVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGdldFRlbXBGaWxlUGF0aCgpXG4gICAgYXdhaXQgc2F2ZUpzb25UYWJsZSh0YWJsZSwge1xuICAgICAgcGF0aCxcbiAgICAgIGZvcm1hdDogXCJqc29ubFwiLFxuICAgICAgZGlhbGVjdDogeyBpdGVtVHlwZTogXCJhcnJheVwiIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShwYXRoLCBcInV0Zi04XCIpXG4gICAgZXhwZWN0KGNvbnRlbnQpLnRvRXF1YWwoXG4gICAgICBbXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKHJvdzEpKSxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoT2JqZWN0LnZhbHVlcyhyb3cxKSksXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KE9iamVjdC52YWx1ZXMocm93MikpLFxuICAgICAgXS5qb2luKFwiXFxuXCIpLFxuICAgIClcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgaXRlbSB0eXBlIChvYmplY3QpXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXRoID0gZ2V0VGVtcEZpbGVQYXRoKClcbiAgICBhd2FpdCBzYXZlSnNvblRhYmxlKHRhYmxlLCB7XG4gICAgICBwYXRoLFxuICAgICAgZm9ybWF0OiBcImpzb25sXCIsXG4gICAgICBkaWFsZWN0OiB7IGl0ZW1UeXBlOiBcIm9iamVjdFwiIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShwYXRoLCBcInV0Zi04XCIpXG4gICAgZXhwZWN0KGNvbnRlbnQpLnRvRXF1YWwoXG4gICAgICBbSlNPTi5zdHJpbmdpZnkocm93MSksIEpTT04uc3RyaW5naWZ5KHJvdzIpXS5qb2luKFwiXFxuXCIpLFxuICAgIClcbiAgfSlcbn0pXG4iXX0=
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbHVnaW5zL29kcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGtCQUFrQixDQUFBO0FBQ2hDLGNBQWMsYUFBYSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vdGFibGUvaW5kZXgudHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vcGx1Z2luLnRzXCJcbiJdfQ==
@@ -0,0 +1,7 @@
1
+ import type { Resource } from "@frictionless-ts/metadata";
2
+ import type { LoadTableOptions, SaveTableOptions, TablePlugin } from "../../plugin.ts";
3
+ import type { Table } from "../../table/index.ts";
4
+ export declare class OdsPlugin implements TablePlugin {
5
+ loadTable(resource: Partial<Resource>, options?: LoadTableOptions): Promise<import("nodejs-polars").LazyDataFrame<any> | undefined>;
6
+ saveTable(table: Table, options: SaveTableOptions): Promise<string | undefined>;
7
+ }
@@ -0,0 +1,23 @@
1
+ import { inferFormat } from "@frictionless-ts/metadata";
2
+ import { loadOdsTable } from "./table/index.js";
3
+ import { saveOdsTable } from "./table/index.js";
4
+ export class OdsPlugin {
5
+ async loadTable(resource, options) {
6
+ const isOds = getIsOds(resource);
7
+ if (!isOds)
8
+ return undefined;
9
+ return await loadOdsTable(resource, options);
10
+ }
11
+ async saveTable(table, options) {
12
+ const { path, format } = options;
13
+ const isOds = getIsOds({ path, format });
14
+ if (!isOds)
15
+ return undefined;
16
+ return await saveOdsTable(table, options);
17
+ }
18
+ }
19
+ function getIsOds(resource) {
20
+ const format = inferFormat(resource);
21
+ return ["ods"].includes(format ?? "");
22
+ }
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2lucy9vZHMvcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQU92RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBRS9DLE1BQU0sT0FBTyxTQUFTO0lBQ3BCLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBMkIsRUFBRSxPQUEwQjtRQUNyRSxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDaEMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLFNBQVMsQ0FBQTtRQUU1QixPQUFPLE1BQU0sWUFBWSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUM5QyxDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFZLEVBQUUsT0FBeUI7UUFDckQsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUE7UUFFaEMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDeEMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLFNBQVMsQ0FBQTtRQUU1QixPQUFPLE1BQU0sWUFBWSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUMzQyxDQUFDO0NBQ0Y7QUFFRCxTQUFTLFFBQVEsQ0FBQyxRQUEyQjtJQUMzQyxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDcEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUE7QUFDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUmVzb3VyY2UgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgeyBpbmZlckZvcm1hdCB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB0eXBlIHtcbiAgTG9hZFRhYmxlT3B0aW9ucyxcbiAgU2F2ZVRhYmxlT3B0aW9ucyxcbiAgVGFibGVQbHVnaW4sXG59IGZyb20gXCIuLi8uLi9wbHVnaW4udHNcIlxuaW1wb3J0IHR5cGUgeyBUYWJsZSB9IGZyb20gXCIuLi8uLi90YWJsZS9pbmRleC50c1wiXG5pbXBvcnQgeyBsb2FkT2RzVGFibGUgfSBmcm9tIFwiLi90YWJsZS9pbmRleC50c1wiXG5pbXBvcnQgeyBzYXZlT2RzVGFibGUgfSBmcm9tIFwiLi90YWJsZS9pbmRleC50c1wiXG5cbmV4cG9ydCBjbGFzcyBPZHNQbHVnaW4gaW1wbGVtZW50cyBUYWJsZVBsdWdpbiB7XG4gIGFzeW5jIGxvYWRUYWJsZShyZXNvdXJjZTogUGFydGlhbDxSZXNvdXJjZT4sIG9wdGlvbnM/OiBMb2FkVGFibGVPcHRpb25zKSB7XG4gICAgY29uc3QgaXNPZHMgPSBnZXRJc09kcyhyZXNvdXJjZSlcbiAgICBpZiAoIWlzT2RzKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICByZXR1cm4gYXdhaXQgbG9hZE9kc1RhYmxlKHJlc291cmNlLCBvcHRpb25zKVxuICB9XG5cbiAgYXN5bmMgc2F2ZVRhYmxlKHRhYmxlOiBUYWJsZSwgb3B0aW9uczogU2F2ZVRhYmxlT3B0aW9ucykge1xuICAgIGNvbnN0IHsgcGF0aCwgZm9ybWF0IH0gPSBvcHRpb25zXG5cbiAgICBjb25zdCBpc09kcyA9IGdldElzT2RzKHsgcGF0aCwgZm9ybWF0IH0pXG4gICAgaWYgKCFpc09kcykgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgcmV0dXJuIGF3YWl0IHNhdmVPZHNUYWJsZSh0YWJsZSwgb3B0aW9ucylcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRJc09kcyhyZXNvdXJjZTogUGFydGlhbDxSZXNvdXJjZT4pIHtcbiAgY29uc3QgZm9ybWF0ID0gaW5mZXJGb3JtYXQocmVzb3VyY2UpXG4gIHJldHVybiBbXCJvZHNcIl0uaW5jbHVkZXMoZm9ybWF0ID8/IFwiXCIpXG59XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};