@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,165 @@
1
+ import os from "node:os";
2
+ import * as pl from "nodejs-polars";
3
+ import pAll from "p-all";
4
+ import { inspectField } from "../field/index.js";
5
+ import { arrayDiff } from "../helpers.js";
6
+ import { matchSchemaField } from "../schema/index.js";
7
+ import { getPolarsSchema } from "../schema/index.js";
8
+ import { createChecksRowUnique } from "./checks/unique.js";
9
+ export async function inspectTable(table, options) {
10
+ const { schema, sampleRows = 100, maxErrors = 1000 } = options ?? {};
11
+ const errors = [];
12
+ if (schema) {
13
+ const sample = await table.head(sampleRows).collect();
14
+ const polarsSchema = getPolarsSchema(sample.schema);
15
+ const mapping = { source: polarsSchema, target: schema };
16
+ const matchErrors = inspectFieldsMatch(mapping);
17
+ errors.push(...matchErrors);
18
+ const fieldErrors = await inspectFields(mapping, table, { maxErrors });
19
+ errors.push(...fieldErrors);
20
+ const rowErrors = await inspectRows(mapping, table, { maxErrors });
21
+ errors.push(...rowErrors);
22
+ }
23
+ return errors.slice(0, maxErrors);
24
+ }
25
+ function inspectFieldsMatch(mapping) {
26
+ const errors = [];
27
+ const fieldsMatch = mapping.target.fieldsMatch ?? "exact";
28
+ const fields = mapping.target.fields;
29
+ const polarsFields = mapping.source.fields;
30
+ const names = fields.map(field => field.name);
31
+ const polarsNames = polarsFields.map(field => field.name);
32
+ const requiredNames = fields
33
+ .filter(field => field.constraints?.required)
34
+ .map(field => field.name);
35
+ const extraFields = polarsFields.length - fields.length;
36
+ const missingFields = fields.length - polarsFields.length;
37
+ const extraNames = arrayDiff(polarsNames, names);
38
+ const missingNames = arrayDiff(names, polarsNames);
39
+ const missingRequiredNames = arrayDiff(requiredNames, polarsNames);
40
+ if (fieldsMatch === "exact") {
41
+ if (extraFields > 0) {
42
+ errors.push({
43
+ type: "fields/extra",
44
+ fieldNames: extraNames,
45
+ });
46
+ }
47
+ if (missingFields > 0) {
48
+ errors.push({
49
+ type: "fields/missing",
50
+ fieldNames: missingNames,
51
+ });
52
+ }
53
+ }
54
+ if (fieldsMatch === "equal") {
55
+ if (extraNames.length > 0) {
56
+ errors.push({
57
+ type: "fields/extra",
58
+ fieldNames: extraNames,
59
+ });
60
+ }
61
+ if (missingRequiredNames.length > 0) {
62
+ errors.push({
63
+ type: "fields/missing",
64
+ fieldNames: missingRequiredNames,
65
+ });
66
+ }
67
+ }
68
+ if (fieldsMatch === "subset") {
69
+ if (missingRequiredNames.length > 0) {
70
+ errors.push({
71
+ type: "fields/missing",
72
+ fieldNames: missingRequiredNames,
73
+ });
74
+ }
75
+ }
76
+ if (fieldsMatch === "superset") {
77
+ if (extraNames.length > 0) {
78
+ errors.push({
79
+ type: "fields/extra",
80
+ fieldNames: extraNames,
81
+ });
82
+ }
83
+ }
84
+ if (fieldsMatch === "partial") {
85
+ if (missingNames.length === fields.length) {
86
+ errors.push({
87
+ type: "fields/missing",
88
+ fieldNames: missingNames,
89
+ });
90
+ }
91
+ }
92
+ return errors;
93
+ }
94
+ async function inspectFields(mapping, table, options) {
95
+ const { maxErrors } = options;
96
+ const errors = [];
97
+ const fields = mapping.target.fields;
98
+ const concurrency = os.cpus().length;
99
+ const abortController = new AbortController();
100
+ const maxFieldErrors = Math.ceil(maxErrors / fields.length);
101
+ const collectFieldErrors = async (index, field) => {
102
+ const fieldMapping = matchSchemaField(mapping, field, index);
103
+ if (!fieldMapping)
104
+ return;
105
+ const fieldErrors = await inspectField(fieldMapping, table, {
106
+ maxErrors: maxFieldErrors,
107
+ });
108
+ errors.push(...fieldErrors);
109
+ if (errors.length > maxErrors) {
110
+ abortController.abort();
111
+ }
112
+ };
113
+ try {
114
+ await pAll(fields.map((field, index) => () => collectFieldErrors(index, field)), { concurrency });
115
+ }
116
+ catch (error) {
117
+ const isAborted = error instanceof Error && error.name === "AbortError";
118
+ if (!isAborted)
119
+ throw error;
120
+ }
121
+ return errors;
122
+ }
123
+ async function inspectRows(mapping, table, options) {
124
+ const { maxErrors } = options;
125
+ const errors = [];
126
+ const fields = mapping.target.fields;
127
+ const concurrency = os.cpus().length - 1;
128
+ const abortController = new AbortController();
129
+ const maxRowErrors = Math.ceil(maxErrors / fields.length);
130
+ const collectRowErrors = async (check) => {
131
+ const rowCheckTable = table
132
+ .withRowCount()
133
+ .withColumn(pl.col("row_nr").add(1))
134
+ .rename({ row_nr: "dpkit:number" })
135
+ .withColumn(pl
136
+ .when(check.isErrorExpr)
137
+ .then(pl.lit(JSON.stringify(check.errorTemplate)))
138
+ .otherwise(pl.lit(null))
139
+ .alias("dpkit:error"));
140
+ const rowCheckFrame = await rowCheckTable
141
+ .filter(pl.col("dpkit:error").isNotNull())
142
+ .head(maxRowErrors)
143
+ .collect();
144
+ for (const row of rowCheckFrame.toRecords()) {
145
+ const errorTemplate = JSON.parse(row["dpkit:error"]);
146
+ errors.push({
147
+ ...errorTemplate,
148
+ rowNumber: row["dpkit:number"],
149
+ });
150
+ }
151
+ if (errors.length > maxErrors) {
152
+ abortController.abort();
153
+ }
154
+ };
155
+ try {
156
+ await pAll([...createChecksRowUnique(mapping)].map(it => () => collectRowErrors(it)), { concurrency });
157
+ }
158
+ catch (error) {
159
+ const isAborted = error instanceof Error && error.name === "AbortError";
160
+ if (!isAborted)
161
+ throw error;
162
+ }
163
+ return errors;
164
+ }
165
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zcGVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RhYmxlL2luc3BlY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBSXhCLE9BQU8sS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ25DLE9BQU8sSUFBSSxNQUFNLE9BQU8sQ0FBQTtBQUN4QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFHcEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFFMUQsTUFBTSxDQUFDLEtBQUssVUFBVSxZQUFZLENBQ2hDLEtBQVksRUFDWixPQUlDO0lBRUQsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEdBQUcsR0FBRyxFQUFFLFNBQVMsR0FBRyxJQUFJLEVBQUUsR0FBRyxPQUFPLElBQUksRUFBRSxDQUFBO0lBQ3BFLE1BQU0sTUFBTSxHQUFpQixFQUFFLENBQUE7SUFFL0IsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNYLE1BQU0sTUFBTSxHQUFHLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUNyRCxNQUFNLFlBQVksR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ25ELE1BQU0sT0FBTyxHQUFHLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUE7UUFFeEQsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDL0MsTUFBTSxDQUFDLElBQUksQ0FBQyxH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TUFBTSxHQUFHLElBQUksYUFBYSxDQUFDLFNBQVMsRUFBVyxFQUFFLENBQUM7WUFDckQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQWEsQ0FBQTtZQUNoRSxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUNWLEdBQUcsYUFBYTtnQkFDaEIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxjQUFjLENBQUM7YUFDL0IsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUVELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxTQUFTLEVBQUUsQ0FBQztZQUM5QixlQUFlLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDekIsQ0FBQztJQUNILENBQUMsQ0FBQTtJQUVELElBQUksQ0FBQztRQUNILE1BQU0sSUFBSSxDQUNSLENBQUMsR0FBRyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ3pFLEVBQUUsV0FBVyxFQUFFLENBQ2hCLENBQUE7SUFDSCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sU0FBUyxHQUFHLEtBQUssWUFBWSxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxZQUFZLENBQUE7UUFDdkUsSUFBSSxDQUFDLFNBQVM7WUFBRSxNQUFNLEtBQUssQ0FBQTtJQUM3QixDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG9zIGZyb20gXCJub2RlOm9zXCJcbmltcG9ydCB0eXBlIHsgRmllbGQsIFNjaGVtYSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB0eXBlIHsgUm93RXJyb3IgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgdHlwZSB7IFRhYmxlRXJyb3IgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgKiBhcyBwbCBmcm9tIFwibm9kZWpzLXBvbGFyc1wiXG5pbXBvcnQgcEFsbCBmcm9tIFwicC1hbGxcIlxuaW1wb3J0IHsgaW5zcGVjdEZpZWxkIH0gZnJvbSBcIi4uL2ZpZWxkL2luZGV4LnRzXCJcbmltcG9ydCB7IGFycmF5RGlmZiB9IGZyb20gXCIuLi9oZWxwZXJzLnRzXCJcbmltcG9ydCB7IG1hdGNoU2NoZW1hRmllbGQgfSBmcm9tIFwiLi4vc2NoZW1hL2luZGV4LnRzXCJcbmltcG9ydCB7IGdldFBvbGFyc1NjaGVtYSB9IGZyb20gXCIuLi9zY2hlbWEvaW5kZXgudHNcIlxuaW1wb3J0IHR5cGUgeyBTY2hlbWFNYXBwaW5nIH0gZnJvbSBcIi4uL3NjaGVtYS9pbmRleC50c1wiXG5pbXBvcnQgdHlwZSB7IFRhYmxlIH0gZnJvbSBcIi4vVGFibGUudHNcIlxuaW1wb3J0IHsgY3JlYXRlQ2hlY2tzUm93VW5pcXVlIH0gZnJvbSBcIi4vY2hlY2tzL3VuaXF1ZS50c1wiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnNwZWN0VGFibGUoXG4gIHRhYmxlOiBUYWJsZSxcbiAgb3B0aW9ucz86IHtcbiAgICBzY2hlbWE/OiBTY2hlbWFcbiAgICBzYW1wbGVSb3dzPzogbnVtYmVyXG4gICAgbWF4RXJyb3JzPzogbnVtYmVyXG4gIH0sXG4pIHtcbiAgY29uc3QgeyBzY2hlbWEsIHNhbXBsZVJvd3MgPSAxMDAsIG1heEVycm9ycyA9IDEwMDAgfSA9IG9wdGlvbnMgPz8ge31cbiAgY29uc3QgZXJyb3JzOiBUYWJsZUVycm9yW10gPSBbXVxuXG4gIGlmIChzY2hlbWEpIHtcbiAgICBjb25zdCBzYW1wbGUgPSBhd2FpdCB0YWJsZS5oZWFkKHNhbXBsZVJvd3MpLmNvbGxlY3QoKVxuICAgIGNvbnN0IHBvbGFyc1NjaGVtYSA9IGdldFBvbGFyc1NjaGVtYShzYW1wbGUuc2NoZW1hKVxuICAgIGNvbnN0IG1hcHBpbmcgPSB7IHNvdXJjZTogcG9sYXJzU2NoZW1hLCB0YXJnZXQ6IHNjaGVtYSB9XG5cbiAgICBjb25zdCBtYXRjaEVycm9ycyA9IGluc3BlY3RGaWVsZHNNYXRjaChtYXBwaW5nKVxuICAgIGVycm9ycy5wdXNoKC4uLm1hdGNoRXJyb3JzKVxuXG4gICAgY29uc3QgZmllbGRFcnJvcnMgPSBhd2FpdCBpbnNwZWN0RmllbGRzKG1hcHBpbmcsIHRhYmxlLCB7IG1heEVycm9ycyB9KVxuICAgIGVycm9ycy5wdXNoKC4uLmZpZWxkRXJyb3JzKVxuXG4gICAgY29uc3Qgcm93RXJyb3JzID0gYXdhaXQgaW5zcGVjdFJvd3MobWFwcGluZywgdGFibGUsIHsgbWF4RXJyb3JzIH0pXG4gICAgZXJyb3JzLnB1c2goLi4ucm93RXJyb3JzKVxuICB9XG5cbiAgcmV0dXJuIGVycm9ycy5zbGljZSgwLCBtYXhFcnJvcnMpXG59XG5cbmZ1bmN0aW9uIGluc3BlY3RGaWVsZHNNYXRjaChtYXBwaW5nOiBTY2hlbWFNYXBwaW5nKSB7XG4gIGNvbnN0IGVycm9yczogVGFibGVFcnJvcltdID0gW11cbiAgY29uc3QgZmllbGRzTWF0Y2ggPSBtYXBwaW5nLnRhcmdldC5maWVsZHNNYXRjaCA/PyBcImV4YWN0XCJcblxuICBjb25zdCBmaWVsZHMgPSBtYXBwaW5nLnRhcmdldC5maWVsZHNcbiAgY29uc3QgcG9sYXJzRmllbGRzID0gbWFwcGluZy5zb3VyY2UuZmllbGRzXG5cbiAgY29uc3QgbmFtZXMgPSBmaWVsZHMubWFwKGZpZWxkID0+IGZpZWxkLm5hbWUpXG4gIGNvbnN0IHBvbGFyc05hbWVzID0gcG9sYXJzRmllbGRzLm1hcChmaWVsZCA9PiBmaWVsZC5uYW1lKVxuXG4gIGNvbnN0IHJlcXVpcmVkTmFtZXMgPSBmaWVsZHNcbiAgICAuZmlsdGVyKGZpZWxkID0+IGZpZWxkLmNvbnN0cmFpbnRzPy5yZXF1aXJlZClcbiAgICAubWFwKGZpZWxkID0+IGZpZWxkLm5hbWUpXG5cbiAgY29uc3QgZXh0cmFGaWVsZHMgPSBwb2xhcnNGaWVsZHMubGVuZ3RoIC0gZmllbGRzLmxlbmd0aFxuICBjb25zdCBtaXNzaW5nRmllbGRzID0gZmllbGRzLmxlbmd0aCAtIHBvbGFyc0ZpZWxkcy5sZW5ndGhcblxuICBjb25zdCBleHRyYU5hbWVzID0gYXJyYXlEaWZmKHBvbGFyc05hbWVzLCBuYW1lcylcbiAgY29uc3QgbWlzc2luZ05hbWVzID0gYXJyYXlEaWZmKG5hbWVzLCBwb2xhcnNOYW1lcylcbiAgY29uc3QgbWlzc2luZ1JlcXVpcmVkTmFtZXMgPSBhcnJheURpZmYocmVxdWlyZWROYW1lcywgcG9sYXJzTmFtZXMpXG5cbiAgaWYgKGZpZWxkc01hdGNoID09PSBcImV4YWN0XCIpIHtcbiAgICBpZiAoZXh0cmFGaWVsZHMgPiAwKSB7XG4gICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgIHR5cGU6IFwiZmllbGRzL2V4dHJhXCIsXG4gICAgICAgIGZpZWxkTmFtZXM6IGV4dHJhTmFtZXMsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChtaXNzaW5nRmllbGRzID4gMCkge1xuICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICB0eXBlOiBcImZpZWxkcy9taXNzaW5nXCIsXG4gICAgICAgIGZpZWxkTmFtZXM6IG1pc3NpbmdOYW1lcyxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgaWYgKGZpZWxkc01hdGNoID09PSBcImVxdWFsXCIpIHtcbiAgICBpZiAoZXh0cmFOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgIHR5cGU6IFwiZmllbGRzL2V4dHJhXCIsXG4gICAgICAgIGZpZWxkTmFtZXM6IGV4dHJhTmFtZXMsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChtaXNzaW5nUmVxdWlyZWROYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgIHR5cGU6IFwiZmllbGRzL21pc3NpbmdcIixcbiAgICAgICAgZmllbGROYW1lczogbWlzc2luZ1JlcXVpcmVkTmFtZXMsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGlmIChmaWVsZHNNYXRjaCA9PT0gXCJzdWJzZXRcIikge1xuICAgIGlmIChtaXNzaW5nUmVxdWlyZWROYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgIHR5cGU6IFwiZmllbGRzL21pc3NpbmdcIixcbiAgICAgICAgZmllbGROYW1lczogbWlzc2luZ1JlcXVpcmVkTmFtZXMsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGlmIChmaWVsZHNNYXRjaCA9PT0gXCJzdXBlcnNldFwiKSB7XG4gICAgaWYgKGV4dHJhTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICB0eXBlOiBcImZpZWxkcy9leHRyYVwiLFxuICAgICAgICBmaWVsZE5hbWVzOiBleHRyYU5hbWVzLFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBpZiAoZmllbGRzTWF0Y2ggPT09IFwicGFydGlhbFwiKSB7XG4gICAgaWYgKG1pc3NpbmdOYW1lcy5sZW5ndGggPT09IGZpZWxkcy5sZW5ndGgpIHtcbiAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgdHlwZTogXCJmaWVsZHMvbWlzc2luZ1wiLFxuICAgICAgICBmaWVsZE5hbWVzOiBtaXNzaW5nTmFtZXMsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlcnJvcnNcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5zcGVjdEZpZWxkcyhcbiAgbWFwcGluZzogU2NoZW1hTWFwcGluZyxcbiAgdGFibGU6IFRhYmxlLFxuICBvcHRpb25zOiB7XG4gICAgbWF4RXJyb3JzOiBudW1iZXJcbiAgfSxcbikge1xuICBjb25zdCB7IG1heEVycm9ycyB9ID0gb3B0aW9uc1xuICBjb25zdCBlcnJvcnM6IFRhYmxlRXJyb3JbXSA9IFtdXG4gIGNvbnN0IGZpZWxkcyA9IG1hcHBpbmcudGFyZ2V0LmZpZWxkc1xuICBjb25zdCBjb25jdXJyZW5jeSA9IG9zLmNwdXMoKS5sZW5ndGhcbiAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gIGNvbnN0IG1heEZpZWxkRXJyb3JzID0gTWF0aC5jZWlsKG1heEVycm9ycyAvIGZpZWxkcy5sZW5ndGgpXG5cbiAgY29uc3QgY29sbGVjdEZpZWxkRXJyb3JzID0gYXN5bmMgKGluZGV4OiBudW1iZXIsIGZpZWxkOiBGaWVsZCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkTWFwcGluZyA9IG1hdGNoU2NoZW1hRmllbGQobWFwcGluZywgZmllbGQsIGluZGV4KVxuICAgIGlmICghZmllbGRNYXBwaW5nKSByZXR1cm5cblxuICAgIGNvbnN0IGZpZWxkRXJyb3JzID0gYXdhaXQgaW5zcGVjdEZpZWxkKGZpZWxkTWFwcGluZywgdGFibGUsIHtcbiAgICAgIG1heEVycm9yczogbWF4RmllbGRFcnJvcnMsXG4gICAgfSlcblxuICAgIGVycm9ycy5wdXNoKC4uLmZpZWxkRXJyb3JzKVxuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gbWF4RXJyb3JzKSB7XG4gICAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKVxuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgcEFsbChcbiAgICAgIGZpZWxkcy5tYXAoKGZpZWxkLCBpbmRleCkgPT4gKCkgPT4gY29sbGVjdEZpZWxkRXJyb3JzKGluZGV4LCBmaWVsZCkpLFxuICAgICAgeyBjb25jdXJyZW5jeSB9LFxuICAgIClcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBpc0Fib3J0ZWQgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm5hbWUgPT09IFwiQWJvcnRFcnJvclwiXG4gICAgaWYgKCFpc0Fib3J0ZWQpIHRocm93IGVycm9yXG4gIH1cblxuICByZXR1cm4gZXJyb3JzXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGluc3BlY3RSb3dzKFxuICBtYXBwaW5nOiBTY2hlbWFNYXBwaW5nLFxuICB0YWJsZTogVGFibGUsXG4gIG9wdGlvbnM6IHsgbWF4RXJyb3JzOiBudW1iZXIgfSxcbikge1xuICBjb25zdCB7IG1heEVycm9ycyB9ID0gb3B0aW9uc1xuICBjb25zdCBlcnJvcnM6IFRhYmxlRXJyb3JbXSA9IFtdXG4gIGNvbnN0IGZpZWxkcyA9IG1hcHBpbmcudGFyZ2V0LmZpZWxkc1xuICBjb25zdCBjb25jdXJyZW5jeSA9IG9zLmNwdXMoKS5sZW5ndGggLSAxXG4gIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICBjb25zdCBtYXhSb3dFcnJvcnMgPSBNYXRoLmNlaWwobWF4RXJyb3JzIC8gZmllbGRzLmxlbmd0aClcblxuICBjb25zdCBjb2xsZWN0Um93RXJyb3JzID0gYXN5bmMgKGNoZWNrOiBhbnkpID0+IHtcbiAgICBjb25zdCByb3dDaGVja1RhYmxlID0gdGFibGVcbiAgICAgIC53aXRoUm93Q291bnQoKVxuICAgICAgLndpdGhDb2x1bW4ocGwuY29sKFwicm93X25yXCIpLmFkZCgxKSlcbiAgICAgIC5yZW5hbWUoeyByb3dfbnI6IFwiZHBraXQ6bnVtYmVyXCIgfSlcbiAgICAgIC53aXRoQ29sdW1uKFxuICAgICAgICBwbFxuICAgICAgICAgIC53aGVuKGNoZWNrLmlzRXJyb3JFeHByKVxuICAgICAgICAgIC50aGVuKHBsLmxpdChKU09OLnN0cmluZ2lmeShjaGVjay5lcnJvclRlbXBsYXRlKSkpXG4gICAgICAgICAgLm90aGVyd2lzZShwbC5saXQobnVsbCkpXG4gICAgICAgICAgLmFsaWFzKFwiZHBraXQ6ZXJyb3JcIiksXG4gICAgICApXG5cbiAgICBjb25zdCByb3dDaGVja0ZyYW1lID0gYXdhaXQgcm93Q2hlY2tUYWJsZVxuICAgICAgLmZpbHRlcihwbC5jb2woXCJkcGtpdDplcnJvclwiKS5pc05vdE51bGwoKSlcbiAgICAgIC5oZWFkKG1heFJvd0Vycm9ycylcbiAgICAgIC5jb2xsZWN0KClcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd0NoZWNrRnJhbWUudG9SZWNvcmRzKCkgYXMgYW55W10pIHtcbiAgICAgIGNvbnN0IGVycm9yVGVtcGxhdGUgPSBKU09OLnBhcnNlKHJvd1tcImRwa2l0OmVycm9yXCJdKSBhcyBSb3dFcnJvclxuICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAuLi5lcnJvclRlbXBsYXRlLFxuICAgICAgICByb3dOdW1iZXI6IHJvd1tcImRwa2l0Om51bWJlclwiXSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiBtYXhFcnJvcnMpIHtcbiAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpXG4gICAgfVxuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBwQWxsKFxuICAgICAgWy4uLmNyZWF0ZUNoZWNrc1Jvd1VuaXF1ZShtYXBwaW5nKV0ubWFwKGl0ID0+ICgpID0+IGNvbGxlY3RSb3dFcnJvcnMoaXQpKSxcbiAgICAgIHsgY29uY3VycmVuY3kgfSxcbiAgICApXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgaXNBYm9ydGVkID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5uYW1lID09PSBcIkFib3J0RXJyb3JcIlxuICAgIGlmICghaXNBYm9ydGVkKSB0aHJvdyBlcnJvclxuICB9XG5cbiAgcmV0dXJuIGVycm9yc1xufVxuIl19
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,335 @@
1
+ import * as pl from "nodejs-polars";
2
+ import { describe, expect, it } from "vitest";
3
+ import { inspectTable } from "./inspect.js";
4
+ describe("inspectTable", () => {
5
+ describe("fields validation with fieldsMatch='exact'", () => {
6
+ it("should pass when fields exactly match", async () => {
7
+ const table = pl
8
+ .DataFrame({
9
+ id: [1, 2],
10
+ name: ["John", "Jane"],
11
+ })
12
+ .lazy();
13
+ const schema = {
14
+ fields: [
15
+ { name: "id", type: "number" },
16
+ { name: "name", type: "string" },
17
+ ],
18
+ };
19
+ const errors = await inspectTable(table, { schema });
20
+ expect(errors).toEqual([]);
21
+ });
22
+ it("should not have fields error when fields same length", async () => {
23
+ const table = pl
24
+ .DataFrame({
25
+ id: [1, 2],
26
+ age: [30, 25],
27
+ })
28
+ .lazy();
29
+ const schema = {
30
+ fieldsMatch: "exact",
31
+ fields: [
32
+ { name: "id", type: "number" },
33
+ { name: "name", type: "number" },
34
+ ],
35
+ };
36
+ const errors = await inspectTable(table, { schema });
37
+ expect(errors).toEqual([
38
+ {
39
+ type: "field/name",
40
+ fieldName: "name",
41
+ actualFieldName: "age",
42
+ },
43
+ ]);
44
+ });
45
+ });
46
+ it("should detect extra fields", async () => {
47
+ const table = pl
48
+ .DataFrame({
49
+ id: [1, 2],
50
+ name: ["John", "Jane"],
51
+ age: [30, 25],
52
+ })
53
+ .lazy();
54
+ const schema = {
55
+ fields: [
56
+ { name: "id", type: "number" },
57
+ { name: "name", type: "string" },
58
+ ],
59
+ };
60
+ const errors = await inspectTable(table, { schema });
61
+ expect(errors).toContainEqual({
62
+ type: "fields/extra",
63
+ fieldNames: ["age"],
64
+ });
65
+ });
66
+ it("should detect missing fields", async () => {
67
+ const table = pl
68
+ .DataFrame({
69
+ id: [1, 2],
70
+ })
71
+ .lazy();
72
+ const schema = {
73
+ fields: [
74
+ { name: "id", type: "number" },
75
+ { name: "name", type: "string" },
76
+ ],
77
+ };
78
+ const errors = await inspectTable(table, { schema });
79
+ expect(errors).toContainEqual({
80
+ type: "fields/missing",
81
+ fieldNames: ["name"],
82
+ });
83
+ });
84
+ describe("fields validation with fieldsMatch='equal'", () => {
85
+ it("should pass when field names match regardless of order", async () => {
86
+ const table = pl
87
+ .DataFrame({
88
+ name: ["John", "Jane"],
89
+ id: [1, 2],
90
+ })
91
+ .lazy();
92
+ const schema = {
93
+ fieldsMatch: "equal",
94
+ fields: [
95
+ { name: "id", type: "number" },
96
+ { name: "name", type: "string" },
97
+ ],
98
+ };
99
+ const errors = await inspectTable(table, { schema });
100
+ expect(errors).toEqual([]);
101
+ });
102
+ it("should detect extra fields", async () => {
103
+ const table = pl
104
+ .DataFrame({
105
+ id: [1, 2],
106
+ name: ["John", "Jane"],
107
+ age: [30, 25],
108
+ })
109
+ .lazy();
110
+ const schema = {
111
+ fieldsMatch: "equal",
112
+ fields: [
113
+ { name: "id", type: "number" },
114
+ { name: "name", type: "string" },
115
+ ],
116
+ };
117
+ const errors = await inspectTable(table, { schema });
118
+ expect(errors).toContainEqual({
119
+ type: "fields/extra",
120
+ fieldNames: ["age"],
121
+ });
122
+ });
123
+ it("should detect missing fields", async () => {
124
+ const table = pl
125
+ .DataFrame({
126
+ id: [1, 2],
127
+ })
128
+ .lazy();
129
+ const schema = {
130
+ fieldsMatch: "equal",
131
+ fields: [
132
+ { name: "id", type: "number" },
133
+ {
134
+ name: "name",
135
+ type: "string",
136
+ constraints: { required: true },
137
+ },
138
+ ],
139
+ };
140
+ const errors = await inspectTable(table, { schema });
141
+ expect(errors).toContainEqual({
142
+ type: "fields/missing",
143
+ fieldNames: ["name"],
144
+ });
145
+ });
146
+ it("should pass when non-required fields are missing", async () => {
147
+ const table = pl
148
+ .DataFrame({
149
+ id: [1, 2],
150
+ })
151
+ .lazy();
152
+ const schema = {
153
+ fieldsMatch: "equal",
154
+ fields: [
155
+ { name: "id", type: "number" },
156
+ { name: "name", type: "string" },
157
+ ],
158
+ };
159
+ const errors = await inspectTable(table, { schema });
160
+ expect(errors).toEqual([]);
161
+ });
162
+ });
163
+ describe("fields validation with fieldsMatch='subset'", () => {
164
+ it("should pass when data contains all schema fields", async () => {
165
+ const table = pl
166
+ .DataFrame({
167
+ id: [1, 2],
168
+ name: ["John", "Jane"],
169
+ age: [30, 25],
170
+ })
171
+ .lazy();
172
+ const schema = {
173
+ fieldsMatch: "subset",
174
+ fields: [
175
+ { name: "id", type: "number" },
176
+ { name: "name", type: "string" },
177
+ ],
178
+ };
179
+ const errors = await inspectTable(table, { schema });
180
+ expect(errors).toEqual([]);
181
+ });
182
+ it("should pass when data contains exact schema fields", async () => {
183
+ const table = pl
184
+ .DataFrame({
185
+ id: [1, 2],
186
+ name: ["John", "Jane"],
187
+ })
188
+ .lazy();
189
+ const schema = {
190
+ fieldsMatch: "subset",
191
+ fields: [
192
+ { name: "id", type: "number" },
193
+ { name: "name", type: "string" },
194
+ ],
195
+ };
196
+ const errors = await inspectTable(table, { schema });
197
+ expect(errors).toEqual([]);
198
+ });
199
+ it("should detect missing fields", async () => {
200
+ const table = pl
201
+ .DataFrame({
202
+ id: [1, 2],
203
+ })
204
+ .lazy();
205
+ const schema = {
206
+ fieldsMatch: "subset",
207
+ fields: [
208
+ { name: "id", type: "number" },
209
+ {
210
+ name: "name",
211
+ type: "string",
212
+ constraints: { required: true },
213
+ },
214
+ ],
215
+ };
216
+ const errors = await inspectTable(table, { schema });
217
+ expect(errors).toContainEqual({
218
+ type: "fields/missing",
219
+ fieldNames: ["name"],
220
+ });
221
+ });
222
+ it("should pass when non-required fields are missing", async () => {
223
+ const table = pl
224
+ .DataFrame({
225
+ id: [1, 2],
226
+ })
227
+ .lazy();
228
+ const schema = {
229
+ fieldsMatch: "subset",
230
+ fields: [
231
+ { name: "id", type: "number" },
232
+ { name: "name", type: "string" },
233
+ ],
234
+ };
235
+ const errors = await inspectTable(table, { schema });
236
+ expect(errors).toEqual([]);
237
+ });
238
+ });
239
+ describe("fields validation with fieldsMatch='superset'", () => {
240
+ it("should pass when schema contains all data fields", async () => {
241
+ const table = pl
242
+ .DataFrame({
243
+ id: [1, 2],
244
+ })
245
+ .lazy();
246
+ const schema = {
247
+ fieldsMatch: "superset",
248
+ fields: [
249
+ { name: "id", type: "number" },
250
+ { name: "name", type: "string" },
251
+ ],
252
+ };
253
+ const errors = await inspectTable(table, { schema });
254
+ expect(errors).toEqual([]);
255
+ });
256
+ it("should pass when schema contains exact data fields", async () => {
257
+ const table = pl
258
+ .DataFrame({
259
+ id: [1, 2],
260
+ name: ["John", "Jane"],
261
+ })
262
+ .lazy();
263
+ const schema = {
264
+ fieldsMatch: "superset",
265
+ fields: [
266
+ { name: "id", type: "number" },
267
+ { name: "name", type: "string" },
268
+ ],
269
+ };
270
+ const errors = await inspectTable(table, { schema });
271
+ expect(errors).toEqual([]);
272
+ });
273
+ it("should detect extra fields", async () => {
274
+ const table = pl
275
+ .DataFrame({
276
+ id: [1, 2],
277
+ name: ["John", "Jane"],
278
+ age: [30, 25],
279
+ })
280
+ .lazy();
281
+ const schema = {
282
+ fieldsMatch: "superset",
283
+ fields: [
284
+ { name: "id", type: "number" },
285
+ { name: "name", type: "string" },
286
+ ],
287
+ };
288
+ const errors = await inspectTable(table, { schema });
289
+ expect(errors).toContainEqual({
290
+ type: "fields/extra",
291
+ fieldNames: ["age"],
292
+ });
293
+ });
294
+ });
295
+ describe("fields validation with fieldsMatch='partial'", () => {
296
+ it("should pass when at least one field matches", async () => {
297
+ const table = pl
298
+ .DataFrame({
299
+ id: [1, 2],
300
+ age: [30, 25],
301
+ })
302
+ .lazy();
303
+ const schema = {
304
+ fieldsMatch: "partial",
305
+ fields: [
306
+ { name: "id", type: "number" },
307
+ { name: "name", type: "string" },
308
+ ],
309
+ };
310
+ const errors = await inspectTable(table, { schema });
311
+ expect(errors).toEqual([]);
312
+ });
313
+ it("should detect when no fields match", async () => {
314
+ const table = pl
315
+ .DataFrame({
316
+ age: [30, 25],
317
+ email: ["john@example.com", "jane@example.com"],
318
+ })
319
+ .lazy();
320
+ const schema = {
321
+ fieldsMatch: "partial",
322
+ fields: [
323
+ { name: "id", type: "number" },
324
+ { name: "name", type: "string" },
325
+ ],
326
+ };
327
+ const errors = await inspectTable(table, { schema });
328
+ expect(errors).toContainEqual({
329
+ type: "fields/missing",
330
+ fieldNames: ["id", "name"],
331
+ });
332
+ });
333
+ });
334
+ });
335
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zcGVjdC5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGFibGUvaW5zcGVjdC5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBRTNDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsR0FBRyxFQUFFO0lBQzVCLFFBQVEsQ0FBQyw0Q0FBNEMsRUFBRSxHQUFHLEVBQUU7UUFDMUQsRUFBRSxDQUFDLHVDQUF1QyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3JELE1BQU0sS0FBSyxHQUFHLEVBQUU7aUJBQ2IsU0FBUyxDQUFDO2dCQUNULEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ1YsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQzthQUN2QixDQUFDO2lCQUNELElBQUksRUFBRSxDQUFBO1lBRVQsTUFBTSxNQUFNLEdBQVc7Z0JBQ3JCLE1BQU0sRUFBRTtvQkFDTixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtvQkFDOUIsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7aUJBQ2pDO2FBQ0YsQ0FBQTtZQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sWUFBWSxDQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUE7WUFFcEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUM1QixDQUFDLENBQUMsQ0FBQTtRQUVGLEVBQUUsQ0FBQyxzREFBc0QsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNwRSxNQUFNLEtBQUssR0FBRyxFQUFF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Q0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU2NoZW1hIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0ICogYXMgcGwgZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IGluc3BlY3RUYWJsZSB9IGZyb20gXCIuL2luc3BlY3QudHNcIlxuXG5kZXNjcmliZShcImluc3BlY3RUYWJsZVwiLCAoKSA9PiB7XG4gIGRlc2NyaWJlKFwiZmllbGRzIHZhbGlkYXRpb24gd2l0aCBmaWVsZHNNYXRjaD0nZXhhY3QnXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBwYXNzIHdoZW4gZmllbGRzIGV4YWN0bHkgbWF0Y2hcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgICBpZDogWzEsIDJdLFxuICAgICAgICAgIG5hbWU6IFtcIkpvaG5cIiwgXCJKYW5lXCJdLFxuICAgICAgICB9KVxuICAgICAgICAubGF6eSgpXG5cbiAgICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJudW1iZXJcIiB9LFxuICAgICAgICAgIHsgbmFtZTogXCJuYW1lXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgXSxcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXJyb3JzID0gYXdhaXQgaW5zcGVjdFRhYmxlKHRhYmxlLCB7IHNjaGVtYSB9KVxuXG4gICAgICBleHBlY3QoZXJyb3JzKS50b0VxdWFsKFtdKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBub3QgaGF2ZSBmaWVsZHMgZXJyb3Igd2hlbiBmaWVsZHMgc2FtZSBsZW5ndGhcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgICBpZDogWzEsIDJdLFxuICAgICAgICAgIGFnZTogWzMwLCAyNV0sXG4gICAgICAgIH0pXG4gICAgICAgIC5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICAgIGZpZWxkc01hdGNoOiBcImV4YWN0XCIsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICAgICAgeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJudW1iZXJcIiB9LFxuICAgICAgICBdLFxuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgICBleHBlY3QoZXJyb3JzKS50b0VxdWFsKFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwiZmllbGQvbmFtZVwiLFxuICAgICAgICAgIGZpZWxkTmFtZTogXCJuYW1lXCIsXG4gICAgICAgICAgYWN0dWFsRmllbGROYW1lOiBcImFnZVwiLFxuICAgICAgICB9LFxuICAgICAgXSlcbiAgICB9KVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGRldGVjdCBleHRyYSBmaWVsZHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBpZDogWzEsIDJdLFxuICAgICAgICBuYW1lOiBbXCJKb2huXCIsIFwiSmFuZVwiXSxcbiAgICAgICAgYWdlOiBbMzAsIDI1XSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJudW1iZXJcIiB9LFxuICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICBleHBlY3QoZXJyb3JzKS50b0NvbnRhaW5FcXVhbCh7XG4gICAgICB0eXBlOiBcImZpZWxkcy9leHRyYVwiLFxuICAgICAgZmllbGROYW1lczogW1wiYWdlXCJdLFxuICAgIH0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgZGV0ZWN0IG1pc3NpbmcgZmllbGRzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgaWQ6IFsxLCAyXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJudW1iZXJcIiB9LFxuICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICBleHBlY3QoZXJyb3JzKS50b0NvbnRhaW5FcXVhbCh7XG4gICAgICB0eXBlOiBcImZpZWxkcy9taXNzaW5nXCIsXG4gICAgICBmaWVsZE5hbWVzOiBbXCJuYW1lXCJdLFxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoXCJmaWVsZHMgdmFsaWRhdGlvbiB3aXRoIGZpZWxkc01hdGNoPSdlcXVhbCdcIiwgKCkgPT4ge1xuICAgIGl0KFwic2hvdWxkIHBhc3Mgd2hlbiBmaWVsZCBuYW1lcyBtYXRjaCByZWdhcmRsZXNzIG9mIG9yZGVyXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgICAgbmFtZTogW1wiSm9oblwiLCBcIkphbmVcIl0sXG4gICAgICAgICAgaWQ6IFsxLCAyXSxcbiAgICAgICAgfSlcbiAgICAgICAgLmxhenkoKVxuXG4gICAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgICAgZmllbGRzTWF0Y2g6IFwiZXF1YWxcIixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIF0sXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICAgIGV4cGVjdChlcnJvcnMpLnRvRXF1YWwoW10pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIGRldGVjdCBleHRyYSBmaWVsZHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgICBpZDogWzEsIDJdLFxuICAgICAgICAgIG5hbWU6IFtcIkpvaG5cIiwgXCJKYW5lXCJdLFxuICAgICAgICAgIGFnZTogWzMwLCAyNV0sXG4gICAgICAgIH0pXG4gICAgICAgIC5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICAgIGZpZWxkc01hdGNoOiBcImVxdWFsXCIsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICAgICAgeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBdLFxuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgICBleHBlY3QoZXJyb3JzKS50b0NvbnRhaW5FcXVhbCh7XG4gICAgICAgIHR5cGU6IFwiZmllbGRzL2V4dHJhXCIsXG4gICAgICAgIGZpZWxkTmFtZXM6IFtcImFnZVwiXSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIGRldGVjdCBtaXNzaW5nIGZpZWxkc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICAgIGlkOiBbMSwgMl0sXG4gICAgICAgIH0pXG4gICAgICAgIC5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICAgIGZpZWxkc01hdGNoOiBcImVxdWFsXCIsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJuYW1lXCIsXG4gICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgY29uc3RyYWludHM6IHsgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgICBleHBlY3QoZXJyb3JzKS50b0NvbnRhaW5FcXVhbCh7XG4gICAgICAgIHR5cGU6IFwiZmllbGRzL21pc3NpbmdcIixcbiAgICAgICAgZmllbGROYW1lczogW1wibmFtZVwiXSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIHBhc3Mgd2hlbiBub24tcmVxdWlyZWQgZmllbGRzIGFyZSBtaXNzaW5nXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgICAgaWQ6IFsxLCAyXSxcbiAgICAgICAgfSlcbiAgICAgICAgLmxhenkoKVxuXG4gICAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgICAgZmllbGRzTWF0Y2g6IFwiZXF1YWxcIixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIF0sXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICAgIGV4cGVjdChlcnJvcnMpLnRvRXF1YWwoW10pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZShcImZpZWxkcyB2YWxpZGF0aW9uIHdpdGggZmllbGRzTWF0Y2g9J3N1YnNldCdcIiwgKCkgPT4ge1xuICAgIGl0KFwic2hvdWxkIHBhc3Mgd2hlbiBkYXRhIGNvbnRhaW5zIGFsbCBzY2hlbWEgZmllbGRzXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgICAgaWQ6IFsxLCAyXSxcbiAgICAgICAgICBuYW1lOiBbXCJKb2huXCIsIFwiSmFuZVwiXSxcbiAgICAgICAgICBhZ2U6IFszMCwgMjVdLFxuICAgICAgICB9KVxuICAgICAgICAubGF6eSgpXG5cbiAgICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgICBmaWVsZHNNYXRjaDogXCJzdWJzZXRcIixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIF0sXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICAgIGV4cGVjdChlcnJvcnMpLnRvRXF1YWwoW10pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIHBhc3Mgd2hlbiBkYXRhIGNvbnRhaW5zIGV4YWN0IHNjaGVtYSBmaWVsZHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgICBpZDogWzEsIDJdLFxuICAgICAgICAgIG5hbWU6IFtcIkpvaG5cIiwgXCJKYW5lXCJdLFxuICAgICAgICB9KVxuICAgICAgICAubGF6eSgpXG5cbiAgICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgICBmaWVsZHNNYXRjaDogXCJzdWJzZXRcIixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIF0sXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICAgIGV4cGVjdChlcnJvcnMpLnRvRXF1YWwoW10pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIGRldGVjdCBtaXNzaW5nIGZpZWxkc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICAgIGlkOiBbMSwgMl0sXG4gICAgICAgIH0pXG4gICAgICAgIC5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICAgIGZpZWxkc01hdGNoOiBcInN1YnNldFwiLFxuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJudW1iZXJcIiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGNvbnN0cmFpbnRzOiB7IHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXJyb3JzID0gYXdhaXQgaW5zcGVjdFRhYmxlKHRhYmxlLCB7IHNjaGVtYSB9KVxuICAgICAgZXhwZWN0KGVycm9ycykudG9Db250YWluRXF1YWwoe1xuICAgICAgICB0eXBlOiBcImZpZWxkcy9taXNzaW5nXCIsXG4gICAgICAgIGZpZWxkTmFtZXM6IFtcIm5hbWVcIl0sXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBwYXNzIHdoZW4gbm9uLXJlcXVpcmVkIGZpZWxkcyBhcmUgbWlzc2luZ1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICAgIGlkOiBbMSwgMl0sXG4gICAgICAgIH0pXG4gICAgICAgIC5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICAgIGZpZWxkc01hdGNoOiBcInN1YnNldFwiLFxuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJudW1iZXJcIiB9LFxuICAgICAgICAgIHsgbmFtZTogXCJuYW1lXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgXSxcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXJyb3JzID0gYXdhaXQgaW5zcGVjdFRhYmxlKHRhYmxlLCB7IHNjaGVtYSB9KVxuICAgICAgZXhwZWN0KGVycm9ycykudG9FcXVhbChbXSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKFwiZmllbGRzIHZhbGlkYXRpb24gd2l0aCBmaWVsZHNNYXRjaD0nc3VwZXJzZXQnXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBwYXNzIHdoZW4gc2NoZW1hIGNvbnRhaW5zIGFsbCBkYXRhIGZpZWxkc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICAgIGlkOiBbMSwgMl0sXG4gICAgICAgIH0pXG4gICAgICAgIC5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICAgIGZpZWxkc01hdGNoOiBcInN1cGVyc2V0XCIsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICAgICAgeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBdLFxuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgICBleHBlY3QoZXJyb3JzKS50b0VxdWFsKFtdKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBwYXNzIHdoZW4gc2NoZW1hIGNvbnRhaW5zIGV4YWN0IGRhdGEgZmllbGRzXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgICAgaWQ6IFsxLCAyXSxcbiAgICAgICAgICBuYW1lOiBbXCJKb2huXCIsIFwiSmFuZVwiXSxcbiAgICAgICAgfSlcbiAgICAgICAgLmxhenkoKVxuXG4gICAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgICAgZmllbGRzTWF0Y2g6IFwic3VwZXJzZXRcIixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIF0sXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICAgIGV4cGVjdChlcnJvcnMpLnRvRXF1YWwoW10pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIGRldGVjdCBleHRyYSBmaWVsZHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgICBpZDogWzEsIDJdLFxuICAgICAgICAgIG5hbWU6IFtcIkpvaG5cIiwgXCJKYW5lXCJdLFxuICAgICAgICAgIGFnZTogWzMwLCAyNV0sXG4gICAgICAgIH0pXG4gICAgICAgIC5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICAgIGZpZWxkc01hdGNoOiBcInN1cGVyc2V0XCIsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICAgICAgeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBdLFxuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgICBleHBlY3QoZXJyb3JzKS50b0NvbnRhaW5FcXVhbCh7XG4gICAgICAgIHR5cGU6IFwiZmllbGRzL2V4dHJhXCIsXG4gICAgICAgIGZpZWxkTmFtZXM6IFtcImFnZVwiXSxcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZShcImZpZWxkcyB2YWxpZGF0aW9uIHdpdGggZmllbGRzTWF0Y2g9J3BhcnRpYWwnXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBwYXNzIHdoZW4gYXQgbGVhc3Qgb25lIGZpZWxkIG1hdGNoZXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgICBpZDogWzEsIDJdLFxuICAgICAgICAgIGFnZTogWzMwLCAyNV0sXG4gICAgICAgIH0pXG4gICAgICAgIC5sYXp5KClcblxuICAgICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICAgIGZpZWxkc01hdGNoOiBcInBhcnRpYWxcIixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIF0sXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICAgIGV4cGVjdChlcnJvcnMpLnRvRXF1YWwoW10pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIGRldGVjdCB3aGVuIG5vIGZpZWxkcyBtYXRjaFwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICAgIGFnZTogWzMwLCAyNV0sXG4gICAgICAgICAgZW1haWw6IFtcImpvaG5AZXhhbXBsZS5jb21cIiwgXCJqYW5lQGV4YW1wbGUuY29tXCJdLFxuICAgICAgICB9KVxuICAgICAgICAubGF6eSgpXG5cbiAgICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgICBmaWVsZHNNYXRjaDogXCJwYXJ0aWFsXCIsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICAgICAgeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBdLFxuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgICBleHBlY3QoZXJyb3JzKS50b0NvbnRhaW5FcXVhbCh7XG4gICAgICAgIHR5cGU6IFwiZmllbGRzL21pc3NpbmdcIixcbiAgICAgICAgZmllbGROYW1lczogW1wiaWRcIiwgXCJuYW1lXCJdLFxuICAgICAgfSlcbiAgICB9KVxuICB9KVxufSlcbiJdfQ==
@@ -0,0 +1,6 @@
1
+ import type { Schema } from "@frictionless-ts/metadata";
2
+ import * as pl from "nodejs-polars";
3
+ import type { SchemaMapping } from "../schema/index.ts";
4
+ import type { Table } from "./Table.ts";
5
+ export declare function normalizeTable(table: Table, schema: Schema): Promise<pl.LazyDataFrame<any>>;
6
+ export declare function normalizeFields(mapping: SchemaMapping): Record<string, pl.Expr>;
@@ -0,0 +1,27 @@
1
+ import * as pl from "nodejs-polars";
2
+ import { normalizeField } from "../field/index.js";
3
+ import { matchSchemaField } from "../schema/index.js";
4
+ import { getPolarsSchema } from "../schema/index.js";
5
+ const HEAD_ROWS = 100;
6
+ export async function normalizeTable(table, schema) {
7
+ const head = await table.head(HEAD_ROWS).collect();
8
+ const polarsSchema = getPolarsSchema(head.schema);
9
+ const mapping = { source: polarsSchema, target: schema };
10
+ return table.select(...Object.values(normalizeFields(mapping)));
11
+ }
12
+ export function normalizeFields(mapping) {
13
+ const exprs = {};
14
+ for (const [index, field] of mapping.target.fields.entries()) {
15
+ const fieldMapping = matchSchemaField(mapping, field, index);
16
+ let expr = pl.lit(null).alias(field.name);
17
+ if (fieldMapping) {
18
+ const missingValues = field.missingValues ?? mapping.target.missingValues;
19
+ const mergedField = { ...field, missingValues };
20
+ const column = { source: fieldMapping.source, target: mergedField };
21
+ expr = normalizeField(column);
22
+ }
23
+ exprs[field.name] = expr;
24
+ }
25
+ return exprs;
26
+ }
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9ybWFsaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGFibGUvbm9ybWFsaXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFJcEQsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFBO0FBRXJCLE1BQU0sQ0FBQyxLQUFLLFVBQVUsY0FBYyxDQUFDLEtBQVksRUFBRSxNQUFjO0lBQy9ELE1BQU0sSUFBSSxHQUFHLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUNsRCxNQUFNLFlBQVksR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRWpELE1BQU0sT0FBTyxHQUFHLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUE7SUFDeEQsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ2pFLENBQUM7QUFFRCxNQUFNLFVBQVUsZUFBZSxDQUFDLE9BQXNCO0lBQ3BELE1BQU0sS0FBSyxHQUE0QixFQUFFLENBQUE7SUFFekMsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDN0QsTUFBTSxZQUFZLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUM1RCxJQUFJLElBQUksR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFekMsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFBO1lBQ3pFLE1BQU0sV0FBVyxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsYUFBYSxFQUFFLENBQUE7WUFFL0MsTUFBTSxNQUFNLEdBQUcsRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUE7WUFDbkUsSUFBSSxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUMvQixDQUFDO1FBRUQsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUE7SUFDMUIsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU2NoZW1hIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0ICogYXMgcGwgZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuaW1wb3J0IHsgbm9ybWFsaXplRmllbGQgfSBmcm9tIFwiLi4vZmllbGQvaW5kZXgudHNcIlxuaW1wb3J0IHsgbWF0Y2hTY2hlbWFGaWVsZCB9IGZyb20gXCIuLi9zY2hlbWEvaW5kZXgudHNcIlxuaW1wb3J0IHsgZ2V0UG9sYXJzU2NoZW1hIH0gZnJvbSBcIi4uL3NjaGVtYS9pbmRleC50c1wiXG5pbXBvcnQgdHlwZSB7IFNjaGVtYU1hcHBpbmcgfSBmcm9tIFwiLi4vc2NoZW1hL2luZGV4LnRzXCJcbmltcG9ydCB0eXBlIHsgVGFibGUgfSBmcm9tIFwiLi9UYWJsZS50c1wiXG5cbmNvbnN0IEhFQURfUk9XUyA9IDEwMFxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplVGFibGUodGFibGU6IFRhYmxlLCBzY2hlbWE6IFNjaGVtYSkge1xuICBjb25zdCBoZWFkID0gYXdhaXQgdGFibGUuaGVhZChIRUFEX1JPV1MpLmNvbGxlY3QoKVxuICBjb25zdCBwb2xhcnNTY2hlbWEgPSBnZXRQb2xhcnNTY2hlbWEoaGVhZC5zY2hlbWEpXG5cbiAgY29uc3QgbWFwcGluZyA9IHsgc291cmNlOiBwb2xhcnNTY2hlbWEsIHRhcmdldDogc2NoZW1hIH1cbiAgcmV0dXJuIHRhYmxlLnNlbGVjdCguLi5PYmplY3QudmFsdWVzKG5vcm1hbGl6ZUZpZWxkcyhtYXBwaW5nKSkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVGaWVsZHMobWFwcGluZzogU2NoZW1hTWFwcGluZykge1xuICBjb25zdCBleHByczogUmVjb3JkPHN0cmluZywgcGwuRXhwcj4gPSB7fVxuXG4gIGZvciAoY29uc3QgW2luZGV4LCBmaWVsZF0gb2YgbWFwcGluZy50YXJnZXQuZmllbGRzLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IGZpZWxkTWFwcGluZyA9IG1hdGNoU2NoZW1hRmllbGQobWFwcGluZywgZmllbGQsIGluZGV4KVxuICAgIGxldCBleHByID0gcGwubGl0KG51bGwpLmFsaWFzKGZpZWxkLm5hbWUpXG5cbiAgICBpZiAoZmllbGRNYXBwaW5nKSB7XG4gICAgICBjb25zdCBtaXNzaW5nVmFsdWVzID0gZmllbGQubWlzc2luZ1ZhbHVlcyA/PyBtYXBwaW5nLnRhcmdldC5taXNzaW5nVmFsdWVzXG4gICAgICBjb25zdCBtZXJnZWRGaWVsZCA9IHsgLi4uZmllbGQsIG1pc3NpbmdWYWx1ZXMgfVxuXG4gICAgICBjb25zdCBjb2x1bW4gPSB7IHNvdXJjZTogZmllbGRNYXBwaW5nLnNvdXJjZSwgdGFyZ2V0OiBtZXJnZWRGaWVsZCB9XG4gICAgICBleHByID0gbm9ybWFsaXplRmllbGQoY29sdW1uKVxuICAgIH1cblxuICAgIGV4cHJzW2ZpZWxkLm5hbWVdID0gZXhwclxuICB9XG5cbiAgcmV0dXJuIGV4cHJzXG59XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};