@frictionless-ts/metadata 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/README.md +3 -0
- package/build/assets/dialect-1.0.json +58 -0
- package/build/assets/dialect-2.0.json +98 -0
- package/build/assets/package-1.0.json +1517 -0
- package/build/assets/package-2.0.json +2168 -0
- package/build/assets/resource-1.0.json +1353 -0
- package/build/assets/resource-2.0.json +1987 -0
- package/build/assets/schema-1.0.json +1126 -0
- package/build/assets/schema-2.0.json +1715 -0
- package/build/descriptor/Descriptor.d.ts +2 -0
- package/build/descriptor/Descriptor.js +4 -0
- package/build/descriptor/index.d.ts +6 -0
- package/build/descriptor/index.js +6 -0
- package/build/descriptor/load.d.ts +8 -0
- package/build/descriptor/load.js +36 -0
- package/build/descriptor/load.spec.d.ts +1 -0
- package/build/descriptor/load.spec.js +44 -0
- package/build/descriptor/process/parse.d.ts +2 -0
- package/build/descriptor/process/parse.js +8 -0
- package/build/descriptor/process/stringify.d.ts +2 -0
- package/build/descriptor/process/stringify.js +4 -0
- package/build/descriptor/save.d.ts +9 -0
- package/build/descriptor/save.js +19 -0
- package/build/descriptor/save.spec.d.ts +1 -0
- package/build/descriptor/save.spec.js +99 -0
- package/build/dialect/Dialect.d.ts +89 -0
- package/build/dialect/Dialect.js +2 -0
- package/build/dialect/assert.d.ts +6 -0
- package/build/dialect/assert.js +12 -0
- package/build/dialect/assert.spec.d.ts +1 -0
- package/build/dialect/assert.spec.js +22 -0
- package/build/dialect/convert/fromDescriptor.d.ts +2 -0
- package/build/dialect/convert/fromDescriptor.js +20 -0
- package/build/dialect/convert/toDescriptor.d.ts +3 -0
- package/build/dialect/convert/toDescriptor.js +5 -0
- package/build/dialect/index.d.ts +8 -0
- package/build/dialect/index.js +8 -0
- package/build/dialect/load.d.ts +5 -0
- package/build/dialect/load.js +12 -0
- package/build/dialect/load.spec.d.ts +1 -0
- package/build/dialect/load.spec.js +18 -0
- package/build/dialect/resolve.d.ts +2 -0
- package/build/dialect/resolve.js +11 -0
- package/build/dialect/save.d.ts +9 -0
- package/build/dialect/save.js +16 -0
- package/build/dialect/save.spec.d.ts +1 -0
- package/build/dialect/save.spec.js +52 -0
- package/build/dialect/validate.d.ts +10 -0
- package/build/dialect/validate.js +25 -0
- package/build/dialect/validate.spec.d.ts +1 -0
- package/build/dialect/validate.spec.js +28 -0
- package/build/error/Bound.d.ts +4 -0
- package/build/error/Bound.js +2 -0
- package/build/error/Error.d.ts +3 -0
- package/build/error/Error.js +2 -0
- package/build/error/Unbound.d.ts +6 -0
- package/build/error/Unbound.js +2 -0
- package/build/error/index.d.ts +16 -0
- package/build/error/index.js +2 -0
- package/build/error/types/Base.d.ts +3 -0
- package/build/error/types/Base.js +2 -0
- package/build/error/types/Bytes.d.ts +6 -0
- package/build/error/types/Bytes.js +2 -0
- package/build/error/types/Cell.d.ts +56 -0
- package/build/error/types/Cell.js +2 -0
- package/build/error/types/Data.d.ts +5 -0
- package/build/error/types/Data.js +2 -0
- package/build/error/types/Document.d.ts +7 -0
- package/build/error/types/Document.js +2 -0
- package/build/error/types/Encoding.d.ts +6 -0
- package/build/error/types/Encoding.js +2 -0
- package/build/error/types/Field.d.ts +15 -0
- package/build/error/types/Field.js +2 -0
- package/build/error/types/Fields.d.ts +11 -0
- package/build/error/types/Fields.js +2 -0
- package/build/error/types/File.d.ts +4 -0
- package/build/error/types/File.js +2 -0
- package/build/error/types/ForeignKey.d.ts +7 -0
- package/build/error/types/ForeignKey.js +2 -0
- package/build/error/types/Hash.d.ts +6 -0
- package/build/error/types/Hash.js +2 -0
- package/build/error/types/Metadata.d.ts +9 -0
- package/build/error/types/Metadata.js +2 -0
- package/build/error/types/Row.d.ts +9 -0
- package/build/error/types/Row.js +2 -0
- package/build/error/types/Table.d.ts +6 -0
- package/build/error/types/Table.js +2 -0
- package/build/field/Field.d.ts +5 -0
- package/build/field/Field.js +2 -0
- package/build/field/Type.d.ts +2 -0
- package/build/field/Type.js +2 -0
- package/build/field/convert/fromDescriptor.d.ts +2 -0
- package/build/field/convert/fromDescriptor.js +61 -0
- package/build/field/convert/fromDescriptor.spec.d.ts +1 -0
- package/build/field/convert/fromDescriptor.spec.js +241 -0
- package/build/field/convert/toDescriptor.d.ts +3 -0
- package/build/field/convert/toDescriptor.js +5 -0
- package/build/field/convert/toDescriptor.spec.d.ts +1 -0
- package/build/field/convert/toDescriptor.spec.js +291 -0
- package/build/field/index.d.ts +5 -0
- package/build/field/index.js +3 -0
- package/build/field/types/Any.d.ts +20 -0
- package/build/field/types/Any.js +2 -0
- package/build/field/types/Array.d.ts +32 -0
- package/build/field/types/Array.js +2 -0
- package/build/field/types/Base.d.ts +60 -0
- package/build/field/types/Base.js +2 -0
- package/build/field/types/Boolean.d.ts +28 -0
- package/build/field/types/Boolean.js +2 -0
- package/build/field/types/Date.d.ts +43 -0
- package/build/field/types/Date.js +2 -0
- package/build/field/types/Datetime.d.ts +43 -0
- package/build/field/types/Datetime.js +2 -0
- package/build/field/types/Duration.d.ts +28 -0
- package/build/field/types/Duration.js +2 -0
- package/build/field/types/Geojson.d.ts +30 -0
- package/build/field/types/Geojson.js +2 -0
- package/build/field/types/Geopoint.d.ts +27 -0
- package/build/field/types/Geopoint.js +2 -0
- package/build/field/types/Integer.d.ts +57 -0
- package/build/field/types/Integer.js +2 -0
- package/build/field/types/List.d.ts +36 -0
- package/build/field/types/List.js +2 -0
- package/build/field/types/Number.d.ts +48 -0
- package/build/field/types/Number.js +2 -0
- package/build/field/types/Object.d.ts +32 -0
- package/build/field/types/Object.js +2 -0
- package/build/field/types/String.d.ts +51 -0
- package/build/field/types/String.js +2 -0
- package/build/field/types/Time.d.ts +43 -0
- package/build/field/types/Time.js +2 -0
- package/build/field/types/Year.d.ts +36 -0
- package/build/field/types/Year.js +2 -0
- package/build/field/types/Yearmonth.d.ts +36 -0
- package/build/field/types/Yearmonth.js +2 -0
- package/build/field/types/index.d.ts +16 -0
- package/build/field/types/index.js +17 -0
- package/build/index.d.ts +112 -0
- package/build/index.js +32 -0
- package/build/json/Schema.d.ts +2 -0
- package/build/json/Schema.js +2 -0
- package/build/json/Value.d.ts +1 -0
- package/build/json/Value.js +2 -0
- package/build/json/ajv.d.ts +2 -0
- package/build/json/ajv.js +10 -0
- package/build/json/assert.d.ts +2 -0
- package/build/json/assert.js +10 -0
- package/build/json/cache.d.ts +2 -0
- package/build/json/cache.js +5 -0
- package/build/json/index.d.ts +5 -0
- package/build/json/index.js +4 -0
- package/build/json/inspect/schema.d.ts +4 -0
- package/build/json/inspect/schema.js +10 -0
- package/build/json/inspect/schema.spec.d.ts +1 -0
- package/build/json/inspect/schema.spec.js +132 -0
- package/build/json/inspect/value.d.ts +11 -0
- package/build/json/inspect/value.js +21 -0
- package/build/json/inspect/value.spec.d.ts +1 -0
- package/build/json/inspect/value.spec.js +121 -0
- package/build/json/load.d.ts +3 -0
- package/build/json/load.js +13 -0
- package/build/json/resolve.d.ts +2 -0
- package/build/json/resolve.js +11 -0
- package/build/metadata/Metadata.d.ts +3 -0
- package/build/metadata/Metadata.js +2 -0
- package/build/metadata/index.d.ts +1 -0
- package/build/metadata/index.js +2 -0
- package/build/package/Contributor.d.ts +21 -0
- package/build/package/Contributor.js +2 -0
- package/build/package/Package.d.ts +64 -0
- package/build/package/Package.js +2 -0
- package/build/package/assert.d.ts +8 -0
- package/build/package/assert.js +12 -0
- package/build/package/assert.spec.d.ts +1 -0
- package/build/package/assert.spec.js +26 -0
- package/build/package/convert/fromDescriptor.d.ts +4 -0
- package/build/package/convert/fromDescriptor.js +36 -0
- package/build/package/convert/toDescriptor.d.ts +5 -0
- package/build/package/convert/toDescriptor.js +7 -0
- package/build/package/index.d.ts +8 -0
- package/build/package/index.js +7 -0
- package/build/package/load.d.ts +5 -0
- package/build/package/load.js +14 -0
- package/build/package/load.spec.d.ts +1 -0
- package/build/package/load.spec.js +28 -0
- package/build/package/save.d.ts +9 -0
- package/build/package/save.js +18 -0
- package/build/package/save.spec.d.ts +1 -0
- package/build/package/save.spec.js +311 -0
- package/build/package/validate.d.ts +12 -0
- package/build/package/validate.js +27 -0
- package/build/package/validate.spec.d.ts +1 -0
- package/build/package/validate.spec.js +41 -0
- package/build/path/basepath.d.ts +2 -0
- package/build/path/basepath.js +25 -0
- package/build/path/basepath.spec.d.ts +1 -0
- package/build/path/basepath.spec.js +55 -0
- package/build/path/denormalize.d.ts +3 -0
- package/build/path/denormalize.js +29 -0
- package/build/path/denormalize.spec.d.ts +1 -0
- package/build/path/denormalize.spec.js +45 -0
- package/build/path/index.d.ts +5 -0
- package/build/path/index.js +6 -0
- package/build/path/normalize.d.ts +6 -0
- package/build/path/normalize.js +54 -0
- package/build/path/normalize.spec.d.ts +1 -0
- package/build/path/normalize.spec.js +71 -0
- package/build/path/path.d.ts +5 -0
- package/build/path/path.js +48 -0
- package/build/path/path.spec.d.ts +1 -0
- package/build/path/path.spec.js +111 -0
- package/build/platform/index.d.ts +1 -0
- package/build/platform/index.js +2 -0
- package/build/platform/node.d.ts +130 -0
- package/build/platform/node.js +10 -0
- package/build/platform/node.spec.d.ts +1 -0
- package/build/platform/node.spec.js +16 -0
- package/build/profile/@minify.d.ts +1 -0
- package/build/profile/@minify.js +58 -0
- package/build/profile/Profile.d.ts +9 -0
- package/build/profile/Profile.js +2 -0
- package/build/profile/assert.d.ts +6 -0
- package/build/profile/assert.js +36 -0
- package/build/profile/assert.spec.d.ts +1 -0
- package/build/profile/assert.spec.js +115 -0
- package/build/profile/index.d.ts +2 -0
- package/build/profile/index.js +2 -0
- package/build/profile/load.d.ts +4 -0
- package/build/profile/load.js +12 -0
- package/build/profile/registry.d.ts +2 -0
- package/build/profile/registry.js +83 -0
- package/build/profile/resolve.d.ts +2 -0
- package/build/profile/resolve.js +8 -0
- package/build/profile/validate.d.ts +9 -0
- package/build/profile/validate.js +12 -0
- package/build/report/Report.d.ts +5 -0
- package/build/report/Report.js +2 -0
- package/build/report/create.d.ts +7 -0
- package/build/report/create.js +6 -0
- package/build/report/index.d.ts +2 -0
- package/build/report/index.js +2 -0
- package/build/resource/License.d.ts +18 -0
- package/build/resource/License.js +2 -0
- package/build/resource/Resource.d.ts +93 -0
- package/build/resource/Resource.js +2 -0
- package/build/resource/Source.d.ts +17 -0
- package/build/resource/Source.js +2 -0
- package/build/resource/assert.d.ts +8 -0
- package/build/resource/assert.js +12 -0
- package/build/resource/assert.spec.d.ts +1 -0
- package/build/resource/assert.spec.js +23 -0
- package/build/resource/convert/fromDescriptor.d.ts +4 -0
- package/build/resource/convert/fromDescriptor.js +69 -0
- package/build/resource/convert/toDescriptor.d.ts +5 -0
- package/build/resource/convert/toDescriptor.js +36 -0
- package/build/resource/helpers.d.ts +2 -0
- package/build/resource/helpers.js +6 -0
- package/build/resource/index.d.ts +11 -0
- package/build/resource/index.js +9 -0
- package/build/resource/infer.d.ts +3 -0
- package/build/resource/infer.js +35 -0
- package/build/resource/infer.spec.d.ts +1 -0
- package/build/resource/infer.spec.js +103 -0
- package/build/resource/load.d.ts +5 -0
- package/build/resource/load.js +14 -0
- package/build/resource/load.spec.d.ts +1 -0
- package/build/resource/load.spec.js +22 -0
- package/build/resource/save.d.ts +9 -0
- package/build/resource/save.js +18 -0
- package/build/resource/save.spec.d.ts +1 -0
- package/build/resource/save.spec.js +170 -0
- package/build/resource/validate.d.ts +13 -0
- package/build/resource/validate.js +57 -0
- package/build/resource/validate.spec.d.ts +1 -0
- package/build/resource/validate.spec.js +30 -0
- package/build/schema/ForeignKey.d.ts +23 -0
- package/build/schema/ForeignKey.js +2 -0
- package/build/schema/Schema.d.ts +56 -0
- package/build/schema/Schema.js +2 -0
- package/build/schema/assert.d.ts +6 -0
- package/build/schema/assert.js +12 -0
- package/build/schema/assert.spec.d.ts +1 -0
- package/build/schema/assert.spec.js +34 -0
- package/build/schema/convert/fromDescriptor.d.ts +2 -0
- package/build/schema/convert/fromDescriptor.js +70 -0
- package/build/schema/convert/fromJsonSchema.d.ts +3 -0
- package/build/schema/convert/fromJsonSchema.js +105 -0
- package/build/schema/convert/fromJsonSchema.spec.d.ts +1 -0
- package/build/schema/convert/fromJsonSchema.spec.js +156 -0
- package/build/schema/convert/toDescriptor.d.ts +3 -0
- package/build/schema/convert/toDescriptor.js +5 -0
- package/build/schema/convert/toJsonSchema.d.ts +3 -0
- package/build/schema/convert/toJsonSchema.js +173 -0
- package/build/schema/convert/toJsonSchema.spec.d.ts +1 -0
- package/build/schema/convert/toJsonSchema.spec.js +403 -0
- package/build/schema/index.d.ts +11 -0
- package/build/schema/index.js +10 -0
- package/build/schema/load.d.ts +5 -0
- package/build/schema/load.js +12 -0
- package/build/schema/load.spec.d.ts +1 -0
- package/build/schema/load.spec.js +55 -0
- package/build/schema/resolve.d.ts +2 -0
- package/build/schema/resolve.js +11 -0
- package/build/schema/save.d.ts +9 -0
- package/build/schema/save.js +16 -0
- package/build/schema/save.spec.d.ts +1 -0
- package/build/schema/save.spec.js +58 -0
- package/build/schema/validate.d.ts +10 -0
- package/build/schema/validate.js +25 -0
- package/build/schema/validate.spec.d.ts +1 -0
- package/build/schema/validate.spec.js +41 -0
- package/package.json +37 -0
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { convertFieldFromDescriptor } from "./fromDescriptor.js";
|
|
3
|
+
describe("convertFieldFromDescriptor", () => {
|
|
4
|
+
it("should return a cloned descriptor", () => {
|
|
5
|
+
const descriptor = { name: "id", type: "string" };
|
|
6
|
+
const result = convertFieldFromDescriptor(descriptor);
|
|
7
|
+
expect(result).toEqual(descriptor);
|
|
8
|
+
expect(result).not.toBe(descriptor);
|
|
9
|
+
});
|
|
10
|
+
describe("format conversion", () => {
|
|
11
|
+
it("should remove fmt: prefix from format", () => {
|
|
12
|
+
const descriptor = { name: "id", type: "string", format: "fmt:email" };
|
|
13
|
+
const result = convertFieldFromDescriptor(descriptor);
|
|
14
|
+
expect(result.format).toBe("email");
|
|
15
|
+
});
|
|
16
|
+
it("should preserve format without fmt: prefix", () => {
|
|
17
|
+
const descriptor = { name: "id", type: "string", format: "email" };
|
|
18
|
+
const result = convertFieldFromDescriptor(descriptor);
|
|
19
|
+
expect(result.format).toBe("email");
|
|
20
|
+
});
|
|
21
|
+
it("should handle descriptor without format", () => {
|
|
22
|
+
const descriptor = { name: "id", type: "string" };
|
|
23
|
+
const result = convertFieldFromDescriptor(descriptor);
|
|
24
|
+
expect(result.format).toBeUndefined();
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
describe("missingValues validation", () => {
|
|
28
|
+
it("should preserve valid missingValues array", () => {
|
|
29
|
+
const descriptor = {
|
|
30
|
+
name: "id",
|
|
31
|
+
type: "string",
|
|
32
|
+
missingValues: ["", "NA", "N/A"],
|
|
33
|
+
};
|
|
34
|
+
const result = convertFieldFromDescriptor(descriptor);
|
|
35
|
+
expect(result.missingValues).toEqual(["", "NA", "N/A"]);
|
|
36
|
+
});
|
|
37
|
+
it("should remove invalid non-array missingValues and warn", () => {
|
|
38
|
+
const consoleWarnSpy = vi
|
|
39
|
+
.spyOn(console, "warn")
|
|
40
|
+
.mockImplementation(() => { });
|
|
41
|
+
const descriptor = {
|
|
42
|
+
name: "id",
|
|
43
|
+
type: "string",
|
|
44
|
+
missingValues: "invalid",
|
|
45
|
+
};
|
|
46
|
+
const result = convertFieldFromDescriptor(descriptor);
|
|
47
|
+
expect(result.missingValues).toBeUndefined();
|
|
48
|
+
expect(consoleWarnSpy).toHaveBeenCalledWith("Ignoring v2.0 incompatible missingValues: invalid");
|
|
49
|
+
consoleWarnSpy.mockRestore();
|
|
50
|
+
});
|
|
51
|
+
it("should handle descriptor without missingValues", () => {
|
|
52
|
+
const descriptor = { name: "id", type: "string" };
|
|
53
|
+
const result = convertFieldFromDescriptor(descriptor);
|
|
54
|
+
expect(result.missingValues).toBeUndefined();
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
describe("categories validation", () => {
|
|
58
|
+
it("should preserve valid categories array", () => {
|
|
59
|
+
const descriptor = {
|
|
60
|
+
name: "status",
|
|
61
|
+
type: "string",
|
|
62
|
+
categories: ["active", "inactive", "pending"],
|
|
63
|
+
};
|
|
64
|
+
const result = convertFieldFromDescriptor(descriptor);
|
|
65
|
+
expect(result.categories).toEqual(["active", "inactive", "pending"]);
|
|
66
|
+
});
|
|
67
|
+
it("should remove invalid non-array categories and warn", () => {
|
|
68
|
+
const consoleWarnSpy = vi
|
|
69
|
+
.spyOn(console, "warn")
|
|
70
|
+
.mockImplementation(() => { });
|
|
71
|
+
const descriptor = {
|
|
72
|
+
name: "status",
|
|
73
|
+
type: "string",
|
|
74
|
+
categories: "invalid",
|
|
75
|
+
};
|
|
76
|
+
const result = convertFieldFromDescriptor(descriptor);
|
|
77
|
+
expect(result.categories).toBeUndefined();
|
|
78
|
+
expect(consoleWarnSpy).toHaveBeenCalledWith("Ignoring v2.0 incompatible categories: invalid");
|
|
79
|
+
consoleWarnSpy.mockRestore();
|
|
80
|
+
});
|
|
81
|
+
it("should handle descriptor without categories", () => {
|
|
82
|
+
const descriptor = { name: "status", type: "string" };
|
|
83
|
+
const result = convertFieldFromDescriptor(descriptor);
|
|
84
|
+
expect(result.categories).toBeUndefined();
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
describe("categoriesOrdered validation", () => {
|
|
88
|
+
it("should preserve valid categoriesOrdered boolean", () => {
|
|
89
|
+
const descriptor = {
|
|
90
|
+
name: "status",
|
|
91
|
+
type: "string",
|
|
92
|
+
categoriesOrdered: true,
|
|
93
|
+
};
|
|
94
|
+
const result = convertFieldFromDescriptor(descriptor);
|
|
95
|
+
expect(result.categoriesOrdered).toBe(true);
|
|
96
|
+
});
|
|
97
|
+
it("should remove invalid non-boolean categoriesOrdered and warn", () => {
|
|
98
|
+
const consoleWarnSpy = vi
|
|
99
|
+
.spyOn(console, "warn")
|
|
100
|
+
.mockImplementation(() => { });
|
|
101
|
+
const descriptor = {
|
|
102
|
+
name: "status",
|
|
103
|
+
type: "string",
|
|
104
|
+
categoriesOrdered: "invalid",
|
|
105
|
+
};
|
|
106
|
+
const result = convertFieldFromDescriptor(descriptor);
|
|
107
|
+
expect(result.categoriesOrdered).toBeUndefined();
|
|
108
|
+
expect(consoleWarnSpy).toHaveBeenCalledWith("Ignoring v2.0 incompatible categoriesOrdered: invalid");
|
|
109
|
+
consoleWarnSpy.mockRestore();
|
|
110
|
+
});
|
|
111
|
+
it("should handle descriptor without categoriesOrdered", () => {
|
|
112
|
+
const descriptor = { name: "status", type: "string" };
|
|
113
|
+
const result = convertFieldFromDescriptor(descriptor);
|
|
114
|
+
expect(result.categoriesOrdered).toBeUndefined();
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
describe("jsonschema validation", () => {
|
|
118
|
+
it("should preserve valid jsonschema object", () => {
|
|
119
|
+
const descriptor = {
|
|
120
|
+
name: "data",
|
|
121
|
+
type: "object",
|
|
122
|
+
jsonschema: { type: "object", properties: { id: { type: "number" } } },
|
|
123
|
+
};
|
|
124
|
+
const result = convertFieldFromDescriptor(descriptor);
|
|
125
|
+
expect(result.jsonschema).toEqual({
|
|
126
|
+
type: "object",
|
|
127
|
+
properties: { id: { type: "number" } },
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
it("should remove invalid non-object jsonschema and warn", () => {
|
|
131
|
+
const consoleWarnSpy = vi
|
|
132
|
+
.spyOn(console, "warn")
|
|
133
|
+
.mockImplementation(() => { });
|
|
134
|
+
const descriptor = {
|
|
135
|
+
name: "data",
|
|
136
|
+
type: "object",
|
|
137
|
+
jsonschema: "invalid",
|
|
138
|
+
};
|
|
139
|
+
const result = convertFieldFromDescriptor(descriptor);
|
|
140
|
+
expect(result.jsonschema).toBeUndefined();
|
|
141
|
+
expect(consoleWarnSpy).toHaveBeenCalledWith("Ignoring v2.0 incompatible jsonschema: invalid");
|
|
142
|
+
consoleWarnSpy.mockRestore();
|
|
143
|
+
});
|
|
144
|
+
it("should handle descriptor without jsonschema", () => {
|
|
145
|
+
const descriptor = { name: "data", type: "object" };
|
|
146
|
+
const result = convertFieldFromDescriptor(descriptor);
|
|
147
|
+
expect(result.jsonschema).toBeUndefined();
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
describe("combined conversions", () => {
|
|
151
|
+
it("should apply all conversions together", () => {
|
|
152
|
+
const consoleWarnSpy = vi
|
|
153
|
+
.spyOn(console, "warn")
|
|
154
|
+
.mockImplementation(() => { });
|
|
155
|
+
const descriptor = {
|
|
156
|
+
name: "email",
|
|
157
|
+
type: "string",
|
|
158
|
+
format: "fmt:email",
|
|
159
|
+
missingValues: ["", "NA"],
|
|
160
|
+
categories: ["valid", "invalid"],
|
|
161
|
+
categoriesOrdered: true,
|
|
162
|
+
jsonschema: { type: "string", pattern: "^[a-z]+@[a-z]+\\.[a-z]+$" },
|
|
163
|
+
};
|
|
164
|
+
const result = convertFieldFromDescriptor(descriptor);
|
|
165
|
+
expect(result.format).toBe("email");
|
|
166
|
+
expect(result.missingValues).toEqual(["", "NA"]);
|
|
167
|
+
expect(result.categories).toEqual(["valid", "invalid"]);
|
|
168
|
+
expect(result.categoriesOrdered).toBe(true);
|
|
169
|
+
expect(result.jsonschema).toEqual({
|
|
170
|
+
type: "string",
|
|
171
|
+
pattern: "^[a-z]+@[a-z]+\\.[a-z]+$",
|
|
172
|
+
});
|
|
173
|
+
expect(consoleWarnSpy).not.toHaveBeenCalled();
|
|
174
|
+
consoleWarnSpy.mockRestore();
|
|
175
|
+
});
|
|
176
|
+
it("should handle multiple invalid properties and warn for each", () => {
|
|
177
|
+
const consoleWarnSpy = vi
|
|
178
|
+
.spyOn(console, "warn")
|
|
179
|
+
.mockImplementation(() => { });
|
|
180
|
+
const descriptor = {
|
|
181
|
+
name: "field",
|
|
182
|
+
type: "string",
|
|
183
|
+
missingValues: "invalid",
|
|
184
|
+
categories: 123,
|
|
185
|
+
categoriesOrdered: "invalid",
|
|
186
|
+
jsonschema: "invalid",
|
|
187
|
+
};
|
|
188
|
+
const result = convertFieldFromDescriptor(descriptor);
|
|
189
|
+
expect(result.missingValues).toBeUndefined();
|
|
190
|
+
expect(result.categories).toBeUndefined();
|
|
191
|
+
expect(result.categoriesOrdered).toBeUndefined();
|
|
192
|
+
expect(result.jsonschema).toBeUndefined();
|
|
193
|
+
expect(consoleWarnSpy).toHaveBeenCalledTimes(4);
|
|
194
|
+
consoleWarnSpy.mockRestore();
|
|
195
|
+
});
|
|
196
|
+
it("should handle field with all valid properties", () => {
|
|
197
|
+
const descriptor = {
|
|
198
|
+
name: "age",
|
|
199
|
+
type: "integer",
|
|
200
|
+
title: "Age",
|
|
201
|
+
description: "Person's age",
|
|
202
|
+
format: "fmt:default",
|
|
203
|
+
example: 25,
|
|
204
|
+
examples: [18, 25, 30, 45],
|
|
205
|
+
rdfType: "http://schema.org/age",
|
|
206
|
+
missingValues: ["", "unknown"],
|
|
207
|
+
categories: ["young", "middle", "old"],
|
|
208
|
+
categoriesOrdered: true,
|
|
209
|
+
jsonschema: { type: "integer", minimum: 0, maximum: 150 },
|
|
210
|
+
constraints: {
|
|
211
|
+
required: true,
|
|
212
|
+
minimum: 0,
|
|
213
|
+
maximum: 150,
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
const result = convertFieldFromDescriptor(descriptor);
|
|
217
|
+
expect(result.name).toBe("age");
|
|
218
|
+
expect(result.type).toBe("integer");
|
|
219
|
+
expect(result.title).toBe("Age");
|
|
220
|
+
expect(result.description).toBe("Person's age");
|
|
221
|
+
expect(result.format).toBe("default");
|
|
222
|
+
expect(result.example).toBe(25);
|
|
223
|
+
expect(result.examples).toEqual([18, 25, 30, 45]);
|
|
224
|
+
expect(result.rdfType).toBe("http://schema.org/age");
|
|
225
|
+
expect(result.missingValues).toEqual(["", "unknown"]);
|
|
226
|
+
expect(result.categories).toEqual(["young", "middle", "old"]);
|
|
227
|
+
expect(result.categoriesOrdered).toBe(true);
|
|
228
|
+
expect(result.jsonschema).toEqual({
|
|
229
|
+
type: "integer",
|
|
230
|
+
minimum: 0,
|
|
231
|
+
maximum: 150,
|
|
232
|
+
});
|
|
233
|
+
expect(result.constraints).toEqual({
|
|
234
|
+
required: true,
|
|
235
|
+
minimum: 0,
|
|
236
|
+
maximum: 150,
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbURlc2NyaXB0b3Iuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2ZpZWxkL2NvbnZlcnQvZnJvbURlc2NyaXB0b3Iuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQ2pELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBRWhFLFFBQVEsQ0FBQyw0QkFBNEIsRUFBRSxHQUFHLEVBQUU7SUFDMUMsRUFBRSxDQUFDLG1DQUFtQyxFQUFFLEdBQUcsRUFBRTtRQUMzQyxNQUFNLFVBQVUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFBO1FBRWpELE1BQU0sTUFBTSxHQUFHLDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRXJELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDbEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDckMsQ0FBQyxDQUFDLENBQUE7SUFFRixRQUFRLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxFQUFFO1FBQ2pDLEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRSxHQUFHLEVBQUU7WUFDL0MsTUFBTSxVQUFVLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFBO1lBRXRFLE1BQU0sTUFBTSxHQUFHLDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBRXJELE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3JDLENBQUMsQ0FBQyxDQUFBO1FBRUYsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLEdBQUcsRUFBRTtZQUNwRCxNQUFNLFVBQVUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUE7WUFFbEUsTUFBTSxNQUFNLEdBQUcsMEJBQTBCLENBQUMsVUFBVSxDQUFDLENBQUE7WUFFckQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDckMsQ0FBQyxDQUFDLENBQUE7UUFFRixFQUFFLENBQUMseUNBQXlDLEVBQUUsR0FBRyxFQUFFO1lBQ2pELE1BQU0sVUFBVSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUE7WUFFakQsTUFBTSxNQUFNLEdBQUcsMEJBQTBCLENBQUMsVUFBVSxDQUFDLENBQUE7WUFFckQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUN2QyxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQyxDQUFBO0lBRUYsUUFBUSxDQUFDLDBCQUEwQixFQUFFLEdBQUcsRUFBRTtRQUN4QyxFQUFFLENBQUMsMkNBQTJDLEVBQUUsR0FBRyxFQUFFO1lBQ25ELE1BQU0sVUFBVSxHQUFHO2dCQUNqQixJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUUsUUFBUTtnQkFDZCxhQUFhLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQzthQUNqQyxDQUFBO1lBRUQsTUFBTSxNQUFNLEdBQUcsMEJBQTBCLENBQUMsVUFBVSxDQUFDLENBQUE7WUFFckQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDekQsQ0FBQyxDQUFDLENBQUE7UUFFRixFQUFFLENBQUMsd0RBQXdELEVBQUUsR0FBRyxFQUFFO1lBQ2hFLE1BQU0sY0FBYyxHQUFHLEVBQUU7aUJBQ3RCLEtBQUssQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDO2lCQUN0QixrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQTtZQUMvQixNQUFNLFVBQVUsR0FBRztnQkFDakIsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsYUFBYSxFQUFFLFNBQVM7YUFDekIsQ0FBQTtZQUVELE1BQU0sTUFBTSxHQUFHLDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBRXJELE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUE7WUFDNUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLG9CQUFvQixDQUN6QyxtREFBbUQsQ0FDcEQsQ0FBQTtZQUNELGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUM5QixDQUFDLENBQUMsQ0FBQTtRQUVGLEVBQUUsQ0FBQyxnREFBZ0QsRUFBRSxHQUFHLEVBQUU7WUFDeEQsTUFBTSxVQUFVLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQTtZQUVqRCxNQUFNLE1BQU0sR0FBRywwQkFBMEIsQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUVyRCxNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQzlDLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7SUFFRixRQUFRLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxFQUFFO1FBQ3JDLEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRSxHQUFHLEVBQUU7WUFDaEQsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLElBQUksRUFBRSxRQUFRO2dCQUNkLElBQUksRUFBRSxRQUFRO2dCQUNkLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDO2FBQzlDLENBQUE7WUFFRCxNQUFNLE1BQU0sR0FBRywwQkFBMEIsQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUVyRCxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQTtRQUN0RSxDQUFDLENBQUMsQ0FBQTtRQUVGLEVBQUUsQ0FBQyxxREFBcUQsRUFBRSxHQUFHLEVBQUU7WUFDN0QsTUFBTSxjQUFjLEdBQUcsRUFBRTtpQkFDdEIsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUM7aUJBQ3RCLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFBO1lBQy9CLE1BQU0sVUFBVSxHQUFHO2dCQUNqQixJQUFJLEVBQUUsUUFBUTtnQkFDZCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxVQUFVLEVBQUUsU0FBUzthQUN0QixDQUFBO1lBRUQsTUFBTSxNQUFNLEdBQUcsMEJBQTBCLENBQUMsVUFBVSxDQUFDLENBQUE7WUFFckQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtZQUN6QyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsb0JBQW9CLENBQ3pDLGdEQUFnRCxDQUNqRCxDQUFBO1lBQ0QsY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQzlCLENBQUMsQ0FBQyxDQUFBO1FBRUYsRUFBRSxDQUFDLDZDQUE2QyxFQUFFLEdBQUcsRUFBRTtZQUNyRCxNQUFNLFVBQVUsR0FBRyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFBO1lBRXJELE1BQU0sTUFBTSxHQUFHLDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBRXJELE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDM0MsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtJQUVGLFFBQVEsQ0FBQyw4QkFBOEIsRUFBRSxHQUFHLEVBQUU7UUFDNUMsRUFBRSxDQUFDLGlEQUFpRCxFQUFFLEdBQUcsRUFBRTtZQUN6RCxNQUFNLFVBQVUsR0FBRztnQkFDakIsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsaUJBQWlCLEVBQUUsSUFBSTthQUN4QixDQUFBO1lBRUQsTUFBTSxNQUFNLEdBQUcsMEJBQTBCLENBQUMsVUFBVSxDQUFDLENBQUE7WUFFckQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM3QyxDQUFDLENBQUMsQ0FBQTtRQUVGLEVBQUUsQ0FBQyw4REFBOEQsRUFBRSxHQUFHLEVBQUU7WUFDdEUsTUFBTSxjQUFjLEdBQUcsRUFBRTtpQkFDdEIsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUM7aUJBQ3RCLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFBO1lBQy9CLE1BQU0sVUFBVSxHQUFHO2dCQUNqQixJQUFJLEVBQUUsUUFBUTtnQkFDZCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxpQkFBaUIsRUFBRSxTQUFTO2FBQzdCLENBQUE7WUFFRCxNQUFNLE1BQU0sR0FBRywwQkFBMEIsQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUVyRCxNQUFNLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUMsYUFBYSxFQUFFLENBQUE7WUFDaEQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLG9CQUFvQixDQUN6Qyx1REFBdUQsQ0FDeEQsQ0FBQTtZQUNELGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUM5QixDQUFDLENBQUMsQ0FBQTtRQUVGLEVBQUUsQ0FBQyxvREFBb0QsRUFBRSxHQUFHLEVBQUU7WUFDNUQsTUFBTSxVQUFVLEdBQUcsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQTtZQUVyRCxNQUFNLE1BQU0sR0FBRywwQkFBMEIsQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUVyRCxNQUFNLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDbEQsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtJQUVGLFFBQVEsQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLEVBQUU7UUFDckMsRUFBRSxDQUFDLHlDQUF5QyxFQUFFLEdBQUcsRUFBRTtZQUNqRCxNQUFNLFVBQVUsR0FBRztnQkFDakIsSUFBSSxFQUFFLE1BQU07Z0JBQ1osSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRTthQUN2RSxDQUFBO1lBRUQsTUFBTSxNQUFNLEdBQUcsMEJBQTBCLENBQUMsVUFBVSxDQUFDLENBQUE7WUFFckQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQ2hDLElBQUksRUFBRSxRQUFRO2dCQUNkLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRTthQUN2QyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtRQUVGLEVBQUUsQ0FBQyxzREFBc0QsRUFBRSxHQUFHLEVBQUU7WUFDOUQsTUFBTSxjQUFjLEdBQUcsRUFBRTtpQkFDdEIsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUM7aUJBQ3RCLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFBO1lBQy9CLE1BQU0sVUFBVSxHQUFHO2dCQUNqQixJQUFJLEVBQUUsTUFBTTtnQkFDWixJQUFJLEVBQUUsUUFBUTtnQkFDZCxVQUFVLEVBQUUsU0FBUzthQUN0QixDQUFBO1lBRUQsTUFBTSxNQUFNLEdBQUcsMEJBQTBCLENBQUMsVUFBVSxDQUFDLENBQUE7WUFFckQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtZQUN6QyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsb0JBQW9CLENBQ3pDLGdEQUFnRCxDQUNqRCxDQUFBO1lBQ0QsY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQzlCLENBQUMsQ0FBQyxDQUFBO1FBRUYsRUFBRSxDQUFDLDZDQUE2QyxFQUFFLEdBQUcsRUFBRTtZQUNyRCxNQUFNLFVBQVUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFBO1lBRW5ELE1BQU0sTUFBTSxHQUFHLDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBRXJELE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDM0MsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtJQUVGLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLEVBQUU7UUFDcEMsRUFBRSxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsRUFBRTtZQUMvQyxNQUFNLGNBQWMsR0FBRyxFQUFFO2lCQUN0QixLQUFLLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQztpQkFDdEIsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUE7WUFDL0IsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLElBQUksRUFBRSxPQUFPO2dCQUNiLElBQUksRUFBRSxRQUFRO2dCQUNkLE1BQU0sRUFBRSxXQUFXO2dCQUNuQixhQUFhLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDO2dCQUN6QixVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDO2dCQUNoQyxpQkFBaUIsRUFBRSxJQUFJO2dCQUN2QixVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRTthQUNwRSxDQUFBO1lBRUQsTUFBTSxNQUFNLEdBQUcsMEJBQTBCLENBQUMsVUFBVSxDQUFDLENBQUE7WUFFckQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDbkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtZQUNoRCxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFBO1lBQ3ZELE1BQU0sQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDM0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQ2hDLElBQUksRUFBRSxRQUFRO2dCQUNkLE9BQU8sRUFBRSwwQkFBMEI7YUFDcEMsQ0FBQyxDQUFBO1lBQ0YsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1lBQzdDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUM5QixDQUFDLENBQUMsQ0FBQTtRQUVGLEVBQUUsQ0FBQyw2REFBNkQsRUFBRSxHQUFHLEVBQUU7WUFDckUsTUFBTSxjQUFjLEdBQUcsRUFBRTtpQkFDdEIsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUM7aUJBQ3RCLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFBO1lBQy9CLE1BQU0sVUFBVSxHQUFHO2dCQUNqQixJQUFJLEVBQUUsT0FBTztnQkFDYixJQUFJLEVBQUUsUUFBUTtnQkFDZCxhQUFhLEVBQUUsU0FBUztnQkFDeEIsVUFBVSxFQUFFLEdBQUc7Z0JBQ2YsaUJBQWlCLEVBQUUsU0FBUztnQkFDNUIsVUFBVSxFQUFFLFNBQVM7YUFDdEIsQ0FBQTtZQUVELE1BQU0sTUFBTSxHQUFHLDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBRXJELE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUE7WUFDNUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtZQUN6QyxNQUFNLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUMsYUFBYSxFQUFFLENBQUE7WUFDaEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtZQUN6QyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDL0MsY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQzlCLENBQUMsQ0FBQyxDQUFBO1FBRUYsRUFBRSxDQUFDLCtDQUErQyxFQUFFLEdBQUcsRUFBRTtZQUN2RCxNQUFNLFVBQVUsR0FBRztnQkFDakIsSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osV0FBVyxFQUFFLGNBQWM7Z0JBQzNCLE1BQU0sRUFBRSxhQUFhO2dCQUNyQixPQUFPLEVBQUUsRUFBRTtnQkFDWCxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Z0JBQzFCLE9BQU8sRUFBRSx1QkFBdUI7Z0JBQ2hDLGFBQWEsRUFBRSxDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUM7Z0JBQzlCLFVBQVUsRUFBRSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDO2dCQUN0QyxpQkFBaUIsRUFBRSxJQUFJO2dCQUN2QixVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRTtnQkFDekQsV0FBVyxFQUFFO29CQUNYLFFBQVEsRUFBRSxJQUFJO29CQUNkLE9BQU8sRUFBRSxDQUFDO29CQUNWLE9BQU8sRUFBRSxHQUFHO2lCQUNiO2FBQ0YsQ0FBQTtZQUVELE1BQU0sTUFBTSxHQUFHLDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBRXJELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQy9CLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQ25DLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ2hDLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1lBQy9DLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQ3JDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQy9CLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQTtZQUNqRCxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO1lBQ3BELE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUE7WUFDckQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7WUFDN0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUMzQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFDaEMsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsT0FBTyxFQUFFLEdBQUc7YUFDYixDQUFDLENBQUE7WUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFDakMsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsT0FBTyxFQUFFLEdBQUc7YUFDYixDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCwgdmkgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IGNvbnZlcnRGaWVsZEZyb21EZXNjcmlwdG9yIH0gZnJvbSBcIi4vZnJvbURlc2NyaXB0b3IudHNcIlxuXG5kZXNjcmliZShcImNvbnZlcnRGaWVsZEZyb21EZXNjcmlwdG9yXCIsICgpID0+IHtcbiAgaXQoXCJzaG91bGQgcmV0dXJuIGEgY2xvbmVkIGRlc2NyaXB0b3JcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJzdHJpbmdcIiB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0RmllbGRGcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChkZXNjcmlwdG9yKVxuICAgIGV4cGVjdChyZXN1bHQpLm5vdC50b0JlKGRlc2NyaXB0b3IpXG4gIH0pXG5cbiAgZGVzY3JpYmUoXCJmb3JtYXQgY29udmVyc2lvblwiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgcmVtb3ZlIGZtdDogcHJlZml4IGZyb20gZm9ybWF0XCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJzdHJpbmdcIiwgZm9ybWF0OiBcImZtdDplbWFpbFwiIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydEZpZWxkRnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcilcblxuICAgICAgZXhwZWN0KHJlc3VsdC5mb3JtYXQpLnRvQmUoXCJlbWFpbFwiKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBwcmVzZXJ2ZSBmb3JtYXQgd2l0aG91dCBmbXQ6IHByZWZpeFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0geyBuYW1lOiBcImlkXCIsIHR5cGU6IFwic3RyaW5nXCIsIGZvcm1hdDogXCJlbWFpbFwiIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydEZpZWxkRnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcilcblxuICAgICAgZXhwZWN0KHJlc3VsdC5mb3JtYXQpLnRvQmUoXCJlbWFpbFwiKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgZGVzY3JpcHRvciB3aXRob3V0IGZvcm1hdFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0geyBuYW1lOiBcImlkXCIsIHR5cGU6IFwic3RyaW5nXCIgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0RmllbGRGcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yKVxuXG4gICAgICBleHBlY3QocmVzdWx0LmZvcm1hdCkudG9CZVVuZGVmaW5lZCgpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZShcIm1pc3NpbmdWYWx1ZXMgdmFsaWRhdGlvblwiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgcHJlc2VydmUgdmFsaWQgbWlzc2luZ1ZhbHVlcyBhcnJheVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0ge1xuICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIG1pc3NpbmdWYWx1ZXM6IFtcIlwiLCBcIk5BXCIsIFwiTi9BXCJdLFxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0RmllbGRGcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yKVxuXG4gICAgICBleHBlY3QocmVzdWx0Lm1pc3NpbmdWYWx1ZXMpLnRvRXF1YWwoW1wiXCIsIFwiTkFcIiwgXCJOL0FcIl0pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIHJlbW92ZSBpbnZhbGlkIG5vbi1hcnJheSBtaXNzaW5nVmFsdWVzIGFuZCB3YXJuXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnNvbGVXYXJuU3B5ID0gdmlcbiAgICAgICAgLnNweU9uKGNvbnNvbGUsIFwid2FyblwiKVxuICAgICAgICAubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHt9KVxuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHtcbiAgICAgICAgbmFtZTogXCJpZFwiLFxuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBtaXNzaW5nVmFsdWVzOiBcImludmFsaWRcIixcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydEZpZWxkRnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcilcblxuICAgICAgZXhwZWN0KHJlc3VsdC5taXNzaW5nVmFsdWVzKS50b0JlVW5kZWZpbmVkKClcbiAgICAgIGV4cGVjdChjb25zb2xlV2FyblNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgIFwiSWdub3JpbmcgdjIuMCBpbmNvbXBhdGlibGUgbWlzc2luZ1ZhbHVlczogaW52YWxpZFwiLFxuICAgICAgKVxuICAgICAgY29uc29sZVdhcm5TcHkubW9ja1Jlc3RvcmUoKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgZGVzY3JpcHRvciB3aXRob3V0IG1pc3NpbmdWYWx1ZXNcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcInN0cmluZ1wiIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydEZpZWxkRnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcilcblxuICAgICAgZXhwZWN0KHJlc3VsdC5taXNzaW5nVmFsdWVzKS50b0JlVW5kZWZpbmVkKClcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKFwiY2F0ZWdvcmllcyB2YWxpZGF0aW9uXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBwcmVzZXJ2ZSB2YWxpZCBjYXRlZ29yaWVzIGFycmF5XCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB7XG4gICAgICAgIG5hbWU6IFwic3RhdHVzXCIsXG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGNhdGVnb3JpZXM6IFtcImFjdGl2ZVwiLCBcImluYWN0aXZlXCIsIFwicGVuZGluZ1wiXSxcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydEZpZWxkRnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcilcblxuICAgICAgZXhwZWN0KHJlc3VsdC5jYXRlZ29yaWVzKS50b0VxdWFsKFtcImFjdGl2ZVwiLCBcImluYWN0aXZlXCIsIFwicGVuZGluZ1wiXSlcbiAgICB9KVxuXG4gICAgaXQoXCJzaG91bGQgcmVtb3ZlIGludmFsaWQgbm9uLWFycmF5IGNhdGVnb3JpZXMgYW5kIHdhcm5cIiwgKCkgPT4ge1xuICAgICAgY29uc3QgY29uc29sZVdhcm5TcHkgPSB2aVxuICAgICAgICAuc3B5T24oY29uc29sZSwgXCJ3YXJuXCIpXG4gICAgICAgIC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge30pXG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0ge1xuICAgICAgICBuYW1lOiBcInN0YXR1c1wiLFxuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBjYXRlZ29yaWVzOiBcImludmFsaWRcIixcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydEZpZWxkRnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcilcblxuICAgICAgZXhwZWN0KHJlc3VsdC5jYXRlZ29yaWVzKS50b0JlVW5kZWZpbmVkKClcbiAgICAgIGV4cGVjdChjb25zb2xlV2FyblNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgIFwiSWdub3JpbmcgdjIuMCBpbmNvbXBhdGlibGUgY2F0ZWdvcmllczogaW52YWxpZFwiLFxuICAgICAgKVxuICAgICAgY29uc29sZVdhcm5TcHkubW9ja1Jlc3RvcmUoKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgZGVzY3JpcHRvciB3aXRob3V0IGNhdGVnb3JpZXNcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHsgbmFtZTogXCJzdGF0dXNcIiwgdHlwZTogXCJzdHJpbmdcIiB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRGaWVsZEZyb21EZXNjcmlwdG9yKGRlc2NyaXB0b3IpXG5cbiAgICAgIGV4cGVjdChyZXN1bHQuY2F0ZWdvcmllcykudG9CZVVuZGVmaW5lZCgpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZShcImNhdGVnb3JpZXNPcmRlcmVkIHZhbGlkYXRpb25cIiwgKCkgPT4ge1xuICAgIGl0KFwic2hvdWxkIHByZXNlcnZlIHZhbGlkIGNhdGVnb3JpZXNPcmRlcmVkIGJvb2xlYW5cIiwgKCkgPT4ge1xuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHtcbiAgICAgICAgbmFtZTogXCJzdGF0dXNcIixcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgY2F0ZWdvcmllc09yZGVyZWQ6IHRydWUsXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRGaWVsZEZyb21EZXNjcmlwdG9yKGRlc2NyaXB0b3IpXG5cbiAgICAgIGV4cGVjdChyZXN1bHQuY2F0ZWdvcmllc09yZGVyZWQpLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoXCJzaG91bGQgcmVtb3ZlIGludmFsaWQgbm9uLWJvb2xlYW4gY2F0ZWdvcmllc09yZGVyZWQgYW5kIHdhcm5cIiwgKCkgPT4ge1xuICAgICAgY29uc3QgY29uc29sZVdhcm5TcHkgPSB2aVxuICAgICAgICAuc3B5T24oY29uc29sZSwgXCJ3YXJuXCIpXG4gICAgICAgIC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge30pXG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0ge1xuICAgICAgICBuYW1lOiBcInN0YXR1c1wiLFxuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBjYXRlZ29yaWVzT3JkZXJlZDogXCJpbnZhbGlkXCIsXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRGaWVsZEZyb21EZXNjcmlwdG9yKGRlc2NyaXB0b3IpXG5cbiAgICAgIGV4cGVjdChyZXN1bHQuY2F0ZWdvcmllc09yZGVyZWQpLnRvQmVVbmRlZmluZWQoKVxuICAgICAgZXhwZWN0KGNvbnNvbGVXYXJuU3B5KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgXCJJZ25vcmluZyB2Mi4wIGluY29tcGF0aWJsZSBjYXRlZ29yaWVzT3JkZXJlZDogaW52YWxpZFwiLFxuICAgICAgKVxuICAgICAgY29uc29sZVdhcm5TcHkubW9ja1Jlc3RvcmUoKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgZGVzY3JpcHRvciB3aXRob3V0IGNhdGVnb3JpZXNPcmRlcmVkXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB7IG5hbWU6IFwic3RhdHVzXCIsIHR5cGU6IFwic3RyaW5nXCIgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0RmllbGRGcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yKVxuXG4gICAgICBleHBlY3QocmVzdWx0LmNhdGVnb3JpZXNPcmRlcmVkKS50b0JlVW5kZWZpbmVkKClcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKFwianNvbnNjaGVtYSB2YWxpZGF0aW9uXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBwcmVzZXJ2ZSB2YWxpZCBqc29uc2NoZW1hIG9iamVjdFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0ge1xuICAgICAgICBuYW1lOiBcImRhdGFcIixcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAganNvbnNjaGVtYTogeyB0eXBlOiBcIm9iamVjdFwiLCBwcm9wZXJ0aWVzOiB7IGlkOiB7IHR5cGU6IFwibnVtYmVyXCIgfSB9IH0sXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRGaWVsZEZyb21EZXNjcmlwdG9yKGRlc2NyaXB0b3IpXG5cbiAgICAgIGV4cGVjdChyZXN1bHQuanNvbnNjaGVtYSkudG9FcXVhbCh7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHByb3BlcnRpZXM6IHsgaWQ6IHsgdHlwZTogXCJudW1iZXJcIiB9IH0sXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCByZW1vdmUgaW52YWxpZCBub24tb2JqZWN0IGpzb25zY2hlbWEgYW5kIHdhcm5cIiwgKCkgPT4ge1xuICAgICAgY29uc3QgY29uc29sZVdhcm5TcHkgPSB2aVxuICAgICAgICAuc3B5T24oY29uc29sZSwgXCJ3YXJuXCIpXG4gICAgICAgIC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge30pXG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0ge1xuICAgICAgICBuYW1lOiBcImRhdGFcIixcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAganNvbnNjaGVtYTogXCJpbnZhbGlkXCIsXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRGaWVsZEZyb21EZXNjcmlwdG9yKGRlc2NyaXB0b3IpXG5cbiAgICAgIGV4cGVjdChyZXN1bHQuanNvbnNjaGVtYSkudG9CZVVuZGVmaW5lZCgpXG4gICAgICBleHBlY3QoY29uc29sZVdhcm5TcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBcIklnbm9yaW5nIHYyLjAgaW5jb21wYXRpYmxlIGpzb25zY2hlbWE6IGludmFsaWRcIixcbiAgICAgIClcbiAgICAgIGNvbnNvbGVXYXJuU3B5Lm1vY2tSZXN0b3JlKClcbiAgICB9KVxuXG4gICAgaXQoXCJzaG91bGQgaGFuZGxlIGRlc2NyaXB0b3Igd2l0aG91dCBqc29uc2NoZW1hXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB7IG5hbWU6IFwiZGF0YVwiLCB0eXBlOiBcIm9iamVjdFwiIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydEZpZWxkRnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcilcblxuICAgICAgZXhwZWN0KHJlc3VsdC5qc29uc2NoZW1hKS50b0JlVW5kZWZpbmVkKClcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKFwiY29tYmluZWQgY29udmVyc2lvbnNcIiwgKCkgPT4ge1xuICAgIGl0KFwic2hvdWxkIGFwcGx5IGFsbCBjb252ZXJzaW9ucyB0b2dldGhlclwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb25zb2xlV2FyblNweSA9IHZpXG4gICAgICAgIC5zcHlPbihjb25zb2xlLCBcIndhcm5cIilcbiAgICAgICAgLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7fSlcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB7XG4gICAgICAgIG5hbWU6IFwiZW1haWxcIixcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcImZtdDplbWFpbFwiLFxuICAgICAgICBtaXNzaW5nVmFsdWVzOiBbXCJcIiwgXCJOQVwiXSxcbiAgICAgICAgY2F0ZWdvcmllczogW1widmFsaWRcIiwgXCJpbnZhbGlkXCJdLFxuICAgICAgICBjYXRlZ29yaWVzT3JkZXJlZDogdHJ1ZSxcbiAgICAgICAganNvbnNjaGVtYTogeyB0eXBlOiBcInN0cmluZ1wiLCBwYXR0ZXJuOiBcIl5bYS16XStAW2Etel0rXFxcXC5bYS16XSskXCIgfSxcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydEZpZWxkRnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcilcblxuICAgICAgZXhwZWN0KHJlc3VsdC5mb3JtYXQpLnRvQmUoXCJlbWFpbFwiKVxuICAgICAgZXhwZWN0KHJlc3VsdC5taXNzaW5nVmFsdWVzKS50b0VxdWFsKFtcIlwiLCBcIk5BXCJdKVxuICAgICAgZXhwZWN0KHJlc3VsdC5jYXRlZ29yaWVzKS50b0VxdWFsKFtcInZhbGlkXCIsIFwiaW52YWxpZFwiXSlcbiAgICAgIGV4cGVjdChyZXN1bHQuY2F0ZWdvcmllc09yZGVyZWQpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChyZXN1bHQuanNvbnNjaGVtYSkudG9FcXVhbCh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIHBhdHRlcm46IFwiXlthLXpdK0BbYS16XStcXFxcLlthLXpdKyRcIixcbiAgICAgIH0pXG4gICAgICBleHBlY3QoY29uc29sZVdhcm5TcHkpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICAgIGNvbnNvbGVXYXJuU3B5Lm1vY2tSZXN0b3JlKClcbiAgICB9KVxuXG4gICAgaXQoXCJzaG91bGQgaGFuZGxlIG11bHRpcGxlIGludmFsaWQgcHJvcGVydGllcyBhbmQgd2FybiBmb3IgZWFjaFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb25zb2xlV2FyblNweSA9IHZpXG4gICAgICAgIC5zcHlPbihjb25zb2xlLCBcIndhcm5cIilcbiAgICAgICAgLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7fSlcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB7XG4gICAgICAgIG5hbWU6IFwiZmllbGRcIixcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgbWlzc2luZ1ZhbHVlczogXCJpbnZhbGlkXCIsXG4gICAgICAgIGNhdGVnb3JpZXM6IDEyMyxcbiAgICAgICAgY2F0ZWdvcmllc09yZGVyZWQ6IFwiaW52YWxpZFwiLFxuICAgICAgICBqc29uc2NoZW1hOiBcImludmFsaWRcIixcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydEZpZWxkRnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcilcblxuICAgICAgZXhwZWN0KHJlc3VsdC5taXNzaW5nVmFsdWVzKS50b0JlVW5kZWZpbmVkKClcbiAgICAgIGV4cGVjdChyZXN1bHQuY2F0ZWdvcmllcykudG9CZVVuZGVmaW5lZCgpXG4gICAgICBleHBlY3QocmVzdWx0LmNhdGVnb3JpZXNPcmRlcmVkKS50b0JlVW5kZWZpbmVkKClcbiAgICAgIGV4cGVjdChyZXN1bHQuanNvbnNjaGVtYSkudG9CZVVuZGVmaW5lZCgpXG4gICAgICBleHBlY3QoY29uc29sZVdhcm5TcHkpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcyg0KVxuICAgICAgY29uc29sZVdhcm5TcHkubW9ja1Jlc3RvcmUoKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgZmllbGQgd2l0aCBhbGwgdmFsaWQgcHJvcGVydGllc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0ge1xuICAgICAgICBuYW1lOiBcImFnZVwiLFxuICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgdGl0bGU6IFwiQWdlXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlBlcnNvbidzIGFnZVwiLFxuICAgICAgICBmb3JtYXQ6IFwiZm10OmRlZmF1bHRcIixcbiAgICAgICAgZXhhbXBsZTogMjUsXG4gICAgICAgIGV4YW1wbGVzOiBbMTgsIDI1LCAzMCwgNDVdLFxuICAgICAgICByZGZUeXBlOiBcImh0dHA6Ly9zY2hlbWEub3JnL2FnZVwiLFxuICAgICAgICBtaXNzaW5nVmFsdWVzOiBbXCJcIiwgXCJ1bmtub3duXCJdLFxuICAgICAgICBjYXRlZ29yaWVzOiBbXCJ5b3VuZ1wiLCBcIm1pZGRsZVwiLCBcIm9sZFwiXSxcbiAgICAgICAgY2F0ZWdvcmllc09yZGVyZWQ6IHRydWUsXG4gICAgICAgIGpzb25zY2hlbWE6IHsgdHlwZTogXCJpbnRlZ2VyXCIsIG1pbmltdW06IDAsIG1heGltdW06IDE1MCB9LFxuICAgICAgICBjb25zdHJhaW50czoge1xuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgbWF4aW11bTogMTUwLFxuICAgICAgICB9LFxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0RmllbGRGcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yKVxuXG4gICAgICBleHBlY3QocmVzdWx0Lm5hbWUpLnRvQmUoXCJhZ2VcIilcbiAgICAgIGV4cGVjdChyZXN1bHQudHlwZSkudG9CZShcImludGVnZXJcIilcbiAgICAgIGV4cGVjdChyZXN1bHQudGl0bGUpLnRvQmUoXCJBZ2VcIilcbiAgICAgIGV4cGVjdChyZXN1bHQuZGVzY3JpcHRpb24pLnRvQmUoXCJQZXJzb24ncyBhZ2VcIilcbiAgICAgIGV4cGVjdChyZXN1bHQuZm9ybWF0KS50b0JlKFwiZGVmYXVsdFwiKVxuICAgICAgZXhwZWN0KHJlc3VsdC5leGFtcGxlKS50b0JlKDI1KVxuICAgICAgZXhwZWN0KHJlc3VsdC5leGFtcGxlcykudG9FcXVhbChbMTgsIDI1LCAzMCwgNDVdKVxuICAgICAgZXhwZWN0KHJlc3VsdC5yZGZUeXBlKS50b0JlKFwiaHR0cDovL3NjaGVtYS5vcmcvYWdlXCIpXG4gICAgICBleHBlY3QocmVzdWx0Lm1pc3NpbmdWYWx1ZXMpLnRvRXF1YWwoW1wiXCIsIFwidW5rbm93blwiXSlcbiAgICAgIGV4cGVjdChyZXN1bHQuY2F0ZWdvcmllcykudG9FcXVhbChbXCJ5b3VuZ1wiLCBcIm1pZGRsZVwiLCBcIm9sZFwiXSlcbiAgICAgIGV4cGVjdChyZXN1bHQuY2F0ZWdvcmllc09yZGVyZWQpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChyZXN1bHQuanNvbnNjaGVtYSkudG9FcXVhbCh7XG4gICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICBtYXhpbXVtOiAxNTAsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KHJlc3VsdC5jb25zdHJhaW50cykudG9FcXVhbCh7XG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICBtYXhpbXVtOiAxNTAsXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG59KVxuIl19
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export function convertFieldToDescriptor(field) {
|
|
2
|
+
field = globalThis.structuredClone(field);
|
|
3
|
+
return field;
|
|
4
|
+
}
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9EZXNjcmlwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZmllbGQvY29udmVydC90b0Rlc2NyaXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxVQUFVLHdCQUF3QixDQUFDLEtBQVk7SUFDbkQsS0FBSyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFekMsT0FBTyxLQUE4QixDQUFBO0FBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IERlc2NyaXB0b3IgfSBmcm9tIFwiLi4vLi4vZGVzY3JpcHRvci9pbmRleC50c1wiXG5pbXBvcnQgdHlwZSB7IEZpZWxkIH0gZnJvbSBcIi4uL0ZpZWxkLnRzXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRGaWVsZFRvRGVzY3JpcHRvcihmaWVsZDogRmllbGQpIHtcbiAgZmllbGQgPSBnbG9iYWxUaGlzLnN0cnVjdHVyZWRDbG9uZShmaWVsZClcblxuICByZXR1cm4gZmllbGQgYXMgdW5rbm93biBhcyBEZXNjcmlwdG9yXG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { convertFieldToDescriptor } from "./toDescriptor.js";
|
|
3
|
+
describe("convertFieldToDescriptor", () => {
|
|
4
|
+
it("should return a cloned descriptor", () => {
|
|
5
|
+
const field = { name: "id", type: "string" };
|
|
6
|
+
const result = convertFieldToDescriptor(field);
|
|
7
|
+
expect(result).toEqual(field);
|
|
8
|
+
expect(result).not.toBe(field);
|
|
9
|
+
});
|
|
10
|
+
it("should convert string field to descriptor", () => {
|
|
11
|
+
const field = {
|
|
12
|
+
name: "email",
|
|
13
|
+
type: "string",
|
|
14
|
+
format: "email",
|
|
15
|
+
title: "Email Address",
|
|
16
|
+
description: "User's email address",
|
|
17
|
+
};
|
|
18
|
+
const result = convertFieldToDescriptor(field);
|
|
19
|
+
expect(result.name).toBe("email");
|
|
20
|
+
expect(result.type).toBe("string");
|
|
21
|
+
expect(result.format).toBe("email");
|
|
22
|
+
expect(result.title).toBe("Email Address");
|
|
23
|
+
expect(result.description).toBe("User's email address");
|
|
24
|
+
});
|
|
25
|
+
it("should convert integer field to descriptor", () => {
|
|
26
|
+
const field = {
|
|
27
|
+
name: "age",
|
|
28
|
+
type: "integer",
|
|
29
|
+
title: "Age",
|
|
30
|
+
constraints: {
|
|
31
|
+
required: true,
|
|
32
|
+
minimum: 0,
|
|
33
|
+
maximum: 150,
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
const result = convertFieldToDescriptor(field);
|
|
37
|
+
expect(result.name).toBe("age");
|
|
38
|
+
expect(result.type).toBe("integer");
|
|
39
|
+
expect(result.title).toBe("Age");
|
|
40
|
+
expect(result.constraints).toEqual({
|
|
41
|
+
required: true,
|
|
42
|
+
minimum: 0,
|
|
43
|
+
maximum: 150,
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
it("should convert number field to descriptor", () => {
|
|
47
|
+
const field = {
|
|
48
|
+
name: "score",
|
|
49
|
+
type: "number",
|
|
50
|
+
description: "Test score",
|
|
51
|
+
constraints: {
|
|
52
|
+
minimum: 0,
|
|
53
|
+
maximum: 100,
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
const result = convertFieldToDescriptor(field);
|
|
57
|
+
expect(result.name).toBe("score");
|
|
58
|
+
expect(result.type).toBe("number");
|
|
59
|
+
expect(result.description).toBe("Test score");
|
|
60
|
+
expect(result.constraints).toEqual({
|
|
61
|
+
minimum: 0,
|
|
62
|
+
maximum: 100,
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
it("should convert boolean field to descriptor", () => {
|
|
66
|
+
const field = {
|
|
67
|
+
name: "active",
|
|
68
|
+
type: "boolean",
|
|
69
|
+
title: "Active Status",
|
|
70
|
+
};
|
|
71
|
+
const result = convertFieldToDescriptor(field);
|
|
72
|
+
expect(result.name).toBe("active");
|
|
73
|
+
expect(result.type).toBe("boolean");
|
|
74
|
+
expect(result.title).toBe("Active Status");
|
|
75
|
+
});
|
|
76
|
+
it("should convert date field to descriptor", () => {
|
|
77
|
+
const field = {
|
|
78
|
+
name: "birth_date",
|
|
79
|
+
type: "date",
|
|
80
|
+
description: "Date of birth",
|
|
81
|
+
};
|
|
82
|
+
const result = convertFieldToDescriptor(field);
|
|
83
|
+
expect(result.name).toBe("birth_date");
|
|
84
|
+
expect(result.type).toBe("date");
|
|
85
|
+
expect(result.description).toBe("Date of birth");
|
|
86
|
+
});
|
|
87
|
+
it("should convert datetime field to descriptor", () => {
|
|
88
|
+
const field = {
|
|
89
|
+
name: "created_at",
|
|
90
|
+
type: "datetime",
|
|
91
|
+
title: "Created At",
|
|
92
|
+
};
|
|
93
|
+
const result = convertFieldToDescriptor(field);
|
|
94
|
+
expect(result.name).toBe("created_at");
|
|
95
|
+
expect(result.type).toBe("datetime");
|
|
96
|
+
expect(result.title).toBe("Created At");
|
|
97
|
+
});
|
|
98
|
+
it("should convert time field to descriptor", () => {
|
|
99
|
+
const field = {
|
|
100
|
+
name: "start_time",
|
|
101
|
+
type: "time",
|
|
102
|
+
};
|
|
103
|
+
const result = convertFieldToDescriptor(field);
|
|
104
|
+
expect(result.name).toBe("start_time");
|
|
105
|
+
expect(result.type).toBe("time");
|
|
106
|
+
});
|
|
107
|
+
it("should convert object field to descriptor", () => {
|
|
108
|
+
const field = {
|
|
109
|
+
name: "metadata",
|
|
110
|
+
type: "object",
|
|
111
|
+
constraints: {
|
|
112
|
+
jsonSchema: {
|
|
113
|
+
type: "object",
|
|
114
|
+
properties: {
|
|
115
|
+
id: { type: "number" },
|
|
116
|
+
name: { type: "string" },
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
const result = convertFieldToDescriptor(field);
|
|
122
|
+
expect(result.name).toBe("metadata");
|
|
123
|
+
expect(result.type).toBe("object");
|
|
124
|
+
expect(result.constraints?.jsonSchema).toEqual({
|
|
125
|
+
type: "object",
|
|
126
|
+
properties: {
|
|
127
|
+
id: { type: "number" },
|
|
128
|
+
name: { type: "string" },
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
it("should convert array field to descriptor", () => {
|
|
133
|
+
const field = {
|
|
134
|
+
name: "tags",
|
|
135
|
+
type: "array",
|
|
136
|
+
constraints: {
|
|
137
|
+
jsonSchema: {
|
|
138
|
+
type: "array",
|
|
139
|
+
items: { type: "string" },
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
const result = convertFieldToDescriptor(field);
|
|
144
|
+
expect(result.name).toBe("tags");
|
|
145
|
+
expect(result.type).toBe("array");
|
|
146
|
+
expect(result.constraints?.jsonSchema).toEqual({
|
|
147
|
+
type: "array",
|
|
148
|
+
items: { type: "string" },
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
it("should preserve string field with categories", () => {
|
|
152
|
+
const field = {
|
|
153
|
+
name: "status",
|
|
154
|
+
type: "string",
|
|
155
|
+
categories: ["active", "inactive", "pending"],
|
|
156
|
+
categoriesOrdered: true,
|
|
157
|
+
};
|
|
158
|
+
const result = convertFieldToDescriptor(field);
|
|
159
|
+
expect(result.name).toBe("status");
|
|
160
|
+
expect(result.type).toBe("string");
|
|
161
|
+
expect(result.categories).toEqual(["active", "inactive", "pending"]);
|
|
162
|
+
expect(result.categoriesOrdered).toBe(true);
|
|
163
|
+
});
|
|
164
|
+
it("should preserve field with missingValues", () => {
|
|
165
|
+
const field = {
|
|
166
|
+
name: "value",
|
|
167
|
+
type: "string",
|
|
168
|
+
missingValues: ["", "NA", "N/A"],
|
|
169
|
+
};
|
|
170
|
+
const result = convertFieldToDescriptor(field);
|
|
171
|
+
expect(result.name).toBe("value");
|
|
172
|
+
expect(result.type).toBe("string");
|
|
173
|
+
expect(result.missingValues).toEqual(["", "NA", "N/A"]);
|
|
174
|
+
});
|
|
175
|
+
it("should preserve field with example and examples", () => {
|
|
176
|
+
const field = {
|
|
177
|
+
name: "age",
|
|
178
|
+
type: "integer",
|
|
179
|
+
example: 25,
|
|
180
|
+
examples: [18, 25, 30, 45],
|
|
181
|
+
};
|
|
182
|
+
const result = convertFieldToDescriptor(field);
|
|
183
|
+
expect(result.name).toBe("age");
|
|
184
|
+
expect(result.type).toBe("integer");
|
|
185
|
+
expect(result.example).toBe(25);
|
|
186
|
+
expect(result.examples).toEqual([18, 25, 30, 45]);
|
|
187
|
+
});
|
|
188
|
+
it("should preserve field with rdfType", () => {
|
|
189
|
+
const field = {
|
|
190
|
+
name: "age",
|
|
191
|
+
type: "integer",
|
|
192
|
+
rdfType: "http://schema.org/age",
|
|
193
|
+
};
|
|
194
|
+
const result = convertFieldToDescriptor(field);
|
|
195
|
+
expect(result.name).toBe("age");
|
|
196
|
+
expect(result.type).toBe("integer");
|
|
197
|
+
expect(result.rdfType).toBe("http://schema.org/age");
|
|
198
|
+
});
|
|
199
|
+
it("should convert field with all properties", () => {
|
|
200
|
+
const field = {
|
|
201
|
+
name: "email",
|
|
202
|
+
type: "string",
|
|
203
|
+
format: "email",
|
|
204
|
+
title: "Email Address",
|
|
205
|
+
description: "User's email address",
|
|
206
|
+
example: "user@example.com",
|
|
207
|
+
examples: ["user@example.com", "admin@example.org"],
|
|
208
|
+
rdfType: "http://schema.org/email",
|
|
209
|
+
missingValues: ["", "none"],
|
|
210
|
+
categories: ["personal", "work"],
|
|
211
|
+
categoriesOrdered: false,
|
|
212
|
+
constraints: {
|
|
213
|
+
required: true,
|
|
214
|
+
pattern: "^[a-z]+@[a-z]+\\.[a-z]+$",
|
|
215
|
+
},
|
|
216
|
+
};
|
|
217
|
+
const result = convertFieldToDescriptor(field);
|
|
218
|
+
expect(result.name).toBe("email");
|
|
219
|
+
expect(result.type).toBe("string");
|
|
220
|
+
expect(result.format).toBe("email");
|
|
221
|
+
expect(result.title).toBe("Email Address");
|
|
222
|
+
expect(result.description).toBe("User's email address");
|
|
223
|
+
expect(result.example).toBe("user@example.com");
|
|
224
|
+
expect(result.examples).toEqual(["user@example.com", "admin@example.org"]);
|
|
225
|
+
expect(result.rdfType).toBe("http://schema.org/email");
|
|
226
|
+
expect(result.missingValues).toEqual(["", "none"]);
|
|
227
|
+
expect(result.categories).toEqual(["personal", "work"]);
|
|
228
|
+
expect(result.categoriesOrdered).toBe(false);
|
|
229
|
+
expect(result.constraints).toEqual({
|
|
230
|
+
required: true,
|
|
231
|
+
pattern: "^[a-z]+@[a-z]+\\.[a-z]+$",
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
it("should convert year field to descriptor", () => {
|
|
235
|
+
const field = {
|
|
236
|
+
name: "birth_year",
|
|
237
|
+
type: "year",
|
|
238
|
+
};
|
|
239
|
+
const result = convertFieldToDescriptor(field);
|
|
240
|
+
expect(result.name).toBe("birth_year");
|
|
241
|
+
expect(result.type).toBe("year");
|
|
242
|
+
});
|
|
243
|
+
it("should convert yearmonth field to descriptor", () => {
|
|
244
|
+
const field = {
|
|
245
|
+
name: "start_month",
|
|
246
|
+
type: "yearmonth",
|
|
247
|
+
};
|
|
248
|
+
const result = convertFieldToDescriptor(field);
|
|
249
|
+
expect(result.name).toBe("start_month");
|
|
250
|
+
expect(result.type).toBe("yearmonth");
|
|
251
|
+
});
|
|
252
|
+
it("should convert duration field to descriptor", () => {
|
|
253
|
+
const field = {
|
|
254
|
+
name: "duration",
|
|
255
|
+
type: "duration",
|
|
256
|
+
};
|
|
257
|
+
const result = convertFieldToDescriptor(field);
|
|
258
|
+
expect(result.name).toBe("duration");
|
|
259
|
+
expect(result.type).toBe("duration");
|
|
260
|
+
});
|
|
261
|
+
it("should convert geopoint field to descriptor", () => {
|
|
262
|
+
const field = {
|
|
263
|
+
name: "location",
|
|
264
|
+
type: "geopoint",
|
|
265
|
+
format: "default",
|
|
266
|
+
};
|
|
267
|
+
const result = convertFieldToDescriptor(field);
|
|
268
|
+
expect(result.name).toBe("location");
|
|
269
|
+
expect(result.type).toBe("geopoint");
|
|
270
|
+
expect(result.format).toBe("default");
|
|
271
|
+
});
|
|
272
|
+
it("should convert geojson field to descriptor", () => {
|
|
273
|
+
const field = {
|
|
274
|
+
name: "geometry",
|
|
275
|
+
type: "geojson",
|
|
276
|
+
};
|
|
277
|
+
const result = convertFieldToDescriptor(field);
|
|
278
|
+
expect(result.name).toBe("geometry");
|
|
279
|
+
expect(result.type).toBe("geojson");
|
|
280
|
+
});
|
|
281
|
+
it("should convert any field to descriptor", () => {
|
|
282
|
+
const field = {
|
|
283
|
+
name: "data",
|
|
284
|
+
type: "any",
|
|
285
|
+
};
|
|
286
|
+
const result = convertFieldToDescriptor(field);
|
|
287
|
+
expect(result.name).toBe("data");
|
|
288
|
+
expect(result.type).toBe("any");
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9EZXNjcmlwdG9yLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9maWVsZC9jb252ZXJ0L3RvRGVzY3JpcHRvci5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUU3QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUU1RCxRQUFRLENBQUMsMEJBQTBCLEVBQUUsR0FBRyxFQUFFO0lBQ3hDLEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRSxHQUFHLEVBQUU7UUFDM0MsTUFBTSxLQUFLLEdBQVUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQTtRQUVuRCxNQUFNLE1BQU0sR0FBRyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUU5QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzdCLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2hDLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLDJDQUEyQyxFQUFFLEdBQUcsRUFBRTtRQUNuRCxNQUFNLEtBQUssR0FBVTtZQUNuQixJQUFJLEVBQUUsT0FBTztZQUNiLElBQUksRUFBRSxRQUFRO1lBQ2QsTUFBTSxFQUFFLE9BQU87WUFDZixLQUFLLEVBQUUsZUFBZTtZQUN0QixXQUFXLEVBQUUsc0JBQXNCO1NBQ3BDLENBQUE7UUFFRCxNQUFNLE1BQU0sR0FBRyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUU5QyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNqQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUks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QUFDLEtBQUssQ0FBQyxDQUFBO1FBRTlDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ3BDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ3JDLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLEdBQUcsRUFBRTtRQUNoRCxNQUFNLEtBQUssR0FBVTtZQUNuQixJQUFJLEVBQUUsTUFBTTtZQUNaLElBQUksRUFBRSxLQUFLO1NBQ1osQ0FBQTtRQUVELE1BQU0sTUFBTSxHQUFHLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRTlDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ2hDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2pDLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlc3RcIlxuaW1wb3J0IHR5cGUgeyBGaWVsZCB9IGZyb20gXCIuLi9GaWVsZC50c1wiXG5pbXBvcnQgeyBjb252ZXJ0RmllbGRUb0Rlc2NyaXB0b3IgfSBmcm9tIFwiLi90b0Rlc2NyaXB0b3IudHNcIlxuXG5kZXNjcmliZShcImNvbnZlcnRGaWVsZFRvRGVzY3JpcHRvclwiLCAoKSA9PiB7XG4gIGl0KFwic2hvdWxkIHJldHVybiBhIGNsb25lZCBkZXNjcmlwdG9yXCIsICgpID0+IHtcbiAgICBjb25zdCBmaWVsZDogRmllbGQgPSB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJzdHJpbmdcIiB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0RmllbGRUb0Rlc2NyaXB0b3IoZmllbGQpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGZpZWxkKVxuICAgIGV4cGVjdChyZXN1bHQpLm5vdC50b0JlKGZpZWxkKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGNvbnZlcnQgc3RyaW5nIGZpZWxkIHRvIGRlc2NyaXB0b3JcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkOiBGaWVsZCA9IHtcbiAgICAgIG5hbWU6IFwiZW1haWxcIixcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBmb3JtYXQ6IFwiZW1haWxcIixcbiAgICAgIHRpdGxlOiBcIkVtYWlsIEFkZHJlc3NcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlVzZXIncyBlbWFpbCBhZGRyZXNzXCIsXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydEZpZWxkVG9EZXNjcmlwdG9yKGZpZWxkKVxuXG4gICAgZXhwZWN0KHJlc3VsdC5uYW1lKS50b0JlKFwiZW1haWxcIilcbiAgICBleHBlY3QocmVzdWx0LnR5cGUpLnRvQmUoXCJzdHJpbmdcIilcbiAgICBleHBlY3QocmVzdWx0LmZvcm1hdCkudG9CZShcImVtYWlsXCIpXG4gICAgZXhwZWN0KHJlc3VsdC50aXRsZSkudG9CZShcIkVtYWlsIEFkZHJlc3NcIilcbiAgICBleHBlY3QocmVzdWx0LmRlc2NyaXB0aW9uKS50b0JlKFwiVXNlcidzIGVtYWlsIGFkZHJlc3NcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBjb252ZXJ0IGludGVnZXIgZmllbGQgdG8gZGVzY3JpcHRvclwiLCAoKSA9PiB7XG4gICAgY29uc3QgZmllbGQ6IEZpZWxkID0ge1xuICAgICAgbmFtZTogXCJhZ2VcIixcbiAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgdGl0bGU6IFwiQWdlXCIsXG4gICAgICBjb25zdHJhaW50czoge1xuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgbWF4aW11bTogMTUwLFxuICAgICAgfSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0RmllbGRUb0Rlc2NyaXB0b3IoZmllbGQpXG5cbiAgICBleHBlY3QocmVzdWx0Lm5hbWUpLnRvQmUoXCJhZ2VcIilcbiAgICBleHBlY3QocmVzdWx0LnR5cGUpLnRvQmUoXCJpbnRlZ2VyXCIpXG4gICAgZXhwZWN0KHJlc3VsdC50aXRsZSkudG9CZShcIkFnZVwiKVxuICAgIGV4cGVjdChyZXN1bHQuY29uc3RyYWludHMpLnRvRXF1YWwoe1xuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBtaW5pbXVtOiAwLFxuICAgICAgbWF4aW11bTogMTUwLFxuICAgIH0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgY29udmVydCBudW1iZXIgZmllbGQgdG8gZGVzY3JpcHRvclwiLCAoKSA9PiB7XG4gICAgY29uc3QgZmllbGQ6IEZpZWxkID0ge1xuICAgICAgbmFtZTogXCJzY29yZVwiLFxuICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRlc3Qgc2NvcmVcIixcbiAgICAgIGNvbnN0cmFpbnRzOiB7XG4gICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgIG1heGltdW06IDEwMCxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydEZpZWxkVG9EZXNjcmlwdG9yKGZpZWxkKVxuXG4gICAgZXhwZWN0KHJlc3VsdC5uYW1lKS50b0JlKFwic2NvcmVcIilcbiAgICBleHBlY3QocmVzdWx0LnR5cGUpLnRvQmUoXCJudW1iZXJcIilcbiAgICBleHBlY3QocmVzdWx0LmRlc2NyaXB0aW9uKS50b0JlKFwiVGVzdCBzY29yZVwiKVxuICAgIGV4cGVjdChyZXN1bHQuY29uc3RyYWludHMpLnRvRXF1YWwoe1xuICAgICAgbWluaW11bTogMCxcbiAgICAgIG1heGltdW06IDEwMCxcbiAgICB9KVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGNvbnZlcnQgYm9vbGVhbiBmaWVsZCB0byBkZXNjcmlwdG9yXCIsICgpID0+IHtcbiAgICBjb25zdCBmaWVsZDogRmllbGQgPSB7XG4gICAgICBuYW1lOiBcImFjdGl2ZVwiLFxuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICB0aXRsZTogXCJBY3RpdmUgU3RhdHVzXCIsXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydEZpZWxkVG9EZXNjcmlwdG9yKGZpZWxkKVxuXG4gICAgZXhwZWN0KHJlc3VsdC5uYW1lKS50b0JlKFwiYWN0aXZlXCIpXG4gICAgZXhwZWN0KHJlc3VsdC50eXBlKS50b0JlKFwiYm9vbGVhblwiKVxuICAgIGV4cGVjdChyZXN1bHQudGl0bGUpLnRvQmUoXCJBY3RpdmUgU3RhdHVzXCIpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgY29udmVydCBkYXRlIGZpZWxkIHRvIGRlc2NyaXB0b3JcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkOiBGaWVsZCA9IHtcbiAgICAgIG5hbWU6IFwiYmlydGhfZGF0ZVwiLFxuICAgICAgdHlwZTogXCJkYXRlXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJEYXRlIG9mIGJpcnRoXCIsXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydEZpZWxkVG9EZXNjcmlwdG9yKGZpZWxkKVxuXG4gICAgZXhwZWN0KHJlc3VsdC5uYW1lKS50b0JlKFwiYmlydGhfZGF0ZVwiKVxuICAgIGV4cGVjdChyZXN1bHQudHlwZSkudG9CZShcImRhdGVcIilcbiAgICBleHBlY3QocmVzdWx0LmRlc2NyaXB0aW9uKS50b0JlKFwiRGF0ZSBvZiBiaXJ0aFwiKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGNvbnZlcnQgZGF0ZXRpbWUgZmllbGQgdG8gZGVzY3JpcHRvclwiLCAoKSA9PiB7XG4gICAgY29uc3QgZmllbGQ6IEZpZWxkID0ge1xuICAgICAgbmFtZTogXCJjcmVhdGVkX2F0XCIsXG4gICAgICB0eXBlOiBcImRhdGV0aW1lXCIsXG4gICAgICB0aXRsZTogXCJDcmVhdGVkIEF0XCIsXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydEZpZWxkVG9EZXNjcmlwdG9yKGZpZWxkKVxuXG4gICAgZXhwZWN0KHJlc3VsdC5uYW1lKS50b0JlKFwiY3JlYXRlZF9hdFwiKVxuICAgIGV4cGVjdChyZXN1bHQudHlwZSkudG9CZShcImRhdGV0aW1lXCIpXG4gICAgZXhwZWN0KHJlc3VsdC50aXRsZSkudG9CZShcIkNyZWF0ZWQgQXRcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBjb252ZXJ0IHRpbWUgZmllbGQgdG8gZGVzY3JpcHRvclwiLCAoKSA9PiB7XG4gICAgY29uc3QgZmllbGQ6IEZpZWxkID0ge1xuICAgICAgbmFtZTogXCJzdGFydF90aW1lXCIsXG4gICAgICB0eXBlOiBcInRpbWVcIixcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0RmllbGRUb0Rlc2NyaXB0b3IoZmllbGQpXG5cbiAgICBleHBlY3QocmVzdWx0Lm5hbWUpLnRvQmUoXCJzdGFydF90aW1lXCIpXG4gICAgZXhwZWN0KHJlc3VsdC50eXBlKS50b0JlKFwidGltZVwiKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGNvbnZlcnQgb2JqZWN0IGZpZWxkIHRvIGRlc2NyaXB0b3JcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkOiBGaWVsZCA9IHtcbiAgICAgIG5hbWU6IFwibWV0YWRhdGFcIixcbiAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBjb25zdHJhaW50czoge1xuICAgICAgICBqc29uU2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBpZDogeyB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICAgICAgICBuYW1lOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0RmllbGRUb0Rlc2NyaXB0b3IoZmllbGQpXG5cbiAgICBleHBlY3QocmVzdWx0Lm5hbWUpLnRvQmUoXCJtZXRhZGF0YVwiKVxuICAgIGV4cGVjdChyZXN1bHQudHlwZSkudG9CZShcIm9iamVjdFwiKVxuICAgIGV4cGVjdCgocmVzdWx0LmNvbnN0cmFpbnRzIGFzIGFueSk/Lmpzb25TY2hlbWEpLnRvRXF1YWwoe1xuICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgaWQ6IHsgdHlwZTogXCJudW1iZXJcIiB9LFxuICAgICAgICBuYW1lOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIH0sXG4gICAgfSlcbiAgfSlcblxuICBpdChcInNob3VsZCBjb252ZXJ0IGFycmF5IGZpZWxkIHRvIGRlc2NyaXB0b3JcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkOiBGaWVsZCA9IHtcbiAgICAgIG5hbWU6IFwidGFnc1wiLFxuICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgY29uc3RyYWludHM6IHtcbiAgICAgICAganNvblNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBpdGVtczogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRGaWVsZFRvRGVzY3JpcHRvcihmaWVsZClcblxuICAgIGV4cGVjdChyZXN1bHQubmFtZSkudG9CZShcInRhZ3NcIilcbiAgICBleHBlY3QocmVzdWx0LnR5cGUpLnRvQmUoXCJhcnJheVwiKVxuICAgIGV4cGVjdCgocmVzdWx0LmNvbnN0cmFpbnRzIGFzIGFueSk/Lmpzb25TY2hlbWEpLnRvRXF1YWwoe1xuICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgaXRlbXM6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgIH0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgcHJlc2VydmUgc3RyaW5nIGZpZWxkIHdpdGggY2F0ZWdvcmllc1wiLCAoKSA9PiB7XG4gICAgY29uc3QgZmllbGQ6IEZpZWxkID0ge1xuICAgICAgbmFtZTogXCJzdGF0dXNcIixcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBjYXRlZ29yaWVzOiBbXCJhY3RpdmVcIiwgXCJpbmFjdGl2ZVwiLCBcInBlbmRpbmdcIl0sXG4gICAgICBjYXRlZ29yaWVzT3JkZXJlZDogdHJ1ZSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0RmllbGRUb0Rlc2NyaXB0b3IoZmllbGQpXG5cbiAgICBleHBlY3QocmVzdWx0Lm5hbWUpLnRvQmUoXCJzdGF0dXNcIilcbiAgICBleHBlY3QocmVzdWx0LnR5cGUpLnRvQmUoXCJzdHJpbmdcIilcbiAgICBleHBlY3QocmVzdWx0LmNhdGVnb3JpZXMpLnRvRXF1YWwoW1wiYWN0aXZlXCIsIFwiaW5hY3RpdmVcIiwgXCJwZW5kaW5nXCJdKVxuICAgIGV4cGVjdChyZXN1bHQuY2F0ZWdvcmllc09yZGVyZWQpLnRvQmUodHJ1ZSlcbiAgfSlcblxuICBpdChcInNob3VsZCBwcmVzZXJ2ZSBmaWVsZCB3aXRoIG1pc3NpbmdWYWx1ZXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkOiBGaWVsZCA9IHtcbiAgICAgIG5hbWU6IFwidmFsdWVcIixcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBtaXNzaW5nVmFsdWVzOiBbXCJcIiwgXCJOQVwiLCBcIk4vQVwiXSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0RmllbGRUb0Rlc2NyaXB0b3IoZmllbGQpXG5cbiAgICBleHBlY3QocmVzdWx0Lm5hbWUpLnRvQmUoXCJ2YWx1ZVwiKVxuICAgIGV4cGVjdChyZXN1bHQudHlwZSkudG9CZShcInN0cmluZ1wiKVxuICAgIGV4cGVjdChyZXN1bHQubWlzc2luZ1ZhbHVlcykudG9FcXVhbChbXCJcIiwgXCJOQVwiLCBcIk4vQVwiXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBwcmVzZXJ2ZSBmaWVsZCB3aXRoIGV4YW1wbGUgYW5kIGV4YW1wbGVzXCIsICgpID0+IHtcbiAgICBjb25zdCBmaWVsZDogRmllbGQgPSB7XG4gICAgICBuYW1lOiBcImFnZVwiLFxuICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG4gICAgICBleGFtcGxlOiAyNSxcbiAgICAgIGV4YW1wbGVzOiBbMTgsIDI1LCAzMCwgNDVdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRGaWVsZFRvRGVzY3JpcHRvcihmaWVsZClcblxuICAgIGV4cGVjdChyZXN1bHQubmFtZSkudG9CZShcImFnZVwiKVxuICAgIGV4cGVjdChyZXN1bHQudHlwZSkudG9CZShcImludGVnZXJcIilcbiAgICBleHBlY3QocmVzdWx0LmV4YW1wbGUpLnRvQmUoMjUpXG4gICAgZXhwZWN0KHJlc3VsdC5leGFtcGxlcykudG9FcXVhbChbMTgsIDI1LCAzMCwgNDVdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHByZXNlcnZlIGZpZWxkIHdpdGggcmRmVHlwZVwiLCAoKSA9PiB7XG4gICAgY29uc3QgZmllbGQ6IEZpZWxkID0ge1xuICAgICAgbmFtZTogXCJhZ2VcIixcbiAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgcmRmVHlwZTogXCJodHRwOi8vc2NoZW1hLm9yZy9hZ2VcIixcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0RmllbGRUb0Rlc2NyaXB0b3IoZmllbGQpXG5cbiAgICBleHBlY3QocmVzdWx0Lm5hbWUpLnRvQmUoXCJhZ2VcIilcbiAgICBleHBlY3QocmVzdWx0LnR5cGUpLnRvQmUoXCJpbnRlZ2VyXCIpXG4gICAgZXhwZWN0KHJlc3VsdC5yZGZUeXBlKS50b0JlKFwiaHR0cDovL3NjaGVtYS5vcmcvYWdlXCIpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgY29udmVydCBmaWVsZCB3aXRoIGFsbCBwcm9wZXJ0aWVzXCIsICgpID0+IHtcbiAgICBjb25zdCBmaWVsZDogRmllbGQgPSB7XG4gICAgICBuYW1lOiBcImVtYWlsXCIsXG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgZm9ybWF0OiBcImVtYWlsXCIsXG4gICAgICB0aXRsZTogXCJFbWFpbCBBZGRyZXNzXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJVc2VyJ3MgZW1haWwgYWRkcmVzc1wiLFxuICAgICAgZXhhbXBsZTogXCJ1c2VyQGV4YW1wbGUuY29tXCIsXG4gICAgICBleGFtcGxlczogW1widXNlckBleGFtcGxlLmNvbVwiLCBcImFkbWluQGV4YW1wbGUub3JnXCJdLFxuICAgICAgcmRmVHlwZTogXCJodHRwOi8vc2NoZW1hLm9yZy9lbWFpbFwiLFxuICAgICAgbWlzc2luZ1ZhbHVlczogW1wiXCIsIFwibm9uZVwiXSxcbiAgICAgIGNhdGVnb3JpZXM6IFtcInBlcnNvbmFsXCIsIFwid29ya1wiXSxcbiAgICAgIGNhdGVnb3JpZXNPcmRlcmVkOiBmYWxzZSxcbiAgICAgIGNvbnN0cmFpbnRzOiB7XG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICBwYXR0ZXJuOiBcIl5bYS16XStAW2Etel0rXFxcXC5bYS16XSskXCIsXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRGaWVsZFRvRGVzY3JpcHRvcihmaWVsZClcblxuICAgIGV4cGVjdChyZXN1bHQubmFtZSkudG9CZShcImVtYWlsXCIpXG4gICAgZXhwZWN0KHJlc3VsdC50eXBlKS50b0JlKFwic3RyaW5nXCIpXG4gICAgZXhwZWN0KHJlc3VsdC5mb3JtYXQpLnRvQmUoXCJlbWFpbFwiKVxuICAgIGV4cGVjdChyZXN1bHQudGl0bGUpLnRvQmUoXCJFbWFpbCBBZGRyZXNzXCIpXG4gICAgZXhwZWN0KHJlc3VsdC5kZXNjcmlwdGlvbikudG9CZShcIlVzZXIncyBlbWFpbCBhZGRyZXNzXCIpXG4gICAgZXhwZWN0KHJlc3VsdC5leGFtcGxlKS50b0JlKFwidXNlckBleGFtcGxlLmNvbVwiKVxuICAgIGV4cGVjdChyZXN1bHQuZXhhbXBsZXMpLnRvRXF1YWwoW1widXNlckBleGFtcGxlLmNvbVwiLCBcImFkbWluQGV4YW1wbGUub3JnXCJdKVxuICAgIGV4cGVjdChyZXN1bHQucmRmVHlwZSkudG9CZShcImh0dHA6Ly9zY2hlbWEub3JnL2VtYWlsXCIpXG4gICAgZXhwZWN0KHJlc3VsdC5taXNzaW5nVmFsdWVzKS50b0VxdWFsKFtcIlwiLCBcIm5vbmVcIl0pXG4gICAgZXhwZWN0KHJlc3VsdC5jYXRlZ29yaWVzKS50b0VxdWFsKFtcInBlcnNvbmFsXCIsIFwid29ya1wiXSlcbiAgICBleHBlY3QocmVzdWx0LmNhdGVnb3JpZXNPcmRlcmVkKS50b0JlKGZhbHNlKVxuICAgIGV4cGVjdChyZXN1bHQuY29uc3RyYWludHMpLnRvRXF1YWwoe1xuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBwYXR0ZXJuOiBcIl5bYS16XStAW2Etel0rXFxcXC5bYS16XSskXCIsXG4gICAgfSlcbiAgfSlcblxuICBpdChcInNob3VsZCBjb252ZXJ0IHllYXIgZmllbGQgdG8gZGVzY3JpcHRvclwiLCAoKSA9PiB7XG4gICAgY29uc3QgZmllbGQ6IEZpZWxkID0ge1xuICAgICAgbmFtZTogXCJiaXJ0aF95ZWFyXCIsXG4gICAgICB0eXBlOiBcInllYXJcIixcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0RmllbGRUb0Rlc2NyaXB0b3IoZmllbGQpXG5cbiAgICBleHBlY3QocmVzdWx0Lm5hbWUpLnRvQmUoXCJiaXJ0aF95ZWFyXCIpXG4gICAgZXhwZWN0KHJlc3VsdC50eXBlKS50b0JlKFwieWVhclwiKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGNvbnZlcnQgeWVhcm1vbnRoIGZpZWxkIHRvIGRlc2NyaXB0b3JcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkOiBGaWVsZCA9IHtcbiAgICAgIG5hbWU6IFwic3RhcnRfbW9udGhcIixcbiAgICAgIHR5cGU6IFwieWVhcm1vbnRoXCIsXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydEZpZWxkVG9EZXNjcmlwdG9yKGZpZWxkKVxuXG4gICAgZXhwZWN0KHJlc3VsdC5uYW1lKS50b0JlKFwic3RhcnRfbW9udGhcIilcbiAgICBleHBlY3QocmVzdWx0LnR5cGUpLnRvQmUoXCJ5ZWFybW9udGhcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBjb252ZXJ0IGR1cmF0aW9uIGZpZWxkIHRvIGRlc2NyaXB0b3JcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkOiBGaWVsZCA9IHtcbiAgICAgIG5hbWU6IFwiZHVyYXRpb25cIixcbiAgICAgIHR5cGU6IFwiZHVyYXRpb25cIixcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0RmllbGRUb0Rlc2NyaXB0b3IoZmllbGQpXG5cbiAgICBleHBlY3QocmVzdWx0Lm5hbWUpLnRvQmUoXCJkdXJhdGlvblwiKVxuICAgIGV4cGVjdChyZXN1bHQudHlwZSkudG9CZShcImR1cmF0aW9uXCIpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgY29udmVydCBnZW9wb2ludCBmaWVsZCB0byBkZXNjcmlwdG9yXCIsICgpID0+IHtcbiAgICBjb25zdCBmaWVsZDogRmllbGQgPSB7XG4gICAgICBuYW1lOiBcImxvY2F0aW9uXCIsXG4gICAgICB0eXBlOiBcImdlb3BvaW50XCIsXG4gICAgICBmb3JtYXQ6IFwiZGVmYXVsdFwiLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRGaWVsZFRvRGVzY3JpcHRvcihmaWVsZClcblxuICAgIGV4cGVjdChyZXN1bHQubmFtZSkudG9CZShcImxvY2F0aW9uXCIpXG4gICAgZXhwZWN0KHJlc3VsdC50eXBlKS50b0JlKFwiZ2VvcG9pbnRcIilcbiAgICBleHBlY3QocmVzdWx0LmZvcm1hdCkudG9CZShcImRlZmF1bHRcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBjb252ZXJ0IGdlb2pzb24gZmllbGQgdG8gZGVzY3JpcHRvclwiLCAoKSA9PiB7XG4gICAgY29uc3QgZmllbGQ6IEZpZWxkID0ge1xuICAgICAgbmFtZTogXCJnZW9tZXRyeVwiLFxuICAgICAgdHlwZTogXCJnZW9qc29uXCIsXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydEZpZWxkVG9EZXNjcmlwdG9yKGZpZWxkKVxuXG4gICAgZXhwZWN0KHJlc3VsdC5uYW1lKS50b0JlKFwiZ2VvbWV0cnlcIilcbiAgICBleHBlY3QocmVzdWx0LnR5cGUpLnRvQmUoXCJnZW9qc29uXCIpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgY29udmVydCBhbnkgZmllbGQgdG8gZGVzY3JpcHRvclwiLCAoKSA9PiB7XG4gICAgY29uc3QgZmllbGQ6IEZpZWxkID0ge1xuICAgICAgbmFtZTogXCJkYXRhXCIsXG4gICAgICB0eXBlOiBcImFueVwiLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRGaWVsZFRvRGVzY3JpcHRvcihmaWVsZClcblxuICAgIGV4cGVjdChyZXN1bHQubmFtZSkudG9CZShcImRhdGFcIilcbiAgICBleHBlY3QocmVzdWx0LnR5cGUpLnRvQmUoXCJhbnlcIilcbiAgfSlcbn0pXG4iXX0=
|