@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,358 @@
1
+ import * as pl from "nodejs-polars";
2
+ import { describe, expect, it } from "vitest";
3
+ import { inspectTable } from "../../table/index.js";
4
+ describe("validateArrayField", () => {
5
+ it("should not errors for valid JSON arrays", async () => {
6
+ const table = pl
7
+ .DataFrame({
8
+ tags: ['["tag1","tag2"]', "[1,2,3]", '["a","b","c"]'],
9
+ })
10
+ .lazy();
11
+ const schema = {
12
+ fields: [
13
+ {
14
+ name: "tags",
15
+ type: "array",
16
+ },
17
+ ],
18
+ };
19
+ const errors = await inspectTable(table, { schema });
20
+ expect(errors).toHaveLength(0);
21
+ });
22
+ it("should not errors for empty arrays", async () => {
23
+ const table = pl
24
+ .DataFrame({
25
+ items: ["[]", "[]", "[]"],
26
+ })
27
+ .lazy();
28
+ const schema = {
29
+ fields: [
30
+ {
31
+ name: "items",
32
+ type: "array",
33
+ },
34
+ ],
35
+ };
36
+ const errors = await inspectTable(table, { schema });
37
+ expect(errors).toHaveLength(0);
38
+ });
39
+ it("should not errors for null values", async () => {
40
+ const table = pl
41
+ .DataFrame({
42
+ data: ['["value"]', null, "[1,2,3]"],
43
+ })
44
+ .lazy();
45
+ const schema = {
46
+ fields: [
47
+ {
48
+ name: "data",
49
+ type: "array",
50
+ },
51
+ ],
52
+ };
53
+ const errors = await inspectTable(table, { schema });
54
+ expect(errors).toHaveLength(0);
55
+ });
56
+ it("should errors for JSON objects", async () => {
57
+ const table = pl
58
+ .DataFrame({
59
+ data: ["[1,2,3]", '{"key":"value"}', '["a","b"]'],
60
+ })
61
+ .lazy();
62
+ const schema = {
63
+ fields: [
64
+ {
65
+ name: "data",
66
+ type: "array",
67
+ },
68
+ ],
69
+ };
70
+ const errors = await inspectTable(table, { schema });
71
+ expect(errors).toEqual([
72
+ {
73
+ type: "cell/type",
74
+ fieldName: "data",
75
+ fieldType: "array",
76
+ rowNumber: 2,
77
+ cell: '{"key":"value"}',
78
+ },
79
+ ]);
80
+ });
81
+ it("should errors for invalid JSON", async () => {
82
+ const table = pl
83
+ .DataFrame({
84
+ data: ['["valid"]', "invalid json", "[1,2,3]", "[broken"],
85
+ })
86
+ .lazy();
87
+ const schema = {
88
+ fields: [
89
+ {
90
+ name: "data",
91
+ type: "array",
92
+ },
93
+ ],
94
+ };
95
+ const errors = await inspectTable(table, { schema });
96
+ expect(errors.filter(e => e.type === "cell/type")).toHaveLength(2);
97
+ expect(errors).toContainEqual({
98
+ type: "cell/type",
99
+ fieldName: "data",
100
+ fieldType: "array",
101
+ rowNumber: 2,
102
+ cell: "invalid json",
103
+ });
104
+ expect(errors).toContainEqual({
105
+ type: "cell/type",
106
+ fieldName: "data",
107
+ fieldType: "array",
108
+ rowNumber: 4,
109
+ cell: "[broken",
110
+ });
111
+ });
112
+ it("should handle nested arrays", async () => {
113
+ const table = pl
114
+ .DataFrame({
115
+ matrix: ["[[1,2],[3,4]]", "[[5,6],[7,8]]", '[["a","b"],["c","d"]]'],
116
+ })
117
+ .lazy();
118
+ const schema = {
119
+ fields: [
120
+ {
121
+ name: "matrix",
122
+ type: "array",
123
+ },
124
+ ],
125
+ };
126
+ const errors = await inspectTable(table, { schema });
127
+ expect(errors).toHaveLength(0);
128
+ });
129
+ it("should errors for empty strings", async () => {
130
+ const table = pl
131
+ .DataFrame({
132
+ data: ['["valid"]', "", "[1,2,3]"],
133
+ })
134
+ .lazy();
135
+ const schema = {
136
+ fields: [
137
+ {
138
+ name: "data",
139
+ type: "array",
140
+ },
141
+ ],
142
+ };
143
+ const errors = await inspectTable(table, { schema });
144
+ expect(errors).toEqual([
145
+ {
146
+ type: "cell/type",
147
+ fieldName: "data",
148
+ fieldType: "array",
149
+ rowNumber: 2,
150
+ cell: "",
151
+ },
152
+ ]);
153
+ });
154
+ it("should errors for JSON primitives", async () => {
155
+ const table = pl
156
+ .DataFrame({
157
+ data: ['"string"', "123", "true", "false", "null"],
158
+ })
159
+ .lazy();
160
+ const schema = {
161
+ fields: [
162
+ {
163
+ name: "data",
164
+ type: "array",
165
+ },
166
+ ],
167
+ };
168
+ const errors = await inspectTable(table, { schema });
169
+ expect(errors).toEqual([
170
+ {
171
+ type: "cell/type",
172
+ fieldName: "data",
173
+ fieldType: "array",
174
+ rowNumber: 1,
175
+ cell: '"string"',
176
+ },
177
+ {
178
+ type: "cell/type",
179
+ fieldName: "data",
180
+ fieldType: "array",
181
+ rowNumber: 2,
182
+ cell: "123",
183
+ },
184
+ {
185
+ type: "cell/type",
186
+ fieldName: "data",
187
+ fieldType: "array",
188
+ rowNumber: 3,
189
+ cell: "true",
190
+ },
191
+ {
192
+ type: "cell/type",
193
+ fieldName: "data",
194
+ fieldType: "array",
195
+ rowNumber: 4,
196
+ cell: "false",
197
+ },
198
+ {
199
+ type: "cell/type",
200
+ fieldName: "data",
201
+ fieldType: "array",
202
+ rowNumber: 5,
203
+ cell: "null",
204
+ },
205
+ ]);
206
+ });
207
+ it("should not errors for arrays matching jsonSchema", async () => {
208
+ const table = pl
209
+ .DataFrame({
210
+ scores: ["[80,90,100]", "[75,85,95]", "[90,95,100]"],
211
+ })
212
+ .lazy();
213
+ const schema = {
214
+ fields: [
215
+ {
216
+ name: "scores",
217
+ type: "array",
218
+ constraints: {
219
+ jsonSchema: {
220
+ type: "array",
221
+ items: { type: "number" },
222
+ minItems: 3,
223
+ maxItems: 3,
224
+ },
225
+ },
226
+ },
227
+ ],
228
+ };
229
+ const errors = await inspectTable(table, { schema });
230
+ expect(errors).toHaveLength(0);
231
+ });
232
+ it("should errors for arrays not matching jsonSchema", async () => {
233
+ const jsonSchema = {
234
+ type: "array",
235
+ items: { type: "number" },
236
+ minItems: 2,
237
+ };
238
+ const table = pl
239
+ .DataFrame({
240
+ numbers: ["[1,2,3]", '["not","numbers"]', "[1]", "[4,5,6]"],
241
+ })
242
+ .lazy();
243
+ const schema = {
244
+ fields: [
245
+ {
246
+ name: "numbers",
247
+ type: "array",
248
+ constraints: {
249
+ jsonSchema,
250
+ },
251
+ },
252
+ ],
253
+ };
254
+ const errors = await inspectTable(table, { schema });
255
+ expect(errors.filter(e => e.type === "cell/jsonSchema")).toEqual([
256
+ {
257
+ type: "cell/jsonSchema",
258
+ fieldName: "numbers",
259
+ rowNumber: 2,
260
+ cell: '["not","numbers"]',
261
+ pointer: "/0",
262
+ message: "must be number",
263
+ },
264
+ {
265
+ type: "cell/jsonSchema",
266
+ fieldName: "numbers",
267
+ rowNumber: 2,
268
+ cell: '["not","numbers"]',
269
+ pointer: "/1",
270
+ message: "must be number",
271
+ },
272
+ {
273
+ type: "cell/jsonSchema",
274
+ fieldName: "numbers",
275
+ rowNumber: 3,
276
+ cell: "[1]",
277
+ pointer: "",
278
+ message: "must NOT have fewer than 2 items",
279
+ },
280
+ ]);
281
+ });
282
+ it("should validate complex jsonSchema with array of objects", async () => {
283
+ const table = pl
284
+ .DataFrame({
285
+ users: [
286
+ '[{"name":"John","age":30},{"name":"Jane","age":25}]',
287
+ '[{"name":"Bob","age":"invalid"}]',
288
+ ],
289
+ })
290
+ .lazy();
291
+ const schema = {
292
+ fields: [
293
+ {
294
+ name: "users",
295
+ type: "array",
296
+ constraints: {
297
+ jsonSchema: {
298
+ type: "array",
299
+ items: {
300
+ type: "object",
301
+ properties: {
302
+ name: { type: "string" },
303
+ age: { type: "number" },
304
+ },
305
+ required: ["name", "age"],
306
+ },
307
+ },
308
+ },
309
+ },
310
+ ],
311
+ };
312
+ const errors = await inspectTable(table, { schema });
313
+ expect(errors).toEqual([
314
+ {
315
+ type: "cell/jsonSchema",
316
+ fieldName: "users",
317
+ rowNumber: 2,
318
+ cell: '[{"name":"Bob","age":"invalid"}]',
319
+ pointer: "/0/age",
320
+ message: "must be number",
321
+ },
322
+ ]);
323
+ });
324
+ it("should validate jsonSchema with unique items constraint", async () => {
325
+ const table = pl
326
+ .DataFrame({
327
+ tags: ['["unique","values"]', '["duplicate","duplicate"]'],
328
+ })
329
+ .lazy();
330
+ const schema = {
331
+ fields: [
332
+ {
333
+ name: "tags",
334
+ type: "array",
335
+ constraints: {
336
+ jsonSchema: {
337
+ type: "array",
338
+ items: { type: "string" },
339
+ uniqueItems: true,
340
+ },
341
+ },
342
+ },
343
+ ],
344
+ };
345
+ const errors = await inspectTable(table, { schema });
346
+ expect(errors).toEqual([
347
+ {
348
+ type: "cell/jsonSchema",
349
+ fieldName: "tags",
350
+ rowNumber: 2,
351
+ cell: '["duplicate","duplicate"]',
352
+ pointer: "",
353
+ message: "must NOT have duplicate items (items ## 1 and 0 are identical)",
354
+ },
355
+ ]);
356
+ });
357
+ });
358
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXkuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2ZpZWxkL3R5cGVzL2FycmF5LnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDbkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUVuRCxRQUFRLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFO0lBQ2xDLEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN2RCxNQUFNLEtBQUssR0FBRyxFQUFFO2FBQ2IsU0FBUyxDQUFDO1lBQ1QsSUFBSSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLGVBQWUsQ0FBQztTQUN0RCxDQUFDO2FBQ0QsSUFBSSxFQUFFLENBQUE7UUFFVCxNQUFNLE1BQU0sR0FBVztZQUNyQixNQUFNLEVBQUU7Z0JBQ047b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLE9BQU87aUJBQ2Q7YUFDRjtTQUNGLENBQUE7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFlBQVksQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFBO1FBQ3BELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDaEMsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsb0NBQW9DLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbEQsTUFBTSxLQUFLLEdBQUcsRUFBRTthQUNiLFNBQVMsQ0FBQztZQUNULEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO1NBQzFCLENBQUM7YUFDRCxJQUFJLEVBQUUsQ0FBQTtRQUVULE1BQU0sTUFBTSxH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bmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0ICogYXMgcGwgZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IGluc3BlY3RUYWJsZSB9IGZyb20gXCIuLi8uLi90YWJsZS9pbmRleC50c1wiXG5cbmRlc2NyaWJlKFwidmFsaWRhdGVBcnJheUZpZWxkXCIsICgpID0+IHtcbiAgaXQoXCJzaG91bGQgbm90IGVycm9ycyBmb3IgdmFsaWQgSlNPTiBhcnJheXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICB0YWdzOiBbJ1tcInRhZzFcIixcInRhZzJcIl0nLCBcIlsxLDIsM11cIiwgJ1tcImFcIixcImJcIixcImNcIl0nXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJ0YWdzXCIsXG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgZXhwZWN0KGVycm9ycykudG9IYXZlTGVuZ3RoKDApXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgbm90IGVycm9ycyBmb3IgZW1wdHkgYXJyYXlzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgaXRlbXM6IFtcIltdXCIsIFwiW11cIiwgXCJbXVwiXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJpdGVtc1wiLFxuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgaW5zcGVjdFRhYmxlKHRhYmxlLCB7IHNjaGVtYSB9KVxuICAgIGV4cGVjdChlcnJvcnMpLnRvSGF2ZUxlbmd0aCgwKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIG5vdCBlcnJvcnMgZm9yIG51bGwgdmFsdWVzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgZGF0YTogWydbXCJ2YWx1ZVwiXScsIG51bGwsIFwiWzEsMiwzXVwiXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJkYXRhXCIsXG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgZXhwZWN0KGVycm9ycykudG9IYXZlTGVuZ3RoKDApXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgZXJyb3JzIGZvciBKU09OIG9iamVjdHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBkYXRhOiBbXCJbMSwyLDNdXCIsICd7XCJrZXlcIjpcInZhbHVlXCJ9JywgJ1tcImFcIixcImJcIl0nXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJkYXRhXCIsXG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgZXhwZWN0KGVycm9ycykudG9FcXVhbChbXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiY2VsbC90eXBlXCIsXG4gICAgICAgIGZpZWxkTmFtZTogXCJkYXRhXCIsXG4gICAgICAgIGZpZWxkVHlwZTogXCJhcnJheVwiLFxuICAgICAgICByb3dOdW1iZXI6IDIsXG4gICAgICAgIGNlbGw6ICd7XCJrZXlcIjpcInZhbHVlXCJ9JyxcbiAgICAgIH0sXG4gICAgXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBlcnJvcnMgZm9yIGludmFsaWQgSlNPTlwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIGRhdGE6IFsnW1widmFsaWRcIl0nLCBcImludmFsaWQganNvblwiLCBcIlsxLDIsM11cIiwgXCJbYnJva2VuXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImRhdGFcIixcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICBleHBlY3QoZXJyb3JzLmZpbHRlcihlID0+IGUudHlwZSA9PT0gXCJjZWxsL3R5cGVcIikpLnRvSGF2ZUxlbmd0aCgyKVxuICAgIGV4cGVjdChlcnJvcnMpLnRvQ29udGFpbkVxdWFsKHtcbiAgICAgIHR5cGU6IFwiY2VsbC90eXBlXCIsXG4gICAgICBmaWVsZE5hbWU6IFwiZGF0YVwiLFxuICAgICAgZmllbGRUeXBlOiBcImFycmF5XCIsXG4gICAgICByb3dOdW1iZXI6IDIsXG4gICAgICBjZWxsOiBcImludmFsaWQganNvblwiLFxuICAgIH0pXG4gICAgZXhwZWN0KGVycm9ycykudG9Db250YWluRXF1YWwoe1xuICAgICAgdHlwZTogXCJjZWxsL3R5cGVcIixcbiAgICAgIGZpZWxkTmFtZTogXCJkYXRhXCIsXG4gICAgICBmaWVsZFR5cGU6IFwiYXJyYXlcIixcbiAgICAgIHJvd051bWJlcjogNCxcbiAgICAgIGNlbGw6IFwiW2Jyb2tlblwiLFxuICAgIH0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIG5lc3RlZCBhcnJheXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBtYXRyaXg6IFtcIltbMSwyXSxbMyw0XV1cIiwgXCJbWzUsNl0sWzcsOF1dXCIsICdbW1wiYVwiLFwiYlwiXSxbXCJjXCIsXCJkXCJdXSddLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcIm1hdHJpeFwiLFxuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgaW5zcGVjdFRhYmxlKHRhYmxlLCB7IHNjaGVtYSB9KVxuICAgIGV4cGVjdChlcnJvcnMpLnRvSGF2ZUxlbmd0aCgwKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGVycm9ycyBmb3IgZW1wdHkgc3RyaW5nc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIGRhdGE6IFsnW1widmFsaWRcIl0nLCBcIlwiLCBcIlsxLDIsM11cIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiZGF0YVwiLFxuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgaW5zcGVjdFRhYmxlKHRhYmxlLCB7IHNjaGVtYSB9KVxuICAgIGV4cGVjdChlcnJvcnMpLnRvRXF1YWwoW1xuICAgICAge1xuICAgICAgICB0eXBlOiBcImNlbGwvdHlwZVwiLFxuICAgICAgICBmaWVsZE5hbWU6IFwiZGF0YVwiLFxuICAgICAgICBmaWVsZFR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgcm93TnVtYmVyOiAyLFxuICAgICAgICBjZWxsOiBcIlwiLFxuICAgICAgfSxcbiAgICBdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGVycm9ycyBmb3IgSlNPTiBwcmltaXRpdmVzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgZGF0YTogWydcInN0cmluZ1wiJywgXCIxMjNcIiwgXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJudWxsXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImRhdGFcIixcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICBleHBlY3QoZXJyb3JzKS50b0VxdWFsKFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJjZWxsL3R5cGVcIixcbiAgICAgICAgZmllbGROYW1lOiBcImRhdGFcIixcbiAgICAgICAgZmllbGRUeXBlOiBcImFycmF5XCIsXG4gICAgICAgIHJvd051bWJlcjogMSxcbiAgICAgICAgY2VsbDogJ1wic3RyaW5nXCInLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJjZWxsL3R5cGVcIixcbiAgICAgICAgZmllbGROYW1lOiBcImRhdGFcIixcbiAgICAgICAgZmllbGRUeXBlOiBcImFycmF5XCIsXG4gICAgICAgIHJvd051bWJlcjogMixcbiAgICAgICAgY2VsbDogXCIxMjNcIixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiY2VsbC90eXBlXCIsXG4gICAgICAgIGZpZWxkTmFtZTogXCJkYXRhXCIsXG4gICAgICAgIGZpZWxkVHlwZTogXCJhcnJheVwiLFxuICAgICAgICByb3dOdW1iZXI6IDMsXG4gICAgICAgIGNlbGw6IFwidHJ1ZVwiLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJjZWxsL3R5cGVcIixcbiAgICAgICAgZmllbGROYW1lOiBcImRhdGFcIixcbiAgICAgICAgZmllbGRUeXBlOiBcImFycmF5XCIsXG4gICAgICAgIHJvd051bWJlcjogNCxcbiAgICAgICAgY2VsbDogXCJmYWxzZVwiLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJjZWxsL3R5cGVcIixcbiAgICAgICAgZmllbGROYW1lOiBcImRhdGFcIixcbiAgICAgICAgZmllbGRUeXBlOiBcImFycmF5XCIsXG4gICAgICAgIHJvd051bWJlcjogNSxcbiAgICAgICAgY2VsbDogXCJudWxsXCIsXG4gICAgICB9LFxuICAgIF0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgbm90IGVycm9ycyBmb3IgYXJyYXlzIG1hdGNoaW5nIGpzb25TY2hlbWFcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBzY29yZXM6IFtcIls4MCw5MCwxMDBdXCIsIFwiWzc1LDg1LDk1XVwiLCBcIls5MCw5NSwxMDBdXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInNjb3Jlc1wiLFxuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBjb25zdHJhaW50czoge1xuICAgICAgICAgICAganNvblNjaGVtYToge1xuICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgICAgIGl0ZW1zOiB7IHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgICAgICAgICAgbWluSXRlbXM6IDMsXG4gICAgICAgICAgICAgIG1heEl0ZW1zOiAzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgZXhwZWN0KGVycm9ycykudG9IYXZlTGVuZ3RoKDApXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgZXJyb3JzIGZvciBhcnJheXMgbm90IG1hdGNoaW5nIGpzb25TY2hlbWFcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGpzb25TY2hlbWEgPSB7XG4gICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICBpdGVtczogeyB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICBtaW5JdGVtczogMixcbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgbnVtYmVyczogW1wiWzEsMiwzXVwiLCAnW1wibm90XCIsXCJudW1iZXJzXCJdJywgXCJbMV1cIiwgXCJbNCw1LDZdXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcIm51bWJlcnNcIixcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgY29uc3RyYWludHM6IHtcbiAgICAgICAgICAgIGpzb25TY2hlbWEsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgaW5zcGVjdFRhYmxlKHRhYmxlLCB7IHNjaGVtYSB9KVxuICAgIGV4cGVjdChlcnJvcnMuZmlsdGVyKGUgPT4gZS50eXBlID09PSBcImNlbGwvanNvblNjaGVtYVwiKSkudG9FcXVhbChbXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiY2VsbC9qc29uU2NoZW1hXCIsXG4gICAgICAgIGZpZWxkTmFtZTogXCJudW1iZXJzXCIsXG4gICAgICAgIHJvd051bWJlcjogMixcbiAgICAgICAgY2VsbDogJ1tcIm5vdFwiLFwibnVtYmVyc1wiXScsXG4gICAgICAgIHBvaW50ZXI6IFwiLzBcIixcbiAgICAgICAgbWVzc2FnZTogXCJtdXN0IGJlIG51bWJlclwiLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJjZWxsL2pzb25TY2hlbWFcIixcbiAgICAgICAgZmllbGROYW1lOiBcIm51bWJlcnNcIixcbiAgICAgICAgcm93TnVtYmVyOiAyLFxuICAgICAgICBjZWxsOiAnW1wibm90XCIsXCJudW1iZXJzXCJdJyxcbiAgICAgICAgcG9pbnRlcjogXCIvMVwiLFxuICAgICAgICBtZXNzYWdlOiBcIm11c3QgYmUgbnVtYmVyXCIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0eXBlOiBcImNlbGwvanNvblNjaGVtYVwiLFxuICAgICAgICBmaWVsZE5hbWU6IFwibnVtYmVyc1wiLFxuICAgICAgICByb3dOdW1iZXI6IDMsXG4gICAgICAgIGNlbGw6IFwiWzFdXCIsXG4gICAgICAgIHBvaW50ZXI6IFwiXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwibXVzdCBOT1QgaGF2ZSBmZXdlciB0aGFuIDIgaXRlbXNcIixcbiAgICAgIH0sXG4gICAgXSlcbiAgfSlcblxuICBpdChcInNob3VsZCB2YWxpZGF0ZSBjb21wbGV4IGpzb25TY2hlbWEgd2l0aCBhcnJheSBvZiBvYmplY3RzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgdXNlcnM6IFtcbiAgICAgICAgICAnW3tcIm5hbWVcIjpcIkpvaG5cIixcImFnZVwiOjMwfSx7XCJuYW1lXCI6XCJKYW5lXCIsXCJhZ2VcIjoyNX1dJyxcbiAgICAgICAgICAnW3tcIm5hbWVcIjpcIkJvYlwiLFwiYWdlXCI6XCJpbnZhbGlkXCJ9XScsXG4gICAgICAgIF0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwidXNlcnNcIixcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgY29uc3RyYWludHM6IHtcbiAgICAgICAgICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgICBpdGVtczoge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgbmFtZTogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgICBhZ2U6IHsgdHlwZTogXCJudW1iZXJcIiB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IFtcIm5hbWVcIiwgXCJhZ2VcIl0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICBleHBlY3QoZXJyb3JzKS50b0VxdWFsKFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJjZWxsL2pzb25TY2hlbWFcIixcbiAgICAgICAgZmllbGROYW1lOiBcInVzZXJzXCIsXG4gICAgICAgIHJvd051bWJlcjogMixcbiAgICAgICAgY2VsbDogJ1t7XCJuYW1lXCI6XCJCb2JcIixcImFnZVwiOlwiaW52YWxpZFwifV0nLFxuICAgICAgICBwb2ludGVyOiBcIi8wL2FnZVwiLFxuICAgICAgICBtZXNzYWdlOiBcIm11c3QgYmUgbnVtYmVyXCIsXG4gICAgICB9LFxuICAgIF0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgdmFsaWRhdGUganNvblNjaGVtYSB3aXRoIHVuaXF1ZSBpdGVtcyBjb25zdHJhaW50XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgdGFnczogWydbXCJ1bmlxdWVcIixcInZhbHVlc1wiXScsICdbXCJkdXBsaWNhdGVcIixcImR1cGxpY2F0ZVwiXSddLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInRhZ3NcIixcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgY29uc3RyYWludHM6IHtcbiAgICAgICAgICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgICBpdGVtczogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgIHVuaXF1ZUl0ZW1zOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgZXhwZWN0KGVycm9ycykudG9FcXVhbChbXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiY2VsbC9qc29uU2NoZW1hXCIsXG4gICAgICAgIGZpZWxkTmFtZTogXCJ0YWdzXCIsXG4gICAgICAgIHJvd051bWJlcjogMixcbiAgICAgICAgY2VsbDogJ1tcImR1cGxpY2F0ZVwiLFwiZHVwbGljYXRlXCJdJyxcbiAgICAgICAgcG9pbnRlcjogXCJcIixcbiAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICBcIm11c3QgTk9UIGhhdmUgZHVwbGljYXRlIGl0ZW1zIChpdGVtcyAjIyAxIGFuZCAwIGFyZSBpZGVudGljYWwpXCIsXG4gICAgICB9LFxuICAgIF0pXG4gIH0pXG59KVxuIl19
@@ -0,0 +1,4 @@
1
+ import type { BooleanField } from "@frictionless-ts/metadata";
2
+ import * as pl from "nodejs-polars";
3
+ export declare function parseBooleanField(field: BooleanField, fieldExpr: pl.Expr): pl.Expr;
4
+ export declare function stringifyBooleanField(field: BooleanField, fieldExpr: pl.Expr): pl.Expr;
@@ -0,0 +1,31 @@
1
+ import * as pl from "nodejs-polars";
2
+ const DEFAULT_TRUE_VALUES = ["true", "True", "TRUE", "1"];
3
+ const DEFAULT_FALSE_VALUES = ["false", "False", "FALSE", "0"];
4
+ export function parseBooleanField(field, fieldExpr) {
5
+ const trueValues = field.trueValues ?? DEFAULT_TRUE_VALUES;
6
+ const falseValues = field.falseValues ?? DEFAULT_FALSE_VALUES;
7
+ for (const value of trueValues)
8
+ fieldExpr = fieldExpr.replace(value, "1");
9
+ for (const value of falseValues)
10
+ fieldExpr = fieldExpr.replace(value, "0");
11
+ fieldExpr = fieldExpr.cast(pl.Int8);
12
+ return pl
13
+ .when(fieldExpr.eq(1))
14
+ .then(pl.lit(true))
15
+ .when(fieldExpr.eq(0))
16
+ .then(pl.lit(false))
17
+ .otherwise(pl.lit(null))
18
+ .alias(field.name);
19
+ }
20
+ const DEFAULT_TRUE_VALUE = "true";
21
+ const DEFAULT_FALSE_VALUE = "false";
22
+ export function stringifyBooleanField(field, fieldExpr) {
23
+ const trueValue = field.trueValues?.[0] ?? DEFAULT_TRUE_VALUE;
24
+ const falseValue = field.falseValues?.[0] ?? DEFAULT_FALSE_VALUE;
25
+ return pl
26
+ .when(fieldExpr.eq(pl.lit(true)))
27
+ .then(pl.lit(trueValue))
28
+ .otherwise(pl.lit(falseValue))
29
+ .alias(field.name);
30
+ }
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vbGVhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2ZpZWxkL3R5cGVzL2Jvb2xlYW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFbkMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFBO0FBQ3pELE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQTtBQUU3RCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBbUIsRUFBRSxTQUFrQjtJQUN2RSxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxJQUFJLG1CQUFtQixDQUFBO0lBQzFELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLElBQUksb0JBQW9CLENBQUE7SUFFN0QsS0FBSyxNQUFNLEtBQUssSUFBSSxVQUFVO1FBQUUsU0FBUyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFBO0lBQ3pFLEtBQUssTUFBTSxLQUFLLElBQUksV0FBVztRQUFFLFNBQVMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUUxRSxTQUFTLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFbkMsT0FBTyxFQUFFO1NBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDckIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDckIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbkIsU0FBUyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdkIsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUN0QixDQUFDO0FBRUQsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUE7QUFDakMsTUFBTSxtQkFBbUIsR0FBRyxPQUFPLENBQUE7QUFFbkMsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEtBQW1CLEVBQUUsU0FBa0I7SUFDM0UsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLGtCQUFrQixDQUFBO0lBQzdELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxtQkFBbUIsQ0FBQTtJQUVoRSxPQUFPLEVBQUU7U0FDTixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDaEMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDdkIsU0FBUyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDN0IsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUN0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCb29sZWFuRmllbGQgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgKiBhcyBwbCBmcm9tIFwibm9kZWpzLXBvbGFyc1wiXG5cbmNvbnN0IERFRkFVTFRfVFJVRV9WQUxVRVMgPSBbXCJ0cnVlXCIsIFwiVHJ1ZVwiLCBcIlRSVUVcIiwgXCIxXCJdXG5jb25zdCBERUZBVUxUX0ZBTFNFX1ZBTFVFUyA9IFtcImZhbHNlXCIsIFwiRmFsc2VcIiwgXCJGQUxTRVwiLCBcIjBcIl1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQm9vbGVhbkZpZWxkKGZpZWxkOiBCb29sZWFuRmllbGQsIGZpZWxkRXhwcjogcGwuRXhwcikge1xuICBjb25zdCB0cnVlVmFsdWVzID0gZmllbGQudHJ1ZVZhbHVlcyA/PyBERUZBVUxUX1RSVUVfVkFMVUVTXG4gIGNvbnN0IGZhbHNlVmFsdWVzID0gZmllbGQuZmFsc2VWYWx1ZXMgPz8gREVGQVVMVF9GQUxTRV9WQUxVRVNcblxuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHRydWVWYWx1ZXMpIGZpZWxkRXhwciA9IGZpZWxkRXhwci5yZXBsYWNlKHZhbHVlLCBcIjFcIilcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBmYWxzZVZhbHVlcykgZmllbGRFeHByID0gZmllbGRFeHByLnJlcGxhY2UodmFsdWUsIFwiMFwiKVxuXG4gIGZpZWxkRXhwciA9IGZpZWxkRXhwci5jYXN0KHBsLkludDgpXG5cbiAgcmV0dXJuIHBsXG4gICAgLndoZW4oZmllbGRFeHByLmVxKDEpKVxuICAgIC50aGVuKHBsLmxpdCh0cnVlKSlcbiAgICAud2hlbihmaWVsZEV4cHIuZXEoMCkpXG4gICAgLnRoZW4ocGwubGl0KGZhbHNlKSlcbiAgICAub3RoZXJ3aXNlKHBsLmxpdChudWxsKSlcbiAgICAuYWxpYXMoZmllbGQubmFtZSlcbn1cblxuY29uc3QgREVGQVVMVF9UUlVFX1ZBTFVFID0gXCJ0cnVlXCJcbmNvbnN0IERFRkFVTFRfRkFMU0VfVkFMVUUgPSBcImZhbHNlXCJcblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeUJvb2xlYW5GaWVsZChmaWVsZDogQm9vbGVhbkZpZWxkLCBmaWVsZEV4cHI6IHBsLkV4cHIpIHtcbiAgY29uc3QgdHJ1ZVZhbHVlID0gZmllbGQudHJ1ZVZhbHVlcz8uWzBdID8/IERFRkFVTFRfVFJVRV9WQUxVRVxuICBjb25zdCBmYWxzZVZhbHVlID0gZmllbGQuZmFsc2VWYWx1ZXM/LlswXSA/PyBERUZBVUxUX0ZBTFNFX1ZBTFVFXG5cbiAgcmV0dXJuIHBsXG4gICAgLndoZW4oZmllbGRFeHByLmVxKHBsLmxpdCh0cnVlKSkpXG4gICAgLnRoZW4ocGwubGl0KHRydWVWYWx1ZSkpXG4gICAgLm90aGVyd2lzZShwbC5saXQoZmFsc2VWYWx1ZSkpXG4gICAgLmFsaWFzKGZpZWxkLm5hbWUpXG59XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,76 @@
1
+ import * as pl from "nodejs-polars";
2
+ import { describe, expect, it } from "vitest";
3
+ import { normalizeTable } from "../../table/index.js";
4
+ import { denormalizeTable } from "../../table/index.js";
5
+ describe("parseBooleanField", () => {
6
+ it.each([
7
+ // Default true values
8
+ ["true", true, {}],
9
+ ["True", true, {}],
10
+ ["TRUE", true, {}],
11
+ ["1", true, {}],
12
+ // Default false values
13
+ ["false", false, {}],
14
+ ["False", false, {}],
15
+ ["FALSE", false, {}],
16
+ ["0", false, {}],
17
+ // Invalid values
18
+ ["", null, {}],
19
+ ["invalid", null, {}],
20
+ ["truthy", null, {}],
21
+ ["falsy", null, {}],
22
+ ["2", null, {}],
23
+ ["-100", null, {}],
24
+ ["t", null, {}],
25
+ ["f", null, {}],
26
+ ["3.14", null, {}],
27
+ // Custom true values
28
+ ["Y", true, { trueValues: ["Y", "y", "yes"] }],
29
+ ["y", true, { trueValues: ["Y", "y", "yes"] }],
30
+ ["yes", true, { trueValues: ["Y", "y", "yes"] }],
31
+ ["true", null, { trueValues: ["Y", "y", "yes"] }],
32
+ // Custom false values
33
+ ["N", false, { falseValues: ["N", "n", "no"] }],
34
+ ["n", false, { falseValues: ["N", "n", "no"] }],
35
+ ["no", false, { falseValues: ["N", "n", "no"] }],
36
+ ["false", null, { falseValues: ["N", "n", "no"] }],
37
+ // Custom true and false values
38
+ ["oui", true, { trueValues: ["oui", "si"], falseValues: ["non", "no"] }],
39
+ ["si", true, { trueValues: ["oui", "si"], falseValues: ["non", "no"] }],
40
+ ["non", false, { trueValues: ["oui", "si"], falseValues: ["non", "no"] }],
41
+ ["no", false, { trueValues: ["oui", "si"], falseValues: ["non", "no"] }],
42
+ ])("%s -> %s %o", async (cell, value, options) => {
43
+ const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
44
+ const schema = {
45
+ fields: [{ name: "name", type: "boolean", ...options }],
46
+ };
47
+ const result = await normalizeTable(table, schema);
48
+ const frame = await result.collect();
49
+ expect(frame.toRecords()[0]?.name).toEqual(value);
50
+ });
51
+ });
52
+ describe("stringifyBooleanField", () => {
53
+ it.each([
54
+ // Default values
55
+ [true, "true", {}],
56
+ [false, "false", {}],
57
+ // Custom true values
58
+ [true, "Y", { trueValues: ["Y", "y", "yes"] }],
59
+ [false, "false", { trueValues: ["Y", "y", "yes"] }],
60
+ // Custom false values
61
+ [true, "true", { falseValues: ["N", "n", "no"] }],
62
+ [false, "N", { falseValues: ["N", "n", "no"] }],
63
+ // Custom true and false values
64
+ [true, "oui", { trueValues: ["oui", "si"], falseValues: ["non", "no"] }],
65
+ [false, "non", { trueValues: ["oui", "si"], falseValues: ["non", "no"] }],
66
+ ])("%s -> %s %o", async (value, expected, options) => {
67
+ const table = pl.DataFrame([pl.Series("name", [value], pl.Bool)]).lazy();
68
+ const schema = {
69
+ fields: [{ name: "name", type: "boolean", ...options }],
70
+ };
71
+ const result = await denormalizeTable(table, schema);
72
+ const frame = await result.collect();
73
+ expect(frame.toRecords()[0]?.name).toEqual(expected);
74
+ });
75
+ });
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vbGVhbi5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZmllbGQvdHlwZXMvYm9vbGVhbi5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDckQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFFdkQsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUNqQyxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ04sc0JBQXNCO1FBQ3RCLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7UUFDbEIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNsQixDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ2xCLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7UUFFZix1QkFBdUI7UUFDdkIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNwQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ3BCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDcEIsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUVoQixpQkFBaUI7UUFDakIsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNkLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7UUFDckIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNwQixDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxD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LElBQUksQ0FBQyxFQUFFLENBQUM7UUFDeEUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDO0tBQzFFLENBQUMsQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDbkQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUV4RSxNQUFNLE1BQU0sR0FBRztZQUNiLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBa0IsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDO1NBQ2pFLENBQUE7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLGdCQUFnQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUNwRCxNQUFNLEtBQUssR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUVwQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUN0RCxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGwgZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IG5vcm1hbGl6ZVRhYmxlIH0gZnJvbSBcIi4uLy4uL3RhYmxlL2luZGV4LnRzXCJcbmltcG9ydCB7IGRlbm9ybWFsaXplVGFibGUgfSBmcm9tIFwiLi4vLi4vdGFibGUvaW5kZXgudHNcIlxuXG5kZXNjcmliZShcInBhcnNlQm9vbGVhbkZpZWxkXCIsICgpID0+IHtcbiAgaXQuZWFjaChbXG4gICAgLy8gRGVmYXVsdCB0cnVlIHZhbHVlc1xuICAgIFtcInRydWVcIiwgdHJ1ZSwge31dLFxuICAgIFtcIlRydWVcIiwgdHJ1ZSwge31dLFxuICAgIFtcIlRSVUVcIiwgdHJ1ZSwge31dLFxuICAgIFtcIjFcIiwgdHJ1ZSwge31dLFxuXG4gICAgLy8gRGVmYXVsdCBmYWxzZSB2YWx1ZXNcbiAgICBbXCJmYWxzZVwiLCBmYWxzZSwge31dLFxuICAgIFtcIkZhbHNlXCIsIGZhbHNlLCB7fV0sXG4gICAgW1wiRkFMU0VcIiwgZmFsc2UsIHt9XSxcbiAgICBbXCIwXCIsIGZhbHNlLCB7fV0sXG5cbiAgICAvLyBJbnZhbGlkIHZhbHVlc1xuICAgIFtcIlwiLCBudWxsLCB7fV0sXG4gICAgW1wiaW52YWxpZFwiLCBudWxsLCB7fV0sXG4gICAgW1widHJ1dGh5XCIsIG51bGwsIHt9XSxcbiAgICBbXCJmYWxzeVwiLCBudWxsLCB7fV0sXG4gICAgW1wiMlwiLCBudWxsLCB7fV0sXG4gICAgW1wiLTEwMFwiLCBudWxsLCB7fV0sXG4gICAgW1widFwiLCBudWxsLCB7fV0sXG4gICAgW1wiZlwiLCBudWxsLCB7fV0sXG4gICAgW1wiMy4xNFwiLCBudWxsLCB7fV0sXG5cbiAgICAvLyBDdXN0b20gdHJ1ZSB2YWx1ZXNcbiAgICBbXCJZXCIsIHRydWUsIHsgdHJ1ZVZhbHVlczogW1wiWVwiLCBcInlcIiwgXCJ5ZXNcIl0gfV0sXG4gICAgW1wieVwiLCB0cnVlLCB7IHRydWVWYWx1ZXM6IFtcIllcIiwgXCJ5XCIsIFwieWVzXCJdIH1dLFxuICAgIFtcInllc1wiLCB0cnVlLCB7IHRydWVWYWx1ZXM6IFtcIllcIiwgXCJ5XCIsIFwieWVzXCJdIH1dLFxuICAgIFtcInRydWVcIiwgbnVsbCwgeyB0cnVlVmFsdWVzOiBbXCJZXCIsIFwieVwiLCBcInllc1wiXSB9XSxcblxuICAgIC8vIEN1c3RvbSBmYWxzZSB2YWx1ZXNcbiAgICBbXCJOXCIsIGZhbHNlLCB7IGZhbHNlVmFsdWVzOiBbXCJOXCIsIFwiblwiLCBcIm5vXCJdIH1dLFxuICAgIFtcIm5cIiwgZmFsc2UsIHsgZmFsc2VWYWx1ZXM6IFtcIk5cIiwgXCJuXCIsIFwibm9cIl0gfV0sXG4gICAgW1wibm9cIiwgZmFsc2UsIHsgZmFsc2VWYWx1ZXM6IFtcIk5cIiwgXCJuXCIsIFwibm9cIl0gfV0sXG4gICAgW1wiZmFsc2VcIiwgbnVsbCwgeyBmYWxzZVZhbHVlczogW1wiTlwiLCBcIm5cIiwgXCJub1wiXSB9XSxcblxuICAgIC8vIEN1c3RvbSB0cnVlIGFuZCBmYWxzZSB2YWx1ZXNcbiAgICBbXCJvdWlcIiwgdHJ1ZSwgeyB0cnVlVmFsdWVzOiBbXCJvdWlcIiwgXCJzaVwiXSwgZmFsc2VWYWx1ZXM6IFtcIm5vblwiLCBcIm5vXCJdIH1dLFxuICAgIFtcInNpXCIsIHRydWUsIHsgdHJ1ZVZhbHVlczogW1wib3VpXCIsIFwic2lcIl0sIGZhbHNlVmFsdWVzOiBbXCJub25cIiwgXCJub1wiXSB9XSxcbiAgICBbXCJub25cIiwgZmFsc2UsIHsgdHJ1ZVZhbHVlczogW1wib3VpXCIsIFwic2lcIl0sIGZhbHNlVmFsdWVzOiBbXCJub25cIiwgXCJub1wiXSB9XSxcbiAgICBbXCJub1wiLCBmYWxzZSwgeyB0cnVlVmFsdWVzOiBbXCJvdWlcIiwgXCJzaVwiXSwgZmFsc2VWYWx1ZXM6IFtcIm5vblwiLCBcIm5vXCJdIH1dLFxuICBdKShcIiVzIC0+ICVzICVvXCIsIGFzeW5jIChjZWxsLCB2YWx1ZSwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGwuRGF0YUZyYW1lKFtwbC5TZXJpZXMoXCJuYW1lXCIsIFtjZWxsXSwgcGwuU3RyaW5nKV0pLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJib29sZWFuXCIgYXMgY29uc3QsIC4uLm9wdGlvbnMgfV0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbm9ybWFsaXplVGFibGUodGFibGUsIHNjaGVtYSlcbiAgICBjb25zdCBmcmFtZSA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcblxuICAgIGV4cGVjdChmcmFtZS50b1JlY29yZHMoKVswXT8ubmFtZSkudG9FcXVhbCh2YWx1ZSlcbiAgfSlcbn0pXG5cbmRlc2NyaWJlKFwic3RyaW5naWZ5Qm9vbGVhbkZpZWxkXCIsICgpID0+IHtcbiAgaXQuZWFjaChbXG4gICAgLy8gRGVmYXVsdCB2YWx1ZXNcbiAgICBbdHJ1ZSwgXCJ0cnVlXCIsIHt9XSxcbiAgICBbZmFsc2UsIFwiZmFsc2VcIiwge31dLFxuXG4gICAgLy8gQ3VzdG9tIHRydWUgdmFsdWVzXG4gICAgW3RydWUsIFwiWVwiLCB7IHRydWVWYWx1ZXM6IFtcIllcIiwgXCJ5XCIsIFwieWVzXCJdIH1dLFxuICAgIFtmYWxzZSwgXCJmYWxzZVwiLCB7IHRydWVWYWx1ZXM6IFtcIllcIiwgXCJ5XCIsIFwieWVzXCJdIH1dLFxuXG4gICAgLy8gQ3VzdG9tIGZhbHNlIHZhbHVlc1xuICAgIFt0cnVlLCBcInRydWVcIiwgeyBmYWxzZVZhbHVlczogW1wiTlwiLCBcIm5cIiwgXCJub1wiXSB9XSxcbiAgICBbZmFsc2UsIFwiTlwiLCB7IGZhbHNlVmFsdWVzOiBbXCJOXCIsIFwiblwiLCBcIm5vXCJdIH1dLFxuXG4gICAgLy8gQ3VzdG9tIHRydWUgYW5kIGZhbHNlIHZhbHVlc1xuICAgIFt0cnVlLCBcIm91aVwiLCB7IHRydWVWYWx1ZXM6IFtcIm91aVwiLCBcInNpXCJdLCBmYWxzZVZhbHVlczogW1wibm9uXCIsIFwibm9cIl0gfV0sXG4gICAgW2ZhbHNlLCBcIm5vblwiLCB7IHRydWVWYWx1ZXM6IFtcIm91aVwiLCBcInNpXCJdLCBmYWxzZVZhbHVlczogW1wibm9uXCIsIFwibm9cIl0gfV0sXG4gIF0pKFwiJXMgLT4gJXMgJW9cIiwgYXN5bmMgKHZhbHVlLCBleHBlY3RlZCwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGwuRGF0YUZyYW1lKFtwbC5TZXJpZXMoXCJuYW1lXCIsIFt2YWx1ZV0sIHBsLkJvb2wpXSkubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFt7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcImJvb2xlYW5cIiBhcyBjb25zdCwgLi4ub3B0aW9ucyB9XSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZW5vcm1hbGl6ZVRhYmxlKHRhYmxlLCBzY2hlbWEpXG4gICAgY29uc3QgZnJhbWUgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG5cbiAgICBleHBlY3QoZnJhbWUudG9SZWNvcmRzKClbMF0/Lm5hbWUpLnRvRXF1YWwoZXhwZWN0ZWQpXG4gIH0pXG59KVxuIl19
@@ -0,0 +1,4 @@
1
+ import type { DateField } from "@frictionless-ts/metadata";
2
+ import * as pl from "nodejs-polars";
3
+ export declare function parseDateField(field: DateField, fieldExpr: pl.Expr): pl.Expr;
4
+ export declare function stringifyDateField(field: DateField, fieldExpr: pl.Expr): pl.Expr;
@@ -0,0 +1,14 @@
1
+ import * as pl from "nodejs-polars";
2
+ const DEFAULT_FORMAT = "%Y-%m-%d";
3
+ export function parseDateField(field, fieldExpr) {
4
+ let format = DEFAULT_FORMAT;
5
+ if (field.format && field.format !== "default" && field.format !== "any") {
6
+ format = field.format;
7
+ }
8
+ return fieldExpr.str.strptime(pl.Date, format);
9
+ }
10
+ export function stringifyDateField(field, fieldExpr) {
11
+ const format = field.format ?? DEFAULT_FORMAT;
12
+ return fieldExpr.date.strftime(format);
13
+ }
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2ZpZWxkL3R5cGVzL2RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFbkMsTUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFBO0FBRWpDLE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBZ0IsRUFBRSxTQUFrQjtJQUNqRSxJQUFJLE1BQU0sR0FBRyxjQUFjLENBQUE7SUFDM0IsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxFQUFFLENBQUM7UUFDekUsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUE7SUFDdkIsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQTtBQUNoRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQWdCLEVBQUUsU0FBa0I7SUFDckUsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxjQUFjLENBQUE7SUFFN0MsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBEYXRlRmllbGQgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgKiBhcyBwbCBmcm9tIFwibm9kZWpzLXBvbGFyc1wiXG5cbmNvbnN0IERFRkFVTFRfRk9STUFUID0gXCIlWS0lbS0lZFwiXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURhdGVGaWVsZChmaWVsZDogRGF0ZUZpZWxkLCBmaWVsZEV4cHI6IHBsLkV4cHIpIHtcbiAgbGV0IGZvcm1hdCA9IERFRkFVTFRfRk9STUFUXG4gIGlmIChmaWVsZC5mb3JtYXQgJiYgZmllbGQuZm9ybWF0ICE9PSBcImRlZmF1bHRcIiAmJiBmaWVsZC5mb3JtYXQgIT09IFwiYW55XCIpIHtcbiAgICBmb3JtYXQgPSBmaWVsZC5mb3JtYXRcbiAgfVxuXG4gIHJldHVybiBmaWVsZEV4cHIuc3RyLnN0cnB0aW1lKHBsLkRhdGUsIGZvcm1hdClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeURhdGVGaWVsZChmaWVsZDogRGF0ZUZpZWxkLCBmaWVsZEV4cHI6IHBsLkV4cHIpIHtcbiAgY29uc3QgZm9ybWF0ID0gZmllbGQuZm9ybWF0ID8/IERFRkFVTFRfRk9STUFUXG5cbiAgcmV0dXJuIGZpZWxkRXhwci5kYXRlLnN0cmZ0aW1lKGZvcm1hdClcbn1cbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,52 @@
1
+ import * as pl from "nodejs-polars";
2
+ import { describe, expect, it } from "vitest";
3
+ import { normalizeTable } from "../../table/index.js";
4
+ import { denormalizeTable } from "../../table/index.js";
5
+ describe("parseDateField", () => {
6
+ it.each([
7
+ // Default format
8
+ ["2019-01-01", new Date(Date.UTC(2019, 0, 1)), {}],
9
+ ["10th Jan 1969", null, {}],
10
+ ["invalid", null, {}],
11
+ ["", null, {}],
12
+ // Custom format
13
+ ["21/11/2006", new Date(Date.UTC(2006, 10, 21)), { format: "%d/%m/%Y" }],
14
+ [
15
+ "21/11/06 16:30",
16
+ new Date(Date.UTC(2006, 10, 21)),
17
+ { format: "%d/%m/%y" },
18
+ ],
19
+ ["invalid", null, { format: "%d/%m/%y" }],
20
+ ["", null, { format: "%d/%m/%y" }],
21
+ ["2006/11/21", new Date(Date.UTC(2006, 10, 21)), { format: "%Y/%m/%d" }],
22
+ // Invalid format
23
+ ["21/11/06", null, { format: "invalid" }],
24
+ ])("%s -> %s %o", async (cell, expected, options) => {
25
+ const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
26
+ const schema = {
27
+ fields: [{ name: "name", type: "date", ...options }],
28
+ };
29
+ const result = await normalizeTable(table, schema);
30
+ const frame = await result.collect();
31
+ expect(frame.toRecords()[0]?.name).toEqual(expected);
32
+ });
33
+ });
34
+ describe("stringifyDateField", () => {
35
+ it.each([
36
+ // Default format
37
+ [new Date(Date.UTC(2019, 0, 1)), "2019-01-01", {}],
38
+ [new Date(Date.UTC(2006, 10, 21)), "2006-11-21", {}],
39
+ // Custom format
40
+ [new Date(Date.UTC(2006, 10, 21)), "21/11/2006", { format: "%d/%m/%Y" }],
41
+ [new Date(Date.UTC(2006, 10, 21)), "2006/11/21", { format: "%Y/%m/%d" }],
42
+ ])("%s -> %s %o", async (value, expected, options) => {
43
+ const table = pl.DataFrame([pl.Series("name", [value], pl.Date)]).lazy();
44
+ const schema = {
45
+ fields: [{ name: "name", type: "date", ...options }],
46
+ };
47
+ const result = await denormalizeTable(table, schema);
48
+ const frame = await result.collect();
49
+ expect(frame.toRecords()[0]?.name).toEqual(expected);
50
+ });
51
+ });
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZmllbGQvdHlwZXMvZGF0ZS5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDckQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFFdkQsUUFBUSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsRUFBRTtJQUM5QixFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ04saUJBQWlCO1FBQ2pCLENBQUMsWUFBWSxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNsRCxDQUFDLGVBQWUsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQzNCLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7UUFDckIsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUVkLGdCQUFnQjtRQUNoQixDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQztRQUN4RTtZQUNFLGdCQUFnQjtZQUNoQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDaEMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFO1NBQ3ZCO1FBQ0QsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDO1FBQ3pDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQztRQUNsQyxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQztRQUV4RSxpQkFBaUI7UUFDakIsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO0tBQzFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDbEQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUV6RSxNQUFNLE1BQU0sR0FBRztZQUNiLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBZSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7U0FDOUQsQ0FBQTtRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sY0FBYyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUNsRCxNQUFNLEtBQUssR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUVwQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUN0RCxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBO0FBRUYsUUFBUSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRTtJQUNsQyxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ04saUJBQWlCO1FBQ2pCLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLEVBQUUsQ0FBQztRQUNsRCxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxFQUFFLENBQUM7UUFFcEQsZ0JBQWdCO1FBQ2hCLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDO1FBQ3hFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDO0tBQ3pFLENBQUMsQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDbkQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUV4RSxNQUFNLE1BQU0sR0FBRztZQUNiLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBZSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7U0FDOUQsQ0FBQTtRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ3BELE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBRXBDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3RELENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwbCBmcm9tIFwibm9kZWpzLXBvbGFyc1wiXG5pbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlc3RcIlxuaW1wb3J0IHsgbm9ybWFsaXplVGFibGUgfSBmcm9tIFwiLi4vLi4vdGFibGUvaW5kZXgudHNcIlxuaW1wb3J0IHsgZGVub3JtYWxpemVUYWJsZSB9IGZyb20gXCIuLi8uLi90YWJsZS9pbmRleC50c1wiXG5cbmRlc2NyaWJlKFwicGFyc2VEYXRlRmllbGRcIiwgKCkgPT4ge1xuICBpdC5lYWNoKFtcbiAgICAvLyBEZWZhdWx0IGZvcm1hdFxuICAgIFtcIjIwMTktMDEtMDFcIiwgbmV3IERhdGUoRGF0ZS5VVEMoMjAxOSwgMCwgMSkpLCB7fV0sXG4gICAgW1wiMTB0aCBKYW4gMTk2OVwiLCBudWxsLCB7fV0sXG4gICAgW1wiaW52YWxpZFwiLCBudWxsLCB7fV0sXG4gICAgW1wiXCIsIG51bGwsIHt9XSxcblxuICAgIC8vIEN1c3RvbSBmb3JtYXRcbiAgICBbXCIyMS8xMS8yMDA2XCIsIG5ldyBEYXRlKERhdGUuVVRDKDIwMDYsIDEwLCAyMSkpLCB7IGZvcm1hdDogXCIlZC8lbS8lWVwiIH1dLFxuICAgIFtcbiAgICAgIFwiMjEvMTEvMDYgMTY6MzBcIixcbiAgICAgIG5ldyBEYXRlKERhdGUuVVRDKDIwMDYsIDEwLCAyMSkpLFxuICAgICAgeyBmb3JtYXQ6IFwiJWQvJW0vJXlcIiB9LFxuICAgIF0sXG4gICAgW1wiaW52YWxpZFwiLCBudWxsLCB7IGZvcm1hdDogXCIlZC8lbS8leVwiIH1dLFxuICAgIFtcIlwiLCBudWxsLCB7IGZvcm1hdDogXCIlZC8lbS8leVwiIH1dLFxuICAgIFtcIjIwMDYvMTEvMjFcIiwgbmV3IERhdGUoRGF0ZS5VVEMoMjAwNiwgMTAsIDIxKSksIHsgZm9ybWF0OiBcIiVZLyVtLyVkXCIgfV0sXG5cbiAgICAvLyBJbnZhbGlkIGZvcm1hdFxuICAgIFtcIjIxLzExLzA2XCIsIG51bGwsIHsgZm9ybWF0OiBcImludmFsaWRcIiB9XSxcbiAgXSkoXCIlcyAtPiAlcyAlb1wiLCBhc3luYyAoY2VsbCwgZXhwZWN0ZWQsIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsLkRhdGFGcmFtZShbcGwuU2VyaWVzKFwibmFtZVwiLCBbY2VsbF0sIHBsLlN0cmluZyldKS5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW3sgbmFtZTogXCJuYW1lXCIsIHR5cGU6IFwiZGF0ZVwiIGFzIGNvbnN0LCAuLi5vcHRpb25zIH1dLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG5vcm1hbGl6ZVRhYmxlKHRhYmxlLCBzY2hlbWEpXG4gICAgY29uc3QgZnJhbWUgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG5cbiAgICBleHBlY3QoZnJhbWUudG9SZWNvcmRzKClbMF0/Lm5hbWUpLnRvRXF1YWwoZXhwZWN0ZWQpXG4gIH0pXG59KVxuXG5kZXNjcmliZShcInN0cmluZ2lmeURhdGVGaWVsZFwiLCAoKSA9PiB7XG4gIGl0LmVhY2goW1xuICAgIC8vIERlZmF1bHQgZm9ybWF0XG4gICAgW25ldyBEYXRlKERhdGUuVVRDKDIwMTksIDAsIDEpKSwgXCIyMDE5LTAxLTAxXCIsIHt9XSxcbiAgICBbbmV3IERhdGUoRGF0ZS5VVEMoMjAwNiwgMTAsIDIxKSksIFwiMjAwNi0xMS0yMVwiLCB7fV0sXG5cbiAgICAvLyBDdXN0b20gZm9ybWF0XG4gICAgW25ldyBEYXRlKERhdGUuVVRDKDIwMDYsIDEwLCAyMSkpLCBcIjIxLzExLzIwMDZcIiwgeyBmb3JtYXQ6IFwiJWQvJW0vJVlcIiB9XSxcbiAgICBbbmV3IERhdGUoRGF0ZS5VVEMoMjAwNiwgMTAsIDIxKSksIFwiMjAwNi8xMS8yMVwiLCB7IGZvcm1hdDogXCIlWS8lbS8lZFwiIH1dLFxuICBdKShcIiVzIC0+ICVzICVvXCIsIGFzeW5jICh2YWx1ZSwgZXhwZWN0ZWQsIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsLkRhdGFGcmFtZShbcGwuU2VyaWVzKFwibmFtZVwiLCBbdmFsdWVdLCBwbC5EYXRlKV0pLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJkYXRlXCIgYXMgY29uc3QsIC4uLm9wdGlvbnMgfV0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVub3JtYWxpemVUYWJsZSh0YWJsZSwgc2NoZW1hKVxuICAgIGNvbnN0IGZyYW1lID0gYXdhaXQgcmVzdWx0LmNvbGxlY3QoKVxuXG4gICAgZXhwZWN0KGZyYW1lLnRvUmVjb3JkcygpWzBdPy5uYW1lKS50b0VxdWFsKGV4cGVjdGVkKVxuICB9KVxufSlcbiJdfQ==
@@ -0,0 +1,4 @@
1
+ import type { DatetimeField } from "@frictionless-ts/metadata";
2
+ import * as pl from "nodejs-polars";
3
+ export declare function parseDatetimeField(field: DatetimeField, fieldExpr: pl.Expr): pl.Expr;
4
+ export declare function stringifyDatetimeField(field: DatetimeField, fieldExpr: pl.Expr): pl.Expr;