@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.
Files changed (312) hide show
  1. package/README.md +3 -0
  2. package/build/assets/dialect-1.0.json +58 -0
  3. package/build/assets/dialect-2.0.json +98 -0
  4. package/build/assets/package-1.0.json +1517 -0
  5. package/build/assets/package-2.0.json +2168 -0
  6. package/build/assets/resource-1.0.json +1353 -0
  7. package/build/assets/resource-2.0.json +1987 -0
  8. package/build/assets/schema-1.0.json +1126 -0
  9. package/build/assets/schema-2.0.json +1715 -0
  10. package/build/descriptor/Descriptor.d.ts +2 -0
  11. package/build/descriptor/Descriptor.js +4 -0
  12. package/build/descriptor/index.d.ts +6 -0
  13. package/build/descriptor/index.js +6 -0
  14. package/build/descriptor/load.d.ts +8 -0
  15. package/build/descriptor/load.js +36 -0
  16. package/build/descriptor/load.spec.d.ts +1 -0
  17. package/build/descriptor/load.spec.js +44 -0
  18. package/build/descriptor/process/parse.d.ts +2 -0
  19. package/build/descriptor/process/parse.js +8 -0
  20. package/build/descriptor/process/stringify.d.ts +2 -0
  21. package/build/descriptor/process/stringify.js +4 -0
  22. package/build/descriptor/save.d.ts +9 -0
  23. package/build/descriptor/save.js +19 -0
  24. package/build/descriptor/save.spec.d.ts +1 -0
  25. package/build/descriptor/save.spec.js +99 -0
  26. package/build/dialect/Dialect.d.ts +89 -0
  27. package/build/dialect/Dialect.js +2 -0
  28. package/build/dialect/assert.d.ts +6 -0
  29. package/build/dialect/assert.js +12 -0
  30. package/build/dialect/assert.spec.d.ts +1 -0
  31. package/build/dialect/assert.spec.js +22 -0
  32. package/build/dialect/convert/fromDescriptor.d.ts +2 -0
  33. package/build/dialect/convert/fromDescriptor.js +20 -0
  34. package/build/dialect/convert/toDescriptor.d.ts +3 -0
  35. package/build/dialect/convert/toDescriptor.js +5 -0
  36. package/build/dialect/index.d.ts +8 -0
  37. package/build/dialect/index.js +8 -0
  38. package/build/dialect/load.d.ts +5 -0
  39. package/build/dialect/load.js +12 -0
  40. package/build/dialect/load.spec.d.ts +1 -0
  41. package/build/dialect/load.spec.js +18 -0
  42. package/build/dialect/resolve.d.ts +2 -0
  43. package/build/dialect/resolve.js +11 -0
  44. package/build/dialect/save.d.ts +9 -0
  45. package/build/dialect/save.js +16 -0
  46. package/build/dialect/save.spec.d.ts +1 -0
  47. package/build/dialect/save.spec.js +52 -0
  48. package/build/dialect/validate.d.ts +10 -0
  49. package/build/dialect/validate.js +25 -0
  50. package/build/dialect/validate.spec.d.ts +1 -0
  51. package/build/dialect/validate.spec.js +28 -0
  52. package/build/error/Bound.d.ts +4 -0
  53. package/build/error/Bound.js +2 -0
  54. package/build/error/Error.d.ts +3 -0
  55. package/build/error/Error.js +2 -0
  56. package/build/error/Unbound.d.ts +6 -0
  57. package/build/error/Unbound.js +2 -0
  58. package/build/error/index.d.ts +16 -0
  59. package/build/error/index.js +2 -0
  60. package/build/error/types/Base.d.ts +3 -0
  61. package/build/error/types/Base.js +2 -0
  62. package/build/error/types/Bytes.d.ts +6 -0
  63. package/build/error/types/Bytes.js +2 -0
  64. package/build/error/types/Cell.d.ts +56 -0
  65. package/build/error/types/Cell.js +2 -0
  66. package/build/error/types/Data.d.ts +5 -0
  67. package/build/error/types/Data.js +2 -0
  68. package/build/error/types/Document.d.ts +7 -0
  69. package/build/error/types/Document.js +2 -0
  70. package/build/error/types/Encoding.d.ts +6 -0
  71. package/build/error/types/Encoding.js +2 -0
  72. package/build/error/types/Field.d.ts +15 -0
  73. package/build/error/types/Field.js +2 -0
  74. package/build/error/types/Fields.d.ts +11 -0
  75. package/build/error/types/Fields.js +2 -0
  76. package/build/error/types/File.d.ts +4 -0
  77. package/build/error/types/File.js +2 -0
  78. package/build/error/types/ForeignKey.d.ts +7 -0
  79. package/build/error/types/ForeignKey.js +2 -0
  80. package/build/error/types/Hash.d.ts +6 -0
  81. package/build/error/types/Hash.js +2 -0
  82. package/build/error/types/Metadata.d.ts +9 -0
  83. package/build/error/types/Metadata.js +2 -0
  84. package/build/error/types/Row.d.ts +9 -0
  85. package/build/error/types/Row.js +2 -0
  86. package/build/error/types/Table.d.ts +6 -0
  87. package/build/error/types/Table.js +2 -0
  88. package/build/field/Field.d.ts +5 -0
  89. package/build/field/Field.js +2 -0
  90. package/build/field/Type.d.ts +2 -0
  91. package/build/field/Type.js +2 -0
  92. package/build/field/convert/fromDescriptor.d.ts +2 -0
  93. package/build/field/convert/fromDescriptor.js +61 -0
  94. package/build/field/convert/fromDescriptor.spec.d.ts +1 -0
  95. package/build/field/convert/fromDescriptor.spec.js +241 -0
  96. package/build/field/convert/toDescriptor.d.ts +3 -0
  97. package/build/field/convert/toDescriptor.js +5 -0
  98. package/build/field/convert/toDescriptor.spec.d.ts +1 -0
  99. package/build/field/convert/toDescriptor.spec.js +291 -0
  100. package/build/field/index.d.ts +5 -0
  101. package/build/field/index.js +3 -0
  102. package/build/field/types/Any.d.ts +20 -0
  103. package/build/field/types/Any.js +2 -0
  104. package/build/field/types/Array.d.ts +32 -0
  105. package/build/field/types/Array.js +2 -0
  106. package/build/field/types/Base.d.ts +60 -0
  107. package/build/field/types/Base.js +2 -0
  108. package/build/field/types/Boolean.d.ts +28 -0
  109. package/build/field/types/Boolean.js +2 -0
  110. package/build/field/types/Date.d.ts +43 -0
  111. package/build/field/types/Date.js +2 -0
  112. package/build/field/types/Datetime.d.ts +43 -0
  113. package/build/field/types/Datetime.js +2 -0
  114. package/build/field/types/Duration.d.ts +28 -0
  115. package/build/field/types/Duration.js +2 -0
  116. package/build/field/types/Geojson.d.ts +30 -0
  117. package/build/field/types/Geojson.js +2 -0
  118. package/build/field/types/Geopoint.d.ts +27 -0
  119. package/build/field/types/Geopoint.js +2 -0
  120. package/build/field/types/Integer.d.ts +57 -0
  121. package/build/field/types/Integer.js +2 -0
  122. package/build/field/types/List.d.ts +36 -0
  123. package/build/field/types/List.js +2 -0
  124. package/build/field/types/Number.d.ts +48 -0
  125. package/build/field/types/Number.js +2 -0
  126. package/build/field/types/Object.d.ts +32 -0
  127. package/build/field/types/Object.js +2 -0
  128. package/build/field/types/String.d.ts +51 -0
  129. package/build/field/types/String.js +2 -0
  130. package/build/field/types/Time.d.ts +43 -0
  131. package/build/field/types/Time.js +2 -0
  132. package/build/field/types/Year.d.ts +36 -0
  133. package/build/field/types/Year.js +2 -0
  134. package/build/field/types/Yearmonth.d.ts +36 -0
  135. package/build/field/types/Yearmonth.js +2 -0
  136. package/build/field/types/index.d.ts +16 -0
  137. package/build/field/types/index.js +17 -0
  138. package/build/index.d.ts +112 -0
  139. package/build/index.js +32 -0
  140. package/build/json/Schema.d.ts +2 -0
  141. package/build/json/Schema.js +2 -0
  142. package/build/json/Value.d.ts +1 -0
  143. package/build/json/Value.js +2 -0
  144. package/build/json/ajv.d.ts +2 -0
  145. package/build/json/ajv.js +10 -0
  146. package/build/json/assert.d.ts +2 -0
  147. package/build/json/assert.js +10 -0
  148. package/build/json/cache.d.ts +2 -0
  149. package/build/json/cache.js +5 -0
  150. package/build/json/index.d.ts +5 -0
  151. package/build/json/index.js +4 -0
  152. package/build/json/inspect/schema.d.ts +4 -0
  153. package/build/json/inspect/schema.js +10 -0
  154. package/build/json/inspect/schema.spec.d.ts +1 -0
  155. package/build/json/inspect/schema.spec.js +132 -0
  156. package/build/json/inspect/value.d.ts +11 -0
  157. package/build/json/inspect/value.js +21 -0
  158. package/build/json/inspect/value.spec.d.ts +1 -0
  159. package/build/json/inspect/value.spec.js +121 -0
  160. package/build/json/load.d.ts +3 -0
  161. package/build/json/load.js +13 -0
  162. package/build/json/resolve.d.ts +2 -0
  163. package/build/json/resolve.js +11 -0
  164. package/build/metadata/Metadata.d.ts +3 -0
  165. package/build/metadata/Metadata.js +2 -0
  166. package/build/metadata/index.d.ts +1 -0
  167. package/build/metadata/index.js +2 -0
  168. package/build/package/Contributor.d.ts +21 -0
  169. package/build/package/Contributor.js +2 -0
  170. package/build/package/Package.d.ts +64 -0
  171. package/build/package/Package.js +2 -0
  172. package/build/package/assert.d.ts +8 -0
  173. package/build/package/assert.js +12 -0
  174. package/build/package/assert.spec.d.ts +1 -0
  175. package/build/package/assert.spec.js +26 -0
  176. package/build/package/convert/fromDescriptor.d.ts +4 -0
  177. package/build/package/convert/fromDescriptor.js +36 -0
  178. package/build/package/convert/toDescriptor.d.ts +5 -0
  179. package/build/package/convert/toDescriptor.js +7 -0
  180. package/build/package/index.d.ts +8 -0
  181. package/build/package/index.js +7 -0
  182. package/build/package/load.d.ts +5 -0
  183. package/build/package/load.js +14 -0
  184. package/build/package/load.spec.d.ts +1 -0
  185. package/build/package/load.spec.js +28 -0
  186. package/build/package/save.d.ts +9 -0
  187. package/build/package/save.js +18 -0
  188. package/build/package/save.spec.d.ts +1 -0
  189. package/build/package/save.spec.js +311 -0
  190. package/build/package/validate.d.ts +12 -0
  191. package/build/package/validate.js +27 -0
  192. package/build/package/validate.spec.d.ts +1 -0
  193. package/build/package/validate.spec.js +41 -0
  194. package/build/path/basepath.d.ts +2 -0
  195. package/build/path/basepath.js +25 -0
  196. package/build/path/basepath.spec.d.ts +1 -0
  197. package/build/path/basepath.spec.js +55 -0
  198. package/build/path/denormalize.d.ts +3 -0
  199. package/build/path/denormalize.js +29 -0
  200. package/build/path/denormalize.spec.d.ts +1 -0
  201. package/build/path/denormalize.spec.js +45 -0
  202. package/build/path/index.d.ts +5 -0
  203. package/build/path/index.js +6 -0
  204. package/build/path/normalize.d.ts +6 -0
  205. package/build/path/normalize.js +54 -0
  206. package/build/path/normalize.spec.d.ts +1 -0
  207. package/build/path/normalize.spec.js +71 -0
  208. package/build/path/path.d.ts +5 -0
  209. package/build/path/path.js +48 -0
  210. package/build/path/path.spec.d.ts +1 -0
  211. package/build/path/path.spec.js +111 -0
  212. package/build/platform/index.d.ts +1 -0
  213. package/build/platform/index.js +2 -0
  214. package/build/platform/node.d.ts +130 -0
  215. package/build/platform/node.js +10 -0
  216. package/build/platform/node.spec.d.ts +1 -0
  217. package/build/platform/node.spec.js +16 -0
  218. package/build/profile/@minify.d.ts +1 -0
  219. package/build/profile/@minify.js +58 -0
  220. package/build/profile/Profile.d.ts +9 -0
  221. package/build/profile/Profile.js +2 -0
  222. package/build/profile/assert.d.ts +6 -0
  223. package/build/profile/assert.js +36 -0
  224. package/build/profile/assert.spec.d.ts +1 -0
  225. package/build/profile/assert.spec.js +115 -0
  226. package/build/profile/index.d.ts +2 -0
  227. package/build/profile/index.js +2 -0
  228. package/build/profile/load.d.ts +4 -0
  229. package/build/profile/load.js +12 -0
  230. package/build/profile/registry.d.ts +2 -0
  231. package/build/profile/registry.js +83 -0
  232. package/build/profile/resolve.d.ts +2 -0
  233. package/build/profile/resolve.js +8 -0
  234. package/build/profile/validate.d.ts +9 -0
  235. package/build/profile/validate.js +12 -0
  236. package/build/report/Report.d.ts +5 -0
  237. package/build/report/Report.js +2 -0
  238. package/build/report/create.d.ts +7 -0
  239. package/build/report/create.js +6 -0
  240. package/build/report/index.d.ts +2 -0
  241. package/build/report/index.js +2 -0
  242. package/build/resource/License.d.ts +18 -0
  243. package/build/resource/License.js +2 -0
  244. package/build/resource/Resource.d.ts +93 -0
  245. package/build/resource/Resource.js +2 -0
  246. package/build/resource/Source.d.ts +17 -0
  247. package/build/resource/Source.js +2 -0
  248. package/build/resource/assert.d.ts +8 -0
  249. package/build/resource/assert.js +12 -0
  250. package/build/resource/assert.spec.d.ts +1 -0
  251. package/build/resource/assert.spec.js +23 -0
  252. package/build/resource/convert/fromDescriptor.d.ts +4 -0
  253. package/build/resource/convert/fromDescriptor.js +69 -0
  254. package/build/resource/convert/toDescriptor.d.ts +5 -0
  255. package/build/resource/convert/toDescriptor.js +36 -0
  256. package/build/resource/helpers.d.ts +2 -0
  257. package/build/resource/helpers.js +6 -0
  258. package/build/resource/index.d.ts +11 -0
  259. package/build/resource/index.js +9 -0
  260. package/build/resource/infer.d.ts +3 -0
  261. package/build/resource/infer.js +35 -0
  262. package/build/resource/infer.spec.d.ts +1 -0
  263. package/build/resource/infer.spec.js +103 -0
  264. package/build/resource/load.d.ts +5 -0
  265. package/build/resource/load.js +14 -0
  266. package/build/resource/load.spec.d.ts +1 -0
  267. package/build/resource/load.spec.js +22 -0
  268. package/build/resource/save.d.ts +9 -0
  269. package/build/resource/save.js +18 -0
  270. package/build/resource/save.spec.d.ts +1 -0
  271. package/build/resource/save.spec.js +170 -0
  272. package/build/resource/validate.d.ts +13 -0
  273. package/build/resource/validate.js +57 -0
  274. package/build/resource/validate.spec.d.ts +1 -0
  275. package/build/resource/validate.spec.js +30 -0
  276. package/build/schema/ForeignKey.d.ts +23 -0
  277. package/build/schema/ForeignKey.js +2 -0
  278. package/build/schema/Schema.d.ts +56 -0
  279. package/build/schema/Schema.js +2 -0
  280. package/build/schema/assert.d.ts +6 -0
  281. package/build/schema/assert.js +12 -0
  282. package/build/schema/assert.spec.d.ts +1 -0
  283. package/build/schema/assert.spec.js +34 -0
  284. package/build/schema/convert/fromDescriptor.d.ts +2 -0
  285. package/build/schema/convert/fromDescriptor.js +70 -0
  286. package/build/schema/convert/fromJsonSchema.d.ts +3 -0
  287. package/build/schema/convert/fromJsonSchema.js +105 -0
  288. package/build/schema/convert/fromJsonSchema.spec.d.ts +1 -0
  289. package/build/schema/convert/fromJsonSchema.spec.js +156 -0
  290. package/build/schema/convert/toDescriptor.d.ts +3 -0
  291. package/build/schema/convert/toDescriptor.js +5 -0
  292. package/build/schema/convert/toJsonSchema.d.ts +3 -0
  293. package/build/schema/convert/toJsonSchema.js +173 -0
  294. package/build/schema/convert/toJsonSchema.spec.d.ts +1 -0
  295. package/build/schema/convert/toJsonSchema.spec.js +403 -0
  296. package/build/schema/index.d.ts +11 -0
  297. package/build/schema/index.js +10 -0
  298. package/build/schema/load.d.ts +5 -0
  299. package/build/schema/load.js +12 -0
  300. package/build/schema/load.spec.d.ts +1 -0
  301. package/build/schema/load.spec.js +55 -0
  302. package/build/schema/resolve.d.ts +2 -0
  303. package/build/schema/resolve.js +11 -0
  304. package/build/schema/save.d.ts +9 -0
  305. package/build/schema/save.js +16 -0
  306. package/build/schema/save.spec.d.ts +1 -0
  307. package/build/schema/save.spec.js +58 -0
  308. package/build/schema/validate.d.ts +10 -0
  309. package/build/schema/validate.js +25 -0
  310. package/build/schema/validate.spec.d.ts +1 -0
  311. package/build/schema/validate.spec.js +41 -0
  312. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbURlc2NyaXB0b3Iuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2ZpZWxkL2NvbnZlcnQvZnJvbURlc2NyaXB0b3Iuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQ2pELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBRWhFLFFBQVEsQ0FBQyw0QkFBNEIsRUFBRSxHQUFHLEVBQUU7SUFDMUMsRUFBRSxDQUFDLG1DQUFtQyxFQUFFLEdBQUcsRUFBRTtRQUMzQyxNQUFNLFVBQVUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFBO1FBRWpELE1BQU0sTUFBTSxHQUFHLDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRXJELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDbEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDckMsQ0FBQyxDQUFDLENBQUE7SUFFRixRQUFRLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxFQUFFO1FBQ2pDLEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRSxHQUFHLEVBQUU7WUFDL0MsTUFBTSxVQUFVLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFBO1lBRXRFLE1BQU0sTUFBTSxHQUFHLDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBRXJELE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3JDLENBQUMsQ0FBQyxDQUFBO1FB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SUFBSSxFQUFFLFNBQVM7Z0JBQ2YsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsT0FBTyxFQUFFLEdBQUc7YUFDYixDQUFDLENBQUE7WUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFDakMsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsT0FBTyxFQUFFLEdBQUc7YUFDYixDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCwgdmkgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IGNvbnZlcnRGaWVsZEZyb21EZXNjcmlwdG9yIH0gZnJvbSBcIi4vZnJvbURlc2NyaXB0b3IudHNcIlxuXG5kZXNjcmliZShcImNvbnZlcnRGaWVsZEZyb21EZXNjcmlwdG9yXCIsICgpID0+IHtcbiAgaXQoXCJzaG91bGQgcmV0dXJuIGEgY2xvbmVkIGRlc2NyaXB0b3JcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJzdHJpbmdcIiB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0RmllbGRGcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChkZXNjcmlwdG9yKVxuICAgIGV4cGVjdChyZXN1bHQpLm5vdC50b0JlKGRlc2NyaXB0b3IpXG4gIH0pXG5cbiAgZGVzY3JpYmUoXCJmb3JtYXQgY29udmVyc2lvblwiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgcmVtb3ZlIGZtdDogcHJlZml4IGZyb20gZm9ybWF0XCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJzdHJpbmdcIiwgZm9ybWF0OiBcImZtdDplbWFpbFwiIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydEZpZWxkRnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcilcblxuICAgICAgZXhwZWN0KHJlc3VsdC5mb3JtYXQpLnRvQmUoXCJlbWFpbFwiKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBwcmVzZXJ2ZSBmb3JtYXQgd2l0aG91dCBmbXQ6IHByZWZpeFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0geyBuYW1lOiBcImlkXCIsIHR5cGU6IFwic3RyaW5nXCIsIGZvcm1hdDogXCJlbWFpbFwiIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydEZpZWxkRnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcilcblxuICAgICAgZXhwZWN0KHJlc3VsdC5mb3JtYXQpLnRvQmUoXCJlbWFpbFwiKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgZGVzY3JpcHRvciB3aXRob3V0IGZvcm1hdFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0geyBuYW1lOiBcImlkXCIsIHR5cGU6IFwic3RyaW5nXCIgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0RmllbGRGcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yKVxuXG4gICAgICBleHBlY3QocmVzdWx0LmZvcm1hdCkudG9CZVVuZGVmaW5lZCgpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZShcIm1pc3NpbmdWYWx1ZXMgdmFsaWRhdGlvblwiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgcHJlc2VydmUgdmFsaWQgbWlzc2luZ1ZhbHVlcyBhcnJheVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0ge1xuICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIG1pc3NpbmdWYWx1ZXM6IFtcIlwiLCBcIk5BXCIsIFwiTi9BXCJdLFxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0RmllbGRGcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yKVxuXG4gICAgICBleHBlY3QocmVzdWx0Lm1pc3NpbmdWYWx1ZXMpLnRvRXF1YWwoW1wiXCIsIFwiTkFcIiwgXCJOL0FcIl0pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIHJlbW92ZSBpbnZhbGlkIG5vbi1hcnJheSBtaXNzaW5nVmFsdWVzIGFuZCB3YXJuXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnNvbGVXYXJuU3B5ID0gdmlcbiAgICAgICAgLnNweU9uKGNvbnNvbGUsIFwid2FyblwiKVxuICAgICAgICAubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHt9KVxuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHtcbiAgICAgICAgbmFtZTogXCJpZFwiLFxuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBtaXNzaW5nVmFsdWVzOiBcImludmFsaWRcIixcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydEZpZWxkRnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcilcblxuICAgICAgZXhwZWN0KHJlc3VsdC5taXNzaW5nVmFsdWVzKS50b0JlVW5kZWZpbmVkKClcbiAgICAgIGV4cGVjdChjb25zb2xlV2FyblNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgIFwiSWdub3JpbmcgdjIuMCBpbmNvbXBhdGlibGUgbWlzc2luZ1ZhbHVlczogaW52YWxpZFwiLFxuICAgICAgKVxuICAgICAgY29uc29sZVdhcm5TcHkubW9ja1Jlc3RvcmUoKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgZGVzY3JpcHRvciB3aXRob3V0IG1pc3NpbmdWYWx1ZXNcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcInN0cmluZ1wiIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydEZpZWxkRnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcilcblxuICAgICAgZXhwZWN0KHJlc3VsdC5taXNzaW5nVmFsdWVzKS50b0JlVW5kZWZpbmVkKClcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKFwiY2F0ZWdvcmllcyB2YWxpZGF0aW9uXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBwcmVzZXJ2ZSB2YWxpZCBjYXRlZ29yaWVzIGFycmF5XCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB7XG4gICAgICAgIG5hbWU6IFwic3RhdHVzXCIsXG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGNhdGVnb3JpZXM6IFtcImFjdGl2ZVwiLCBcImluYWN0aXZlXCIsIFwicGVuZGluZ1wiXSxcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydEZpZWxkRnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcilcblxuICAgICAgZXhwZWN0KHJlc3VsdC5jYXRlZ29yaWVzKS50b0VxdWFsKFtcImFjdGl2ZVwiLCBcImluYWN0aXZlXCIsIFwicGVuZGluZ1wiXSlcbiAgICB9KVxuXG4gICAgaXQoXCJzaG91bGQgcmVtb3ZlIGludmFsaWQgbm9uLWFycmF5IGNhdGVnb3JpZXMgYW5kIHdhcm5cIiwgKCkgPT4ge1xuICAgICAgY29uc3QgY29uc29sZVdhcm5TcHkgPSB2aVxuICAgICAgICAuc3B5T24oY29uc29sZSwgXCJ3YXJuXCIpXG4gICAgICAgIC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge30pXG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0ge1xuICAgICAgICBuYW1lOiBcInN0YXR1c1wiLFxuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBjYXRlZ29yaWVzOiBcImludmFsaWRcIixcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydEZpZWxkRnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcilcblxuICAgICAgZXhwZWN0KHJlc3VsdC5jYXRlZ29yaWVzKS50b0JlVW5kZWZpbmVkKClcbiAgICAgIGV4cGVjdChjb25zb2xlV2FyblNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgIFwiSWdub3JpbmcgdjIuMCBpbmNvbXBhdGlibGUgY2F0ZWdvcmllczogaW52YWxpZFwiLFxuICAgICAgKVxuICAgICAgY29uc29sZVdhcm5TcHkubW9ja1Jlc3RvcmUoKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgZGVzY3JpcHRvciB3aXRob3V0IGNhdGVnb3JpZXNcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHsgbmFtZTogXCJzdGF0dXNcIiwgdHlwZTogXCJzdHJpbmdcIiB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRGaWVsZEZyb21EZXNjcmlwdG9yKGRlc2NyaXB0b3IpXG5cbiAgICAgIGV4cGVjdChyZXN1bHQuY2F0ZWdvcmllcykudG9CZVVuZGVmaW5lZCgpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZShcImNhdGVnb3JpZXNPcmRlcmVkIHZhbGlkYXRpb25cIiwgKCkgPT4ge1xuICAgIGl0KFwic2hvdWxkIHByZXNlcnZlIHZhbGlkIGNhdGVnb3JpZXNPcmRlcmVkIGJvb2xlYW5cIiwgKCkgPT4ge1xuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHtcbiAgICAgICAgbmFtZTogXCJzdGF0dXNcIixcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgY2F0ZWdvcmllc09yZGVyZWQ6IHRydWUsXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRGaWVsZEZyb21EZXNjcmlwdG9yKGRlc2NyaXB0b3IpXG5cbiAgICAgIGV4cGVjdChyZXN1bHQuY2F0ZWdvcmllc09yZGVyZWQpLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoXCJzaG91bGQgcmVtb3ZlIGludmFsaWQgbm9uLWJvb2xlYW4gY2F0ZWdvcmllc09yZGVyZWQgYW5kIHdhcm5cIiwgKCkgPT4ge1xuICAgICAgY29uc3QgY29uc29sZVdhcm5TcHkgPSB2aVxuICAgICAgICAuc3B5T24oY29uc29sZSwgXCJ3YXJuXCIpXG4gICAgICAgIC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge30pXG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0ge1xuICAgICAgICBuYW1lOiBcInN0YXR1c1wiLFxuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBjYXRlZ29yaWVzT3JkZXJlZDogXCJpbnZhbGlkXCIsXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRGaWVsZEZyb21EZXNjcmlwdG9yKGRlc2NyaXB0b3IpXG5cbiAgICAgIGV4cGVjdChyZXN1bHQuY2F0ZWdvcmllc09yZGVyZWQpLnRvQmVVbmRlZmluZWQoKVxuICAgICAgZXhwZWN0KGNvbnNvbGVXYXJuU3B5KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgXCJJZ25vcmluZyB2Mi4wIGluY29tcGF0aWJsZSBjYXRlZ29yaWVzT3JkZXJlZDogaW52YWxpZFwiLFxuICAgICAgKVxuICAgICAgY29uc29sZVdhcm5TcHkubW9ja1Jlc3RvcmUoKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgZGVzY3JpcHRvciB3aXRob3V0IGNhdGVnb3JpZXNPcmRlcmVkXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB7IG5hbWU6IFwic3RhdHVzXCIsIHR5cGU6IFwic3RyaW5nXCIgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0RmllbGRGcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yKVxuXG4gICAgICBleHBlY3QocmVzdWx0LmNhdGVnb3JpZXNPcmRlcmVkKS50b0JlVW5kZWZpbmVkKClcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKFwianNvbnNjaGVtYSB2YWxpZGF0aW9uXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBwcmVzZXJ2ZSB2YWxpZCBqc29uc2NoZW1hIG9iamVjdFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0ge1xuICAgICAgICBuYW1lOiBcImRhdGFcIixcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAganNvbnNjaGVtYTogeyB0eXBlOiBcIm9iamVjdFwiLCBwcm9wZXJ0aWVzOiB7IGlkOiB7IHR5cGU6IFwibnVtYmVyXCIgfSB9IH0sXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRGaWVsZEZyb21EZXNjcmlwdG9yKGRlc2NyaXB0b3IpXG5cbiAgICAgIGV4cGVjdChyZXN1bHQuanNvbnNjaGVtYSkudG9FcXVhbCh7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHByb3BlcnRpZXM6IHsgaWQ6IHsgdHlwZTogXCJudW1iZXJcIiB9IH0sXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCByZW1vdmUgaW52YWxpZCBub24tb2JqZWN0IGpzb25zY2hlbWEgYW5kIHdhcm5cIiwgKCkgPT4ge1xuICAgICAgY29uc3QgY29uc29sZVdhcm5TcHkgPSB2aVxuICAgICAgICAuc3B5T24oY29uc29sZSwgXCJ3YXJuXCIpXG4gICAgICAgIC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge30pXG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0ge1xuICAgICAgICBuYW1lOiBcImRhdGFcIixcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAganNvbnNjaGVtYTogXCJpbnZhbGlkXCIsXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRGaWVsZEZyb21EZXNjcmlwdG9yKGRlc2NyaXB0b3IpXG5cbiAgICAgIGV4cGVjdChyZXN1bHQuanNvbnNjaGVtYSkudG9CZVVuZGVmaW5lZCgpXG4gICAgICBleHBlY3QoY29uc29sZVdhcm5TcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBcIklnbm9yaW5nIHYyLjAgaW5jb21wYXRpYmxlIGpzb25zY2hlbWE6IGludmFsaWRcIixcbiAgICAgIClcbiAgICAgIGNvbnNvbGVXYXJuU3B5Lm1vY2tSZXN0b3JlKClcbiAgICB9KVxuXG4gICAgaXQoXCJzaG91bGQgaGFuZGxlIGRlc2NyaXB0b3Igd2l0aG91dCBqc29uc2NoZW1hXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB7IG5hbWU6IFwiZGF0YVwiLCB0eXBlOiBcIm9iamVjdFwiIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydEZpZWxkRnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcilcblxuICAgICAgZXhwZWN0KHJlc3VsdC5qc29uc2NoZW1hKS50b0JlVW5kZWZpbmVkKClcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKFwiY29tYmluZWQgY29udmVyc2lvbnNcIiwgKCkgPT4ge1xuICAgIGl0KFwic2hvdWxkIGFwcGx5IGFsbCBjb252ZXJzaW9ucyB0b2dldGhlclwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb25zb2xlV2FyblNweSA9IHZpXG4gICAgICAgIC5zcHlPbihjb25zb2xlLCBcIndhcm5cIilcbiAgICAgICAgLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7fSlcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB7XG4gICAgICAgIG5hbWU6IFwiZW1haWxcIixcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZm9ybWF0OiBcImZtdDplbWFpbFwiLFxuICAgICAgICBtaXNzaW5nVmFsdWVzOiBbXCJcIiwgXCJOQVwiXSxcbiAgICAgICAgY2F0ZWdvcmllczogW1widmFsaWRcIiwgXCJpbnZhbGlkXCJdLFxuICAgICAgICBjYXRlZ29yaWVzT3JkZXJlZDogdHJ1ZSxcbiAgICAgICAganNvbnNjaGVtYTogeyB0eXBlOiBcInN0cmluZ1wiLCBwYXR0ZXJuOiBcIl5bYS16XStAW2Etel0rXFxcXC5bYS16XSskXCIgfSxcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydEZpZWxkRnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcilcblxuICAgICAgZXhwZWN0KHJlc3VsdC5mb3JtYXQpLnRvQmUoXCJlbWFpbFwiKVxuICAgICAgZXhwZWN0KHJlc3VsdC5taXNzaW5nVmFsdWVzKS50b0VxdWFsKFtcIlwiLCBcIk5BXCJdKVxuICAgICAgZXhwZWN0KHJlc3VsdC5jYXRlZ29yaWVzKS50b0VxdWFsKFtcInZhbGlkXCIsIFwiaW52YWxpZFwiXSlcbiAgICAgIGV4cGVjdChyZXN1bHQuY2F0ZWdvcmllc09yZGVyZWQpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChyZXN1bHQuanNvbnNjaGVtYSkudG9FcXVhbCh7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIHBhdHRlcm46IFwiXlthLXpdK0BbYS16XStcXFxcLlthLXpdKyRcIixcbiAgICAgIH0pXG4gICAgICBleHBlY3QoY29uc29sZVdhcm5TcHkpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICAgIGNvbnNvbGVXYXJuU3B5Lm1vY2tSZXN0b3JlKClcbiAgICB9KVxuXG4gICAgaXQoXCJzaG91bGQgaGFuZGxlIG11bHRpcGxlIGludmFsaWQgcHJvcGVydGllcyBhbmQgd2FybiBmb3IgZWFjaFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb25zb2xlV2FyblNweSA9IHZpXG4gICAgICAgIC5zcHlPbihjb25zb2xlLCBcIndhcm5cIilcbiAgICAgICAgLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7fSlcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB7XG4gICAgICAgIG5hbWU6IFwiZmllbGRcIixcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgbWlzc2luZ1ZhbHVlczogXCJpbnZhbGlkXCIsXG4gICAgICAgIGNhdGVnb3JpZXM6IDEyMyxcbiAgICAgICAgY2F0ZWdvcmllc09yZGVyZWQ6IFwiaW52YWxpZFwiLFxuICAgICAgICBqc29uc2NoZW1hOiBcImludmFsaWRcIixcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydEZpZWxkRnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcilcblxuICAgICAgZXhwZWN0KHJlc3VsdC5taXNzaW5nVmFsdWVzKS50b0JlVW5kZWZpbmVkKClcbiAgICAgIGV4cGVjdChyZXN1bHQuY2F0ZWdvcmllcykudG9CZVVuZGVmaW5lZCgpXG4gICAgICBleHBlY3QocmVzdWx0LmNhdGVnb3JpZXNPcmRlcmVkKS50b0JlVW5kZWZpbmVkKClcbiAgICAgIGV4cGVjdChyZXN1bHQuanNvbnNjaGVtYSkudG9CZVVuZGVmaW5lZCgpXG4gICAgICBleHBlY3QoY29uc29sZVdhcm5TcHkpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcyg0KVxuICAgICAgY29uc29sZVdhcm5TcHkubW9ja1Jlc3RvcmUoKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgZmllbGQgd2l0aCBhbGwgdmFsaWQgcHJvcGVydGllc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0ge1xuICAgICAgICBuYW1lOiBcImFnZVwiLFxuICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgdGl0bGU6IFwiQWdlXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlBlcnNvbidzIGFnZVwiLFxuICAgICAgICBmb3JtYXQ6IFwiZm10OmRlZmF1bHRcIixcbiAgICAgICAgZXhhbXBsZTogMjUsXG4gICAgICAgIGV4YW1wbGVzOiBbMTgsIDI1LCAzMCwgNDVdLFxuICAgICAgICByZGZUeXBlOiBcImh0dHA6Ly9zY2hlbWEub3JnL2FnZVwiLFxuICAgICAgICBtaXNzaW5nVmFsdWVzOiBbXCJcIiwgXCJ1bmtub3duXCJdLFxuICAgICAgICBjYXRlZ29yaWVzOiBbXCJ5b3VuZ1wiLCBcIm1pZGRsZVwiLCBcIm9sZFwiXSxcbiAgICAgICAgY2F0ZWdvcmllc09yZGVyZWQ6IHRydWUsXG4gICAgICAgIGpzb25zY2hlbWE6IHsgdHlwZTogXCJpbnRlZ2VyXCIsIG1pbmltdW06IDAsIG1heGltdW06IDE1MCB9LFxuICAgICAgICBjb25zdHJhaW50czoge1xuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgbWF4aW11bTogMTUwLFxuICAgICAgICB9LFxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0RmllbGRGcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yKVxuXG4gICAgICBleHBlY3QocmVzdWx0Lm5hbWUpLnRvQmUoXCJhZ2VcIilcbiAgICAgIGV4cGVjdChyZXN1bHQudHlwZSkudG9CZShcImludGVnZXJcIilcbiAgICAgIGV4cGVjdChyZXN1bHQudGl0bGUpLnRvQmUoXCJBZ2VcIilcbiAgICAgIGV4cGVjdChyZXN1bHQuZGVzY3JpcHRpb24pLnRvQmUoXCJQZXJzb24ncyBhZ2VcIilcbiAgICAgIGV4cGVjdChyZXN1bHQuZm9ybWF0KS50b0JlKFwiZGVmYXVsdFwiKVxuICAgICAgZXhwZWN0KHJlc3VsdC5leGFtcGxlKS50b0JlKDI1KVxuICAgICAgZXhwZWN0KHJlc3VsdC5leGFtcGxlcykudG9FcXVhbChbMTgsIDI1LCAzMCwgNDVdKVxuICAgICAgZXhwZWN0KHJlc3VsdC5yZGZUeXBlKS50b0JlKFwiaHR0cDovL3NjaGVtYS5vcmcvYWdlXCIpXG4gICAgICBleHBlY3QocmVzdWx0Lm1pc3NpbmdWYWx1ZXMpLnRvRXF1YWwoW1wiXCIsIFwidW5rbm93blwiXSlcbiAgICAgIGV4cGVjdChyZXN1bHQuY2F0ZWdvcmllcykudG9FcXVhbChbXCJ5b3VuZ1wiLCBcIm1pZGRsZVwiLCBcIm9sZFwiXSlcbiAgICAgIGV4cGVjdChyZXN1bHQuY2F0ZWdvcmllc09yZGVyZWQpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChyZXN1bHQuanNvbnNjaGVtYSkudG9FcXVhbCh7XG4gICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICBtYXhpbXVtOiAxNTAsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KHJlc3VsdC5jb25zdHJhaW50cykudG9FcXVhbCh7XG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICBtYXhpbXVtOiAxNTAsXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG59KVxuIl19
@@ -0,0 +1,3 @@
1
+ import type { Descriptor } from "../../descriptor/index.ts";
2
+ import type { Field } from "../Field.ts";
3
+ export declare function convertFieldToDescriptor(field: Field): Descriptor;
@@ -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=