@json-editor/json-editor 1.4.0-beta.0 → 1.17.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 (435) hide show
  1. package/.claude/settings.local.json +8 -0
  2. package/.env +2 -0
  3. package/.env-dist +2 -0
  4. package/.eslintrc +10 -0
  5. package/.github/PULL_REQUEST_TEMPLATE.md +9 -0
  6. package/.github/workflows/build.yml +70 -0
  7. package/.travis.yml +62 -16
  8. package/CHANGELOG.md +483 -113
  9. package/CONTRIBUTING.md +43 -4
  10. package/Makefile +26 -0
  11. package/README.md +632 -121
  12. package/README_ADDON.md +577 -0
  13. package/UPGRADING.md +46 -0
  14. package/build/CssToJson.js +55 -0
  15. package/codecept.conf.js +35 -0
  16. package/config/.eslintrc +7 -0
  17. package/config/codeceptjs_helpers.js +146 -0
  18. package/config/helpers.js +10 -0
  19. package/config/karma.conf.js +89 -0
  20. package/config/readme.md +31 -0
  21. package/config/webpack.common.js +71 -0
  22. package/config/webpack.dev.js +15 -0
  23. package/config/webpack.nonmin.js +19 -0
  24. package/config/webpack.prod.js +24 -0
  25. package/dist/jsoneditor.js +2 -11550
  26. package/dist/jsoneditor.js.LICENSE.txt +15 -0
  27. package/dist/nonmin/jsoneditor.js +31392 -0
  28. package/dist/nonmin/jsoneditor.js.map +1 -0
  29. package/docs/basic.html +2 -2
  30. package/docs/basic_person.json +2 -1
  31. package/docs/choices.html +86 -0
  32. package/docs/cleave.html +11 -19
  33. package/docs/colorpicker.html +194 -0
  34. package/docs/css_integration.html +56 -54
  35. package/docs/custom-editor.html +92 -0
  36. package/docs/datetime.html +48 -21
  37. package/docs/describedby.html +42 -35
  38. package/docs/enumsource.html +67 -0
  39. package/docs/form-submission.html +162 -0
  40. package/docs/imask.html +192 -0
  41. package/docs/index.html +600 -582
  42. package/docs/materialize_css.html +1 -1
  43. package/docs/meta-schema.html +793 -0
  44. package/docs/meta_schema.json +446 -400
  45. package/docs/polyfills/assign.js +29 -0
  46. package/docs/radio.html +9 -17
  47. package/docs/recursive.html +15 -17
  48. package/docs/scripts/ajv-validator.js +8695 -0
  49. package/docs/select2.html +15 -9
  50. package/docs/selectize.html +11 -9
  51. package/docs/signature.html +12 -11
  52. package/docs/starrating.html +5 -17
  53. package/docs/upload.html +33 -23
  54. package/docs/uuid.html +70 -0
  55. package/docs/wysiwyg.html +14 -7
  56. package/jasmine.json +11 -0
  57. package/package.json +74 -25
  58. package/release-notes.md +90 -0
  59. package/src/core.js +411 -611
  60. package/src/defaults.js +381 -327
  61. package/src/editor.js +733 -544
  62. package/src/editors/ace.js +90 -0
  63. package/src/editors/array/choices.js +104 -0
  64. package/src/editors/array/select2.js +112 -0
  65. package/src/editors/array/selectize.js +107 -130
  66. package/src/editors/array.css +9 -0
  67. package/src/editors/array.css.js +3 -0
  68. package/src/editors/array.js +812 -695
  69. package/src/editors/autocomplete.js +59 -0
  70. package/src/editors/base64.js +148 -129
  71. package/src/editors/button.js +104 -0
  72. package/src/editors/checkbox.js +111 -76
  73. package/src/editors/choices.css +3 -0
  74. package/src/editors/choices.css.js +3 -0
  75. package/src/editors/choices.js +71 -0
  76. package/src/editors/colorpicker.js +105 -0
  77. package/src/editors/datetime.js +93 -79
  78. package/src/editors/describedby.js +141 -125
  79. package/src/editors/enum.js +131 -116
  80. package/src/editors/hidden.js +100 -86
  81. package/src/editors/index.js +81 -0
  82. package/src/editors/info.js +28 -0
  83. package/src/editors/integer.js +21 -8
  84. package/src/editors/ip.js +36 -0
  85. package/src/editors/jodit.js +66 -0
  86. package/src/editors/multiple.js +380 -241
  87. package/src/editors/multiselect.js +207 -207
  88. package/src/editors/null.js +15 -11
  89. package/src/editors/number.js +39 -30
  90. package/src/editors/object.css +41 -0
  91. package/src/editors/object.css.js +3 -0
  92. package/src/editors/object.js +1190 -1068
  93. package/src/editors/radio.js +117 -101
  94. package/src/editors/sceditor.js +74 -0
  95. package/src/editors/select.js +318 -342
  96. package/src/editors/select2.js +112 -0
  97. package/src/editors/selectize.js +89 -338
  98. package/src/editors/signature.js +100 -104
  99. package/src/editors/simplemde.js +103 -0
  100. package/src/{styles → editors}/starrating.css +11 -2
  101. package/src/editors/starrating.css.js +3 -0
  102. package/src/editors/starrating.js +126 -95
  103. package/src/editors/stepper.js +27 -0
  104. package/src/editors/string.js +352 -426
  105. package/src/editors/table.js +486 -410
  106. package/src/editors/upload.js +297 -131
  107. package/src/editors/uuid.js +49 -0
  108. package/src/iconlib.js +22 -27
  109. package/src/iconlibs/bootstrap.js +28 -0
  110. package/src/iconlibs/bootstrap2.js +28 -17
  111. package/src/iconlibs/bootstrap3.js +28 -17
  112. package/src/iconlibs/fontawesome3.js +28 -17
  113. package/src/iconlibs/fontawesome4.js +28 -18
  114. package/src/iconlibs/fontawesome5.js +28 -18
  115. package/src/iconlibs/foundation2.js +24 -17
  116. package/src/iconlibs/foundation3.js +28 -17
  117. package/src/iconlibs/index.js +27 -0
  118. package/src/iconlibs/jqueryui.js +28 -17
  119. package/src/iconlibs/materialicons.js +49 -44
  120. package/src/iconlibs/openiconic.js +28 -0
  121. package/src/iconlibs/spectre.js +28 -0
  122. package/src/resolvers.js +135 -0
  123. package/src/schemaloader.js +639 -0
  124. package/src/style.css +157 -0
  125. package/src/style.css.js +3 -0
  126. package/src/templates/default.js +46 -51
  127. package/src/templates/ejs.js +8 -10
  128. package/src/templates/handlebars.js +1 -3
  129. package/src/templates/hogan.js +7 -9
  130. package/src/templates/index.js +21 -0
  131. package/src/templates/lodash.js +6 -8
  132. package/src/templates/markup.js +6 -8
  133. package/src/templates/mustache.js +6 -8
  134. package/src/templates/swig.js +1 -3
  135. package/src/templates/underscore.js +6 -8
  136. package/src/theme.js +717 -433
  137. package/src/themes/barebones.css +35 -0
  138. package/src/themes/barebones.css.js +3 -0
  139. package/src/themes/barebones.js +31 -0
  140. package/src/themes/bootstrap2.js +302 -265
  141. package/src/themes/bootstrap3.css +53 -0
  142. package/src/themes/bootstrap3.css.js +3 -0
  143. package/src/themes/bootstrap3.js +355 -262
  144. package/src/themes/bootstrap4.css +89 -0
  145. package/src/themes/bootstrap4.css.js +3 -0
  146. package/src/themes/bootstrap4.js +743 -237
  147. package/src/themes/bootstrap5.css +97 -0
  148. package/src/themes/bootstrap5.css.js +3 -0
  149. package/src/themes/bootstrap5.js +687 -0
  150. package/src/themes/foundation.js +535 -472
  151. package/src/themes/html.css +60 -0
  152. package/src/themes/html.css.js +3 -0
  153. package/src/themes/html.js +69 -82
  154. package/src/themes/index.js +29 -0
  155. package/src/themes/jqueryui.js +181 -167
  156. package/src/themes/materialize.js +263 -292
  157. package/src/themes/spectre.css +208 -0
  158. package/src/themes/spectre.css.js +3 -0
  159. package/src/themes/spectre.js +443 -0
  160. package/src/themes/tailwind.css +303 -0
  161. package/src/themes/tailwind.css.js +3 -0
  162. package/src/themes/tailwind.js +469 -0
  163. package/src/utilities.js +127 -68
  164. package/src/validator.js +909 -565
  165. package/src/validators/ip-validator.js +51 -0
  166. package/tests/Dockerfile +3 -0
  167. package/tests/README.md +25 -5
  168. package/tests/codeceptjs/codecept.json +9 -2
  169. package/tests/codeceptjs/constrains/contains_test.js +37 -0
  170. package/tests/codeceptjs/constrains/dependentRequired_test.js +33 -0
  171. package/tests/codeceptjs/constrains/dependentSchemas_test.js +16 -0
  172. package/tests/codeceptjs/constrains/if-then-else_test.js +186 -0
  173. package/tests/codeceptjs/core_test.js +534 -63
  174. package/tests/codeceptjs/editors/advanced_test.js +12 -9
  175. package/tests/codeceptjs/editors/array_any_of_test.js +50 -0
  176. package/tests/codeceptjs/editors/array_test.js +923 -657
  177. package/tests/codeceptjs/editors/autocomplete_test.js +15 -0
  178. package/tests/codeceptjs/editors/button_test.js +50 -0
  179. package/tests/codeceptjs/editors/checkbox_test.js +21 -6
  180. package/tests/codeceptjs/editors/colorpicker_test.js +29 -0
  181. package/tests/codeceptjs/editors/datetime_test.js +33 -0
  182. package/tests/codeceptjs/editors/inheritance_test.js +10 -0
  183. package/tests/codeceptjs/editors/integer_test.js +82 -64
  184. package/tests/codeceptjs/editors/jodit_test.js +23 -0
  185. package/tests/codeceptjs/editors/multiple_test.js +27 -0
  186. package/tests/codeceptjs/editors/multiselect_test.js +6 -7
  187. package/tests/codeceptjs/editors/number_test.js +75 -60
  188. package/tests/codeceptjs/editors/object_test.js +322 -80
  189. package/tests/codeceptjs/editors/option-no_default_values_test.js +42 -0
  190. package/tests/codeceptjs/editors/programmatic-changes_test.js +20 -0
  191. package/tests/codeceptjs/editors/purify_test.js +26 -0
  192. package/tests/codeceptjs/editors/radio_test.js +9 -0
  193. package/tests/codeceptjs/editors/range_test.js +10 -0
  194. package/tests/codeceptjs/editors/rating_test.js +10 -10
  195. package/tests/codeceptjs/editors/select_test.js +47 -18
  196. package/tests/codeceptjs/editors/starrating_test.js +15 -0
  197. package/tests/codeceptjs/editors/stepper_test.js +37 -0
  198. package/tests/codeceptjs/editors/string_test.js +107 -91
  199. package/tests/codeceptjs/editors/table-confirm-delete_test.js +60 -54
  200. package/tests/codeceptjs/editors/tabs_test.js +15 -11
  201. package/tests/codeceptjs/editors/uuid_test.js +48 -0
  202. package/tests/codeceptjs/editors/validation_test.js +13 -9
  203. package/tests/codeceptjs/issues/issue-gh-1133_test.js +9 -0
  204. package/tests/codeceptjs/issues/issue-gh-1158-2_test.js +10 -0
  205. package/tests/codeceptjs/issues/issue-gh-1158_test.js +8 -0
  206. package/tests/codeceptjs/issues/issue-gh-1164_test.js +9 -0
  207. package/tests/codeceptjs/issues/issue-gh-1171_test.js +11 -0
  208. package/tests/codeceptjs/issues/issue-gh-1211_test.js +17 -0
  209. package/tests/codeceptjs/issues/issue-gh-1257_test.js +11 -0
  210. package/tests/codeceptjs/issues/issue-gh-1272_test.js +21 -0
  211. package/tests/codeceptjs/issues/issue-gh-1330_test.js +8 -0
  212. package/tests/codeceptjs/issues/issue-gh-1338_test.js +18 -0
  213. package/tests/codeceptjs/issues/issue-gh-1347_test.js +8 -0
  214. package/tests/codeceptjs/issues/issue-gh-1364_test.js +13 -0
  215. package/tests/codeceptjs/issues/issue-gh-1367_test.js +11 -0
  216. package/tests/codeceptjs/issues/issue-gh-1383_test.js +9 -0
  217. package/tests/codeceptjs/issues/issue-gh-1384_test.js +9 -0
  218. package/tests/codeceptjs/issues/issue-gh-1410_test.js +13 -0
  219. package/tests/codeceptjs/issues/issue-gh-1422_test.js +9 -0
  220. package/tests/codeceptjs/issues/issue-gh-1431_test.js +12 -0
  221. package/tests/codeceptjs/issues/issue-gh-1439_test.js +12 -0
  222. package/tests/codeceptjs/issues/issue-gh-1452_test.js +10 -0
  223. package/tests/codeceptjs/issues/issue-gh-1453_test.js +18 -0
  224. package/tests/codeceptjs/issues/issue-gh-1461_test.js +14 -0
  225. package/tests/codeceptjs/issues/issue-gh-1463_test.js +9 -0
  226. package/tests/codeceptjs/issues/issue-gh-1471_test.js +17 -0
  227. package/tests/codeceptjs/issues/issue-gh-1485_test.js +13 -0
  228. package/tests/codeceptjs/issues/issue-gh-1491_test.js +9 -0
  229. package/tests/codeceptjs/issues/issue-gh-1525_test.js +9 -0
  230. package/tests/codeceptjs/issues/issue-gh-1536_test.js +12 -0
  231. package/tests/codeceptjs/issues/issue-gh-1538_test.js +10 -0
  232. package/tests/codeceptjs/issues/issue-gh-1541_test.js +8 -0
  233. package/tests/codeceptjs/issues/issue-gh-1559_test.js +15 -0
  234. package/tests/codeceptjs/issues/issue-gh-1562_test.js +12 -0
  235. package/tests/codeceptjs/issues/issue-gh-1586_test.js +15 -0
  236. package/tests/codeceptjs/issues/issue-gh-1636_test.js +9 -0
  237. package/tests/codeceptjs/issues/issue-gh-795_test.js +13 -0
  238. package/tests/codeceptjs/issues/issue-gh-810_test.js +52 -0
  239. package/tests/codeceptjs/issues/issue-gh-812_test.js +25 -0
  240. package/tests/codeceptjs/meta-schema_test.js +85 -0
  241. package/tests/codeceptjs/schemaloader_test.js +14 -0
  242. package/tests/codeceptjs/steps.d.ts +13 -0
  243. package/tests/codeceptjs/steps_file.js +4 -4
  244. package/tests/codeceptjs/test-config.js +3 -0
  245. package/tests/codeceptjs/themes_test.js +564 -0
  246. package/tests/docker-compose-local.yml +5 -0
  247. package/tests/docker-compose.yml +11 -19
  248. package/tests/fixtures/basic_person.json +2 -1
  249. package/tests/fixtures/definitions.json +22 -0
  250. package/tests/fixtures/nested_object.json +26 -0
  251. package/tests/fixtures/properties.json +20 -0
  252. package/tests/fixtures/some_types.json +32 -0
  253. package/tests/fixtures/validation.json +1347 -0
  254. package/tests/pages/_demo.html +475 -0
  255. package/tests/pages/advanced.html +1 -1
  256. package/tests/pages/anyof-2.html +91 -0
  257. package/tests/pages/anyof.html +82 -0
  258. package/tests/pages/array-anyof.html +145 -0
  259. package/tests/pages/array-checkboxes-infotext.html +55 -0
  260. package/tests/pages/array-checkboxes.html +5 -2
  261. package/tests/pages/array-choices.html +48 -0
  262. package/tests/pages/array-events-table.html +70 -0
  263. package/tests/pages/array-events.html +75 -0
  264. package/tests/pages/array-header-template.html +60 -0
  265. package/tests/pages/array-integers.html +5 -2
  266. package/tests/pages/array-multiselects.html +5 -2
  267. package/tests/pages/array-nested-arrays.html +5 -2
  268. package/tests/pages/array-numbers.html +5 -2
  269. package/tests/pages/array-objects.html +5 -2
  270. package/tests/pages/array-ratings.html +5 -2
  271. package/tests/pages/array-selectize-create.html +63 -0
  272. package/tests/pages/array-selectize.html +10 -8
  273. package/tests/pages/array-selects.html +5 -2
  274. package/tests/pages/array-strings.html +5 -2
  275. package/tests/pages/array-table-responsive.html +66 -0
  276. package/tests/pages/array-unique-items-sort.html +81 -0
  277. package/tests/pages/array.html +5 -2
  278. package/tests/pages/assets/autocomplete.css +1 -0
  279. package/tests/pages/assets/autocomplete.min.js +1 -0
  280. package/tests/pages/assets/pages.css +130 -0
  281. package/tests/pages/autocomplete.html +72 -0
  282. package/tests/pages/button-callbacks.html +79 -0
  283. package/tests/pages/button-icons.html +39 -0
  284. package/tests/pages/button_state_mode_1.html +35 -0
  285. package/tests/pages/button_state_mode_2.html +36 -0
  286. package/tests/pages/checkbox-labels.html +116 -0
  287. package/tests/pages/colorpicker-no-3rd-party.html +45 -0
  288. package/tests/pages/colorpicker-use-vanilla-picker.html +52 -0
  289. package/tests/pages/container-attributes.html +51 -0
  290. package/tests/pages/contains.html +39 -0
  291. package/tests/pages/core.html +14 -7
  292. package/tests/pages/datetime.html +78 -0
  293. package/tests/pages/dependentRequired.html +72 -0
  294. package/tests/pages/dependentSchemas.html +53 -0
  295. package/tests/pages/disable-button-in-object-editors.html +57 -0
  296. package/tests/pages/editor-show-validation-errors.html +54 -0
  297. package/tests/pages/enforce-const.html +168 -0
  298. package/tests/pages/error-messages.html +48 -0
  299. package/tests/pages/form-name.html +111 -0
  300. package/tests/pages/grid-strict.html +10 -13
  301. package/tests/pages/grid.html +4 -7
  302. package/tests/pages/if-else.html +58 -0
  303. package/tests/pages/if-then-else-allOf.html +118 -0
  304. package/tests/pages/if-then-else-disable-fields.html +70 -0
  305. package/tests/pages/if-then-else.html +65 -0
  306. package/tests/pages/if-then.html +58 -0
  307. package/tests/pages/inheritance.html +80 -0
  308. package/tests/pages/integer.html +17 -10
  309. package/tests/pages/issues/_template.html +50 -0
  310. package/tests/pages/issues/issue-gh-1133.html +64 -0
  311. package/tests/pages/issues/issue-gh-1158-2.html +189 -0
  312. package/tests/pages/issues/issue-gh-1158.html +50 -0
  313. package/tests/pages/issues/issue-gh-1164.html +71 -0
  314. package/tests/pages/issues/issue-gh-1165.html +63 -0
  315. package/tests/pages/issues/issue-gh-1165.json +8 -0
  316. package/tests/pages/issues/issue-gh-1171.html +39 -0
  317. package/tests/pages/issues/issue-gh-1211.html +1022 -0
  318. package/tests/pages/issues/issue-gh-1233-failing.html +46 -0
  319. package/tests/pages/issues/issue-gh-1233-passing.html +49 -0
  320. package/tests/pages/issues/issue-gh-1257.html +77 -0
  321. package/tests/pages/issues/issue-gh-1272.html +167 -0
  322. package/tests/pages/issues/issue-gh-1330.html +52 -0
  323. package/tests/pages/issues/issue-gh-1338.html +74 -0
  324. package/tests/pages/issues/issue-gh-1347.html +142 -0
  325. package/tests/pages/issues/issue-gh-1364.html +64 -0
  326. package/tests/pages/issues/issue-gh-1367.html +49 -0
  327. package/tests/pages/issues/issue-gh-1383.html +31 -0
  328. package/tests/pages/issues/issue-gh-1383.json +14 -0
  329. package/tests/pages/issues/issue-gh-1384.html +31 -0
  330. package/tests/pages/issues/issue-gh-1384.json +36 -0
  331. package/tests/pages/issues/issue-gh-1410.html +57 -0
  332. package/tests/pages/issues/issue-gh-1422.html +68 -0
  333. package/tests/pages/issues/issue-gh-1431.html +49 -0
  334. package/tests/pages/issues/issue-gh-1439.html +69 -0
  335. package/tests/pages/issues/issue-gh-1452.html +98 -0
  336. package/tests/pages/issues/issue-gh-1453.html +45 -0
  337. package/tests/pages/issues/issue-gh-1461.html +55 -0
  338. package/tests/pages/issues/issue-gh-1463.html +41 -0
  339. package/tests/pages/issues/issue-gh-1466.html +63 -0
  340. package/tests/pages/issues/issue-gh-1471.html +49 -0
  341. package/tests/pages/issues/issue-gh-1485.html +59 -0
  342. package/tests/pages/issues/issue-gh-1491.html +59 -0
  343. package/tests/pages/issues/issue-gh-1525.html +62 -0
  344. package/tests/pages/issues/issue-gh-1536.html +55 -0
  345. package/tests/pages/issues/issue-gh-1538.html +56 -0
  346. package/tests/pages/issues/issue-gh-1541.html +51 -0
  347. package/tests/pages/issues/issue-gh-1541.json +9 -0
  348. package/tests/pages/issues/issue-gh-1559.html +68 -0
  349. package/tests/pages/issues/issue-gh-1562.html +170 -0
  350. package/tests/pages/issues/issue-gh-1586.html +48 -0
  351. package/tests/pages/issues/issue-gh-1636.html +52 -0
  352. package/tests/pages/issues/issue-gh-795.html +58 -0
  353. package/tests/pages/issues/issue-gh-810.html +149 -0
  354. package/tests/pages/issues/issue-gh-812.html +113 -0
  355. package/tests/pages/issues/issue-gh-823-meta-schema.html +35 -0
  356. package/tests/pages/issues/issue-gh-848.html +81 -0
  357. package/tests/pages/keep_only_existing_values.html +81 -0
  358. package/tests/pages/load-events.html +61 -0
  359. package/tests/pages/maxContains.html +40 -0
  360. package/tests/pages/meta-schema.html +793 -0
  361. package/tests/pages/meta_schema.json +740 -0
  362. package/tests/pages/minContains.html +40 -0
  363. package/tests/pages/number.html +53 -6
  364. package/tests/pages/object-case-sensitive-property-search-false.html +42 -0
  365. package/tests/pages/object-case-sensitive-property-search-true.html +42 -0
  366. package/tests/pages/object-no-additional-properties.html +68 -0
  367. package/tests/pages/object-no-duplicated-id.html +70 -0
  368. package/tests/pages/object-required-properties.html +56 -20
  369. package/tests/pages/object-show-opt-in.html +111 -0
  370. package/tests/pages/object-with-dependencies-array.html +58 -0
  371. package/tests/pages/object-with-dependencies.html +62 -0
  372. package/tests/pages/object.html +5 -3
  373. package/tests/pages/oneof-2.html +91 -0
  374. package/tests/pages/oneof.html +105 -0
  375. package/tests/pages/opt-in-widget.html +134 -0
  376. package/tests/pages/option-dependencies.html +107 -0
  377. package/tests/pages/option-no_default_values.html +60 -0
  378. package/tests/pages/per-editor-options.html +44 -0
  379. package/tests/pages/placeholder-options.html +57 -0
  380. package/tests/pages/programmatic-changes.html +121 -0
  381. package/tests/pages/prompt-paste-max-length-reached.html +51 -0
  382. package/tests/pages/purify.html +66 -0
  383. package/tests/pages/range.html +62 -0
  384. package/tests/pages/read-only.html +60 -8
  385. package/tests/pages/ready.html +44 -0
  386. package/tests/pages/references.html +168 -0
  387. package/tests/pages/remove-false-properties.html +85 -0
  388. package/tests/pages/select-values.html +91 -0
  389. package/tests/pages/select.html +4 -3
  390. package/tests/pages/show-validation-errors.html +73 -0
  391. package/tests/pages/starrating.html +86 -0
  392. package/tests/pages/stepper-manual.html +59 -0
  393. package/tests/pages/stepper.html +61 -0
  394. package/tests/pages/string-ace-editor.html +7 -3
  395. package/tests/pages/string-cleave.html +48 -0
  396. package/tests/pages/string-custom-attributes.html +9 -6
  397. package/tests/pages/string-formats.html +54 -0
  398. package/tests/pages/string-formats2.html +59 -0
  399. package/tests/pages/{array-move-events.html → string-jodit-editor.html} +21 -29
  400. package/tests/pages/string-sceditor.html +9 -7
  401. package/tests/pages/string-simplemde-editor.html +83 -0
  402. package/tests/pages/switcher-option.html +69 -0
  403. package/tests/pages/table.html +4 -2
  404. package/tests/pages/tabs.html +1 -1
  405. package/tests/pages/themes.html +517 -0
  406. package/tests/pages/title-hidden.html +75 -0
  407. package/tests/pages/translate-property.html +248 -0
  408. package/tests/pages/urn.html +98 -0
  409. package/tests/pages/use-name-attributes.html +207 -0
  410. package/tests/pages/uuid.html +113 -0
  411. package/tests/pages/validation-messages.json +705 -0
  412. package/tests/pages/validation.html +20 -730
  413. package/tests/unit/.eslintrc +8 -0
  414. package/tests/unit/core.spec.js +320 -0
  415. package/tests/unit/defaults.spec.js +40 -0
  416. package/tests/unit/editor.spec.js +172 -0
  417. package/tests/unit/editors/array.spec.js +87 -0
  418. package/tests/unit/editors/object.spec.js +81 -0
  419. package/tests/unit/editors/table.spec.js +93 -0
  420. package/tests/unit/readme.md +35 -0
  421. package/tests/unit/schemaloader.spec.js +576 -0
  422. package/tests/unit/validator.spec.js +104 -0
  423. package/tests/unit/validators/ip-validator.spec.js +62 -0
  424. package/Gruntfile.js +0 -228
  425. package/dist/css/jsoneditor.min.css +0 -1
  426. package/dist/jsoneditor.js.map +0 -1
  427. package/dist/jsoneditor.min.js +0 -19
  428. package/dist/jsoneditor.min.js.map +0 -1
  429. package/src/class.js +0 -68
  430. package/src/editors/rating.js +0 -152
  431. package/src/ie9.js +0 -51
  432. package/src/intro.js +0 -23
  433. package/src/jquery.js +0 -64
  434. package/src/outro.js +0 -2
  435. package/src/themes/jsoneditor.barebones-theme.js +0 -60
@@ -0,0 +1,93 @@
1
+ import { JSONEditor } from '../../../src/core'
2
+
3
+ const fixture = [
4
+ {
5
+ title: 'Table Editor Test',
6
+ schema: {
7
+ type: 'array',
8
+ format: 'table',
9
+ items: {
10
+ type: ['boolean', 'string', 'null', 'number']
11
+ }
12
+ },
13
+ value: [false]
14
+ },
15
+ {
16
+ title: 'Table Editor Test',
17
+ schema: {
18
+ type: 'array',
19
+ format: 'table',
20
+ items: {
21
+ type: ['boolean', 'string', 'null', 'number']
22
+ }
23
+ },
24
+ value: ['']
25
+ },
26
+ {
27
+ title: 'Table Editor Test',
28
+ schema: {
29
+ type: 'array',
30
+ format: 'table',
31
+ items: {
32
+ type: ['boolean', 'string', 'null', 'number']
33
+ }
34
+ },
35
+ value: [0]
36
+ },
37
+ {
38
+ title: 'Table Editor Test',
39
+ schema: {
40
+ type: 'array',
41
+ format: 'table',
42
+ items: {
43
+ type: 'string'
44
+ }
45
+ },
46
+ options: {
47
+ use_default_values: false
48
+ },
49
+ value: ['']
50
+ },
51
+ {
52
+ title: 'Table Editor Test',
53
+ schema: {
54
+ type: 'array',
55
+ format: 'table',
56
+ items: {
57
+ type: 'number'
58
+ }
59
+ },
60
+ options: {
61
+ use_default_values: false
62
+ },
63
+ value: [0]
64
+ }
65
+ ]
66
+
67
+ describe('Table Editor', () => {
68
+ let element
69
+ let editor
70
+
71
+ beforeEach(() => {
72
+ document.body.insertAdjacentHTML(
73
+ 'afterbegin',
74
+ '<div id="fixture"></div>')
75
+ element = document.getElementById('fixture')
76
+ })
77
+
78
+ afterEach(() => {
79
+ editor.destroy()
80
+ })
81
+
82
+ fixture.forEach(spec => {
83
+ it(spec.title, () => {
84
+ editor = new JSONEditor(element, {
85
+ schema: spec.schema
86
+ })
87
+ editor.promise.then(() => {
88
+ editor.setValue(spec.value)
89
+ expect(editor.getValue()).toEqual(spec.value)
90
+ })
91
+ })
92
+ })
93
+ })
@@ -0,0 +1,35 @@
1
+ # Unit Tests
2
+
3
+ ## Introduction
4
+
5
+ Unit tests are implemented using the [Jasmine](https://jasmine.github.io/) framework.
6
+
7
+ ## Karma Test Runner
8
+
9
+ ### Running
10
+
11
+ You can continuously watch and debug unit tests using:
12
+
13
+ ```bash
14
+ npm run test
15
+ ```
16
+
17
+ The browser will start and run each unit test in a random sequence, showing the result. If tests are target code is edited, the code will be recompiled and the tests re-run.
18
+
19
+ ### Debugging
20
+
21
+ To debug tests click the debug button in the browser - this will allow you to select each test to run in debug mode.
22
+
23
+ You can set breakpoints on the original code by:
24
+
25
+ 1. Opening Chrome developer tools
26
+ 2. Opening the Sources tab
27
+ 3. Expanding the Webpack://./tests/unit/ hierarchy to display your test file
28
+ 4. Clicking on the line number to place the breakpoint
29
+
30
+ ## File hierarchy
31
+
32
+ Test files should have the same name as their target files but ending with `.spec.js` instead of `.js` and their subpath relative to this directory should be the same as the target file's relative to the `./src/` directory.
33
+
34
+ So a file testing `/src/editors/validator.js` should have the path `./tests/unit/editors/validator.spec.js`
35
+
@@ -0,0 +1,576 @@
1
+ /* global describe beforeEach it expect */
2
+
3
+ import { SchemaLoader } from '../../src/schemaloader'
4
+ import { createFakeServer } from 'sinon'
5
+
6
+ describe('SchemaLoader', () => {
7
+ let loader
8
+ let fileBase
9
+ let fetchUrl
10
+
11
+ describe('when no external ref', () => {
12
+ beforeEach(() => {
13
+ fetchUrl =
14
+ document.location.origin + document.location.pathname.toString()
15
+ loader = new SchemaLoader()
16
+ fileBase = loader._getFileBase(document.location.toString())
17
+ })
18
+
19
+ it('should create a loader', () => {
20
+ expect(loader).toBeTruthy()
21
+ })
22
+
23
+ it('load schema without $ref', async () => {
24
+ const schema = {
25
+ type: 'object',
26
+ properties: {
27
+ name: { type: 'string' }
28
+ }
29
+ }
30
+ await loader.load(schema, fetchUrl, fileBase)
31
+ const urls = Object.keys(loader.refs)
32
+ expect(urls.length).toEqual(0)
33
+ })
34
+
35
+ it('load schema with $ref', async () => {
36
+ const schema = {
37
+ definitions: {
38
+ name: {
39
+ type: 'string',
40
+ minLength: 4
41
+ }
42
+ },
43
+ type: 'object',
44
+ properties: {
45
+ fname: { $ref: '#/definitions/name' },
46
+ lname: { $ref: '#/definitions/name' }
47
+ }
48
+ }
49
+ await loader.load(schema, fetchUrl, fileBase)
50
+ const urls = Object.keys(loader.refs)
51
+ expect(urls.length).toEqual(0)
52
+ })
53
+
54
+ it('load schema with urn: $ref', async () => {
55
+ const schema = {
56
+ definitions: {
57
+ fname: {
58
+ id: 'urn:fname',
59
+ type: 'string',
60
+ default: 'John',
61
+ minLength: 4
62
+ },
63
+ lname: {
64
+ $id: 'urn:lname',
65
+ type: 'string',
66
+ default: 'Doe',
67
+ minLength: 4
68
+ }
69
+ },
70
+ type: 'object',
71
+ properties: {
72
+ fname: { $ref: 'urn:fname' },
73
+ lname: { $ref: 'urn:lname' }
74
+ }
75
+ }
76
+ await loader.load(schema, fetchUrl, fileBase)
77
+ const urls = Object.keys(loader.refs)
78
+ expect(urls.length).toEqual(2)
79
+ })
80
+ })
81
+
82
+ describe('when external absolute ref exists', () => {
83
+ it('should set option { ajax: true }', async () => {
84
+ const response = {
85
+ type: 'string',
86
+ minLength: 4
87
+ }
88
+ const server = createFakeServer()
89
+ server.autoRespond = true
90
+ window.XMLHttpRequest = server.xhr
91
+ server.respondWith('/string.json', [
92
+ 200,
93
+ { 'Content-Type': 'application/json' },
94
+ JSON.stringify(response)
95
+ ])
96
+ fetchUrl =
97
+ document.location.origin + document.location.pathname.toString()
98
+ loader = new SchemaLoader({ ajax: true })
99
+ fileBase = loader._getFileBase(document.location.toString())
100
+
101
+ const schema = {
102
+ type: 'object',
103
+ properties: {
104
+ fname: { $ref: '/string.json' },
105
+ lname: { $ref: '/string.json' }
106
+ }
107
+ }
108
+ await loader.load(
109
+ schema,
110
+ fetchUrl,
111
+ fileBase
112
+ )
113
+ const urls = Object.keys(loader.refs)
114
+ expect(urls.length).toEqual(1)
115
+ server.restore()
116
+ })
117
+ })
118
+
119
+ describe('when external relative $ref exists', () => {
120
+ it('should set option { ajax: true }', async () => {
121
+ const response = {
122
+ type: 'string',
123
+ minLength: 4
124
+ }
125
+ const server = createFakeServer()
126
+ server.autoRespond = true
127
+ window.XMLHttpRequest = server.xhr
128
+ server.respondWith('/string.json', [
129
+ 200,
130
+ { 'Content-Type': 'application/json' },
131
+ JSON.stringify(response)
132
+ ])
133
+ fetchUrl =
134
+ document.location.origin + document.location.pathname.toString()
135
+ loader = new SchemaLoader({ ajax: true })
136
+ fileBase = loader._getFileBase(document.location.toString())
137
+
138
+ const schema = {
139
+ type: 'object',
140
+ properties: {
141
+ fname: { $ref: 'string.json' },
142
+ lname: { $ref: 'string.json' }
143
+ }
144
+ }
145
+ await loader.load(
146
+ schema,
147
+
148
+ fetchUrl,
149
+ fileBase
150
+ )
151
+ const urls = Object.keys(loader.refs)
152
+ expect(urls.length).toEqual(1)
153
+ server.restore()
154
+ })
155
+ })
156
+
157
+ describe('when external absolute-to-relative $ref exists', () => {
158
+ it('can get refs recursively', async () => {
159
+ const schema1 = {
160
+ type: 'object',
161
+ properties: {
162
+ fname: { $ref: '/schema/main.json' },
163
+ lname: { $ref: '/schema/main.json' }
164
+ }
165
+ }
166
+ const schema2 = {
167
+ $ref: 'registry/sub.json'
168
+ }
169
+ const schema3 = {
170
+ type: 'string',
171
+ minLength: 4
172
+ }
173
+ const server = createFakeServer()
174
+ server.autoRespond = true
175
+ window.XMLHttpRequest = server.xhr
176
+ server.respondWith('/schema/main.json', [
177
+ 200,
178
+ { 'Content-Type': 'application/json' },
179
+ JSON.stringify(schema2)
180
+ ])
181
+ server.respondWith('/schema/registry/sub.json', [
182
+ 200,
183
+ { 'Content-Type': 'application/json' },
184
+ JSON.stringify(schema3)
185
+ ])
186
+ fetchUrl =
187
+ document.location.origin + document.location.pathname.toString()
188
+ loader = new SchemaLoader({ ajax: true })
189
+ fileBase = loader._getFileBase(document.location.toString())
190
+ await loader.load(
191
+ schema1,
192
+ fetchUrl,
193
+ fileBase
194
+ )
195
+ expect(Object.keys(loader.refs).length).toBe(2)
196
+ server.restore()
197
+ })
198
+ })
199
+
200
+ describe('when external relative-to-relative $ref exists', () => {
201
+ it('can get refs recursively', async () => {
202
+ const schema1 = {
203
+ type: 'object',
204
+ properties: {
205
+ fname: { $ref: 'schema/main.json' },
206
+ lname: { $ref: 'schema/main.json' }
207
+ }
208
+ }
209
+ const schema2 = {
210
+ $ref: 'registry/sub.json'
211
+ }
212
+ const schema3 = {
213
+ type: 'string',
214
+ minLength: 4
215
+ }
216
+ const server = createFakeServer()
217
+ server.autoRespond = true
218
+ window.XMLHttpRequest = server.xhr
219
+ server.respondWith('/schema/main.json', [
220
+ 200,
221
+ { 'Content-Type': 'application/json' },
222
+ JSON.stringify(schema2)
223
+ ])
224
+ server.respondWith('/schema/registry/sub.json', [
225
+ 200,
226
+ { 'Content-Type': 'application/json' },
227
+ JSON.stringify(schema3)
228
+ ])
229
+ fetchUrl =
230
+ document.location.origin + document.location.pathname.toString()
231
+ loader = new SchemaLoader({ ajax: true })
232
+ fileBase = loader._getFileBase(document.location.toString())
233
+ await loader.load(
234
+ schema1,
235
+ fetchUrl,
236
+ fileBase
237
+ )
238
+ expect(Object.keys(loader.refs).length).toBe(2)
239
+
240
+ server.restore()
241
+ })
242
+ })
243
+
244
+ describe('when external absolute $ref with json pointer exists', () => {
245
+ it('can get refs', async () => {
246
+ const schema1 = {
247
+ type: 'object',
248
+ properties: {
249
+ 'test-1': { $ref: '/common.schema.json#' },
250
+ 'test-2': { $ref: '/common.schema.json#/definitions/known-product' },
251
+ 'test-3': {
252
+ type: 'object',
253
+ properties: {
254
+ Product: { $ref: '/common.schema.json#/definitions/known-product' }
255
+ }
256
+ },
257
+ 'test-4': { $ref: '/common.schema.json#/properties/customer' }
258
+ }
259
+ }
260
+ const schema2 = {
261
+ definitions: {
262
+ 'known-product': {
263
+ title: 'product',
264
+ type: 'string',
265
+ enum: ['power', 'hydrogen', 'heat']
266
+ }
267
+ },
268
+ title: 'test',
269
+ properties: {
270
+ customer: { type: 'string' },
271
+ product: { $ref: '#/definitions/known-product' }
272
+ }
273
+ }
274
+ const server = createFakeServer()
275
+ server.autoRespond = true
276
+ window.XMLHttpRequest = server.xhr
277
+ server.respondWith('/common.schema.json', [
278
+ 200,
279
+ { 'Content-Type': 'application/json' },
280
+ JSON.stringify(schema2)
281
+ ])
282
+ fetchUrl =
283
+ document.location.origin + document.location.pathname.toString()
284
+ loader = new SchemaLoader({ ajax: true })
285
+ fileBase = loader._getFileBase(document.location.toString())
286
+ await loader.load(
287
+ schema1,
288
+ fetchUrl,
289
+ fileBase
290
+ )
291
+ expect(Object.keys(loader.refs).length).toBe(1)
292
+ server.restore()
293
+ })
294
+ })
295
+
296
+ describe('when external relative $ref with json pointer exists', () => {
297
+ it('can get refs', async () => {
298
+ const schema1 = {
299
+ type: 'object',
300
+ properties: {
301
+ 'test-1': { $ref: 'common.schema.json#' },
302
+ 'test-2': { $ref: 'common.schema.json#/definitions/known-product' },
303
+ 'test-3': {
304
+ type: 'object',
305
+ properties: {
306
+ Product: { $ref: 'common.schema.json#/definitions/known-product' }
307
+ }
308
+ },
309
+ 'test-4': { $ref: '/common.schema.json#/properties/customer' }
310
+ }
311
+ }
312
+ const schema2 = {
313
+ definitions: {
314
+ 'known-product': {
315
+ title: 'product',
316
+ type: 'string',
317
+ enum: ['power', 'hydrogen', 'heat']
318
+ }
319
+ },
320
+ title: 'test',
321
+ properties: {
322
+ customer: { type: 'string' },
323
+ product: { $ref: '#/definitions/known-product' }
324
+ }
325
+ }
326
+ const server = createFakeServer()
327
+ server.autoRespond = true
328
+ window.XMLHttpRequest = server.xhr
329
+ server.respondWith('/common.schema.json', [
330
+ 200,
331
+ { 'Content-Type': 'application/json' },
332
+ JSON.stringify(schema2)
333
+ ])
334
+ fetchUrl =
335
+ document.location.origin + document.location.pathname.toString()
336
+ loader = new SchemaLoader({ ajax: true })
337
+ fileBase = loader._getFileBase(document.location.toString())
338
+ await loader.load(
339
+ schema1,
340
+ fetchUrl,
341
+ fileBase
342
+ )
343
+ expect(Object.keys(loader.refs).length).toBe(2)
344
+ server.restore()
345
+ })
346
+ })
347
+
348
+ describe('when external ref exists with json pointer', () => {
349
+ it('should get ref and resolve json pointer', async () => {
350
+ const response = {
351
+ definitions: {
352
+ fruits: {
353
+ enum: [
354
+ 'apple',
355
+ 'banana',
356
+ 'cherry'
357
+ ]
358
+ }
359
+ }
360
+ }
361
+ const server = createFakeServer()
362
+ server.autoRespond = true
363
+ window.XMLHttpRequest = server.xhr
364
+ server.respondWith([
365
+ 200,
366
+ { 'Content-Type': 'application/json' },
367
+ JSON.stringify(response)
368
+ ])
369
+ fetchUrl =
370
+ document.location.origin + document.location.pathname.toString()
371
+ loader = new SchemaLoader({ ajax: true })
372
+ fileBase = loader._getFileBase(document.location.toString())
373
+
374
+ const schema = {
375
+ type: 'object',
376
+ properties: {
377
+ fruits: { $ref: '/fruits.json#/definitions/fruits' }
378
+ }
379
+ }
380
+ await loader.load(
381
+ schema,
382
+ fetchUrl,
383
+ fileBase
384
+ )
385
+ const urls = Object.keys(loader.refs)
386
+ expect(urls.length).toEqual(1)
387
+ expect(urls[0]).toEqual('/fruits.json')
388
+ expect(loader.refs['/fruits.json'].definitions.fruits).toEqual({ enum: ['apple', 'banana', 'cherry'] })
389
+ server.restore()
390
+ })
391
+ })
392
+
393
+ describe('when resolving undeclared URN $ref', () => {
394
+ it('can get refs recursively', async () => {
395
+ const schema1 = {
396
+ type: 'object',
397
+ properties: {
398
+ fname: { $ref: 'urn:main' },
399
+ lname: { $ref: 'urn:sub' }
400
+ }
401
+ }
402
+ const schema2 = {
403
+ definitions: {
404
+ name: {
405
+ id: 'urn:main',
406
+ $ref: 'urn:sub'
407
+ }
408
+ }
409
+ }
410
+ const schema3 = {
411
+ definitions: {
412
+ name: {
413
+ $id: 'urn:sub',
414
+ type: 'string',
415
+ default: 'Waldo',
416
+ minLength: 4
417
+ }
418
+ }
419
+ }
420
+
421
+ loader = new SchemaLoader({
422
+ urn_resolver: async (urn) => {
423
+ if (urn === 'urn:main') {
424
+ return JSON.stringify(schema2)
425
+ }
426
+ if (urn === 'urn:sub') {
427
+ return (JSON.stringify(schema3))
428
+ }
429
+ return false
430
+ }
431
+ })
432
+ await loader.load(
433
+ schema1
434
+ )
435
+ expect(Object.keys(loader.refs).length).toBe(2)
436
+ })
437
+ })
438
+
439
+ describe('when resolving undeclared URN $ref with fragment', () => {
440
+ it('can get refs recursively', async () => {
441
+ const schema1 = {
442
+ type: 'object',
443
+ properties: {
444
+ fname: { $ref: 'urn:main#/definitions/name' },
445
+ lname: { $ref: 'urn:main#/definitions/name' }
446
+ }
447
+ }
448
+ const schema2 = {
449
+ definitions: {
450
+ name: {
451
+ $id: 'urn:main',
452
+ type: 'string',
453
+ default: 'Waldo',
454
+ minLength: 4
455
+ }
456
+ }
457
+ }
458
+ loader = new SchemaLoader({
459
+ urn_resolver: async (urn) => {
460
+ if (urn === 'urn:main') {
461
+ return JSON.stringify(schema2)
462
+ }
463
+ return false
464
+ }
465
+ })
466
+ await loader.load(schema1)
467
+ expect(Object.keys(loader.refs).length).toBe(1)
468
+ })
469
+ })
470
+
471
+ describe('when schemas caching is enabled', () => {
472
+ beforeEach(() => {
473
+ // Mocks window.localStorage system.
474
+ // Thanks to https://stackoverflow.com/a/32911774.
475
+ var localStorageMock = (function () {
476
+ var store = {}
477
+ return {
478
+ getItem: function (key) {
479
+ return store[key]
480
+ },
481
+ setItem: function (key, value) {
482
+ store[key] = value.toString()
483
+ },
484
+ clear: function () {
485
+ store = {}
486
+ },
487
+ removeItem: function (key) {
488
+ delete store[key]
489
+ }
490
+ }
491
+ })()
492
+ Object.defineProperty(window, 'localStorage', { value: localStorageMock })
493
+ })
494
+ it('should store and retrieve cached items', async () => {
495
+ const schema = {
496
+ type: 'string',
497
+ minLength: 4
498
+ }
499
+ const cacheKey = 'myItem'
500
+ loader = new SchemaLoader({ ajax: true, ajax_cache_responses: true, ajax_cache_buster: 'abc123' })
501
+ loader.cacheSet(cacheKey, schema)
502
+
503
+ const schemaCached = loader.cacheGet(cacheKey)
504
+ expect(schemaCached).toEqual(schema)
505
+ })
506
+ it('should not retrieve cached item with invalid cache buster', async () => {
507
+ const schema = {
508
+ type: 'string',
509
+ minLength: 4
510
+ }
511
+ const cacheKey = 'myItem'
512
+ loader = new SchemaLoader({ ajax: true, ajax_cache_responses: true, ajax_cache_buster: 'abc123' })
513
+ loader.cacheSet(cacheKey, schema)
514
+
515
+ loader.options.ajax_cache_buster = 'not-abc123'
516
+ const schemaCached = loader.cacheGet(cacheKey)
517
+ expect(schemaCached).toBeUndefined()
518
+ })
519
+ it('should fetch schemas from cache { ajax: true, ajax_cache_responses: true }', async () => {
520
+ // Runs two passes, the first to warm cache and second to fetch from cache.
521
+ const response = {
522
+ type: 'string',
523
+ minLength: 4
524
+ }
525
+ const server = createFakeServer()
526
+ server.autoRespond = true
527
+ window.XMLHttpRequest = server.xhr
528
+ server.respondWith('/string.json', [
529
+ 200,
530
+ { 'Content-Type': 'application/json' },
531
+ JSON.stringify(response)
532
+ ])
533
+ fetchUrl =
534
+ document.location.origin + document.location.pathname.toString()
535
+ loader = new SchemaLoader({ ajax: true, ajax_cache_responses: true })
536
+ fileBase = loader._getFileBase(document.location.toString())
537
+
538
+ // Pass one: Warm the cache.
539
+ const schema = {
540
+ type: 'object',
541
+ properties: {
542
+ fname: { $ref: '/string.json' },
543
+ lname: { $ref: '/string.json' }
544
+ }
545
+ }
546
+ await loader.load(
547
+ schema,
548
+ fetchUrl,
549
+ fileBase
550
+ )
551
+ const urls = Object.keys(loader.refs)
552
+ expect(urls.length).toEqual(1)
553
+
554
+ // Tears down the mock Ajax endpoint to ensure any schemas get fetched from cache.
555
+ server.restore()
556
+
557
+ // Pass two: Should fetch external schemas from cache.
558
+ // Requires a fresh loader because SchemaLoader.refs can return stale data.
559
+ const loaderFresh = new SchemaLoader({ ajax: true, ajax_cache_responses: true })
560
+ const schemaFromCache = {
561
+ type: 'object',
562
+ properties: {
563
+ fname: { $ref: '/string.json' },
564
+ lname: { $ref: '/string.json' }
565
+ }
566
+ }
567
+ await loaderFresh.load(
568
+ schemaFromCache,
569
+ fetchUrl,
570
+ fileBase
571
+ )
572
+ const urlsFromCache = Object.keys(loaderFresh.refs)
573
+ expect(urlsFromCache.length).toEqual(1)
574
+ })
575
+ })
576
+ })