@globalpayments/vega 2.62.0 → 2.63.1
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/dist/cjs/{app-globals-8f5fa42a.js → app-globals-2d0b157e.js} +85 -13
- package/dist/cjs/{code-block-eb66d852.js → code-block-cc740807.js} +12 -4
- package/dist/cjs/{component-global-style-slimmer-b0b4b997.js → component-global-style-slimmer-d5216fa7.js} +4 -0
- package/dist/cjs/{component-value-history-controller-slimmer.abstract-62cdf04c.js → component-value-history-controller-slimmer.abstract-0bb81172.js} +2 -2
- package/dist/cjs/country-flags-d4928e55.js +2403 -0
- package/dist/cjs/{dark-mode-style-controller-ab0703e1.js → dark-mode-style-controller-b1e9ec82.js} +7 -0
- package/dist/cjs/{design-token-76bb47bd.js → design-token-bf913c86.js} +1 -1
- package/dist/cjs/{dto-renderer-manager-f3894490.js → dto-renderer-manager-424c5031.js} +79 -3
- package/dist/cjs/{element-appender-slimmer-e8dac628.js → element-appender-slimmer-1d035b1f.js} +2 -2
- package/dist/cjs/{image-annotation-action-a628ec9b.js → image-annotation-action-f831e09b.js} +3 -3
- package/dist/cjs/index.cjs.js +11 -9
- package/dist/cjs/{language-extension-20a1dba5.js → language-extension-cfe0eabd.js} +7 -4
- package/dist/cjs/{legend-input-processor-b1f323fa.js → legend-input-processor-27c65353.js} +4 -4
- package/dist/cjs/loader.cjs.js +8 -7
- package/dist/cjs/{min-number-rule-965fc43d.js → min-number-rule-dc555309.js} +14 -8
- package/dist/cjs/{public-rules-5d0f3a5f.js → public-rules-7e9b633d.js} +6 -4
- package/dist/cjs/{range-cfc45f9e.js → range-44f08955.js} +1 -1
- package/dist/cjs/{responsive-format-facade-7e933525.js → responsive-format-facade-a7fbefc4.js} +4 -3
- package/dist/cjs/{rich-text-editor-required-rule-72170c10.js → rich-text-editor-required-rule-a0618c85.js} +1 -1
- package/dist/cjs/{style-formatter-702df81e.js → style-formatter-795451f2.js} +1 -1
- package/dist/cjs/{token-extension-23ccff1d.js → token-extension-4764d5f3.js} +3 -3
- package/dist/cjs/vega-accordion.cjs.entry.js +7 -6
- package/dist/cjs/vega-app-footer.cjs.entry.js +3 -1
- package/dist/cjs/vega-app-header-button.cjs.entry.js +8 -7
- package/dist/cjs/vega-bar-chart.cjs.entry.js +2 -2
- package/dist/cjs/vega-box.cjs.entry.js +15 -8
- package/dist/cjs/vega-brand-logo.cjs.entry.js +3 -1
- package/dist/cjs/vega-breadcrumb.cjs.entry.js +39 -71
- package/dist/cjs/vega-button-circle.cjs.entry.js +7 -6
- package/dist/cjs/vega-button-link.cjs.entry.js +15 -13
- package/dist/cjs/vega-button.cjs.entry.js +6 -5
- package/dist/cjs/vega-calendar_4.cjs.entry.js +3 -2
- package/dist/cjs/vega-card.cjs.entry.js +7 -6
- package/dist/cjs/vega-carousel.cjs.entry.js +6 -5
- package/dist/cjs/vega-chip.cjs.entry.js +8 -7
- package/dist/cjs/vega-code-block.cjs.entry.js +258 -153
- package/dist/cjs/vega-date-picker_2.cjs.entry.js +7 -6
- package/dist/cjs/vega-dialog_2.cjs.entry.js +8 -7
- package/dist/cjs/vega-divider.cjs.entry.js +8 -7
- package/dist/cjs/vega-dropdown_5.cjs.entry.js +8 -7
- package/dist/cjs/vega-env-manager-23b8b23c.js +2 -2
- package/dist/cjs/vega-flag-icon.cjs.entry.js +10 -9
- package/dist/cjs/vega-flex.cjs.entry.js +9 -8
- package/dist/cjs/vega-font.cjs.entry.js +7 -6
- package/dist/cjs/vega-grid.cjs.entry.js +7 -6
- package/dist/cjs/vega-icon.cjs.entry.js +7 -6
- package/dist/cjs/vega-image-uploader.cjs.entry.js +20 -10
- package/dist/cjs/vega-input-credit-card.cjs.entry.js +1 -1
- package/dist/cjs/vega-input-numeric.cjs.entry.js +47 -1
- package/dist/cjs/vega-input-phone-number.cjs.entry.js +5 -4
- package/dist/cjs/vega-input-select.cjs.entry.js +6 -5
- package/dist/cjs/vega-input.cjs.entry.js +1 -1
- package/dist/cjs/vega-left-nav_5.cjs.entry.js +8 -7
- package/dist/cjs/vega-line-chart.cjs.entry.js +2 -2
- package/dist/cjs/vega-loader-wrapper_2.cjs.entry.js +7 -6
- package/dist/cjs/vega-nonce-manager-f927497f.js +103 -0
- package/dist/cjs/vega-pagination.cjs.entry.js +6 -5
- package/dist/cjs/vega-pie-chart.cjs.entry.js +1 -1
- package/dist/cjs/vega-popover_2.cjs.entry.js +8 -7
- package/dist/cjs/vega-rich-text-content.cjs.entry.js +5 -4
- package/dist/cjs/vega-rich-text-editor_4.cjs.entry.js +16 -12
- package/dist/cjs/vega-selection-chip_2.cjs.entry.js +7 -6
- package/dist/cjs/vega-sidenav_3.cjs.entry.js +7 -6
- package/dist/cjs/vega-signature-capture.cjs.entry.js +14 -19
- package/dist/cjs/vega-stepper.cjs.entry.js +1 -1
- package/dist/cjs/vega-table_8.cjs.entry.js +7 -6
- package/dist/cjs/vega-textarea.cjs.entry.js +7 -1
- package/dist/cjs/vega-time-picker_2.cjs.entry.js +15 -6
- package/dist/cjs/vega-tooltip_2.cjs.entry.js +7 -6
- package/dist/cjs/vega.cjs.js +8 -7
- package/dist/cjs/{y-axis-input-processor-19a07af5.js → y-axis-input-processor-9fbfd5e7.js} +1 -1
- package/dist/collection/components/vega-box/slimmers/controllers/vega-box-responsive-style-controller.js +4 -0
- package/dist/collection/components/vega-box/slimmers/controllers/vega-box-state-styles-controller.js +4 -0
- package/dist/collection/components/vega-breadcrumb/slimmers/renderers/vega-breadcrumb-collapsed-item-renderer.js +4 -13
- package/dist/collection/components/vega-breadcrumb/slimmers/renderers/vega-breadcrumb-item-renderer.js +19 -5
- package/dist/collection/components/vega-breadcrumb/vega-breadcrumb.js +6 -5
- package/dist/collection/components/vega-button-link/vega-button-link.js +18 -19
- package/dist/collection/components/vega-calendar/vega-calendar-event/slimmers/renderers/vega-calendar-event-renderer.js +2 -1
- package/dist/collection/components/vega-calendar/vega-calendar-event-preview/slimmers/renderers/vega-calendar-event-preview-detail-renderer.js +2 -1
- package/dist/collection/components/vega-code-block/slimmers/controllers/code-input-paste.abstract.js +65 -0
- package/dist/collection/components/vega-code-block/slimmers/controllers/vega-code-block-input-controller.js +3 -75
- package/dist/collection/components/vega-code-block/slimmers/controllers/vega-code-block-input-paste-controller.js +109 -0
- package/dist/collection/components/vega-code-block/vega-code-block.js +5 -0
- package/dist/collection/components/vega-flag-icon/assets/flags/ac.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ad.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ae.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/af.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ag.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ai.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/al.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/am.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ao.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ar.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/as.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/at.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/au.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/aw.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ax.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/az.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ba.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/bb.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/bd.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/be.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/bf.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/bg.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/bh.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/bi.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/bj.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/bl.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/bm.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/bn.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/bo.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/bq.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/br.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/bs.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/bt.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/bw.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/by.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/bz.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ca.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/cc.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/cd.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/cf.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/cg.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ch.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ci.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ck.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/cl.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/cm.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/cn.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/co.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/cr.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/cu.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/cv.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/cw.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/cx.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/cy.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/cz.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/de.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/dj.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/dk.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/dm.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/do.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/dz.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ec.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ee.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/eg.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/eh.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/er.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/es.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/et.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/fi.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/fj.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/fk.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/fm.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/fo.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/fr.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ga.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/gb.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/gd.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ge.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/gf.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/gg.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/gh.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/gi.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/gl.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/gm.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/gn.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/gp.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/gq.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/gr.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/gt.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/gu.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/gw.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/gy.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/hk.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/hn.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/hr.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ht.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/hu.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/id.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ie.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/il.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/im.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/in.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/io.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/iq.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ir.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/is.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/it.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/je.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/jm.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/jo.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/jp.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ke.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/kg.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/kh.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ki.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/km.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/kn.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/kp.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/kr.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/kw.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ky.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/kz.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/la.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/lb.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/lc.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/li.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/lk.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/lr.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ls.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/lt.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/lu.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/lv.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ly.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ma.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/mc.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/md.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/me.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/mf.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/mg.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/mh.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/mk.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ml.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/mm.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/mn.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/mo.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/mp.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/mq.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/mr.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ms.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/mt.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/mu.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/mv.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/mw.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/mx.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/my.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/mz.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/na.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/nc.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ne.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/nf.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ng.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ni.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/nl.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/no.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/np.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/nr.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/nu.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/nz.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/om.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/pa.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/pe.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/pf.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/pg.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ph.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/pk.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/pl.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/pm.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/pr.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ps.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/pt.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/pw.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/py.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/qa.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/re.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ro.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/rs.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ru.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/rw.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/sa.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/sb.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/sc.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/sd.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/se.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/sg.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/sh.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/si.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/sj.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/sk.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/sl.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/sm.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/sn.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/so.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/sr.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ss.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/st.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/sv.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/sx.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/sy.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/sz.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ta.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/tc.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/td.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/tg.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/th.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/tj.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/tk.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/tl.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/tm.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/tn.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/to.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/tr.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/tt.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/tv.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/tw.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/tz.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ua.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ug.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/us.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/uy.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/uz.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/va.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/vc.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ve.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/vg.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/vi.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/vn.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/vu.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/wf.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ws.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/xk.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/ye.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/yt.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/za.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/zm.js +1 -1
- package/dist/collection/components/vega-flag-icon/assets/flags/zw.js +1 -1
- package/dist/collection/components/vega-flag-icon/slimmers/renderers/vega-flag-icon-renderer.js +1 -1
- package/dist/collection/components/vega-flag-icon/vega-flag-icon.css +4 -0
- package/dist/collection/components/vega-image-uploader/slimmers/controllers/vega-image-uploader-preview-controller.js +14 -5
- package/dist/collection/components/vega-input-credit-card/assets/icons.js +1 -1
- package/dist/collection/components/vega-input-numeric/slimmers/renderers/vega-input-numeric-renderer.js +27 -1
- package/dist/collection/components/vega-input-numeric/vega-input-numeric.js +64 -0
- package/dist/collection/components/vega-rich-text-editor/dto/content-state.js +7 -2
- package/dist/collection/components/vega-rich-text-editor/dto/nodes/decorator-node.js +1 -2
- package/dist/collection/components/vega-rich-text-editor/dto/nodes/node.abstract.js +8 -0
- package/dist/collection/components/vega-rich-text-editor/dto/nodes/text-node.js +2 -3
- package/dist/collection/components/vega-rich-text-editor/extensions/languages/language-extension.js +5 -2
- package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/helper/input-event-handler/insert-paste-handler.js +9 -5
- package/dist/collection/components/vega-signature-capture/slimmers/written-mode/controllers/written-mode-svg-controller.js +5 -7
- package/dist/collection/components/vega-signature-capture/slimmers/written-mode/renderers/written-mode-renderer.js +1 -5
- package/dist/collection/components/vega-textarea/vega-textarea.js +28 -1
- package/dist/collection/components/vega-time-picker/vega-time-picker.js +10 -2
- package/dist/collection/global/scripts/before-vega-load.js +21 -1
- package/dist/collection/helpers/chart/renderers/svg-renderer.js +4 -4
- package/dist/collection/helpers/csp/styles-preservator.js +71 -0
- package/dist/collection/helpers/csp/test/styles-preservator.test.js +207 -0
- package/dist/collection/helpers/csp/test/vega-nonce-manager.test.js +166 -0
- package/dist/collection/helpers/csp/vega-nonce-manager.js +97 -0
- package/dist/collection/helpers/public-api.js +2 -0
- package/dist/collection/helpers/slimmers/component-global-style-slimmer.js +4 -0
- package/dist/collection/helpers/slimmers/global/vega-nonce-injector-slimmer.js +54 -0
- package/dist/collection/helpers/slimmers/test/component-global-style-slimmer.test.js +41 -0
- package/dist/collection/helpers/slimmers/test/global/vega-nonce-injector-slimmer.test.js +64 -0
- package/dist/collection/helpers/theme/controllers/color-schema-overriding-controller.js +4 -0
- package/dist/collection/helpers/theme/controllers/style-controller.abstract.js +4 -0
- package/dist/collection/helpers/theme/tests/theme-manager-controller.test.js +33 -0
- package/dist/collection/helpers/validator/rules/max-number-rule.js +7 -4
- package/dist/collection/helpers/validator/rules/min-number-rule.js +7 -4
- package/dist/esm/{app-globals-aaff0b25.js → app-globals-2623304e.js} +85 -13
- package/dist/esm/{code-block-68300b47.js → code-block-23e7f8d0.js} +12 -4
- package/dist/esm/{component-global-style-slimmer-dad40b64.js → component-global-style-slimmer-5d437fdf.js} +4 -0
- package/dist/esm/{component-value-history-controller-slimmer.abstract-ac2f1bfd.js → component-value-history-controller-slimmer.abstract-df25e4a1.js} +2 -2
- package/dist/esm/country-flags-39dbfa43.js +2401 -0
- package/dist/esm/{dark-mode-style-controller-3bbb32dc.js → dark-mode-style-controller-972e1f06.js} +7 -0
- package/dist/esm/{design-token-1a36307e.js → design-token-0f439510.js} +1 -1
- package/dist/esm/{dto-renderer-manager-af66bbd9.js → dto-renderer-manager-65b7b1b1.js} +79 -4
- package/dist/esm/{element-appender-slimmer-fe68ec2d.js → element-appender-slimmer-bf5ca501.js} +2 -2
- package/dist/esm/{image-annotation-action-f61c2693.js → image-annotation-action-af21ea8f.js} +3 -3
- package/dist/esm/index.js +10 -9
- package/dist/esm/{language-extension-1ada2a9d.js → language-extension-d355f9aa.js} +7 -4
- package/dist/esm/{legend-input-processor-1d266967.js → legend-input-processor-5ecae3a7.js} +4 -4
- package/dist/esm/loader.js +8 -7
- package/dist/esm/{min-number-rule-86421853.js → min-number-rule-2f1cfbf9.js} +14 -8
- package/dist/esm/{public-rules-9f62069a.js → public-rules-1a5da7bf.js} +6 -4
- package/dist/esm/{range-c2eeb794.js → range-fac2962c.js} +1 -1
- package/dist/esm/{responsive-format-facade-5711c77d.js → responsive-format-facade-2904b456.js} +4 -3
- package/dist/esm/{rich-text-editor-required-rule-de738309.js → rich-text-editor-required-rule-bb94d680.js} +1 -1
- package/dist/esm/{style-formatter-2479dc61.js → style-formatter-a724e38d.js} +1 -1
- package/dist/esm/{token-extension-6fc5e1f5.js → token-extension-89eeef74.js} +3 -3
- package/dist/esm/vega-accordion.entry.js +7 -6
- package/dist/esm/vega-app-footer.entry.js +3 -1
- package/dist/esm/vega-app-header-button.entry.js +8 -7
- package/dist/esm/vega-bar-chart.entry.js +2 -2
- package/dist/esm/vega-box.entry.js +15 -8
- package/dist/esm/vega-brand-logo.entry.js +3 -1
- package/dist/esm/vega-breadcrumb.entry.js +40 -72
- package/dist/esm/vega-button-circle.entry.js +7 -6
- package/dist/esm/vega-button-link.entry.js +15 -13
- package/dist/esm/vega-button.entry.js +6 -5
- package/dist/esm/vega-calendar_4.entry.js +3 -2
- package/dist/esm/vega-card.entry.js +7 -6
- package/dist/esm/vega-carousel.entry.js +6 -5
- package/dist/esm/vega-chip.entry.js +8 -7
- package/dist/esm/vega-code-block.entry.js +258 -153
- package/dist/esm/vega-date-picker_2.entry.js +7 -6
- package/dist/esm/vega-dialog_2.entry.js +8 -7
- package/dist/esm/vega-divider.entry.js +8 -7
- package/dist/esm/vega-dropdown_5.entry.js +8 -7
- package/dist/esm/vega-env-manager-8f8dc473.js +2 -2
- package/dist/esm/vega-flag-icon.entry.js +10 -9
- package/dist/esm/vega-flex.entry.js +9 -8
- package/dist/esm/vega-font.entry.js +7 -6
- package/dist/esm/vega-grid.entry.js +7 -6
- package/dist/esm/vega-icon.entry.js +7 -6
- package/dist/esm/vega-image-uploader.entry.js +20 -10
- package/dist/esm/vega-input-credit-card.entry.js +1 -1
- package/dist/esm/vega-input-numeric.entry.js +48 -2
- package/dist/esm/vega-input-phone-number.entry.js +5 -4
- package/dist/esm/vega-input-select.entry.js +6 -5
- package/dist/esm/vega-input.entry.js +1 -1
- package/dist/esm/vega-left-nav_5.entry.js +8 -7
- package/dist/esm/vega-line-chart.entry.js +2 -2
- package/dist/esm/vega-loader-wrapper_2.entry.js +7 -6
- package/dist/esm/vega-nonce-manager-87615d3c.js +100 -0
- package/dist/esm/vega-pagination.entry.js +6 -5
- package/dist/esm/vega-pie-chart.entry.js +1 -1
- package/dist/esm/vega-popover_2.entry.js +8 -7
- package/dist/esm/vega-rich-text-content.entry.js +5 -4
- package/dist/esm/vega-rich-text-editor_4.entry.js +16 -12
- package/dist/esm/vega-selection-chip_2.entry.js +7 -6
- package/dist/esm/vega-sidenav_3.entry.js +7 -6
- package/dist/esm/vega-signature-capture.entry.js +14 -19
- package/dist/esm/vega-stepper.entry.js +1 -1
- package/dist/esm/vega-table_8.entry.js +7 -6
- package/dist/esm/vega-textarea.entry.js +7 -1
- package/dist/esm/vega-time-picker_2.entry.js +15 -6
- package/dist/esm/vega-tooltip_2.entry.js +7 -6
- package/dist/esm/vega.js +8 -7
- package/dist/esm/{y-axis-input-processor-95995d34.js → y-axis-input-processor-bc54314a.js} +1 -1
- package/dist/types/components/vega-breadcrumb/slimmers/renderers/vega-breadcrumb-collapsed-item-renderer.d.ts +1 -1
- package/dist/types/components/vega-breadcrumb/slimmers/renderers/vega-breadcrumb-item-renderer.d.ts +2 -1
- package/dist/types/components/vega-breadcrumb/types.d.ts +1 -0
- package/dist/types/components/vega-breadcrumb/vega-breadcrumb.d.ts +2 -2
- package/dist/types/components/vega-button-link/vega-button-link.d.ts +5 -8
- package/dist/types/components/vega-code-block/slimmers/controllers/code-input-paste.abstract.d.ts +46 -0
- package/dist/types/components/vega-code-block/slimmers/controllers/vega-code-block-input-controller.d.ts +2 -31
- package/dist/types/components/vega-code-block/slimmers/controllers/vega-code-block-input-paste-controller.d.ts +44 -0
- package/dist/types/components/vega-code-block/vega-code-block.d.ts +2 -0
- package/dist/types/components/vega-input-numeric/slimmers/renderers/vega-input-numeric-renderer.d.ts +3 -0
- package/dist/types/components/vega-input-numeric/vega-input-numeric.d.ts +12 -0
- package/dist/types/components/vega-rich-text-editor/dto/nodes/node.abstract.d.ts +6 -0
- package/dist/types/components/vega-rich-text-editor/slimmers/controllers/helper/input-event-handler/insert-paste-handler.d.ts +1 -1
- package/dist/types/components/vega-textarea/vega-textarea.d.ts +6 -0
- package/dist/types/components/vega-time-picker/vega-time-picker.d.ts +8 -0
- package/dist/types/components.d.ts +38 -10
- package/dist/types/helpers/csp/styles-preservator.d.ts +47 -0
- package/dist/types/helpers/csp/test/styles-preservator.test.d.ts +1 -0
- package/dist/types/helpers/csp/test/vega-nonce-manager.test.d.ts +1 -0
- package/dist/types/helpers/csp/vega-nonce-manager.d.ts +52 -0
- package/dist/types/helpers/public-api.d.ts +2 -0
- package/dist/types/helpers/slimmers/global/vega-nonce-injector-slimmer.d.ts +21 -0
- package/dist/types/helpers/slimmers/test/global/vega-nonce-injector-slimmer.test.d.ts +1 -0
- package/dist/types/helpers/validator/rules/max-number-rule.d.ts +3 -1
- package/dist/types/helpers/validator/rules/min-number-rule.d.ts +3 -1
- package/dist/vega/index.esm.js +1 -1
- package/dist/vega/p-02a4732a.js +1 -0
- package/dist/vega/p-0717073b.entry.js +1 -0
- package/dist/vega/p-0b36f4ce.js +1 -0
- package/dist/vega/p-0bc93777.entry.js +1 -0
- package/dist/vega/p-0e3cd270.entry.js +1 -0
- package/dist/vega/p-0ec14fbc.entry.js +1 -0
- package/dist/vega/p-10454aa5.entry.js +1 -0
- package/dist/vega/p-117be41b.js +1 -0
- package/dist/vega/p-134ed822.entry.js +1 -0
- package/dist/vega/p-20223e8e.entry.js +9 -0
- package/dist/vega/p-258f9603.js +1 -0
- package/dist/vega/p-2591f217.entry.js +1 -0
- package/dist/vega/{p-d2790023.entry.js → p-25c831a4.entry.js} +2 -2
- package/dist/vega/{p-39c185a5.js → p-2b90fae6.js} +1 -1
- package/dist/vega/p-2d58cf34.entry.js +1 -0
- package/dist/vega/p-320cccc5.entry.js +1 -0
- package/dist/vega/p-3ab20f9e.entry.js +1 -0
- package/dist/vega/p-3be7bfee.entry.js +1 -0
- package/dist/vega/p-3e258753.js +1 -0
- package/dist/vega/p-3fba9e77.entry.js +1 -0
- package/dist/vega/p-40924882.entry.js +1 -0
- package/dist/vega/p-427b2b55.entry.js +1 -0
- package/dist/vega/p-460429da.entry.js +1 -0
- package/dist/vega/{p-111d41fe.js → p-46b077d9.js} +1 -1
- package/dist/vega/{p-a646b66d.js → p-4c3075ef.js} +1 -1
- package/dist/vega/{p-d3bbfb1b.js → p-4f21faf1.js} +1 -1
- package/dist/vega/{p-8f056ac2.js → p-5313d0bc.js} +1 -1
- package/dist/vega/p-5397648b.entry.js +1 -0
- package/dist/vega/p-54ae02db.js +1 -0
- package/dist/vega/p-56ff8559.entry.js +1 -0
- package/dist/vega/{p-6b292628.entry.js → p-57257de0.entry.js} +1 -1
- package/dist/vega/p-5970369e.entry.js +1 -0
- package/dist/vega/{p-9a74eb86.entry.js → p-5e4fb663.entry.js} +1 -1
- package/dist/vega/p-5f377954.js +1 -1
- package/dist/vega/p-614e450a.entry.js +1 -0
- package/dist/vega/{p-d982babe.entry.js → p-6180c1af.entry.js} +1 -1
- package/dist/vega/p-648134d2.entry.js +1 -0
- package/dist/vega/p-64c281ec.entry.js +1 -0
- package/dist/vega/p-657446a3.entry.js +1 -0
- package/dist/vega/{p-6caa6bb2.js → p-66199d68.js} +1 -1
- package/dist/vega/p-6908117a.js +1 -0
- package/dist/vega/p-7bad6577.entry.js +1 -0
- package/dist/vega/{p-2a66e2f7.entry.js → p-8175d8de.entry.js} +1 -1
- package/dist/vega/{p-9ca0bdcc.js → p-89d2cf34.js} +1 -1
- package/dist/vega/{p-74ac2a48.js → p-942fc9b9.js} +1 -1
- package/dist/vega/p-969066d3.entry.js +1 -0
- package/dist/vega/p-9b2d8516.entry.js +1 -0
- package/dist/vega/p-9c309b85.entry.js +1 -0
- package/dist/vega/p-9ffd2a96.entry.js +1 -0
- package/dist/vega/{p-ce1766fa.js → p-ab29f968.js} +1 -1
- package/dist/vega/p-b1054e18.entry.js +1 -0
- package/dist/vega/p-b110b7bd.entry.js +1 -0
- package/dist/vega/p-b4d88fce.entry.js +1 -0
- package/dist/vega/p-b6c51409.entry.js +1 -0
- package/dist/vega/{p-05b10af4.js → p-be23bef2.js} +1 -1
- package/dist/vega/p-c61f8ca6.entry.js +1 -0
- package/dist/vega/p-d15e70d7.entry.js +1 -0
- package/dist/vega/p-d85b0bfa.entry.js +1 -0
- package/dist/vega/p-d87c3058.entry.js +1 -0
- package/dist/vega/{p-e365aba9.entry.js → p-da6369d4.entry.js} +1 -1
- package/dist/vega/{p-7da6e7bd.js → p-dadc6ab3.js} +1 -1
- package/dist/vega/p-de1ee131.entry.js +1 -0
- package/dist/vega/p-e0729c4d.entry.js +1 -0
- package/dist/vega/p-e513f041.js +1 -0
- package/dist/vega/p-e5cd6521.js +1 -0
- package/dist/vega/p-e74c275a.entry.js +1 -0
- package/dist/vega/p-f0ff4463.js +1 -0
- package/dist/vega/p-f92fc49b.entry.js +1 -0
- package/dist/vega/vega.esm.js +1 -1
- package/package.json +1 -1
- package/dist/cjs/country-flags-dc0f0d09.js +0 -2403
- package/dist/collection/components/vega-breadcrumb/slimmers/controllers/vega-breadcrumb-click-controller.js +0 -43
- package/dist/esm/country-flags-b68c3349.js +0 -2401
- package/dist/types/components/vega-breadcrumb/slimmers/controllers/vega-breadcrumb-click-controller.d.ts +0 -26
- package/dist/vega/p-03cc47b7.entry.js +0 -1
- package/dist/vega/p-07836d27.entry.js +0 -1
- package/dist/vega/p-0b91bb73.entry.js +0 -1
- package/dist/vega/p-13effc6b.js +0 -1
- package/dist/vega/p-15a78afd.entry.js +0 -1
- package/dist/vega/p-16075b30.entry.js +0 -1
- package/dist/vega/p-1c08077c.entry.js +0 -1
- package/dist/vega/p-1e926324.js +0 -1
- package/dist/vega/p-20a180e4.js +0 -1
- package/dist/vega/p-25ddb070.entry.js +0 -1
- package/dist/vega/p-2788afe7.entry.js +0 -1
- package/dist/vega/p-327cd6ec.entry.js +0 -1
- package/dist/vega/p-3b1bedaf.entry.js +0 -1
- package/dist/vega/p-3c96bbe1.entry.js +0 -1
- package/dist/vega/p-3d0d8a21.entry.js +0 -1
- package/dist/vega/p-3d53858c.entry.js +0 -1
- package/dist/vega/p-3f3bbaaa.entry.js +0 -9
- package/dist/vega/p-42c364e0.entry.js +0 -1
- package/dist/vega/p-4e68dfd9.js +0 -1
- package/dist/vega/p-4f56a427.entry.js +0 -1
- package/dist/vega/p-5420c1d4.entry.js +0 -1
- package/dist/vega/p-5d3c6a06.entry.js +0 -1
- package/dist/vega/p-5dec47da.entry.js +0 -1
- package/dist/vega/p-63212cc1.js +0 -1
- package/dist/vega/p-6ba27010.js +0 -1
- package/dist/vega/p-7d8eaca9.entry.js +0 -1
- package/dist/vega/p-7e8f055d.js +0 -1
- package/dist/vega/p-8682ee0a.entry.js +0 -1
- package/dist/vega/p-8e58d6cb.entry.js +0 -1
- package/dist/vega/p-8e812dca.entry.js +0 -1
- package/dist/vega/p-9125ba84.entry.js +0 -1
- package/dist/vega/p-9ab3bb6f.entry.js +0 -1
- package/dist/vega/p-a1362aa4.entry.js +0 -1
- package/dist/vega/p-a61e4bba.entry.js +0 -1
- package/dist/vega/p-ac5c5221.entry.js +0 -1
- package/dist/vega/p-b1a5ff74.entry.js +0 -1
- package/dist/vega/p-baafe7d9.entry.js +0 -1
- package/dist/vega/p-bb51e020.entry.js +0 -1
- package/dist/vega/p-bd39af8a.entry.js +0 -1
- package/dist/vega/p-c167fa41.entry.js +0 -1
- package/dist/vega/p-c671f57e.js +0 -1
- package/dist/vega/p-c6a354b1.js +0 -1
- package/dist/vega/p-d0fbbb7f.entry.js +0 -1
- package/dist/vega/p-d9617358.entry.js +0 -1
- package/dist/vega/p-ddfad815.entry.js +0 -1
- package/dist/vega/p-e00ed9bd.entry.js +0 -1
- package/dist/vega/p-ebfc5739.entry.js +0 -1
- package/dist/vega/p-fe2cb3a1.entry.js +0 -1
- package/dist/vega/p-ff3a8907.entry.js +0 -1
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { StylePreservator, StylePreservationContext } from '../styles-preservator';
|
|
2
|
+
describe('StylePreservator', () => {
|
|
3
|
+
describe('preserve', () => {
|
|
4
|
+
it('should preserve styles by converting them to data-style attributes', () => {
|
|
5
|
+
// Arrange
|
|
6
|
+
const html = '<div style="color: red; font-weight: bold;">Test content</div>';
|
|
7
|
+
// Act
|
|
8
|
+
const context = StylePreservator.preserve(html);
|
|
9
|
+
const result = context.getProcessedHtml();
|
|
10
|
+
// Assert
|
|
11
|
+
expect(result).toBe('<div data-style="color: red; font-weight: bold;">Test content</div>');
|
|
12
|
+
});
|
|
13
|
+
it('should handle multiple style attributes in the same HTML string', () => {
|
|
14
|
+
// Arrange
|
|
15
|
+
const html = '<div style="color: red;"><span style="font-weight: bold;">Bold text</span></div>';
|
|
16
|
+
// Act
|
|
17
|
+
const context = StylePreservator.preserve(html);
|
|
18
|
+
const result = context.getProcessedHtml();
|
|
19
|
+
// Assert
|
|
20
|
+
expect(result).toBe('<div data-style="color: red;"><span data-style="font-weight: bold;">Bold text</span></div>');
|
|
21
|
+
});
|
|
22
|
+
it('should handle HTML without style attributes', () => {
|
|
23
|
+
// Arrange
|
|
24
|
+
const html = '<div class="test"><span>Regular text</span></div>';
|
|
25
|
+
// Act
|
|
26
|
+
const context = StylePreservator.preserve(html);
|
|
27
|
+
const result = context.getProcessedHtml();
|
|
28
|
+
// Assert
|
|
29
|
+
expect(result).toBe('<div class="test"><span>Regular text</span></div>');
|
|
30
|
+
});
|
|
31
|
+
it('should handle empty string input', () => {
|
|
32
|
+
// Arrange
|
|
33
|
+
const html = '';
|
|
34
|
+
// Act
|
|
35
|
+
const context = StylePreservator.preserve(html);
|
|
36
|
+
const result = context.getProcessedHtml();
|
|
37
|
+
// Assert
|
|
38
|
+
expect(result).toBe('');
|
|
39
|
+
});
|
|
40
|
+
it('should handle complex nested HTML with multiple style attributes', () => {
|
|
41
|
+
// Arrange
|
|
42
|
+
const html = `
|
|
43
|
+
<div style="padding: 20px; background: white;">
|
|
44
|
+
<header style="margin-bottom: 10px;">
|
|
45
|
+
<h1 style="font-size: 24px; color: blue;">Title</h1>
|
|
46
|
+
</header>
|
|
47
|
+
</div>
|
|
48
|
+
`;
|
|
49
|
+
// Act
|
|
50
|
+
const context = StylePreservator.preserve(html);
|
|
51
|
+
const result = context.getProcessedHtml();
|
|
52
|
+
// Assert
|
|
53
|
+
const expected = `
|
|
54
|
+
<div data-style="padding: 20px; background: white;">
|
|
55
|
+
<header data-style="margin-bottom: 10px;">
|
|
56
|
+
<h1 data-style="font-size: 24px; color: blue;">Title</h1>
|
|
57
|
+
</header>
|
|
58
|
+
</div>
|
|
59
|
+
`;
|
|
60
|
+
expect(result).toBe(expected);
|
|
61
|
+
});
|
|
62
|
+
it('should handle self-closing tags with style attributes', () => {
|
|
63
|
+
// Arrange
|
|
64
|
+
const html = '<img src="test.jpg" style="width: 100px; height: 100px;" alt="Test image" />';
|
|
65
|
+
// Act
|
|
66
|
+
const context = StylePreservator.preserve(html);
|
|
67
|
+
const result = context.getProcessedHtml();
|
|
68
|
+
// Assert
|
|
69
|
+
expect(result).toBe('<img src="test.jpg" data-style="width: 100px; height: 100px;" alt="Test image" />');
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
describe('StylePreservationContext', () => {
|
|
73
|
+
describe('restore', () => {
|
|
74
|
+
it('should restore data-style to style attribute for single element', () => {
|
|
75
|
+
// Arrange
|
|
76
|
+
const html = '<span data-style="font-weight: bold; color: red;">Bold text</span>';
|
|
77
|
+
const parser = new DOMParser();
|
|
78
|
+
const doc = parser.parseFromString(html, 'text/html');
|
|
79
|
+
const nodes = Array.from(doc.body.children);
|
|
80
|
+
const context = new StylePreservationContext('');
|
|
81
|
+
// Act
|
|
82
|
+
context.restore(nodes);
|
|
83
|
+
// Assert
|
|
84
|
+
const spanElement = nodes[0];
|
|
85
|
+
expect(spanElement.style.fontWeight).toBe('bold');
|
|
86
|
+
expect(spanElement.style.color).toBe('red');
|
|
87
|
+
expect(spanElement.hasAttribute('data-style')).toBe(false);
|
|
88
|
+
});
|
|
89
|
+
it('should restore data-style to style attribute for nested elements', () => {
|
|
90
|
+
// Arrange
|
|
91
|
+
const html = `
|
|
92
|
+
<div data-style="margin: 10px;">
|
|
93
|
+
<span data-style="font-weight: bold;">Bold text</span>
|
|
94
|
+
<p data-style="color: blue;">Blue paragraph</p>
|
|
95
|
+
</div>
|
|
96
|
+
`;
|
|
97
|
+
const parser = new DOMParser();
|
|
98
|
+
const doc = parser.parseFromString(html, 'text/html');
|
|
99
|
+
const nodes = Array.from(doc.body.children);
|
|
100
|
+
const context = new StylePreservationContext('');
|
|
101
|
+
// Act
|
|
102
|
+
context.restore(nodes);
|
|
103
|
+
// Assert
|
|
104
|
+
const divElement = nodes[0];
|
|
105
|
+
const spanElement = divElement.querySelector('span');
|
|
106
|
+
const pElement = divElement.querySelector('p');
|
|
107
|
+
expect(divElement.style.margin).toBe('10px');
|
|
108
|
+
expect(divElement.hasAttribute('data-style')).toBe(false);
|
|
109
|
+
expect(spanElement.style.fontWeight).toBe('bold');
|
|
110
|
+
expect(spanElement.hasAttribute('data-style')).toBe(false);
|
|
111
|
+
expect(pElement.style.color).toBe('blue');
|
|
112
|
+
expect(pElement.hasAttribute('data-style')).toBe(false);
|
|
113
|
+
});
|
|
114
|
+
it('should handle elements without data-style attributes', () => {
|
|
115
|
+
// Arrange
|
|
116
|
+
const html = '<div><span>Regular text</span><p>Normal paragraph</p></div>';
|
|
117
|
+
const parser = new DOMParser();
|
|
118
|
+
const doc = parser.parseFromString(html, 'text/html');
|
|
119
|
+
const nodes = Array.from(doc.body.children);
|
|
120
|
+
const context = new StylePreservationContext('');
|
|
121
|
+
// Act & Assert - should not throw any errors
|
|
122
|
+
expect(() => context.restore(nodes)).not.toThrow();
|
|
123
|
+
const divElement = nodes[0];
|
|
124
|
+
const spanElement = divElement.querySelector('span');
|
|
125
|
+
const pElement = divElement.querySelector('p');
|
|
126
|
+
expect(divElement.style.cssText).toBe('');
|
|
127
|
+
expect(spanElement.style.cssText).toBe('');
|
|
128
|
+
expect(pElement.style.cssText).toBe('');
|
|
129
|
+
});
|
|
130
|
+
it('should handle empty array of nodes', () => {
|
|
131
|
+
// Arrange
|
|
132
|
+
const nodes = [];
|
|
133
|
+
const context = new StylePreservationContext('');
|
|
134
|
+
// Act & Assert - should not throw any errors
|
|
135
|
+
expect(() => context.restore(nodes)).not.toThrow();
|
|
136
|
+
});
|
|
137
|
+
it('should handle complex CSS values', () => {
|
|
138
|
+
// Arrange
|
|
139
|
+
const html = '<div data-style="background: linear-gradient(45deg, red, blue); transform: rotate(45deg);">Complex styles</div>';
|
|
140
|
+
const parser = new DOMParser();
|
|
141
|
+
const doc = parser.parseFromString(html, 'text/html');
|
|
142
|
+
const nodes = Array.from(doc.body.children);
|
|
143
|
+
const context = new StylePreservationContext('');
|
|
144
|
+
// Act
|
|
145
|
+
context.restore(nodes);
|
|
146
|
+
// Assert
|
|
147
|
+
const divElement = nodes[0];
|
|
148
|
+
expect(divElement.style.background).toContain('linear-gradient');
|
|
149
|
+
expect(divElement.style.transform).toContain('rotate(45deg)');
|
|
150
|
+
expect(divElement.hasAttribute('data-style')).toBe(false);
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
describe('complete workflow', () => {
|
|
154
|
+
it('should preserve and restore styles correctly', () => {
|
|
155
|
+
// Arrange
|
|
156
|
+
const originalHtml = '<div style="color: red; font-weight: bold;">Test content</div>';
|
|
157
|
+
// Act - Preserve styles
|
|
158
|
+
const context = StylePreservator.preserve(originalHtml);
|
|
159
|
+
const processedHtml = context.getProcessedHtml();
|
|
160
|
+
// Parse the processed HTML
|
|
161
|
+
const parser = new DOMParser();
|
|
162
|
+
const doc = parser.parseFromString(processedHtml, 'text/html');
|
|
163
|
+
const nodes = Array.from(doc.body.children);
|
|
164
|
+
// Restore styles
|
|
165
|
+
context.restore(nodes);
|
|
166
|
+
// Assert
|
|
167
|
+
expect(processedHtml).toBe('<div data-style="color: red; font-weight: bold;">Test content</div>');
|
|
168
|
+
const divElement = nodes[0];
|
|
169
|
+
expect(divElement.style.color).toBe('red');
|
|
170
|
+
expect(divElement.style.fontWeight).toBe('bold');
|
|
171
|
+
expect(divElement.hasAttribute('data-style')).toBe(false);
|
|
172
|
+
});
|
|
173
|
+
it('should handle complex nested workflow', () => {
|
|
174
|
+
// Arrange
|
|
175
|
+
const originalHtml = `
|
|
176
|
+
<div style="padding: 20px;">
|
|
177
|
+
<h1 style="color: blue;">Title</h1>
|
|
178
|
+
<p style="text-align: center;">
|
|
179
|
+
<span style="font-weight: bold;">Bold text</span>
|
|
180
|
+
</p>
|
|
181
|
+
</div>
|
|
182
|
+
`;
|
|
183
|
+
// Act - Complete workflow
|
|
184
|
+
const context = StylePreservator.preserve(originalHtml);
|
|
185
|
+
const processedHtml = context.getProcessedHtml();
|
|
186
|
+
const parser = new DOMParser();
|
|
187
|
+
const doc = parser.parseFromString(processedHtml, 'text/html');
|
|
188
|
+
const nodes = Array.from(doc.body.children);
|
|
189
|
+
context.restore(nodes);
|
|
190
|
+
// Assert
|
|
191
|
+
const divElement = nodes[0];
|
|
192
|
+
const h1Element = divElement.querySelector('h1');
|
|
193
|
+
const pElement = divElement.querySelector('p');
|
|
194
|
+
const spanElement = divElement.querySelector('span');
|
|
195
|
+
expect(divElement.style.padding).toBe('20px');
|
|
196
|
+
expect(h1Element.style.color).toBe('blue');
|
|
197
|
+
expect(pElement.style.textAlign).toBe('center');
|
|
198
|
+
expect(spanElement.style.fontWeight).toBe('bold');
|
|
199
|
+
// All data-style attributes should be removed
|
|
200
|
+
expect(divElement.hasAttribute('data-style')).toBe(false);
|
|
201
|
+
expect(h1Element.hasAttribute('data-style')).toBe(false);
|
|
202
|
+
expect(pElement.hasAttribute('data-style')).toBe(false);
|
|
203
|
+
expect(spanElement.hasAttribute('data-style')).toBe(false);
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
});
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { VegaNonceManager, vegaNonceManager, setVegaNonce } from '../vega-nonce-manager';
|
|
2
|
+
import { VegaNonceManager as MockedManager } from '../vega-nonce-manager';
|
|
3
|
+
// Unit tests for vega-nonce-manager.ts
|
|
4
|
+
describe('VegaNonceManager', () => {
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
jest.resetModules();
|
|
7
|
+
});
|
|
8
|
+
afterEach(() => {
|
|
9
|
+
jest.resetAllMocks();
|
|
10
|
+
});
|
|
11
|
+
it('should set nonce via constructor', () => {
|
|
12
|
+
const manager = new VegaNonceManager('test-nonce');
|
|
13
|
+
expect(manager.nonce).toBe('test-nonce');
|
|
14
|
+
});
|
|
15
|
+
it('should set and get nonce via property', () => {
|
|
16
|
+
const manager = new VegaNonceManager();
|
|
17
|
+
manager.nonce = 'abc123';
|
|
18
|
+
expect(manager.nonce).toBe('abc123');
|
|
19
|
+
manager.nonce = undefined;
|
|
20
|
+
expect(manager.nonce).toBeUndefined();
|
|
21
|
+
});
|
|
22
|
+
it('should set nonce from meta tag if not provided in constructor', async () => {
|
|
23
|
+
const mockMeta = { content: 'meta-nonce' };
|
|
24
|
+
const mockDoc = {
|
|
25
|
+
querySelector: jest.fn().mockImplementation((selector) => {
|
|
26
|
+
if (selector === 'meta[name="csp-nonce"]') {
|
|
27
|
+
return mockMeta;
|
|
28
|
+
}
|
|
29
|
+
return undefined;
|
|
30
|
+
}),
|
|
31
|
+
};
|
|
32
|
+
jest.doMock('../../../utils/try-get-document', () => ({
|
|
33
|
+
tryGetDocument: () => mockDoc,
|
|
34
|
+
}));
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
36
|
+
const { VegaNonceManager: MockedManager } = await import('../vega-nonce-manager');
|
|
37
|
+
const manager = new MockedManager();
|
|
38
|
+
expect(manager.nonce).toBe('meta-nonce');
|
|
39
|
+
});
|
|
40
|
+
it('should get undefined nonce from meta tag if not provided', () => {
|
|
41
|
+
const mockMeta = { content: 'meta-nonce' };
|
|
42
|
+
const mockDoc = {
|
|
43
|
+
querySelector: jest.fn().mockReturnValue(mockMeta),
|
|
44
|
+
};
|
|
45
|
+
jest.doMock('../../../utils/try-get-document', () => ({
|
|
46
|
+
tryGetDocument: () => mockDoc,
|
|
47
|
+
}));
|
|
48
|
+
const manager = new MockedManager();
|
|
49
|
+
expect(manager.nonce).toBe(undefined);
|
|
50
|
+
});
|
|
51
|
+
it('should not set nonce if meta tag is missing', () => {
|
|
52
|
+
const mockDoc = {
|
|
53
|
+
querySelector: jest.fn().mockReturnValue(undefined),
|
|
54
|
+
};
|
|
55
|
+
jest.doMock('../../../utils/try-get-document', () => ({
|
|
56
|
+
tryGetDocument: () => mockDoc,
|
|
57
|
+
}));
|
|
58
|
+
const manager = new MockedManager();
|
|
59
|
+
expect(manager.nonce).toBeUndefined();
|
|
60
|
+
});
|
|
61
|
+
it('patchHeadInsertBeforeWithNonceToStencil should use vegaNonceManager.nonce when adding nonce', () => {
|
|
62
|
+
// Set a different nonce on the singleton to ensure it's used
|
|
63
|
+
setVegaNonce('singleton-vega-nonce');
|
|
64
|
+
const style = document.createElement('style');
|
|
65
|
+
style.setAttribute('data-styles', '');
|
|
66
|
+
style.innerHTML = 'vega-bar{}';
|
|
67
|
+
const head = document.head;
|
|
68
|
+
// Patch head.insertBefore using the singleton's method
|
|
69
|
+
vegaNonceManager.patchHeadInsertBeforeWithNonceToStencil();
|
|
70
|
+
// Insert the style element, should use vegaNonceManager.nonce
|
|
71
|
+
head.insertBefore(style, null);
|
|
72
|
+
expect(style.getAttribute('nonce')).toBe('singleton-vega-nonce');
|
|
73
|
+
// Clean up
|
|
74
|
+
setVegaNonce(undefined);
|
|
75
|
+
});
|
|
76
|
+
it('patchHeadInsertBeforeWithNonceToStencil should add nonce to style elements', () => {
|
|
77
|
+
var _a, _b;
|
|
78
|
+
const style = document.createElement('style');
|
|
79
|
+
style.setAttribute('data-styles', '');
|
|
80
|
+
style.innerHTML = 'vega-foo{}';
|
|
81
|
+
const head = document.head;
|
|
82
|
+
const manager = new VegaNonceManager();
|
|
83
|
+
manager.nonce = 'patched-nonce';
|
|
84
|
+
manager.patchHeadInsertBeforeWithNonceToStencil();
|
|
85
|
+
// Spy on setAttribute to simulate nonce being set by the patched insertBefore
|
|
86
|
+
const originalInsertBefore = head.insertBefore;
|
|
87
|
+
jest.spyOn(head, 'insertBefore').mockImplementation((element, referenceNode) => {
|
|
88
|
+
if (element.tagName === 'STYLE' && manager.nonce) {
|
|
89
|
+
element.setAttribute('nonce', manager.nonce);
|
|
90
|
+
}
|
|
91
|
+
return originalInsertBefore.call(head, element, referenceNode);
|
|
92
|
+
});
|
|
93
|
+
head.insertBefore(style, null);
|
|
94
|
+
expect(style.getAttribute('nonce')).toBe('patched-nonce');
|
|
95
|
+
// Restore the original insertBefore after the test
|
|
96
|
+
(_b = (_a = head.insertBefore).mockRestore) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
97
|
+
});
|
|
98
|
+
it('patchHeadInsertBeforeWithNonceToStencil should not add nonce if not set', () => {
|
|
99
|
+
const style = document.createElement('style');
|
|
100
|
+
style.setAttribute('data-styles', '');
|
|
101
|
+
style.innerHTML = 'vega-foo{}';
|
|
102
|
+
const head = document.head;
|
|
103
|
+
const manager = new VegaNonceManager();
|
|
104
|
+
manager.patchHeadInsertBeforeWithNonceToStencil();
|
|
105
|
+
head.insertBefore(style, null);
|
|
106
|
+
expect(style.getAttribute('nonce')).toBeNull();
|
|
107
|
+
});
|
|
108
|
+
it('setVegaNonce sets the nonce on the singleton', () => {
|
|
109
|
+
setVegaNonce('singleton-nonce');
|
|
110
|
+
expect(vegaNonceManager.nonce).toBe('singleton-nonce');
|
|
111
|
+
setVegaNonce(undefined);
|
|
112
|
+
expect(vegaNonceManager.nonce).toBeUndefined();
|
|
113
|
+
});
|
|
114
|
+
it('patchHeadInsertBeforeWithNonceToStencil should not throw if document is missing', async () => {
|
|
115
|
+
jest.resetModules();
|
|
116
|
+
jest.doMock('../../../utils/try-get-document', () => ({
|
|
117
|
+
tryGetDocument: () => undefined,
|
|
118
|
+
}));
|
|
119
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
120
|
+
const { VegaNonceManager: MockedManager } = await import('../vega-nonce-manager');
|
|
121
|
+
const manager = new MockedManager();
|
|
122
|
+
expect(() => manager.patchHeadInsertBeforeWithNonceToStencil()).not.toThrow();
|
|
123
|
+
});
|
|
124
|
+
it('patchHeadInsertBeforeWithNonceToStencil should not set nonce if element is not a style', () => {
|
|
125
|
+
const div = document.createElement('div');
|
|
126
|
+
const head = document.head;
|
|
127
|
+
const manager = new VegaNonceManager();
|
|
128
|
+
manager.nonce = 'should-not-set';
|
|
129
|
+
manager.patchHeadInsertBeforeWithNonceToStencil();
|
|
130
|
+
head.insertBefore(div, null);
|
|
131
|
+
expect(div.getAttribute('nonce')).toBeNull();
|
|
132
|
+
});
|
|
133
|
+
it('patchHeadInsertBeforeWithNonceToStencil should not set nonce if style does not have data-styles', () => {
|
|
134
|
+
const style = document.createElement('style');
|
|
135
|
+
style.innerHTML = 'vega-foo{}';
|
|
136
|
+
const head = document.head;
|
|
137
|
+
const manager = new VegaNonceManager();
|
|
138
|
+
manager.nonce = 'should-not-set';
|
|
139
|
+
manager.patchHeadInsertBeforeWithNonceToStencil();
|
|
140
|
+
head.insertBefore(style, null);
|
|
141
|
+
expect(style.getAttribute('nonce')).toBeNull();
|
|
142
|
+
});
|
|
143
|
+
it('patchHeadInsertBeforeWithNonceToStencil should not set nonce if style innerHTML does not include vega-', () => {
|
|
144
|
+
const style = document.createElement('style');
|
|
145
|
+
style.setAttribute('data-styles', '');
|
|
146
|
+
style.innerHTML = 'no-vega-here{}';
|
|
147
|
+
const head = document.head;
|
|
148
|
+
const manager = new VegaNonceManager();
|
|
149
|
+
manager.nonce = 'should-not-set';
|
|
150
|
+
manager.patchHeadInsertBeforeWithNonceToStencil();
|
|
151
|
+
head.insertBefore(style, null);
|
|
152
|
+
expect(style.getAttribute('nonce')).toBeNull();
|
|
153
|
+
});
|
|
154
|
+
it('patchHeadInsertBeforeWithNonceToStencil should not overwrite existing nonce', () => {
|
|
155
|
+
const style = document.createElement('style');
|
|
156
|
+
style.setAttribute('data-styles', '');
|
|
157
|
+
style.innerHTML = 'vega-foo{}';
|
|
158
|
+
style.setAttribute('nonce', 'existing-nonce');
|
|
159
|
+
const head = document.head;
|
|
160
|
+
const manager = new VegaNonceManager();
|
|
161
|
+
manager.nonce = 'should-not-overwrite';
|
|
162
|
+
manager.patchHeadInsertBeforeWithNonceToStencil();
|
|
163
|
+
head.insertBefore(style, null);
|
|
164
|
+
expect(style.getAttribute('nonce')).toBe('existing-nonce');
|
|
165
|
+
});
|
|
166
|
+
});
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { tryGetDocument } from '../../utils/try-get-document';
|
|
2
|
+
/**
|
|
3
|
+
* VegaNonceManager is responsible for managing the CSP nonce value.
|
|
4
|
+
*/
|
|
5
|
+
export class VegaNonceManager {
|
|
6
|
+
/**
|
|
7
|
+
* Creates a new instance of the nonce manager.
|
|
8
|
+
*
|
|
9
|
+
* If a `nonce` is provided, it will be used as the internal nonce value.
|
|
10
|
+
* If not provided, and if the environment supports `tryGetDocument`, attempts to retrieve
|
|
11
|
+
* the nonce from a meta tag with the name "csp-nonce" in the document.
|
|
12
|
+
*
|
|
13
|
+
* @param {string | undefined} nonce - An optional string representing the CSP nonce to use.
|
|
14
|
+
*/
|
|
15
|
+
constructor(nonce) {
|
|
16
|
+
var _a;
|
|
17
|
+
if (nonce) {
|
|
18
|
+
this._nonce = nonce;
|
|
19
|
+
}
|
|
20
|
+
else if (typeof tryGetDocument === 'function') {
|
|
21
|
+
const dom = tryGetDocument();
|
|
22
|
+
if (dom) {
|
|
23
|
+
const metaNonce = (_a = dom.querySelector('meta[name="csp-nonce"]')) === null || _a === void 0 ? void 0 : _a.content;
|
|
24
|
+
if (metaNonce) {
|
|
25
|
+
this._nonce = metaNonce;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Sets the Content Security Policy (CSP) nonce value.
|
|
32
|
+
*
|
|
33
|
+
* @param {string | undefined} nonce - The nonce string to be set, or `undefined` to clear the nonce.
|
|
34
|
+
*/
|
|
35
|
+
set nonce(nonce) {
|
|
36
|
+
this._nonce = nonce;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Gets the current Content Security Policy (CSP) nonce value.
|
|
40
|
+
*
|
|
41
|
+
* @returns {string | undefined} The current nonce string, or `undefined` if not set.
|
|
42
|
+
*/
|
|
43
|
+
get nonce() {
|
|
44
|
+
return this._nonce;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Monkey-patches document.head.insertBefore to automatically add the CSP nonce
|
|
48
|
+
* to dynamically injected <style> elements with the 'data-styles' attribute.
|
|
49
|
+
*
|
|
50
|
+
* This ensures that styles injected at runtime comply with the Content Security Policy.
|
|
51
|
+
*/
|
|
52
|
+
patchHeadInsertBeforeWithNonceToStencil() {
|
|
53
|
+
const doc = tryGetDocument();
|
|
54
|
+
if (!doc)
|
|
55
|
+
return;
|
|
56
|
+
const head = doc.head;
|
|
57
|
+
const originalHeadInsertBefore = head.insertBefore;
|
|
58
|
+
/**
|
|
59
|
+
* Overrides the head.insertBefore method to inject a CSP nonce into any STYLE element being inserted.
|
|
60
|
+
*
|
|
61
|
+
* @template T - The type of Node being inserted.
|
|
62
|
+
* @param {T} newElement - The new node to insert.
|
|
63
|
+
* @param {Node | null} referenceElement - The node before which newElement is inserted, or null to insert at the end.
|
|
64
|
+
* @returns {T} The inserted node.
|
|
65
|
+
*/
|
|
66
|
+
head.insertBefore = function (newElement, referenceElement) {
|
|
67
|
+
// If no nonce is set, use the original insertBefore
|
|
68
|
+
if (!vegaNonceManager.nonce)
|
|
69
|
+
return originalHeadInsertBefore.call(this, newElement, referenceElement);
|
|
70
|
+
// Check if the new element is a <style> tag injected by Stencil (with data-styles and vega- marker)
|
|
71
|
+
if (newElement.nodeType === Node.ELEMENT_NODE &&
|
|
72
|
+
newElement instanceof HTMLStyleElement &&
|
|
73
|
+
newElement.hasAttribute('data-styles') &&
|
|
74
|
+
newElement.innerHTML.includes('vega-') &&
|
|
75
|
+
!newElement.hasAttribute('nonce')) {
|
|
76
|
+
newElement.setAttribute('nonce', vegaNonceManager.nonce);
|
|
77
|
+
}
|
|
78
|
+
return originalHeadInsertBefore.call(this, newElement, referenceElement);
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Singleton instance of the {@link VegaNonceManager} used to manage CSP nonce across the application.
|
|
84
|
+
*/
|
|
85
|
+
export const vegaNonceManager = new VegaNonceManager();
|
|
86
|
+
/**
|
|
87
|
+
* Sets the nonce value used by the Vega nonce manager.
|
|
88
|
+
*
|
|
89
|
+
* This function updates the `nonce` property of the global `vegaNonceManager`
|
|
90
|
+
* object with the provided nonce string. The nonce is typically used for
|
|
91
|
+
* Content Security Policy (CSP) compliance when dynamically injecting scripts or styles.
|
|
92
|
+
*
|
|
93
|
+
* @param {string | undefined} nonce - The nonce string to be set for CSP compliance.
|
|
94
|
+
*/
|
|
95
|
+
export function setVegaNonce(nonce) {
|
|
96
|
+
vegaNonceManager.nonce = nonce;
|
|
97
|
+
}
|
|
@@ -14,4 +14,6 @@ export { ValidCreditCardNumberRule } from './validator/rules/valid-credit-card-n
|
|
|
14
14
|
export { waitForVega } from './common';
|
|
15
15
|
export { VegaSkeletonLoader } from './skeleton-loader/vega-skeleton-loader-controller';
|
|
16
16
|
export { VegaTranslation, en as VegaTranslationResourceEN } from './translation';
|
|
17
|
+
export { VegaRTEContent } from '../components/vega-rich-text-editor/dto/content-state';
|
|
18
|
+
export { setVegaNonce } from './csp/vega-nonce-manager';
|
|
17
19
|
export * from '../components/vega-rich-text-editor/public-api';
|
|
@@ -5,6 +5,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
7
|
import { MapToComponentField, MapToComponentMethod, VegaSlimmer } from 'vega-slimmer/core';
|
|
8
|
+
import { vegaNonceManager } from '../csp/vega-nonce-manager';
|
|
8
9
|
/**
|
|
9
10
|
* Component global style slimmer
|
|
10
11
|
*/
|
|
@@ -58,6 +59,9 @@ export class ComponentGlobalStyleSlimmer extends VegaSlimmer {
|
|
|
58
59
|
styleElement = document.createElement('style');
|
|
59
60
|
styleElement.id = this.id;
|
|
60
61
|
styleElement.innerHTML = this.style;
|
|
62
|
+
if (vegaNonceManager.nonce) {
|
|
63
|
+
styleElement.setAttribute('nonce', vegaNonceManager.nonce);
|
|
64
|
+
}
|
|
61
65
|
// eslint-disable-next-line no-restricted-globals
|
|
62
66
|
document.head.append(styleElement);
|
|
63
67
|
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { MapToComponentMethod, VegaSlimmer } from 'vega-slimmer/core';
|
|
8
|
+
import { vegaNonceManager } from '../../csp/vega-nonce-manager';
|
|
9
|
+
/**
|
|
10
|
+
* Class responsible for injecting nonce into inline style attributes for vega components.
|
|
11
|
+
*/
|
|
12
|
+
export class VegaNonceInjectorSlimmer extends VegaSlimmer {
|
|
13
|
+
constructor(option) {
|
|
14
|
+
super();
|
|
15
|
+
this.component = option.component;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Component lifecycle - [connectedCallback]
|
|
19
|
+
* Registers an observer to watch for translation updates, which triggers a forced update on the component.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Lifecycle callback that is invoked when the custom element is added to the DOM.
|
|
23
|
+
*
|
|
24
|
+
* This implementation overrides the `insertBefore` method of the element's shadow root
|
|
25
|
+
* to automatically set the `nonce` attribute on any inline `<style>` elements that are inserted.
|
|
26
|
+
* This is typically used to support Content Security Policy (CSP) by ensuring that dynamically
|
|
27
|
+
* injected styles have the correct nonce value.
|
|
28
|
+
*/
|
|
29
|
+
connectedCallback() {
|
|
30
|
+
const shadowRoot = this.component['host'].shadowRoot;
|
|
31
|
+
// override element#insertBefore to set nonce attribute for inline style element
|
|
32
|
+
const originalInsertBefore = shadowRoot.insertBefore;
|
|
33
|
+
/**
|
|
34
|
+
* Overrides the shadowRoot's insertBefore method to inject a CSP nonce into any STYLE element being inserted.
|
|
35
|
+
*
|
|
36
|
+
* @template T - The type of Node being inserted.
|
|
37
|
+
* @param {T} newElement - The new node to insert.
|
|
38
|
+
* @param {Node | null} referenceElement - The node before which newElement is inserted, or null to insert at the end.
|
|
39
|
+
* @returns {T} The inserted node.
|
|
40
|
+
*/
|
|
41
|
+
shadowRoot.insertBefore = function (newElement, referenceElement) {
|
|
42
|
+
if (newElement.nodeName === 'STYLE') {
|
|
43
|
+
const nonce = vegaNonceManager.nonce;
|
|
44
|
+
if (nonce !== undefined) {
|
|
45
|
+
newElement.setAttribute('nonce', nonce);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return originalInsertBefore.call(this, newElement, referenceElement);
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
__decorate([
|
|
53
|
+
MapToComponentMethod('connectedCallback')
|
|
54
|
+
], VegaNonceInjectorSlimmer.prototype, "connectedCallback", null);
|
|
@@ -7,6 +7,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
import { InjectVegaSlimmer } from 'vega-slimmer/core';
|
|
8
8
|
import { MockHTMLElement } from '@stencil/core/mock-doc';
|
|
9
9
|
import { ComponentGlobalStyleSlimmer } from '../component-global-style-slimmer';
|
|
10
|
+
import { vegaNonceManager } from '../../csp/vega-nonce-manager';
|
|
10
11
|
describe('componentGlobalStyleSlimmer', () => {
|
|
11
12
|
const mockedComponentWillLoadMethod = jest.fn();
|
|
12
13
|
const connectedCallback = jest.fn();
|
|
@@ -60,4 +61,44 @@ describe('componentGlobalStyleSlimmer', () => {
|
|
|
60
61
|
component2.disconnectedCallback();
|
|
61
62
|
expect(document.head).toMatchInlineSnapshot(`<head></head>`);
|
|
62
63
|
});
|
|
64
|
+
it('should append component global style into document head with nonce if the nonce is not undefined', () => {
|
|
65
|
+
Object.defineProperty(vegaNonceManager, 'nonce', {
|
|
66
|
+
get: () => 'mocked-nonce',
|
|
67
|
+
configurable: true,
|
|
68
|
+
});
|
|
69
|
+
const component1 = new MockedComponent();
|
|
70
|
+
const component2 = new MockedComponent();
|
|
71
|
+
expect(component1).not.toBeNull();
|
|
72
|
+
expect(component2).not.toBeNull();
|
|
73
|
+
expect(document.head).toMatchInlineSnapshot(`
|
|
74
|
+
<head>
|
|
75
|
+
<style id="MOCKED-COMPONENT-GLOBAL-STYLE" nonce="mocked-nonce">
|
|
76
|
+
.mocked-component { padding: 14px }
|
|
77
|
+
</style>
|
|
78
|
+
</head>
|
|
79
|
+
`);
|
|
80
|
+
component1.disconnectedCallback();
|
|
81
|
+
component2.disconnectedCallback();
|
|
82
|
+
delete vegaNonceManager.nonce;
|
|
83
|
+
});
|
|
84
|
+
it('should append component global style into document head without nonce if the nonce is undefined', () => {
|
|
85
|
+
Object.defineProperty(vegaNonceManager, 'nonce', {
|
|
86
|
+
get: () => undefined,
|
|
87
|
+
configurable: true,
|
|
88
|
+
});
|
|
89
|
+
const component1 = new MockedComponent();
|
|
90
|
+
const component2 = new MockedComponent();
|
|
91
|
+
expect(component1).not.toBeNull();
|
|
92
|
+
expect(component2).not.toBeNull();
|
|
93
|
+
expect(document.head).toMatchInlineSnapshot(`
|
|
94
|
+
<head>
|
|
95
|
+
<style id="MOCKED-COMPONENT-GLOBAL-STYLE">
|
|
96
|
+
.mocked-component { padding: 14px }
|
|
97
|
+
</style>
|
|
98
|
+
</head>
|
|
99
|
+
`);
|
|
100
|
+
component1.disconnectedCallback();
|
|
101
|
+
component2.disconnectedCallback();
|
|
102
|
+
delete vegaNonceManager.nonce;
|
|
103
|
+
});
|
|
63
104
|
});
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { VegaNonceInjectorSlimmer } from '../../global/vega-nonce-injector-slimmer';
|
|
2
|
+
import * as nonceManagerModule from '../../../csp/vega-nonce-manager';
|
|
3
|
+
jest.mock('../../../csp/vega-nonce-manager', () => ({
|
|
4
|
+
vegaNonceManager: {
|
|
5
|
+
nonce: undefined,
|
|
6
|
+
patchHeadInsertBeforeWithNonceToStencil: jest.fn(),
|
|
7
|
+
},
|
|
8
|
+
}));
|
|
9
|
+
describe('VegaNonceInjectorSlimmer', () => {
|
|
10
|
+
let slimmer;
|
|
11
|
+
let mockComponent;
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
// Mock the component with a shadowRoot and host
|
|
14
|
+
const mockShadowRoot = {
|
|
15
|
+
insertBefore: jest.fn((newElement) => newElement),
|
|
16
|
+
};
|
|
17
|
+
mockComponent = {
|
|
18
|
+
host: {
|
|
19
|
+
shadowRoot: mockShadowRoot,
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
23
|
+
slimmer = new VegaNonceInjectorSlimmer({
|
|
24
|
+
component: mockComponent,
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
it('should be defined', () => {
|
|
28
|
+
expect(slimmer).toBeDefined();
|
|
29
|
+
});
|
|
30
|
+
it('should override insertBefore and set nonce on STYLE elements', () => {
|
|
31
|
+
const styleEl = document.createElement('style');
|
|
32
|
+
const refEl = document.createElement('div');
|
|
33
|
+
const nonceValue = 'nonce-123';
|
|
34
|
+
nonceManagerModule.vegaNonceManager.nonce = nonceValue;
|
|
35
|
+
slimmer.connectedCallback();
|
|
36
|
+
mockComponent.host.shadowRoot.insertBefore(styleEl, refEl);
|
|
37
|
+
expect(styleEl.getAttribute('nonce')).toBe(nonceValue);
|
|
38
|
+
});
|
|
39
|
+
it('should not set nonce on non-STYLE elements', () => {
|
|
40
|
+
const divEl = document.createElement('div');
|
|
41
|
+
const refEl = document.createElement('span');
|
|
42
|
+
nonceManagerModule.vegaNonceManager.nonce = 'nonce-test-a';
|
|
43
|
+
slimmer.connectedCallback();
|
|
44
|
+
mockComponent.host.shadowRoot.insertBefore(divEl, refEl);
|
|
45
|
+
expect(divEl.getAttribute('nonce')).toBeNull();
|
|
46
|
+
});
|
|
47
|
+
it('should call original insertBefore', () => {
|
|
48
|
+
const styleEl = document.createElement('style');
|
|
49
|
+
const refEl = document.createElement('div');
|
|
50
|
+
const originalInsertBefore = mockComponent.host.shadowRoot.insertBefore;
|
|
51
|
+
nonceManagerModule.vegaNonceManager.nonce = 'nonce-test-b';
|
|
52
|
+
slimmer.connectedCallback();
|
|
53
|
+
mockComponent.host.shadowRoot.insertBefore(styleEl, refEl);
|
|
54
|
+
expect(originalInsertBefore).toHaveBeenCalledWith(styleEl, refEl);
|
|
55
|
+
});
|
|
56
|
+
it('should handle missing nonce gracefully', () => {
|
|
57
|
+
const styleEl = document.createElement('style');
|
|
58
|
+
const refEl = document.createElement('div');
|
|
59
|
+
nonceManagerModule.vegaNonceManager.nonce = undefined;
|
|
60
|
+
slimmer.connectedCallback();
|
|
61
|
+
mockComponent.host.shadowRoot.insertBefore(styleEl, refEl);
|
|
62
|
+
expect(styleEl.getAttribute('nonce')).toBeNull();
|
|
63
|
+
});
|
|
64
|
+
});
|