@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.
- package/LICENSE.md +9 -0
- package/README.md +3 -0
- package/build/assets/geojson.json +216 -0
- package/build/assets/topojson.json +259 -0
- package/build/data/index.d.ts +2 -0
- package/build/data/index.js +2 -0
- package/build/data/record.d.ts +4 -0
- package/build/data/record.js +84 -0
- package/build/data/record.spec.d.ts +1 -0
- package/build/data/record.spec.js +269 -0
- package/build/dialect/Options.d.ts +3 -0
- package/build/dialect/Options.js +3 -0
- package/build/dialect/index.d.ts +2 -0
- package/build/dialect/index.js +2 -0
- package/build/dialect/infer.d.ts +4 -0
- package/build/dialect/infer.js +2 -0
- package/build/field/Field.d.ts +5 -0
- package/build/field/Field.js +2 -0
- package/build/field/Mapping.d.ts +11 -0
- package/build/field/Mapping.js +2 -0
- package/build/field/checks/enum.d.ts +8 -0
- package/build/field/checks/enum.js +71 -0
- package/build/field/checks/enum.spec.d.ts +1 -0
- package/build/field/checks/enum.spec.js +327 -0
- package/build/field/checks/maxLength.d.ts +7 -0
- package/build/field/checks/maxLength.js +17 -0
- package/build/field/checks/maxLength.spec.d.ts +1 -0
- package/build/field/checks/maxLength.spec.js +49 -0
- package/build/field/checks/maximum.d.ts +11 -0
- package/build/field/checks/maximum.js +73 -0
- package/build/field/checks/maximum.spec.d.ts +1 -0
- package/build/field/checks/maximum.spec.js +476 -0
- package/build/field/checks/minLength.d.ts +7 -0
- package/build/field/checks/minLength.js +17 -0
- package/build/field/checks/minLength.spec.d.ts +1 -0
- package/build/field/checks/minLength.spec.js +56 -0
- package/build/field/checks/minimum.d.ts +11 -0
- package/build/field/checks/minimum.js +73 -0
- package/build/field/checks/minimum.spec.d.ts +1 -0
- package/build/field/checks/minimum.spec.js +476 -0
- package/build/field/checks/pattern.d.ts +7 -0
- package/build/field/checks/pattern.js +17 -0
- package/build/field/checks/pattern.spec.d.ts +1 -0
- package/build/field/checks/pattern.spec.js +66 -0
- package/build/field/checks/required.d.ts +7 -0
- package/build/field/checks/required.js +14 -0
- package/build/field/checks/required.spec.d.ts +1 -0
- package/build/field/checks/required.spec.js +24 -0
- package/build/field/checks/type.d.ts +7 -0
- package/build/field/checks/type.js +14 -0
- package/build/field/checks/type.spec.d.ts +1 -0
- package/build/field/checks/type.spec.js +255 -0
- package/build/field/checks/unique.d.ts +7 -0
- package/build/field/checks/unique.js +17 -0
- package/build/field/checks/unique.spec.d.ts +1 -0
- package/build/field/checks/unique.spec.js +97 -0
- package/build/field/denormalize.d.ts +6 -0
- package/build/field/denormalize.js +13 -0
- package/build/field/desubstitute.d.ts +3 -0
- package/build/field/desubstitute.js +13 -0
- package/build/field/index.d.ts +8 -0
- package/build/field/index.js +6 -0
- package/build/field/inspect.d.ts +6 -0
- package/build/field/inspect.js +131 -0
- package/build/field/inspect.spec.d.ts +1 -0
- package/build/field/inspect.spec.js +385 -0
- package/build/field/narrow.d.ts +3 -0
- package/build/field/narrow.js +14 -0
- package/build/field/narrow.spec.d.ts +1 -0
- package/build/field/narrow.spec.js +52 -0
- package/build/field/normalize.d.ts +5 -0
- package/build/field/normalize.js +14 -0
- package/build/field/parse.d.ts +3 -0
- package/build/field/parse.js +47 -0
- package/build/field/parse.spec.d.ts +1 -0
- package/build/field/parse.spec.js +33 -0
- package/build/field/stringify.d.ts +3 -0
- package/build/field/stringify.js +43 -0
- package/build/field/stringify.spec.d.ts +1 -0
- package/build/field/stringify.spec.js +41 -0
- package/build/field/substitute.d.ts +3 -0
- package/build/field/substitute.js +16 -0
- package/build/field/types/array.d.ts +3 -0
- package/build/field/types/array.js +5 -0
- package/build/field/types/array.spec.d.ts +1 -0
- package/build/field/types/array.spec.js +358 -0
- package/build/field/types/boolean.d.ts +4 -0
- package/build/field/types/boolean.js +31 -0
- package/build/field/types/boolean.spec.d.ts +1 -0
- package/build/field/types/boolean.spec.js +76 -0
- package/build/field/types/date.d.ts +4 -0
- package/build/field/types/date.js +14 -0
- package/build/field/types/date.spec.d.ts +1 -0
- package/build/field/types/date.spec.js +52 -0
- package/build/field/types/datetime.d.ts +4 -0
- package/build/field/types/datetime.js +15 -0
- package/build/field/types/datetime.spec.d.ts +1 -0
- package/build/field/types/datetime.spec.js +62 -0
- package/build/field/types/duration.d.ts +4 -0
- package/build/field/types/duration.js +9 -0
- package/build/field/types/duration.spec.d.ts +1 -0
- package/build/field/types/duration.spec.js +37 -0
- package/build/field/types/geojson.d.ts +3 -0
- package/build/field/types/geojson.js +9 -0
- package/build/field/types/geojson.spec.d.ts +1 -0
- package/build/field/types/geojson.spec.js +522 -0
- package/build/field/types/geopoint.d.ts +4 -0
- package/build/field/types/geopoint.js +59 -0
- package/build/field/types/geopoint.spec.d.ts +1 -0
- package/build/field/types/geopoint.spec.js +173 -0
- package/build/field/types/integer.d.ts +4 -0
- package/build/field/types/integer.js +41 -0
- package/build/field/types/integer.spec.d.ts +1 -0
- package/build/field/types/integer.spec.js +102 -0
- package/build/field/types/json.d.ts +6 -0
- package/build/field/types/json.js +68 -0
- package/build/field/types/list.d.ts +4 -0
- package/build/field/types/list.js +30 -0
- package/build/field/types/list.spec.d.ts +1 -0
- package/build/field/types/list.spec.js +230 -0
- package/build/field/types/number.d.ts +4 -0
- package/build/field/types/number.js +50 -0
- package/build/field/types/number.spec.d.ts +1 -0
- package/build/field/types/number.spec.js +101 -0
- package/build/field/types/object.d.ts +3 -0
- package/build/field/types/object.js +5 -0
- package/build/field/types/object.spec.d.ts +1 -0
- package/build/field/types/object.spec.js +393 -0
- package/build/field/types/string.d.ts +4 -0
- package/build/field/types/string.js +32 -0
- package/build/field/types/string.spec.d.ts +1 -0
- package/build/field/types/string.spec.js +162 -0
- package/build/field/types/time.d.ts +4 -0
- package/build/field/types/time.js +18 -0
- package/build/field/types/time.spec.d.ts +1 -0
- package/build/field/types/time.spec.js +53 -0
- package/build/field/types/year.d.ts +4 -0
- package/build/field/types/year.js +16 -0
- package/build/field/types/year.spec.d.ts +1 -0
- package/build/field/types/year.spec.js +50 -0
- package/build/field/types/yearmonth.d.ts +4 -0
- package/build/field/types/yearmonth.js +14 -0
- package/build/field/types/yearmonth.spec.d.ts +1 -0
- package/build/field/types/yearmonth.spec.js +36 -0
- package/build/helpers.d.ts +4 -0
- package/build/helpers.js +12 -0
- package/build/index.d.ts +40 -0
- package/build/index.js +27 -0
- package/build/plugin.d.ts +27 -0
- package/build/plugin.js +2 -0
- package/build/plugins/arrow/index.d.ts +2 -0
- package/build/plugins/arrow/index.js +3 -0
- package/build/plugins/arrow/plugin.d.ts +7 -0
- package/build/plugins/arrow/plugin.js +22 -0
- package/build/plugins/arrow/plugin.spec.d.ts +1 -0
- package/build/plugins/arrow/plugin.spec.js +161 -0
- package/build/plugins/arrow/table/index.d.ts +2 -0
- package/build/plugins/arrow/table/index.js +3 -0
- package/build/plugins/arrow/table/load.d.ts +4 -0
- package/build/plugins/arrow/table/load.js +23 -0
- package/build/plugins/arrow/table/load.spec.d.ts +1 -0
- package/build/plugins/arrow/table/load.spec.js +56 -0
- package/build/plugins/arrow/table/save.d.ts +3 -0
- package/build/plugins/arrow/table/save.js +31 -0
- package/build/plugins/arrow/table/save.spec.d.ts +1 -0
- package/build/plugins/arrow/table/save.spec.js +81 -0
- package/build/plugins/csv/dialect/index.d.ts +1 -0
- package/build/plugins/csv/dialect/index.js +2 -0
- package/build/plugins/csv/dialect/infer.d.ts +4 -0
- package/build/plugins/csv/dialect/infer.js +44 -0
- package/build/plugins/csv/dialect/infer.spec.d.ts +1 -0
- package/build/plugins/csv/dialect/infer.spec.js +54 -0
- package/build/plugins/csv/index.d.ts +2 -0
- package/build/plugins/csv/index.js +3 -0
- package/build/plugins/csv/plugin.d.ts +8 -0
- package/build/plugins/csv/plugin.js +22 -0
- package/build/plugins/csv/plugin.spec.d.ts +1 -0
- package/build/plugins/csv/plugin.spec.js +161 -0
- package/build/plugins/csv/table/index.d.ts +2 -0
- package/build/plugins/csv/table/index.js +3 -0
- package/build/plugins/csv/table/load.d.ts +6 -0
- package/build/plugins/csv/table/load.js +86 -0
- package/build/plugins/csv/table/load.spec.d.ts +1 -0
- package/build/plugins/csv/table/load.spec.js +293 -0
- package/build/plugins/csv/table/save.d.ts +5 -0
- package/build/plugins/csv/table/save.js +29 -0
- package/build/plugins/csv/table/save.spec.d.ts +1 -0
- package/build/plugins/csv/table/save.spec.js +137 -0
- package/build/plugins/inline/index.d.ts +2 -0
- package/build/plugins/inline/index.js +3 -0
- package/build/plugins/inline/plugin.d.ts +7 -0
- package/build/plugins/inline/plugin.js +14 -0
- package/build/plugins/inline/table/index.d.ts +1 -0
- package/build/plugins/inline/table/index.js +2 -0
- package/build/plugins/inline/table/load.d.ts +6 -0
- package/build/plugins/inline/table/load.js +24 -0
- package/build/plugins/inline/table/load.spec.d.ts +1 -0
- package/build/plugins/inline/table/load.spec.js +160 -0
- package/build/plugins/json/buffer/decode.d.ts +4 -0
- package/build/plugins/json/buffer/decode.js +10 -0
- package/build/plugins/json/buffer/encode.d.ts +4 -0
- package/build/plugins/json/buffer/encode.js +8 -0
- package/build/plugins/json/buffer/index.d.ts +2 -0
- package/build/plugins/json/buffer/index.js +3 -0
- package/build/plugins/json/index.d.ts +2 -0
- package/build/plugins/json/index.js +3 -0
- package/build/plugins/json/plugin.d.ts +7 -0
- package/build/plugins/json/plugin.js +25 -0
- package/build/plugins/json/plugin.spec.d.ts +1 -0
- package/build/plugins/json/plugin.spec.js +163 -0
- package/build/plugins/json/table/index.d.ts +2 -0
- package/build/plugins/json/table/index.js +3 -0
- package/build/plugins/json/table/load.d.ts +6 -0
- package/build/plugins/json/table/load.js +55 -0
- package/build/plugins/json/table/load.spec.d.ts +1 -0
- package/build/plugins/json/table/load.spec.js +200 -0
- package/build/plugins/json/table/parse.d.ts +3 -0
- package/build/plugins/json/table/parse.js +6 -0
- package/build/plugins/json/table/save.d.ts +5 -0
- package/build/plugins/json/table/save.js +45 -0
- package/build/plugins/json/table/save.spec.d.ts +1 -0
- package/build/plugins/json/table/save.spec.js +147 -0
- package/build/plugins/ods/index.d.ts +2 -0
- package/build/plugins/ods/index.js +3 -0
- package/build/plugins/ods/plugin.d.ts +7 -0
- package/build/plugins/ods/plugin.js +23 -0
- package/build/plugins/ods/plugin.spec.d.ts +1 -0
- package/build/plugins/ods/plugin.spec.js +142 -0
- package/build/plugins/ods/table/index.d.ts +2 -0
- package/build/plugins/ods/table/index.js +3 -0
- package/build/plugins/ods/table/load.d.ts +4 -0
- package/build/plugins/ods/table/load.js +41 -0
- package/build/plugins/ods/table/load.spec.d.ts +1 -0
- package/build/plugins/ods/table/load.spec.js +167 -0
- package/build/plugins/ods/table/save.d.ts +3 -0
- package/build/plugins/ods/table/save.js +26 -0
- package/build/plugins/ods/table/save.spec.d.ts +1 -0
- package/build/plugins/ods/table/save.spec.js +75 -0
- package/build/plugins/ods/table/test.d.ts +5 -0
- package/build/plugins/ods/table/test.js +23 -0
- package/build/plugins/parquet/index.d.ts +2 -0
- package/build/plugins/parquet/index.js +3 -0
- package/build/plugins/parquet/plugin.d.ts +7 -0
- package/build/plugins/parquet/plugin.js +23 -0
- package/build/plugins/parquet/plugin.spec.d.ts +1 -0
- package/build/plugins/parquet/plugin.spec.js +142 -0
- package/build/plugins/parquet/table/index.d.ts +2 -0
- package/build/plugins/parquet/table/index.js +3 -0
- package/build/plugins/parquet/table/load.d.ts +4 -0
- package/build/plugins/parquet/table/load.js +23 -0
- package/build/plugins/parquet/table/load.spec.d.ts +1 -0
- package/build/plugins/parquet/table/load.spec.js +56 -0
- package/build/plugins/parquet/table/save.d.ts +3 -0
- package/build/plugins/parquet/table/save.js +32 -0
- package/build/plugins/parquet/table/save.spec.d.ts +1 -0
- package/build/plugins/parquet/table/save.spec.js +81 -0
- package/build/plugins/xlxs/index.d.ts +2 -0
- package/build/plugins/xlxs/index.js +3 -0
- package/build/plugins/xlxs/plugin.d.ts +7 -0
- package/build/plugins/xlxs/plugin.js +23 -0
- package/build/plugins/xlxs/plugin.spec.d.ts +1 -0
- package/build/plugins/xlxs/plugin.spec.js +142 -0
- package/build/plugins/xlxs/table/index.d.ts +2 -0
- package/build/plugins/xlxs/table/index.js +3 -0
- package/build/plugins/xlxs/table/load.d.ts +4 -0
- package/build/plugins/xlxs/table/load.js +43 -0
- package/build/plugins/xlxs/table/load.spec.d.ts +1 -0
- package/build/plugins/xlxs/table/load.spec.js +167 -0
- package/build/plugins/xlxs/table/save.d.ts +3 -0
- package/build/plugins/xlxs/table/save.js +28 -0
- package/build/plugins/xlxs/table/save.spec.d.ts +1 -0
- package/build/plugins/xlxs/table/save.spec.js +75 -0
- package/build/plugins/xlxs/table/test.d.ts +5 -0
- package/build/plugins/xlxs/table/test.js +23 -0
- package/build/schema/Mapping.d.ts +6 -0
- package/build/schema/Mapping.js +2 -0
- package/build/schema/Options.d.ts +22 -0
- package/build/schema/Options.js +2 -0
- package/build/schema/Schema.d.ts +4 -0
- package/build/schema/Schema.js +2 -0
- package/build/schema/helpers.d.ts +3 -0
- package/build/schema/helpers.js +6 -0
- package/build/schema/index.d.ts +8 -0
- package/build/schema/index.js +5 -0
- package/build/schema/infer.d.ts +13 -0
- package/build/schema/infer.js +199 -0
- package/build/schema/infer.spec.d.ts +1 -0
- package/build/schema/infer.spec.js +304 -0
- package/build/schema/match.d.ts +6 -0
- package/build/schema/match.js +8 -0
- package/build/table/Frame.d.ts +2 -0
- package/build/table/Frame.js +2 -0
- package/build/table/Table.d.ts +2 -0
- package/build/table/Table.js +2 -0
- package/build/table/checks/unique.d.ts +7 -0
- package/build/table/checks/unique.js +23 -0
- package/build/table/checks/unique.spec.d.ts +1 -0
- package/build/table/checks/unique.spec.js +187 -0
- package/build/table/denormalize.d.ts +6 -0
- package/build/table/denormalize.js +15 -0
- package/build/table/helpers.d.ts +19 -0
- package/build/table/helpers.js +62 -0
- package/build/table/helpers.spec.d.ts +1 -0
- package/build/table/helpers.spec.js +352 -0
- package/build/table/index.d.ts +9 -0
- package/build/table/index.js +8 -0
- package/build/table/inspect.d.ts +8 -0
- package/build/table/inspect.js +165 -0
- package/build/table/inspect.spec.d.ts +1 -0
- package/build/table/inspect.spec.js +335 -0
- package/build/table/normalize.d.ts +6 -0
- package/build/table/normalize.js +27 -0
- package/build/table/normalize.spec.d.ts +1 -0
- package/build/table/normalize.spec.js +222 -0
- package/build/table/query.d.ts +3 -0
- package/build/table/query.js +6 -0
- 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 {};
|