@lowdefy/build 3.23.0-alpha.0 → 4.0.0-alpha.4

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 (87) hide show
  1. package/dist/build/addDefaultPages/404.js +56 -0
  2. package/dist/build/addDefaultPages/addDefaultPages.js +40 -0
  3. package/dist/build/buildAuth/buildAuth.js +50 -0
  4. package/dist/build/buildAuth/getPageRoles.js +34 -0
  5. package/dist/build/buildAuth/getProtectedPages.js +30 -0
  6. package/dist/build/buildConnections.js +47 -0
  7. package/dist/build/buildIcons.js +63 -0
  8. package/dist/build/buildMenu.js +122 -0
  9. package/dist/build/buildPages/buildBlock/buildBlock.js +31 -0
  10. package/dist/build/buildPages/buildBlock/buildEvents.js +72 -0
  11. package/dist/build/buildPages/buildBlock/buildRequests.js +52 -0
  12. package/dist/build/buildPages/buildBlock/buildSubBlocks.js +35 -0
  13. package/dist/build/buildPages/buildBlock/countBlockOperators.js +33 -0
  14. package/dist/build/buildPages/buildBlock/moveSubBlocksToArea.js +25 -0
  15. package/dist/build/buildPages/buildBlock/setBlockId.js +20 -0
  16. package/dist/build/buildPages/buildBlock/validateBlock.js +39 -0
  17. package/dist/build/buildPages/buildPage.js +50 -0
  18. package/dist/build/buildPages/buildPages.js +33 -0
  19. package/dist/build/buildRefs/buildRefs.js +26 -0
  20. package/dist/build/buildRefs/getConfigFile.js +28 -0
  21. package/dist/build/buildRefs/getRefContent.js +44 -0
  22. package/dist/build/buildRefs/getRefPath.js +30 -0
  23. package/dist/build/buildRefs/getRefsFromFile.js +37 -0
  24. package/dist/build/buildRefs/getUserJavascriptFunction.js +21 -0
  25. package/dist/build/buildRefs/makeRefDefinition.js +31 -0
  26. package/dist/build/buildRefs/parseNunjucks.js +20 -0
  27. package/dist/build/buildRefs/parseRefContent.js +37 -0
  28. package/dist/build/buildRefs/populateRefs.js +43 -0
  29. package/dist/build/buildRefs/recursiveBuild.js +63 -0
  30. package/dist/build/buildRefs/runRefResolver.js +33 -0
  31. package/dist/build/buildRefs/runTransformer.js +26 -0
  32. package/dist/build/buildStyles.js +29 -0
  33. package/dist/build/buildTypes.js +83 -0
  34. package/dist/build/cleanBuildDirectory.js +19 -0
  35. package/dist/build/testSchema.js +34 -0
  36. package/dist/build/validateApp.js +36 -0
  37. package/dist/build/validateConfig.js +53 -0
  38. package/dist/build/writeApp.js +22 -0
  39. package/dist/build/writeConfig.js +22 -0
  40. package/dist/build/writeConnections.js +29 -0
  41. package/dist/build/writeGlobal.js +29 -0
  42. package/dist/build/writeMenus.js +25 -0
  43. package/dist/build/writePages.js +37 -0
  44. package/dist/build/writePluginImports/writeBlockImports.js +39 -0
  45. package/dist/build/writePluginImports/writeConnectionImports.js +39 -0
  46. package/dist/build/writePluginImports/writeIconImports.js +37 -0
  47. package/dist/build/writePluginImports/writeStyleImports.js +30 -0
  48. package/dist/build/writeRequests.js +37 -0
  49. package/dist/build/writeTypes.js +21 -0
  50. package/dist/defaultTypes.json +66 -0
  51. package/dist/index.js +182 -1
  52. package/dist/lowdefySchema.js +699 -0
  53. package/dist/scripts/generateDefaultTypes.js +101 -0
  54. package/dist/scripts/run.js +25 -0
  55. package/dist/test/buildRefs/testBuildRefsAsyncFunction.js +25 -0
  56. package/dist/test/buildRefs/testBuildRefsErrorResolver.js +18 -0
  57. package/dist/test/buildRefs/testBuildRefsNullResolver.js +19 -0
  58. package/dist/test/buildRefs/testBuildRefsParsingResolver.js +39 -0
  59. package/dist/test/buildRefs/testBuildRefsResolver.js +23 -0
  60. package/dist/test/buildRefs/testBuildRefsTransform.js +25 -0
  61. package/dist/test/buildRefs/testBuildRefsTransformIdentity.js +21 -0
  62. package/dist/test/testContext.js +55 -0
  63. package/dist/utils/countOperators.js +30 -0
  64. package/dist/utils/createCheckDuplicateId.js +31 -0
  65. package/dist/utils/createCounter.js +33 -0
  66. package/dist/utils/files/readConfigFile.js +24 -0
  67. package/dist/utils/files/writeBuildArtifact.js +26 -0
  68. package/dist/utils/formatErrorMessage.js +56 -0
  69. package/package.json +22 -21
  70. package/dist/138.index.js +0 -2
  71. package/dist/138.index.js.LICENSE.txt +0 -3
  72. package/dist/231.index.js +0 -1
  73. package/dist/319.index.js +0 -1
  74. package/dist/35.index.js +0 -1
  75. package/dist/422.index.js +0 -1
  76. package/dist/443.index.js +0 -1
  77. package/dist/449.index.js +0 -1
  78. package/dist/5.index.js +0 -2
  79. package/dist/5.index.js.LICENSE.txt +0 -1
  80. package/dist/564.index.js +0 -1
  81. package/dist/569.index.js +0 -1
  82. package/dist/625.index.js +0 -1
  83. package/dist/693.index.js +0 -2
  84. package/dist/693.index.js.LICENSE.txt +0 -1
  85. package/dist/734.index.js +0 -1
  86. package/dist/904.index.js +0 -1
  87. package/dist/remoteEntry.js +0 -1
@@ -0,0 +1,699 @@
1
+ export default {
2
+ $schema: 'http://json-schema.org/draft-07/schema#',
3
+ $id: 'http://lowdefy.com/appSchema.json',
4
+ type: 'object',
5
+ title: 'Lowdefy App Schema',
6
+ definitions: {
7
+ action: {
8
+ type: 'object',
9
+ additionalProperties: false,
10
+ required: [
11
+ 'id',
12
+ 'type'
13
+ ],
14
+ properties: {
15
+ async: {
16
+ type: 'boolean',
17
+ errorMessage: {
18
+ type: 'Action "async" should be a boolean.'
19
+ }
20
+ },
21
+ id: {
22
+ type: 'string',
23
+ errorMessage: {
24
+ type: 'Action "id" should be a string.'
25
+ }
26
+ },
27
+ messages: {
28
+ },
29
+ params: {
30
+ },
31
+ skip: {
32
+ },
33
+ type: {
34
+ type: 'string',
35
+ errorMessage: {
36
+ type: 'Action "type" should be a string.'
37
+ }
38
+ }
39
+ },
40
+ errorMessage: {
41
+ type: 'Action should be an object.',
42
+ required: {
43
+ id: 'Action should have required property "id".',
44
+ type: 'Action should have required property "type".'
45
+ }
46
+ }
47
+ },
48
+ app: {
49
+ type: 'object',
50
+ additionalProperties: false,
51
+ properties: {
52
+ html: {
53
+ type: 'object',
54
+ errorMessage: {
55
+ type: 'App "app.html" should be an object.'
56
+ },
57
+ properties: {
58
+ appendBody: {
59
+ type: 'string',
60
+ errorMessage: {
61
+ type: 'App "app.html.appendBody" should be a string.'
62
+ }
63
+ },
64
+ appendHead: {
65
+ type: 'string',
66
+ errorMessage: {
67
+ type: 'App "app.html.appendHead" should be a string.'
68
+ }
69
+ }
70
+ }
71
+ }
72
+ }
73
+ },
74
+ authConfig: {
75
+ type: 'object',
76
+ additionalProperties: false,
77
+ errorMessage: {
78
+ type: 'App "config.auth" should be an object.'
79
+ },
80
+ properties: {
81
+ openId: {
82
+ type: 'object',
83
+ additionalProperties: false,
84
+ errorMessage: {
85
+ type: 'App "config.auth.openId" should be an object.'
86
+ },
87
+ properties: {
88
+ rolesField: {
89
+ type: 'string',
90
+ description: '.',
91
+ errorMessage: {
92
+ type: 'App "config.auth.openId.rolesField" should be a string.'
93
+ }
94
+ },
95
+ logoutRedirectUri: {
96
+ type: 'string',
97
+ description: 'The URI to redirect the user to after logout. Can be a Nunjucks template string with client_id, host, id_token_hint, and openid_domain as template data.',
98
+ errorMessage: {
99
+ type: 'App "config.auth.openId.logoutRedirectUri" should be a string.'
100
+ }
101
+ },
102
+ scope: {
103
+ type: 'string',
104
+ description: 'The OpenID Connect scope to request.',
105
+ default: 'openid profile email',
106
+ errorMessage: {
107
+ type: 'App "config.auth.openId.scope" should be a string.'
108
+ }
109
+ }
110
+ }
111
+ },
112
+ pages: {
113
+ type: 'object',
114
+ additionalProperties: false,
115
+ errorMessage: {
116
+ type: 'App "config.auth.pages" should be an object.'
117
+ },
118
+ properties: {
119
+ protected: {
120
+ type: [
121
+ 'array',
122
+ 'boolean'
123
+ ],
124
+ errorMessage: {
125
+ type: 'App "config.auth.pages.protected.$" should be an array of strings.'
126
+ },
127
+ items: {
128
+ type: 'string',
129
+ description: 'Page ids for which authentication is required. When specified, all unspecified pages will be public.',
130
+ errorMessage: {
131
+ type: 'App "config.auth.pages.protected.$" should be an array of strings.'
132
+ }
133
+ }
134
+ },
135
+ public: {
136
+ type: [
137
+ 'array',
138
+ 'boolean'
139
+ ],
140
+ errorMessage: {
141
+ type: 'App "config.auth.pages.public.$" should be an array of strings.'
142
+ },
143
+ items: {
144
+ type: 'string',
145
+ description: 'Page ids for which authentication is not required. When specified, all unspecified pages will be protected.',
146
+ errorMessage: {
147
+ type: 'App "config.auth.pages.public.$" should be an array of strings.'
148
+ }
149
+ }
150
+ },
151
+ roles: {
152
+ type: 'object',
153
+ patternProperties: {
154
+ '^.*$': {
155
+ type: 'array',
156
+ items: {
157
+ type: 'string'
158
+ },
159
+ errorMessage: {
160
+ type: 'App "config.auth.pages.roles.[role]" should be an array of strings.'
161
+ }
162
+ }
163
+ },
164
+ errorMessage: {
165
+ type: 'App "config.auth.pages.roles" should be an object.'
166
+ }
167
+ }
168
+ }
169
+ },
170
+ jwt: {
171
+ type: 'object',
172
+ additionalProperties: false,
173
+ errorMessage: {
174
+ type: 'App "config.auth.jwt" should be an object.'
175
+ },
176
+ properties: {
177
+ expiresIn: {
178
+ type: [
179
+ 'string',
180
+ 'number'
181
+ ],
182
+ default: '4h',
183
+ description: 'The length of time a user token should be valid. Can be expressed as a number in seconds, or a vercel/ms string (https://github.com/vercel/ms)',
184
+ errorMessage: {
185
+ type: 'App "config.auth.jwt.expiresIn" should be a string or number.'
186
+ }
187
+ },
188
+ loginStateExpiresIn: {
189
+ type: [
190
+ 'string',
191
+ 'number'
192
+ ],
193
+ default: '5min',
194
+ description: 'The length of time an authorization request token should be valid. Can be expressed as a number in seconds, or a vercel/ms string (https://github.com/vercel/ms)',
195
+ errorMessage: {
196
+ type: 'App "config.auth.jwt.loginStateExpiresIn" should be a string or number.'
197
+ }
198
+ }
199
+ }
200
+ }
201
+ }
202
+ },
203
+ block: {
204
+ type: 'object',
205
+ additionalProperties: false,
206
+ required: [
207
+ 'id',
208
+ 'type'
209
+ ],
210
+ properties: {
211
+ id: {
212
+ type: 'string',
213
+ errorMessage: {
214
+ type: 'Block "id" should be a string.'
215
+ }
216
+ },
217
+ type: {
218
+ type: 'string',
219
+ errorMessage: {
220
+ type: 'Block "type" should be a string.'
221
+ }
222
+ },
223
+ field: {
224
+ type: 'string',
225
+ errorMessage: {
226
+ type: 'Block "field" should be a string.'
227
+ }
228
+ },
229
+ properties: {
230
+ type: 'object'
231
+ },
232
+ layout: {
233
+ type: 'object',
234
+ errorMessage: {
235
+ type: 'Block "layout" should be an object.'
236
+ }
237
+ },
238
+ loading: {
239
+ type: 'object',
240
+ errorMessage: {
241
+ type: 'Block "loading" should be an object.'
242
+ }
243
+ },
244
+ style: {
245
+ type: 'object',
246
+ errorMessage: {
247
+ type: 'Block "style" should be an object.'
248
+ }
249
+ },
250
+ visible: {
251
+ },
252
+ blocks: {
253
+ type: 'array',
254
+ items: {
255
+ $ref: '#/definitions/block'
256
+ },
257
+ errorMessage: {
258
+ type: 'Block "blocks" should be an array.'
259
+ }
260
+ },
261
+ requests: {
262
+ type: 'array',
263
+ items: {
264
+ $ref: '#/definitions/request'
265
+ },
266
+ errorMessage: {
267
+ type: 'Block "requests" should be an array.'
268
+ }
269
+ },
270
+ required: {
271
+ },
272
+ validate: {
273
+ type: 'array',
274
+ items: {
275
+ type: 'object',
276
+ errorMessage: {
277
+ type: 'Block "validate" should be an array of objects.'
278
+ }
279
+ },
280
+ errorMessage: {
281
+ type: 'Block "validate" should be an array.'
282
+ }
283
+ },
284
+ events: {
285
+ type: 'object',
286
+ patternProperties: {
287
+ '^.*$': {
288
+ anyOf: [
289
+ {
290
+ type: 'array',
291
+ items: {
292
+ $ref: '#/definitions/action'
293
+ }
294
+ },
295
+ {
296
+ type: 'object',
297
+ additionalProperties: false,
298
+ properties: {
299
+ try: {
300
+ type: 'array',
301
+ items: {
302
+ $ref: '#/definitions/action'
303
+ }
304
+ },
305
+ catch: {
306
+ type: 'array',
307
+ items: {
308
+ $ref: '#/definitions/action'
309
+ }
310
+ },
311
+ debounce: {
312
+ type: 'object',
313
+ additionalProperties: false,
314
+ properties: {
315
+ immediate: {
316
+ type: 'boolean',
317
+ errorMessage: {
318
+ type: 'Event "debounce.immediate" should be an boolean.'
319
+ }
320
+ },
321
+ ms: {
322
+ type: 'number',
323
+ errorMessage: {
324
+ type: 'Event "debounce.ms" should be a number.'
325
+ }
326
+ }
327
+ }
328
+ }
329
+ }
330
+ },
331
+ ]
332
+ }
333
+ },
334
+ errorMessage: {
335
+ type: 'Block "events" should be an object.'
336
+ }
337
+ },
338
+ areas: {
339
+ type: 'object',
340
+ patternProperties: {
341
+ '^.*$': {
342
+ type: 'object',
343
+ properties: {
344
+ blocks: {
345
+ type: 'array',
346
+ items: {
347
+ $ref: '#/definitions/block'
348
+ },
349
+ errorMessage: {
350
+ type: 'Block "areas.{areaKey}.blocks" should be an array.'
351
+ }
352
+ }
353
+ },
354
+ errorMessage: {
355
+ type: 'Block "areas.{areaKey}" should be an object.'
356
+ }
357
+ }
358
+ },
359
+ errorMessage: {
360
+ type: 'Block "areas" should be an object.'
361
+ }
362
+ }
363
+ },
364
+ errorMessage: {
365
+ type: 'Block should be an object.',
366
+ required: {
367
+ id: 'Block should have required property "id".',
368
+ type: 'Block should have required property "type".'
369
+ }
370
+ }
371
+ },
372
+ connection: {
373
+ type: 'object',
374
+ additionalProperties: false,
375
+ required: [
376
+ 'id',
377
+ 'type'
378
+ ],
379
+ properties: {
380
+ id: {
381
+ type: 'string',
382
+ errorMessage: {
383
+ type: 'Connection "id" should be a string.'
384
+ }
385
+ },
386
+ type: {
387
+ type: 'string',
388
+ errorMessage: {
389
+ type: 'Connection "type" should be a string.'
390
+ }
391
+ },
392
+ properties: {
393
+ type: 'object',
394
+ errorMessage: {
395
+ type: 'Connection "properties" should be an object.'
396
+ }
397
+ }
398
+ },
399
+ errorMessage: {
400
+ type: 'Connection should be an object.',
401
+ required: {
402
+ id: 'Connection should have required property "id".',
403
+ type: 'Connection should have required property "type".'
404
+ }
405
+ }
406
+ },
407
+ menu: {
408
+ type: 'object',
409
+ additionalProperties: false,
410
+ required: [
411
+ 'id'
412
+ ],
413
+ properties: {
414
+ id: {
415
+ type: 'string',
416
+ errorMessage: {
417
+ type: 'Menu "id" should be a string.'
418
+ }
419
+ },
420
+ properties: {
421
+ type: 'object',
422
+ errorMessage: {
423
+ type: 'Menu "properties" should be an object.'
424
+ }
425
+ },
426
+ links: {
427
+ type: 'array',
428
+ items: {
429
+ $ref: '#/definitions/menuItem'
430
+ },
431
+ errorMessage: {
432
+ type: 'Menu "links" should be an array.'
433
+ }
434
+ }
435
+ },
436
+ errorMessage: {
437
+ type: 'Menu should be an object.',
438
+ required: {
439
+ id: 'Menu should have required property "id".'
440
+ }
441
+ }
442
+ },
443
+ menuGroup: {
444
+ type: 'object',
445
+ additionalProperties: false,
446
+ required: [
447
+ 'id',
448
+ 'type'
449
+ ],
450
+ properties: {
451
+ id: {
452
+ type: 'string',
453
+ errorMessage: {
454
+ type: 'MenuGroup "id" should be a string.'
455
+ }
456
+ },
457
+ type: {
458
+ type: 'string',
459
+ errorMessage: {
460
+ type: 'MenuGroup "type" should be a string.'
461
+ }
462
+ },
463
+ properties: {
464
+ type: 'object',
465
+ errorMessage: {
466
+ type: 'MenuGroup "properties" should be an object.'
467
+ }
468
+ },
469
+ links: {
470
+ type: 'array',
471
+ items: {
472
+ $ref: '#/definitions/menuItem'
473
+ },
474
+ errorMessage: {
475
+ type: 'MenuGroup "links" should be an array.'
476
+ }
477
+ }
478
+ },
479
+ errorMessage: {
480
+ type: 'MenuGroup should be an object.',
481
+ required: {
482
+ id: 'MenuGroup should have required property "id".',
483
+ type: 'MenuGroup should have required property "type".'
484
+ }
485
+ }
486
+ },
487
+ menuItem: {
488
+ anyOf: [
489
+ {
490
+ $ref: '#/definitions/menuGroup'
491
+ },
492
+ {
493
+ $ref: '#/definitions/menuLink'
494
+ },
495
+ ]
496
+ },
497
+ menuLink: {
498
+ type: 'object',
499
+ additionalProperties: false,
500
+ required: [
501
+ 'id',
502
+ 'type'
503
+ ],
504
+ properties: {
505
+ id: {
506
+ type: 'string',
507
+ errorMessage: {
508
+ type: 'MenuLink "id" should be a string.'
509
+ }
510
+ },
511
+ type: {
512
+ type: 'string',
513
+ errorMessage: {
514
+ type: 'MenuLink "type" should be a string.'
515
+ }
516
+ },
517
+ pageId: {
518
+ type: 'string',
519
+ errorMessage: {
520
+ type: 'MenuLink "pageId" should be a string.'
521
+ }
522
+ },
523
+ url: {
524
+ type: 'string',
525
+ errorMessage: {
526
+ type: 'MenuLink "url" should be a string.'
527
+ }
528
+ },
529
+ properties: {
530
+ type: 'object',
531
+ errorMessage: {
532
+ type: 'MenuLink "properties" should be an object.'
533
+ }
534
+ }
535
+ },
536
+ errorMessage: {
537
+ type: 'MenuLink should be an object.',
538
+ required: {
539
+ id: 'MenuLink should have required property "id".',
540
+ type: 'MenuLink should have required property "type".'
541
+ }
542
+ }
543
+ },
544
+ request: {
545
+ type: 'object',
546
+ additionalProperties: false,
547
+ required: [
548
+ 'id',
549
+ 'type',
550
+ 'connectionId'
551
+ ],
552
+ properties: {
553
+ id: {
554
+ type: 'string',
555
+ errorMessage: {
556
+ type: 'Request "id" should be a string.'
557
+ }
558
+ },
559
+ type: {
560
+ type: 'string',
561
+ errorMessage: {
562
+ type: 'Request "type" should be a string.'
563
+ }
564
+ },
565
+ connectionId: {
566
+ type: 'string',
567
+ errorMessage: {
568
+ type: 'Request "connectionId" should be a string.'
569
+ }
570
+ },
571
+ payload: {
572
+ type: 'object',
573
+ errorMessage: {
574
+ type: 'Request "payload" should be an object.'
575
+ }
576
+ },
577
+ properties: {
578
+ type: 'object',
579
+ errorMessage: {
580
+ type: 'Request "properties" should be an object.'
581
+ }
582
+ }
583
+ },
584
+ errorMessage: {
585
+ type: 'Request should be an object.',
586
+ required: {
587
+ id: 'Request should have required property "id".',
588
+ type: 'Request should have required property "type".',
589
+ connectionId: 'Request should have required property "connectionId".'
590
+ }
591
+ }
592
+ }
593
+ },
594
+ additionalProperties: false,
595
+ required: [
596
+ 'lowdefy'
597
+ ],
598
+ properties: {
599
+ name: {
600
+ type: 'string',
601
+ errorMessage: {
602
+ type: 'App "name" should be a string.'
603
+ }
604
+ },
605
+ lowdefy: {
606
+ type: 'string',
607
+ errorMessage: {
608
+ type: 'Lowdefy version in field "lowdefy" should be a string.'
609
+ }
610
+ },
611
+ license: {
612
+ type: 'string',
613
+ errorMessage: {
614
+ type: 'App "license" should be a string.'
615
+ }
616
+ },
617
+ app: {
618
+ $ref: '#/definitions/app'
619
+ },
620
+ cli: {
621
+ type: 'object',
622
+ errorMessage: {
623
+ type: 'App "cli" should be an object.'
624
+ }
625
+ },
626
+ config: {
627
+ type: 'object',
628
+ errorMessage: {
629
+ type: 'App "config" should be an object.'
630
+ },
631
+ additionalProperties: false,
632
+ properties: {
633
+ homePageId: {
634
+ type: 'string',
635
+ description: 'Page id to use as homepage. When visiting home route "/", the router will redirect to this page. If not provided, the first page in default or first menu will be used as the homePageId.',
636
+ errorMessage: {
637
+ type: 'App "config.homePageId" should be a string.'
638
+ }
639
+ },
640
+ auth: {
641
+ $ref: '#/definitions/authConfig'
642
+ }
643
+ }
644
+ },
645
+ types: {
646
+ type: 'object',
647
+ patternProperties: {
648
+ '^.*$': {
649
+ url: 'string',
650
+ errorMessage: {
651
+ enum: 'Type "url" should be a string.'
652
+ }
653
+ }
654
+ },
655
+ errorMessage: {
656
+ type: 'App "types" should be an object.'
657
+ }
658
+ },
659
+ global: {
660
+ type: 'object',
661
+ errorMessage: {
662
+ type: 'App "global" should be an object.'
663
+ }
664
+ },
665
+ connections: {
666
+ type: 'array',
667
+ items: {
668
+ $ref: '#/definitions/connection'
669
+ },
670
+ errorMessage: {
671
+ type: 'App "connections" should be an array.'
672
+ }
673
+ },
674
+ menus: {
675
+ type: 'array',
676
+ items: {
677
+ $ref: '#/definitions/menu'
678
+ },
679
+ errorMessage: {
680
+ type: 'App "menus" should be an array.'
681
+ }
682
+ },
683
+ pages: {
684
+ type: 'array',
685
+ items: {
686
+ $ref: '#/definitions/block'
687
+ },
688
+ errorMessage: {
689
+ type: 'App "pages" should be an array.'
690
+ }
691
+ }
692
+ },
693
+ errorMessage: {
694
+ type: 'Lowdefy configuration should be an object.',
695
+ required: {
696
+ lowdefy: 'Lowdefy configuration should have required property "lowdefy".'
697
+ }
698
+ }
699
+ };