@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,162 @@
1
+ import * as pl from "nodejs-polars";
2
+ import { describe, expect, it } from "vitest";
3
+ import { normalizeTable } from "../../table/index.js";
4
+ // TODO: Implement proper tests
5
+ // TODO: Currently, it fails on to JS conversion from Polars
6
+ describe("parseStringField", () => {
7
+ it.each([
8
+ // Simplr string
9
+ ["string", "string"],
10
+ // Null handling
11
+ ["", null],
12
+ ])("$0 -> $1", async (cell, value) => {
13
+ const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
14
+ const schema = {
15
+ fields: [{ name: "name", type: "string" }],
16
+ };
17
+ const result = await normalizeTable(table, schema);
18
+ const frame = await result.collect();
19
+ expect(frame.getColumn("name").dtype).toEqual(pl.String);
20
+ expect(frame.toRecords()[0]?.name).toEqual(value);
21
+ });
22
+ describe("email format", () => {
23
+ it.each([
24
+ // Valid emails
25
+ ["user@example.com", "user@example.com"],
26
+ ["test.email@domain.co.uk", "test.email@domain.co.uk"],
27
+ ["user+tag@example.org", "user+tag@example.org"],
28
+ ["first.last@subdomain.example.com", "first.last@subdomain.example.com"],
29
+ ["user123@test-domain.com", "user123@test-domain.com"],
30
+ // Invalid emails
31
+ ["invalid-email", null],
32
+ ["@example.com", null],
33
+ ["user@", null],
34
+ ["user@@example.com", null],
35
+ ["user@example", null],
36
+ ["user name@example.com", null],
37
+ // Null handling
38
+ ["", null],
39
+ ])("$0 -> $1", async (cell, value) => {
40
+ const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
41
+ const schema = {
42
+ fields: [
43
+ { name: "name", type: "string", format: "email" },
44
+ ],
45
+ };
46
+ const result = await normalizeTable(table, schema);
47
+ const frame = await result.collect();
48
+ expect(frame.getColumn("name").dtype).toEqual(pl.String);
49
+ expect(frame.toRecords()[0]?.name).toEqual(value);
50
+ });
51
+ });
52
+ describe("uri format", () => {
53
+ it.each([
54
+ // Valid URIs
55
+ ["https://example.com", "https://example.com"],
56
+ [
57
+ "http://www.google.com/search?q=test",
58
+ "http://www.google.com/search?q=test",
59
+ ],
60
+ ["ftp://files.example.org/file.txt", "ftp://files.example.org/file.txt"],
61
+ ["mailto:user@example.com", "mailto:user@example.com"],
62
+ ["file:///path/to/file", "file:///path/to/file"],
63
+ ["ssh://user@host:22/path", "ssh://user@host:22/path"],
64
+ // Invalid URIs
65
+ ["not-a-uri", null],
66
+ ["://missing-scheme", null],
67
+ ["http://", null],
68
+ ["example.com", null],
69
+ ["http:// space in uri", null],
70
+ // Null handling
71
+ ["", null],
72
+ ])("$0 -> $1", async (cell, value) => {
73
+ const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
74
+ const schema = {
75
+ fields: [
76
+ { name: "name", type: "string", format: "uri" },
77
+ ],
78
+ };
79
+ const result = await normalizeTable(table, schema);
80
+ const frame = await result.collect();
81
+ expect(frame.getColumn("name").dtype).toEqual(pl.String);
82
+ expect(frame.toRecords()[0]?.name).toEqual(value);
83
+ });
84
+ });
85
+ describe("binary format", () => {
86
+ it.each([
87
+ // Valid base64 strings
88
+ ["SGVsbG8gV29ybGQ=", "SGVsbG8gV29ybGQ="],
89
+ ["YWJjZGVmZw==", "YWJjZGVmZw=="],
90
+ ["VGVzdA==", "VGVzdA=="],
91
+ ["QQ==", "QQ=="],
92
+ ["Zg==", "Zg=="],
93
+ ["Zm8=", "Zm8="],
94
+ ["Zm9v", "Zm9v"],
95
+ // Invalid base64 strings
96
+ ["Hello World!", null],
97
+ ["SGVsbG8gV29ybGQ===", null],
98
+ ["Invalid@#$", null],
99
+ ["SGVsb(8gV29ybGQ=", null],
100
+ // Null handling
101
+ ["", null],
102
+ ])("$0 -> $1", async (cell, value) => {
103
+ const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
104
+ const schema = {
105
+ fields: [
106
+ { name: "name", type: "string", format: "binary" },
107
+ ],
108
+ };
109
+ const result = await normalizeTable(table, schema);
110
+ const frame = await result.collect();
111
+ expect(frame.getColumn("name").dtype).toEqual(pl.String);
112
+ expect(frame.toRecords()[0]?.name).toEqual(value);
113
+ });
114
+ });
115
+ describe("uuid format", () => {
116
+ it.each([
117
+ // Valid UUIDs
118
+ [
119
+ "f47ac10b-58cc-4372-a567-0e02b2c3d479",
120
+ "f47ac10b-58cc-4372-a567-0e02b2c3d479",
121
+ ],
122
+ // Invalid UUIDs
123
+ ["f47ac10b-58cc-4372-a567-0e02b2c3d47X", null],
124
+ ["f47ac10b", null],
125
+ ["X", null],
126
+ // Null handling
127
+ ["", null],
128
+ ])("$0 -> $1 $2", async (cell, value) => {
129
+ const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
130
+ const schema = {
131
+ fields: [
132
+ { name: "name", type: "string", format: "uuid" },
133
+ ],
134
+ };
135
+ const result = await normalizeTable(table, schema);
136
+ const frame = await result.collect();
137
+ expect(frame.getColumn("name").dtype).toEqual(pl.Categorical);
138
+ expect(frame.toRecords()[0]?.name).toEqual(value);
139
+ });
140
+ });
141
+ describe("categories", () => {
142
+ it.each([
143
+ // Flat categories
144
+ ["apple", "apple", { categories: ["apple", "banana"] }],
145
+ ["banana", "banana", { categories: ["apple", "banana"] }],
146
+ ["orange", null, { categories: ["apple", "banana"] }],
147
+ // Object categories
148
+ ["apple", "apple", { categories: [{ value: "apple", label: "Apple" }] }],
149
+ ["orange", null, { categories: [{ value: "apple", label: "Apple" }] }],
150
+ ])("$0 -> $1 $2", async (cell, value, options) => {
151
+ const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
152
+ const schema = {
153
+ fields: [{ name: "name", type: "string", ...options }],
154
+ };
155
+ const result = await normalizeTable(table, schema);
156
+ const frame = await result.collect();
157
+ expect(frame.getColumn("name").dtype).toEqual(pl.Categorical);
158
+ expect(frame.toRecords()[0]?.name).toEqual(value);
159
+ });
160
+ });
161
+ });
162
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9maWVsZC90eXBlcy9zdHJpbmcuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUNuQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBRXJELCtCQUErQjtBQUMvQiw0REFBNEQ7QUFDNUQsUUFBUSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRTtJQUNoQyxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ04sZ0JBQWdCO1FBQ2hCLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQztRQUVwQixnQkFBZ0I7UUFDaEIsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDO0tBQ1gsQ0FBQyxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQ25DLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7UUFFekUsTUFBTSxNQUFNLEdBQUc7WUFDYixNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQWlCLEVBQUUsQ0FBQztTQUNwRCxDQUFBO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxjQUFjLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ2xELE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBRXBDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1B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QUV6RSxNQUFNLE1BQU0sR0FBRztnQkFDYixNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQWlCLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQzthQUNoRSxDQUFBO1lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxjQUFjLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1lBQ2xELE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFBO1lBRXBDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUE7WUFDN0QsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDbkQsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGwgZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IG5vcm1hbGl6ZVRhYmxlIH0gZnJvbSBcIi4uLy4uL3RhYmxlL2luZGV4LnRzXCJcblxuLy8gVE9ETzogSW1wbGVtZW50IHByb3BlciB0ZXN0c1xuLy8gVE9ETzogQ3VycmVudGx5LCBpdCBmYWlscyBvbiB0byBKUyBjb252ZXJzaW9uIGZyb20gUG9sYXJzXG5kZXNjcmliZShcInBhcnNlU3RyaW5nRmllbGRcIiwgKCkgPT4ge1xuICBpdC5lYWNoKFtcbiAgICAvLyBTaW1wbHIgc3RyaW5nXG4gICAgW1wic3RyaW5nXCIsIFwic3RyaW5nXCJdLFxuXG4gICAgLy8gTnVsbCBoYW5kbGluZ1xuICAgIFtcIlwiLCBudWxsXSxcbiAgXSkoXCIkMCAtPiAkMVwiLCBhc3luYyAoY2VsbCwgdmFsdWUpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsLkRhdGFGcmFtZShbcGwuU2VyaWVzKFwibmFtZVwiLCBbY2VsbF0sIHBsLlN0cmluZyldKS5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW3sgbmFtZTogXCJuYW1lXCIsIHR5cGU6IFwic3RyaW5nXCIgYXMgY29uc3QgfV0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbm9ybWFsaXplVGFibGUodGFibGUsIHNjaGVtYSlcbiAgICBjb25zdCBmcmFtZSA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcblxuICAgIGV4cGVjdChmcmFtZS5nZXRDb2x1bW4oXCJuYW1lXCIpLmR0eXBlKS50b0VxdWFsKHBsLlN0cmluZylcbiAgICBleHBlY3QoZnJhbWUudG9SZWNvcmRzKClbMF0/Lm5hbWUpLnRvRXF1YWwodmFsdWUpXG4gIH0pXG5cbiAgZGVzY3JpYmUoXCJlbWFpbCBmb3JtYXRcIiwgKCkgPT4ge1xuICAgIGl0LmVhY2goW1xuICAgICAgLy8gVmFsaWQgZW1haWxzXG4gICAgICBbXCJ1c2VyQGV4YW1wbGUuY29tXCIsIFwidXNlckBleGFtcGxlLmNvbVwiXSxcbiAgICAgIFtcInRlc3QuZW1haWxAZG9tYWluLmNvLnVrXCIsIFwidGVzdC5lbWFpbEBkb21haW4uY28udWtcIl0sXG4gICAgICBbXCJ1c2VyK3RhZ0BleGFtcGxlLm9yZ1wiLCBcInVzZXIrdGFnQGV4YW1wbGUub3JnXCJdLFxuICAgICAgW1wiZmlyc3QubGFzdEBzdWJkb21haW4uZXhhbXBsZS5jb21cIiwgXCJmaXJzdC5sYXN0QHN1YmRvbWFpbi5leGFtcGxlLmNvbVwiXSxcbiAgICAgIFtcInVzZXIxMjNAdGVzdC1kb21haW4uY29tXCIsIFwidXNlcjEyM0B0ZXN0LWRvbWFpbi5jb21cIl0sXG5cbiAgICAgIC8vIEludmFsaWQgZW1haWxzXG4gICAgICBbXCJpbnZhbGlkLWVtYWlsXCIsIG51bGxdLFxuICAgICAgW1wiQGV4YW1wbGUuY29tXCIsIG51bGxdLFxuICAgICAgW1widXNlckBcIiwgbnVsbF0sXG4gICAgICBbXCJ1c2VyQEBleGFtcGxlLmNvbVwiLCBudWxsXSxcbiAgICAgIFtcInVzZXJAZXhhbXBsZVwiLCBudWxsXSxcbiAgICAgIFtcInVzZXIgbmFtZUBleGFtcGxlLmNvbVwiLCBudWxsXSxcblxuICAgICAgLy8gTnVsbCBoYW5kbGluZ1xuICAgICAgW1wiXCIsIG51bGxdLFxuICAgIF0pKFwiJDAgLT4gJDFcIiwgYXN5bmMgKGNlbGwsIHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IHBsLkRhdGFGcmFtZShbcGwuU2VyaWVzKFwibmFtZVwiLCBbY2VsbF0sIHBsLlN0cmluZyldKS5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInN0cmluZ1wiIGFzIGNvbnN0LCBmb3JtYXQ6IFwiZW1haWxcIiBhcyBjb25zdCB9LFxuICAgICAgICBdLFxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBub3JtYWxpemVUYWJsZSh0YWJsZSwgc2NoZW1hKVxuICAgICAgY29uc3QgZnJhbWUgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG5cbiAgICAgIGV4cGVjdChmcmFtZS5nZXRDb2x1bW4oXCJuYW1lXCIpLmR0eXBlKS50b0VxdWFsKHBsLlN0cmluZylcbiAgICAgIGV4cGVjdChmcmFtZS50b1JlY29yZHMoKVswXT8ubmFtZSkudG9FcXVhbCh2YWx1ZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKFwidXJpIGZvcm1hdFwiLCAoKSA9PiB7XG4gICAgaXQuZWFjaChbXG4gICAgICAvLyBWYWxpZCBVUklzXG4gICAgICBbXCJodHRwczovL2V4YW1wbGUuY29tXCIsIFwiaHR0cHM6Ly9leGFtcGxlLmNvbVwiXSxcbiAgICAgIFtcbiAgICAgICAgXCJodHRwOi8vd3d3Lmdvb2dsZS5jb20vc2VhcmNoP3E9dGVzdFwiLFxuICAgICAgICBcImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2g/cT10ZXN0XCIsXG4gICAgICBdLFxuICAgICAgW1wiZnRwOi8vZmlsZXMuZXhhbXBsZS5vcmcvZmlsZS50eHRcIiwgXCJmdHA6Ly9maWxlcy5leGFtcGxlLm9yZy9maWxlLnR4dFwiXSxcbiAgICAgIFtcIm1haWx0bzp1c2VyQGV4YW1wbGUuY29tXCIsIFwibWFpbHRvOnVzZXJAZXhhbXBsZS5jb21cIl0sXG4gICAgICBbXCJmaWxlOi8vL3BhdGgvdG8vZmlsZVwiLCBcImZpbGU6Ly8vcGF0aC90by9maWxlXCJdLFxuICAgICAgW1wic3NoOi8vdXNlckBob3N0OjIyL3BhdGhcIiwgXCJzc2g6Ly91c2VyQGhvc3Q6MjIvcGF0aFwiXSxcblxuICAgICAgLy8gSW52YWxpZCBVUklzXG4gICAgICBbXCJub3QtYS11cmlcIiwgbnVsbF0sXG4gICAgICBbXCI6Ly9taXNzaW5nLXNjaGVtZVwiLCBudWxsXSxcbiAgICAgIFtcImh0dHA6Ly9cIiwgbnVsbF0sXG4gICAgICBbXCJleGFtcGxlLmNvbVwiLCBudWxsXSxcbiAgICAgIFtcImh0dHA6Ly8gc3BhY2UgaW4gdXJpXCIsIG51bGxdLFxuXG4gICAgICAvLyBOdWxsIGhhbmRsaW5nXG4gICAgICBbXCJcIiwgbnVsbF0sXG4gICAgXSkoXCIkMCAtPiAkMVwiLCBhc3luYyAoY2VsbCwgdmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gcGwuRGF0YUZyYW1lKFtwbC5TZXJpZXMoXCJuYW1lXCIsIFtjZWxsXSwgcGwuU3RyaW5nKV0pLmxhenkoKVxuXG4gICAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHsgbmFtZTogXCJuYW1lXCIsIHR5cGU6IFwic3RyaW5nXCIgYXMgY29uc3QsIGZvcm1hdDogXCJ1cmlcIiBhcyBjb25zdCB9LFxuICAgICAgICBdLFxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBub3JtYWxpemVUYWJsZSh0YWJsZSwgc2NoZW1hKVxuICAgICAgY29uc3QgZnJhbWUgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG5cbiAgICAgIGV4cGVjdChmcmFtZS5nZXRDb2x1bW4oXCJuYW1lXCIpLmR0eXBlKS50b0VxdWFsKHBsLlN0cmluZylcbiAgICAgIGV4cGVjdChmcmFtZS50b1JlY29yZHMoKVswXT8ubmFtZSkudG9FcXVhbCh2YWx1ZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKFwiYmluYXJ5IGZvcm1hdFwiLCAoKSA9PiB7XG4gICAgaXQuZWFjaChbXG4gICAgICAvLyBWYWxpZCBiYXNlNjQgc3RyaW5nc1xuICAgICAgW1wiU0dWc2JHOGdWMjl5YkdRPVwiLCBcIlNHVnNiRzhnVjI5eWJHUT1cIl0sXG4gICAgICBbXCJZV0pqWkdWbVp3PT1cIiwgXCJZV0pqWkdWbVp3PT1cIl0sXG4gICAgICBbXCJWR1Z6ZEE9PVwiLCBcIlZHVnpkQT09XCJdLFxuICAgICAgW1wiUVE9PVwiLCBcIlFRPT1cIl0sXG4gICAgICBbXCJaZz09XCIsIFwiWmc9PVwiXSxcbiAgICAgIFtcIlptOD1cIiwgXCJabTg9XCJdLFxuICAgICAgW1wiWm05dlwiLCBcIlptOXZcIl0sXG5cbiAgICAgIC8vIEludmFsaWQgYmFzZTY0IHN0cmluZ3NcbiAgICAgIFtcIkhlbGxvIFdvcmxkIVwiLCBudWxsXSxcbiAgICAgIFtcIlNHVnNiRzhnVjI5eWJHUT09PVwiLCBudWxsXSxcbiAgICAgIFtcIkludmFsaWRAIyRcIiwgbnVsbF0sXG4gICAgICBbXCJTR1ZzYig4Z1YyOXliR1E9XCIsIG51bGxdLFxuXG4gICAgICAvLyBOdWxsIGhhbmRsaW5nXG4gICAgICBbXCJcIiwgbnVsbF0sXG4gICAgXSkoXCIkMCAtPiAkMVwiLCBhc3luYyAoY2VsbCwgdmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gcGwuRGF0YUZyYW1lKFtwbC5TZXJpZXMoXCJuYW1lXCIsIFtjZWxsXSwgcGwuU3RyaW5nKV0pLmxhenkoKVxuXG4gICAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHsgbmFtZTogXCJuYW1lXCIsIHR5cGU6IFwic3RyaW5nXCIgYXMgY29uc3QsIGZvcm1hdDogXCJiaW5hcnlcIiBhcyBjb25zdCB9LFxuICAgICAgICBdLFxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBub3JtYWxpemVUYWJsZSh0YWJsZSwgc2NoZW1hKVxuICAgICAgY29uc3QgZnJhbWUgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG5cbiAgICAgIGV4cGVjdChmcmFtZS5nZXRDb2x1bW4oXCJuYW1lXCIpLmR0eXBlKS50b0VxdWFsKHBsLlN0cmluZylcbiAgICAgIGV4cGVjdChmcmFtZS50b1JlY29yZHMoKVswXT8ubmFtZSkudG9FcXVhbCh2YWx1ZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKFwidXVpZCBmb3JtYXRcIiwgKCkgPT4ge1xuICAgIGl0LmVhY2goW1xuICAgICAgLy8gVmFsaWQgVVVJRHNcbiAgICAgIFtcbiAgICAgICAgXCJmNDdhYzEwYi01OGNjLTQzNzItYTU2Ny0wZTAyYjJjM2Q0NzlcIixcbiAgICAgICAgXCJmNDdhYzEwYi01OGNjLTQzNzItYTU2Ny0wZTAyYjJjM2Q0NzlcIixcbiAgICAgIF0sXG5cbiAgICAgIC8vIEludmFsaWQgVVVJRHNcbiAgICAgIFtcImY0N2FjMTBiLTU4Y2MtNDM3Mi1hNTY3LTBlMDJiMmMzZDQ3WFwiLCBudWxsXSxcbiAgICAgIFtcImY0N2FjMTBiXCIsIG51bGxdLFxuICAgICAgW1wiWFwiLCBudWxsXSxcblxuICAgICAgLy8gTnVsbCBoYW5kbGluZ1xuICAgICAgW1wiXCIsIG51bGxdLFxuICAgIF0pKFwiJDAgLT4gJDEgJDJcIiwgYXN5bmMgKGNlbGwsIHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IHBsLkRhdGFGcmFtZShbcGwuU2VyaWVzKFwibmFtZVwiLCBbY2VsbF0sIHBsLlN0cmluZyldKS5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInN0cmluZ1wiIGFzIGNvbnN0LCBmb3JtYXQ6IFwidXVpZFwiIGFzIGNvbnN0IH0sXG4gICAgICAgIF0sXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG5vcm1hbGl6ZVRhYmxlKHRhYmxlLCBzY2hlbWEpXG4gICAgICBjb25zdCBmcmFtZSA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcblxuICAgICAgZXhwZWN0KGZyYW1lLmdldENvbHVtbihcIm5hbWVcIikuZHR5cGUpLnRvRXF1YWwocGwuQ2F0ZWdvcmljYWwpXG4gICAgICBleHBlY3QoZnJhbWUudG9SZWNvcmRzKClbMF0/Lm5hbWUpLnRvRXF1YWwodmFsdWUpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZShcImNhdGVnb3JpZXNcIiwgKCkgPT4ge1xuICAgIGl0LmVhY2goW1xuICAgICAgLy8gRmxhdCBjYXRlZ29yaWVzXG4gICAgICBbXCJhcHBsZVwiLCBcImFwcGxlXCIsIHsgY2F0ZWdvcmllczogW1wiYXBwbGVcIiwgXCJiYW5hbmFcIl0gfV0sXG4gICAgICBbXCJiYW5hbmFcIiwgXCJiYW5hbmFcIiwgeyBjYXRlZ29yaWVzOiBbXCJhcHBsZVwiLCBcImJhbmFuYVwiXSB9XSxcbiAgICAgIFtcIm9yYW5nZVwiLCBudWxsLCB7IGNhdGVnb3JpZXM6IFtcImFwcGxlXCIsIFwiYmFuYW5hXCJdIH1dLFxuXG4gICAgICAvLyBPYmplY3QgY2F0ZWdvcmllc1xuICAgICAgW1wiYXBwbGVcIiwgXCJhcHBsZVwiLCB7IGNhdGVnb3JpZXM6IFt7IHZhbHVlOiBcImFwcGxlXCIsIGxhYmVsOiBcIkFwcGxlXCIgfV0gfV0sXG4gICAgICBbXCJvcmFuZ2VcIiwgbnVsbCwgeyBjYXRlZ29yaWVzOiBbeyB2YWx1ZTogXCJhcHBsZVwiLCBsYWJlbDogXCJBcHBsZVwiIH1dIH1dLFxuICAgIF0pKFwiJDAgLT4gJDEgJDJcIiwgYXN5bmMgKGNlbGwsIHZhbHVlLCBvcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IHBsLkRhdGFGcmFtZShbcGwuU2VyaWVzKFwibmFtZVwiLCBbY2VsbF0sIHBsLlN0cmluZyldKS5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgICBmaWVsZHM6IFt7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInN0cmluZ1wiIGFzIGNvbnN0LCAuLi5vcHRpb25zIH1dLFxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBub3JtYWxpemVUYWJsZSh0YWJsZSwgc2NoZW1hKVxuICAgICAgY29uc3QgZnJhbWUgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG5cbiAgICAgIGV4cGVjdChmcmFtZS5nZXRDb2x1bW4oXCJuYW1lXCIpLmR0eXBlKS50b0VxdWFsKHBsLkNhdGVnb3JpY2FsKVxuICAgICAgZXhwZWN0KGZyYW1lLnRvUmVjb3JkcygpWzBdPy5uYW1lKS50b0VxdWFsKHZhbHVlKVxuICAgIH0pXG4gIH0pXG59KVxuIl19
@@ -0,0 +1,4 @@
1
+ import type { TimeField } from "@frictionless-ts/metadata";
2
+ import * as pl from "nodejs-polars";
3
+ export declare function parseTimeField(field: TimeField, fieldExpr: pl.Expr): any;
4
+ export declare function stringifyTimeField(field: TimeField, fieldExpr: pl.Expr): pl.Expr;
@@ -0,0 +1,18 @@
1
+ import * as pl from "nodejs-polars";
2
+ const DEFAULT_FORMAT = "%H:%M:%S";
3
+ export function parseTimeField(field, fieldExpr) {
4
+ let format = DEFAULT_FORMAT;
5
+ if (field.format && field.format !== "default" && field.format !== "any") {
6
+ format = field.format;
7
+ }
8
+ return pl.pl
9
+ .concatString([pl.pl.lit("1970-01-01T"), fieldExpr], "")
10
+ .str.strptime(pl.Datetime, `%Y-%m-%dT${format}`)
11
+ .cast(pl.Time)
12
+ .alias(field.name);
13
+ }
14
+ export function stringifyTimeField(field, fieldExpr) {
15
+ const format = field.format ?? DEFAULT_FORMAT;
16
+ return fieldExpr.date.strftime(format);
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2ZpZWxkL3R5cGVzL3RpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFbkMsTUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFBO0FBRWpDLE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBZ0IsRUFBRSxTQUFrQjtJQUNqRSxJQUFJLE1BQU0sR0FBRyxjQUFjLENBQUE7SUFDM0IsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxFQUFFLENBQUM7UUFDekUsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUE7SUFDdkIsQ0FBQztJQUVELE9BQU8sRUFBRSxDQUFDLEVBQUU7U0FDVCxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUM7U0FDdkQsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLFlBQVksTUFBTSxFQUFFLENBQUM7U0FDL0MsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7U0FDYixLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ3RCLENBQUM7QUFFRCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsS0FBZ0IsRUFBRSxTQUFrQjtJQUNyRSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLGNBQWMsQ0FBQTtJQUU3QyxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFRpbWVGaWVsZCB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCAqIGFzIHBsIGZyb20gXCJub2RlanMtcG9sYXJzXCJcblxuY29uc3QgREVGQVVMVF9GT1JNQVQgPSBcIiVIOiVNOiVTXCJcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVGltZUZpZWxkKGZpZWxkOiBUaW1lRmllbGQsIGZpZWxkRXhwcjogcGwuRXhwcikge1xuICBsZXQgZm9ybWF0ID0gREVGQVVMVF9GT1JNQVRcbiAgaWYgKGZpZWxkLmZvcm1hdCAmJiBmaWVsZC5mb3JtYXQgIT09IFwiZGVmYXVsdFwiICYmIGZpZWxkLmZvcm1hdCAhPT0gXCJhbnlcIikge1xuICAgIGZvcm1hdCA9IGZpZWxkLmZvcm1hdFxuICB9XG5cbiAgcmV0dXJuIHBsLnBsXG4gICAgLmNvbmNhdFN0cmluZyhbcGwucGwubGl0KFwiMTk3MC0wMS0wMVRcIiksIGZpZWxkRXhwcl0sIFwiXCIpXG4gICAgLnN0ci5zdHJwdGltZShwbC5EYXRldGltZSwgYCVZLSVtLSVkVCR7Zm9ybWF0fWApXG4gICAgLmNhc3QocGwuVGltZSlcbiAgICAuYWxpYXMoZmllbGQubmFtZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeVRpbWVGaWVsZChmaWVsZDogVGltZUZpZWxkLCBmaWVsZEV4cHI6IHBsLkV4cHIpIHtcbiAgY29uc3QgZm9ybWF0ID0gZmllbGQuZm9ybWF0ID8/IERFRkFVTFRfRk9STUFUXG5cbiAgcmV0dXJuIGZpZWxkRXhwci5kYXRlLnN0cmZ0aW1lKGZvcm1hdClcbn1cbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,53 @@
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("parseTimeField", () => {
6
+ it.each([
7
+ // Default format tests
8
+ ["06:00:00", "06:00:00", {}],
9
+ // #TODO: Clarify the behavior on the Standard level first
10
+ //["06:00:00Z", 6 * 60 * 60 * 10 ** 9, {}],
11
+ ["09:00", null, {}], // Incomplete time
12
+ ["3 am", null, {}], // Wrong format
13
+ ["3.00", null, {}], // Wrong format
14
+ ["invalid", null, {}],
15
+ ["", null, {}],
16
+ // Custom format tests
17
+ ["06:00", "06:00:00", { format: "%H:%M" }],
18
+ ["06:50", null, { format: "%M:%H" }], // Invalid format
19
+ ["3:00 am", "03:00:00", { format: "%H:%M" }],
20
+ ["some night", null, { format: "%H:%M" }],
21
+ ["invalid", null, { format: "%H:%M" }],
22
+ ["", null, { format: "%H:%M" }],
23
+ // Invalid format
24
+ //["06:00", null, { format: "invalid" }],
25
+ ])("$0 -> $1 $2", async (cell, expected, options) => {
26
+ const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
27
+ const schema = {
28
+ fields: [{ name: "name", type: "time", ...options }],
29
+ };
30
+ const result = await normalizeTable(table, schema);
31
+ const frame = await result.collect();
32
+ expect(frame.toRecords()[0]?.name).toEqual(expected);
33
+ });
34
+ });
35
+ describe("stringifyTimeField", () => {
36
+ it.each([
37
+ // Default format
38
+ [new Date(Date.UTC(2014, 0, 1, 6, 0, 0)), "06:00:00", {}],
39
+ [new Date(Date.UTC(2014, 0, 1, 16, 30, 0)), "16:30:00", {}],
40
+ // Custom format
41
+ [new Date(Date.UTC(2014, 0, 1, 6, 0, 0)), "06:00", { format: "%H:%M" }],
42
+ [new Date(Date.UTC(2014, 0, 1, 16, 30, 0)), "16:30", { format: "%H:%M" }],
43
+ ])("%s -> %s %o", async (value, expected, options) => {
44
+ const table = pl.DataFrame([pl.Series("name", [value], pl.Time)]).lazy();
45
+ const schema = {
46
+ fields: [{ name: "name", type: "time", ...options }],
47
+ };
48
+ const result = await denormalizeTable(table, schema);
49
+ const frame = await result.collect();
50
+ expect(frame.toRecords()[0]?.name).toEqual(expected);
51
+ });
52
+ });
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZmllbGQvdHlwZXMvdGltZS5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDckQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFFdkQsUUFBUSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsRUFBRTtJQUM5QixFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ04sdUJBQXVCO1FBQ3ZCLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUM7UUFDNUIsMERBQTBEO1FBQzFELDJDQUEyQztRQUMzQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsa0JBQWtCO1FBQ3ZDLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxlQUFlO1FBQ25DLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxlQUFlO1FBQ25DLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7UUFDckIsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUVkLHNCQUFzQjtRQUN0QixDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDMUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsaUJBQWlCO1FBQ3ZELENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUM1QyxD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TUFBTSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ3BELE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBRXBDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3RELENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwbCBmcm9tIFwibm9kZWpzLXBvbGFyc1wiXG5pbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlc3RcIlxuaW1wb3J0IHsgbm9ybWFsaXplVGFibGUgfSBmcm9tIFwiLi4vLi4vdGFibGUvaW5kZXgudHNcIlxuaW1wb3J0IHsgZGVub3JtYWxpemVUYWJsZSB9IGZyb20gXCIuLi8uLi90YWJsZS9pbmRleC50c1wiXG5cbmRlc2NyaWJlKFwicGFyc2VUaW1lRmllbGRcIiwgKCkgPT4ge1xuICBpdC5lYWNoKFtcbiAgICAvLyBEZWZhdWx0IGZvcm1hdCB0ZXN0c1xuICAgIFtcIjA2OjAwOjAwXCIsIFwiMDY6MDA6MDBcIiwge31dLFxuICAgIC8vICNUT0RPOiBDbGFyaWZ5IHRoZSBiZWhhdmlvciBvbiB0aGUgU3RhbmRhcmQgbGV2ZWwgZmlyc3RcbiAgICAvL1tcIjA2OjAwOjAwWlwiLCA2ICogNjAgKiA2MCAqIDEwICoqIDksIHt9XSxcbiAgICBbXCIwOTowMFwiLCBudWxsLCB7fV0sIC8vIEluY29tcGxldGUgdGltZVxuICAgIFtcIjMgYW1cIiwgbnVsbCwge31dLCAvLyBXcm9uZyBmb3JtYXRcbiAgICBbXCIzLjAwXCIsIG51bGwsIHt9XSwgLy8gV3JvbmcgZm9ybWF0XG4gICAgW1wiaW52YWxpZFwiLCBudWxsLCB7fV0sXG4gICAgW1wiXCIsIG51bGwsIHt9XSxcblxuICAgIC8vIEN1c3RvbSBmb3JtYXQgdGVzdHNcbiAgICBbXCIwNjowMFwiLCBcIjA2OjAwOjAwXCIsIHsgZm9ybWF0OiBcIiVIOiVNXCIgfV0sXG4gICAgW1wiMDY6NTBcIiwgbnVsbCwgeyBmb3JtYXQ6IFwiJU06JUhcIiB9XSwgLy8gSW52YWxpZCBmb3JtYXRcbiAgICBbXCIzOjAwIGFtXCIsIFwiMDM6MDA6MDBcIiwgeyBmb3JtYXQ6IFwiJUg6JU1cIiB9XSxcbiAgICBbXCJzb21lIG5pZ2h0XCIsIG51bGwsIHsgZm9ybWF0OiBcIiVIOiVNXCIgfV0sXG4gICAgW1wiaW52YWxpZFwiLCBudWxsLCB7IGZvcm1hdDogXCIlSDolTVwiIH1dLFxuICAgIFtcIlwiLCBudWxsLCB7IGZvcm1hdDogXCIlSDolTVwiIH1dLFxuXG4gICAgLy8gSW52YWxpZCBmb3JtYXRcbiAgICAvL1tcIjA2OjAwXCIsIG51bGwsIHsgZm9ybWF0OiBcImludmFsaWRcIiB9XSxcbiAgXSkoXCIkMCAtPiAkMSAkMlwiLCBhc3luYyAoY2VsbCwgZXhwZWN0ZWQsIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsLkRhdGFGcmFtZShbcGwuU2VyaWVzKFwibmFtZVwiLCBbY2VsbF0sIHBsLlN0cmluZyldKS5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW3sgbmFtZTogXCJuYW1lXCIsIHR5cGU6IFwidGltZVwiIGFzIGNvbnN0LCAuLi5vcHRpb25zIH1dLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG5vcm1hbGl6ZVRhYmxlKHRhYmxlLCBzY2hlbWEpXG4gICAgY29uc3QgZnJhbWUgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG5cbiAgICBleHBlY3QoZnJhbWUudG9SZWNvcmRzKClbMF0/Lm5hbWUpLnRvRXF1YWwoZXhwZWN0ZWQpXG4gIH0pXG59KVxuXG5kZXNjcmliZShcInN0cmluZ2lmeVRpbWVGaWVsZFwiLCAoKSA9PiB7XG4gIGl0LmVhY2goW1xuICAgIC8vIERlZmF1bHQgZm9ybWF0XG4gICAgW25ldyBEYXRlKERhdGUuVVRDKDIwMTQsIDAsIDEsIDYsIDAsIDApKSwgXCIwNjowMDowMFwiLCB7fV0sXG4gICAgW25ldyBEYXRlKERhdGUuVVRDKDIwMTQsIDAsIDEsIDE2LCAzMCwgMCkpLCBcIjE2OjMwOjAwXCIsIHt9XSxcblxuICAgIC8vIEN1c3RvbSBmb3JtYXRcbiAgICBbbmV3IERhdGUoRGF0ZS5VVEMoMjAxNCwgMCwgMSwgNiwgMCwgMCkpLCBcIjA2OjAwXCIsIHsgZm9ybWF0OiBcIiVIOiVNXCIgfV0sXG4gICAgW25ldyBEYXRlKERhdGUuVVRDKDIwMTQsIDAsIDEsIDE2LCAzMCwgMCkpLCBcIjE2OjMwXCIsIHsgZm9ybWF0OiBcIiVIOiVNXCIgfV0sXG4gIF0pKFwiJXMgLT4gJXMgJW9cIiwgYXN5bmMgKHZhbHVlLCBleHBlY3RlZCwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGwuRGF0YUZyYW1lKFtwbC5TZXJpZXMoXCJuYW1lXCIsIFt2YWx1ZV0sIHBsLlRpbWUpXSkubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFt7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInRpbWVcIiBhcyBjb25zdCwgLi4ub3B0aW9ucyB9XSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZW5vcm1hbGl6ZVRhYmxlKHRhYmxlLCBzY2hlbWEpXG4gICAgY29uc3QgZnJhbWUgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG5cbiAgICBleHBlY3QoZnJhbWUudG9SZWNvcmRzKClbMF0/Lm5hbWUpLnRvRXF1YWwoZXhwZWN0ZWQpXG4gIH0pXG59KVxuIl19
@@ -0,0 +1,4 @@
1
+ import type { YearField } from "@frictionless-ts/metadata";
2
+ import * as pl from "nodejs-polars";
3
+ export declare function parseYearField(_field: YearField, fieldExpr: pl.Expr): pl.Expr;
4
+ export declare function stringifyYearField(_field: YearField, fieldExpr: pl.Expr): pl.Expr;
@@ -0,0 +1,16 @@
1
+ import * as pl from "nodejs-polars";
2
+ export function parseYearField(_field, fieldExpr) {
3
+ fieldExpr = pl
4
+ .when(fieldExpr.str.lengths().eq(4))
5
+ .then(fieldExpr)
6
+ .otherwise(pl.lit(null))
7
+ .cast(pl.Int16);
8
+ return pl
9
+ .when(fieldExpr.gtEq(0).and(fieldExpr.ltEq(9999)))
10
+ .then(fieldExpr)
11
+ .otherwise(pl.lit(null));
12
+ }
13
+ export function stringifyYearField(_field, fieldExpr) {
14
+ return fieldExpr.cast(pl.String).str.zFill(4);
15
+ }
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieWVhci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2ZpZWxkL3R5cGVzL3llYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFbkMsTUFBTSxVQUFVLGNBQWMsQ0FBQyxNQUFpQixFQUFFLFNBQWtCO0lBQ2xFLFNBQVMsR0FBRyxFQUFFO1NBQ1gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ25DLElBQUksQ0FBQyxTQUFTLENBQUM7U0FDZixTQUFTLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN2QixJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRWpCLE9BQU8sRUFBRTtTQUNOLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDakQsSUFBSSxDQUFDLFNBQVMsQ0FBQztTQUNmLFNBQVMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7QUFDNUIsQ0FBQztBQUVELE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxNQUFpQixFQUFFLFNBQWtCO0lBQ3RFLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUMvQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBZZWFyRmllbGQgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgKiBhcyBwbCBmcm9tIFwibm9kZWpzLXBvbGFyc1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVllYXJGaWVsZChfZmllbGQ6IFllYXJGaWVsZCwgZmllbGRFeHByOiBwbC5FeHByKSB7XG4gIGZpZWxkRXhwciA9IHBsXG4gICAgLndoZW4oZmllbGRFeHByLnN0ci5sZW5ndGhzKCkuZXEoNCkpXG4gICAgLnRoZW4oZmllbGRFeHByKVxuICAgIC5vdGhlcndpc2UocGwubGl0KG51bGwpKVxuICAgIC5jYXN0KHBsLkludDE2KVxuXG4gIHJldHVybiBwbFxuICAgIC53aGVuKGZpZWxkRXhwci5ndEVxKDApLmFuZChmaWVsZEV4cHIubHRFcSg5OTk5KSkpXG4gICAgLnRoZW4oZmllbGRFeHByKVxuICAgIC5vdGhlcndpc2UocGwubGl0KG51bGwpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5WWVhckZpZWxkKF9maWVsZDogWWVhckZpZWxkLCBmaWVsZEV4cHI6IHBsLkV4cHIpIHtcbiAgcmV0dXJuIGZpZWxkRXhwci5jYXN0KHBsLlN0cmluZykuc3RyLnpGaWxsKDQpXG59XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,50 @@
1
+ import * as pl from "nodejs-polars";
2
+ import { describe, expect, it } from "vitest";
3
+ import { denormalizeTable, normalizeTable } from "../../table/index.js";
4
+ describe("parseYearField", () => {
5
+ it.each([
6
+ // Tests ported from frictionless-py (string values only)
7
+ ["2000", 2000],
8
+ ["-2000", null],
9
+ ["20000", null],
10
+ ["3.14", null],
11
+ ["", null],
12
+ // Additional tests for completeness
13
+ ["0000", 0],
14
+ ["9999", 9999],
15
+ //[" 2023 ", 2023],
16
+ //[" 1984 ", 1984],
17
+ ["bad", null],
18
+ ["12345", null],
19
+ ["123", null],
20
+ ])("%s -> %s", async (cell, value) => {
21
+ const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
22
+ const schema = {
23
+ fields: [{ name: "name", type: "year" }],
24
+ };
25
+ const result = await normalizeTable(table, schema);
26
+ const frame = await result.collect();
27
+ expect(frame.getColumn("name").get(0)).toEqual(value);
28
+ });
29
+ });
30
+ describe("stringifyYearField", () => {
31
+ it.each([
32
+ // Basic integer years to string conversion
33
+ [2000, "2000"],
34
+ [2023, "2023"],
35
+ [1999, "1999"],
36
+ [0, "0000"],
37
+ [9999, "9999"],
38
+ // Edge cases with null values
39
+ [null, ""],
40
+ ])("%s -> %s", async (value, expected) => {
41
+ const table = pl.DataFrame([pl.Series("name", [value], pl.Int16)]).lazy();
42
+ const schema = {
43
+ fields: [{ name: "name", type: "year" }],
44
+ };
45
+ const result = await denormalizeTable(table, schema);
46
+ const frame = await result.collect();
47
+ expect(frame.toRecords()[0]?.name).toEqual(expected);
48
+ });
49
+ });
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieWVhci5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZmllbGQvdHlwZXMveWVhci5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFFdkUsUUFBUSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsRUFBRTtJQUM5QixFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ04seURBQXlEO1FBQ3pELENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztRQUNkLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQztRQUNmLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQztRQUNmLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztRQUNkLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQztRQUVWLG9DQUFvQztRQUNwQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDWCxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7UUFDZCxtQkFBbUI7UUFDbkIscUJBQXFCO1FBQ3JCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQztRQUNiLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQztRQUNmLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQztLQUNkLENBQUMsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUNuQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO1FBRXpFLE1BQU0sTUFBTSxHQUFHO1lBQ2IsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFlLEVBQUUsQ0FBQztTQUNsRCxDQUFBO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxjQUFjLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ2xELE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBRXBDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN2RCxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBO0FBRUYsUUFBUSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRTtJQUNsQyxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ04sMkNBQTJDO1FBQzNDLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQztRQUNkLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQztRQUNkLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQztRQUNkLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQztRQUNYLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQztRQUVkLDhCQUE4QjtRQUM5QixDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7S0FDWCxDQUFDLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUU7UUFDdkMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUV6RSxNQUFNLE1BQU0sR0FBRztZQUNiLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBZSxFQUFFLENBQUM7U0FDbEQsQ0FBQTtRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ3BELE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBRXBDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3RELENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwbCBmcm9tIFwibm9kZWpzLXBvbGFyc1wiXG5pbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlc3RcIlxuaW1wb3J0IHsgZGVub3JtYWxpemVUYWJsZSwgbm9ybWFsaXplVGFibGUgfSBmcm9tIFwiLi4vLi4vdGFibGUvaW5kZXgudHNcIlxuXG5kZXNjcmliZShcInBhcnNlWWVhckZpZWxkXCIsICgpID0+IHtcbiAgaXQuZWFjaChbXG4gICAgLy8gVGVzdHMgcG9ydGVkIGZyb20gZnJpY3Rpb25sZXNzLXB5IChzdHJpbmcgdmFsdWVzIG9ubHkpXG4gICAgW1wiMjAwMFwiLCAyMDAwXSxcbiAgICBbXCItMjAwMFwiLCBudWxsXSxcbiAgICBbXCIyMDAwMFwiLCBudWxsXSxcbiAgICBbXCIzLjE0XCIsIG51bGxdLFxuICAgIFtcIlwiLCBudWxsXSxcblxuICAgIC8vIEFkZGl0aW9uYWwgdGVzdHMgZm9yIGNvbXBsZXRlbmVzc1xuICAgIFtcIjAwMDBcIiwgMF0sXG4gICAgW1wiOTk5OVwiLCA5OTk5XSxcbiAgICAvL1tcIiAyMDIzIFwiLCAyMDIzXSxcbiAgICAvL1tcIiAgMTk4NCAgXCIsIDE5ODRdLFxuICAgIFtcImJhZFwiLCBudWxsXSxcbiAgICBbXCIxMjM0NVwiLCBudWxsXSxcbiAgICBbXCIxMjNcIiwgbnVsbF0sXG4gIF0pKFwiJXMgLT4gJXNcIiwgYXN5bmMgKGNlbGwsIHZhbHVlKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbC5EYXRhRnJhbWUoW3BsLlNlcmllcyhcIm5hbWVcIiwgW2NlbGxdLCBwbC5TdHJpbmcpXSkubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFt7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInllYXJcIiBhcyBjb25zdCB9XSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBub3JtYWxpemVUYWJsZSh0YWJsZSwgc2NoZW1hKVxuICAgIGNvbnN0IGZyYW1lID0gYXdhaXQgcmVzdWx0LmNvbGxlY3QoKVxuXG4gICAgZXhwZWN0KGZyYW1lLmdldENvbHVtbihcIm5hbWVcIikuZ2V0KDApKS50b0VxdWFsKHZhbHVlKVxuICB9KVxufSlcblxuZGVzY3JpYmUoXCJzdHJpbmdpZnlZZWFyRmllbGRcIiwgKCkgPT4ge1xuICBpdC5lYWNoKFtcbiAgICAvLyBCYXNpYyBpbnRlZ2VyIHllYXJzIHRvIHN0cmluZyBjb252ZXJzaW9uXG4gICAgWzIwMDAsIFwiMjAwMFwiXSxcbiAgICBbMjAyMywgXCIyMDIzXCJdLFxuICAgIFsxOTk5LCBcIjE5OTlcIl0sXG4gICAgWzAsIFwiMDAwMFwiXSxcbiAgICBbOTk5OSwgXCI5OTk5XCJdLFxuXG4gICAgLy8gRWRnZSBjYXNlcyB3aXRoIG51bGwgdmFsdWVzXG4gICAgW251bGwsIFwiXCJdLFxuICBdKShcIiVzIC0+ICVzXCIsIGFzeW5jICh2YWx1ZSwgZXhwZWN0ZWQpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsLkRhdGFGcmFtZShbcGwuU2VyaWVzKFwibmFtZVwiLCBbdmFsdWVdLCBwbC5JbnQxNildKS5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW3sgbmFtZTogXCJuYW1lXCIsIHR5cGU6IFwieWVhclwiIGFzIGNvbnN0IH1dLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlbm9ybWFsaXplVGFibGUodGFibGUsIHNjaGVtYSlcbiAgICBjb25zdCBmcmFtZSA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcblxuICAgIGV4cGVjdChmcmFtZS50b1JlY29yZHMoKVswXT8ubmFtZSkudG9FcXVhbChleHBlY3RlZClcbiAgfSlcbn0pXG4iXX0=
@@ -0,0 +1,4 @@
1
+ import type { YearmonthField } from "@frictionless-ts/metadata";
2
+ import * as pl from "nodejs-polars";
3
+ export declare function parseYearmonthField(_field: YearmonthField, fieldExpr: pl.Expr): pl.Expr;
4
+ export declare function stringifyYearmonthField(field: YearmonthField, fieldExpr: pl.Expr): pl.Expr;
@@ -0,0 +1,14 @@
1
+ import * as pl from "nodejs-polars";
2
+ export function parseYearmonthField(_field, fieldExpr) {
3
+ fieldExpr = fieldExpr.str.split("-").cast(pl.List(pl.Int16));
4
+ return fieldExpr;
5
+ }
6
+ export function stringifyYearmonthField(field, fieldExpr) {
7
+ return pl
8
+ .concatString([
9
+ fieldExpr.lst.get(0).cast(pl.String).str.zFill(4),
10
+ fieldExpr.lst.get(1).cast(pl.String).str.zFill(2),
11
+ ], "-")
12
+ .alias(field.name);
13
+ }
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieWVhcm1vbnRoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZmllbGQvdHlwZXMveWVhcm1vbnRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRW5DLE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsTUFBc0IsRUFDdEIsU0FBa0I7SUFFbEIsU0FBUyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBRTVELE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUM7QUFFRCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLEtBQXFCLEVBQ3JCLFNBQWtCO0lBRWxCLE9BQU8sRUFBRTtTQUNOLFlBQVksQ0FDWDtRQUNFLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDakQsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztLQUNsRCxFQUNELEdBQUcsQ0FDSjtTQUNBLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFZLENBQUE7QUFDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgWWVhcm1vbnRoRmllbGQgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgKiBhcyBwbCBmcm9tIFwibm9kZWpzLXBvbGFyc1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVllYXJtb250aEZpZWxkKFxuICBfZmllbGQ6IFllYXJtb250aEZpZWxkLFxuICBmaWVsZEV4cHI6IHBsLkV4cHIsXG4pIHtcbiAgZmllbGRFeHByID0gZmllbGRFeHByLnN0ci5zcGxpdChcIi1cIikuY2FzdChwbC5MaXN0KHBsLkludDE2KSlcblxuICByZXR1cm4gZmllbGRFeHByXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnlZZWFybW9udGhGaWVsZChcbiAgZmllbGQ6IFllYXJtb250aEZpZWxkLFxuICBmaWVsZEV4cHI6IHBsLkV4cHIsXG4pIHtcbiAgcmV0dXJuIHBsXG4gICAgLmNvbmNhdFN0cmluZyhcbiAgICAgIFtcbiAgICAgICAgZmllbGRFeHByLmxzdC5nZXQoMCkuY2FzdChwbC5TdHJpbmcpLnN0ci56RmlsbCg0KSxcbiAgICAgICAgZmllbGRFeHByLmxzdC5nZXQoMSkuY2FzdChwbC5TdHJpbmcpLnN0ci56RmlsbCgyKSxcbiAgICAgIF0sXG4gICAgICBcIi1cIixcbiAgICApXG4gICAgLmFsaWFzKGZpZWxkLm5hbWUpIGFzIHBsLkV4cHJcbn1cbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,36 @@
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("parseYearmonthField", () => {
6
+ it.each([
7
+ ["2000-01", [2000, 1]],
8
+ ["0-0", [0, 0]],
9
+ ])("%s -> %s", async (cell, value) => {
10
+ const table = pl.DataFrame([pl.Series("name", [cell], pl.String)]).lazy();
11
+ const schema = {
12
+ fields: [{ name: "name", type: "yearmonth" }],
13
+ };
14
+ const result = await normalizeTable(table, schema);
15
+ const frame = await result.collect();
16
+ expect(frame.toRecords()[0]?.name).toEqual(value);
17
+ });
18
+ });
19
+ describe("stringifyYearmonthField", () => {
20
+ it.each([
21
+ [[2000, 1], "2000-01"],
22
+ [[2023, 12], "2023-12"],
23
+ [[0, 0], "0000-00"],
24
+ ])("%s -> %s", async (value, expected) => {
25
+ const table = pl
26
+ .DataFrame([pl.Series("name", [value], pl.List(pl.Int16))])
27
+ .lazy();
28
+ const schema = {
29
+ fields: [{ name: "name", type: "yearmonth" }],
30
+ };
31
+ const result = await denormalizeTable(table, schema);
32
+ const frame = await result.collect();
33
+ expect(frame.toRecords()[0]?.name).toEqual(expected);
34
+ });
35
+ });
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieWVhcm1vbnRoLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9maWVsZC90eXBlcy95ZWFybW9udGguc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUNuQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBQ3JELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBRXZELFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUU7SUFDbkMsRUFBRSxDQUFDLElBQUksQ0FBQztRQUNOLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ2hCLENBQUMsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUNuQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO1FBRXpFLE1BQU0sTUFBTSxHQUFHO1lBQ2IsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxXQUFvQixFQUFFLENBQUM7U0FDdkQsQ0FBQTtRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sY0FBYyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUNsRCxNQUFNLEtBQUssR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUVwQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNuRCxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBO0FBRUYsUUFBUSxDQUFDLHlCQUF5QixFQUFFLEdBQUcsRUFBRTtJQUN2QyxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ04sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUM7UUFDdEIsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUM7S0FDcEIsQ0FBQyxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLEVBQUU7YUFDYixTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMxRCxJQUFJLEVBQUUsQ0FBQTtRQUVULE1BQU0sTUFBTSxHQUFHO1lBQ2IsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxXQUFvQixFQUFFLENBQUM7U0FDdkQsQ0FBQTtRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ3BELE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBRXBDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3RELENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwbCBmcm9tIFwibm9kZWpzLXBvbGFyc1wiXG5pbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlc3RcIlxuaW1wb3J0IHsgbm9ybWFsaXplVGFibGUgfSBmcm9tIFwiLi4vLi4vdGFibGUvaW5kZXgudHNcIlxuaW1wb3J0IHsgZGVub3JtYWxpemVUYWJsZSB9IGZyb20gXCIuLi8uLi90YWJsZS9pbmRleC50c1wiXG5cbmRlc2NyaWJlKFwicGFyc2VZZWFybW9udGhGaWVsZFwiLCAoKSA9PiB7XG4gIGl0LmVhY2goW1xuICAgIFtcIjIwMDAtMDFcIiwgWzIwMDAsIDFdXSxcbiAgICBbXCIwLTBcIiwgWzAsIDBdXSxcbiAgXSkoXCIlcyAtPiAlc1wiLCBhc3luYyAoY2VsbCwgdmFsdWUpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsLkRhdGFGcmFtZShbcGwuU2VyaWVzKFwibmFtZVwiLCBbY2VsbF0sIHBsLlN0cmluZyldKS5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW3sgbmFtZTogXCJuYW1lXCIsIHR5cGU6IFwieWVhcm1vbnRoXCIgYXMgY29uc3QgfV0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbm9ybWFsaXplVGFibGUodGFibGUsIHNjaGVtYSlcbiAgICBjb25zdCBmcmFtZSA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcblxuICAgIGV4cGVjdChmcmFtZS50b1JlY29yZHMoKVswXT8ubmFtZSkudG9FcXVhbCh2YWx1ZSlcbiAgfSlcbn0pXG5cbmRlc2NyaWJlKFwic3RyaW5naWZ5WWVhcm1vbnRoRmllbGRcIiwgKCkgPT4ge1xuICBpdC5lYWNoKFtcbiAgICBbWzIwMDAsIDFdLCBcIjIwMDAtMDFcIl0sXG4gICAgW1syMDIzLCAxMl0sIFwiMjAyMy0xMlwiXSxcbiAgICBbWzAsIDBdLCBcIjAwMDAtMDBcIl0sXG4gIF0pKFwiJXMgLT4gJXNcIiwgYXN5bmMgKHZhbHVlLCBleHBlY3RlZCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoW3BsLlNlcmllcyhcIm5hbWVcIiwgW3ZhbHVlXSwgcGwuTGlzdChwbC5JbnQxNikpXSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW3sgbmFtZTogXCJuYW1lXCIsIHR5cGU6IFwieWVhcm1vbnRoXCIgYXMgY29uc3QgfV0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVub3JtYWxpemVUYWJsZSh0YWJsZSwgc2NoZW1hKVxuICAgIGNvbnN0IGZyYW1lID0gYXdhaXQgcmVzdWx0LmNvbGxlY3QoKVxuXG4gICAgZXhwZWN0KGZyYW1lLnRvUmVjb3JkcygpWzBdPy5uYW1lKS50b0VxdWFsKGV4cGVjdGVkKVxuICB9KVxufSlcbiJdfQ==
@@ -0,0 +1,4 @@
1
+ import * as pl from "nodejs-polars";
2
+ export declare function isObject(value: any): value is Record<string, any>;
3
+ export declare function arrayDiff(a: string[], b: string[]): string[];
4
+ export declare function evaluateExpression(expr: pl.Expr): any;
@@ -0,0 +1,12 @@
1
+ import * as pl from "nodejs-polars";
2
+ export function isObject(value) {
3
+ return typeof value === "object" && value !== null && !Array.isArray(value);
4
+ }
5
+ export function arrayDiff(a, b) {
6
+ return a.filter(x => !b.includes(x));
7
+ }
8
+ export function evaluateExpression(expr) {
9
+ // @ts-ignore
10
+ return pl.select(expr.alias("value")).toRecords()[0].value;
11
+ }
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2hlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFbkMsTUFBTSxVQUFVLFFBQVEsQ0FBQyxLQUFVO0lBQ2pDLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQzdFLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUyxDQUFDLENBQVcsRUFBRSxDQUFXO0lBQ2hELE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ3RDLENBQUM7QUFFRCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsSUFBYTtJQUM5QyxhQUFhO0lBQ2IsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUE7QUFDNUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBsIGZyb20gXCJub2RlanMtcG9sYXJzXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5RGlmZihhOiBzdHJpbmdbXSwgYjogc3RyaW5nW10pIHtcbiAgcmV0dXJuIGEuZmlsdGVyKHggPT4gIWIuaW5jbHVkZXMoeCkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBldmFsdWF0ZUV4cHJlc3Npb24oZXhwcjogcGwuRXhwcikge1xuICAvLyBAdHMtaWdub3JlXG4gIHJldHVybiBwbC5zZWxlY3QoZXhwci5hbGlhcyhcInZhbHVlXCIpKS50b1JlY29yZHMoKVswXS52YWx1ZVxufVxuIl19
@@ -0,0 +1,40 @@
1
+ export type { DataRecord } from "./data/index.ts";
2
+ export type { DataRow } from "./data/index.ts";
3
+ export type { DenormalizeFieldOptions } from "./field/index.ts";
4
+ export type { DialectOptions } from "./dialect/index.ts";
5
+ export type { Frame } from "./table/index.ts";
6
+ export type { InferDialectOptions } from "./dialect/index.ts";
7
+ export type { InferSchemaOptions } from "./schema/index.ts";
8
+ export type { LoadTableOptions } from "./plugin.ts";
9
+ export type { PolarsField } from "./field/index.ts";
10
+ export type { PolarsSchema } from "./schema/index.ts";
11
+ export type { SaveTableOptions } from "./plugin.ts";
12
+ export type { SchemaOptions } from "./schema/index.ts";
13
+ export type { Table } from "./table/index.ts";
14
+ export type { TablePlugin } from "./plugin.ts";
15
+ export { ArrowPlugin } from "./plugins/arrow/index.ts";
16
+ export { CsvPlugin } from "./plugins/csv/index.ts";
17
+ export { InlinePlugin } from "./plugins/inline/index.ts";
18
+ export { JsonPlugin } from "./plugins/json/index.ts";
19
+ export { OdsPlugin } from "./plugins/ods/index.ts";
20
+ export { ParquetPlugin } from "./plugins/parquet/index.ts";
21
+ export { XlsxPlugin } from "./plugins/xlxs/index.ts";
22
+ export { denormalizeTable } from "./table/index.ts";
23
+ export { inferSchemaFromSample } from "./schema/index.ts";
24
+ export { inferSchemaFromTable } from "./schema/index.ts";
25
+ export { inspectTable } from "./table/index.ts";
26
+ export { loadArrowTable } from "./plugins/arrow/index.ts";
27
+ export { loadCsvTable } from "./plugins/csv/index.ts";
28
+ export { loadInlineTable } from "./plugins/inline/index.ts";
29
+ export { loadJsonTable } from "./plugins/json/index.ts";
30
+ export { loadOdsTable } from "./plugins/ods/index.ts";
31
+ export { loadParquetTable } from "./plugins/parquet/index.ts";
32
+ export { loadXlsxTable } from "./plugins/xlxs/index.ts";
33
+ export { normalizeTable } from "./table/index.ts";
34
+ export { queryTable } from "./table/index.ts";
35
+ export { saveArrowTable } from "./plugins/arrow/index.ts";
36
+ export { saveCsvTable } from "./plugins/csv/index.ts";
37
+ export { saveJsonTable } from "./plugins/json/index.ts";
38
+ export { saveOdsTable } from "./plugins/ods/index.ts";
39
+ export { saveParquetTable } from "./plugins/parquet/index.ts";
40
+ export { saveXlsxTable } from "./plugins/xlxs/index.ts";
package/build/index.js ADDED
@@ -0,0 +1,27 @@
1
+ export { ArrowPlugin } from "./plugins/arrow/index.js";
2
+ export { CsvPlugin } from "./plugins/csv/index.js";
3
+ export { InlinePlugin } from "./plugins/inline/index.js";
4
+ export { JsonPlugin } from "./plugins/json/index.js";
5
+ export { OdsPlugin } from "./plugins/ods/index.js";
6
+ export { ParquetPlugin } from "./plugins/parquet/index.js";
7
+ export { XlsxPlugin } from "./plugins/xlxs/index.js";
8
+ export { denormalizeTable } from "./table/index.js";
9
+ export { inferSchemaFromSample } from "./schema/index.js";
10
+ export { inferSchemaFromTable } from "./schema/index.js";
11
+ export { inspectTable } from "./table/index.js";
12
+ export { loadArrowTable } from "./plugins/arrow/index.js";
13
+ export { loadCsvTable } from "./plugins/csv/index.js";
14
+ export { loadInlineTable } from "./plugins/inline/index.js";
15
+ export { loadJsonTable } from "./plugins/json/index.js";
16
+ export { loadOdsTable } from "./plugins/ods/index.js";
17
+ export { loadParquetTable } from "./plugins/parquet/index.js";
18
+ export { loadXlsxTable } from "./plugins/xlxs/index.js";
19
+ export { normalizeTable } from "./table/index.js";
20
+ export { queryTable } from "./table/index.js";
21
+ export { saveArrowTable } from "./plugins/arrow/index.js";
22
+ export { saveCsvTable } from "./plugins/csv/index.js";
23
+ export { saveJsonTable } from "./plugins/json/index.js";
24
+ export { saveOdsTable } from "./plugins/ods/index.js";
25
+ export { saveParquetTable } from "./plugins/parquet/index.js";
26
+ export { saveXlsxTable } from "./plugins/xlxs/index.js";
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFlQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFDdEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQ2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUN4RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDcEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQ2xELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUMxRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFFcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDbkQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDekQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQy9DLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQzNELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFDckQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNEJBQTRCLENBQUE7QUFDN0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFBO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNqRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQ3JELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRCQUE0QixDQUFBO0FBQzdELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIHsgRGF0YVJlY29yZCB9IGZyb20gXCIuL2RhdGEvaW5kZXgudHNcIlxuZXhwb3J0IHR5cGUgeyBEYXRhUm93IH0gZnJvbSBcIi4vZGF0YS9pbmRleC50c1wiXG5leHBvcnQgdHlwZSB7IERlbm9ybWFsaXplRmllbGRPcHRpb25zIH0gZnJvbSBcIi4vZmllbGQvaW5kZXgudHNcIlxuZXhwb3J0IHR5cGUgeyBEaWFsZWN0T3B0aW9ucyB9IGZyb20gXCIuL2RpYWxlY3QvaW5kZXgudHNcIlxuZXhwb3J0IHR5cGUgeyBGcmFtZSB9IGZyb20gXCIuL3RhYmxlL2luZGV4LnRzXCJcbmV4cG9ydCB0eXBlIHsgSW5mZXJEaWFsZWN0T3B0aW9ucyB9IGZyb20gXCIuL2RpYWxlY3QvaW5kZXgudHNcIlxuZXhwb3J0IHR5cGUgeyBJbmZlclNjaGVtYU9wdGlvbnMgfSBmcm9tIFwiLi9zY2hlbWEvaW5kZXgudHNcIlxuZXhwb3J0IHR5cGUgeyBMb2FkVGFibGVPcHRpb25zIH0gZnJvbSBcIi4vcGx1Z2luLnRzXCJcbmV4cG9ydCB0eXBlIHsgUG9sYXJzRmllbGQgfSBmcm9tIFwiLi9maWVsZC9pbmRleC50c1wiXG5leHBvcnQgdHlwZSB7IFBvbGFyc1NjaGVtYSB9IGZyb20gXCIuL3NjaGVtYS9pbmRleC50c1wiXG5leHBvcnQgdHlwZSB7IFNhdmVUYWJsZU9wdGlvbnMgfSBmcm9tIFwiLi9wbHVnaW4udHNcIlxuZXhwb3J0IHR5cGUgeyBTY2hlbWFPcHRpb25zIH0gZnJvbSBcIi4vc2NoZW1hL2luZGV4LnRzXCJcbmV4cG9ydCB0eXBlIHsgVGFibGUgfSBmcm9tIFwiLi90YWJsZS9pbmRleC50c1wiXG5leHBvcnQgdHlwZSB7IFRhYmxlUGx1Z2luIH0gZnJvbSBcIi4vcGx1Z2luLnRzXCJcblxuZXhwb3J0IHsgQXJyb3dQbHVnaW4gfSBmcm9tIFwiLi9wbHVnaW5zL2Fycm93L2luZGV4LnRzXCJcbmV4cG9ydCB7IENzdlBsdWdpbiB9IGZyb20gXCIuL3BsdWdpbnMvY3N2L2luZGV4LnRzXCJcbmV4cG9ydCB7IElubGluZVBsdWdpbiB9IGZyb20gXCIuL3BsdWdpbnMvaW5saW5lL2luZGV4LnRzXCJcbmV4cG9ydCB7IEpzb25QbHVnaW4gfSBmcm9tIFwiLi9wbHVnaW5zL2pzb24vaW5kZXgudHNcIlxuZXhwb3J0IHsgT2RzUGx1Z2luIH0gZnJvbSBcIi4vcGx1Z2lucy9vZHMvaW5kZXgudHNcIlxuZXhwb3J0IHsgUGFycXVldFBsdWdpbiB9IGZyb20gXCIuL3BsdWdpbnMvcGFycXVldC9pbmRleC50c1wiXG5leHBvcnQgeyBYbHN4UGx1Z2luIH0gZnJvbSBcIi4vcGx1Z2lucy94bHhzL2luZGV4LnRzXCJcblxuZXhwb3J0IHsgZGVub3JtYWxpemVUYWJsZSB9IGZyb20gXCIuL3RhYmxlL2luZGV4LnRzXCJcbmV4cG9ydCB7IGluZmVyU2NoZW1hRnJvbVNhbXBsZSB9IGZyb20gXCIuL3NjaGVtYS9pbmRleC50c1wiXG5leHBvcnQgeyBpbmZlclNjaGVtYUZyb21UYWJsZSB9IGZyb20gXCIuL3NjaGVtYS9pbmRleC50c1wiXG5leHBvcnQgeyBpbnNwZWN0VGFibGUgfSBmcm9tIFwiLi90YWJsZS9pbmRleC50c1wiXG5leHBvcnQgeyBsb2FkQXJyb3dUYWJsZSB9IGZyb20gXCIuL3BsdWdpbnMvYXJyb3cvaW5kZXgudHNcIlxuZXhwb3J0IHsgbG9hZENzdlRhYmxlIH0gZnJvbSBcIi4vcGx1Z2lucy9jc3YvaW5kZXgudHNcIlxuZXhwb3J0IHsgbG9hZElubGluZVRhYmxlIH0gZnJvbSBcIi4vcGx1Z2lucy9pbmxpbmUvaW5kZXgudHNcIlxuZXhwb3J0IHsgbG9hZEpzb25UYWJsZSB9IGZyb20gXCIuL3BsdWdpbnMvanNvbi9pbmRleC50c1wiXG5leHBvcnQgeyBsb2FkT2RzVGFibGUgfSBmcm9tIFwiLi9wbHVnaW5zL29kcy9pbmRleC50c1wiXG5leHBvcnQgeyBsb2FkUGFycXVldFRhYmxlIH0gZnJvbSBcIi4vcGx1Z2lucy9wYXJxdWV0L2luZGV4LnRzXCJcbmV4cG9ydCB7IGxvYWRYbHN4VGFibGUgfSBmcm9tIFwiLi9wbHVnaW5zL3hseHMvaW5kZXgudHNcIlxuZXhwb3J0IHsgbm9ybWFsaXplVGFibGUgfSBmcm9tIFwiLi90YWJsZS9pbmRleC50c1wiXG5leHBvcnQgeyBxdWVyeVRhYmxlIH0gZnJvbSBcIi4vdGFibGUvaW5kZXgudHNcIlxuZXhwb3J0IHsgc2F2ZUFycm93VGFibGUgfSBmcm9tIFwiLi9wbHVnaW5zL2Fycm93L2luZGV4LnRzXCJcbmV4cG9ydCB7IHNhdmVDc3ZUYWJsZSB9IGZyb20gXCIuL3BsdWdpbnMvY3N2L2luZGV4LnRzXCJcbmV4cG9ydCB7IHNhdmVKc29uVGFibGUgfSBmcm9tIFwiLi9wbHVnaW5zL2pzb24vaW5kZXgudHNcIlxuZXhwb3J0IHsgc2F2ZU9kc1RhYmxlIH0gZnJvbSBcIi4vcGx1Z2lucy9vZHMvaW5kZXgudHNcIlxuZXhwb3J0IHsgc2F2ZVBhcnF1ZXRUYWJsZSB9IGZyb20gXCIuL3BsdWdpbnMvcGFycXVldC9pbmRleC50c1wiXG5leHBvcnQgeyBzYXZlWGxzeFRhYmxlIH0gZnJvbSBcIi4vcGx1Z2lucy94bHhzL2luZGV4LnRzXCJcbiJdfQ==
@@ -0,0 +1,27 @@
1
+ import type { SavePackageOptions } from "@frictionless-ts/dataset";
2
+ import type { DatasetPlugin } from "@frictionless-ts/dataset";
3
+ import type { Dialect, Package, Resource, Schema } from "@frictionless-ts/metadata";
4
+ import type { DialectOptions, InferDialectOptions } from "./dialect/index.ts";
5
+ import type { InferSchemaOptions, SchemaOptions } from "./schema/index.ts";
6
+ import type { Table } from "./table/index.ts";
7
+ export type LoadTableOptions = InferDialectOptions & InferSchemaOptions & {
8
+ denormalized?: boolean;
9
+ };
10
+ export type SaveTableOptions = DialectOptions & SchemaOptions & {
11
+ path: string;
12
+ format?: string;
13
+ dialect?: Dialect;
14
+ schema?: Schema;
15
+ overwrite?: boolean;
16
+ };
17
+ export interface TablePlugin extends DatasetPlugin {
18
+ savePackage?(dataPackage: Package, options: SavePackageOptions & {
19
+ plugins?: TablePlugin[];
20
+ }): Promise<{
21
+ path?: string;
22
+ } | undefined>;
23
+ inferDialect?(resource: Partial<Resource>, options?: InferDialectOptions): Promise<Dialect | undefined>;
24
+ inferSchema?(resource: Partial<Resource>, options?: InferSchemaOptions): Promise<Schema | undefined>;
25
+ loadTable?(resource: Partial<Resource>, options?: LoadTableOptions): Promise<Table | undefined>;
26
+ saveTable?(table: Table, options: SaveTableOptions): Promise<string | undefined>;
27
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFNhdmVQYWNrYWdlT3B0aW9ucyB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL2RhdGFzZXRcIlxuaW1wb3J0IHR5cGUgeyBEYXRhc2V0UGx1Z2luIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvZGF0YXNldFwiXG5pbXBvcnQgdHlwZSB7XG4gIERpYWxlY3QsXG4gIFBhY2thZ2UsXG4gIFJlc291cmNlLFxuICBTY2hlbWEsXG59IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB0eXBlIHsgRGlhbGVjdE9wdGlvbnMsIEluZmVyRGlhbGVjdE9wdGlvbnMgfSBmcm9tIFwiLi9kaWFsZWN0L2luZGV4LnRzXCJcbmltcG9ydCB0eXBlIHsgSW5mZXJTY2hlbWFPcHRpb25zLCBTY2hlbWFPcHRpb25zIH0gZnJvbSBcIi4vc2NoZW1hL2luZGV4LnRzXCJcbmltcG9ydCB0eXBlIHsgVGFibGUgfSBmcm9tIFwiLi90YWJsZS9pbmRleC50c1wiXG5cbmV4cG9ydCB0eXBlIExvYWRUYWJsZU9wdGlvbnMgPSBJbmZlckRpYWxlY3RPcHRpb25zICZcbiAgSW5mZXJTY2hlbWFPcHRpb25zICYge1xuICAgIGRlbm9ybWFsaXplZD86IGJvb2xlYW5cbiAgfVxuXG5leHBvcnQgdHlwZSBTYXZlVGFibGVPcHRpb25zID0gRGlhbGVjdE9wdGlvbnMgJlxuICBTY2hlbWFPcHRpb25zICYge1xuICAgIHBhdGg6IHN0cmluZ1xuICAgIGZvcm1hdD86IHN0cmluZ1xuICAgIGRpYWxlY3Q/OiBEaWFsZWN0XG4gICAgc2NoZW1hPzogU2NoZW1hXG4gICAgb3ZlcndyaXRlPzogYm9vbGVhblxuICB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVQbHVnaW4gZXh0ZW5kcyBEYXRhc2V0UGx1Z2luIHtcbiAgc2F2ZVBhY2thZ2U/KFxuICAgIGRhdGFQYWNrYWdlOiBQYWNrYWdlLFxuICAgIG9wdGlvbnM6IFNhdmVQYWNrYWdlT3B0aW9ucyAmIHsgcGx1Z2lucz86IFRhYmxlUGx1Z2luW10gfSxcbiAgKTogUHJvbWlzZTx7IHBhdGg/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZD5cblxuICBpbmZlckRpYWxlY3Q/KFxuICAgIHJlc291cmNlOiBQYXJ0aWFsPFJlc291cmNlPixcbiAgICBvcHRpb25zPzogSW5mZXJEaWFsZWN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxEaWFsZWN0IHwgdW5kZWZpbmVkPlxuXG4gIGluZmVyU2NoZW1hPyhcbiAgICByZXNvdXJjZTogUGFydGlhbDxSZXNvdXJjZT4sXG4gICAgb3B0aW9ucz86IEluZmVyU2NoZW1hT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxTY2hlbWEgfCB1bmRlZmluZWQ+XG5cbiAgbG9hZFRhYmxlPyhcbiAgICByZXNvdXJjZTogUGFydGlhbDxSZXNvdXJjZT4sXG4gICAgb3B0aW9ucz86IExvYWRUYWJsZU9wdGlvbnMsXG4gICk6IFByb21pc2U8VGFibGUgfCB1bmRlZmluZWQ+XG5cbiAgc2F2ZVRhYmxlPyhcbiAgICB0YWJsZTogVGFibGUsXG4gICAgb3B0aW9uczogU2F2ZVRhYmxlT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export * from "./table/index.ts";
2
+ export * from "./plugin.ts";
@@ -0,0 +1,3 @@
1
+ export * from "./table/index.js";
2
+ export * from "./plugin.js";
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbHVnaW5zL2Fycm93L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsa0JBQWtCLENBQUE7QUFDaEMsY0FBYyxhQUFhLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi90YWJsZS9pbmRleC50c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9wbHVnaW4udHNcIlxuIl19
@@ -0,0 +1,7 @@
1
+ import type { Resource } from "@frictionless-ts/metadata";
2
+ import type { LoadTableOptions, SaveTableOptions, TablePlugin } from "../../plugin.ts";
3
+ import type { Table } from "../../table/index.ts";
4
+ export declare class ArrowPlugin implements TablePlugin {
5
+ loadTable(resource: Partial<Resource>, options?: LoadTableOptions): Promise<import("nodejs-polars").LazyDataFrame<any> | undefined>;
6
+ saveTable(table: Table, options: SaveTableOptions): Promise<string | undefined>;
7
+ }