@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,2 @@
1
+ export * from "./table/index.ts";
2
+ export * from "./plugin.ts";
@@ -0,0 +1,3 @@
1
+ export * from "./table/index.js";
2
+ export * from "./plugin.js";
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbHVnaW5zL2Nzdi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGtCQUFrQixDQUFBO0FBQ2hDLGNBQWMsYUFBYSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vdGFibGUvaW5kZXgudHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vcGx1Z2luLnRzXCJcbiJdfQ==
@@ -0,0 +1,8 @@
1
+ import type { Resource } from "@frictionless-ts/metadata";
2
+ import type { LoadTableOptions, SaveTableOptions } from "../../plugin.ts";
3
+ import type { TablePlugin } from "../../plugin.ts";
4
+ import type { Table } from "../../table/index.ts";
5
+ export declare class CsvPlugin implements TablePlugin {
6
+ loadTable(resource: Partial<Resource>, options?: LoadTableOptions): Promise<import("nodejs-polars").LazyDataFrame<any> | undefined>;
7
+ saveTable(table: Table, options: SaveTableOptions): Promise<string | undefined>;
8
+ }
@@ -0,0 +1,22 @@
1
+ import { inferFormat } from "@frictionless-ts/metadata";
2
+ import { loadCsvTable, saveCsvTable } from "./table/index.js";
3
+ export class CsvPlugin {
4
+ async loadTable(resource, options) {
5
+ const csvFormat = getCsvFormat(resource);
6
+ if (!csvFormat)
7
+ return undefined;
8
+ return await loadCsvTable({ ...resource, format: csvFormat }, options);
9
+ }
10
+ async saveTable(table, options) {
11
+ const { path, format } = options;
12
+ const csvFormat = getCsvFormat({ path, format });
13
+ if (!csvFormat)
14
+ return undefined;
15
+ return await saveCsvTable(table, { ...options, format: csvFormat });
16
+ }
17
+ }
18
+ function getCsvFormat(resource) {
19
+ const format = inferFormat(resource);
20
+ return format === "csv" || format === "tsv" ? format : undefined;
21
+ }
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2lucy9jc3YvcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUl2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBRTdELE1BQU0sT0FBTyxTQUFTO0lBQ3BCLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBMkIsRUFBRSxPQUEwQjtRQUNyRSxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDeEMsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPLFNBQVMsQ0FBQTtRQUVoQyxPQUFPLE1BQU0sWUFBWSxDQUFDLEVBQUUsR0FBRyxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3hFLENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQVksRUFBRSxPQUF5QjtRQUNyRCxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQTtRQUVoQyxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQTtRQUNoRCxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU8sU0FBUyxDQUFBO1FBRWhDLE9BQU8sTUFBTSxZQUFZLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUE7SUFDckUsQ0FBQztDQUNGO0FBRUQsU0FBUyxZQUFZLENBQUMsUUFBMkI7SUFDL0MsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3BDLE9BQU8sTUFBTSxLQUFLLEtBQUssSUFBSSxNQUFNLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtBQUNsRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZXNvdXJjZSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB7IGluZmVyRm9ybWF0IH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0IHR5cGUgeyBMb2FkVGFibGVPcHRpb25zLCBTYXZlVGFibGVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL3BsdWdpbi50c1wiXG5pbXBvcnQgdHlwZSB7IFRhYmxlUGx1Z2luIH0gZnJvbSBcIi4uLy4uL3BsdWdpbi50c1wiXG5pbXBvcnQgdHlwZSB7IFRhYmxlIH0gZnJvbSBcIi4uLy4uL3RhYmxlL2luZGV4LnRzXCJcbmltcG9ydCB7IGxvYWRDc3ZUYWJsZSwgc2F2ZUNzdlRhYmxlIH0gZnJvbSBcIi4vdGFibGUvaW5kZXgudHNcIlxuXG5leHBvcnQgY2xhc3MgQ3N2UGx1Z2luIGltcGxlbWVudHMgVGFibGVQbHVnaW4ge1xuICBhc3luYyBsb2FkVGFibGUocmVzb3VyY2U6IFBhcnRpYWw8UmVzb3VyY2U+LCBvcHRpb25zPzogTG9hZFRhYmxlT3B0aW9ucykge1xuICAgIGNvbnN0IGNzdkZvcm1hdCA9IGdldENzdkZvcm1hdChyZXNvdXJjZSlcbiAgICBpZiAoIWNzdkZvcm1hdCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgcmV0dXJuIGF3YWl0IGxvYWRDc3ZUYWJsZSh7IC4uLnJlc291cmNlLCBmb3JtYXQ6IGNzdkZvcm1hdCB9LCBvcHRpb25zKVxuICB9XG5cbiAgYXN5bmMgc2F2ZVRhYmxlKHRhYmxlOiBUYWJsZSwgb3B0aW9uczogU2F2ZVRhYmxlT3B0aW9ucykge1xuICAgIGNvbnN0IHsgcGF0aCwgZm9ybWF0IH0gPSBvcHRpb25zXG5cbiAgICBjb25zdCBjc3ZGb3JtYXQgPSBnZXRDc3ZGb3JtYXQoeyBwYXRoLCBmb3JtYXQgfSlcbiAgICBpZiAoIWNzdkZvcm1hdCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgcmV0dXJuIGF3YWl0IHNhdmVDc3ZUYWJsZSh0YWJsZSwgeyAuLi5vcHRpb25zLCBmb3JtYXQ6IGNzdkZvcm1hdCB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldENzdkZvcm1hdChyZXNvdXJjZTogUGFydGlhbDxSZXNvdXJjZT4pIHtcbiAgY29uc3QgZm9ybWF0ID0gaW5mZXJGb3JtYXQocmVzb3VyY2UpXG4gIHJldHVybiBmb3JtYXQgPT09IFwiY3N2XCIgfHwgZm9ybWF0ID09PSBcInRzdlwiID8gZm9ybWF0IDogdW5kZWZpbmVkXG59XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,161 @@
1
+ import * as pl from "nodejs-polars";
2
+ import { beforeEach, describe, expect, it, vi } from "vitest";
3
+ import { CsvPlugin } from "./plugin.js";
4
+ import * as tableModule from "./table/index.js";
5
+ vi.mock("./table/index.ts", () => ({
6
+ loadCsvTable: vi.fn(),
7
+ saveCsvTable: vi.fn(),
8
+ }));
9
+ describe("CsvPlugin", () => {
10
+ let plugin;
11
+ let mockLoadCsvTable;
12
+ let mockSaveCsvTable;
13
+ beforeEach(() => {
14
+ plugin = new CsvPlugin();
15
+ mockLoadCsvTable = vi.mocked(tableModule.loadCsvTable);
16
+ mockSaveCsvTable = vi.mocked(tableModule.saveCsvTable);
17
+ vi.clearAllMocks();
18
+ });
19
+ describe("loadTable", () => {
20
+ it("should load table from csv file", async () => {
21
+ const resource = {
22
+ path: "test.csv",
23
+ };
24
+ const mockTable = pl.DataFrame().lazy();
25
+ mockLoadCsvTable.mockResolvedValue(mockTable);
26
+ const result = await plugin.loadTable(resource);
27
+ expect(mockLoadCsvTable).toHaveBeenCalledWith({ ...resource, format: "csv" }, undefined);
28
+ expect(result).toEqual(mockTable);
29
+ });
30
+ it("should load table from tsv file", async () => {
31
+ const resource = {
32
+ path: "test.tsv",
33
+ };
34
+ const mockTable = pl.DataFrame().lazy();
35
+ mockLoadCsvTable.mockResolvedValue(mockTable);
36
+ const result = await plugin.loadTable(resource);
37
+ expect(mockLoadCsvTable).toHaveBeenCalledWith({ ...resource, format: "tsv" }, undefined);
38
+ expect(result).toEqual(mockTable);
39
+ });
40
+ it("should return undefined for non-csv files", async () => {
41
+ const resource = {
42
+ path: "test.json",
43
+ };
44
+ const result = await plugin.loadTable(resource);
45
+ expect(mockLoadCsvTable).not.toHaveBeenCalled();
46
+ expect(result).toBeUndefined();
47
+ });
48
+ it("should handle explicit format specification", async () => {
49
+ const resource = {
50
+ path: "test.txt",
51
+ format: "csv",
52
+ };
53
+ const mockTable = pl.DataFrame().lazy();
54
+ mockLoadCsvTable.mockResolvedValue(mockTable);
55
+ const result = await plugin.loadTable(resource);
56
+ expect(mockLoadCsvTable).toHaveBeenCalledWith({ ...resource, format: "csv" }, undefined);
57
+ expect(result).toEqual(mockTable);
58
+ });
59
+ it("should pass through load options", async () => {
60
+ const resource = {
61
+ path: "test.csv",
62
+ };
63
+ const options = { denormalized: true };
64
+ const mockTable = pl.DataFrame().lazy();
65
+ mockLoadCsvTable.mockResolvedValue(mockTable);
66
+ await plugin.loadTable(resource, options);
67
+ expect(mockLoadCsvTable).toHaveBeenCalledWith({ ...resource, format: "csv" }, options);
68
+ });
69
+ it("should handle paths with directories", async () => {
70
+ const resource = {
71
+ path: "/path/to/data.csv",
72
+ };
73
+ const mockTable = pl.DataFrame().lazy();
74
+ mockLoadCsvTable.mockResolvedValue(mockTable);
75
+ await plugin.loadTable(resource);
76
+ expect(mockLoadCsvTable).toHaveBeenCalledWith({ ...resource, format: "csv" }, undefined);
77
+ });
78
+ it("should handle explicit tsv format specification", async () => {
79
+ const resource = {
80
+ path: "test.txt",
81
+ format: "tsv",
82
+ };
83
+ const mockTable = pl.DataFrame().lazy();
84
+ mockLoadCsvTable.mockResolvedValue(mockTable);
85
+ const result = await plugin.loadTable(resource);
86
+ expect(mockLoadCsvTable).toHaveBeenCalledWith({ ...resource, format: "tsv" }, undefined);
87
+ expect(result).toEqual(mockTable);
88
+ });
89
+ });
90
+ describe("saveTable", () => {
91
+ it("should save table to csv file", async () => {
92
+ const table = pl.DataFrame().lazy();
93
+ const options = { path: "output.csv" };
94
+ mockSaveCsvTable.mockResolvedValue("output.csv");
95
+ const result = await plugin.saveTable(table, options);
96
+ expect(mockSaveCsvTable).toHaveBeenCalledWith(table, {
97
+ ...options,
98
+ format: "csv",
99
+ });
100
+ expect(result).toBe("output.csv");
101
+ });
102
+ it("should save table to tsv file", async () => {
103
+ const table = pl.DataFrame().lazy();
104
+ const options = { path: "output.tsv" };
105
+ mockSaveCsvTable.mockResolvedValue("output.tsv");
106
+ const result = await plugin.saveTable(table, options);
107
+ expect(mockSaveCsvTable).toHaveBeenCalledWith(table, {
108
+ ...options,
109
+ format: "tsv",
110
+ });
111
+ expect(result).toBe("output.tsv");
112
+ });
113
+ it("should return undefined for non-csv files", async () => {
114
+ const table = pl.DataFrame().lazy();
115
+ const options = { path: "output.json" };
116
+ const result = await plugin.saveTable(table, options);
117
+ expect(mockSaveCsvTable).not.toHaveBeenCalled();
118
+ expect(result).toBeUndefined();
119
+ });
120
+ it("should handle explicit format specification", async () => {
121
+ const table = pl.DataFrame().lazy();
122
+ const options = { path: "output.txt", format: "csv" };
123
+ mockSaveCsvTable.mockResolvedValue("output.txt");
124
+ const result = await plugin.saveTable(table, options);
125
+ expect(mockSaveCsvTable).toHaveBeenCalledWith(table, {
126
+ ...options,
127
+ format: "csv",
128
+ });
129
+ expect(result).toBe("output.txt");
130
+ });
131
+ it("should handle paths with directories", async () => {
132
+ const table = pl.DataFrame().lazy();
133
+ const options = { path: "/path/to/output.csv" };
134
+ mockSaveCsvTable.mockResolvedValue("/path/to/output.csv");
135
+ await plugin.saveTable(table, options);
136
+ expect(mockSaveCsvTable).toHaveBeenCalledWith(table, {
137
+ ...options,
138
+ format: "csv",
139
+ });
140
+ });
141
+ it("should return undefined for files without extension", async () => {
142
+ const table = pl.DataFrame().lazy();
143
+ const options = { path: "output" };
144
+ const result = await plugin.saveTable(table, options);
145
+ expect(mockSaveCsvTable).not.toHaveBeenCalled();
146
+ expect(result).toBeUndefined();
147
+ });
148
+ it("should handle explicit tsv format specification", async () => {
149
+ const table = pl.DataFrame().lazy();
150
+ const options = { path: "output.txt", format: "tsv" };
151
+ mockSaveCsvTable.mockResolvedValue("output.txt");
152
+ const result = await plugin.saveTable(table, options);
153
+ expect(mockSaveCsvTable).toHaveBeenCalledWith(table, {
154
+ ...options,
155
+ format: "tsv",
156
+ });
157
+ expect(result).toBe("output.txt");
158
+ });
159
+ });
160
+ });
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbHVnaW5zL2Nzdi9wbHVnaW4uc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUNuQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ3ZDLE9BQU8sS0FBSyxXQUFXLE1BQU0sa0JBQWtCLENBQUE7QUFFL0MsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLFlBQVksRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO0lBQ3JCLFlBQVksRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO0NBQ3RCLENBQUMsQ0FBQyxDQUFBO0FBRUgsUUFBUSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUU7SUFDekIsSUFBSSxNQUFpQixDQUFBO0lBQ3JCLElBQUksZ0JBQTBDLENBQUE7SUFDOUMsSUFBSSxnQkFBMEMsQ0FBQTtJQUU5QyxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUE7UUFDeEIsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDdEQsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDdEQsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFBO0lBQ3BCLENBQUMsQ0FBQyxDQUFBO0lBRUYsUUFBUSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUU7UUFDekIsRUFBRSxDQUFDLGlDQUFpQyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQy9DLE1BQU0sUUFBUSxHQUFzQjtnQkFDbEMsSUFBSSxFQUFFLFVBQVU7YUFDakIsQ0FBQTtZQUNELE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtZQUN2QyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUU3QyxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7WUFFL0MsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsb0JBQW9CLENBQzNDLEVBQUUsR0FBRyxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUM5QixTQUFTLENBQ1YsQ0FBQTtZQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDbkMsQ0FBQyxDQUFDLENBQUE7UUFFRixFQUFFLENBQUMsaUNBQWlDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDL0MsTUFBTSxRQUFRLEdBQXNCO2dCQUNsQyxJQUFJLEVBQUUsVUFBVTthQUNqQixDQUFBO1lBQ0QsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFBO1lBQ3ZDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBRTdDLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUUvQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxvQkFBb0IsQ0FDM0MsRUFBRSxHQUFHLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQzlCLFNBQVMsQ0FDVixDQUFBO1lBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNuQyxDQUFDLENBQUMsQ0FBQTtRQUVGLEVBQUUsQ0FBQywyQ0FBMkMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUN6RCxNQUFNLFFBQVEsR0FBc0I7Z0JBQ2xDLElBQUksRUFBRSxXQUFXO2FBQ2xCLENBQUE7WUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7WUFFL0MsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLENBQUE7WUFDL0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQ2hDLENBQUMsQ0FBQyxDQUFBO1FBRUYsRUFBRSxDQUFDLDZDQUE2QyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzNELE1BQU0sUUFBUSxHQUFzQjtnQkFDbEMsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLE1BQU0sRUFBRSxLQUFLO2FBQ2QsQ0FBQTtZQUNELE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtZQUN2QyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUU3QyxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7WUFFL0MsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsb0JBQW9CLENBQzNDLEVBQUUsR0FBRyxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUM5QixTQUFTLENBQ1YsQ0FBQTtZQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDbkMsQ0FBQyxDQUFDLENBQUE7UUFFRixFQUFFLENBQUMsa0NBQWtDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDaEQsTUFBTSxRQUFRLEdBQXNCO2dCQUNsQyxJQUFJLEVBQUUsVUFBVTthQUNqQixDQUFBO1lBQ0QsTUFBTSxPQUFPLEdBQUcsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUE7WUFDdEMsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFBO1lBQ3ZDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBRTdDLE1BQU0sTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUE7WUFFekMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsb0JBQW9CLENBQzNDLEVBQUUsR0FBRyxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUM5QixPQUFPLENBQ1IsQ0FBQTtRQUNILENBQUMsQ0FBQyxDQUFBO1FBRUYsRUFBRSxDQUFDLHNDQUFzQyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3BELE1BQU0sUUFBUSxHQUFzQjtnQkFDbEMsSUFBSSxFQUFFLG1CQUFtQjthQUMxQixDQUFBO1lBQ0QsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFBO1lBQ3ZDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBRTdDLE1BQU0sTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUVoQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxvQkFBb0IsQ0FDM0MsRUFBRSxHQUFHLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQzlCLFNBQVMsQ0FDVixDQUFBO1FBQ0gsQ0FBQyxDQUFDLENBQUE7UUFFRixFQUFFLENBQUMsaURBQWlELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDL0QsTUFBTSxRQUFRLEdBQXNCO2dCQUNsQyxJQUFJLEVBQUUsVUFBVTtnQkFDaEIsTUFBTSxFQUFFLEtBQUs7YUFDZCxDQUFBO1lBQ0QsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFBO1lBQ3ZDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBRTdDLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUUvQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxvQkFBb0IsQ0FDM0MsRUFBRSxHQUFHLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQzlCLFNBQVMsQ0FDVixDQUFBO1lBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNuQyxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQyxDQUFBO0lBRUYsUUFBUSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUU7UUFDekIsRUFBRSxDQUFDLCtCQUErQixFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzdDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtZQUNuQyxNQUFNLE9BQU8sR0FBRyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQTtZQUN0QyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUVoRCxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBRXJELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRTtnQkFDbkQsR0FBRyxPQUFPO2dCQUNWLE1BQU0sRUFBRSxLQUFLO2FBQ2QsQ0FBQyxDQUFBO1lBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUNuQyxDQUFDLENBQUMsQ0FBQTtRQUVGLEVBQUUsQ0FBQywrQkFBK0IsRUFBRSxLQUFLLElBQUksRUFBRTtZQUM3QyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUE7WUFDbkMsTUFBTSxPQUFPLEdBQUcsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUE7WUFDdEMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUE7WUFFaEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQTtZQUVyRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUU7Z0JBQ25ELEdBQUcsT0FBTztnQkFDVixNQUFNLEVBQUUsS0FBSzthQUNkLENBQUMsQ0FBQTtZQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDbkMsQ0FBQyxDQUFDLENBQUE7UUFFRixFQUFFLENBQUMsMkNBQTJDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDekQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFBO1lBQ25DLE1BQU0sT0FBTyxHQUFHLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFBO1lBRXZDLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUE7WUFFckQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLENBQUE7WUFDL0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQ2hDLENBQUMsQ0FBQyxDQUFBO1FBRUYsRUFBRSxDQUFDLDZDQUE2QyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzNELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtZQUNuQyxNQUFNLE9BQU8sR0FBRyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQWMsRUFBRSxDQUFBO1lBQzlELGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFBO1lBRWhELE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUE7WUFFckQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFO2dCQUNuRCxHQUFHLE9BQU87Z0JBQ1YsTUFBTSxFQUFFLEtBQUs7YUFDZCxDQUFDLENBQUE7WUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQ25DLENBQUMsQ0FBQyxDQUFBO1FBRUYsRUFBRSxDQUFDLHNDQUFzQyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3BELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtZQUNuQyxNQUFNLE9BQU8sR0FBRyxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxDQUFBO1lBQy9DLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDLENBQUE7WUFFekQsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQTtZQUV0QyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUU7Z0JBQ25ELEdBQUcsT0FBTztnQkFDVixNQUFNLEVBQUUsS0FBSzthQUNkLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQyxDQUFBO1FBRUYsRUFBRSxDQUFDLHFEQUFxRCxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ25FLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtZQUNuQyxNQUFNLE9BQU8sR0FBRyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQTtZQUVsQyxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBRXJELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1lBQy9DLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUNoQyxDQUFDLENBQUMsQ0FBQTtRQUVGLEVBQUUsQ0FBQyxpREFBaUQsRUFBRSxLQUFLLElBQUksRUFBRTtZQUMvRCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUE7WUFDbkMsTUFBTSxPQUFPLEdBQUcsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFjLEVBQUUsQ0FBQTtZQUM5RCxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUVoRCxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBRXJELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRTtnQkFDbkQsR0FBRyxPQUFPO2dCQUNWLE1BQU0sRUFBRSxLQUFLO2FBQ2QsQ0FBQyxDQUFBO1lBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUNuQyxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJlc291cmNlIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0ICogYXMgcGwgZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuaW1wb3J0IHsgYmVmb3JlRWFjaCwgZGVzY3JpYmUsIGV4cGVjdCwgaXQsIHZpIH0gZnJvbSBcInZpdGVzdFwiXG5pbXBvcnQgeyBDc3ZQbHVnaW4gfSBmcm9tIFwiLi9wbHVnaW4udHNcIlxuaW1wb3J0ICogYXMgdGFibGVNb2R1bGUgZnJvbSBcIi4vdGFibGUvaW5kZXgudHNcIlxuXG52aS5tb2NrKFwiLi90YWJsZS9pbmRleC50c1wiLCAoKSA9PiAoe1xuICBsb2FkQ3N2VGFibGU6IHZpLmZuKCksXG4gIHNhdmVDc3ZUYWJsZTogdmkuZm4oKSxcbn0pKVxuXG5kZXNjcmliZShcIkNzdlBsdWdpblwiLCAoKSA9PiB7XG4gIGxldCBwbHVnaW46IENzdlBsdWdpblxuICBsZXQgbW9ja0xvYWRDc3ZUYWJsZTogUmV0dXJuVHlwZTx0eXBlb2YgdmkuZm4+XG4gIGxldCBtb2NrU2F2ZUNzdlRhYmxlOiBSZXR1cm5UeXBlPHR5cGVvZiB2aS5mbj5cblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBwbHVnaW4gPSBuZXcgQ3N2UGx1Z2luKClcbiAgICBtb2NrTG9hZENzdlRhYmxlID0gdmkubW9ja2VkKHRhYmxlTW9kdWxlLmxvYWRDc3ZUYWJsZSlcbiAgICBtb2NrU2F2ZUNzdlRhYmxlID0gdmkubW9ja2VkKHRhYmxlTW9kdWxlLnNhdmVDc3ZUYWJsZSlcbiAgICB2aS5jbGVhckFsbE1vY2tzKClcbiAgfSlcblxuICBkZXNjcmliZShcImxvYWRUYWJsZVwiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgbG9hZCB0YWJsZSBmcm9tIGNzdiBmaWxlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc291cmNlOiBQYXJ0aWFsPFJlc291cmNlPiA9IHtcbiAgICAgICAgcGF0aDogXCJ0ZXN0LmNzdlwiLFxuICAgICAgfVxuICAgICAgY29uc3QgbW9ja1RhYmxlID0gcGwuRGF0YUZyYW1lKCkubGF6eSgpXG4gICAgICBtb2NrTG9hZENzdlRhYmxlLm1vY2tSZXNvbHZlZFZhbHVlKG1vY2tUYWJsZSlcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGx1Z2luLmxvYWRUYWJsZShyZXNvdXJjZSlcblxuICAgICAgZXhwZWN0KG1vY2tMb2FkQ3N2VGFibGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICB7IC4uLnJlc291cmNlLCBmb3JtYXQ6IFwiY3N2XCIgfSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgKVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChtb2NrVGFibGUpXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIGxvYWQgdGFibGUgZnJvbSB0c3YgZmlsZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXNvdXJjZTogUGFydGlhbDxSZXNvdXJjZT4gPSB7XG4gICAgICAgIHBhdGg6IFwidGVzdC50c3ZcIixcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1vY2tUYWJsZSA9IHBsLkRhdGFGcmFtZSgpLmxhenkoKVxuICAgICAgbW9ja0xvYWRDc3ZUYWJsZS5tb2NrUmVzb2x2ZWRWYWx1ZShtb2NrVGFibGUpXG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBsdWdpbi5sb2FkVGFibGUocmVzb3VyY2UpXG5cbiAgICAgIGV4cGVjdChtb2NrTG9hZENzdlRhYmxlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgeyAuLi5yZXNvdXJjZSwgZm9ybWF0OiBcInRzdlwiIH0sXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgIClcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwobW9ja1RhYmxlKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCByZXR1cm4gdW5kZWZpbmVkIGZvciBub24tY3N2IGZpbGVzXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc291cmNlOiBQYXJ0aWFsPFJlc291cmNlPiA9IHtcbiAgICAgICAgcGF0aDogXCJ0ZXN0Lmpzb25cIixcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGx1Z2luLmxvYWRUYWJsZShyZXNvdXJjZSlcblxuICAgICAgZXhwZWN0KG1vY2tMb2FkQ3N2VGFibGUpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVVbmRlZmluZWQoKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgZXhwbGljaXQgZm9ybWF0IHNwZWNpZmljYXRpb25cIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzb3VyY2U6IFBhcnRpYWw8UmVzb3VyY2U+ID0ge1xuICAgICAgICBwYXRoOiBcInRlc3QudHh0XCIsXG4gICAgICAgIGZvcm1hdDogXCJjc3ZcIixcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1vY2tUYWJsZSA9IHBsLkRhdGFGcmFtZSgpLmxhenkoKVxuICAgICAgbW9ja0xvYWRDc3ZUYWJsZS5tb2NrUmVzb2x2ZWRWYWx1ZShtb2NrVGFibGUpXG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBsdWdpbi5sb2FkVGFibGUocmVzb3VyY2UpXG5cbiAgICAgIGV4cGVjdChtb2NrTG9hZENzdlRhYmxlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgeyAuLi5yZXNvdXJjZSwgZm9ybWF0OiBcImNzdlwiIH0sXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgIClcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwobW9ja1RhYmxlKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBwYXNzIHRocm91Z2ggbG9hZCBvcHRpb25zXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc291cmNlOiBQYXJ0aWFsPFJlc291cmNlPiA9IHtcbiAgICAgICAgcGF0aDogXCJ0ZXN0LmNzdlwiLFxuICAgICAgfVxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHsgZGVub3JtYWxpemVkOiB0cnVlIH1cbiAgICAgIGNvbnN0IG1vY2tUYWJsZSA9IHBsLkRhdGFGcmFtZSgpLmxhenkoKVxuICAgICAgbW9ja0xvYWRDc3ZUYWJsZS5tb2NrUmVzb2x2ZWRWYWx1ZShtb2NrVGFibGUpXG5cbiAgICAgIGF3YWl0IHBsdWdpbi5sb2FkVGFibGUocmVzb3VyY2UsIG9wdGlvbnMpXG5cbiAgICAgIGV4cGVjdChtb2NrTG9hZENzdlRhYmxlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgeyAuLi5yZXNvdXJjZSwgZm9ybWF0OiBcImNzdlwiIH0sXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIGhhbmRsZSBwYXRocyB3aXRoIGRpcmVjdG9yaWVzXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc291cmNlOiBQYXJ0aWFsPFJlc291cmNlPiA9IHtcbiAgICAgICAgcGF0aDogXCIvcGF0aC90by9kYXRhLmNzdlwiLFxuICAgICAgfVxuICAgICAgY29uc3QgbW9ja1RhYmxlID0gcGwuRGF0YUZyYW1lKCkubGF6eSgpXG4gICAgICBtb2NrTG9hZENzdlRhYmxlLm1vY2tSZXNvbHZlZFZhbHVlKG1vY2tUYWJsZSlcblxuICAgICAgYXdhaXQgcGx1Z2luLmxvYWRUYWJsZShyZXNvdXJjZSlcblxuICAgICAgZXhwZWN0KG1vY2tMb2FkQ3N2VGFibGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICB7IC4uLnJlc291cmNlLCBmb3JtYXQ6IFwiY3N2XCIgfSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgZXhwbGljaXQgdHN2IGZvcm1hdCBzcGVjaWZpY2F0aW9uXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc291cmNlOiBQYXJ0aWFsPFJlc291cmNlPiA9IHtcbiAgICAgICAgcGF0aDogXCJ0ZXN0LnR4dFwiLFxuICAgICAgICBmb3JtYXQ6IFwidHN2XCIsXG4gICAgICB9XG4gICAgICBjb25zdCBtb2NrVGFibGUgPSBwbC5EYXRhRnJhbWUoKS5sYXp5KClcbiAgICAgIG1vY2tMb2FkQ3N2VGFibGUubW9ja1Jlc29sdmVkVmFsdWUobW9ja1RhYmxlKVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwbHVnaW4ubG9hZFRhYmxlKHJlc291cmNlKVxuXG4gICAgICBleHBlY3QobW9ja0xvYWRDc3ZUYWJsZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgIHsgLi4ucmVzb3VyY2UsIGZvcm1hdDogXCJ0c3ZcIiB9LFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICApXG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKG1vY2tUYWJsZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKFwic2F2ZVRhYmxlXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBzYXZlIHRhYmxlIHRvIGNzdiBmaWxlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gcGwuRGF0YUZyYW1lKCkubGF6eSgpXG4gICAgICBjb25zdCBvcHRpb25zID0geyBwYXRoOiBcIm91dHB1dC5jc3ZcIiB9XG4gICAgICBtb2NrU2F2ZUNzdlRhYmxlLm1vY2tSZXNvbHZlZFZhbHVlKFwib3V0cHV0LmNzdlwiKVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwbHVnaW4uc2F2ZVRhYmxlKHRhYmxlLCBvcHRpb25zKVxuXG4gICAgICBleHBlY3QobW9ja1NhdmVDc3ZUYWJsZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgodGFibGUsIHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgZm9ybWF0OiBcImNzdlwiLFxuICAgICAgfSlcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoXCJvdXRwdXQuY3N2XCIpXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIHNhdmUgdGFibGUgdG8gdHN2IGZpbGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBwbC5EYXRhRnJhbWUoKS5sYXp5KClcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IHBhdGg6IFwib3V0cHV0LnRzdlwiIH1cbiAgICAgIG1vY2tTYXZlQ3N2VGFibGUubW9ja1Jlc29sdmVkVmFsdWUoXCJvdXRwdXQudHN2XCIpXG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBsdWdpbi5zYXZlVGFibGUodGFibGUsIG9wdGlvbnMpXG5cbiAgICAgIGV4cGVjdChtb2NrU2F2ZUNzdlRhYmxlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh0YWJsZSwge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBmb3JtYXQ6IFwidHN2XCIsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZShcIm91dHB1dC50c3ZcIilcbiAgICB9KVxuXG4gICAgaXQoXCJzaG91bGQgcmV0dXJuIHVuZGVmaW5lZCBmb3Igbm9uLWNzdiBmaWxlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IHBsLkRhdGFGcmFtZSgpLmxhenkoKVxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHsgcGF0aDogXCJvdXRwdXQuanNvblwiIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGx1Z2luLnNhdmVUYWJsZSh0YWJsZSwgb3B0aW9ucylcblxuICAgICAgZXhwZWN0KG1vY2tTYXZlQ3N2VGFibGUpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVVbmRlZmluZWQoKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgZXhwbGljaXQgZm9ybWF0IHNwZWNpZmljYXRpb25cIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBwbC5EYXRhRnJhbWUoKS5sYXp5KClcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IHBhdGg6IFwib3V0cHV0LnR4dFwiLCBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QgfVxuICAgICAgbW9ja1NhdmVDc3ZUYWJsZS5tb2NrUmVzb2x2ZWRWYWx1ZShcIm91dHB1dC50eHRcIilcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGx1Z2luLnNhdmVUYWJsZSh0YWJsZSwgb3B0aW9ucylcblxuICAgICAgZXhwZWN0KG1vY2tTYXZlQ3N2VGFibGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHRhYmxlLCB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGZvcm1hdDogXCJjc3ZcIixcbiAgICAgIH0pXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKFwib3V0cHV0LnR4dFwiKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgcGF0aHMgd2l0aCBkaXJlY3Rvcmllc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IHBsLkRhdGFGcmFtZSgpLmxhenkoKVxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHsgcGF0aDogXCIvcGF0aC90by9vdXRwdXQuY3N2XCIgfVxuICAgICAgbW9ja1NhdmVDc3ZUYWJsZS5tb2NrUmVzb2x2ZWRWYWx1ZShcIi9wYXRoL3RvL291dHB1dC5jc3ZcIilcblxuICAgICAgYXdhaXQgcGx1Z2luLnNhdmVUYWJsZSh0YWJsZSwgb3B0aW9ucylcblxuICAgICAgZXhwZWN0KG1vY2tTYXZlQ3N2VGFibGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHRhYmxlLCB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGZvcm1hdDogXCJjc3ZcIixcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIHJldHVybiB1bmRlZmluZWQgZm9yIGZpbGVzIHdpdGhvdXQgZXh0ZW5zaW9uXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gcGwuRGF0YUZyYW1lKCkubGF6eSgpXG4gICAgICBjb25zdCBvcHRpb25zID0geyBwYXRoOiBcIm91dHB1dFwiIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGx1Z2luLnNhdmVUYWJsZSh0YWJsZSwgb3B0aW9ucylcblxuICAgICAgZXhwZWN0KG1vY2tTYXZlQ3N2VGFibGUpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVVbmRlZmluZWQoKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgZXhwbGljaXQgdHN2IGZvcm1hdCBzcGVjaWZpY2F0aW9uXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gcGwuRGF0YUZyYW1lKCkubGF6eSgpXG4gICAgICBjb25zdCBvcHRpb25zID0geyBwYXRoOiBcIm91dHB1dC50eHRcIiwgZm9ybWF0OiBcInRzdlwiIGFzIGNvbnN0IH1cbiAgICAgIG1vY2tTYXZlQ3N2VGFibGUubW9ja1Jlc29sdmVkVmFsdWUoXCJvdXRwdXQudHh0XCIpXG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBsdWdpbi5zYXZlVGFibGUodGFibGUsIG9wdGlvbnMpXG5cbiAgICAgIGV4cGVjdChtb2NrU2F2ZUNzdlRhYmxlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh0YWJsZSwge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBmb3JtYXQ6IFwidHN2XCIsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZShcIm91dHB1dC50eHRcIilcbiAgICB9KVxuICB9KVxufSlcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export { loadCsvTable } from "./load.ts";
2
+ export { saveCsvTable } from "./save.ts";
@@ -0,0 +1,3 @@
1
+ export { loadCsvTable } from "./load.js";
2
+ export { saveCsvTable } from "./save.js";
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wbHVnaW5zL2Nzdi90YWJsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ3hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBsb2FkQ3N2VGFibGUgfSBmcm9tIFwiLi9sb2FkLnRzXCJcbmV4cG9ydCB7IHNhdmVDc3ZUYWJsZSB9IGZyb20gXCIuL3NhdmUudHNcIlxuIl19
@@ -0,0 +1,6 @@
1
+ import type { Resource } from "@frictionless-ts/metadata";
2
+ import type { LoadTableOptions } from "../../../plugin.ts";
3
+ import * as pl from "nodejs-polars";
4
+ export declare function loadCsvTable(resource: Partial<Resource> & {
5
+ format?: "csv" | "tsv";
6
+ }, options?: LoadTableOptions): Promise<pl.LazyDataFrame<any>>;
@@ -0,0 +1,86 @@
1
+ import { resolveDialect, resolveSchema } from "@frictionless-ts/metadata";
2
+ import { prefetchFiles } from "@frictionless-ts/dataset";
3
+ import { inferSchemaFromTable } from "../../../schema/index.js";
4
+ import { joinHeaderRows } from "../../../table/index.js";
5
+ import { normalizeTable } from "../../../table/index.js";
6
+ import { skipCommentRows } from "../../../table/index.js";
7
+ import { stripInitialSpace } from "../../../table/index.js";
8
+ import * as pl from "nodejs-polars";
9
+ import { inferCsvDialect } from "../dialect/index.js";
10
+ // TODO: Condier using sample to extract header first
11
+ // for better commentChar + headerRows/commentRows support
12
+ // (consult with the Data Package Working Group)
13
+ export async function loadCsvTable(resource, options) {
14
+ const paths = await prefetchFiles(resource.path);
15
+ if (!paths.length) {
16
+ throw new Error("Resource path is not defined");
17
+ }
18
+ let dialect = await resolveDialect(resource.dialect);
19
+ if (!dialect) {
20
+ dialect = await inferCsvDialect({ ...resource, path: paths[0] }, options);
21
+ }
22
+ const scanOptions = getScanOptions(resource, dialect);
23
+ const tables = [];
24
+ for (const path of paths) {
25
+ const table = pl.scanCSV(path, scanOptions);
26
+ tables.push(table);
27
+ }
28
+ // There is no way to specify column names in nodejs-polars by default
29
+ // so we have to rename `column_*` to `field*` is table doesn't have header
30
+ let table = pl.concat(tables);
31
+ if (!scanOptions.hasHeader) {
32
+ table = table.rename(Object.fromEntries(table.columns.map(name => [name, name.replace("column_", "field")])));
33
+ }
34
+ if (dialect) {
35
+ table = await joinHeaderRows(table, { dialect });
36
+ table = skipCommentRows(table, { dialect });
37
+ table = stripInitialSpace(table, { dialect });
38
+ }
39
+ if (!options?.denormalized) {
40
+ let schema = await resolveSchema(resource.schema);
41
+ if (!schema)
42
+ schema = await inferSchemaFromTable(table, options);
43
+ table = await normalizeTable(table, schema);
44
+ }
45
+ return table;
46
+ }
47
+ function getScanOptions(resource, dialect) {
48
+ const options = {
49
+ inferSchemaLength: 0,
50
+ truncateRaggedLines: true,
51
+ };
52
+ if (resource.encoding) {
53
+ options.encoding = resource.encoding;
54
+ // Polars supports only utf-8 and utf-8-lossy encodings
55
+ if (options.encoding === "utf-8") {
56
+ options.encoding = "utf8";
57
+ }
58
+ if (options.encoding !== "utf8") {
59
+ throw new Error(`Encoding ${options.encoding} for CSV files is not supported`);
60
+ }
61
+ }
62
+ options.skipRows = getRowsToSkip(dialect);
63
+ options.hasHeader = dialect?.header !== false;
64
+ options.eolChar = dialect?.lineTerminator ?? "\n";
65
+ options.sep = dialect?.delimiter ?? ",";
66
+ // TODO: try convincing nodejs-polars to support escapeChar
67
+ // https://github.com/pola-rs/polars/issues/3074
68
+ //options.escapeChar = dialect?.escapeChar
69
+ options.quoteChar = dialect?.quoteChar ?? '"';
70
+ options.nullValues = dialect?.nullSequence;
71
+ // TODO: try convincing nodejs-polars to support doubleQuote
72
+ //options.doubleQuote = dialect?.doubleQuote ?? true
73
+ // TODO: remove ts-ignore when issues is fixed
74
+ // https://github.com/pola-rs/nodejs-polars/issues/334
75
+ // @ts-ignore
76
+ options.commentPrefix = dialect?.commentChar;
77
+ return options;
78
+ }
79
+ function getRowsToSkip(dialect) {
80
+ const headerRows = getHeaderRows(dialect);
81
+ return headerRows[0] ? headerRows[0] - 1 : 0;
82
+ }
83
+ function getHeaderRows(dialect) {
84
+ return dialect?.header !== false ? (dialect?.headerRows ?? [1]) : [];
85
+ }
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BsdWdpbnMvY3N2L3RhYmxlL2xvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUN6RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFFeEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFDL0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFBO0FBQ3hELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQUN4RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFFM0QsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDbkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBRXJELHFEQUFxRDtBQUNyRCwwREFBMEQ7QUFDMUQsZ0RBQWdEO0FBRWhELE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWSxDQUNoQyxRQUF3RCxFQUN4RCxPQUEwQjtJQUUxQixNQUFNLEtBQUssR0FBRyxNQUFNLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUE7SUFDakQsQ0FBQztJQUVELElBQUksT0FBTyxHQUFHLE1BQU0sY0FBYyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNwRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixPQUFPLEdBQUcsTUFBTSxlQUFlLENBQUMsRUFBRSxHQUFHLFFBQVEs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O0lBQzNELGdEQUFnRDtJQUNoRCwwQ0FBMEM7SUFFMUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxPQUFPLEVBQUUsU0FBUyxJQUFJLEdBQUcsQ0FBQTtJQUM3QyxPQUFPLENBQUMsVUFBVSxHQUFHLE9BQU8sRUFBRSxZQUFZLENBQUE7SUFFMUMsNERBQTREO0lBQzVELG9EQUFvRDtJQUVwRCw4Q0FBOEM7SUFDOUMsc0RBQXNEO0lBQ3RELGFBQWE7SUFDYixPQUFPLENBQUMsYUFBYSxHQUFHLE9BQU8sRUFBRSxXQUFXLENBQUE7SUFFNUMsT0FBTyxPQUFPLENBQUE7QUFDaEIsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLE9BQWlCO0lBQ3RDLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN6QyxPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQzlDLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxPQUFpQjtJQUN0QyxPQUFPLE9BQU8sRUFBRSxNQUFNLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7QUFDdEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRGlhbGVjdCwgUmVzb3VyY2UgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgeyByZXNvbHZlRGlhbGVjdCwgcmVzb2x2ZVNjaGVtYSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB7IHByZWZldGNoRmlsZXMgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9kYXRhc2V0XCJcbmltcG9ydCB0eXBlIHsgTG9hZFRhYmxlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi8uLi9wbHVnaW4udHNcIlxuaW1wb3J0IHsgaW5mZXJTY2hlbWFGcm9tVGFibGUgfSBmcm9tIFwiLi4vLi4vLi4vc2NoZW1hL2luZGV4LnRzXCJcbmltcG9ydCB7IGpvaW5IZWFkZXJSb3dzIH0gZnJvbSBcIi4uLy4uLy4uL3RhYmxlL2luZGV4LnRzXCJcbmltcG9ydCB7IG5vcm1hbGl6ZVRhYmxlIH0gZnJvbSBcIi4uLy4uLy4uL3RhYmxlL2luZGV4LnRzXCJcbmltcG9ydCB7IHNraXBDb21tZW50Um93cyB9IGZyb20gXCIuLi8uLi8uLi90YWJsZS9pbmRleC50c1wiXG5pbXBvcnQgeyBzdHJpcEluaXRpYWxTcGFjZSB9IGZyb20gXCIuLi8uLi8uLi90YWJsZS9pbmRleC50c1wiXG5pbXBvcnQgdHlwZSB7IFRhYmxlIH0gZnJvbSBcIi4uLy4uLy4uL3RhYmxlL2luZGV4LnRzXCJcbmltcG9ydCAqIGFzIHBsIGZyb20gXCJub2RlanMtcG9sYXJzXCJcbmltcG9ydCB7IGluZmVyQ3N2RGlhbGVjdCB9IGZyb20gXCIuLi9kaWFsZWN0L2luZGV4LnRzXCJcblxuLy8gVE9ETzogQ29uZGllciB1c2luZyBzYW1wbGUgdG8gZXh0cmFjdCBoZWFkZXIgZmlyc3Rcbi8vIGZvciBiZXR0ZXIgY29tbWVudENoYXIgKyBoZWFkZXJSb3dzL2NvbW1lbnRSb3dzIHN1cHBvcnRcbi8vIChjb25zdWx0IHdpdGggdGhlIERhdGEgUGFja2FnZSBXb3JraW5nIEdyb3VwKVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZENzdlRhYmxlKFxuICByZXNvdXJjZTogUGFydGlhbDxSZXNvdXJjZT4gJiB7IGZvcm1hdD86IFwiY3N2XCIgfCBcInRzdlwiIH0sXG4gIG9wdGlvbnM/OiBMb2FkVGFibGVPcHRpb25zLFxuKSB7XG4gIGNvbnN0IHBhdGhzID0gYXdhaXQgcHJlZmV0Y2hGaWxlcyhyZXNvdXJjZS5wYXRoKVxuICBpZiAoIXBhdGhzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlJlc291cmNlIHBhdGggaXMgbm90IGRlZmluZWRcIilcbiAgfVxuXG4gIGxldCBkaWFsZWN0ID0gYXdhaXQgcmVzb2x2ZURpYWxlY3QocmVzb3VyY2UuZGlhbGVjdClcbiAgaWYgKCFkaWFsZWN0KSB7XG4gICAgZGlhbGVjdCA9IGF3YWl0IGluZmVyQ3N2RGlhbGVjdCh7IC4uLnJlc291cmNlLCBwYXRoOiBwYXRoc1swXSB9LCBvcHRpb25zKVxuICB9XG5cbiAgY29uc3Qgc2Nhbk9wdGlvbnMgPSBnZXRTY2FuT3B0aW9ucyhyZXNvdXJjZSwgZGlhbGVjdClcbiAgY29uc3QgdGFibGVzOiBUYWJsZVtdID0gW11cbiAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgY29uc3QgdGFibGUgPSBwbC5zY2FuQ1NWKHBhdGgsIHNjYW5PcHRpb25zKVxuICAgIHRhYmxlcy5wdXNoKHRhYmxlKVxuICB9XG5cbiAgLy8gVGhlcmUgaXMgbm8gd2F5IHRvIHNwZWNpZnkgY29sdW1uIG5hbWVzIGluIG5vZGVqcy1wb2xhcnMgYnkgZGVmYXVsdFxuICAvLyBzbyB3ZSBoYXZlIHRvIHJlbmFtZSBgY29sdW1uXypgIHRvIGBmaWVsZCpgIGlzIHRhYmxlIGRvZXNuJ3QgaGF2ZSBoZWFkZXJcbiAgbGV0IHRhYmxlID0gcGwuY29uY2F0KHRhYmxlcylcbiAgaWYgKCFzY2FuT3B0aW9ucy5oYXNIZWFkZXIpIHtcbiAgICB0YWJsZSA9IHRhYmxlLnJlbmFtZShcbiAgICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgdGFibGUuY29sdW1ucy5tYXAobmFtZSA9PiBbbmFtZSwgbmFtZS5yZXBsYWNlKFwiY29sdW1uX1wiLCBcImZpZWxkXCIpXSksXG4gICAgICApLFxuICAgIClcbiAgfVxuXG4gIGlmIChkaWFsZWN0KSB7XG4gICAgdGFibGUgPSBhd2FpdCBqb2luSGVhZGVyUm93cyh0YWJsZSwgeyBkaWFsZWN0IH0pXG4gICAgdGFibGUgPSBza2lwQ29tbWVudFJvd3ModGFibGUsIHsgZGlhbGVjdCB9KVxuICAgIHRhYmxlID0gc3RyaXBJbml0aWFsU3BhY2UodGFibGUsIHsgZGlhbGVjdCB9KVxuICB9XG5cbiAgaWYgKCFvcHRpb25zPy5kZW5vcm1hbGl6ZWQpIHtcbiAgICBsZXQgc2NoZW1hID0gYXdhaXQgcmVzb2x2ZVNjaGVtYShyZXNvdXJjZS5zY2hlbWEpXG4gICAgaWYgKCFzY2hlbWEpIHNjaGVtYSA9IGF3YWl0IGluZmVyU2NoZW1hRnJvbVRhYmxlKHRhYmxlLCBvcHRpb25zKVxuICAgIHRhYmxlID0gYXdhaXQgbm9ybWFsaXplVGFibGUodGFibGUsIHNjaGVtYSlcbiAgfVxuXG4gIHJldHVybiB0YWJsZVxufVxuXG5mdW5jdGlvbiBnZXRTY2FuT3B0aW9ucyhyZXNvdXJjZTogUGFydGlhbDxSZXNvdXJjZT4sIGRpYWxlY3Q/OiBEaWFsZWN0KSB7XG4gIGNvbnN0IG9wdGlvbnM6IFBhcnRpYWw8cGwuU2NhbkNzdk9wdGlvbnM+ID0ge1xuICAgIGluZmVyU2NoZW1hTGVuZ3RoOiAwLFxuICAgIHRydW5jYXRlUmFnZ2VkTGluZXM6IHRydWUsXG4gIH1cblxuICBpZiAocmVzb3VyY2UuZW5jb2RpbmcpIHtcbiAgICBvcHRpb25zLmVuY29kaW5nID0gcmVzb3VyY2UuZW5jb2RpbmdcblxuICAgIC8vIFBvbGFycyBzdXBwb3J0cyBvbmx5IHV0Zi04IGFuZCB1dGYtOC1sb3NzeSBlbmNvZGluZ3NcbiAgICBpZiAob3B0aW9ucy5lbmNvZGluZyA9PT0gXCJ1dGYtOFwiKSB7XG4gICAgICBvcHRpb25zLmVuY29kaW5nID0gXCJ1dGY4XCJcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5lbmNvZGluZyAhPT0gXCJ1dGY4XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW5jb2RpbmcgJHtvcHRpb25zLmVuY29kaW5nfSBmb3IgQ1NWIGZpbGVzIGlzIG5vdCBzdXBwb3J0ZWRgKVxuICAgIH1cbiAgfVxuXG4gIG9wdGlvbnMuc2tpcFJvd3MgPSBnZXRSb3dzVG9Ta2lwKGRpYWxlY3QpXG4gIG9wdGlvbnMuaGFzSGVhZGVyID0gZGlhbGVjdD8uaGVhZGVyICE9PSBmYWxzZVxuICBvcHRpb25zLmVvbENoYXIgPSBkaWFsZWN0Py5saW5lVGVybWluYXRvciA/PyBcIlxcblwiXG4gIG9wdGlvbnMuc2VwID0gZGlhbGVjdD8uZGVsaW1pdGVyID8/IFwiLFwiXG5cbiAgLy8gVE9ETzogdHJ5IGNvbnZpbmNpbmcgbm9kZWpzLXBvbGFycyB0byBzdXBwb3J0IGVzY2FwZUNoYXJcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BvbGEtcnMvcG9sYXJzL2lzc3Vlcy8zMDc0XG4gIC8vb3B0aW9ucy5lc2NhcGVDaGFyID0gZGlhbGVjdD8uZXNjYXBlQ2hhclxuXG4gIG9wdGlvbnMucXVvdGVDaGFyID0gZGlhbGVjdD8ucXVvdGVDaGFyID8/ICdcIidcbiAgb3B0aW9ucy5udWxsVmFsdWVzID0gZGlhbGVjdD8ubnVsbFNlcXVlbmNlXG5cbiAgLy8gVE9ETzogdHJ5IGNvbnZpbmNpbmcgbm9kZWpzLXBvbGFycyB0byBzdXBwb3J0IGRvdWJsZVF1b3RlXG4gIC8vb3B0aW9ucy5kb3VibGVRdW90ZSA9IGRpYWxlY3Q/LmRvdWJsZVF1b3RlID8/IHRydWVcblxuICAvLyBUT0RPOiByZW1vdmUgdHMtaWdub3JlIHdoZW4gaXNzdWVzIGlzIGZpeGVkXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb2xhLXJzL25vZGVqcy1wb2xhcnMvaXNzdWVzLzMzNFxuICAvLyBAdHMtaWdub3JlXG4gIG9wdGlvbnMuY29tbWVudFByZWZpeCA9IGRpYWxlY3Q/LmNvbW1lbnRDaGFyXG5cbiAgcmV0dXJuIG9wdGlvbnNcbn1cblxuZnVuY3Rpb24gZ2V0Um93c1RvU2tpcChkaWFsZWN0PzogRGlhbGVjdCkge1xuICBjb25zdCBoZWFkZXJSb3dzID0gZ2V0SGVhZGVyUm93cyhkaWFsZWN0KVxuICByZXR1cm4gaGVhZGVyUm93c1swXSA/IGhlYWRlclJvd3NbMF0gLSAxIDogMFxufVxuXG5mdW5jdGlvbiBnZXRIZWFkZXJSb3dzKGRpYWxlY3Q/OiBEaWFsZWN0KSB7XG4gIHJldHVybiBkaWFsZWN0Py5oZWFkZXIgIT09IGZhbHNlID8gKGRpYWxlY3Q/LmhlYWRlclJvd3MgPz8gWzFdKSA6IFtdXG59XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};