@ditojs/server 0.275.0 → 1.0.0

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 (216) hide show
  1. package/package.json +25 -43
  2. package/src/app/Application.js +105 -111
  3. package/src/app/Validator.js +6 -3
  4. package/src/app/index.js +2 -2
  5. package/src/cli/db/createMigration.js +1 -1
  6. package/src/cli/db/index.js +7 -7
  7. package/src/cli/db/listAssetConfig.js +1 -1
  8. package/src/cli/db/reset.js +1 -1
  9. package/src/cli/index.js +14 -5
  10. package/src/controllers/AdminController.js +181 -158
  11. package/src/controllers/CollectionController.js +8 -29
  12. package/src/controllers/Controller.js +71 -76
  13. package/src/controllers/ControllerAction.js +39 -17
  14. package/src/controllers/MemberAction.js +2 -2
  15. package/src/controllers/ModelController.js +4 -4
  16. package/src/controllers/RelationController.js +3 -3
  17. package/src/controllers/{UserController.js → UsersController.js} +8 -13
  18. package/src/controllers/index.js +5 -5
  19. package/src/decorators/action.js +3 -3
  20. package/src/decorators/authorize.js +1 -1
  21. package/src/decorators/index.js +6 -6
  22. package/src/decorators/parameters.js +1 -1
  23. package/src/decorators/returns.js +1 -1
  24. package/src/decorators/scope.js +1 -1
  25. package/src/decorators/transacted.js +1 -1
  26. package/src/errors/AssetError.js +1 -1
  27. package/src/errors/AuthenticationError.js +1 -1
  28. package/src/errors/AuthorizationError.js +1 -1
  29. package/src/errors/ControllerError.js +1 -1
  30. package/src/errors/DatabaseError.js +12 -3
  31. package/src/errors/GraphError.js +1 -1
  32. package/src/errors/ModelError.js +1 -1
  33. package/src/errors/NotFoundError.js +1 -1
  34. package/src/errors/NotImplementedError.js +1 -1
  35. package/src/errors/QueryBuilderError.js +1 -1
  36. package/src/errors/RelationError.js +1 -1
  37. package/src/errors/ValidationError.js +1 -1
  38. package/src/errors/WrappedError.js +1 -1
  39. package/src/errors/index.js +14 -14
  40. package/src/graph/DitoGraphProcessor.js +2 -1
  41. package/src/graph/graph.js +1 -1
  42. package/src/graph/index.js +3 -3
  43. package/src/index.js +11 -9
  44. package/src/lib/index.js +2 -2
  45. package/src/middleware/createTransaction.js +1 -1
  46. package/src/middleware/findRoute.js +3 -2
  47. package/src/middleware/handleConnectMiddleware.js +88 -0
  48. package/src/middleware/handleError.js +1 -1
  49. package/src/middleware/handleRoute.js +3 -3
  50. package/src/middleware/index.js +8 -7
  51. package/src/mixins/AssetMixin.js +1 -1
  52. package/src/mixins/UserMixin.js +1 -1
  53. package/src/mixins/index.js +4 -4
  54. package/src/models/AssetModel.js +2 -2
  55. package/src/models/Model.js +16 -12
  56. package/src/models/RelationAccessor.js +1 -1
  57. package/src/models/SessionModel.js +2 -2
  58. package/src/models/TimeStampedModel.js +2 -2
  59. package/src/models/UserModel.js +2 -2
  60. package/src/models/definitions/assets.js +1 -1
  61. package/src/models/definitions/filters.js +57 -44
  62. package/src/models/definitions/hooks.js +1 -1
  63. package/src/models/definitions/index.js +9 -9
  64. package/src/models/definitions/modifiers.js +1 -1
  65. package/src/models/definitions/options.js +1 -1
  66. package/src/models/definitions/properties.js +2 -2
  67. package/src/models/definitions/relations.js +1 -1
  68. package/src/models/definitions/schema.js +1 -1
  69. package/src/models/definitions/scopes.js +2 -2
  70. package/src/models/index.js +5 -5
  71. package/src/query/QueryBuilder.js +5 -5
  72. package/src/query/QueryFilters.js +50 -50
  73. package/src/query/QueryParameters.js +2 -2
  74. package/src/query/index.js +3 -3
  75. package/src/schema/formats/index.js +2 -2
  76. package/src/schema/index.js +4 -4
  77. package/src/schema/keywords/_relate.js +1 -1
  78. package/src/schema/keywords/index.js +12 -12
  79. package/src/schema/properties.test.js +1 -1
  80. package/src/schema/relations.js +1 -1
  81. package/src/schema/relations.test.js +2 -2
  82. package/src/services/index.js +1 -1
  83. package/src/storage/DiskStorage.js +1 -1
  84. package/src/storage/S3Storage.js +4 -4
  85. package/src/storage/Storage.js +1 -1
  86. package/src/storage/index.js +4 -4
  87. package/src/utils/function.test.js +1 -1
  88. package/src/utils/handler.js +17 -0
  89. package/src/utils/index.js +8 -7
  90. package/src/utils/object.test.js +1 -1
  91. package/lib/app/Application.js +0 -961
  92. package/lib/app/SessionStore.js +0 -40
  93. package/lib/app/Validator.js +0 -355
  94. package/lib/app/index.js +0 -26
  95. package/lib/cli/console.js +0 -175
  96. package/lib/cli/db/createMigration.js +0 -237
  97. package/lib/cli/db/index.js +0 -66
  98. package/lib/cli/db/listAssetConfig.js +0 -16
  99. package/lib/cli/db/migrate.js +0 -15
  100. package/lib/cli/db/reset.js +0 -27
  101. package/lib/cli/db/rollback.js +0 -15
  102. package/lib/cli/db/seed.js +0 -104
  103. package/lib/cli/db/unlock.js +0 -15
  104. package/lib/cli/index.js +0 -90
  105. package/lib/controllers/AdminController.js +0 -258
  106. package/lib/controllers/CollectionController.js +0 -263
  107. package/lib/controllers/Controller.js +0 -462
  108. package/lib/controllers/ControllerAction.js +0 -276
  109. package/lib/controllers/MemberAction.js +0 -22
  110. package/lib/controllers/ModelController.js +0 -64
  111. package/lib/controllers/RelationController.js +0 -82
  112. package/lib/controllers/UserController.js +0 -98
  113. package/lib/controllers/index.js +0 -50
  114. package/lib/decorators/action.js +0 -14
  115. package/lib/decorators/authorize.js +0 -13
  116. package/lib/decorators/index.js +0 -58
  117. package/lib/decorators/parameters.js +0 -35
  118. package/lib/decorators/returns.js +0 -26
  119. package/lib/decorators/scope.js +0 -14
  120. package/lib/decorators/transacted.js +0 -12
  121. package/lib/errors/AssetError.js +0 -19
  122. package/lib/errors/AuthenticationError.js +0 -19
  123. package/lib/errors/AuthorizationError.js +0 -19
  124. package/lib/errors/ControllerError.js +0 -24
  125. package/lib/errors/DatabaseError.js +0 -27
  126. package/lib/errors/GraphError.js +0 -19
  127. package/lib/errors/ModelError.js +0 -24
  128. package/lib/errors/NotFoundError.js +0 -19
  129. package/lib/errors/NotImplementedError.js +0 -19
  130. package/lib/errors/QueryBuilderError.js +0 -19
  131. package/lib/errors/RelationError.js +0 -36
  132. package/lib/errors/ResponseError.js +0 -46
  133. package/lib/errors/ValidationError.js +0 -19
  134. package/lib/errors/WrappedError.js +0 -24
  135. package/lib/errors/index.js +0 -122
  136. package/lib/graph/DitoGraphProcessor.js +0 -185
  137. package/lib/graph/expression.js +0 -76
  138. package/lib/graph/graph.js +0 -300
  139. package/lib/graph/index.js +0 -34
  140. package/lib/index.js +0 -82
  141. package/lib/lib/EventEmitter.js +0 -76
  142. package/lib/lib/KnexHelper.js +0 -40
  143. package/lib/lib/index.js +0 -26
  144. package/lib/middleware/attachLogger.js +0 -16
  145. package/lib/middleware/createTransaction.js +0 -36
  146. package/lib/middleware/findRoute.js +0 -35
  147. package/lib/middleware/handleError.js +0 -26
  148. package/lib/middleware/handleRoute.js +0 -29
  149. package/lib/middleware/handleUser.js +0 -36
  150. package/lib/middleware/index.js +0 -66
  151. package/lib/middleware/logRequests.js +0 -122
  152. package/lib/mixins/AssetMixin.js +0 -81
  153. package/lib/mixins/SessionMixin.js +0 -22
  154. package/lib/mixins/TimeStampedMixin.js +0 -47
  155. package/lib/mixins/UserMixin.js +0 -151
  156. package/lib/mixins/index.js +0 -42
  157. package/lib/models/AssetModel.js +0 -12
  158. package/lib/models/Model.js +0 -953
  159. package/lib/models/RelationAccessor.js +0 -41
  160. package/lib/models/SessionModel.js +0 -12
  161. package/lib/models/TimeStampedModel.js +0 -12
  162. package/lib/models/UserModel.js +0 -12
  163. package/lib/models/definitions/assets.js +0 -11
  164. package/lib/models/definitions/filters.js +0 -101
  165. package/lib/models/definitions/hooks.js +0 -11
  166. package/lib/models/definitions/index.js +0 -38
  167. package/lib/models/definitions/modifiers.js +0 -11
  168. package/lib/models/definitions/options.js +0 -11
  169. package/lib/models/definitions/properties.js +0 -87
  170. package/lib/models/definitions/relations.js +0 -11
  171. package/lib/models/definitions/schema.js +0 -11
  172. package/lib/models/definitions/scopes.js +0 -51
  173. package/lib/models/index.js +0 -50
  174. package/lib/query/QueryBuilder.js +0 -745
  175. package/lib/query/QueryFilters.js +0 -82
  176. package/lib/query/QueryParameters.js +0 -77
  177. package/lib/query/Registry.js +0 -40
  178. package/lib/query/index.js +0 -34
  179. package/lib/schema/formats/_empty.js +0 -10
  180. package/lib/schema/formats/_required.js +0 -10
  181. package/lib/schema/formats/index.js +0 -26
  182. package/lib/schema/index.js +0 -49
  183. package/lib/schema/keywords/_computed.js +0 -11
  184. package/lib/schema/keywords/_foreign.js +0 -11
  185. package/lib/schema/keywords/_hidden.js +0 -11
  186. package/lib/schema/keywords/_index.js +0 -11
  187. package/lib/schema/keywords/_instanceof.js +0 -49
  188. package/lib/schema/keywords/_primary.js +0 -11
  189. package/lib/schema/keywords/_range.js +0 -26
  190. package/lib/schema/keywords/_relate.js +0 -19
  191. package/lib/schema/keywords/_specificType.js +0 -11
  192. package/lib/schema/keywords/_unique.js +0 -11
  193. package/lib/schema/keywords/_unsigned.js +0 -11
  194. package/lib/schema/keywords/_validate.js +0 -80
  195. package/lib/schema/keywords/index.js +0 -106
  196. package/lib/schema/properties.js +0 -227
  197. package/lib/schema/properties.test.js +0 -573
  198. package/lib/schema/relations.js +0 -274
  199. package/lib/schema/relations.test.js +0 -155
  200. package/lib/services/Service.js +0 -34
  201. package/lib/services/index.js +0 -18
  202. package/lib/storage/AssetFile.js +0 -97
  203. package/lib/storage/DiskStorage.js +0 -125
  204. package/lib/storage/S3Storage.js +0 -171
  205. package/lib/storage/Storage.js +0 -209
  206. package/lib/storage/index.js +0 -34
  207. package/lib/utils/decorator.js +0 -16
  208. package/lib/utils/deprecate.js +0 -46
  209. package/lib/utils/emitter.js +0 -13
  210. package/lib/utils/function.js +0 -14
  211. package/lib/utils/function.test.js +0 -49
  212. package/lib/utils/index.js +0 -66
  213. package/lib/utils/json.js +0 -9
  214. package/lib/utils/object.js +0 -92
  215. package/lib/utils/object.test.js +0 -65
  216. package/lib/utils/scope.js +0 -14
@@ -1,573 +0,0 @@
1
- "use strict";
2
-
3
- var _properties = require("./properties");
4
-
5
- describe('convertSchema()', () => {
6
- it('expands objects with properties to full JSON schemas', () => {
7
- const properties = {
8
- myString: {
9
- type: 'string'
10
- },
11
- myNumber: {
12
- type: 'number'
13
- },
14
- myInteger: {
15
- type: 'integer'
16
- },
17
- myBoolean: {
18
- type: 'boolean'
19
- },
20
- myObject: {
21
- type: 'object'
22
- },
23
- myArray: {
24
- type: 'array'
25
- }
26
- };
27
- expect((0, _properties.convertSchema)(properties)).toEqual({
28
- type: 'object',
29
- properties,
30
- additionalProperties: false
31
- });
32
- });
33
- it('supports falsy default values', () => {
34
- const properties = {
35
- myString: {
36
- type: 'string',
37
- default: ''
38
- },
39
- myNumber: {
40
- type: 'number',
41
- default: 0
42
- },
43
- myInteger: {
44
- type: 'integer',
45
- default: 0
46
- },
47
- myBoolean: {
48
- type: 'boolean',
49
- default: false
50
- },
51
- myObject: {
52
- type: 'object',
53
- default: null
54
- },
55
- myArray: {
56
- type: 'array',
57
- default: null
58
- }
59
- };
60
- expect((0, _properties.convertSchema)(properties)).toEqual({
61
- type: 'object',
62
- properties,
63
- additionalProperties: false
64
- });
65
- });
66
- it(`expands 'text' typess to 'string' JSON schema typess`, () => {
67
- expect((0, _properties.convertSchema)({
68
- myText: {
69
- type: 'text'
70
- }
71
- })).toEqual({
72
- type: 'object',
73
- properties: {
74
- myText: {
75
- type: 'string'
76
- }
77
- },
78
- additionalProperties: false
79
- });
80
- });
81
- it('expands strings property short-hands to property schemas', () => {
82
- expect((0, _properties.convertSchema)({
83
- myNumber: 'number'
84
- })).toEqual({
85
- type: 'object',
86
- properties: {
87
- myNumber: {
88
- type: 'number'
89
- }
90
- },
91
- additionalProperties: false
92
- });
93
- });
94
- it('expands array property short-hands to array property schemas', () => {
95
- expect((0, _properties.convertSchema)({
96
- myArray: [{
97
- type: 'number'
98
- }]
99
- })).toEqual({
100
- type: 'object',
101
- properties: {
102
- myArray: {
103
- type: 'array',
104
- items: {
105
- type: 'number'
106
- },
107
- default: []
108
- }
109
- },
110
- additionalProperties: false
111
- });
112
- });
113
- it('expands nested array property and object short-hands', () => {
114
- expect((0, _properties.convertSchema)({
115
- myArray: [{
116
- myNumber: 'number'
117
- }]
118
- })).toEqual({
119
- type: 'object',
120
- properties: {
121
- myArray: {
122
- type: 'array',
123
- items: {
124
- type: 'object',
125
- properties: {
126
- myNumber: {
127
- type: 'number'
128
- }
129
- },
130
- additionalProperties: false
131
- },
132
- default: []
133
- }
134
- },
135
- additionalProperties: false
136
- });
137
- });
138
- it('adds `required` arrays and formats for required properties', () => {
139
- expect((0, _properties.convertSchema)({
140
- myString: {
141
- type: 'string',
142
- required: true
143
- },
144
- myNumber: {
145
- type: 'number',
146
- required: true
147
- }
148
- })).toEqual({
149
- type: 'object',
150
- properties: {
151
- myString: {
152
- type: 'string',
153
- format: 'required'
154
- },
155
- myNumber: {
156
- type: 'number',
157
- format: 'required'
158
- }
159
- },
160
- additionalProperties: false,
161
- required: ['myString', 'myNumber']
162
- });
163
- });
164
- it(`expands 'object' schemas with properties to JSON schemas allowing no additional properties`, () => {
165
- expect((0, _properties.convertSchema)({
166
- myText: {
167
- type: 'object',
168
- properties: {}
169
- }
170
- })).toEqual({
171
- type: 'object',
172
- properties: {
173
- myText: {
174
- type: 'object',
175
- additionalProperties: false,
176
- properties: {}
177
- }
178
- },
179
- additionalProperties: false
180
- });
181
- });
182
- it('preserves preexisting settings for no additional properties', () => {
183
- expect((0, _properties.convertSchema)({
184
- myText: {
185
- type: 'object',
186
- additionalProperties: true,
187
- properties: {}
188
- }
189
- })).toEqual({
190
- type: 'object',
191
- properties: {
192
- myText: {
193
- type: 'object',
194
- additionalProperties: true,
195
- properties: {}
196
- }
197
- },
198
- additionalProperties: false
199
- });
200
- });
201
- it('expands nested object schemas with required properties', () => {
202
- expect((0, _properties.convertSchema)({
203
- myText: {
204
- type: 'object',
205
- properties: {
206
- myProperty: {
207
- type: 'text',
208
- required: true
209
- }
210
- }
211
- }
212
- })).toEqual({
213
- type: 'object',
214
- properties: {
215
- myText: {
216
- type: 'object',
217
- properties: {
218
- myProperty: {
219
- type: 'string',
220
- format: 'required'
221
- }
222
- },
223
- additionalProperties: false,
224
- required: ['myProperty']
225
- }
226
- },
227
- additionalProperties: false
228
- });
229
- });
230
- it(`expands 'object' schemas with patternProperties`, () => {
231
- expect((0, _properties.convertSchema)({
232
- myText: {
233
- type: 'object',
234
- patternProperties: {
235
- '^.*$': {
236
- type: 'text'
237
- }
238
- }
239
- }
240
- })).toEqual({
241
- type: 'object',
242
- properties: {
243
- myText: {
244
- type: 'object',
245
- patternProperties: {
246
- '^.*$': {
247
- type: 'string'
248
- }
249
- },
250
- additionalProperties: false
251
- }
252
- },
253
- additionalProperties: false
254
- });
255
- });
256
- it('expands datetime types to their JSON schema representation', () => {
257
- expect((0, _properties.convertSchema)({
258
- myDate: {
259
- type: 'date'
260
- },
261
- myDateTime: {
262
- type: 'datetime'
263
- },
264
- myTimeStamp: {
265
- type: 'timestamp'
266
- }
267
- })).toEqual({
268
- type: 'object',
269
- properties: {
270
- myDate: {
271
- type: ['string', 'object'],
272
- format: 'date-time'
273
- },
274
- myDateTime: {
275
- type: ['string', 'object'],
276
- format: 'date-time'
277
- },
278
- myTimeStamp: {
279
- type: ['string', 'object'],
280
- format: 'date-time'
281
- }
282
- },
283
- additionalProperties: false
284
- });
285
- });
286
- it('expands unrecognized types to `$ref` references', () => {
287
- expect((0, _properties.convertSchema)({
288
- myModel: {
289
- type: 'MyModel'
290
- }
291
- })).toEqual({
292
- type: 'object',
293
- properties: {
294
- myModel: {
295
- $ref: 'MyModel'
296
- }
297
- },
298
- additionalProperties: false
299
- });
300
- });
301
- it(`expands unrecognized types to \`instanceof\` keywords when the \`useInstanceOf\` option is provided`, () => {
302
- expect((0, _properties.convertSchema)({
303
- myModel: {
304
- type: 'MyModel'
305
- }
306
- }, {
307
- useInstanceOf: true
308
- })).toEqual({
309
- type: 'object',
310
- properties: {
311
- myModel: {
312
- type: 'object',
313
- instanceof: 'MyModel'
314
- }
315
- },
316
- additionalProperties: false
317
- });
318
- });
319
- it('handles `nullable: true` correctly (now natively supported)', () => {
320
- expect((0, _properties.convertSchema)({
321
- myString: {
322
- type: 'string',
323
- nullable: true
324
- }
325
- })).toEqual({
326
- type: 'object',
327
- properties: {
328
- myString: {
329
- type: 'string',
330
- nullable: true
331
- }
332
- },
333
- additionalProperties: false
334
- });
335
- });
336
- it(`handles \`nullable: true\` references correctly`, () => {
337
- expect((0, _properties.convertSchema)({
338
- myModel: {
339
- type: 'MyModel',
340
- nullable: true
341
- }
342
- })).toEqual({
343
- type: 'object',
344
- properties: {
345
- myModel: {
346
- oneOf: [{
347
- type: 'null'
348
- }, {
349
- $ref: 'MyModel'
350
- }]
351
- }
352
- },
353
- additionalProperties: false
354
- });
355
- });
356
- it(`handles \`nullable: true\` dates correctly (now natively supported)`, () => {
357
- expect((0, _properties.convertSchema)({
358
- myDate: {
359
- type: 'date',
360
- nullable: true
361
- }
362
- })).toEqual({
363
- type: 'object',
364
- properties: {
365
- myDate: {
366
- type: ['string', 'object'],
367
- format: 'date-time',
368
- nullable: true
369
- }
370
- },
371
- additionalProperties: false
372
- });
373
- });
374
- it(`handles \`nullable: true\` enums correctly`, () => {
375
- expect((0, _properties.convertSchema)({
376
- myEnum: {
377
- type: 'string',
378
- enum: ['one', 'two', 'three'],
379
- nullable: true
380
- }
381
- })).toEqual({
382
- type: 'object',
383
- properties: {
384
- myEnum: {
385
- type: 'string',
386
- enum: ['one', 'two', 'three', null],
387
- nullable: true
388
- }
389
- },
390
- additionalProperties: false
391
- });
392
- });
393
- });
394
- it('convert schemas within oneOf properties', () => {
395
- expect((0, _properties.convertSchema)({
396
- myList: {
397
- type: 'array',
398
- items: {
399
- oneOf: [{
400
- prop1: {
401
- type: 'string',
402
- required: true
403
- },
404
- prop2: {
405
- type: 'number',
406
- required: true
407
- }
408
- }, {
409
- type: 'object',
410
- properties: {
411
- prop3: {
412
- type: 'string',
413
- required: true
414
- },
415
- prop4: {
416
- type: 'number',
417
- required: true
418
- }
419
- }
420
- }]
421
- }
422
- }
423
- })).toEqual({
424
- type: 'object',
425
- properties: {
426
- myList: {
427
- type: 'array',
428
- items: {
429
- oneOf: [{
430
- type: 'object',
431
- properties: {
432
- prop1: {
433
- type: 'string',
434
- format: 'required'
435
- },
436
- prop2: {
437
- type: 'number',
438
- format: 'required'
439
- }
440
- },
441
- required: ['prop1', 'prop2'],
442
- additionalProperties: false
443
- }, {
444
- type: 'object',
445
- properties: {
446
- prop3: {
447
- type: 'string',
448
- format: 'required'
449
- },
450
- prop4: {
451
- type: 'number',
452
- format: 'required'
453
- }
454
- },
455
- required: ['prop3', 'prop4'],
456
- additionalProperties: false
457
- }]
458
- }
459
- }
460
- },
461
- additionalProperties: false
462
- });
463
- });
464
- it('support `required: true` on object', () => {
465
- expect((0, _properties.convertSchema)({
466
- myObject: {
467
- type: 'object',
468
- required: true,
469
- properties: {
470
- prop1: {
471
- type: 'string',
472
- required: true
473
- },
474
- prop2: {
475
- type: 'number',
476
- required: true
477
- }
478
- }
479
- }
480
- })).toEqual({
481
- type: 'object',
482
- properties: {
483
- myObject: {
484
- type: 'object',
485
- format: 'required',
486
- properties: {
487
- prop1: {
488
- format: 'required',
489
- type: 'string'
490
- },
491
- prop2: {
492
- format: 'required',
493
- type: 'number'
494
- }
495
- },
496
- additionalProperties: false,
497
- required: ['prop1', 'prop2']
498
- }
499
- },
500
- additionalProperties: false,
501
- required: ['myObject']
502
- });
503
- });
504
- it('support `required` on object short-hand', () => {
505
- expect((0, _properties.convertSchema)({
506
- myObject: {
507
- required: true,
508
- prop1: {
509
- type: 'string',
510
- required: true
511
- },
512
- prop2: {
513
- type: 'number',
514
- required: true
515
- }
516
- }
517
- })).toEqual({
518
- type: 'object',
519
- properties: {
520
- myObject: {
521
- type: 'object',
522
- format: 'required',
523
- properties: {
524
- prop1: {
525
- type: 'string',
526
- format: 'required'
527
- },
528
- prop2: {
529
- type: 'number',
530
- format: 'required'
531
- }
532
- },
533
- additionalProperties: false,
534
- required: ['prop1', 'prop2']
535
- }
536
- },
537
- additionalProperties: false,
538
- required: ['myObject']
539
- });
540
- });
541
- describe('expandSchemaShorthand()', () => {
542
- it('expands strings to schemas', () => {
543
- expect((0, _properties.expandSchemaShorthand)('number')).toEqual({
544
- type: 'number'
545
- });
546
- });
547
- it('expands array property short-hands to array property schemas', () => {
548
- expect((0, _properties.expandSchemaShorthand)([{
549
- type: 'number'
550
- }])).toEqual({
551
- type: 'array',
552
- items: {
553
- type: 'number'
554
- },
555
- default: []
556
- });
557
- });
558
- it('expands objects property short-hands to object property schemas', () => {
559
- expect((0, _properties.expandSchemaShorthand)({
560
- myNumber: {
561
- type: 'number'
562
- }
563
- })).toEqual({
564
- type: 'object',
565
- properties: {
566
- myNumber: {
567
- type: 'number'
568
- }
569
- }
570
- });
571
- });
572
- });
573
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY2hlbWEvcHJvcGVydGllcy50ZXN0LmpzIl0sIm5hbWVzIjpbImRlc2NyaWJlIiwiaXQiLCJwcm9wZXJ0aWVzIiwibXlTdHJpbmciLCJ0eXBlIiwibXlOdW1iZXIiLCJteUludGVnZXIiLCJteUJvb2xlYW4iLCJteU9iamVjdCIsIm15QXJyYXkiLCJleHBlY3QiLCJ0b0VxdWFsIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJkZWZhdWx0IiwibXlUZXh0IiwiaXRlbXMiLCJyZXF1aXJlZCIsImZvcm1hdCIsIm15UHJvcGVydHkiLCJwYXR0ZXJuUHJvcGVydGllcyIsIm15RGF0ZSIsIm15RGF0ZVRpbWUiLCJteVRpbWVTdGFtcCIsIm15TW9kZWwiLCIkcmVmIiwidXNlSW5zdGFuY2VPZiIsImluc3RhbmNlb2YiLCJudWxsYWJsZSIsIm9uZU9mIiwibXlFbnVtIiwiZW51bSIsIm15TGlzdCIsInByb3AxIiwicHJvcDIiLCJwcm9wMyIsInByb3A0Il0sIm1hcHBpbmdzIjoiOztBQUFBOztBQUVBQSxRQUFRLENBQUMsaUJBQUQsRUFBb0IsTUFBTTtBQUNoQ0MsRUFBQUEsRUFBRSxDQUFDLHNEQUFELEVBQXlELE1BQU07QUFDL0QsVUFBTUMsVUFBVSxHQUFHO0FBQ2pCQyxNQUFBQSxRQUFRLEVBQUU7QUFDUkMsUUFBQUEsSUFBSSxFQUFFO0FBREUsT0FETztBQUlqQkMsTUFBQUEsUUFBUSxFQUFFO0FBQ1JELFFBQUFBLElBQUksRUFBRTtBQURFLE9BSk87QUFPakJFLE1BQUFBLFNBQVMsRUFBRTtBQUNURixRQUFBQSxJQUFJLEVBQUU7QUFERyxPQVBNO0FBVWpCRyxNQUFBQSxTQUFTLEVBQUU7QUFDVEgsUUFBQUEsSUFBSSxFQUFFO0FBREcsT0FWTTtBQWFqQkksTUFBQUEsUUFBUSxFQUFFO0FBQ1JKLFFBQUFBLElBQUksRUFBRTtBQURFLE9BYk87QUFnQmpCSyxNQUFBQSxPQUFPLEVBQUU7QUFDUEwsUUFBQUEsSUFBSSxFQUFFO0FBREM7QUFo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USxFQUFFO0FBQ1JELFFBQUFBLElBQUksRUFBRTtBQURFO0FBRGlCLEtBQXRCLENBQUQsQ0FBTixDQUlJTyxPQUpKLENBSVk7QUFDVlAsTUFBQUEsSUFBSSxFQUFFLFFBREk7QUFFVkYsTUFBQUEsVUFBVSxFQUFFO0FBQ1ZHLFFBQUFBLFFBQVEsRUFBRTtBQUNSRCxVQUFBQSxJQUFJLEVBQUU7QUFERTtBQURBO0FBRkYsS0FKWjtBQVlELEdBYkMsQ0FBRjtBQWNELENBakNPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb252ZXJ0U2NoZW1hLCBleHBhbmRTY2hlbWFTaG9ydGhhbmQgfSBmcm9tICcuL3Byb3BlcnRpZXMnXG5cbmRlc2NyaWJlKCdjb252ZXJ0U2NoZW1hKCknLCAoKSA9PiB7XG4gIGl0KCdleHBhbmRzIG9iamVjdHMgd2l0aCBwcm9wZXJ0aWVzIHRvIGZ1bGwgSlNPTiBzY2hlbWFzJywgKCkgPT4ge1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSB7XG4gICAgICBteVN0cmluZzoge1xuICAgICAgICB0eXBlOiAnc3RyaW5nJ1xuICAgICAgfSxcbiAgICAgIG15TnVtYmVyOiB7XG4gICAgICAgIHR5cGU6ICdudW1iZXInXG4gICAgICB9LFxuICAgICAgbXlJbnRlZ2VyOiB7XG4gICAgICAgIHR5cGU6ICdpbnRlZ2VyJ1xuICAgICAgfSxcbiAgICAgIG15Qm9vbGVhbjoge1xuICAgICAgICB0eXBlOiAnYm9vbGVhbidcbiAgICAgIH0sXG4gICAgICBteU9iamVjdDoge1xuICAgICAgICB0eXBlOiAnb2JqZWN0J1xuICAgICAgfSxcbiAgICAgIG15QXJyYXk6IHtcbiAgICAgICAgdHlwZTogJ2FycmF5J1xuICAgICAgfVxuICAgIH1cbiAgICBleHBlY3QoY29udmVydFNjaGVtYShwcm9wZXJ0aWVzKSkudG9FcXVhbCh7XG4gICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgIHByb3BlcnRpZXMsXG4gICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2VcbiAgICB9KVxuICB9KVxuXG4gIGl0KCdzdXBwb3J0cyBmYWxzeSBkZWZhdWx0IHZhbHVlcycsICgpID0+IHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0ge1xuICAgICAgbXlTdHJpbmc6IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlZmF1bHQ6ICcnXG4gICAgICB9LFxuICAgICAgbXlOdW1iZXI6IHtcbiAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgIGRlZmF1bHQ6IDBcbiAgICAgIH0sXG4gICAgICBteUludGVnZXI6IHtcbiAgICAgICAgdHlwZTogJ2ludGVnZXInLFxuICAgICAgICBkZWZhdWx0OiAwXG4gICAgICB9LFxuICAgICAgbXlCb29sZWFuOiB7XG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICAgIH0sXG4gICAgICBteU9iamVjdDoge1xuICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgZGVmYXVsdDogbnVsbFxuICAgICAgfSxcbiAgICAgIG15QXJyYXk6IHtcbiAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgZGVmYXVsdDogbnVsbFxuICAgICAgfVxuICAgIH1cbiAgICBleHBlY3QoY29udmVydFNjaGVtYShwcm9wZXJ0aWVzKSkudG9FcXVhbCh7XG4gICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgIHByb3BlcnRpZXMsXG4gICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2VcbiAgICB9KVxuICB9KVxuXG4gIGl0KGBleHBhbmRzICd0ZXh0JyB0eXBlc3MgdG8gJ3N0cmluZycgSlNPTiBzY2hlbWEgdHlwZXNzYCwgKCkgPT4ge1xuICAgIGV4cGVjdChjb252ZXJ0U2NoZW1hKHtcbiAgICAgIG15VGV4dDoge1xuICAgICAgICB0eXBlOiAndGV4dCdcbiAgICAgIH1cbiAgICB9KSkudG9FcXVhbCh7XG4gICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgbXlUZXh0OiB7XG4gICAgICAgICAgdHlwZTogJ3N0cmluZydcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoJ2V4cGFuZHMgc3RyaW5ncyBwcm9wZXJ0eSBzaG9ydC1oYW5kcyB0byBwcm9wZXJ0eSBzY2hlbWFzJywgKCkgPT4ge1xuICAgIGV4cGVjdChjb252ZXJ0U2NoZW1hKHtcbiAgICAgIG15TnVtYmVyOiAnbnVtYmVyJ1xuICAgIH0pKS50b0VxdWFsKHtcbiAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBteU51bWJlcjoge1xuICAgICAgICAgIHR5cGU6ICdudW1iZXInXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2VcbiAgICB9KVxuICB9KVxuXG4gIGl0KCdleHBhbmRzIGFycmF5IHByb3BlcnR5IHNob3J0LWhhbmRzIHRvIGFycmF5IHByb3BlcnR5IHNjaGVtYXMnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGNvbnZlcnRTY2hlbWEoe1xuICAgICAgbXlBcnJheTogW3tcbiAgICAgICAgdHlwZTogJ251bWJlcidcbiAgICAgIH1dXG4gICAgfSkpLnRvRXF1YWwoe1xuICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIG15QXJyYXk6IHtcbiAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgIGl0ZW1zOiB7XG4gICAgICAgICAgICB0eXBlOiAnbnVtYmVyJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogW11cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoJ2V4cGFuZHMgbmVzdGVkIGFycmF5IHByb3BlcnR5IGFuZCBvYmplY3Qgc2hvcnQtaGFuZHMnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGNvbnZlcnRTY2hlbWEoe1xuICAgICAgbXlBcnJheTogW3tcbiAgICAgICAgbXlOdW1iZXI6ICdudW1iZXInXG4gICAgICB9XVxuICAgIH0pKS50b0VxdWFsKHtcbiAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBteUFycmF5OiB7XG4gICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICBpdGVtczoge1xuICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgIG15TnVtYmVyOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ251bWJlcidcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogW11cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoJ2FkZHMgYHJlcXVpcmVkYCBhcnJheXMgYW5kIGZvcm1hdHMgZm9yIHJlcXVpcmVkIHByb3BlcnRpZXMnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGNvbnZlcnRTY2hlbWEoe1xuICAgICAgbXlTdHJpbmc6IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgICB9LFxuICAgICAgbXlOdW1iZXI6IHtcbiAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgICB9XG4gICAgfSkpLnRvRXF1YWwoe1xuICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIG15U3RyaW5nOiB7XG4gICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgZm9ybWF0OiAncmVxdWlyZWQnXG4gICAgICAgIH0sXG4gICAgICAgIG15TnVtYmVyOiB7XG4gICAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgICAgZm9ybWF0OiAncmVxdWlyZWQnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gICAgICByZXF1aXJlZDogWydteVN0cmluZycsICdteU51bWJlciddXG4gICAgfSlcbiAgfSlcblxuICBpdChgZXhwYW5kcyAnb2JqZWN0JyBzY2hlbWFzIHdpdGggcHJvcGVydGllcyB0byBKU09OIHNjaGVtYXMgYWxsb3dpbmcgbm8gYWRkaXRpb25hbCBwcm9wZXJ0aWVzYCwgKCkgPT4ge1xuICAgIGV4cGVjdChjb252ZXJ0U2NoZW1hKHtcbiAgICAgIG15VGV4dDoge1xuICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgcHJvcGVydGllczoge31cbiAgICAgIH1cbiAgICB9KSkudG9FcXVhbCh7XG4gICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgbXlUZXh0OiB7XG4gICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHt9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2VcbiAgICB9KVxuICB9KVxuXG4gIGl0KCdwcmVzZXJ2ZXMgcHJlZXhpc3Rpbmcgc2V0dGluZ3MgZm9yIG5vIGFkZGl0aW9uYWwgcHJvcGVydGllcycsICgpID0+IHtcbiAgICBleHBlY3QoY29udmVydFNjaGVtYSh7XG4gICAgICBteVRleHQ6IHtcbiAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB0cnVlLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7fVxuICAgICAgfVxuICAgIH0pKS50b0VxdWFsKHtcbiAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBteVRleHQ6IHtcbiAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogdHJ1ZSxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7fVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlXG4gICAgfSlcbiAgfSlcblxuICBpdCgnZXhwYW5kcyBuZXN0ZWQgb2JqZWN0IHNjaGVtYXMgd2l0aCByZXF1aXJlZCBwcm9wZXJ0aWVzJywgKCkgPT4ge1xuICAgIGV4cGVjdChjb252ZXJ0U2NoZW1hKHtcbiAgICAgIG15VGV4dDoge1xuICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIG15UHJvcGVydHk6IHtcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkpLnRvRXF1YWwoe1xuICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIG15VGV4dDoge1xuICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIG15UHJvcGVydHk6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgIGZvcm1hdDogJ3JlcXVpcmVkJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgICAgIHJlcXVpcmVkOiBbJ215UHJvcGVydHknXVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlXG4gICAgfSlcbiAgfSlcblxuICBpdChgZXhwYW5kcyAnb2JqZWN0JyBzY2hlbWFzIHdpdGggcGF0dGVyblByb3BlcnRpZXNgLCAoKSA9PiB7XG4gICAgZXhwZWN0KGNvbnZlcnRTY2hlbWEoe1xuICAgICAgbXlUZXh0OiB7XG4gICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICBwYXR0ZXJuUHJvcGVydGllczoge1xuICAgICAgICAgICdeLiokJzoge1xuICAgICAgICAgICAgdHlwZTogJ3RleHQnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkpLnRvRXF1YWwoe1xuICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIG15VGV4dDoge1xuICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICAgIHBhdHRlcm5Qcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAnXi4qJCc6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZydcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlXG4gICAgfSlcbiAgfSlcblxuICBpdCgnZXhwYW5kcyBkYXRldGltZSB0eXBlcyB0byB0aGVpciBKU09OIHNjaGVtYSByZXByZXNlbnRhdGlvbicsICgpID0+IHtcbiAgICBleHBlY3QoY29udmVydFNjaGVtYSh7XG4gICAgICBteURhdGU6IHtcbiAgICAgICAgdHlwZTogJ2RhdGUnXG4gICAgICB9LFxuICAgICAgbXlEYXRlVGltZToge1xuICAgICAgICB0eXBlOiAnZGF0ZXRpbWUnXG4gICAgICB9LFxuICAgICAgbXlUaW1lU3RhbXA6IHtcbiAgICAgICAgdHlwZTogJ3RpbWVzdGFtcCdcbiAgICAgIH1cbiAgICB9KSkudG9FcXVhbCh7XG4gICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgbXlEYXRlOiB7XG4gICAgICAgICAgdHlwZTogWydzdHJpbmcnLCAnb2JqZWN0J10sXG4gICAgICAgICAgZm9ybWF0OiAnZGF0ZS10aW1lJ1xuICAgICAgICB9LFxuICAgICAgICBteURhdGVUaW1lOiB7XG4gICAgICAgICAgdHlwZTogWydzdHJpbmcnLCAnb2JqZWN0J10sXG4gICAgICAgICAgZm9ybWF0OiAnZGF0ZS10aW1lJ1xuICAgICAgICB9LFxuICAgICAgICBteVRpbWVTdGFtcDoge1xuICAgICAgICAgIHR5cGU6IFsnc3RyaW5nJywgJ29iamVjdCddLFxuICAgICAgICAgIGZvcm1hdDogJ2RhdGUtdGltZSdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoJ2V4cGFuZHMgdW5yZWNvZ25pemVkIHR5cGVzIHRvIGAkcmVmYCByZWZlcmVuY2VzJywgKCkgPT4ge1xuICAgIGV4cGVjdChjb252ZXJ0U2NoZW1hKHtcbiAgICAgIG15TW9kZWw6IHtcbiAgICAgICAgdHlwZTogJ015TW9kZWwnXG4gICAgICB9XG4gICAgfSkpLnRvRXF1YWwoe1xuICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIG15TW9kZWw6IHtcbiAgICAgICAgICAkcmVmOiAnTXlNb2RlbCdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoYGV4cGFuZHMgdW5yZWNvZ25pemVkIHR5cGVzIHRvIFxcYGluc3RhbmNlb2ZcXGAga2V5d29yZHMgd2hlbiB0aGUgXFxgdXNlSW5zdGFuY2VPZlxcYCBvcHRpb24gaXMgcHJvdmlkZWRgLCAoKSA9PiB7XG4gICAgZXhwZWN0KGNvbnZlcnRTY2hlbWEoe1xuICAgICAgbXlNb2RlbDoge1xuICAgICAgICB0eXBlOiAnTXlNb2RlbCdcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICB1c2VJbnN0YW5jZU9mOiB0cnVlXG4gICAgfSkpLnRvRXF1YWwoe1xuICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIG15TW9kZWw6IHtcbiAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICBpbnN0YW5jZW9mOiAnTXlNb2RlbCdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoJ2hhbmRsZXMgYG51bGxhYmxlOiB0cnVlYCBjb3JyZWN0bHkgKG5vdyBuYXRpdmVseSBzdXBwb3J0ZWQpJywgKCkgPT4ge1xuICAgIGV4cGVjdChjb252ZXJ0U2NoZW1hKHtcbiAgICAgIG15U3RyaW5nOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBudWxsYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pKS50b0VxdWFsKHtcbiAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBteVN0cmluZzoge1xuICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgIG51bGxhYmxlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2VcbiAgICB9KVxuICB9KVxuXG4gIGl0KGBoYW5kbGVzIFxcYG51bGxhYmxlOiB0cnVlXFxgIHJlZmVyZW5jZXMgY29ycmVjdGx5YCwgKCkgPT4ge1xuICAgIGV4cGVjdChjb252ZXJ0U2NoZW1hKHtcbiAgICAgIG15TW9kZWw6IHtcbiAgICAgICAgdHlwZTogJ015TW9kZWwnLFxuICAgICAgICBudWxsYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pKS50b0VxdWFsKHtcbiAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBteU1vZGVsOiB7XG4gICAgICAgICAgb25lT2Y6IFtcbiAgICAgICAgICAgIHsgdHlwZTogJ251bGwnIH0sXG4gICAgICAgICAgICB7ICRyZWY6ICdNeU1vZGVsJyB9XG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlXG4gICAgfSlcbiAgfSlcblxuICBpdChgaGFuZGxlcyBcXGBudWxsYWJsZTogdHJ1ZVxcYCBkYXRlcyBjb3JyZWN0bHkgKG5vdyBuYXRpdmVseSBzdXBwb3J0ZWQpYCwgKCkgPT4ge1xuICAgIGV4cGVjdChjb252ZXJ0U2NoZW1hKHtcbiAgICAgIG15RGF0ZToge1xuICAgICAgICB0eXBlOiAnZGF0ZScsXG4gICAgICAgIG51bGxhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSkpLnRvRXF1YWwoe1xuICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIG15RGF0ZToge1xuICAgICAgICAgIHR5cGU6IFsnc3RyaW5nJywgJ29iamVjdCddLFxuICAgICAgICAgIGZvcm1hdDogJ2RhdGUtdGltZScsXG4gICAgICAgICAgbnVsbGFibGU6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoYGhhbmRsZXMgXFxgbnVsbGFibGU6IHRydWVcXGAgZW51bXMgY29ycmVjdGx5YCwgKCkgPT4ge1xuICAgIGV4cGVjdChjb252ZXJ0U2NoZW1hKHtcbiAgICAgIG15RW51bToge1xuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZW51bTogWydvbmUnLCAndHdvJywgJ3RocmVlJ10sXG4gICAgICAgIG51bGxhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSkpLnRvRXF1YWwoe1xuICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIG15RW51bToge1xuICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgIGVudW06IFsnb25lJywgJ3R3bycsICd0aHJlZScsIG51bGxdLFxuICAgICAgICAgIG51bGxhYmxlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2VcbiAgICB9KVxuICB9KVxufSlcblxuaXQoJ2NvbnZlcnQgc2NoZW1hcyB3aXRoaW4gb25lT2YgcHJvcGVydGllcycsICgpID0+IHtcbiAgZXhwZWN0KGNvbnZlcnRTY2hlbWEoe1xuICAgIG15TGlzdDoge1xuICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgIGl0ZW1zOiB7XG4gICAgICAgIG9uZU9mOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJvcDE6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJvcDI6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgcHJvcDM6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBwcm9wNDoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH1cbiAgICB9XG4gIH0pKS50b0VxdWFsKHtcbiAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICBteUxpc3Q6IHtcbiAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgaXRlbXM6IHtcbiAgICAgICAgICBvbmVPZjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgIHByb3AxOiB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgICAgIGZvcm1hdDogJ3JlcXVpcmVkJ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcHJvcDI6IHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICAgICAgICAgICAgZm9ybWF0OiAncmVxdWlyZWQnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICByZXF1aXJlZDogWydwcm9wMScsICdwcm9wMiddLFxuICAgICAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgcHJvcDM6IHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgICAgICAgZm9ybWF0OiAncmVxdWlyZWQnXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwcm9wNDoge1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgICAgICAgICAgICBmb3JtYXQ6ICdyZXF1aXJlZCdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiBbJ3Byb3AzJywgJ3Byb3A0J10sXG4gICAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlXG4gIH0pXG59KVxuXG5pdCgnc3VwcG9ydCBgcmVxdWlyZWQ6IHRydWVgIG9uIG9iamVjdCcsICgpID0+IHtcbiAgZXhwZWN0KGNvbnZlcnRTY2hlbWEoe1xuICAgIG15T2JqZWN0OiB7XG4gICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBwcm9wMToge1xuICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIHByb3AyOiB7XG4gICAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSkpLnRvRXF1YWwoe1xuICAgIHR5cGU6ICdvYmplY3QnLFxuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIG15T2JqZWN0OiB7XG4gICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICBmb3JtYXQ6ICdyZXF1aXJlZCcsXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICBwcm9wMToge1xuICAgICAgICAgICAgZm9ybWF0OiAncmVxdWlyZWQnLFxuICAgICAgICAgICAgdHlwZTogJ3N0cmluZydcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb3AyOiB7XG4gICAgICAgICAgICBmb3JtYXQ6ICdyZXF1aXJlZCcsXG4gICAgICAgICAgICB0eXBlOiAnbnVtYmVyJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgICByZXF1aXJlZDogWydwcm9wMScsICdwcm9wMiddXG4gICAgICB9XG4gICAgfSxcbiAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gICAgcmVxdWlyZWQ6IFsnbXlPYmplY3QnXVxuICB9KVxufSlcblxuaXQoJ3N1cHBvcnQgYHJlcXVpcmVkYCBvbiBvYmplY3Qgc2hvcnQtaGFuZCcsICgpID0+IHtcbiAgZXhwZWN0KGNvbnZlcnRTY2hlbWEoe1xuICAgIG15T2JqZWN0OiB7XG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHByb3AxOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHByb3AyOiB7XG4gICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfSkpLnRvRXF1YWwoe1xuICAgIHR5cGU6ICdvYmplY3QnLFxuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIG15T2JqZWN0OiB7XG4gICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICBmb3JtYXQ6ICdyZXF1aXJlZCcsXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICBwcm9wMToge1xuICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICBmb3JtYXQ6ICdyZXF1aXJlZCdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb3AyOiB7XG4gICAgICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgICAgIGZvcm1hdDogJ3JlcXVpcmVkJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgICByZXF1aXJlZDogWydwcm9wMScsICdwcm9wMiddXG4gICAgICB9XG4gICAgfSxcbiAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gICAgcmVxdWlyZWQ6IFsnbXlPYmplY3QnXVxuICB9KVxufSlcblxuZGVzY3JpYmUoJ2V4cGFuZFNjaGVtYVNob3J0aGFuZCgpJywgKCkgPT4ge1xuICBpdCgnZXhwYW5kcyBzdHJpbmdzIHRvIHNjaGVtYXMnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGV4cGFuZFNjaGVtYVNob3J0aGFuZCgnbnVtYmVyJykpLnRvRXF1YWwoe1xuICAgICAgdHlwZTogJ251bWJlcidcbiAgICB9KVxuICB9KVxuXG4gIGl0KCdleHBhbmRzIGFycmF5IHByb3BlcnR5IHNob3J0LWhhbmRzIHRvIGFycmF5IHByb3BlcnR5IHNjaGVtYXMnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGV4cGFuZFNjaGVtYVNob3J0aGFuZChbe1xuICAgICAgdHlwZTogJ251bWJlcidcbiAgICB9XSkpLnRvRXF1YWwoe1xuICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgIGl0ZW1zOiB7XG4gICAgICAgIHR5cGU6ICdudW1iZXInXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogW11cbiAgICB9KVxuICB9KVxuXG4gIGl0KCdleHBhbmRzIG9iamVjdHMgcHJvcGVydHkgc2hvcnQtaGFuZHMgdG8gb2JqZWN0IHByb3BlcnR5IHNjaGVtYXMnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGV4cGFuZFNjaGVtYVNob3J0aGFuZCh7XG4gICAgICBteU51bWJlcjoge1xuICAgICAgICB0eXBlOiAnbnVtYmVyJ1xuICAgICAgfVxuICAgIH0pKS50b0VxdWFsKHtcbiAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBteU51bWJlcjoge1xuICAgICAgICAgIHR5cGU6ICdudW1iZXInXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9KVxufSlcbiJdfQ==