@evolvere/sgp-ui 1.6.9 → 1.6.10

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 (97) hide show
  1. package/lib/alert.js +2 -2
  2. package/lib/aside.js +2 -2
  3. package/lib/autocomplete.js +4 -4
  4. package/lib/avatar.js +2 -2
  5. package/lib/backtop.js +4 -4
  6. package/lib/badge.js +2 -2
  7. package/lib/breadcrumb-item.js +2 -2
  8. package/lib/breadcrumb.js +2 -2
  9. package/lib/button-group.js +2 -2
  10. package/lib/button.js +2 -2
  11. package/lib/calendar.js +6 -6
  12. package/lib/card.js +2 -2
  13. package/lib/carousel-item.js +2 -2
  14. package/lib/carousel.js +4 -4
  15. package/lib/cascader-panel.js +12 -12
  16. package/lib/cascader.js +13 -13
  17. package/lib/checkbox-button.js +9 -9
  18. package/lib/checkbox-group.js +9 -9
  19. package/lib/checkbox.js +2 -2
  20. package/lib/col.js +2 -2
  21. package/lib/collapse-item.js +7 -7
  22. package/lib/collapse.js +2 -2
  23. package/lib/color-picker.js +2 -2
  24. package/lib/container.js +2 -2
  25. package/lib/date-picker.js +10 -10
  26. package/lib/descriptions-item.js +2 -2
  27. package/lib/descriptions.js +2 -2
  28. package/lib/dialog.js +2 -2
  29. package/lib/divider.js +2 -2
  30. package/lib/drawer.js +2 -2
  31. package/lib/dropdown-item.js +2 -2
  32. package/lib/dropdown-menu.js +2 -2
  33. package/lib/dropdown.js +4 -4
  34. package/lib/editor.js +258 -32
  35. package/lib/empty.js +2 -2
  36. package/lib/footer.js +2 -2
  37. package/lib/form-item.js +4 -4
  38. package/lib/form.js +2 -2
  39. package/lib/header.js +2 -2
  40. package/lib/icon.js +2 -2
  41. package/lib/image.js +4 -4
  42. package/lib/index.js +1 -1
  43. package/lib/infinite-scroll.js +2 -2
  44. package/lib/input-number.js +6 -6
  45. package/lib/input.js +4 -4
  46. package/lib/link.js +2 -2
  47. package/lib/loading.js +4 -4
  48. package/lib/main.js +2 -2
  49. package/lib/menu-item-group.js +2 -2
  50. package/lib/menu-item.js +6 -6
  51. package/lib/menu.js +2 -2
  52. package/lib/message-box.js +6 -6
  53. package/lib/message.js +4 -4
  54. package/lib/notification.js +4 -4
  55. package/lib/option-group.js +2 -2
  56. package/lib/option.js +4 -4
  57. package/lib/page-header.js +2 -2
  58. package/lib/pagination.js +6 -6
  59. package/lib/popconfirm.js +4 -4
  60. package/lib/popover.js +2 -2
  61. package/lib/progress.js +2 -2
  62. package/lib/radio-button.js +2 -2
  63. package/lib/radio-group.js +2 -2
  64. package/lib/radio.js +2 -2
  65. package/lib/rate.js +2 -2
  66. package/lib/rdc-sgp-ui.common.js +321 -97
  67. package/lib/result.js +2 -2
  68. package/lib/row.js +2 -2
  69. package/lib/scrollbar.js +4 -4
  70. package/lib/select.js +15 -15
  71. package/lib/skeleton-item.js +2 -2
  72. package/lib/skeleton.js +2 -2
  73. package/lib/slider.js +6 -6
  74. package/lib/spinner.js +2 -2
  75. package/lib/step.js +2 -2
  76. package/lib/steps.js +2 -2
  77. package/lib/submenu.js +6 -6
  78. package/lib/switch.js +4 -4
  79. package/lib/tab-pane.js +2 -2
  80. package/lib/table-column.js +2 -2
  81. package/lib/table.js +19 -17
  82. package/lib/tabs.js +2 -2
  83. package/lib/tag.js +2 -2
  84. package/lib/time-picker.js +11 -11
  85. package/lib/time-select.js +6 -6
  86. package/lib/timeline-item.js +2 -2
  87. package/lib/timeline.js +2 -2
  88. package/lib/tooltip.js +2 -2
  89. package/lib/transfer.js +4 -4
  90. package/lib/tree.js +7 -7
  91. package/lib/upload.js +10 -10
  92. package/package.json +3 -1
  93. package/packages/editor/src/html-security.js +180 -0
  94. package/packages/editor/src/index.vue +68 -15
  95. package/packages/editor/src/video-security.js +1 -0
  96. package/packages/theme-chalk/package.json +1 -1
  97. package/src/index.js +1 -1
@@ -82,7 +82,7 @@ module.exports =
82
82
  /******/
83
83
  /******/
84
84
  /******/ // Load entry module and return exports
85
- /******/ return __webpack_require__(__webpack_require__.s = 83);
85
+ /******/ return __webpack_require__(__webpack_require__.s = 85);
86
86
  /******/ })
87
87
  /************************************************************************/
88
88
  /******/ ({
@@ -227,7 +227,7 @@ module.exports = require("@evolvere/sgp-ui/lib/utils/dom");
227
227
 
228
228
  /***/ }),
229
229
 
230
- /***/ 28:
230
+ /***/ 29:
231
231
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
232
232
 
233
233
  "use strict";
@@ -330,7 +330,7 @@ var locale_ = __webpack_require__(6);
330
330
  var locale_default = /*#__PURE__*/__webpack_require__.n(locale_);
331
331
 
332
332
  // EXTERNAL MODULE: ./packages/date-picker/src/basic/time-spinner.vue + 4 modules
333
- var time_spinner = __webpack_require__(35);
333
+ var time_spinner = __webpack_require__(36);
334
334
 
335
335
  // CONCATENATED MODULE: ./node_modules/_babel-loader@7.1.5@babel-loader/lib!./node_modules/_vue-loader@15.10.0@vue-loader/lib??vue-loader-options!./packages/date-picker/src/panel/time.vue?vue&type=script&lang=js&
336
336
  //
@@ -552,7 +552,7 @@ var component = Object(componentNormalizer["a" /* default */])(
552
552
 
553
553
  /***/ }),
554
554
 
555
- /***/ 31:
555
+ /***/ 32:
556
556
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
557
557
 
558
558
  "use strict";
@@ -587,7 +587,7 @@ var component = Object(componentNormalizer["a" /* default */])(
587
587
 
588
588
  /***/ }),
589
589
 
590
- /***/ 33:
590
+ /***/ 34:
591
591
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
592
592
 
593
593
  "use strict";
@@ -1718,7 +1718,7 @@ var component = Object(componentNormalizer["a" /* default */])(
1718
1718
 
1719
1719
  /***/ }),
1720
1720
 
1721
- /***/ 35:
1721
+ /***/ 36:
1722
1722
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
1723
1723
 
1724
1724
  "use strict";
@@ -2088,7 +2088,7 @@ var scrollbar_ = __webpack_require__(15);
2088
2088
  var scrollbar_default = /*#__PURE__*/__webpack_require__.n(scrollbar_);
2089
2089
 
2090
2090
  // EXTERNAL MODULE: ./src/directives/repeat-click.js
2091
- var repeat_click = __webpack_require__(31);
2091
+ var repeat_click = __webpack_require__(32);
2092
2092
 
2093
2093
  // CONCATENATED MODULE: ./node_modules/_babel-loader@7.1.5@babel-loader/lib!./node_modules/_vue-loader@15.10.0@vue-loader/lib??vue-loader-options!./packages/date-picker/src/basic/time-spinner.vue?vue&type=script&lang=js&
2094
2094
  //
@@ -2444,7 +2444,7 @@ module.exports = require("vue");
2444
2444
 
2445
2445
  /***/ }),
2446
2446
 
2447
- /***/ 83:
2447
+ /***/ 85:
2448
2448
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
2449
2449
 
2450
2450
  "use strict";
@@ -2452,10 +2452,10 @@ module.exports = require("vue");
2452
2452
  __webpack_require__.r(__webpack_exports__);
2453
2453
 
2454
2454
  // EXTERNAL MODULE: ./packages/date-picker/src/picker.vue + 4 modules
2455
- var picker = __webpack_require__(33);
2455
+ var picker = __webpack_require__(34);
2456
2456
 
2457
2457
  // EXTERNAL MODULE: ./packages/date-picker/src/panel/time.vue + 4 modules
2458
- var time = __webpack_require__(28);
2458
+ var time = __webpack_require__(29);
2459
2459
 
2460
2460
  // CONCATENATED MODULE: ./node_modules/_vue-loader@15.10.0@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/_vue-loader@15.10.0@vue-loader/lib??vue-loader-options!./packages/date-picker/src/panel/time-range.vue?vue&type=template&id=7ed65786&
2461
2461
  var render = function () {
@@ -2601,7 +2601,7 @@ var locale_ = __webpack_require__(6);
2601
2601
  var locale_default = /*#__PURE__*/__webpack_require__.n(locale_);
2602
2602
 
2603
2603
  // EXTERNAL MODULE: ./packages/date-picker/src/basic/time-spinner.vue + 4 modules
2604
- var time_spinner = __webpack_require__(35);
2604
+ var time_spinner = __webpack_require__(36);
2605
2605
 
2606
2606
  // CONCATENATED MODULE: ./node_modules/_babel-loader@7.1.5@babel-loader/lib!./node_modules/_vue-loader@15.10.0@vue-loader/lib??vue-loader-options!./packages/date-picker/src/panel/time-range.vue?vue&type=script&lang=js&
2607
2607
  //
@@ -82,7 +82,7 @@ module.exports =
82
82
  /******/
83
83
  /******/
84
84
  /******/ // Load entry module and return exports
85
- /******/ return __webpack_require__(__webpack_require__.s = 82);
85
+ /******/ return __webpack_require__(__webpack_require__.s = 84);
86
86
  /******/ })
87
87
  /************************************************************************/
88
88
  /******/ ({
@@ -220,14 +220,14 @@ module.exports = require("@evolvere/sgp-ui/lib/scrollbar");
220
220
 
221
221
  /***/ }),
222
222
 
223
- /***/ 32:
223
+ /***/ 33:
224
224
  /***/ (function(module, exports) {
225
225
 
226
226
  module.exports = require("@evolvere/sgp-ui/lib/utils/scroll-into-view");
227
227
 
228
228
  /***/ }),
229
229
 
230
- /***/ 33:
230
+ /***/ 34:
231
231
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
232
232
 
233
233
  "use strict";
@@ -1379,7 +1379,7 @@ module.exports = require("vue");
1379
1379
 
1380
1380
  /***/ }),
1381
1381
 
1382
- /***/ 82:
1382
+ /***/ 84:
1383
1383
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
1384
1384
 
1385
1385
  "use strict";
@@ -1387,7 +1387,7 @@ module.exports = require("vue");
1387
1387
  __webpack_require__.r(__webpack_exports__);
1388
1388
 
1389
1389
  // EXTERNAL MODULE: ./packages/date-picker/src/picker.vue + 4 modules
1390
- var picker = __webpack_require__(33);
1390
+ var picker = __webpack_require__(34);
1391
1391
 
1392
1392
  // CONCATENATED MODULE: ./node_modules/_vue-loader@15.10.0@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/_vue-loader@15.10.0@vue-loader/lib??vue-loader-options!./packages/date-picker/src/panel/time-select.vue?vue&type=template&id=047b9193&
1393
1393
  var render = function () {
@@ -1468,7 +1468,7 @@ var scrollbar_ = __webpack_require__(15);
1468
1468
  var scrollbar_default = /*#__PURE__*/__webpack_require__.n(scrollbar_);
1469
1469
 
1470
1470
  // EXTERNAL MODULE: external "@evolvere/sgp-ui/lib/utils/scroll-into-view"
1471
- var scroll_into_view_ = __webpack_require__(32);
1471
+ var scroll_into_view_ = __webpack_require__(33);
1472
1472
  var scroll_into_view_default = /*#__PURE__*/__webpack_require__.n(scroll_into_view_);
1473
1473
 
1474
1474
  // CONCATENATED MODULE: ./node_modules/_babel-loader@7.1.5@babel-loader/lib!./node_modules/_vue-loader@15.10.0@vue-loader/lib??vue-loader-options!./packages/date-picker/src/panel/time-select.vue?vue&type=script&lang=js&
@@ -82,7 +82,7 @@ module.exports =
82
82
  /******/
83
83
  /******/
84
84
  /******/ // Load entry module and return exports
85
- /******/ return __webpack_require__(__webpack_require__.s = 127);
85
+ /******/ return __webpack_require__(__webpack_require__.s = 129);
86
86
  /******/ })
87
87
  /************************************************************************/
88
88
  /******/ ({
@@ -192,7 +192,7 @@ function normalizeComponent(
192
192
 
193
193
  /***/ }),
194
194
 
195
- /***/ 127:
195
+ /***/ 129:
196
196
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
197
197
 
198
198
  "use strict";
package/lib/timeline.js CHANGED
@@ -82,7 +82,7 @@ module.exports =
82
82
  /******/
83
83
  /******/
84
84
  /******/ // Load entry module and return exports
85
- /******/ return __webpack_require__(__webpack_require__.s = 140);
85
+ /******/ return __webpack_require__(__webpack_require__.s = 142);
86
86
  /******/ })
87
87
  /************************************************************************/
88
88
  /******/ ({
@@ -192,7 +192,7 @@ function normalizeComponent(
192
192
 
193
193
  /***/ }),
194
194
 
195
- /***/ 140:
195
+ /***/ 142:
196
196
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
197
197
 
198
198
  "use strict";
package/lib/tooltip.js CHANGED
@@ -82,12 +82,12 @@ module.exports =
82
82
  /******/
83
83
  /******/
84
84
  /******/ // Load entry module and return exports
85
- /******/ return __webpack_require__(__webpack_require__.s = 145);
85
+ /******/ return __webpack_require__(__webpack_require__.s = 147);
86
86
  /******/ })
87
87
  /************************************************************************/
88
88
  /******/ ({
89
89
 
90
- /***/ 145:
90
+ /***/ 147:
91
91
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
92
92
 
93
93
  "use strict";
package/lib/transfer.js CHANGED
@@ -82,7 +82,7 @@ module.exports =
82
82
  /******/
83
83
  /******/
84
84
  /******/ // Load entry module and return exports
85
- /******/ return __webpack_require__(__webpack_require__.s = 72);
85
+ /******/ return __webpack_require__(__webpack_require__.s = 74);
86
86
  /******/ })
87
87
  /************************************************************************/
88
88
  /******/ ({
@@ -227,7 +227,7 @@ module.exports = require("@evolvere/sgp-ui/lib/mixins/emitter");
227
227
 
228
228
  /***/ }),
229
229
 
230
- /***/ 41:
230
+ /***/ 42:
231
231
  /***/ (function(module, exports) {
232
232
 
233
233
  module.exports = require("@evolvere/sgp-ui/lib/checkbox-group");
@@ -241,7 +241,7 @@ module.exports = require("@evolvere/sgp-ui/lib/mixins/locale");
241
241
 
242
242
  /***/ }),
243
243
 
244
- /***/ 72:
244
+ /***/ 74:
245
245
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
246
246
 
247
247
  "use strict";
@@ -536,7 +536,7 @@ transfer_panelvue_type_template_id_260da9e7_render._withStripped = true
536
536
  // CONCATENATED MODULE: ./packages/transfer/src/transfer-panel.vue?vue&type=template&id=260da9e7&
537
537
 
538
538
  // EXTERNAL MODULE: external "@evolvere/sgp-ui/lib/checkbox-group"
539
- var checkbox_group_ = __webpack_require__(41);
539
+ var checkbox_group_ = __webpack_require__(42);
540
540
  var checkbox_group_default = /*#__PURE__*/__webpack_require__.n(checkbox_group_);
541
541
 
542
542
  // EXTERNAL MODULE: external "@evolvere/sgp-ui/lib/checkbox"
package/lib/tree.js CHANGED
@@ -82,7 +82,7 @@ module.exports =
82
82
  /******/
83
83
  /******/
84
84
  /******/ // Load entry module and return exports
85
- /******/ return __webpack_require__(__webpack_require__.s = 66);
85
+ /******/ return __webpack_require__(__webpack_require__.s = 68);
86
86
  /******/ })
87
87
  /************************************************************************/
88
88
  /******/ ({
@@ -213,17 +213,17 @@ module.exports = require("@evolvere/sgp-ui/lib/locale");
213
213
 
214
214
  /***/ }),
215
215
 
216
- /***/ 29:
216
+ /***/ 3:
217
217
  /***/ (function(module, exports) {
218
218
 
219
- module.exports = require("@evolvere/sgp-ui/lib/transitions/collapse-transition");
219
+ module.exports = require("@evolvere/sgp-ui/lib/utils/util");
220
220
 
221
221
  /***/ }),
222
222
 
223
- /***/ 3:
223
+ /***/ 30:
224
224
  /***/ (function(module, exports) {
225
225
 
226
- module.exports = require("@evolvere/sgp-ui/lib/utils/util");
226
+ module.exports = require("@evolvere/sgp-ui/lib/transitions/collapse-transition");
227
227
 
228
228
  /***/ }),
229
229
 
@@ -234,7 +234,7 @@ module.exports = require("@evolvere/sgp-ui/lib/mixins/emitter");
234
234
 
235
235
  /***/ }),
236
236
 
237
- /***/ 66:
237
+ /***/ 68:
238
238
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
239
239
 
240
240
  "use strict";
@@ -1421,7 +1421,7 @@ tree_nodevue_type_template_id_097e75f6_render._withStripped = true
1421
1421
  // CONCATENATED MODULE: ./packages/tree/src/tree-node.vue?vue&type=template&id=097e75f6&
1422
1422
 
1423
1423
  // EXTERNAL MODULE: external "@evolvere/sgp-ui/lib/transitions/collapse-transition"
1424
- var collapse_transition_ = __webpack_require__(29);
1424
+ var collapse_transition_ = __webpack_require__(30);
1425
1425
  var collapse_transition_default = /*#__PURE__*/__webpack_require__.n(collapse_transition_);
1426
1426
 
1427
1427
  // EXTERNAL MODULE: external "@evolvere/sgp-ui/lib/checkbox"
package/lib/upload.js CHANGED
@@ -82,7 +82,7 @@ module.exports =
82
82
  /******/
83
83
  /******/
84
84
  /******/ // Load entry module and return exports
85
- /******/ return __webpack_require__(__webpack_require__.s = 65);
85
+ /******/ return __webpack_require__(__webpack_require__.s = 67);
86
86
  /******/ })
87
87
  /************************************************************************/
88
88
  /******/ ({
@@ -206,28 +206,28 @@ module.exports = require("yakuza1");
206
206
 
207
207
  /***/ }),
208
208
 
209
- /***/ 27:
209
+ /***/ 28:
210
210
  /***/ (function(module, exports) {
211
211
 
212
212
  module.exports = require("babel-helper-vue-jsx-merge-props");
213
213
 
214
214
  /***/ }),
215
215
 
216
- /***/ 36:
216
+ /***/ 37:
217
217
  /***/ (function(module, exports) {
218
218
 
219
219
  module.exports = require("yakuza1/lib/safe");
220
220
 
221
221
  /***/ }),
222
222
 
223
- /***/ 43:
223
+ /***/ 44:
224
224
  /***/ (function(module, exports) {
225
225
 
226
226
  module.exports = require("yakuza1/lib/config/def");
227
227
 
228
228
  /***/ }),
229
229
 
230
- /***/ 46:
230
+ /***/ 47:
231
231
  /***/ (function(module, exports) {
232
232
 
233
233
  module.exports = require("@evolvere/sgp-ui/lib/progress");
@@ -241,7 +241,7 @@ module.exports = require("@evolvere/sgp-ui/lib/mixins/locale");
241
241
 
242
242
  /***/ }),
243
243
 
244
- /***/ 65:
244
+ /***/ 67:
245
245
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
246
246
 
247
247
  "use strict";
@@ -416,7 +416,7 @@ var locale_ = __webpack_require__(6);
416
416
  var locale_default = /*#__PURE__*/__webpack_require__.n(locale_);
417
417
 
418
418
  // EXTERNAL MODULE: external "@evolvere/sgp-ui/lib/progress"
419
- var progress_ = __webpack_require__(46);
419
+ var progress_ = __webpack_require__(47);
420
420
  var progress_default = /*#__PURE__*/__webpack_require__.n(progress_);
421
421
 
422
422
  // CONCATENATED MODULE: ./node_modules/_babel-loader@7.1.5@babel-loader/lib!./node_modules/_vue-loader@15.10.0@vue-loader/lib??vue-loader-options!./packages/upload/src/upload-list.vue?vue&type=script&lang=js&
@@ -551,17 +551,17 @@ var component = Object(componentNormalizer["a" /* default */])(
551
551
 
552
552
  /* harmony default export */ var upload_list = (component.exports);
553
553
  // EXTERNAL MODULE: external "babel-helper-vue-jsx-merge-props"
554
- var external_babel_helper_vue_jsx_merge_props_ = __webpack_require__(27);
554
+ var external_babel_helper_vue_jsx_merge_props_ = __webpack_require__(28);
555
555
  var external_babel_helper_vue_jsx_merge_props_default = /*#__PURE__*/__webpack_require__.n(external_babel_helper_vue_jsx_merge_props_);
556
556
 
557
557
  // EXTERNAL MODULE: external "yakuza1/lib/config/def"
558
- var def_ = __webpack_require__(43);
558
+ var def_ = __webpack_require__(44);
559
559
 
560
560
  // EXTERNAL MODULE: external "yakuza1"
561
561
  var external_yakuza1_ = __webpack_require__(21);
562
562
 
563
563
  // EXTERNAL MODULE: external "yakuza1/lib/safe"
564
- var safe_ = __webpack_require__(36);
564
+ var safe_ = __webpack_require__(37);
565
565
 
566
566
  // CONCATENATED MODULE: ./packages/upload/src/ajax.js
567
567
  var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@evolvere/sgp-ui",
3
- "version": "1.6.9",
3
+ "version": "1.6.10",
4
4
  "description": "A Component Library for Vue.js.",
5
5
  "main": "lib/rdc-sgp-ui.common.js",
6
6
  "files": [
@@ -27,6 +27,7 @@
27
27
  "lint": "eslint src/**/* test/**/* packages/**/* build/**/* --quiet",
28
28
  "pub1": "npm run bootstrap && sh build/git-release.sh && sh build/release.sh && node build/bin/gen-indices.js && sh build/deploy-faas.sh",
29
29
  "test": "npm run lint && npm run build:theme && cross-env CI_ENV=/dev/ BABEL_ENV=test karma start test/unit/karma.conf.js --single-run",
30
+ "test:editor-security": "cross-env BABEL_ENV=test karma start test/unit/karma.editor-security.conf.js --single-run",
30
31
  "test:watch": "npm run build:theme && cross-env BABEL_ENV=test karma start test/unit/karma.conf.js",
31
32
  "pub": "sh build/release.sh"
32
33
  },
@@ -64,6 +65,7 @@
64
65
  "async-validator": "~1.8.1",
65
66
  "babel-helper-vue-jsx-merge-props": "^2.0.0",
66
67
  "deepmerge": "^1.2.0",
68
+ "dompurify": "3.4.14",
67
69
  "normalize-wheel": "^1.0.1",
68
70
  "resize-observer-polyfill": "^1.5.0",
69
71
  "throttle-debounce": "^1.0.1",
@@ -0,0 +1,180 @@
1
+ import DOMPurify from 'dompurify';
2
+
3
+ export const MAX_EDITOR_HTML_LENGTH = 1024 * 1024;
4
+ export const MAX_IMAGE_SIZE = 5 * 1024 * 1024;
5
+ export const MAX_IMAGE_COUNT = 10;
6
+
7
+ const SAFE_PROTOCOLS = ['http:', 'https:'];
8
+ const SAFE_LINK_PROTOCOLS = SAFE_PROTOCOLS.concat(['mailto:', 'tel:']);
9
+ const SAFE_URI_PATTERN = /^(?:(?:https?|mailto|tel):|(?:\.{0,2}\/|#))/i;
10
+
11
+ const PURIFY_OPTIONS = {
12
+ ALLOWED_TAGS: [
13
+ 'a', 'b', 'blockquote', 'br', 'code', 'del', 'div', 'em', 'h1', 'h2',
14
+ 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'iframe', 'img', 'li', 'ol', 'p',
15
+ 'pre', 's', 'span', 'strike', 'strong', 'sub', 'sup', 'table', 'tbody',
16
+ 'td', 'tfoot', 'th', 'thead', 'tr', 'u', 'ul', 'video', 'source'
17
+ ],
18
+ ALLOWED_ATTR: [
19
+ 'allow', 'allowfullscreen', 'alt', 'colspan', 'controls', 'frameborder',
20
+ 'height', 'href', 'loading', 'loop', 'muted', 'playsinline', 'poster',
21
+ 'preload', 'referrerpolicy', 'rel', 'rowspan', 'sandbox', 'src', 'style',
22
+ 'target', 'title', 'webkitallowfullscreen', 'width'
23
+ ],
24
+ // These attributes carry fixed policy tokens rather than URLs. DOMPurify
25
+ // otherwise applies its URI value check and removes the security settings.
26
+ ADD_URI_SAFE_ATTR: ['loading', 'referrerpolicy', 'rel', 'sandbox', 'target'],
27
+ ALLOW_ARIA_ATTR: false,
28
+ ALLOW_DATA_ATTR: false,
29
+ ALLOW_UNKNOWN_PROTOCOLS: false,
30
+ ALLOWED_URI_REGEXP: SAFE_URI_PATTERN,
31
+ FORBID_TAGS: [
32
+ 'base', 'button', 'embed', 'form', 'input', 'link', 'math', 'meta',
33
+ 'noscript', 'object', 'option', 'script', 'select', 'style', 'svg',
34
+ 'template', 'textarea'
35
+ ],
36
+ FORBID_ATTR: ['formaction', 'id', 'name', 'srcdoc', 'xlink:href'],
37
+ KEEP_CONTENT: true,
38
+ RETURN_TRUSTED_TYPE: false,
39
+ SANITIZE_DOM: true,
40
+ SANITIZE_NAMED_PROPS: true
41
+ };
42
+
43
+ const COLOR_VALUE = /^(?:#[0-9a-f]{3,8}|[a-z]{1,20}|rgba?\(\s*\d{1,3}\s*,\s*\d{1,3}\s*,\s*\d{1,3}(?:\s*,\s*(?:0|1|0?\.\d+))?\s*\))$/i;
44
+ const LENGTH_VALUE = /^\d+(?:\.\d+)?(?:px|em|rem|%)?$/i;
45
+ const FONT_FAMILY_VALUE = /^[a-z0-9\u4e00-\u9fff ,'-]{1,120}$/i;
46
+
47
+ const SAFE_STYLE_RULES = {
48
+ 'background-color': COLOR_VALUE,
49
+ color: COLOR_VALUE,
50
+ 'font-family': FONT_FAMILY_VALUE,
51
+ 'font-size': LENGTH_VALUE,
52
+ 'font-style': /^(?:normal|italic|oblique)$/i,
53
+ 'font-weight': /^(?:normal|bold|bolder|lighter|[1-9]00)$/i,
54
+ 'line-height': LENGTH_VALUE,
55
+ 'list-style-type': /^(?:disc|circle|square|decimal|lower-alpha|upper-alpha|lower-roman|upper-roman|none)$/i,
56
+ 'margin-left': LENGTH_VALUE,
57
+ 'max-width': LENGTH_VALUE,
58
+ 'padding-left': LENGTH_VALUE,
59
+ 'text-align': /^(?:left|right|center|justify)$/i,
60
+ 'text-decoration': /^(?:none|underline|line-through)(?:\s+(?:underline|line-through))*$/i,
61
+ 'text-indent': LENGTH_VALUE,
62
+ 'vertical-align': /^(?:baseline|sub|super|top|text-top|middle|bottom|text-bottom)$/i,
63
+ 'white-space': /^(?:normal|nowrap|pre|pre-wrap|pre-line)$/i
64
+ };
65
+
66
+ function parseUrl(value) {
67
+ const url = (value || '').trim();
68
+ if (!url || /[\u0000-\u001f\u007f]/.test(url)) return null;
69
+
70
+ const parser = document.createElement('a');
71
+ parser.href = url;
72
+ return parser;
73
+ }
74
+
75
+ function hasSafeProtocol(value, protocols) {
76
+ const parser = parseUrl(value);
77
+ return !!parser && protocols.indexOf(parser.protocol.toLowerCase()) !== -1;
78
+ }
79
+
80
+ export function isSafeLink(link) {
81
+ return hasSafeProtocol(link, SAFE_LINK_PROTOCOLS);
82
+ }
83
+
84
+ export function isSafeMediaSource(source) {
85
+ return hasSafeProtocol(source, SAFE_PROTOCOLS);
86
+ }
87
+
88
+ function sanitizeStyle(styleText) {
89
+ if (!styleText || styleText.length > 500 || /[\\<>{}]|url\s*\(|expression\s*\(|@import|javascript\s*:|data\s*:|-moz-binding|behavior\s*:/i.test(styleText)) {
90
+ return '';
91
+ }
92
+
93
+ return styleText.split(';').reduce((rules, declaration) => {
94
+ const separator = declaration.indexOf(':');
95
+ if (separator === -1) return rules;
96
+
97
+ const property = declaration.slice(0, separator).trim().toLowerCase();
98
+ const value = declaration.slice(separator + 1).trim();
99
+ const rule = SAFE_STYLE_RULES[property];
100
+ if (rule && rule.test(value)) rules.push(`${property}: ${value}`);
101
+ return rules;
102
+ }, []).join('; ');
103
+ }
104
+
105
+ function normalizeDimension(element, attribute) {
106
+ if (!element.hasAttribute(attribute)) return;
107
+ const value = Number(element.getAttribute(attribute));
108
+ if (!Number.isInteger(value) || value < 1 || value > 10000) {
109
+ element.removeAttribute(attribute);
110
+ }
111
+ }
112
+
113
+ function normalizeRichText(html) {
114
+ const template = document.createElement('template');
115
+ template.innerHTML = html;
116
+ const elements = Array.prototype.slice.call(template.content.querySelectorAll('*'));
117
+
118
+ elements.forEach(element => {
119
+ const style = sanitizeStyle(element.getAttribute('style'));
120
+ if (style) element.setAttribute('style', style);
121
+ else element.removeAttribute('style');
122
+
123
+ normalizeDimension(element, 'width');
124
+ normalizeDimension(element, 'height');
125
+
126
+ if (element.tagName === 'A') {
127
+ if (!isSafeLink(element.getAttribute('href'))) element.removeAttribute('href');
128
+ if (element.getAttribute('target') === '_blank') {
129
+ element.setAttribute('rel', 'noopener noreferrer');
130
+ } else {
131
+ element.removeAttribute('target');
132
+ element.removeAttribute('rel');
133
+ }
134
+ }
135
+
136
+ if (element.tagName === 'IMG') {
137
+ if (!isSafeMediaSource(element.getAttribute('src'))) {
138
+ element.parentNode.removeChild(element);
139
+ return;
140
+ }
141
+ element.setAttribute('loading', 'lazy');
142
+ element.setAttribute('referrerpolicy', 'no-referrer');
143
+ }
144
+
145
+ if (element.tagName === 'IFRAME') {
146
+ if (!isSafeMediaSource(element.getAttribute('src'))) {
147
+ element.parentNode.removeChild(element);
148
+ return;
149
+ }
150
+ element.setAttribute('sandbox', 'allow-scripts allow-presentation allow-popups');
151
+ element.setAttribute('referrerpolicy', 'no-referrer');
152
+ element.setAttribute('loading', 'lazy');
153
+ }
154
+
155
+ if ((element.tagName === 'VIDEO' || element.tagName === 'SOURCE') &&
156
+ !isSafeMediaSource(element.getAttribute('src'))) {
157
+ element.parentNode.removeChild(element);
158
+ }
159
+ });
160
+
161
+ return template.innerHTML;
162
+ }
163
+
164
+ export function sanitizeEditorHtml(html) {
165
+ if (typeof html !== 'string' || html.length > MAX_EDITOR_HTML_LENGTH) return '';
166
+
167
+ const sanitized = DOMPurify.sanitize(html, PURIFY_OPTIONS);
168
+ const normalized = normalizeRichText(sanitized);
169
+ return DOMPurify.sanitize(normalized, PURIFY_OPTIONS);
170
+ }
171
+
172
+ export function validateImageFiles(files) {
173
+ if (!files || files.length < 1 || files.length > MAX_IMAGE_COUNT) return false;
174
+ return Array.prototype.every.call(files, file => (
175
+ !!file &&
176
+ file.size > 0 &&
177
+ file.size <= MAX_IMAGE_SIZE &&
178
+ /^(?:image\/jpeg|image\/png|image\/gif)$/i.test(file.type || '')
179
+ ));
180
+ }