@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,173 @@
1
+ import * as pl from "nodejs-polars";
2
+ import { describe, expect, it } from "vitest";
3
+ import { denormalizeTable, normalizeTable } from "../../table/index.js";
4
+ describe("parseGeopointField", () => {
5
+ describe("default format", () => {
6
+ it.each([
7
+ // Valid geopoints in default format (lon,lat)
8
+ ["90.50,45.50", [90.5, 45.5]],
9
+ ["0,0", [0, 0]],
10
+ //["-122.40, 37.78", [-122.4, 37.78]],
11
+ //["-180.0,-90.0", [-180.0, -90.0]],
12
+ //["180.0, 90.0", [180.0, 90.0]],
13
+ // With whitespace
14
+ //[" 90.50, 45.50 ", [90.5, 45.5]],
15
+ // Invalid formats
16
+ //["not a geopoint", null],
17
+ //["", null],
18
+ //["90.50", null],
19
+ //["90.50,lat", null],
20
+ //["lon,45.50", null],
21
+ //["90.50,45.50,0", null],
22
+ ])("%s -> %s", async (cell, value) => {
23
+ const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
24
+ const schema = {
25
+ fields: [{ name: "name", type: "geopoint" }],
26
+ };
27
+ const result = await normalizeTable(table, schema);
28
+ const frame = await result.collect();
29
+ expect(frame.toRecords()[0]?.name).toEqual(value);
30
+ });
31
+ });
32
+ describe("array format", () => {
33
+ it.each([
34
+ // Valid geopoints in array format
35
+ ["[90.50, 45.50]", [90.5, 45.5]],
36
+ ["[0, 0]", [0, 0]],
37
+ ["[-122.40, 37.78]", [-122.4, 37.78]],
38
+ ["[-180.0, -90.0]", [-180.0, -90.0]],
39
+ ["[180.0, 90.0]", [180.0, 90.0]],
40
+ // With whitespace
41
+ [" [90.50, 45.50] ", [90.5, 45.5]],
42
+ // Invalid formats
43
+ // TODO: fix this
44
+ //["not a geopoint", null],
45
+ //["", null],
46
+ //["[90.50]", null],
47
+ //["[90.50, 45.50, 0]", null],
48
+ //["['lon', 'lat']", null],
49
+ ])("%s -> %s", async (cell, value) => {
50
+ const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
51
+ const schema = {
52
+ fields: [
53
+ { name: "name", type: "geopoint", format: "array" },
54
+ ],
55
+ };
56
+ const result = await normalizeTable(table, schema);
57
+ const frame = await result.collect();
58
+ expect(frame.toRecords()[0]?.name).toEqual(value);
59
+ });
60
+ });
61
+ describe("object format", () => {
62
+ it.each([
63
+ // Valid geopoints in object format
64
+ ['{"lon": 90.50, "lat": 45.50}', [90.5, 45.5]],
65
+ ['{"lon": 0, "lat": 0}', [0, 0]],
66
+ ['{"lon": -122.40, "lat": 37.78}', [-122.4, 37.78]],
67
+ ['{"lon": -180.0, "lat": -90.0}', [-180.0, -90.0]],
68
+ ['{"lon": 180.0, "lat": 90.0}', [180.0, 90.0]],
69
+ // With whitespace
70
+ [' {"lon": 90.50, "lat": 45.50} ', [90.5, 45.5]],
71
+ // TODO: fix this
72
+ // Invalid formats
73
+ //["not a geopoint", null],
74
+ //["", null],
75
+ //['{"longitude": 90.50, "latitude": 45.50}', null],
76
+ //['{"lon": 90.50}', null],
77
+ //['{"lat": 45.50}', null],
78
+ ])("%s -> %s", async (cell, value) => {
79
+ const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
80
+ const schema = {
81
+ fields: [
82
+ {
83
+ name: "name",
84
+ type: "geopoint",
85
+ format: "object",
86
+ },
87
+ ],
88
+ };
89
+ const result = await normalizeTable(table, schema);
90
+ const frame = await result.collect();
91
+ expect(frame.toRecords()[0]?.name).toEqual(value);
92
+ });
93
+ });
94
+ });
95
+ describe("stringifyGeopointField", () => {
96
+ describe("default format", () => {
97
+ it.each([
98
+ // Coordinate arrays to default format (lon,lat)
99
+ [[90.5, 45.5], "90.5,45.5"],
100
+ [[0, 0], "0.0,0.0"],
101
+ [[-122.4, 37.78], "-122.4,37.78"],
102
+ [[-180.0, -90.0], "-180.0,-90.0"],
103
+ [[180.0, 90.0], "180.0,90.0"],
104
+ // With precise decimals
105
+ [[125.6789, 10.1234], "125.6789,10.1234"],
106
+ // Null handling
107
+ //[null, null],
108
+ ])("%s -> %s", async (value, expected) => {
109
+ const table = pl
110
+ .DataFrame([pl.Series("name", [value], pl.List(pl.Float64))])
111
+ .lazy();
112
+ const schema = {
113
+ fields: [{ name: "name", type: "geopoint" }],
114
+ };
115
+ const result = await denormalizeTable(table, schema);
116
+ const frame = await result.collect();
117
+ expect(frame.toRecords()[0]?.name).toEqual(expected);
118
+ });
119
+ });
120
+ describe("array format", () => {
121
+ it.each([
122
+ // Coordinate arrays to array format string
123
+ [[90.5, 45.5], "[90.5,45.5]"],
124
+ [[0, 0], "[0.0,0.0]"],
125
+ [[-122.4, 37.78], "[-122.4,37.78]"],
126
+ [[-180.0, -90.0], "[-180.0,-90.0]"],
127
+ [[180.0, 90.0], "[180.0,90.0]"],
128
+ // Null handling
129
+ //[null, null],
130
+ ])("%s -> %s", async (value, expected) => {
131
+ const table = pl
132
+ .DataFrame([pl.Series("name", [value], pl.List(pl.Float64))])
133
+ .lazy();
134
+ const schema = {
135
+ fields: [
136
+ { name: "name", type: "geopoint", format: "array" },
137
+ ],
138
+ };
139
+ const result = await denormalizeTable(table, schema);
140
+ const frame = await result.collect();
141
+ expect(frame.toRecords()[0]?.name).toEqual(expected);
142
+ });
143
+ });
144
+ describe("object format", () => {
145
+ it.each([
146
+ // Coordinate arrays to object format string
147
+ [[90.5, 45.5], '{"lon":90.5,"lat":45.5}'],
148
+ [[0, 0], '{"lon":0.0,"lat":0.0}'],
149
+ [[-122.4, 37.78], '{"lon":-122.4,"lat":37.78}'],
150
+ [[-180.0, -90.0], '{"lon":-180.0,"lat":-90.0}'],
151
+ [[180.0, 90.0], '{"lon":180.0,"lat":90.0}'],
152
+ // Null handling
153
+ //[null, null],
154
+ ])("%s -> %s", async (value, expected) => {
155
+ const table = pl
156
+ .DataFrame([pl.Series("name", [value], pl.List(pl.Float64))])
157
+ .lazy();
158
+ const schema = {
159
+ fields: [
160
+ {
161
+ name: "name",
162
+ type: "geopoint",
163
+ format: "object",
164
+ },
165
+ ],
166
+ };
167
+ const result = await denormalizeTable(table, schema);
168
+ const frame = await result.collect();
169
+ expect(frame.toRecords()[0]?.name).toEqual(expected);
170
+ });
171
+ });
172
+ });
173
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvcG9pbnQuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2ZpZWxkL3R5cGVzL2dlb3BvaW50LnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDbkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQzdDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUV2RSxRQUFRLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFO0lBQ2xDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUU7UUFDOUIsRUFBRSxDQUFDLElBQUksQ0FBQztZQUNOLDhDQUE4QztZQUM5QyxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM3QixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNmLHNDQUFzQztZQUN0QyxvQ0FBb0M7WUFDcEMsaUNBQWlDO1lBRWpDLGtCQUFrQjtZQUNsQixtQ0FBbUM7WUFFbkMsa0JBQWtCO1lBQ2xCLDJCQUEyQjtZQUMzQixhQUFhO1lBQ2Isa0JBQWtCO1lBQ2xCLHNCQUFzQjtZQUN0QixzQkFBc0I7WUFDdEIsMEJBQTBCO1NBQzNCLENBQUMsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNuQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO1lBRXpFLE1BQU0sTUFBTSxHQUFHO2dCQUNiLE1BQU0sRUFBRSxDQUFDLEVB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LENBQUE7WUFFcEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDdEQsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGwgZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IGRlbm9ybWFsaXplVGFibGUsIG5vcm1hbGl6ZVRhYmxlIH0gZnJvbSBcIi4uLy4uL3RhYmxlL2luZGV4LnRzXCJcblxuZGVzY3JpYmUoXCJwYXJzZUdlb3BvaW50RmllbGRcIiwgKCkgPT4ge1xuICBkZXNjcmliZShcImRlZmF1bHQgZm9ybWF0XCIsICgpID0+IHtcbiAgICBpdC5lYWNoKFtcbiAgICAgIC8vIFZhbGlkIGdlb3BvaW50cyBpbiBkZWZhdWx0IGZvcm1hdCAobG9uLGxhdClcbiAgICAgIFtcIjkwLjUwLDQ1LjUwXCIsIFs5MC41LCA0NS41XV0sXG4gICAgICBbXCIwLDBcIiwgWzAsIDBdXSxcbiAgICAgIC8vW1wiLTEyMi40MCwgMzcuNzhcIiwgWy0xMjIuNCwgMzcuNzhdXSxcbiAgICAgIC8vW1wiLTE4MC4wLC05MC4wXCIsIFstMTgwLjAsIC05MC4wXV0sXG4gICAgICAvL1tcIjE4MC4wLCA5MC4wXCIsIFsxODAuMCwgOTAuMF1dLFxuXG4gICAgICAvLyBXaXRoIHdoaXRlc3BhY2VcbiAgICAgIC8vW1wiIDkwLjUwLCA0NS41MCBcIiwgWzkwLjUsIDQ1LjVdXSxcblxuICAgICAgLy8gSW52YWxpZCBmb3JtYXRzXG4gICAgICAvL1tcIm5vdCBhIGdlb3BvaW50XCIsIG51bGxdLFxuICAgICAgLy9bXCJcIiwgbnVsbF0sXG4gICAgICAvL1tcIjkwLjUwXCIsIG51bGxdLFxuICAgICAgLy9bXCI5MC41MCxsYXRcIiwgbnVsbF0sXG4gICAgICAvL1tcImxvbiw0NS41MFwiLCBudWxsXSxcbiAgICAgIC8vW1wiOTAuNTAsNDUuNTAsMFwiLCBudWxsXSxcbiAgICBdKShcIiVzIC0+ICVzXCIsIGFzeW5jIChjZWxsLCB2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBwbC5EYXRhRnJhbWUoW3BsLlNlcmllcyhcIm5hbWVcIiwgW2NlbGxdLCBwbC5TdHJpbmcpXSkubGF6eSgpXG5cbiAgICAgIGNvbnN0IHNjaGVtYSA9IHtcbiAgICAgICAgZmllbGRzOiBbeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJnZW9wb2ludFwiIGFzIGNvbnN0IH1dLFxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBub3JtYWxpemVUYWJsZSh0YWJsZSwgc2NoZW1hKVxuICAgICAgY29uc3QgZnJhbWUgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG5cbiAgICAgIGV4cGVjdChmcmFtZS50b1JlY29yZHMoKVswXT8ubmFtZSkudG9FcXVhbCh2YWx1ZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKFwiYXJyYXkgZm9ybWF0XCIsICgpID0+IHtcbiAgICBpdC5lYWNoKFtcbiAgICAgIC8vIFZhbGlkIGdlb3BvaW50cyBpbiBhcnJheSBmb3JtYXRcbiAgICAgIFtcIls5MC41MCwgNDUuNTBdXCIsIFs5MC41LCA0NS41XV0sXG4gICAgICBbXCJbMCwgMF1cIiwgWzAsIDBdXSxcbiAgICAgIFtcIlstMTIyLjQwLCAzNy43OF1cIiwgWy0xMjIuNCwgMzcuNzhdXSxcbiAgICAgIFtcIlstMTgwLjAsIC05MC4wXVwiLCBbLTE4MC4wLCAtOTAuMF1dLFxuICAgICAgW1wiWzE4MC4wLCA5MC4wXVwiLCBbMTgwLjAsIDkwLjBdXSxcblxuICAgICAgLy8gV2l0aCB3aGl0ZXNwYWNlXG4gICAgICBbXCIgWzkwLjUwLCA0NS41MF0gXCIsIFs5MC41LCA0NS41XV0sXG5cbiAgICAgIC8vIEludmFsaWQgZm9ybWF0c1xuICAgICAgLy8gVE9ETzogZml4IHRoaXNcbiAgICAgIC8vW1wibm90IGEgZ2VvcG9pbnRcIiwgbnVsbF0sXG4gICAgICAvL1tcIlwiLCBudWxsXSxcbiAgICAgIC8vW1wiWzkwLjUwXVwiLCBudWxsXSxcbiAgICAgIC8vW1wiWzkwLjUwLCA0NS41MCwgMF1cIiwgbnVsbF0sXG4gICAgICAvL1tcIlsnbG9uJywgJ2xhdCddXCIsIG51bGxdLFxuICAgIF0pKFwiJXMgLT4gJXNcIiwgYXN5bmMgKGNlbGwsIHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IHBsLkRhdGFGcmFtZShbcGwuU2VyaWVzKFwibmFtZVwiLCBbY2VsbF0sIHBsLlN0cmluZyldKS5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcImdlb3BvaW50XCIgYXMgY29uc3QsIGZvcm1hdDogXCJhcnJheVwiIGFzIGNvbnN0IH0sXG4gICAgICAgIF0sXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG5vcm1hbGl6ZVRhYmxlKHRhYmxlLCBzY2hlbWEpXG4gICAgICBjb25zdCBmcmFtZSA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcblxuICAgICAgZXhwZWN0KGZyYW1lLnRvUmVjb3JkcygpWzBdPy5uYW1lKS50b0VxdWFsKHZhbHVlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoXCJvYmplY3QgZm9ybWF0XCIsICgpID0+IHtcbiAgICBpdC5lYWNoKFtcbiAgICAgIC8vIFZhbGlkIGdlb3BvaW50cyBpbiBvYmplY3QgZm9ybWF0XG4gICAgICBbJ3tcImxvblwiOiA5MC41MCwgXCJsYXRcIjogNDUuNTB9JywgWzkwLjUsIDQ1LjVdXSxcbiAgICAgIFsne1wibG9uXCI6IDAsIFwibGF0XCI6IDB9JywgWzAsIDBdXSxcbiAgICAgIFsne1wibG9uXCI6IC0xMjIuNDAsIFwibGF0XCI6IDM3Ljc4fScsIFstMTIyLjQsIDM3Ljc4XV0sXG4gICAgICBbJ3tcImxvblwiOiAtMTgwLjAsIFwibGF0XCI6IC05MC4wfScsIFstMTgwLjAsIC05MC4wXV0sXG4gICAgICBbJ3tcImxvblwiOiAxODAuMCwgXCJsYXRcIjogOTAuMH0nLCBbMTgwLjAsIDkwLjBdXSxcblxuICAgICAgLy8gV2l0aCB3aGl0ZXNwYWNlXG4gICAgICBbJyB7XCJsb25cIjogOTAuNTAsIFwibGF0XCI6IDQ1LjUwfSAnLCBbOTAuNSwgNDUuNV1dLFxuXG4gICAgICAvLyBUT0RPOiBmaXggdGhpc1xuICAgICAgLy8gSW52YWxpZCBmb3JtYXRzXG4gICAgICAvL1tcIm5vdCBhIGdlb3BvaW50XCIsIG51bGxdLFxuICAgICAgLy9bXCJcIiwgbnVsbF0sXG4gICAgICAvL1sne1wibG9uZ2l0dWRlXCI6IDkwLjUwLCBcImxhdGl0dWRlXCI6IDQ1LjUwfScsIG51bGxdLFxuICAgICAgLy9bJ3tcImxvblwiOiA5MC41MH0nLCBudWxsXSxcbiAgICAgIC8vWyd7XCJsYXRcIjogNDUuNTB9JywgbnVsbF0sXG4gICAgXSkoXCIlcyAtPiAlc1wiLCBhc3luYyAoY2VsbCwgdmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gcGwuRGF0YUZyYW1lKFtwbC5TZXJpZXMoXCJuYW1lXCIsIFtjZWxsXSwgcGwuU3RyaW5nKV0pLmxhenkoKVxuXG4gICAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICAgICAgdHlwZTogXCJnZW9wb2ludFwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgZm9ybWF0OiBcIm9iamVjdFwiIGFzIGNvbnN0LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG5vcm1hbGl6ZVRhYmxlKHRhYmxlLCBzY2hlbWEpXG4gICAgICBjb25zdCBmcmFtZSA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcblxuICAgICAgZXhwZWN0KGZyYW1lLnRvUmVjb3JkcygpWzBdPy5uYW1lKS50b0VxdWFsKHZhbHVlKVxuICAgIH0pXG4gIH0pXG59KVxuXG5kZXNjcmliZShcInN0cmluZ2lmeUdlb3BvaW50RmllbGRcIiwgKCkgPT4ge1xuICBkZXNjcmliZShcImRlZmF1bHQgZm9ybWF0XCIsICgpID0+IHtcbiAgICBpdC5lYWNoKFtcbiAgICAgIC8vIENvb3JkaW5hdGUgYXJyYXlzIHRvIGRlZmF1bHQgZm9ybWF0IChsb24sbGF0KVxuICAgICAgW1s5MC41LCA0NS41XSwgXCI5MC41LDQ1LjVcIl0sXG4gICAgICBbWzAsIDBdLCBcIjAuMCwwLjBcIl0sXG4gICAgICBbWy0xMjIuNCwgMzcuNzhdLCBcIi0xMjIuNCwzNy43OFwiXSxcbiAgICAgIFtbLTE4MC4wLCAtOTAuMF0sIFwiLTE4MC4wLC05MC4wXCJdLFxuICAgICAgW1sxODAuMCwgOTAuMF0sIFwiMTgwLjAsOTAuMFwiXSxcblxuICAgICAgLy8gV2l0aCBwcmVjaXNlIGRlY2ltYWxzXG4gICAgICBbWzEyNS42Nzg5LCAxMC4xMjM0XSwgXCIxMjUuNjc4OSwxMC4xMjM0XCJdLFxuXG4gICAgICAvLyBOdWxsIGhhbmRsaW5nXG4gICAgICAvL1tudWxsLCBudWxsXSxcbiAgICBdKShcIiVzIC0+ICVzXCIsIGFzeW5jICh2YWx1ZSwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgICAgLkRhdGFGcmFtZShbcGwuU2VyaWVzKFwibmFtZVwiLCBbdmFsdWVdLCBwbC5MaXN0KHBsLkZsb2F0NjQpKV0pXG4gICAgICAgIC5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgICBmaWVsZHM6IFt7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcImdlb3BvaW50XCIgYXMgY29uc3QgfV0sXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlbm9ybWFsaXplVGFibGUodGFibGUsIHNjaGVtYSlcbiAgICAgIGNvbnN0IGZyYW1lID0gYXdhaXQgcmVzdWx0LmNvbGxlY3QoKVxuXG4gICAgICBleHBlY3QoZnJhbWUudG9SZWNvcmRzKClbMF0/Lm5hbWUpLnRvRXF1YWwoZXhwZWN0ZWQpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZShcImFycmF5IGZvcm1hdFwiLCAoKSA9PiB7XG4gICAgaXQuZWFjaChbXG4gICAgICAvLyBDb29yZGluYXRlIGFycmF5cyB0byBhcnJheSBmb3JtYXQgc3RyaW5nXG4gICAgICBbWzkwLjUsIDQ1LjVdLCBcIls5MC41LDQ1LjVdXCJdLFxuICAgICAgW1swLCAwXSwgXCJbMC4wLDAuMF1cIl0sXG4gICAgICBbWy0xMjIuNCwgMzcuNzhdLCBcIlstMTIyLjQsMzcuNzhdXCJdLFxuICAgICAgW1stMTgwLjAsIC05MC4wXSwgXCJbLTE4MC4wLC05MC4wXVwiXSxcbiAgICAgIFtbMTgwLjAsIDkwLjBdLCBcIlsxODAuMCw5MC4wXVwiXSxcblxuICAgICAgLy8gTnVsbCBoYW5kbGluZ1xuICAgICAgLy9bbnVsbCwgbnVsbF0sXG4gICAgXSkoXCIlcyAtPiAlc1wiLCBhc3luYyAodmFsdWUsIGV4cGVjdGVkKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAgIC5EYXRhRnJhbWUoW3BsLlNlcmllcyhcIm5hbWVcIiwgW3ZhbHVlXSwgcGwuTGlzdChwbC5GbG9hdDY0KSldKVxuICAgICAgICAubGF6eSgpXG5cbiAgICAgIGNvbnN0IHNjaGVtYSA9IHtcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJnZW9wb2ludFwiIGFzIGNvbnN0LCBmb3JtYXQ6IFwiYXJyYXlcIiBhcyBjb25zdCB9LFxuICAgICAgICBdLFxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZW5vcm1hbGl6ZVRhYmxlKHRhYmxlLCBzY2hlbWEpXG4gICAgICBjb25zdCBmcmFtZSA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcblxuICAgICAgZXhwZWN0KGZyYW1lLnRvUmVjb3JkcygpWzBdPy5uYW1lKS50b0VxdWFsKGV4cGVjdGVkKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoXCJvYmplY3QgZm9ybWF0XCIsICgpID0+IHtcbiAgICBpdC5lYWNoKFtcbiAgICAgIC8vIENvb3JkaW5hdGUgYXJyYXlzIHRvIG9iamVjdCBmb3JtYXQgc3RyaW5nXG4gICAgICBbWzkwLjUsIDQ1LjVdLCAne1wibG9uXCI6OTAuNSxcImxhdFwiOjQ1LjV9J10sXG4gICAgICBbWzAsIDBdLCAne1wibG9uXCI6MC4wLFwibGF0XCI6MC4wfSddLFxuICAgICAgW1stMTIyLjQsIDM3Ljc4XSwgJ3tcImxvblwiOi0xMjIuNCxcImxhdFwiOjM3Ljc4fSddLFxuICAgICAgW1stMTgwLjAsIC05MC4wXSwgJ3tcImxvblwiOi0xODAuMCxcImxhdFwiOi05MC4wfSddLFxuICAgICAgW1sxODAuMCwgOTAuMF0sICd7XCJsb25cIjoxODAuMCxcImxhdFwiOjkwLjB9J10sXG5cbiAgICAgIC8vIE51bGwgaGFuZGxpbmdcbiAgICAgIC8vW251bGwsIG51bGxdLFxuICAgIF0pKFwiJXMgLT4gJXNcIiwgYXN5bmMgKHZhbHVlLCBleHBlY3RlZCkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgICAuRGF0YUZyYW1lKFtwbC5TZXJpZXMoXCJuYW1lXCIsIFt2YWx1ZV0sIHBsLkxpc3QocGwuRmxvYXQ2NCkpXSlcbiAgICAgICAgLmxhenkoKVxuXG4gICAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICAgICAgdHlwZTogXCJnZW9wb2ludFwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgZm9ybWF0OiBcIm9iamVjdFwiIGFzIGNvbnN0LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlbm9ybWFsaXplVGFibGUodGFibGUsIHNjaGVtYSlcbiAgICAgIGNvbnN0IGZyYW1lID0gYXdhaXQgcmVzdWx0LmNvbGxlY3QoKVxuXG4gICAgICBleHBlY3QoZnJhbWUudG9SZWNvcmRzKClbMF0/Lm5hbWUpLnRvRXF1YWwoZXhwZWN0ZWQpXG4gICAgfSlcbiAgfSlcbn0pXG4iXX0=
@@ -0,0 +1,4 @@
1
+ import type { IntegerField } from "@frictionless-ts/metadata";
2
+ import * as pl from "nodejs-polars";
3
+ export declare function parseIntegerField(field: IntegerField, fieldExpr: pl.Expr): pl.Expr;
4
+ export declare function stringifyIntegerField(_field: IntegerField, fieldExpr: pl.Expr): pl.Expr;
@@ -0,0 +1,41 @@
1
+ import * as pl from "nodejs-polars";
2
+ // TODO: support categories
3
+ // TODO: support categoriesOrder
4
+ export function parseIntegerField(field, fieldExpr) {
5
+ const groupChar = field.groupChar;
6
+ const bareNumber = field.bareNumber;
7
+ const flattenCategories = field.categories?.map(it => typeof it === "number" ? it : it.value);
8
+ // Handle non-bare numbers (with currency symbols, percent signs, etc.)
9
+ if (bareNumber === false) {
10
+ // Preserve the minus sign when removing leading characters
11
+ fieldExpr = fieldExpr.str.replaceAll("^[^\\d\\-]+", "");
12
+ fieldExpr = fieldExpr.str.replaceAll("[^\\d\\-]+$", "");
13
+ }
14
+ // Handle group character (thousands separator)
15
+ if (groupChar) {
16
+ // Escape special characters for regex
17
+ const escapedGroupChar = groupChar.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
18
+ fieldExpr = fieldExpr.str.replaceAll(escapedGroupChar, "");
19
+ }
20
+ // Cast to int64 (will handle values up to 2^63-1)
21
+ fieldExpr = fieldExpr.cast(pl.Int64);
22
+ // Currently, only string categories are supported
23
+ if (flattenCategories) {
24
+ return pl
25
+ .when(fieldExpr.isIn(flattenCategories))
26
+ .then(fieldExpr)
27
+ .otherwise(pl.lit(null))
28
+ .alias(field.name);
29
+ }
30
+ return fieldExpr;
31
+ }
32
+ export function stringifyIntegerField(_field, fieldExpr) {
33
+ // Convert to string
34
+ fieldExpr = fieldExpr.cast(pl.String);
35
+ //const groupChar = field.groupChar
36
+ //const bareNumber = field.bareNumber
37
+ // TODO: Add group character formatting (thousands separator) when needed
38
+ // TODO: Add non-bare number formatting (currency symbols, etc.) when needed
39
+ return fieldExpr;
40
+ }
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2ZpZWxkL3R5cGVzL2ludGVnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFbkMsMkJBQTJCO0FBQzNCLGdDQUFnQztBQUNoQyxNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBbUIsRUFBRSxTQUFrQjtJQUN2RSxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFBO0lBQ2pDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUE7SUFDbkMsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUNuRCxPQUFPLEVBQUUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FDdkMsQ0FBQTtJQUVELHVFQUF1RTtJQUN2RSxJQUFJLFVBQVUsS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUN6QiwyREFBMkQ7UUFDM0QsU0FBUyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUN2RCxTQUFTLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQ3pELENBQUM7SUFFRCwrQ0FBK0M7SUFDL0MsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNkLHNDQUFzQztRQUN0QyxNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDekUsU0FBUyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQzVELENBQUM7SUFFRCxrREFBa0Q7SUFDbEQsU0FBUyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRXBDLGtEQUFrRDtJQUNsRCxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDdEIsT0FBTyxFQUFFO2FBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQzthQUN2QyxJQUFJLENBQUMsU0FBUyxDQUFDO2FBQ2YsU0FBUyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDdkIsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUN0QixDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQztBQUVELE1BQU0sVUFBVSxxQkFBcUIsQ0FDbkMsTUFBb0IsRUFDcEIsU0FBa0I7SUFFbEIsb0JBQW9CO0lBQ3BCLFNBQVMsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUVyQyxtQ0FBbUM7SUFDbkMscUNBQXFDO0lBRXJDLHlFQUF5RTtJQUN6RSw0RUFBNEU7SUFFNUUsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgSW50ZWdlckZpZWxkIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0ICogYXMgcGwgZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuXG4vLyBUT0RPOiBzdXBwb3J0IGNhdGVnb3JpZXNcbi8vIFRPRE86IHN1cHBvcnQgY2F0ZWdvcmllc09yZGVyXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJbnRlZ2VyRmllbGQoZmllbGQ6IEludGVnZXJGaWVsZCwgZmllbGRFeHByOiBwbC5FeHByKSB7XG4gIGNvbnN0IGdyb3VwQ2hhciA9IGZpZWxkLmdyb3VwQ2hhclxuICBjb25zdCBiYXJlTnVtYmVyID0gZmllbGQuYmFyZU51bWJlclxuICBjb25zdCBmbGF0dGVuQ2F0ZWdvcmllcyA9IGZpZWxkLmNhdGVnb3JpZXM/Lm1hcChpdCA9PlxuICAgIHR5cGVvZiBpdCA9PT0gXCJudW1iZXJcIiA/IGl0IDogaXQudmFsdWUsXG4gIClcblxuICAvLyBIYW5kbGUgbm9uLWJhcmUgbnVtYmVycyAod2l0aCBjdXJyZW5jeSBzeW1ib2xzLCBwZXJjZW50IHNpZ25zLCBldGMuKVxuICBpZiAoYmFyZU51bWJlciA9PT0gZmFsc2UpIHtcbiAgICAvLyBQcmVzZXJ2ZSB0aGUgbWludXMgc2lnbiB3aGVuIHJlbW92aW5nIGxlYWRpbmcgY2hhcmFjdGVyc1xuICAgIGZpZWxkRXhwciA9IGZpZWxkRXhwci5zdHIucmVwbGFjZUFsbChcIl5bXlxcXFxkXFxcXC1dK1wiLCBcIlwiKVxuICAgIGZpZWxkRXhwciA9IGZpZWxkRXhwci5zdHIucmVwbGFjZUFsbChcIlteXFxcXGRcXFxcLV0rJFwiLCBcIlwiKVxuICB9XG5cbiAgLy8gSGFuZGxlIGdyb3VwIGNoYXJhY3RlciAodGhvdXNhbmRzIHNlcGFyYXRvcilcbiAgaWYgKGdyb3VwQ2hhcikge1xuICAgIC8vIEVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnMgZm9yIHJlZ2V4XG4gICAgY29uc3QgZXNjYXBlZEdyb3VwQ2hhciA9IGdyb3VwQ2hhci5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIilcbiAgICBmaWVsZEV4cHIgPSBmaWVsZEV4cHIuc3RyLnJlcGxhY2VBbGwoZXNjYXBlZEdyb3VwQ2hhciwgXCJcIilcbiAgfVxuXG4gIC8vIENhc3QgdG8gaW50NjQgKHdpbGwgaGFuZGxlIHZhbHVlcyB1cCB0byAyXjYzLTEpXG4gIGZpZWxkRXhwciA9IGZpZWxkRXhwci5jYXN0KHBsLkludDY0KVxuXG4gIC8vIEN1cnJlbnRseSwgb25seSBzdHJpbmcgY2F0ZWdvcmllcyBhcmUgc3VwcG9ydGVkXG4gIGlmIChmbGF0dGVuQ2F0ZWdvcmllcykge1xuICAgIHJldHVybiBwbFxuICAgICAgLndoZW4oZmllbGRFeHByLmlzSW4oZmxhdHRlbkNhdGVnb3JpZXMpKVxuICAgICAgLnRoZW4oZmllbGRFeHByKVxuICAgICAgLm90aGVyd2lzZShwbC5saXQobnVsbCkpXG4gICAgICAuYWxpYXMoZmllbGQubmFtZSlcbiAgfVxuXG4gIHJldHVybiBmaWVsZEV4cHJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeUludGVnZXJGaWVsZChcbiAgX2ZpZWxkOiBJbnRlZ2VyRmllbGQsXG4gIGZpZWxkRXhwcjogcGwuRXhwcixcbikge1xuICAvLyBDb252ZXJ0IHRvIHN0cmluZ1xuICBmaWVsZEV4cHIgPSBmaWVsZEV4cHIuY2FzdChwbC5TdHJpbmcpXG5cbiAgLy9jb25zdCBncm91cENoYXIgPSBmaWVsZC5ncm91cENoYXJcbiAgLy9jb25zdCBiYXJlTnVtYmVyID0gZmllbGQuYmFyZU51bWJlclxuXG4gIC8vIFRPRE86IEFkZCBncm91cCBjaGFyYWN0ZXIgZm9ybWF0dGluZyAodGhvdXNhbmRzIHNlcGFyYXRvcikgd2hlbiBuZWVkZWRcbiAgLy8gVE9ETzogQWRkIG5vbi1iYXJlIG51bWJlciBmb3JtYXR0aW5nIChjdXJyZW5jeSBzeW1ib2xzLCBldGMuKSB3aGVuIG5lZWRlZFxuXG4gIHJldHVybiBmaWVsZEV4cHJcbn1cbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,102 @@
1
+ import * as pl from "nodejs-polars";
2
+ import { describe, expect, it } from "vitest";
3
+ import { denormalizeTable, normalizeTable } from "../../table/index.js";
4
+ describe("parseIntegerField", () => {
5
+ it.each([
6
+ // Basic integer parsing
7
+ ["1", 1, {}],
8
+ ["2", 2, {}],
9
+ ["1000", 1000, {}],
10
+ // Empty or invalid values
11
+ ["", null, {}],
12
+ ["2.1", null, {}],
13
+ ["bad", null, {}],
14
+ ["0.0003", null, {}],
15
+ ["3.14", null, {}],
16
+ ["1/2", null, {}],
17
+ // Group character handling
18
+ ["1", 1, { groupChar: "," }],
19
+ ["1,000", 1000, { groupChar: "," }],
20
+ ["1,000,000", 1000000, { groupChar: "," }],
21
+ ["1 000", 1000, { groupChar: " " }],
22
+ ["1'000'000", 1000000, { groupChar: "'" }],
23
+ ["1.000.000", 1000000, { groupChar: "." }],
24
+ // Bare number handling
25
+ ["1", 1, { bareNumber: false }],
26
+ ["1000", 1000, { bareNumber: false }],
27
+ ["$1000", 1000, { bareNumber: false }],
28
+ ["1000$", 1000, { bareNumber: false }],
29
+ ["€1000", 1000, { bareNumber: false }],
30
+ ["1000€", 1000, { bareNumber: false }],
31
+ ["1,000", null, { bareNumber: false }],
32
+ ["-12€", -12, { bareNumber: false }],
33
+ ["€-12", -12, { bareNumber: false }],
34
+ // Leading zeros and whitespace
35
+ ["000835", 835, {}],
36
+ ["0", 0, {}],
37
+ ["00", 0, {}],
38
+ ["01", 1, {}],
39
+ //[" 01 ", 1, {}],
40
+ //[" 42 ", 42, {}],
41
+ // Combined cases
42
+ ["$1,000,000", 1000000, { bareNumber: false, groupChar: "," }],
43
+ ["1,000,000$", 1000000, { bareNumber: false, groupChar: "," }],
44
+ ["€ 1.000.000", 1000000, { bareNumber: false, groupChar: "." }],
45
+ //[" -1,000 ", -1000, { groupChar: "," }],
46
+ ["000,001", 1, { groupChar: "," }],
47
+ ])("$0 -> $1 $2", async (cell, value, options) => {
48
+ const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
49
+ const schema = {
50
+ fields: [{ name: "name", type: "integer", ...options }],
51
+ };
52
+ const result = await normalizeTable(table, schema);
53
+ const frame = await result.collect();
54
+ expect(frame.getColumn("name").get(0)).toEqual(value);
55
+ expect(frame.getColumn("name").get(0)).toEqual(value);
56
+ });
57
+ describe("categories", () => {
58
+ it.each([
59
+ // Flat categories
60
+ ["1", 1, { categories: [1, 2] }],
61
+ ["2", 2, { categories: [1, 2] }],
62
+ ["3", null, { categories: [1, 2] }],
63
+ // Object categories
64
+ ["1", 1, { categories: [{ value: 1, label: "One" }] }],
65
+ ["2", null, { categories: [{ value: 1, label: "One" }] }],
66
+ ])("$0 -> $1 $2", async (cell, value, options) => {
67
+ const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
68
+ const schema = {
69
+ fields: [{ name: "name", type: "integer", ...options }],
70
+ };
71
+ const result = await normalizeTable(table, schema);
72
+ const frame = await result.collect();
73
+ expect(frame.toRecords()[0]?.name).toEqual(value);
74
+ });
75
+ });
76
+ });
77
+ describe("stringifyIntegerField", () => {
78
+ it.each([
79
+ // Basic integer to string conversion
80
+ [1, "1"],
81
+ [2, "2"],
82
+ [1000, "1000"],
83
+ [42, "42"],
84
+ [-1, "-1"],
85
+ [-100, "-100"],
86
+ [0, "0"],
87
+ // Large integers
88
+ [1234567890, "1234567890"],
89
+ [-1234567890, "-1234567890"],
90
+ // Null handling
91
+ [null, ""],
92
+ ])("%s -> %s", async (value, expected) => {
93
+ const table = pl.DataFrame([pl.Series("name", [value], pl.Int64)]).lazy();
94
+ const schema = {
95
+ fields: [{ name: "name", type: "integer" }],
96
+ };
97
+ const result = await denormalizeTable(table, schema);
98
+ const frame = await result.collect();
99
+ expect(frame.toRecords()[0]?.name).toEqual(expected);
100
+ });
101
+ });
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWdlci5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZmllbGQvdHlwZXMvaW50ZWdlci5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFFdkUsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUNqQyxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ04sd0JBQXdCO1FBQ3hCLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDWixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ1osQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUVsQiwwQkFBMEI7UUFDMUIsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNkLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7UUFDakIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNqQixDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ3BCLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7UUFDbEIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUVqQiwyQkFBMkI7UUFDM0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQzVCLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNuQyxDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUs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QUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7UUFFekUsTUFBTSxNQUFNLEdBQUc7WUFDYixNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQWtCLEVBQUUsQ0FBQztTQUNyRCxDQUFBO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDcEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUE7UUFFcEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDdEQsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBsIGZyb20gXCJub2RlanMtcG9sYXJzXCJcbmltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGVzdFwiXG5pbXBvcnQgeyBkZW5vcm1hbGl6ZVRhYmxlLCBub3JtYWxpemVUYWJsZSB9IGZyb20gXCIuLi8uLi90YWJsZS9pbmRleC50c1wiXG5cbmRlc2NyaWJlKFwicGFyc2VJbnRlZ2VyRmllbGRcIiwgKCkgPT4ge1xuICBpdC5lYWNoKFtcbiAgICAvLyBCYXNpYyBpbnRlZ2VyIHBhcnNpbmdcbiAgICBbXCIxXCIsIDEsIHt9XSxcbiAgICBbXCIyXCIsIDIsIHt9XSxcbiAgICBbXCIxMDAwXCIsIDEwMDAsIHt9XSxcblxuICAgIC8vIEVtcHR5IG9yIGludmFsaWQgdmFsdWVzXG4gICAgW1wiXCIsIG51bGwsIHt9XSxcbiAgICBbXCIyLjFcIiwgbnVsbCwge31dLFxuICAgIFtcImJhZFwiLCBudWxsLCB7fV0sXG4gICAgW1wiMC4wMDAzXCIsIG51bGwsIHt9XSxcbiAgICBbXCIzLjE0XCIsIG51bGwsIHt9XSxcbiAgICBbXCIxLzJcIiwgbnVsbCwge31dLFxuXG4gICAgLy8gR3JvdXAgY2hhcmFjdGVyIGhhbmRsaW5nXG4gICAgW1wiMVwiLCAxLCB7IGdyb3VwQ2hhcjogXCIsXCIgfV0sXG4gICAgW1wiMSwwMDBcIiwgMTAwMCwgeyBncm91cENoYXI6IFwiLFwiIH1dLFxuICAgIFtcIjEsMDAwLDAwMFwiLCAxMDAwMDAwLCB7IGdyb3VwQ2hhcjogXCIsXCIgfV0sXG4gICAgW1wiMSAwMDBcIiwgMTAwMCwgeyBncm91cENoYXI6IFwiIFwiIH1dLFxuICAgIFtcIjEnMDAwJzAwMFwiLCAxMDAwMDAwLCB7IGdyb3VwQ2hhcjogXCInXCIgfV0sXG4gICAgW1wiMS4wMDAuMDAwXCIsIDEwMDAwMDAsIHsgZ3JvdXBDaGFyOiBcIi5cIiB9XSxcblxuICAgIC8vIEJhcmUgbnVtYmVyIGhhbmRsaW5nXG4gICAgW1wiMVwiLCAxLCB7IGJhcmVOdW1iZXI6IGZhbHNlIH1dLFxuICAgIFtcIjEwMDBcIiwgMTAwMCwgeyBiYXJlTnVtYmVyOiBmYWxzZSB9XSxcbiAgICBbXCIkMTAwMFwiLCAxMDAwLCB7IGJhcmVOdW1iZXI6IGZhbHNlIH1dLFxuICAgIFtcIjEwMDAkXCIsIDEwMDAsIHsgYmFyZU51bWJlcjogZmFsc2UgfV0sXG4gICAgW1wi4oKsMTAwMFwiLCAxMDAwLCB7IGJhcmVOdW1iZXI6IGZhbHNlIH1dLFxuICAgIFtcIjEwMDDigqxcIiwgMTAwMCwgeyBiYXJlTnVtYmVyOiBmYWxzZSB9XSxcbiAgICBbXCIxLDAwMFwiLCBudWxsLCB7IGJhcmVOdW1iZXI6IGZhbHNlIH1dLFxuICAgIFtcIi0xMuKCrFwiLCAtMTIsIHsgYmFyZU51bWJlcjogZmFsc2UgfV0sXG4gICAgW1wi4oKsLTEyXCIsIC0xMiwgeyBiYXJlTnVtYmVyOiBmYWxzZSB9XSxcblxuICAgIC8vIExlYWRpbmcgemVyb3MgYW5kIHdoaXRlc3BhY2VcbiAgICBbXCIwMDA4MzVcIiwgODM1LCB7fV0sXG4gICAgW1wiMFwiLCAwLCB7fV0sXG4gICAgW1wiMDBcIiwgMCwge31dLFxuICAgIFtcIjAxXCIsIDEsIHt9XSxcbiAgICAvL1tcIiAwMSBcIiwgMSwge31dLFxuICAgIC8vW1wiICA0MiAgXCIsIDQyLCB7fV0sXG5cbiAgICAvLyBDb21iaW5lZCBjYXNlc1xuICAgIFtcIiQxLDAwMCwwMDBcIiwgMTAwMDAwMCwgeyBiYXJlTnVtYmVyOiBmYWxzZSwgZ3JvdXBDaGFyOiBcIixcIiB9XSxcbiAgICBbXCIxLDAwMCwwMDAkXCIsIDEwMDAwMDAsIHsgYmFyZU51bWJlcjogZmFsc2UsIGdyb3VwQ2hhcjogXCIsXCIgfV0sXG4gICAgW1wi4oKsIDEuMDAwLjAwMFwiLCAxMDAwMDAwLCB7IGJhcmVOdW1iZXI6IGZhbHNlLCBncm91cENoYXI6IFwiLlwiIH1dLFxuICAgIC8vW1wiIC0xLDAwMCBcIiwgLTEwMDAsIHsgZ3JvdXBDaGFyOiBcIixcIiB9XSxcbiAgICBbXCIwMDAsMDAxXCIsIDEsIHsgZ3JvdXBDaGFyOiBcIixcIiB9XSxcbiAgXSkoXCIkMCAtPiAkMSAkMlwiLCBhc3luYyAoY2VsbCwgdmFsdWUsIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsLkRhdGFGcmFtZShbcGwuU2VyaWVzKFwibmFtZVwiLCBbY2VsbF0sIHBsLlN0cmluZyldKS5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW3sgbmFtZTogXCJuYW1lXCIsIHR5cGU6IFwiaW50ZWdlclwiIGFzIGNvbnN0LCAuLi5vcHRpb25zIH1dLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG5vcm1hbGl6ZVRhYmxlKHRhYmxlLCBzY2hlbWEpXG4gICAgY29uc3QgZnJhbWUgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG5cbiAgICBleHBlY3QoZnJhbWUuZ2V0Q29sdW1uKFwibmFtZVwiKS5nZXQoMCkpLnRvRXF1YWwodmFsdWUpXG4gICAgZXhwZWN0KGZyYW1lLmdldENvbHVtbihcIm5hbWVcIikuZ2V0KDApKS50b0VxdWFsKHZhbHVlKVxuICB9KVxuXG4gIGRlc2NyaWJlKFwiY2F0ZWdvcmllc1wiLCAoKSA9PiB7XG4gICAgaXQuZWFjaChbXG4gICAgICAvLyBGbGF0IGNhdGVnb3JpZXNcbiAgICAgIFtcIjFcIiwgMSwgeyBjYXRlZ29yaWVzOiBbMSwgMl0gfV0sXG4gICAgICBbXCIyXCIsIDIsIHsgY2F0ZWdvcmllczogWzEsIDJdIH1dLFxuICAgICAgW1wiM1wiLCBudWxsLCB7IGNhdGVnb3JpZXM6IFsxLCAyXSB9XSxcblxuICAgICAgLy8gT2JqZWN0IGNhdGVnb3JpZXNcbiAgICAgIFtcIjFcIiwgMSwgeyBjYXRlZ29yaWVzOiBbeyB2YWx1ZTogMSwgbGFiZWw6IFwiT25lXCIgfV0gfV0sXG4gICAgICBbXCIyXCIsIG51bGwsIHsgY2F0ZWdvcmllczogW3sgdmFsdWU6IDEsIGxhYmVsOiBcIk9uZVwiIH1dIH1dLFxuICAgIF0pKFwiJDAgLT4gJDEgJDJcIiwgYXN5bmMgKGNlbGwsIHZhbHVlLCBvcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IHBsLkRhdGFGcmFtZShbcGwuU2VyaWVzKFwibmFtZVwiLCBbY2VsbF0sIHBsLlN0cmluZyldKS5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgICBmaWVsZHM6IFt7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcImludGVnZXJcIiBhcyBjb25zdCwgLi4ub3B0aW9ucyB9XSxcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbm9ybWFsaXplVGFibGUodGFibGUsIHNjaGVtYSlcbiAgICAgIGNvbnN0IGZyYW1lID0gYXdhaXQgcmVzdWx0LmNvbGxlY3QoKVxuXG4gICAgICBleHBlY3QoZnJhbWUudG9SZWNvcmRzKClbMF0/Lm5hbWUpLnRvRXF1YWwodmFsdWUpXG4gICAgfSlcbiAgfSlcbn0pXG5cbmRlc2NyaWJlKFwic3RyaW5naWZ5SW50ZWdlckZpZWxkXCIsICgpID0+IHtcbiAgaXQuZWFjaChbXG4gICAgLy8gQmFzaWMgaW50ZWdlciB0byBzdHJpbmcgY29udmVyc2lvblxuICAgIFsxLCBcIjFcIl0sXG4gICAgWzIsIFwiMlwiXSxcbiAgICBbMTAwMCwgXCIxMDAwXCJdLFxuICAgIFs0MiwgXCI0MlwiXSxcbiAgICBbLTEsIFwiLTFcIl0sXG4gICAgWy0xMDAsIFwiLTEwMFwiXSxcbiAgICBbMCwgXCIwXCJdLFxuXG4gICAgLy8gTGFyZ2UgaW50ZWdlcnNcbiAgICBbMTIzNDU2Nzg5MCwgXCIxMjM0NTY3ODkwXCJdLFxuICAgIFstMTIzNDU2Nzg5MCwgXCItMTIzNDU2Nzg5MFwiXSxcblxuICAgIC8vIE51bGwgaGFuZGxpbmdcbiAgICBbbnVsbCwgXCJcIl0sXG4gIF0pKFwiJXMgLT4gJXNcIiwgYXN5bmMgKHZhbHVlLCBleHBlY3RlZCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGwuRGF0YUZyYW1lKFtwbC5TZXJpZXMoXCJuYW1lXCIsIFt2YWx1ZV0sIHBsLkludDY0KV0pLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJpbnRlZ2VyXCIgYXMgY29uc3QgfV0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVub3JtYWxpemVUYWJsZSh0YWJsZSwgc2NoZW1hKVxuICAgIGNvbnN0IGZyYW1lID0gYXdhaXQgcmVzdWx0LmNvbGxlY3QoKVxuXG4gICAgZXhwZWN0KGZyYW1lLnRvUmVjb3JkcygpWzBdPy5uYW1lKS50b0VxdWFsKGV4cGVjdGVkKVxuICB9KVxufSlcbiJdfQ==
@@ -0,0 +1,6 @@
1
+ import type { ArrayField, GeojsonField, ObjectField } from "@frictionless-ts/metadata";
2
+ import type { CellError } from "@frictionless-ts/metadata";
3
+ import type { Table } from "../../table/index.ts";
4
+ export declare function inspectJsonField(field: ArrayField | GeojsonField | ObjectField, table: Table, options?: {
5
+ formatJsonSchema?: Record<string, any>;
6
+ }): Promise<CellError[]>;
@@ -0,0 +1,68 @@
1
+ import { inspectJsonValue } from "@frictionless-ts/metadata";
2
+ import * as pl from "nodejs-polars";
3
+ import { isObject } from "../../helpers.js";
4
+ // TODO: Improve the implementation
5
+ // Make unblocking / handle large data / process in parallel / move processing to Rust?
6
+ export async function inspectJsonField(field, table, options) {
7
+ const errors = [];
8
+ const formatJsonSchema = options?.formatJsonSchema;
9
+ const constraintJsonSchema = field.constraints?.jsonSchema;
10
+ const frame = await table
11
+ .withRowCount()
12
+ .select(pl.pl.col("row_nr").add(1).alias("number"), pl.pl.col(field.name).alias("source"))
13
+ .collect();
14
+ for (const row of frame.toRecords()) {
15
+ if (row.source === null)
16
+ continue;
17
+ let target;
18
+ const checkCompat = field.type === "array" ? Array.isArray : isObject;
19
+ try {
20
+ target = JSON.parse(row.source);
21
+ }
22
+ catch (error) { }
23
+ if (!target || !checkCompat(target)) {
24
+ errors.push({
25
+ type: "cell/type",
26
+ cell: String(row.source),
27
+ fieldName: field.name,
28
+ fieldType: field.type,
29
+ fieldFormat: field.format,
30
+ rowNumber: row.number,
31
+ });
32
+ continue;
33
+ }
34
+ if (formatJsonSchema) {
35
+ const formatErrors = await inspectJsonValue(target, {
36
+ jsonSchema: formatJsonSchema,
37
+ });
38
+ if (formatErrors.length) {
39
+ errors.push({
40
+ type: "cell/type",
41
+ cell: String(row.source),
42
+ fieldName: field.name,
43
+ fieldType: field.type,
44
+ fieldFormat: field.format,
45
+ rowNumber: row.number,
46
+ });
47
+ }
48
+ continue;
49
+ }
50
+ if (constraintJsonSchema) {
51
+ const constraintErrors = await inspectJsonValue(target, {
52
+ jsonSchema: constraintJsonSchema,
53
+ });
54
+ for (const error of constraintErrors) {
55
+ errors.push({
56
+ type: "cell/jsonSchema",
57
+ cell: String(row.source),
58
+ fieldName: field.name,
59
+ rowNumber: row.number,
60
+ pointer: error.pointer,
61
+ message: error.message,
62
+ });
63
+ }
64
+ }
65
+ }
66
+ return errors;
67
+ }
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2ZpZWxkL3R5cGVzL2pzb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFFNUQsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDbkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBRzNDLG1DQUFtQztBQUNuQyx1RkFBdUY7QUFFdkYsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FDcEMsS0FBOEMsRUFDOUMsS0FBWSxFQUNaLE9BRUM7SUFFRCxNQUFNLE1BQU0sR0FBZ0IsRUFBRSxDQUFBO0lBRTlCLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxFQUFFLGdCQUFnQixDQUFBO0lBQ2xELE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUE7SUFFMUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxLQUFLO1NBQ3RCLFlBQVksRUFBRTtTQUNkLE1BQU0sQ0FDTCxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUMxQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUN0QztTQUNBLE9BQU8sRUFBRSxDQUFBO0lBRVosS0FBSyxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFXLEVBQUUsQ0FBQztRQUM3QyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssSUFBSTtZQUFFLFNBQVE7UUFFakMsSUFBSSxNQUF1QyxDQUFBO1FBQzNDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUE7UUFFckUsSUFBSSxDQUFDO1lBQ0gsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ2pDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDLENBQUEsQ0FBQztRQUVsQixJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDVixJQUFJLEVBQUUsV0FBVztnQkFDakIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO2dCQUN4QixTQUFTLEVBQUUsS0FBSyxDQUFDLElBQUk7Z0JBQ3JCLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSTtnQkFDckIsV0FBVyxFQUFFLEtBQUssQ0FBQyxNQUFNO2dCQUN6QixTQUFTLEVBQUUsR0FBRyxDQUFDLE1BQU07YUFDdEIsQ0FBQyxDQUFBO1lBRUYsU0FBUTtRQUNWLENBQUM7UUFFRCxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDckIsTUFBTSxZQUFZLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUU7Z0JBQ2xELFVBQVUsRUFBRSxnQkFBZ0I7YUFDN0IsQ0FBQyxDQUFBO1lBRUYsSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUM7b0JBQ1YsSUFBSSxFQUFFLFdBQVc7b0JBQ2pCLElBQUksRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztvQkFDeEIsU0FBUyxFQUFFLEtBQUssQ0FBQyxJQUFJO29CQUNyQixTQUFTLEVBQUUsS0FBSyxDQUFDLElBQUk7b0JBQ3JCLFdBQVcsRUFBRSxLQUFLLENBQUMsTUFBTTtvQkFDekIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxNQUFNO2lCQUN0QixDQUFDLENBQUE7WUFDSixDQUFDO1lBRUQsU0FBUTtRQUNWLENBQUM7UUFFRCxJQUFJLG9CQUFvQixFQUFFLENBQUM7WUFDekIsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLGdCQUFnQixDQUFDLE1BQU0sRUFBRTtnQkFDdEQsVUFBVSxFQUFFLG9CQUFvQjthQUNqQyxDQUFDLENBQUE7WUFFRixLQUFLLE1BQU0sS0FBSyxJQUFJLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sQ0FBQyxJQUFJLENBQUM7b0JBQ1YsSUFBSSxFQUFFLGlCQUFpQjtvQkFDdkIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO29CQUN4QixTQUFTLEVBQUUsS0FBSyxDQUFDLElBQUk7b0JBQ3JCLFNBQVMsRUFBRSxHQUFHLENBQUMsTUFBTTtvQkFDckIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO29CQUN0QixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87aUJBQ3ZCLENBQUMsQ0FBQTtZQUNKLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgQXJyYXlGaWVsZCxcbiAgR2VvanNvbkZpZWxkLFxuICBPYmplY3RGaWVsZCxcbn0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0IHsgaW5zcGVjdEpzb25WYWx1ZSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB0eXBlIHsgQ2VsbEVycm9yIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0ICogYXMgcGwgZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tIFwiLi4vLi4vaGVscGVycy50c1wiXG5pbXBvcnQgdHlwZSB7IFRhYmxlIH0gZnJvbSBcIi4uLy4uL3RhYmxlL2luZGV4LnRzXCJcblxuLy8gVE9ETzogSW1wcm92ZSB0aGUgaW1wbGVtZW50YXRpb25cbi8vIE1ha2UgdW5ibG9ja2luZyAvIGhhbmRsZSBsYXJnZSBkYXRhIC8gcHJvY2VzcyBpbiBwYXJhbGxlbCAvIG1vdmUgcHJvY2Vzc2luZyB0byBSdXN0P1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zcGVjdEpzb25GaWVsZChcbiAgZmllbGQ6IEFycmF5RmllbGQgfCBHZW9qc29uRmllbGQgfCBPYmplY3RGaWVsZCxcbiAgdGFibGU6IFRhYmxlLFxuICBvcHRpb25zPzoge1xuICAgIGZvcm1hdEpzb25TY2hlbWE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gIH0sXG4pIHtcbiAgY29uc3QgZXJyb3JzOiBDZWxsRXJyb3JbXSA9IFtdXG5cbiAgY29uc3QgZm9ybWF0SnNvblNjaGVtYSA9IG9wdGlvbnM/LmZvcm1hdEpzb25TY2hlbWFcbiAgY29uc3QgY29uc3RyYWludEpzb25TY2hlbWEgPSBmaWVsZC5jb25zdHJhaW50cz8uanNvblNjaGVtYVxuXG4gIGNvbnN0IGZyYW1lID0gYXdhaXQgdGFibGVcbiAgICAud2l0aFJvd0NvdW50KClcbiAgICAuc2VsZWN0KFxuICAgICAgcGwucGwuY29sKFwicm93X25yXCIpLmFkZCgxKS5hbGlhcyhcIm51bWJlclwiKSxcbiAgICAgIHBsLnBsLmNvbChmaWVsZC5uYW1lKS5hbGlhcyhcInNvdXJjZVwiKSxcbiAgICApXG4gICAgLmNvbGxlY3QoKVxuXG4gIGZvciAoY29uc3Qgcm93IG9mIGZyYW1lLnRvUmVjb3JkcygpIGFzIGFueVtdKSB7XG4gICAgaWYgKHJvdy5zb3VyY2UgPT09IG51bGwpIGNvbnRpbnVlXG5cbiAgICBsZXQgdGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkXG4gICAgY29uc3QgY2hlY2tDb21wYXQgPSBmaWVsZC50eXBlID09PSBcImFycmF5XCIgPyBBcnJheS5pc0FycmF5IDogaXNPYmplY3RcblxuICAgIHRyeSB7XG4gICAgICB0YXJnZXQgPSBKU09OLnBhcnNlKHJvdy5zb3VyY2UpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHt9XG5cbiAgICBpZiAoIXRhcmdldCB8fCAhY2hlY2tDb21wYXQodGFyZ2V0KSkge1xuICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICB0eXBlOiBcImNlbGwvdHlwZVwiLFxuICAgICAgICBjZWxsOiBTdHJpbmcocm93LnNvdXJjZSksXG4gICAgICAgIGZpZWxkTmFtZTogZmllbGQubmFtZSxcbiAgICAgICAgZmllbGRUeXBlOiBmaWVsZC50eXBlLFxuICAgICAgICBmaWVsZEZvcm1hdDogZmllbGQuZm9ybWF0LFxuICAgICAgICByb3dOdW1iZXI6IHJvdy5udW1iZXIsXG4gICAgICB9KVxuXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChmb3JtYXRKc29uU2NoZW1hKSB7XG4gICAgICBjb25zdCBmb3JtYXRFcnJvcnMgPSBhd2FpdCBpbnNwZWN0SnNvblZhbHVlKHRhcmdldCwge1xuICAgICAgICBqc29uU2NoZW1hOiBmb3JtYXRKc29uU2NoZW1hLFxuICAgICAgfSlcblxuICAgICAgaWYgKGZvcm1hdEVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgIHR5cGU6IFwiY2VsbC90eXBlXCIsXG4gICAgICAgICAgY2VsbDogU3RyaW5nKHJvdy5zb3VyY2UpLFxuICAgICAgICAgIGZpZWxkTmFtZTogZmllbGQubmFtZSxcbiAgICAgICAgICBmaWVsZFR5cGU6IGZpZWxkLnR5cGUsXG4gICAgICAgICAgZmllbGRGb3JtYXQ6IGZpZWxkLmZvcm1hdCxcbiAgICAgICAgICByb3dOdW1iZXI6IHJvdy5udW1iZXIsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKGNvbnN0cmFpbnRKc29uU2NoZW1hKSB7XG4gICAgICBjb25zdCBjb25zdHJhaW50RXJyb3JzID0gYXdhaXQgaW5zcGVjdEpzb25WYWx1ZSh0YXJnZXQsIHtcbiAgICAgICAganNvblNjaGVtYTogY29uc3RyYWludEpzb25TY2hlbWEsXG4gICAgICB9KVxuXG4gICAgICBmb3IgKGNvbnN0IGVycm9yIG9mIGNvbnN0cmFpbnRFcnJvcnMpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgIHR5cGU6IFwiY2VsbC9qc29uU2NoZW1hXCIsXG4gICAgICAgICAgY2VsbDogU3RyaW5nKHJvdy5zb3VyY2UpLFxuICAgICAgICAgIGZpZWxkTmFtZTogZmllbGQubmFtZSxcbiAgICAgICAgICByb3dOdW1iZXI6IHJvdy5udW1iZXIsXG4gICAgICAgICAgcG9pbnRlcjogZXJyb3IucG9pbnRlcixcbiAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlcnJvcnNcbn1cbiJdfQ==
@@ -0,0 +1,4 @@
1
+ import type { ListField } from "@frictionless-ts/metadata";
2
+ import * as pl from "nodejs-polars";
3
+ export declare function parseListField(field: ListField, fieldExpr: pl.Expr): pl.Expr;
4
+ export declare function stringifyListField(field: ListField, fieldExpr: pl.Expr): pl.Expr;
@@ -0,0 +1,30 @@
1
+ import * as pl from "nodejs-polars";
2
+ // TODO:
3
+ // Add more validation:
4
+ // - Return null instead of list if all array values are nulls?
5
+ export function parseListField(field, fieldExpr) {
6
+ const delimiter = field.delimiter ?? ",";
7
+ const itemType = field.itemType;
8
+ let dtype = pl.String;
9
+ if (itemType === "integer")
10
+ dtype = pl.Int64;
11
+ if (itemType === "number")
12
+ dtype = pl.Float64;
13
+ if (itemType === "boolean")
14
+ dtype = pl.Bool;
15
+ if (itemType === "datetime")
16
+ dtype = pl.Datetime;
17
+ if (itemType === "date")
18
+ dtype = pl.Date;
19
+ if (itemType === "time")
20
+ dtype = pl.Time;
21
+ fieldExpr = fieldExpr.str.split(delimiter).cast(pl.List(dtype));
22
+ return fieldExpr;
23
+ }
24
+ export function stringifyListField(field, fieldExpr) {
25
+ const delimiter = field.delimiter ?? ",";
26
+ return fieldExpr
27
+ .cast(pl.List(pl.String))
28
+ .lst.join({ separator: delimiter, ignoreNulls: true });
29
+ }
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2ZpZWxkL3R5cGVzL2xpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFbkMsUUFBUTtBQUNSLHVCQUF1QjtBQUN2QiwrREFBK0Q7QUFDL0QsTUFBTSxVQUFVLGNBQWMsQ0FBQyxLQUFnQixFQUFFLFNBQWtCO0lBQ2pFLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLElBQUksR0FBRyxDQUFBO0lBQ3hDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUE7SUFFL0IsSUFBSSxLQUFLLEdBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQTtJQUMxQixJQUFJLFFBQVEsS0FBSyxTQUFTO1FBQUUsS0FBSyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUE7SUFDNUMsSUFBSSxRQUFRLEtBQUssUUFBUTtRQUFFLEtBQUssR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFBO0lBQzdDLElBQUksUUFBUSxLQUFLLFNBQVM7UUFBRSxLQUFLLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQTtJQUMzQyxJQUFJLFFBQVEsS0FBSyxVQUFVO1FBQUUsS0FBSyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUE7SUFDaEQsSUFBSSxRQUFRLEtBQUssTUFBTTtRQUFFLEtBQUssR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFBO0lBQ3hDLElBQUksUUFBUSxLQUFLLE1BQU07UUFBRSxLQUFLLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQTtJQUV4QyxTQUFTLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUUvRCxPQUFPLFNBQVMsQ0FBQTtBQUNsQixDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQWdCLEVBQUUsU0FBa0I7SUFDckUsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUE7SUFFeEMsT0FBTyxTQUFTO1NBQ2IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3hCLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0FBQzFELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IExpc3RGaWVsZCB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCAqIGFzIHBsIGZyb20gXCJub2RlanMtcG9sYXJzXCJcblxuLy8gVE9ETzpcbi8vIEFkZCBtb3JlIHZhbGlkYXRpb246XG4vLyAtIFJldHVybiBudWxsIGluc3RlYWQgb2YgbGlzdCBpZiBhbGwgYXJyYXkgdmFsdWVzIGFyZSBudWxscz9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxpc3RGaWVsZChmaWVsZDogTGlzdEZpZWxkLCBmaWVsZEV4cHI6IHBsLkV4cHIpIHtcbiAgY29uc3QgZGVsaW1pdGVyID0gZmllbGQuZGVsaW1pdGVyID8/IFwiLFwiXG4gIGNvbnN0IGl0ZW1UeXBlID0gZmllbGQuaXRlbVR5cGVcblxuICBsZXQgZHR5cGU6IGFueSA9IHBsLlN0cmluZ1xuICBpZiAoaXRlbVR5cGUgPT09IFwiaW50ZWdlclwiKSBkdHlwZSA9IHBsLkludDY0XG4gIGlmIChpdGVtVHlwZSA9PT0gXCJudW1iZXJcIikgZHR5cGUgPSBwbC5GbG9hdDY0XG4gIGlmIChpdGVtVHlwZSA9PT0gXCJib29sZWFuXCIpIGR0eXBlID0gcGwuQm9vbFxuICBpZiAoaXRlbVR5cGUgPT09IFwiZGF0ZXRpbWVcIikgZHR5cGUgPSBwbC5EYXRldGltZVxuICBpZiAoaXRlbVR5cGUgPT09IFwiZGF0ZVwiKSBkdHlwZSA9IHBsLkRhdGVcbiAgaWYgKGl0ZW1UeXBlID09PSBcInRpbWVcIikgZHR5cGUgPSBwbC5UaW1lXG5cbiAgZmllbGRFeHByID0gZmllbGRFeHByLnN0ci5zcGxpdChkZWxpbWl0ZXIpLmNhc3QocGwuTGlzdChkdHlwZSkpXG5cbiAgcmV0dXJuIGZpZWxkRXhwclxufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5TGlzdEZpZWxkKGZpZWxkOiBMaXN0RmllbGQsIGZpZWxkRXhwcjogcGwuRXhwcikge1xuICBjb25zdCBkZWxpbWl0ZXIgPSBmaWVsZC5kZWxpbWl0ZXIgPz8gXCIsXCJcblxuICByZXR1cm4gZmllbGRFeHByXG4gICAgLmNhc3QocGwuTGlzdChwbC5TdHJpbmcpKVxuICAgIC5sc3Quam9pbih7IHNlcGFyYXRvcjogZGVsaW1pdGVyLCBpZ25vcmVOdWxsczogdHJ1ZSB9KVxufVxuIl19
@@ -0,0 +1 @@
1
+ export {};