@instructure/outcomes-ui 3.2.3 → 3.2.5
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.
- package/es/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/components/OutcomeCheckbox/index.js +1 -0
- package/es/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/components/OutcomeSelectionList/index.js +1 -0
- package/es/lib/__tests__/sanitize.test.js +132 -10
- package/es/lib/sanitize.js +22 -26
- package/es/translated/ar/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/ar/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/ar/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/ar/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/ar/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/ar/lib/sanitize.js +22 -26
- package/es/translated/ca/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/ca/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/ca/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/ca/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/ca/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/ca/lib/sanitize.js +22 -26
- package/es/translated/cy/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/cy/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/cy/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/cy/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/cy/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/cy/lib/sanitize.js +22 -26
- package/es/translated/da/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/da/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/da/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/da/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/da/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/da/lib/sanitize.js +22 -26
- package/es/translated/da-x-k12/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/da-x-k12/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/da-x-k12/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/da-x-k12/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/da-x-k12/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/da-x-k12/lib/sanitize.js +22 -26
- package/es/translated/de/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/de/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/de/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/de/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/de/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/de/lib/sanitize.js +22 -26
- package/es/translated/en/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/en/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/en/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/en/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/en/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/en/lib/sanitize.js +22 -26
- package/es/translated/en-AU/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/en-AU/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/en-AU/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/en-AU/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/en-AU/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/en-AU/lib/sanitize.js +22 -26
- package/es/translated/en-AU-x-unimelb/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/en-AU-x-unimelb/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/en-AU-x-unimelb/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/en-AU-x-unimelb/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/en-AU-x-unimelb/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/en-AU-x-unimelb/lib/sanitize.js +22 -26
- package/es/translated/en-CA/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/en-CA/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/en-CA/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/en-CA/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/en-CA/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/en-CA/lib/sanitize.js +22 -26
- package/es/translated/en-CY/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/en-CY/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/en-CY/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/en-CY/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/en-CY/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/en-CY/lib/sanitize.js +22 -26
- package/es/translated/en-GB/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/en-GB/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/en-GB/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/en-GB/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/en-GB/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/en-GB/lib/sanitize.js +22 -26
- package/es/translated/en-GB-x-ukhe/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/en-GB-x-ukhe/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/en-GB-x-ukhe/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/en-GB-x-ukhe/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/en-GB-x-ukhe/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/en-GB-x-ukhe/lib/sanitize.js +22 -26
- package/es/translated/en-IE/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/en-IE/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/en-IE/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/en-IE/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/en-IE/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/en-IE/lib/sanitize.js +22 -26
- package/es/translated/es/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/es/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/es/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/es/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/es/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/es/lib/sanitize.js +22 -26
- package/es/translated/es-ES/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/es-ES/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/es-ES/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/es-ES/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/es-ES/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/es-ES/lib/sanitize.js +22 -26
- package/es/translated/es_ES/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/es_ES/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/es_ES/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/es_ES/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/es_ES/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/es_ES/lib/sanitize.js +22 -26
- package/es/translated/fi/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/fi/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/fi/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/fi/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/fi/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/fi/lib/sanitize.js +22 -26
- package/es/translated/fr/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/fr/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/fr/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/fr/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/fr/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/fr/lib/sanitize.js +22 -26
- package/es/translated/fr-CA/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/fr-CA/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/fr-CA/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/fr-CA/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/fr-CA/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/fr-CA/lib/sanitize.js +22 -26
- package/es/translated/ht/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/ht/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/ht/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/ht/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/ht/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/ht/lib/sanitize.js +22 -26
- package/es/translated/is/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/is/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/is/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/is/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/is/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/is/lib/sanitize.js +22 -26
- package/es/translated/it/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/it/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/it/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/it/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/it/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/it/lib/sanitize.js +22 -26
- package/es/translated/ja/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/ja/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/ja/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/ja/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/ja/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/ja/lib/sanitize.js +22 -26
- package/es/translated/mi/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/mi/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/mi/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/mi/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/mi/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/mi/lib/sanitize.js +22 -26
- package/es/translated/nb/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/nb/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/nb/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/nb/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/nb/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/nb/lib/sanitize.js +22 -26
- package/es/translated/nb-x-k12/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/nb-x-k12/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/nb-x-k12/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/nb-x-k12/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/nb-x-k12/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/nb-x-k12/lib/sanitize.js +22 -26
- package/es/translated/nl/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/nl/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/nl/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/nl/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/nl/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/nl/lib/sanitize.js +22 -26
- package/es/translated/pl/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/pl/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/pl/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/pl/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/pl/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/pl/lib/sanitize.js +22 -26
- package/es/translated/pt/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/pt/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/pt/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/pt/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/pt/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/pt/lib/sanitize.js +22 -26
- package/es/translated/pt-BR/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/pt-BR/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/pt-BR/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/pt-BR/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/pt-BR/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/pt-BR/lib/sanitize.js +22 -26
- package/es/translated/ru/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/ru/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/ru/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/ru/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/ru/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/ru/lib/sanitize.js +22 -26
- package/es/translated/sl/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/sl/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/sl/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/sl/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/sl/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/sl/lib/sanitize.js +22 -26
- package/es/translated/sv/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/sv/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/sv/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/sv/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/sv/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/sv/lib/sanitize.js +22 -26
- package/es/translated/sv-x-k12/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/sv-x-k12/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/sv-x-k12/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/sv-x-k12/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/sv-x-k12/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/sv-x-k12/lib/sanitize.js +22 -26
- package/es/translated/th/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/th/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/th/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/th/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/th/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/th/lib/sanitize.js +22 -26
- package/es/translated/vi/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/vi/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/vi/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/vi/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/vi/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/vi/lib/sanitize.js +22 -26
- package/es/translated/zh-Hans/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/zh-Hans/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/zh-Hans/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/zh-Hans/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/zh-Hans/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/zh-Hans/lib/sanitize.js +22 -26
- package/es/translated/zh-Hant/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/es/translated/zh-Hant/components/OutcomeCheckbox/index.js +1 -0
- package/es/translated/zh-Hant/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/es/translated/zh-Hant/components/OutcomeSelectionList/index.js +1 -0
- package/es/translated/zh-Hant/lib/__tests__/sanitize.test.js +132 -10
- package/es/translated/zh-Hant/lib/sanitize.js +22 -26
- package/lib/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/components/OutcomeCheckbox/index.js +1 -0
- package/lib/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/components/OutcomeSelectionList/index.js +1 -0
- package/lib/lib/__tests__/sanitize.test.js +132 -10
- package/lib/lib/sanitize.js +22 -26
- package/lib/translated/ar/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/ar/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/ar/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/ar/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/ar/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/ar/lib/sanitize.js +22 -26
- package/lib/translated/ca/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/ca/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/ca/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/ca/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/ca/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/ca/lib/sanitize.js +22 -26
- package/lib/translated/cy/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/cy/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/cy/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/cy/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/cy/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/cy/lib/sanitize.js +22 -26
- package/lib/translated/da/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/da/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/da/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/da/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/da/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/da/lib/sanitize.js +22 -26
- package/lib/translated/da-x-k12/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/da-x-k12/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/da-x-k12/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/da-x-k12/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/da-x-k12/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/da-x-k12/lib/sanitize.js +22 -26
- package/lib/translated/de/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/de/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/de/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/de/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/de/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/de/lib/sanitize.js +22 -26
- package/lib/translated/en/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/en/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/en/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/en/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/en/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/en/lib/sanitize.js +22 -26
- package/lib/translated/en-AU/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/en-AU/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/en-AU/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/en-AU/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/en-AU/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/en-AU/lib/sanitize.js +22 -26
- package/lib/translated/en-AU-x-unimelb/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/en-AU-x-unimelb/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/en-AU-x-unimelb/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/en-AU-x-unimelb/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/en-AU-x-unimelb/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/en-AU-x-unimelb/lib/sanitize.js +22 -26
- package/lib/translated/en-CA/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/en-CA/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/en-CA/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/en-CA/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/en-CA/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/en-CA/lib/sanitize.js +22 -26
- package/lib/translated/en-CY/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/en-CY/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/en-CY/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/en-CY/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/en-CY/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/en-CY/lib/sanitize.js +22 -26
- package/lib/translated/en-GB/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/en-GB/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/en-GB/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/en-GB/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/en-GB/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/en-GB/lib/sanitize.js +22 -26
- package/lib/translated/en-GB-x-ukhe/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/en-GB-x-ukhe/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/en-GB-x-ukhe/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/en-GB-x-ukhe/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/en-GB-x-ukhe/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/en-GB-x-ukhe/lib/sanitize.js +22 -26
- package/lib/translated/en-IE/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/en-IE/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/en-IE/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/en-IE/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/en-IE/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/en-IE/lib/sanitize.js +22 -26
- package/lib/translated/es/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/es/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/es/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/es/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/es/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/es/lib/sanitize.js +22 -26
- package/lib/translated/es-ES/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/es-ES/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/es-ES/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/es-ES/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/es-ES/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/es-ES/lib/sanitize.js +22 -26
- package/lib/translated/es_ES/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/es_ES/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/es_ES/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/es_ES/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/es_ES/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/es_ES/lib/sanitize.js +22 -26
- package/lib/translated/fi/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/fi/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/fi/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/fi/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/fi/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/fi/lib/sanitize.js +22 -26
- package/lib/translated/fr/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/fr/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/fr/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/fr/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/fr/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/fr/lib/sanitize.js +22 -26
- package/lib/translated/fr-CA/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/fr-CA/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/fr-CA/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/fr-CA/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/fr-CA/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/fr-CA/lib/sanitize.js +22 -26
- package/lib/translated/ht/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/ht/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/ht/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/ht/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/ht/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/ht/lib/sanitize.js +22 -26
- package/lib/translated/is/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/is/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/is/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/is/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/is/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/is/lib/sanitize.js +22 -26
- package/lib/translated/it/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/it/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/it/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/it/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/it/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/it/lib/sanitize.js +22 -26
- package/lib/translated/ja/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/ja/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/ja/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/ja/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/ja/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/ja/lib/sanitize.js +22 -26
- package/lib/translated/mi/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/mi/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/mi/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/mi/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/mi/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/mi/lib/sanitize.js +22 -26
- package/lib/translated/nb/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/nb/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/nb/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/nb/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/nb/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/nb/lib/sanitize.js +22 -26
- package/lib/translated/nb-x-k12/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/nb-x-k12/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/nb-x-k12/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/nb-x-k12/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/nb-x-k12/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/nb-x-k12/lib/sanitize.js +22 -26
- package/lib/translated/nl/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/nl/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/nl/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/nl/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/nl/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/nl/lib/sanitize.js +22 -26
- package/lib/translated/pl/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/pl/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/pl/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/pl/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/pl/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/pl/lib/sanitize.js +22 -26
- package/lib/translated/pt/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/pt/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/pt/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/pt/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/pt/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/pt/lib/sanitize.js +22 -26
- package/lib/translated/pt-BR/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/pt-BR/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/pt-BR/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/pt-BR/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/pt-BR/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/pt-BR/lib/sanitize.js +22 -26
- package/lib/translated/ru/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/ru/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/ru/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/ru/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/ru/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/ru/lib/sanitize.js +22 -26
- package/lib/translated/sl/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/sl/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/sl/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/sl/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/sl/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/sl/lib/sanitize.js +22 -26
- package/lib/translated/sv/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/sv/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/sv/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/sv/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/sv/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/sv/lib/sanitize.js +22 -26
- package/lib/translated/sv-x-k12/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/sv-x-k12/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/sv-x-k12/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/sv-x-k12/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/sv-x-k12/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/sv-x-k12/lib/sanitize.js +22 -26
- package/lib/translated/th/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/th/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/th/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/th/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/th/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/th/lib/sanitize.js +22 -26
- package/lib/translated/vi/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/vi/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/vi/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/vi/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/vi/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/vi/lib/sanitize.js +22 -26
- package/lib/translated/zh-Hans/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/zh-Hans/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/zh-Hans/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/zh-Hans/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/zh-Hans/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/zh-Hans/lib/sanitize.js +22 -26
- package/lib/translated/zh-Hant/components/OutcomeCheckbox/__tests__/index.test.js +5 -2
- package/lib/translated/zh-Hant/components/OutcomeCheckbox/index.js +1 -0
- package/lib/translated/zh-Hant/components/OutcomeSelectionList/__tests__/index.test.js +1 -0
- package/lib/translated/zh-Hant/components/OutcomeSelectionList/index.js +1 -0
- package/lib/translated/zh-Hant/lib/__tests__/sanitize.test.js +132 -10
- package/lib/translated/zh-Hant/lib/sanitize.js +22 -26
- package/package.json +3 -3
|
@@ -2,17 +2,139 @@
|
|
|
2
2
|
|
|
3
3
|
var _chai = require("chai");
|
|
4
4
|
var _sanitize = require("../sanitize.js");
|
|
5
|
-
describe('
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
describe('sanitizeHtml', function () {
|
|
6
|
+
describe('equation images (Canvas-specific)', function () {
|
|
7
|
+
it('rewrites /equation_images src to absolute canvas URL', function () {
|
|
8
|
+
var equationImage = 'Some text with an <img src="/equation_images/image" />';
|
|
9
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)(equationImage)).to.include('canvas.instructure.com/equation_images/image');
|
|
10
|
+
});
|
|
11
|
+
it('adds vertical-align style to equation images', function () {
|
|
12
|
+
var equationImage = '<img src="/equation_images/abc" />';
|
|
13
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)(equationImage)).to.include('vertical-align: middle');
|
|
14
|
+
});
|
|
15
|
+
it('leaves non-equation image src untouched', function () {
|
|
16
|
+
var otherImage = '<img src="/another_image">';
|
|
17
|
+
var out = (0, _sanitize.sanitizeHtml)(otherImage);
|
|
18
|
+
(0, _chai.expect)(out).to.include('src="/another_image"');
|
|
19
|
+
(0, _chai.expect)(out).to.not.include('canvas.instructure.com');
|
|
20
|
+
});
|
|
9
21
|
});
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
22
|
+
describe('null / empty input handling', function () {
|
|
23
|
+
it('returns empty string for null', function () {
|
|
24
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)(null)).to.equal('');
|
|
25
|
+
});
|
|
26
|
+
it('returns empty string for undefined', function () {
|
|
27
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)(void 0)).to.equal('');
|
|
28
|
+
});
|
|
29
|
+
it('returns empty string for empty string', function () {
|
|
30
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)('')).to.equal('');
|
|
31
|
+
});
|
|
13
32
|
});
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
33
|
+
describe('XSS - script execution vectors', function () {
|
|
34
|
+
it('strips <script> tags', function () {
|
|
35
|
+
var xss = 'Hello<script>alert(1)</script>World';
|
|
36
|
+
var out = (0, _sanitize.sanitizeHtml)(xss);
|
|
37
|
+
(0, _chai.expect)(out).to.not.include('<script');
|
|
38
|
+
(0, _chai.expect)(out).to.not.include('alert(1)');
|
|
39
|
+
});
|
|
40
|
+
it('strips inline event handlers (onerror)', function () {
|
|
41
|
+
var xss = '<img src="x" onerror="alert(1)">';
|
|
42
|
+
var out = (0, _sanitize.sanitizeHtml)(xss);
|
|
43
|
+
(0, _chai.expect)(out).to.not.match(/onerror/i);
|
|
44
|
+
(0, _chai.expect)(out).to.not.include('alert(1)');
|
|
45
|
+
});
|
|
46
|
+
it('strips inline event handlers (onclick)', function () {
|
|
47
|
+
var xss = '<a href="#" onclick="alert(1)">click</a>';
|
|
48
|
+
var out = (0, _sanitize.sanitizeHtml)(xss);
|
|
49
|
+
(0, _chai.expect)(out).to.not.match(/onclick/i);
|
|
50
|
+
});
|
|
51
|
+
it('strips inline event handlers (onload on svg)', function () {
|
|
52
|
+
var xss = '<svg onload="alert(1)"></svg>';
|
|
53
|
+
var out = (0, _sanitize.sanitizeHtml)(xss);
|
|
54
|
+
(0, _chai.expect)(out).to.not.match(/onload/i);
|
|
55
|
+
(0, _chai.expect)(out).to.not.include('alert(1)');
|
|
56
|
+
});
|
|
57
|
+
it('strips javascript: URLs in href', function () {
|
|
58
|
+
// eslint-disable-next-line no-script-url
|
|
59
|
+
var xss = '<a href="javascript:alert(1)">x</a>';
|
|
60
|
+
var out = (0, _sanitize.sanitizeHtml)(xss);
|
|
61
|
+
(0, _chai.expect)(out).to.not.match(/javascript:/i);
|
|
62
|
+
});
|
|
63
|
+
it('strips javascript: URLs in img src', function () {
|
|
64
|
+
// eslint-disable-next-line no-script-url
|
|
65
|
+
var xss = '<img src="javascript:alert(1)">';
|
|
66
|
+
var out = (0, _sanitize.sanitizeHtml)(xss);
|
|
67
|
+
(0, _chai.expect)(out).to.not.match(/javascript:/i);
|
|
68
|
+
});
|
|
69
|
+
it('strips data: URLs that contain HTML/JS in iframe src', function () {
|
|
70
|
+
var xss = '<iframe src="data:text/html,<script>alert(1)</script>"></iframe>';
|
|
71
|
+
var out = (0, _sanitize.sanitizeHtml)(xss);
|
|
72
|
+
(0, _chai.expect)(out).to.not.include('alert(1)');
|
|
73
|
+
});
|
|
74
|
+
it('strips <object> tags', function () {
|
|
75
|
+
var xss = '<object data="evil.swf"></object>';
|
|
76
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)(xss)).to.not.include('<object');
|
|
77
|
+
});
|
|
78
|
+
it('strips <embed> tags', function () {
|
|
79
|
+
var xss = '<embed src="evil.swf">';
|
|
80
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)(xss)).to.not.include('<embed');
|
|
81
|
+
});
|
|
82
|
+
it('strips <form> tags (CSRF / phishing surface)', function () {
|
|
83
|
+
var xss = '<form action="https://evil.com"><input name=x></form>';
|
|
84
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)(xss)).to.not.include('<form');
|
|
85
|
+
});
|
|
86
|
+
it('strips style tags (CSS-based exfil / clickjacking)', function () {
|
|
87
|
+
var xss = '<style>body{background:url(//evil.com/?c=)}</style>';
|
|
88
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)(xss)).to.not.include('<style');
|
|
89
|
+
});
|
|
90
|
+
it('strips <meta http-equiv refresh> redirects', function () {
|
|
91
|
+
var xss = '<meta http-equiv="refresh" content="0;url=https://evil.com">';
|
|
92
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)(xss)).to.not.include('<meta');
|
|
93
|
+
});
|
|
94
|
+
it('strips <base> tag (can rewrite all relative URLs)', function () {
|
|
95
|
+
var xss = '<base href="https://evil.com/">';
|
|
96
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)(xss)).to.not.include('<base');
|
|
97
|
+
});
|
|
98
|
+
it('strips encoded onerror payloads', function () {
|
|
99
|
+
var xss = '<img src=x onerror=alert(1)>';
|
|
100
|
+
var out = (0, _sanitize.sanitizeHtml)(xss);
|
|
101
|
+
(0, _chai.expect)(out).to.not.match(/onerror/i);
|
|
102
|
+
});
|
|
103
|
+
it('strips mixed-case obfuscated script tags', function () {
|
|
104
|
+
var xss = '<ScRiPt>alert(1)</sCrIpT>';
|
|
105
|
+
var out = (0, _sanitize.sanitizeHtml)(xss);
|
|
106
|
+
(0, _chai.expect)(out).to.not.match(/<script/i);
|
|
107
|
+
(0, _chai.expect)(out).to.not.include('alert(1)');
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
describe('benign HTML (should be preserved)', function () {
|
|
111
|
+
it('preserves basic formatting tags', function () {
|
|
112
|
+
var html = '<p>Hello <strong>world</strong> <em>!</em></p>';
|
|
113
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)(html)).to.equal(html);
|
|
114
|
+
});
|
|
115
|
+
it('preserves links with safe http(s) hrefs', function () {
|
|
116
|
+
var html = '<a href="https://example.com">link</a>';
|
|
117
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)(html)).to.include('href="https://example.com"');
|
|
118
|
+
});
|
|
119
|
+
it('preserves lists', function () {
|
|
120
|
+
var html = '<ul><li>a</li><li>b</li></ul>';
|
|
121
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)(html)).to.equal(html);
|
|
122
|
+
});
|
|
123
|
+
it('preserves Canvas RCE iframes (Studio / media embeds)', function () {
|
|
124
|
+
var html = '<iframe src="https://canvas.instructure.com/media_objects_iframe/123" ' + 'allowfullscreen="" allow="fullscreen" frameborder="0" ' + 'data-media-id="123" data-media-type="video"></iframe>';
|
|
125
|
+
var out = (0, _sanitize.sanitizeHtml)(html);
|
|
126
|
+
(0, _chai.expect)(out).to.include('<iframe');
|
|
127
|
+
(0, _chai.expect)(out).to.include('data-media-id="123"');
|
|
128
|
+
(0, _chai.expect)(out).to.include('data-media-type="video"');
|
|
129
|
+
(0, _chai.expect)(out).to.include('allowfullscreen');
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
describe('link hardening', function () {
|
|
133
|
+
it('adds rel="noopener noreferrer" to target=_blank links', function () {
|
|
134
|
+
var html = '<a href="https://example.com" target="_blank">x</a>';
|
|
135
|
+
var out = (0, _sanitize.sanitizeHtml)(html);
|
|
136
|
+
(0, _chai.expect)(out).to.match(/rel=["'][^"']*noopener[^"']*["']/);
|
|
137
|
+
(0, _chai.expect)(out).to.match(/rel=["'][^"']*noreferrer[^"']*["']/);
|
|
138
|
+
});
|
|
17
139
|
});
|
|
18
140
|
});
|
|
@@ -5,32 +5,28 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
7
|
exports.sanitizeHtml = sanitizeHtml;
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
8
|
+
var _dompurify = _interopRequireDefault(require("dompurify"));
|
|
9
|
+
var CONFIG = {
|
|
10
|
+
ADD_TAGS: ['iframe'],
|
|
11
|
+
ADD_ATTR: ['allowfullscreen', 'allow', 'frameborder', 'sandbox', 'target', 'data-media-id', 'data-media-type'],
|
|
12
|
+
FORBID_TAGS: ['form', 'input', 'button', 'textarea', 'select', 'option']
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
// Rewrite Canvas equation-image relative URLs to absolute,
|
|
16
|
+
// preserving the previous behavior of this module.
|
|
17
|
+
_dompurify.default.addHook('afterSanitizeAttributes', function (node) {
|
|
18
|
+
if (node.tagName === 'IMG') {
|
|
19
|
+
var src = node.getAttribute('src') || '';
|
|
20
|
+
if (src.indexOf('/equation_images') === 0) {
|
|
21
|
+
node.setAttribute('src', "https://canvas.instructure.com".concat(src));
|
|
22
|
+
node.setAttribute('style', 'vertical-align: middle');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// Harden links opened in a new tab against tab-nabbing.
|
|
26
|
+
if (node.tagName === 'A' && node.getAttribute('target') === '_blank') {
|
|
27
|
+
node.setAttribute('rel', 'noopener noreferrer');
|
|
22
28
|
}
|
|
23
|
-
|
|
24
|
-
tagName: tagName,
|
|
25
|
-
attribs: attribs
|
|
26
|
-
};
|
|
27
|
-
}
|
|
29
|
+
});
|
|
28
30
|
function sanitizeHtml(html) {
|
|
29
|
-
return
|
|
30
|
-
allowedTags: false,
|
|
31
|
-
allowedAttributes: false,
|
|
32
|
-
transformTags: {
|
|
33
|
-
img: transformImage
|
|
34
|
-
}
|
|
35
|
-
});
|
|
31
|
+
return _dompurify.default.sanitize(html == null ? '' : html, CONFIG);
|
|
36
32
|
}
|
|
@@ -26,10 +26,13 @@ describe('OutcomeCheckbox', function () {
|
|
|
26
26
|
}, props);
|
|
27
27
|
}
|
|
28
28
|
it('renders a checkbox', function () {
|
|
29
|
-
var
|
|
29
|
+
var props = makeProps();
|
|
30
|
+
var wrapper = (0, _enzyme.mount)( /*#__PURE__*/_react.default.createElement(_index.default, props), {
|
|
30
31
|
disableLifecycleMethods: true
|
|
31
32
|
});
|
|
32
|
-
|
|
33
|
+
var checkbox = wrapper.find(_uiCheckbox.Checkbox);
|
|
34
|
+
(0, _chai.expect)(checkbox).to.have.length(1);
|
|
35
|
+
(0, _chai.expect)(checkbox.prop('id')).to.equal("outcome-select-".concat(props.outcome.id));
|
|
33
36
|
});
|
|
34
37
|
it('renders outcome title in link', function () {
|
|
35
38
|
var props = makeProps();
|
|
@@ -55,6 +55,7 @@ var OutcomeCheckbox = exports.default = (_dec = (0, _emotion.withStyle)(_styles.
|
|
|
55
55
|
css: this.props.styles.checkbox,
|
|
56
56
|
className: "OutcomeSelector"
|
|
57
57
|
}, (0, _emotion.jsx)(_uiCheckbox.Checkbox, {
|
|
58
|
+
id: "outcome-select-".concat(id),
|
|
58
59
|
value: id,
|
|
59
60
|
checked: this.selected(),
|
|
60
61
|
onChange: function onChange() {
|
|
@@ -71,6 +71,7 @@ describe('OutcomeSelectionList', function () {
|
|
|
71
71
|
});
|
|
72
72
|
// Enzyme finds extra Checkbox components because of the instui decorator on the component
|
|
73
73
|
(0, _chai.expect)(wrapper.find('Checkbox[value="selectAll"]')).to.have.length(3);
|
|
74
|
+
(0, _chai.expect)(wrapper.find('Checkbox[value="selectAll"]').at(0).prop('id')).to.equal('outcome-select-all');
|
|
74
75
|
});
|
|
75
76
|
it('renders select all as unchecked when no outcomes selected', function () {
|
|
76
77
|
var wrapper = (0, _enzyme.mount)( /*#__PURE__*/_react.default.createElement(_index.default, makeProps()), {
|
|
@@ -84,6 +84,7 @@ var OutcomeSelectionList = exports.default = (_dec = (0, _emotion.withStyle)(_st
|
|
|
84
84
|
}, (0, _emotion.jsx)("div", {
|
|
85
85
|
css: this.props.styles.checkbox
|
|
86
86
|
}, (0, _emotion.jsx)(_uiCheckbox.Checkbox, {
|
|
87
|
+
id: "outcome-select-all",
|
|
87
88
|
value: "selectAll",
|
|
88
89
|
checked: this.allSelected(),
|
|
89
90
|
onChange: function onChange() {
|
|
@@ -2,17 +2,139 @@
|
|
|
2
2
|
|
|
3
3
|
var _chai = require("chai");
|
|
4
4
|
var _sanitize = require("../sanitize.js");
|
|
5
|
-
describe('
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
describe('sanitizeHtml', function () {
|
|
6
|
+
describe('equation images (Canvas-specific)', function () {
|
|
7
|
+
it('rewrites /equation_images src to absolute canvas URL', function () {
|
|
8
|
+
var equationImage = 'Some text with an <img src="/equation_images/image" />';
|
|
9
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)(equationImage)).to.include('canvas.instructure.com/equation_images/image');
|
|
10
|
+
});
|
|
11
|
+
it('adds vertical-align style to equation images', function () {
|
|
12
|
+
var equationImage = '<img src="/equation_images/abc" />';
|
|
13
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)(equationImage)).to.include('vertical-align: middle');
|
|
14
|
+
});
|
|
15
|
+
it('leaves non-equation image src untouched', function () {
|
|
16
|
+
var otherImage = '<img src="/another_image">';
|
|
17
|
+
var out = (0, _sanitize.sanitizeHtml)(otherImage);
|
|
18
|
+
(0, _chai.expect)(out).to.include('src="/another_image"');
|
|
19
|
+
(0, _chai.expect)(out).to.not.include('canvas.instructure.com');
|
|
20
|
+
});
|
|
9
21
|
});
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
22
|
+
describe('null / empty input handling', function () {
|
|
23
|
+
it('returns empty string for null', function () {
|
|
24
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)(null)).to.equal('');
|
|
25
|
+
});
|
|
26
|
+
it('returns empty string for undefined', function () {
|
|
27
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)(void 0)).to.equal('');
|
|
28
|
+
});
|
|
29
|
+
it('returns empty string for empty string', function () {
|
|
30
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)('')).to.equal('');
|
|
31
|
+
});
|
|
13
32
|
});
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
33
|
+
describe('XSS - script execution vectors', function () {
|
|
34
|
+
it('strips <script> tags', function () {
|
|
35
|
+
var xss = 'Hello<script>alert(1)</script>World';
|
|
36
|
+
var out = (0, _sanitize.sanitizeHtml)(xss);
|
|
37
|
+
(0, _chai.expect)(out).to.not.include('<script');
|
|
38
|
+
(0, _chai.expect)(out).to.not.include('alert(1)');
|
|
39
|
+
});
|
|
40
|
+
it('strips inline event handlers (onerror)', function () {
|
|
41
|
+
var xss = '<img src="x" onerror="alert(1)">';
|
|
42
|
+
var out = (0, _sanitize.sanitizeHtml)(xss);
|
|
43
|
+
(0, _chai.expect)(out).to.not.match(/onerror/i);
|
|
44
|
+
(0, _chai.expect)(out).to.not.include('alert(1)');
|
|
45
|
+
});
|
|
46
|
+
it('strips inline event handlers (onclick)', function () {
|
|
47
|
+
var xss = '<a href="#" onclick="alert(1)">click</a>';
|
|
48
|
+
var out = (0, _sanitize.sanitizeHtml)(xss);
|
|
49
|
+
(0, _chai.expect)(out).to.not.match(/onclick/i);
|
|
50
|
+
});
|
|
51
|
+
it('strips inline event handlers (onload on svg)', function () {
|
|
52
|
+
var xss = '<svg onload="alert(1)"></svg>';
|
|
53
|
+
var out = (0, _sanitize.sanitizeHtml)(xss);
|
|
54
|
+
(0, _chai.expect)(out).to.not.match(/onload/i);
|
|
55
|
+
(0, _chai.expect)(out).to.not.include('alert(1)');
|
|
56
|
+
});
|
|
57
|
+
it('strips javascript: URLs in href', function () {
|
|
58
|
+
// eslint-disable-next-line no-script-url
|
|
59
|
+
var xss = '<a href="javascript:alert(1)">x</a>';
|
|
60
|
+
var out = (0, _sanitize.sanitizeHtml)(xss);
|
|
61
|
+
(0, _chai.expect)(out).to.not.match(/javascript:/i);
|
|
62
|
+
});
|
|
63
|
+
it('strips javascript: URLs in img src', function () {
|
|
64
|
+
// eslint-disable-next-line no-script-url
|
|
65
|
+
var xss = '<img src="javascript:alert(1)">';
|
|
66
|
+
var out = (0, _sanitize.sanitizeHtml)(xss);
|
|
67
|
+
(0, _chai.expect)(out).to.not.match(/javascript:/i);
|
|
68
|
+
});
|
|
69
|
+
it('strips data: URLs that contain HTML/JS in iframe src', function () {
|
|
70
|
+
var xss = '<iframe src="data:text/html,<script>alert(1)</script>"></iframe>';
|
|
71
|
+
var out = (0, _sanitize.sanitizeHtml)(xss);
|
|
72
|
+
(0, _chai.expect)(out).to.not.include('alert(1)');
|
|
73
|
+
});
|
|
74
|
+
it('strips <object> tags', function () {
|
|
75
|
+
var xss = '<object data="evil.swf"></object>';
|
|
76
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)(xss)).to.not.include('<object');
|
|
77
|
+
});
|
|
78
|
+
it('strips <embed> tags', function () {
|
|
79
|
+
var xss = '<embed src="evil.swf">';
|
|
80
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)(xss)).to.not.include('<embed');
|
|
81
|
+
});
|
|
82
|
+
it('strips <form> tags (CSRF / phishing surface)', function () {
|
|
83
|
+
var xss = '<form action="https://evil.com"><input name=x></form>';
|
|
84
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)(xss)).to.not.include('<form');
|
|
85
|
+
});
|
|
86
|
+
it('strips style tags (CSS-based exfil / clickjacking)', function () {
|
|
87
|
+
var xss = '<style>body{background:url(//evil.com/?c=)}</style>';
|
|
88
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)(xss)).to.not.include('<style');
|
|
89
|
+
});
|
|
90
|
+
it('strips <meta http-equiv refresh> redirects', function () {
|
|
91
|
+
var xss = '<meta http-equiv="refresh" content="0;url=https://evil.com">';
|
|
92
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)(xss)).to.not.include('<meta');
|
|
93
|
+
});
|
|
94
|
+
it('strips <base> tag (can rewrite all relative URLs)', function () {
|
|
95
|
+
var xss = '<base href="https://evil.com/">';
|
|
96
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)(xss)).to.not.include('<base');
|
|
97
|
+
});
|
|
98
|
+
it('strips encoded onerror payloads', function () {
|
|
99
|
+
var xss = '<img src=x onerror=alert(1)>';
|
|
100
|
+
var out = (0, _sanitize.sanitizeHtml)(xss);
|
|
101
|
+
(0, _chai.expect)(out).to.not.match(/onerror/i);
|
|
102
|
+
});
|
|
103
|
+
it('strips mixed-case obfuscated script tags', function () {
|
|
104
|
+
var xss = '<ScRiPt>alert(1)</sCrIpT>';
|
|
105
|
+
var out = (0, _sanitize.sanitizeHtml)(xss);
|
|
106
|
+
(0, _chai.expect)(out).to.not.match(/<script/i);
|
|
107
|
+
(0, _chai.expect)(out).to.not.include('alert(1)');
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
describe('benign HTML (should be preserved)', function () {
|
|
111
|
+
it('preserves basic formatting tags', function () {
|
|
112
|
+
var html = '<p>Hello <strong>world</strong> <em>!</em></p>';
|
|
113
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)(html)).to.equal(html);
|
|
114
|
+
});
|
|
115
|
+
it('preserves links with safe http(s) hrefs', function () {
|
|
116
|
+
var html = '<a href="https://example.com">link</a>';
|
|
117
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)(html)).to.include('href="https://example.com"');
|
|
118
|
+
});
|
|
119
|
+
it('preserves lists', function () {
|
|
120
|
+
var html = '<ul><li>a</li><li>b</li></ul>';
|
|
121
|
+
(0, _chai.expect)((0, _sanitize.sanitizeHtml)(html)).to.equal(html);
|
|
122
|
+
});
|
|
123
|
+
it('preserves Canvas RCE iframes (Studio / media embeds)', function () {
|
|
124
|
+
var html = '<iframe src="https://canvas.instructure.com/media_objects_iframe/123" ' + 'allowfullscreen="" allow="fullscreen" frameborder="0" ' + 'data-media-id="123" data-media-type="video"></iframe>';
|
|
125
|
+
var out = (0, _sanitize.sanitizeHtml)(html);
|
|
126
|
+
(0, _chai.expect)(out).to.include('<iframe');
|
|
127
|
+
(0, _chai.expect)(out).to.include('data-media-id="123"');
|
|
128
|
+
(0, _chai.expect)(out).to.include('data-media-type="video"');
|
|
129
|
+
(0, _chai.expect)(out).to.include('allowfullscreen');
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
describe('link hardening', function () {
|
|
133
|
+
it('adds rel="noopener noreferrer" to target=_blank links', function () {
|
|
134
|
+
var html = '<a href="https://example.com" target="_blank">x</a>';
|
|
135
|
+
var out = (0, _sanitize.sanitizeHtml)(html);
|
|
136
|
+
(0, _chai.expect)(out).to.match(/rel=["'][^"']*noopener[^"']*["']/);
|
|
137
|
+
(0, _chai.expect)(out).to.match(/rel=["'][^"']*noreferrer[^"']*["']/);
|
|
138
|
+
});
|
|
17
139
|
});
|
|
18
140
|
});
|
|
@@ -5,32 +5,28 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
7
|
exports.sanitizeHtml = sanitizeHtml;
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
8
|
+
var _dompurify = _interopRequireDefault(require("dompurify"));
|
|
9
|
+
var CONFIG = {
|
|
10
|
+
ADD_TAGS: ['iframe'],
|
|
11
|
+
ADD_ATTR: ['allowfullscreen', 'allow', 'frameborder', 'sandbox', 'target', 'data-media-id', 'data-media-type'],
|
|
12
|
+
FORBID_TAGS: ['form', 'input', 'button', 'textarea', 'select', 'option']
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
// Rewrite Canvas equation-image relative URLs to absolute,
|
|
16
|
+
// preserving the previous behavior of this module.
|
|
17
|
+
_dompurify.default.addHook('afterSanitizeAttributes', function (node) {
|
|
18
|
+
if (node.tagName === 'IMG') {
|
|
19
|
+
var src = node.getAttribute('src') || '';
|
|
20
|
+
if (src.indexOf('/equation_images') === 0) {
|
|
21
|
+
node.setAttribute('src', "https://canvas.instructure.com".concat(src));
|
|
22
|
+
node.setAttribute('style', 'vertical-align: middle');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// Harden links opened in a new tab against tab-nabbing.
|
|
26
|
+
if (node.tagName === 'A' && node.getAttribute('target') === '_blank') {
|
|
27
|
+
node.setAttribute('rel', 'noopener noreferrer');
|
|
22
28
|
}
|
|
23
|
-
|
|
24
|
-
tagName: tagName,
|
|
25
|
-
attribs: attribs
|
|
26
|
-
};
|
|
27
|
-
}
|
|
29
|
+
});
|
|
28
30
|
function sanitizeHtml(html) {
|
|
29
|
-
return
|
|
30
|
-
allowedTags: false,
|
|
31
|
-
allowedAttributes: false,
|
|
32
|
-
transformTags: {
|
|
33
|
-
img: transformImage
|
|
34
|
-
}
|
|
35
|
-
});
|
|
31
|
+
return _dompurify.default.sanitize(html == null ? '' : html, CONFIG);
|
|
36
32
|
}
|
|
@@ -26,10 +26,13 @@ describe('OutcomeCheckbox', function () {
|
|
|
26
26
|
}, props);
|
|
27
27
|
}
|
|
28
28
|
it('renders a checkbox', function () {
|
|
29
|
-
var
|
|
29
|
+
var props = makeProps();
|
|
30
|
+
var wrapper = (0, _enzyme.mount)( /*#__PURE__*/_react.default.createElement(_index.default, props), {
|
|
30
31
|
disableLifecycleMethods: true
|
|
31
32
|
});
|
|
32
|
-
|
|
33
|
+
var checkbox = wrapper.find(_uiCheckbox.Checkbox);
|
|
34
|
+
(0, _chai.expect)(checkbox).to.have.length(1);
|
|
35
|
+
(0, _chai.expect)(checkbox.prop('id')).to.equal("outcome-select-".concat(props.outcome.id));
|
|
33
36
|
});
|
|
34
37
|
it('renders outcome title in link', function () {
|
|
35
38
|
var props = makeProps();
|
|
@@ -55,6 +55,7 @@ var OutcomeCheckbox = exports.default = (_dec = (0, _emotion.withStyle)(_styles.
|
|
|
55
55
|
css: this.props.styles.checkbox,
|
|
56
56
|
className: "OutcomeSelector"
|
|
57
57
|
}, (0, _emotion.jsx)(_uiCheckbox.Checkbox, {
|
|
58
|
+
id: "outcome-select-".concat(id),
|
|
58
59
|
value: id,
|
|
59
60
|
checked: this.selected(),
|
|
60
61
|
onChange: function onChange() {
|
|
@@ -71,6 +71,7 @@ describe('OutcomeSelectionList', function () {
|
|
|
71
71
|
});
|
|
72
72
|
// Enzyme finds extra Checkbox components because of the instui decorator on the component
|
|
73
73
|
(0, _chai.expect)(wrapper.find('Checkbox[value="selectAll"]')).to.have.length(3);
|
|
74
|
+
(0, _chai.expect)(wrapper.find('Checkbox[value="selectAll"]').at(0).prop('id')).to.equal('outcome-select-all');
|
|
74
75
|
});
|
|
75
76
|
it('renders select all as unchecked when no outcomes selected', function () {
|
|
76
77
|
var wrapper = (0, _enzyme.mount)( /*#__PURE__*/_react.default.createElement(_index.default, makeProps()), {
|
|
@@ -84,6 +84,7 @@ var OutcomeSelectionList = exports.default = (_dec = (0, _emotion.withStyle)(_st
|
|
|
84
84
|
}, (0, _emotion.jsx)("div", {
|
|
85
85
|
css: this.props.styles.checkbox
|
|
86
86
|
}, (0, _emotion.jsx)(_uiCheckbox.Checkbox, {
|
|
87
|
+
id: "outcome-select-all",
|
|
87
88
|
value: "selectAll",
|
|
88
89
|
checked: this.allSelected(),
|
|
89
90
|
onChange: function onChange() {
|