@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,522 @@
1
+ import * as pl from "nodejs-polars";
2
+ import { describe, expect, it } from "vitest";
3
+ import { inspectTable } from "../../table/index.js";
4
+ describe("validateGeojsonField", () => {
5
+ it("should not errors for valid GeoJSON Point", async () => {
6
+ const table = pl
7
+ .DataFrame({
8
+ location: [
9
+ '{"type":"Point","coordinates":[0,0]}',
10
+ '{"type":"Point","coordinates":[12.5,41.9]}',
11
+ '{"type":"Point","coordinates":[-73.9,40.7]}',
12
+ ],
13
+ })
14
+ .lazy();
15
+ const schema = {
16
+ fields: [
17
+ {
18
+ name: "location",
19
+ type: "geojson",
20
+ },
21
+ ],
22
+ };
23
+ const errors = await inspectTable(table, { schema });
24
+ expect(errors).toHaveLength(0);
25
+ });
26
+ it("should not errors for valid GeoJSON geometries", async () => {
27
+ const table = pl
28
+ .DataFrame({
29
+ geometry: [
30
+ '{"type":"LineString","coordinates":[[0,0],[1,1]]}',
31
+ '{"type":"Polygon","coordinates":[[[0,0],[1,0],[1,1],[0,1],[0,0]]]}',
32
+ '{"type":"MultiPoint","coordinates":[[0,0],[1,1]]}',
33
+ ],
34
+ })
35
+ .lazy();
36
+ const schema = {
37
+ fields: [
38
+ {
39
+ name: "geometry",
40
+ type: "geojson",
41
+ },
42
+ ],
43
+ };
44
+ const errors = await inspectTable(table, { schema });
45
+ expect(errors).toHaveLength(0);
46
+ });
47
+ it("should not errors for valid GeoJSON Feature", async () => {
48
+ const table = pl
49
+ .DataFrame({
50
+ feature: [
51
+ '{"type":"Feature","geometry":{"type":"Point","coordinates":[0,0]},"properties":{"name":"Test"}}',
52
+ '{"type":"Feature","geometry":{"type":"LineString","coordinates":[[0,0],[1,1]]},"properties":{"id":1}}',
53
+ '{"type":"Feature","geometry":null,"properties":{}}',
54
+ ],
55
+ })
56
+ .lazy();
57
+ const schema = {
58
+ fields: [
59
+ {
60
+ name: "feature",
61
+ type: "geojson",
62
+ },
63
+ ],
64
+ };
65
+ const errors = await inspectTable(table, { schema });
66
+ expect(errors).toHaveLength(0);
67
+ });
68
+ it("should not errors for valid GeoJSON FeatureCollection", async () => {
69
+ const table = pl
70
+ .DataFrame({
71
+ collection: [
72
+ '{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[0,0]},"properties":{}}]}',
73
+ '{"type":"FeatureCollection","features":[]}',
74
+ ],
75
+ })
76
+ .lazy();
77
+ const schema = {
78
+ fields: [
79
+ {
80
+ name: "collection",
81
+ type: "geojson",
82
+ },
83
+ ],
84
+ };
85
+ const errors = await inspectTable(table, { schema });
86
+ expect(errors).toHaveLength(0);
87
+ });
88
+ it("should not errors for null values", async () => {
89
+ const table = pl
90
+ .DataFrame({
91
+ location: [
92
+ '{"type":"Point","coordinates":[0,0]}',
93
+ null,
94
+ '{"type":"Feature","geometry":null,"properties":{}}',
95
+ ],
96
+ })
97
+ .lazy();
98
+ const schema = {
99
+ fields: [
100
+ {
101
+ name: "location",
102
+ type: "geojson",
103
+ },
104
+ ],
105
+ };
106
+ const errors = await inspectTable(table, { schema });
107
+ expect(errors).toHaveLength(0);
108
+ });
109
+ it("should errors for JSON arrays", async () => {
110
+ const table = pl
111
+ .DataFrame({
112
+ data: [
113
+ '{"type":"Point","coordinates":[0,0]}',
114
+ "[[0,0],[1,1]]",
115
+ '{"type":"Feature","geometry":null,"properties":{}}',
116
+ ],
117
+ })
118
+ .lazy();
119
+ const schema = {
120
+ fields: [
121
+ {
122
+ name: "data",
123
+ type: "geojson",
124
+ },
125
+ ],
126
+ };
127
+ const errors = await inspectTable(table, { schema });
128
+ expect(errors).toEqual([
129
+ {
130
+ type: "cell/type",
131
+ fieldName: "data",
132
+ fieldType: "geojson",
133
+ rowNumber: 2,
134
+ cell: "[[0,0],[1,1]]",
135
+ },
136
+ ]);
137
+ });
138
+ it("should errors for invalid JSON", async () => {
139
+ const table = pl
140
+ .DataFrame({
141
+ data: [
142
+ '{"type":"Point","coordinates":[0,0]}',
143
+ "invalid json",
144
+ "{broken}",
145
+ ],
146
+ })
147
+ .lazy();
148
+ const schema = {
149
+ fields: [
150
+ {
151
+ name: "data",
152
+ type: "geojson",
153
+ },
154
+ ],
155
+ };
156
+ const errors = await inspectTable(table, { schema });
157
+ expect(errors.filter(e => e.type === "cell/type")).toHaveLength(2);
158
+ expect(errors).toContainEqual({
159
+ type: "cell/type",
160
+ fieldName: "data",
161
+ fieldType: "geojson",
162
+ rowNumber: 2,
163
+ cell: "invalid json",
164
+ });
165
+ expect(errors).toContainEqual({
166
+ type: "cell/type",
167
+ fieldName: "data",
168
+ fieldType: "geojson",
169
+ rowNumber: 3,
170
+ cell: "{broken}",
171
+ });
172
+ });
173
+ it("should errors for empty strings", async () => {
174
+ const table = pl
175
+ .DataFrame({
176
+ data: [
177
+ '{"type":"Point","coordinates":[0,0]}',
178
+ "",
179
+ '{"type":"Feature","geometry":null,"properties":{}}',
180
+ ],
181
+ })
182
+ .lazy();
183
+ const schema = {
184
+ fields: [
185
+ {
186
+ name: "data",
187
+ type: "geojson",
188
+ },
189
+ ],
190
+ };
191
+ const errors = await inspectTable(table, { schema });
192
+ expect(errors).toEqual([
193
+ {
194
+ type: "cell/type",
195
+ fieldName: "data",
196
+ fieldType: "geojson",
197
+ rowNumber: 2,
198
+ cell: "",
199
+ },
200
+ ]);
201
+ });
202
+ it("should errors for JSON primitives", async () => {
203
+ const table = pl
204
+ .DataFrame({
205
+ data: ['"string"', "123", "true", "false", "null"],
206
+ })
207
+ .lazy();
208
+ const schema = {
209
+ fields: [
210
+ {
211
+ name: "data",
212
+ type: "geojson",
213
+ },
214
+ ],
215
+ };
216
+ const errors = await inspectTable(table, { schema });
217
+ expect(errors).toEqual([
218
+ {
219
+ type: "cell/type",
220
+ fieldName: "data",
221
+ fieldType: "geojson",
222
+ rowNumber: 1,
223
+ cell: '"string"',
224
+ },
225
+ {
226
+ type: "cell/type",
227
+ fieldName: "data",
228
+ fieldType: "geojson",
229
+ rowNumber: 2,
230
+ cell: "123",
231
+ },
232
+ {
233
+ type: "cell/type",
234
+ fieldName: "data",
235
+ fieldType: "geojson",
236
+ rowNumber: 3,
237
+ cell: "true",
238
+ },
239
+ {
240
+ type: "cell/type",
241
+ fieldName: "data",
242
+ fieldType: "geojson",
243
+ rowNumber: 4,
244
+ cell: "false",
245
+ },
246
+ {
247
+ type: "cell/type",
248
+ fieldName: "data",
249
+ fieldType: "geojson",
250
+ rowNumber: 5,
251
+ cell: "null",
252
+ },
253
+ ]);
254
+ });
255
+ it("should errors for invalid GeoJSON Point coordinates", async () => {
256
+ const table = pl
257
+ .DataFrame({
258
+ location: [
259
+ '{"type":"Point","coordinates":[0,0]}',
260
+ '{"type":"Point","coordinates":[0]}',
261
+ '{"type":"Point","coordinates":[0,0,0,0]}',
262
+ ],
263
+ })
264
+ .lazy();
265
+ const schema = {
266
+ fields: [
267
+ {
268
+ name: "location",
269
+ type: "geojson",
270
+ },
271
+ ],
272
+ };
273
+ const errors = await inspectTable(table, { schema });
274
+ expect(errors).toHaveLength(2);
275
+ expect(errors).toContainEqual({
276
+ type: "cell/type",
277
+ fieldName: "location",
278
+ fieldType: "geojson",
279
+ rowNumber: 2,
280
+ cell: '{"type":"Point","coordinates":[0]}',
281
+ });
282
+ expect(errors).toContainEqual({
283
+ type: "cell/type",
284
+ fieldName: "location",
285
+ fieldType: "geojson",
286
+ rowNumber: 3,
287
+ cell: '{"type":"Point","coordinates":[0,0,0,0]}',
288
+ });
289
+ });
290
+ it("should errors for invalid GeoJSON LineString", async () => {
291
+ const table = pl
292
+ .DataFrame({
293
+ line: [
294
+ '{"type":"LineString","coordinates":[[0,0],[1,1]]}',
295
+ '{"type":"LineString","coordinates":[[0,0]]}',
296
+ '{"type":"LineString","coordinates":[0,0]}',
297
+ ],
298
+ })
299
+ .lazy();
300
+ const schema = {
301
+ fields: [
302
+ {
303
+ name: "line",
304
+ type: "geojson",
305
+ },
306
+ ],
307
+ };
308
+ const errors = await inspectTable(table, { schema });
309
+ expect(errors).toHaveLength(2);
310
+ expect(errors).toContainEqual({
311
+ type: "cell/type",
312
+ fieldName: "line",
313
+ fieldType: "geojson",
314
+ rowNumber: 2,
315
+ cell: '{"type":"LineString","coordinates":[[0,0]]}',
316
+ });
317
+ expect(errors).toContainEqual({
318
+ type: "cell/type",
319
+ fieldName: "line",
320
+ fieldType: "geojson",
321
+ rowNumber: 3,
322
+ cell: '{"type":"LineString","coordinates":[0,0]}',
323
+ });
324
+ });
325
+ it("should errors for incomplete GeoJSON Feature", async () => {
326
+ const table = pl
327
+ .DataFrame({
328
+ feature: [
329
+ '{"type":"Feature","geometry":{"type":"Point","coordinates":[0,0]},"properties":{}}',
330
+ '{"type":"Feature","geometry":{"type":"Point","coordinates":[0,0]}}',
331
+ '{"type":"Feature","properties":{}}',
332
+ ],
333
+ })
334
+ .lazy();
335
+ const schema = {
336
+ fields: [
337
+ {
338
+ name: "feature",
339
+ type: "geojson",
340
+ },
341
+ ],
342
+ };
343
+ const errors = await inspectTable(table, { schema });
344
+ expect(errors).toHaveLength(2);
345
+ expect(errors).toContainEqual({
346
+ type: "cell/type",
347
+ fieldName: "feature",
348
+ fieldType: "geojson",
349
+ rowNumber: 2,
350
+ cell: '{"type":"Feature","geometry":{"type":"Point","coordinates":[0,0]}}',
351
+ });
352
+ expect(errors).toContainEqual({
353
+ type: "cell/type",
354
+ fieldName: "feature",
355
+ fieldType: "geojson",
356
+ rowNumber: 3,
357
+ cell: '{"type":"Feature","properties":{}}',
358
+ });
359
+ });
360
+ it("should errors for invalid GeoJSON FeatureCollection", async () => {
361
+ const table = pl
362
+ .DataFrame({
363
+ collection: [
364
+ '{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[0,0]},"properties":{}}]}',
365
+ '{"type":"FeatureCollection"}',
366
+ ],
367
+ })
368
+ .lazy();
369
+ const schema = {
370
+ fields: [
371
+ {
372
+ name: "collection",
373
+ type: "geojson",
374
+ },
375
+ ],
376
+ };
377
+ const errors = await inspectTable(table, { schema });
378
+ expect(errors).toEqual([
379
+ {
380
+ type: "cell/type",
381
+ fieldName: "collection",
382
+ fieldType: "geojson",
383
+ rowNumber: 2,
384
+ cell: '{"type":"FeatureCollection"}',
385
+ },
386
+ ]);
387
+ });
388
+ it("should not validate jsonSchema constraints for geojson fields", async () => {
389
+ const table = pl
390
+ .DataFrame({
391
+ location: [
392
+ '{"type":"Point","coordinates":[0,0]}',
393
+ '{"type":"Point","coordinates":[100,200]}',
394
+ ],
395
+ })
396
+ .lazy();
397
+ const schema = {
398
+ fields: [
399
+ {
400
+ name: "location",
401
+ type: "geojson",
402
+ constraints: {
403
+ jsonSchema: {
404
+ type: "object",
405
+ properties: {
406
+ coordinates: {
407
+ type: "array",
408
+ items: { type: "number", minimum: -50, maximum: 50 },
409
+ },
410
+ },
411
+ },
412
+ },
413
+ },
414
+ ],
415
+ };
416
+ const errors = await inspectTable(table, { schema });
417
+ expect(errors).toHaveLength(0);
418
+ });
419
+ it("should not errors for valid TopoJSON", async () => {
420
+ const table = pl
421
+ .DataFrame({
422
+ topology: [
423
+ '{"type":"Topology","objects":{"example":{"type":"GeometryCollection","geometries":[{"type":"Point","coordinates":[0,0]}]}},"arcs":[]}',
424
+ '{"type":"Topology","objects":{"collection":{"type":"GeometryCollection","geometries":[]}},"arcs":[]}',
425
+ ],
426
+ })
427
+ .lazy();
428
+ const schema = {
429
+ fields: [
430
+ {
431
+ name: "topology",
432
+ type: "geojson",
433
+ format: "topojson",
434
+ },
435
+ ],
436
+ };
437
+ const errors = await inspectTable(table, { schema });
438
+ expect(errors).toHaveLength(0);
439
+ });
440
+ it("should errors for invalid TopoJSON structure", async () => {
441
+ const table = pl
442
+ .DataFrame({
443
+ topology: [
444
+ '{"type":"Topology","objects":{"example":{"type":"GeometryCollection","geometries":[]}},"arcs":[]}',
445
+ '{"type":"Topology","objects":{}}',
446
+ '{"type":"Topology"}',
447
+ ],
448
+ })
449
+ .lazy();
450
+ const schema = {
451
+ fields: [
452
+ {
453
+ name: "topology",
454
+ type: "geojson",
455
+ format: "topojson",
456
+ },
457
+ ],
458
+ };
459
+ const errors = await inspectTable(table, { schema });
460
+ expect(errors).toHaveLength(2);
461
+ expect(errors).toContainEqual({
462
+ type: "cell/type",
463
+ fieldName: "topology",
464
+ fieldType: "geojson",
465
+ fieldFormat: "topojson",
466
+ rowNumber: 2,
467
+ cell: '{"type":"Topology","objects":{}}',
468
+ });
469
+ expect(errors).toContainEqual({
470
+ type: "cell/type",
471
+ fieldName: "topology",
472
+ fieldType: "geojson",
473
+ fieldFormat: "topojson",
474
+ rowNumber: 3,
475
+ cell: '{"type":"Topology"}',
476
+ });
477
+ });
478
+ it("should accept TopoJSON geometry objects", async () => {
479
+ const table = pl
480
+ .DataFrame({
481
+ geometry: [
482
+ '{"type":"Point","coordinates":[0,0]}',
483
+ '{"type":"LineString","arcs":[0,1]}',
484
+ '{"type":"Polygon","arcs":[[0,1,2]]}',
485
+ ],
486
+ })
487
+ .lazy();
488
+ const schema = {
489
+ fields: [
490
+ {
491
+ name: "geometry",
492
+ type: "geojson",
493
+ format: "topojson",
494
+ },
495
+ ],
496
+ };
497
+ const errors = await inspectTable(table, { schema });
498
+ expect(errors).toHaveLength(0);
499
+ });
500
+ it("should handle null values for topojson format", async () => {
501
+ const table = pl
502
+ .DataFrame({
503
+ topology: [
504
+ '{"type":"Topology","objects":{"example":{"type":"GeometryCollection","geometries":[]}},"arcs":[]}',
505
+ null,
506
+ ],
507
+ })
508
+ .lazy();
509
+ const schema = {
510
+ fields: [
511
+ {
512
+ name: "topology",
513
+ type: "geojson",
514
+ format: "topojson",
515
+ },
516
+ ],
517
+ };
518
+ const errors = await inspectTable(table, { schema });
519
+ expect(errors).toHaveLength(0);
520
+ });
521
+ });
522
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvanNvbi5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZmllbGQvdHlwZXMvZ2VvanNvbi5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFFbkQsUUFBUSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRTtJQUNwQyxFQUFFLENBQUMsMkNBQTJDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDekQsTUFBTSxLQUFLLEdBQUcsRUFBRTthQUNiLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRTtnQkFDUixzQ0FBc0M7Z0JBQ3RDLDRDQUE0QztnQkFDNUMsNkNBQTZDO2FBQzlDO1NBQ0YsQ0FBQzthQUNELElBQUksRUFBRSxDQUFBO1FBRVQsTUFBTSxNQUFNLEdBQVc7WUFDckIsTUFBTSxFQUFFO2dCQUNOO29CQUNFLElBQUksRUFBRSxVQUFVO29CQUNoQixJQUFJLEVBQUUsU0FBUztpQkFDaEI7YUFDRjtTQUNGLENBQUE7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFlBQVksQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFBO1FBQ3BELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDaEMsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsZ0RBQWdELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDOUQsTUFBTSxLQUFLLEdBQUcsRUFBRTthQUNiLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRTtnQkFDUixtREFBbUQ7Z0JBQ25ELG9FQUFvRTtnQkFDcEUsbURBQW1EO2FBQ3BEO1NBQ0YsQ0FBQzthQUNELElBQUks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QyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFBO1FBQ3BELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDaEMsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU2NoZW1hIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0ICogYXMgcGwgZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IGluc3BlY3RUYWJsZSB9IGZyb20gXCIuLi8uLi90YWJsZS9pbmRleC50c1wiXG5cbmRlc2NyaWJlKFwidmFsaWRhdGVHZW9qc29uRmllbGRcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCBub3QgZXJyb3JzIGZvciB2YWxpZCBHZW9KU09OIFBvaW50XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgbG9jYXRpb246IFtcbiAgICAgICAgICAne1widHlwZVwiOlwiUG9pbnRcIixcImNvb3JkaW5hdGVzXCI6WzAsMF19JyxcbiAgICAgICAgICAne1widHlwZVwiOlwiUG9pbnRcIixcImNvb3JkaW5hdGVzXCI6WzEyLjUsNDEuOV19JyxcbiAgICAgICAgICAne1widHlwZVwiOlwiUG9pbnRcIixcImNvb3JkaW5hdGVzXCI6Wy03My45LDQwLjddfScsXG4gICAgICAgIF0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwibG9jYXRpb25cIixcbiAgICAgICAgICB0eXBlOiBcImdlb2pzb25cIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgaW5zcGVjdFRhYmxlKHRhYmxlLCB7IHNjaGVtYSB9KVxuICAgIGV4cGVjdChlcnJvcnMpLnRvSGF2ZUxlbmd0aCgwKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIG5vdCBlcnJvcnMgZm9yIHZhbGlkIEdlb0pTT04gZ2VvbWV0cmllc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIGdlb21ldHJ5OiBbXG4gICAgICAgICAgJ3tcInR5cGVcIjpcIkxpbmVTdHJpbmdcIixcImNvb3JkaW5hdGVzXCI6W1swLDBdLFsxLDFdXX0nLFxuICAgICAgICAgICd7XCJ0eXBlXCI6XCJQb2x5Z29uXCIsXCJjb29yZGluYXRlc1wiOltbWzAsMF0sWzEsMF0sWzEsMV0sWzAsMV0sWzAsMF1dXX0nLFxuICAgICAgICAgICd7XCJ0eXBlXCI6XCJNdWx0aVBvaW50XCIsXCJjb29yZGluYXRlc1wiOltbMCwwXSxbMSwxXV19JyxcbiAgICAgICAgXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJnZW9tZXRyeVwiLFxuICAgICAgICAgIHR5cGU6IFwiZ2VvanNvblwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgZXhwZWN0KGVycm9ycykudG9IYXZlTGVuZ3RoKDApXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgbm90IGVycm9ycyBmb3IgdmFsaWQgR2VvSlNPTiBGZWF0dXJlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgZmVhdHVyZTogW1xuICAgICAgICAgICd7XCJ0eXBlXCI6XCJGZWF0dXJlXCIsXCJnZW9tZXRyeVwiOntcInR5cGVcIjpcIlBvaW50XCIsXCJjb29yZGluYXRlc1wiOlswLDBdfSxcInByb3BlcnRpZXNcIjp7XCJuYW1lXCI6XCJUZXN0XCJ9fScsXG4gICAgICAgICAgJ3tcInR5cGVcIjpcIkZlYXR1cmVcIixcImdlb21ldHJ5XCI6e1widHlwZVwiOlwiTGluZVN0cmluZ1wiLFwiY29vcmRpbmF0ZXNcIjpbWzAsMF0sWzEsMV1dfSxcInByb3BlcnRpZXNcIjp7XCJpZFwiOjF9fScsXG4gICAgICAgICAgJ3tcInR5cGVcIjpcIkZlYXR1cmVcIixcImdlb21ldHJ5XCI6bnVsbCxcInByb3BlcnRpZXNcIjp7fX0nLFxuICAgICAgICBdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImZlYXR1cmVcIixcbiAgICAgICAgICB0eXBlOiBcImdlb2pzb25cIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgaW5zcGVjdFRhYmxlKHRhYmxlLCB7IHNjaGVtYSB9KVxuICAgIGV4cGVjdChlcnJvcnMpLnRvSGF2ZUxlbmd0aCgwKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIG5vdCBlcnJvcnMgZm9yIHZhbGlkIEdlb0pTT04gRmVhdHVyZUNvbGxlY3Rpb25cIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBjb2xsZWN0aW9uOiBbXG4gICAgICAgICAgJ3tcInR5cGVcIjpcIkZlYXR1cmVDb2xsZWN0aW9uXCIsXCJmZWF0dXJlc1wiOlt7XCJ0eXBlXCI6XCJGZWF0dXJlXCIsXCJnZW9tZXRyeVwiOntcInR5cGVcIjpcIlBvaW50XCIsXCJjb29yZGluYXRlc1wiOlswLDBdfSxcInByb3BlcnRpZXNcIjp7fX1dfScsXG4gICAgICAgICAgJ3tcInR5cGVcIjpcIkZlYXR1cmVDb2xsZWN0aW9uXCIsXCJmZWF0dXJlc1wiOltdfScsXG4gICAgICAgIF0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiY29sbGVjdGlvblwiLFxuICAgICAgICAgIHR5cGU6IFwiZ2VvanNvblwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgZXhwZWN0KGVycm9ycykudG9IYXZlTGVuZ3RoKDApXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgbm90IGVycm9ycyBmb3IgbnVsbCB2YWx1ZXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBsb2NhdGlvbjogW1xuICAgICAgICAgICd7XCJ0eXBlXCI6XCJQb2ludFwiLFwiY29vcmRpbmF0ZXNcIjpbMCwwXX0nLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgJ3tcInR5cGVcIjpcIkZlYXR1cmVcIixcImdlb21ldHJ5XCI6bnVsbCxcInByb3BlcnRpZXNcIjp7fX0nLFxuICAgICAgICBdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImxvY2F0aW9uXCIsXG4gICAgICAgICAgdHlwZTogXCJnZW9qc29uXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICBleHBlY3QoZXJyb3JzKS50b0hhdmVMZW5ndGgoMClcbiAgfSlcblxuICBpdChcInNob3VsZCBlcnJvcnMgZm9yIEpTT04gYXJyYXlzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgZGF0YTogW1xuICAgICAgICAgICd7XCJ0eXBlXCI6XCJQb2ludFwiLFwiY29vcmRpbmF0ZXNcIjpbMCwwXX0nLFxuICAgICAgICAgIFwiW1swLDBdLFsxLDFdXVwiLFxuICAgICAgICAgICd7XCJ0eXBlXCI6XCJGZWF0dXJlXCIsXCJnZW9tZXRyeVwiOm51bGwsXCJwcm9wZXJ0aWVzXCI6e319JyxcbiAgICAgICAgXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJkYXRhXCIsXG4gICAgICAgICAgdHlwZTogXCJnZW9qc29uXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICBleHBlY3QoZXJyb3JzKS50b0VxdWFsKFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJjZWxsL3R5cGVcIixcbiAgICAgICAgZmllbGROYW1lOiBcImRhdGFcIixcbiAgICAgICAgZmllbGRUeXBlOiBcImdlb2pzb25cIixcbiAgICAgICAgcm93TnVtYmVyOiAyLFxuICAgICAgICBjZWxsOiBcIltbMCwwXSxbMSwxXV1cIixcbiAgICAgIH0sXG4gICAgXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBlcnJvcnMgZm9yIGludmFsaWQgSlNPTlwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIGRhdGE6IFtcbiAgICAgICAgICAne1widHlwZVwiOlwiUG9pbnRcIixcImNvb3JkaW5hdGVzXCI6WzAsMF19JyxcbiAgICAgICAgICBcImludmFsaWQganNvblwiLFxuICAgICAgICAgIFwie2Jyb2tlbn1cIixcbiAgICAgICAgXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJkYXRhXCIsXG4gICAgICAgICAgdHlwZTogXCJnZW9qc29uXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICBleHBlY3QoZXJyb3JzLmZpbHRlcihlID0+IGUudHlwZSA9PT0gXCJjZWxsL3R5cGVcIikpLnRvSGF2ZUxlbmd0aCgyKVxuICAgIGV4cGVjdChlcnJvcnMpLnRvQ29udGFpbkVxdWFsKHtcbiAgICAgIHR5cGU6IFwiY2VsbC90eXBlXCIsXG4gICAgICBmaWVsZE5hbWU6IFwiZGF0YVwiLFxuICAgICAgZmllbGRUeXBlOiBcImdlb2pzb25cIixcbiAgICAgIHJvd051bWJlcjogMixcbiAgICAgIGNlbGw6IFwiaW52YWxpZCBqc29uXCIsXG4gICAgfSlcbiAgICBleHBlY3QoZXJyb3JzKS50b0NvbnRhaW5FcXVhbCh7XG4gICAgICB0eXBlOiBcImNlbGwvdHlwZVwiLFxuICAgICAgZmllbGROYW1lOiBcImRhdGFcIixcbiAgICAgIGZpZWxkVHlwZTogXCJnZW9qc29uXCIsXG4gICAgICByb3dOdW1iZXI6IDMsXG4gICAgICBjZWxsOiBcInticm9rZW59XCIsXG4gICAgfSlcbiAgfSlcblxuICBpdChcInNob3VsZCBlcnJvcnMgZm9yIGVtcHR5IHN0cmluZ3NcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBkYXRhOiBbXG4gICAgICAgICAgJ3tcInR5cGVcIjpcIlBvaW50XCIsXCJjb29yZGluYXRlc1wiOlswLDBdfScsXG4gICAgICAgICAgXCJcIixcbiAgICAgICAgICAne1widHlwZVwiOlwiRmVhdHVyZVwiLFwiZ2VvbWV0cnlcIjpudWxsLFwicHJvcGVydGllc1wiOnt9fScsXG4gICAgICAgIF0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiZGF0YVwiLFxuICAgICAgICAgIHR5cGU6IFwiZ2VvanNvblwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgZXhwZWN0KGVycm9ycykudG9FcXVhbChbXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiY2VsbC90eXBlXCIsXG4gICAgICAgIGZpZWxkTmFtZTogXCJkYXRhXCIsXG4gICAgICAgIGZpZWxkVHlwZTogXCJnZW9qc29uXCIsXG4gICAgICAgIHJvd051bWJlcjogMixcbiAgICAgICAgY2VsbDogXCJcIixcbiAgICAgIH0sXG4gICAgXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBlcnJvcnMgZm9yIEpTT04gcHJpbWl0aXZlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIGRhdGE6IFsnXCJzdHJpbmdcIicsIFwiMTIzXCIsIFwidHJ1ZVwiLCBcImZhbHNlXCIsIFwibnVsbFwiXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJkYXRhXCIsXG4gICAgICAgICAgdHlwZTogXCJnZW9qc29uXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICBleHBlY3QoZXJyb3JzKS50b0VxdWFsKFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJjZWxsL3R5cGVcIixcbiAgICAgICAgZmllbGROYW1lOiBcImRhdGFcIixcbiAgICAgICAgZmllbGRUeXBlOiBcImdlb2pzb25cIixcbiAgICAgICAgcm93TnVtYmVyOiAxLFxuICAgICAgICBjZWxsOiAnXCJzdHJpbmdcIicsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0eXBlOiBcImNlbGwvdHlwZVwiLFxuICAgICAgICBmaWVsZE5hbWU6IFwiZGF0YVwiLFxuICAgICAgICBmaWVsZFR5cGU6IFwiZ2VvanNvblwiLFxuICAgICAgICByb3dOdW1iZXI6IDIsXG4gICAgICAgIGNlbGw6IFwiMTIzXCIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0eXBlOiBcImNlbGwvdHlwZVwiLFxuICAgICAgICBmaWVsZE5hbWU6IFwiZGF0YVwiLFxuICAgICAgICBmaWVsZFR5cGU6IFwiZ2VvanNvblwiLFxuICAgICAgICByb3dOdW1iZXI6IDMsXG4gICAgICAgIGNlbGw6IFwidHJ1ZVwiLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJjZWxsL3R5cGVcIixcbiAgICAgICAgZmllbGROYW1lOiBcImRhdGFcIixcbiAgICAgICAgZmllbGRUeXBlOiBcImdlb2pzb25cIixcbiAgICAgICAgcm93TnVtYmVyOiA0LFxuICAgICAgICBjZWxsOiBcImZhbHNlXCIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0eXBlOiBcImNlbGwvdHlwZVwiLFxuICAgICAgICBmaWVsZE5hbWU6IFwiZGF0YVwiLFxuICAgICAgICBmaWVsZFR5cGU6IFwiZ2VvanNvblwiLFxuICAgICAgICByb3dOdW1iZXI6IDUsXG4gICAgICAgIGNlbGw6IFwibnVsbFwiLFxuICAgICAgfSxcbiAgICBdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGVycm9ycyBmb3IgaW52YWxpZCBHZW9KU09OIFBvaW50IGNvb3JkaW5hdGVzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgbG9jYXRpb246IFtcbiAgICAgICAgICAne1widHlwZVwiOlwiUG9pbnRcIixcImNvb3JkaW5hdGVzXCI6WzAsMF19JyxcbiAgICAgICAgICAne1widHlwZVwiOlwiUG9pbnRcIixcImNvb3JkaW5hdGVzXCI6WzBdfScsXG4gICAgICAgICAgJ3tcInR5cGVcIjpcIlBvaW50XCIsXCJjb29yZGluYXRlc1wiOlswLDAsMCwwXX0nLFxuICAgICAgICBdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImxvY2F0aW9uXCIsXG4gICAgICAgICAgdHlwZTogXCJnZW9qc29uXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICBleHBlY3QoZXJyb3JzKS50b0hhdmVMZW5ndGgoMilcbiAgICBleHBlY3QoZXJyb3JzKS50b0NvbnRhaW5FcXVhbCh7XG4gICAgICB0eXBlOiBcImNlbGwvdHlwZVwiLFxuICAgICAgZmllbGROYW1lOiBcImxvY2F0aW9uXCIsXG4gICAgICBmaWVsZFR5cGU6IFwiZ2VvanNvblwiLFxuICAgICAgcm93TnVtYmVyOiAyLFxuICAgICAgY2VsbDogJ3tcInR5cGVcIjpcIlBvaW50XCIsXCJjb29yZGluYXRlc1wiOlswXX0nLFxuICAgIH0pXG4gICAgZXhwZWN0KGVycm9ycykudG9Db250YWluRXF1YWwoe1xuICAgICAgdHlwZTogXCJjZWxsL3R5cGVcIixcbiAgICAgIGZpZWxkTmFtZTogXCJsb2NhdGlvblwiLFxuICAgICAgZmllbGRUeXBlOiBcImdlb2pzb25cIixcbiAgICAgIHJvd051bWJlcjogMyxcbiAgICAgIGNlbGw6ICd7XCJ0eXBlXCI6XCJQb2ludFwiLFwiY29vcmRpbmF0ZXNcIjpbMCwwLDAsMF19JyxcbiAgICB9KVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGVycm9ycyBmb3IgaW52YWxpZCBHZW9KU09OIExpbmVTdHJpbmdcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBsaW5lOiBbXG4gICAgICAgICAgJ3tcInR5cGVcIjpcIkxpbmVTdHJpbmdcIixcImNvb3JkaW5hdGVzXCI6W1swLDBdLFsxLDFdXX0nLFxuICAgICAgICAgICd7XCJ0eXBlXCI6XCJMaW5lU3RyaW5nXCIsXCJjb29yZGluYXRlc1wiOltbMCwwXV19JyxcbiAgICAgICAgICAne1widHlwZVwiOlwiTGluZVN0cmluZ1wiLFwiY29vcmRpbmF0ZXNcIjpbMCwwXX0nLFxuICAgICAgICBdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImxpbmVcIixcbiAgICAgICAgICB0eXBlOiBcImdlb2pzb25cIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgaW5zcGVjdFRhYmxlKHRhYmxlLCB7IHNjaGVtYSB9KVxuICAgIGV4cGVjdChlcnJvcnMpLnRvSGF2ZUxlbmd0aCgyKVxuICAgIGV4cGVjdChlcnJvcnMpLnRvQ29udGFpbkVxdWFsKHtcbiAgICAgIHR5cGU6IFwiY2VsbC90eXBlXCIsXG4gICAgICBmaWVsZE5hbWU6IFwibGluZVwiLFxuICAgICAgZmllbGRUeXBlOiBcImdlb2pzb25cIixcbiAgICAgIHJvd051bWJlcjogMixcbiAgICAgIGNlbGw6ICd7XCJ0eXBlXCI6XCJMaW5lU3RyaW5nXCIsXCJjb29yZGluYXRlc1wiOltbMCwwXV19JyxcbiAgICB9KVxuICAgIGV4cGVjdChlcnJvcnMpLnRvQ29udGFpbkVxdWFsKHtcbiAgICAgIHR5cGU6IFwiY2VsbC90eXBlXCIsXG4gICAgICBmaWVsZE5hbWU6IFwibGluZVwiLFxuICAgICAgZmllbGRUeXBlOiBcImdlb2pzb25cIixcbiAgICAgIHJvd051bWJlcjogMyxcbiAgICAgIGNlbGw6ICd7XCJ0eXBlXCI6XCJMaW5lU3RyaW5nXCIsXCJjb29yZGluYXRlc1wiOlswLDBdfScsXG4gICAgfSlcbiAgfSlcblxuICBpdChcInNob3VsZCBlcnJvcnMgZm9yIGluY29tcGxldGUgR2VvSlNPTiBGZWF0dXJlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgZmVhdHVyZTogW1xuICAgICAgICAgICd7XCJ0eXBlXCI6XCJGZWF0dXJlXCIsXCJnZW9tZXRyeVwiOntcInR5cGVcIjpcIlBvaW50XCIsXCJjb29yZGluYXRlc1wiOlswLDBdfSxcInByb3BlcnRpZXNcIjp7fX0nLFxuICAgICAgICAgICd7XCJ0eXBlXCI6XCJGZWF0dXJlXCIsXCJnZW9tZXRyeVwiOntcInR5cGVcIjpcIlBvaW50XCIsXCJjb29yZGluYXRlc1wiOlswLDBdfX0nLFxuICAgICAgICAgICd7XCJ0eXBlXCI6XCJGZWF0dXJlXCIsXCJwcm9wZXJ0aWVzXCI6e319JyxcbiAgICAgICAgXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJmZWF0dXJlXCIsXG4gICAgICAgICAgdHlwZTogXCJnZW9qc29uXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICBleHBlY3QoZXJyb3JzKS50b0hhdmVMZW5ndGgoMilcbiAgICBleHBlY3QoZXJyb3JzKS50b0NvbnRhaW5FcXVhbCh7XG4gICAgICB0eXBlOiBcImNlbGwvdHlwZVwiLFxuICAgICAgZmllbGROYW1lOiBcImZlYXR1cmVcIixcbiAgICAgIGZpZWxkVHlwZTogXCJnZW9qc29uXCIsXG4gICAgICByb3dOdW1iZXI6IDIsXG4gICAgICBjZWxsOiAne1widHlwZVwiOlwiRmVhdHVyZVwiLFwiZ2VvbWV0cnlcIjp7XCJ0eXBlXCI6XCJQb2ludFwiLFwiY29vcmRpbmF0ZXNcIjpbMCwwXX19JyxcbiAgICB9KVxuICAgIGV4cGVjdChlcnJvcnMpLnRvQ29udGFpbkVxdWFsKHtcbiAgICAgIHR5cGU6IFwiY2VsbC90eXBlXCIsXG4gICAgICBmaWVsZE5hbWU6IFwiZmVhdHVyZVwiLFxuICAgICAgZmllbGRUeXBlOiBcImdlb2pzb25cIixcbiAgICAgIHJvd051bWJlcjogMyxcbiAgICAgIGNlbGw6ICd7XCJ0eXBlXCI6XCJGZWF0dXJlXCIsXCJwcm9wZXJ0aWVzXCI6e319JyxcbiAgICB9KVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGVycm9ycyBmb3IgaW52YWxpZCBHZW9KU09OIEZlYXR1cmVDb2xsZWN0aW9uXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgY29sbGVjdGlvbjogW1xuICAgICAgICAgICd7XCJ0eXBlXCI6XCJGZWF0dXJlQ29sbGVjdGlvblwiLFwiZmVhdHVyZXNcIjpbe1widHlwZVwiOlwiRmVhdHVyZVwiLFwiZ2VvbWV0cnlcIjp7XCJ0eXBlXCI6XCJQb2ludFwiLFwiY29vcmRpbmF0ZXNcIjpbMCwwXX0sXCJwcm9wZXJ0aWVzXCI6e319XX0nLFxuICAgICAgICAgICd7XCJ0eXBlXCI6XCJGZWF0dXJlQ29sbGVjdGlvblwifScsXG4gICAgICAgIF0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiY29sbGVjdGlvblwiLFxuICAgICAgICAgIHR5cGU6IFwiZ2VvanNvblwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgZXhwZWN0KGVycm9ycykudG9FcXVhbChbXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiY2VsbC90eXBlXCIsXG4gICAgICAgIGZpZWxkTmFtZTogXCJjb2xsZWN0aW9uXCIsXG4gICAgICAgIGZpZWxkVHlwZTogXCJnZW9qc29uXCIsXG4gICAgICAgIHJvd051bWJlcjogMixcbiAgICAgICAgY2VsbDogJ3tcInR5cGVcIjpcIkZlYXR1cmVDb2xsZWN0aW9uXCJ9JyxcbiAgICAgIH0sXG4gICAgXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBub3QgdmFsaWRhdGUganNvblNjaGVtYSBjb25zdHJhaW50cyBmb3IgZ2VvanNvbiBmaWVsZHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBsb2NhdGlvbjogW1xuICAgICAgICAgICd7XCJ0eXBlXCI6XCJQb2ludFwiLFwiY29vcmRpbmF0ZXNcIjpbMCwwXX0nLFxuICAgICAgICAgICd7XCJ0eXBlXCI6XCJQb2ludFwiLFwiY29vcmRpbmF0ZXNcIjpbMTAwLDIwMF19JyxcbiAgICAgICAgXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJsb2NhdGlvblwiLFxuICAgICAgICAgIHR5cGU6IFwiZ2VvanNvblwiLFxuICAgICAgICAgIGNvbnN0cmFpbnRzOiB7XG4gICAgICAgICAgICBqc29uU2NoZW1hOiB7XG4gICAgICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICBjb29yZGluYXRlczoge1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgICAgICAgaXRlbXM6IHsgdHlwZTogXCJudW1iZXJcIiwgbWluaW11bTogLTUwLCBtYXhpbXVtOiA1MCB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICBleHBlY3QoZXJyb3JzKS50b0hhdmVMZW5ndGgoMClcbiAgfSlcblxuICBpdChcInNob3VsZCBub3QgZXJyb3JzIGZvciB2YWxpZCBUb3BvSlNPTlwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIHRvcG9sb2d5OiBbXG4gICAgICAgICAgJ3tcInR5cGVcIjpcIlRvcG9sb2d5XCIsXCJvYmplY3RzXCI6e1wiZXhhbXBsZVwiOntcInR5cGVcIjpcIkdlb21ldHJ5Q29sbGVjdGlvblwiLFwiZ2VvbWV0cmllc1wiOlt7XCJ0eXBlXCI6XCJQb2ludFwiLFwiY29vcmRpbmF0ZXNcIjpbMCwwXX1dfX0sXCJhcmNzXCI6W119JyxcbiAgICAgICAgICAne1widHlwZVwiOlwiVG9wb2xvZ3lcIixcIm9iamVjdHNcIjp7XCJjb2xsZWN0aW9uXCI6e1widHlwZVwiOlwiR2VvbWV0cnlDb2xsZWN0aW9uXCIsXCJnZW9tZXRyaWVzXCI6W119fSxcImFyY3NcIjpbXX0nLFxuICAgICAgICBdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInRvcG9sb2d5XCIsXG4gICAgICAgICAgdHlwZTogXCJnZW9qc29uXCIsXG4gICAgICAgICAgZm9ybWF0OiBcInRvcG9qc29uXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICBleHBlY3QoZXJyb3JzKS50b0hhdmVMZW5ndGgoMClcbiAgfSlcblxuICBpdChcInNob3VsZCBlcnJvcnMgZm9yIGludmFsaWQgVG9wb0pTT04gc3RydWN0dXJlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgdG9wb2xvZ3k6IFtcbiAgICAgICAgICAne1widHlwZVwiOlwiVG9wb2xvZ3lcIixcIm9iamVjdHNcIjp7XCJleGFtcGxlXCI6e1widHlwZVwiOlwiR2VvbWV0cnlDb2xsZWN0aW9uXCIsXCJnZW9tZXRyaWVzXCI6W119fSxcImFyY3NcIjpbXX0nLFxuICAgICAgICAgICd7XCJ0eXBlXCI6XCJUb3BvbG9neVwiLFwib2JqZWN0c1wiOnt9fScsXG4gICAgICAgICAgJ3tcInR5cGVcIjpcIlRvcG9sb2d5XCJ9JyxcbiAgICAgICAgXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJ0b3BvbG9neVwiLFxuICAgICAgICAgIHR5cGU6IFwiZ2VvanNvblwiLFxuICAgICAgICAgIGZvcm1hdDogXCJ0b3BvanNvblwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0VGFibGUodGFibGUsIHsgc2NoZW1hIH0pXG4gICAgZXhwZWN0KGVycm9ycykudG9IYXZlTGVuZ3RoKDIpXG4gICAgZXhwZWN0KGVycm9ycykudG9Db250YWluRXF1YWwoe1xuICAgICAgdHlwZTogXCJjZWxsL3R5cGVcIixcbiAgICAgIGZpZWxkTmFtZTogXCJ0b3BvbG9neVwiLFxuICAgICAgZmllbGRUeXBlOiBcImdlb2pzb25cIixcbiAgICAgIGZpZWxkRm9ybWF0OiBcInRvcG9qc29uXCIsXG4gICAgICByb3dOdW1iZXI6IDIsXG4gICAgICBjZWxsOiAne1widHlwZVwiOlwiVG9wb2xvZ3lcIixcIm9iamVjdHNcIjp7fX0nLFxuICAgIH0pXG4gICAgZXhwZWN0KGVycm9ycykudG9Db250YWluRXF1YWwoe1xuICAgICAgdHlwZTogXCJjZWxsL3R5cGVcIixcbiAgICAgIGZpZWxkTmFtZTogXCJ0b3BvbG9neVwiLFxuICAgICAgZmllbGRUeXBlOiBcImdlb2pzb25cIixcbiAgICAgIGZpZWxkRm9ybWF0OiBcInRvcG9qc29uXCIsXG4gICAgICByb3dOdW1iZXI6IDMsXG4gICAgICBjZWxsOiAne1widHlwZVwiOlwiVG9wb2xvZ3lcIn0nLFxuICAgIH0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgYWNjZXB0IFRvcG9KU09OIGdlb21ldHJ5IG9iamVjdHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBnZW9tZXRyeTogW1xuICAgICAgICAgICd7XCJ0eXBlXCI6XCJQb2ludFwiLFwiY29vcmRpbmF0ZXNcIjpbMCwwXX0nLFxuICAgICAgICAgICd7XCJ0eXBlXCI6XCJMaW5lU3RyaW5nXCIsXCJhcmNzXCI6WzAsMV19JyxcbiAgICAgICAgICAne1widHlwZVwiOlwiUG9seWdvblwiLFwiYXJjc1wiOltbMCwxLDJdXX0nLFxuICAgICAgICBdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImdlb21ldHJ5XCIsXG4gICAgICAgICAgdHlwZTogXCJnZW9qc29uXCIsXG4gICAgICAgICAgZm9ybWF0OiBcInRvcG9qc29uXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICBleHBlY3QoZXJyb3JzKS50b0hhdmVMZW5ndGgoMClcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgbnVsbCB2YWx1ZXMgZm9yIHRvcG9qc29uIGZvcm1hdFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIHRvcG9sb2d5OiBbXG4gICAgICAgICAgJ3tcInR5cGVcIjpcIlRvcG9sb2d5XCIsXCJvYmplY3RzXCI6e1wiZXhhbXBsZVwiOntcInR5cGVcIjpcIkdlb21ldHJ5Q29sbGVjdGlvblwiLFwiZ2VvbWV0cmllc1wiOltdfX0sXCJhcmNzXCI6W119JyxcbiAgICAgICAgICBudWxsLFxuICAgICAgICBdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInRvcG9sb2d5XCIsXG4gICAgICAgICAgdHlwZTogXCJnZW9qc29uXCIsXG4gICAgICAgICAgZm9ybWF0OiBcInRvcG9qc29uXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IGluc3BlY3RUYWJsZSh0YWJsZSwgeyBzY2hlbWEgfSlcbiAgICBleHBlY3QoZXJyb3JzKS50b0hhdmVMZW5ndGgoMClcbiAgfSlcbn0pXG4iXX0=
@@ -0,0 +1,4 @@
1
+ import type { GeopointField } from "@frictionless-ts/metadata";
2
+ import * as pl from "nodejs-polars";
3
+ export declare function parseGeopointField(field: GeopointField, fieldExpr: pl.Expr): pl.Expr;
4
+ export declare function stringifyGeopointField(field: GeopointField, fieldExpr: pl.Expr): pl.Expr;
@@ -0,0 +1,59 @@
1
+ import * as pl from "nodejs-polars";
2
+ // TODO:
3
+ // Add more validation:
4
+ // - Check the length of the list is 2 (no list.lenghts in polars currently)
5
+ // - Check the values are within -180..180 and -90..90
6
+ // - Return null instead of list if any of the values are out of range
7
+ export function parseGeopointField(field, fieldExpr) {
8
+ // Default format is "lon,lat" string
9
+ const format = field.format ?? "default";
10
+ if (format === "default") {
11
+ fieldExpr = fieldExpr.str.split(",").cast(pl.List(pl.Float64));
12
+ }
13
+ if (format === "array") {
14
+ fieldExpr = fieldExpr.str
15
+ .replaceAll("[\\[\\]\\s]", "")
16
+ .str.split(",")
17
+ .cast(pl.List(pl.Float64));
18
+ }
19
+ if (format === "object") {
20
+ fieldExpr = pl
21
+ .concatList([
22
+ fieldExpr.str.jsonPathMatch("$.lon").cast(pl.Float64),
23
+ fieldExpr.str.jsonPathMatch("$.lat").cast(pl.Float64),
24
+ ])
25
+ .alias(field.name);
26
+ }
27
+ return fieldExpr;
28
+ }
29
+ export function stringifyGeopointField(field, fieldExpr) {
30
+ // Default format is "lon,lat" string
31
+ const format = field.format ?? "default";
32
+ if (format === "default") {
33
+ return fieldExpr.cast(pl.List(pl.String)).lst.join(",");
34
+ }
35
+ if (format === "array") {
36
+ return pl
37
+ .concatString([
38
+ pl.lit("["),
39
+ fieldExpr.lst.get(0).cast(pl.String),
40
+ pl.lit(","),
41
+ fieldExpr.lst.get(1).cast(pl.String),
42
+ pl.lit("]"),
43
+ ], "")
44
+ .alias(field.name);
45
+ }
46
+ if (format === "object") {
47
+ return pl
48
+ .concatString([
49
+ pl.lit('{"lon":'),
50
+ fieldExpr.lst.get(0).cast(pl.String),
51
+ pl.lit(',"lat":'),
52
+ fieldExpr.lst.get(1).cast(pl.String),
53
+ pl.lit("}"),
54
+ ], "")
55
+ .alias(field.name);
56
+ }
57
+ return fieldExpr;
58
+ }
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvcG9pbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9maWVsZC90eXBlcy9nZW9wb2ludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUVuQyxRQUFRO0FBQ1IsdUJBQXVCO0FBQ3ZCLDRFQUE0RTtBQUM1RSxzREFBc0Q7QUFDdEQsc0VBQXNFO0FBRXRFLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxLQUFvQixFQUFFLFNBQWtCO0lBQ3pFLHFDQUFxQztJQUNyQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQTtJQUV4QyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN6QixTQUFTLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7SUFDaEUsQ0FBQztJQUVELElBQUksTUFBTSxLQUFLLE9BQU8sRUFBRSxDQUFDO1FBQ3ZCLFNBQVMsR0FBRyxTQUFTLENBQUMsR0FBRzthQUN0QixVQUFVLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQzthQUM3QixHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQzthQUNkLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO0lBQzlCLENBQUM7SUFFRCxJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN4QixTQUFTLEdBQUcsRUFBRTthQUNYLFVBQVUsQ0FBQztZQUNWLFNBQVMsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ3JELFNBQVMsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDO1NBQ3RELENBQUM7YUFDRCxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3RCLENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQTtBQUNsQixDQUFDO0FBRUQsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxLQUFvQixFQUNwQixTQUFrQjtJQUVsQixxQ0FBcUM7SUFDckMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUE7SUFFeEMsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDekIsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUN6RCxDQUFDO0lBRUQsSUFBSSxNQUFNLEtBQUssT0FBTyxFQUFFLENBQUM7UUFDdkIsT0FBTyxFQUFFO2FBQ04sWUFBWSxDQUNYO1lBQ0UsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFDWCxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNwQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUNYLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ3BDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1NBQ1osRUFDRCxFQUFFLENBQ0g7YUFDQSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBWSxDQUFBO0lBQ2pDLENBQUM7SUFFRCxJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN4QixPQUFPLEVBQUU7YUFDTixZQUFZLENBQ1g7WUFDRSxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztZQUNqQixTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNwQyxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztZQUNqQixTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNwQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztTQUNaLEVBQ0QsRUFBRSxDQUNIO2FBQ0EsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQVksQ0FBQTtJQUNqQyxDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgR2VvcG9pbnRGaWVsZCB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCAqIGFzIHBsIGZyb20gXCJub2RlanMtcG9sYXJzXCJcblxuLy8gVE9ETzpcbi8vIEFkZCBtb3JlIHZhbGlkYXRpb246XG4vLyAtIENoZWNrIHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgaXMgMiAobm8gbGlzdC5sZW5naHRzIGluIHBvbGFycyBjdXJyZW50bHkpXG4vLyAtIENoZWNrIHRoZSB2YWx1ZXMgYXJlIHdpdGhpbiAtMTgwLi4xODAgYW5kIC05MC4uOTBcbi8vIC0gUmV0dXJuIG51bGwgaW5zdGVhZCBvZiBsaXN0IGlmIGFueSBvZiB0aGUgdmFsdWVzIGFyZSBvdXQgb2YgcmFuZ2VcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlR2VvcG9pbnRGaWVsZChmaWVsZDogR2VvcG9pbnRGaWVsZCwgZmllbGRFeHByOiBwbC5FeHByKSB7XG4gIC8vIERlZmF1bHQgZm9ybWF0IGlzIFwibG9uLGxhdFwiIHN0cmluZ1xuICBjb25zdCBmb3JtYXQgPSBmaWVsZC5mb3JtYXQgPz8gXCJkZWZhdWx0XCJcblxuICBpZiAoZm9ybWF0ID09PSBcImRlZmF1bHRcIikge1xuICAgIGZpZWxkRXhwciA9IGZpZWxkRXhwci5zdHIuc3BsaXQoXCIsXCIpLmNhc3QocGwuTGlzdChwbC5GbG9hdDY0KSlcbiAgfVxuXG4gIGlmIChmb3JtYXQgPT09IFwiYXJyYXlcIikge1xuICAgIGZpZWxkRXhwciA9IGZpZWxkRXhwci5zdHJcbiAgICAgIC5yZXBsYWNlQWxsKFwiW1xcXFxbXFxcXF1cXFxcc11cIiwgXCJcIilcbiAgICAgIC5zdHIuc3BsaXQoXCIsXCIpXG4gICAgICAuY2FzdChwbC5MaXN0KHBsLkZsb2F0NjQpKVxuICB9XG5cbiAgaWYgKGZvcm1hdCA9PT0gXCJvYmplY3RcIikge1xuICAgIGZpZWxkRXhwciA9IHBsXG4gICAgICAuY29uY2F0TGlzdChbXG4gICAgICAgIGZpZWxkRXhwci5zdHIuanNvblBhdGhNYXRjaChcIiQubG9uXCIpLmNhc3QocGwuRmxvYXQ2NCksXG4gICAgICAgIGZpZWxkRXhwci5zdHIuanNvblBhdGhNYXRjaChcIiQubGF0XCIpLmNhc3QocGwuRmxvYXQ2NCksXG4gICAgICBdKVxuICAgICAgLmFsaWFzKGZpZWxkLm5hbWUpXG4gIH1cblxuICByZXR1cm4gZmllbGRFeHByXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnlHZW9wb2ludEZpZWxkKFxuICBmaWVsZDogR2VvcG9pbnRGaWVsZCxcbiAgZmllbGRFeHByOiBwbC5FeHByLFxuKSB7XG4gIC8vIERlZmF1bHQgZm9ybWF0IGlzIFwibG9uLGxhdFwiIHN0cmluZ1xuICBjb25zdCBmb3JtYXQgPSBmaWVsZC5mb3JtYXQgPz8gXCJkZWZhdWx0XCJcblxuICBpZiAoZm9ybWF0ID09PSBcImRlZmF1bHRcIikge1xuICAgIHJldHVybiBmaWVsZEV4cHIuY2FzdChwbC5MaXN0KHBsLlN0cmluZykpLmxzdC5qb2luKFwiLFwiKVxuICB9XG5cbiAgaWYgKGZvcm1hdCA9PT0gXCJhcnJheVwiKSB7XG4gICAgcmV0dXJuIHBsXG4gICAgICAuY29uY2F0U3RyaW5nKFxuICAgICAgICBbXG4gICAgICAgICAgcGwubGl0KFwiW1wiKSxcbiAgICAgICAgICBmaWVsZEV4cHIubHN0LmdldCgwKS5jYXN0KHBsLlN0cmluZyksXG4gICAgICAgICAgcGwubGl0KFwiLFwiKSxcbiAgICAgICAgICBmaWVsZEV4cHIubHN0LmdldCgxKS5jYXN0KHBsLlN0cmluZyksXG4gICAgICAgICAgcGwubGl0KFwiXVwiKSxcbiAgICAgICAgXSxcbiAgICAgICAgXCJcIixcbiAgICAgIClcbiAgICAgIC5hbGlhcyhmaWVsZC5uYW1lKSBhcyBwbC5FeHByXG4gIH1cblxuICBpZiAoZm9ybWF0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIHBsXG4gICAgICAuY29uY2F0U3RyaW5nKFxuICAgICAgICBbXG4gICAgICAgICAgcGwubGl0KCd7XCJsb25cIjonKSxcbiAgICAgICAgICBmaWVsZEV4cHIubHN0LmdldCgwKS5jYXN0KHBsLlN0cmluZyksXG4gICAgICAgICAgcGwubGl0KCcsXCJsYXRcIjonKSxcbiAgICAgICAgICBmaWVsZEV4cHIubHN0LmdldCgxKS5jYXN0KHBsLlN0cmluZyksXG4gICAgICAgICAgcGwubGl0KFwifVwiKSxcbiAgICAgICAgXSxcbiAgICAgICAgXCJcIixcbiAgICAgIClcbiAgICAgIC5hbGlhcyhmaWVsZC5uYW1lKSBhcyBwbC5FeHByXG4gIH1cblxuICByZXR1cm4gZmllbGRFeHByXG59XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};