@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,304 @@
1
+ import * as pl from "nodejs-polars";
2
+ import { describe, expect, it } from "vitest";
3
+ import { inferSchemaFromTable } from "./infer.js";
4
+ describe("inferSchemaFromTable", () => {
5
+ it("should infer from native types", async () => {
6
+ const table = pl
7
+ .DataFrame({
8
+ integer: pl.Series("integer", [1, 2], pl.Int32),
9
+ number: [1.1, 2.2],
10
+ })
11
+ .lazy();
12
+ const schema = {
13
+ fields: [
14
+ { name: "integer", type: "integer" },
15
+ { name: "number", type: "number" },
16
+ ],
17
+ };
18
+ expect(await inferSchemaFromTable(table)).toEqual(schema);
19
+ });
20
+ it("should infer integers from floats", async () => {
21
+ const table = pl
22
+ .DataFrame({
23
+ id: [1.0, 2.0, 3.0],
24
+ count: [10.0, 20.0, 30.0],
25
+ })
26
+ .lazy();
27
+ const schema = {
28
+ fields: [
29
+ { name: "id", type: "integer" },
30
+ { name: "count", type: "integer" },
31
+ ],
32
+ };
33
+ expect(await inferSchemaFromTable(table)).toEqual(schema);
34
+ });
35
+ it("should infer numeric", async () => {
36
+ const table = pl
37
+ .DataFrame({
38
+ name1: ["1", "2", "3"],
39
+ name2: ["1,000", "2,000", "3,000"],
40
+ name3: ["1.1", "2.2", "3.3"],
41
+ name4: ["1,000.1", "2,000.2", "3,000.3"],
42
+ })
43
+ .lazy();
44
+ const schema = {
45
+ fields: [
46
+ { name: "name1", type: "integer" },
47
+ { name: "name2", type: "integer", groupChar: "," },
48
+ { name: "name3", type: "number" },
49
+ { name: "name4", type: "number", groupChar: "," },
50
+ ],
51
+ };
52
+ expect(await inferSchemaFromTable(table)).toEqual(schema);
53
+ });
54
+ it("should infer numeric (commaDecimal)", async () => {
55
+ const table = pl
56
+ .DataFrame({
57
+ name1: ["1.000", "2.000", "3.000"],
58
+ name2: ["1.000,5", "2.000,5", "3.000,5"],
59
+ })
60
+ .lazy();
61
+ const schema = {
62
+ fields: [
63
+ { name: "name1", type: "integer", groupChar: "." },
64
+ { name: "name2", type: "number", decimalChar: ",", groupChar: "." },
65
+ ],
66
+ };
67
+ expect(await inferSchemaFromTable(table, { commaDecimal: true })).toEqual(schema);
68
+ });
69
+ it("should infer booleans", async () => {
70
+ const table = pl
71
+ .DataFrame({
72
+ name1: ["true", "True", "TRUE"],
73
+ name2: ["false", "False", "FALSE"],
74
+ })
75
+ .lazy();
76
+ const schema = {
77
+ fields: [
78
+ { name: "name1", type: "boolean" },
79
+ { name: "name2", type: "boolean" },
80
+ ],
81
+ };
82
+ expect(await inferSchemaFromTable(table)).toEqual(schema);
83
+ });
84
+ it("should infer objects", async () => {
85
+ const table = pl
86
+ .DataFrame({
87
+ name1: ['{"a": 1}'],
88
+ name2: ["{}"],
89
+ })
90
+ .lazy();
91
+ const schema = {
92
+ fields: [
93
+ { name: "name1", type: "object" },
94
+ { name: "name2", type: "object" },
95
+ ],
96
+ };
97
+ expect(await inferSchemaFromTable(table)).toEqual(schema);
98
+ });
99
+ it("should infer arrays", async () => {
100
+ const table = pl
101
+ .DataFrame({
102
+ name1: ["[1,2,3]"],
103
+ name2: ["[]"],
104
+ })
105
+ .lazy();
106
+ const schema = {
107
+ fields: [
108
+ { name: "name1", type: "array" },
109
+ { name: "name2", type: "array" },
110
+ ],
111
+ };
112
+ expect(await inferSchemaFromTable(table)).toEqual(schema);
113
+ });
114
+ it("should infer dates with ISO format", async () => {
115
+ const table = pl
116
+ .DataFrame({
117
+ name1: ["2023-01-15", "2023-02-20", "2023-03-25"],
118
+ })
119
+ .lazy();
120
+ const schema = {
121
+ fields: [{ name: "name1", type: "date" }],
122
+ };
123
+ expect(await inferSchemaFromTable(table)).toEqual(schema);
124
+ });
125
+ it("should infer dates with slash format", async () => {
126
+ const table = pl
127
+ .DataFrame({
128
+ yearFirst: ["2023/01/15", "2023/02/20", "2023/03/25"],
129
+ dayMonth: ["15/01/2023", "20/02/2023", "25/03/2023"],
130
+ monthDay: ["01/15/2023", "02/20/2023", "03/25/2023"],
131
+ })
132
+ .lazy();
133
+ const schemaDefault = {
134
+ fields: [
135
+ { name: "yearFirst", type: "date", format: "%Y/%m/%d" },
136
+ { name: "dayMonth", type: "date", format: "%d/%m/%Y" },
137
+ { name: "monthDay", type: "date", format: "%d/%m/%Y" },
138
+ ],
139
+ };
140
+ const schemaMonthFirst = {
141
+ fields: [
142
+ { name: "yearFirst", type: "date", format: "%Y/%m/%d" },
143
+ { name: "dayMonth", type: "date", format: "%m/%d/%Y" },
144
+ { name: "monthDay", type: "date", format: "%m/%d/%Y" },
145
+ ],
146
+ };
147
+ expect(await inferSchemaFromTable(table)).toEqual(schemaDefault);
148
+ expect(await inferSchemaFromTable(table, { monthFirst: true })).toEqual(schemaMonthFirst);
149
+ });
150
+ it("should infer dates with hyphen format", async () => {
151
+ const table = pl
152
+ .DataFrame({
153
+ dayMonth: ["15-01-2023", "20-02-2023", "25-03-2023"],
154
+ })
155
+ .lazy();
156
+ const schemaDefault = {
157
+ fields: [{ name: "dayMonth", type: "date", format: "%d-%m-%Y" }],
158
+ };
159
+ const schemaMonthFirst = {
160
+ fields: [{ name: "dayMonth", type: "date", format: "%m-%d-%Y" }],
161
+ };
162
+ expect(await inferSchemaFromTable(table)).toEqual(schemaDefault);
163
+ expect(await inferSchemaFromTable(table, { monthFirst: true })).toEqual(schemaMonthFirst);
164
+ });
165
+ it("should infer times with standard format", async () => {
166
+ const table = pl
167
+ .DataFrame({
168
+ fullTime: ["14:30:45", "08:15:30", "23:59:59"],
169
+ shortTime: ["14:30", "08:15", "23:59"],
170
+ })
171
+ .lazy();
172
+ const schema = {
173
+ fields: [
174
+ { name: "fullTime", type: "time" },
175
+ { name: "shortTime", type: "time", format: "%H:%M" },
176
+ ],
177
+ };
178
+ expect(await inferSchemaFromTable(table)).toEqual(schema);
179
+ });
180
+ it("should infer times with 12-hour format", async () => {
181
+ const table = pl
182
+ .DataFrame({
183
+ fullTime: ["2:30:45 PM", "8:15:30 AM", "11:59:59 PM"],
184
+ shortTime: ["2:30 PM", "8:15 AM", "11:59 PM"],
185
+ })
186
+ .lazy();
187
+ const schema = {
188
+ fields: [
189
+ { name: "fullTime", type: "time", format: "%I:%M:%S %p" },
190
+ { name: "shortTime", type: "time", format: "%I:%M %p" },
191
+ ],
192
+ };
193
+ expect(await inferSchemaFromTable(table)).toEqual(schema);
194
+ });
195
+ it("should infer times with timezone offset", async () => {
196
+ const table = pl
197
+ .DataFrame({
198
+ name: ["14:30:45+01:00", "08:15:30-05:00", "23:59:59+00:00"],
199
+ })
200
+ .lazy();
201
+ const schema = {
202
+ fields: [{ name: "name", type: "time" }],
203
+ };
204
+ expect(await inferSchemaFromTable(table)).toEqual(schema);
205
+ });
206
+ it("should infer datetimes with ISO format", async () => {
207
+ const table = pl
208
+ .DataFrame({
209
+ standard: [
210
+ "2023-01-15T14:30:45",
211
+ "2023-02-20T08:15:30",
212
+ "2023-03-25T23:59:59",
213
+ ],
214
+ utc: [
215
+ "2023-01-15T14:30:45Z",
216
+ "2023-02-20T08:15:30Z",
217
+ "2023-03-25T23:59:59Z",
218
+ ],
219
+ withTz: [
220
+ "2023-01-15T14:30:45+01:00",
221
+ "2023-02-20T08:15:30-05:00",
222
+ "2023-03-25T23:59:59+00:00",
223
+ ],
224
+ withSpace: [
225
+ "2023-01-15 14:30:45",
226
+ "2023-02-20 08:15:30",
227
+ "2023-03-25 23:59:59",
228
+ ],
229
+ })
230
+ .lazy();
231
+ const schema = {
232
+ fields: [
233
+ { name: "standard", type: "datetime" },
234
+ { name: "utc", type: "datetime" },
235
+ { name: "withTz", type: "datetime" },
236
+ { name: "withSpace", type: "datetime", format: "%Y-%m-%d %H:%M:%S" },
237
+ ],
238
+ };
239
+ expect(await inferSchemaFromTable(table)).toEqual(schema);
240
+ });
241
+ it("should infer datetimes with custom formats", async () => {
242
+ const table = pl
243
+ .DataFrame({
244
+ shortDayMonth: [
245
+ "15/01/2023 14:30",
246
+ "20/02/2023 08:15",
247
+ "25/03/2023 23:59",
248
+ ],
249
+ fullDayMonth: [
250
+ "15/01/2023 14:30:45",
251
+ "20/02/2023 08:15:30",
252
+ "25/03/2023 23:59:59",
253
+ ],
254
+ shortMonthDay: [
255
+ "01/15/2023 14:30",
256
+ "02/20/2023 08:15",
257
+ "03/25/2023 23:59",
258
+ ],
259
+ fullMonthDay: [
260
+ "01/15/2023 14:30:45",
261
+ "02/20/2023 08:15:30",
262
+ "03/25/2023 23:59:59",
263
+ ],
264
+ })
265
+ .lazy();
266
+ const schemaDefault = {
267
+ fields: [
268
+ { name: "shortDayMonth", type: "datetime", format: "%d/%m/%Y %H:%M" },
269
+ { name: "fullDayMonth", type: "datetime", format: "%d/%m/%Y %H:%M:%S" },
270
+ { name: "shortMonthDay", type: "datetime", format: "%d/%m/%Y %H:%M" },
271
+ { name: "fullMonthDay", type: "datetime", format: "%d/%m/%Y %H:%M:%S" },
272
+ ],
273
+ };
274
+ const schemaMonthFirst = {
275
+ fields: [
276
+ { name: "shortDayMonth", type: "datetime", format: "%m/%d/%Y %H:%M" },
277
+ { name: "fullDayMonth", type: "datetime", format: "%m/%d/%Y %H:%M:%S" },
278
+ { name: "shortMonthDay", type: "datetime", format: "%m/%d/%Y %H:%M" },
279
+ { name: "fullMonthDay", type: "datetime", format: "%m/%d/%Y %H:%M:%S" },
280
+ ],
281
+ };
282
+ expect(await inferSchemaFromTable(table)).toEqual(schemaDefault);
283
+ expect(await inferSchemaFromTable(table, { monthFirst: true })).toEqual(schemaMonthFirst);
284
+ });
285
+ it("should infer lists", async () => {
286
+ const table = pl
287
+ .DataFrame({
288
+ numericList: ["1.5,2.3", "4.1,5.9", "7.2,8.6"],
289
+ integerList: ["1,2", "3,4", "5,6"],
290
+ singleValue: ["1.5", "2.3", "4.1"],
291
+ })
292
+ .lazy();
293
+ const schema = {
294
+ fields: [
295
+ { name: "numericList", type: "list", itemType: "number" },
296
+ { name: "integerList", type: "list", itemType: "integer" },
297
+ { name: "singleValue", type: "number" },
298
+ ],
299
+ missingValues: undefined,
300
+ };
301
+ expect(await inferSchemaFromTable(table)).toEqual(schema);
302
+ });
303
+ });
304
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mZXIuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NjaGVtYS9pbmZlci5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFFakQsUUFBUSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRTtJQUNwQyxFQUFFLENBQUMsZ0NBQWdDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDOUMsTUFBTSxLQUFLLEdBQUcsRUFBRTthQUNiLFNBQVMsQ0FBQztZQUNULE9BQU8sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQy9DLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7U0FDbkIsQ0FBQzthQUNELElBQUksRUFBRSxDQUFBO1FBRVQsTUFBTSxNQUFNLEdBQUc7WUFDYixNQUFNLEVBQUU7Z0JBQ04sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7Z0JBQ3BDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO2FBQ25DO1NBQ0YsQ0FBQTtRQUVELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzNELENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLG1DQUFtQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2pELE1BQU0sS0FBSyxHQUFHLEVBQUU7YUFDYixTQUFTLENBQUM7WUFDVCxFQUFFLEVBQUUsQ0FBQyxH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cm9tIFwibm9kZWpzLXBvbGFyc1wiXG5pbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlc3RcIlxuaW1wb3J0IHsgaW5mZXJTY2hlbWFGcm9tVGFibGUgfSBmcm9tIFwiLi9pbmZlci50c1wiXG5cbmRlc2NyaWJlKFwiaW5mZXJTY2hlbWFGcm9tVGFibGVcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCBpbmZlciBmcm9tIG5hdGl2ZSB0eXBlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIGludGVnZXI6IHBsLlNlcmllcyhcImludGVnZXJcIiwgWzEsIDJdLCBwbC5JbnQzMiksXG4gICAgICAgIG51bWJlcjogWzEuMSwgMi4yXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAgeyBuYW1lOiBcImludGVnZXJcIiwgdHlwZTogXCJpbnRlZ2VyXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIm51bWJlclwiLCB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGV4cGVjdChhd2FpdCBpbmZlclNjaGVtYUZyb21UYWJsZSh0YWJsZSkpLnRvRXF1YWwoc2NoZW1hKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGluZmVyIGludGVnZXJzIGZyb20gZmxvYXRzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgaWQ6IFsxLjAsIDIuMCwgMy4wXSxcbiAgICAgICAgY291bnQ6IFsxMC4wLCAyMC4wLCAzMC4wXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwiaW50ZWdlclwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJjb3VudFwiLCB0eXBlOiBcImludGVnZXJcIiB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBleHBlY3QoYXdhaXQgaW5mZXJTY2hlbWFGcm9tVGFibGUodGFibGUpKS50b0VxdWFsKHNjaGVtYSlcbiAgfSlcblxuICBpdChcInNob3VsZCBpbmZlciBudW1lcmljXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgbmFtZTE6IFtcIjFcIiwgXCIyXCIsIFwiM1wiXSxcbiAgICAgICAgbmFtZTI6IFtcIjEsMDAwXCIsIFwiMiwwMDBcIiwgXCIzLDAwMFwiXSxcbiAgICAgICAgbmFtZTM6IFtcIjEuMVwiLCBcIjIuMlwiLCBcIjMuM1wiXSxcbiAgICAgICAgbmFtZTQ6IFtcIjEsMDAwLjFcIiwgXCIyLDAwMC4yXCIsIFwiMywwMDAuM1wiXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAgeyBuYW1lOiBcIm5hbWUxXCIsIHR5cGU6IFwiaW50ZWdlclwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJuYW1lMlwiLCB0eXBlOiBcImludGVnZXJcIiwgZ3JvdXBDaGFyOiBcIixcIiB9LFxuICAgICAgICB7IG5hbWU6IFwibmFtZTNcIiwgdHlwZTogXCJudW1iZXJcIiB9LFxuICAgICAgICB7IG5hbWU6IFwibmFtZTRcIiwgdHlwZTogXCJudW1iZXJcIiwgZ3JvdXBDaGFyOiBcIixcIiB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBleHBlY3QoYXdhaXQgaW5mZXJTY2hlbWFGcm9tVGFibGUodGFibGUpKS50b0VxdWFsKHNjaGVtYSlcbiAgfSlcblxuICBpdChcInNob3VsZCBpbmZlciBudW1lcmljIChjb21tYURlY2ltYWwpXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgbmFtZTE6IFtcIjEuMDAwXCIsIFwiMi4wMDBcIiwgXCIzLjAwMFwiXSxcbiAgICAgICAgbmFtZTI6IFtcIjEuMDAwLDVcIiwgXCIyLjAwMCw1XCIsIFwiMy4wMDAsNVwiXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAgeyBuYW1lOiBcIm5hbWUxXCIsIHR5cGU6IFwiaW50ZWdlclwiLCBncm91cENoYXI6IFwiLlwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJuYW1lMlwiLCB0eXBlOiBcIm51bWJlclwiLCBkZWNpbWFsQ2hhcjogXCIsXCIsIGdyb3VwQ2hhcjogXCIuXCIgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgZXhwZWN0KGF3YWl0IGluZmVyU2NoZW1hRnJvbVRhYmxlKHRhYmxlLCB7IGNvbW1hRGVjaW1hbDogdHJ1ZSB9KSkudG9FcXVhbChcbiAgICAgIHNjaGVtYSxcbiAgICApXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaW5mZXIgYm9vbGVhbnNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBuYW1lMTogW1widHJ1ZVwiLCBcIlRydWVcIiwgXCJUUlVFXCJdLFxuICAgICAgICBuYW1lMjogW1wiZmFsc2VcIiwgXCJGYWxzZVwiLCBcIkZBTFNFXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7IG5hbWU6IFwibmFtZTFcIiwgdHlwZTogXCJib29sZWFuXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIm5hbWUyXCIsIHR5cGU6IFwiYm9vbGVhblwiIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGV4cGVjdChhd2FpdCBpbmZlclNjaGVtYUZyb21UYWJsZSh0YWJsZSkpLnRvRXF1YWwoc2NoZW1hKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGluZmVyIG9iamVjdHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBuYW1lMTogWyd7XCJhXCI6IDF9J10sXG4gICAgICAgIG5hbWUyOiBbXCJ7fVwiXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAgeyBuYW1lOiBcIm5hbWUxXCIsIHR5cGU6IFwib2JqZWN0XCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIm5hbWUyXCIsIHR5cGU6IFwib2JqZWN0XCIgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgZXhwZWN0KGF3YWl0IGluZmVyU2NoZW1hRnJvbVRhYmxlKHRhYmxlKSkudG9FcXVhbChzY2hlbWEpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaW5mZXIgYXJyYXlzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgbmFtZTE6IFtcIlsxLDIsM11cIl0sXG4gICAgICAgIG5hbWUyOiBbXCJbXVwiXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAgeyBuYW1lOiBcIm5hbWUxXCIsIHR5cGU6IFwiYXJyYXlcIiB9LFxuICAgICAgICB7IG5hbWU6IFwibmFtZTJcIiwgdHlwZTogXCJhcnJheVwiIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGV4cGVjdChhd2FpdCBpbmZlclNjaGVtYUZyb21UYWJsZSh0YWJsZSkpLnRvRXF1YWwoc2NoZW1hKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGluZmVyIGRhdGVzIHdpdGggSVNPIGZvcm1hdFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIG5hbWUxOiBbXCIyMDIzLTAxLTE1XCIsIFwiMjAyMy0wMi0yMFwiLCBcIjIwMjMtMDMtMjVcIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbeyBuYW1lOiBcIm5hbWUxXCIsIHR5cGU6IFwiZGF0ZVwiIH1dLFxuICAgIH1cblxuICAgIGV4cGVjdChhd2FpdCBpbmZlclNjaGVtYUZyb21UYWJsZSh0YWJsZSkpLnRvRXF1YWwoc2NoZW1hKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGluZmVyIGRhdGVzIHdpdGggc2xhc2ggZm9ybWF0XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgeWVhckZpcnN0OiBbXCIyMDIzLzAxLzE1XCIsIFwiMjAyMy8wMi8yMFwiLCBcIjIwMjMvMDMvMjVcIl0sXG4gICAgICAgIGRheU1vbnRoOiBbXCIxNS8wMS8yMDIzXCIsIFwiMjAvMDIvMjAyM1wiLCBcIjI1LzAzLzIwMjNcIl0sXG4gICAgICAgIG1vbnRoRGF5OiBbXCIwMS8xNS8yMDIzXCIsIFwiMDIvMjAvMjAyM1wiLCBcIjAzLzI1LzIwMjNcIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hRGVmYXVsdCA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7IG5hbWU6IFwieWVhckZpcnN0XCIsIHR5cGU6IFwiZGF0ZVwiLCBmb3JtYXQ6IFwiJVkvJW0vJWRcIiB9LFxuICAgICAgICB7IG5hbWU6IFwiZGF5TW9udGhcIiwgdHlwZTogXCJkYXRlXCIsIGZvcm1hdDogXCIlZC8lbS8lWVwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJtb250aERheVwiLCB0eXBlOiBcImRhdGVcIiwgZm9ybWF0OiBcIiVkLyVtLyVZXCIgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3Qgc2NoZW1hTW9udGhGaXJzdCA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7IG5hbWU6IFwieWVhckZpcnN0XCIsIHR5cGU6IFwiZGF0ZVwiLCBmb3JtYXQ6IFwiJVkvJW0vJWRcIiB9LFxuICAgICAgICB7IG5hbWU6IFwiZGF5TW9udGhcIiwgdHlwZTogXCJkYXRlXCIsIGZvcm1hdDogXCIlbS8lZC8lWVwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJtb250aERheVwiLCB0eXBlOiBcImRhdGVcIiwgZm9ybWF0OiBcIiVtLyVkLyVZXCIgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgZXhwZWN0KGF3YWl0IGluZmVyU2NoZW1hRnJvbVRhYmxlKHRhYmxlKSkudG9FcXVhbChzY2hlbWFEZWZhdWx0KVxuICAgIGV4cGVjdChhd2FpdCBpbmZlclNjaGVtYUZyb21UYWJsZSh0YWJsZSwgeyBtb250aEZpcnN0OiB0cnVlIH0pKS50b0VxdWFsKFxuICAgICAgc2NoZW1hTW9udGhGaXJzdCxcbiAgICApXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaW5mZXIgZGF0ZXMgd2l0aCBoeXBoZW4gZm9ybWF0XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgZGF5TW9udGg6IFtcIjE1LTAxLTIwMjNcIiwgXCIyMC0wMi0yMDIzXCIsIFwiMjUtMDMtMjAyM1wiXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWFEZWZhdWx0ID0ge1xuICAgICAgZmllbGRzOiBbeyBuYW1lOiBcImRheU1vbnRoXCIsIHR5cGU6IFwiZGF0ZVwiLCBmb3JtYXQ6IFwiJWQtJW0tJVlcIiB9XSxcbiAgICB9XG5cbiAgICBjb25zdCBzY2hlbWFNb250aEZpcnN0ID0ge1xuICAgICAgZmllbGRzOiBbeyBuYW1lOiBcImRheU1vbnRoXCIsIHR5cGU6IFwiZGF0ZVwiLCBmb3JtYXQ6IFwiJW0tJWQtJVlcIiB9XSxcbiAgICB9XG5cbiAgICBleHBlY3QoYXdhaXQgaW5mZXJTY2hlbWFGcm9tVGFibGUodGFibGUpKS50b0VxdWFsKHNjaGVtYURlZmF1bHQpXG4gICAgZXhwZWN0KGF3YWl0IGluZmVyU2NoZW1hRnJvbVRhYmxlKHRhYmxlLCB7IG1vbnRoRmlyc3Q6IHRydWUgfSkpLnRvRXF1YWwoXG4gICAgICBzY2hlbWFNb250aEZpcnN0LFxuICAgIClcbiAgfSlcblxuICBpdChcInNob3VsZCBpbmZlciB0aW1lcyB3aXRoIHN0YW5kYXJkIGZvcm1hdFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIGZ1bGxUaW1lOiBbXCIxNDozMDo0NVwiLCBcIjA4OjE1OjMwXCIsIFwiMjM6NTk6NTlcIl0sXG4gICAgICAgIHNob3J0VGltZTogW1wiMTQ6MzBcIiwgXCIwODoxNVwiLCBcIjIzOjU5XCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7IG5hbWU6IFwiZnVsbFRpbWVcIiwgdHlwZTogXCJ0aW1lXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInNob3J0VGltZVwiLCB0eXBlOiBcInRpbWVcIiwgZm9ybWF0OiBcIiVIOiVNXCIgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgZXhwZWN0KGF3YWl0IGluZmVyU2NoZW1hRnJvbVRhYmxlKHRhYmxlKSkudG9FcXVhbChzY2hlbWEpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaW5mZXIgdGltZXMgd2l0aCAxMi1ob3VyIGZvcm1hdFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIGZ1bGxUaW1lOiBbXCIyOjMwOjQ1IFBNXCIsIFwiODoxNTozMCBBTVwiLCBcIjExOjU5OjU5IFBNXCJdLFxuICAgICAgICBzaG9ydFRpbWU6IFtcIjI6MzAgUE1cIiwgXCI4OjE1IEFNXCIsIFwiMTE6NTkgUE1cIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHsgbmFtZTogXCJmdWxsVGltZVwiLCB0eXBlOiBcInRpbWVcIiwgZm9ybWF0OiBcIiVJOiVNOiVTICVwXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInNob3J0VGltZVwiLCB0eXBlOiBcInRpbWVcIiwgZm9ybWF0OiBcIiVJOiVNICVwXCIgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgZXhwZWN0KGF3YWl0IGluZmVyU2NoZW1hRnJvbVRhYmxlKHRhYmxlKSkudG9FcXVhbChzY2hlbWEpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaW5mZXIgdGltZXMgd2l0aCB0aW1lem9uZSBvZmZzZXRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBuYW1lOiBbXCIxNDozMDo0NSswMTowMFwiLCBcIjA4OjE1OjMwLTA1OjAwXCIsIFwiMjM6NTk6NTkrMDA6MDBcIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJ0aW1lXCIgfV0sXG4gICAgfVxuXG4gICAgZXhwZWN0KGF3YWl0IGluZmVyU2NoZW1hRnJvbVRhYmxlKHRhYmxlKSkudG9FcXVhbChzY2hlbWEpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaW5mZXIgZGF0ZXRpbWVzIHdpdGggSVNPIGZvcm1hdFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIHN0YW5kYXJkOiBbXG4gICAgICAgICAgXCIyMDIzLTAxLTE1VDE0OjMwOjQ1XCIsXG4gICAgICAgICAgXCIyMDIzLTAyLTIwVDA4OjE1OjMwXCIsXG4gICAgICAgICAgXCIyMDIzLTAzLTI1VDIzOjU5OjU5XCIsXG4gICAgICAgIF0sXG4gICAgICAgIHV0YzogW1xuICAgICAgICAgIFwiMjAyMy0wMS0xNVQxNDozMDo0NVpcIixcbiAgICAgICAgICBcIjIwMjMtMDItMjBUMDg6MTU6MzBaXCIsXG4gICAgICAgICAgXCIyMDIzLTAzLTI1VDIzOjU5OjU5WlwiLFxuICAgICAgICBdLFxuICAgICAgICB3aXRoVHo6IFtcbiAgICAgICAgICBcIjIwMjMtMDEtMTVUMTQ6MzA6NDUrMDE6MDBcIixcbiAgICAgICAgICBcIjIwMjMtMDItMjBUMDg6MTU6MzAtMDU6MDBcIixcbiAgICAgICAgICBcIjIwMjMtMDMtMjVUMjM6NTk6NTkrMDA6MDBcIixcbiAgICAgICAgXSxcbiAgICAgICAgd2l0aFNwYWNlOiBbXG4gICAgICAgICAgXCIyMDIzLTAxLTE1IDE0OjMwOjQ1XCIsXG4gICAgICAgICAgXCIyMDIzLTAyLTIwIDA4OjE1OjMwXCIsXG4gICAgICAgICAgXCIyMDIzLTAzLTI1IDIzOjU5OjU5XCIsXG4gICAgICAgIF0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHsgbmFtZTogXCJzdGFuZGFyZFwiLCB0eXBlOiBcImRhdGV0aW1lXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInV0Y1wiLCB0eXBlOiBcImRhdGV0aW1lXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIndpdGhUelwiLCB0eXBlOiBcImRhdGV0aW1lXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIndpdGhTcGFjZVwiLCB0eXBlOiBcImRhdGV0aW1lXCIsIGZvcm1hdDogXCIlWS0lbS0lZCAlSDolTTolU1wiIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGV4cGVjdChhd2FpdCBpbmZlclNjaGVtYUZyb21UYWJsZSh0YWJsZSkpLnRvRXF1YWwoc2NoZW1hKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGluZmVyIGRhdGV0aW1lcyB3aXRoIGN1c3RvbSBmb3JtYXRzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgc2hvcnREYXlNb250aDogW1xuICAgICAgICAgIFwiMTUvMDEvMjAyMyAxNDozMFwiLFxuICAgICAgICAgIFwiMjAvMDIvMjAyMyAwODoxNVwiLFxuICAgICAgICAgIFwiMjUvMDMvMjAyMyAyMzo1OVwiLFxuICAgICAgICBdLFxuICAgICAgICBmdWxsRGF5TW9udGg6IFtcbiAgICAgICAgICBcIjE1LzAxLzIwMjMgMTQ6MzA6NDVcIixcbiAgICAgICAgICBcIjIwLzAyLzIwMjMgMDg6MTU6MzBcIixcbiAgICAgICAgICBcIjI1LzAzLzIwMjMgMjM6NTk6NTlcIixcbiAgICAgICAgXSxcbiAgICAgICAgc2hvcnRNb250aERheTogW1xuICAgICAgICAgIFwiMDEvMTUvMjAyMyAxNDozMFwiLFxuICAgICAgICAgIFwiMDIvMjAvMjAyMyAwODoxNVwiLFxuICAgICAgICAgIFwiMDMvMjUvMjAyMyAyMzo1OVwiLFxuICAgICAgICBdLFxuICAgICAgICBmdWxsTW9udGhEYXk6IFtcbiAgICAgICAgICBcIjAxLzE1LzIwMjMgMTQ6MzA6NDVcIixcbiAgICAgICAgICBcIjAyLzIwLzIwMjMgMDg6MTU6MzBcIixcbiAgICAgICAgICBcIjAzLzI1LzIwMjMgMjM6NTk6NTlcIixcbiAgICAgICAgXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWFEZWZhdWx0ID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHsgbmFtZTogXCJzaG9ydERheU1vbnRoXCIsIHR5cGU6IFwiZGF0ZXRpbWVcIiwgZm9ybWF0OiBcIiVkLyVtLyVZICVIOiVNXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImZ1bGxEYXlNb250aFwiLCB0eXBlOiBcImRhdGV0aW1lXCIsIGZvcm1hdDogXCIlZC8lbS8lWSAlSDolTTolU1wiIH0sXG4gICAgICAgIHsgbmFtZTogXCJzaG9ydE1vbnRoRGF5XCIsIHR5cGU6IFwiZGF0ZXRpbWVcIiwgZm9ybWF0OiBcIiVkLyVtLyVZICVIOiVNXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImZ1bGxNb250aERheVwiLCB0eXBlOiBcImRhdGV0aW1lXCIsIGZvcm1hdDogXCIlZC8lbS8lWSAlSDolTTolU1wiIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IHNjaGVtYU1vbnRoRmlyc3QgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAgeyBuYW1lOiBcInNob3J0RGF5TW9udGhcIiwgdHlwZTogXCJkYXRldGltZVwiLCBmb3JtYXQ6IFwiJW0vJWQvJVkgJUg6JU1cIiB9LFxuICAgICAgICB7IG5hbWU6IFwiZnVsbERheU1vbnRoXCIsIHR5cGU6IFwiZGF0ZXRpbWVcIiwgZm9ybWF0OiBcIiVtLyVkLyVZICVIOiVNOiVTXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInNob3J0TW9udGhEYXlcIiwgdHlwZTogXCJkYXRldGltZVwiLCBmb3JtYXQ6IFwiJW0vJWQvJVkgJUg6JU1cIiB9LFxuICAgICAgICB7IG5hbWU6IFwiZnVsbE1vbnRoRGF5XCIsIHR5cGU6IFwiZGF0ZXRpbWVcIiwgZm9ybWF0OiBcIiVtLyVkLyVZICVIOiVNOiVTXCIgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgZXhwZWN0KGF3YWl0IGluZmVyU2NoZW1hRnJvbVRhYmxlKHRhYmxlKSkudG9FcXVhbChzY2hlbWFEZWZhdWx0KVxuICAgIGV4cGVjdChhd2FpdCBpbmZlclNjaGVtYUZyb21UYWJsZSh0YWJsZSwgeyBtb250aEZpcnN0OiB0cnVlIH0pKS50b0VxdWFsKFxuICAgICAgc2NoZW1hTW9udGhGaXJzdCxcbiAgICApXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaW5mZXIgbGlzdHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBudW1lcmljTGlzdDogW1wiMS41LDIuM1wiLCBcIjQuMSw1LjlcIiwgXCI3LjIsOC42XCJdLFxuICAgICAgICBpbnRlZ2VyTGlzdDogW1wiMSwyXCIsIFwiMyw0XCIsIFwiNSw2XCJdLFxuICAgICAgICBzaW5nbGVWYWx1ZTogW1wiMS41XCIsIFwiMi4zXCIsIFwiNC4xXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7IG5hbWU6IFwibnVtZXJpY0xpc3RcIiwgdHlwZTogXCJsaXN0XCIsIGl0ZW1UeXBlOiBcIm51bWJlclwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJpbnRlZ2VyTGlzdFwiLCB0eXBlOiBcImxpc3RcIiwgaXRlbVR5cGU6IFwiaW50ZWdlclwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJzaW5nbGVWYWx1ZVwiLCB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICBdLFxuICAgICAgbWlzc2luZ1ZhbHVlczogdW5kZWZpbmVkLFxuICAgIH1cblxuICAgIGV4cGVjdChhd2FpdCBpbmZlclNjaGVtYUZyb21UYWJsZSh0YWJsZSkpLnRvRXF1YWwoc2NoZW1hKVxuICB9KVxufSlcbiJdfQ==
@@ -0,0 +1,6 @@
1
+ import type { Field } from "@frictionless-ts/metadata";
2
+ import type { SchemaMapping } from "./Mapping.ts";
3
+ export declare function matchSchemaField(mapping: SchemaMapping, field: Field, index: number): {
4
+ source: import("../index.ts").PolarsField;
5
+ target: Field;
6
+ } | undefined;
@@ -0,0 +1,8 @@
1
+ export function matchSchemaField(mapping, field, index) {
2
+ const fieldsMatch = mapping.target.fieldsMatch ?? "exact";
3
+ const polarsField = fieldsMatch !== "exact"
4
+ ? mapping.source.fields.find(it => it.name === field.name)
5
+ : mapping.source.fields[index];
6
+ return polarsField ? { source: polarsField, target: field } : undefined;
7
+ }
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zY2hlbWEvbWF0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixPQUFzQixFQUN0QixLQUFZLEVBQ1osS0FBYTtJQUViLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQTtJQUV6RCxNQUFNLFdBQVcsR0FDZixXQUFXLEtBQUssT0FBTztRQUNyQixDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQzFELENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUVsQyxPQUFPLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO0FBQ3pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEZpZWxkIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0IHR5cGUgeyBTY2hlbWFNYXBwaW5nIH0gZnJvbSBcIi4vTWFwcGluZy50c1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaFNjaGVtYUZpZWxkKFxuICBtYXBwaW5nOiBTY2hlbWFNYXBwaW5nLFxuICBmaWVsZDogRmllbGQsXG4gIGluZGV4OiBudW1iZXIsXG4pIHtcbiAgY29uc3QgZmllbGRzTWF0Y2ggPSBtYXBwaW5nLnRhcmdldC5maWVsZHNNYXRjaCA/PyBcImV4YWN0XCJcblxuICBjb25zdCBwb2xhcnNGaWVsZCA9XG4gICAgZmllbGRzTWF0Y2ggIT09IFwiZXhhY3RcIlxuICAgICAgPyBtYXBwaW5nLnNvdXJjZS5maWVsZHMuZmluZChpdCA9PiBpdC5uYW1lID09PSBmaWVsZC5uYW1lKVxuICAgICAgOiBtYXBwaW5nLnNvdXJjZS5maWVsZHNbaW5kZXhdXG5cbiAgcmV0dXJuIHBvbGFyc0ZpZWxkID8geyBzb3VyY2U6IHBvbGFyc0ZpZWxkLCB0YXJnZXQ6IGZpZWxkIH0gOiB1bmRlZmluZWRcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ import type * as pl from "nodejs-polars";
2
+ export type Frame = pl.DataFrame;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnJhbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90YWJsZS9GcmFtZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgKiBhcyBwbCBmcm9tIFwibm9kZWpzLXBvbGFyc1wiXG5cbmV4cG9ydCB0eXBlIEZyYW1lID0gcGwuRGF0YUZyYW1lXG4iXX0=
@@ -0,0 +1,2 @@
1
+ import type * as pl from "nodejs-polars";
2
+ export type Table = pl.LazyDataFrame;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90YWJsZS9UYWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgKiBhcyBwbCBmcm9tIFwibm9kZWpzLXBvbGFyc1wiXG5cbmV4cG9ydCB0eXBlIFRhYmxlID0gcGwuTGF6eURhdGFGcmFtZVxuIl19
@@ -0,0 +1,7 @@
1
+ import type { RowUniqueError } from "@frictionless-ts/metadata";
2
+ import * as pl from "nodejs-polars";
3
+ import type { SchemaMapping } from "../../schema/index.ts";
4
+ export declare function createChecksRowUnique(mapping: SchemaMapping): {
5
+ isErrorExpr: pl.Expr;
6
+ errorTemplate: RowUniqueError;
7
+ }[];
@@ -0,0 +1,23 @@
1
+ import * as pl from "nodejs-polars";
2
+ export function createChecksRowUnique(mapping) {
3
+ const uniqueKeys = mapping.target.uniqueKeys ?? [];
4
+ if (mapping.target.primaryKey) {
5
+ uniqueKeys.push(mapping.target.primaryKey);
6
+ }
7
+ return uniqueKeys.map(createCheckRowUnique);
8
+ }
9
+ function createCheckRowUnique(uniqueKey) {
10
+ const isErrorExpr = pl
11
+ .concatList(uniqueKey)
12
+ .isFirstDistinct()
13
+ .not()
14
+ // Fold is not available so we use a tricky way to eliminate nulls
15
+ .and(pl.concatList(uniqueKey).lst.min().isNotNull());
16
+ const errorTemplate = {
17
+ type: "row/unique",
18
+ fieldNames: uniqueKey,
19
+ rowNumber: 0,
20
+ };
21
+ return { isErrorExpr, errorTemplate };
22
+ }
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pcXVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGFibGUvY2hlY2tzL3VuaXF1ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUduQyxNQUFNLFVBQVUscUJBQXFCLENBQUMsT0FBc0I7SUFDMUQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFBO0lBRWxELElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM5QixVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDNUMsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO0FBQzdDLENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUFDLFNBQW1CO0lBQy9DLE1BQU0sV0FBVyxHQUFHLEVBQUU7U0FDbkIsVUFBVSxDQUFDLFNBQVMsQ0FBQztTQUNyQixlQUFlLEVBQUU7U0FDakIsR0FBRyxFQUFFO1FBQ04sa0VBQWtFO1NBQ2pFLEdBQUcsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFBO0lBRXRELE1BQU0sYUFBYSxHQUFtQjtRQUNwQyxJQUFJLEVBQUUsWUFBWTtRQUNsQixVQUFVLEVBQUUsU0FBUztRQUNyQixTQUFTLEVBQUUsQ0FBQztLQUNiLENBQUE7SUFFRCxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxDQUFBO0FBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJvd1VuaXF1ZUVycm9yIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0ICogYXMgcGwgZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuaW1wb3J0IHR5cGUgeyBTY2hlbWFNYXBwaW5nIH0gZnJvbSBcIi4uLy4uL3NjaGVtYS9pbmRleC50c1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDaGVja3NSb3dVbmlxdWUobWFwcGluZzogU2NoZW1hTWFwcGluZykge1xuICBjb25zdCB1bmlxdWVLZXlzID0gbWFwcGluZy50YXJnZXQudW5pcXVlS2V5cyA/PyBbXVxuXG4gIGlmIChtYXBwaW5nLnRhcmdldC5wcmltYXJ5S2V5KSB7XG4gICAgdW5pcXVlS2V5cy5wdXNoKG1hcHBpbmcudGFyZ2V0LnByaW1hcnlLZXkpXG4gIH1cblxuICByZXR1cm4gdW5pcXVlS2V5cy5tYXAoY3JlYXRlQ2hlY2tSb3dVbmlxdWUpXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNoZWNrUm93VW5pcXVlKHVuaXF1ZUtleTogc3RyaW5nW10pIHtcbiAgY29uc3QgaXNFcnJvckV4cHIgPSBwbFxuICAgIC5jb25jYXRMaXN0KHVuaXF1ZUtleSlcbiAgICAuaXNGaXJzdERpc3RpbmN0KClcbiAgICAubm90KClcbiAgICAvLyBGb2xkIGlzIG5vdCBhdmFpbGFibGUgc28gd2UgdXNlIGEgdHJpY2t5IHdheSB0byBlbGltaW5hdGUgbnVsbHNcbiAgICAuYW5kKHBsLmNvbmNhdExpc3QodW5pcXVlS2V5KS5sc3QubWluKCkuaXNOb3ROdWxsKCkpXG5cbiAgY29uc3QgZXJyb3JUZW1wbGF0ZTogUm93VW5pcXVlRXJyb3IgPSB7XG4gICAgdHlwZTogXCJyb3cvdW5pcXVlXCIsXG4gICAgZmllbGROYW1lczogdW5pcXVlS2V5LFxuICAgIHJvd051bWJlcjogMCxcbiAgfVxuXG4gIHJldHVybiB7IGlzRXJyb3JFeHByLCBlcnJvclRlbXBsYXRlIH1cbn1cbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,187 @@
1
+ import * as pl from "nodejs-polars";
2
+ import { describe, expect, it } from "vitest";
3
+ import { inspectTable } from "../../table/index.js";
4
+ describe("inspectTable (row/unique)", () => {
5
+ it("should not errors when all rows are unique for primary key", async () => {
6
+ const table = pl
7
+ .DataFrame({
8
+ id: [1, 2, 3, 4, 5],
9
+ name: ["Alice", "Bob", "Charlie", "David", "Eve"],
10
+ })
11
+ .lazy();
12
+ const schema = {
13
+ fields: [
14
+ { name: "id", type: "number" },
15
+ { name: "name", type: "string" },
16
+ ],
17
+ primaryKey: ["id"],
18
+ };
19
+ const errors = await inspectTable(table, { schema });
20
+ expect(errors).toHaveLength(0);
21
+ });
22
+ it("should errors for duplicate primary key rows", async () => {
23
+ const table = pl
24
+ .DataFrame({
25
+ id: [1, 2, 3, 2, 5],
26
+ name: ["Alice", "Bob", "Charlie", "Bob2", "Eve"],
27
+ })
28
+ .lazy();
29
+ const schema = {
30
+ fields: [
31
+ { name: "id", type: "number" },
32
+ { name: "name", type: "string" },
33
+ ],
34
+ primaryKey: ["id"],
35
+ };
36
+ const errors = await inspectTable(table, { schema });
37
+ expect(errors.filter(e => e.type === "row/unique")).toHaveLength(1);
38
+ expect(errors).toContainEqual({
39
+ type: "row/unique",
40
+ rowNumber: 4,
41
+ fieldNames: ["id"],
42
+ });
43
+ });
44
+ it("should not errors when all rows are unique for unique key", async () => {
45
+ const table = pl
46
+ .DataFrame({
47
+ id: [1, 2, 3, 4, 5],
48
+ email: [
49
+ "a@test.com",
50
+ "b@test.com",
51
+ "c@test.com",
52
+ "d@test.com",
53
+ "e@test.com",
54
+ ],
55
+ })
56
+ .lazy();
57
+ const schema = {
58
+ fields: [
59
+ { name: "id", type: "number" },
60
+ { name: "email", type: "string" },
61
+ ],
62
+ uniqueKeys: [["email"]],
63
+ };
64
+ const errors = await inspectTable(table, { schema });
65
+ expect(errors).toHaveLength(0);
66
+ });
67
+ it("should errors for duplicate unique key rows", async () => {
68
+ const table = pl
69
+ .DataFrame({
70
+ id: [1, 2, 3, 4, 5],
71
+ email: [
72
+ "a@test.com",
73
+ "b@test.com",
74
+ "a@test.com",
75
+ "d@test.com",
76
+ "b@test.com",
77
+ ],
78
+ })
79
+ .lazy();
80
+ const schema = {
81
+ fields: [
82
+ { name: "id", type: "number" },
83
+ { name: "email", type: "string" },
84
+ ],
85
+ uniqueKeys: [["email"]],
86
+ };
87
+ const errors = await inspectTable(table, { schema });
88
+ expect(errors.filter(e => e.type === "row/unique")).toHaveLength(2);
89
+ expect(errors).toContainEqual({
90
+ type: "row/unique",
91
+ rowNumber: 3,
92
+ fieldNames: ["email"],
93
+ });
94
+ expect(errors).toContainEqual({
95
+ type: "row/unique",
96
+ rowNumber: 5,
97
+ fieldNames: ["email"],
98
+ });
99
+ });
100
+ it("should handle composite unique keys", async () => {
101
+ const table = pl
102
+ .DataFrame({
103
+ category: ["A", "A", "B", "A", "B"],
104
+ subcategory: ["X", "Y", "X", "X", "Y"],
105
+ value: [1, 2, 3, 4, 5],
106
+ })
107
+ .lazy();
108
+ const schema = {
109
+ fields: [
110
+ { name: "category", type: "string" },
111
+ { name: "subcategory", type: "string" },
112
+ { name: "value", type: "number" },
113
+ ],
114
+ uniqueKeys: [["category", "subcategory"]],
115
+ };
116
+ const errors = await inspectTable(table, { schema });
117
+ expect(errors.filter(e => e.type === "row/unique")).toHaveLength(1);
118
+ expect(errors).toContainEqual({
119
+ type: "row/unique",
120
+ rowNumber: 4,
121
+ fieldNames: ["category", "subcategory"],
122
+ });
123
+ });
124
+ it("should handle both primary key and unique keys", async () => {
125
+ const table = pl
126
+ .DataFrame({
127
+ id: [1, 2, 3, 2, 5],
128
+ email: [
129
+ "a@test.com",
130
+ "b@test.com",
131
+ "c@test.com",
132
+ "d@test.com",
133
+ "a@test.com",
134
+ ],
135
+ })
136
+ .lazy();
137
+ const schema = {
138
+ fields: [
139
+ { name: "id", type: "number" },
140
+ { name: "email", type: "string" },
141
+ ],
142
+ primaryKey: ["id"],
143
+ uniqueKeys: [["email"]],
144
+ };
145
+ const errors = await inspectTable(table, { schema });
146
+ expect(errors.filter(e => e.type === "row/unique")).toHaveLength(2);
147
+ expect(errors).toContainEqual({
148
+ type: "row/unique",
149
+ rowNumber: 4,
150
+ fieldNames: ["id"],
151
+ });
152
+ expect(errors).toContainEqual({
153
+ type: "row/unique",
154
+ rowNumber: 5,
155
+ fieldNames: ["email"],
156
+ });
157
+ });
158
+ it("should handle null values in unique keys correctly", async () => {
159
+ const table = pl
160
+ .DataFrame({
161
+ id: [1, 2, null, 4, null, 2],
162
+ name: ["Alice", "Bob", "Charlie", "David", "Eve", "Bob"],
163
+ })
164
+ .lazy();
165
+ const schema = {
166
+ fields: [
167
+ { name: "id", type: "number" },
168
+ { name: "name", type: "string" },
169
+ ],
170
+ uniqueKeys: [["id"], ["id", "name"]],
171
+ };
172
+ const errors = await inspectTable(table, { schema });
173
+ console.log(errors);
174
+ expect(errors).toHaveLength(2);
175
+ expect(errors).toContainEqual({
176
+ type: "row/unique",
177
+ rowNumber: 6,
178
+ fieldNames: ["id"],
179
+ });
180
+ expect(errors).toContainEqual({
181
+ type: "row/unique",
182
+ rowNumber: 6,
183
+ fieldNames: ["id", "name"],
184
+ });
185
+ });
186
+ });
187
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pcXVlLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90YWJsZS9jaGVja3MvdW5pcXVlLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDbkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUVuRCxRQUFRLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO0lBQ3pDLEVBQUUsQ0FBQyw0REFBNEQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMxRSxNQUFNLEtBQUssR0FBRyxFQUFFO2FBQ2IsU0FBUyxDQUFDO1lBQ1QsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNuQixJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDO1NBQ2xELENBQUM7YUFDRCxJQUFJLEVBQUUsQ0FBQTtRQUVULE1BQU0sTUFBTSxHQUFXO1lBQ3JCLE1BQU0sRUFBRTtnQkFDTixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtnQkFDOUIsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7YUFDakM7WUFDRCxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUM7U0FDbkIsQ0FBQTtRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sWUFBWSxDQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDcEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNoQyxDQUFDLENBQUMsQ0FBQTtJQUVGLEVB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QUNOLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO2dCQUM5QixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTthQUNqQztZQUNELFVBQVUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDckMsQ0FBQTtRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sWUFBWSxDQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDcEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUVuQixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzlCLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxjQUFjLENBQUM7WUFDNUIsSUFBSSxFQUFFLFlBQVk7WUFDbEIsU0FBUyxFQUFFLENBQUM7WUFDWixVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUM7U0FDbkIsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGNBQWMsQ0FBQztZQUM1QixJQUFJLEVBQUUsWUFBWTtZQUNsQixTQUFTLEVBQUUsQ0FBQztZQUNaLFVBQVUsRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUM7U0FDM0IsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU2NoZW1hIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0ICogYXMgcGwgZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IGluc3BlY3RUYWJsZSB9IGZyb20gXCIuLi8uLi90YWJsZS9pbmRleC50c1wiXG5cbmRlc2NyaWJlKFwiaW5zcGVjdFRhYmxlIChyb3cvdW5pcXVlKVwiLCAoKSA9PiB7XG4gIGl0KFwic2hvdWxkIG5vdCBlcnJvcnMgd2hlbiBhbGwgcm93cyBhcmUgdW5pcXVlIGZvciBwcmltYXJ5IGtleVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIGlkOiBbMSwgMiwgMywgNCwgNV0sXG4gICAgICAgIG5hbWU6IFtcIkFsaWNlXCIsIFwiQm9iXCIsIFwiQ2hhcmxpZVwiLCBcIkRhdmlkXCIsIFwiRXZlXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJuYW1lXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIF0sXG4gICAgICBwcmltYXJ5S2V5OiBbXCJpZFwiXSxcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgZXhwZWN0KGVycm9ycykudG9IYXZlTGVuZ3RoKDApXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgZXJyb3JzIGZvciBkdXBsaWNhdGUgcHJpbWFyeSBrZXkgcm93c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIGlkOiBbMSwgMiwgMywgMiwgNV0sXG4gICAgICAgIG5hbWU6IFtcIkFsaWNlXCIsIFwiQm9iXCIsIFwiQ2hhcmxpZVwiLCBcIkJvYjJcIiwgXCJFdmVcIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgXSxcbiAgICAgIHByaW1hcnlLZXk6IFtcImlkXCJdLFxuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcblxuICAgIGV4cGVjdChlcnJvcnMuZmlsdGVyKGUgPT4gZS50eXBlID09PSBcInJvdy91bmlxdWVcIikpLnRvSGF2ZUxlbmd0aCgxKVxuICAgIGV4cGVjdChlcnJvcnMpLnRvQ29udGFpbkVxdWFsKHtcbiAgICAgIHR5cGU6IFwicm93L3VuaXF1ZVwiLFxuICAgICAgcm93TnVtYmVyOiA0LFxuICAgICAgZmllbGROYW1lczogW1wiaWRcIl0sXG4gICAgfSlcbiAgfSlcblxuICBpdChcInNob3VsZCBub3QgZXJyb3JzIHdoZW4gYWxsIHJvd3MgYXJlIHVuaXF1ZSBmb3IgdW5pcXVlIGtleVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIGlkOiBbMSwgMiwgMywgNCwgNV0sXG4gICAgICAgIGVtYWlsOiBbXG4gICAgICAgICAgXCJhQHRlc3QuY29tXCIsXG4gICAgICAgICAgXCJiQHRlc3QuY29tXCIsXG4gICAgICAgICAgXCJjQHRlc3QuY29tXCIsXG4gICAgICAgICAgXCJkQHRlc3QuY29tXCIsXG4gICAgICAgICAgXCJlQHRlc3QuY29tXCIsXG4gICAgICAgIF0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImVtYWlsXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIF0sXG4gICAgICB1bmlxdWVLZXlzOiBbW1wiZW1haWxcIl1dLFxuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICBleHBlY3QoZXJyb3JzKS50b0hhdmVMZW5ndGgoMClcbiAgfSlcblxuICBpdChcInNob3VsZCBlcnJvcnMgZm9yIGR1cGxpY2F0ZSB1bmlxdWUga2V5IHJvd3NcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBpZDogWzEsIDIsIDMsIDQsIDVdLFxuICAgICAgICBlbWFpbDogW1xuICAgICAgICAgIFwiYUB0ZXN0LmNvbVwiLFxuICAgICAgICAgIFwiYkB0ZXN0LmNvbVwiLFxuICAgICAgICAgIFwiYUB0ZXN0LmNvbVwiLFxuICAgICAgICAgIFwiZEB0ZXN0LmNvbVwiLFxuICAgICAgICAgIFwiYkB0ZXN0LmNvbVwiLFxuICAgICAgICBdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJlbWFpbFwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICBdLFxuICAgICAgdW5pcXVlS2V5czogW1tcImVtYWlsXCJdXSxcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgZXhwZWN0KGVycm9ycy5maWx0ZXIoZSA9PiBlLnR5cGUgPT09IFwicm93L3VuaXF1ZVwiKSkudG9IYXZlTGVuZ3RoKDIpXG4gICAgZXhwZWN0KGVycm9ycykudG9Db250YWluRXF1YWwoe1xuICAgICAgdHlwZTogXCJyb3cvdW5pcXVlXCIsXG4gICAgICByb3dOdW1iZXI6IDMsXG4gICAgICBmaWVsZE5hbWVzOiBbXCJlbWFpbFwiXSxcbiAgICB9KVxuICAgIGV4cGVjdChlcnJvcnMpLnRvQ29udGFpbkVxdWFsKHtcbiAgICAgIHR5cGU6IFwicm93L3VuaXF1ZVwiLFxuICAgICAgcm93TnVtYmVyOiA1LFxuICAgICAgZmllbGROYW1lczogW1wiZW1haWxcIl0sXG4gICAgfSlcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgY29tcG9zaXRlIHVuaXF1ZSBrZXlzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgY2F0ZWdvcnk6IFtcIkFcIiwgXCJBXCIsIFwiQlwiLCBcIkFcIiwgXCJCXCJdLFxuICAgICAgICBzdWJjYXRlZ29yeTogW1wiWFwiLCBcIllcIiwgXCJYXCIsIFwiWFwiLCBcIllcIl0sXG4gICAgICAgIHZhbHVlOiBbMSwgMiwgMywgNCwgNV0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAgeyBuYW1lOiBcImNhdGVnb3J5XCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInN1YmNhdGVnb3J5XCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInZhbHVlXCIsIHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgIF0sXG4gICAgICB1bmlxdWVLZXlzOiBbW1wiY2F0ZWdvcnlcIiwgXCJzdWJjYXRlZ29yeVwiXV0sXG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgaW5zcGVjdFRhYmxlKHRhYmxlLCB7IHNjaGVtYSB9KVxuICAgIGV4cGVjdChlcnJvcnMuZmlsdGVyKGUgPT4gZS50eXBlID09PSBcInJvdy91bmlxdWVcIikpLnRvSGF2ZUxlbmd0aCgxKVxuICAgIGV4cGVjdChlcnJvcnMpLnRvQ29udGFpbkVxdWFsKHtcbiAgICAgIHR5cGU6IFwicm93L3VuaXF1ZVwiLFxuICAgICAgcm93TnVtYmVyOiA0LFxuICAgICAgZmllbGROYW1lczogW1wiY2F0ZWdvcnlcIiwgXCJzdWJjYXRlZ29yeVwiXSxcbiAgICB9KVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBib3RoIHByaW1hcnkga2V5IGFuZCB1bmlxdWUga2V5c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIGlkOiBbMSwgMiwgMywgMiwgNV0sXG4gICAgICAgIGVtYWlsOiBbXG4gICAgICAgICAgXCJhQHRlc3QuY29tXCIsXG4gICAgICAgICAgXCJiQHRlc3QuY29tXCIsXG4gICAgICAgICAgXCJjQHRlc3QuY29tXCIsXG4gICAgICAgICAgXCJkQHRlc3QuY29tXCIsXG4gICAgICAgICAgXCJhQHRlc3QuY29tXCIsXG4gICAgICAgIF0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImVtYWlsXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIF0sXG4gICAgICBwcmltYXJ5S2V5OiBbXCJpZFwiXSxcbiAgICAgIHVuaXF1ZUtleXM6IFtbXCJlbWFpbFwiXV0sXG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgaW5zcGVjdFRhYmxlKHRhYmxlLCB7IHNjaGVtYSB9KVxuICAgIGV4cGVjdChlcnJvcnMuZmlsdGVyKGUgPT4gZS50eXBlID09PSBcInJvdy91bmlxdWVcIikpLnRvSGF2ZUxlbmd0aCgyKVxuICAgIGV4cGVjdChlcnJvcnMpLnRvQ29udGFpbkVxdWFsKHtcbiAgICAgIHR5cGU6IFwicm93L3VuaXF1ZVwiLFxuICAgICAgcm93TnVtYmVyOiA0LFxuICAgICAgZmllbGROYW1lczogW1wiaWRcIl0sXG4gICAgfSlcbiAgICBleHBlY3QoZXJyb3JzKS50b0NvbnRhaW5FcXVhbCh7XG4gICAgICB0eXBlOiBcInJvdy91bmlxdWVcIixcbiAgICAgIHJvd051bWJlcjogNSxcbiAgICAgIGZpZWxkTmFtZXM6IFtcImVtYWlsXCJdLFxuICAgIH0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIG51bGwgdmFsdWVzIGluIHVuaXF1ZSBrZXlzIGNvcnJlY3RseVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIGlkOiBbMSwgMiwgbnVsbCwgNCwgbnVsbCwgMl0sXG4gICAgICAgIG5hbWU6IFtcIkFsaWNlXCIsIFwiQm9iXCIsIFwiQ2hhcmxpZVwiLCBcIkRhdmlkXCIsIFwiRXZlXCIsIFwiQm9iXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJuYW1lXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIF0sXG4gICAgICB1bmlxdWVLZXlzOiBbW1wiaWRcIl0sIFtcImlkXCIsIFwibmFtZVwiXV0sXG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgaW5zcGVjdFRhYmxlKHRhYmxlLCB7IHNjaGVtYSB9KVxuICAgIGNvbnNvbGUubG9nKGVycm9ycylcblxuICAgIGV4cGVjdChlcnJvcnMpLnRvSGF2ZUxlbmd0aCgyKVxuICAgIGV4cGVjdChlcnJvcnMpLnRvQ29udGFpbkVxdWFsKHtcbiAgICAgIHR5cGU6IFwicm93L3VuaXF1ZVwiLFxuICAgICAgcm93TnVtYmVyOiA2LFxuICAgICAgZmllbGROYW1lczogW1wiaWRcIl0sXG4gICAgfSlcbiAgICBleHBlY3QoZXJyb3JzKS50b0NvbnRhaW5FcXVhbCh7XG4gICAgICB0eXBlOiBcInJvdy91bmlxdWVcIixcbiAgICAgIHJvd051bWJlcjogNixcbiAgICAgIGZpZWxkTmFtZXM6IFtcImlkXCIsIFwibmFtZVwiXSxcbiAgICB9KVxuICB9KVxufSlcbiJdfQ==