summaryrefslogtreecommitdiff
path: root/node_modules/doiuse
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2023-10-14 15:50:21 +0800
committerlittleblack111 <littleblack11111@gmail.com>2023-10-14 15:50:21 +0800
commit0379526e20e1ff212df23e6326741aa9c06df204 (patch)
tree340143b0c4dc4280c88ba1591d137b53477005b3 /node_modules/doiuse
parent7aba14fb7c970c6e6af82c805db2aef6d70bfe2b (diff)
added doiuse plugin for postcss
Diffstat (limited to 'node_modules/doiuse')
-rw-r--r--node_modules/doiuse/LICENSE22
-rw-r--r--node_modules/doiuse/README.md172
-rwxr-xr-xnode_modules/doiuse/bin/cli.js161
-rw-r--r--node_modules/doiuse/data/.eslintrc.json18
-rw-r--r--node_modules/doiuse/data/features.js425
-rw-r--r--node_modules/doiuse/data/features/alternate-stylesheet.js12
-rw-r--r--node_modules/doiuse/data/features/background-attachment.js15
-rw-r--r--node_modules/doiuse/data/features/background-clip-text.js13
-rw-r--r--node_modules/doiuse/data/features/background-img-opts.js5
-rw-r--r--node_modules/doiuse/data/features/background-position-x-y.js4
-rw-r--r--node_modules/doiuse/data/features/background-repeat-round-space.js12
-rw-r--r--node_modules/doiuse/data/features/border-image.js9
-rw-r--r--node_modules/doiuse/data/features/border-radius.js7
-rw-r--r--node_modules/doiuse/data/features/calc.js3
-rw-r--r--node_modules/doiuse/data/features/ch-unit.js8
-rw-r--r--node_modules/doiuse/data/features/css-all.js3
-rw-r--r--node_modules/doiuse/data/features/css-animation.js14
-rw-r--r--node_modules/doiuse/data/features/css-any-link.js3
-rw-r--r--node_modules/doiuse/data/features/css-appearance.js5
-rw-r--r--node_modules/doiuse/data/features/css-at-counter-style.js3
-rw-r--r--node_modules/doiuse/data/features/css-autofill.js3
-rw-r--r--node_modules/doiuse/data/features/css-backdrop-filter.js3
-rw-r--r--node_modules/doiuse/data/features/css-background-offsets.js11
-rw-r--r--node_modules/doiuse/data/features/css-backgroundblendmode.js3
-rw-r--r--node_modules/doiuse/data/features/css-boxdecorationbreak.js13
-rw-r--r--node_modules/doiuse/data/features/css-boxshadow.js3
-rw-r--r--node_modules/doiuse/data/features/css-canvas.js9
-rw-r--r--node_modules/doiuse/data/features/css-caret-color.js12
-rw-r--r--node_modules/doiuse/data/features/css-cascade-layers.js12
-rw-r--r--node_modules/doiuse/data/features/css-case-insensitive.js14
-rw-r--r--node_modules/doiuse/data/features/css-clip-path.js3
-rw-r--r--node_modules/doiuse/data/features/css-color-adjust.js13
-rw-r--r--node_modules/doiuse/data/features/css-color-function.js12
-rw-r--r--node_modules/doiuse/data/features/css-conic-gradients.js12
-rw-r--r--node_modules/doiuse/data/features/css-container-queries-style.js3
-rw-r--r--node_modules/doiuse/data/features/css-container-queries.js12
-rw-r--r--node_modules/doiuse/data/features/css-container-query-units.js10
-rw-r--r--node_modules/doiuse/data/features/css-containment.js12
-rw-r--r--node_modules/doiuse/data/features/css-content-visibility.js12
-rw-r--r--node_modules/doiuse/data/features/css-counters.js5
-rw-r--r--node_modules/doiuse/data/features/css-crisp-edges.js12
-rw-r--r--node_modules/doiuse/data/features/css-cross-fade.js15
-rw-r--r--node_modules/doiuse/data/features/css-default-pseudo.js12
-rw-r--r--node_modules/doiuse/data/features/css-descendant-gtgt.js12
-rw-r--r--node_modules/doiuse/data/features/css-deviceadaptation.js12
-rw-r--r--node_modules/doiuse/data/features/css-dir-pseudo.js12
-rw-r--r--node_modules/doiuse/data/features/css-display-contents.js12
-rw-r--r--node_modules/doiuse/data/features/css-element-function.js12
-rw-r--r--node_modules/doiuse/data/features/css-env-function.js3
-rw-r--r--node_modules/doiuse/data/features/css-exclusions.js13
-rw-r--r--node_modules/doiuse/data/features/css-featurequeries.js3
-rw-r--r--node_modules/doiuse/data/features/css-file-selector-button.js12
-rw-r--r--node_modules/doiuse/data/features/css-filter-function.js12
-rw-r--r--node_modules/doiuse/data/features/css-filters.js3
-rw-r--r--node_modules/doiuse/data/features/css-first-letter.js12
-rw-r--r--node_modules/doiuse/data/features/css-first-line.js12
-rw-r--r--node_modules/doiuse/data/features/css-fixed.js3
-rw-r--r--node_modules/doiuse/data/features/css-focus-visible.js12
-rw-r--r--node_modules/doiuse/data/features/css-focus-within.js12
-rw-r--r--node_modules/doiuse/data/features/css-font-palette.js6
-rw-r--r--node_modules/doiuse/data/features/css-font-rendering-controls.js12
-rw-r--r--node_modules/doiuse/data/features/css-font-stretch.js3
-rw-r--r--node_modules/doiuse/data/features/css-gencontent.js3
-rw-r--r--node_modules/doiuse/data/features/css-gradients.js12
-rw-r--r--node_modules/doiuse/data/features/css-grid-animation.js6
-rw-r--r--node_modules/doiuse/data/features/css-grid.js23
-rw-r--r--node_modules/doiuse/data/features/css-hanging-punctuation.js11
-rw-r--r--node_modules/doiuse/data/features/css-has.js11
-rw-r--r--node_modules/doiuse/data/features/css-hyphens.js3
-rw-r--r--node_modules/doiuse/data/features/css-image-orientation.js3
-rw-r--r--node_modules/doiuse/data/features/css-image-set.js11
-rw-r--r--node_modules/doiuse/data/features/css-in-out-of-range.js14
-rw-r--r--node_modules/doiuse/data/features/css-indeterminate-pseudo.js11
-rw-r--r--node_modules/doiuse/data/features/css-initial-letter.js11
-rw-r--r--node_modules/doiuse/data/features/css-initial-value.js3
-rw-r--r--node_modules/doiuse/data/features/css-lch-lab.js14
-rw-r--r--node_modules/doiuse/data/features/css-letter-spacing.js11
-rw-r--r--node_modules/doiuse/data/features/css-line-clamp.js12
-rw-r--r--node_modules/doiuse/data/features/css-logical-props.js60
-rw-r--r--node_modules/doiuse/data/features/css-marker-pseudo.js11
-rw-r--r--node_modules/doiuse/data/features/css-masks.js39
-rw-r--r--node_modules/doiuse/data/features/css-matches-pseudo.js12
-rw-r--r--node_modules/doiuse/data/features/css-math-functions.js3
-rw-r--r--node_modules/doiuse/data/features/css-media-interaction.js16
-rw-r--r--node_modules/doiuse/data/features/css-media-range-syntax.js3
-rw-r--r--node_modules/doiuse/data/features/css-media-resolution.js3
-rw-r--r--node_modules/doiuse/data/features/css-media-scripting.js11
-rw-r--r--node_modules/doiuse/data/features/css-mediaqueries.js3
-rw-r--r--node_modules/doiuse/data/features/css-mixblendmode.js3
-rw-r--r--node_modules/doiuse/data/features/css-motion-paths.js3
-rw-r--r--node_modules/doiuse/data/features/css-namespaces.js11
-rw-r--r--node_modules/doiuse/data/features/css-nesting.js19
-rw-r--r--node_modules/doiuse/data/features/css-not-sel-list.js13
-rw-r--r--node_modules/doiuse/data/features/css-nth-child-of.js13
-rw-r--r--node_modules/doiuse/data/features/css-opacity.js3
-rw-r--r--node_modules/doiuse/data/features/css-optional-pseudo.js11
-rw-r--r--node_modules/doiuse/data/features/css-overflow-anchor.js11
-rw-r--r--node_modules/doiuse/data/features/css-overflow-overlay.js3
-rw-r--r--node_modules/doiuse/data/features/css-overflow.js13
-rw-r--r--node_modules/doiuse/data/features/css-overscroll-behavior.js5
-rw-r--r--node_modules/doiuse/data/features/css-page-break.js13
-rw-r--r--node_modules/doiuse/data/features/css-paged-media.js11
-rw-r--r--node_modules/doiuse/data/features/css-paint-api.js9
-rw-r--r--node_modules/doiuse/data/features/css-placeholder-shown.js12
-rw-r--r--node_modules/doiuse/data/features/css-placeholder.js5
-rw-r--r--node_modules/doiuse/data/features/css-print-color-adjust.js3
-rw-r--r--node_modules/doiuse/data/features/css-read-only-write.js12
-rw-r--r--node_modules/doiuse/data/features/css-rebeccapurple.js12
-rw-r--r--node_modules/doiuse/data/features/css-reflections.js4
-rw-r--r--node_modules/doiuse/data/features/css-regions.js15
-rw-r--r--node_modules/doiuse/data/features/css-relative-colors.js12
-rw-r--r--node_modules/doiuse/data/features/css-repeating-gradients.js6
-rw-r--r--node_modules/doiuse/data/features/css-resize.js3
-rw-r--r--node_modules/doiuse/data/features/css-revert-value.js4
-rw-r--r--node_modules/doiuse/data/features/css-rrggbbaa.js15
-rw-r--r--node_modules/doiuse/data/features/css-scroll-behavior.js12
-rw-r--r--node_modules/doiuse/data/features/css-scroll-timeline.js27
-rw-r--r--node_modules/doiuse/data/features/css-scrollbar.js4
-rw-r--r--node_modules/doiuse/data/features/css-sel2.js42
-rw-r--r--node_modules/doiuse/data/features/css-sel3.js34
-rw-r--r--node_modules/doiuse/data/features/css-selection.js3
-rw-r--r--node_modules/doiuse/data/features/css-shapes.js5
-rw-r--r--node_modules/doiuse/data/features/css-snappoints.js36
-rw-r--r--node_modules/doiuse/data/features/css-sticky.js3
-rw-r--r--node_modules/doiuse/data/features/css-subgrid.js12
-rw-r--r--node_modules/doiuse/data/features/css-supports-api.js12
-rw-r--r--node_modules/doiuse/data/features/css-table.js7
-rw-r--r--node_modules/doiuse/data/features/css-text-align-last.js12
-rw-r--r--node_modules/doiuse/data/features/css-text-box-trim.js13
-rw-r--r--node_modules/doiuse/data/features/css-text-indent.js12
-rw-r--r--node_modules/doiuse/data/features/css-text-justify.js12
-rw-r--r--node_modules/doiuse/data/features/css-text-orientation.js12
-rw-r--r--node_modules/doiuse/data/features/css-text-spacing.js12
-rw-r--r--node_modules/doiuse/data/features/css-textshadow.js3
-rw-r--r--node_modules/doiuse/data/features/css-touch-action.js3
-rw-r--r--node_modules/doiuse/data/features/css-transitions.js7
-rw-r--r--node_modules/doiuse/data/features/css-unicode-bidi.js12
-rw-r--r--node_modules/doiuse/data/features/css-unset-value.js3
-rw-r--r--node_modules/doiuse/data/features/css-variables.js8
-rw-r--r--node_modules/doiuse/data/features/css-when-else.js12
-rw-r--r--node_modules/doiuse/data/features/css-widows-orphans.js13
-rw-r--r--node_modules/doiuse/data/features/css-width-stretch.js12
-rw-r--r--node_modules/doiuse/data/features/css-writing-mode.js12
-rw-r--r--node_modules/doiuse/data/features/css-zoom.js12
-rw-r--r--node_modules/doiuse/data/features/css3-attr.js17
-rw-r--r--node_modules/doiuse/data/features/css3-boxsizing.js3
-rw-r--r--node_modules/doiuse/data/features/css3-colors.js7
-rw-r--r--node_modules/doiuse/data/features/css3-cursors-grab.js3
-rw-r--r--node_modules/doiuse/data/features/css3-cursors-newer.js3
-rw-r--r--node_modules/doiuse/data/features/css3-cursors.js17
-rw-r--r--node_modules/doiuse/data/features/css3-tabsize.js3
-rw-r--r--node_modules/doiuse/data/features/currentcolor.js12
-rw-r--r--node_modules/doiuse/data/features/devicepixelratio.js12
-rw-r--r--node_modules/doiuse/data/features/extended-system-fonts.js12
-rw-r--r--node_modules/doiuse/data/features/flexbox-gap.js18
-rw-r--r--node_modules/doiuse/data/features/flexbox.js13
-rw-r--r--node_modules/doiuse/data/features/flow-root.js12
-rw-r--r--node_modules/doiuse/data/features/font-family-system-ui.js12
-rw-r--r--node_modules/doiuse/data/features/font-feature.js6
-rw-r--r--node_modules/doiuse/data/features/font-kerning.js12
-rw-r--r--node_modules/doiuse/data/features/font-loading.js12
-rw-r--r--node_modules/doiuse/data/features/font-size-adjust.js3
-rw-r--r--node_modules/doiuse/data/features/font-smooth.js12
-rw-r--r--node_modules/doiuse/data/features/font-unicode-range.js3
-rw-r--r--node_modules/doiuse/data/features/font-variant-alternates.js12
-rw-r--r--node_modules/doiuse/data/features/font-variant-numeric.js12
-rw-r--r--node_modules/doiuse/data/features/fontface.js5
-rw-r--r--node_modules/doiuse/data/features/fullscreen.js3
-rw-r--r--node_modules/doiuse/data/features/getcomputedstyle.js12
-rw-r--r--node_modules/doiuse/data/features/inline-block.js3
-rw-r--r--node_modules/doiuse/data/features/intrinsic-width.js10
-rw-r--r--node_modules/doiuse/data/features/justify-content-space-evenly.js12
-rw-r--r--node_modules/doiuse/data/features/kerning-pairs-ligatures.js3
-rw-r--r--node_modules/doiuse/data/features/mdn-css-unicode-bidi-isolate-override.js3
-rw-r--r--node_modules/doiuse/data/features/mdn-css-unicode-bidi-isolate.js3
-rw-r--r--node_modules/doiuse/data/features/mdn-css-unicode-bidi-plaintext.js3
-rw-r--r--node_modules/doiuse/data/features/mdn-text-decoration-color.js3
-rw-r--r--node_modules/doiuse/data/features/mdn-text-decoration-line.js3
-rw-r--r--node_modules/doiuse/data/features/mdn-text-decoration-shorthand.js3
-rw-r--r--node_modules/doiuse/data/features/mdn-text-decoration-style.js3
-rw-r--r--node_modules/doiuse/data/features/minmaxwh.js6
-rw-r--r--node_modules/doiuse/data/features/multibackgrounds.js11
-rw-r--r--node_modules/doiuse/data/features/multicolumn.js15
-rw-r--r--node_modules/doiuse/data/features/object-fit.js4
-rw-r--r--node_modules/doiuse/data/features/outline.js6
-rw-r--r--node_modules/doiuse/data/features/pointer-events.js3
-rw-r--r--node_modules/doiuse/data/features/pointer.js3
-rw-r--r--node_modules/doiuse/data/features/prefers-color-scheme.js12
-rw-r--r--node_modules/doiuse/data/features/prefers-reduced-motion.js13
-rw-r--r--node_modules/doiuse/data/features/rem.js3
-rw-r--r--node_modules/doiuse/data/features/run-in.js12
-rw-r--r--node_modules/doiuse/data/features/style-scoped.js12
-rw-r--r--node_modules/doiuse/data/features/svg-css.js19
-rw-r--r--node_modules/doiuse/data/features/text-decoration.js9
-rw-r--r--node_modules/doiuse/data/features/text-emphasis.js15
-rw-r--r--node_modules/doiuse/data/features/text-overflow.js3
-rw-r--r--node_modules/doiuse/data/features/text-size-adjust.js3
-rw-r--r--node_modules/doiuse/data/features/text-stroke.js15
-rw-r--r--node_modules/doiuse/data/features/transforms2d.js4
-rw-r--r--node_modules/doiuse/data/features/transforms3d.js7
-rw-r--r--node_modules/doiuse/data/features/ttf.js20
-rw-r--r--node_modules/doiuse/data/features/user-select-none.js3
-rw-r--r--node_modules/doiuse/data/features/variable-fonts.js12
-rw-r--r--node_modules/doiuse/data/features/viewport-unit-variants.js43
-rw-r--r--node_modules/doiuse/data/features/viewport-units.js8
-rw-r--r--node_modules/doiuse/data/features/webkit-user-drag.js12
-rw-r--r--node_modules/doiuse/data/features/will-change.js3
-rw-r--r--node_modules/doiuse/data/features/word-break.js3
-rw-r--r--node_modules/doiuse/data/features/wordwrap.js4
-rw-r--r--node_modules/doiuse/exports/index.cjs2901
-rw-r--r--node_modules/doiuse/exports/index.js9
-rw-r--r--node_modules/doiuse/exports/stream.cjs3087
-rw-r--r--node_modules/doiuse/exports/stream.js9
-rw-r--r--node_modules/doiuse/lib/BrowserSelection.js181
-rw-r--r--node_modules/doiuse/lib/Detector.js157
-rw-r--r--node_modules/doiuse/lib/DoIUse.js130
-rw-r--r--node_modules/doiuse/lib/stream/CssUsageDuplex.js36
-rw-r--r--node_modules/doiuse/lib/stream/RuleUsageTransform.js80
-rw-r--r--node_modules/doiuse/lib/stream/SourceMapTransform.js74
-rw-r--r--node_modules/doiuse/node_modules/source-map/LICENSE28
-rw-r--r--node_modules/doiuse/node_modules/source-map/README.md822
-rw-r--r--node_modules/doiuse/node_modules/source-map/dist/source-map.js1
-rw-r--r--node_modules/doiuse/node_modules/source-map/lib/array-set.js100
-rw-r--r--node_modules/doiuse/node_modules/source-map/lib/base64-vlq.js111
-rw-r--r--node_modules/doiuse/node_modules/source-map/lib/base64.js18
-rw-r--r--node_modules/doiuse/node_modules/source-map/lib/binary-search.js107
-rw-r--r--node_modules/doiuse/node_modules/source-map/lib/mapping-list.js80
-rw-r--r--node_modules/doiuse/node_modules/source-map/lib/mappings.wasmbin0 -> 48693 bytes
-rw-r--r--node_modules/doiuse/node_modules/source-map/lib/read-wasm.js49
-rw-r--r--node_modules/doiuse/node_modules/source-map/lib/source-map-consumer.js1237
-rw-r--r--node_modules/doiuse/node_modules/source-map/lib/source-map-generator.js413
-rw-r--r--node_modules/doiuse/node_modules/source-map/lib/source-node.js404
-rw-r--r--node_modules/doiuse/node_modules/source-map/lib/util.js546
-rw-r--r--node_modules/doiuse/node_modules/source-map/lib/wasm.js107
-rw-r--r--node_modules/doiuse/node_modules/source-map/package.json91
-rw-r--r--node_modules/doiuse/node_modules/source-map/source-map.d.ts369
-rw-r--r--node_modules/doiuse/node_modules/source-map/source-map.js8
-rw-r--r--node_modules/doiuse/package.json96
-rw-r--r--node_modules/doiuse/types/bin/cli.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features.d.ts786
-rw-r--r--node_modules/doiuse/types/data/features/alternate-stylesheet.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/background-attachment.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/background-clip-text.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/background-img-opts.d.ts6
-rw-r--r--node_modules/doiuse/types/data/features/background-position-x-y.d.ts5
-rw-r--r--node_modules/doiuse/types/data/features/background-repeat-round-space.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/border-image.d.ts9
-rw-r--r--node_modules/doiuse/types/data/features/border-radius.d.ts8
-rw-r--r--node_modules/doiuse/types/data/features/calc.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/ch-unit.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-all.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css-animation.d.ts12
-rw-r--r--node_modules/doiuse/types/data/features/css-any-link.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-appearance.d.ts6
-rw-r--r--node_modules/doiuse/types/data/features/css-at-counter-style.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-autofill.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-backdrop-filter.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css-background-offsets.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-backgroundblendmode.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css-boxdecorationbreak.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-boxshadow.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css-canvas.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-caret-color.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-cascade-layers.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-case-insensitive.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-clip-path.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css-color-adjust.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-color-function.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-conic-gradients.d.ts11
-rw-r--r--node_modules/doiuse/types/data/features/css-container-queries-style.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-container-queries.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-container-query-units.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-containment.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-content-visibility.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-counters.d.ts6
-rw-r--r--node_modules/doiuse/types/data/features/css-crisp-edges.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-cross-fade.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-default-pseudo.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-descendant-gtgt.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-deviceadaptation.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-dir-pseudo.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-display-contents.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-element-function.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-env-function.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css-exclusions.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-featurequeries.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-file-selector-button.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-filter-function.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-filters.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css-first-letter.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-first-line.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-fixed.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css-focus-visible.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-focus-within.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-font-palette.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-font-rendering-controls.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-font-stretch.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css-gencontent.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-gradients.d.ts11
-rw-r--r--node_modules/doiuse/types/data/features/css-grid-animation.d.ts5
-rw-r--r--node_modules/doiuse/types/data/features/css-grid.d.ts19
-rw-r--r--node_modules/doiuse/types/data/features/css-hanging-punctuation.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-has.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-hyphens.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css-image-orientation.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css-image-set.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-in-out-of-range.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-indeterminate-pseudo.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-initial-letter.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-initial-value.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css-lch-lab.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-letter-spacing.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-line-clamp.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-logical-props.d.ts61
-rw-r--r--node_modules/doiuse/types/data/features/css-marker-pseudo.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-masks.d.ts39
-rw-r--r--node_modules/doiuse/types/data/features/css-matches-pseudo.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-math-functions.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css-media-interaction.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-media-range-syntax.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-media-resolution.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-media-scripting.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-mediaqueries.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-mixblendmode.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css-motion-paths.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css-namespaces.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-nesting.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-not-sel-list.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-nth-child-of.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-opacity.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css-optional-pseudo.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-overflow-anchor.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-overflow-overlay.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css-overflow.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-overscroll-behavior.d.ts6
-rw-r--r--node_modules/doiuse/types/data/features/css-page-break.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-paged-media.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-paint-api.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-placeholder-shown.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-placeholder.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-print-color-adjust.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css-read-only-write.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-rebeccapurple.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-reflections.d.ts5
-rw-r--r--node_modules/doiuse/types/data/features/css-regions.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-relative-colors.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-repeating-gradients.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css-resize.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css-revert-value.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css-rrggbbaa.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-scroll-behavior.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-scroll-timeline.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-scrollbar.d.ts5
-rw-r--r--node_modules/doiuse/types/data/features/css-sel2.d.ts9
-rw-r--r--node_modules/doiuse/types/data/features/css-sel3.d.ts8
-rw-r--r--node_modules/doiuse/types/data/features/css-selection.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-shapes.d.ts6
-rw-r--r--node_modules/doiuse/types/data/features/css-snappoints.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-sticky.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css-subgrid.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-supports-api.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-table.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css-text-align-last.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-text-box-trim.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-text-indent.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-text-justify.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-text-orientation.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-text-spacing.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-textshadow.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css-touch-action.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css-transitions.d.ts8
-rw-r--r--node_modules/doiuse/types/data/features/css-unicode-bidi.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-unset-value.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css-variables.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-when-else.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-widows-orphans.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-width-stretch.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-writing-mode.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css-zoom.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css3-attr.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/css3-boxsizing.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css3-colors.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css3-cursors-grab.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css3-cursors-newer.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css3-cursors.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/css3-tabsize.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/currentcolor.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/devicepixelratio.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/extended-system-fonts.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/flexbox-gap.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/flexbox.d.ts11
-rw-r--r--node_modules/doiuse/types/data/features/flow-root.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/font-family-system-ui.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/font-feature.d.ts7
-rw-r--r--node_modules/doiuse/types/data/features/font-kerning.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/font-loading.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/font-size-adjust.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/font-smooth.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/font-unicode-range.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/font-variant-alternates.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/font-variant-numeric.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/fontface.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/fullscreen.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/getcomputedstyle.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/inline-block.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/intrinsic-width.d.ts9
-rw-r--r--node_modules/doiuse/types/data/features/justify-content-space-evenly.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/kerning-pairs-ligatures.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/mdn-css-unicode-bidi-isolate-override.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/mdn-css-unicode-bidi-isolate.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/mdn-css-unicode-bidi-plaintext.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/mdn-text-decoration-color.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/mdn-text-decoration-line.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/mdn-text-decoration-shorthand.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/mdn-text-decoration-style.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/minmaxwh.d.ts7
-rw-r--r--node_modules/doiuse/types/data/features/multibackgrounds.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/multicolumn.d.ts16
-rw-r--r--node_modules/doiuse/types/data/features/object-fit.d.ts5
-rw-r--r--node_modules/doiuse/types/data/features/outline.d.ts7
-rw-r--r--node_modules/doiuse/types/data/features/pointer-events.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/pointer.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/prefers-color-scheme.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/prefers-reduced-motion.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/rem.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/run-in.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/style-scoped.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/svg-css.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/text-decoration.d.ts10
-rw-r--r--node_modules/doiuse/types/data/features/text-emphasis.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/text-overflow.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/text-size-adjust.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/text-stroke.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/transforms2d.d.ts5
-rw-r--r--node_modules/doiuse/types/data/features/transforms3d.d.ts8
-rw-r--r--node_modules/doiuse/types/data/features/ttf.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/user-select-none.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/variable-fonts.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/viewport-unit-variants.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/viewport-units.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/webkit-user-drag.d.ts2
-rw-r--r--node_modules/doiuse/types/data/features/will-change.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/word-break.d.ts4
-rw-r--r--node_modules/doiuse/types/data/features/wordwrap.d.ts5
-rw-r--r--node_modules/doiuse/types/exports/index.d.ts6
-rw-r--r--node_modules/doiuse/types/exports/stream.d.ts10
-rw-r--r--node_modules/doiuse/types/lib/BrowserSelection.d.ts511
-rw-r--r--node_modules/doiuse/types/lib/Detector.d.ts1076
-rw-r--r--node_modules/doiuse/types/lib/DoIUse.d.ts56
-rw-r--r--node_modules/doiuse/types/lib/stream/CssUsageDuplex.d.ts17
-rw-r--r--node_modules/doiuse/types/lib/stream/RuleUsageTransform.d.ts26
-rw-r--r--node_modules/doiuse/types/lib/stream/SourceMapTransform.d.ts22
-rw-r--r--node_modules/doiuse/types/scripts/update-features.d.ts7
-rw-r--r--node_modules/doiuse/types/test/caniuse-lite.d.ts1
-rw-r--r--node_modules/doiuse/types/test/cli.d.ts1
-rw-r--r--node_modules/doiuse/types/test/css-rule-stream.d.ts1
-rw-r--r--node_modules/doiuse/types/test/detect-feature-use.d.ts1
-rw-r--r--node_modules/doiuse/types/test/missing-support.d.ts1
-rw-r--r--node_modules/doiuse/types/test/postcss-plugin.d.ts1
-rw-r--r--node_modules/doiuse/types/test/regex.d.ts1
-rw-r--r--node_modules/doiuse/types/test/stream.d.ts1
-rw-r--r--node_modules/doiuse/types/test/utils.d.ts7
-rw-r--r--node_modules/doiuse/types/utils/getFiles.d.ts7
-rw-r--r--node_modules/doiuse/types/utils/kebabToCamel.d.ts6
-rw-r--r--node_modules/doiuse/types/utils/util.d.ts32
-rw-r--r--node_modules/doiuse/utils/getFiles.js19
-rw-r--r--node_modules/doiuse/utils/kebabToCamel.js8
-rw-r--r--node_modules/doiuse/utils/util.js79
468 files changed, 17528 insertions, 0 deletions
diff --git a/node_modules/doiuse/LICENSE b/node_modules/doiuse/LICENSE
new file mode 100644
index 00000000..18ed0820
--- /dev/null
+++ b/node_modules/doiuse/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Anand Thakker
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/node_modules/doiuse/README.md b/node_modules/doiuse/README.md
new file mode 100644
index 00000000..0964c18c
--- /dev/null
+++ b/node_modules/doiuse/README.md
@@ -0,0 +1,172 @@
+[![Build Status](https://travis-ci.org/anandthakker/doiuse.svg?branch=master)](https://travis-ci.org/anandthakker/doiuse)
+[![Release Notes](https://release-notes.com/badges/v2.svg)](https://release-notes.com/@open-source-community/anandthakker-doiuse)
+
+# doiuse
+
+Lint CSS for browser support against [Can I use](http://caniuse.com) database.
+
+## Install
+
+```sh
+npm install -g doiuse
+```
+
+## Usage Examples
+
+### Command Line
+
+```bash
+doiuse --browsers "ie >= 9, > 1%, last 2 versions" main.css
+# or
+cat main.css | doiuse --browsers "ie >= 9, > 1%, last 2 versions"
+```
+
+**Sample output:**
+```
+/projects/website/main.css:5:3: CSS3 Box-sizing not supported by: IE (8,9,10,11), Chrome (36,37,38), Safari (8,7.1), Opera (24,25), iOS Safari (8,7.1,8.1), Android Browser (4.1,4.4,4.4.4), IE Mobile (10,11)
+/projects/website/main.css:6:3: CSS3 Box-sizing not supported by: IE (8,9,10,11), Chrome (36,37,38), Safari (8,7.1), Opera (24,25), iOS Safari (8,7.1,8.1), Android Browser (4.1,4.4,4.4.4), IE Mobile (10,11)
+/projects/website/main.css:8:3: CSS user-select: none not supported by: IE (8,9)
+/projects/website/main.css:9:3: CSS user-select: none not supported by: IE (8,9)
+/projects/website/main.css:10:3: CSS user-select: none not supported by: IE (8,9)
+/projects/website/main.css:11:3: CSS user-select: none not supported by: IE (8,9)
+/projects/website/main.css:12:3: CSS user-select: none not supported by: IE (8,9)
+/projects/website/main.css:13:3: Pointer events not supported by: IE (8,9,10), Firefox (32,33), Chrome (36,37,38), Safari (8,7.1), Opera (24,25), iOS Safari (8,7.1,8.1), Android Browser (4.1,4.4,4.4.4), IE Mobile (10)
+/projects/website/main.css:14:3: Pointer events not supported by: IE (8,9,10), Firefox (32,33), Chrome (36,37,38), Safari (8,7.1), Opera (24,25), iOS Safari (8,7.1,8.1), Android Browser (4.1,4.4,4.4.4), IE Mobile (10)
+/projects/website/main.css:32:3: CSS3 Transforms not supported by: IE (8)
+```
+
+Use `--json` to get output as (newline-delimited) JSON objects.
+
+### JS
+
+```javascript
+import postcss from 'postcss';
+import DoIUse from 'doiuse/lib/DoIUse.js';
+
+postcss(new DoIUse({
+ browsers:['ie >= 6', '> 1%'],
+ ignore: ['rem'], // an optional array of features to ignore
+ ignoreFiles: ['**/normalize.css'], // an optional array of file globs to match against original source file path, to ignore
+ onFeatureUsage: (usageInfo) => {
+ console.log(usageInfo.message);
+ }
+})).process("a { background-size: cover; }")
+```
+
+CommonJS syntax is still supported if using `var doiuse = require('doiuse')`.
+
+### Gulp (CommonJS)
+
+```javascript
+var gulp = require('gulp')
+var postcss = require('postcss')
+var doiuse = require('doiuse')
+
+gulp.src(src, { cwd: process.cwd() })
+.pipe(gulp.postcss([
+ doiuse({
+ browsers: [
+ 'ie >= 8',
+ '> 1%'
+ ],
+ ignore: ['rem'], // an optional array of features to ignore
+ ignoreFiles: ['**/normalize.css'], // an optional array of file globs to match against original source file path, to ignore
+ onFeatureUsage: function (usageInfo) {
+ console.log(usageInfo.message)
+ }
+ })
+]))
+```
+
+## How it works
+
+In particular, the approach to detecting features usage is currently quite naive.
+
+<a name="features-list"></a>Refer to the data in [/data/features.js](data/features.js).
+
+- If a feature in that dataset only specifies `properties`, we just use those
+ properties for regex/substring matches against the properties used in the input CSS.
+- If a feature also specifies `values`, then we also require that the associated
+ value matches one of those values.
+
+## API Details
+
+### As a transform stream
+
+```javascript
+var doiuse = require('doiuse/stream');
+
+process.stdin
+ .pipe(doiuse({ browsers: ['ie >= 8', '> 1%'], ignore: ['rem'] }))
+ .on('data', function (usageInfo) {
+ console.log(JSON.stringify(usageInfo))
+ })
+```
+
+Yields `UsageInfo` objects as described below.
+
+### As a postcss plugin
+
+`postcss(new DoIUse(opts)).process(css)`, where `opts` is:
+```javascript
+{
+ browsers: ['ie >= 8', '> 1%'], // an autoprefixer-like array of browsers.
+ ignore: ['rem'], // an optional array of features to ignore
+ ignoreFiles: ['**/normalize.css'], // an optional array of file globs to match against original source file path, to ignore
+ onFeatureUsage: function(usageInfo) { } // a callback for usages of features not supported by the selected browsers
+}
+```
+
+And `usageInfo` looks like this:
+
+```javascript
+{
+ message: '<input source>: line <l>, col <c> - CSS3 Gradients not supported by: IE (8)',
+ feature: 'css-gradients', // slug identifying a caniuse-db feature
+ featureData: {
+ title: 'CSS Gradients',
+ missing: "IE (8)", // string of browsers missing support for this feature.
+ missingData: {
+ // map of browser -> version -> (lack of)support code
+ ie: { '8': 'n' }
+ },
+ caniuseData: { // data from caniuse-db/features-json/[feature].json }
+ },
+ usage: {} //the postcss node where that feature is being used.
+}
+```
+
+Called once for each usage of each css feature not supported by the selected browsers.
+
+### Ignoring file-specific rules
+
+For disabling some checks you can use just-in-place comments
+
+##### `/* doiuse-disable */`
+
+Disables checks of _all [features](#features-list)_
+
+##### `/* doiuse-disable feature */`
+
+Disables checks of _specified [feature(s)](#features-list)_ (can be comma separated list)
+
+##### `/* doiuse-enable */`
+
+Re-enables checks of _all [features](#features-list)_
+
+##### `/* doiuse-enable feature */`
+
+Enables checks of _specified [feature(s)](#features-list)_ (can be comma separated list)
+ - for following lines in file
+
+## [Contributing](CONTRIBUTING.md)
+
+doiuse is an [OPEN Open Source](http://openopensource.org/) Project.
+
+This means that individuals making significant and valuable contributions are given commit-access to the project to contribute as they see fit. This project is more like an open wiki than a standard guarded open source project.
+
+## License
+
+MIT
+
+**NOTE:** Many of the files in test/cases are from autoprefixer-core, Copyright 2013 Andrey Sitnik <andrey@sitnik.ru>. Please see https://github.com/postcss/autoprefixer-core.
diff --git a/node_modules/doiuse/bin/cli.js b/node_modules/doiuse/bin/cli.js
new file mode 100755
index 00000000..d07d159b
--- /dev/null
+++ b/node_modules/doiuse/bin/cli.js
@@ -0,0 +1,161 @@
+#!/usr/bin/env node
+
+import fs from 'node:fs';
+import path from 'node:path';
+import { PassThrough } from 'node:stream';
+
+import browserslist from 'browserslist';
+import ldjson from 'ldjson-stream';
+import yargs from 'yargs';
+
+import DoIUse from '../lib/DoIUse.js';
+import CssUsageDuplex from '../lib/stream/CssUsageDuplex.js';
+import { formatBrowserName } from '../utils/util.js';
+
+const FILE_NOT_FOUND = 'ENOENT';
+const argv = await yargs(process.argv.slice(2))
+ .usage('Lint your CSS for browser support.')
+ .example('cat FILE | $0 -b "ios >= 6"', '')
+ .example('$0 --browsers "ie >= 9, > 1%, last 3 versions" [FILE] [FILE] ...', '')
+ .example('$0 -b "ie >= 8" -b "> 1%" -b "last 3 versions" [FILE] [FILE] ...', '')
+ .options({
+ browsers: {
+ type: 'string',
+ alias: 'b',
+ description: 'Autoprefixer-like browser criteria.',
+ default: /** @type {string} */ (null),
+ string: true,
+ },
+ ignore: {
+ type: 'string',
+ alias: 'i',
+ description: 'List of features to ignore.',
+ default: '',
+ string: true,
+ },
+ l: {
+ type: 'boolean',
+ alias: 'list-only',
+ description: 'Just show the browsers and features that would be tested by'
+ + 'the specified browser criteria, without actually processing any CSS.',
+ },
+ config: {
+ type: 'string',
+ alias: 'c',
+ description: 'Provide options through config file',
+ },
+ verbose: {
+ type: 'number',
+ alias: 'v',
+ description: 'Verbose output. Multiple levels available.',
+ },
+ json: {
+ type: 'boolean',
+ alias: 'j',
+ description: 'Output JSON instead of string linter-like messages.',
+ },
+ })
+ .count('verbose')
+ .help('h', 'Show help message.')
+ .alias('h', 'help')
+ .argv;
+
+// Config file reading
+if (argv.config) {
+ try {
+ const fileData = fs.readFileSync(path.resolve(argv.config));
+ const config = JSON.parse(fileData.toString());
+
+ for (const [key, value] of Object.entries(config)) {
+ argv[key] = (key === 'browsers' && Array.isArray(value))
+ ? value.join(',')
+ : value;
+ }
+ } catch (error) {
+ if (error && error.code === FILE_NOT_FOUND) {
+ process.stderr.write('Config file not found\n');
+ }
+ throw error;
+ }
+}
+
+const browsers = argv.browsers ? argv.browsers.split(',')
+ .map((/** @type {string} */ s) => s.trim()) : null;
+
+const ignore = argv.ignore.split(',').map((s) => s.trim());
+
+// Informational output
+if (argv.l || argv.verbose >= 1) {
+ const formattedBrowsers = browserslist(browsers)
+ .map((b) => {
+ const [name, version] = b.split(' ');
+ /** @type {[string, number]} */
+ const formatted = [formatBrowserName(name), Number.parseInt(version, 10)];
+ return formatted;
+ })
+ .sort((a, b) => b[1] - a[1])
+ .map((b) => b.join(' '))
+ .join(', ');
+ process.stdout.write(`[doiuse] Browsers: ${formattedBrowsers}\n`);
+}
+
+if (argv.verbose >= 2) {
+ const { features } = new DoIUse({ browsers }).info();
+ process.stdout.write('[doiuse] Unsupported features:\n');
+ for (const feature of Object.values(features)) {
+ process.stdout.write(`${feature.caniuseData.title}\n`);
+ if (argv.verbose >= 3) {
+ process.stdout.write(`\n${feature.missing}\n`);
+ }
+ }
+}
+
+if (argv.l) {
+ // eslint-disable-next-line n/no-process-exit
+ process.exit(0);
+}
+
+// Process the CSS
+if (argv.help || (argv._.length === 0 && process.stdin.isTTY)) {
+ yargs.showHelp();
+ // eslint-disable-next-line n/no-process-exit
+ process.exit(0);
+}
+
+/** @type {import("stream").Writable} */
+let outStream;
+if (argv.json) {
+ outStream = ldjson.serialize();
+} else {
+ outStream = new PassThrough({
+ objectMode: true,
+ transform(usage, enc, next) {
+ next(null, `${usage.message}\n`);
+ },
+ });
+}
+outStream.pipe(process.stdout);
+
+/**
+ * @param {import('stream').Stream} stream
+ * @param {string} [file]
+ */
+function processStream(stream, file) {
+ stream.pipe(new CssUsageDuplex({
+ browsers: argv.browsers,
+ // @ts-expect-error Skip cast
+ ignore,
+ }, file))
+ .on('error', (error) => {
+ process.stderr.write('Error parsing file\n');
+ throw error;
+ })
+ .pipe(outStream);
+}
+if (argv._.length > 0) {
+ for (const file of argv._) {
+ processStream(fs.createReadStream(file.toString()), file.toString());
+ }
+} else {
+ processStream(process.stdin);
+}
diff --git a/node_modules/doiuse/data/.eslintrc.json b/node_modules/doiuse/data/.eslintrc.json
new file mode 100644
index 00000000..5d42aab7
--- /dev/null
+++ b/node_modules/doiuse/data/.eslintrc.json
@@ -0,0 +1,18 @@
+{
+ "rules": {
+ "canonical/filename-match-exported": "off",
+ "canonical/filename-match-regex": "off",
+ "import/order": "off",
+ "max-len": "off",
+ "object-shorthand": [
+ "error",
+ "consistent"
+ ],
+ "quote-props": [
+ "error",
+ "always"
+ ],
+ "unicorn/no-empty-file": "off",
+ "unicorn/prevent-abbreviations": "off"
+ }
+} \ No newline at end of file
diff --git a/node_modules/doiuse/data/features.js b/node_modules/doiuse/data/features.js
new file mode 100644
index 00000000..52bdc6c8
--- /dev/null
+++ b/node_modules/doiuse/data/features.js
@@ -0,0 +1,425 @@
+/* THIS FILE IS AUTOGENERATED */
+/* eslint-disable import/order, canonical/filename-match-exported */
+
+import alternateStylesheet from './features/alternate-stylesheet.js';
+import backgroundAttachment from './features/background-attachment.js';
+import backgroundClipText from './features/background-clip-text.js';
+import backgroundImgOpts from './features/background-img-opts.js';
+import backgroundPositionXY from './features/background-position-x-y.js';
+import backgroundRepeatRoundSpace from './features/background-repeat-round-space.js';
+import borderImage from './features/border-image.js';
+import borderRadius from './features/border-radius.js';
+import calc from './features/calc.js';
+import chUnit from './features/ch-unit.js';
+import cssAll from './features/css-all.js';
+import cssAnimation from './features/css-animation.js';
+import cssAnyLink from './features/css-any-link.js';
+import cssAppearance from './features/css-appearance.js';
+import cssAtCounterStyle from './features/css-at-counter-style.js';
+import cssAutofill from './features/css-autofill.js';
+import cssBackdropFilter from './features/css-backdrop-filter.js';
+import cssBackgroundOffsets from './features/css-background-offsets.js';
+import cssBackgroundblendmode from './features/css-backgroundblendmode.js';
+import cssBoxdecorationbreak from './features/css-boxdecorationbreak.js';
+import cssBoxshadow from './features/css-boxshadow.js';
+import cssCanvas from './features/css-canvas.js';
+import cssCaretColor from './features/css-caret-color.js';
+import cssCascadeLayers from './features/css-cascade-layers.js';
+import cssCaseInsensitive from './features/css-case-insensitive.js';
+import cssClipPath from './features/css-clip-path.js';
+import cssColorAdjust from './features/css-color-adjust.js';
+import cssColorFunction from './features/css-color-function.js';
+import cssConicGradients from './features/css-conic-gradients.js';
+import cssContainerQueries from './features/css-container-queries.js';
+import cssContainerQueriesStyle from './features/css-container-queries-style.js';
+import cssContainerQueryUnits from './features/css-container-query-units.js';
+import cssContainment from './features/css-containment.js';
+import cssContentVisibility from './features/css-content-visibility.js';
+import cssCounters from './features/css-counters.js';
+import cssCrispEdges from './features/css-crisp-edges.js';
+import cssCrossFade from './features/css-cross-fade.js';
+import cssDefaultPseudo from './features/css-default-pseudo.js';
+import cssDescendantGtgt from './features/css-descendant-gtgt.js';
+import cssDeviceadaptation from './features/css-deviceadaptation.js';
+import cssDirPseudo from './features/css-dir-pseudo.js';
+import cssDisplayContents from './features/css-display-contents.js';
+import cssElementFunction from './features/css-element-function.js';
+import cssEnvFunction from './features/css-env-function.js';
+import cssExclusions from './features/css-exclusions.js';
+import cssFeaturequeries from './features/css-featurequeries.js';
+import cssFileSelectorButton from './features/css-file-selector-button.js';
+import cssFilterFunction from './features/css-filter-function.js';
+import cssFilters from './features/css-filters.js';
+import cssFirstLetter from './features/css-first-letter.js';
+import cssFirstLine from './features/css-first-line.js';
+import cssFixed from './features/css-fixed.js';
+import cssFocusVisible from './features/css-focus-visible.js';
+import cssFocusWithin from './features/css-focus-within.js';
+import cssFontPalette from './features/css-font-palette.js';
+import cssFontRenderingControls from './features/css-font-rendering-controls.js';
+import cssFontStretch from './features/css-font-stretch.js';
+import cssGencontent from './features/css-gencontent.js';
+import cssGradients from './features/css-gradients.js';
+import cssGrid from './features/css-grid.js';
+import cssGridAnimation from './features/css-grid-animation.js';
+import cssHangingPunctuation from './features/css-hanging-punctuation.js';
+import cssHas from './features/css-has.js';
+import cssHyphens from './features/css-hyphens.js';
+import cssImageOrientation from './features/css-image-orientation.js';
+import cssImageSet from './features/css-image-set.js';
+import cssInOutOfRange from './features/css-in-out-of-range.js';
+import cssIndeterminatePseudo from './features/css-indeterminate-pseudo.js';
+import cssInitialLetter from './features/css-initial-letter.js';
+import cssInitialValue from './features/css-initial-value.js';
+import cssLchLab from './features/css-lch-lab.js';
+import cssLetterSpacing from './features/css-letter-spacing.js';
+import cssLineClamp from './features/css-line-clamp.js';
+import cssLogicalProps from './features/css-logical-props.js';
+import cssMarkerPseudo from './features/css-marker-pseudo.js';
+import cssMasks from './features/css-masks.js';
+import cssMatchesPseudo from './features/css-matches-pseudo.js';
+import cssMathFunctions from './features/css-math-functions.js';
+import cssMediaInteraction from './features/css-media-interaction.js';
+import cssMediaRangeSyntax from './features/css-media-range-syntax.js';
+import cssMediaResolution from './features/css-media-resolution.js';
+import cssMediaScripting from './features/css-media-scripting.js';
+import cssMediaqueries from './features/css-mediaqueries.js';
+import cssMixblendmode from './features/css-mixblendmode.js';
+import cssMotionPaths from './features/css-motion-paths.js';
+import cssNamespaces from './features/css-namespaces.js';
+import cssNesting from './features/css-nesting.js';
+import cssNotSelList from './features/css-not-sel-list.js';
+import cssNthChildOf from './features/css-nth-child-of.js';
+import cssOpacity from './features/css-opacity.js';
+import cssOptionalPseudo from './features/css-optional-pseudo.js';
+import cssOverflow from './features/css-overflow.js';
+import cssOverflowAnchor from './features/css-overflow-anchor.js';
+import cssOverflowOverlay from './features/css-overflow-overlay.js';
+import cssOverscrollBehavior from './features/css-overscroll-behavior.js';
+import cssPageBreak from './features/css-page-break.js';
+import cssPagedMedia from './features/css-paged-media.js';
+import cssPaintApi from './features/css-paint-api.js';
+import cssPlaceholder from './features/css-placeholder.js';
+import cssPlaceholderShown from './features/css-placeholder-shown.js';
+import cssPrintColorAdjust from './features/css-print-color-adjust.js';
+import cssReadOnlyWrite from './features/css-read-only-write.js';
+import cssRebeccapurple from './features/css-rebeccapurple.js';
+import cssReflections from './features/css-reflections.js';
+import cssRegions from './features/css-regions.js';
+import cssRelativeColors from './features/css-relative-colors.js';
+import cssRepeatingGradients from './features/css-repeating-gradients.js';
+import cssResize from './features/css-resize.js';
+import cssRevertValue from './features/css-revert-value.js';
+import cssRrggbbaa from './features/css-rrggbbaa.js';
+import cssScrollBehavior from './features/css-scroll-behavior.js';
+import cssScrollTimeline from './features/css-scroll-timeline.js';
+import cssScrollbar from './features/css-scrollbar.js';
+import cssSel2 from './features/css-sel2.js';
+import cssSel3 from './features/css-sel3.js';
+import cssSelection from './features/css-selection.js';
+import cssShapes from './features/css-shapes.js';
+import cssSnappoints from './features/css-snappoints.js';
+import cssSticky from './features/css-sticky.js';
+import cssSubgrid from './features/css-subgrid.js';
+import cssSupportsApi from './features/css-supports-api.js';
+import cssTable from './features/css-table.js';
+import cssTextAlignLast from './features/css-text-align-last.js';
+import cssTextBoxTrim from './features/css-text-box-trim.js';
+import cssTextIndent from './features/css-text-indent.js';
+import cssTextJustify from './features/css-text-justify.js';
+import cssTextOrientation from './features/css-text-orientation.js';
+import cssTextSpacing from './features/css-text-spacing.js';
+import cssTextshadow from './features/css-textshadow.js';
+import cssTouchAction from './features/css-touch-action.js';
+import cssTransitions from './features/css-transitions.js';
+import cssUnicodeBidi from './features/css-unicode-bidi.js';
+import cssUnsetValue from './features/css-unset-value.js';
+import cssVariables from './features/css-variables.js';
+import cssWhenElse from './features/css-when-else.js';
+import cssWidowsOrphans from './features/css-widows-orphans.js';
+import cssWidthStretch from './features/css-width-stretch.js';
+import cssWritingMode from './features/css-writing-mode.js';
+import cssZoom from './features/css-zoom.js';
+import css3Attr from './features/css3-attr.js';
+import css3Boxsizing from './features/css3-boxsizing.js';
+import css3Colors from './features/css3-colors.js';
+import css3Cursors from './features/css3-cursors.js';
+import css3CursorsGrab from './features/css3-cursors-grab.js';
+import css3CursorsNewer from './features/css3-cursors-newer.js';
+import css3Tabsize from './features/css3-tabsize.js';
+import currentcolor from './features/currentcolor.js';
+import devicepixelratio from './features/devicepixelratio.js';
+import extendedSystemFonts from './features/extended-system-fonts.js';
+import flexbox from './features/flexbox.js';
+import flexboxGap from './features/flexbox-gap.js';
+import flowRoot from './features/flow-root.js';
+import fontFamilySystemUi from './features/font-family-system-ui.js';
+import fontFeature from './features/font-feature.js';
+import fontKerning from './features/font-kerning.js';
+import fontLoading from './features/font-loading.js';
+import fontSizeAdjust from './features/font-size-adjust.js';
+import fontSmooth from './features/font-smooth.js';
+import fontUnicodeRange from './features/font-unicode-range.js';
+import fontVariantAlternates from './features/font-variant-alternates.js';
+import fontVariantNumeric from './features/font-variant-numeric.js';
+import fontface from './features/fontface.js';
+import fullscreen from './features/fullscreen.js';
+import getcomputedstyle from './features/getcomputedstyle.js';
+import inlineBlock from './features/inline-block.js';
+import intrinsicWidth from './features/intrinsic-width.js';
+import justifyContentSpaceEvenly from './features/justify-content-space-evenly.js';
+import kerningPairsLigatures from './features/kerning-pairs-ligatures.js';
+import mdnCssUnicodeBidiIsolate from './features/mdn-css-unicode-bidi-isolate.js';
+import mdnCssUnicodeBidiIsolateOverride from './features/mdn-css-unicode-bidi-isolate-override.js';
+import mdnCssUnicodeBidiPlaintext from './features/mdn-css-unicode-bidi-plaintext.js';
+import mdnTextDecorationColor from './features/mdn-text-decoration-color.js';
+import mdnTextDecorationLine from './features/mdn-text-decoration-line.js';
+import mdnTextDecorationShorthand from './features/mdn-text-decoration-shorthand.js';
+import mdnTextDecorationStyle from './features/mdn-text-decoration-style.js';
+import minmaxwh from './features/minmaxwh.js';
+import multibackgrounds from './features/multibackgrounds.js';
+import multicolumn from './features/multicolumn.js';
+import objectFit from './features/object-fit.js';
+import outline from './features/outline.js';
+import pointer from './features/pointer.js';
+import pointerEvents from './features/pointer-events.js';
+import prefersColorScheme from './features/prefers-color-scheme.js';
+import prefersReducedMotion from './features/prefers-reduced-motion.js';
+import rem from './features/rem.js';
+import runIn from './features/run-in.js';
+import styleScoped from './features/style-scoped.js';
+import svgCss from './features/svg-css.js';
+import textDecoration from './features/text-decoration.js';
+import textEmphasis from './features/text-emphasis.js';
+import textOverflow from './features/text-overflow.js';
+import textSizeAdjust from './features/text-size-adjust.js';
+import textStroke from './features/text-stroke.js';
+import transforms2d from './features/transforms2d.js';
+import transforms3d from './features/transforms3d.js';
+import ttf from './features/ttf.js';
+import userSelectNone from './features/user-select-none.js';
+import variableFonts from './features/variable-fonts.js';
+import viewportUnitVariants from './features/viewport-unit-variants.js';
+import viewportUnits from './features/viewport-units.js';
+import webkitUserDrag from './features/webkit-user-drag.js';
+import willChange from './features/will-change.js';
+import wordBreak from './features/word-break.js';
+import wordwrap from './features/wordwrap.js';
+
+/** @typedef {RegExp|string|((value:string) => boolean)} FeatureCheck */
+
+/** @typedef {((rule:import('postcss').ChildNode) => boolean)} RuleCheck */
+
+/** @typedef {Record<string, FeatureCheck|FeatureCheck[]|boolean> | RuleCheck | RuleCheck[]} Feature */
+
+/** @enum {Feature} */
+const FEATURES = {
+ 'alternate-stylesheet': alternateStylesheet,
+ 'background-attachment': backgroundAttachment,
+ 'background-clip-text': backgroundClipText,
+ 'background-img-opts': backgroundImgOpts,
+ 'background-position-x-y': backgroundPositionXY,
+ 'background-repeat-round-space': backgroundRepeatRoundSpace,
+ 'border-image': borderImage,
+ 'border-radius': borderRadius,
+ 'calc': calc,
+ 'ch-unit': chUnit,
+ 'css-all': cssAll,
+ 'css-animation': cssAnimation,
+ 'css-any-link': cssAnyLink,
+ 'css-appearance': cssAppearance,
+ 'css-at-counter-style': cssAtCounterStyle,
+ 'css-autofill': cssAutofill,
+ 'css-backdrop-filter': cssBackdropFilter,
+ 'css-background-offsets': cssBackgroundOffsets,
+ 'css-backgroundblendmode': cssBackgroundblendmode,
+ 'css-boxdecorationbreak': cssBoxdecorationbreak,
+ 'css-boxshadow': cssBoxshadow,
+ 'css-canvas': cssCanvas,
+ 'css-caret-color': cssCaretColor,
+ 'css-cascade-layers': cssCascadeLayers,
+ 'css-case-insensitive': cssCaseInsensitive,
+ 'css-clip-path': cssClipPath,
+ 'css-color-adjust': cssColorAdjust,
+ 'css-color-function': cssColorFunction,
+ 'css-conic-gradients': cssConicGradients,
+ 'css-container-queries': cssContainerQueries,
+ 'css-container-queries-style': cssContainerQueriesStyle,
+ 'css-container-query-units': cssContainerQueryUnits,
+ 'css-containment': cssContainment,
+ 'css-content-visibility': cssContentVisibility,
+ 'css-counters': cssCounters,
+ 'css-crisp-edges': cssCrispEdges,
+ 'css-cross-fade': cssCrossFade,
+ 'css-default-pseudo': cssDefaultPseudo,
+ 'css-descendant-gtgt': cssDescendantGtgt,
+ 'css-deviceadaptation': cssDeviceadaptation,
+ 'css-dir-pseudo': cssDirPseudo,
+ 'css-display-contents': cssDisplayContents,
+ 'css-element-function': cssElementFunction,
+ 'css-env-function': cssEnvFunction,
+ 'css-exclusions': cssExclusions,
+ 'css-featurequeries': cssFeaturequeries,
+ 'css-file-selector-button': cssFileSelectorButton,
+ 'css-filter-function': cssFilterFunction,
+ 'css-filters': cssFilters,
+ 'css-first-letter': cssFirstLetter,
+ 'css-first-line': cssFirstLine,
+ 'css-fixed': cssFixed,
+ 'css-focus-visible': cssFocusVisible,
+ 'css-focus-within': cssFocusWithin,
+ 'css-font-palette': cssFontPalette,
+ 'css-font-rendering-controls': cssFontRenderingControls,
+ 'css-font-stretch': cssFontStretch,
+ 'css-gencontent': cssGencontent,
+ 'css-gradients': cssGradients,
+ 'css-grid': cssGrid,
+ 'css-grid-animation': cssGridAnimation,
+ 'css-hanging-punctuation': cssHangingPunctuation,
+ 'css-has': cssHas,
+ 'css-hyphens': cssHyphens,
+ 'css-image-orientation': cssImageOrientation,
+ 'css-image-set': cssImageSet,
+ 'css-in-out-of-range': cssInOutOfRange,
+ 'css-indeterminate-pseudo': cssIndeterminatePseudo,
+ 'css-initial-letter': cssInitialLetter,
+ 'css-initial-value': cssInitialValue,
+ 'css-lch-lab': cssLchLab,
+ 'css-letter-spacing': cssLetterSpacing,
+ 'css-line-clamp': cssLineClamp,
+ 'css-logical-props': cssLogicalProps,
+ 'css-marker-pseudo': cssMarkerPseudo,
+ 'css-masks': cssMasks,
+ 'css-matches-pseudo': cssMatchesPseudo,
+ 'css-math-functions': cssMathFunctions,
+ 'css-media-interaction': cssMediaInteraction,
+ 'css-media-range-syntax': cssMediaRangeSyntax,
+ 'css-media-resolution': cssMediaResolution,
+ 'css-media-scripting': cssMediaScripting,
+ 'css-mediaqueries': cssMediaqueries,
+ 'css-mixblendmode': cssMixblendmode,
+ 'css-motion-paths': cssMotionPaths,
+ 'css-namespaces': cssNamespaces,
+ 'css-nesting': cssNesting,
+ 'css-not-sel-list': cssNotSelList,
+ 'css-nth-child-of': cssNthChildOf,
+ 'css-opacity': cssOpacity,
+ 'css-optional-pseudo': cssOptionalPseudo,
+ 'css-overflow': cssOverflow,
+ 'css-overflow-anchor': cssOverflowAnchor,
+ 'css-overflow-overlay': cssOverflowOverlay,
+ 'css-overscroll-behavior': cssOverscrollBehavior,
+ 'css-page-break': cssPageBreak,
+ 'css-paged-media': cssPagedMedia,
+ 'css-paint-api': cssPaintApi,
+ 'css-placeholder': cssPlaceholder,
+ 'css-placeholder-shown': cssPlaceholderShown,
+ 'css-print-color-adjust': cssPrintColorAdjust,
+ 'css-read-only-write': cssReadOnlyWrite,
+ 'css-rebeccapurple': cssRebeccapurple,
+ 'css-reflections': cssReflections,
+ 'css-regions': cssRegions,
+ 'css-relative-colors': cssRelativeColors,
+ 'css-repeating-gradients': cssRepeatingGradients,
+ 'css-resize': cssResize,
+ 'css-revert-value': cssRevertValue,
+ 'css-rrggbbaa': cssRrggbbaa,
+ 'css-scroll-behavior': cssScrollBehavior,
+ 'css-scroll-timeline': cssScrollTimeline,
+ 'css-scrollbar': cssScrollbar,
+ 'css-sel2': cssSel2,
+ 'css-sel3': cssSel3,
+ 'css-selection': cssSelection,
+ 'css-shapes': cssShapes,
+ 'css-snappoints': cssSnappoints,
+ 'css-sticky': cssSticky,
+ 'css-subgrid': cssSubgrid,
+ 'css-supports-api': cssSupportsApi,
+ 'css-table': cssTable,
+ 'css-text-align-last': cssTextAlignLast,
+ 'css-text-box-trim': cssTextBoxTrim,
+ 'css-text-indent': cssTextIndent,
+ 'css-text-justify': cssTextJustify,
+ 'css-text-orientation': cssTextOrientation,
+ 'css-text-spacing': cssTextSpacing,
+ 'css-textshadow': cssTextshadow,
+ 'css-touch-action': cssTouchAction,
+ 'css-transitions': cssTransitions,
+ 'css-unicode-bidi': cssUnicodeBidi,
+ 'css-unset-value': cssUnsetValue,
+ 'css-variables': cssVariables,
+ 'css-when-else': cssWhenElse,
+ 'css-widows-orphans': cssWidowsOrphans,
+ 'css-width-stretch': cssWidthStretch,
+ 'css-writing-mode': cssWritingMode,
+ 'css-zoom': cssZoom,
+ 'css3-attr': css3Attr,
+ 'css3-boxsizing': css3Boxsizing,
+ 'css3-colors': css3Colors,
+ 'css3-cursors': css3Cursors,
+ 'css3-cursors-grab': css3CursorsGrab,
+ 'css3-cursors-newer': css3CursorsNewer,
+ 'css3-tabsize': css3Tabsize,
+ 'currentcolor': currentcolor,
+ 'devicepixelratio': devicepixelratio,
+ 'extended-system-fonts': extendedSystemFonts,
+ 'flexbox': flexbox,
+ 'flexbox-gap': flexboxGap,
+ 'flow-root': flowRoot,
+ 'font-family-system-ui': fontFamilySystemUi,
+ 'font-feature': fontFeature,
+ 'font-kerning': fontKerning,
+ 'font-loading': fontLoading,
+ 'font-size-adjust': fontSizeAdjust,
+ 'font-smooth': fontSmooth,
+ 'font-unicode-range': fontUnicodeRange,
+ 'font-variant-alternates': fontVariantAlternates,
+ 'font-variant-numeric': fontVariantNumeric,
+ 'fontface': fontface,
+ 'fullscreen': fullscreen,
+ 'getcomputedstyle': getcomputedstyle,
+ 'inline-block': inlineBlock,
+ 'intrinsic-width': intrinsicWidth,
+ 'justify-content-space-evenly': justifyContentSpaceEvenly,
+ 'kerning-pairs-ligatures': kerningPairsLigatures,
+ 'mdn-css-unicode-bidi-isolate': mdnCssUnicodeBidiIsolate,
+ 'mdn-css-unicode-bidi-isolate-override': mdnCssUnicodeBidiIsolateOverride,
+ 'mdn-css-unicode-bidi-plaintext': mdnCssUnicodeBidiPlaintext,
+ 'mdn-text-decoration-color': mdnTextDecorationColor,
+ 'mdn-text-decoration-line': mdnTextDecorationLine,
+ 'mdn-text-decoration-shorthand': mdnTextDecorationShorthand,
+ 'mdn-text-decoration-style': mdnTextDecorationStyle,
+ 'minmaxwh': minmaxwh,
+ 'multibackgrounds': multibackgrounds,
+ 'multicolumn': multicolumn,
+ 'object-fit': objectFit,
+ 'outline': outline,
+ 'pointer': pointer,
+ 'pointer-events': pointerEvents,
+ 'prefers-color-scheme': prefersColorScheme,
+ 'prefers-reduced-motion': prefersReducedMotion,
+ 'rem': rem,
+ 'run-in': runIn,
+ 'style-scoped': styleScoped,
+ 'svg-css': svgCss,
+ 'text-decoration': textDecoration,
+ 'text-emphasis': textEmphasis,
+ 'text-overflow': textOverflow,
+ 'text-size-adjust': textSizeAdjust,
+ 'text-stroke': textStroke,
+ 'transforms2d': transforms2d,
+ 'transforms3d': transforms3d,
+ 'ttf': ttf,
+ 'user-select-none': userSelectNone,
+ 'variable-fonts': variableFonts,
+ 'viewport-unit-variants': viewportUnitVariants,
+ 'viewport-units': viewportUnits,
+ 'webkit-user-drag': webkitUserDrag,
+ 'will-change': willChange,
+ 'word-break': wordBreak,
+ 'wordwrap': wordwrap,
+};
+
+/** @typedef {keyof typeof FEATURES} FeatureKeys */
+
+export default /** @type {{[K in FeatureKeys]: Feature}} */ (FEATURES);
diff --git a/node_modules/doiuse/data/features/alternate-stylesheet.js b/node_modules/doiuse/data/features/alternate-stylesheet.js
new file mode 100644
index 00000000..f127e84d
--- /dev/null
+++ b/node_modules/doiuse/data/features/alternate-stylesheet.js
@@ -0,0 +1,12 @@
+/**
+ * No description available.
+ *
+ * See: This feature comes from MDN: https://developer.mozilla.org/en-US/search?q=Alternate+stylesheet
+ */
+
+// This feature is only in HTML, so we don't lint it
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {};
diff --git a/node_modules/doiuse/data/features/background-attachment.js b/node_modules/doiuse/data/features/background-attachment.js
new file mode 100644
index 00000000..cd493ddb
--- /dev/null
+++ b/node_modules/doiuse/data/features/background-attachment.js
@@ -0,0 +1,15 @@
+/**
+ * Method of defining how a background image is attached to a scrollable element. Values include `scroll` (default), `fixed` and `local`.
+ *
+ * See: https://caniuse.com/background-attachment
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'background-attachment': [
+ 'fixed',
+ 'local',
+ ],
+};
diff --git a/node_modules/doiuse/data/features/background-clip-text.js b/node_modules/doiuse/data/features/background-clip-text.js
new file mode 100644
index 00000000..c02c5974
--- /dev/null
+++ b/node_modules/doiuse/data/features/background-clip-text.js
@@ -0,0 +1,13 @@
+/**
+ * Non-standard method of clipping a background image to the foreground text.
+ *
+ * See: https://caniuse.com/background-clip-text
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'background-clip': 'text',
+ '-webkit-background-clip': 'text',
+};
diff --git a/node_modules/doiuse/data/features/background-img-opts.js b/node_modules/doiuse/data/features/background-img-opts.js
new file mode 100644
index 00000000..32ba9590
--- /dev/null
+++ b/node_modules/doiuse/data/features/background-img-opts.js
@@ -0,0 +1,5 @@
+export default {
+ 'background-clip': true,
+ 'background-origin': true,
+ 'background-size': true,
+};
diff --git a/node_modules/doiuse/data/features/background-position-x-y.js b/node_modules/doiuse/data/features/background-position-x-y.js
new file mode 100644
index 00000000..9239d7d0
--- /dev/null
+++ b/node_modules/doiuse/data/features/background-position-x-y.js
@@ -0,0 +1,4 @@
+export default {
+ 'background-position-x': true,
+ 'background-position-y': true,
+};
diff --git a/node_modules/doiuse/data/features/background-repeat-round-space.js b/node_modules/doiuse/data/features/background-repeat-round-space.js
new file mode 100644
index 00000000..0a8fb685
--- /dev/null
+++ b/node_modules/doiuse/data/features/background-repeat-round-space.js
@@ -0,0 +1,12 @@
+/**
+ * Allows CSS background images to be repeated without clipping.
+ *
+ * See: https://caniuse.com/background-repeat-round-space
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'background-repeat': ['round', 'space'],
+};
diff --git a/node_modules/doiuse/data/features/border-image.js b/node_modules/doiuse/data/features/border-image.js
new file mode 100644
index 00000000..911a04ba
--- /dev/null
+++ b/node_modules/doiuse/data/features/border-image.js
@@ -0,0 +1,9 @@
+export default {
+ 'border-image': true,
+ 'border-image-outset': true,
+ 'border-image-repeat': true,
+ 'border-image-slice': true,
+ 'border-image-source': true,
+ 'border-image-width': true,
+
+};
diff --git a/node_modules/doiuse/data/features/border-radius.js b/node_modules/doiuse/data/features/border-radius.js
new file mode 100644
index 00000000..ed207b05
--- /dev/null
+++ b/node_modules/doiuse/data/features/border-radius.js
@@ -0,0 +1,7 @@
+export default {
+ 'border-radius': true,
+ 'border-top-left-radius': true,
+ 'border-top-right-radius': true,
+ 'border-bottom-right-radius': true,
+ 'border-bottom-left-radius': true,
+};
diff --git a/node_modules/doiuse/data/features/calc.js b/node_modules/doiuse/data/features/calc.js
new file mode 100644
index 00000000..f20331d6
--- /dev/null
+++ b/node_modules/doiuse/data/features/calc.js
@@ -0,0 +1,3 @@
+export default {
+ '': 'calc(',
+};
diff --git a/node_modules/doiuse/data/features/ch-unit.js b/node_modules/doiuse/data/features/ch-unit.js
new file mode 100644
index 00000000..57da8096
--- /dev/null
+++ b/node_modules/doiuse/data/features/ch-unit.js
@@ -0,0 +1,8 @@
+import { checkCSSLengthUnits } from '../../utils/util.js';
+
+/**
+ * Unit representing the width of the character "0" in the current font, of particular use in combination with monospace fonts.
+ * @see https://caniuse.com/ch-unit
+ * @type {import('../features').Feature}
+ */
+export default checkCSSLengthUnits('ch');
diff --git a/node_modules/doiuse/data/features/css-all.js b/node_modules/doiuse/data/features/css-all.js
new file mode 100644
index 00000000..8112d162
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-all.js
@@ -0,0 +1,3 @@
+export default {
+ 'all': true,
+};
diff --git a/node_modules/doiuse/data/features/css-animation.js b/node_modules/doiuse/data/features/css-animation.js
new file mode 100644
index 00000000..7c2fb88f
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-animation.js
@@ -0,0 +1,14 @@
+export default {
+ 'animation': true,
+ 'animation-name': true,
+ 'animation-duration': true,
+ 'animation-timing-function': true,
+ 'animation-iteration-count': true,
+ 'animation-direction': true,
+ 'animation-play-state': true,
+ 'animation-delay': true,
+ 'animation-fill-mode': true,
+};
+
+// @keyframes isn't checked for, but if you try to use it,
+// you'll still get a warning anyway because of the 'animation' property
diff --git a/node_modules/doiuse/data/features/css-any-link.js b/node_modules/doiuse/data/features/css-any-link.js
new file mode 100644
index 00000000..990a591d
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-any-link.js
@@ -0,0 +1,3 @@
+import { checkSelector } from '../../utils/util.js';
+
+export default checkSelector([':any-link', ':-webkit-any-link']);
diff --git a/node_modules/doiuse/data/features/css-appearance.js b/node_modules/doiuse/data/features/css-appearance.js
new file mode 100644
index 00000000..f316c2d4
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-appearance.js
@@ -0,0 +1,5 @@
+export default {
+ 'appearance': true,
+ '-webkit-appearance': true,
+ '-moz-appearance': true,
+};
diff --git a/node_modules/doiuse/data/features/css-at-counter-style.js b/node_modules/doiuse/data/features/css-at-counter-style.js
new file mode 100644
index 00000000..d944cc62
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-at-counter-style.js
@@ -0,0 +1,3 @@
+import { checkAtRule } from '../../utils/util.js';
+
+export default checkAtRule('counter-style');
diff --git a/node_modules/doiuse/data/features/css-autofill.js b/node_modules/doiuse/data/features/css-autofill.js
new file mode 100644
index 00000000..52850482
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-autofill.js
@@ -0,0 +1,3 @@
+import { checkSelector } from '../../utils/util.js';
+
+export default checkSelector([':autofill', ':-webkit-autofill']);
diff --git a/node_modules/doiuse/data/features/css-backdrop-filter.js b/node_modules/doiuse/data/features/css-backdrop-filter.js
new file mode 100644
index 00000000..ac92860c
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-backdrop-filter.js
@@ -0,0 +1,3 @@
+export default {
+ 'backdrop-filter': true,
+};
diff --git a/node_modules/doiuse/data/features/css-background-offsets.js b/node_modules/doiuse/data/features/css-background-offsets.js
new file mode 100644
index 00000000..0fb021d4
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-background-offsets.js
@@ -0,0 +1,11 @@
+import { list } from 'postcss';
+
+/**
+ * @param {import('postcss').ChildNode} rule
+ * @return {boolean}
+ */
+export default (rule) => {
+ if (rule.type !== 'decl') return false;
+ if (rule.prop !== 'background-position') return false;
+ return list.space(rule.value).length > 2;
+};
diff --git a/node_modules/doiuse/data/features/css-backgroundblendmode.js b/node_modules/doiuse/data/features/css-backgroundblendmode.js
new file mode 100644
index 00000000..f2e5181e
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-backgroundblendmode.js
@@ -0,0 +1,3 @@
+export default {
+ 'background-blend-mode': true,
+};
diff --git a/node_modules/doiuse/data/features/css-boxdecorationbreak.js b/node_modules/doiuse/data/features/css-boxdecorationbreak.js
new file mode 100644
index 00000000..a68839a0
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-boxdecorationbreak.js
@@ -0,0 +1,13 @@
+/**
+ * Controls whether the box's margins, borders, padding, and other decorations wrap the broken edges of the box fragments (when the box is split by a break (page/column/region/line).
+ *
+ * See: https://caniuse.com/css-boxdecorationbreak
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'box-decoration-break': true,
+ '-webkit-box-decoration-break': true,
+};
diff --git a/node_modules/doiuse/data/features/css-boxshadow.js b/node_modules/doiuse/data/features/css-boxshadow.js
new file mode 100644
index 00000000..ac91aba2
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-boxshadow.js
@@ -0,0 +1,3 @@
+export default {
+ 'box-shadow': true,
+};
diff --git a/node_modules/doiuse/data/features/css-canvas.js b/node_modules/doiuse/data/features/css-canvas.js
new file mode 100644
index 00000000..92b858b8
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-canvas.js
@@ -0,0 +1,9 @@
+/**
+ * @param {import('postcss').ChildNode} rule
+ * @return {boolean}
+ */
+export default (rule) => {
+ if (rule.type !== 'decl') return false;
+ if (!rule.prop.startsWith('background')) return false;
+ return rule.value.startsWith('-webkit-canvas');
+};
diff --git a/node_modules/doiuse/data/features/css-caret-color.js b/node_modules/doiuse/data/features/css-caret-color.js
new file mode 100644
index 00000000..da95db5c
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-caret-color.js
@@ -0,0 +1,12 @@
+/**
+ * The `caret-color` property allows the color to be set of the caret (blinking text insertion pointer) in an editable text area.
+ *
+ * See: https://caniuse.com/css-caret-color
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'caret-color': true,
+};
diff --git a/node_modules/doiuse/data/features/css-cascade-layers.js b/node_modules/doiuse/data/features/css-cascade-layers.js
new file mode 100644
index 00000000..6edd5dbb
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-cascade-layers.js
@@ -0,0 +1,12 @@
+/**
+ * The `@layer` at-rule allows authors to explicitly layer their styles in the cascade, before specificity and order of appearance are considered.
+ *
+ * See: https://caniuse.com/css-cascade-layers
+ */
+
+import { checkAtRule } from '../../utils/util.js';
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default checkAtRule('layer');
diff --git a/node_modules/doiuse/data/features/css-case-insensitive.js b/node_modules/doiuse/data/features/css-case-insensitive.js
new file mode 100644
index 00000000..72c36107
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-case-insensitive.js
@@ -0,0 +1,14 @@
+/**
+ * Including an `i` before the `]` in a CSS attribute selector causes the attribute value to be matched in an ASCII-case-insensitive manner. For example, `[b="xyz" i]` would match both `<a b="xyz">` and `<a b="XYZ">`.
+ *
+ * See: https://caniuse.com/css-case-insensitive
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default (rule) => {
+ if (rule.type !== 'rule') { return false; }
+ if (/\[.*i]/.test(rule.selector)) { return true; }
+ return false;
+};
diff --git a/node_modules/doiuse/data/features/css-clip-path.js b/node_modules/doiuse/data/features/css-clip-path.js
new file mode 100644
index 00000000..d1322c5e
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-clip-path.js
@@ -0,0 +1,3 @@
+export default {
+ 'clip-path': true,
+};
diff --git a/node_modules/doiuse/data/features/css-color-adjust.js b/node_modules/doiuse/data/features/css-color-adjust.js
new file mode 100644
index 00000000..1feb161f
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-color-adjust.js
@@ -0,0 +1,13 @@
+/**
+ * The `print-color-adjust` (or `-webkit-print-color-adjust` as prefixed in WebKit/Blink browsers) property is a CSS extension that can be used to force printing of background colors and images.
+ *
+ * See: https://caniuse.com/css-color-adjust
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'print-color-adjust': true,
+ '-webkit-print-color-adjust': true,
+};
diff --git a/node_modules/doiuse/data/features/css-color-function.js b/node_modules/doiuse/data/features/css-color-function.js
new file mode 100644
index 00000000..0cd1dc34
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-color-function.js
@@ -0,0 +1,12 @@
+/**
+ * The CSS `color()` function allows the browser to display colors in any color space, such as the P3 color space which can display colors outside of the default sRGB color space.
+ *
+ * See: https://caniuse.com/css-color-function
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ '': 'color(',
+};
diff --git a/node_modules/doiuse/data/features/css-conic-gradients.js b/node_modules/doiuse/data/features/css-conic-gradients.js
new file mode 100644
index 00000000..60494e7b
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-conic-gradients.js
@@ -0,0 +1,12 @@
+const REGEX = /(^|[^-])(repeating-)?conic-gradient/;
+
+export default {
+ 'background': REGEX,
+ 'background-image': REGEX,
+ 'border-image': REGEX,
+ 'border-image-source': REGEX,
+ 'content': REGEX,
+ 'cursor': REGEX,
+ 'list-style': REGEX,
+ 'list-style-image': REGEX,
+};
diff --git a/node_modules/doiuse/data/features/css-container-queries-style.js b/node_modules/doiuse/data/features/css-container-queries-style.js
new file mode 100644
index 00000000..d9886295
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-container-queries-style.js
@@ -0,0 +1,3 @@
+import { checkAtRule } from '../../utils/util.js';
+
+export default checkAtRule('container', 'style(');
diff --git a/node_modules/doiuse/data/features/css-container-queries.js b/node_modules/doiuse/data/features/css-container-queries.js
new file mode 100644
index 00000000..1b013096
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-container-queries.js
@@ -0,0 +1,12 @@
+/**
+ * Size queries in Container Queries provide a way to query the size of a container, and conditionally apply CSS to the content of that container.
+ *
+ * See: https://caniuse.com/css-container-queries
+ */
+
+import { checkAtRule } from '../../utils/util.js';
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default checkAtRule('container');
diff --git a/node_modules/doiuse/data/features/css-container-query-units.js b/node_modules/doiuse/data/features/css-container-query-units.js
new file mode 100644
index 00000000..c6212b4f
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-container-query-units.js
@@ -0,0 +1,10 @@
+import { checkCSSLengthUnits } from '../../utils/util.js';
+
+export default checkCSSLengthUnits(
+ 'cqw',
+ 'cqh',
+ 'cqi',
+ 'cqb',
+ 'cqmin',
+ 'cqmax',
+);
diff --git a/node_modules/doiuse/data/features/css-containment.js b/node_modules/doiuse/data/features/css-containment.js
new file mode 100644
index 00000000..c9492d32
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-containment.js
@@ -0,0 +1,12 @@
+/**
+ * The CSS `contain` property lets developers limit the scope of the browser's styles, layout and paint work for faster and more efficient rendering.
+ *
+ * See: https://caniuse.com/css-containment
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'contain': true,
+};
diff --git a/node_modules/doiuse/data/features/css-content-visibility.js b/node_modules/doiuse/data/features/css-content-visibility.js
new file mode 100644
index 00000000..2adef2da
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-content-visibility.js
@@ -0,0 +1,12 @@
+/**
+ * Provides control over when elements are rendered, so rendering can be skipped for elements not yet in the user's viewport.
+ *
+ * See: https://caniuse.com/css-content-visibility
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'content-visibility': true,
+};
diff --git a/node_modules/doiuse/data/features/css-counters.js b/node_modules/doiuse/data/features/css-counters.js
new file mode 100644
index 00000000..56b824e2
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-counters.js
@@ -0,0 +1,5 @@
+export default {
+ 'counter-reset': true,
+ 'counter-increment': true,
+ '': 'counter(',
+};
diff --git a/node_modules/doiuse/data/features/css-crisp-edges.js b/node_modules/doiuse/data/features/css-crisp-edges.js
new file mode 100644
index 00000000..31690145
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-crisp-edges.js
@@ -0,0 +1,12 @@
+/**
+ * Scales images with an algorithm that preserves edges and contrast, without smoothing colors or introducing blur. This is intended for images such as pixel art. Official values that accomplish this for the `image-rendering` property are `crisp-edges` and `pixelated`.
+ *
+ * See: https://caniuse.com/css-crisp-edges
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'image-rendering': ['crisp-edges', 'pixelated'],
+};
diff --git a/node_modules/doiuse/data/features/css-cross-fade.js b/node_modules/doiuse/data/features/css-cross-fade.js
new file mode 100644
index 00000000..bf32aee7
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-cross-fade.js
@@ -0,0 +1,15 @@
+/**
+ * Image function to create a "crossfade" between images. This allows one image to transition (fade) into another based on a percentage value.
+ *
+ * See: https://caniuse.com/css-cross-fade
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ '': [
+ 'cross-fade(',
+ '-webkit-cross-fade(',
+ ],
+};
diff --git a/node_modules/doiuse/data/features/css-default-pseudo.js b/node_modules/doiuse/data/features/css-default-pseudo.js
new file mode 100644
index 00000000..e191fd88
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-default-pseudo.js
@@ -0,0 +1,12 @@
+/**
+ * The `:default` pseudo-class matches checkboxes and radio buttons which are checked by default, `<option>`s with the `selected` attribute, and the default submit button (if any) of a form.
+ *
+ * See: https://caniuse.com/css-default-pseudo
+ */
+
+import { checkSelector } from '../../utils/util.js';
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default checkSelector(':default');
diff --git a/node_modules/doiuse/data/features/css-descendant-gtgt.js b/node_modules/doiuse/data/features/css-descendant-gtgt.js
new file mode 100644
index 00000000..48371d35
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-descendant-gtgt.js
@@ -0,0 +1,12 @@
+/**
+ * An explicit, non-whitespace spelling of the descendant combinator. `A >> B` is equivalent to `A B`.
+ *
+ * See: https://caniuse.com/css-descendant-gtgt
+ */
+
+import { checkSelector } from '../../utils/util.js';
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default checkSelector('>>');
diff --git a/node_modules/doiuse/data/features/css-deviceadaptation.js b/node_modules/doiuse/data/features/css-deviceadaptation.js
new file mode 100644
index 00000000..ac3481ac
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-deviceadaptation.js
@@ -0,0 +1,12 @@
+/**
+ * Method of overriding the size of viewport in web page using the `@viewport` rule, replacing Apple's own popular `<meta>` viewport implementation. Includes the `extend-to-zoom` width value.
+ *
+ * See: https://caniuse.com/css-deviceadaptation
+ */
+
+import { checkAtRule } from '../../utils/util.js';
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default checkAtRule('viewport');
diff --git a/node_modules/doiuse/data/features/css-dir-pseudo.js b/node_modules/doiuse/data/features/css-dir-pseudo.js
new file mode 100644
index 00000000..0b16e8f8
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-dir-pseudo.js
@@ -0,0 +1,12 @@
+/**
+ * Matches elements based on their directionality. `:dir(ltr)` matches elements which are Left-to-Right. `:dir(rtl)` matches elements which are Right-to-Left.
+ *
+ * See: https://caniuse.com/css-dir-pseudo
+ */
+
+import { checkSelector } from '../../utils/util.js';
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default checkSelector(':dir(');
diff --git a/node_modules/doiuse/data/features/css-display-contents.js b/node_modules/doiuse/data/features/css-display-contents.js
new file mode 100644
index 00000000..d6b002fd
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-display-contents.js
@@ -0,0 +1,12 @@
+/**
+ * `display: contents` causes an element's children to appear as if they were direct children of the element's parent, ignoring the element itself. This can be useful when a wrapper element should be ignored when using CSS grid or similar layout techniques.
+ *
+ * See: https://caniuse.com/css-display-contents
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'display': 'contents',
+};
diff --git a/node_modules/doiuse/data/features/css-element-function.js b/node_modules/doiuse/data/features/css-element-function.js
new file mode 100644
index 00000000..4d9171a0
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-element-function.js
@@ -0,0 +1,12 @@
+/**
+ * This function renders a live image generated from an arbitrary HTML element
+ *
+ * See: https://caniuse.com/css-element-function
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ '': 'element(',
+};
diff --git a/node_modules/doiuse/data/features/css-env-function.js b/node_modules/doiuse/data/features/css-env-function.js
new file mode 100644
index 00000000..4b275b55
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-env-function.js
@@ -0,0 +1,3 @@
+export default {
+ '': 'env(',
+};
diff --git a/node_modules/doiuse/data/features/css-exclusions.js b/node_modules/doiuse/data/features/css-exclusions.js
new file mode 100644
index 00000000..1e45ea6e
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-exclusions.js
@@ -0,0 +1,13 @@
+/**
+ * Exclusions defines how inline content flows around elements. It extends the content wrapping ability of floats to any block-level element.
+ *
+ * See: https://caniuse.com/css-exclusions
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'wrap-flow': true,
+ '-ms-wrap-flow': true,
+};
diff --git a/node_modules/doiuse/data/features/css-featurequeries.js b/node_modules/doiuse/data/features/css-featurequeries.js
new file mode 100644
index 00000000..ecd372f8
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-featurequeries.js
@@ -0,0 +1,3 @@
+import { checkAtRule } from '../../utils/util.js';
+
+export default checkAtRule(['supports']);
diff --git a/node_modules/doiuse/data/features/css-file-selector-button.js b/node_modules/doiuse/data/features/css-file-selector-button.js
new file mode 100644
index 00000000..bc8d7682
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-file-selector-button.js
@@ -0,0 +1,12 @@
+/**
+ * No description available.
+ *
+ * See: This feature comes from MDN: https://developer.mozilla.org/en-US/search?q=::file-selector-button+CSS+pseudo-element
+ */
+
+import { checkSelector } from '../../utils/util.js';
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default checkSelector(':file-selector-button');
diff --git a/node_modules/doiuse/data/features/css-filter-function.js b/node_modules/doiuse/data/features/css-filter-function.js
new file mode 100644
index 00000000..d83f30f6
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-filter-function.js
@@ -0,0 +1,12 @@
+/**
+ * This function filters a CSS input image with a set of filter functions (like blur, grayscale or hue)
+ *
+ * See: https://caniuse.com/css-filter-function
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ '': 'filter(',
+};
diff --git a/node_modules/doiuse/data/features/css-filters.js b/node_modules/doiuse/data/features/css-filters.js
new file mode 100644
index 00000000..f10dfe6c
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-filters.js
@@ -0,0 +1,3 @@
+export default {
+ 'filter': true,
+};
diff --git a/node_modules/doiuse/data/features/css-first-letter.js b/node_modules/doiuse/data/features/css-first-letter.js
new file mode 100644
index 00000000..efaf92f8
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-first-letter.js
@@ -0,0 +1,12 @@
+/**
+ * CSS pseudo-element that allows styling only the first "letter" of text within an element. Useful for implementing initial caps or drop caps styling.
+ *
+ * See: https://caniuse.com/css-first-letter
+ */
+
+import { checkSelector } from '../../utils/util.js';
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default checkSelector(':first-letter');
diff --git a/node_modules/doiuse/data/features/css-first-line.js b/node_modules/doiuse/data/features/css-first-line.js
new file mode 100644
index 00000000..4f6e5df7
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-first-line.js
@@ -0,0 +1,12 @@
+/**
+ * Allows styling specifically for the first line of text using the `::first-line` pseudo-element. Note that only a limited set of properties can be applied.
+ *
+ * See: https://caniuse.com/css-first-line
+ */
+
+import { checkSelector } from '../../utils/util.js';
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default checkSelector(':first-line');
diff --git a/node_modules/doiuse/data/features/css-fixed.js b/node_modules/doiuse/data/features/css-fixed.js
new file mode 100644
index 00000000..9075e504
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-fixed.js
@@ -0,0 +1,3 @@
+export default {
+ 'position': 'fixed',
+};
diff --git a/node_modules/doiuse/data/features/css-focus-visible.js b/node_modules/doiuse/data/features/css-focus-visible.js
new file mode 100644
index 00000000..54d79eb6
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-focus-visible.js
@@ -0,0 +1,12 @@
+/**
+ * The `:focus-visible` pseudo-class applies while an element matches the `:focus` pseudo-class, and the UA determines via heuristics that the focus should be specially indicated on the element (typically via a “focus ring”).
+ *
+ * See: https://caniuse.com/css-focus-visible
+ */
+
+import { checkSelector } from '../../utils/util.js';
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default checkSelector(':focus-visible');
diff --git a/node_modules/doiuse/data/features/css-focus-within.js b/node_modules/doiuse/data/features/css-focus-within.js
new file mode 100644
index 00000000..f020462b
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-focus-within.js
@@ -0,0 +1,12 @@
+/**
+ * The `:focus-within` pseudo-class matches elements that either themselves match `:focus` or that have descendants which match `:focus`.
+ *
+ * See: https://caniuse.com/css-focus-within
+ */
+
+import { checkSelector } from '../../utils/util.js';
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default checkSelector(':focus-within');
diff --git a/node_modules/doiuse/data/features/css-font-palette.js b/node_modules/doiuse/data/features/css-font-palette.js
new file mode 100644
index 00000000..8c8eff4e
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-font-palette.js
@@ -0,0 +1,6 @@
+import { checkAtRule, performFeatureCheck } from '../../utils/util.js';
+
+export default [
+ (rule) => performFeatureCheck('font-palette', rule.name),
+ checkAtRule('font-palette-values'),
+];
diff --git a/node_modules/doiuse/data/features/css-font-rendering-controls.js b/node_modules/doiuse/data/features/css-font-rendering-controls.js
new file mode 100644
index 00000000..ba99dfc8
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-font-rendering-controls.js
@@ -0,0 +1,12 @@
+/**
+ * `@font-face` descriptor `font-display` that allows control over how a downloadable font renders before it is fully loaded.
+ *
+ * See: https://caniuse.com/css-font-rendering-controls
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'font-display': true,
+};
diff --git a/node_modules/doiuse/data/features/css-font-stretch.js b/node_modules/doiuse/data/features/css-font-stretch.js
new file mode 100644
index 00000000..239170d3
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-font-stretch.js
@@ -0,0 +1,3 @@
+export default {
+ 'font-stretch': true,
+};
diff --git a/node_modules/doiuse/data/features/css-gencontent.js b/node_modules/doiuse/data/features/css-gencontent.js
new file mode 100644
index 00000000..d420e074
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-gencontent.js
@@ -0,0 +1,3 @@
+import { checkSelector } from '../../utils/util.js';
+
+export default checkSelector([':before', ':after']);
diff --git a/node_modules/doiuse/data/features/css-gradients.js b/node_modules/doiuse/data/features/css-gradients.js
new file mode 100644
index 00000000..b889583e
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-gradients.js
@@ -0,0 +1,12 @@
+const REGEX = /(^|[^-])((linear)|(radial))-gradient/;
+
+export default {
+ 'background': REGEX,
+ 'background-image': REGEX,
+ 'border-image': REGEX,
+ 'border-image-source': REGEX,
+ 'content': REGEX,
+ 'cursor': REGEX,
+ 'list-style': REGEX,
+ 'list-style-image': REGEX,
+};
diff --git a/node_modules/doiuse/data/features/css-grid-animation.js b/node_modules/doiuse/data/features/css-grid-animation.js
new file mode 100644
index 00000000..50be7da2
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-grid-animation.js
@@ -0,0 +1,6 @@
+const REGEX = /grid/;
+
+export default {
+ 'transition': REGEX,
+ 'transition-property': REGEX,
+};
diff --git a/node_modules/doiuse/data/features/css-grid.js b/node_modules/doiuse/data/features/css-grid.js
new file mode 100644
index 00000000..3387ed60
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-grid.js
@@ -0,0 +1,23 @@
+/** @see https://drafts.csswg.org/css-grid/ */
+
+export default {
+ 'display': ['grid', 'inline-grid', '-ms-grid'],
+ 'grid': true,
+ 'grid-area': true,
+ 'grid-auto-columns': true,
+
+ 'grid-auto-flow': true,
+ 'grid-auto-rows': true,
+ 'grid-column': true,
+ 'grid-column-end': true,
+
+ 'grid-column-start': true,
+ 'grid-row': true,
+ 'grid-row-end': true,
+ 'grid-row-start': true,
+
+ 'grid-template': true,
+ 'grid-template-areas': true,
+ 'grid-template-columns': true,
+ 'grid-template-rows': true,
+};
diff --git a/node_modules/doiuse/data/features/css-hanging-punctuation.js b/node_modules/doiuse/data/features/css-hanging-punctuation.js
new file mode 100644
index 00000000..def2e2db
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-hanging-punctuation.js
@@ -0,0 +1,11 @@
+/**
+ * Allows some punctuation characters from start (or the end) of text elements to be placed "outside" of the box in order to preserve the reading flow.
+ * @see https://caniuse.com/css-hanging-punctuation
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'hanging-punctuation': true,
+};
diff --git a/node_modules/doiuse/data/features/css-has.js b/node_modules/doiuse/data/features/css-has.js
new file mode 100644
index 00000000..da108c07
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-has.js
@@ -0,0 +1,11 @@
+/**
+ * Select elements containing specific content. For example, `a:has(img)` selects all `<a>` elements that contain an `<img>` child.
+ * @see https://caniuse.com/css-has
+ */
+
+import { checkSelector } from '../../utils/util.js';
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default checkSelector(':has');
diff --git a/node_modules/doiuse/data/features/css-hyphens.js b/node_modules/doiuse/data/features/css-hyphens.js
new file mode 100644
index 00000000..fff20407
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-hyphens.js
@@ -0,0 +1,3 @@
+export default {
+ 'hyphens': true,
+};
diff --git a/node_modules/doiuse/data/features/css-image-orientation.js b/node_modules/doiuse/data/features/css-image-orientation.js
new file mode 100644
index 00000000..6a715f39
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-image-orientation.js
@@ -0,0 +1,3 @@
+export default {
+ 'image-orientation': true,
+};
diff --git a/node_modules/doiuse/data/features/css-image-set.js b/node_modules/doiuse/data/features/css-image-set.js
new file mode 100644
index 00000000..9134ce83
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-image-set.js
@@ -0,0 +1,11 @@
+/**
+ * Method of letting the browser pick the most appropriate CSS image from a given set.
+ * @see https://caniuse.com/css-image-set
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ '': 'image-set(',
+};
diff --git a/node_modules/doiuse/data/features/css-in-out-of-range.js b/node_modules/doiuse/data/features/css-in-out-of-range.js
new file mode 100644
index 00000000..dae751db
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-in-out-of-range.js
@@ -0,0 +1,14 @@
+/**
+ * If a temporal or number `<input>` has `max` and/or `min` attributes, then `:in-range` matches when the value is within the specified range and `:out-of-range` matches when the value is outside the specified range. If there are no range constraints, then neither pseudo-class matches.
+ * @see https://caniuse.com/css-in-out-of-range
+ */
+
+import { checkSelector } from '../../utils/util.js';
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default checkSelector([
+ ':in-range',
+ ':out-of-range',
+]);
diff --git a/node_modules/doiuse/data/features/css-indeterminate-pseudo.js b/node_modules/doiuse/data/features/css-indeterminate-pseudo.js
new file mode 100644
index 00000000..855f8b27
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-indeterminate-pseudo.js
@@ -0,0 +1,11 @@
+/**
+ * The `:indeterminate` pseudo-class matches indeterminate checkboxes, indeterminate `<progress>` bars, and radio buttons with no checked button in their radio button group.
+ * @see https://caniuse.com/css-indeterminate-pseudo
+ */
+
+import { checkSelector } from '../../utils/util.js';
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default checkSelector(':indeterminate');
diff --git a/node_modules/doiuse/data/features/css-initial-letter.js b/node_modules/doiuse/data/features/css-initial-letter.js
new file mode 100644
index 00000000..8376c7b8
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-initial-letter.js
@@ -0,0 +1,11 @@
+/**
+ * Method of creating an enlarged cap, including a drop or raised cap, in a robust way.
+ * @see https://caniuse.com/css-initial-letter
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'initial-letter': true,
+};
diff --git a/node_modules/doiuse/data/features/css-initial-value.js b/node_modules/doiuse/data/features/css-initial-value.js
new file mode 100644
index 00000000..21eb98f5
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-initial-value.js
@@ -0,0 +1,3 @@
+export default {
+ '': 'initial',
+};
diff --git a/node_modules/doiuse/data/features/css-lch-lab.js b/node_modules/doiuse/data/features/css-lch-lab.js
new file mode 100644
index 00000000..9d208641
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-lch-lab.js
@@ -0,0 +1,14 @@
+/**
+ * The `lch()` and `lab()` color functions are based on the CIE LAB color space, representing colors in a way that closely matches human perception and provides access to a wider spectrum of colors than offered by the usual RGB color space.
+ * @see https://caniuse.com/css-lch-lab
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ '': [
+ 'lch(',
+ 'lab(',
+ ],
+};
diff --git a/node_modules/doiuse/data/features/css-letter-spacing.js b/node_modules/doiuse/data/features/css-letter-spacing.js
new file mode 100644
index 00000000..60f900ab
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-letter-spacing.js
@@ -0,0 +1,11 @@
+/**
+ * Controls spacing between characters of text (i.e. "tracking" in typographical terms). Not to be confused with kerning.
+ * @see https://caniuse.com/css-letter-spacing
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'letter-spacing': true,
+};
diff --git a/node_modules/doiuse/data/features/css-line-clamp.js b/node_modules/doiuse/data/features/css-line-clamp.js
new file mode 100644
index 00000000..bb704439
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-line-clamp.js
@@ -0,0 +1,12 @@
+/**
+ * CSS property that will contain text to a given amount of lines when used in combination with `display: -webkit-box`. It will end with ellipsis when `text-overflow: ellipsis` is included.
+ * @see https://caniuse.com/css-line-clamp
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'line-clamp': true,
+ '-webkit-line-clamp': true,
+};
diff --git a/node_modules/doiuse/data/features/css-logical-props.js b/node_modules/doiuse/data/features/css-logical-props.js
new file mode 100644
index 00000000..13c70831
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-logical-props.js
@@ -0,0 +1,60 @@
+export default {
+ 'block-size': true,
+ 'inline-size': true,
+ 'min-block-size': true,
+ 'min-inline-size': true,
+ 'max-block-size': true,
+ 'max-inline-size': true,
+ 'margin-block-start': true,
+ 'margin-block-end': true,
+ 'margin-inline-start': true,
+ 'margin-inline-end': true,
+ 'margin-block': true,
+ 'margin-inline': true,
+ 'inset-block-start': true,
+ 'inset-block-end': true,
+ 'inset-inline-start': true,
+ 'inset-inline-end': true,
+ 'inset-block': true,
+ 'inset-inline': true,
+ 'inset': true,
+ 'padding-block-start': true,
+ 'padding-block-end': true,
+ 'padding-inline-start': true,
+ 'padding-inline-end': true,
+ 'padding-block': true,
+ 'padding-inline': true,
+ 'border-block-start-width': true,
+ 'border-block-end-width': true,
+ 'border-inline-start-width': true,
+ 'border-inline-end-width': true,
+ 'border-block-width': true,
+ 'border-inline-width': true,
+ 'border-block-start-style': true,
+ 'border-block-end-style': true,
+ 'border-inline-start-style': true,
+ 'border-inline-end-style': true,
+ 'border-block-style': true,
+ 'border-inline-style': true,
+ 'border-block-start-color': true,
+ 'border-block-end-color': true,
+ 'border-inline-start-color': true,
+ 'border-inline-end-color': true,
+ 'border-block-color': true,
+ 'border-inline-color': true,
+ 'border-block-start': true,
+ 'border-block-end': true,
+ 'border-inline-start': true,
+ 'border-inline-end': true,
+ 'border-block': true,
+ 'border-inline': true,
+ 'border-start-start-radius': true,
+ 'border-start-end-radius': true,
+ 'border-end-start-radius': true,
+ 'border-end-end-radius': true,
+ 'text-align': ['start', 'end'],
+ 'float': ['inline-start', 'inline-end'],
+ 'resize': ['block', 'inline'],
+ 'overflow-block': true,
+ 'overflow-inline': true,
+};
diff --git a/node_modules/doiuse/data/features/css-marker-pseudo.js b/node_modules/doiuse/data/features/css-marker-pseudo.js
new file mode 100644
index 00000000..e8d51a39
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-marker-pseudo.js
@@ -0,0 +1,11 @@
+/**
+ * The `::marker` pseudo-element allows list item markers to be styled or have their content value customized.
+ * @see https://caniuse.com/css-marker-pseudo
+ */
+
+import { checkSelector } from '../../utils/util.js';
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default checkSelector(':marker');
diff --git a/node_modules/doiuse/data/features/css-masks.js b/node_modules/doiuse/data/features/css-masks.js
new file mode 100644
index 00000000..fab5f338
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-masks.js
@@ -0,0 +1,39 @@
+export default {
+ 'clip-path': true,
+ 'mask': true,
+ 'mask-border': true,
+ 'mask-border-mode': true,
+ 'mask-border-outset': true,
+ 'mask-border-repeat': true,
+ 'mask-border-slice': true,
+ 'mask-border-source': true,
+ 'mask-border-width': true,
+ 'mask-clip': true,
+ 'mask-composite': true,
+ 'mask-image': true,
+ 'mask-mode': true,
+ 'mask-origin': true,
+ 'mask-position': true,
+ 'mask-repeat': true,
+ 'mask-size': true,
+ 'mask-type': true,
+ // and webkit versions
+ '-webkit-clip-path': true,
+ '-webkit-mask': true,
+ '-webkit-mask-border': true,
+ '-webkit-mask-border-mode': true,
+ '-webkit-mask-border-outset': true,
+ '-webkit-mask-border-repeat': true,
+ '-webkit-mask-border-slice': true,
+ '-webkit-mask-border-source': true,
+ '-webkit-mask-border-width': true,
+ '-webkit-mask-clip': true,
+ '-webkit-mask-composite': true,
+ '-webkit-mask-image': true,
+ '-webkit-mask-mode': true,
+ '-webkit-mask-origin': true,
+ '-webkit-mask-position': true,
+ '-webkit-mask-repeat': true,
+ '-webkit-mask-size': true,
+ '-webkit-mask-type': true,
+};
diff --git a/node_modules/doiuse/data/features/css-matches-pseudo.js b/node_modules/doiuse/data/features/css-matches-pseudo.js
new file mode 100644
index 00000000..e1696a9a
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-matches-pseudo.js
@@ -0,0 +1,12 @@
+import { checkSelector } from '../../utils/util.js';
+
+export default checkSelector([
+ ':is',
+ ':where',
+ ':matches',
+ ':any',
+ ':-webkit-any',
+ ':-webkit-is',
+ ':-webkit-where',
+ ':-webkit-matches',
+]);
diff --git a/node_modules/doiuse/data/features/css-math-functions.js b/node_modules/doiuse/data/features/css-math-functions.js
new file mode 100644
index 00000000..59bab0f4
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-math-functions.js
@@ -0,0 +1,3 @@
+export default {
+ '': ['min(', 'max(', 'clamp('],
+};
diff --git a/node_modules/doiuse/data/features/css-media-interaction.js b/node_modules/doiuse/data/features/css-media-interaction.js
new file mode 100644
index 00000000..23e1a9c7
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-media-interaction.js
@@ -0,0 +1,16 @@
+/**
+ * Allows a media query to be set based on the presence and accuracy of the user's pointing device, and whether they have the ability to hover over elements on the page. This includes the `pointer`, `any-pointer`, `hover`, and `any-hover` media features.
+ * @see https://caniuse.com/css-media-interaction
+ */
+
+import { checkAtRule } from '../../utils/util.js';
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default checkAtRule('media', [
+ 'pointer',
+ 'any-pointer',
+ 'hover',
+ 'any-hover',
+]);
diff --git a/node_modules/doiuse/data/features/css-media-range-syntax.js b/node_modules/doiuse/data/features/css-media-range-syntax.js
new file mode 100644
index 00000000..ff9de126
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-media-range-syntax.js
@@ -0,0 +1,3 @@
+import { checkAtRule } from '../../utils/util.js';
+
+export default checkAtRule('media', [' > ', ' < ', ' <= ', ' >= ']);
diff --git a/node_modules/doiuse/data/features/css-media-resolution.js b/node_modules/doiuse/data/features/css-media-resolution.js
new file mode 100644
index 00000000..a995449a
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-media-resolution.js
@@ -0,0 +1,3 @@
+import { checkAtRule } from '../../utils/util.js';
+
+export default checkAtRule('media', ['min-resolution', 'max-resolution', 'resolution', 'device-pixel-ratio']);
diff --git a/node_modules/doiuse/data/features/css-media-scripting.js b/node_modules/doiuse/data/features/css-media-scripting.js
new file mode 100644
index 00000000..cfac81d2
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-media-scripting.js
@@ -0,0 +1,11 @@
+/**
+ * No description available.
+ * @see This feature comes from MDN: https://developer.mozilla.org/en-US/search?q=Media+Queries:+scripting+media+feature
+ */
+
+import { checkAtRule } from '../../utils/util.js';
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default checkAtRule('media', ['scripting']);
diff --git a/node_modules/doiuse/data/features/css-mediaqueries.js b/node_modules/doiuse/data/features/css-mediaqueries.js
new file mode 100644
index 00000000..0f251607
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-mediaqueries.js
@@ -0,0 +1,3 @@
+import { checkAtRule } from '../../utils/util.js';
+
+export default checkAtRule(['media']);
diff --git a/node_modules/doiuse/data/features/css-mixblendmode.js b/node_modules/doiuse/data/features/css-mixblendmode.js
new file mode 100644
index 00000000..4197789b
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-mixblendmode.js
@@ -0,0 +1,3 @@
+export default {
+ 'mix-blend-mode': true,
+};
diff --git a/node_modules/doiuse/data/features/css-motion-paths.js b/node_modules/doiuse/data/features/css-motion-paths.js
new file mode 100644
index 00000000..c06f4cbf
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-motion-paths.js
@@ -0,0 +1,3 @@
+export default {
+ 'offset-path': true,
+};
diff --git a/node_modules/doiuse/data/features/css-namespaces.js b/node_modules/doiuse/data/features/css-namespaces.js
new file mode 100644
index 00000000..0e9797db
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-namespaces.js
@@ -0,0 +1,11 @@
+/**
+ * Using the `@namespace` at-rule, elements of other namespaces (e.g. SVG) can be targeted using the pipe (`|`) selector.
+ * @see https://caniuse.com/css-namespaces
+ */
+
+import { checkAtRule } from '../../utils/util.js';
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default checkAtRule('namespace');
diff --git a/node_modules/doiuse/data/features/css-nesting.js b/node_modules/doiuse/data/features/css-nesting.js
new file mode 100644
index 00000000..2415d08a
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-nesting.js
@@ -0,0 +1,19 @@
+/**
+ * CSS nesting provides the ability to nest one style rule inside another, with the selector of the child rule relative to the selector of the parent rule. Similar behavior previously required a CSS pre-processor.
+ * @see https://caniuse.com/css-nesting
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default (rule) => {
+ if (rule.type === 'rule' && rule.parent.type === 'rule') {
+ return true;
+ }
+
+ if (rule.type === 'atrule' && rule.parent.type === 'rule') {
+ return true;
+ }
+
+ return false;
+};
diff --git a/node_modules/doiuse/data/features/css-not-sel-list.js b/node_modules/doiuse/data/features/css-not-sel-list.js
new file mode 100644
index 00000000..ee745e7e
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-not-sel-list.js
@@ -0,0 +1,13 @@
+/**
+ * Selectors Level 3 only allowed `:not()` pseudo-class to accept a single simple selector, which the element must not match any of. Thus, `:not(a, .b, [c])` or `:not(a.b[c])` did not work. Selectors Level 4 allows `:not()` to accept a list of selectors. Thus, `:not(a):not(.b):not([c])` can instead be written as `:not(a, .b, [c])` and `:not(a.b[c])` works as intended.
+ * @see https://caniuse.com/css-not-sel-list
+ */
+
+import { checkSelector } from '../../utils/util.js';
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default checkSelector(
+ (selector) => selector.includes(':not(') && !/:not\(.?#?-?[\w[\]-]+\)/.test(selector),
+);
diff --git a/node_modules/doiuse/data/features/css-nth-child-of.js b/node_modules/doiuse/data/features/css-nth-child-of.js
new file mode 100644
index 00000000..b1249f6f
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-nth-child-of.js
@@ -0,0 +1,13 @@
+/**
+ * The newest versions of `:nth-child()` and `:nth-last-child()` accept an optional `of S` clause which filters the children to only those which match the selector list `S`. For example, `:nth-child(1 of .foo)` selects the first child among the children that have the `foo` class (ignoring any non-`foo` children which precede that child). Similar to `:nth-of-type`, but for arbitrary selectors instead of only type selectors.
+ * @see https://caniuse.com/css-nth-child-of
+ */
+
+import { checkSelector } from '../../utils/util.js';
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default checkSelector(
+ (selector) => /:nth-(child|last-child)\(\s*\d+\s*of/.test(selector),
+);
diff --git a/node_modules/doiuse/data/features/css-opacity.js b/node_modules/doiuse/data/features/css-opacity.js
new file mode 100644
index 00000000..50f65243
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-opacity.js
@@ -0,0 +1,3 @@
+export default {
+ 'opacity': true,
+};
diff --git a/node_modules/doiuse/data/features/css-optional-pseudo.js b/node_modules/doiuse/data/features/css-optional-pseudo.js
new file mode 100644
index 00000000..8ecca39f
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-optional-pseudo.js
@@ -0,0 +1,11 @@
+/**
+ * The `:optional` pseudo-class matches form inputs (`<input>`, `<textarea>`, `<select>`) which are not `:required`.
+ * @see https://caniuse.com/css-optional-pseudo
+ */
+
+import { checkSelector } from '../../utils/util.js';
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default checkSelector(':optional');
diff --git a/node_modules/doiuse/data/features/css-overflow-anchor.js b/node_modules/doiuse/data/features/css-overflow-anchor.js
new file mode 100644
index 00000000..6424835a
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-overflow-anchor.js
@@ -0,0 +1,11 @@
+/**
+ * Changes in DOM elements above the visible region of a scrolling box can result in the page moving while the user is in the middle of consuming the content. By default, the value of `overflow-anchor` is `auto`, it can mitigate this jarring user experience by keeping track of the position of an anchor node and adjusting the scroll offset accordingly
+ * @see https://caniuse.com/css-overflow-anchor
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'overflow-anchor': true,
+};
diff --git a/node_modules/doiuse/data/features/css-overflow-overlay.js b/node_modules/doiuse/data/features/css-overflow-overlay.js
new file mode 100644
index 00000000..bdbc6ba3
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-overflow-overlay.js
@@ -0,0 +1,3 @@
+export default {
+ 'overflow': 'overlay',
+};
diff --git a/node_modules/doiuse/data/features/css-overflow.js b/node_modules/doiuse/data/features/css-overflow.js
new file mode 100644
index 00000000..324bbcda
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-overflow.js
@@ -0,0 +1,13 @@
+/**
+ * Originally a single property for controlling overflowing content in both horizontal & vertical directions, the `overflow` property is now a shorthand for `overflow-x` & `overflow-y`. The latest version of the specification also introduces the `clip` value that blocks programmatic scrolling.
+ * @see https://caniuse.com/css-overflow
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'overflow': true,
+ 'overflow-x': true,
+ 'overflow-y': true,
+};
diff --git a/node_modules/doiuse/data/features/css-overscroll-behavior.js b/node_modules/doiuse/data/features/css-overscroll-behavior.js
new file mode 100644
index 00000000..3f951b6a
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-overscroll-behavior.js
@@ -0,0 +1,5 @@
+export default {
+ 'overscroll-behavior': true,
+ 'overscroll-behavior-x': true,
+ 'overscroll-behavior-y': true,
+};
diff --git a/node_modules/doiuse/data/features/css-page-break.js b/node_modules/doiuse/data/features/css-page-break.js
new file mode 100644
index 00000000..93d95a04
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-page-break.js
@@ -0,0 +1,13 @@
+/**
+ * Properties to control the way elements are broken across (printed) pages.
+ * @see https://caniuse.com/css-page-break
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'page-break-after': true,
+ 'page-break-before': true,
+ 'page-break-inside': true,
+};
diff --git a/node_modules/doiuse/data/features/css-paged-media.js b/node_modules/doiuse/data/features/css-paged-media.js
new file mode 100644
index 00000000..b06d2042
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-paged-media.js
@@ -0,0 +1,11 @@
+/**
+ * CSS at-rule (`@page`) to define page-specific rules when printing web pages, such as margin per page and page dimensions.
+ * @see https://caniuse.com/css-paged-media
+ */
+
+import { checkAtRule } from '../../utils/util.js';
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default checkAtRule('page');
diff --git a/node_modules/doiuse/data/features/css-paint-api.js b/node_modules/doiuse/data/features/css-paint-api.js
new file mode 100644
index 00000000..cf951ec5
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-paint-api.js
@@ -0,0 +1,9 @@
+/**
+ * Allows programmatic generation of images used by CSS
+ * @see https://caniuse.com/css-paint-api
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default { '': 'paint(' };
diff --git a/node_modules/doiuse/data/features/css-placeholder-shown.js b/node_modules/doiuse/data/features/css-placeholder-shown.js
new file mode 100644
index 00000000..1a92d39e
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-placeholder-shown.js
@@ -0,0 +1,12 @@
+/**
+ * :placeholder-shown CSS pseudo-class
+ * Input elements can sometimes show placeholder text as a hint to the user on what to type in. See, for example, the placeholder attribute in HTML5. The :placeholder-shown pseudo-class matches an input element that is showing such placeholder text.
+ * @see https://caniuse.com/css-placeholder-shown
+ */
+
+import { checkSelector } from '../../utils/util.js';
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default checkSelector(':placeholder-shown');
diff --git a/node_modules/doiuse/data/features/css-placeholder.js b/node_modules/doiuse/data/features/css-placeholder.js
new file mode 100644
index 00000000..52390e8c
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-placeholder.js
@@ -0,0 +1,5 @@
+import { checkSelector } from '../../utils/util.js';
+
+export default [
+ checkSelector(':placeholder'),
+];
diff --git a/node_modules/doiuse/data/features/css-print-color-adjust.js b/node_modules/doiuse/data/features/css-print-color-adjust.js
new file mode 100644
index 00000000..ffa89e69
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-print-color-adjust.js
@@ -0,0 +1,3 @@
+export default {
+ 'print-color-adjust': true,
+};
diff --git a/node_modules/doiuse/data/features/css-read-only-write.js b/node_modules/doiuse/data/features/css-read-only-write.js
new file mode 100644
index 00000000..e9956292
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-read-only-write.js
@@ -0,0 +1,12 @@
+/**
+ * CSS :read-only and :read-write selectors
+ * :read-only and :read-write pseudo-classes to match elements which are considered user-alterable
+ * @see https://caniuse.com/css-read-only-write
+ */
+
+import { checkSelector } from '../../utils/util.js';
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default checkSelector([':read-only', ':read-write']);
diff --git a/node_modules/doiuse/data/features/css-rebeccapurple.js b/node_modules/doiuse/data/features/css-rebeccapurple.js
new file mode 100644
index 00000000..3a813b5d
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-rebeccapurple.js
@@ -0,0 +1,12 @@
+/**
+ * Rebeccapurple color
+ * The new color added in CSS Color Module Level 4
+ * @see https://caniuse.com/css-rebeccapurple
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ '': 'rebeccapurple',
+};
diff --git a/node_modules/doiuse/data/features/css-reflections.js b/node_modules/doiuse/data/features/css-reflections.js
new file mode 100644
index 00000000..de0a7671
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-reflections.js
@@ -0,0 +1,4 @@
+export default {
+ 'box-reflect': true,
+ '-webkit-box-reflect': true,
+};
diff --git a/node_modules/doiuse/data/features/css-regions.js b/node_modules/doiuse/data/features/css-regions.js
new file mode 100644
index 00000000..3aefaacf
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-regions.js
@@ -0,0 +1,15 @@
+/**
+ * CSS Regions
+ * Method of flowing content into multiple elements, allowing magazine-like layouts. While once supported in WebKit-based browsers and Internet Explorer, implementing the feature is no longer being pursued by any browser.
+ * @see https://caniuse.com/css-regions
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'flow-into': true,
+ 'flow-from': true,
+ '-webkit-flow-into': true,
+ '-webkit-flow-from': true,
+};
diff --git a/node_modules/doiuse/data/features/css-relative-colors.js b/node_modules/doiuse/data/features/css-relative-colors.js
new file mode 100644
index 00000000..48bcd665
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-relative-colors.js
@@ -0,0 +1,12 @@
+/**
+ * CSS Relative colors
+ * The CSS Relative Color syntax allows a color to be defined relative to another color using the `from` keyword and optionally `calc()` for any of the color values.
+ * @see https://caniuse.com/css-relative-colors
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ '': /((rgb)|(rgba)|(hsl)|(hsla)|(hwb))\(\s*from/,
+};
diff --git a/node_modules/doiuse/data/features/css-repeating-gradients.js b/node_modules/doiuse/data/features/css-repeating-gradients.js
new file mode 100644
index 00000000..5639bbe6
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-repeating-gradients.js
@@ -0,0 +1,6 @@
+export default {
+ '': [
+ 'repeating-linear-gradient',
+ 'repeating-radial-gradient',
+ ],
+};
diff --git a/node_modules/doiuse/data/features/css-resize.js b/node_modules/doiuse/data/features/css-resize.js
new file mode 100644
index 00000000..8b25994b
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-resize.js
@@ -0,0 +1,3 @@
+export default {
+ 'resize': true,
+};
diff --git a/node_modules/doiuse/data/features/css-revert-value.js b/node_modules/doiuse/data/features/css-revert-value.js
new file mode 100644
index 00000000..03067c7b
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-revert-value.js
@@ -0,0 +1,4 @@
+export default {
+ '': 'revert',
+
+};
diff --git a/node_modules/doiuse/data/features/css-rrggbbaa.js b/node_modules/doiuse/data/features/css-rrggbbaa.js
new file mode 100644
index 00000000..7d83f4e4
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-rrggbbaa.js
@@ -0,0 +1,15 @@
+/**
+ * #rrggbbaa hex color notation
+ * The CSS Color Module Level 4 defines new 4 & 8 character hex notation for color to include the opacity level.
+ * @see https://caniuse.com/css-rrggbbaa
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ '': [
+ /#[\da-f]{8}/i,
+ /#[\da-f]{4}(\W|$)/i,
+ ],
+};
diff --git a/node_modules/doiuse/data/features/css-scroll-behavior.js b/node_modules/doiuse/data/features/css-scroll-behavior.js
new file mode 100644
index 00000000..fc83e96f
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-scroll-behavior.js
@@ -0,0 +1,12 @@
+/**
+ * CSS Scroll-behavior
+ * Method of specifying the scrolling behavior for a scrolling box, when scrolling happens due to navigation or CSSOM scrolling APIs.
+ * @see https://caniuse.com/css-scroll-behavior
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'scroll-behavior': true,
+};
diff --git a/node_modules/doiuse/data/features/css-scroll-timeline.js b/node_modules/doiuse/data/features/css-scroll-timeline.js
new file mode 100644
index 00000000..48da61cd
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-scroll-timeline.js
@@ -0,0 +1,27 @@
+/**
+ * CSS @scroll-timeline
+ * CSS property that allows animations to be driven by a container's scroll position
+ * @see https://caniuse.com/css-scroll-timeline
+ */
+
+import { checkAtRule } from '../../utils/util.js';
+
+const checkAt = checkAtRule('scroll-timeline');
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default (node) => {
+ // check for @scroll-timeline
+ if (checkAt(node)) {
+ return true;
+ }
+
+ // check for animation-timeline
+ if (node.type !== 'decl') return false;
+ if (node.prop.startsWith('animation-timeline')) {
+ return true;
+ }
+
+ return false;
+};
diff --git a/node_modules/doiuse/data/features/css-scrollbar.js b/node_modules/doiuse/data/features/css-scrollbar.js
new file mode 100644
index 00000000..ed4edbf9
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-scrollbar.js
@@ -0,0 +1,4 @@
+export default {
+ 'scrollbar-color': true,
+ 'scrollbar-width': true,
+};
diff --git a/node_modules/doiuse/data/features/css-sel2.js b/node_modules/doiuse/data/features/css-sel2.js
new file mode 100644
index 00000000..cdadf2ff
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-sel2.js
@@ -0,0 +1,42 @@
+import { checkSelector } from '../../utils/util.js';
+
+const ATTRIBUTE_IDENTIFIER = '[^\\~|^$*\\]]*';
+
+// Export for testing
+export const REGEXES = {
+ 'HAS_ATTRIBUTE': new RegExp(`\\[${ATTRIBUTE_IDENTIFIER}\\]`),
+ 'MATCH_ATTRIBUTE': new RegExp(`\\[${ATTRIBUTE_IDENTIFIER}=${ATTRIBUTE_IDENTIFIER}\\]`),
+ 'WORD_ATTRIBUTE': new RegExp(`\\[${ATTRIBUTE_IDENTIFIER}\\~=${ATTRIBUTE_IDENTIFIER}\\]`),
+ 'SUBCODE_ATTRIBUTE': new RegExp(`\\[${ATTRIBUTE_IDENTIFIER}\\|=${ATTRIBUTE_IDENTIFIER}\\]`),
+ 'BRACKET_PARENS': /(\[[^=\]]*(=("[^"]*")|[^\]]+|)])|(\([^)]*\))/g,
+};
+
+/**
+ * @param {RegExp} pattern
+ * @return {(str:string) => boolean}
+ */
+function matchOutsideOfBrackets(pattern) {
+ if (!(pattern instanceof RegExp)) {
+ throw new TypeError('matchOutsideOfBrackets expects a RegExp');
+ }
+ return (string) => pattern.test(string.replaceAll(REGEXES.BRACKET_PARENS, ''));
+}
+
+export default checkSelector([
+ ':first-child',
+ ':link',
+ ':visited',
+ ':active',
+ ':hover',
+ ':focus',
+ ':lang',
+ REGEXES.HAS_ATTRIBUTE,
+ REGEXES.MATCH_ATTRIBUTE,
+ REGEXES.WORD_ATTRIBUTE,
+ REGEXES.SUBCODE_ATTRIBUTE,
+ matchOutsideOfBrackets(/\*/),
+ matchOutsideOfBrackets(/>/),
+ matchOutsideOfBrackets(/\+/),
+ matchOutsideOfBrackets(/\./),
+ matchOutsideOfBrackets(/#/),
+]);
diff --git a/node_modules/doiuse/data/features/css-sel3.js b/node_modules/doiuse/data/features/css-sel3.js
new file mode 100644
index 00000000..c82db473
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-sel3.js
@@ -0,0 +1,34 @@
+import { checkSelector } from '../../utils/util.js';
+
+const ATTRIBUTE_IDENTIFIER = '[^\\~|^$*\\]]*';
+
+// Export for testing
+export const REGEXES = {
+ 'SIBLING_SELECTOR': /^[^[]*~/,
+ 'STARTSWITH_ATTRIBUTE': new RegExp(`\\[${ATTRIBUTE_IDENTIFIER}\\^=${ATTRIBUTE_IDENTIFIER}\\]`),
+ 'ENDSWITH_ATTRIBUTE': new RegExp(`\\[${ATTRIBUTE_IDENTIFIER}\\$=${ATTRIBUTE_IDENTIFIER}\\]`),
+ 'INSENSITIVE_ATTRIBUTE': new RegExp(`\\[${ATTRIBUTE_IDENTIFIER}\\*=${ATTRIBUTE_IDENTIFIER}\\]`),
+};
+
+export default checkSelector([
+ ':root',
+ ':nth-child',
+ ':nth-last-child',
+ 'nth-of-type',
+ 'nth-last-of-type',
+ ':last-child',
+ ':first-of-type',
+ ':last-of-type',
+ ':only-child',
+ ':only-of-type',
+ ':empty',
+ ':target',
+ ':enabled',
+ ':disabled',
+ ':checked',
+ ':not',
+ REGEXES.SIBLING_SELECTOR,
+ REGEXES.STARTSWITH_ATTRIBUTE,
+ REGEXES.ENDSWITH_ATTRIBUTE,
+ REGEXES.INSENSITIVE_ATTRIBUTE,
+]);
diff --git a/node_modules/doiuse/data/features/css-selection.js b/node_modules/doiuse/data/features/css-selection.js
new file mode 100644
index 00000000..34c6fd4f
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-selection.js
@@ -0,0 +1,3 @@
+import { checkSelector } from '../../utils/util.js';
+
+export default checkSelector(':selection');
diff --git a/node_modules/doiuse/data/features/css-shapes.js b/node_modules/doiuse/data/features/css-shapes.js
new file mode 100644
index 00000000..4eddbfa3
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-shapes.js
@@ -0,0 +1,5 @@
+export default {
+ 'shape-outside': true,
+ 'shape-image-threshold': true,
+ 'shape-margin': true,
+};
diff --git a/node_modules/doiuse/data/features/css-snappoints.js b/node_modules/doiuse/data/features/css-snappoints.js
new file mode 100644
index 00000000..52b5649f
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-snappoints.js
@@ -0,0 +1,36 @@
+/**
+ * CSS Scroll Snap
+ * CSS technique that allows customizable scrolling experiences like pagination of carousels by setting defined snap positions.
+ * @see https://caniuse.com/css-snappoints
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'scroll-snap-type': true,
+ 'scroll-padding': true,
+ 'scroll-padding-top': true,
+ 'scroll-padding-right': true,
+ 'scroll-padding-bottom': true,
+ 'scroll-padding-left': true,
+ 'scroll-padding-inline': true,
+ 'scroll-padding-inline-start': true,
+ 'scroll-padding-inline-end': true,
+ 'scroll-padding-block': true,
+ 'scroll-padding-block-start': true,
+ 'scroll-padding-block-end': true,
+ 'scroll-snap-align': true,
+ 'scroll-margin': true,
+ 'scroll-margin-top': true,
+ 'scroll-margin-right': true,
+ 'scroll-margin-bottom': true,
+ 'scroll-margin-left': true,
+ 'scroll-margin-inline': true,
+ 'scroll-margin-inline-start': true,
+ 'scroll-margin-inline-end': true,
+ 'scroll-margin-block': true,
+ 'scroll-margin-block-start': true,
+ 'scroll-margin-block-end': true,
+ 'scroll-snap-stop': true,
+};
diff --git a/node_modules/doiuse/data/features/css-sticky.js b/node_modules/doiuse/data/features/css-sticky.js
new file mode 100644
index 00000000..b7336e62
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-sticky.js
@@ -0,0 +1,3 @@
+export default {
+ 'position': 'sticky',
+};
diff --git a/node_modules/doiuse/data/features/css-subgrid.js b/node_modules/doiuse/data/features/css-subgrid.js
new file mode 100644
index 00000000..0b23eb99
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-subgrid.js
@@ -0,0 +1,12 @@
+/**
+ * CSS Subgrid
+ * Feature of the CSS Grid Layout Module Level 2 that allows a grid-item with its own grid to align in one or both dimensions with its parent grid.
+ * @see https://caniuse.com/css-subgrid
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ '': 'subgrid',
+};
diff --git a/node_modules/doiuse/data/features/css-supports-api.js b/node_modules/doiuse/data/features/css-supports-api.js
new file mode 100644
index 00000000..cea5cab1
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-supports-api.js
@@ -0,0 +1,12 @@
+/**
+ * CSS.supports() API
+ * The CSS.supports() static methods returns a Boolean value indicating if the browser supports a given CSS feature, or not.
+ * @see https://caniuse.com/css-supports-api
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {};
+
+/* this feature appears in JS, so it's not linted by this tool */
diff --git a/node_modules/doiuse/data/features/css-table.js b/node_modules/doiuse/data/features/css-table.js
new file mode 100644
index 00000000..d86c5c2a
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-table.js
@@ -0,0 +1,7 @@
+export default {
+ 'display': [
+ 'table',
+ 'table-',
+ 'inline-table',
+ ],
+};
diff --git a/node_modules/doiuse/data/features/css-text-align-last.js b/node_modules/doiuse/data/features/css-text-align-last.js
new file mode 100644
index 00000000..31883731
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-text-align-last.js
@@ -0,0 +1,12 @@
+/**
+ * CSS3 text-align-last
+ * CSS property to describe how the last line of a block or a line right before a forced line break when `text-align` is `justify`.
+ * @see https://caniuse.com/css-text-align-last
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'text-align-last': true,
+};
diff --git a/node_modules/doiuse/data/features/css-text-box-trim.js b/node_modules/doiuse/data/features/css-text-box-trim.js
new file mode 100644
index 00000000..e91567f0
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-text-box-trim.js
@@ -0,0 +1,13 @@
+/**
+ * CSS text-box-trim & text-box-edge
+ * Provides the ability to remove the vertical space appearing above and below text glyphs, allowing more precise positioning and alignment. Previously specified as the `leading-trim` & `text-edge` properties.
+ * @see https://caniuse.com/css-text-box-trim
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'text-box-trim': true,
+ 'text-box-edge': true,
+};
diff --git a/node_modules/doiuse/data/features/css-text-indent.js b/node_modules/doiuse/data/features/css-text-indent.js
new file mode 100644
index 00000000..574fab41
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-text-indent.js
@@ -0,0 +1,12 @@
+/**
+ * CSS text-indent
+ * The `text-indent` property applies indentation to lines of inline content in a block.
+ * @see https://caniuse.com/css-text-indent
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'text-indent': true,
+};
diff --git a/node_modules/doiuse/data/features/css-text-justify.js b/node_modules/doiuse/data/features/css-text-justify.js
new file mode 100644
index 00000000..3b08cad8
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-text-justify.js
@@ -0,0 +1,12 @@
+/**
+ * CSS text-justify
+ * CSS property to define how text should be justified when `text-align: justify` is set.
+ * @see https://caniuse.com/css-text-justify
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'text-justify': true,
+};
diff --git a/node_modules/doiuse/data/features/css-text-orientation.js b/node_modules/doiuse/data/features/css-text-orientation.js
new file mode 100644
index 00000000..93c7ccd0
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-text-orientation.js
@@ -0,0 +1,12 @@
+/**
+ * CSS text-orientation
+ * The CSS `text-orientation` property specifies the orientation of text within a line. Current values only have an effect in vertical typographic modes (defined with the `writing-mode` property)
+ * @see https://caniuse.com/css-text-orientation
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'text-orientation': true,
+};
diff --git a/node_modules/doiuse/data/features/css-text-spacing.js b/node_modules/doiuse/data/features/css-text-spacing.js
new file mode 100644
index 00000000..08d3262b
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-text-spacing.js
@@ -0,0 +1,12 @@
+/**
+ * CSS Text 4 text-spacing
+ * No description available.
+ * @see This feature comes from MDN: https://developer.mozilla.org/en-US/search?q=CSS+Text+4+text-spacing
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'text-spacing': true,
+};
diff --git a/node_modules/doiuse/data/features/css-textshadow.js b/node_modules/doiuse/data/features/css-textshadow.js
new file mode 100644
index 00000000..00ec173d
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-textshadow.js
@@ -0,0 +1,3 @@
+export default {
+ 'text-shadow': true,
+};
diff --git a/node_modules/doiuse/data/features/css-touch-action.js b/node_modules/doiuse/data/features/css-touch-action.js
new file mode 100644
index 00000000..fe8ccc57
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-touch-action.js
@@ -0,0 +1,3 @@
+export default {
+ 'touch-action': true,
+};
diff --git a/node_modules/doiuse/data/features/css-transitions.js b/node_modules/doiuse/data/features/css-transitions.js
new file mode 100644
index 00000000..c2f29934
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-transitions.js
@@ -0,0 +1,7 @@
+export default {
+ 'transition': true,
+ 'transition-property': true,
+ 'transition-duration': true,
+ 'transition-delay': true,
+ 'transition-timing-function': true,
+};
diff --git a/node_modules/doiuse/data/features/css-unicode-bidi.js b/node_modules/doiuse/data/features/css-unicode-bidi.js
new file mode 100644
index 00000000..7a16c868
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-unicode-bidi.js
@@ -0,0 +1,12 @@
+/**
+ * CSS unicode-bidi property
+ * No description available.
+ * @see This feature comes from MDN: https://developer.mozilla.org/en-US/search?q=CSS+unicode-bidi+property
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'unicode-bidi': true,
+};
diff --git a/node_modules/doiuse/data/features/css-unset-value.js b/node_modules/doiuse/data/features/css-unset-value.js
new file mode 100644
index 00000000..28b86a14
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-unset-value.js
@@ -0,0 +1,3 @@
+export default {
+ '': 'unset',
+};
diff --git a/node_modules/doiuse/data/features/css-variables.js b/node_modules/doiuse/data/features/css-variables.js
new file mode 100644
index 00000000..fecc07b4
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-variables.js
@@ -0,0 +1,8 @@
+/**
+ * @param {import('postcss').ChildNode} rule
+ * @return {boolean}
+ */
+export default (rule) => {
+ if (rule.type !== 'decl') return false;
+ return (rule.prop.startsWith('--') || rule.value.includes('var('));
+};
diff --git a/node_modules/doiuse/data/features/css-when-else.js b/node_modules/doiuse/data/features/css-when-else.js
new file mode 100644
index 00000000..d449b9d3
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-when-else.js
@@ -0,0 +1,12 @@
+/**
+ * CSS @when / @else conditional rules
+ * Syntax allowing CSS conditions (like media and support queries) to be written more simply, as well as making it possibly to write mutually exclusive rules using `@else` statements.
+ * @see https://caniuse.com/css-when-else
+ */
+
+import { checkAtRule } from '../../utils/util.js';
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default checkAtRule(['when', 'else']);
diff --git a/node_modules/doiuse/data/features/css-widows-orphans.js b/node_modules/doiuse/data/features/css-widows-orphans.js
new file mode 100644
index 00000000..1604f84d
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-widows-orphans.js
@@ -0,0 +1,13 @@
+/**
+ * CSS widows & orphans
+ * CSS properties to control when lines break across pages or columns by defining the amount of lines that must be left before or after the break.
+ * @see https://caniuse.com/css-widows-orphans
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'widows': true,
+ 'orphans': true,
+};
diff --git a/node_modules/doiuse/data/features/css-width-stretch.js b/node_modules/doiuse/data/features/css-width-stretch.js
new file mode 100644
index 00000000..f87b0b75
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-width-stretch.js
@@ -0,0 +1,12 @@
+/**
+ * width: stretch property
+ * No description available.
+ * @see This feature comes from MDN: https://developer.mozilla.org/en-US/search?q=width:+stretch+property
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'width': 'stretch',
+};
diff --git a/node_modules/doiuse/data/features/css-writing-mode.js b/node_modules/doiuse/data/features/css-writing-mode.js
new file mode 100644
index 00000000..0a43f59c
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-writing-mode.js
@@ -0,0 +1,12 @@
+/**
+ * CSS writing-mode property
+ * Property to define whether lines of text are laid out horizontally or vertically and the direction in which blocks progress.
+ * @see https://caniuse.com/css-writing-mode
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'writing-mode': true,
+};
diff --git a/node_modules/doiuse/data/features/css-zoom.js b/node_modules/doiuse/data/features/css-zoom.js
new file mode 100644
index 00000000..66f606b7
--- /dev/null
+++ b/node_modules/doiuse/data/features/css-zoom.js
@@ -0,0 +1,12 @@
+/**
+ * CSS zoom
+ * Non-standard method of scaling content.
+ * @see https://caniuse.com/css-zoom
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'zoom': true,
+};
diff --git a/node_modules/doiuse/data/features/css3-attr.js b/node_modules/doiuse/data/features/css3-attr.js
new file mode 100644
index 00000000..0031aedf
--- /dev/null
+++ b/node_modules/doiuse/data/features/css3-attr.js
@@ -0,0 +1,17 @@
+/**
+ * CSS3 attr() function for all properties
+ * While `attr()` is supported for effectively all browsers for the `content` property, CSS Values and Units Level 5 adds the ability to use `attr()` on **any** CSS property, and to use it for non-string values (e.g. numbers, colors).
+ * @see https://caniuse.com/css3-attr
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default (rule) => {
+ if (rule.type !== 'decl') return false;
+ if (rule.prop === 'content') {
+ return false;
+ }
+
+ return rule.toString().includes('attr(');
+};
diff --git a/node_modules/doiuse/data/features/css3-boxsizing.js b/node_modules/doiuse/data/features/css3-boxsizing.js
new file mode 100644
index 00000000..56f16d9f
--- /dev/null
+++ b/node_modules/doiuse/data/features/css3-boxsizing.js
@@ -0,0 +1,3 @@
+export default {
+ 'box-sizing': true,
+};
diff --git a/node_modules/doiuse/data/features/css3-colors.js b/node_modules/doiuse/data/features/css3-colors.js
new file mode 100644
index 00000000..97fa5620
--- /dev/null
+++ b/node_modules/doiuse/data/features/css3-colors.js
@@ -0,0 +1,7 @@
+export default {
+ '': [
+ 'rgba',
+ 'hsl',
+ 'hsla',
+ ],
+};
diff --git a/node_modules/doiuse/data/features/css3-cursors-grab.js b/node_modules/doiuse/data/features/css3-cursors-grab.js
new file mode 100644
index 00000000..69f55e6e
--- /dev/null
+++ b/node_modules/doiuse/data/features/css3-cursors-grab.js
@@ -0,0 +1,3 @@
+export default {
+ 'cursor': ['grab', 'grabbing'],
+};
diff --git a/node_modules/doiuse/data/features/css3-cursors-newer.js b/node_modules/doiuse/data/features/css3-cursors-newer.js
new file mode 100644
index 00000000..8941c6f8
--- /dev/null
+++ b/node_modules/doiuse/data/features/css3-cursors-newer.js
@@ -0,0 +1,3 @@
+export default {
+ 'cursor': ['zoom-in', 'zoom-out'],
+};
diff --git a/node_modules/doiuse/data/features/css3-cursors.js b/node_modules/doiuse/data/features/css3-cursors.js
new file mode 100644
index 00000000..e6e96e18
--- /dev/null
+++ b/node_modules/doiuse/data/features/css3-cursors.js
@@ -0,0 +1,17 @@
+export default {
+ 'cursor': [
+ 'none',
+ 'context-menu',
+ 'cell',
+ 'vertical-text',
+ 'alias',
+ 'copy',
+ 'no-drop',
+ 'not-allowed',
+ 'nesw-resize',
+ 'nwse-resize',
+ 'col-resize',
+ 'row-resize',
+ 'all-scroll',
+ ],
+};
diff --git a/node_modules/doiuse/data/features/css3-tabsize.js b/node_modules/doiuse/data/features/css3-tabsize.js
new file mode 100644
index 00000000..3176ab15
--- /dev/null
+++ b/node_modules/doiuse/data/features/css3-tabsize.js
@@ -0,0 +1,3 @@
+export default {
+ 'tab-size': true,
+};
diff --git a/node_modules/doiuse/data/features/currentcolor.js b/node_modules/doiuse/data/features/currentcolor.js
new file mode 100644
index 00000000..a3a733a7
--- /dev/null
+++ b/node_modules/doiuse/data/features/currentcolor.js
@@ -0,0 +1,12 @@
+/**
+ * CSS currentColor value
+ * A CSS value that will apply the existing `color` value to other properties like `background-color`, etc.
+ * @see https://caniuse.com/currentcolor
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ '': 'currentColor',
+};
diff --git a/node_modules/doiuse/data/features/devicepixelratio.js b/node_modules/doiuse/data/features/devicepixelratio.js
new file mode 100644
index 00000000..13fdd938
--- /dev/null
+++ b/node_modules/doiuse/data/features/devicepixelratio.js
@@ -0,0 +1,12 @@
+/**
+ * Window.devicePixelRatio
+ * Read-only property that returns the ratio of the (vertical) size of one physical pixel on the current display device to the size of one CSS pixel.
+ * @see https://caniuse.com/devicepixelratio
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {};
+
+/* this feature is found in JS and is not linted by this tool */
diff --git a/node_modules/doiuse/data/features/extended-system-fonts.js b/node_modules/doiuse/data/features/extended-system-fonts.js
new file mode 100644
index 00000000..5376d3f7
--- /dev/null
+++ b/node_modules/doiuse/data/features/extended-system-fonts.js
@@ -0,0 +1,12 @@
+/**
+ * ui-serif, ui-sans-serif, ui-monospace and ui-rounded values for font-family
+ * Allows more control when choosing system interface fonts
+ * @see https://caniuse.com/extended-system-fonts
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'font-family': ['ui-serif', 'ui-sans-serif', 'ui-monospace', 'ui-rounded'],
+};
diff --git a/node_modules/doiuse/data/features/flexbox-gap.js b/node_modules/doiuse/data/features/flexbox-gap.js
new file mode 100644
index 00000000..c94eac38
--- /dev/null
+++ b/node_modules/doiuse/data/features/flexbox-gap.js
@@ -0,0 +1,18 @@
+/**
+ * gap property for Flexbox
+ * `gap` for flexbox containers to create gaps/gutters between flex items
+ * @see https://caniuse.com/flexbox-gap
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default (rule) => {
+ if (/display:\s(inline-)?flex/.test(rule.toString())
+ && rule.toString().includes('gap:')
+ ) {
+ return true;
+ }
+
+ return false;
+};
diff --git a/node_modules/doiuse/data/features/flexbox.js b/node_modules/doiuse/data/features/flexbox.js
new file mode 100644
index 00000000..e494acb1
--- /dev/null
+++ b/node_modules/doiuse/data/features/flexbox.js
@@ -0,0 +1,13 @@
+export default {
+ 'display': [
+ 'flex',
+ 'inline-flex',
+ ],
+ 'flex': true,
+ 'flex-grow': true,
+ 'flex-shrink': true,
+ 'flex-basis': true,
+ 'flex-direction': true,
+ 'flex-wrap': true,
+ 'flex-flow': true,
+};
diff --git a/node_modules/doiuse/data/features/flow-root.js b/node_modules/doiuse/data/features/flow-root.js
new file mode 100644
index 00000000..9b16aede
--- /dev/null
+++ b/node_modules/doiuse/data/features/flow-root.js
@@ -0,0 +1,12 @@
+/**
+ * display: flow-root
+ * The element generates a block container box, and lays out its contents using flow layout. It always establishes a new block formatting context for its contents. It provides a better solution to the most use cases of the "clearfix" hack.
+ * @see https://caniuse.com/flow-root
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'display': 'flow-root',
+};
diff --git a/node_modules/doiuse/data/features/font-family-system-ui.js b/node_modules/doiuse/data/features/font-family-system-ui.js
new file mode 100644
index 00000000..b1b6e08f
--- /dev/null
+++ b/node_modules/doiuse/data/features/font-family-system-ui.js
@@ -0,0 +1,12 @@
+/**
+ * system-ui value for font-family
+ * Value for `font-family` that represents the default user interface font.
+ * @see https://caniuse.com/font-family-system-ui
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'font-family': 'system-ui',
+};
diff --git a/node_modules/doiuse/data/features/font-feature.js b/node_modules/doiuse/data/features/font-feature.js
new file mode 100644
index 00000000..f0b8ebd2
--- /dev/null
+++ b/node_modules/doiuse/data/features/font-feature.js
@@ -0,0 +1,6 @@
+export default {
+ 'font-feature-settings': true,
+ 'font-variant-ligatures': true,
+ 'font-language-override': true,
+ 'font-kerning': true,
+};
diff --git a/node_modules/doiuse/data/features/font-kerning.js b/node_modules/doiuse/data/features/font-kerning.js
new file mode 100644
index 00000000..d239756e
--- /dev/null
+++ b/node_modules/doiuse/data/features/font-kerning.js
@@ -0,0 +1,12 @@
+/**
+ * CSS3 font-kerning
+ * Controls the usage of the kerning information (spacing between letters) stored in the font. Note that this only affects OpenType fonts with kerning information, it has no effect on other fonts.
+ * @see https://caniuse.com/font-kerning
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'font-kerning': true,
+};
diff --git a/node_modules/doiuse/data/features/font-loading.js b/node_modules/doiuse/data/features/font-loading.js
new file mode 100644
index 00000000..1a0c1ca9
--- /dev/null
+++ b/node_modules/doiuse/data/features/font-loading.js
@@ -0,0 +1,12 @@
+/**
+ * CSS Font Loading
+ * This CSS module defines a scripting interface to font faces in CSS, allowing font faces to be easily created and loaded from script. It also provides methods to track the loading status of an individual font, or of all the fonts on an entire page.
+ * @see https://caniuse.com/font-loading
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {};
+
+/* this feature appears in JS and as such is not linted */
diff --git a/node_modules/doiuse/data/features/font-size-adjust.js b/node_modules/doiuse/data/features/font-size-adjust.js
new file mode 100644
index 00000000..4604c92a
--- /dev/null
+++ b/node_modules/doiuse/data/features/font-size-adjust.js
@@ -0,0 +1,3 @@
+export default {
+ 'font-size-adjust': true,
+};
diff --git a/node_modules/doiuse/data/features/font-smooth.js b/node_modules/doiuse/data/features/font-smooth.js
new file mode 100644
index 00000000..8304c4ad
--- /dev/null
+++ b/node_modules/doiuse/data/features/font-smooth.js
@@ -0,0 +1,12 @@
+/**
+ * CSS font-smooth
+ * Controls the application of anti-aliasing when fonts are rendered.
+ * @see https://caniuse.com/font-smooth
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'font-smooth': true,
+};
diff --git a/node_modules/doiuse/data/features/font-unicode-range.js b/node_modules/doiuse/data/features/font-unicode-range.js
new file mode 100644
index 00000000..945ebb6d
--- /dev/null
+++ b/node_modules/doiuse/data/features/font-unicode-range.js
@@ -0,0 +1,3 @@
+export default {
+ 'unicode-range': true,
+};
diff --git a/node_modules/doiuse/data/features/font-variant-alternates.js b/node_modules/doiuse/data/features/font-variant-alternates.js
new file mode 100644
index 00000000..169e5c37
--- /dev/null
+++ b/node_modules/doiuse/data/features/font-variant-alternates.js
@@ -0,0 +1,12 @@
+/**
+ * CSS font-variant-alternates
+ * Controls the usage of alternate glyphs associated to alternative names defined in @font-feature-values for certain types of OpenType fonts.
+ * @see https://caniuse.com/font-variant-alternates
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'font-variant-alternates': true,
+};
diff --git a/node_modules/doiuse/data/features/font-variant-numeric.js b/node_modules/doiuse/data/features/font-variant-numeric.js
new file mode 100644
index 00000000..13b05164
--- /dev/null
+++ b/node_modules/doiuse/data/features/font-variant-numeric.js
@@ -0,0 +1,12 @@
+/**
+ * CSS font-variant-numeric
+ * CSS property that provides different ways of displaying numbers, fractions, and ordinal markers.
+ * @see https://caniuse.com/font-variant-numeric
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'font-variant-numeric': true,
+};
diff --git a/node_modules/doiuse/data/features/fontface.js b/node_modules/doiuse/data/features/fontface.js
new file mode 100644
index 00000000..2350dae0
--- /dev/null
+++ b/node_modules/doiuse/data/features/fontface.js
@@ -0,0 +1,5 @@
+import { checkAtRule } from '../../utils/util.js';
+
+export default [
+ checkAtRule('font-face'),
+];
diff --git a/node_modules/doiuse/data/features/fullscreen.js b/node_modules/doiuse/data/features/fullscreen.js
new file mode 100644
index 00000000..c5befe68
--- /dev/null
+++ b/node_modules/doiuse/data/features/fullscreen.js
@@ -0,0 +1,3 @@
+import { checkSelector } from '../../utils/util.js';
+
+export default checkSelector(':fullscreen');
diff --git a/node_modules/doiuse/data/features/getcomputedstyle.js b/node_modules/doiuse/data/features/getcomputedstyle.js
new file mode 100644
index 00000000..ac64aab5
--- /dev/null
+++ b/node_modules/doiuse/data/features/getcomputedstyle.js
@@ -0,0 +1,12 @@
+/**
+ * getComputedStyle
+ * API to get the current computed CSS styles applied to an element. This may be the current value applied by an animation or as set by a stylesheet.
+ * @see https://caniuse.com/getcomputedstyle
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {};
+
+/* this is a js api, so we don't lint it */
diff --git a/node_modules/doiuse/data/features/inline-block.js b/node_modules/doiuse/data/features/inline-block.js
new file mode 100644
index 00000000..35b09093
--- /dev/null
+++ b/node_modules/doiuse/data/features/inline-block.js
@@ -0,0 +1,3 @@
+export default {
+ 'display': 'inline-block',
+};
diff --git a/node_modules/doiuse/data/features/intrinsic-width.js b/node_modules/doiuse/data/features/intrinsic-width.js
new file mode 100644
index 00000000..a01a8f3f
--- /dev/null
+++ b/node_modules/doiuse/data/features/intrinsic-width.js
@@ -0,0 +1,10 @@
+const VALUES = ['max-content', 'min-content', 'fit-content', 'fill-available', 'stretch', 'fill'];
+
+export default {
+ 'width': VALUES,
+ 'min-width': VALUES,
+ 'max-width': VALUES,
+ 'height': VALUES,
+ 'min-height': VALUES,
+ 'max-height': VALUES,
+};
diff --git a/node_modules/doiuse/data/features/justify-content-space-evenly.js b/node_modules/doiuse/data/features/justify-content-space-evenly.js
new file mode 100644
index 00000000..0df7d327
--- /dev/null
+++ b/node_modules/doiuse/data/features/justify-content-space-evenly.js
@@ -0,0 +1,12 @@
+/**
+ * CSS justify-content: space-evenly
+ * The "space-evenly" value for the `justify-content` property distributes the space between items evenly. It is similar to space-around but provides equal instead of half-sized space on the edges. Can be used in both CSS flexbox & grid.
+ * @see https://caniuse.com/justify-content-space-evenly
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'justify-content': 'space-evenly',
+};
diff --git a/node_modules/doiuse/data/features/kerning-pairs-ligatures.js b/node_modules/doiuse/data/features/kerning-pairs-ligatures.js
new file mode 100644
index 00000000..31fbcbbc
--- /dev/null
+++ b/node_modules/doiuse/data/features/kerning-pairs-ligatures.js
@@ -0,0 +1,3 @@
+export default {
+ 'text-rendering': 'optimizeLegibility',
+};
diff --git a/node_modules/doiuse/data/features/mdn-css-unicode-bidi-isolate-override.js b/node_modules/doiuse/data/features/mdn-css-unicode-bidi-isolate-override.js
new file mode 100644
index 00000000..72e64cf8
--- /dev/null
+++ b/node_modules/doiuse/data/features/mdn-css-unicode-bidi-isolate-override.js
@@ -0,0 +1,3 @@
+export default {
+ 'unicode-bidi': 'isolate-override',
+};
diff --git a/node_modules/doiuse/data/features/mdn-css-unicode-bidi-isolate.js b/node_modules/doiuse/data/features/mdn-css-unicode-bidi-isolate.js
new file mode 100644
index 00000000..84039895
--- /dev/null
+++ b/node_modules/doiuse/data/features/mdn-css-unicode-bidi-isolate.js
@@ -0,0 +1,3 @@
+export default {
+ 'unicode-bidi': 'isolate',
+};
diff --git a/node_modules/doiuse/data/features/mdn-css-unicode-bidi-plaintext.js b/node_modules/doiuse/data/features/mdn-css-unicode-bidi-plaintext.js
new file mode 100644
index 00000000..7850a81d
--- /dev/null
+++ b/node_modules/doiuse/data/features/mdn-css-unicode-bidi-plaintext.js
@@ -0,0 +1,3 @@
+export default {
+ 'unicode-bidi': 'plaintext',
+};
diff --git a/node_modules/doiuse/data/features/mdn-text-decoration-color.js b/node_modules/doiuse/data/features/mdn-text-decoration-color.js
new file mode 100644
index 00000000..cc6cf839
--- /dev/null
+++ b/node_modules/doiuse/data/features/mdn-text-decoration-color.js
@@ -0,0 +1,3 @@
+export default {
+ 'text-decoration-color': true,
+};
diff --git a/node_modules/doiuse/data/features/mdn-text-decoration-line.js b/node_modules/doiuse/data/features/mdn-text-decoration-line.js
new file mode 100644
index 00000000..45ad538d
--- /dev/null
+++ b/node_modules/doiuse/data/features/mdn-text-decoration-line.js
@@ -0,0 +1,3 @@
+export default {
+ 'text-decoration-line': true,
+};
diff --git a/node_modules/doiuse/data/features/mdn-text-decoration-shorthand.js b/node_modules/doiuse/data/features/mdn-text-decoration-shorthand.js
new file mode 100644
index 00000000..791f6067
--- /dev/null
+++ b/node_modules/doiuse/data/features/mdn-text-decoration-shorthand.js
@@ -0,0 +1,3 @@
+export default {
+ 'text-decoration': true,
+};
diff --git a/node_modules/doiuse/data/features/mdn-text-decoration-style.js b/node_modules/doiuse/data/features/mdn-text-decoration-style.js
new file mode 100644
index 00000000..5c1142c2
--- /dev/null
+++ b/node_modules/doiuse/data/features/mdn-text-decoration-style.js
@@ -0,0 +1,3 @@
+export default {
+ 'text-decoration-style': true,
+};
diff --git a/node_modules/doiuse/data/features/minmaxwh.js b/node_modules/doiuse/data/features/minmaxwh.js
new file mode 100644
index 00000000..4b6ab356
--- /dev/null
+++ b/node_modules/doiuse/data/features/minmaxwh.js
@@ -0,0 +1,6 @@
+export default {
+ 'min-width': true,
+ 'max-width': true,
+ 'min-height': true,
+ 'max-height': true,
+};
diff --git a/node_modules/doiuse/data/features/multibackgrounds.js b/node_modules/doiuse/data/features/multibackgrounds.js
new file mode 100644
index 00000000..6ff70435
--- /dev/null
+++ b/node_modules/doiuse/data/features/multibackgrounds.js
@@ -0,0 +1,11 @@
+import { list } from 'postcss';
+
+/**
+ * @param {import('postcss').ChildNode} rule
+ * @return {boolean}
+ */
+export default (rule) => {
+ if (rule.type !== 'decl') return false;
+ if (!/^background-?/.test(rule.prop)) return false;
+ return list.comma(rule.value).length > 1;
+};
diff --git a/node_modules/doiuse/data/features/multicolumn.js b/node_modules/doiuse/data/features/multicolumn.js
new file mode 100644
index 00000000..3d2efc7c
--- /dev/null
+++ b/node_modules/doiuse/data/features/multicolumn.js
@@ -0,0 +1,15 @@
+export default {
+ 'columns': true,
+ 'column-width': true,
+ 'column-gap': true,
+ 'column-rule': true,
+ 'column-rule-color': true,
+ 'column-rule-width': true,
+ 'column-count': true,
+ 'column-rule-style': true,
+ 'column-span': true,
+ 'column-fill': true,
+ 'break-before': true,
+ 'break-after': true,
+ 'break-inside': true,
+};
diff --git a/node_modules/doiuse/data/features/object-fit.js b/node_modules/doiuse/data/features/object-fit.js
new file mode 100644
index 00000000..44c59b2f
--- /dev/null
+++ b/node_modules/doiuse/data/features/object-fit.js
@@ -0,0 +1,4 @@
+export default {
+ 'object-fit': true,
+ 'object-position': true,
+};
diff --git a/node_modules/doiuse/data/features/outline.js b/node_modules/doiuse/data/features/outline.js
new file mode 100644
index 00000000..17e62061
--- /dev/null
+++ b/node_modules/doiuse/data/features/outline.js
@@ -0,0 +1,6 @@
+export default {
+ 'outline': true,
+ 'outline-style': true,
+ 'outline-width': true,
+ 'outline-color': true,
+};
diff --git a/node_modules/doiuse/data/features/pointer-events.js b/node_modules/doiuse/data/features/pointer-events.js
new file mode 100644
index 00000000..15492e04
--- /dev/null
+++ b/node_modules/doiuse/data/features/pointer-events.js
@@ -0,0 +1,3 @@
+export default {
+ 'pointer-events': true,
+};
diff --git a/node_modules/doiuse/data/features/pointer.js b/node_modules/doiuse/data/features/pointer.js
new file mode 100644
index 00000000..fe8ccc57
--- /dev/null
+++ b/node_modules/doiuse/data/features/pointer.js
@@ -0,0 +1,3 @@
+export default {
+ 'touch-action': true,
+};
diff --git a/node_modules/doiuse/data/features/prefers-color-scheme.js b/node_modules/doiuse/data/features/prefers-color-scheme.js
new file mode 100644
index 00000000..3886efa3
--- /dev/null
+++ b/node_modules/doiuse/data/features/prefers-color-scheme.js
@@ -0,0 +1,12 @@
+/**
+ * prefers-color-scheme media query
+ * Media query to detect if the user has set their system to use a light or dark color theme.
+ * @see https://caniuse.com/prefers-color-scheme
+ */
+
+import { checkAtRule } from '../../utils/util.js';
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default checkAtRule('media', 'prefers-color-scheme');
diff --git a/node_modules/doiuse/data/features/prefers-reduced-motion.js b/node_modules/doiuse/data/features/prefers-reduced-motion.js
new file mode 100644
index 00000000..80246beb
--- /dev/null
+++ b/node_modules/doiuse/data/features/prefers-reduced-motion.js
@@ -0,0 +1,13 @@
+/**
+ * TODO: initially implement feature
+ * prefers-reduced-motion media query
+ * CSS media query based on a user preference for preferring reduced motion (animation, etc).
+ * @see https://caniuse.com/prefers-reduced-motion
+ */
+
+import { checkAtRule } from '../../utils/util.js';
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default checkAtRule('media', 'prefers-reduced-motion');
diff --git a/node_modules/doiuse/data/features/rem.js b/node_modules/doiuse/data/features/rem.js
new file mode 100644
index 00000000..4fd69c35
--- /dev/null
+++ b/node_modules/doiuse/data/features/rem.js
@@ -0,0 +1,3 @@
+import { checkCSSLengthUnits } from '../../utils/util.js';
+
+export default checkCSSLengthUnits('rem');
diff --git a/node_modules/doiuse/data/features/run-in.js b/node_modules/doiuse/data/features/run-in.js
new file mode 100644
index 00000000..188909b0
--- /dev/null
+++ b/node_modules/doiuse/data/features/run-in.js
@@ -0,0 +1,12 @@
+/**
+ * display: run-in
+ * If the run-in box contains a block box, same as block. If a block box follows the run-in box, the run-in box becomes the first inline box of the block box. If an inline box follows, the run-in box becomes a block box.
+ * @see https://caniuse.com/run-in
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'display': 'run-in',
+};
diff --git a/node_modules/doiuse/data/features/style-scoped.js b/node_modules/doiuse/data/features/style-scoped.js
new file mode 100644
index 00000000..667e7b52
--- /dev/null
+++ b/node_modules/doiuse/data/features/style-scoped.js
@@ -0,0 +1,12 @@
+/**
+ * Scoped CSS
+ * Allows CSS rules to be scoped to part of the document, based on the position of the style element. The attribute has been [removed from the current specification](https://github.com/whatwg/html/issues/552).
+ * @see https://caniuse.com/style-scoped
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {};
+
+/* this feature appears in HTML, so we don't lint it */
diff --git a/node_modules/doiuse/data/features/svg-css.js b/node_modules/doiuse/data/features/svg-css.js
new file mode 100644
index 00000000..8b2039a6
--- /dev/null
+++ b/node_modules/doiuse/data/features/svg-css.js
@@ -0,0 +1,19 @@
+/**
+ * SVG in CSS backgrounds
+ * Method of using SVG images as CSS backgrounds
+ * @see https://caniuse.com/svg-css
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default (rule) => {
+ if (rule.type !== 'decl') return false;
+ if (/url\([\S\s]*svg/g.test(
+ rule.toString(),
+ )) {
+ return true;
+ }
+
+ return false;
+};
diff --git a/node_modules/doiuse/data/features/text-decoration.js b/node_modules/doiuse/data/features/text-decoration.js
new file mode 100644
index 00000000..5b97b3a5
--- /dev/null
+++ b/node_modules/doiuse/data/features/text-decoration.js
@@ -0,0 +1,9 @@
+export default {
+ 'text-decoration-style': true,
+ 'text-decoration-line': true,
+ 'text-decoration-color': true,
+ 'text-decoration': /\w \w/,
+ 'text-decoration-thickness': true,
+ 'text-decoration-skip': true,
+ 'text-decoration-skip-ink': true,
+};
diff --git a/node_modules/doiuse/data/features/text-emphasis.js b/node_modules/doiuse/data/features/text-emphasis.js
new file mode 100644
index 00000000..8bd63742
--- /dev/null
+++ b/node_modules/doiuse/data/features/text-emphasis.js
@@ -0,0 +1,15 @@
+/**
+ * text-emphasis styling
+ * Method of using small symbols next to each glyph to emphasize a run of text, commonly used in East Asian languages. The `text-emphasis` shorthand, and its `text-emphasis-style` and `text-emphasis-color` longhands, can be used to apply marks to the text. The `text-emphasis-position` property, which inherits separately, allows setting the emphasis marks' position with respect to the text.
+ * @see https://caniuse.com/text-emphasis
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'text-emphasis': true,
+ 'text-emphasis-style': true,
+ 'text-emphasis-color': true,
+ 'text-emphasis-position': true,
+};
diff --git a/node_modules/doiuse/data/features/text-overflow.js b/node_modules/doiuse/data/features/text-overflow.js
new file mode 100644
index 00000000..faf236ea
--- /dev/null
+++ b/node_modules/doiuse/data/features/text-overflow.js
@@ -0,0 +1,3 @@
+export default {
+ 'text-overflow': true,
+};
diff --git a/node_modules/doiuse/data/features/text-size-adjust.js b/node_modules/doiuse/data/features/text-size-adjust.js
new file mode 100644
index 00000000..828e27fb
--- /dev/null
+++ b/node_modules/doiuse/data/features/text-size-adjust.js
@@ -0,0 +1,3 @@
+export default {
+ 'text-size-adjust': true,
+};
diff --git a/node_modules/doiuse/data/features/text-stroke.js b/node_modules/doiuse/data/features/text-stroke.js
new file mode 100644
index 00000000..82e489b1
--- /dev/null
+++ b/node_modules/doiuse/data/features/text-stroke.js
@@ -0,0 +1,15 @@
+/**
+ * CSS text-stroke and text-fill
+ * Method of declaring the outline (stroke) width and color for text.
+ * @see https://caniuse.com/text-stroke
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'text-stroke-color': true,
+ 'text-stroke-width': true,
+ 'text-stroke': true,
+ 'text-fill-color': true,
+};
diff --git a/node_modules/doiuse/data/features/transforms2d.js b/node_modules/doiuse/data/features/transforms2d.js
new file mode 100644
index 00000000..32f0dc6c
--- /dev/null
+++ b/node_modules/doiuse/data/features/transforms2d.js
@@ -0,0 +1,4 @@
+export default {
+ 'transform': true,
+ 'transform-origin': true,
+};
diff --git a/node_modules/doiuse/data/features/transforms3d.js b/node_modules/doiuse/data/features/transforms3d.js
new file mode 100644
index 00000000..8f90cf6b
--- /dev/null
+++ b/node_modules/doiuse/data/features/transforms3d.js
@@ -0,0 +1,7 @@
+export default {
+ 'perspective': true,
+ 'perspective-origin': true,
+ 'transform-style': true,
+ 'backface-visibility': true,
+ 'transform': '3d',
+};
diff --git a/node_modules/doiuse/data/features/ttf.js b/node_modules/doiuse/data/features/ttf.js
new file mode 100644
index 00000000..19f7687e
--- /dev/null
+++ b/node_modules/doiuse/data/features/ttf.js
@@ -0,0 +1,20 @@
+/**
+ * TTF/OTF - TrueType and OpenType font support
+ * Support for the TrueType (.ttf) and OpenType (.otf) outline font formats in @font-face.
+ * @see https://caniuse.com/ttf
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default (rule) => {
+ const ruleText = rule.toString();
+
+ if (ruleText.includes('@font-face') && (
+ (ruleText.includes('.ttf') || ruleText.includes('.otf'))
+ )) {
+ return true;
+ }
+
+ return false;
+};
diff --git a/node_modules/doiuse/data/features/user-select-none.js b/node_modules/doiuse/data/features/user-select-none.js
new file mode 100644
index 00000000..880da5df
--- /dev/null
+++ b/node_modules/doiuse/data/features/user-select-none.js
@@ -0,0 +1,3 @@
+export default {
+ 'user-select': true,
+};
diff --git a/node_modules/doiuse/data/features/variable-fonts.js b/node_modules/doiuse/data/features/variable-fonts.js
new file mode 100644
index 00000000..461bde8c
--- /dev/null
+++ b/node_modules/doiuse/data/features/variable-fonts.js
@@ -0,0 +1,12 @@
+/**
+ * Variable fonts
+ * OpenType font settings that allows a single font file to behave like multiple fonts: it can contain all the allowed variations in width, weight, slant, optical size, or any other exposed axes of variation as defined by the font designer. Variations can be applied via the `font-variation-settings` property.
+ * @see https://caniuse.com/variable-fonts
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'font-variation-settings': true,
+};
diff --git a/node_modules/doiuse/data/features/viewport-unit-variants.js b/node_modules/doiuse/data/features/viewport-unit-variants.js
new file mode 100644
index 00000000..330df5df
--- /dev/null
+++ b/node_modules/doiuse/data/features/viewport-unit-variants.js
@@ -0,0 +1,43 @@
+import { checkCSSLengthUnits } from '../../utils/util.js';
+
+/**
+ * Small, Large, and Dynamic viewport units
+ * Viewport units similar to `vw` and `vh` that are based on shown or hidden
+ * browser UI states to address shortcomings of the original units. Currently
+ * defined as the
+ * `sv*` units (`svb`, `svh`, `svi`, `svmax`, `svmin`, `svw`),
+ * `lv*` units (`lvb`, `lvh`, `lvi`, `lvmax`, `lvmin`, `lvw`),
+ * `dv*` units (`dvb`, `dvh`, `dvi`, `dvmax`, `dvmin`, `dvw`)
+ * and the logical `vi`/`vb` units.
+ * @see https://caniuse.com/viewport-unit-variants
+ * @type {import('../features').Feature}
+ */
+export default checkCSSLengthUnits(
+ /* sv* units */
+ 'svb',
+ 'svh',
+ 'svi',
+ 'svmax',
+ 'svmin',
+ 'svw',
+
+ /* lv* units */
+ 'lvb',
+ 'lvh',
+ 'lvi',
+ 'lvmax',
+ 'lvmin',
+ 'lvw',
+
+ /* dv* units */
+ 'dvb',
+ 'dvh',
+ 'dvi',
+ 'dvmax',
+ 'dvmin',
+ 'dvw',
+
+ /* vi/vb units */
+ 'vi',
+ 'vb',
+);
diff --git a/node_modules/doiuse/data/features/viewport-units.js b/node_modules/doiuse/data/features/viewport-units.js
new file mode 100644
index 00000000..fe8b79a8
--- /dev/null
+++ b/node_modules/doiuse/data/features/viewport-units.js
@@ -0,0 +1,8 @@
+export default {
+ '': [
+ 'vw',
+ 'vh',
+ 'vmin',
+ 'vmax',
+ ],
+};
diff --git a/node_modules/doiuse/data/features/webkit-user-drag.js b/node_modules/doiuse/data/features/webkit-user-drag.js
new file mode 100644
index 00000000..a695919a
--- /dev/null
+++ b/node_modules/doiuse/data/features/webkit-user-drag.js
@@ -0,0 +1,12 @@
+/**
+ * CSS -webkit-user-drag property
+ * The non-standard `-webkit-user-drag` CSS property can be used to either make an element draggable or explicitly non-draggable (like links and images). See the standardized [draggable attribute/property](/mdn-api_htmlelement_draggable) for the recommended alternative method of accomplishing the same functionality.
+ * @see https://caniuse.com/webkit-user-drag
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+export default {
+ 'webkit-user-drag': true,
+};
diff --git a/node_modules/doiuse/data/features/will-change.js b/node_modules/doiuse/data/features/will-change.js
new file mode 100644
index 00000000..042ef87b
--- /dev/null
+++ b/node_modules/doiuse/data/features/will-change.js
@@ -0,0 +1,3 @@
+export default {
+ 'will-change': true,
+};
diff --git a/node_modules/doiuse/data/features/word-break.js b/node_modules/doiuse/data/features/word-break.js
new file mode 100644
index 00000000..731e6be0
--- /dev/null
+++ b/node_modules/doiuse/data/features/word-break.js
@@ -0,0 +1,3 @@
+export default {
+ 'word-break': true,
+};
diff --git a/node_modules/doiuse/data/features/wordwrap.js b/node_modules/doiuse/data/features/wordwrap.js
new file mode 100644
index 00000000..b90e17f1
--- /dev/null
+++ b/node_modules/doiuse/data/features/wordwrap.js
@@ -0,0 +1,4 @@
+export default {
+ 'overflow-wrap': true,
+ 'word-wrap': true,
+};
diff --git a/node_modules/doiuse/exports/index.cjs b/node_modules/doiuse/exports/index.cjs
new file mode 100644
index 00000000..34cabe3a
--- /dev/null
+++ b/node_modules/doiuse/exports/index.cjs
@@ -0,0 +1,2901 @@
+'use strict';
+
+var multimatch = require('multimatch');
+var browserslist = require('browserslist');
+var caniuse = require('caniuse-lite');
+var postcss = require('postcss');
+
+function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
+
+function _interopNamespace(e) {
+ if (e && e.__esModule) return e;
+ var n = Object.create(null);
+ if (e) {
+ Object.keys(e).forEach(function (k) {
+ if (k !== 'default') {
+ var d = Object.getOwnPropertyDescriptor(e, k);
+ Object.defineProperty(n, k, d.get ? d : {
+ enumerable: true,
+ get: function () { return e[k]; }
+ });
+ }
+ });
+ }
+ n["default"] = e;
+ return Object.freeze(n);
+}
+
+var multimatch__default = /*#__PURE__*/_interopDefaultLegacy(multimatch);
+var browserslist__default = /*#__PURE__*/_interopDefaultLegacy(browserslist);
+var caniuse__namespace = /*#__PURE__*/_interopNamespace(caniuse);
+
+/**
+ * No description available.
+ *
+ * See: This feature comes from MDN: https://developer.mozilla.org/en-US/search?q=Alternate+stylesheet
+ */
+
+// This feature is only in HTML, so we don't lint it
+
+/**
+ * @type {import('../features').Feature}
+ */
+var alternateStylesheet = {};
+
+/**
+ * Method of defining how a background image is attached to a scrollable element. Values include `scroll` (default), `fixed` and `local`.
+ *
+ * See: https://caniuse.com/background-attachment
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var backgroundAttachment = {
+ 'background-attachment': [
+ 'fixed',
+ 'local',
+ ],
+};
+
+/**
+ * Non-standard method of clipping a background image to the foreground text.
+ *
+ * See: https://caniuse.com/background-clip-text
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var backgroundClipText = {
+ 'background-clip': 'text',
+ '-webkit-background-clip': 'text',
+};
+
+var backgroundImgOpts = {
+ 'background-clip': true,
+ 'background-origin': true,
+ 'background-size': true,
+};
+
+var backgroundPositionXY = {
+ 'background-position-x': true,
+ 'background-position-y': true,
+};
+
+/**
+ * Allows CSS background images to be repeated without clipping.
+ *
+ * See: https://caniuse.com/background-repeat-round-space
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var backgroundRepeatRoundSpace = {
+ 'background-repeat': ['round', 'space'],
+};
+
+var borderImage = {
+ 'border-image': true,
+ 'border-image-outset': true,
+ 'border-image-repeat': true,
+ 'border-image-slice': true,
+ 'border-image-source': true,
+ 'border-image-width': true,
+
+};
+
+var borderRadius = {
+ 'border-radius': true,
+ 'border-top-left-radius': true,
+ 'border-top-right-radius': true,
+ 'border-bottom-right-radius': true,
+ 'border-bottom-left-radius': true,
+};
+
+var calc = {
+ '': 'calc(',
+};
+
+/** @typedef {RegExp|string|((value:string) => boolean)} FeatureCheck */
+
+/**
+ * @param {string} browserKey
+ * @param {string[]} [versions]
+ * @return {string}
+ */
+function formatBrowserName(browserKey, versions) {
+ const entry = caniuse.agents[browserKey];
+ const browserName = entry ? entry.browser : null;
+ if (!versions) {
+ return browserName || '';
+ }
+ return (`${browserName} (${versions.join(',')})`);
+}
+
+/**
+ *
+ * @param {FeatureCheck|FeatureCheck[]} check
+ * @param {?string|undefined} candidate
+ */
+function performFeatureCheck(check, candidate) {
+ if (check == null || candidate == null) return false;
+ if (check instanceof RegExp) {
+ return check.test(candidate);
+ }
+ switch (typeof check) {
+ case 'string':
+ return candidate.includes(check);
+ case 'function':
+ return check(candidate);
+ case 'boolean':
+ return check;
+ case 'object':
+ if (Array.isArray(check)) {
+ return check.some((c) => performFeatureCheck(c, candidate));
+ }
+ // Fallthrough
+ default:
+ console.error(check);
+ throw new TypeError(`Unexpected feature check: ${check}`);
+ }
+}
+
+/**
+ * @param {FeatureCheck|FeatureCheck[]} selector
+ * @return {(rule:import('postcss').ChildNode) => boolean}
+ */
+function checkSelector(selector) {
+ return (rule) => rule.type === 'rule'
+ && performFeatureCheck(selector, rule.selector);
+}
+
+/**
+ * @param {FeatureCheck|FeatureCheck[]} [name]
+ * @param {FeatureCheck|FeatureCheck[]} [parameters]
+ * @return {(rule:import('postcss').ChildNode) => boolean}
+ */
+function checkAtRule(name, parameters) {
+ return (rule) => rule.type === 'atrule'
+ && performFeatureCheck(name, rule.name)
+ && (!parameters || performFeatureCheck(parameters, rule.params));
+}
+
+/**
+ * @see https://drafts.csswg.org/css-values/#lengths
+ * @see https://drafts.csswg.org/css-values/#number-value
+ * @param {string[]} units
+ * @return {(rule:import('postcss').ChildNode) => boolean}
+ */
+function checkCSSLengthUnits(...units) {
+ const regexp = new RegExp(`(\\+-)?[\\d.]*\\.?\\d+(e(\\+-)?\\d+)?(${units.join('|')})`, 'i');
+ return (rule) => (
+ (rule.type === 'decl') ? performFeatureCheck(regexp, rule.value)
+ : ((rule.type === 'atrule') ? performFeatureCheck(regexp, rule.params)
+ : false));
+}
+
+/**
+ * Unit representing the width of the character "0" in the current font, of particular use in combination with monospace fonts.
+ * @see https://caniuse.com/ch-unit
+ * @type {import('../features').Feature}
+ */
+var chUnit = checkCSSLengthUnits('ch');
+
+var cssAll = {
+ 'all': true,
+};
+
+var cssAnimation = {
+ 'animation': true,
+ 'animation-name': true,
+ 'animation-duration': true,
+ 'animation-timing-function': true,
+ 'animation-iteration-count': true,
+ 'animation-direction': true,
+ 'animation-play-state': true,
+ 'animation-delay': true,
+ 'animation-fill-mode': true,
+};
+
+// @keyframes isn't checked for, but if you try to use it,
+// you'll still get a warning anyway because of the 'animation' property
+
+var cssAnyLink = checkSelector([':any-link', ':-webkit-any-link']);
+
+var cssAppearance = {
+ 'appearance': true,
+ '-webkit-appearance': true,
+ '-moz-appearance': true,
+};
+
+var cssAtCounterStyle = checkAtRule('counter-style');
+
+var cssAutofill = checkSelector([':autofill', ':-webkit-autofill']);
+
+var cssBackdropFilter = {
+ 'backdrop-filter': true,
+};
+
+/**
+ * @param {import('postcss').ChildNode} rule
+ * @return {boolean}
+ */
+var cssBackgroundOffsets = (rule) => {
+ if (rule.type !== 'decl') return false;
+ if (rule.prop !== 'background-position') return false;
+ return postcss.list.space(rule.value).length > 2;
+};
+
+var cssBackgroundblendmode = {
+ 'background-blend-mode': true,
+};
+
+/**
+ * Controls whether the box's margins, borders, padding, and other decorations wrap the broken edges of the box fragments (when the box is split by a break (page/column/region/line).
+ *
+ * See: https://caniuse.com/css-boxdecorationbreak
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssBoxdecorationbreak = {
+ 'box-decoration-break': true,
+ '-webkit-box-decoration-break': true,
+};
+
+var cssBoxshadow = {
+ 'box-shadow': true,
+};
+
+/**
+ * @param {import('postcss').ChildNode} rule
+ * @return {boolean}
+ */
+var cssCanvas = (rule) => {
+ if (rule.type !== 'decl') return false;
+ if (!rule.prop.startsWith('background')) return false;
+ return rule.value.startsWith('-webkit-canvas');
+};
+
+/**
+ * The `caret-color` property allows the color to be set of the caret (blinking text insertion pointer) in an editable text area.
+ *
+ * See: https://caniuse.com/css-caret-color
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssCaretColor = {
+ 'caret-color': true,
+};
+
+/**
+ * The `@layer` at-rule allows authors to explicitly layer their styles in the cascade, before specificity and order of appearance are considered.
+ *
+ * See: https://caniuse.com/css-cascade-layers
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssCascadeLayers = checkAtRule('layer');
+
+/**
+ * Including an `i` before the `]` in a CSS attribute selector causes the attribute value to be matched in an ASCII-case-insensitive manner. For example, `[b="xyz" i]` would match both `<a b="xyz">` and `<a b="XYZ">`.
+ *
+ * See: https://caniuse.com/css-case-insensitive
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssCaseInsensitive = (rule) => {
+ if (rule.type !== 'rule') { return false; }
+ if (/\[.*i]/.test(rule.selector)) { return true; }
+ return false;
+};
+
+var cssClipPath = {
+ 'clip-path': true,
+};
+
+/**
+ * The `print-color-adjust` (or `-webkit-print-color-adjust` as prefixed in WebKit/Blink browsers) property is a CSS extension that can be used to force printing of background colors and images.
+ *
+ * See: https://caniuse.com/css-color-adjust
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssColorAdjust = {
+ 'print-color-adjust': true,
+ '-webkit-print-color-adjust': true,
+};
+
+/**
+ * The CSS `color()` function allows the browser to display colors in any color space, such as the P3 color space which can display colors outside of the default sRGB color space.
+ *
+ * See: https://caniuse.com/css-color-function
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssColorFunction = {
+ '': 'color(',
+};
+
+const REGEX$2 = /(^|[^-])(repeating-)?conic-gradient/;
+
+var cssConicGradients = {
+ 'background': REGEX$2,
+ 'background-image': REGEX$2,
+ 'border-image': REGEX$2,
+ 'border-image-source': REGEX$2,
+ 'content': REGEX$2,
+ 'cursor': REGEX$2,
+ 'list-style': REGEX$2,
+ 'list-style-image': REGEX$2,
+};
+
+/**
+ * Size queries in Container Queries provide a way to query the size of a container, and conditionally apply CSS to the content of that container.
+ *
+ * See: https://caniuse.com/css-container-queries
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssContainerQueries = checkAtRule('container');
+
+var cssContainerQueriesStyle = checkAtRule('container', 'style(');
+
+var cssContainerQueryUnits = checkCSSLengthUnits(
+ 'cqw',
+ 'cqh',
+ 'cqi',
+ 'cqb',
+ 'cqmin',
+ 'cqmax',
+);
+
+/**
+ * The CSS `contain` property lets developers limit the scope of the browser's styles, layout and paint work for faster and more efficient rendering.
+ *
+ * See: https://caniuse.com/css-containment
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssContainment = {
+ 'contain': true,
+};
+
+/**
+ * Provides control over when elements are rendered, so rendering can be skipped for elements not yet in the user's viewport.
+ *
+ * See: https://caniuse.com/css-content-visibility
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssContentVisibility = {
+ 'content-visibility': true,
+};
+
+var cssCounters = {
+ 'counter-reset': true,
+ 'counter-increment': true,
+ '': 'counter(',
+};
+
+/**
+ * Scales images with an algorithm that preserves edges and contrast, without smoothing colors or introducing blur. This is intended for images such as pixel art. Official values that accomplish this for the `image-rendering` property are `crisp-edges` and `pixelated`.
+ *
+ * See: https://caniuse.com/css-crisp-edges
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssCrispEdges = {
+ 'image-rendering': ['crisp-edges', 'pixelated'],
+};
+
+/**
+ * Image function to create a "crossfade" between images. This allows one image to transition (fade) into another based on a percentage value.
+ *
+ * See: https://caniuse.com/css-cross-fade
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssCrossFade = {
+ '': [
+ 'cross-fade(',
+ '-webkit-cross-fade(',
+ ],
+};
+
+/**
+ * The `:default` pseudo-class matches checkboxes and radio buttons which are checked by default, `<option>`s with the `selected` attribute, and the default submit button (if any) of a form.
+ *
+ * See: https://caniuse.com/css-default-pseudo
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssDefaultPseudo = checkSelector(':default');
+
+/**
+ * An explicit, non-whitespace spelling of the descendant combinator. `A >> B` is equivalent to `A B`.
+ *
+ * See: https://caniuse.com/css-descendant-gtgt
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssDescendantGtgt = checkSelector('>>');
+
+/**
+ * Method of overriding the size of viewport in web page using the `@viewport` rule, replacing Apple's own popular `<meta>` viewport implementation. Includes the `extend-to-zoom` width value.
+ *
+ * See: https://caniuse.com/css-deviceadaptation
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssDeviceadaptation = checkAtRule('viewport');
+
+/**
+ * Matches elements based on their directionality. `:dir(ltr)` matches elements which are Left-to-Right. `:dir(rtl)` matches elements which are Right-to-Left.
+ *
+ * See: https://caniuse.com/css-dir-pseudo
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssDirPseudo = checkSelector(':dir(');
+
+/**
+ * `display: contents` causes an element's children to appear as if they were direct children of the element's parent, ignoring the element itself. This can be useful when a wrapper element should be ignored when using CSS grid or similar layout techniques.
+ *
+ * See: https://caniuse.com/css-display-contents
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssDisplayContents = {
+ 'display': 'contents',
+};
+
+/**
+ * This function renders a live image generated from an arbitrary HTML element
+ *
+ * See: https://caniuse.com/css-element-function
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssElementFunction = {
+ '': 'element(',
+};
+
+var cssEnvFunction = {
+ '': 'env(',
+};
+
+/**
+ * Exclusions defines how inline content flows around elements. It extends the content wrapping ability of floats to any block-level element.
+ *
+ * See: https://caniuse.com/css-exclusions
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssExclusions = {
+ 'wrap-flow': true,
+ '-ms-wrap-flow': true,
+};
+
+var cssFeaturequeries = checkAtRule(['supports']);
+
+/**
+ * No description available.
+ *
+ * See: This feature comes from MDN: https://developer.mozilla.org/en-US/search?q=::file-selector-button+CSS+pseudo-element
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssFileSelectorButton = checkSelector(':file-selector-button');
+
+/**
+ * This function filters a CSS input image with a set of filter functions (like blur, grayscale or hue)
+ *
+ * See: https://caniuse.com/css-filter-function
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssFilterFunction = {
+ '': 'filter(',
+};
+
+var cssFilters = {
+ 'filter': true,
+};
+
+/**
+ * CSS pseudo-element that allows styling only the first "letter" of text within an element. Useful for implementing initial caps or drop caps styling.
+ *
+ * See: https://caniuse.com/css-first-letter
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssFirstLetter = checkSelector(':first-letter');
+
+/**
+ * Allows styling specifically for the first line of text using the `::first-line` pseudo-element. Note that only a limited set of properties can be applied.
+ *
+ * See: https://caniuse.com/css-first-line
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssFirstLine = checkSelector(':first-line');
+
+var cssFixed = {
+ 'position': 'fixed',
+};
+
+/**
+ * The `:focus-visible` pseudo-class applies while an element matches the `:focus` pseudo-class, and the UA determines via heuristics that the focus should be specially indicated on the element (typically via a “focus ring”).
+ *
+ * See: https://caniuse.com/css-focus-visible
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssFocusVisible = checkSelector(':focus-visible');
+
+/**
+ * The `:focus-within` pseudo-class matches elements that either themselves match `:focus` or that have descendants which match `:focus`.
+ *
+ * See: https://caniuse.com/css-focus-within
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssFocusWithin = checkSelector(':focus-within');
+
+var cssFontPalette = [
+ (rule) => performFeatureCheck('font-palette', rule.name),
+ checkAtRule('font-palette-values'),
+];
+
+/**
+ * `@font-face` descriptor `font-display` that allows control over how a downloadable font renders before it is fully loaded.
+ *
+ * See: https://caniuse.com/css-font-rendering-controls
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssFontRenderingControls = {
+ 'font-display': true,
+};
+
+var cssFontStretch = {
+ 'font-stretch': true,
+};
+
+var cssGencontent = checkSelector([':before', ':after']);
+
+const REGEX$1 = /(^|[^-])((linear)|(radial))-gradient/;
+
+var cssGradients = {
+ 'background': REGEX$1,
+ 'background-image': REGEX$1,
+ 'border-image': REGEX$1,
+ 'border-image-source': REGEX$1,
+ 'content': REGEX$1,
+ 'cursor': REGEX$1,
+ 'list-style': REGEX$1,
+ 'list-style-image': REGEX$1,
+};
+
+/** @see https://drafts.csswg.org/css-grid/ */
+
+var cssGrid = {
+ 'display': ['grid', 'inline-grid', '-ms-grid'],
+ 'grid': true,
+ 'grid-area': true,
+ 'grid-auto-columns': true,
+
+ 'grid-auto-flow': true,
+ 'grid-auto-rows': true,
+ 'grid-column': true,
+ 'grid-column-end': true,
+
+ 'grid-column-start': true,
+ 'grid-row': true,
+ 'grid-row-end': true,
+ 'grid-row-start': true,
+
+ 'grid-template': true,
+ 'grid-template-areas': true,
+ 'grid-template-columns': true,
+ 'grid-template-rows': true,
+};
+
+const REGEX = /grid/;
+
+var cssGridAnimation = {
+ 'transition': REGEX,
+ 'transition-property': REGEX,
+};
+
+/**
+ * Allows some punctuation characters from start (or the end) of text elements to be placed "outside" of the box in order to preserve the reading flow.
+ * @see https://caniuse.com/css-hanging-punctuation
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssHangingPunctuation = {
+ 'hanging-punctuation': true,
+};
+
+/**
+ * Select elements containing specific content. For example, `a:has(img)` selects all `<a>` elements that contain an `<img>` child.
+ * @see https://caniuse.com/css-has
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssHas = checkSelector(':has');
+
+var cssHyphens = {
+ 'hyphens': true,
+};
+
+var cssImageOrientation = {
+ 'image-orientation': true,
+};
+
+/**
+ * Method of letting the browser pick the most appropriate CSS image from a given set.
+ * @see https://caniuse.com/css-image-set
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssImageSet = {
+ '': 'image-set(',
+};
+
+/**
+ * If a temporal or number `<input>` has `max` and/or `min` attributes, then `:in-range` matches when the value is within the specified range and `:out-of-range` matches when the value is outside the specified range. If there are no range constraints, then neither pseudo-class matches.
+ * @see https://caniuse.com/css-in-out-of-range
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssInOutOfRange = checkSelector([
+ ':in-range',
+ ':out-of-range',
+]);
+
+/**
+ * The `:indeterminate` pseudo-class matches indeterminate checkboxes, indeterminate `<progress>` bars, and radio buttons with no checked button in their radio button group.
+ * @see https://caniuse.com/css-indeterminate-pseudo
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssIndeterminatePseudo = checkSelector(':indeterminate');
+
+/**
+ * Method of creating an enlarged cap, including a drop or raised cap, in a robust way.
+ * @see https://caniuse.com/css-initial-letter
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssInitialLetter = {
+ 'initial-letter': true,
+};
+
+var cssInitialValue = {
+ '': 'initial',
+};
+
+/**
+ * The `lch()` and `lab()` color functions are based on the CIE LAB color space, representing colors in a way that closely matches human perception and provides access to a wider spectrum of colors than offered by the usual RGB color space.
+ * @see https://caniuse.com/css-lch-lab
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssLchLab = {
+ '': [
+ 'lch(',
+ 'lab(',
+ ],
+};
+
+/**
+ * Controls spacing between characters of text (i.e. "tracking" in typographical terms). Not to be confused with kerning.
+ * @see https://caniuse.com/css-letter-spacing
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssLetterSpacing = {
+ 'letter-spacing': true,
+};
+
+/**
+ * CSS property that will contain text to a given amount of lines when used in combination with `display: -webkit-box`. It will end with ellipsis when `text-overflow: ellipsis` is included.
+ * @see https://caniuse.com/css-line-clamp
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssLineClamp = {
+ 'line-clamp': true,
+ '-webkit-line-clamp': true,
+};
+
+var cssLogicalProps = {
+ 'block-size': true,
+ 'inline-size': true,
+ 'min-block-size': true,
+ 'min-inline-size': true,
+ 'max-block-size': true,
+ 'max-inline-size': true,
+ 'margin-block-start': true,
+ 'margin-block-end': true,
+ 'margin-inline-start': true,
+ 'margin-inline-end': true,
+ 'margin-block': true,
+ 'margin-inline': true,
+ 'inset-block-start': true,
+ 'inset-block-end': true,
+ 'inset-inline-start': true,
+ 'inset-inline-end': true,
+ 'inset-block': true,
+ 'inset-inline': true,
+ 'inset': true,
+ 'padding-block-start': true,
+ 'padding-block-end': true,
+ 'padding-inline-start': true,
+ 'padding-inline-end': true,
+ 'padding-block': true,
+ 'padding-inline': true,
+ 'border-block-start-width': true,
+ 'border-block-end-width': true,
+ 'border-inline-start-width': true,
+ 'border-inline-end-width': true,
+ 'border-block-width': true,
+ 'border-inline-width': true,
+ 'border-block-start-style': true,
+ 'border-block-end-style': true,
+ 'border-inline-start-style': true,
+ 'border-inline-end-style': true,
+ 'border-block-style': true,
+ 'border-inline-style': true,
+ 'border-block-start-color': true,
+ 'border-block-end-color': true,
+ 'border-inline-start-color': true,
+ 'border-inline-end-color': true,
+ 'border-block-color': true,
+ 'border-inline-color': true,
+ 'border-block-start': true,
+ 'border-block-end': true,
+ 'border-inline-start': true,
+ 'border-inline-end': true,
+ 'border-block': true,
+ 'border-inline': true,
+ 'border-start-start-radius': true,
+ 'border-start-end-radius': true,
+ 'border-end-start-radius': true,
+ 'border-end-end-radius': true,
+ 'text-align': ['start', 'end'],
+ 'float': ['inline-start', 'inline-end'],
+ 'resize': ['block', 'inline'],
+ 'overflow-block': true,
+ 'overflow-inline': true,
+};
+
+/**
+ * The `::marker` pseudo-element allows list item markers to be styled or have their content value customized.
+ * @see https://caniuse.com/css-marker-pseudo
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssMarkerPseudo = checkSelector(':marker');
+
+var cssMasks = {
+ 'clip-path': true,
+ 'mask': true,
+ 'mask-border': true,
+ 'mask-border-mode': true,
+ 'mask-border-outset': true,
+ 'mask-border-repeat': true,
+ 'mask-border-slice': true,
+ 'mask-border-source': true,
+ 'mask-border-width': true,
+ 'mask-clip': true,
+ 'mask-composite': true,
+ 'mask-image': true,
+ 'mask-mode': true,
+ 'mask-origin': true,
+ 'mask-position': true,
+ 'mask-repeat': true,
+ 'mask-size': true,
+ 'mask-type': true,
+ // and webkit versions
+ '-webkit-clip-path': true,
+ '-webkit-mask': true,
+ '-webkit-mask-border': true,
+ '-webkit-mask-border-mode': true,
+ '-webkit-mask-border-outset': true,
+ '-webkit-mask-border-repeat': true,
+ '-webkit-mask-border-slice': true,
+ '-webkit-mask-border-source': true,
+ '-webkit-mask-border-width': true,
+ '-webkit-mask-clip': true,
+ '-webkit-mask-composite': true,
+ '-webkit-mask-image': true,
+ '-webkit-mask-mode': true,
+ '-webkit-mask-origin': true,
+ '-webkit-mask-position': true,
+ '-webkit-mask-repeat': true,
+ '-webkit-mask-size': true,
+ '-webkit-mask-type': true,
+};
+
+var cssMatchesPseudo = checkSelector([
+ ':is',
+ ':where',
+ ':matches',
+ ':any',
+ ':-webkit-any',
+ ':-webkit-is',
+ ':-webkit-where',
+ ':-webkit-matches',
+]);
+
+var cssMathFunctions = {
+ '': ['min(', 'max(', 'clamp('],
+};
+
+/**
+ * Allows a media query to be set based on the presence and accuracy of the user's pointing device, and whether they have the ability to hover over elements on the page. This includes the `pointer`, `any-pointer`, `hover`, and `any-hover` media features.
+ * @see https://caniuse.com/css-media-interaction
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssMediaInteraction = checkAtRule('media', [
+ 'pointer',
+ 'any-pointer',
+ 'hover',
+ 'any-hover',
+]);
+
+var cssMediaRangeSyntax = checkAtRule('media', [' > ', ' < ', ' <= ', ' >= ']);
+
+var cssMediaResolution = checkAtRule('media', ['min-resolution', 'max-resolution', 'resolution', 'device-pixel-ratio']);
+
+/**
+ * No description available.
+ * @see This feature comes from MDN: https://developer.mozilla.org/en-US/search?q=Media+Queries:+scripting+media+feature
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssMediaScripting = checkAtRule('media', ['scripting']);
+
+var cssMediaqueries = checkAtRule(['media']);
+
+var cssMixblendmode = {
+ 'mix-blend-mode': true,
+};
+
+var cssMotionPaths = {
+ 'offset-path': true,
+};
+
+/**
+ * Using the `@namespace` at-rule, elements of other namespaces (e.g. SVG) can be targeted using the pipe (`|`) selector.
+ * @see https://caniuse.com/css-namespaces
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssNamespaces = checkAtRule('namespace');
+
+/**
+ * CSS nesting provides the ability to nest one style rule inside another, with the selector of the child rule relative to the selector of the parent rule. Similar behavior previously required a CSS pre-processor.
+ * @see https://caniuse.com/css-nesting
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssNesting = (rule) => {
+ if (rule.type === 'rule' && rule.parent.type === 'rule') {
+ return true;
+ }
+
+ if (rule.type === 'atrule' && rule.parent.type === 'rule') {
+ return true;
+ }
+
+ return false;
+};
+
+/**
+ * Selectors Level 3 only allowed `:not()` pseudo-class to accept a single simple selector, which the element must not match any of. Thus, `:not(a, .b, [c])` or `:not(a.b[c])` did not work. Selectors Level 4 allows `:not()` to accept a list of selectors. Thus, `:not(a):not(.b):not([c])` can instead be written as `:not(a, .b, [c])` and `:not(a.b[c])` works as intended.
+ * @see https://caniuse.com/css-not-sel-list
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssNotSelList = checkSelector(
+ (selector) => selector.includes(':not(') && !/:not\(.?#?-?[\w[\]-]+\)/.test(selector),
+);
+
+/**
+ * The newest versions of `:nth-child()` and `:nth-last-child()` accept an optional `of S` clause which filters the children to only those which match the selector list `S`. For example, `:nth-child(1 of .foo)` selects the first child among the children that have the `foo` class (ignoring any non-`foo` children which precede that child). Similar to `:nth-of-type`, but for arbitrary selectors instead of only type selectors.
+ * @see https://caniuse.com/css-nth-child-of
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssNthChildOf = checkSelector(
+ (selector) => /:nth-(child|last-child)\(\s*\d+\s*of/.test(selector),
+);
+
+var cssOpacity = {
+ 'opacity': true,
+};
+
+/**
+ * The `:optional` pseudo-class matches form inputs (`<input>`, `<textarea>`, `<select>`) which are not `:required`.
+ * @see https://caniuse.com/css-optional-pseudo
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssOptionalPseudo = checkSelector(':optional');
+
+/**
+ * Originally a single property for controlling overflowing content in both horizontal & vertical directions, the `overflow` property is now a shorthand for `overflow-x` & `overflow-y`. The latest version of the specification also introduces the `clip` value that blocks programmatic scrolling.
+ * @see https://caniuse.com/css-overflow
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssOverflow = {
+ 'overflow': true,
+ 'overflow-x': true,
+ 'overflow-y': true,
+};
+
+/**
+ * Changes in DOM elements above the visible region of a scrolling box can result in the page moving while the user is in the middle of consuming the content. By default, the value of `overflow-anchor` is `auto`, it can mitigate this jarring user experience by keeping track of the position of an anchor node and adjusting the scroll offset accordingly
+ * @see https://caniuse.com/css-overflow-anchor
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssOverflowAnchor = {
+ 'overflow-anchor': true,
+};
+
+var cssOverflowOverlay = {
+ 'overflow': 'overlay',
+};
+
+var cssOverscrollBehavior = {
+ 'overscroll-behavior': true,
+ 'overscroll-behavior-x': true,
+ 'overscroll-behavior-y': true,
+};
+
+/**
+ * Properties to control the way elements are broken across (printed) pages.
+ * @see https://caniuse.com/css-page-break
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssPageBreak = {
+ 'page-break-after': true,
+ 'page-break-before': true,
+ 'page-break-inside': true,
+};
+
+/**
+ * CSS at-rule (`@page`) to define page-specific rules when printing web pages, such as margin per page and page dimensions.
+ * @see https://caniuse.com/css-paged-media
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssPagedMedia = checkAtRule('page');
+
+/**
+ * Allows programmatic generation of images used by CSS
+ * @see https://caniuse.com/css-paint-api
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssPaintApi = { '': 'paint(' };
+
+var cssPlaceholder = [
+ checkSelector(':placeholder'),
+];
+
+/**
+ * :placeholder-shown CSS pseudo-class
+ * Input elements can sometimes show placeholder text as a hint to the user on what to type in. See, for example, the placeholder attribute in HTML5. The :placeholder-shown pseudo-class matches an input element that is showing such placeholder text.
+ * @see https://caniuse.com/css-placeholder-shown
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssPlaceholderShown = checkSelector(':placeholder-shown');
+
+var cssPrintColorAdjust = {
+ 'print-color-adjust': true,
+};
+
+/**
+ * CSS :read-only and :read-write selectors
+ * :read-only and :read-write pseudo-classes to match elements which are considered user-alterable
+ * @see https://caniuse.com/css-read-only-write
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssReadOnlyWrite = checkSelector([':read-only', ':read-write']);
+
+/**
+ * Rebeccapurple color
+ * The new color added in CSS Color Module Level 4
+ * @see https://caniuse.com/css-rebeccapurple
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssRebeccapurple = {
+ '': 'rebeccapurple',
+};
+
+var cssReflections = {
+ 'box-reflect': true,
+ '-webkit-box-reflect': true,
+};
+
+/**
+ * CSS Regions
+ * Method of flowing content into multiple elements, allowing magazine-like layouts. While once supported in WebKit-based browsers and Internet Explorer, implementing the feature is no longer being pursued by any browser.
+ * @see https://caniuse.com/css-regions
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssRegions = {
+ 'flow-into': true,
+ 'flow-from': true,
+ '-webkit-flow-into': true,
+ '-webkit-flow-from': true,
+};
+
+/**
+ * CSS Relative colors
+ * The CSS Relative Color syntax allows a color to be defined relative to another color using the `from` keyword and optionally `calc()` for any of the color values.
+ * @see https://caniuse.com/css-relative-colors
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssRelativeColors = {
+ '': /((rgb)|(rgba)|(hsl)|(hsla)|(hwb))\(\s*from/,
+};
+
+var cssRepeatingGradients = {
+ '': [
+ 'repeating-linear-gradient',
+ 'repeating-radial-gradient',
+ ],
+};
+
+var cssResize = {
+ 'resize': true,
+};
+
+var cssRevertValue = {
+ '': 'revert',
+
+};
+
+/**
+ * #rrggbbaa hex color notation
+ * The CSS Color Module Level 4 defines new 4 & 8 character hex notation for color to include the opacity level.
+ * @see https://caniuse.com/css-rrggbbaa
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssRrggbbaa = {
+ '': [
+ /#[\da-f]{8}/i,
+ /#[\da-f]{4}(\W|$)/i,
+ ],
+};
+
+/**
+ * CSS Scroll-behavior
+ * Method of specifying the scrolling behavior for a scrolling box, when scrolling happens due to navigation or CSSOM scrolling APIs.
+ * @see https://caniuse.com/css-scroll-behavior
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssScrollBehavior = {
+ 'scroll-behavior': true,
+};
+
+/**
+ * CSS @scroll-timeline
+ * CSS property that allows animations to be driven by a container's scroll position
+ * @see https://caniuse.com/css-scroll-timeline
+ */
+
+const checkAt = checkAtRule('scroll-timeline');
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssScrollTimeline = (node) => {
+ // check for @scroll-timeline
+ if (checkAt(node)) {
+ return true;
+ }
+
+ // check for animation-timeline
+ if (node.type !== 'decl') return false;
+ if (node.prop.startsWith('animation-timeline')) {
+ return true;
+ }
+
+ return false;
+};
+
+var cssScrollbar = {
+ 'scrollbar-color': true,
+ 'scrollbar-width': true,
+};
+
+const ATTRIBUTE_IDENTIFIER$1 = '[^\\~|^$*\\]]*';
+
+// Export for testing
+const REGEXES$1 = {
+ 'HAS_ATTRIBUTE': new RegExp(`\\[${ATTRIBUTE_IDENTIFIER$1}\\]`),
+ 'MATCH_ATTRIBUTE': new RegExp(`\\[${ATTRIBUTE_IDENTIFIER$1}=${ATTRIBUTE_IDENTIFIER$1}\\]`),
+ 'WORD_ATTRIBUTE': new RegExp(`\\[${ATTRIBUTE_IDENTIFIER$1}\\~=${ATTRIBUTE_IDENTIFIER$1}\\]`),
+ 'SUBCODE_ATTRIBUTE': new RegExp(`\\[${ATTRIBUTE_IDENTIFIER$1}\\|=${ATTRIBUTE_IDENTIFIER$1}\\]`),
+ 'BRACKET_PARENS': /(\[[^=\]]*(=("[^"]*")|[^\]]+|)])|(\([^)]*\))/g,
+};
+
+/**
+ * @param {RegExp} pattern
+ * @return {(str:string) => boolean}
+ */
+function matchOutsideOfBrackets(pattern) {
+ if (!(pattern instanceof RegExp)) {
+ throw new TypeError('matchOutsideOfBrackets expects a RegExp');
+ }
+ return (string) => pattern.test(string.replaceAll(REGEXES$1.BRACKET_PARENS, ''));
+}
+
+var cssSel2 = checkSelector([
+ ':first-child',
+ ':link',
+ ':visited',
+ ':active',
+ ':hover',
+ ':focus',
+ ':lang',
+ REGEXES$1.HAS_ATTRIBUTE,
+ REGEXES$1.MATCH_ATTRIBUTE,
+ REGEXES$1.WORD_ATTRIBUTE,
+ REGEXES$1.SUBCODE_ATTRIBUTE,
+ matchOutsideOfBrackets(/\*/),
+ matchOutsideOfBrackets(/>/),
+ matchOutsideOfBrackets(/\+/),
+ matchOutsideOfBrackets(/\./),
+ matchOutsideOfBrackets(/#/),
+]);
+
+const ATTRIBUTE_IDENTIFIER = '[^\\~|^$*\\]]*';
+
+// Export for testing
+const REGEXES = {
+ 'SIBLING_SELECTOR': /^[^[]*~/,
+ 'STARTSWITH_ATTRIBUTE': new RegExp(`\\[${ATTRIBUTE_IDENTIFIER}\\^=${ATTRIBUTE_IDENTIFIER}\\]`),
+ 'ENDSWITH_ATTRIBUTE': new RegExp(`\\[${ATTRIBUTE_IDENTIFIER}\\$=${ATTRIBUTE_IDENTIFIER}\\]`),
+ 'INSENSITIVE_ATTRIBUTE': new RegExp(`\\[${ATTRIBUTE_IDENTIFIER}\\*=${ATTRIBUTE_IDENTIFIER}\\]`),
+};
+
+var cssSel3 = checkSelector([
+ ':root',
+ ':nth-child',
+ ':nth-last-child',
+ 'nth-of-type',
+ 'nth-last-of-type',
+ ':last-child',
+ ':first-of-type',
+ ':last-of-type',
+ ':only-child',
+ ':only-of-type',
+ ':empty',
+ ':target',
+ ':enabled',
+ ':disabled',
+ ':checked',
+ ':not',
+ REGEXES.SIBLING_SELECTOR,
+ REGEXES.STARTSWITH_ATTRIBUTE,
+ REGEXES.ENDSWITH_ATTRIBUTE,
+ REGEXES.INSENSITIVE_ATTRIBUTE,
+]);
+
+var cssSelection = checkSelector(':selection');
+
+var cssShapes = {
+ 'shape-outside': true,
+ 'shape-image-threshold': true,
+ 'shape-margin': true,
+};
+
+/**
+ * CSS Scroll Snap
+ * CSS technique that allows customizable scrolling experiences like pagination of carousels by setting defined snap positions.
+ * @see https://caniuse.com/css-snappoints
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssSnappoints = {
+ 'scroll-snap-type': true,
+ 'scroll-padding': true,
+ 'scroll-padding-top': true,
+ 'scroll-padding-right': true,
+ 'scroll-padding-bottom': true,
+ 'scroll-padding-left': true,
+ 'scroll-padding-inline': true,
+ 'scroll-padding-inline-start': true,
+ 'scroll-padding-inline-end': true,
+ 'scroll-padding-block': true,
+ 'scroll-padding-block-start': true,
+ 'scroll-padding-block-end': true,
+ 'scroll-snap-align': true,
+ 'scroll-margin': true,
+ 'scroll-margin-top': true,
+ 'scroll-margin-right': true,
+ 'scroll-margin-bottom': true,
+ 'scroll-margin-left': true,
+ 'scroll-margin-inline': true,
+ 'scroll-margin-inline-start': true,
+ 'scroll-margin-inline-end': true,
+ 'scroll-margin-block': true,
+ 'scroll-margin-block-start': true,
+ 'scroll-margin-block-end': true,
+ 'scroll-snap-stop': true,
+};
+
+var cssSticky = {
+ 'position': 'sticky',
+};
+
+/**
+ * CSS Subgrid
+ * Feature of the CSS Grid Layout Module Level 2 that allows a grid-item with its own grid to align in one or both dimensions with its parent grid.
+ * @see https://caniuse.com/css-subgrid
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssSubgrid = {
+ '': 'subgrid',
+};
+
+/**
+ * CSS.supports() API
+ * The CSS.supports() static methods returns a Boolean value indicating if the browser supports a given CSS feature, or not.
+ * @see https://caniuse.com/css-supports-api
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssSupportsApi = {};
+
+/* this feature appears in JS, so it's not linted by this tool */
+
+var cssTable = {
+ 'display': [
+ 'table',
+ 'table-',
+ 'inline-table',
+ ],
+};
+
+/**
+ * CSS3 text-align-last
+ * CSS property to describe how the last line of a block or a line right before a forced line break when `text-align` is `justify`.
+ * @see https://caniuse.com/css-text-align-last
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssTextAlignLast = {
+ 'text-align-last': true,
+};
+
+/**
+ * CSS text-box-trim & text-box-edge
+ * Provides the ability to remove the vertical space appearing above and below text glyphs, allowing more precise positioning and alignment. Previously specified as the `leading-trim` & `text-edge` properties.
+ * @see https://caniuse.com/css-text-box-trim
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssTextBoxTrim = {
+ 'text-box-trim': true,
+ 'text-box-edge': true,
+};
+
+/**
+ * CSS text-indent
+ * The `text-indent` property applies indentation to lines of inline content in a block.
+ * @see https://caniuse.com/css-text-indent
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssTextIndent = {
+ 'text-indent': true,
+};
+
+/**
+ * CSS text-justify
+ * CSS property to define how text should be justified when `text-align: justify` is set.
+ * @see https://caniuse.com/css-text-justify
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssTextJustify = {
+ 'text-justify': true,
+};
+
+/**
+ * CSS text-orientation
+ * The CSS `text-orientation` property specifies the orientation of text within a line. Current values only have an effect in vertical typographic modes (defined with the `writing-mode` property)
+ * @see https://caniuse.com/css-text-orientation
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssTextOrientation = {
+ 'text-orientation': true,
+};
+
+/**
+ * CSS Text 4 text-spacing
+ * No description available.
+ * @see This feature comes from MDN: https://developer.mozilla.org/en-US/search?q=CSS+Text+4+text-spacing
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssTextSpacing = {
+ 'text-spacing': true,
+};
+
+var cssTextshadow = {
+ 'text-shadow': true,
+};
+
+var cssTouchAction = {
+ 'touch-action': true,
+};
+
+var cssTransitions = {
+ 'transition': true,
+ 'transition-property': true,
+ 'transition-duration': true,
+ 'transition-delay': true,
+ 'transition-timing-function': true,
+};
+
+/**
+ * CSS unicode-bidi property
+ * No description available.
+ * @see This feature comes from MDN: https://developer.mozilla.org/en-US/search?q=CSS+unicode-bidi+property
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssUnicodeBidi = {
+ 'unicode-bidi': true,
+};
+
+var cssUnsetValue = {
+ '': 'unset',
+};
+
+/**
+ * @param {import('postcss').ChildNode} rule
+ * @return {boolean}
+ */
+var cssVariables = (rule) => {
+ if (rule.type !== 'decl') return false;
+ return (rule.prop.startsWith('--') || rule.value.includes('var('));
+};
+
+/**
+ * CSS @when / @else conditional rules
+ * Syntax allowing CSS conditions (like media and support queries) to be written more simply, as well as making it possibly to write mutually exclusive rules using `@else` statements.
+ * @see https://caniuse.com/css-when-else
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssWhenElse = checkAtRule(['when', 'else']);
+
+/**
+ * CSS widows & orphans
+ * CSS properties to control when lines break across pages or columns by defining the amount of lines that must be left before or after the break.
+ * @see https://caniuse.com/css-widows-orphans
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssWidowsOrphans = {
+ 'widows': true,
+ 'orphans': true,
+};
+
+/**
+ * width: stretch property
+ * No description available.
+ * @see This feature comes from MDN: https://developer.mozilla.org/en-US/search?q=width:+stretch+property
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssWidthStretch = {
+ 'width': 'stretch',
+};
+
+/**
+ * CSS writing-mode property
+ * Property to define whether lines of text are laid out horizontally or vertically and the direction in which blocks progress.
+ * @see https://caniuse.com/css-writing-mode
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssWritingMode = {
+ 'writing-mode': true,
+};
+
+/**
+ * CSS zoom
+ * Non-standard method of scaling content.
+ * @see https://caniuse.com/css-zoom
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssZoom = {
+ 'zoom': true,
+};
+
+/**
+ * CSS3 attr() function for all properties
+ * While `attr()` is supported for effectively all browsers for the `content` property, CSS Values and Units Level 5 adds the ability to use `attr()` on **any** CSS property, and to use it for non-string values (e.g. numbers, colors).
+ * @see https://caniuse.com/css3-attr
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var css3Attr = (rule) => {
+ if (rule.type !== 'decl') return false;
+ if (rule.prop === 'content') {
+ return false;
+ }
+
+ return rule.toString().includes('attr(');
+};
+
+var css3Boxsizing = {
+ 'box-sizing': true,
+};
+
+var css3Colors = {
+ '': [
+ 'rgba',
+ 'hsl',
+ 'hsla',
+ ],
+};
+
+var css3Cursors = {
+ 'cursor': [
+ 'none',
+ 'context-menu',
+ 'cell',
+ 'vertical-text',
+ 'alias',
+ 'copy',
+ 'no-drop',
+ 'not-allowed',
+ 'nesw-resize',
+ 'nwse-resize',
+ 'col-resize',
+ 'row-resize',
+ 'all-scroll',
+ ],
+};
+
+var css3CursorsGrab = {
+ 'cursor': ['grab', 'grabbing'],
+};
+
+var css3CursorsNewer = {
+ 'cursor': ['zoom-in', 'zoom-out'],
+};
+
+var css3Tabsize = {
+ 'tab-size': true,
+};
+
+/**
+ * CSS currentColor value
+ * A CSS value that will apply the existing `color` value to other properties like `background-color`, etc.
+ * @see https://caniuse.com/currentcolor
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var currentcolor = {
+ '': 'currentColor',
+};
+
+/**
+ * Window.devicePixelRatio
+ * Read-only property that returns the ratio of the (vertical) size of one physical pixel on the current display device to the size of one CSS pixel.
+ * @see https://caniuse.com/devicepixelratio
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var devicepixelratio = {};
+
+/* this feature is found in JS and is not linted by this tool */
+
+/**
+ * ui-serif, ui-sans-serif, ui-monospace and ui-rounded values for font-family
+ * Allows more control when choosing system interface fonts
+ * @see https://caniuse.com/extended-system-fonts
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var extendedSystemFonts = {
+ 'font-family': ['ui-serif', 'ui-sans-serif', 'ui-monospace', 'ui-rounded'],
+};
+
+var flexbox = {
+ 'display': [
+ 'flex',
+ 'inline-flex',
+ ],
+ 'flex': true,
+ 'flex-grow': true,
+ 'flex-shrink': true,
+ 'flex-basis': true,
+ 'flex-direction': true,
+ 'flex-wrap': true,
+ 'flex-flow': true,
+};
+
+/**
+ * gap property for Flexbox
+ * `gap` for flexbox containers to create gaps/gutters between flex items
+ * @see https://caniuse.com/flexbox-gap
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var flexboxGap = (rule) => {
+ if (/display:\s(inline-)?flex/.test(rule.toString())
+ && rule.toString().includes('gap:')
+ ) {
+ return true;
+ }
+
+ return false;
+};
+
+/**
+ * display: flow-root
+ * The element generates a block container box, and lays out its contents using flow layout. It always establishes a new block formatting context for its contents. It provides a better solution to the most use cases of the "clearfix" hack.
+ * @see https://caniuse.com/flow-root
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var flowRoot = {
+ 'display': 'flow-root',
+};
+
+/**
+ * system-ui value for font-family
+ * Value for `font-family` that represents the default user interface font.
+ * @see https://caniuse.com/font-family-system-ui
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var fontFamilySystemUi = {
+ 'font-family': 'system-ui',
+};
+
+var fontFeature = {
+ 'font-feature-settings': true,
+ 'font-variant-ligatures': true,
+ 'font-language-override': true,
+ 'font-kerning': true,
+};
+
+/**
+ * CSS3 font-kerning
+ * Controls the usage of the kerning information (spacing between letters) stored in the font. Note that this only affects OpenType fonts with kerning information, it has no effect on other fonts.
+ * @see https://caniuse.com/font-kerning
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var fontKerning = {
+ 'font-kerning': true,
+};
+
+/**
+ * CSS Font Loading
+ * This CSS module defines a scripting interface to font faces in CSS, allowing font faces to be easily created and loaded from script. It also provides methods to track the loading status of an individual font, or of all the fonts on an entire page.
+ * @see https://caniuse.com/font-loading
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var fontLoading = {};
+
+/* this feature appears in JS and as such is not linted */
+
+var fontSizeAdjust = {
+ 'font-size-adjust': true,
+};
+
+/**
+ * CSS font-smooth
+ * Controls the application of anti-aliasing when fonts are rendered.
+ * @see https://caniuse.com/font-smooth
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var fontSmooth = {
+ 'font-smooth': true,
+};
+
+var fontUnicodeRange = {
+ 'unicode-range': true,
+};
+
+/**
+ * CSS font-variant-alternates
+ * Controls the usage of alternate glyphs associated to alternative names defined in @font-feature-values for certain types of OpenType fonts.
+ * @see https://caniuse.com/font-variant-alternates
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var fontVariantAlternates = {
+ 'font-variant-alternates': true,
+};
+
+/**
+ * CSS font-variant-numeric
+ * CSS property that provides different ways of displaying numbers, fractions, and ordinal markers.
+ * @see https://caniuse.com/font-variant-numeric
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var fontVariantNumeric = {
+ 'font-variant-numeric': true,
+};
+
+var fontface = [
+ checkAtRule('font-face'),
+];
+
+var fullscreen = checkSelector(':fullscreen');
+
+/**
+ * getComputedStyle
+ * API to get the current computed CSS styles applied to an element. This may be the current value applied by an animation or as set by a stylesheet.
+ * @see https://caniuse.com/getcomputedstyle
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var getcomputedstyle = {};
+
+/* this is a js api, so we don't lint it */
+
+var inlineBlock = {
+ 'display': 'inline-block',
+};
+
+const VALUES = ['max-content', 'min-content', 'fit-content', 'fill-available', 'stretch', 'fill'];
+
+var intrinsicWidth = {
+ 'width': VALUES,
+ 'min-width': VALUES,
+ 'max-width': VALUES,
+ 'height': VALUES,
+ 'min-height': VALUES,
+ 'max-height': VALUES,
+};
+
+/**
+ * CSS justify-content: space-evenly
+ * The "space-evenly" value for the `justify-content` property distributes the space between items evenly. It is similar to space-around but provides equal instead of half-sized space on the edges. Can be used in both CSS flexbox & grid.
+ * @see https://caniuse.com/justify-content-space-evenly
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var justifyContentSpaceEvenly = {
+ 'justify-content': 'space-evenly',
+};
+
+var kerningPairsLigatures = {
+ 'text-rendering': 'optimizeLegibility',
+};
+
+var mdnCssUnicodeBidiIsolate = {
+ 'unicode-bidi': 'isolate',
+};
+
+var mdnCssUnicodeBidiIsolateOverride = {
+ 'unicode-bidi': 'isolate-override',
+};
+
+var mdnCssUnicodeBidiPlaintext = {
+ 'unicode-bidi': 'plaintext',
+};
+
+var mdnTextDecorationColor = {
+ 'text-decoration-color': true,
+};
+
+var mdnTextDecorationLine = {
+ 'text-decoration-line': true,
+};
+
+var mdnTextDecorationShorthand = {
+ 'text-decoration': true,
+};
+
+var mdnTextDecorationStyle = {
+ 'text-decoration-style': true,
+};
+
+var minmaxwh = {
+ 'min-width': true,
+ 'max-width': true,
+ 'min-height': true,
+ 'max-height': true,
+};
+
+/**
+ * @param {import('postcss').ChildNode} rule
+ * @return {boolean}
+ */
+var multibackgrounds = (rule) => {
+ if (rule.type !== 'decl') return false;
+ if (!/^background-?/.test(rule.prop)) return false;
+ return postcss.list.comma(rule.value).length > 1;
+};
+
+var multicolumn = {
+ 'columns': true,
+ 'column-width': true,
+ 'column-gap': true,
+ 'column-rule': true,
+ 'column-rule-color': true,
+ 'column-rule-width': true,
+ 'column-count': true,
+ 'column-rule-style': true,
+ 'column-span': true,
+ 'column-fill': true,
+ 'break-before': true,
+ 'break-after': true,
+ 'break-inside': true,
+};
+
+var objectFit = {
+ 'object-fit': true,
+ 'object-position': true,
+};
+
+var outline = {
+ 'outline': true,
+ 'outline-style': true,
+ 'outline-width': true,
+ 'outline-color': true,
+};
+
+var pointer = {
+ 'touch-action': true,
+};
+
+var pointerEvents = {
+ 'pointer-events': true,
+};
+
+/**
+ * prefers-color-scheme media query
+ * Media query to detect if the user has set their system to use a light or dark color theme.
+ * @see https://caniuse.com/prefers-color-scheme
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var prefersColorScheme = checkAtRule('media', 'prefers-color-scheme');
+
+/**
+ * TODO: initially implement feature
+ * prefers-reduced-motion media query
+ * CSS media query based on a user preference for preferring reduced motion (animation, etc).
+ * @see https://caniuse.com/prefers-reduced-motion
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var prefersReducedMotion = checkAtRule('media', 'prefers-reduced-motion');
+
+var rem = checkCSSLengthUnits('rem');
+
+/**
+ * display: run-in
+ * If the run-in box contains a block box, same as block. If a block box follows the run-in box, the run-in box becomes the first inline box of the block box. If an inline box follows, the run-in box becomes a block box.
+ * @see https://caniuse.com/run-in
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var runIn = {
+ 'display': 'run-in',
+};
+
+/**
+ * Scoped CSS
+ * Allows CSS rules to be scoped to part of the document, based on the position of the style element. The attribute has been [removed from the current specification](https://github.com/whatwg/html/issues/552).
+ * @see https://caniuse.com/style-scoped
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var styleScoped = {};
+
+/* this feature appears in HTML, so we don't lint it */
+
+/**
+ * SVG in CSS backgrounds
+ * Method of using SVG images as CSS backgrounds
+ * @see https://caniuse.com/svg-css
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var svgCss = (rule) => {
+ if (rule.type !== 'decl') return false;
+ if (/url\([\S\s]*svg/g.test(
+ rule.toString(),
+ )) {
+ return true;
+ }
+
+ return false;
+};
+
+var textDecoration = {
+ 'text-decoration-style': true,
+ 'text-decoration-line': true,
+ 'text-decoration-color': true,
+ 'text-decoration': /\w \w/,
+ 'text-decoration-thickness': true,
+ 'text-decoration-skip': true,
+ 'text-decoration-skip-ink': true,
+};
+
+/**
+ * text-emphasis styling
+ * Method of using small symbols next to each glyph to emphasize a run of text, commonly used in East Asian languages. The `text-emphasis` shorthand, and its `text-emphasis-style` and `text-emphasis-color` longhands, can be used to apply marks to the text. The `text-emphasis-position` property, which inherits separately, allows setting the emphasis marks' position with respect to the text.
+ * @see https://caniuse.com/text-emphasis
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var textEmphasis = {
+ 'text-emphasis': true,
+ 'text-emphasis-style': true,
+ 'text-emphasis-color': true,
+ 'text-emphasis-position': true,
+};
+
+var textOverflow = {
+ 'text-overflow': true,
+};
+
+var textSizeAdjust = {
+ 'text-size-adjust': true,
+};
+
+/**
+ * CSS text-stroke and text-fill
+ * Method of declaring the outline (stroke) width and color for text.
+ * @see https://caniuse.com/text-stroke
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var textStroke = {
+ 'text-stroke-color': true,
+ 'text-stroke-width': true,
+ 'text-stroke': true,
+ 'text-fill-color': true,
+};
+
+var transforms2d = {
+ 'transform': true,
+ 'transform-origin': true,
+};
+
+var transforms3d = {
+ 'perspective': true,
+ 'perspective-origin': true,
+ 'transform-style': true,
+ 'backface-visibility': true,
+ 'transform': '3d',
+};
+
+/**
+ * TTF/OTF - TrueType and OpenType font support
+ * Support for the TrueType (.ttf) and OpenType (.otf) outline font formats in @font-face.
+ * @see https://caniuse.com/ttf
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var ttf = (rule) => {
+ const ruleText = rule.toString();
+
+ if (ruleText.includes('@font-face') && (
+ (ruleText.includes('.ttf') || ruleText.includes('.otf'))
+ )) {
+ return true;
+ }
+
+ return false;
+};
+
+var userSelectNone = {
+ 'user-select': true,
+};
+
+/**
+ * Variable fonts
+ * OpenType font settings that allows a single font file to behave like multiple fonts: it can contain all the allowed variations in width, weight, slant, optical size, or any other exposed axes of variation as defined by the font designer. Variations can be applied via the `font-variation-settings` property.
+ * @see https://caniuse.com/variable-fonts
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var variableFonts = {
+ 'font-variation-settings': true,
+};
+
+/**
+ * Small, Large, and Dynamic viewport units
+ * Viewport units similar to `vw` and `vh` that are based on shown or hidden
+ * browser UI states to address shortcomings of the original units. Currently
+ * defined as the
+ * `sv*` units (`svb`, `svh`, `svi`, `svmax`, `svmin`, `svw`),
+ * `lv*` units (`lvb`, `lvh`, `lvi`, `lvmax`, `lvmin`, `lvw`),
+ * `dv*` units (`dvb`, `dvh`, `dvi`, `dvmax`, `dvmin`, `dvw`)
+ * and the logical `vi`/`vb` units.
+ * @see https://caniuse.com/viewport-unit-variants
+ * @type {import('../features').Feature}
+ */
+var viewportUnitVariants = checkCSSLengthUnits(
+ /* sv* units */
+ 'svb',
+ 'svh',
+ 'svi',
+ 'svmax',
+ 'svmin',
+ 'svw',
+
+ /* lv* units */
+ 'lvb',
+ 'lvh',
+ 'lvi',
+ 'lvmax',
+ 'lvmin',
+ 'lvw',
+
+ /* dv* units */
+ 'dvb',
+ 'dvh',
+ 'dvi',
+ 'dvmax',
+ 'dvmin',
+ 'dvw',
+
+ /* vi/vb units */
+ 'vi',
+ 'vb',
+);
+
+var viewportUnits = {
+ '': [
+ 'vw',
+ 'vh',
+ 'vmin',
+ 'vmax',
+ ],
+};
+
+/**
+ * CSS -webkit-user-drag property
+ * The non-standard `-webkit-user-drag` CSS property can be used to either make an element draggable or explicitly non-draggable (like links and images). See the standardized [draggable attribute/property](/mdn-api_htmlelement_draggable) for the recommended alternative method of accomplishing the same functionality.
+ * @see https://caniuse.com/webkit-user-drag
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var webkitUserDrag = {
+ 'webkit-user-drag': true,
+};
+
+var willChange = {
+ 'will-change': true,
+};
+
+var wordBreak = {
+ 'word-break': true,
+};
+
+var wordwrap = {
+ 'overflow-wrap': true,
+ 'word-wrap': true,
+};
+
+/* THIS FILE IS AUTOGENERATED */
+
+/** @typedef {RegExp|string|((value:string) => boolean)} FeatureCheck */
+
+/** @typedef {((rule:import('postcss').ChildNode) => boolean)} RuleCheck */
+
+/** @typedef {Record<string, FeatureCheck|FeatureCheck[]|boolean> | RuleCheck | RuleCheck[]} Feature */
+
+/** @enum {Feature} */
+const FEATURES = {
+ 'alternate-stylesheet': alternateStylesheet,
+ 'background-attachment': backgroundAttachment,
+ 'background-clip-text': backgroundClipText,
+ 'background-img-opts': backgroundImgOpts,
+ 'background-position-x-y': backgroundPositionXY,
+ 'background-repeat-round-space': backgroundRepeatRoundSpace,
+ 'border-image': borderImage,
+ 'border-radius': borderRadius,
+ 'calc': calc,
+ 'ch-unit': chUnit,
+ 'css-all': cssAll,
+ 'css-animation': cssAnimation,
+ 'css-any-link': cssAnyLink,
+ 'css-appearance': cssAppearance,
+ 'css-at-counter-style': cssAtCounterStyle,
+ 'css-autofill': cssAutofill,
+ 'css-backdrop-filter': cssBackdropFilter,
+ 'css-background-offsets': cssBackgroundOffsets,
+ 'css-backgroundblendmode': cssBackgroundblendmode,
+ 'css-boxdecorationbreak': cssBoxdecorationbreak,
+ 'css-boxshadow': cssBoxshadow,
+ 'css-canvas': cssCanvas,
+ 'css-caret-color': cssCaretColor,
+ 'css-cascade-layers': cssCascadeLayers,
+ 'css-case-insensitive': cssCaseInsensitive,
+ 'css-clip-path': cssClipPath,
+ 'css-color-adjust': cssColorAdjust,
+ 'css-color-function': cssColorFunction,
+ 'css-conic-gradients': cssConicGradients,
+ 'css-container-queries': cssContainerQueries,
+ 'css-container-queries-style': cssContainerQueriesStyle,
+ 'css-container-query-units': cssContainerQueryUnits,
+ 'css-containment': cssContainment,
+ 'css-content-visibility': cssContentVisibility,
+ 'css-counters': cssCounters,
+ 'css-crisp-edges': cssCrispEdges,
+ 'css-cross-fade': cssCrossFade,
+ 'css-default-pseudo': cssDefaultPseudo,
+ 'css-descendant-gtgt': cssDescendantGtgt,
+ 'css-deviceadaptation': cssDeviceadaptation,
+ 'css-dir-pseudo': cssDirPseudo,
+ 'css-display-contents': cssDisplayContents,
+ 'css-element-function': cssElementFunction,
+ 'css-env-function': cssEnvFunction,
+ 'css-exclusions': cssExclusions,
+ 'css-featurequeries': cssFeaturequeries,
+ 'css-file-selector-button': cssFileSelectorButton,
+ 'css-filter-function': cssFilterFunction,
+ 'css-filters': cssFilters,
+ 'css-first-letter': cssFirstLetter,
+ 'css-first-line': cssFirstLine,
+ 'css-fixed': cssFixed,
+ 'css-focus-visible': cssFocusVisible,
+ 'css-focus-within': cssFocusWithin,
+ 'css-font-palette': cssFontPalette,
+ 'css-font-rendering-controls': cssFontRenderingControls,
+ 'css-font-stretch': cssFontStretch,
+ 'css-gencontent': cssGencontent,
+ 'css-gradients': cssGradients,
+ 'css-grid': cssGrid,
+ 'css-grid-animation': cssGridAnimation,
+ 'css-hanging-punctuation': cssHangingPunctuation,
+ 'css-has': cssHas,
+ 'css-hyphens': cssHyphens,
+ 'css-image-orientation': cssImageOrientation,
+ 'css-image-set': cssImageSet,
+ 'css-in-out-of-range': cssInOutOfRange,
+ 'css-indeterminate-pseudo': cssIndeterminatePseudo,
+ 'css-initial-letter': cssInitialLetter,
+ 'css-initial-value': cssInitialValue,
+ 'css-lch-lab': cssLchLab,
+ 'css-letter-spacing': cssLetterSpacing,
+ 'css-line-clamp': cssLineClamp,
+ 'css-logical-props': cssLogicalProps,
+ 'css-marker-pseudo': cssMarkerPseudo,
+ 'css-masks': cssMasks,
+ 'css-matches-pseudo': cssMatchesPseudo,
+ 'css-math-functions': cssMathFunctions,
+ 'css-media-interaction': cssMediaInteraction,
+ 'css-media-range-syntax': cssMediaRangeSyntax,
+ 'css-media-resolution': cssMediaResolution,
+ 'css-media-scripting': cssMediaScripting,
+ 'css-mediaqueries': cssMediaqueries,
+ 'css-mixblendmode': cssMixblendmode,
+ 'css-motion-paths': cssMotionPaths,
+ 'css-namespaces': cssNamespaces,
+ 'css-nesting': cssNesting,
+ 'css-not-sel-list': cssNotSelList,
+ 'css-nth-child-of': cssNthChildOf,
+ 'css-opacity': cssOpacity,
+ 'css-optional-pseudo': cssOptionalPseudo,
+ 'css-overflow': cssOverflow,
+ 'css-overflow-anchor': cssOverflowAnchor,
+ 'css-overflow-overlay': cssOverflowOverlay,
+ 'css-overscroll-behavior': cssOverscrollBehavior,
+ 'css-page-break': cssPageBreak,
+ 'css-paged-media': cssPagedMedia,
+ 'css-paint-api': cssPaintApi,
+ 'css-placeholder': cssPlaceholder,
+ 'css-placeholder-shown': cssPlaceholderShown,
+ 'css-print-color-adjust': cssPrintColorAdjust,
+ 'css-read-only-write': cssReadOnlyWrite,
+ 'css-rebeccapurple': cssRebeccapurple,
+ 'css-reflections': cssReflections,
+ 'css-regions': cssRegions,
+ 'css-relative-colors': cssRelativeColors,
+ 'css-repeating-gradients': cssRepeatingGradients,
+ 'css-resize': cssResize,
+ 'css-revert-value': cssRevertValue,
+ 'css-rrggbbaa': cssRrggbbaa,
+ 'css-scroll-behavior': cssScrollBehavior,
+ 'css-scroll-timeline': cssScrollTimeline,
+ 'css-scrollbar': cssScrollbar,
+ 'css-sel2': cssSel2,
+ 'css-sel3': cssSel3,
+ 'css-selection': cssSelection,
+ 'css-shapes': cssShapes,
+ 'css-snappoints': cssSnappoints,
+ 'css-sticky': cssSticky,
+ 'css-subgrid': cssSubgrid,
+ 'css-supports-api': cssSupportsApi,
+ 'css-table': cssTable,
+ 'css-text-align-last': cssTextAlignLast,
+ 'css-text-box-trim': cssTextBoxTrim,
+ 'css-text-indent': cssTextIndent,
+ 'css-text-justify': cssTextJustify,
+ 'css-text-orientation': cssTextOrientation,
+ 'css-text-spacing': cssTextSpacing,
+ 'css-textshadow': cssTextshadow,
+ 'css-touch-action': cssTouchAction,
+ 'css-transitions': cssTransitions,
+ 'css-unicode-bidi': cssUnicodeBidi,
+ 'css-unset-value': cssUnsetValue,
+ 'css-variables': cssVariables,
+ 'css-when-else': cssWhenElse,
+ 'css-widows-orphans': cssWidowsOrphans,
+ 'css-width-stretch': cssWidthStretch,
+ 'css-writing-mode': cssWritingMode,
+ 'css-zoom': cssZoom,
+ 'css3-attr': css3Attr,
+ 'css3-boxsizing': css3Boxsizing,
+ 'css3-colors': css3Colors,
+ 'css3-cursors': css3Cursors,
+ 'css3-cursors-grab': css3CursorsGrab,
+ 'css3-cursors-newer': css3CursorsNewer,
+ 'css3-tabsize': css3Tabsize,
+ 'currentcolor': currentcolor,
+ 'devicepixelratio': devicepixelratio,
+ 'extended-system-fonts': extendedSystemFonts,
+ 'flexbox': flexbox,
+ 'flexbox-gap': flexboxGap,
+ 'flow-root': flowRoot,
+ 'font-family-system-ui': fontFamilySystemUi,
+ 'font-feature': fontFeature,
+ 'font-kerning': fontKerning,
+ 'font-loading': fontLoading,
+ 'font-size-adjust': fontSizeAdjust,
+ 'font-smooth': fontSmooth,
+ 'font-unicode-range': fontUnicodeRange,
+ 'font-variant-alternates': fontVariantAlternates,
+ 'font-variant-numeric': fontVariantNumeric,
+ 'fontface': fontface,
+ 'fullscreen': fullscreen,
+ 'getcomputedstyle': getcomputedstyle,
+ 'inline-block': inlineBlock,
+ 'intrinsic-width': intrinsicWidth,
+ 'justify-content-space-evenly': justifyContentSpaceEvenly,
+ 'kerning-pairs-ligatures': kerningPairsLigatures,
+ 'mdn-css-unicode-bidi-isolate': mdnCssUnicodeBidiIsolate,
+ 'mdn-css-unicode-bidi-isolate-override': mdnCssUnicodeBidiIsolateOverride,
+ 'mdn-css-unicode-bidi-plaintext': mdnCssUnicodeBidiPlaintext,
+ 'mdn-text-decoration-color': mdnTextDecorationColor,
+ 'mdn-text-decoration-line': mdnTextDecorationLine,
+ 'mdn-text-decoration-shorthand': mdnTextDecorationShorthand,
+ 'mdn-text-decoration-style': mdnTextDecorationStyle,
+ 'minmaxwh': minmaxwh,
+ 'multibackgrounds': multibackgrounds,
+ 'multicolumn': multicolumn,
+ 'object-fit': objectFit,
+ 'outline': outline,
+ 'pointer': pointer,
+ 'pointer-events': pointerEvents,
+ 'prefers-color-scheme': prefersColorScheme,
+ 'prefers-reduced-motion': prefersReducedMotion,
+ 'rem': rem,
+ 'run-in': runIn,
+ 'style-scoped': styleScoped,
+ 'svg-css': svgCss,
+ 'text-decoration': textDecoration,
+ 'text-emphasis': textEmphasis,
+ 'text-overflow': textOverflow,
+ 'text-size-adjust': textSizeAdjust,
+ 'text-stroke': textStroke,
+ 'transforms2d': transforms2d,
+ 'transforms3d': transforms3d,
+ 'ttf': ttf,
+ 'user-select-none': userSelectNone,
+ 'variable-fonts': variableFonts,
+ 'viewport-unit-variants': viewportUnitVariants,
+ 'viewport-units': viewportUnits,
+ 'webkit-user-drag': webkitUserDrag,
+ 'will-change': willChange,
+ 'word-break': wordBreak,
+ 'wordwrap': wordwrap,
+};
+
+/**
+ * @template T
+ * @typedef {{missing: T, partial: T}} Filter
+ */
+
+/**
+ * @typedef {Object} MissingSupportResultStats
+ * @prop {string} title
+ * @prop {caniuse.Feature} caniuseData
+ * @prop {string} [missing]
+ * @prop {Record<string, Record<string, string>>} [missingData]
+ * @prop {string} [partial]
+ * @prop {Record<string, Record<string, string>>} [partialData]
+ */
+
+/**
+ * @typedef {Partial<Record<keyof FEATURES, MissingSupportResultStats>>} BrowserSupportStats
+ */
+
+/**
+ * @typedef {Object} MissingSupportResult
+ * @prop {string[][]} browsers
+ * @prop {Partial<Record<keyof FEATURES, MissingSupportResultStats>>} features
+ */
+
+class BrowserSelection {
+ #list;
+
+ /**
+ * @param {string | string[]} [query]
+ * @param {string | false} [from]
+ */
+ constructor(query, from) {
+ this.browsersRequest = query;
+ const options = from ? { path: from } : {};
+ this.#list = browserslist__default["default"](this.browsersRequest, options).map((browser) => browser.split(' '));
+ }
+
+ /**
+ * @param {string} browser
+ * @param {string} version
+ * @return {string[]|undefined}
+ */
+ test(browser, version) {
+ const versions = version.split('-');
+
+ if (versions.length === 1) {
+ versions.push(versions[0]);
+ }
+
+ return this.#list.find(([b, v]) => b === browser && v >= versions[0] && v <= versions[1]);
+ }
+
+ list() {
+ return [...this.#list];
+ }
+
+ /**
+ * @param {Record<string, Record<string, string>>} browserStats
+ * @return {string}
+ */
+ static lackingBrowsers(browserStats) {
+ const result = [];
+ for (const browser of Object.keys(browserStats)) {
+ result.push(formatBrowserName(browser, Object.keys(browserStats[browser])));
+ }
+ return result.join(', ');
+ }
+
+ /**
+ * @param {import('caniuse-lite').StatsByAgentID} stats
+ * @return {Filter<Record<string,Record<string, string>>>}
+ */
+ filterStats(stats) {
+ /** @type {Filter<Record<string,Record<string, string>>>} */
+ const result = { missing: {}, partial: {} };
+ for (const [browser, versions] of Object.entries(stats)) {
+ /** @type {Filter<Record<string,string>>} */
+ const feature = { missing: {}, partial: {} };
+ for (const [version, support] of Object.entries(versions)) {
+ const selected = this.test(browser, version);
+
+ // check if browser is NOT fully (i.e., don't have 'y' in their stats) supported
+ if (!selected) continue;
+ if ((/(^|\s)y($|\s)/.test(support))) continue;
+ // when it's not partially supported ('a'), it's missing
+ const type = (/(^|\s)a($|\s)/.test(support) ? 'partial' : 'missing');
+
+ if (!feature[type]) {
+ feature[type] = {};
+ }
+
+ feature[type][selected[1]] = support;
+ }
+ if (Object.keys(feature.missing).length > 0) {
+ result.missing[browser] = feature.missing;
+ }
+
+ if (Object.keys(feature.partial).length > 0) {
+ result.partial[browser] = feature.partial;
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Get data on CSS features not supported by the given autoprefixer-like
+ * browser selection.
+ * @return {BrowserSupportStats} `features` is an array of:
+ * ```
+ * {
+ * 'feature-name': {
+ * title: 'Title of feature'
+ * missing: "IE (8), Chrome (31)"
+ * missingData: {
+ * // map of browser -> version -> (lack of)support code
+ * ie: { '8': 'n' },
+ * chrome: { '31': 'n' }
+ * }
+ * partialData: {
+ * // map of browser -> version -> (partial)support code
+ * ie: { '7': 'a' },
+ * ff: { '29': 'a #1' }
+ * }
+ * caniuseData: {
+ * // caniuse-db json data for this feature
+ * }
+ * },
+ * 'feature-name-2': {} // etc.
+ * }
+ * ```
+ *
+ * `feature-name` is a caniuse-db slug.
+ */
+ compileBrowserSupport() {
+ /** @type {Partial<Record<keyof FEATURES, MissingSupportResultStats>>} */
+ const result = {};
+
+ for (const key of Object.keys(FEATURES)) {
+ const feature = /** @type {keyof FEATURES} */ (key);
+ const packedFeature = caniuse__namespace.features[feature];
+ const featureData = caniuse__namespace.feature(packedFeature);
+ const lackData = this.filterStats(featureData.stats);
+ const missingData = lackData.missing;
+ const partialData = lackData.partial;
+ // browsers with missing or partial support for this feature
+ const missing = BrowserSelection.lackingBrowsers(missingData);
+ const partial = BrowserSelection.lackingBrowsers(partialData);
+
+ if (missing.length > 0 || partial.length > 0) {
+ result[feature] = {
+ title: featureData.title,
+ caniuseData: featureData,
+ ...(missing.length > 0 ? { missingData, missing } : null),
+ ...(partial.length > 0 ? { partialData, partial } : null),
+ };
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * @see BrowserSelection.compileBrowserSupport
+ * @param {ConstructorParameters<typeof this>} constructorParameters
+ * @return {MissingSupportResult} `{browsers, features}`
+ */
+ static missingSupport(...constructorParameters) {
+ const selection = new BrowserSelection(...constructorParameters);
+ return {
+ browsers: selection.list(),
+ features: selection.compileBrowserSupport(),
+ };
+ }
+}
+
+/**
+ * @typedef DetectorCallbackArgument
+ * @prop {!import('postcss').ChildNode} usage
+ * @prop {keyof FEATURES} feature
+ * @prop {(keyof FEATURES & string)[]} ignore
+ */
+
+/**
+ * @callback DetectorCallback
+ * @param {DetectorCallbackArgument} result
+ * @return {any}
+ */
+
+const PLUGIN_OPTION_COMMENT = 'doiuse-';
+const DISABLE_FEATURE_COMMENT = `${PLUGIN_OPTION_COMMENT}disable`;
+const ENABLE_FEATURE_COMMENT = `${PLUGIN_OPTION_COMMENT}enable`;
+
+/**
+ * Strip the contents of url literals so they aren't matched
+ * by our naive substring matching.
+ * @param {string} input
+ * @return {string}
+ */
+function stripUrls(input) {
+ return input.replaceAll(/url\([^)]*\)/g, 'url()');
+}
+
+/**
+ * Detect the use of any of a given list of CSS features.
+ * ```
+ * var detector = new Detector(featureList)
+ * detector.process(css, cb)
+ * ```
+ *
+ * `featureList`: an array of feature slugs (see caniuse-db)
+ * `cb`: a callback that gets called for each usage of one of the given features,
+ * called with an argument like:
+ * ```
+ * {
+ * usage: {} // postcss node where usage was found
+ * feature: {} // caniuse-db feature slug
+ * ignore: {} // caniuse-db feature to ignore in current file
+ * }
+ * ```
+ */
+class Detector {
+ /**
+ * @param {(keyof FEATURES & string)[]} featureList an array of feature slugs (see caniuse-db)
+ */
+ constructor(featureList) {
+ /** @type {Partial<FEATURES>} */
+ this.features = {};
+ for (const feature of featureList) {
+ if (FEATURES[feature]) {
+ this.features[feature] = FEATURES[feature];
+ }
+ }
+ /** @type {(keyof FEATURES & string)[]} */
+ this.ignore = [];
+ }
+
+ /**
+ * @param {import('postcss').Comment} comment
+ * @return {void}
+ */
+ comment(comment) {
+ const text = comment.text.toLowerCase();
+
+ if (!text.startsWith(PLUGIN_OPTION_COMMENT)) return;
+ const option = text.split(' ', 1)[0];
+ const value = text.replace(option, '').trim();
+
+ switch (option) {
+ case DISABLE_FEATURE_COMMENT: {
+ if (value === '') {
+ // @ts-expect-error Skip cast
+ this.ignore = Object.keys(this.features);
+ } else {
+ for (const feat of value.split(',')) {
+ /** @type {any} */
+ const f = feat.trim();
+ if (!this.ignore.includes(f)) {
+ this.ignore.push(f);
+ }
+ }
+ }
+ break;
+ }
+ case ENABLE_FEATURE_COMMENT: {
+ if (value === '') {
+ this.ignore = [];
+ } else {
+ const without = new Set(value.split(',').map((feat) => feat.trim()));
+ this.ignore = this.ignore.filter((index) => !without.has(index));
+ }
+ break;
+ }
+ }
+ }
+
+ /**
+ * @param {import('postcss').Container} node
+ * @param {DetectorCallback} callback
+ * @return {void}
+ */
+ node(node, callback) {
+ node.each((child) => {
+ if (child.type === 'comment') {
+ this.comment(child);
+ return;
+ }
+
+ for (const [feat] of Object.entries(this.features).filter(([, featValue]) => {
+ if (!featValue) return false;
+ if (typeof featValue === 'function') {
+ return featValue(child);
+ }
+ if (Array.isArray(featValue)) {
+ return featValue.some((function_) => function_(child));
+ }
+ if (child.type !== 'decl') {
+ return false;
+ }
+
+ return Object.entries(featValue).some(([property, value]) => {
+ if (property !== '' && property !== child.prop) return false;
+ if (value === true) return true;
+ if (value === false) return false;
+ return performFeatureCheck(value, stripUrls(child.value));
+ });
+ })) {
+ const feature = /** @type {keyof FEATURES} */ (feat);
+ callback({ usage: child, feature, ignore: this.ignore });
+ }
+ if (child.type !== 'decl') {
+ this.node(child, callback);
+ }
+ });
+ }
+
+ /**
+ * @param {import('postcss').Root} node
+ * @param {DetectorCallback} callback
+ * @return {void}
+ */
+ process(node, callback) {
+ // Reset ignoring rules specified by inline comments per each file
+ this.ignore = [];
+
+ // Recursively walk nodes in file
+ this.node(node, callback);
+ }
+}
+
+/** @typedef {import('../data/features.js').FeatureKeys} FeatureKeys */
+
+/**
+ * @typedef {Object} OnFeatureUsageArguments
+ * @prop {FeatureKeys} feature
+ * @prop {import('./BrowserSelection.js').MissingSupportResultStats|undefined} featureData
+ * @prop {import('postcss').Node} usage
+ * @prop {string} message
+ */
+
+/**
+ * @callback OnFeatureUsage
+ * @param {OnFeatureUsageArguments} result
+ * @return {any}
+ */
+
+/**
+ * @typedef {Object} DoIUseOptions
+ * @prop {ConstructorParameters<typeof BrowserSelection>[0]} [browsers]
+ * @prop {FeatureKeys[]} [ignore]
+ * @prop {OnFeatureUsage} [onFeatureUsage]
+ * @prop {string[]} [ignoreFiles]
+ */
+
+class DoIUse {
+ static default = null;
+
+ /**
+ * @param {DoIUseOptions} [optionsOrBrowserQuery]
+ */
+ constructor(optionsOrBrowserQuery) {
+ const options = (typeof optionsOrBrowserQuery === 'string')
+ ? { browsers: optionsOrBrowserQuery }
+ : { ...optionsOrBrowserQuery };
+ this.browserQuery = options.browsers;
+ this.onFeatureUsage = options.onFeatureUsage;
+ this.ignoreOptions = options.ignore;
+ this.ignoreFiles = options.ignoreFiles;
+ this.info = this.info.bind(this);
+ this.postcss = this.postcss.bind(this);
+ }
+
+ /**
+ * @param {Object} [options]
+ * @param {ConstructorParameters<typeof BrowserSelection>[1]} [options.from]
+ */
+ info(options = {}) {
+ const { browsers, features } = BrowserSelection.missingSupport(this.browserQuery, options.from);
+
+ return {
+ browsers,
+ features,
+ };
+ }
+
+ /** @type {import('postcss').TransformCallback} */
+ postcss(css, result) {
+ let from;
+ if (css.source && css.source.input) {
+ from = css.source.input.file;
+ }
+ const { features } = BrowserSelection.missingSupport(this.browserQuery, from);
+ // @ts-expect-error Needs cast
+ const detector = new Detector(Object.keys(features));
+
+ return detector.process(css, ({ feature, usage, ignore }) => {
+ if (ignore && ignore.includes(feature)) {
+ return;
+ }
+
+ if (this.ignoreOptions && this.ignoreOptions.includes(feature)) {
+ return;
+ }
+
+ if (!usage.source) {
+ throw new Error('No source?');
+ }
+ if (this.ignoreFiles && multimatch__default["default"](usage.source.input.from, this.ignoreFiles).length > 0) {
+ return;
+ }
+
+ const data = features[feature];
+ if (!data) {
+ throw new Error('No feature data?');
+ }
+ const messages = [];
+ if (data.missing) {
+ messages.push(`not supported by: ${data.missing}`);
+ }
+ if (data.partial) {
+ messages.push(`only partially supported by: ${data.partial}`);
+ }
+
+ let message = `${data.title} ${messages.join(' and ')} (${feature})`;
+
+ result.warn(message, { node: usage, plugin: 'doiuse' });
+
+ if (this.onFeatureUsage) {
+ if (!usage.source) {
+ throw new Error('No usage source?');
+ }
+ const { start, input } = usage.source;
+ if (!start) {
+ throw new Error('No usage source start?');
+ }
+
+ const map = css.source && css.source.input.map;
+ const mappedStart = map && map.consumer().originalPositionFor(start);
+
+ const file = (mappedStart && mappedStart.source) || input.file || input.from;
+ const line = (mappedStart && mappedStart.line) || start.line;
+ const column = (mappedStart && mappedStart.column) || start.column;
+
+ message = `${file}:${line}:${column}: ${message}`;
+
+ this.onFeatureUsage({
+ feature,
+ featureData: features[feature],
+ usage,
+ message,
+ });
+ }
+ });
+ }
+}
+
+/**
+ * @param {ConstructorParameters<typeof DoIUse>} options
+ * @return {DoIUse}
+ */
+function index(...options) {
+ return new DoIUse(...options);
+}
+
+module.exports = index;
diff --git a/node_modules/doiuse/exports/index.js b/node_modules/doiuse/exports/index.js
new file mode 100644
index 00000000..dde9ea23
--- /dev/null
+++ b/node_modules/doiuse/exports/index.js
@@ -0,0 +1,9 @@
+import DoIUse from '../lib/DoIUse.js';
+
+/**
+ * @param {ConstructorParameters<typeof DoIUse>} options
+ * @return {DoIUse}
+ */
+export default function index(...options) {
+ return new DoIUse(...options);
+}
diff --git a/node_modules/doiuse/exports/stream.cjs b/node_modules/doiuse/exports/stream.cjs
new file mode 100644
index 00000000..982a0d35
--- /dev/null
+++ b/node_modules/doiuse/exports/stream.cjs
@@ -0,0 +1,3087 @@
+'use strict';
+
+var node_stream = require('node:stream');
+var Tokenize = require('css-tokenize');
+var Duplexify = require('duplexify');
+var postcss = require('postcss');
+var sourcemap = require('source-map');
+var multimatch = require('multimatch');
+var browserslist = require('browserslist');
+var caniuse = require('caniuse-lite');
+
+function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
+
+function _interopNamespace(e) {
+ if (e && e.__esModule) return e;
+ var n = Object.create(null);
+ if (e) {
+ Object.keys(e).forEach(function (k) {
+ if (k !== 'default') {
+ var d = Object.getOwnPropertyDescriptor(e, k);
+ Object.defineProperty(n, k, d.get ? d : {
+ enumerable: true,
+ get: function () { return e[k]; }
+ });
+ }
+ });
+ }
+ n["default"] = e;
+ return Object.freeze(n);
+}
+
+var Tokenize__default = /*#__PURE__*/_interopDefaultLegacy(Tokenize);
+var Duplexify__default = /*#__PURE__*/_interopDefaultLegacy(Duplexify);
+var postcss__default = /*#__PURE__*/_interopDefaultLegacy(postcss);
+var sourcemap__default = /*#__PURE__*/_interopDefaultLegacy(sourcemap);
+var multimatch__default = /*#__PURE__*/_interopDefaultLegacy(multimatch);
+var browserslist__default = /*#__PURE__*/_interopDefaultLegacy(browserslist);
+var caniuse__namespace = /*#__PURE__*/_interopNamespace(caniuse);
+
+/**
+ * No description available.
+ *
+ * See: This feature comes from MDN: https://developer.mozilla.org/en-US/search?q=Alternate+stylesheet
+ */
+
+// This feature is only in HTML, so we don't lint it
+
+/**
+ * @type {import('../features').Feature}
+ */
+var alternateStylesheet = {};
+
+/**
+ * Method of defining how a background image is attached to a scrollable element. Values include `scroll` (default), `fixed` and `local`.
+ *
+ * See: https://caniuse.com/background-attachment
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var backgroundAttachment = {
+ 'background-attachment': [
+ 'fixed',
+ 'local',
+ ],
+};
+
+/**
+ * Non-standard method of clipping a background image to the foreground text.
+ *
+ * See: https://caniuse.com/background-clip-text
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var backgroundClipText = {
+ 'background-clip': 'text',
+ '-webkit-background-clip': 'text',
+};
+
+var backgroundImgOpts = {
+ 'background-clip': true,
+ 'background-origin': true,
+ 'background-size': true,
+};
+
+var backgroundPositionXY = {
+ 'background-position-x': true,
+ 'background-position-y': true,
+};
+
+/**
+ * Allows CSS background images to be repeated without clipping.
+ *
+ * See: https://caniuse.com/background-repeat-round-space
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var backgroundRepeatRoundSpace = {
+ 'background-repeat': ['round', 'space'],
+};
+
+var borderImage = {
+ 'border-image': true,
+ 'border-image-outset': true,
+ 'border-image-repeat': true,
+ 'border-image-slice': true,
+ 'border-image-source': true,
+ 'border-image-width': true,
+
+};
+
+var borderRadius = {
+ 'border-radius': true,
+ 'border-top-left-radius': true,
+ 'border-top-right-radius': true,
+ 'border-bottom-right-radius': true,
+ 'border-bottom-left-radius': true,
+};
+
+var calc = {
+ '': 'calc(',
+};
+
+/** @typedef {RegExp|string|((value:string) => boolean)} FeatureCheck */
+
+/**
+ * @param {string} browserKey
+ * @param {string[]} [versions]
+ * @return {string}
+ */
+function formatBrowserName(browserKey, versions) {
+ const entry = caniuse.agents[browserKey];
+ const browserName = entry ? entry.browser : null;
+ if (!versions) {
+ return browserName || '';
+ }
+ return (`${browserName} (${versions.join(',')})`);
+}
+
+/**
+ *
+ * @param {FeatureCheck|FeatureCheck[]} check
+ * @param {?string|undefined} candidate
+ */
+function performFeatureCheck(check, candidate) {
+ if (check == null || candidate == null) return false;
+ if (check instanceof RegExp) {
+ return check.test(candidate);
+ }
+ switch (typeof check) {
+ case 'string':
+ return candidate.includes(check);
+ case 'function':
+ return check(candidate);
+ case 'boolean':
+ return check;
+ case 'object':
+ if (Array.isArray(check)) {
+ return check.some((c) => performFeatureCheck(c, candidate));
+ }
+ // Fallthrough
+ default:
+ console.error(check);
+ throw new TypeError(`Unexpected feature check: ${check}`);
+ }
+}
+
+/**
+ * @param {FeatureCheck|FeatureCheck[]} selector
+ * @return {(rule:import('postcss').ChildNode) => boolean}
+ */
+function checkSelector(selector) {
+ return (rule) => rule.type === 'rule'
+ && performFeatureCheck(selector, rule.selector);
+}
+
+/**
+ * @param {FeatureCheck|FeatureCheck[]} [name]
+ * @param {FeatureCheck|FeatureCheck[]} [parameters]
+ * @return {(rule:import('postcss').ChildNode) => boolean}
+ */
+function checkAtRule(name, parameters) {
+ return (rule) => rule.type === 'atrule'
+ && performFeatureCheck(name, rule.name)
+ && (!parameters || performFeatureCheck(parameters, rule.params));
+}
+
+/**
+ * @see https://drafts.csswg.org/css-values/#lengths
+ * @see https://drafts.csswg.org/css-values/#number-value
+ * @param {string[]} units
+ * @return {(rule:import('postcss').ChildNode) => boolean}
+ */
+function checkCSSLengthUnits(...units) {
+ const regexp = new RegExp(`(\\+-)?[\\d.]*\\.?\\d+(e(\\+-)?\\d+)?(${units.join('|')})`, 'i');
+ return (rule) => (
+ (rule.type === 'decl') ? performFeatureCheck(regexp, rule.value)
+ : ((rule.type === 'atrule') ? performFeatureCheck(regexp, rule.params)
+ : false));
+}
+
+/**
+ * Unit representing the width of the character "0" in the current font, of particular use in combination with monospace fonts.
+ * @see https://caniuse.com/ch-unit
+ * @type {import('../features').Feature}
+ */
+var chUnit = checkCSSLengthUnits('ch');
+
+var cssAll = {
+ 'all': true,
+};
+
+var cssAnimation = {
+ 'animation': true,
+ 'animation-name': true,
+ 'animation-duration': true,
+ 'animation-timing-function': true,
+ 'animation-iteration-count': true,
+ 'animation-direction': true,
+ 'animation-play-state': true,
+ 'animation-delay': true,
+ 'animation-fill-mode': true,
+};
+
+// @keyframes isn't checked for, but if you try to use it,
+// you'll still get a warning anyway because of the 'animation' property
+
+var cssAnyLink = checkSelector([':any-link', ':-webkit-any-link']);
+
+var cssAppearance = {
+ 'appearance': true,
+ '-webkit-appearance': true,
+ '-moz-appearance': true,
+};
+
+var cssAtCounterStyle = checkAtRule('counter-style');
+
+var cssAutofill = checkSelector([':autofill', ':-webkit-autofill']);
+
+var cssBackdropFilter = {
+ 'backdrop-filter': true,
+};
+
+/**
+ * @param {import('postcss').ChildNode} rule
+ * @return {boolean}
+ */
+var cssBackgroundOffsets = (rule) => {
+ if (rule.type !== 'decl') return false;
+ if (rule.prop !== 'background-position') return false;
+ return postcss.list.space(rule.value).length > 2;
+};
+
+var cssBackgroundblendmode = {
+ 'background-blend-mode': true,
+};
+
+/**
+ * Controls whether the box's margins, borders, padding, and other decorations wrap the broken edges of the box fragments (when the box is split by a break (page/column/region/line).
+ *
+ * See: https://caniuse.com/css-boxdecorationbreak
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssBoxdecorationbreak = {
+ 'box-decoration-break': true,
+ '-webkit-box-decoration-break': true,
+};
+
+var cssBoxshadow = {
+ 'box-shadow': true,
+};
+
+/**
+ * @param {import('postcss').ChildNode} rule
+ * @return {boolean}
+ */
+var cssCanvas = (rule) => {
+ if (rule.type !== 'decl') return false;
+ if (!rule.prop.startsWith('background')) return false;
+ return rule.value.startsWith('-webkit-canvas');
+};
+
+/**
+ * The `caret-color` property allows the color to be set of the caret (blinking text insertion pointer) in an editable text area.
+ *
+ * See: https://caniuse.com/css-caret-color
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssCaretColor = {
+ 'caret-color': true,
+};
+
+/**
+ * The `@layer` at-rule allows authors to explicitly layer their styles in the cascade, before specificity and order of appearance are considered.
+ *
+ * See: https://caniuse.com/css-cascade-layers
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssCascadeLayers = checkAtRule('layer');
+
+/**
+ * Including an `i` before the `]` in a CSS attribute selector causes the attribute value to be matched in an ASCII-case-insensitive manner. For example, `[b="xyz" i]` would match both `<a b="xyz">` and `<a b="XYZ">`.
+ *
+ * See: https://caniuse.com/css-case-insensitive
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssCaseInsensitive = (rule) => {
+ if (rule.type !== 'rule') { return false; }
+ if (/\[.*i]/.test(rule.selector)) { return true; }
+ return false;
+};
+
+var cssClipPath = {
+ 'clip-path': true,
+};
+
+/**
+ * The `print-color-adjust` (or `-webkit-print-color-adjust` as prefixed in WebKit/Blink browsers) property is a CSS extension that can be used to force printing of background colors and images.
+ *
+ * See: https://caniuse.com/css-color-adjust
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssColorAdjust = {
+ 'print-color-adjust': true,
+ '-webkit-print-color-adjust': true,
+};
+
+/**
+ * The CSS `color()` function allows the browser to display colors in any color space, such as the P3 color space which can display colors outside of the default sRGB color space.
+ *
+ * See: https://caniuse.com/css-color-function
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssColorFunction = {
+ '': 'color(',
+};
+
+const REGEX$2 = /(^|[^-])(repeating-)?conic-gradient/;
+
+var cssConicGradients = {
+ 'background': REGEX$2,
+ 'background-image': REGEX$2,
+ 'border-image': REGEX$2,
+ 'border-image-source': REGEX$2,
+ 'content': REGEX$2,
+ 'cursor': REGEX$2,
+ 'list-style': REGEX$2,
+ 'list-style-image': REGEX$2,
+};
+
+/**
+ * Size queries in Container Queries provide a way to query the size of a container, and conditionally apply CSS to the content of that container.
+ *
+ * See: https://caniuse.com/css-container-queries
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssContainerQueries = checkAtRule('container');
+
+var cssContainerQueriesStyle = checkAtRule('container', 'style(');
+
+var cssContainerQueryUnits = checkCSSLengthUnits(
+ 'cqw',
+ 'cqh',
+ 'cqi',
+ 'cqb',
+ 'cqmin',
+ 'cqmax',
+);
+
+/**
+ * The CSS `contain` property lets developers limit the scope of the browser's styles, layout and paint work for faster and more efficient rendering.
+ *
+ * See: https://caniuse.com/css-containment
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssContainment = {
+ 'contain': true,
+};
+
+/**
+ * Provides control over when elements are rendered, so rendering can be skipped for elements not yet in the user's viewport.
+ *
+ * See: https://caniuse.com/css-content-visibility
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssContentVisibility = {
+ 'content-visibility': true,
+};
+
+var cssCounters = {
+ 'counter-reset': true,
+ 'counter-increment': true,
+ '': 'counter(',
+};
+
+/**
+ * Scales images with an algorithm that preserves edges and contrast, without smoothing colors or introducing blur. This is intended for images such as pixel art. Official values that accomplish this for the `image-rendering` property are `crisp-edges` and `pixelated`.
+ *
+ * See: https://caniuse.com/css-crisp-edges
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssCrispEdges = {
+ 'image-rendering': ['crisp-edges', 'pixelated'],
+};
+
+/**
+ * Image function to create a "crossfade" between images. This allows one image to transition (fade) into another based on a percentage value.
+ *
+ * See: https://caniuse.com/css-cross-fade
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssCrossFade = {
+ '': [
+ 'cross-fade(',
+ '-webkit-cross-fade(',
+ ],
+};
+
+/**
+ * The `:default` pseudo-class matches checkboxes and radio buttons which are checked by default, `<option>`s with the `selected` attribute, and the default submit button (if any) of a form.
+ *
+ * See: https://caniuse.com/css-default-pseudo
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssDefaultPseudo = checkSelector(':default');
+
+/**
+ * An explicit, non-whitespace spelling of the descendant combinator. `A >> B` is equivalent to `A B`.
+ *
+ * See: https://caniuse.com/css-descendant-gtgt
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssDescendantGtgt = checkSelector('>>');
+
+/**
+ * Method of overriding the size of viewport in web page using the `@viewport` rule, replacing Apple's own popular `<meta>` viewport implementation. Includes the `extend-to-zoom` width value.
+ *
+ * See: https://caniuse.com/css-deviceadaptation
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssDeviceadaptation = checkAtRule('viewport');
+
+/**
+ * Matches elements based on their directionality. `:dir(ltr)` matches elements which are Left-to-Right. `:dir(rtl)` matches elements which are Right-to-Left.
+ *
+ * See: https://caniuse.com/css-dir-pseudo
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssDirPseudo = checkSelector(':dir(');
+
+/**
+ * `display: contents` causes an element's children to appear as if they were direct children of the element's parent, ignoring the element itself. This can be useful when a wrapper element should be ignored when using CSS grid or similar layout techniques.
+ *
+ * See: https://caniuse.com/css-display-contents
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssDisplayContents = {
+ 'display': 'contents',
+};
+
+/**
+ * This function renders a live image generated from an arbitrary HTML element
+ *
+ * See: https://caniuse.com/css-element-function
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssElementFunction = {
+ '': 'element(',
+};
+
+var cssEnvFunction = {
+ '': 'env(',
+};
+
+/**
+ * Exclusions defines how inline content flows around elements. It extends the content wrapping ability of floats to any block-level element.
+ *
+ * See: https://caniuse.com/css-exclusions
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssExclusions = {
+ 'wrap-flow': true,
+ '-ms-wrap-flow': true,
+};
+
+var cssFeaturequeries = checkAtRule(['supports']);
+
+/**
+ * No description available.
+ *
+ * See: This feature comes from MDN: https://developer.mozilla.org/en-US/search?q=::file-selector-button+CSS+pseudo-element
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssFileSelectorButton = checkSelector(':file-selector-button');
+
+/**
+ * This function filters a CSS input image with a set of filter functions (like blur, grayscale or hue)
+ *
+ * See: https://caniuse.com/css-filter-function
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssFilterFunction = {
+ '': 'filter(',
+};
+
+var cssFilters = {
+ 'filter': true,
+};
+
+/**
+ * CSS pseudo-element that allows styling only the first "letter" of text within an element. Useful for implementing initial caps or drop caps styling.
+ *
+ * See: https://caniuse.com/css-first-letter
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssFirstLetter = checkSelector(':first-letter');
+
+/**
+ * Allows styling specifically for the first line of text using the `::first-line` pseudo-element. Note that only a limited set of properties can be applied.
+ *
+ * See: https://caniuse.com/css-first-line
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssFirstLine = checkSelector(':first-line');
+
+var cssFixed = {
+ 'position': 'fixed',
+};
+
+/**
+ * The `:focus-visible` pseudo-class applies while an element matches the `:focus` pseudo-class, and the UA determines via heuristics that the focus should be specially indicated on the element (typically via a “focus ring”).
+ *
+ * See: https://caniuse.com/css-focus-visible
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssFocusVisible = checkSelector(':focus-visible');
+
+/**
+ * The `:focus-within` pseudo-class matches elements that either themselves match `:focus` or that have descendants which match `:focus`.
+ *
+ * See: https://caniuse.com/css-focus-within
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssFocusWithin = checkSelector(':focus-within');
+
+var cssFontPalette = [
+ (rule) => performFeatureCheck('font-palette', rule.name),
+ checkAtRule('font-palette-values'),
+];
+
+/**
+ * `@font-face` descriptor `font-display` that allows control over how a downloadable font renders before it is fully loaded.
+ *
+ * See: https://caniuse.com/css-font-rendering-controls
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssFontRenderingControls = {
+ 'font-display': true,
+};
+
+var cssFontStretch = {
+ 'font-stretch': true,
+};
+
+var cssGencontent = checkSelector([':before', ':after']);
+
+const REGEX$1 = /(^|[^-])((linear)|(radial))-gradient/;
+
+var cssGradients = {
+ 'background': REGEX$1,
+ 'background-image': REGEX$1,
+ 'border-image': REGEX$1,
+ 'border-image-source': REGEX$1,
+ 'content': REGEX$1,
+ 'cursor': REGEX$1,
+ 'list-style': REGEX$1,
+ 'list-style-image': REGEX$1,
+};
+
+/** @see https://drafts.csswg.org/css-grid/ */
+
+var cssGrid = {
+ 'display': ['grid', 'inline-grid', '-ms-grid'],
+ 'grid': true,
+ 'grid-area': true,
+ 'grid-auto-columns': true,
+
+ 'grid-auto-flow': true,
+ 'grid-auto-rows': true,
+ 'grid-column': true,
+ 'grid-column-end': true,
+
+ 'grid-column-start': true,
+ 'grid-row': true,
+ 'grid-row-end': true,
+ 'grid-row-start': true,
+
+ 'grid-template': true,
+ 'grid-template-areas': true,
+ 'grid-template-columns': true,
+ 'grid-template-rows': true,
+};
+
+const REGEX = /grid/;
+
+var cssGridAnimation = {
+ 'transition': REGEX,
+ 'transition-property': REGEX,
+};
+
+/**
+ * Allows some punctuation characters from start (or the end) of text elements to be placed "outside" of the box in order to preserve the reading flow.
+ * @see https://caniuse.com/css-hanging-punctuation
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssHangingPunctuation = {
+ 'hanging-punctuation': true,
+};
+
+/**
+ * Select elements containing specific content. For example, `a:has(img)` selects all `<a>` elements that contain an `<img>` child.
+ * @see https://caniuse.com/css-has
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssHas = checkSelector(':has');
+
+var cssHyphens = {
+ 'hyphens': true,
+};
+
+var cssImageOrientation = {
+ 'image-orientation': true,
+};
+
+/**
+ * Method of letting the browser pick the most appropriate CSS image from a given set.
+ * @see https://caniuse.com/css-image-set
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssImageSet = {
+ '': 'image-set(',
+};
+
+/**
+ * If a temporal or number `<input>` has `max` and/or `min` attributes, then `:in-range` matches when the value is within the specified range and `:out-of-range` matches when the value is outside the specified range. If there are no range constraints, then neither pseudo-class matches.
+ * @see https://caniuse.com/css-in-out-of-range
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssInOutOfRange = checkSelector([
+ ':in-range',
+ ':out-of-range',
+]);
+
+/**
+ * The `:indeterminate` pseudo-class matches indeterminate checkboxes, indeterminate `<progress>` bars, and radio buttons with no checked button in their radio button group.
+ * @see https://caniuse.com/css-indeterminate-pseudo
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssIndeterminatePseudo = checkSelector(':indeterminate');
+
+/**
+ * Method of creating an enlarged cap, including a drop or raised cap, in a robust way.
+ * @see https://caniuse.com/css-initial-letter
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssInitialLetter = {
+ 'initial-letter': true,
+};
+
+var cssInitialValue = {
+ '': 'initial',
+};
+
+/**
+ * The `lch()` and `lab()` color functions are based on the CIE LAB color space, representing colors in a way that closely matches human perception and provides access to a wider spectrum of colors than offered by the usual RGB color space.
+ * @see https://caniuse.com/css-lch-lab
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssLchLab = {
+ '': [
+ 'lch(',
+ 'lab(',
+ ],
+};
+
+/**
+ * Controls spacing between characters of text (i.e. "tracking" in typographical terms). Not to be confused with kerning.
+ * @see https://caniuse.com/css-letter-spacing
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssLetterSpacing = {
+ 'letter-spacing': true,
+};
+
+/**
+ * CSS property that will contain text to a given amount of lines when used in combination with `display: -webkit-box`. It will end with ellipsis when `text-overflow: ellipsis` is included.
+ * @see https://caniuse.com/css-line-clamp
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssLineClamp = {
+ 'line-clamp': true,
+ '-webkit-line-clamp': true,
+};
+
+var cssLogicalProps = {
+ 'block-size': true,
+ 'inline-size': true,
+ 'min-block-size': true,
+ 'min-inline-size': true,
+ 'max-block-size': true,
+ 'max-inline-size': true,
+ 'margin-block-start': true,
+ 'margin-block-end': true,
+ 'margin-inline-start': true,
+ 'margin-inline-end': true,
+ 'margin-block': true,
+ 'margin-inline': true,
+ 'inset-block-start': true,
+ 'inset-block-end': true,
+ 'inset-inline-start': true,
+ 'inset-inline-end': true,
+ 'inset-block': true,
+ 'inset-inline': true,
+ 'inset': true,
+ 'padding-block-start': true,
+ 'padding-block-end': true,
+ 'padding-inline-start': true,
+ 'padding-inline-end': true,
+ 'padding-block': true,
+ 'padding-inline': true,
+ 'border-block-start-width': true,
+ 'border-block-end-width': true,
+ 'border-inline-start-width': true,
+ 'border-inline-end-width': true,
+ 'border-block-width': true,
+ 'border-inline-width': true,
+ 'border-block-start-style': true,
+ 'border-block-end-style': true,
+ 'border-inline-start-style': true,
+ 'border-inline-end-style': true,
+ 'border-block-style': true,
+ 'border-inline-style': true,
+ 'border-block-start-color': true,
+ 'border-block-end-color': true,
+ 'border-inline-start-color': true,
+ 'border-inline-end-color': true,
+ 'border-block-color': true,
+ 'border-inline-color': true,
+ 'border-block-start': true,
+ 'border-block-end': true,
+ 'border-inline-start': true,
+ 'border-inline-end': true,
+ 'border-block': true,
+ 'border-inline': true,
+ 'border-start-start-radius': true,
+ 'border-start-end-radius': true,
+ 'border-end-start-radius': true,
+ 'border-end-end-radius': true,
+ 'text-align': ['start', 'end'],
+ 'float': ['inline-start', 'inline-end'],
+ 'resize': ['block', 'inline'],
+ 'overflow-block': true,
+ 'overflow-inline': true,
+};
+
+/**
+ * The `::marker` pseudo-element allows list item markers to be styled or have their content value customized.
+ * @see https://caniuse.com/css-marker-pseudo
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssMarkerPseudo = checkSelector(':marker');
+
+var cssMasks = {
+ 'clip-path': true,
+ 'mask': true,
+ 'mask-border': true,
+ 'mask-border-mode': true,
+ 'mask-border-outset': true,
+ 'mask-border-repeat': true,
+ 'mask-border-slice': true,
+ 'mask-border-source': true,
+ 'mask-border-width': true,
+ 'mask-clip': true,
+ 'mask-composite': true,
+ 'mask-image': true,
+ 'mask-mode': true,
+ 'mask-origin': true,
+ 'mask-position': true,
+ 'mask-repeat': true,
+ 'mask-size': true,
+ 'mask-type': true,
+ // and webkit versions
+ '-webkit-clip-path': true,
+ '-webkit-mask': true,
+ '-webkit-mask-border': true,
+ '-webkit-mask-border-mode': true,
+ '-webkit-mask-border-outset': true,
+ '-webkit-mask-border-repeat': true,
+ '-webkit-mask-border-slice': true,
+ '-webkit-mask-border-source': true,
+ '-webkit-mask-border-width': true,
+ '-webkit-mask-clip': true,
+ '-webkit-mask-composite': true,
+ '-webkit-mask-image': true,
+ '-webkit-mask-mode': true,
+ '-webkit-mask-origin': true,
+ '-webkit-mask-position': true,
+ '-webkit-mask-repeat': true,
+ '-webkit-mask-size': true,
+ '-webkit-mask-type': true,
+};
+
+var cssMatchesPseudo = checkSelector([
+ ':is',
+ ':where',
+ ':matches',
+ ':any',
+ ':-webkit-any',
+ ':-webkit-is',
+ ':-webkit-where',
+ ':-webkit-matches',
+]);
+
+var cssMathFunctions = {
+ '': ['min(', 'max(', 'clamp('],
+};
+
+/**
+ * Allows a media query to be set based on the presence and accuracy of the user's pointing device, and whether they have the ability to hover over elements on the page. This includes the `pointer`, `any-pointer`, `hover`, and `any-hover` media features.
+ * @see https://caniuse.com/css-media-interaction
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssMediaInteraction = checkAtRule('media', [
+ 'pointer',
+ 'any-pointer',
+ 'hover',
+ 'any-hover',
+]);
+
+var cssMediaRangeSyntax = checkAtRule('media', [' > ', ' < ', ' <= ', ' >= ']);
+
+var cssMediaResolution = checkAtRule('media', ['min-resolution', 'max-resolution', 'resolution', 'device-pixel-ratio']);
+
+/**
+ * No description available.
+ * @see This feature comes from MDN: https://developer.mozilla.org/en-US/search?q=Media+Queries:+scripting+media+feature
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssMediaScripting = checkAtRule('media', ['scripting']);
+
+var cssMediaqueries = checkAtRule(['media']);
+
+var cssMixblendmode = {
+ 'mix-blend-mode': true,
+};
+
+var cssMotionPaths = {
+ 'offset-path': true,
+};
+
+/**
+ * Using the `@namespace` at-rule, elements of other namespaces (e.g. SVG) can be targeted using the pipe (`|`) selector.
+ * @see https://caniuse.com/css-namespaces
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssNamespaces = checkAtRule('namespace');
+
+/**
+ * CSS nesting provides the ability to nest one style rule inside another, with the selector of the child rule relative to the selector of the parent rule. Similar behavior previously required a CSS pre-processor.
+ * @see https://caniuse.com/css-nesting
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssNesting = (rule) => {
+ if (rule.type === 'rule' && rule.parent.type === 'rule') {
+ return true;
+ }
+
+ if (rule.type === 'atrule' && rule.parent.type === 'rule') {
+ return true;
+ }
+
+ return false;
+};
+
+/**
+ * Selectors Level 3 only allowed `:not()` pseudo-class to accept a single simple selector, which the element must not match any of. Thus, `:not(a, .b, [c])` or `:not(a.b[c])` did not work. Selectors Level 4 allows `:not()` to accept a list of selectors. Thus, `:not(a):not(.b):not([c])` can instead be written as `:not(a, .b, [c])` and `:not(a.b[c])` works as intended.
+ * @see https://caniuse.com/css-not-sel-list
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssNotSelList = checkSelector(
+ (selector) => selector.includes(':not(') && !/:not\(.?#?-?[\w[\]-]+\)/.test(selector),
+);
+
+/**
+ * The newest versions of `:nth-child()` and `:nth-last-child()` accept an optional `of S` clause which filters the children to only those which match the selector list `S`. For example, `:nth-child(1 of .foo)` selects the first child among the children that have the `foo` class (ignoring any non-`foo` children which precede that child). Similar to `:nth-of-type`, but for arbitrary selectors instead of only type selectors.
+ * @see https://caniuse.com/css-nth-child-of
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssNthChildOf = checkSelector(
+ (selector) => /:nth-(child|last-child)\(\s*\d+\s*of/.test(selector),
+);
+
+var cssOpacity = {
+ 'opacity': true,
+};
+
+/**
+ * The `:optional` pseudo-class matches form inputs (`<input>`, `<textarea>`, `<select>`) which are not `:required`.
+ * @see https://caniuse.com/css-optional-pseudo
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssOptionalPseudo = checkSelector(':optional');
+
+/**
+ * Originally a single property for controlling overflowing content in both horizontal & vertical directions, the `overflow` property is now a shorthand for `overflow-x` & `overflow-y`. The latest version of the specification also introduces the `clip` value that blocks programmatic scrolling.
+ * @see https://caniuse.com/css-overflow
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssOverflow = {
+ 'overflow': true,
+ 'overflow-x': true,
+ 'overflow-y': true,
+};
+
+/**
+ * Changes in DOM elements above the visible region of a scrolling box can result in the page moving while the user is in the middle of consuming the content. By default, the value of `overflow-anchor` is `auto`, it can mitigate this jarring user experience by keeping track of the position of an anchor node and adjusting the scroll offset accordingly
+ * @see https://caniuse.com/css-overflow-anchor
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssOverflowAnchor = {
+ 'overflow-anchor': true,
+};
+
+var cssOverflowOverlay = {
+ 'overflow': 'overlay',
+};
+
+var cssOverscrollBehavior = {
+ 'overscroll-behavior': true,
+ 'overscroll-behavior-x': true,
+ 'overscroll-behavior-y': true,
+};
+
+/**
+ * Properties to control the way elements are broken across (printed) pages.
+ * @see https://caniuse.com/css-page-break
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssPageBreak = {
+ 'page-break-after': true,
+ 'page-break-before': true,
+ 'page-break-inside': true,
+};
+
+/**
+ * CSS at-rule (`@page`) to define page-specific rules when printing web pages, such as margin per page and page dimensions.
+ * @see https://caniuse.com/css-paged-media
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssPagedMedia = checkAtRule('page');
+
+/**
+ * Allows programmatic generation of images used by CSS
+ * @see https://caniuse.com/css-paint-api
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssPaintApi = { '': 'paint(' };
+
+var cssPlaceholder = [
+ checkSelector(':placeholder'),
+];
+
+/**
+ * :placeholder-shown CSS pseudo-class
+ * Input elements can sometimes show placeholder text as a hint to the user on what to type in. See, for example, the placeholder attribute in HTML5. The :placeholder-shown pseudo-class matches an input element that is showing such placeholder text.
+ * @see https://caniuse.com/css-placeholder-shown
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssPlaceholderShown = checkSelector(':placeholder-shown');
+
+var cssPrintColorAdjust = {
+ 'print-color-adjust': true,
+};
+
+/**
+ * CSS :read-only and :read-write selectors
+ * :read-only and :read-write pseudo-classes to match elements which are considered user-alterable
+ * @see https://caniuse.com/css-read-only-write
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssReadOnlyWrite = checkSelector([':read-only', ':read-write']);
+
+/**
+ * Rebeccapurple color
+ * The new color added in CSS Color Module Level 4
+ * @see https://caniuse.com/css-rebeccapurple
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssRebeccapurple = {
+ '': 'rebeccapurple',
+};
+
+var cssReflections = {
+ 'box-reflect': true,
+ '-webkit-box-reflect': true,
+};
+
+/**
+ * CSS Regions
+ * Method of flowing content into multiple elements, allowing magazine-like layouts. While once supported in WebKit-based browsers and Internet Explorer, implementing the feature is no longer being pursued by any browser.
+ * @see https://caniuse.com/css-regions
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssRegions = {
+ 'flow-into': true,
+ 'flow-from': true,
+ '-webkit-flow-into': true,
+ '-webkit-flow-from': true,
+};
+
+/**
+ * CSS Relative colors
+ * The CSS Relative Color syntax allows a color to be defined relative to another color using the `from` keyword and optionally `calc()` for any of the color values.
+ * @see https://caniuse.com/css-relative-colors
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssRelativeColors = {
+ '': /((rgb)|(rgba)|(hsl)|(hsla)|(hwb))\(\s*from/,
+};
+
+var cssRepeatingGradients = {
+ '': [
+ 'repeating-linear-gradient',
+ 'repeating-radial-gradient',
+ ],
+};
+
+var cssResize = {
+ 'resize': true,
+};
+
+var cssRevertValue = {
+ '': 'revert',
+
+};
+
+/**
+ * #rrggbbaa hex color notation
+ * The CSS Color Module Level 4 defines new 4 & 8 character hex notation for color to include the opacity level.
+ * @see https://caniuse.com/css-rrggbbaa
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssRrggbbaa = {
+ '': [
+ /#[\da-f]{8}/i,
+ /#[\da-f]{4}(\W|$)/i,
+ ],
+};
+
+/**
+ * CSS Scroll-behavior
+ * Method of specifying the scrolling behavior for a scrolling box, when scrolling happens due to navigation or CSSOM scrolling APIs.
+ * @see https://caniuse.com/css-scroll-behavior
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssScrollBehavior = {
+ 'scroll-behavior': true,
+};
+
+/**
+ * CSS @scroll-timeline
+ * CSS property that allows animations to be driven by a container's scroll position
+ * @see https://caniuse.com/css-scroll-timeline
+ */
+
+const checkAt = checkAtRule('scroll-timeline');
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssScrollTimeline = (node) => {
+ // check for @scroll-timeline
+ if (checkAt(node)) {
+ return true;
+ }
+
+ // check for animation-timeline
+ if (node.type !== 'decl') return false;
+ if (node.prop.startsWith('animation-timeline')) {
+ return true;
+ }
+
+ return false;
+};
+
+var cssScrollbar = {
+ 'scrollbar-color': true,
+ 'scrollbar-width': true,
+};
+
+const ATTRIBUTE_IDENTIFIER$1 = '[^\\~|^$*\\]]*';
+
+// Export for testing
+const REGEXES$1 = {
+ 'HAS_ATTRIBUTE': new RegExp(`\\[${ATTRIBUTE_IDENTIFIER$1}\\]`),
+ 'MATCH_ATTRIBUTE': new RegExp(`\\[${ATTRIBUTE_IDENTIFIER$1}=${ATTRIBUTE_IDENTIFIER$1}\\]`),
+ 'WORD_ATTRIBUTE': new RegExp(`\\[${ATTRIBUTE_IDENTIFIER$1}\\~=${ATTRIBUTE_IDENTIFIER$1}\\]`),
+ 'SUBCODE_ATTRIBUTE': new RegExp(`\\[${ATTRIBUTE_IDENTIFIER$1}\\|=${ATTRIBUTE_IDENTIFIER$1}\\]`),
+ 'BRACKET_PARENS': /(\[[^=\]]*(=("[^"]*")|[^\]]+|)])|(\([^)]*\))/g,
+};
+
+/**
+ * @param {RegExp} pattern
+ * @return {(str:string) => boolean}
+ */
+function matchOutsideOfBrackets(pattern) {
+ if (!(pattern instanceof RegExp)) {
+ throw new TypeError('matchOutsideOfBrackets expects a RegExp');
+ }
+ return (string) => pattern.test(string.replaceAll(REGEXES$1.BRACKET_PARENS, ''));
+}
+
+var cssSel2 = checkSelector([
+ ':first-child',
+ ':link',
+ ':visited',
+ ':active',
+ ':hover',
+ ':focus',
+ ':lang',
+ REGEXES$1.HAS_ATTRIBUTE,
+ REGEXES$1.MATCH_ATTRIBUTE,
+ REGEXES$1.WORD_ATTRIBUTE,
+ REGEXES$1.SUBCODE_ATTRIBUTE,
+ matchOutsideOfBrackets(/\*/),
+ matchOutsideOfBrackets(/>/),
+ matchOutsideOfBrackets(/\+/),
+ matchOutsideOfBrackets(/\./),
+ matchOutsideOfBrackets(/#/),
+]);
+
+const ATTRIBUTE_IDENTIFIER = '[^\\~|^$*\\]]*';
+
+// Export for testing
+const REGEXES = {
+ 'SIBLING_SELECTOR': /^[^[]*~/,
+ 'STARTSWITH_ATTRIBUTE': new RegExp(`\\[${ATTRIBUTE_IDENTIFIER}\\^=${ATTRIBUTE_IDENTIFIER}\\]`),
+ 'ENDSWITH_ATTRIBUTE': new RegExp(`\\[${ATTRIBUTE_IDENTIFIER}\\$=${ATTRIBUTE_IDENTIFIER}\\]`),
+ 'INSENSITIVE_ATTRIBUTE': new RegExp(`\\[${ATTRIBUTE_IDENTIFIER}\\*=${ATTRIBUTE_IDENTIFIER}\\]`),
+};
+
+var cssSel3 = checkSelector([
+ ':root',
+ ':nth-child',
+ ':nth-last-child',
+ 'nth-of-type',
+ 'nth-last-of-type',
+ ':last-child',
+ ':first-of-type',
+ ':last-of-type',
+ ':only-child',
+ ':only-of-type',
+ ':empty',
+ ':target',
+ ':enabled',
+ ':disabled',
+ ':checked',
+ ':not',
+ REGEXES.SIBLING_SELECTOR,
+ REGEXES.STARTSWITH_ATTRIBUTE,
+ REGEXES.ENDSWITH_ATTRIBUTE,
+ REGEXES.INSENSITIVE_ATTRIBUTE,
+]);
+
+var cssSelection = checkSelector(':selection');
+
+var cssShapes = {
+ 'shape-outside': true,
+ 'shape-image-threshold': true,
+ 'shape-margin': true,
+};
+
+/**
+ * CSS Scroll Snap
+ * CSS technique that allows customizable scrolling experiences like pagination of carousels by setting defined snap positions.
+ * @see https://caniuse.com/css-snappoints
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssSnappoints = {
+ 'scroll-snap-type': true,
+ 'scroll-padding': true,
+ 'scroll-padding-top': true,
+ 'scroll-padding-right': true,
+ 'scroll-padding-bottom': true,
+ 'scroll-padding-left': true,
+ 'scroll-padding-inline': true,
+ 'scroll-padding-inline-start': true,
+ 'scroll-padding-inline-end': true,
+ 'scroll-padding-block': true,
+ 'scroll-padding-block-start': true,
+ 'scroll-padding-block-end': true,
+ 'scroll-snap-align': true,
+ 'scroll-margin': true,
+ 'scroll-margin-top': true,
+ 'scroll-margin-right': true,
+ 'scroll-margin-bottom': true,
+ 'scroll-margin-left': true,
+ 'scroll-margin-inline': true,
+ 'scroll-margin-inline-start': true,
+ 'scroll-margin-inline-end': true,
+ 'scroll-margin-block': true,
+ 'scroll-margin-block-start': true,
+ 'scroll-margin-block-end': true,
+ 'scroll-snap-stop': true,
+};
+
+var cssSticky = {
+ 'position': 'sticky',
+};
+
+/**
+ * CSS Subgrid
+ * Feature of the CSS Grid Layout Module Level 2 that allows a grid-item with its own grid to align in one or both dimensions with its parent grid.
+ * @see https://caniuse.com/css-subgrid
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssSubgrid = {
+ '': 'subgrid',
+};
+
+/**
+ * CSS.supports() API
+ * The CSS.supports() static methods returns a Boolean value indicating if the browser supports a given CSS feature, or not.
+ * @see https://caniuse.com/css-supports-api
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssSupportsApi = {};
+
+/* this feature appears in JS, so it's not linted by this tool */
+
+var cssTable = {
+ 'display': [
+ 'table',
+ 'table-',
+ 'inline-table',
+ ],
+};
+
+/**
+ * CSS3 text-align-last
+ * CSS property to describe how the last line of a block or a line right before a forced line break when `text-align` is `justify`.
+ * @see https://caniuse.com/css-text-align-last
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssTextAlignLast = {
+ 'text-align-last': true,
+};
+
+/**
+ * CSS text-box-trim & text-box-edge
+ * Provides the ability to remove the vertical space appearing above and below text glyphs, allowing more precise positioning and alignment. Previously specified as the `leading-trim` & `text-edge` properties.
+ * @see https://caniuse.com/css-text-box-trim
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssTextBoxTrim = {
+ 'text-box-trim': true,
+ 'text-box-edge': true,
+};
+
+/**
+ * CSS text-indent
+ * The `text-indent` property applies indentation to lines of inline content in a block.
+ * @see https://caniuse.com/css-text-indent
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssTextIndent = {
+ 'text-indent': true,
+};
+
+/**
+ * CSS text-justify
+ * CSS property to define how text should be justified when `text-align: justify` is set.
+ * @see https://caniuse.com/css-text-justify
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssTextJustify = {
+ 'text-justify': true,
+};
+
+/**
+ * CSS text-orientation
+ * The CSS `text-orientation` property specifies the orientation of text within a line. Current values only have an effect in vertical typographic modes (defined with the `writing-mode` property)
+ * @see https://caniuse.com/css-text-orientation
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssTextOrientation = {
+ 'text-orientation': true,
+};
+
+/**
+ * CSS Text 4 text-spacing
+ * No description available.
+ * @see This feature comes from MDN: https://developer.mozilla.org/en-US/search?q=CSS+Text+4+text-spacing
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssTextSpacing = {
+ 'text-spacing': true,
+};
+
+var cssTextshadow = {
+ 'text-shadow': true,
+};
+
+var cssTouchAction = {
+ 'touch-action': true,
+};
+
+var cssTransitions = {
+ 'transition': true,
+ 'transition-property': true,
+ 'transition-duration': true,
+ 'transition-delay': true,
+ 'transition-timing-function': true,
+};
+
+/**
+ * CSS unicode-bidi property
+ * No description available.
+ * @see This feature comes from MDN: https://developer.mozilla.org/en-US/search?q=CSS+unicode-bidi+property
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssUnicodeBidi = {
+ 'unicode-bidi': true,
+};
+
+var cssUnsetValue = {
+ '': 'unset',
+};
+
+/**
+ * @param {import('postcss').ChildNode} rule
+ * @return {boolean}
+ */
+var cssVariables = (rule) => {
+ if (rule.type !== 'decl') return false;
+ return (rule.prop.startsWith('--') || rule.value.includes('var('));
+};
+
+/**
+ * CSS @when / @else conditional rules
+ * Syntax allowing CSS conditions (like media and support queries) to be written more simply, as well as making it possibly to write mutually exclusive rules using `@else` statements.
+ * @see https://caniuse.com/css-when-else
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssWhenElse = checkAtRule(['when', 'else']);
+
+/**
+ * CSS widows & orphans
+ * CSS properties to control when lines break across pages or columns by defining the amount of lines that must be left before or after the break.
+ * @see https://caniuse.com/css-widows-orphans
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssWidowsOrphans = {
+ 'widows': true,
+ 'orphans': true,
+};
+
+/**
+ * width: stretch property
+ * No description available.
+ * @see This feature comes from MDN: https://developer.mozilla.org/en-US/search?q=width:+stretch+property
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssWidthStretch = {
+ 'width': 'stretch',
+};
+
+/**
+ * CSS writing-mode property
+ * Property to define whether lines of text are laid out horizontally or vertically and the direction in which blocks progress.
+ * @see https://caniuse.com/css-writing-mode
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssWritingMode = {
+ 'writing-mode': true,
+};
+
+/**
+ * CSS zoom
+ * Non-standard method of scaling content.
+ * @see https://caniuse.com/css-zoom
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var cssZoom = {
+ 'zoom': true,
+};
+
+/**
+ * CSS3 attr() function for all properties
+ * While `attr()` is supported for effectively all browsers for the `content` property, CSS Values and Units Level 5 adds the ability to use `attr()` on **any** CSS property, and to use it for non-string values (e.g. numbers, colors).
+ * @see https://caniuse.com/css3-attr
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var css3Attr = (rule) => {
+ if (rule.type !== 'decl') return false;
+ if (rule.prop === 'content') {
+ return false;
+ }
+
+ return rule.toString().includes('attr(');
+};
+
+var css3Boxsizing = {
+ 'box-sizing': true,
+};
+
+var css3Colors = {
+ '': [
+ 'rgba',
+ 'hsl',
+ 'hsla',
+ ],
+};
+
+var css3Cursors = {
+ 'cursor': [
+ 'none',
+ 'context-menu',
+ 'cell',
+ 'vertical-text',
+ 'alias',
+ 'copy',
+ 'no-drop',
+ 'not-allowed',
+ 'nesw-resize',
+ 'nwse-resize',
+ 'col-resize',
+ 'row-resize',
+ 'all-scroll',
+ ],
+};
+
+var css3CursorsGrab = {
+ 'cursor': ['grab', 'grabbing'],
+};
+
+var css3CursorsNewer = {
+ 'cursor': ['zoom-in', 'zoom-out'],
+};
+
+var css3Tabsize = {
+ 'tab-size': true,
+};
+
+/**
+ * CSS currentColor value
+ * A CSS value that will apply the existing `color` value to other properties like `background-color`, etc.
+ * @see https://caniuse.com/currentcolor
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var currentcolor = {
+ '': 'currentColor',
+};
+
+/**
+ * Window.devicePixelRatio
+ * Read-only property that returns the ratio of the (vertical) size of one physical pixel on the current display device to the size of one CSS pixel.
+ * @see https://caniuse.com/devicepixelratio
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var devicepixelratio = {};
+
+/* this feature is found in JS and is not linted by this tool */
+
+/**
+ * ui-serif, ui-sans-serif, ui-monospace and ui-rounded values for font-family
+ * Allows more control when choosing system interface fonts
+ * @see https://caniuse.com/extended-system-fonts
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var extendedSystemFonts = {
+ 'font-family': ['ui-serif', 'ui-sans-serif', 'ui-monospace', 'ui-rounded'],
+};
+
+var flexbox = {
+ 'display': [
+ 'flex',
+ 'inline-flex',
+ ],
+ 'flex': true,
+ 'flex-grow': true,
+ 'flex-shrink': true,
+ 'flex-basis': true,
+ 'flex-direction': true,
+ 'flex-wrap': true,
+ 'flex-flow': true,
+};
+
+/**
+ * gap property for Flexbox
+ * `gap` for flexbox containers to create gaps/gutters between flex items
+ * @see https://caniuse.com/flexbox-gap
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var flexboxGap = (rule) => {
+ if (/display:\s(inline-)?flex/.test(rule.toString())
+ && rule.toString().includes('gap:')
+ ) {
+ return true;
+ }
+
+ return false;
+};
+
+/**
+ * display: flow-root
+ * The element generates a block container box, and lays out its contents using flow layout. It always establishes a new block formatting context for its contents. It provides a better solution to the most use cases of the "clearfix" hack.
+ * @see https://caniuse.com/flow-root
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var flowRoot = {
+ 'display': 'flow-root',
+};
+
+/**
+ * system-ui value for font-family
+ * Value for `font-family` that represents the default user interface font.
+ * @see https://caniuse.com/font-family-system-ui
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var fontFamilySystemUi = {
+ 'font-family': 'system-ui',
+};
+
+var fontFeature = {
+ 'font-feature-settings': true,
+ 'font-variant-ligatures': true,
+ 'font-language-override': true,
+ 'font-kerning': true,
+};
+
+/**
+ * CSS3 font-kerning
+ * Controls the usage of the kerning information (spacing between letters) stored in the font. Note that this only affects OpenType fonts with kerning information, it has no effect on other fonts.
+ * @see https://caniuse.com/font-kerning
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var fontKerning = {
+ 'font-kerning': true,
+};
+
+/**
+ * CSS Font Loading
+ * This CSS module defines a scripting interface to font faces in CSS, allowing font faces to be easily created and loaded from script. It also provides methods to track the loading status of an individual font, or of all the fonts on an entire page.
+ * @see https://caniuse.com/font-loading
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var fontLoading = {};
+
+/* this feature appears in JS and as such is not linted */
+
+var fontSizeAdjust = {
+ 'font-size-adjust': true,
+};
+
+/**
+ * CSS font-smooth
+ * Controls the application of anti-aliasing when fonts are rendered.
+ * @see https://caniuse.com/font-smooth
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var fontSmooth = {
+ 'font-smooth': true,
+};
+
+var fontUnicodeRange = {
+ 'unicode-range': true,
+};
+
+/**
+ * CSS font-variant-alternates
+ * Controls the usage of alternate glyphs associated to alternative names defined in @font-feature-values for certain types of OpenType fonts.
+ * @see https://caniuse.com/font-variant-alternates
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var fontVariantAlternates = {
+ 'font-variant-alternates': true,
+};
+
+/**
+ * CSS font-variant-numeric
+ * CSS property that provides different ways of displaying numbers, fractions, and ordinal markers.
+ * @see https://caniuse.com/font-variant-numeric
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var fontVariantNumeric = {
+ 'font-variant-numeric': true,
+};
+
+var fontface = [
+ checkAtRule('font-face'),
+];
+
+var fullscreen = checkSelector(':fullscreen');
+
+/**
+ * getComputedStyle
+ * API to get the current computed CSS styles applied to an element. This may be the current value applied by an animation or as set by a stylesheet.
+ * @see https://caniuse.com/getcomputedstyle
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var getcomputedstyle = {};
+
+/* this is a js api, so we don't lint it */
+
+var inlineBlock = {
+ 'display': 'inline-block',
+};
+
+const VALUES = ['max-content', 'min-content', 'fit-content', 'fill-available', 'stretch', 'fill'];
+
+var intrinsicWidth = {
+ 'width': VALUES,
+ 'min-width': VALUES,
+ 'max-width': VALUES,
+ 'height': VALUES,
+ 'min-height': VALUES,
+ 'max-height': VALUES,
+};
+
+/**
+ * CSS justify-content: space-evenly
+ * The "space-evenly" value for the `justify-content` property distributes the space between items evenly. It is similar to space-around but provides equal instead of half-sized space on the edges. Can be used in both CSS flexbox & grid.
+ * @see https://caniuse.com/justify-content-space-evenly
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var justifyContentSpaceEvenly = {
+ 'justify-content': 'space-evenly',
+};
+
+var kerningPairsLigatures = {
+ 'text-rendering': 'optimizeLegibility',
+};
+
+var mdnCssUnicodeBidiIsolate = {
+ 'unicode-bidi': 'isolate',
+};
+
+var mdnCssUnicodeBidiIsolateOverride = {
+ 'unicode-bidi': 'isolate-override',
+};
+
+var mdnCssUnicodeBidiPlaintext = {
+ 'unicode-bidi': 'plaintext',
+};
+
+var mdnTextDecorationColor = {
+ 'text-decoration-color': true,
+};
+
+var mdnTextDecorationLine = {
+ 'text-decoration-line': true,
+};
+
+var mdnTextDecorationShorthand = {
+ 'text-decoration': true,
+};
+
+var mdnTextDecorationStyle = {
+ 'text-decoration-style': true,
+};
+
+var minmaxwh = {
+ 'min-width': true,
+ 'max-width': true,
+ 'min-height': true,
+ 'max-height': true,
+};
+
+/**
+ * @param {import('postcss').ChildNode} rule
+ * @return {boolean}
+ */
+var multibackgrounds = (rule) => {
+ if (rule.type !== 'decl') return false;
+ if (!/^background-?/.test(rule.prop)) return false;
+ return postcss.list.comma(rule.value).length > 1;
+};
+
+var multicolumn = {
+ 'columns': true,
+ 'column-width': true,
+ 'column-gap': true,
+ 'column-rule': true,
+ 'column-rule-color': true,
+ 'column-rule-width': true,
+ 'column-count': true,
+ 'column-rule-style': true,
+ 'column-span': true,
+ 'column-fill': true,
+ 'break-before': true,
+ 'break-after': true,
+ 'break-inside': true,
+};
+
+var objectFit = {
+ 'object-fit': true,
+ 'object-position': true,
+};
+
+var outline = {
+ 'outline': true,
+ 'outline-style': true,
+ 'outline-width': true,
+ 'outline-color': true,
+};
+
+var pointer = {
+ 'touch-action': true,
+};
+
+var pointerEvents = {
+ 'pointer-events': true,
+};
+
+/**
+ * prefers-color-scheme media query
+ * Media query to detect if the user has set their system to use a light or dark color theme.
+ * @see https://caniuse.com/prefers-color-scheme
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var prefersColorScheme = checkAtRule('media', 'prefers-color-scheme');
+
+/**
+ * TODO: initially implement feature
+ * prefers-reduced-motion media query
+ * CSS media query based on a user preference for preferring reduced motion (animation, etc).
+ * @see https://caniuse.com/prefers-reduced-motion
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var prefersReducedMotion = checkAtRule('media', 'prefers-reduced-motion');
+
+var rem = checkCSSLengthUnits('rem');
+
+/**
+ * display: run-in
+ * If the run-in box contains a block box, same as block. If a block box follows the run-in box, the run-in box becomes the first inline box of the block box. If an inline box follows, the run-in box becomes a block box.
+ * @see https://caniuse.com/run-in
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var runIn = {
+ 'display': 'run-in',
+};
+
+/**
+ * Scoped CSS
+ * Allows CSS rules to be scoped to part of the document, based on the position of the style element. The attribute has been [removed from the current specification](https://github.com/whatwg/html/issues/552).
+ * @see https://caniuse.com/style-scoped
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var styleScoped = {};
+
+/* this feature appears in HTML, so we don't lint it */
+
+/**
+ * SVG in CSS backgrounds
+ * Method of using SVG images as CSS backgrounds
+ * @see https://caniuse.com/svg-css
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var svgCss = (rule) => {
+ if (rule.type !== 'decl') return false;
+ if (/url\([\S\s]*svg/g.test(
+ rule.toString(),
+ )) {
+ return true;
+ }
+
+ return false;
+};
+
+var textDecoration = {
+ 'text-decoration-style': true,
+ 'text-decoration-line': true,
+ 'text-decoration-color': true,
+ 'text-decoration': /\w \w/,
+ 'text-decoration-thickness': true,
+ 'text-decoration-skip': true,
+ 'text-decoration-skip-ink': true,
+};
+
+/**
+ * text-emphasis styling
+ * Method of using small symbols next to each glyph to emphasize a run of text, commonly used in East Asian languages. The `text-emphasis` shorthand, and its `text-emphasis-style` and `text-emphasis-color` longhands, can be used to apply marks to the text. The `text-emphasis-position` property, which inherits separately, allows setting the emphasis marks' position with respect to the text.
+ * @see https://caniuse.com/text-emphasis
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var textEmphasis = {
+ 'text-emphasis': true,
+ 'text-emphasis-style': true,
+ 'text-emphasis-color': true,
+ 'text-emphasis-position': true,
+};
+
+var textOverflow = {
+ 'text-overflow': true,
+};
+
+var textSizeAdjust = {
+ 'text-size-adjust': true,
+};
+
+/**
+ * CSS text-stroke and text-fill
+ * Method of declaring the outline (stroke) width and color for text.
+ * @see https://caniuse.com/text-stroke
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var textStroke = {
+ 'text-stroke-color': true,
+ 'text-stroke-width': true,
+ 'text-stroke': true,
+ 'text-fill-color': true,
+};
+
+var transforms2d = {
+ 'transform': true,
+ 'transform-origin': true,
+};
+
+var transforms3d = {
+ 'perspective': true,
+ 'perspective-origin': true,
+ 'transform-style': true,
+ 'backface-visibility': true,
+ 'transform': '3d',
+};
+
+/**
+ * TTF/OTF - TrueType and OpenType font support
+ * Support for the TrueType (.ttf) and OpenType (.otf) outline font formats in @font-face.
+ * @see https://caniuse.com/ttf
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var ttf = (rule) => {
+ const ruleText = rule.toString();
+
+ if (ruleText.includes('@font-face') && (
+ (ruleText.includes('.ttf') || ruleText.includes('.otf'))
+ )) {
+ return true;
+ }
+
+ return false;
+};
+
+var userSelectNone = {
+ 'user-select': true,
+};
+
+/**
+ * Variable fonts
+ * OpenType font settings that allows a single font file to behave like multiple fonts: it can contain all the allowed variations in width, weight, slant, optical size, or any other exposed axes of variation as defined by the font designer. Variations can be applied via the `font-variation-settings` property.
+ * @see https://caniuse.com/variable-fonts
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var variableFonts = {
+ 'font-variation-settings': true,
+};
+
+/**
+ * Small, Large, and Dynamic viewport units
+ * Viewport units similar to `vw` and `vh` that are based on shown or hidden
+ * browser UI states to address shortcomings of the original units. Currently
+ * defined as the
+ * `sv*` units (`svb`, `svh`, `svi`, `svmax`, `svmin`, `svw`),
+ * `lv*` units (`lvb`, `lvh`, `lvi`, `lvmax`, `lvmin`, `lvw`),
+ * `dv*` units (`dvb`, `dvh`, `dvi`, `dvmax`, `dvmin`, `dvw`)
+ * and the logical `vi`/`vb` units.
+ * @see https://caniuse.com/viewport-unit-variants
+ * @type {import('../features').Feature}
+ */
+var viewportUnitVariants = checkCSSLengthUnits(
+ /* sv* units */
+ 'svb',
+ 'svh',
+ 'svi',
+ 'svmax',
+ 'svmin',
+ 'svw',
+
+ /* lv* units */
+ 'lvb',
+ 'lvh',
+ 'lvi',
+ 'lvmax',
+ 'lvmin',
+ 'lvw',
+
+ /* dv* units */
+ 'dvb',
+ 'dvh',
+ 'dvi',
+ 'dvmax',
+ 'dvmin',
+ 'dvw',
+
+ /* vi/vb units */
+ 'vi',
+ 'vb',
+);
+
+var viewportUnits = {
+ '': [
+ 'vw',
+ 'vh',
+ 'vmin',
+ 'vmax',
+ ],
+};
+
+/**
+ * CSS -webkit-user-drag property
+ * The non-standard `-webkit-user-drag` CSS property can be used to either make an element draggable or explicitly non-draggable (like links and images). See the standardized [draggable attribute/property](/mdn-api_htmlelement_draggable) for the recommended alternative method of accomplishing the same functionality.
+ * @see https://caniuse.com/webkit-user-drag
+ */
+
+/**
+ * @type {import('../features').Feature}
+ */
+var webkitUserDrag = {
+ 'webkit-user-drag': true,
+};
+
+var willChange = {
+ 'will-change': true,
+};
+
+var wordBreak = {
+ 'word-break': true,
+};
+
+var wordwrap = {
+ 'overflow-wrap': true,
+ 'word-wrap': true,
+};
+
+/* THIS FILE IS AUTOGENERATED */
+
+/** @typedef {RegExp|string|((value:string) => boolean)} FeatureCheck */
+
+/** @typedef {((rule:import('postcss').ChildNode) => boolean)} RuleCheck */
+
+/** @typedef {Record<string, FeatureCheck|FeatureCheck[]|boolean> | RuleCheck | RuleCheck[]} Feature */
+
+/** @enum {Feature} */
+const FEATURES = {
+ 'alternate-stylesheet': alternateStylesheet,
+ 'background-attachment': backgroundAttachment,
+ 'background-clip-text': backgroundClipText,
+ 'background-img-opts': backgroundImgOpts,
+ 'background-position-x-y': backgroundPositionXY,
+ 'background-repeat-round-space': backgroundRepeatRoundSpace,
+ 'border-image': borderImage,
+ 'border-radius': borderRadius,
+ 'calc': calc,
+ 'ch-unit': chUnit,
+ 'css-all': cssAll,
+ 'css-animation': cssAnimation,
+ 'css-any-link': cssAnyLink,
+ 'css-appearance': cssAppearance,
+ 'css-at-counter-style': cssAtCounterStyle,
+ 'css-autofill': cssAutofill,
+ 'css-backdrop-filter': cssBackdropFilter,
+ 'css-background-offsets': cssBackgroundOffsets,
+ 'css-backgroundblendmode': cssBackgroundblendmode,
+ 'css-boxdecorationbreak': cssBoxdecorationbreak,
+ 'css-boxshadow': cssBoxshadow,
+ 'css-canvas': cssCanvas,
+ 'css-caret-color': cssCaretColor,
+ 'css-cascade-layers': cssCascadeLayers,
+ 'css-case-insensitive': cssCaseInsensitive,
+ 'css-clip-path': cssClipPath,
+ 'css-color-adjust': cssColorAdjust,
+ 'css-color-function': cssColorFunction,
+ 'css-conic-gradients': cssConicGradients,
+ 'css-container-queries': cssContainerQueries,
+ 'css-container-queries-style': cssContainerQueriesStyle,
+ 'css-container-query-units': cssContainerQueryUnits,
+ 'css-containment': cssContainment,
+ 'css-content-visibility': cssContentVisibility,
+ 'css-counters': cssCounters,
+ 'css-crisp-edges': cssCrispEdges,
+ 'css-cross-fade': cssCrossFade,
+ 'css-default-pseudo': cssDefaultPseudo,
+ 'css-descendant-gtgt': cssDescendantGtgt,
+ 'css-deviceadaptation': cssDeviceadaptation,
+ 'css-dir-pseudo': cssDirPseudo,
+ 'css-display-contents': cssDisplayContents,
+ 'css-element-function': cssElementFunction,
+ 'css-env-function': cssEnvFunction,
+ 'css-exclusions': cssExclusions,
+ 'css-featurequeries': cssFeaturequeries,
+ 'css-file-selector-button': cssFileSelectorButton,
+ 'css-filter-function': cssFilterFunction,
+ 'css-filters': cssFilters,
+ 'css-first-letter': cssFirstLetter,
+ 'css-first-line': cssFirstLine,
+ 'css-fixed': cssFixed,
+ 'css-focus-visible': cssFocusVisible,
+ 'css-focus-within': cssFocusWithin,
+ 'css-font-palette': cssFontPalette,
+ 'css-font-rendering-controls': cssFontRenderingControls,
+ 'css-font-stretch': cssFontStretch,
+ 'css-gencontent': cssGencontent,
+ 'css-gradients': cssGradients,
+ 'css-grid': cssGrid,
+ 'css-grid-animation': cssGridAnimation,
+ 'css-hanging-punctuation': cssHangingPunctuation,
+ 'css-has': cssHas,
+ 'css-hyphens': cssHyphens,
+ 'css-image-orientation': cssImageOrientation,
+ 'css-image-set': cssImageSet,
+ 'css-in-out-of-range': cssInOutOfRange,
+ 'css-indeterminate-pseudo': cssIndeterminatePseudo,
+ 'css-initial-letter': cssInitialLetter,
+ 'css-initial-value': cssInitialValue,
+ 'css-lch-lab': cssLchLab,
+ 'css-letter-spacing': cssLetterSpacing,
+ 'css-line-clamp': cssLineClamp,
+ 'css-logical-props': cssLogicalProps,
+ 'css-marker-pseudo': cssMarkerPseudo,
+ 'css-masks': cssMasks,
+ 'css-matches-pseudo': cssMatchesPseudo,
+ 'css-math-functions': cssMathFunctions,
+ 'css-media-interaction': cssMediaInteraction,
+ 'css-media-range-syntax': cssMediaRangeSyntax,
+ 'css-media-resolution': cssMediaResolution,
+ 'css-media-scripting': cssMediaScripting,
+ 'css-mediaqueries': cssMediaqueries,
+ 'css-mixblendmode': cssMixblendmode,
+ 'css-motion-paths': cssMotionPaths,
+ 'css-namespaces': cssNamespaces,
+ 'css-nesting': cssNesting,
+ 'css-not-sel-list': cssNotSelList,
+ 'css-nth-child-of': cssNthChildOf,
+ 'css-opacity': cssOpacity,
+ 'css-optional-pseudo': cssOptionalPseudo,
+ 'css-overflow': cssOverflow,
+ 'css-overflow-anchor': cssOverflowAnchor,
+ 'css-overflow-overlay': cssOverflowOverlay,
+ 'css-overscroll-behavior': cssOverscrollBehavior,
+ 'css-page-break': cssPageBreak,
+ 'css-paged-media': cssPagedMedia,
+ 'css-paint-api': cssPaintApi,
+ 'css-placeholder': cssPlaceholder,
+ 'css-placeholder-shown': cssPlaceholderShown,
+ 'css-print-color-adjust': cssPrintColorAdjust,
+ 'css-read-only-write': cssReadOnlyWrite,
+ 'css-rebeccapurple': cssRebeccapurple,
+ 'css-reflections': cssReflections,
+ 'css-regions': cssRegions,
+ 'css-relative-colors': cssRelativeColors,
+ 'css-repeating-gradients': cssRepeatingGradients,
+ 'css-resize': cssResize,
+ 'css-revert-value': cssRevertValue,
+ 'css-rrggbbaa': cssRrggbbaa,
+ 'css-scroll-behavior': cssScrollBehavior,
+ 'css-scroll-timeline': cssScrollTimeline,
+ 'css-scrollbar': cssScrollbar,
+ 'css-sel2': cssSel2,
+ 'css-sel3': cssSel3,
+ 'css-selection': cssSelection,
+ 'css-shapes': cssShapes,
+ 'css-snappoints': cssSnappoints,
+ 'css-sticky': cssSticky,
+ 'css-subgrid': cssSubgrid,
+ 'css-supports-api': cssSupportsApi,
+ 'css-table': cssTable,
+ 'css-text-align-last': cssTextAlignLast,
+ 'css-text-box-trim': cssTextBoxTrim,
+ 'css-text-indent': cssTextIndent,
+ 'css-text-justify': cssTextJustify,
+ 'css-text-orientation': cssTextOrientation,
+ 'css-text-spacing': cssTextSpacing,
+ 'css-textshadow': cssTextshadow,
+ 'css-touch-action': cssTouchAction,
+ 'css-transitions': cssTransitions,
+ 'css-unicode-bidi': cssUnicodeBidi,
+ 'css-unset-value': cssUnsetValue,
+ 'css-variables': cssVariables,
+ 'css-when-else': cssWhenElse,
+ 'css-widows-orphans': cssWidowsOrphans,
+ 'css-width-stretch': cssWidthStretch,
+ 'css-writing-mode': cssWritingMode,
+ 'css-zoom': cssZoom,
+ 'css3-attr': css3Attr,
+ 'css3-boxsizing': css3Boxsizing,
+ 'css3-colors': css3Colors,
+ 'css3-cursors': css3Cursors,
+ 'css3-cursors-grab': css3CursorsGrab,
+ 'css3-cursors-newer': css3CursorsNewer,
+ 'css3-tabsize': css3Tabsize,
+ 'currentcolor': currentcolor,
+ 'devicepixelratio': devicepixelratio,
+ 'extended-system-fonts': extendedSystemFonts,
+ 'flexbox': flexbox,
+ 'flexbox-gap': flexboxGap,
+ 'flow-root': flowRoot,
+ 'font-family-system-ui': fontFamilySystemUi,
+ 'font-feature': fontFeature,
+ 'font-kerning': fontKerning,
+ 'font-loading': fontLoading,
+ 'font-size-adjust': fontSizeAdjust,
+ 'font-smooth': fontSmooth,
+ 'font-unicode-range': fontUnicodeRange,
+ 'font-variant-alternates': fontVariantAlternates,
+ 'font-variant-numeric': fontVariantNumeric,
+ 'fontface': fontface,
+ 'fullscreen': fullscreen,
+ 'getcomputedstyle': getcomputedstyle,
+ 'inline-block': inlineBlock,
+ 'intrinsic-width': intrinsicWidth,
+ 'justify-content-space-evenly': justifyContentSpaceEvenly,
+ 'kerning-pairs-ligatures': kerningPairsLigatures,
+ 'mdn-css-unicode-bidi-isolate': mdnCssUnicodeBidiIsolate,
+ 'mdn-css-unicode-bidi-isolate-override': mdnCssUnicodeBidiIsolateOverride,
+ 'mdn-css-unicode-bidi-plaintext': mdnCssUnicodeBidiPlaintext,
+ 'mdn-text-decoration-color': mdnTextDecorationColor,
+ 'mdn-text-decoration-line': mdnTextDecorationLine,
+ 'mdn-text-decoration-shorthand': mdnTextDecorationShorthand,
+ 'mdn-text-decoration-style': mdnTextDecorationStyle,
+ 'minmaxwh': minmaxwh,
+ 'multibackgrounds': multibackgrounds,
+ 'multicolumn': multicolumn,
+ 'object-fit': objectFit,
+ 'outline': outline,
+ 'pointer': pointer,
+ 'pointer-events': pointerEvents,
+ 'prefers-color-scheme': prefersColorScheme,
+ 'prefers-reduced-motion': prefersReducedMotion,
+ 'rem': rem,
+ 'run-in': runIn,
+ 'style-scoped': styleScoped,
+ 'svg-css': svgCss,
+ 'text-decoration': textDecoration,
+ 'text-emphasis': textEmphasis,
+ 'text-overflow': textOverflow,
+ 'text-size-adjust': textSizeAdjust,
+ 'text-stroke': textStroke,
+ 'transforms2d': transforms2d,
+ 'transforms3d': transforms3d,
+ 'ttf': ttf,
+ 'user-select-none': userSelectNone,
+ 'variable-fonts': variableFonts,
+ 'viewport-unit-variants': viewportUnitVariants,
+ 'viewport-units': viewportUnits,
+ 'webkit-user-drag': webkitUserDrag,
+ 'will-change': willChange,
+ 'word-break': wordBreak,
+ 'wordwrap': wordwrap,
+};
+
+/**
+ * @template T
+ * @typedef {{missing: T, partial: T}} Filter
+ */
+
+/**
+ * @typedef {Object} MissingSupportResultStats
+ * @prop {string} title
+ * @prop {caniuse.Feature} caniuseData
+ * @prop {string} [missing]
+ * @prop {Record<string, Record<string, string>>} [missingData]
+ * @prop {string} [partial]
+ * @prop {Record<string, Record<string, string>>} [partialData]
+ */
+
+/**
+ * @typedef {Partial<Record<keyof FEATURES, MissingSupportResultStats>>} BrowserSupportStats
+ */
+
+/**
+ * @typedef {Object} MissingSupportResult
+ * @prop {string[][]} browsers
+ * @prop {Partial<Record<keyof FEATURES, MissingSupportResultStats>>} features
+ */
+
+class BrowserSelection {
+ #list;
+
+ /**
+ * @param {string | string[]} [query]
+ * @param {string | false} [from]
+ */
+ constructor(query, from) {
+ this.browsersRequest = query;
+ const options = from ? { path: from } : {};
+ this.#list = browserslist__default["default"](this.browsersRequest, options).map((browser) => browser.split(' '));
+ }
+
+ /**
+ * @param {string} browser
+ * @param {string} version
+ * @return {string[]|undefined}
+ */
+ test(browser, version) {
+ const versions = version.split('-');
+
+ if (versions.length === 1) {
+ versions.push(versions[0]);
+ }
+
+ return this.#list.find(([b, v]) => b === browser && v >= versions[0] && v <= versions[1]);
+ }
+
+ list() {
+ return [...this.#list];
+ }
+
+ /**
+ * @param {Record<string, Record<string, string>>} browserStats
+ * @return {string}
+ */
+ static lackingBrowsers(browserStats) {
+ const result = [];
+ for (const browser of Object.keys(browserStats)) {
+ result.push(formatBrowserName(browser, Object.keys(browserStats[browser])));
+ }
+ return result.join(', ');
+ }
+
+ /**
+ * @param {import('caniuse-lite').StatsByAgentID} stats
+ * @return {Filter<Record<string,Record<string, string>>>}
+ */
+ filterStats(stats) {
+ /** @type {Filter<Record<string,Record<string, string>>>} */
+ const result = { missing: {}, partial: {} };
+ for (const [browser, versions] of Object.entries(stats)) {
+ /** @type {Filter<Record<string,string>>} */
+ const feature = { missing: {}, partial: {} };
+ for (const [version, support] of Object.entries(versions)) {
+ const selected = this.test(browser, version);
+
+ // check if browser is NOT fully (i.e., don't have 'y' in their stats) supported
+ if (!selected) continue;
+ if ((/(^|\s)y($|\s)/.test(support))) continue;
+ // when it's not partially supported ('a'), it's missing
+ const type = (/(^|\s)a($|\s)/.test(support) ? 'partial' : 'missing');
+
+ if (!feature[type]) {
+ feature[type] = {};
+ }
+
+ feature[type][selected[1]] = support;
+ }
+ if (Object.keys(feature.missing).length > 0) {
+ result.missing[browser] = feature.missing;
+ }
+
+ if (Object.keys(feature.partial).length > 0) {
+ result.partial[browser] = feature.partial;
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Get data on CSS features not supported by the given autoprefixer-like
+ * browser selection.
+ * @return {BrowserSupportStats} `features` is an array of:
+ * ```
+ * {
+ * 'feature-name': {
+ * title: 'Title of feature'
+ * missing: "IE (8), Chrome (31)"
+ * missingData: {
+ * // map of browser -> version -> (lack of)support code
+ * ie: { '8': 'n' },
+ * chrome: { '31': 'n' }
+ * }
+ * partialData: {
+ * // map of browser -> version -> (partial)support code
+ * ie: { '7': 'a' },
+ * ff: { '29': 'a #1' }
+ * }
+ * caniuseData: {
+ * // caniuse-db json data for this feature
+ * }
+ * },
+ * 'feature-name-2': {} // etc.
+ * }
+ * ```
+ *
+ * `feature-name` is a caniuse-db slug.
+ */
+ compileBrowserSupport() {
+ /** @type {Partial<Record<keyof FEATURES, MissingSupportResultStats>>} */
+ const result = {};
+
+ for (const key of Object.keys(FEATURES)) {
+ const feature = /** @type {keyof FEATURES} */ (key);
+ const packedFeature = caniuse__namespace.features[feature];
+ const featureData = caniuse__namespace.feature(packedFeature);
+ const lackData = this.filterStats(featureData.stats);
+ const missingData = lackData.missing;
+ const partialData = lackData.partial;
+ // browsers with missing or partial support for this feature
+ const missing = BrowserSelection.lackingBrowsers(missingData);
+ const partial = BrowserSelection.lackingBrowsers(partialData);
+
+ if (missing.length > 0 || partial.length > 0) {
+ result[feature] = {
+ title: featureData.title,
+ caniuseData: featureData,
+ ...(missing.length > 0 ? { missingData, missing } : null),
+ ...(partial.length > 0 ? { partialData, partial } : null),
+ };
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * @see BrowserSelection.compileBrowserSupport
+ * @param {ConstructorParameters<typeof this>} constructorParameters
+ * @return {MissingSupportResult} `{browsers, features}`
+ */
+ static missingSupport(...constructorParameters) {
+ const selection = new BrowserSelection(...constructorParameters);
+ return {
+ browsers: selection.list(),
+ features: selection.compileBrowserSupport(),
+ };
+ }
+}
+
+/**
+ * @typedef DetectorCallbackArgument
+ * @prop {!import('postcss').ChildNode} usage
+ * @prop {keyof FEATURES} feature
+ * @prop {(keyof FEATURES & string)[]} ignore
+ */
+
+/**
+ * @callback DetectorCallback
+ * @param {DetectorCallbackArgument} result
+ * @return {any}
+ */
+
+const PLUGIN_OPTION_COMMENT = 'doiuse-';
+const DISABLE_FEATURE_COMMENT = `${PLUGIN_OPTION_COMMENT}disable`;
+const ENABLE_FEATURE_COMMENT = `${PLUGIN_OPTION_COMMENT}enable`;
+
+/**
+ * Strip the contents of url literals so they aren't matched
+ * by our naive substring matching.
+ * @param {string} input
+ * @return {string}
+ */
+function stripUrls(input) {
+ return input.replaceAll(/url\([^)]*\)/g, 'url()');
+}
+
+/**
+ * Detect the use of any of a given list of CSS features.
+ * ```
+ * var detector = new Detector(featureList)
+ * detector.process(css, cb)
+ * ```
+ *
+ * `featureList`: an array of feature slugs (see caniuse-db)
+ * `cb`: a callback that gets called for each usage of one of the given features,
+ * called with an argument like:
+ * ```
+ * {
+ * usage: {} // postcss node where usage was found
+ * feature: {} // caniuse-db feature slug
+ * ignore: {} // caniuse-db feature to ignore in current file
+ * }
+ * ```
+ */
+class Detector {
+ /**
+ * @param {(keyof FEATURES & string)[]} featureList an array of feature slugs (see caniuse-db)
+ */
+ constructor(featureList) {
+ /** @type {Partial<FEATURES>} */
+ this.features = {};
+ for (const feature of featureList) {
+ if (FEATURES[feature]) {
+ this.features[feature] = FEATURES[feature];
+ }
+ }
+ /** @type {(keyof FEATURES & string)[]} */
+ this.ignore = [];
+ }
+
+ /**
+ * @param {import('postcss').Comment} comment
+ * @return {void}
+ */
+ comment(comment) {
+ const text = comment.text.toLowerCase();
+
+ if (!text.startsWith(PLUGIN_OPTION_COMMENT)) return;
+ const option = text.split(' ', 1)[0];
+ const value = text.replace(option, '').trim();
+
+ switch (option) {
+ case DISABLE_FEATURE_COMMENT: {
+ if (value === '') {
+ // @ts-expect-error Skip cast
+ this.ignore = Object.keys(this.features);
+ } else {
+ for (const feat of value.split(',')) {
+ /** @type {any} */
+ const f = feat.trim();
+ if (!this.ignore.includes(f)) {
+ this.ignore.push(f);
+ }
+ }
+ }
+ break;
+ }
+ case ENABLE_FEATURE_COMMENT: {
+ if (value === '') {
+ this.ignore = [];
+ } else {
+ const without = new Set(value.split(',').map((feat) => feat.trim()));
+ this.ignore = this.ignore.filter((index) => !without.has(index));
+ }
+ break;
+ }
+ }
+ }
+
+ /**
+ * @param {import('postcss').Container} node
+ * @param {DetectorCallback} callback
+ * @return {void}
+ */
+ node(node, callback) {
+ node.each((child) => {
+ if (child.type === 'comment') {
+ this.comment(child);
+ return;
+ }
+
+ for (const [feat] of Object.entries(this.features).filter(([, featValue]) => {
+ if (!featValue) return false;
+ if (typeof featValue === 'function') {
+ return featValue(child);
+ }
+ if (Array.isArray(featValue)) {
+ return featValue.some((function_) => function_(child));
+ }
+ if (child.type !== 'decl') {
+ return false;
+ }
+
+ return Object.entries(featValue).some(([property, value]) => {
+ if (property !== '' && property !== child.prop) return false;
+ if (value === true) return true;
+ if (value === false) return false;
+ return performFeatureCheck(value, stripUrls(child.value));
+ });
+ })) {
+ const feature = /** @type {keyof FEATURES} */ (feat);
+ callback({ usage: child, feature, ignore: this.ignore });
+ }
+ if (child.type !== 'decl') {
+ this.node(child, callback);
+ }
+ });
+ }
+
+ /**
+ * @param {import('postcss').Root} node
+ * @param {DetectorCallback} callback
+ * @return {void}
+ */
+ process(node, callback) {
+ // Reset ignoring rules specified by inline comments per each file
+ this.ignore = [];
+
+ // Recursively walk nodes in file
+ this.node(node, callback);
+ }
+}
+
+/** @typedef {import('../data/features.js').FeatureKeys} FeatureKeys */
+
+/**
+ * @typedef {Object} OnFeatureUsageArguments
+ * @prop {FeatureKeys} feature
+ * @prop {import('./BrowserSelection.js').MissingSupportResultStats|undefined} featureData
+ * @prop {import('postcss').Node} usage
+ * @prop {string} message
+ */
+
+/**
+ * @callback OnFeatureUsage
+ * @param {OnFeatureUsageArguments} result
+ * @return {any}
+ */
+
+/**
+ * @typedef {Object} DoIUseOptions
+ * @prop {ConstructorParameters<typeof BrowserSelection>[0]} [browsers]
+ * @prop {FeatureKeys[]} [ignore]
+ * @prop {OnFeatureUsage} [onFeatureUsage]
+ * @prop {string[]} [ignoreFiles]
+ */
+
+class DoIUse {
+ static default = null;
+
+ /**
+ * @param {DoIUseOptions} [optionsOrBrowserQuery]
+ */
+ constructor(optionsOrBrowserQuery) {
+ const options = (typeof optionsOrBrowserQuery === 'string')
+ ? { browsers: optionsOrBrowserQuery }
+ : { ...optionsOrBrowserQuery };
+ this.browserQuery = options.browsers;
+ this.onFeatureUsage = options.onFeatureUsage;
+ this.ignoreOptions = options.ignore;
+ this.ignoreFiles = options.ignoreFiles;
+ this.info = this.info.bind(this);
+ this.postcss = this.postcss.bind(this);
+ }
+
+ /**
+ * @param {Object} [options]
+ * @param {ConstructorParameters<typeof BrowserSelection>[1]} [options.from]
+ */
+ info(options = {}) {
+ const { browsers, features } = BrowserSelection.missingSupport(this.browserQuery, options.from);
+
+ return {
+ browsers,
+ features,
+ };
+ }
+
+ /** @type {import('postcss').TransformCallback} */
+ postcss(css, result) {
+ let from;
+ if (css.source && css.source.input) {
+ from = css.source.input.file;
+ }
+ const { features } = BrowserSelection.missingSupport(this.browserQuery, from);
+ // @ts-expect-error Needs cast
+ const detector = new Detector(Object.keys(features));
+
+ return detector.process(css, ({ feature, usage, ignore }) => {
+ if (ignore && ignore.includes(feature)) {
+ return;
+ }
+
+ if (this.ignoreOptions && this.ignoreOptions.includes(feature)) {
+ return;
+ }
+
+ if (!usage.source) {
+ throw new Error('No source?');
+ }
+ if (this.ignoreFiles && multimatch__default["default"](usage.source.input.from, this.ignoreFiles).length > 0) {
+ return;
+ }
+
+ const data = features[feature];
+ if (!data) {
+ throw new Error('No feature data?');
+ }
+ const messages = [];
+ if (data.missing) {
+ messages.push(`not supported by: ${data.missing}`);
+ }
+ if (data.partial) {
+ messages.push(`only partially supported by: ${data.partial}`);
+ }
+
+ let message = `${data.title} ${messages.join(' and ')} (${feature})`;
+
+ result.warn(message, { node: usage, plugin: 'doiuse' });
+
+ if (this.onFeatureUsage) {
+ if (!usage.source) {
+ throw new Error('No usage source?');
+ }
+ const { start, input } = usage.source;
+ if (!start) {
+ throw new Error('No usage source start?');
+ }
+
+ const map = css.source && css.source.input.map;
+ const mappedStart = map && map.consumer().originalPositionFor(start);
+
+ const file = (mappedStart && mappedStart.source) || input.file || input.from;
+ const line = (mappedStart && mappedStart.line) || start.line;
+ const column = (mappedStart && mappedStart.column) || start.column;
+
+ message = `${file}:${line}:${column}: ${message}`;
+
+ this.onFeatureUsage({
+ feature,
+ featureData: features[feature],
+ usage,
+ message,
+ });
+ }
+ });
+ }
+}
+
+/* eslint-disable no-underscore-dangle */
+
+/** @typedef {import('../../data/features.js').FeatureKeys} FeatureKeys */
+/** @typedef {import('./SourceMapTransform.js').SourceMapTransformation} SourceMapTransformation */
+
+class RuleUsageTransform extends node_stream.Transform {
+ /** @type {import("postcss").Processor} */
+ #processor;
+
+ #skipErrors;
+
+ #filename;
+
+ /**
+ * @param {Object} options
+ * @param {string} options.browsers
+ * @param {FeatureKeys[]} [options.ignore]
+ * @param {boolean} [options.skipErrors]
+ * @param {string} [filename] Filename for outputting source code locations.
+ */
+ constructor(options, filename = '<streaming css input>') {
+ super({
+ objectMode: true,
+ });
+ this.#processor = postcss__default["default"]([new DoIUse({
+ browsers: options.browsers,
+ ignore: options.ignore,
+ onFeatureUsage: (usage) => {
+ this.push(usage);
+ },
+ })]);
+ this.#filename = filename;
+ this.#skipErrors = options.skipErrors;
+ }
+
+ /**
+ * @param {SourceMapTransformation} rule
+ * @param {any} encoding
+ * @param {Function} callback
+ */
+ async _transform(rule, encoding, callback) {
+ let caughtError;
+ try {
+ const mapper = new sourcemap__default["default"].SourceMapGenerator();
+ const lines = rule.content.split('\n');
+ let oline = rule.line;
+ let ocol = rule.column;
+ for (const [lineNumber, content] of lines.entries()) {
+ mapper.addMapping({
+ generated: { line: lineNumber + 1, column: 1 },
+ original: { line: oline, column: ocol },
+ source: this.#filename,
+ });
+ mapper.addMapping({
+ generated: { line: lineNumber + 1, column: content.length },
+ original: { line: oline, column: ocol + content.length },
+ source: this.#filename,
+ });
+ oline += 1;
+ ocol = 1;
+ }
+ await this.#processor.process(rule.content, {
+ from: this.#filename, map: { prev: mapper.toString() },
+ });
+ } catch (error) {
+ if (this.#skipErrors) {
+ this.emit('warning', error);
+ } else {
+ caughtError = error;
+ }
+ }
+ callback(caughtError);
+ }
+}
+
+/* eslint-disable no-underscore-dangle */
+
+const NEW_LINE_CHAR = '\n'.codePointAt(0);
+
+/**
+ * @typedef {Object} SourceMapTransformation
+ * @prop {number} line
+ * @prop {number} column
+ * @prop {string} content
+ */
+
+class SourceMapTransform extends node_stream.Transform {
+ constructor() {
+ super({ objectMode: true });
+ }
+
+ /**
+ * @type {?{location:[number,number], buffers: Buffer[]}}
+ * buffer for the current incoming rule.
+ */
+ #current = null;
+
+ /** track depth to handle rules nested in at-rules. */
+ #depth = 0;
+
+ /** track this and pass it downstream for source mapping. */
+ #line = 1;
+
+ /** track this and pass it downstream for source mapping. */
+ #column = 1;
+
+ /**
+ * @param {[string,Buffer]} chunk
+ * @param {any} encoding
+ * @param {Function} callback
+ */
+ _transform([type, buf], encoding, callback) {
+ if ((type === 'rule_start' || type === 'atrule_start')) {
+ this.#depth += 1;
+ }
+ if (this.#depth > 0 && !this.#current) {
+ this.#current = { location: [this.#line, this.#column], buffers: [] };
+ }
+ if (type === 'rule_end' || type === 'atrule_end') {
+ this.#depth -= 1;
+ }
+
+ if (this.#current) {
+ this.#current.buffers.push(buf);
+ if (this.#depth === 0) {
+ // Push rule
+ this.push({
+ line: this.#current.location[0],
+ column: this.#current.location[1],
+ content: Buffer.concat(this.#current.buffers).toString(),
+ });
+ this.#current = null;
+ }
+ }
+
+ // Update position
+ for (const char of buf) {
+ if (char === NEW_LINE_CHAR) {
+ this.#line += 1;
+ this.#column = 1;
+ } else {
+ this.#column += 1;
+ }
+ }
+
+ callback();
+ }
+}
+
+/* eslint-disable no-underscore-dangle */
+
+/** @typedef {import('../../data/features.js').FeatureKeys} FeatureKeys */
+
+class CssUsageDuplex extends Duplexify__default["default"] {
+ /**
+ * @param {Object} options
+ * @param {string} options.browsers
+ * @param {FeatureKeys[]} [options.ignore]
+ * @param {boolean} [options.skipErrors]
+ * @param {string} [filename] Filename for outputting source code locations.
+ */
+ constructor(options, filename) {
+ const streams = [
+ new Tokenize__default["default"](),
+ new SourceMapTransform(),
+ new RuleUsageTransform(options, filename),
+ ];
+ node_stream.pipeline(
+ // @ts-expect-error Bad typings
+ ...streams,
+ () => {
+ // noop (Error handled by Duplexify)
+ },
+ );
+ super(streams[0], streams.at(-1), { objectMode: true });
+ }
+}
+
+/**
+ * @param {ConstructorParameters<typeof CssUsageDuplex>} options
+ * @return {CssUsageDuplex}
+ */
+function index(...options) {
+ return new CssUsageDuplex(...options);
+}
+
+module.exports = index;
diff --git a/node_modules/doiuse/exports/stream.js b/node_modules/doiuse/exports/stream.js
new file mode 100644
index 00000000..fecaefac
--- /dev/null
+++ b/node_modules/doiuse/exports/stream.js
@@ -0,0 +1,9 @@
+import CssUsageDuplex from '../lib/stream/CssUsageDuplex.js';
+
+/**
+ * @param {ConstructorParameters<typeof CssUsageDuplex>} options
+ * @return {CssUsageDuplex}
+ */
+export default function index(...options) {
+ return new CssUsageDuplex(...options);
+}
diff --git a/node_modules/doiuse/lib/BrowserSelection.js b/node_modules/doiuse/lib/BrowserSelection.js
new file mode 100644
index 00000000..17467548
--- /dev/null
+++ b/node_modules/doiuse/lib/BrowserSelection.js
@@ -0,0 +1,181 @@
+import browserslist from 'browserslist';
+import * as caniuse from 'caniuse-lite';
+
+import FEATURES from '../data/features.js';
+import { formatBrowserName } from '../utils/util.js';
+
+/**
+ * @template T
+ * @typedef {{missing: T, partial: T}} Filter
+ */
+
+/**
+ * @typedef {Object} MissingSupportResultStats
+ * @prop {string} title
+ * @prop {caniuse.Feature} caniuseData
+ * @prop {string} [missing]
+ * @prop {Record<string, Record<string, string>>} [missingData]
+ * @prop {string} [partial]
+ * @prop {Record<string, Record<string, string>>} [partialData]
+ */
+
+/**
+ * @typedef {Partial<Record<keyof FEATURES, MissingSupportResultStats>>} BrowserSupportStats
+ */
+
+/**
+ * @typedef {Object} MissingSupportResult
+ * @prop {string[][]} browsers
+ * @prop {Partial<Record<keyof FEATURES, MissingSupportResultStats>>} features
+ */
+
+export default class BrowserSelection {
+ #list;
+
+ /**
+ * @param {string | string[]} [query]
+ * @param {string | false} [from]
+ */
+ constructor(query, from) {
+ this.browsersRequest = query;
+ const options = from ? { path: from } : {};
+ this.#list = browserslist(this.browsersRequest, options).map((browser) => browser.split(' '));
+ }
+
+ /**
+ * @param {string} browser
+ * @param {string} version
+ * @return {string[]|undefined}
+ */
+ test(browser, version) {
+ const versions = version.split('-');
+
+ if (versions.length === 1) {
+ versions.push(versions[0]);
+ }
+
+ return this.#list.find(([b, v]) => b === browser && v >= versions[0] && v <= versions[1]);
+ }
+
+ list() {
+ return [...this.#list];
+ }
+
+ /**
+ * @param {Record<string, Record<string, string>>} browserStats
+ * @return {string}
+ */
+ static lackingBrowsers(browserStats) {
+ const result = [];
+ for (const browser of Object.keys(browserStats)) {
+ result.push(formatBrowserName(browser, Object.keys(browserStats[browser])));
+ }
+ return result.join(', ');
+ }
+
+ /**
+ * @param {import('caniuse-lite').StatsByAgentID} stats
+ * @return {Filter<Record<string,Record<string, string>>>}
+ */
+ filterStats(stats) {
+ /** @type {Filter<Record<string,Record<string, string>>>} */
+ const result = { missing: {}, partial: {} };
+ for (const [browser, versions] of Object.entries(stats)) {
+ /** @type {Filter<Record<string,string>>} */
+ const feature = { missing: {}, partial: {} };
+ for (const [version, support] of Object.entries(versions)) {
+ const selected = this.test(browser, version);
+
+ // check if browser is NOT fully (i.e., don't have 'y' in their stats) supported
+ if (!selected) continue;
+ if ((/(^|\s)y($|\s)/.test(support))) continue;
+ // when it's not partially supported ('a'), it's missing
+ const type = (/(^|\s)a($|\s)/.test(support) ? 'partial' : 'missing');
+
+ if (!feature[type]) {
+ feature[type] = {};
+ }
+
+ feature[type][selected[1]] = support;
+ }
+ if (Object.keys(feature.missing).length > 0) {
+ result.missing[browser] = feature.missing;
+ }
+
+ if (Object.keys(feature.partial).length > 0) {
+ result.partial[browser] = feature.partial;
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Get data on CSS features not supported by the given autoprefixer-like
+ * browser selection.
+ * @return {BrowserSupportStats} `features` is an array of:
+ * ```
+ * {
+ * 'feature-name': {
+ * title: 'Title of feature'
+ * missing: "IE (8), Chrome (31)"
+ * missingData: {
+ * // map of browser -> version -> (lack of)support code
+ * ie: { '8': 'n' },
+ * chrome: { '31': 'n' }
+ * }
+ * partialData: {
+ * // map of browser -> version -> (partial)support code
+ * ie: { '7': 'a' },
+ * ff: { '29': 'a #1' }
+ * }
+ * caniuseData: {
+ * // caniuse-db json data for this feature
+ * }
+ * },
+ * 'feature-name-2': {} // etc.
+ * }
+ * ```
+ *
+ * `feature-name` is a caniuse-db slug.
+ */
+ compileBrowserSupport() {
+ /** @type {Partial<Record<keyof FEATURES, MissingSupportResultStats>>} */
+ const result = {};
+
+ for (const key of Object.keys(FEATURES)) {
+ const feature = /** @type {keyof FEATURES} */ (key);
+ const packedFeature = caniuse.features[feature];
+ const featureData = caniuse.feature(packedFeature);
+ const lackData = this.filterStats(featureData.stats);
+ const missingData = lackData.missing;
+ const partialData = lackData.partial;
+ // browsers with missing or partial support for this feature
+ const missing = BrowserSelection.lackingBrowsers(missingData);
+ const partial = BrowserSelection.lackingBrowsers(partialData);
+
+ if (missing.length > 0 || partial.length > 0) {
+ result[feature] = {
+ title: featureData.title,
+ caniuseData: featureData,
+ ...(missing.length > 0 ? { missingData, missing } : null),
+ ...(partial.length > 0 ? { partialData, partial } : null),
+ };
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * @see BrowserSelection.compileBrowserSupport
+ * @param {ConstructorParameters<typeof this>} constructorParameters
+ * @return {MissingSupportResult} `{browsers, features}`
+ */
+ static missingSupport(...constructorParameters) {
+ const selection = new BrowserSelection(...constructorParameters);
+ return {
+ browsers: selection.list(),
+ features: selection.compileBrowserSupport(),
+ };
+ }
+}
diff --git a/node_modules/doiuse/lib/Detector.js b/node_modules/doiuse/lib/Detector.js
new file mode 100644
index 00000000..2858bca9
--- /dev/null
+++ b/node_modules/doiuse/lib/Detector.js
@@ -0,0 +1,157 @@
+import FEATURES from '../data/features.js';
+import { performFeatureCheck } from '../utils/util.js';
+
+/**
+ * @typedef DetectorCallbackArgument
+ * @prop {!import('postcss').ChildNode} usage
+ * @prop {keyof FEATURES} feature
+ * @prop {(keyof FEATURES & string)[]} ignore
+ */
+
+/**
+ * @callback DetectorCallback
+ * @param {DetectorCallbackArgument} result
+ * @return {any}
+ */
+
+const PLUGIN_OPTION_COMMENT = 'doiuse-';
+const DISABLE_FEATURE_COMMENT = `${PLUGIN_OPTION_COMMENT}disable`;
+const ENABLE_FEATURE_COMMENT = `${PLUGIN_OPTION_COMMENT}enable`;
+
+/**
+ * Strip the contents of url literals so they aren't matched
+ * by our naive substring matching.
+ * @param {string} input
+ * @return {string}
+ */
+function stripUrls(input) {
+ return input.replaceAll(/url\([^)]*\)/g, 'url()');
+}
+
+/**
+ * Detect the use of any of a given list of CSS features.
+ * ```
+ * var detector = new Detector(featureList)
+ * detector.process(css, cb)
+ * ```
+ *
+ * `featureList`: an array of feature slugs (see caniuse-db)
+ * `cb`: a callback that gets called for each usage of one of the given features,
+ * called with an argument like:
+ * ```
+ * {
+ * usage: {} // postcss node where usage was found
+ * feature: {} // caniuse-db feature slug
+ * ignore: {} // caniuse-db feature to ignore in current file
+ * }
+ * ```
+ */
+export default class Detector {
+ /**
+ * @param {(keyof FEATURES & string)[]} featureList an array of feature slugs (see caniuse-db)
+ */
+ constructor(featureList) {
+ /** @type {Partial<FEATURES>} */
+ this.features = {};
+ for (const feature of featureList) {
+ if (FEATURES[feature]) {
+ this.features[feature] = FEATURES[feature];
+ }
+ }
+ /** @type {(keyof FEATURES & string)[]} */
+ this.ignore = [];
+ }
+
+ /**
+ * @param {import('postcss').Comment} comment
+ * @return {void}
+ */
+ comment(comment) {
+ const text = comment.text.toLowerCase();
+
+ if (!text.startsWith(PLUGIN_OPTION_COMMENT)) return;
+ const option = text.split(' ', 1)[0];
+ const value = text.replace(option, '').trim();
+
+ switch (option) {
+ case DISABLE_FEATURE_COMMENT: {
+ if (value === '') {
+ // @ts-expect-error Skip cast
+ this.ignore = Object.keys(this.features);
+ } else {
+ for (const feat of value.split(',')) {
+ /** @type {any} */
+ const f = feat.trim();
+ if (!this.ignore.includes(f)) {
+ this.ignore.push(f);
+ }
+ }
+ }
+ break;
+ }
+ case ENABLE_FEATURE_COMMENT: {
+ if (value === '') {
+ this.ignore = [];
+ } else {
+ const without = new Set(value.split(',').map((feat) => feat.trim()));
+ this.ignore = this.ignore.filter((index) => !without.has(index));
+ }
+ break;
+ }
+ default:
+ }
+ }
+
+ /**
+ * @param {import('postcss').Container} node
+ * @param {DetectorCallback} callback
+ * @return {void}
+ */
+ node(node, callback) {
+ node.each((child) => {
+ if (child.type === 'comment') {
+ this.comment(child);
+ return;
+ }
+
+ for (const [feat] of Object.entries(this.features).filter(([, featValue]) => {
+ if (!featValue) return false;
+ if (typeof featValue === 'function') {
+ return featValue(child);
+ }
+ if (Array.isArray(featValue)) {
+ return featValue.some((function_) => function_(child));
+ }
+ if (child.type !== 'decl') {
+ return false;
+ }
+
+ return Object.entries(featValue).some(([property, value]) => {
+ if (property !== '' && property !== child.prop) return false;
+ if (value === true) return true;
+ if (value === false) return false;
+ return performFeatureCheck(value, stripUrls(child.value));
+ });
+ })) {
+ const feature = /** @type {keyof FEATURES} */ (feat);
+ callback({ usage: child, feature, ignore: this.ignore });
+ }
+ if (child.type !== 'decl') {
+ this.node(child, callback);
+ }
+ });
+ }
+
+ /**
+ * @param {import('postcss').Root} node
+ * @param {DetectorCallback} callback
+ * @return {void}
+ */
+ process(node, callback) {
+ // Reset ignoring rules specified by inline comments per each file
+ this.ignore = [];
+
+ // Recursively walk nodes in file
+ this.node(node, callback);
+ }
+}
diff --git a/node_modules/doiuse/lib/DoIUse.js b/node_modules/doiuse/lib/DoIUse.js
new file mode 100644
index 00000000..78db53c8
--- /dev/null
+++ b/node_modules/doiuse/lib/DoIUse.js
@@ -0,0 +1,130 @@
+import multimatch from 'multimatch';
+
+import BrowserSelection from './BrowserSelection.js';
+import Detector from './Detector.js';
+
+/** @typedef {import('../data/features.js').FeatureKeys} FeatureKeys */
+
+/**
+ * @typedef {Object} OnFeatureUsageArguments
+ * @prop {FeatureKeys} feature
+ * @prop {import('./BrowserSelection.js').MissingSupportResultStats|undefined} featureData
+ * @prop {import('postcss').Node} usage
+ * @prop {string} message
+ */
+
+/**
+ * @callback OnFeatureUsage
+ * @param {OnFeatureUsageArguments} result
+ * @return {any}
+ */
+
+/**
+ * @typedef {Object} DoIUseOptions
+ * @prop {ConstructorParameters<typeof BrowserSelection>[0]} [browsers]
+ * @prop {FeatureKeys[]} [ignore]
+ * @prop {OnFeatureUsage} [onFeatureUsage]
+ * @prop {string[]} [ignoreFiles]
+ */
+
+export default class DoIUse {
+ static default = null;
+
+ /**
+ * @param {DoIUseOptions} [optionsOrBrowserQuery]
+ */
+ constructor(optionsOrBrowserQuery) {
+ const options = (typeof optionsOrBrowserQuery === 'string')
+ ? { browsers: optionsOrBrowserQuery }
+ : { ...optionsOrBrowserQuery };
+ this.browserQuery = options.browsers;
+ this.onFeatureUsage = options.onFeatureUsage;
+ this.ignoreOptions = options.ignore;
+ this.ignoreFiles = options.ignoreFiles;
+ this.info = this.info.bind(this);
+ this.postcss = this.postcss.bind(this);
+ }
+
+ /**
+ * @param {Object} [options]
+ * @param {ConstructorParameters<typeof BrowserSelection>[1]} [options.from]
+ */
+ info(options = {}) {
+ const { browsers, features } = BrowserSelection.missingSupport(this.browserQuery, options.from);
+
+ return {
+ browsers,
+ features,
+ };
+ }
+
+ /** @type {import('postcss').TransformCallback} */
+ postcss(css, result) {
+ let from;
+ if (css.source && css.source.input) {
+ from = css.source.input.file;
+ }
+ const { features } = BrowserSelection.missingSupport(this.browserQuery, from);
+ // @ts-expect-error Needs cast
+ const detector = new Detector(Object.keys(features));
+
+ return detector.process(css, ({ feature, usage, ignore }) => {
+ if (ignore && ignore.includes(feature)) {
+ return;
+ }
+
+ if (this.ignoreOptions && this.ignoreOptions.includes(feature)) {
+ return;
+ }
+
+ if (!usage.source) {
+ throw new Error('No source?');
+ }
+ if (this.ignoreFiles && multimatch(usage.source.input.from, this.ignoreFiles).length > 0) {
+ return;
+ }
+
+ const data = features[feature];
+ if (!data) {
+ throw new Error('No feature data?');
+ }
+ const messages = [];
+ if (data.missing) {
+ messages.push(`not supported by: ${data.missing}`);
+ }
+ if (data.partial) {
+ messages.push(`only partially supported by: ${data.partial}`);
+ }
+
+ let message = `${data.title} ${messages.join(' and ')} (${feature})`;
+
+ result.warn(message, { node: usage, plugin: 'doiuse' });
+
+ if (this.onFeatureUsage) {
+ if (!usage.source) {
+ throw new Error('No usage source?');
+ }
+ const { start, input } = usage.source;
+ if (!start) {
+ throw new Error('No usage source start?');
+ }
+
+ const map = css.source && css.source.input.map;
+ const mappedStart = map && map.consumer().originalPositionFor(start);
+
+ const file = (mappedStart && mappedStart.source) || input.file || input.from;
+ const line = (mappedStart && mappedStart.line) || start.line;
+ const column = (mappedStart && mappedStart.column) || start.column;
+
+ message = `${file}:${line}:${column}: ${message}`;
+
+ this.onFeatureUsage({
+ feature,
+ featureData: features[feature],
+ usage,
+ message,
+ });
+ }
+ });
+ }
+}
diff --git a/node_modules/doiuse/lib/stream/CssUsageDuplex.js b/node_modules/doiuse/lib/stream/CssUsageDuplex.js
new file mode 100644
index 00000000..063ed1dc
--- /dev/null
+++ b/node_modules/doiuse/lib/stream/CssUsageDuplex.js
@@ -0,0 +1,36 @@
+/* eslint-disable no-underscore-dangle */
+
+import { pipeline } from 'node:stream';
+
+import Tokenize from 'css-tokenize';
+import Duplexify from 'duplexify';
+
+import RuleUsageTransform from './RuleUsageTransform.js';
+import SourceMapTransform from './SourceMapTransform.js';
+
+/** @typedef {import('../../data/features.js').FeatureKeys} FeatureKeys */
+
+export default class CssUsageDuplex extends Duplexify {
+ /**
+ * @param {Object} options
+ * @param {string} options.browsers
+ * @param {FeatureKeys[]} [options.ignore]
+ * @param {boolean} [options.skipErrors]
+ * @param {string} [filename] Filename for outputting source code locations.
+ */
+ constructor(options, filename) {
+ const streams = [
+ new Tokenize(),
+ new SourceMapTransform(),
+ new RuleUsageTransform(options, filename),
+ ];
+ pipeline(
+ // @ts-expect-error Bad typings
+ ...streams,
+ () => {
+ // noop (Error handled by Duplexify)
+ },
+ );
+ super(streams[0], streams.at(-1), { objectMode: true });
+ }
+}
diff --git a/node_modules/doiuse/lib/stream/RuleUsageTransform.js b/node_modules/doiuse/lib/stream/RuleUsageTransform.js
new file mode 100644
index 00000000..a2a79d4d
--- /dev/null
+++ b/node_modules/doiuse/lib/stream/RuleUsageTransform.js
@@ -0,0 +1,80 @@
+/* eslint-disable no-underscore-dangle */
+import { Transform } from 'node:stream';
+
+import postcss from 'postcss';
+import sourcemap from 'source-map';
+
+import DoIUse from '../DoIUse.js';
+
+/** @typedef {import('../../data/features.js').FeatureKeys} FeatureKeys */
+/** @typedef {import('./SourceMapTransform.js').SourceMapTransformation} SourceMapTransformation */
+
+export default class RuleUsageTransform extends Transform {
+ /** @type {import("postcss").Processor} */
+ #processor;
+
+ #skipErrors;
+
+ #filename;
+
+ /**
+ * @param {Object} options
+ * @param {string} options.browsers
+ * @param {FeatureKeys[]} [options.ignore]
+ * @param {boolean} [options.skipErrors]
+ * @param {string} [filename] Filename for outputting source code locations.
+ */
+ constructor(options, filename = '<streaming css input>') {
+ super({
+ objectMode: true,
+ });
+ this.#processor = postcss([new DoIUse({
+ browsers: options.browsers,
+ ignore: options.ignore,
+ onFeatureUsage: (usage) => {
+ this.push(usage);
+ },
+ })]);
+ this.#filename = filename;
+ this.#skipErrors = options.skipErrors;
+ }
+
+ /**
+ * @param {SourceMapTransformation} rule
+ * @param {any} encoding
+ * @param {Function} callback
+ */
+ async _transform(rule, encoding, callback) {
+ let caughtError;
+ try {
+ const mapper = new sourcemap.SourceMapGenerator();
+ const lines = rule.content.split('\n');
+ let oline = rule.line;
+ let ocol = rule.column;
+ for (const [lineNumber, content] of lines.entries()) {
+ mapper.addMapping({
+ generated: { line: lineNumber + 1, column: 1 },
+ original: { line: oline, column: ocol },
+ source: this.#filename,
+ });
+ mapper.addMapping({
+ generated: { line: lineNumber + 1, column: content.length },
+ original: { line: oline, column: ocol + content.length },
+ source: this.#filename,
+ });
+ oline += 1;
+ ocol = 1;
+ }
+ await this.#processor.process(rule.content, {
+ from: this.#filename, map: { prev: mapper.toString() },
+ });
+ } catch (error) {
+ if (this.#skipErrors) {
+ this.emit('warning', error);
+ } else {
+ caughtError = error;
+ }
+ }
+ callback(caughtError);
+ }
+}
diff --git a/node_modules/doiuse/lib/stream/SourceMapTransform.js b/node_modules/doiuse/lib/stream/SourceMapTransform.js
new file mode 100644
index 00000000..6295b1d3
--- /dev/null
+++ b/node_modules/doiuse/lib/stream/SourceMapTransform.js
@@ -0,0 +1,74 @@
+/* eslint-disable no-underscore-dangle */
+import { Transform } from 'node:stream';
+
+const NEW_LINE_CHAR = '\n'.codePointAt(0);
+
+/**
+ * @typedef {Object} SourceMapTransformation
+ * @prop {number} line
+ * @prop {number} column
+ * @prop {string} content
+ */
+
+export default class SourceMapTransform extends Transform {
+ constructor() {
+ super({ objectMode: true });
+ }
+
+ /**
+ * @type {?{location:[number,number], buffers: Buffer[]}}
+ * buffer for the current incoming rule.
+ */
+ #current = null;
+
+ /** track depth to handle rules nested in at-rules. */
+ #depth = 0;
+
+ /** track this and pass it downstream for source mapping. */
+ #line = 1;
+
+ /** track this and pass it downstream for source mapping. */
+ #column = 1;
+
+ /**
+ * @param {[string,Buffer]} chunk
+ * @param {any} encoding
+ * @param {Function} callback
+ */
+ _transform([type, buf], encoding, callback) {
+ if ((type === 'rule_start' || type === 'atrule_start')) {
+ this.#depth += 1;
+ }
+ if (this.#depth > 0 && !this.#current) {
+ this.#current = { location: [this.#line, this.#column], buffers: [] };
+ }
+ if (type === 'rule_end' || type === 'atrule_end') {
+ this.#depth -= 1;
+ }
+
+ if (this.#current) {
+ this.#current.buffers.push(buf);
+ if (this.#depth === 0) {
+ // Push rule
+ this.push({
+ line: this.#current.location[0],
+ column: this.#current.location[1],
+ content: Buffer.concat(this.#current.buffers).toString(),
+ });
+ this.#current = null;
+ }
+ }
+
+ // Update position
+ for (const char of buf) {
+ if (char === NEW_LINE_CHAR) {
+ this.#line += 1;
+ this.#column = 1;
+ } else {
+ this.#column += 1;
+ }
+ }
+
+ callback();
+ }
+}
diff --git a/node_modules/doiuse/node_modules/source-map/LICENSE b/node_modules/doiuse/node_modules/source-map/LICENSE
new file mode 100644
index 00000000..ed1b7cf2
--- /dev/null
+++ b/node_modules/doiuse/node_modules/source-map/LICENSE
@@ -0,0 +1,28 @@
+
+Copyright (c) 2009-2011, Mozilla Foundation and contributors
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the names of the Mozilla Foundation nor the names of project
+ contributors may be used to endorse or promote products derived from this
+ software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/node_modules/doiuse/node_modules/source-map/README.md b/node_modules/doiuse/node_modules/source-map/README.md
new file mode 100644
index 00000000..56e5ac3e
--- /dev/null
+++ b/node_modules/doiuse/node_modules/source-map/README.md
@@ -0,0 +1,822 @@
+# Source Map
+
+[![Build Status](https://travis-ci.org/mozilla/source-map.png?branch=master)](https://travis-ci.org/mozilla/source-map)
+
+[![Coverage Status](https://coveralls.io/repos/github/mozilla/source-map/badge.svg)](https://coveralls.io/github/mozilla/source-map)
+
+[![NPM](https://nodei.co/npm/source-map.png?downloads=true&downloadRank=true)](https://www.npmjs.com/package/source-map)
+
+This is a library to generate and consume the source map format
+[described here][format].
+
+[format]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit
+
+## Use with Node
+
+ $ npm install source-map
+
+## Use on the Web
+
+ <script src="https://unpkg.com/source-map@0.7.3/dist/source-map.js"></script>
+ <script>
+ sourceMap.SourceMapConsumer.initialize({
+ "lib/mappings.wasm": "https://unpkg.com/source-map@0.7.3/lib/mappings.wasm"
+ });
+ </script>
+
+--------------------------------------------------------------------------------
+
+<!-- `npm run toc` to regenerate the Table of Contents -->
+
+<!-- START doctoc generated TOC please keep comment here to allow auto update -->
+<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
+## Table of Contents
+
+- [Examples](#examples)
+ - [Consuming a source map](#consuming-a-source-map)
+ - [Generating a source map](#generating-a-source-map)
+ - [With SourceNode (high level API)](#with-sourcenode-high-level-api)
+ - [With SourceMapGenerator (low level API)](#with-sourcemapgenerator-low-level-api)
+- [API](#api)
+ - [SourceMapConsumer](#sourcemapconsumer)
+ - [SourceMapConsumer.initialize(options)](#sourcemapconsumerinitializeoptions)
+ - [new SourceMapConsumer(rawSourceMap)](#new-sourcemapconsumerrawsourcemap)
+ - [SourceMapConsumer.with](#sourcemapconsumerwith)
+ - [SourceMapConsumer.prototype.destroy()](#sourcemapconsumerprototypedestroy)
+ - [SourceMapConsumer.prototype.computeColumnSpans()](#sourcemapconsumerprototypecomputecolumnspans)
+ - [SourceMapConsumer.prototype.originalPositionFor(generatedPosition)](#sourcemapconsumerprototypeoriginalpositionforgeneratedposition)
+ - [SourceMapConsumer.prototype.generatedPositionFor(originalPosition)](#sourcemapconsumerprototypegeneratedpositionfororiginalposition)
+ - [SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition)](#sourcemapconsumerprototypeallgeneratedpositionsfororiginalposition)
+ - [SourceMapConsumer.prototype.hasContentsOfAllSources()](#sourcemapconsumerprototypehascontentsofallsources)
+ - [SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing])](#sourcemapconsumerprototypesourcecontentforsource-returnnullonmissing)
+ - [SourceMapConsumer.prototype.eachMapping(callback, context, order)](#sourcemapconsumerprototypeeachmappingcallback-context-order)
+ - [SourceMapGenerator](#sourcemapgenerator)
+ - [new SourceMapGenerator([startOfSourceMap])](#new-sourcemapgeneratorstartofsourcemap)
+ - [SourceMapGenerator.fromSourceMap(sourceMapConsumer)](#sourcemapgeneratorfromsourcemapsourcemapconsumer)
+ - [SourceMapGenerator.prototype.addMapping(mapping)](#sourcemapgeneratorprototypeaddmappingmapping)
+ - [SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent)](#sourcemapgeneratorprototypesetsourcecontentsourcefile-sourcecontent)
+ - [SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]])](#sourcemapgeneratorprototypeapplysourcemapsourcemapconsumer-sourcefile-sourcemappath)
+ - [SourceMapGenerator.prototype.toString()](#sourcemapgeneratorprototypetostring)
+ - [SourceNode](#sourcenode)
+ - [new SourceNode([line, column, source[, chunk[, name]]])](#new-sourcenodeline-column-source-chunk-name)
+ - [SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath])](#sourcenodefromstringwithsourcemapcode-sourcemapconsumer-relativepath)
+ - [SourceNode.prototype.add(chunk)](#sourcenodeprototypeaddchunk)
+ - [SourceNode.prototype.prepend(chunk)](#sourcenodeprototypeprependchunk)
+ - [SourceNode.prototype.setSourceContent(sourceFile, sourceContent)](#sourcenodeprototypesetsourcecontentsourcefile-sourcecontent)
+ - [SourceNode.prototype.walk(fn)](#sourcenodeprototypewalkfn)
+ - [SourceNode.prototype.walkSourceContents(fn)](#sourcenodeprototypewalksourcecontentsfn)
+ - [SourceNode.prototype.join(sep)](#sourcenodeprototypejoinsep)
+ - [SourceNode.prototype.replaceRight(pattern, replacement)](#sourcenodeprototypereplacerightpattern-replacement)
+ - [SourceNode.prototype.toString()](#sourcenodeprototypetostring)
+ - [SourceNode.prototype.toStringWithSourceMap([startOfSourceMap])](#sourcenodeprototypetostringwithsourcemapstartofsourcemap)
+
+<!-- END doctoc generated TOC please keep comment here to allow auto update -->
+
+## Examples
+
+### Consuming a source map
+
+```js
+const rawSourceMap = {
+ version: 3,
+ file: 'min.js',
+ names: ['bar', 'baz', 'n'],
+ sources: ['one.js', 'two.js'],
+ sourceRoot: 'http://example.com/www/js/',
+ mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA'
+};
+
+const whatever = await SourceMapConsumer.with(rawSourceMap, null, consumer => {
+
+ console.log(consumer.sources);
+ // [ 'http://example.com/www/js/one.js',
+ // 'http://example.com/www/js/two.js' ]
+
+ console.log(consumer.originalPositionFor({
+ line: 2,
+ column: 28
+ }));
+ // { source: 'http://example.com/www/js/two.js',
+ // line: 2,
+ // column: 10,
+ // name: 'n' }
+
+ console.log(consumer.generatedPositionFor({
+ source: 'http://example.com/www/js/two.js',
+ line: 2,
+ column: 10
+ }));
+ // { line: 2, column: 28 }
+
+ consumer.eachMapping(function (m) {
+ // ...
+ });
+
+ return computeWhatever();
+});
+```
+
+### Generating a source map
+
+In depth guide:
+[**Compiling to JavaScript, and Debugging with Source Maps**](https://hacks.mozilla.org/2013/05/compiling-to-javascript-and-debugging-with-source-maps/)
+
+#### With SourceNode (high level API)
+
+```js
+function compile(ast) {
+ switch (ast.type) {
+ case 'BinaryExpression':
+ return new SourceNode(
+ ast.location.line,
+ ast.location.column,
+ ast.location.source,
+ [compile(ast.left), " + ", compile(ast.right)]
+ );
+ case 'Literal':
+ return new SourceNode(
+ ast.location.line,
+ ast.location.column,
+ ast.location.source,
+ String(ast.value)
+ );
+ // ...
+ default:
+ throw new Error("Bad AST");
+ }
+}
+
+var ast = parse("40 + 2", "add.js");
+console.log(compile(ast).toStringWithSourceMap({
+ file: 'add.js'
+}));
+// { code: '40 + 2',
+// map: [object SourceMapGenerator] }
+```
+
+#### With SourceMapGenerator (low level API)
+
+```js
+var map = new SourceMapGenerator({
+ file: "source-mapped.js"
+});
+
+map.addMapping({
+ generated: {
+ line: 10,
+ column: 35
+ },
+ source: "foo.js",
+ original: {
+ line: 33,
+ column: 2
+ },
+ name: "christopher"
+});
+
+console.log(map.toString());
+// '{"version":3,"file":"source-mapped.js","sources":["foo.js"],"names":["christopher"],"mappings":";;;;;;;;;mCAgCEA"}'
+```
+
+## API
+
+Get a reference to the module:
+
+```js
+// Node.js
+var sourceMap = require('source-map');
+
+// Browser builds
+var sourceMap = window.sourceMap;
+
+// Inside Firefox
+const sourceMap = require("devtools/toolkit/sourcemap/source-map.js");
+```
+
+### SourceMapConsumer
+
+A `SourceMapConsumer` instance represents a parsed source map which we can query
+for information about the original file positions by giving it a file position
+in the generated source.
+
+#### SourceMapConsumer.initialize(options)
+
+When using `SourceMapConsumer` outside of node.js, for example on the Web, it
+needs to know from what URL to load `lib/mappings.wasm`. You must inform it by
+calling `initialize` before constructing any `SourceMapConsumer`s.
+
+The options object has the following properties:
+
+* `"lib/mappings.wasm"`: A `String` containing the URL of the
+ `lib/mappings.wasm` file, or an `ArrayBuffer` with the contents of `lib/mappings.wasm`.
+
+```js
+sourceMap.SourceMapConsumer.initialize({
+ "lib/mappings.wasm": "https://example.com/source-map/lib/mappings.wasm"
+});
+```
+
+#### new SourceMapConsumer(rawSourceMap)
+
+The only parameter is the raw source map (either as a string which can be
+`JSON.parse`'d, or an object). According to the spec, source maps have the
+following attributes:
+
+* `version`: Which version of the source map spec this map is following.
+
+* `sources`: An array of URLs to the original source files.
+
+* `names`: An array of identifiers which can be referenced by individual
+ mappings.
+
+* `sourceRoot`: Optional. The URL root from which all sources are relative.
+
+* `sourcesContent`: Optional. An array of contents of the original source files.
+
+* `mappings`: A string of base64 VLQs which contain the actual mappings.
+
+* `file`: Optional. The generated filename this source map is associated with.
+
+The promise of the constructed souce map consumer is returned.
+
+When the `SourceMapConsumer` will no longer be used anymore, you must call its
+`destroy` method.
+
+```js
+const consumer = await new sourceMap.SourceMapConsumer(rawSourceMapJsonData);
+doStuffWith(consumer);
+consumer.destroy();
+```
+
+Alternatively, you can use `SourceMapConsumer.with` to avoid needing to remember
+to call `destroy`.
+
+#### SourceMapConsumer.with
+
+Construct a new `SourceMapConsumer` from `rawSourceMap` and `sourceMapUrl`
+(see the `SourceMapConsumer` constructor for details. Then, invoke the `async
+function f(SourceMapConsumer) -> T` with the newly constructed consumer, wait
+for `f` to complete, call `destroy` on the consumer, and return `f`'s return
+value.
+
+You must not use the consumer after `f` completes!
+
+By using `with`, you do not have to remember to manually call `destroy` on
+the consumer, since it will be called automatically once `f` completes.
+
+```js
+const xSquared = await SourceMapConsumer.with(
+ myRawSourceMap,
+ null,
+ async function (consumer) {
+ // Use `consumer` inside here and don't worry about remembering
+ // to call `destroy`.
+
+ const x = await whatever(consumer);
+ return x * x;
+ }
+);
+
+// You may not use that `consumer` anymore out here; it has
+// been destroyed. But you can use `xSquared`.
+console.log(xSquared);
+```
+
+#### SourceMapConsumer.prototype.destroy()
+
+Free this source map consumer's associated wasm data that is manually-managed.
+
+```js
+consumer.destroy();
+```
+
+Alternatively, you can use `SourceMapConsumer.with` to avoid needing to remember
+to call `destroy`.
+
+#### SourceMapConsumer.prototype.computeColumnSpans()
+
+Compute the last column for each generated mapping. The last column is
+inclusive.
+
+```js
+// Before:
+consumer.allGeneratedPositionsFor({ line: 2, source: "foo.coffee" })
+// [ { line: 2,
+// column: 1 },
+// { line: 2,
+// column: 10 },
+// { line: 2,
+// column: 20 } ]
+
+consumer.computeColumnSpans();
+
+// After:
+consumer.allGeneratedPositionsFor({ line: 2, source: "foo.coffee" })
+// [ { line: 2,
+// column: 1,
+// lastColumn: 9 },
+// { line: 2,
+// column: 10,
+// lastColumn: 19 },
+// { line: 2,
+// column: 20,
+// lastColumn: Infinity } ]
+```
+
+#### SourceMapConsumer.prototype.originalPositionFor(generatedPosition)
+
+Returns the original source, line, and column information for the generated
+source's line and column positions provided. The only argument is an object with
+the following properties:
+
+* `line`: The line number in the generated source. Line numbers in
+ this library are 1-based (note that the underlying source map
+ specification uses 0-based line numbers -- this library handles the
+ translation).
+
+* `column`: The column number in the generated source. Column numbers
+ in this library are 0-based.
+
+* `bias`: Either `SourceMapConsumer.GREATEST_LOWER_BOUND` or
+ `SourceMapConsumer.LEAST_UPPER_BOUND`. Specifies whether to return the closest
+ element that is smaller than or greater than the one we are searching for,
+ respectively, if the exact element cannot be found. Defaults to
+ `SourceMapConsumer.GREATEST_LOWER_BOUND`.
+
+and an object is returned with the following properties:
+
+* `source`: The original source file, or null if this information is not
+ available.
+
+* `line`: The line number in the original source, or null if this information is
+ not available. The line number is 1-based.
+
+* `column`: The column number in the original source, or null if this
+ information is not available. The column number is 0-based.
+
+* `name`: The original identifier, or null if this information is not available.
+
+```js
+consumer.originalPositionFor({ line: 2, column: 10 })
+// { source: 'foo.coffee',
+// line: 2,
+// column: 2,
+// name: null }
+
+consumer.originalPositionFor({ line: 99999999999999999, column: 999999999999999 })
+// { source: null,
+// line: null,
+// column: null,
+// name: null }
+```
+
+#### SourceMapConsumer.prototype.generatedPositionFor(originalPosition)
+
+Returns the generated line and column information for the original source,
+line, and column positions provided. The only argument is an object with
+the following properties:
+
+* `source`: The filename of the original source.
+
+* `line`: The line number in the original source. The line number is
+ 1-based.
+
+* `column`: The column number in the original source. The column
+ number is 0-based.
+
+and an object is returned with the following properties:
+
+* `line`: The line number in the generated source, or null. The line
+ number is 1-based.
+
+* `column`: The column number in the generated source, or null. The
+ column number is 0-based.
+
+```js
+consumer.generatedPositionFor({ source: "example.js", line: 2, column: 10 })
+// { line: 1,
+// column: 56 }
+```
+
+#### SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition)
+
+Returns all generated line and column information for the original source, line,
+and column provided. If no column is provided, returns all mappings
+corresponding to a either the line we are searching for or the next closest line
+that has any mappings. Otherwise, returns all mappings corresponding to the
+given line and either the column we are searching for or the next closest column
+that has any offsets.
+
+The only argument is an object with the following properties:
+
+* `source`: The filename of the original source.
+
+* `line`: The line number in the original source. The line number is
+ 1-based.
+
+* `column`: Optional. The column number in the original source. The
+ column number is 0-based.
+
+and an array of objects is returned, each with the following properties:
+
+* `line`: The line number in the generated source, or null. The line
+ number is 1-based.
+
+* `column`: The column number in the generated source, or null. The
+ column number is 0-based.
+
+```js
+consumer.allGeneratedpositionsfor({ line: 2, source: "foo.coffee" })
+// [ { line: 2,
+// column: 1 },
+// { line: 2,
+// column: 10 },
+// { line: 2,
+// column: 20 } ]
+```
+
+#### SourceMapConsumer.prototype.hasContentsOfAllSources()
+
+Return true if we have the embedded source content for every source listed in
+the source map, false otherwise.
+
+In other words, if this method returns `true`, then
+`consumer.sourceContentFor(s)` will succeed for every source `s` in
+`consumer.sources`.
+
+```js
+// ...
+if (consumer.hasContentsOfAllSources()) {
+ consumerReadyCallback(consumer);
+} else {
+ fetchSources(consumer, consumerReadyCallback);
+}
+// ...
+```
+
+#### SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing])
+
+Returns the original source content for the source provided. The only
+argument is the URL of the original source file.
+
+If the source content for the given source is not found, then an error is
+thrown. Optionally, pass `true` as the second param to have `null` returned
+instead.
+
+```js
+consumer.sources
+// [ "my-cool-lib.clj" ]
+
+consumer.sourceContentFor("my-cool-lib.clj")
+// "..."
+
+consumer.sourceContentFor("this is not in the source map");
+// Error: "this is not in the source map" is not in the source map
+
+consumer.sourceContentFor("this is not in the source map", true);
+// null
+```
+
+#### SourceMapConsumer.prototype.eachMapping(callback, context, order)
+
+Iterate over each mapping between an original source/line/column and a
+generated line/column in this source map.
+
+* `callback`: The function that is called with each mapping. Mappings have the
+ form `{ source, generatedLine, generatedColumn, originalLine, originalColumn,
+ name }`
+
+* `context`: Optional. If specified, this object will be the value of `this`
+ every time that `callback` is called.
+
+* `order`: Either `SourceMapConsumer.GENERATED_ORDER` or
+ `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to iterate over
+ the mappings sorted by the generated file's line/column order or the
+ original's source/line/column order, respectively. Defaults to
+ `SourceMapConsumer.GENERATED_ORDER`.
+
+```js
+consumer.eachMapping(function (m) { console.log(m); })
+// ...
+// { source: 'illmatic.js',
+// generatedLine: 1,
+// generatedColumn: 0,
+// originalLine: 1,
+// originalColumn: 0,
+// name: null }
+// { source: 'illmatic.js',
+// generatedLine: 2,
+// generatedColumn: 0,
+// originalLine: 2,
+// originalColumn: 0,
+// name: null }
+// ...
+```
+### SourceMapGenerator
+
+An instance of the SourceMapGenerator represents a source map which is being
+built incrementally.
+
+#### new SourceMapGenerator([startOfSourceMap])
+
+You may pass an object with the following properties:
+
+* `file`: The filename of the generated source that this source map is
+ associated with.
+
+* `sourceRoot`: A root for all relative URLs in this source map.
+
+* `skipValidation`: Optional. When `true`, disables validation of mappings as
+ they are added. This can improve performance but should be used with
+ discretion, as a last resort. Even then, one should avoid using this flag when
+ running tests, if possible.
+
+```js
+var generator = new sourceMap.SourceMapGenerator({
+ file: "my-generated-javascript-file.js",
+ sourceRoot: "http://example.com/app/js/"
+});
+```
+
+#### SourceMapGenerator.fromSourceMap(sourceMapConsumer)
+
+Creates a new `SourceMapGenerator` from an existing `SourceMapConsumer` instance.
+
+* `sourceMapConsumer` The SourceMap.
+
+```js
+var generator = sourceMap.SourceMapGenerator.fromSourceMap(consumer);
+```
+
+#### SourceMapGenerator.prototype.addMapping(mapping)
+
+Add a single mapping from original source line and column to the generated
+source's line and column for this source map being created. The mapping object
+should have the following properties:
+
+* `generated`: An object with the generated line and column positions.
+
+* `original`: An object with the original line and column positions.
+
+* `source`: The original source file (relative to the sourceRoot).
+
+* `name`: An optional original token name for this mapping.
+
+```js
+generator.addMapping({
+ source: "module-one.scm",
+ original: { line: 128, column: 0 },
+ generated: { line: 3, column: 456 }
+})
+```
+
+#### SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent)
+
+Set the source content for an original source file.
+
+* `sourceFile` the URL of the original source file.
+
+* `sourceContent` the content of the source file.
+
+```js
+generator.setSourceContent("module-one.scm",
+ fs.readFileSync("path/to/module-one.scm"))
+```
+
+#### SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]])
+
+Applies a SourceMap for a source file to the SourceMap.
+Each mapping to the supplied source file is rewritten using the
+supplied SourceMap. Note: The resolution for the resulting mappings
+is the minimum of this map and the supplied map.
+
+* `sourceMapConsumer`: The SourceMap to be applied.
+
+* `sourceFile`: Optional. The filename of the source file.
+ If omitted, sourceMapConsumer.file will be used, if it exists.
+ Otherwise an error will be thrown.
+
+* `sourceMapPath`: Optional. The dirname of the path to the SourceMap
+ to be applied. If relative, it is relative to the SourceMap.
+
+ This parameter is needed when the two SourceMaps aren't in the same
+ directory, and the SourceMap to be applied contains relative source
+ paths. If so, those relative source paths need to be rewritten
+ relative to the SourceMap.
+
+ If omitted, it is assumed that both SourceMaps are in the same directory,
+ thus not needing any rewriting. (Supplying `'.'` has the same effect.)
+
+#### SourceMapGenerator.prototype.toString()
+
+Renders the source map being generated to a string.
+
+```js
+generator.toString()
+// '{"version":3,"sources":["module-one.scm"],"names":[],"mappings":"...snip...","file":"my-generated-javascript-file.js","sourceRoot":"http://example.com/app/js/"}'
+```
+
+### SourceNode
+
+SourceNodes provide a way to abstract over interpolating and/or concatenating
+snippets of generated JavaScript source code, while maintaining the line and
+column information associated between those snippets and the original source
+code. This is useful as the final intermediate representation a compiler might
+use before outputting the generated JS and source map.
+
+#### new SourceNode([line, column, source[, chunk[, name]]])
+
+* `line`: The original line number associated with this source node, or null if
+ it isn't associated with an original line. The line number is 1-based.
+
+* `column`: The original column number associated with this source node, or null
+ if it isn't associated with an original column. The column number
+ is 0-based.
+
+* `source`: The original source's filename; null if no filename is provided.
+
+* `chunk`: Optional. Is immediately passed to `SourceNode.prototype.add`, see
+ below.
+
+* `name`: Optional. The original identifier.
+
+```js
+var node = new SourceNode(1, 2, "a.cpp", [
+ new SourceNode(3, 4, "b.cpp", "extern int status;\n"),
+ new SourceNode(5, 6, "c.cpp", "std::string* make_string(size_t n);\n"),
+ new SourceNode(7, 8, "d.cpp", "int main(int argc, char** argv) {}\n"),
+]);
+```
+
+#### SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath])
+
+Creates a SourceNode from generated code and a SourceMapConsumer.
+
+* `code`: The generated code
+
+* `sourceMapConsumer` The SourceMap for the generated code
+
+* `relativePath` The optional path that relative sources in `sourceMapConsumer`
+ should be relative to.
+
+```js
+const consumer = await new SourceMapConsumer(fs.readFileSync("path/to/my-file.js.map", "utf8"));
+const node = SourceNode.fromStringWithSourceMap(fs.readFileSync("path/to/my-file.js"), consumer);
+```
+
+#### SourceNode.prototype.add(chunk)
+
+Add a chunk of generated JS to this source node.
+
+* `chunk`: A string snippet of generated JS code, another instance of
+ `SourceNode`, or an array where each member is one of those things.
+
+```js
+node.add(" + ");
+node.add(otherNode);
+node.add([leftHandOperandNode, " + ", rightHandOperandNode]);
+```
+
+#### SourceNode.prototype.prepend(chunk)
+
+Prepend a chunk of generated JS to this source node.
+
+* `chunk`: A string snippet of generated JS code, another instance of
+ `SourceNode`, or an array where each member is one of those things.
+
+```js
+node.prepend("/** Build Id: f783haef86324gf **/\n\n");
+```
+
+#### SourceNode.prototype.setSourceContent(sourceFile, sourceContent)
+
+Set the source content for a source file. This will be added to the
+`SourceMap` in the `sourcesContent` field.
+
+* `sourceFile`: The filename of the source file
+
+* `sourceContent`: The content of the source file
+
+```js
+node.setSourceContent("module-one.scm",
+ fs.readFileSync("path/to/module-one.scm"))
+```
+
+#### SourceNode.prototype.walk(fn)
+
+Walk over the tree of JS snippets in this node and its children. The walking
+function is called once for each snippet of JS and is passed that snippet and
+the its original associated source's line/column location.
+
+* `fn`: The traversal function.
+
+```js
+var node = new SourceNode(1, 2, "a.js", [
+ new SourceNode(3, 4, "b.js", "uno"),
+ "dos",
+ [
+ "tres",
+ new SourceNode(5, 6, "c.js", "quatro")
+ ]
+]);
+
+node.walk(function (code, loc) { console.log("WALK:", code, loc); })
+// WALK: uno { source: 'b.js', line: 3, column: 4, name: null }
+// WALK: dos { source: 'a.js', line: 1, column: 2, name: null }
+// WALK: tres { source: 'a.js', line: 1, column: 2, name: null }
+// WALK: quatro { source: 'c.js', line: 5, column: 6, name: null }
+```
+
+#### SourceNode.prototype.walkSourceContents(fn)
+
+Walk over the tree of SourceNodes. The walking function is called for each
+source file content and is passed the filename and source content.
+
+* `fn`: The traversal function.
+
+```js
+var a = new SourceNode(1, 2, "a.js", "generated from a");
+a.setSourceContent("a.js", "original a");
+var b = new SourceNode(1, 2, "b.js", "generated from b");
+b.setSourceContent("b.js", "original b");
+var c = new SourceNode(1, 2, "c.js", "generated from c");
+c.setSourceContent("c.js", "original c");
+
+var node = new SourceNode(null, null, null, [a, b, c]);
+node.walkSourceContents(function (source, contents) { console.log("WALK:", source, ":", contents); })
+// WALK: a.js : original a
+// WALK: b.js : original b
+// WALK: c.js : original c
+```
+
+#### SourceNode.prototype.join(sep)
+
+Like `Array.prototype.join` except for SourceNodes. Inserts the separator
+between each of this source node's children.
+
+* `sep`: The separator.
+
+```js
+var lhs = new SourceNode(1, 2, "a.rs", "my_copy");
+var operand = new SourceNode(3, 4, "a.rs", "=");
+var rhs = new SourceNode(5, 6, "a.rs", "orig.clone()");
+
+var node = new SourceNode(null, null, null, [ lhs, operand, rhs ]);
+var joinedNode = node.join(" ");
+```
+
+#### SourceNode.prototype.replaceRight(pattern, replacement)
+
+Call `String.prototype.replace` on the very right-most source snippet. Useful
+for trimming white space from the end of a source node, etc.
+
+* `pattern`: The pattern to replace.
+
+* `replacement`: The thing to replace the pattern with.
+
+```js
+// Trim trailing white space.
+node.replaceRight(/\s*$/, "");
+```
+
+#### SourceNode.prototype.toString()
+
+Return the string representation of this source node. Walks over the tree and
+concatenates all the various snippets together to one string.
+
+```js
+var node = new SourceNode(1, 2, "a.js", [
+ new SourceNode(3, 4, "b.js", "uno"),
+ "dos",
+ [
+ "tres",
+ new SourceNode(5, 6, "c.js", "quatro")
+ ]
+]);
+
+node.toString()
+// 'unodostresquatro'
+```
+
+#### SourceNode.prototype.toStringWithSourceMap([startOfSourceMap])
+
+Returns the string representation of this tree of source nodes, plus a
+SourceMapGenerator which contains all the mappings between the generated and
+original sources.
+
+The arguments are the same as those to `new SourceMapGenerator`.
+
+```js
+var node = new SourceNode(1, 2, "a.js", [
+ new SourceNode(3, 4, "b.js", "uno"),
+ "dos",
+ [
+ "tres",
+ new SourceNode(5, 6, "c.js", "quatro")
+ ]
+]);
+
+node.toStringWithSourceMap({ file: "my-output-file.js" })
+// { code: 'unodostresquatro',
+// map: [object SourceMapGenerator] }
+```
diff --git a/node_modules/doiuse/node_modules/source-map/dist/source-map.js b/node_modules/doiuse/node_modules/source-map/dist/source-map.js
new file mode 100644
index 00000000..b75e98bd
--- /dev/null
+++ b/node_modules/doiuse/node_modules/source-map/dist/source-map.js
@@ -0,0 +1 @@
+!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n(require("fs"),require("path")):"function"==typeof define&&define.amd?define(["fs","path"],n):"object"==typeof exports?exports.sourceMap=n(require("fs"),require("path")):e.sourceMap=n(e.fs,e.path)}(window,(function(e,n){return function(e){var n={};function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var o in e)t.d(r,o,function(n){return e[n]}.bind(null,o));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="",t(t.s=5)}([function(e,n){n.getArg=function(e,n,t){if(n in e)return e[n];if(3===arguments.length)return t;throw new Error('"'+n+'" is a required argument.')};const t=/^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/,r=/^data:.+\,.+$/;function o(e){const n=e.match(t);return n?{scheme:n[1],auth:n[2],host:n[3],port:n[4],path:n[5]}:null}function i(e){let n="";return e.scheme&&(n+=e.scheme+":"),n+="//",e.auth&&(n+=e.auth+"@"),e.host&&(n+=e.host),e.port&&(n+=":"+e.port),e.path&&(n+=e.path),n}n.urlParse=o,n.urlGenerate=i;const s=function(e){const n=[];return function(t){for(let e=0;e<n.length;e++)if(n[e].input===t){const t=n[0];return n[0]=n[e],n[e]=t,n[0].result}const r=e(t);return n.unshift({input:t,result:r}),n.length>32&&n.pop(),r}}((function(e){let t=e;const r=o(e);if(r){if(!r.path)return e;t=r.path}const s=n.isAbsolute(t),l=[];let a=0,u=0;for(;;){if(a=u,u=t.indexOf("/",a),-1===u){l.push(t.slice(a));break}for(l.push(t.slice(a,u));u<t.length&&"/"===t[u];)u++}let c=0;for(u=l.length-1;u>=0;u--){const e=l[u];"."===e?l.splice(u,1):".."===e?c++:c>0&&(""===e?(l.splice(u+1,c),c=0):(l.splice(u,2),c--))}return t=l.join("/"),""===t&&(t=s?"/":"."),r?(r.path=t,i(r)):t}));function l(e,n){""===e&&(e="."),""===n&&(n=".");const t=o(n),l=o(e);if(l&&(e=l.path||"/"),t&&!t.scheme)return l&&(t.scheme=l.scheme),i(t);if(t||n.match(r))return n;if(l&&!l.host&&!l.path)return l.host=n,i(l);const a="/"===n.charAt(0)?n:s(e.replace(/\/+$/,"")+"/"+n);return l?(l.path=a,i(l)):a}n.normalize=s,n.join=l,n.isAbsolute=function(e){return"/"===e.charAt(0)||t.test(e)},n.relative=function(e,n){""===e&&(e="."),e=e.replace(/\/$/,"");let t=0;for(;0!==n.indexOf(e+"/");){const r=e.lastIndexOf("/");if(r<0)return n;if((e=e.slice(0,r)).match(/^([^\/]+:\/)?\/*$/))return n;++t}return Array(t+1).join("../")+n.substr(e.length+1)};const a=!("__proto__"in Object.create(null));function u(e){return e}function c(e){if(!e)return!1;const n=e.length;if(n<9)return!1;if(95!==e.charCodeAt(n-1)||95!==e.charCodeAt(n-2)||111!==e.charCodeAt(n-3)||116!==e.charCodeAt(n-4)||111!==e.charCodeAt(n-5)||114!==e.charCodeAt(n-6)||112!==e.charCodeAt(n-7)||95!==e.charCodeAt(n-8)||95!==e.charCodeAt(n-9))return!1;for(let t=n-10;t>=0;t--)if(36!==e.charCodeAt(t))return!1;return!0}function g(e,n){return e===n?0:null===e?1:null===n?-1:e>n?1:-1}n.toSetString=a?u:function(e){return c(e)?"$"+e:e},n.fromSetString=a?u:function(e){return c(e)?e.slice(1):e},n.compareByOriginalPositions=function(e,n,t){let r=g(e.source,n.source);return 0!==r?r:(r=e.originalLine-n.originalLine,0!==r?r:(r=e.originalColumn-n.originalColumn,0!==r||t?r:(r=e.generatedColumn-n.generatedColumn,0!==r?r:(r=e.generatedLine-n.generatedLine,0!==r?r:g(e.name,n.name)))))},n.compareByGeneratedPositionsDeflated=function(e,n,t){let r=e.generatedLine-n.generatedLine;return 0!==r?r:(r=e.generatedColumn-n.generatedColumn,0!==r||t?r:(r=g(e.source,n.source),0!==r?r:(r=e.originalLine-n.originalLine,0!==r?r:(r=e.originalColumn-n.originalColumn,0!==r?r:g(e.name,n.name)))))},n.compareByGeneratedPositionsInflated=function(e,n){let t=e.generatedLine-n.generatedLine;return 0!==t?t:(t=e.generatedColumn-n.generatedColumn,0!==t?t:(t=g(e.source,n.source),0!==t?t:(t=e.originalLine-n.originalLine,0!==t?t:(t=e.originalColumn-n.originalColumn,0!==t?t:g(e.name,n.name)))))},n.parseSourceMapInput=function(e){return JSON.parse(e.replace(/^\)]}'[^\n]*\n/,""))},n.computeSourceURL=function(e,n,t){if(n=n||"",e&&("/"!==e[e.length-1]&&"/"!==n[0]&&(e+="/"),n=e+n),t){const e=o(t);if(!e)throw new Error("sourceMapURL could not be parsed");if(e.path){const n=e.path.lastIndexOf("/");n>=0&&(e.path=e.path.substring(0,n+1))}n=l(i(e),n)}return s(n)}},function(e,n,t){const r=t(2),o=t(0),i=t(3).ArraySet,s=t(7).MappingList;class l{constructor(e){e||(e={}),this._file=o.getArg(e,"file",null),this._sourceRoot=o.getArg(e,"sourceRoot",null),this._skipValidation=o.getArg(e,"skipValidation",!1),this._sources=new i,this._names=new i,this._mappings=new s,this._sourcesContents=null}static fromSourceMap(e){const n=e.sourceRoot,t=new l({file:e.file,sourceRoot:n});return e.eachMapping((function(e){const r={generated:{line:e.generatedLine,column:e.generatedColumn}};null!=e.source&&(r.source=e.source,null!=n&&(r.source=o.relative(n,r.source)),r.original={line:e.originalLine,column:e.originalColumn},null!=e.name&&(r.name=e.name)),t.addMapping(r)})),e.sources.forEach((function(r){let i=r;null!==n&&(i=o.relative(n,r)),t._sources.has(i)||t._sources.add(i);const s=e.sourceContentFor(r);null!=s&&t.setSourceContent(r,s)})),t}addMapping(e){const n=o.getArg(e,"generated"),t=o.getArg(e,"original",null);let r=o.getArg(e,"source",null),i=o.getArg(e,"name",null);this._skipValidation||this._validateMapping(n,t,r,i),null!=r&&(r=String(r),this._sources.has(r)||this._sources.add(r)),null!=i&&(i=String(i),this._names.has(i)||this._names.add(i)),this._mappings.add({generatedLine:n.line,generatedColumn:n.column,originalLine:null!=t&&t.line,originalColumn:null!=t&&t.column,source:r,name:i})}setSourceContent(e,n){let t=e;null!=this._sourceRoot&&(t=o.relative(this._sourceRoot,t)),null!=n?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[o.toSetString(t)]=n):this._sourcesContents&&(delete this._sourcesContents[o.toSetString(t)],0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))}applySourceMap(e,n,t){let r=n;if(null==n){if(null==e.file)throw new Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\'s "file" property. Both were omitted.');r=e.file}const s=this._sourceRoot;null!=s&&(r=o.relative(s,r));const l=this._mappings.toArray().length>0?new i:this._sources,a=new i;this._mappings.unsortedForEach((function(n){if(n.source===r&&null!=n.originalLine){const r=e.originalPositionFor({line:n.originalLine,column:n.originalColumn});null!=r.source&&(n.source=r.source,null!=t&&(n.source=o.join(t,n.source)),null!=s&&(n.source=o.relative(s,n.source)),n.originalLine=r.line,n.originalColumn=r.column,null!=r.name&&(n.name=r.name))}const i=n.source;null==i||l.has(i)||l.add(i);const u=n.name;null==u||a.has(u)||a.add(u)}),this),this._sources=l,this._names=a,e.sources.forEach((function(n){const r=e.sourceContentFor(n);null!=r&&(null!=t&&(n=o.join(t,n)),null!=s&&(n=o.relative(s,n)),this.setSourceContent(n,r))}),this)}_validateMapping(e,n,t,r){if(n&&"number"!=typeof n.line&&"number"!=typeof n.column)throw new Error("original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.");if(e&&"line"in e&&"column"in e&&e.line>0&&e.column>=0&&!n&&!t&&!r);else if(!(e&&"line"in e&&"column"in e&&n&&"line"in n&&"column"in n&&e.line>0&&e.column>=0&&n.line>0&&n.column>=0&&t))throw new Error("Invalid mapping: "+JSON.stringify({generated:e,source:t,original:n,name:r}))}_serializeMappings(){let e,n,t,i,s=0,l=1,a=0,u=0,c=0,g=0,p="";const h=this._mappings.toArray();for(let m=0,d=h.length;m<d;m++){if(n=h[m],e="",n.generatedLine!==l)for(s=0;n.generatedLine!==l;)e+=";",l++;else if(m>0){if(!o.compareByGeneratedPositionsInflated(n,h[m-1]))continue;e+=","}e+=r.encode(n.generatedColumn-s),s=n.generatedColumn,null!=n.source&&(i=this._sources.indexOf(n.source),e+=r.encode(i-g),g=i,e+=r.encode(n.originalLine-1-u),u=n.originalLine-1,e+=r.encode(n.originalColumn-a),a=n.originalColumn,null!=n.name&&(t=this._names.indexOf(n.name),e+=r.encode(t-c),c=t)),p+=e}return p}_generateSourcesContent(e,n){return e.map((function(e){if(!this._sourcesContents)return null;null!=n&&(e=o.relative(n,e));const t=o.toSetString(e);return Object.prototype.hasOwnProperty.call(this._sourcesContents,t)?this._sourcesContents[t]:null}),this)}toJSON(){const e={version:this._version,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};return null!=this._file&&(e.file=this._file),null!=this._sourceRoot&&(e.sourceRoot=this._sourceRoot),this._sourcesContents&&(e.sourcesContent=this._generateSourcesContent(e.sources,e.sourceRoot)),e}toString(){return JSON.stringify(this.toJSON())}}l.prototype._version=3,n.SourceMapGenerator=l},function(e,n,t){const r=t(6);n.encode=function(e){let n,t="",o=function(e){return e<0?1+(-e<<1):0+(e<<1)}(e);do{n=31&o,o>>>=5,o>0&&(n|=32),t+=r.encode(n)}while(o>0);return t}},function(e,n){class t{constructor(){this._array=[],this._set=new Map}static fromArray(e,n){const r=new t;for(let t=0,o=e.length;t<o;t++)r.add(e[t],n);return r}size(){return this._set.size}add(e,n){const t=this.has(e),r=this._array.length;t&&!n||this._array.push(e),t||this._set.set(e,r)}has(e){return this._set.has(e)}indexOf(e){const n=this._set.get(e);if(n>=0)return n;throw new Error('"'+e+'" is not in the set.')}at(e){if(e>=0&&e<this._array.length)return this._array[e];throw new Error("No element indexed by "+e)}toArray(){return this._array.slice()}}n.ArraySet=t},function(e,n,t){(function(n){if(function(){return"undefined"!=typeof window&&this===window}.call()){let n=null;e.exports=function(){if("string"==typeof n)return fetch(n).then(e=>e.arrayBuffer());if(n instanceof ArrayBuffer)return Promise.resolve(n);throw new Error("You must provide the string URL or ArrayBuffer contents of lib/mappings.wasm by calling SourceMapConsumer.initialize({ 'lib/mappings.wasm': ... }) before using SourceMapConsumer")},e.exports.initialize=e=>n=e}else{const r=t(10),o=t(11);e.exports=function(){return new Promise((e,t)=>{const i=o.join(n,"mappings.wasm");r.readFile(i,null,(n,r)=>{n?t(n):e(r.buffer)})})},e.exports.initialize=e=>{console.debug("SourceMapConsumer.initialize is a no-op when running in node.js")}}}).call(this,"/")},function(e,n,t){n.SourceMapGenerator=t(1).SourceMapGenerator,n.SourceMapConsumer=t(8).SourceMapConsumer,n.SourceNode=t(13).SourceNode},function(e,n){const t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("");n.encode=function(e){if(0<=e&&e<t.length)return t[e];throw new TypeError("Must be between 0 and 63: "+e)}},function(e,n,t){const r=t(0);n.MappingList=class{constructor(){this._array=[],this._sorted=!0,this._last={generatedLine:-1,generatedColumn:0}}unsortedForEach(e,n){this._array.forEach(e,n)}add(e){!function(e,n){const t=e.generatedLine,o=n.generatedLine,i=e.generatedColumn,s=n.generatedColumn;return o>t||o==t&&s>=i||r.compareByGeneratedPositionsInflated(e,n)<=0}(this._last,e)?(this._sorted=!1,this._array.push(e)):(this._last=e,this._array.push(e))}toArray(){return this._sorted||(this._array.sort(r.compareByGeneratedPositionsInflated),this._sorted=!0),this._array}}},function(e,n,t){const r=t(0),o=t(9),i=t(3).ArraySet,s=(t(2),t(4)),l=t(12),a=Symbol("smcInternal");class u{constructor(e,n){return e==a?Promise.resolve(this):function(e,n){let t=e;"string"==typeof e&&(t=r.parseSourceMapInput(e));const o=null!=t.sections?new g(t,n):new c(t,n);return Promise.resolve(o)}(e,n)}static initialize(e){s.initialize(e["lib/mappings.wasm"])}static fromSourceMap(e,n){return function(e,n){return c.fromSourceMap(e,n)}(e,n)}static async with(e,n,t){const r=await new u(e,n);try{return await t(r)}finally{r.destroy()}}_parseMappings(e,n){throw new Error("Subclasses must implement _parseMappings")}eachMapping(e,n,t){throw new Error("Subclasses must implement eachMapping")}allGeneratedPositionsFor(e){throw new Error("Subclasses must implement allGeneratedPositionsFor")}destroy(){throw new Error("Subclasses must implement destroy")}}u.prototype._version=3,u.GENERATED_ORDER=1,u.ORIGINAL_ORDER=2,u.GREATEST_LOWER_BOUND=1,u.LEAST_UPPER_BOUND=2,n.SourceMapConsumer=u;class c extends u{constructor(e,n){return super(a).then(t=>{let o=e;"string"==typeof e&&(o=r.parseSourceMapInput(e));const s=r.getArg(o,"version");let a=r.getArg(o,"sources");const u=r.getArg(o,"names",[]);let c=r.getArg(o,"sourceRoot",null);const g=r.getArg(o,"sourcesContent",null),p=r.getArg(o,"mappings"),h=r.getArg(o,"file",null);if(s!=t._version)throw new Error("Unsupported version: "+s);return c&&(c=r.normalize(c)),a=a.map(String).map(r.normalize).map((function(e){return c&&r.isAbsolute(c)&&r.isAbsolute(e)?r.relative(c,e):e})),t._names=i.fromArray(u.map(String),!0),t._sources=i.fromArray(a,!0),t._absoluteSources=t._sources.toArray().map((function(e){return r.computeSourceURL(c,e,n)})),t.sourceRoot=c,t.sourcesContent=g,t._mappings=p,t._sourceMapURL=n,t.file=h,t._computedColumnSpans=!1,t._mappingsPtr=0,t._wasm=null,l().then(e=>(t._wasm=e,t))})}_findSourceIndex(e){let n=e;if(null!=this.sourceRoot&&(n=r.relative(this.sourceRoot,n)),this._sources.has(n))return this._sources.indexOf(n);for(let n=0;n<this._absoluteSources.length;++n)if(this._absoluteSources[n]==e)return n;return-1}static fromSourceMap(e,n){return new c(e.toString())}get sources(){return this._absoluteSources.slice()}_getMappingsPtr(){return 0===this._mappingsPtr&&this._parseMappings(this._mappings,this.sourceRoot),this._mappingsPtr}_parseMappings(e,n){const t=e.length,r=this._wasm.exports.allocate_mappings(t),o=new Uint8Array(this._wasm.exports.memory.buffer,r,t);for(let n=0;n<t;n++)o[n]=e.charCodeAt(n);const i=this._wasm.exports.parse_mappings(r);if(!i){const e=this._wasm.exports.get_last_error();let n=`Error parsing mappings (code ${e}): `;switch(e){case 1:n+="the mappings contained a negative line, column, source index, or name index";break;case 2:n+="the mappings contained a number larger than 2**32";break;case 3:n+="reached EOF while in the middle of parsing a VLQ";break;case 4:n+="invalid base 64 character while parsing a VLQ";break;default:n+="unknown error code"}throw new Error(n)}this._mappingsPtr=i}eachMapping(e,n,t){const o=n||null,i=t||u.GENERATED_ORDER,s=this.sourceRoot;this._wasm.withMappingCallback(n=>{null!==n.source&&(n.source=this._sources.at(n.source),n.source=r.computeSourceURL(s,n.source,this._sourceMapURL),null!==n.name&&(n.name=this._names.at(n.name))),e.call(o,n)},()=>{switch(i){case u.GENERATED_ORDER:this._wasm.exports.by_generated_location(this._getMappingsPtr());break;case u.ORIGINAL_ORDER:this._wasm.exports.by_original_location(this._getMappingsPtr());break;default:throw new Error("Unknown order of iteration.")}})}allGeneratedPositionsFor(e){let n=r.getArg(e,"source");const t=r.getArg(e,"line"),o=e.column||0;if(n=this._findSourceIndex(n),n<0)return[];if(t<1)throw new Error("Line numbers must be >= 1");if(o<0)throw new Error("Column numbers must be >= 0");const i=[];return this._wasm.withMappingCallback(e=>{let n=e.lastGeneratedColumn;this._computedColumnSpans&&null===n&&(n=1/0),i.push({line:e.generatedLine,column:e.generatedColumn,lastColumn:n})},()=>{this._wasm.exports.all_generated_locations_for(this._getMappingsPtr(),n,t-1,"column"in e,o)}),i}destroy(){0!==this._mappingsPtr&&(this._wasm.exports.free_mappings(this._mappingsPtr),this._mappingsPtr=0)}computeColumnSpans(){this._computedColumnSpans||(this._wasm.exports.compute_column_spans(this._getMappingsPtr()),this._computedColumnSpans=!0)}originalPositionFor(e){const n={generatedLine:r.getArg(e,"line"),generatedColumn:r.getArg(e,"column")};if(n.generatedLine<1)throw new Error("Line numbers must be >= 1");if(n.generatedColumn<0)throw new Error("Column numbers must be >= 0");let t,o=r.getArg(e,"bias",u.GREATEST_LOWER_BOUND);if(null==o&&(o=u.GREATEST_LOWER_BOUND),this._wasm.withMappingCallback(e=>t=e,()=>{this._wasm.exports.original_location_for(this._getMappingsPtr(),n.generatedLine-1,n.generatedColumn,o)}),t&&t.generatedLine===n.generatedLine){let e=r.getArg(t,"source",null);null!==e&&(e=this._sources.at(e),e=r.computeSourceURL(this.sourceRoot,e,this._sourceMapURL));let n=r.getArg(t,"name",null);return null!==n&&(n=this._names.at(n)),{source:e,line:r.getArg(t,"originalLine",null),column:r.getArg(t,"originalColumn",null),name:n}}return{source:null,line:null,column:null,name:null}}hasContentsOfAllSources(){return!!this.sourcesContent&&(this.sourcesContent.length>=this._sources.size()&&!this.sourcesContent.some((function(e){return null==e})))}sourceContentFor(e,n){if(!this.sourcesContent)return null;const t=this._findSourceIndex(e);if(t>=0)return this.sourcesContent[t];let o,i=e;if(null!=this.sourceRoot&&(i=r.relative(this.sourceRoot,i)),null!=this.sourceRoot&&(o=r.urlParse(this.sourceRoot))){const e=i.replace(/^file:\/\//,"");if("file"==o.scheme&&this._sources.has(e))return this.sourcesContent[this._sources.indexOf(e)];if((!o.path||"/"==o.path)&&this._sources.has("/"+i))return this.sourcesContent[this._sources.indexOf("/"+i)]}if(n)return null;throw new Error('"'+i+'" is not in the SourceMap.')}generatedPositionFor(e){let n=r.getArg(e,"source");if(n=this._findSourceIndex(n),n<0)return{line:null,column:null,lastColumn:null};const t={source:n,originalLine:r.getArg(e,"line"),originalColumn:r.getArg(e,"column")};if(t.originalLine<1)throw new Error("Line numbers must be >= 1");if(t.originalColumn<0)throw new Error("Column numbers must be >= 0");let o,i=r.getArg(e,"bias",u.GREATEST_LOWER_BOUND);if(null==i&&(i=u.GREATEST_LOWER_BOUND),this._wasm.withMappingCallback(e=>o=e,()=>{this._wasm.exports.generated_location_for(this._getMappingsPtr(),t.source,t.originalLine-1,t.originalColumn,i)}),o&&o.source===t.source){let e=o.lastGeneratedColumn;return this._computedColumnSpans&&null===e&&(e=1/0),{line:r.getArg(o,"generatedLine",null),column:r.getArg(o,"generatedColumn",null),lastColumn:e}}return{line:null,column:null,lastColumn:null}}}c.prototype.consumer=u,n.BasicSourceMapConsumer=c;class g extends u{constructor(e,n){return super(a).then(t=>{let o=e;"string"==typeof e&&(o=r.parseSourceMapInput(e));const s=r.getArg(o,"version"),l=r.getArg(o,"sections");if(s!=t._version)throw new Error("Unsupported version: "+s);t._sources=new i,t._names=new i,t.__generatedMappings=null,t.__originalMappings=null,t.__generatedMappingsUnsorted=null,t.__originalMappingsUnsorted=null;let a={line:-1,column:0};return Promise.all(l.map(e=>{if(e.url)throw new Error("Support for url field in sections not implemented.");const t=r.getArg(e,"offset"),o=r.getArg(t,"line"),i=r.getArg(t,"column");if(o<a.line||o===a.line&&i<a.column)throw new Error("Section offsets must be ordered and non-overlapping.");a=t;return new u(r.getArg(e,"map"),n).then(e=>({generatedOffset:{generatedLine:o+1,generatedColumn:i+1},consumer:e}))})).then(e=>(t._sections=e,t))})}get _generatedMappings(){return this.__generatedMappings||this._sortGeneratedMappings(),this.__generatedMappings}get _originalMappings(){return this.__originalMappings||this._sortOriginalMappings(),this.__originalMappings}get _generatedMappingsUnsorted(){return this.__generatedMappingsUnsorted||this._parseMappings(this._mappings,this.sourceRoot),this.__generatedMappingsUnsorted}get _originalMappingsUnsorted(){return this.__originalMappingsUnsorted||this._parseMappings(this._mappings,this.sourceRoot),this.__originalMappingsUnsorted}_sortGeneratedMappings(){const e=this._generatedMappingsUnsorted;e.sort(r.compareByGeneratedPositionsDeflated),this.__generatedMappings=e}_sortOriginalMappings(){const e=this._originalMappingsUnsorted;e.sort(r.compareByOriginalPositions),this.__originalMappings=e}get sources(){const e=[];for(let n=0;n<this._sections.length;n++)for(let t=0;t<this._sections[n].consumer.sources.length;t++)e.push(this._sections[n].consumer.sources[t]);return e}originalPositionFor(e){const n={generatedLine:r.getArg(e,"line"),generatedColumn:r.getArg(e,"column")},t=o.search(n,this._sections,(function(e,n){const t=e.generatedLine-n.generatedOffset.generatedLine;return t||e.generatedColumn-n.generatedOffset.generatedColumn})),i=this._sections[t];return i?i.consumer.originalPositionFor({line:n.generatedLine-(i.generatedOffset.generatedLine-1),column:n.generatedColumn-(i.generatedOffset.generatedLine===n.generatedLine?i.generatedOffset.generatedColumn-1:0),bias:e.bias}):{source:null,line:null,column:null,name:null}}hasContentsOfAllSources(){return this._sections.every((function(e){return e.consumer.hasContentsOfAllSources()}))}sourceContentFor(e,n){for(let n=0;n<this._sections.length;n++){const t=this._sections[n].consumer.sourceContentFor(e,!0);if(t)return t}if(n)return null;throw new Error('"'+e+'" is not in the SourceMap.')}generatedPositionFor(e){for(let n=0;n<this._sections.length;n++){const t=this._sections[n];if(-1===t.consumer._findSourceIndex(r.getArg(e,"source")))continue;const o=t.consumer.generatedPositionFor(e);if(o){return{line:o.line+(t.generatedOffset.generatedLine-1),column:o.column+(t.generatedOffset.generatedLine===o.line?t.generatedOffset.generatedColumn-1:0)}}}return{line:null,column:null}}_parseMappings(e,n){const t=this.__generatedMappingsUnsorted=[],o=this.__originalMappingsUnsorted=[];for(let e=0;e<this._sections.length;e++){const n=this._sections[e],i=[];n.consumer.eachMapping(e=>i.push(e));for(let e=0;e<i.length;e++){const s=i[e];let l=r.computeSourceURL(n.consumer.sourceRoot,null,this._sourceMapURL);this._sources.add(l),l=this._sources.indexOf(l);let a=null;s.name&&(this._names.add(s.name),a=this._names.indexOf(s.name));const u={source:l,generatedLine:s.generatedLine+(n.generatedOffset.generatedLine-1),generatedColumn:s.generatedColumn+(n.generatedOffset.generatedLine===s.generatedLine?n.generatedOffset.generatedColumn-1:0),originalLine:s.originalLine,originalColumn:s.originalColumn,name:a};t.push(u),"number"==typeof u.originalLine&&o.push(u)}}}eachMapping(e,n,t){const o=n||null;let i;switch(t||u.GENERATED_ORDER){case u.GENERATED_ORDER:i=this._generatedMappings;break;case u.ORIGINAL_ORDER:i=this._originalMappings;break;default:throw new Error("Unknown order of iteration.")}const s=this.sourceRoot;i.map((function(e){let n=null;return null!==e.source&&(n=this._sources.at(e.source),n=r.computeSourceURL(s,n,this._sourceMapURL)),{source:n,generatedLine:e.generatedLine,generatedColumn:e.generatedColumn,originalLine:e.originalLine,originalColumn:e.originalColumn,name:null===e.name?null:this._names.at(e.name)}}),this).forEach(e,o)}_findMapping(e,n,t,r,i,s){if(e[t]<=0)throw new TypeError("Line must be greater than or equal to 1, got "+e[t]);if(e[r]<0)throw new TypeError("Column must be greater than or equal to 0, got "+e[r]);return o.search(e,n,i,s)}allGeneratedPositionsFor(e){const n=r.getArg(e,"line"),t={source:r.getArg(e,"source"),originalLine:n,originalColumn:r.getArg(e,"column",0)};if(t.source=this._findSourceIndex(t.source),t.source<0)return[];if(t.originalLine<1)throw new Error("Line numbers must be >= 1");if(t.originalColumn<0)throw new Error("Column numbers must be >= 0");const i=[];let s=this._findMapping(t,this._originalMappings,"originalLine","originalColumn",r.compareByOriginalPositions,o.LEAST_UPPER_BOUND);if(s>=0){let t=this._originalMappings[s];if(void 0===e.column){const e=t.originalLine;for(;t&&t.originalLine===e;){let e=t.lastGeneratedColumn;this._computedColumnSpans&&null===e&&(e=1/0),i.push({line:r.getArg(t,"generatedLine",null),column:r.getArg(t,"generatedColumn",null),lastColumn:e}),t=this._originalMappings[++s]}}else{const e=t.originalColumn;for(;t&&t.originalLine===n&&t.originalColumn==e;){let e=t.lastGeneratedColumn;this._computedColumnSpans&&null===e&&(e=1/0),i.push({line:r.getArg(t,"generatedLine",null),column:r.getArg(t,"generatedColumn",null),lastColumn:e}),t=this._originalMappings[++s]}}}return i}destroy(){for(let e=0;e<this._sections.length;e++)this._sections[e].consumer.destroy()}}n.IndexedSourceMapConsumer=g},function(e,n){n.GREATEST_LOWER_BOUND=1,n.LEAST_UPPER_BOUND=2,n.search=function(e,t,r,o){if(0===t.length)return-1;let i=function e(t,r,o,i,s,l){const a=Math.floor((r-t)/2)+t,u=s(o,i[a],!0);return 0===u?a:u>0?r-a>1?e(a,r,o,i,s,l):l==n.LEAST_UPPER_BOUND?r<i.length?r:-1:a:a-t>1?e(t,a,o,i,s,l):l==n.LEAST_UPPER_BOUND?a:t<0?-1:t}(-1,t.length,e,t,r,o||n.GREATEST_LOWER_BOUND);if(i<0)return-1;for(;i-1>=0&&0===r(t[i],t[i-1],!0);)--i;return i}},function(n,t){n.exports=e},function(e,t){e.exports=n},function(e,n,t){const r=t(4);function o(){this.generatedLine=0,this.generatedColumn=0,this.lastGeneratedColumn=null,this.source=null,this.originalLine=null,this.originalColumn=null,this.name=null}let i=null;e.exports=function(){if(i)return i;const e=[];return i=r().then(n=>WebAssembly.instantiate(n,{env:{mapping_callback(n,t,r,i,s,l,a,u,c,g){const p=new o;p.generatedLine=n+1,p.generatedColumn=t,r&&(p.lastGeneratedColumn=i-1),s&&(p.source=l,p.originalLine=a+1,p.originalColumn=u,c&&(p.name=g)),e[e.length-1](p)},start_all_generated_locations_for(){console.time("all_generated_locations_for")},end_all_generated_locations_for(){console.timeEnd("all_generated_locations_for")},start_compute_column_spans(){console.time("compute_column_spans")},end_compute_column_spans(){console.timeEnd("compute_column_spans")},start_generated_location_for(){console.time("generated_location_for")},end_generated_location_for(){console.timeEnd("generated_location_for")},start_original_location_for(){console.time("original_location_for")},end_original_location_for(){console.timeEnd("original_location_for")},start_parse_mappings(){console.time("parse_mappings")},end_parse_mappings(){console.timeEnd("parse_mappings")},start_sort_by_generated_location(){console.time("sort_by_generated_location")},end_sort_by_generated_location(){console.timeEnd("sort_by_generated_location")},start_sort_by_original_location(){console.time("sort_by_original_location")},end_sort_by_original_location(){console.timeEnd("sort_by_original_location")}}})).then(n=>({exports:n.instance.exports,withMappingCallback:(n,t)=>{e.push(n);try{t()}finally{e.pop()}}})).then(null,e=>{throw i=null,e}),i}},function(e,n,t){const r=t(1).SourceMapGenerator,o=t(0),i=/(\r?\n)/,s="$$$isSourceNode$$$";class l{constructor(e,n,t,r,o){this.children=[],this.sourceContents={},this.line=null==e?null:e,this.column=null==n?null:n,this.source=null==t?null:t,this.name=null==o?null:o,this[s]=!0,null!=r&&this.add(r)}static fromStringWithSourceMap(e,n,t){const r=new l,s=e.split(i);let a=0;const u=function(){return e()+(e()||"");function e(){return a<s.length?s[a++]:void 0}};let c,g=1,p=0,h=null;return n.eachMapping((function(e){if(null!==h){if(!(g<e.generatedLine)){c=s[a]||"";const n=c.substr(0,e.generatedColumn-p);return s[a]=c.substr(e.generatedColumn-p),p=e.generatedColumn,m(h,n),void(h=e)}m(h,u()),g++,p=0}for(;g<e.generatedLine;)r.add(u()),g++;p<e.generatedColumn&&(c=s[a]||"",r.add(c.substr(0,e.generatedColumn)),s[a]=c.substr(e.generatedColumn),p=e.generatedColumn),h=e}),this),a<s.length&&(h&&m(h,u()),r.add(s.splice(a).join(""))),n.sources.forEach((function(e){const i=n.sourceContentFor(e);null!=i&&(null!=t&&(e=o.join(t,e)),r.setSourceContent(e,i))})),r;function m(e,n){if(null===e||void 0===e.source)r.add(n);else{const i=t?o.join(t,e.source):e.source;r.add(new l(e.originalLine,e.originalColumn,i,n,e.name))}}}add(e){if(Array.isArray(e))e.forEach((function(e){this.add(e)}),this);else{if(!e[s]&&"string"!=typeof e)throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+e);e&&this.children.push(e)}return this}prepend(e){if(Array.isArray(e))for(let n=e.length-1;n>=0;n--)this.prepend(e[n]);else{if(!e[s]&&"string"!=typeof e)throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+e);this.children.unshift(e)}return this}walk(e){let n;for(let t=0,r=this.children.length;t<r;t++)n=this.children[t],n[s]?n.walk(e):""!==n&&e(n,{source:this.source,line:this.line,column:this.column,name:this.name})}join(e){let n,t;const r=this.children.length;if(r>0){for(n=[],t=0;t<r-1;t++)n.push(this.children[t]),n.push(e);n.push(this.children[t]),this.children=n}return this}replaceRight(e,n){const t=this.children[this.children.length-1];return t[s]?t.replaceRight(e,n):"string"==typeof t?this.children[this.children.length-1]=t.replace(e,n):this.children.push("".replace(e,n)),this}setSourceContent(e,n){this.sourceContents[o.toSetString(e)]=n}walkSourceContents(e){for(let n=0,t=this.children.length;n<t;n++)this.children[n][s]&&this.children[n].walkSourceContents(e);const n=Object.keys(this.sourceContents);for(let t=0,r=n.length;t<r;t++)e(o.fromSetString(n[t]),this.sourceContents[n[t]])}toString(){let e="";return this.walk((function(n){e+=n})),e}toStringWithSourceMap(e){const n={code:"",line:1,column:0},t=new r(e);let o=!1,i=null,s=null,l=null,a=null;return this.walk((function(e,r){n.code+=e,null!==r.source&&null!==r.line&&null!==r.column?(i===r.source&&s===r.line&&l===r.column&&a===r.name||t.addMapping({source:r.source,original:{line:r.line,column:r.column},generated:{line:n.line,column:n.column},name:r.name}),i=r.source,s=r.line,l=r.column,a=r.name,o=!0):o&&(t.addMapping({generated:{line:n.line,column:n.column}}),i=null,o=!1);for(let s=0,l=e.length;s<l;s++)10===e.charCodeAt(s)?(n.line++,n.column=0,s+1===l?(i=null,o=!1):o&&t.addMapping({source:r.source,original:{line:r.line,column:r.column},generated:{line:n.line,column:n.column},name:r.name})):n.column++})),this.walkSourceContents((function(e,n){t.setSourceContent(e,n)})),{code:n.code,map:t}}}n.SourceNode=l}])})); \ No newline at end of file
diff --git a/node_modules/doiuse/node_modules/source-map/lib/array-set.js b/node_modules/doiuse/node_modules/source-map/lib/array-set.js
new file mode 100644
index 00000000..40171b9a
--- /dev/null
+++ b/node_modules/doiuse/node_modules/source-map/lib/array-set.js
@@ -0,0 +1,100 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+/**
+ * A data structure which is a combination of an array and a set. Adding a new
+ * member is O(1), testing for membership is O(1), and finding the index of an
+ * element is O(1). Removing elements from the set is not supported. Only
+ * strings are supported for membership.
+ */
+class ArraySet {
+ constructor() {
+ this._array = [];
+ this._set = new Map();
+ }
+
+ /**
+ * Static method for creating ArraySet instances from an existing array.
+ */
+ static fromArray(aArray, aAllowDuplicates) {
+ const set = new ArraySet();
+ for (let i = 0, len = aArray.length; i < len; i++) {
+ set.add(aArray[i], aAllowDuplicates);
+ }
+ return set;
+ }
+
+ /**
+ * Return how many unique items are in this ArraySet. If duplicates have been
+ * added, than those do not count towards the size.
+ *
+ * @returns Number
+ */
+ size() {
+ return this._set.size;
+ }
+
+ /**
+ * Add the given string to this set.
+ *
+ * @param String aStr
+ */
+ add(aStr, aAllowDuplicates) {
+ const isDuplicate = this.has(aStr);
+ const idx = this._array.length;
+ if (!isDuplicate || aAllowDuplicates) {
+ this._array.push(aStr);
+ }
+ if (!isDuplicate) {
+ this._set.set(aStr, idx);
+ }
+ }
+
+ /**
+ * Is the given string a member of this set?
+ *
+ * @param String aStr
+ */
+ has(aStr) {
+ return this._set.has(aStr);
+ }
+
+ /**
+ * What is the index of the given string in the array?
+ *
+ * @param String aStr
+ */
+ indexOf(aStr) {
+ const idx = this._set.get(aStr);
+ if (idx >= 0) {
+ return idx;
+ }
+ throw new Error('"' + aStr + '" is not in the set.');
+ }
+
+ /**
+ * What is the element at the given index?
+ *
+ * @param Number aIdx
+ */
+ at(aIdx) {
+ if (aIdx >= 0 && aIdx < this._array.length) {
+ return this._array[aIdx];
+ }
+ throw new Error("No element indexed by " + aIdx);
+ }
+
+ /**
+ * Returns the array representation of this set (which has the proper indices
+ * indicated by indexOf). Note that this is a copy of the internal array used
+ * for storing the members so that no one can mess with internal state.
+ */
+ toArray() {
+ return this._array.slice();
+ }
+}
+exports.ArraySet = ArraySet;
diff --git a/node_modules/doiuse/node_modules/source-map/lib/base64-vlq.js b/node_modules/doiuse/node_modules/source-map/lib/base64-vlq.js
new file mode 100644
index 00000000..fc1049c8
--- /dev/null
+++ b/node_modules/doiuse/node_modules/source-map/lib/base64-vlq.js
@@ -0,0 +1,111 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ *
+ * Based on the Base 64 VLQ implementation in Closure Compiler:
+ * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java
+ *
+ * Copyright 2011 The Closure Compiler Authors. All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+const base64 = require("./base64");
+
+// A single base 64 digit can contain 6 bits of data. For the base 64 variable
+// length quantities we use in the source map spec, the first bit is the sign,
+// the next four bits are the actual value, and the 6th bit is the
+// continuation bit. The continuation bit tells us whether there are more
+// digits in this value following this digit.
+//
+// Continuation
+// | Sign
+// | |
+// V V
+// 101011
+
+const VLQ_BASE_SHIFT = 5;
+
+// binary: 100000
+const VLQ_BASE = 1 << VLQ_BASE_SHIFT;
+
+// binary: 011111
+const VLQ_BASE_MASK = VLQ_BASE - 1;
+
+// binary: 100000
+const VLQ_CONTINUATION_BIT = VLQ_BASE;
+
+/**
+ * Converts from a two-complement value to a value where the sign bit is
+ * placed in the least significant bit. For example, as decimals:
+ * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)
+ * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)
+ */
+function toVLQSigned(aValue) {
+ return aValue < 0
+ ? ((-aValue) << 1) + 1
+ : (aValue << 1) + 0;
+}
+
+/**
+ * Converts to a two-complement value from a value where the sign bit is
+ * placed in the least significant bit. For example, as decimals:
+ * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1
+ * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2
+ */
+// eslint-disable-next-line no-unused-vars
+function fromVLQSigned(aValue) {
+ const isNegative = (aValue & 1) === 1;
+ const shifted = aValue >> 1;
+ return isNegative
+ ? -shifted
+ : shifted;
+}
+
+/**
+ * Returns the base 64 VLQ encoded value.
+ */
+exports.encode = function base64VLQ_encode(aValue) {
+ let encoded = "";
+ let digit;
+
+ let vlq = toVLQSigned(aValue);
+
+ do {
+ digit = vlq & VLQ_BASE_MASK;
+ vlq >>>= VLQ_BASE_SHIFT;
+ if (vlq > 0) {
+ // There are still more digits in this value, so we must make sure the
+ // continuation bit is marked.
+ digit |= VLQ_CONTINUATION_BIT;
+ }
+ encoded += base64.encode(digit);
+ } while (vlq > 0);
+
+ return encoded;
+};
diff --git a/node_modules/doiuse/node_modules/source-map/lib/base64.js b/node_modules/doiuse/node_modules/source-map/lib/base64.js
new file mode 100644
index 00000000..b9ca3199
--- /dev/null
+++ b/node_modules/doiuse/node_modules/source-map/lib/base64.js
@@ -0,0 +1,18 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+const intToCharMap = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("");
+
+/**
+ * Encode an integer in the range of 0 to 63 to a single base 64 digit.
+ */
+exports.encode = function(number) {
+ if (0 <= number && number < intToCharMap.length) {
+ return intToCharMap[number];
+ }
+ throw new TypeError("Must be between 0 and 63: " + number);
+};
diff --git a/node_modules/doiuse/node_modules/source-map/lib/binary-search.js b/node_modules/doiuse/node_modules/source-map/lib/binary-search.js
new file mode 100644
index 00000000..d6f898ea
--- /dev/null
+++ b/node_modules/doiuse/node_modules/source-map/lib/binary-search.js
@@ -0,0 +1,107 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+exports.GREATEST_LOWER_BOUND = 1;
+exports.LEAST_UPPER_BOUND = 2;
+
+/**
+ * Recursive implementation of binary search.
+ *
+ * @param aLow Indices here and lower do not contain the needle.
+ * @param aHigh Indices here and higher do not contain the needle.
+ * @param aNeedle The element being searched for.
+ * @param aHaystack The non-empty array being searched.
+ * @param aCompare Function which takes two elements and returns -1, 0, or 1.
+ * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
+ * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ */
+function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {
+ // This function terminates when one of the following is true:
+ //
+ // 1. We find the exact element we are looking for.
+ //
+ // 2. We did not find the exact element, but we can return the index of
+ // the next-closest element.
+ //
+ // 3. We did not find the exact element, and there is no next-closest
+ // element than the one we are searching for, so we return -1.
+ const mid = Math.floor((aHigh - aLow) / 2) + aLow;
+ const cmp = aCompare(aNeedle, aHaystack[mid], true);
+ if (cmp === 0) {
+ // Found the element we are looking for.
+ return mid;
+ } else if (cmp > 0) {
+ // Our needle is greater than aHaystack[mid].
+ if (aHigh - mid > 1) {
+ // The element is in the upper half.
+ return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);
+ }
+
+ // The exact needle element was not found in this haystack. Determine if
+ // we are in termination case (3) or (2) and return the appropriate thing.
+ if (aBias == exports.LEAST_UPPER_BOUND) {
+ return aHigh < aHaystack.length ? aHigh : -1;
+ }
+ return mid;
+ }
+
+ // Our needle is less than aHaystack[mid].
+ if (mid - aLow > 1) {
+ // The element is in the lower half.
+ return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);
+ }
+
+ // we are in termination case (3) or (2) and return the appropriate thing.
+ if (aBias == exports.LEAST_UPPER_BOUND) {
+ return mid;
+ }
+ return aLow < 0 ? -1 : aLow;
+}
+
+/**
+ * This is an implementation of binary search which will always try and return
+ * the index of the closest element if there is no exact hit. This is because
+ * mappings between original and generated line/col pairs are single points,
+ * and there is an implicit region between each of them, so a miss just means
+ * that you aren't on the very start of a region.
+ *
+ * @param aNeedle The element you are looking for.
+ * @param aHaystack The array that is being searched.
+ * @param aCompare A function which takes the needle and an element in the
+ * array and returns -1, 0, or 1 depending on whether the needle is less
+ * than, equal to, or greater than the element, respectively.
+ * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
+ * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.
+ */
+exports.search = function search(aNeedle, aHaystack, aCompare, aBias) {
+ if (aHaystack.length === 0) {
+ return -1;
+ }
+
+ let index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,
+ aCompare, aBias || exports.GREATEST_LOWER_BOUND);
+ if (index < 0) {
+ return -1;
+ }
+
+ // We have found either the exact element, or the next-closest element than
+ // the one we are searching for. However, there may be more than one such
+ // element. Make sure we always return the smallest of these.
+ while (index - 1 >= 0) {
+ if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {
+ break;
+ }
+ --index;
+ }
+
+ return index;
+};
diff --git a/node_modules/doiuse/node_modules/source-map/lib/mapping-list.js b/node_modules/doiuse/node_modules/source-map/lib/mapping-list.js
new file mode 100644
index 00000000..70568610
--- /dev/null
+++ b/node_modules/doiuse/node_modules/source-map/lib/mapping-list.js
@@ -0,0 +1,80 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2014 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+const util = require("./util");
+
+/**
+ * Determine whether mappingB is after mappingA with respect to generated
+ * position.
+ */
+function generatedPositionAfter(mappingA, mappingB) {
+ // Optimized for most common case
+ const lineA = mappingA.generatedLine;
+ const lineB = mappingB.generatedLine;
+ const columnA = mappingA.generatedColumn;
+ const columnB = mappingB.generatedColumn;
+ return lineB > lineA || lineB == lineA && columnB >= columnA ||
+ util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;
+}
+
+/**
+ * A data structure to provide a sorted view of accumulated mappings in a
+ * performance conscious manner. It trades a negligible overhead in general
+ * case for a large speedup in case of mappings being added in order.
+ */
+class MappingList {
+ constructor() {
+ this._array = [];
+ this._sorted = true;
+ // Serves as infimum
+ this._last = {generatedLine: -1, generatedColumn: 0};
+ }
+
+ /**
+ * Iterate through internal items. This method takes the same arguments that
+ * `Array.prototype.forEach` takes.
+ *
+ * NOTE: The order of the mappings is NOT guaranteed.
+ */
+ unsortedForEach(aCallback, aThisArg) {
+ this._array.forEach(aCallback, aThisArg);
+ }
+
+ /**
+ * Add the given source mapping.
+ *
+ * @param Object aMapping
+ */
+ add(aMapping) {
+ if (generatedPositionAfter(this._last, aMapping)) {
+ this._last = aMapping;
+ this._array.push(aMapping);
+ } else {
+ this._sorted = false;
+ this._array.push(aMapping);
+ }
+ }
+
+ /**
+ * Returns the flat, sorted array of mappings. The mappings are sorted by
+ * generated position.
+ *
+ * WARNING: This method returns internal data without copying, for
+ * performance. The return value must NOT be mutated, and should be treated as
+ * an immutable borrow. If you want to take ownership, you must make your own
+ * copy.
+ */
+ toArray() {
+ if (!this._sorted) {
+ this._array.sort(util.compareByGeneratedPositionsInflated);
+ this._sorted = true;
+ }
+ return this._array;
+ }
+}
+
+exports.MappingList = MappingList;
diff --git a/node_modules/doiuse/node_modules/source-map/lib/mappings.wasm b/node_modules/doiuse/node_modules/source-map/lib/mappings.wasm
new file mode 100644
index 00000000..35153707
--- /dev/null
+++ b/node_modules/doiuse/node_modules/source-map/lib/mappings.wasm
Binary files differ
diff --git a/node_modules/doiuse/node_modules/source-map/lib/read-wasm.js b/node_modules/doiuse/node_modules/source-map/lib/read-wasm.js
new file mode 100644
index 00000000..e81c1772
--- /dev/null
+++ b/node_modules/doiuse/node_modules/source-map/lib/read-wasm.js
@@ -0,0 +1,49 @@
+/* Determine browser vs node environment by testing the default top level context. Solution courtesy of: https://stackoverflow.com/questions/17575790/environment-detection-node-js-or-browser */
+const isBrowserEnvironment = (function() {
+ // eslint-disable-next-line no-undef
+ return (typeof window !== "undefined") && (this === window);
+}).call();
+
+if (isBrowserEnvironment) {
+ // Web version of reading a wasm file into an array buffer.
+
+ let mappingsWasm = null;
+
+ module.exports = function readWasm() {
+ if (typeof mappingsWasm === "string") {
+ return fetch(mappingsWasm)
+ .then(response => response.arrayBuffer());
+ }
+ if (mappingsWasm instanceof ArrayBuffer) {
+ return Promise.resolve(mappingsWasm);
+ }
+ throw new Error("You must provide the string URL or ArrayBuffer contents " +
+ "of lib/mappings.wasm by calling " +
+ "SourceMapConsumer.initialize({ 'lib/mappings.wasm': ... }) " +
+ "before using SourceMapConsumer");
+ };
+
+ module.exports.initialize = input => mappingsWasm = input;
+} else {
+ // Node version of reading a wasm file into an array buffer.
+ const fs = require("fs");
+ const path = require("path");
+
+ module.exports = function readWasm() {
+ return new Promise((resolve, reject) => {
+ const wasmPath = path.join(__dirname, "mappings.wasm");
+ fs.readFile(wasmPath, null, (error, data) => {
+ if (error) {
+ reject(error);
+ return;
+ }
+
+ resolve(data.buffer);
+ });
+ });
+ };
+
+ module.exports.initialize = _ => {
+ console.debug("SourceMapConsumer.initialize is a no-op when running in node.js");
+ };
+}
diff --git a/node_modules/doiuse/node_modules/source-map/lib/source-map-consumer.js b/node_modules/doiuse/node_modules/source-map/lib/source-map-consumer.js
new file mode 100644
index 00000000..9aaf92f5
--- /dev/null
+++ b/node_modules/doiuse/node_modules/source-map/lib/source-map-consumer.js
@@ -0,0 +1,1237 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+const util = require("./util");
+const binarySearch = require("./binary-search");
+const ArraySet = require("./array-set").ArraySet;
+const base64VLQ = require("./base64-vlq"); // eslint-disable-line no-unused-vars
+const readWasm = require("../lib/read-wasm");
+const wasm = require("./wasm");
+
+const INTERNAL = Symbol("smcInternal");
+
+class SourceMapConsumer {
+ constructor(aSourceMap, aSourceMapURL) {
+ // If the constructor was called by super(), just return Promise<this>.
+ // Yes, this is a hack to retain the pre-existing API of the base-class
+ // constructor also being an async factory function.
+ if (aSourceMap == INTERNAL) {
+ return Promise.resolve(this);
+ }
+
+ return _factory(aSourceMap, aSourceMapURL);
+ }
+
+ static initialize(opts) {
+ readWasm.initialize(opts["lib/mappings.wasm"]);
+ }
+
+ static fromSourceMap(aSourceMap, aSourceMapURL) {
+ return _factoryBSM(aSourceMap, aSourceMapURL);
+ }
+
+ /**
+ * Construct a new `SourceMapConsumer` from `rawSourceMap` and `sourceMapUrl`
+ * (see the `SourceMapConsumer` constructor for details. Then, invoke the `async
+ * function f(SourceMapConsumer) -> T` with the newly constructed consumer, wait
+ * for `f` to complete, call `destroy` on the consumer, and return `f`'s return
+ * value.
+ *
+ * You must not use the consumer after `f` completes!
+ *
+ * By using `with`, you do not have to remember to manually call `destroy` on
+ * the consumer, since it will be called automatically once `f` completes.
+ *
+ * ```js
+ * const xSquared = await SourceMapConsumer.with(
+ * myRawSourceMap,
+ * null,
+ * async function (consumer) {
+ * // Use `consumer` inside here and don't worry about remembering
+ * // to call `destroy`.
+ *
+ * const x = await whatever(consumer);
+ * return x * x;
+ * }
+ * );
+ *
+ * // You may not use that `consumer` anymore out here; it has
+ * // been destroyed. But you can use `xSquared`.
+ * console.log(xSquared);
+ * ```
+ */
+ static async with(rawSourceMap, sourceMapUrl, f) {
+ const consumer = await new SourceMapConsumer(rawSourceMap, sourceMapUrl);
+ try {
+ return await f(consumer);
+ } finally {
+ consumer.destroy();
+ }
+ }
+
+ /**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+ _parseMappings(aStr, aSourceRoot) {
+ throw new Error("Subclasses must implement _parseMappings");
+ }
+
+ /**
+ * Iterate over each mapping between an original source/line/column and a
+ * generated line/column in this source map.
+ *
+ * @param Function aCallback
+ * The function that is called with each mapping.
+ * @param Object aContext
+ * Optional. If specified, this object will be the value of `this` every
+ * time that `aCallback` is called.
+ * @param aOrder
+ * Either `SourceMapConsumer.GENERATED_ORDER` or
+ * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to
+ * iterate over the mappings sorted by the generated file's line/column
+ * order or the original's source/line/column order, respectively. Defaults to
+ * `SourceMapConsumer.GENERATED_ORDER`.
+ */
+ eachMapping(aCallback, aContext, aOrder) {
+ throw new Error("Subclasses must implement eachMapping");
+ }
+
+ /**
+ * Returns all generated line and column information for the original source,
+ * line, and column provided. If no column is provided, returns all mappings
+ * corresponding to a either the line we are searching for or the next
+ * closest line that has any mappings. Otherwise, returns all mappings
+ * corresponding to the given line and either the column we are searching for
+ * or the next closest column that has any offsets.
+ *
+ * The only argument is an object with the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source. The line number is 1-based.
+ * - column: Optional. the column number in the original source.
+ * The column number is 0-based.
+ *
+ * and an array of objects is returned, each with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+ allGeneratedPositionsFor(aArgs) {
+ throw new Error("Subclasses must implement allGeneratedPositionsFor");
+ }
+
+ destroy() {
+ throw new Error("Subclasses must implement destroy");
+ }
+}
+
+/**
+ * The version of the source mapping spec that we are consuming.
+ */
+SourceMapConsumer.prototype._version = 3;
+SourceMapConsumer.GENERATED_ORDER = 1;
+SourceMapConsumer.ORIGINAL_ORDER = 2;
+
+SourceMapConsumer.GREATEST_LOWER_BOUND = 1;
+SourceMapConsumer.LEAST_UPPER_BOUND = 2;
+
+exports.SourceMapConsumer = SourceMapConsumer;
+
+/**
+ * A BasicSourceMapConsumer instance represents a parsed source map which we can
+ * query for information about the original file positions by giving it a file
+ * position in the generated source.
+ *
+ * The first parameter is the raw source map (either as a JSON string, or
+ * already parsed to an object). According to the spec, source maps have the
+ * following attributes:
+ *
+ * - version: Which version of the source map spec this map is following.
+ * - sources: An array of URLs to the original source files.
+ * - names: An array of identifiers which can be referenced by individual mappings.
+ * - sourceRoot: Optional. The URL root from which all sources are relative.
+ * - sourcesContent: Optional. An array of contents of the original source files.
+ * - mappings: A string of base64 VLQs which contain the actual mappings.
+ * - file: Optional. The generated file this source map is associated with.
+ *
+ * Here is an example source map, taken from the source map spec[0]:
+ *
+ * {
+ * version : 3,
+ * file: "out.js",
+ * sourceRoot : "",
+ * sources: ["foo.js", "bar.js"],
+ * names: ["src", "maps", "are", "fun"],
+ * mappings: "AA,AB;;ABCDE;"
+ * }
+ *
+ * The second parameter, if given, is a string whose value is the URL
+ * at which the source map was found. This URL is used to compute the
+ * sources array.
+ *
+ * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#
+ */
+class BasicSourceMapConsumer extends SourceMapConsumer {
+ constructor(aSourceMap, aSourceMapURL) {
+ return super(INTERNAL).then(that => {
+ let sourceMap = aSourceMap;
+ if (typeof aSourceMap === "string") {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ const version = util.getArg(sourceMap, "version");
+ let sources = util.getArg(sourceMap, "sources");
+ // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which
+ // requires the array) to play nice here.
+ const names = util.getArg(sourceMap, "names", []);
+ let sourceRoot = util.getArg(sourceMap, "sourceRoot", null);
+ const sourcesContent = util.getArg(sourceMap, "sourcesContent", null);
+ const mappings = util.getArg(sourceMap, "mappings");
+ const file = util.getArg(sourceMap, "file", null);
+
+ // Once again, Sass deviates from the spec and supplies the version as a
+ // string rather than a number, so we use loose equality checking here.
+ if (version != that._version) {
+ throw new Error("Unsupported version: " + version);
+ }
+
+ if (sourceRoot) {
+ sourceRoot = util.normalize(sourceRoot);
+ }
+
+ sources = sources
+ .map(String)
+ // Some source maps produce relative source paths like "./foo.js" instead of
+ // "foo.js". Normalize these first so that future comparisons will succeed.
+ // See bugzil.la/1090768.
+ .map(util.normalize)
+ // Always ensure that absolute sources are internally stored relative to
+ // the source root, if the source root is absolute. Not doing this would
+ // be particularly problematic when the source root is a prefix of the
+ // source (valid, but why??). See github issue #199 and bugzil.la/1188982.
+ .map(function(source) {
+ return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)
+ ? util.relative(sourceRoot, source)
+ : source;
+ });
+
+ // Pass `true` below to allow duplicate names and sources. While source maps
+ // are intended to be compressed and deduplicated, the TypeScript compiler
+ // sometimes generates source maps with duplicates in them. See Github issue
+ // #72 and bugzil.la/889492.
+ that._names = ArraySet.fromArray(names.map(String), true);
+ that._sources = ArraySet.fromArray(sources, true);
+
+ that._absoluteSources = that._sources.toArray().map(function(s) {
+ return util.computeSourceURL(sourceRoot, s, aSourceMapURL);
+ });
+
+ that.sourceRoot = sourceRoot;
+ that.sourcesContent = sourcesContent;
+ that._mappings = mappings;
+ that._sourceMapURL = aSourceMapURL;
+ that.file = file;
+
+ that._computedColumnSpans = false;
+ that._mappingsPtr = 0;
+ that._wasm = null;
+
+ return wasm().then(w => {
+ that._wasm = w;
+ return that;
+ });
+ });
+ }
+
+ /**
+ * Utility function to find the index of a source. Returns -1 if not
+ * found.
+ */
+ _findSourceIndex(aSource) {
+ let relativeSource = aSource;
+ if (this.sourceRoot != null) {
+ relativeSource = util.relative(this.sourceRoot, relativeSource);
+ }
+
+ if (this._sources.has(relativeSource)) {
+ return this._sources.indexOf(relativeSource);
+ }
+
+ // Maybe aSource is an absolute URL as returned by |sources|. In
+ // this case we can't simply undo the transform.
+ for (let i = 0; i < this._absoluteSources.length; ++i) {
+ if (this._absoluteSources[i] == aSource) {
+ return i;
+ }
+ }
+
+ return -1;
+ }
+
+ /**
+ * Create a BasicSourceMapConsumer from a SourceMapGenerator.
+ *
+ * @param SourceMapGenerator aSourceMap
+ * The source map that will be consumed.
+ * @param String aSourceMapURL
+ * The URL at which the source map can be found (optional)
+ * @returns BasicSourceMapConsumer
+ */
+ static fromSourceMap(aSourceMap, aSourceMapURL) {
+ return new BasicSourceMapConsumer(aSourceMap.toString());
+ }
+
+ get sources() {
+ return this._absoluteSources.slice();
+ }
+
+ _getMappingsPtr() {
+ if (this._mappingsPtr === 0) {
+ this._parseMappings(this._mappings, this.sourceRoot);
+ }
+
+ return this._mappingsPtr;
+ }
+
+ /**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+ _parseMappings(aStr, aSourceRoot) {
+ const size = aStr.length;
+
+ const mappingsBufPtr = this._wasm.exports.allocate_mappings(size);
+ const mappingsBuf = new Uint8Array(this._wasm.exports.memory.buffer, mappingsBufPtr, size);
+ for (let i = 0; i < size; i++) {
+ mappingsBuf[i] = aStr.charCodeAt(i);
+ }
+
+ const mappingsPtr = this._wasm.exports.parse_mappings(mappingsBufPtr);
+
+ if (!mappingsPtr) {
+ const error = this._wasm.exports.get_last_error();
+ let msg = `Error parsing mappings (code ${error}): `;
+
+ // XXX: keep these error codes in sync with `fitzgen/source-map-mappings`.
+ switch (error) {
+ case 1:
+ msg += "the mappings contained a negative line, column, source index, or name index";
+ break;
+ case 2:
+ msg += "the mappings contained a number larger than 2**32";
+ break;
+ case 3:
+ msg += "reached EOF while in the middle of parsing a VLQ";
+ break;
+ case 4:
+ msg += "invalid base 64 character while parsing a VLQ";
+ break;
+ default:
+ msg += "unknown error code";
+ break;
+ }
+
+ throw new Error(msg);
+ }
+
+ this._mappingsPtr = mappingsPtr;
+ }
+
+ eachMapping(aCallback, aContext, aOrder) {
+ const context = aContext || null;
+ const order = aOrder || SourceMapConsumer.GENERATED_ORDER;
+ const sourceRoot = this.sourceRoot;
+
+ this._wasm.withMappingCallback(
+ mapping => {
+ if (mapping.source !== null) {
+ mapping.source = this._sources.at(mapping.source);
+ mapping.source = util.computeSourceURL(sourceRoot, mapping.source, this._sourceMapURL);
+
+ if (mapping.name !== null) {
+ mapping.name = this._names.at(mapping.name);
+ }
+ }
+
+ aCallback.call(context, mapping);
+ },
+ () => {
+ switch (order) {
+ case SourceMapConsumer.GENERATED_ORDER:
+ this._wasm.exports.by_generated_location(this._getMappingsPtr());
+ break;
+ case SourceMapConsumer.ORIGINAL_ORDER:
+ this._wasm.exports.by_original_location(this._getMappingsPtr());
+ break;
+ default:
+ throw new Error("Unknown order of iteration.");
+ }
+ }
+ );
+ }
+
+ allGeneratedPositionsFor(aArgs) {
+ let source = util.getArg(aArgs, "source");
+ const originalLine = util.getArg(aArgs, "line");
+ const originalColumn = aArgs.column || 0;
+
+ source = this._findSourceIndex(source);
+ if (source < 0) {
+ return [];
+ }
+
+ if (originalLine < 1) {
+ throw new Error("Line numbers must be >= 1");
+ }
+
+ if (originalColumn < 0) {
+ throw new Error("Column numbers must be >= 0");
+ }
+
+ const mappings = [];
+
+ this._wasm.withMappingCallback(
+ m => {
+ let lastColumn = m.lastGeneratedColumn;
+ if (this._computedColumnSpans && lastColumn === null) {
+ lastColumn = Infinity;
+ }
+ mappings.push({
+ line: m.generatedLine,
+ column: m.generatedColumn,
+ lastColumn,
+ });
+ }, () => {
+ this._wasm.exports.all_generated_locations_for(
+ this._getMappingsPtr(),
+ source,
+ originalLine - 1,
+ "column" in aArgs,
+ originalColumn
+ );
+ }
+ );
+
+ return mappings;
+ }
+
+ destroy() {
+ if (this._mappingsPtr !== 0) {
+ this._wasm.exports.free_mappings(this._mappingsPtr);
+ this._mappingsPtr = 0;
+ }
+ }
+
+ /**
+ * Compute the last column for each generated mapping. The last column is
+ * inclusive.
+ */
+ computeColumnSpans() {
+ if (this._computedColumnSpans) {
+ return;
+ }
+
+ this._wasm.exports.compute_column_spans(this._getMappingsPtr());
+ this._computedColumnSpans = true;
+ }
+
+ /**
+ * Returns the original source, line, and column information for the generated
+ * source's line and column positions provided. The only argument is an object
+ * with the following properties:
+ *
+ * - line: The line number in the generated source. The line number
+ * is 1-based.
+ * - column: The column number in the generated source. The column
+ * number is 0-based.
+ * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
+ * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - source: The original source file, or null.
+ * - line: The line number in the original source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the original source, or null. The
+ * column number is 0-based.
+ * - name: The original identifier, or null.
+ */
+ originalPositionFor(aArgs) {
+ const needle = {
+ generatedLine: util.getArg(aArgs, "line"),
+ generatedColumn: util.getArg(aArgs, "column")
+ };
+
+ if (needle.generatedLine < 1) {
+ throw new Error("Line numbers must be >= 1");
+ }
+
+ if (needle.generatedColumn < 0) {
+ throw new Error("Column numbers must be >= 0");
+ }
+
+ let bias = util.getArg(aArgs, "bias", SourceMapConsumer.GREATEST_LOWER_BOUND);
+ if (bias == null) {
+ bias = SourceMapConsumer.GREATEST_LOWER_BOUND;
+ }
+
+ let mapping;
+ this._wasm.withMappingCallback(m => mapping = m, () => {
+ this._wasm.exports.original_location_for(
+ this._getMappingsPtr(),
+ needle.generatedLine - 1,
+ needle.generatedColumn,
+ bias
+ );
+ });
+
+ if (mapping) {
+ if (mapping.generatedLine === needle.generatedLine) {
+ let source = util.getArg(mapping, "source", null);
+ if (source !== null) {
+ source = this._sources.at(source);
+ source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);
+ }
+
+ let name = util.getArg(mapping, "name", null);
+ if (name !== null) {
+ name = this._names.at(name);
+ }
+
+ return {
+ source,
+ line: util.getArg(mapping, "originalLine", null),
+ column: util.getArg(mapping, "originalColumn", null),
+ name
+ };
+ }
+ }
+
+ return {
+ source: null,
+ line: null,
+ column: null,
+ name: null
+ };
+ }
+
+ /**
+ * Return true if we have the source content for every source in the source
+ * map, false otherwise.
+ */
+ hasContentsOfAllSources() {
+ if (!this.sourcesContent) {
+ return false;
+ }
+ return this.sourcesContent.length >= this._sources.size() &&
+ !this.sourcesContent.some(function(sc) { return sc == null; });
+ }
+
+ /**
+ * Returns the original source content. The only argument is the url of the
+ * original source file. Returns null if no original source content is
+ * available.
+ */
+ sourceContentFor(aSource, nullOnMissing) {
+ if (!this.sourcesContent) {
+ return null;
+ }
+
+ const index = this._findSourceIndex(aSource);
+ if (index >= 0) {
+ return this.sourcesContent[index];
+ }
+
+ let relativeSource = aSource;
+ if (this.sourceRoot != null) {
+ relativeSource = util.relative(this.sourceRoot, relativeSource);
+ }
+
+ let url;
+ if (this.sourceRoot != null
+ && (url = util.urlParse(this.sourceRoot))) {
+ // XXX: file:// URIs and absolute paths lead to unexpected behavior for
+ // many users. We can help them out when they expect file:// URIs to
+ // behave like it would if they were running a local HTTP server. See
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.
+ const fileUriAbsPath = relativeSource.replace(/^file:\/\//, "");
+ if (url.scheme == "file"
+ && this._sources.has(fileUriAbsPath)) {
+ return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)];
+ }
+
+ if ((!url.path || url.path == "/")
+ && this._sources.has("/" + relativeSource)) {
+ return this.sourcesContent[this._sources.indexOf("/" + relativeSource)];
+ }
+ }
+
+ // This function is used recursively from
+ // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we
+ // don't want to throw if we can't find the source - we just want to
+ // return null, so we provide a flag to exit gracefully.
+ if (nullOnMissing) {
+ return null;
+ }
+
+ throw new Error('"' + relativeSource + '" is not in the SourceMap.');
+ }
+
+ /**
+ * Returns the generated line and column information for the original source,
+ * line, and column positions provided. The only argument is an object with
+ * the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source. The line number
+ * is 1-based.
+ * - column: The column number in the original source. The column
+ * number is 0-based.
+ * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
+ * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+ generatedPositionFor(aArgs) {
+ let source = util.getArg(aArgs, "source");
+ source = this._findSourceIndex(source);
+ if (source < 0) {
+ return {
+ line: null,
+ column: null,
+ lastColumn: null
+ };
+ }
+
+ const needle = {
+ source,
+ originalLine: util.getArg(aArgs, "line"),
+ originalColumn: util.getArg(aArgs, "column")
+ };
+
+ if (needle.originalLine < 1) {
+ throw new Error("Line numbers must be >= 1");
+ }
+
+ if (needle.originalColumn < 0) {
+ throw new Error("Column numbers must be >= 0");
+ }
+
+ let bias = util.getArg(aArgs, "bias", SourceMapConsumer.GREATEST_LOWER_BOUND);
+ if (bias == null) {
+ bias = SourceMapConsumer.GREATEST_LOWER_BOUND;
+ }
+
+ let mapping;
+ this._wasm.withMappingCallback(m => mapping = m, () => {
+ this._wasm.exports.generated_location_for(
+ this._getMappingsPtr(),
+ needle.source,
+ needle.originalLine - 1,
+ needle.originalColumn,
+ bias
+ );
+ });
+
+ if (mapping) {
+ if (mapping.source === needle.source) {
+ let lastColumn = mapping.lastGeneratedColumn;
+ if (this._computedColumnSpans && lastColumn === null) {
+ lastColumn = Infinity;
+ }
+ return {
+ line: util.getArg(mapping, "generatedLine", null),
+ column: util.getArg(mapping, "generatedColumn", null),
+ lastColumn,
+ };
+ }
+ }
+
+ return {
+ line: null,
+ column: null,
+ lastColumn: null
+ };
+ }
+}
+
+BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;
+exports.BasicSourceMapConsumer = BasicSourceMapConsumer;
+
+/**
+ * An IndexedSourceMapConsumer instance represents a parsed source map which
+ * we can query for information. It differs from BasicSourceMapConsumer in
+ * that it takes "indexed" source maps (i.e. ones with a "sections" field) as
+ * input.
+ *
+ * The first parameter is a raw source map (either as a JSON string, or already
+ * parsed to an object). According to the spec for indexed source maps, they
+ * have the following attributes:
+ *
+ * - version: Which version of the source map spec this map is following.
+ * - file: Optional. The generated file this source map is associated with.
+ * - sections: A list of section definitions.
+ *
+ * Each value under the "sections" field has two fields:
+ * - offset: The offset into the original specified at which this section
+ * begins to apply, defined as an object with a "line" and "column"
+ * field.
+ * - map: A source map definition. This source map could also be indexed,
+ * but doesn't have to be.
+ *
+ * Instead of the "map" field, it's also possible to have a "url" field
+ * specifying a URL to retrieve a source map from, but that's currently
+ * unsupported.
+ *
+ * Here's an example source map, taken from the source map spec[0], but
+ * modified to omit a section which uses the "url" field.
+ *
+ * {
+ * version : 3,
+ * file: "app.js",
+ * sections: [{
+ * offset: {line:100, column:10},
+ * map: {
+ * version : 3,
+ * file: "section.js",
+ * sources: ["foo.js", "bar.js"],
+ * names: ["src", "maps", "are", "fun"],
+ * mappings: "AAAA,E;;ABCDE;"
+ * }
+ * }],
+ * }
+ *
+ * The second parameter, if given, is a string whose value is the URL
+ * at which the source map was found. This URL is used to compute the
+ * sources array.
+ *
+ * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt
+ */
+class IndexedSourceMapConsumer extends SourceMapConsumer {
+ constructor(aSourceMap, aSourceMapURL) {
+ return super(INTERNAL).then(that => {
+ let sourceMap = aSourceMap;
+ if (typeof aSourceMap === "string") {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ const version = util.getArg(sourceMap, "version");
+ const sections = util.getArg(sourceMap, "sections");
+
+ if (version != that._version) {
+ throw new Error("Unsupported version: " + version);
+ }
+
+ that._sources = new ArraySet();
+ that._names = new ArraySet();
+ that.__generatedMappings = null;
+ that.__originalMappings = null;
+ that.__generatedMappingsUnsorted = null;
+ that.__originalMappingsUnsorted = null;
+
+ let lastOffset = {
+ line: -1,
+ column: 0
+ };
+ return Promise.all(sections.map(s => {
+ if (s.url) {
+ // The url field will require support for asynchronicity.
+ // See https://github.com/mozilla/source-map/issues/16
+ throw new Error("Support for url field in sections not implemented.");
+ }
+ const offset = util.getArg(s, "offset");
+ const offsetLine = util.getArg(offset, "line");
+ const offsetColumn = util.getArg(offset, "column");
+
+ if (offsetLine < lastOffset.line ||
+ (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {
+ throw new Error("Section offsets must be ordered and non-overlapping.");
+ }
+ lastOffset = offset;
+
+ const cons = new SourceMapConsumer(util.getArg(s, "map"), aSourceMapURL);
+ return cons.then(consumer => {
+ return {
+ generatedOffset: {
+ // The offset fields are 0-based, but we use 1-based indices when
+ // encoding/decoding from VLQ.
+ generatedLine: offsetLine + 1,
+ generatedColumn: offsetColumn + 1
+ },
+ consumer
+ };
+ });
+ })).then(s => {
+ that._sections = s;
+ return that;
+ });
+ });
+ }
+
+ // `__generatedMappings` and `__originalMappings` are arrays that hold the
+ // parsed mapping coordinates from the source map's "mappings" attribute. They
+ // are lazily instantiated, accessed via the `_generatedMappings` and
+ // `_originalMappings` getters respectively, and we only parse the mappings
+ // and create these arrays once queried for a source location. We jump through
+ // these hoops because there can be many thousands of mappings, and parsing
+ // them is expensive, so we only want to do it if we must.
+ //
+ // Each object in the arrays is of the form:
+ //
+ // {
+ // generatedLine: The line number in the generated code,
+ // generatedColumn: The column number in the generated code,
+ // source: The path to the original source file that generated this
+ // chunk of code,
+ // originalLine: The line number in the original source that
+ // corresponds to this chunk of generated code,
+ // originalColumn: The column number in the original source that
+ // corresponds to this chunk of generated code,
+ // name: The name of the original symbol which generated this chunk of
+ // code.
+ // }
+ //
+ // All properties except for `generatedLine` and `generatedColumn` can be
+ // `null`.
+ //
+ // `_generatedMappings` is ordered by the generated positions.
+ //
+ // `_originalMappings` is ordered by the original positions.
+ get _generatedMappings() {
+ if (!this.__generatedMappings) {
+ this._sortGeneratedMappings();
+ }
+
+ return this.__generatedMappings;
+ }
+
+ get _originalMappings() {
+ if (!this.__originalMappings) {
+ this._sortOriginalMappings();
+ }
+
+ return this.__originalMappings;
+ }
+
+ get _generatedMappingsUnsorted() {
+ if (!this.__generatedMappingsUnsorted) {
+ this._parseMappings(this._mappings, this.sourceRoot);
+ }
+
+ return this.__generatedMappingsUnsorted;
+ }
+
+ get _originalMappingsUnsorted() {
+ if (!this.__originalMappingsUnsorted) {
+ this._parseMappings(this._mappings, this.sourceRoot);
+ }
+
+ return this.__originalMappingsUnsorted;
+ }
+
+ _sortGeneratedMappings() {
+ const mappings = this._generatedMappingsUnsorted;
+ mappings.sort(util.compareByGeneratedPositionsDeflated);
+ this.__generatedMappings = mappings;
+ }
+
+ _sortOriginalMappings() {
+ const mappings = this._originalMappingsUnsorted;
+ mappings.sort(util.compareByOriginalPositions);
+ this.__originalMappings = mappings;
+ }
+
+ /**
+ * The list of original sources.
+ */
+ get sources() {
+ const sources = [];
+ for (let i = 0; i < this._sections.length; i++) {
+ for (let j = 0; j < this._sections[i].consumer.sources.length; j++) {
+ sources.push(this._sections[i].consumer.sources[j]);
+ }
+ }
+ return sources;
+ }
+
+ /**
+ * Returns the original source, line, and column information for the generated
+ * source's line and column positions provided. The only argument is an object
+ * with the following properties:
+ *
+ * - line: The line number in the generated source. The line number
+ * is 1-based.
+ * - column: The column number in the generated source. The column
+ * number is 0-based.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - source: The original source file, or null.
+ * - line: The line number in the original source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the original source, or null. The
+ * column number is 0-based.
+ * - name: The original identifier, or null.
+ */
+ originalPositionFor(aArgs) {
+ const needle = {
+ generatedLine: util.getArg(aArgs, "line"),
+ generatedColumn: util.getArg(aArgs, "column")
+ };
+
+ // Find the section containing the generated position we're trying to map
+ // to an original position.
+ const sectionIndex = binarySearch.search(needle, this._sections,
+ function(aNeedle, section) {
+ const cmp = aNeedle.generatedLine - section.generatedOffset.generatedLine;
+ if (cmp) {
+ return cmp;
+ }
+
+ return (aNeedle.generatedColumn -
+ section.generatedOffset.generatedColumn);
+ });
+ const section = this._sections[sectionIndex];
+
+ if (!section) {
+ return {
+ source: null,
+ line: null,
+ column: null,
+ name: null
+ };
+ }
+
+ return section.consumer.originalPositionFor({
+ line: needle.generatedLine -
+ (section.generatedOffset.generatedLine - 1),
+ column: needle.generatedColumn -
+ (section.generatedOffset.generatedLine === needle.generatedLine
+ ? section.generatedOffset.generatedColumn - 1
+ : 0),
+ bias: aArgs.bias
+ });
+ }
+
+ /**
+ * Return true if we have the source content for every source in the source
+ * map, false otherwise.
+ */
+ hasContentsOfAllSources() {
+ return this._sections.every(function(s) {
+ return s.consumer.hasContentsOfAllSources();
+ });
+ }
+
+ /**
+ * Returns the original source content. The only argument is the url of the
+ * original source file. Returns null if no original source content is
+ * available.
+ */
+ sourceContentFor(aSource, nullOnMissing) {
+ for (let i = 0; i < this._sections.length; i++) {
+ const section = this._sections[i];
+
+ const content = section.consumer.sourceContentFor(aSource, true);
+ if (content) {
+ return content;
+ }
+ }
+ if (nullOnMissing) {
+ return null;
+ }
+ throw new Error('"' + aSource + '" is not in the SourceMap.');
+ }
+
+ /**
+ * Returns the generated line and column information for the original source,
+ * line, and column positions provided. The only argument is an object with
+ * the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source. The line number
+ * is 1-based.
+ * - column: The column number in the original source. The column
+ * number is 0-based.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+ generatedPositionFor(aArgs) {
+ for (let i = 0; i < this._sections.length; i++) {
+ const section = this._sections[i];
+
+ // Only consider this section if the requested source is in the list of
+ // sources of the consumer.
+ if (section.consumer._findSourceIndex(util.getArg(aArgs, "source")) === -1) {
+ continue;
+ }
+ const generatedPosition = section.consumer.generatedPositionFor(aArgs);
+ if (generatedPosition) {
+ const ret = {
+ line: generatedPosition.line +
+ (section.generatedOffset.generatedLine - 1),
+ column: generatedPosition.column +
+ (section.generatedOffset.generatedLine === generatedPosition.line
+ ? section.generatedOffset.generatedColumn - 1
+ : 0)
+ };
+ return ret;
+ }
+ }
+
+ return {
+ line: null,
+ column: null
+ };
+ }
+
+ /**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+ _parseMappings(aStr, aSourceRoot) {
+ const generatedMappings = this.__generatedMappingsUnsorted = [];
+ const originalMappings = this.__originalMappingsUnsorted = [];
+ for (let i = 0; i < this._sections.length; i++) {
+ const section = this._sections[i];
+
+ const sectionMappings = [];
+ section.consumer.eachMapping(m => sectionMappings.push(m));
+
+ for (let j = 0; j < sectionMappings.length; j++) {
+ const mapping = sectionMappings[j];
+
+ // TODO: test if null is correct here. The original code used
+ // `source`, which would actually have gotten used as null because
+ // var's get hoisted.
+ // See: https://github.com/mozilla/source-map/issues/333
+ let source = util.computeSourceURL(section.consumer.sourceRoot, null, this._sourceMapURL);
+ this._sources.add(source);
+ source = this._sources.indexOf(source);
+
+ let name = null;
+ if (mapping.name) {
+ this._names.add(mapping.name);
+ name = this._names.indexOf(mapping.name);
+ }
+
+ // The mappings coming from the consumer for the section have
+ // generated positions relative to the start of the section, so we
+ // need to offset them to be relative to the start of the concatenated
+ // generated file.
+ const adjustedMapping = {
+ source,
+ generatedLine: mapping.generatedLine +
+ (section.generatedOffset.generatedLine - 1),
+ generatedColumn: mapping.generatedColumn +
+ (section.generatedOffset.generatedLine === mapping.generatedLine
+ ? section.generatedOffset.generatedColumn - 1
+ : 0),
+ originalLine: mapping.originalLine,
+ originalColumn: mapping.originalColumn,
+ name
+ };
+
+ generatedMappings.push(adjustedMapping);
+ if (typeof adjustedMapping.originalLine === "number") {
+ originalMappings.push(adjustedMapping);
+ }
+ }
+ }
+ }
+
+ eachMapping(aCallback, aContext, aOrder) {
+ const context = aContext || null;
+ const order = aOrder || SourceMapConsumer.GENERATED_ORDER;
+
+ let mappings;
+ switch (order) {
+ case SourceMapConsumer.GENERATED_ORDER:
+ mappings = this._generatedMappings;
+ break;
+ case SourceMapConsumer.ORIGINAL_ORDER:
+ mappings = this._originalMappings;
+ break;
+ default:
+ throw new Error("Unknown order of iteration.");
+ }
+
+ const sourceRoot = this.sourceRoot;
+ mappings.map(function(mapping) {
+ let source = null;
+ if (mapping.source !== null) {
+ source = this._sources.at(mapping.source);
+ source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);
+ }
+ return {
+ source,
+ generatedLine: mapping.generatedLine,
+ generatedColumn: mapping.generatedColumn,
+ originalLine: mapping.originalLine,
+ originalColumn: mapping.originalColumn,
+ name: mapping.name === null ? null : this._names.at(mapping.name)
+ };
+ }, this).forEach(aCallback, context);
+ }
+
+ /**
+ * Find the mapping that best matches the hypothetical "needle" mapping that
+ * we are searching for in the given "haystack" of mappings.
+ */
+ _findMapping(aNeedle, aMappings, aLineName,
+ aColumnName, aComparator, aBias) {
+ // To return the position we are searching for, we must first find the
+ // mapping for the given position and then return the opposite position it
+ // points to. Because the mappings are sorted, we can use binary search to
+ // find the best mapping.
+
+ if (aNeedle[aLineName] <= 0) {
+ throw new TypeError("Line must be greater than or equal to 1, got "
+ + aNeedle[aLineName]);
+ }
+ if (aNeedle[aColumnName] < 0) {
+ throw new TypeError("Column must be greater than or equal to 0, got "
+ + aNeedle[aColumnName]);
+ }
+
+ return binarySearch.search(aNeedle, aMappings, aComparator, aBias);
+ }
+
+ allGeneratedPositionsFor(aArgs) {
+ const line = util.getArg(aArgs, "line");
+
+ // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping
+ // returns the index of the closest mapping less than the needle. By
+ // setting needle.originalColumn to 0, we thus find the last mapping for
+ // the given line, provided such a mapping exists.
+ const needle = {
+ source: util.getArg(aArgs, "source"),
+ originalLine: line,
+ originalColumn: util.getArg(aArgs, "column", 0)
+ };
+
+ needle.source = this._findSourceIndex(needle.source);
+ if (needle.source < 0) {
+ return [];
+ }
+
+ if (needle.originalLine < 1) {
+ throw new Error("Line numbers must be >= 1");
+ }
+
+ if (needle.originalColumn < 0) {
+ throw new Error("Column numbers must be >= 0");
+ }
+
+ const mappings = [];
+
+ let index = this._findMapping(needle,
+ this._originalMappings,
+ "originalLine",
+ "originalColumn",
+ util.compareByOriginalPositions,
+ binarySearch.LEAST_UPPER_BOUND);
+ if (index >= 0) {
+ let mapping = this._originalMappings[index];
+
+ if (aArgs.column === undefined) {
+ const originalLine = mapping.originalLine;
+
+ // Iterate until either we run out of mappings, or we run into
+ // a mapping for a different line than the one we found. Since
+ // mappings are sorted, this is guaranteed to find all mappings for
+ // the line we found.
+ while (mapping && mapping.originalLine === originalLine) {
+ let lastColumn = mapping.lastGeneratedColumn;
+ if (this._computedColumnSpans && lastColumn === null) {
+ lastColumn = Infinity;
+ }
+ mappings.push({
+ line: util.getArg(mapping, "generatedLine", null),
+ column: util.getArg(mapping, "generatedColumn", null),
+ lastColumn,
+ });
+
+ mapping = this._originalMappings[++index];
+ }
+ } else {
+ const originalColumn = mapping.originalColumn;
+
+ // Iterate until either we run out of mappings, or we run into
+ // a mapping for a different line than the one we were searching for.
+ // Since mappings are sorted, this is guaranteed to find all mappings for
+ // the line we are searching for.
+ while (mapping &&
+ mapping.originalLine === line &&
+ mapping.originalColumn == originalColumn) {
+ let lastColumn = mapping.lastGeneratedColumn;
+ if (this._computedColumnSpans && lastColumn === null) {
+ lastColumn = Infinity;
+ }
+ mappings.push({
+ line: util.getArg(mapping, "generatedLine", null),
+ column: util.getArg(mapping, "generatedColumn", null),
+ lastColumn,
+ });
+
+ mapping = this._originalMappings[++index];
+ }
+ }
+ }
+
+ return mappings;
+ }
+
+ destroy() {
+ for (let i = 0; i < this._sections.length; i++) {
+ this._sections[i].consumer.destroy();
+ }
+ }
+}
+exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;
+
+/*
+ * Cheat to get around inter-twingled classes. `factory()` can be at the end
+ * where it has access to non-hoisted classes, but it gets hoisted itself.
+ */
+function _factory(aSourceMap, aSourceMapURL) {
+ let sourceMap = aSourceMap;
+ if (typeof aSourceMap === "string") {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ const consumer = sourceMap.sections != null
+ ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)
+ : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);
+ return Promise.resolve(consumer);
+}
+
+function _factoryBSM(aSourceMap, aSourceMapURL) {
+ return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);
+}
diff --git a/node_modules/doiuse/node_modules/source-map/lib/source-map-generator.js b/node_modules/doiuse/node_modules/source-map/lib/source-map-generator.js
new file mode 100644
index 00000000..8111e061
--- /dev/null
+++ b/node_modules/doiuse/node_modules/source-map/lib/source-map-generator.js
@@ -0,0 +1,413 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+const base64VLQ = require("./base64-vlq");
+const util = require("./util");
+const ArraySet = require("./array-set").ArraySet;
+const MappingList = require("./mapping-list").MappingList;
+
+/**
+ * An instance of the SourceMapGenerator represents a source map which is
+ * being built incrementally. You may pass an object with the following
+ * properties:
+ *
+ * - file: The filename of the generated source.
+ * - sourceRoot: A root for all relative URLs in this source map.
+ */
+class SourceMapGenerator {
+ constructor(aArgs) {
+ if (!aArgs) {
+ aArgs = {};
+ }
+ this._file = util.getArg(aArgs, "file", null);
+ this._sourceRoot = util.getArg(aArgs, "sourceRoot", null);
+ this._skipValidation = util.getArg(aArgs, "skipValidation", false);
+ this._sources = new ArraySet();
+ this._names = new ArraySet();
+ this._mappings = new MappingList();
+ this._sourcesContents = null;
+ }
+
+ /**
+ * Creates a new SourceMapGenerator based on a SourceMapConsumer
+ *
+ * @param aSourceMapConsumer The SourceMap.
+ */
+ static fromSourceMap(aSourceMapConsumer) {
+ const sourceRoot = aSourceMapConsumer.sourceRoot;
+ const generator = new SourceMapGenerator({
+ file: aSourceMapConsumer.file,
+ sourceRoot
+ });
+ aSourceMapConsumer.eachMapping(function(mapping) {
+ const newMapping = {
+ generated: {
+ line: mapping.generatedLine,
+ column: mapping.generatedColumn
+ }
+ };
+
+ if (mapping.source != null) {
+ newMapping.source = mapping.source;
+ if (sourceRoot != null) {
+ newMapping.source = util.relative(sourceRoot, newMapping.source);
+ }
+
+ newMapping.original = {
+ line: mapping.originalLine,
+ column: mapping.originalColumn
+ };
+
+ if (mapping.name != null) {
+ newMapping.name = mapping.name;
+ }
+ }
+
+ generator.addMapping(newMapping);
+ });
+ aSourceMapConsumer.sources.forEach(function(sourceFile) {
+ let sourceRelative = sourceFile;
+ if (sourceRoot !== null) {
+ sourceRelative = util.relative(sourceRoot, sourceFile);
+ }
+
+ if (!generator._sources.has(sourceRelative)) {
+ generator._sources.add(sourceRelative);
+ }
+
+ const content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ generator.setSourceContent(sourceFile, content);
+ }
+ });
+ return generator;
+ }
+
+ /**
+ * Add a single mapping from original source line and column to the generated
+ * source's line and column for this source map being created. The mapping
+ * object should have the following properties:
+ *
+ * - generated: An object with the generated line and column positions.
+ * - original: An object with the original line and column positions.
+ * - source: The original source file (relative to the sourceRoot).
+ * - name: An optional original token name for this mapping.
+ */
+ addMapping(aArgs) {
+ const generated = util.getArg(aArgs, "generated");
+ const original = util.getArg(aArgs, "original", null);
+ let source = util.getArg(aArgs, "source", null);
+ let name = util.getArg(aArgs, "name", null);
+
+ if (!this._skipValidation) {
+ this._validateMapping(generated, original, source, name);
+ }
+
+ if (source != null) {
+ source = String(source);
+ if (!this._sources.has(source)) {
+ this._sources.add(source);
+ }
+ }
+
+ if (name != null) {
+ name = String(name);
+ if (!this._names.has(name)) {
+ this._names.add(name);
+ }
+ }
+
+ this._mappings.add({
+ generatedLine: generated.line,
+ generatedColumn: generated.column,
+ originalLine: original != null && original.line,
+ originalColumn: original != null && original.column,
+ source,
+ name
+ });
+ }
+
+ /**
+ * Set the source content for a source file.
+ */
+ setSourceContent(aSourceFile, aSourceContent) {
+ let source = aSourceFile;
+ if (this._sourceRoot != null) {
+ source = util.relative(this._sourceRoot, source);
+ }
+
+ if (aSourceContent != null) {
+ // Add the source content to the _sourcesContents map.
+ // Create a new _sourcesContents map if the property is null.
+ if (!this._sourcesContents) {
+ this._sourcesContents = Object.create(null);
+ }
+ this._sourcesContents[util.toSetString(source)] = aSourceContent;
+ } else if (this._sourcesContents) {
+ // Remove the source file from the _sourcesContents map.
+ // If the _sourcesContents map is empty, set the property to null.
+ delete this._sourcesContents[util.toSetString(source)];
+ if (Object.keys(this._sourcesContents).length === 0) {
+ this._sourcesContents = null;
+ }
+ }
+ }
+
+ /**
+ * Applies the mappings of a sub-source-map for a specific source file to the
+ * source map being generated. Each mapping to the supplied source file is
+ * rewritten using the supplied source map. Note: The resolution for the
+ * resulting mappings is the minimium of this map and the supplied map.
+ *
+ * @param aSourceMapConsumer The source map to be applied.
+ * @param aSourceFile Optional. The filename of the source file.
+ * If omitted, SourceMapConsumer's file property will be used.
+ * @param aSourceMapPath Optional. The dirname of the path to the source map
+ * to be applied. If relative, it is relative to the SourceMapConsumer.
+ * This parameter is needed when the two source maps aren't in the same
+ * directory, and the source map to be applied contains relative source
+ * paths. If so, those relative source paths need to be rewritten
+ * relative to the SourceMapGenerator.
+ */
+ applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {
+ let sourceFile = aSourceFile;
+ // If aSourceFile is omitted, we will use the file property of the SourceMap
+ if (aSourceFile == null) {
+ if (aSourceMapConsumer.file == null) {
+ throw new Error(
+ "SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, " +
+ 'or the source map\'s "file" property. Both were omitted.'
+ );
+ }
+ sourceFile = aSourceMapConsumer.file;
+ }
+ const sourceRoot = this._sourceRoot;
+ // Make "sourceFile" relative if an absolute Url is passed.
+ if (sourceRoot != null) {
+ sourceFile = util.relative(sourceRoot, sourceFile);
+ }
+ // Applying the SourceMap can add and remove items from the sources and
+ // the names array.
+ const newSources = this._mappings.toArray().length > 0
+ ? new ArraySet()
+ : this._sources;
+ const newNames = new ArraySet();
+
+ // Find mappings for the "sourceFile"
+ this._mappings.unsortedForEach(function(mapping) {
+ if (mapping.source === sourceFile && mapping.originalLine != null) {
+ // Check if it can be mapped by the source map, then update the mapping.
+ const original = aSourceMapConsumer.originalPositionFor({
+ line: mapping.originalLine,
+ column: mapping.originalColumn
+ });
+ if (original.source != null) {
+ // Copy mapping
+ mapping.source = original.source;
+ if (aSourceMapPath != null) {
+ mapping.source = util.join(aSourceMapPath, mapping.source);
+ }
+ if (sourceRoot != null) {
+ mapping.source = util.relative(sourceRoot, mapping.source);
+ }
+ mapping.originalLine = original.line;
+ mapping.originalColumn = original.column;
+ if (original.name != null) {
+ mapping.name = original.name;
+ }
+ }
+ }
+
+ const source = mapping.source;
+ if (source != null && !newSources.has(source)) {
+ newSources.add(source);
+ }
+
+ const name = mapping.name;
+ if (name != null && !newNames.has(name)) {
+ newNames.add(name);
+ }
+
+ }, this);
+ this._sources = newSources;
+ this._names = newNames;
+
+ // Copy sourcesContents of applied map.
+ aSourceMapConsumer.sources.forEach(function(srcFile) {
+ const content = aSourceMapConsumer.sourceContentFor(srcFile);
+ if (content != null) {
+ if (aSourceMapPath != null) {
+ srcFile = util.join(aSourceMapPath, srcFile);
+ }
+ if (sourceRoot != null) {
+ srcFile = util.relative(sourceRoot, srcFile);
+ }
+ this.setSourceContent(srcFile, content);
+ }
+ }, this);
+ }
+
+ /**
+ * A mapping can have one of the three levels of data:
+ *
+ * 1. Just the generated position.
+ * 2. The Generated position, original position, and original source.
+ * 3. Generated and original position, original source, as well as a name
+ * token.
+ *
+ * To maintain consistency, we validate that any new mapping being added falls
+ * in to one of these categories.
+ */
+ _validateMapping(aGenerated, aOriginal, aSource, aName) {
+ // When aOriginal is truthy but has empty values for .line and .column,
+ // it is most likely a programmer error. In this case we throw a very
+ // specific error message to try to guide them the right way.
+ // For example: https://github.com/Polymer/polymer-bundler/pull/519
+ if (aOriginal && typeof aOriginal.line !== "number" && typeof aOriginal.column !== "number") {
+ throw new Error(
+ "original.line and original.column are not numbers -- you probably meant to omit " +
+ "the original mapping entirely and only map the generated position. If so, pass " +
+ "null for the original mapping instead of an object with empty or null values."
+ );
+ }
+
+ if (aGenerated && "line" in aGenerated && "column" in aGenerated
+ && aGenerated.line > 0 && aGenerated.column >= 0
+ && !aOriginal && !aSource && !aName) {
+ // Case 1.
+
+ } else if (aGenerated && "line" in aGenerated && "column" in aGenerated
+ && aOriginal && "line" in aOriginal && "column" in aOriginal
+ && aGenerated.line > 0 && aGenerated.column >= 0
+ && aOriginal.line > 0 && aOriginal.column >= 0
+ && aSource) {
+ // Cases 2 and 3.
+
+ } else {
+ throw new Error("Invalid mapping: " + JSON.stringify({
+ generated: aGenerated,
+ source: aSource,
+ original: aOriginal,
+ name: aName
+ }));
+ }
+ }
+
+ /**
+ * Serialize the accumulated mappings in to the stream of base 64 VLQs
+ * specified by the source map format.
+ */
+ _serializeMappings() {
+ let previousGeneratedColumn = 0;
+ let previousGeneratedLine = 1;
+ let previousOriginalColumn = 0;
+ let previousOriginalLine = 0;
+ let previousName = 0;
+ let previousSource = 0;
+ let result = "";
+ let next;
+ let mapping;
+ let nameIdx;
+ let sourceIdx;
+
+ const mappings = this._mappings.toArray();
+ for (let i = 0, len = mappings.length; i < len; i++) {
+ mapping = mappings[i];
+ next = "";
+
+ if (mapping.generatedLine !== previousGeneratedLine) {
+ previousGeneratedColumn = 0;
+ while (mapping.generatedLine !== previousGeneratedLine) {
+ next += ";";
+ previousGeneratedLine++;
+ }
+ } else if (i > 0) {
+ if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {
+ continue;
+ }
+ next += ",";
+ }
+
+ next += base64VLQ.encode(mapping.generatedColumn
+ - previousGeneratedColumn);
+ previousGeneratedColumn = mapping.generatedColumn;
+
+ if (mapping.source != null) {
+ sourceIdx = this._sources.indexOf(mapping.source);
+ next += base64VLQ.encode(sourceIdx - previousSource);
+ previousSource = sourceIdx;
+
+ // lines are stored 0-based in SourceMap spec version 3
+ next += base64VLQ.encode(mapping.originalLine - 1
+ - previousOriginalLine);
+ previousOriginalLine = mapping.originalLine - 1;
+
+ next += base64VLQ.encode(mapping.originalColumn
+ - previousOriginalColumn);
+ previousOriginalColumn = mapping.originalColumn;
+
+ if (mapping.name != null) {
+ nameIdx = this._names.indexOf(mapping.name);
+ next += base64VLQ.encode(nameIdx - previousName);
+ previousName = nameIdx;
+ }
+ }
+
+ result += next;
+ }
+
+ return result;
+ }
+
+ _generateSourcesContent(aSources, aSourceRoot) {
+ return aSources.map(function(source) {
+ if (!this._sourcesContents) {
+ return null;
+ }
+ if (aSourceRoot != null) {
+ source = util.relative(aSourceRoot, source);
+ }
+ const key = util.toSetString(source);
+ return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)
+ ? this._sourcesContents[key]
+ : null;
+ }, this);
+ }
+
+ /**
+ * Externalize the source map.
+ */
+ toJSON() {
+ const map = {
+ version: this._version,
+ sources: this._sources.toArray(),
+ names: this._names.toArray(),
+ mappings: this._serializeMappings()
+ };
+ if (this._file != null) {
+ map.file = this._file;
+ }
+ if (this._sourceRoot != null) {
+ map.sourceRoot = this._sourceRoot;
+ }
+ if (this._sourcesContents) {
+ map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);
+ }
+
+ return map;
+ }
+
+ /**
+ * Render the source map being generated to a string.
+ */
+ toString() {
+ return JSON.stringify(this.toJSON());
+ }
+}
+
+SourceMapGenerator.prototype._version = 3;
+exports.SourceMapGenerator = SourceMapGenerator;
diff --git a/node_modules/doiuse/node_modules/source-map/lib/source-node.js b/node_modules/doiuse/node_modules/source-map/lib/source-node.js
new file mode 100644
index 00000000..8a7a157e
--- /dev/null
+++ b/node_modules/doiuse/node_modules/source-map/lib/source-node.js
@@ -0,0 +1,404 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+const SourceMapGenerator = require("./source-map-generator").SourceMapGenerator;
+const util = require("./util");
+
+// Matches a Windows-style `\r\n` newline or a `\n` newline used by all other
+// operating systems these days (capturing the result).
+const REGEX_NEWLINE = /(\r?\n)/;
+
+// Newline character code for charCodeAt() comparisons
+const NEWLINE_CODE = 10;
+
+// Private symbol for identifying `SourceNode`s when multiple versions of
+// the source-map library are loaded. This MUST NOT CHANGE across
+// versions!
+const isSourceNode = "$$$isSourceNode$$$";
+
+/**
+ * SourceNodes provide a way to abstract over interpolating/concatenating
+ * snippets of generated JavaScript source code while maintaining the line and
+ * column information associated with the original source code.
+ *
+ * @param aLine The original line number.
+ * @param aColumn The original column number.
+ * @param aSource The original source's filename.
+ * @param aChunks Optional. An array of strings which are snippets of
+ * generated JS, or other SourceNodes.
+ * @param aName The original identifier.
+ */
+class SourceNode {
+ constructor(aLine, aColumn, aSource, aChunks, aName) {
+ this.children = [];
+ this.sourceContents = {};
+ this.line = aLine == null ? null : aLine;
+ this.column = aColumn == null ? null : aColumn;
+ this.source = aSource == null ? null : aSource;
+ this.name = aName == null ? null : aName;
+ this[isSourceNode] = true;
+ if (aChunks != null) this.add(aChunks);
+ }
+
+ /**
+ * Creates a SourceNode from generated code and a SourceMapConsumer.
+ *
+ * @param aGeneratedCode The generated code
+ * @param aSourceMapConsumer The SourceMap for the generated code
+ * @param aRelativePath Optional. The path that relative sources in the
+ * SourceMapConsumer should be relative to.
+ */
+ static fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {
+ // The SourceNode we want to fill with the generated code
+ // and the SourceMap
+ const node = new SourceNode();
+
+ // All even indices of this array are one line of the generated code,
+ // while all odd indices are the newlines between two adjacent lines
+ // (since `REGEX_NEWLINE` captures its match).
+ // Processed fragments are accessed by calling `shiftNextLine`.
+ const remainingLines = aGeneratedCode.split(REGEX_NEWLINE);
+ let remainingLinesIndex = 0;
+ const shiftNextLine = function() {
+ const lineContents = getNextLine();
+ // The last line of a file might not have a newline.
+ const newLine = getNextLine() || "";
+ return lineContents + newLine;
+
+ function getNextLine() {
+ return remainingLinesIndex < remainingLines.length ?
+ remainingLines[remainingLinesIndex++] : undefined;
+ }
+ };
+
+ // We need to remember the position of "remainingLines"
+ let lastGeneratedLine = 1, lastGeneratedColumn = 0;
+
+ // The generate SourceNodes we need a code range.
+ // To extract it current and last mapping is used.
+ // Here we store the last mapping.
+ let lastMapping = null;
+ let nextLine;
+
+ aSourceMapConsumer.eachMapping(function(mapping) {
+ if (lastMapping !== null) {
+ // We add the code from "lastMapping" to "mapping":
+ // First check if there is a new line in between.
+ if (lastGeneratedLine < mapping.generatedLine) {
+ // Associate first line with "lastMapping"
+ addMappingWithCode(lastMapping, shiftNextLine());
+ lastGeneratedLine++;
+ lastGeneratedColumn = 0;
+ // The remaining code is added without mapping
+ } else {
+ // There is no new line in between.
+ // Associate the code between "lastGeneratedColumn" and
+ // "mapping.generatedColumn" with "lastMapping"
+ nextLine = remainingLines[remainingLinesIndex] || "";
+ const code = nextLine.substr(0, mapping.generatedColumn -
+ lastGeneratedColumn);
+ remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -
+ lastGeneratedColumn);
+ lastGeneratedColumn = mapping.generatedColumn;
+ addMappingWithCode(lastMapping, code);
+ // No more remaining code, continue
+ lastMapping = mapping;
+ return;
+ }
+ }
+ // We add the generated code until the first mapping
+ // to the SourceNode without any mapping.
+ // Each line is added as separate string.
+ while (lastGeneratedLine < mapping.generatedLine) {
+ node.add(shiftNextLine());
+ lastGeneratedLine++;
+ }
+ if (lastGeneratedColumn < mapping.generatedColumn) {
+ nextLine = remainingLines[remainingLinesIndex] || "";
+ node.add(nextLine.substr(0, mapping.generatedColumn));
+ remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);
+ lastGeneratedColumn = mapping.generatedColumn;
+ }
+ lastMapping = mapping;
+ }, this);
+ // We have processed all mappings.
+ if (remainingLinesIndex < remainingLines.length) {
+ if (lastMapping) {
+ // Associate the remaining code in the current line with "lastMapping"
+ addMappingWithCode(lastMapping, shiftNextLine());
+ }
+ // and add the remaining lines without any mapping
+ node.add(remainingLines.splice(remainingLinesIndex).join(""));
+ }
+
+ // Copy sourcesContent into SourceNode
+ aSourceMapConsumer.sources.forEach(function(sourceFile) {
+ const content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ if (aRelativePath != null) {
+ sourceFile = util.join(aRelativePath, sourceFile);
+ }
+ node.setSourceContent(sourceFile, content);
+ }
+ });
+
+ return node;
+
+ function addMappingWithCode(mapping, code) {
+ if (mapping === null || mapping.source === undefined) {
+ node.add(code);
+ } else {
+ const source = aRelativePath
+ ? util.join(aRelativePath, mapping.source)
+ : mapping.source;
+ node.add(new SourceNode(mapping.originalLine,
+ mapping.originalColumn,
+ source,
+ code,
+ mapping.name));
+ }
+ }
+ }
+
+ /**
+ * Add a chunk of generated JS to this source node.
+ *
+ * @param aChunk A string snippet of generated JS code, another instance of
+ * SourceNode, or an array where each member is one of those things.
+ */
+ add(aChunk) {
+ if (Array.isArray(aChunk)) {
+ aChunk.forEach(function(chunk) {
+ this.add(chunk);
+ }, this);
+ } else if (aChunk[isSourceNode] || typeof aChunk === "string") {
+ if (aChunk) {
+ this.children.push(aChunk);
+ }
+ } else {
+ throw new TypeError(
+ "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
+ );
+ }
+ return this;
+ }
+
+ /**
+ * Add a chunk of generated JS to the beginning of this source node.
+ *
+ * @param aChunk A string snippet of generated JS code, another instance of
+ * SourceNode, or an array where each member is one of those things.
+ */
+ prepend(aChunk) {
+ if (Array.isArray(aChunk)) {
+ for (let i = aChunk.length - 1; i >= 0; i--) {
+ this.prepend(aChunk[i]);
+ }
+ } else if (aChunk[isSourceNode] || typeof aChunk === "string") {
+ this.children.unshift(aChunk);
+ } else {
+ throw new TypeError(
+ "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
+ );
+ }
+ return this;
+ }
+
+ /**
+ * Walk over the tree of JS snippets in this node and its children. The
+ * walking function is called once for each snippet of JS and is passed that
+ * snippet and the its original associated source's line/column location.
+ *
+ * @param aFn The traversal function.
+ */
+ walk(aFn) {
+ let chunk;
+ for (let i = 0, len = this.children.length; i < len; i++) {
+ chunk = this.children[i];
+ if (chunk[isSourceNode]) {
+ chunk.walk(aFn);
+ } else if (chunk !== "") {
+ aFn(chunk, { source: this.source,
+ line: this.line,
+ column: this.column,
+ name: this.name });
+ }
+ }
+ }
+
+ /**
+ * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between
+ * each of `this.children`.
+ *
+ * @param aSep The separator.
+ */
+ join(aSep) {
+ let newChildren;
+ let i;
+ const len = this.children.length;
+ if (len > 0) {
+ newChildren = [];
+ for (i = 0; i < len - 1; i++) {
+ newChildren.push(this.children[i]);
+ newChildren.push(aSep);
+ }
+ newChildren.push(this.children[i]);
+ this.children = newChildren;
+ }
+ return this;
+ }
+
+ /**
+ * Call String.prototype.replace on the very right-most source snippet. Useful
+ * for trimming whitespace from the end of a source node, etc.
+ *
+ * @param aPattern The pattern to replace.
+ * @param aReplacement The thing to replace the pattern with.
+ */
+ replaceRight(aPattern, aReplacement) {
+ const lastChild = this.children[this.children.length - 1];
+ if (lastChild[isSourceNode]) {
+ lastChild.replaceRight(aPattern, aReplacement);
+ } else if (typeof lastChild === "string") {
+ this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);
+ } else {
+ this.children.push("".replace(aPattern, aReplacement));
+ }
+ return this;
+ }
+
+ /**
+ * Set the source content for a source file. This will be added to the SourceMapGenerator
+ * in the sourcesContent field.
+ *
+ * @param aSourceFile The filename of the source file
+ * @param aSourceContent The content of the source file
+ */
+ setSourceContent(aSourceFile, aSourceContent) {
+ this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;
+ }
+
+ /**
+ * Walk over the tree of SourceNodes. The walking function is called for each
+ * source file content and is passed the filename and source content.
+ *
+ * @param aFn The traversal function.
+ */
+ walkSourceContents(aFn) {
+ for (let i = 0, len = this.children.length; i < len; i++) {
+ if (this.children[i][isSourceNode]) {
+ this.children[i].walkSourceContents(aFn);
+ }
+ }
+
+ const sources = Object.keys(this.sourceContents);
+ for (let i = 0, len = sources.length; i < len; i++) {
+ aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);
+ }
+ }
+
+ /**
+ * Return the string representation of this source node. Walks over the tree
+ * and concatenates all the various snippets together to one string.
+ */
+ toString() {
+ let str = "";
+ this.walk(function(chunk) {
+ str += chunk;
+ });
+ return str;
+ }
+
+ /**
+ * Returns the string representation of this source node along with a source
+ * map.
+ */
+ toStringWithSourceMap(aArgs) {
+ const generated = {
+ code: "",
+ line: 1,
+ column: 0
+ };
+ const map = new SourceMapGenerator(aArgs);
+ let sourceMappingActive = false;
+ let lastOriginalSource = null;
+ let lastOriginalLine = null;
+ let lastOriginalColumn = null;
+ let lastOriginalName = null;
+ this.walk(function(chunk, original) {
+ generated.code += chunk;
+ if (original.source !== null
+ && original.line !== null
+ && original.column !== null) {
+ if (lastOriginalSource !== original.source
+ || lastOriginalLine !== original.line
+ || lastOriginalColumn !== original.column
+ || lastOriginalName !== original.name) {
+ map.addMapping({
+ source: original.source,
+ original: {
+ line: original.line,
+ column: original.column
+ },
+ generated: {
+ line: generated.line,
+ column: generated.column
+ },
+ name: original.name
+ });
+ }
+ lastOriginalSource = original.source;
+ lastOriginalLine = original.line;
+ lastOriginalColumn = original.column;
+ lastOriginalName = original.name;
+ sourceMappingActive = true;
+ } else if (sourceMappingActive) {
+ map.addMapping({
+ generated: {
+ line: generated.line,
+ column: generated.column
+ }
+ });
+ lastOriginalSource = null;
+ sourceMappingActive = false;
+ }
+ for (let idx = 0, length = chunk.length; idx < length; idx++) {
+ if (chunk.charCodeAt(idx) === NEWLINE_CODE) {
+ generated.line++;
+ generated.column = 0;
+ // Mappings end at eol
+ if (idx + 1 === length) {
+ lastOriginalSource = null;
+ sourceMappingActive = false;
+ } else if (sourceMappingActive) {
+ map.addMapping({
+ source: original.source,
+ original: {
+ line: original.line,
+ column: original.column
+ },
+ generated: {
+ line: generated.line,
+ column: generated.column
+ },
+ name: original.name
+ });
+ }
+ } else {
+ generated.column++;
+ }
+ }
+ });
+ this.walkSourceContents(function(sourceFile, sourceContent) {
+ map.setSourceContent(sourceFile, sourceContent);
+ });
+
+ return { code: generated.code, map };
+ }
+}
+
+exports.SourceNode = SourceNode;
diff --git a/node_modules/doiuse/node_modules/source-map/lib/util.js b/node_modules/doiuse/node_modules/source-map/lib/util.js
new file mode 100644
index 00000000..35bd93d6
--- /dev/null
+++ b/node_modules/doiuse/node_modules/source-map/lib/util.js
@@ -0,0 +1,546 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+/**
+ * This is a helper function for getting values from parameter/options
+ * objects.
+ *
+ * @param args The object we are extracting values from
+ * @param name The name of the property we are getting.
+ * @param defaultValue An optional value to return if the property is missing
+ * from the object. If this is not specified and the property is missing, an
+ * error will be thrown.
+ */
+function getArg(aArgs, aName, aDefaultValue) {
+ if (aName in aArgs) {
+ return aArgs[aName];
+ } else if (arguments.length === 3) {
+ return aDefaultValue;
+ }
+ throw new Error('"' + aName + '" is a required argument.');
+
+}
+exports.getArg = getArg;
+
+const urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/;
+const dataUrlRegexp = /^data:.+\,.+$/;
+
+function urlParse(aUrl) {
+ const match = aUrl.match(urlRegexp);
+ if (!match) {
+ return null;
+ }
+ return {
+ scheme: match[1],
+ auth: match[2],
+ host: match[3],
+ port: match[4],
+ path: match[5]
+ };
+}
+exports.urlParse = urlParse;
+
+function urlGenerate(aParsedUrl) {
+ let url = "";
+ if (aParsedUrl.scheme) {
+ url += aParsedUrl.scheme + ":";
+ }
+ url += "//";
+ if (aParsedUrl.auth) {
+ url += aParsedUrl.auth + "@";
+ }
+ if (aParsedUrl.host) {
+ url += aParsedUrl.host;
+ }
+ if (aParsedUrl.port) {
+ url += ":" + aParsedUrl.port;
+ }
+ if (aParsedUrl.path) {
+ url += aParsedUrl.path;
+ }
+ return url;
+}
+exports.urlGenerate = urlGenerate;
+
+const MAX_CACHED_INPUTS = 32;
+
+/**
+ * Takes some function `f(input) -> result` and returns a memoized version of
+ * `f`.
+ *
+ * We keep at most `MAX_CACHED_INPUTS` memoized results of `f` alive. The
+ * memoization is a dumb-simple, linear least-recently-used cache.
+ */
+function lruMemoize(f) {
+ const cache = [];
+
+ return function(input) {
+ for (let i = 0; i < cache.length; i++) {
+ if (cache[i].input === input) {
+ const temp = cache[0];
+ cache[0] = cache[i];
+ cache[i] = temp;
+ return cache[0].result;
+ }
+ }
+
+ const result = f(input);
+
+ cache.unshift({
+ input,
+ result,
+ });
+
+ if (cache.length > MAX_CACHED_INPUTS) {
+ cache.pop();
+ }
+
+ return result;
+ };
+}
+
+/**
+ * Normalizes a path, or the path portion of a URL:
+ *
+ * - Replaces consecutive slashes with one slash.
+ * - Removes unnecessary '.' parts.
+ * - Removes unnecessary '<dir>/..' parts.
+ *
+ * Based on code in the Node.js 'path' core module.
+ *
+ * @param aPath The path or url to normalize.
+ */
+const normalize = lruMemoize(function normalize(aPath) {
+ let path = aPath;
+ const url = urlParse(aPath);
+ if (url) {
+ if (!url.path) {
+ return aPath;
+ }
+ path = url.path;
+ }
+ const isAbsolute = exports.isAbsolute(path);
+
+ // Split the path into parts between `/` characters. This is much faster than
+ // using `.split(/\/+/g)`.
+ const parts = [];
+ let start = 0;
+ let i = 0;
+ while (true) {
+ start = i;
+ i = path.indexOf("/", start);
+ if (i === -1) {
+ parts.push(path.slice(start));
+ break;
+ } else {
+ parts.push(path.slice(start, i));
+ while (i < path.length && path[i] === "/") {
+ i++;
+ }
+ }
+ }
+
+ let up = 0;
+ for (i = parts.length - 1; i >= 0; i--) {
+ const part = parts[i];
+ if (part === ".") {
+ parts.splice(i, 1);
+ } else if (part === "..") {
+ up++;
+ } else if (up > 0) {
+ if (part === "") {
+ // The first part is blank if the path is absolute. Trying to go
+ // above the root is a no-op. Therefore we can remove all '..' parts
+ // directly after the root.
+ parts.splice(i + 1, up);
+ up = 0;
+ } else {
+ parts.splice(i, 2);
+ up--;
+ }
+ }
+ }
+ path = parts.join("/");
+
+ if (path === "") {
+ path = isAbsolute ? "/" : ".";
+ }
+
+ if (url) {
+ url.path = path;
+ return urlGenerate(url);
+ }
+ return path;
+});
+exports.normalize = normalize;
+
+/**
+ * Joins two paths/URLs.
+ *
+ * @param aRoot The root path or URL.
+ * @param aPath The path or URL to be joined with the root.
+ *
+ * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a
+ * scheme-relative URL: Then the scheme of aRoot, if any, is prepended
+ * first.
+ * - Otherwise aPath is a path. If aRoot is a URL, then its path portion
+ * is updated with the result and aRoot is returned. Otherwise the result
+ * is returned.
+ * - If aPath is absolute, the result is aPath.
+ * - Otherwise the two paths are joined with a slash.
+ * - Joining for example 'http://' and 'www.example.com' is also supported.
+ */
+function join(aRoot, aPath) {
+ if (aRoot === "") {
+ aRoot = ".";
+ }
+ if (aPath === "") {
+ aPath = ".";
+ }
+ const aPathUrl = urlParse(aPath);
+ const aRootUrl = urlParse(aRoot);
+ if (aRootUrl) {
+ aRoot = aRootUrl.path || "/";
+ }
+
+ // `join(foo, '//www.example.org')`
+ if (aPathUrl && !aPathUrl.scheme) {
+ if (aRootUrl) {
+ aPathUrl.scheme = aRootUrl.scheme;
+ }
+ return urlGenerate(aPathUrl);
+ }
+
+ if (aPathUrl || aPath.match(dataUrlRegexp)) {
+ return aPath;
+ }
+
+ // `join('http://', 'www.example.com')`
+ if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {
+ aRootUrl.host = aPath;
+ return urlGenerate(aRootUrl);
+ }
+
+ const joined = aPath.charAt(0) === "/"
+ ? aPath
+ : normalize(aRoot.replace(/\/+$/, "") + "/" + aPath);
+
+ if (aRootUrl) {
+ aRootUrl.path = joined;
+ return urlGenerate(aRootUrl);
+ }
+ return joined;
+}
+exports.join = join;
+
+exports.isAbsolute = function(aPath) {
+ return aPath.charAt(0) === "/" || urlRegexp.test(aPath);
+};
+
+/**
+ * Make a path relative to a URL or another path.
+ *
+ * @param aRoot The root path or URL.
+ * @param aPath The path or URL to be made relative to aRoot.
+ */
+function relative(aRoot, aPath) {
+ if (aRoot === "") {
+ aRoot = ".";
+ }
+
+ aRoot = aRoot.replace(/\/$/, "");
+
+ // It is possible for the path to be above the root. In this case, simply
+ // checking whether the root is a prefix of the path won't work. Instead, we
+ // need to remove components from the root one by one, until either we find
+ // a prefix that fits, or we run out of components to remove.
+ let level = 0;
+ while (aPath.indexOf(aRoot + "/") !== 0) {
+ const index = aRoot.lastIndexOf("/");
+ if (index < 0) {
+ return aPath;
+ }
+
+ // If the only part of the root that is left is the scheme (i.e. http://,
+ // file:///, etc.), one or more slashes (/), or simply nothing at all, we
+ // have exhausted all components, so the path is not relative to the root.
+ aRoot = aRoot.slice(0, index);
+ if (aRoot.match(/^([^\/]+:\/)?\/*$/)) {
+ return aPath;
+ }
+
+ ++level;
+ }
+
+ // Make sure we add a "../" for each component we removed from the root.
+ return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1);
+}
+exports.relative = relative;
+
+const supportsNullProto = (function() {
+ const obj = Object.create(null);
+ return !("__proto__" in obj);
+}());
+
+function identity(s) {
+ return s;
+}
+
+/**
+ * Because behavior goes wacky when you set `__proto__` on objects, we
+ * have to prefix all the strings in our set with an arbitrary character.
+ *
+ * See https://github.com/mozilla/source-map/pull/31 and
+ * https://github.com/mozilla/source-map/issues/30
+ *
+ * @param String aStr
+ */
+function toSetString(aStr) {
+ if (isProtoString(aStr)) {
+ return "$" + aStr;
+ }
+
+ return aStr;
+}
+exports.toSetString = supportsNullProto ? identity : toSetString;
+
+function fromSetString(aStr) {
+ if (isProtoString(aStr)) {
+ return aStr.slice(1);
+ }
+
+ return aStr;
+}
+exports.fromSetString = supportsNullProto ? identity : fromSetString;
+
+function isProtoString(s) {
+ if (!s) {
+ return false;
+ }
+
+ const length = s.length;
+
+ if (length < 9 /* "__proto__".length */) {
+ return false;
+ }
+
+ /* eslint-disable no-multi-spaces */
+ if (s.charCodeAt(length - 1) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 2) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 3) !== 111 /* 'o' */ ||
+ s.charCodeAt(length - 4) !== 116 /* 't' */ ||
+ s.charCodeAt(length - 5) !== 111 /* 'o' */ ||
+ s.charCodeAt(length - 6) !== 114 /* 'r' */ ||
+ s.charCodeAt(length - 7) !== 112 /* 'p' */ ||
+ s.charCodeAt(length - 8) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 9) !== 95 /* '_' */) {
+ return false;
+ }
+ /* eslint-enable no-multi-spaces */
+
+ for (let i = length - 10; i >= 0; i--) {
+ if (s.charCodeAt(i) !== 36 /* '$' */) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+/**
+ * Comparator between two mappings where the original positions are compared.
+ *
+ * Optionally pass in `true` as `onlyCompareGenerated` to consider two
+ * mappings with the same original source/line/column, but different generated
+ * line and column the same. Useful when searching for a mapping with a
+ * stubbed out mapping.
+ */
+function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {
+ let cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0 || onlyCompareOriginal) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+}
+exports.compareByOriginalPositions = compareByOriginalPositions;
+
+/**
+ * Comparator between two mappings with deflated source and name indices where
+ * the generated positions are compared.
+ *
+ * Optionally pass in `true` as `onlyCompareGenerated` to consider two
+ * mappings with the same generated line and column, but different
+ * source/name/original line and column the same. Useful when searching for a
+ * mapping with a stubbed out mapping.
+ */
+function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {
+ let cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0 || onlyCompareGenerated) {
+ return cmp;
+ }
+
+ cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+}
+exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;
+
+function strcmp(aStr1, aStr2) {
+ if (aStr1 === aStr2) {
+ return 0;
+ }
+
+ if (aStr1 === null) {
+ return 1; // aStr2 !== null
+ }
+
+ if (aStr2 === null) {
+ return -1; // aStr1 !== null
+ }
+
+ if (aStr1 > aStr2) {
+ return 1;
+ }
+
+ return -1;
+}
+
+/**
+ * Comparator between two mappings with inflated source and name strings where
+ * the generated positions are compared.
+ */
+function compareByGeneratedPositionsInflated(mappingA, mappingB) {
+ let cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+}
+exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;
+
+/**
+ * Strip any JSON XSSI avoidance prefix from the string (as documented
+ * in the source maps specification), and then parse the string as
+ * JSON.
+ */
+function parseSourceMapInput(str) {
+ return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, ""));
+}
+exports.parseSourceMapInput = parseSourceMapInput;
+
+/**
+ * Compute the URL of a source given the the source root, the source's
+ * URL, and the source map's URL.
+ */
+function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {
+ sourceURL = sourceURL || "";
+
+ if (sourceRoot) {
+ // This follows what Chrome does.
+ if (sourceRoot[sourceRoot.length - 1] !== "/" && sourceURL[0] !== "/") {
+ sourceRoot += "/";
+ }
+ // The spec says:
+ // Line 4: An optional source root, useful for relocating source
+ // files on a server or removing repeated values in the
+ // “sources” entry. This value is prepended to the individual
+ // entries in the “source” field.
+ sourceURL = sourceRoot + sourceURL;
+ }
+
+ // Historically, SourceMapConsumer did not take the sourceMapURL as
+ // a parameter. This mode is still somewhat supported, which is why
+ // this code block is conditional. However, it's preferable to pass
+ // the source map URL to SourceMapConsumer, so that this function
+ // can implement the source URL resolution algorithm as outlined in
+ // the spec. This block is basically the equivalent of:
+ // new URL(sourceURL, sourceMapURL).toString()
+ // ... except it avoids using URL, which wasn't available in the
+ // older releases of node still supported by this library.
+ //
+ // The spec says:
+ // If the sources are not absolute URLs after prepending of the
+ // “sourceRoot”, the sources are resolved relative to the
+ // SourceMap (like resolving script src in a html document).
+ if (sourceMapURL) {
+ const parsed = urlParse(sourceMapURL);
+ if (!parsed) {
+ throw new Error("sourceMapURL could not be parsed");
+ }
+ if (parsed.path) {
+ // Strip the last path component, but keep the "/".
+ const index = parsed.path.lastIndexOf("/");
+ if (index >= 0) {
+ parsed.path = parsed.path.substring(0, index + 1);
+ }
+ }
+ sourceURL = join(urlGenerate(parsed), sourceURL);
+ }
+
+ return normalize(sourceURL);
+}
+exports.computeSourceURL = computeSourceURL;
diff --git a/node_modules/doiuse/node_modules/source-map/lib/wasm.js b/node_modules/doiuse/node_modules/source-map/lib/wasm.js
new file mode 100644
index 00000000..88b18bea
--- /dev/null
+++ b/node_modules/doiuse/node_modules/source-map/lib/wasm.js
@@ -0,0 +1,107 @@
+const readWasm = require("../lib/read-wasm");
+
+/**
+ * Provide the JIT with a nice shape / hidden class.
+ */
+function Mapping() {
+ this.generatedLine = 0;
+ this.generatedColumn = 0;
+ this.lastGeneratedColumn = null;
+ this.source = null;
+ this.originalLine = null;
+ this.originalColumn = null;
+ this.name = null;
+}
+
+let cachedWasm = null;
+
+module.exports = function wasm() {
+ if (cachedWasm) {
+ return cachedWasm;
+ }
+
+ const callbackStack = [];
+
+ cachedWasm = readWasm().then(buffer => {
+ return WebAssembly.instantiate(buffer, {
+ env: {
+ mapping_callback(
+ generatedLine,
+ generatedColumn,
+
+ hasLastGeneratedColumn,
+ lastGeneratedColumn,
+
+ hasOriginal,
+ source,
+ originalLine,
+ originalColumn,
+
+ hasName,
+ name
+ ) {
+ const mapping = new Mapping();
+ // JS uses 1-based line numbers, wasm uses 0-based.
+ mapping.generatedLine = generatedLine + 1;
+ mapping.generatedColumn = generatedColumn;
+
+ if (hasLastGeneratedColumn) {
+ // JS uses inclusive last generated column, wasm uses exclusive.
+ mapping.lastGeneratedColumn = lastGeneratedColumn - 1;
+ }
+
+ if (hasOriginal) {
+ mapping.source = source;
+ // JS uses 1-based line numbers, wasm uses 0-based.
+ mapping.originalLine = originalLine + 1;
+ mapping.originalColumn = originalColumn;
+
+ if (hasName) {
+ mapping.name = name;
+ }
+ }
+
+ callbackStack[callbackStack.length - 1](mapping);
+ },
+
+ start_all_generated_locations_for() { console.time("all_generated_locations_for"); },
+ end_all_generated_locations_for() { console.timeEnd("all_generated_locations_for"); },
+
+ start_compute_column_spans() { console.time("compute_column_spans"); },
+ end_compute_column_spans() { console.timeEnd("compute_column_spans"); },
+
+ start_generated_location_for() { console.time("generated_location_for"); },
+ end_generated_location_for() { console.timeEnd("generated_location_for"); },
+
+ start_original_location_for() { console.time("original_location_for"); },
+ end_original_location_for() { console.timeEnd("original_location_for"); },
+
+ start_parse_mappings() { console.time("parse_mappings"); },
+ end_parse_mappings() { console.timeEnd("parse_mappings"); },
+
+ start_sort_by_generated_location() { console.time("sort_by_generated_location"); },
+ end_sort_by_generated_location() { console.timeEnd("sort_by_generated_location"); },
+
+ start_sort_by_original_location() { console.time("sort_by_original_location"); },
+ end_sort_by_original_location() { console.timeEnd("sort_by_original_location"); },
+ }
+ });
+ }).then(Wasm => {
+ return {
+ exports: Wasm.instance.exports,
+ withMappingCallback: (mappingCallback, f) => {
+ callbackStack.push(mappingCallback);
+ try {
+ f();
+ } finally {
+ callbackStack.pop();
+ }
+ }
+ };
+ }).then(null, e => {
+ cachedWasm = null;
+ throw e;
+ });
+
+ return cachedWasm;
+};
diff --git a/node_modules/doiuse/node_modules/source-map/package.json b/node_modules/doiuse/node_modules/source-map/package.json
new file mode 100644
index 00000000..1d67accb
--- /dev/null
+++ b/node_modules/doiuse/node_modules/source-map/package.json
@@ -0,0 +1,91 @@
+{
+ "name": "source-map",
+ "description": "Generates and consumes source maps",
+ "version": "0.7.4",
+ "homepage": "https://github.com/mozilla/source-map",
+ "author": "Nick Fitzgerald <nfitzgerald@mozilla.com>",
+ "contributors": [
+ "Tobias Koppers <tobias.koppers@googlemail.com>",
+ "Duncan Beevers <duncan@dweebd.com>",
+ "Stephen Crane <scrane@mozilla.com>",
+ "Ryan Seddon <seddon.ryan@gmail.com>",
+ "Miles Elam <miles.elam@deem.com>",
+ "Mihai Bazon <mihai.bazon@gmail.com>",
+ "Michael Ficarra <github.public.email@michael.ficarra.me>",
+ "Todd Wolfson <todd@twolfson.com>",
+ "Alexander Solovyov <alexander@solovyov.net>",
+ "Felix Gnass <fgnass@gmail.com>",
+ "Conrad Irwin <conrad.irwin@gmail.com>",
+ "usrbincc <usrbincc@yahoo.com>",
+ "David Glasser <glasser@davidglasser.net>",
+ "Chase Douglas <chase@newrelic.com>",
+ "Evan Wallace <evan.exe@gmail.com>",
+ "Heather Arthur <fayearthur@gmail.com>",
+ "Hugh Kennedy <hughskennedy@gmail.com>",
+ "David Glasser <glasser@davidglasser.net>",
+ "Simon Lydell <simon.lydell@gmail.com>",
+ "Jmeas Smith <jellyes2@gmail.com>",
+ "Michael Z Goddard <mzgoddard@gmail.com>",
+ "azu <azu@users.noreply.github.com>",
+ "John Gozde <john@gozde.ca>",
+ "Adam Kirkton <akirkton@truefitinnovation.com>",
+ "Chris Montgomery <christopher.montgomery@dowjones.com>",
+ "J. Ryan Stinnett <jryans@gmail.com>",
+ "Jack Herrington <jherrington@walmartlabs.com>",
+ "Chris Truter <jeffpalentine@gmail.com>",
+ "Daniel Espeset <daniel@danielespeset.com>",
+ "Jamie Wong <jamie.lf.wong@gmail.com>",
+ "Eddy Bruël <ejpbruel@mozilla.com>",
+ "Hawken Rives <hawkrives@gmail.com>",
+ "Gilad Peleg <giladp007@gmail.com>",
+ "djchie <djchie.dev@gmail.com>",
+ "Gary Ye <garysye@gmail.com>",
+ "Nicolas Lalevée <nicolas.lalevee@hibnet.org>"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "http://github.com/mozilla/source-map.git"
+ },
+ "main": "./source-map.js",
+ "types": "./source-map.d.ts",
+ "files": [
+ "source-map.js",
+ "source-map.d.ts",
+ "lib/",
+ "dist/source-map.js"
+ ],
+ "engines": {
+ "node": ">= 8"
+ },
+ "license": "BSD-3-Clause",
+ "scripts": {
+ "lint": "eslint *.js lib/ test/",
+ "prebuild": "npm run lint",
+ "build": "webpack --color",
+ "pretest": "npm run build",
+ "test": "node test/run-tests.js",
+ "precoverage": "npm run build",
+ "coverage": "nyc node test/run-tests.js",
+ "setup": "mkdir -p coverage && cp -n .waiting.html coverage/index.html || true",
+ "dev:live": "live-server --port=4103 --ignorePattern='(js|css|png)$' coverage",
+ "dev:watch": "watch 'npm run coverage' lib/ test/",
+ "predev": "npm run setup",
+ "dev": "npm-run-all -p --silent dev:*",
+ "clean": "rm -rf coverage .nyc_output",
+ "toc": "doctoc --title '## Table of Contents' README.md && doctoc --title '## Table of Contents' CONTRIBUTING.md"
+ },
+ "devDependencies": {
+ "doctoc": "^1.3.1",
+ "eslint": "^4.19.1",
+ "live-server": "^1.2.0",
+ "npm-run-all": "^4.1.2",
+ "nyc": "^11.7.1",
+ "watch": "^1.0.2",
+ "webpack": "^4.9.1",
+ "webpack-cli": "^3.1"
+ },
+ "nyc": {
+ "reporter": "html"
+ },
+ "typings": "source-map"
+}
diff --git a/node_modules/doiuse/node_modules/source-map/source-map.d.ts b/node_modules/doiuse/node_modules/source-map/source-map.d.ts
new file mode 100644
index 00000000..24593915
--- /dev/null
+++ b/node_modules/doiuse/node_modules/source-map/source-map.d.ts
@@ -0,0 +1,369 @@
+// Type definitions for source-map 0.7
+// Project: https://github.com/mozilla/source-map
+// Definitions by: Morten Houston Ludvigsen <https://github.com/MortenHoustonLudvigsen>,
+// Ron Buckton <https://github.com/rbuckton>,
+// John Vilk <https://github.com/jvilk>
+// Definitions: https://github.com/mozilla/source-map
+export type SourceMapUrl = string;
+
+export interface StartOfSourceMap {
+ file?: string;
+ sourceRoot?: string;
+ skipValidation?: boolean;
+}
+
+export interface RawSourceMap {
+ version: number;
+ sources: string[];
+ names: string[];
+ sourceRoot?: string;
+ sourcesContent?: string[];
+ mappings: string;
+ file: string;
+}
+
+export interface RawIndexMap extends StartOfSourceMap {
+ version: number;
+ sections: RawSection[];
+}
+
+export interface RawSection {
+ offset: Position;
+ map: RawSourceMap;
+}
+
+export interface Position {
+ line: number;
+ column: number;
+}
+
+export interface NullablePosition {
+ line: number | null;
+ column: number | null;
+ lastColumn: number | null;
+}
+
+export interface MappedPosition {
+ source: string;
+ line: number;
+ column: number;
+ name?: string;
+}
+
+export interface NullableMappedPosition {
+ source: string | null;
+ line: number | null;
+ column: number | null;
+ name: string | null;
+}
+
+export interface MappingItem {
+ source: string;
+ generatedLine: number;
+ generatedColumn: number;
+ originalLine: number;
+ originalColumn: number;
+ name: string;
+}
+
+export interface Mapping {
+ generated: Position;
+ original: Position;
+ source: string;
+ name?: string;
+}
+
+export interface CodeWithSourceMap {
+ code: string;
+ map: SourceMapGenerator;
+}
+
+export interface SourceMapConsumer {
+ /**
+ * Compute the last column for each generated mapping. The last column is
+ * inclusive.
+ */
+ computeColumnSpans(): void;
+
+ /**
+ * Returns the original source, line, and column information for the generated
+ * source's line and column positions provided. The only argument is an object
+ * with the following properties:
+ *
+ * - line: The line number in the generated source.
+ * - column: The column number in the generated source.
+ * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
+ * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - source: The original source file, or null.
+ * - line: The line number in the original source, or null.
+ * - column: The column number in the original source, or null.
+ * - name: The original identifier, or null.
+ */
+ originalPositionFor(generatedPosition: Position & { bias?: number }): NullableMappedPosition;
+
+ /**
+ * Returns the generated line and column information for the original source,
+ * line, and column positions provided. The only argument is an object with
+ * the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source.
+ * - column: The column number in the original source.
+ * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
+ * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - line: The line number in the generated source, or null.
+ * - column: The column number in the generated source, or null.
+ */
+ generatedPositionFor(originalPosition: MappedPosition & { bias?: number }): NullablePosition;
+
+ /**
+ * Returns all generated line and column information for the original source,
+ * line, and column provided. If no column is provided, returns all mappings
+ * corresponding to a either the line we are searching for or the next
+ * closest line that has any mappings. Otherwise, returns all mappings
+ * corresponding to the given line and either the column we are searching for
+ * or the next closest column that has any offsets.
+ *
+ * The only argument is an object with the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source.
+ * - column: Optional. the column number in the original source.
+ *
+ * and an array of objects is returned, each with the following properties:
+ *
+ * - line: The line number in the generated source, or null.
+ * - column: The column number in the generated source, or null.
+ */
+ allGeneratedPositionsFor(originalPosition: MappedPosition): NullablePosition[];
+
+ /**
+ * Return true if we have the source content for every source in the source
+ * map, false otherwise.
+ */
+ hasContentsOfAllSources(): boolean;
+
+ /**
+ * Returns the original source content. The only argument is the url of the
+ * original source file. Returns null if no original source content is
+ * available.
+ */
+ sourceContentFor(source: string, returnNullOnMissing?: boolean): string | null;
+
+ /**
+ * Iterate over each mapping between an original source/line/column and a
+ * generated line/column in this source map.
+ *
+ * @param callback
+ * The function that is called with each mapping.
+ * @param context
+ * Optional. If specified, this object will be the value of `this` every
+ * time that `aCallback` is called.
+ * @param order
+ * Either `SourceMapConsumer.GENERATED_ORDER` or
+ * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to
+ * iterate over the mappings sorted by the generated file's line/column
+ * order or the original's source/line/column order, respectively. Defaults to
+ * `SourceMapConsumer.GENERATED_ORDER`.
+ */
+ eachMapping(callback: (mapping: MappingItem) => void, context?: any, order?: number): void;
+ /**
+ * Free this source map consumer's associated wasm data that is manually-managed.
+ * Alternatively, you can use SourceMapConsumer.with to avoid needing to remember to call destroy.
+ */
+ destroy(): void;
+}
+
+export interface SourceMapConsumerConstructor {
+ prototype: SourceMapConsumer;
+
+ GENERATED_ORDER: number;
+ ORIGINAL_ORDER: number;
+ GREATEST_LOWER_BOUND: number;
+ LEAST_UPPER_BOUND: number;
+
+ new (rawSourceMap: RawSourceMap, sourceMapUrl?: SourceMapUrl): Promise<BasicSourceMapConsumer>;
+ new (rawSourceMap: RawIndexMap, sourceMapUrl?: SourceMapUrl): Promise<IndexedSourceMapConsumer>;
+ new (rawSourceMap: RawSourceMap | RawIndexMap | string, sourceMapUrl?: SourceMapUrl): Promise<BasicSourceMapConsumer | IndexedSourceMapConsumer>;
+
+ /**
+ * Create a BasicSourceMapConsumer from a SourceMapGenerator.
+ *
+ * @param sourceMap
+ * The source map that will be consumed.
+ */
+ fromSourceMap(sourceMap: SourceMapGenerator, sourceMapUrl?: SourceMapUrl): Promise<BasicSourceMapConsumer>;
+
+ /**
+ * Construct a new `SourceMapConsumer` from `rawSourceMap` and `sourceMapUrl`
+ * (see the `SourceMapConsumer` constructor for details. Then, invoke the `async
+ * function f(SourceMapConsumer) -> T` with the newly constructed consumer, wait
+ * for `f` to complete, call `destroy` on the consumer, and return `f`'s return
+ * value.
+ *
+ * You must not use the consumer after `f` completes!
+ *
+ * By using `with`, you do not have to remember to manually call `destroy` on
+ * the consumer, since it will be called automatically once `f` completes.
+ *
+ * ```js
+ * const xSquared = await SourceMapConsumer.with(
+ * myRawSourceMap,
+ * null,
+ * async function (consumer) {
+ * // Use `consumer` inside here and don't worry about remembering
+ * // to call `destroy`.
+ *
+ * const x = await whatever(consumer);
+ * return x * x;
+ * }
+ * );
+ *
+ * // You may not use that `consumer` anymore out here; it has
+ * // been destroyed. But you can use `xSquared`.
+ * console.log(xSquared);
+ * ```
+ */
+ with<T>(rawSourceMap: RawSourceMap | RawIndexMap | string, sourceMapUrl: SourceMapUrl | null | undefined, callback: (consumer: BasicSourceMapConsumer | IndexedSourceMapConsumer) => Promise<T> | T): Promise<T>;
+}
+
+export const SourceMapConsumer: SourceMapConsumerConstructor;
+
+export interface BasicSourceMapConsumer extends SourceMapConsumer {
+ file: string;
+ sourceRoot: string;
+ sources: string[];
+ sourcesContent: string[];
+}
+
+export interface BasicSourceMapConsumerConstructor {
+ prototype: BasicSourceMapConsumer;
+
+ new (rawSourceMap: RawSourceMap | string): Promise<BasicSourceMapConsumer>;
+
+ /**
+ * Create a BasicSourceMapConsumer from a SourceMapGenerator.
+ *
+ * @param sourceMap
+ * The source map that will be consumed.
+ */
+ fromSourceMap(sourceMap: SourceMapGenerator): Promise<BasicSourceMapConsumer>;
+}
+
+export const BasicSourceMapConsumer: BasicSourceMapConsumerConstructor;
+
+export interface IndexedSourceMapConsumer extends SourceMapConsumer {
+ sources: string[];
+}
+
+export interface IndexedSourceMapConsumerConstructor {
+ prototype: IndexedSourceMapConsumer;
+
+ new (rawSourceMap: RawIndexMap | string): Promise<IndexedSourceMapConsumer>;
+}
+
+export const IndexedSourceMapConsumer: IndexedSourceMapConsumerConstructor;
+
+export class SourceMapGenerator {
+ constructor(startOfSourceMap?: StartOfSourceMap);
+
+ /**
+ * Creates a new SourceMapGenerator based on a SourceMapConsumer
+ *
+ * @param sourceMapConsumer The SourceMap.
+ */
+ static fromSourceMap(sourceMapConsumer: SourceMapConsumer): SourceMapGenerator;
+
+ /**
+ * Add a single mapping from original source line and column to the generated
+ * source's line and column for this source map being created. The mapping
+ * object should have the following properties:
+ *
+ * - generated: An object with the generated line and column positions.
+ * - original: An object with the original line and column positions.
+ * - source: The original source file (relative to the sourceRoot).
+ * - name: An optional original token name for this mapping.
+ */
+ addMapping(mapping: Mapping): void;
+
+ /**
+ * Set the source content for a source file.
+ */
+ setSourceContent(sourceFile: string, sourceContent: string): void;
+
+ /**
+ * Applies the mappings of a sub-source-map for a specific source file to the
+ * source map being generated. Each mapping to the supplied source file is
+ * rewritten using the supplied source map. Note: The resolution for the
+ * resulting mappings is the minimium of this map and the supplied map.
+ *
+ * @param sourceMapConsumer The source map to be applied.
+ * @param sourceFile Optional. The filename of the source file.
+ * If omitted, SourceMapConsumer's file property will be used.
+ * @param sourceMapPath Optional. The dirname of the path to the source map
+ * to be applied. If relative, it is relative to the SourceMapConsumer.
+ * This parameter is needed when the two source maps aren't in the same
+ * directory, and the source map to be applied contains relative source
+ * paths. If so, those relative source paths need to be rewritten
+ * relative to the SourceMapGenerator.
+ */
+ applySourceMap(sourceMapConsumer: SourceMapConsumer, sourceFile?: string, sourceMapPath?: string): void;
+
+ toString(): string;
+
+ toJSON(): RawSourceMap;
+}
+
+export class SourceNode {
+ children: SourceNode[];
+ sourceContents: any;
+ line: number;
+ column: number;
+ source: string;
+ name: string;
+
+ constructor();
+ constructor(
+ line: number | null,
+ column: number | null,
+ source: string | null,
+ chunks?: Array<(string | SourceNode)> | SourceNode | string,
+ name?: string
+ );
+
+ static fromStringWithSourceMap(
+ code: string,
+ sourceMapConsumer: SourceMapConsumer,
+ relativePath?: string
+ ): SourceNode;
+
+ add(chunk: Array<(string | SourceNode)> | SourceNode | string): SourceNode;
+
+ prepend(chunk: Array<(string | SourceNode)> | SourceNode | string): SourceNode;
+
+ setSourceContent(sourceFile: string, sourceContent: string): void;
+
+ walk(fn: (chunk: string, mapping: MappedPosition) => void): void;
+
+ walkSourceContents(fn: (file: string, content: string) => void): void;
+
+ join(sep: string): SourceNode;
+
+ replaceRight(pattern: string, replacement: string): SourceNode;
+
+ toString(): string;
+
+ toStringWithSourceMap(startOfSourceMap?: StartOfSourceMap): CodeWithSourceMap;
+}
diff --git a/node_modules/doiuse/node_modules/source-map/source-map.js b/node_modules/doiuse/node_modules/source-map/source-map.js
new file mode 100644
index 00000000..a84abf1e
--- /dev/null
+++ b/node_modules/doiuse/node_modules/source-map/source-map.js
@@ -0,0 +1,8 @@
+/*
+ * Copyright 2009-2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE.txt or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+exports.SourceMapGenerator = require("./lib/source-map-generator").SourceMapGenerator;
+exports.SourceMapConsumer = require("./lib/source-map-consumer").SourceMapConsumer;
+exports.SourceNode = require("./lib/source-node").SourceNode;
diff --git a/node_modules/doiuse/package.json b/node_modules/doiuse/package.json
new file mode 100644
index 00000000..c82d589c
--- /dev/null
+++ b/node_modules/doiuse/package.json
@@ -0,0 +1,96 @@
+{
+ "name": "doiuse",
+ "version": "6.0.2",
+ "description": "Lint CSS for browser support against caniuse database",
+ "main:": "./exports/index.cjs",
+ "type": "module",
+ "exports": {
+ "./lib/*": "./lib/*",
+ ".": {
+ "require": "./exports/index.cjs",
+ "import": "./exports/index.js"
+ },
+ "./stream": {
+ "require": "./exports/stream.cjs",
+ "import": "./exports/stream.js"
+ }
+ },
+ "bin": "./bin/cli.js",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/anandthakker/doiuse.git"
+ },
+ "keywords": [
+ "lint",
+ "css",
+ "browser",
+ "support",
+ "caniuse",
+ "stylelint"
+ ],
+ "author": "Carlos Lopez Jr. <clshortfuse@gmail.com> (https://github.com/clshortfuse)",
+ "contributors": [
+ "Robbie Wadley (https://github.com/RJWadley)",
+ "Anand Thakker <mail@anandthakker.net> (http://www.anandthakker.net/)",
+ "Piotr Kuczynski <piotr.kuczynski@gmail.com> (https://github.com/pkuczynski)"
+ ],
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/anandthakker/doiuse/issues"
+ },
+ "homepage": "https://github.com/anandthakker/doiuse",
+ "engines": {
+ "node": ">=16"
+ },
+ "dependencies": {
+ "browserslist": "^4.21.5",
+ "caniuse-lite": "^1.0.30001487",
+ "css-tokenize": "^1.0.1",
+ "duplexify": "^4.1.2",
+ "ldjson-stream": "^1.2.1",
+ "multimatch": "^5.0.0",
+ "postcss": "^8.4.21",
+ "source-map": "^0.7.4",
+ "yargs": "^17.7.1"
+ },
+ "devDependencies": {
+ "@types/caniuse-lite": "^1.0.1",
+ "@types/duplexify": "^3.6.1",
+ "@types/node": "^16.18.34",
+ "@types/tap": "^15.0.8",
+ "@types/yargs": "^17.0.24",
+ "@typescript-eslint/eslint-plugin": "^5.54.0",
+ "@typescript-eslint/parser": "^5.54.0",
+ "c8": "^7.13.0",
+ "caniuse-db": "^1.0.30001487",
+ "eslint": "^8.35.0",
+ "eslint-config-airbnb-base": "^15.0.0",
+ "eslint-plugin-canonical": "^4.2.2",
+ "eslint-plugin-import": "^2.27.5",
+ "eslint-plugin-jsdoc": "^46.4.3",
+ "eslint-plugin-n": "^16.0.0",
+ "eslint-plugin-unicorn": "^47.0.0",
+ "mock-fs": "^4.14.0",
+ "postcss-import": "^14.1.0",
+ "rollup": "^2.79.1",
+ "safe-regex": "^2.1.1",
+ "tap": "^16.3.4",
+ "typescript": "^5.1.6"
+ },
+ "files": [
+ "bin",
+ "data",
+ "features",
+ "exports",
+ "lib",
+ "types",
+ "utils"
+ ],
+ "scripts": {
+ "pretest": "eslint \"./bin/**/*.js\" \"./data/**/*.js\" \"./utils/**/*.js\" \"./lib/**/*.js\" \"./test/**/*.js\" && tsc --noEmit",
+ "test": "c8 tap --no-coverage",
+ "prepare": "rollup -c rollup.config.js",
+ "prepublishOnly": "tsc --emitDeclarationOnly",
+ "updateFeatures": "scripts/update-caniuse.sh && node scripts/update-features.js"
+ }
+}
diff --git a/node_modules/doiuse/types/bin/cli.d.ts b/node_modules/doiuse/types/bin/cli.d.ts
new file mode 100644
index 00000000..b7988016
--- /dev/null
+++ b/node_modules/doiuse/types/bin/cli.d.ts
@@ -0,0 +1,2 @@
+#!/usr/bin/env node
+export {};
diff --git a/node_modules/doiuse/types/data/features.d.ts b/node_modules/doiuse/types/data/features.d.ts
new file mode 100644
index 00000000..f724f4d4
--- /dev/null
+++ b/node_modules/doiuse/types/data/features.d.ts
@@ -0,0 +1,786 @@
+declare const _default: {
+ outline: Feature;
+ "background-attachment": Feature;
+ pointer: Feature;
+ "flow-root": Feature;
+ "font-kerning": Feature;
+ "font-smooth": Feature;
+ "font-variant-alternates": Feature;
+ "font-variant-numeric": Feature;
+ "inline-block": Feature;
+ "prefers-color-scheme": Feature;
+ "prefers-reduced-motion": Feature;
+ rem: Feature;
+ "run-in": Feature;
+ "text-emphasis": Feature;
+ "text-stroke": Feature;
+ "webkit-user-drag": Feature;
+ "border-image": Feature;
+ "border-radius": Feature;
+ "font-size-adjust": Feature;
+ "text-decoration": Feature;
+ "object-fit": Feature;
+ "pointer-events": Feature;
+ "text-overflow": Feature;
+ "text-size-adjust": Feature;
+ "will-change": Feature;
+ "word-break": Feature;
+ "alternate-stylesheet": Feature;
+ "background-clip-text": Feature;
+ "background-img-opts": Feature;
+ "background-position-x-y": Feature;
+ "background-repeat-round-space": Feature;
+ calc: Feature;
+ "ch-unit": Feature;
+ "css-all": Feature;
+ "css-animation": Feature;
+ "css-any-link": Feature;
+ "css-appearance": Feature;
+ "css-at-counter-style": Feature;
+ "css-autofill": Feature;
+ "css-backdrop-filter": Feature;
+ "css-background-offsets": Feature;
+ "css-backgroundblendmode": Feature;
+ "css-boxdecorationbreak": Feature;
+ "css-boxshadow": Feature;
+ "css-canvas": Feature;
+ "css-caret-color": Feature;
+ "css-cascade-layers": Feature;
+ "css-case-insensitive": Feature;
+ "css-clip-path": Feature;
+ "css-color-adjust": Feature;
+ "css-color-function": Feature;
+ "css-conic-gradients": Feature;
+ "css-container-queries": Feature;
+ "css-container-queries-style": Feature;
+ "css-container-query-units": Feature;
+ "css-containment": Feature;
+ "css-content-visibility": Feature;
+ "css-counters": Feature;
+ "css-crisp-edges": Feature;
+ "css-cross-fade": Feature;
+ "css-default-pseudo": Feature;
+ "css-descendant-gtgt": Feature;
+ "css-deviceadaptation": Feature;
+ "css-dir-pseudo": Feature;
+ "css-display-contents": Feature;
+ "css-element-function": Feature;
+ "css-env-function": Feature;
+ "css-exclusions": Feature;
+ "css-featurequeries": Feature;
+ "css-file-selector-button": Feature;
+ "css-filter-function": Feature;
+ "css-filters": Feature;
+ "css-first-letter": Feature;
+ "css-first-line": Feature;
+ "css-fixed": Feature;
+ "css-focus-visible": Feature;
+ "css-focus-within": Feature;
+ "css-font-palette": Feature;
+ "css-font-rendering-controls": Feature;
+ "css-font-stretch": Feature;
+ "css-gencontent": Feature;
+ "css-gradients": Feature;
+ "css-grid": Feature;
+ "css-grid-animation": Feature;
+ "css-hanging-punctuation": Feature;
+ "css-has": Feature;
+ "css-hyphens": Feature;
+ "css-image-orientation": Feature;
+ "css-image-set": Feature;
+ "css-in-out-of-range": Feature;
+ "css-indeterminate-pseudo": Feature;
+ "css-initial-letter": Feature;
+ "css-initial-value": Feature;
+ "css-lch-lab": Feature;
+ "css-letter-spacing": Feature;
+ "css-line-clamp": Feature;
+ "css-logical-props": Feature;
+ "css-marker-pseudo": Feature;
+ "css-masks": Feature;
+ "css-matches-pseudo": Feature;
+ "css-math-functions": Feature;
+ "css-media-interaction": Feature;
+ "css-media-range-syntax": Feature;
+ "css-media-resolution": Feature;
+ "css-media-scripting": Feature;
+ "css-mediaqueries": Feature;
+ "css-mixblendmode": Feature;
+ "css-motion-paths": Feature;
+ "css-namespaces": Feature;
+ "css-nesting": Feature;
+ "css-not-sel-list": Feature;
+ "css-nth-child-of": Feature;
+ "css-opacity": Feature;
+ "css-optional-pseudo": Feature;
+ "css-overflow": Feature;
+ "css-overflow-anchor": Feature;
+ "css-overflow-overlay": Feature;
+ "css-overscroll-behavior": Feature;
+ "css-page-break": Feature;
+ "css-paged-media": Feature;
+ "css-paint-api": Feature;
+ "css-placeholder": Feature;
+ "css-placeholder-shown": Feature;
+ "css-print-color-adjust": Feature;
+ "css-read-only-write": Feature;
+ "css-rebeccapurple": Feature;
+ "css-reflections": Feature;
+ "css-regions": Feature;
+ "css-relative-colors": Feature;
+ "css-repeating-gradients": Feature;
+ "css-resize": Feature;
+ "css-revert-value": Feature;
+ "css-rrggbbaa": Feature;
+ "css-scroll-behavior": Feature;
+ "css-scroll-timeline": Feature;
+ "css-scrollbar": Feature;
+ "css-sel2": Feature;
+ "css-sel3": Feature;
+ "css-selection": Feature;
+ "css-shapes": Feature;
+ "css-snappoints": Feature;
+ "css-sticky": Feature;
+ "css-subgrid": Feature;
+ "css-supports-api": Feature;
+ "css-table": Feature;
+ "css-text-align-last": Feature;
+ "css-text-box-trim": Feature;
+ "css-text-indent": Feature;
+ "css-text-justify": Feature;
+ "css-text-orientation": Feature;
+ "css-text-spacing": Feature;
+ "css-textshadow": Feature;
+ "css-touch-action": Feature;
+ "css-transitions": Feature;
+ "css-unicode-bidi": Feature;
+ "css-unset-value": Feature;
+ "css-variables": Feature;
+ "css-when-else": Feature;
+ "css-widows-orphans": Feature;
+ "css-width-stretch": Feature;
+ "css-writing-mode": Feature;
+ "css-zoom": Feature;
+ "css3-attr": Feature;
+ "css3-boxsizing": Feature;
+ "css3-colors": Feature;
+ "css3-cursors": Feature;
+ "css3-cursors-grab": Feature;
+ "css3-cursors-newer": Feature;
+ "css3-tabsize": Feature;
+ currentcolor: Feature;
+ devicepixelratio: Feature;
+ "extended-system-fonts": Feature;
+ flexbox: Feature;
+ "flexbox-gap": Feature;
+ "font-family-system-ui": Feature;
+ "font-feature": Feature;
+ "font-loading": Feature;
+ "font-unicode-range": Feature;
+ fontface: Feature;
+ fullscreen: Feature;
+ getcomputedstyle: Feature;
+ "intrinsic-width": Feature;
+ "justify-content-space-evenly": Feature;
+ "kerning-pairs-ligatures": Feature;
+ "mdn-css-unicode-bidi-isolate": Feature;
+ "mdn-css-unicode-bidi-isolate-override": Feature;
+ "mdn-css-unicode-bidi-plaintext": Feature;
+ "mdn-text-decoration-color": Feature;
+ "mdn-text-decoration-line": Feature;
+ "mdn-text-decoration-shorthand": Feature;
+ "mdn-text-decoration-style": Feature;
+ minmaxwh: Feature;
+ multibackgrounds: Feature;
+ multicolumn: Feature;
+ "style-scoped": Feature;
+ "svg-css": Feature;
+ transforms2d: Feature;
+ transforms3d: Feature;
+ ttf: Feature;
+ "user-select-none": Feature;
+ "variable-fonts": Feature;
+ "viewport-unit-variants": Feature;
+ "viewport-units": Feature;
+ wordwrap: Feature;
+};
+export default _default;
+export type FeatureCheck = string | RegExp | ((value: string) => boolean);
+export type RuleCheck = (rule: import('postcss').ChildNode) => boolean;
+export type Feature = Record<string, FeatureCheck | FeatureCheck[] | boolean> | RuleCheck | RuleCheck[];
+export type FeatureKeys = keyof typeof FEATURES;
+type FEATURES = Feature;
+/** @typedef {RegExp|string|((value:string) => boolean)} FeatureCheck */
+/** @typedef {((rule:import('postcss').ChildNode) => boolean)} RuleCheck */
+/** @typedef {Record<string, FeatureCheck|FeatureCheck[]|boolean> | RuleCheck | RuleCheck[]} Feature */
+/** @enum {Feature} */
+declare const FEATURES: {
+ 'alternate-stylesheet': Feature;
+ 'background-attachment': Feature;
+ 'background-clip-text': Feature;
+ 'background-img-opts': {
+ 'background-clip': boolean;
+ 'background-origin': boolean;
+ 'background-size': boolean;
+ };
+ 'background-position-x-y': {
+ 'background-position-x': boolean;
+ 'background-position-y': boolean;
+ };
+ 'background-repeat-round-space': Feature;
+ 'border-image': {
+ 'border-image': boolean;
+ 'border-image-outset': boolean;
+ 'border-image-repeat': boolean;
+ 'border-image-slice': boolean;
+ 'border-image-source': boolean;
+ 'border-image-width': boolean;
+ };
+ 'border-radius': {
+ 'border-radius': boolean;
+ 'border-top-left-radius': boolean;
+ 'border-top-right-radius': boolean;
+ 'border-bottom-right-radius': boolean;
+ 'border-bottom-left-radius': boolean;
+ };
+ calc: {
+ '': string;
+ };
+ 'ch-unit': Feature;
+ 'css-all': {
+ all: boolean;
+ };
+ 'css-animation': {
+ animation: boolean;
+ 'animation-name': boolean;
+ 'animation-duration': boolean;
+ 'animation-timing-function': boolean;
+ 'animation-iteration-count': boolean;
+ 'animation-direction': boolean;
+ 'animation-play-state': boolean;
+ 'animation-delay': boolean;
+ 'animation-fill-mode': boolean;
+ };
+ 'css-any-link': (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+ 'css-appearance': {
+ appearance: boolean;
+ '-webkit-appearance': boolean;
+ '-moz-appearance': boolean;
+ };
+ 'css-at-counter-style': (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+ 'css-autofill': (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+ 'css-backdrop-filter': {
+ 'backdrop-filter': boolean;
+ };
+ 'css-background-offsets': (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+ 'css-backgroundblendmode': {
+ 'background-blend-mode': boolean;
+ };
+ 'css-boxdecorationbreak': Feature;
+ 'css-boxshadow': {
+ 'box-shadow': boolean;
+ };
+ 'css-canvas': (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+ 'css-caret-color': Feature;
+ 'css-cascade-layers': Feature;
+ 'css-case-insensitive': Feature;
+ 'css-clip-path': {
+ 'clip-path': boolean;
+ };
+ 'css-color-adjust': Feature;
+ 'css-color-function': Feature;
+ 'css-conic-gradients': {
+ background: RegExp;
+ 'background-image': RegExp;
+ 'border-image': RegExp;
+ 'border-image-source': RegExp;
+ content: RegExp;
+ cursor: RegExp;
+ 'list-style': RegExp;
+ 'list-style-image': RegExp;
+ };
+ 'css-container-queries': Feature;
+ 'css-container-queries-style': (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+ 'css-container-query-units': (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+ 'css-containment': Feature;
+ 'css-content-visibility': Feature;
+ 'css-counters': {
+ 'counter-reset': boolean;
+ 'counter-increment': boolean;
+ '': string;
+ };
+ 'css-crisp-edges': Feature;
+ 'css-cross-fade': Feature;
+ 'css-default-pseudo': Feature;
+ 'css-descendant-gtgt': Feature;
+ 'css-deviceadaptation': Feature;
+ 'css-dir-pseudo': Feature;
+ 'css-display-contents': Feature;
+ 'css-element-function': Feature;
+ 'css-env-function': {
+ '': string;
+ };
+ 'css-exclusions': Feature;
+ 'css-featurequeries': (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+ 'css-file-selector-button': Feature;
+ 'css-filter-function': Feature;
+ 'css-filters': {
+ filter: boolean;
+ };
+ 'css-first-letter': Feature;
+ 'css-first-line': Feature;
+ 'css-fixed': {
+ position: string;
+ };
+ 'css-focus-visible': Feature;
+ 'css-focus-within': Feature;
+ 'css-font-palette': ((rule: any) => any)[];
+ 'css-font-rendering-controls': Feature;
+ 'css-font-stretch': {
+ 'font-stretch': boolean;
+ };
+ 'css-gencontent': (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+ 'css-gradients': {
+ background: RegExp;
+ 'background-image': RegExp;
+ 'border-image': RegExp;
+ 'border-image-source': RegExp;
+ content: RegExp;
+ cursor: RegExp;
+ 'list-style': RegExp;
+ 'list-style-image': RegExp;
+ };
+ 'css-grid': {
+ display: string[];
+ grid: boolean;
+ 'grid-area': boolean;
+ 'grid-auto-columns': boolean;
+ 'grid-auto-flow': boolean;
+ 'grid-auto-rows': boolean;
+ 'grid-column': boolean;
+ 'grid-column-end': boolean;
+ 'grid-column-start': boolean;
+ 'grid-row': boolean;
+ 'grid-row-end': boolean;
+ 'grid-row-start': boolean;
+ 'grid-template': boolean;
+ 'grid-template-areas': boolean;
+ 'grid-template-columns': boolean;
+ 'grid-template-rows': boolean;
+ };
+ 'css-grid-animation': {
+ transition: RegExp;
+ 'transition-property': RegExp;
+ };
+ 'css-hanging-punctuation': Feature;
+ 'css-has': Feature;
+ 'css-hyphens': {
+ hyphens: boolean;
+ };
+ 'css-image-orientation': {
+ 'image-orientation': boolean;
+ };
+ 'css-image-set': Feature;
+ 'css-in-out-of-range': Feature;
+ 'css-indeterminate-pseudo': Feature;
+ 'css-initial-letter': Feature;
+ 'css-initial-value': {
+ '': string;
+ };
+ 'css-lch-lab': Feature;
+ 'css-letter-spacing': Feature;
+ 'css-line-clamp': Feature;
+ 'css-logical-props': {
+ 'block-size': boolean;
+ 'inline-size': boolean;
+ 'min-block-size': boolean;
+ 'min-inline-size': boolean;
+ 'max-block-size': boolean;
+ 'max-inline-size': boolean;
+ 'margin-block-start': boolean;
+ 'margin-block-end': boolean;
+ 'margin-inline-start': boolean;
+ 'margin-inline-end': boolean;
+ 'margin-block': boolean;
+ 'margin-inline': boolean;
+ 'inset-block-start': boolean;
+ 'inset-block-end': boolean;
+ 'inset-inline-start': boolean;
+ 'inset-inline-end': boolean;
+ 'inset-block': boolean;
+ 'inset-inline': boolean;
+ inset: boolean;
+ 'padding-block-start': boolean;
+ 'padding-block-end': boolean;
+ 'padding-inline-start': boolean;
+ 'padding-inline-end': boolean;
+ 'padding-block': boolean;
+ 'padding-inline': boolean;
+ 'border-block-start-width': boolean;
+ 'border-block-end-width': boolean;
+ 'border-inline-start-width': boolean;
+ 'border-inline-end-width': boolean;
+ 'border-block-width': boolean;
+ 'border-inline-width': boolean;
+ 'border-block-start-style': boolean;
+ 'border-block-end-style': boolean;
+ 'border-inline-start-style': boolean;
+ 'border-inline-end-style': boolean;
+ 'border-block-style': boolean;
+ 'border-inline-style': boolean;
+ 'border-block-start-color': boolean;
+ 'border-block-end-color': boolean;
+ 'border-inline-start-color': boolean;
+ 'border-inline-end-color': boolean;
+ 'border-block-color': boolean;
+ 'border-inline-color': boolean;
+ 'border-block-start': boolean;
+ 'border-block-end': boolean;
+ 'border-inline-start': boolean;
+ 'border-inline-end': boolean;
+ 'border-block': boolean;
+ 'border-inline': boolean;
+ 'border-start-start-radius': boolean;
+ 'border-start-end-radius': boolean;
+ 'border-end-start-radius': boolean;
+ 'border-end-end-radius': boolean;
+ 'text-align': string[];
+ float: string[];
+ resize: string[];
+ 'overflow-block': boolean;
+ 'overflow-inline': boolean;
+ };
+ 'css-marker-pseudo': Feature;
+ 'css-masks': {
+ 'clip-path': boolean;
+ mask: boolean;
+ 'mask-border': boolean;
+ 'mask-border-mode': boolean;
+ 'mask-border-outset': boolean;
+ 'mask-border-repeat': boolean;
+ 'mask-border-slice': boolean;
+ 'mask-border-source': boolean;
+ 'mask-border-width': boolean;
+ 'mask-clip': boolean;
+ 'mask-composite': boolean;
+ 'mask-image': boolean;
+ 'mask-mode': boolean;
+ 'mask-origin': boolean;
+ 'mask-position': boolean;
+ 'mask-repeat': boolean;
+ 'mask-size': boolean;
+ 'mask-type': boolean;
+ '-webkit-clip-path': boolean;
+ '-webkit-mask': boolean;
+ '-webkit-mask-border': boolean;
+ '-webkit-mask-border-mode': boolean;
+ '-webkit-mask-border-outset': boolean;
+ '-webkit-mask-border-repeat': boolean;
+ '-webkit-mask-border-slice': boolean;
+ '-webkit-mask-border-source': boolean;
+ '-webkit-mask-border-width': boolean;
+ '-webkit-mask-clip': boolean;
+ '-webkit-mask-composite': boolean;
+ '-webkit-mask-image': boolean;
+ '-webkit-mask-mode': boolean;
+ '-webkit-mask-origin': boolean;
+ '-webkit-mask-position': boolean;
+ '-webkit-mask-repeat': boolean;
+ '-webkit-mask-size': boolean;
+ '-webkit-mask-type': boolean;
+ };
+ 'css-matches-pseudo': (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+ 'css-math-functions': {
+ '': string[];
+ };
+ 'css-media-interaction': Feature;
+ 'css-media-range-syntax': (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+ 'css-media-resolution': (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+ 'css-media-scripting': Feature;
+ 'css-mediaqueries': (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+ 'css-mixblendmode': {
+ 'mix-blend-mode': boolean;
+ };
+ 'css-motion-paths': {
+ 'offset-path': boolean;
+ };
+ 'css-namespaces': Feature;
+ 'css-nesting': Feature;
+ 'css-not-sel-list': Feature;
+ 'css-nth-child-of': Feature;
+ 'css-opacity': {
+ opacity: boolean;
+ };
+ 'css-optional-pseudo': Feature;
+ 'css-overflow': Feature;
+ 'css-overflow-anchor': Feature;
+ 'css-overflow-overlay': {
+ overflow: string;
+ };
+ 'css-overscroll-behavior': {
+ 'overscroll-behavior': boolean;
+ 'overscroll-behavior-x': boolean;
+ 'overscroll-behavior-y': boolean;
+ };
+ 'css-page-break': Feature;
+ 'css-paged-media': Feature;
+ 'css-paint-api': Feature;
+ 'css-placeholder': ((rule: import("postcss/lib/node.js").ChildNode) => boolean)[];
+ 'css-placeholder-shown': Feature;
+ 'css-print-color-adjust': {
+ 'print-color-adjust': boolean;
+ };
+ 'css-read-only-write': Feature;
+ 'css-rebeccapurple': Feature;
+ 'css-reflections': {
+ 'box-reflect': boolean;
+ '-webkit-box-reflect': boolean;
+ };
+ 'css-regions': Feature;
+ 'css-relative-colors': Feature;
+ 'css-repeating-gradients': {
+ '': string[];
+ };
+ 'css-resize': {
+ resize: boolean;
+ };
+ 'css-revert-value': {
+ '': string;
+ };
+ 'css-rrggbbaa': Feature;
+ 'css-scroll-behavior': Feature;
+ 'css-scroll-timeline': Feature;
+ 'css-scrollbar': {
+ 'scrollbar-color': boolean;
+ 'scrollbar-width': boolean;
+ };
+ 'css-sel2': (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+ 'css-sel3': (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+ 'css-selection': (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+ 'css-shapes': {
+ 'shape-outside': boolean;
+ 'shape-image-threshold': boolean;
+ 'shape-margin': boolean;
+ };
+ 'css-snappoints': Feature;
+ 'css-sticky': {
+ position: string;
+ };
+ 'css-subgrid': Feature;
+ 'css-supports-api': Feature;
+ 'css-table': {
+ display: string[];
+ };
+ 'css-text-align-last': Feature;
+ 'css-text-box-trim': Feature;
+ 'css-text-indent': Feature;
+ 'css-text-justify': Feature;
+ 'css-text-orientation': Feature;
+ 'css-text-spacing': Feature;
+ 'css-textshadow': {
+ 'text-shadow': boolean;
+ };
+ 'css-touch-action': {
+ 'touch-action': boolean;
+ };
+ 'css-transitions': {
+ transition: boolean;
+ 'transition-property': boolean;
+ 'transition-duration': boolean;
+ 'transition-delay': boolean;
+ 'transition-timing-function': boolean;
+ };
+ 'css-unicode-bidi': Feature;
+ 'css-unset-value': {
+ '': string;
+ };
+ 'css-variables': (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+ 'css-when-else': Feature;
+ 'css-widows-orphans': Feature;
+ 'css-width-stretch': Feature;
+ 'css-writing-mode': Feature;
+ 'css-zoom': Feature;
+ 'css3-attr': Feature;
+ 'css3-boxsizing': {
+ 'box-sizing': boolean;
+ };
+ 'css3-colors': {
+ '': string[];
+ };
+ 'css3-cursors': {
+ cursor: string[];
+ };
+ 'css3-cursors-grab': {
+ cursor: string[];
+ };
+ 'css3-cursors-newer': {
+ cursor: string[];
+ };
+ 'css3-tabsize': {
+ 'tab-size': boolean;
+ };
+ currentcolor: Feature;
+ devicepixelratio: Feature;
+ 'extended-system-fonts': Feature;
+ flexbox: {
+ display: string[];
+ flex: boolean;
+ 'flex-grow': boolean;
+ 'flex-shrink': boolean;
+ 'flex-basis': boolean;
+ 'flex-direction': boolean;
+ 'flex-wrap': boolean;
+ 'flex-flow': boolean;
+ };
+ 'flexbox-gap': Feature;
+ 'flow-root': Feature;
+ 'font-family-system-ui': Feature;
+ 'font-feature': {
+ 'font-feature-settings': boolean;
+ 'font-variant-ligatures': boolean;
+ 'font-language-override': boolean;
+ 'font-kerning': boolean;
+ };
+ 'font-kerning': Feature;
+ 'font-loading': Feature;
+ 'font-size-adjust': {
+ 'font-size-adjust': boolean;
+ };
+ 'font-smooth': Feature;
+ 'font-unicode-range': {
+ 'unicode-range': boolean;
+ };
+ 'font-variant-alternates': Feature;
+ 'font-variant-numeric': Feature;
+ fontface: ((rule: import("postcss/lib/node.js").ChildNode) => boolean)[];
+ fullscreen: (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+ getcomputedstyle: Feature;
+ 'inline-block': {
+ display: string;
+ };
+ 'intrinsic-width': {
+ width: string[];
+ 'min-width': string[];
+ 'max-width': string[];
+ height: string[];
+ 'min-height': string[];
+ 'max-height': string[];
+ };
+ 'justify-content-space-evenly': Feature;
+ 'kerning-pairs-ligatures': {
+ 'text-rendering': string;
+ };
+ 'mdn-css-unicode-bidi-isolate': {
+ 'unicode-bidi': string;
+ };
+ 'mdn-css-unicode-bidi-isolate-override': {
+ 'unicode-bidi': string;
+ };
+ 'mdn-css-unicode-bidi-plaintext': {
+ 'unicode-bidi': string;
+ };
+ 'mdn-text-decoration-color': {
+ 'text-decoration-color': boolean;
+ };
+ 'mdn-text-decoration-line': {
+ 'text-decoration-line': boolean;
+ };
+ 'mdn-text-decoration-shorthand': {
+ 'text-decoration': boolean;
+ };
+ 'mdn-text-decoration-style': {
+ 'text-decoration-style': boolean;
+ };
+ minmaxwh: {
+ 'min-width': boolean;
+ 'max-width': boolean;
+ 'min-height': boolean;
+ 'max-height': boolean;
+ };
+ multibackgrounds: (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+ multicolumn: {
+ columns: boolean;
+ 'column-width': boolean;
+ 'column-gap': boolean;
+ 'column-rule': boolean;
+ 'column-rule-color': boolean;
+ 'column-rule-width': boolean;
+ 'column-count': boolean;
+ 'column-rule-style': boolean;
+ 'column-span': boolean;
+ 'column-fill': boolean;
+ 'break-before': boolean;
+ 'break-after': boolean;
+ 'break-inside': boolean;
+ };
+ 'object-fit': {
+ 'object-fit': boolean;
+ 'object-position': boolean;
+ };
+ outline: {
+ outline: boolean;
+ 'outline-style': boolean;
+ 'outline-width': boolean;
+ 'outline-color': boolean;
+ };
+ pointer: {
+ 'touch-action': boolean;
+ };
+ 'pointer-events': {
+ 'pointer-events': boolean;
+ };
+ 'prefers-color-scheme': Feature;
+ 'prefers-reduced-motion': Feature;
+ rem: (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+ 'run-in': Feature;
+ 'style-scoped': Feature;
+ 'svg-css': Feature;
+ 'text-decoration': {
+ 'text-decoration-style': boolean;
+ 'text-decoration-line': boolean;
+ 'text-decoration-color': boolean;
+ 'text-decoration': RegExp;
+ 'text-decoration-thickness': boolean;
+ 'text-decoration-skip': boolean;
+ 'text-decoration-skip-ink': boolean;
+ };
+ 'text-emphasis': Feature;
+ 'text-overflow': {
+ 'text-overflow': boolean;
+ };
+ 'text-size-adjust': {
+ 'text-size-adjust': boolean;
+ };
+ 'text-stroke': Feature;
+ transforms2d: {
+ transform: boolean;
+ 'transform-origin': boolean;
+ };
+ transforms3d: {
+ perspective: boolean;
+ 'perspective-origin': boolean;
+ 'transform-style': boolean;
+ 'backface-visibility': boolean;
+ transform: string;
+ };
+ ttf: Feature;
+ 'user-select-none': {
+ 'user-select': boolean;
+ };
+ 'variable-fonts': Feature;
+ 'viewport-unit-variants': Feature;
+ 'viewport-units': {
+ '': string[];
+ };
+ 'webkit-user-drag': Feature;
+ 'will-change': {
+ 'will-change': boolean;
+ };
+ 'word-break': {
+ 'word-break': boolean;
+ };
+ wordwrap: {
+ 'overflow-wrap': boolean;
+ 'word-wrap': boolean;
+ };
+};
diff --git a/node_modules/doiuse/types/data/features/alternate-stylesheet.d.ts b/node_modules/doiuse/types/data/features/alternate-stylesheet.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/alternate-stylesheet.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/background-attachment.d.ts b/node_modules/doiuse/types/data/features/background-attachment.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/background-attachment.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/background-clip-text.d.ts b/node_modules/doiuse/types/data/features/background-clip-text.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/background-clip-text.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/background-img-opts.d.ts b/node_modules/doiuse/types/data/features/background-img-opts.d.ts
new file mode 100644
index 00000000..78c1aefe
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/background-img-opts.d.ts
@@ -0,0 +1,6 @@
+declare const _default: {
+ 'background-clip': boolean;
+ 'background-origin': boolean;
+ 'background-size': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/background-position-x-y.d.ts b/node_modules/doiuse/types/data/features/background-position-x-y.d.ts
new file mode 100644
index 00000000..a6c9a187
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/background-position-x-y.d.ts
@@ -0,0 +1,5 @@
+declare const _default: {
+ 'background-position-x': boolean;
+ 'background-position-y': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/background-repeat-round-space.d.ts b/node_modules/doiuse/types/data/features/background-repeat-round-space.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/background-repeat-round-space.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/border-image.d.ts b/node_modules/doiuse/types/data/features/border-image.d.ts
new file mode 100644
index 00000000..5ea36f26
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/border-image.d.ts
@@ -0,0 +1,9 @@
+declare const _default: {
+ 'border-image': boolean;
+ 'border-image-outset': boolean;
+ 'border-image-repeat': boolean;
+ 'border-image-slice': boolean;
+ 'border-image-source': boolean;
+ 'border-image-width': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/border-radius.d.ts b/node_modules/doiuse/types/data/features/border-radius.d.ts
new file mode 100644
index 00000000..42a5f870
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/border-radius.d.ts
@@ -0,0 +1,8 @@
+declare const _default: {
+ 'border-radius': boolean;
+ 'border-top-left-radius': boolean;
+ 'border-top-right-radius': boolean;
+ 'border-bottom-right-radius': boolean;
+ 'border-bottom-left-radius': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/calc.d.ts b/node_modules/doiuse/types/data/features/calc.d.ts
new file mode 100644
index 00000000..e9abdf25
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/calc.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ '': string;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/ch-unit.d.ts b/node_modules/doiuse/types/data/features/ch-unit.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/ch-unit.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-all.d.ts b/node_modules/doiuse/types/data/features/css-all.d.ts
new file mode 100644
index 00000000..9d932f8c
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-all.d.ts
@@ -0,0 +1,4 @@
+declare namespace _default {
+ let all: boolean;
+}
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-animation.d.ts b/node_modules/doiuse/types/data/features/css-animation.d.ts
new file mode 100644
index 00000000..00d5a94f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-animation.d.ts
@@ -0,0 +1,12 @@
+declare const _default: {
+ animation: boolean;
+ 'animation-name': boolean;
+ 'animation-duration': boolean;
+ 'animation-timing-function': boolean;
+ 'animation-iteration-count': boolean;
+ 'animation-direction': boolean;
+ 'animation-play-state': boolean;
+ 'animation-delay': boolean;
+ 'animation-fill-mode': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-any-link.d.ts b/node_modules/doiuse/types/data/features/css-any-link.d.ts
new file mode 100644
index 00000000..5f226387
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-any-link.d.ts
@@ -0,0 +1,2 @@
+declare const _default: (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-appearance.d.ts b/node_modules/doiuse/types/data/features/css-appearance.d.ts
new file mode 100644
index 00000000..5306895c
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-appearance.d.ts
@@ -0,0 +1,6 @@
+declare const _default: {
+ appearance: boolean;
+ '-webkit-appearance': boolean;
+ '-moz-appearance': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-at-counter-style.d.ts b/node_modules/doiuse/types/data/features/css-at-counter-style.d.ts
new file mode 100644
index 00000000..5f226387
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-at-counter-style.d.ts
@@ -0,0 +1,2 @@
+declare const _default: (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-autofill.d.ts b/node_modules/doiuse/types/data/features/css-autofill.d.ts
new file mode 100644
index 00000000..5f226387
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-autofill.d.ts
@@ -0,0 +1,2 @@
+declare const _default: (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-backdrop-filter.d.ts b/node_modules/doiuse/types/data/features/css-backdrop-filter.d.ts
new file mode 100644
index 00000000..7b11086f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-backdrop-filter.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'backdrop-filter': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-background-offsets.d.ts b/node_modules/doiuse/types/data/features/css-background-offsets.d.ts
new file mode 100644
index 00000000..2dbf6838
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-background-offsets.d.ts
@@ -0,0 +1,2 @@
+declare function _default(rule: import('postcss').ChildNode): boolean;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-backgroundblendmode.d.ts b/node_modules/doiuse/types/data/features/css-backgroundblendmode.d.ts
new file mode 100644
index 00000000..0b1cfffb
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-backgroundblendmode.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'background-blend-mode': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-boxdecorationbreak.d.ts b/node_modules/doiuse/types/data/features/css-boxdecorationbreak.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-boxdecorationbreak.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-boxshadow.d.ts b/node_modules/doiuse/types/data/features/css-boxshadow.d.ts
new file mode 100644
index 00000000..42eee3a6
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-boxshadow.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'box-shadow': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-canvas.d.ts b/node_modules/doiuse/types/data/features/css-canvas.d.ts
new file mode 100644
index 00000000..2dbf6838
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-canvas.d.ts
@@ -0,0 +1,2 @@
+declare function _default(rule: import('postcss').ChildNode): boolean;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-caret-color.d.ts b/node_modules/doiuse/types/data/features/css-caret-color.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-caret-color.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-cascade-layers.d.ts b/node_modules/doiuse/types/data/features/css-cascade-layers.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-cascade-layers.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-case-insensitive.d.ts b/node_modules/doiuse/types/data/features/css-case-insensitive.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-case-insensitive.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-clip-path.d.ts b/node_modules/doiuse/types/data/features/css-clip-path.d.ts
new file mode 100644
index 00000000..4d709c81
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-clip-path.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'clip-path': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-color-adjust.d.ts b/node_modules/doiuse/types/data/features/css-color-adjust.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-color-adjust.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-color-function.d.ts b/node_modules/doiuse/types/data/features/css-color-function.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-color-function.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-conic-gradients.d.ts b/node_modules/doiuse/types/data/features/css-conic-gradients.d.ts
new file mode 100644
index 00000000..0f7d08ee
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-conic-gradients.d.ts
@@ -0,0 +1,11 @@
+declare const _default: {
+ background: RegExp;
+ 'background-image': RegExp;
+ 'border-image': RegExp;
+ 'border-image-source': RegExp;
+ content: RegExp;
+ cursor: RegExp;
+ 'list-style': RegExp;
+ 'list-style-image': RegExp;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-container-queries-style.d.ts b/node_modules/doiuse/types/data/features/css-container-queries-style.d.ts
new file mode 100644
index 00000000..5f226387
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-container-queries-style.d.ts
@@ -0,0 +1,2 @@
+declare const _default: (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-container-queries.d.ts b/node_modules/doiuse/types/data/features/css-container-queries.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-container-queries.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-container-query-units.d.ts b/node_modules/doiuse/types/data/features/css-container-query-units.d.ts
new file mode 100644
index 00000000..5f226387
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-container-query-units.d.ts
@@ -0,0 +1,2 @@
+declare const _default: (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-containment.d.ts b/node_modules/doiuse/types/data/features/css-containment.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-containment.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-content-visibility.d.ts b/node_modules/doiuse/types/data/features/css-content-visibility.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-content-visibility.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-counters.d.ts b/node_modules/doiuse/types/data/features/css-counters.d.ts
new file mode 100644
index 00000000..15591bb6
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-counters.d.ts
@@ -0,0 +1,6 @@
+declare const _default: {
+ 'counter-reset': boolean;
+ 'counter-increment': boolean;
+ '': string;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-crisp-edges.d.ts b/node_modules/doiuse/types/data/features/css-crisp-edges.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-crisp-edges.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-cross-fade.d.ts b/node_modules/doiuse/types/data/features/css-cross-fade.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-cross-fade.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-default-pseudo.d.ts b/node_modules/doiuse/types/data/features/css-default-pseudo.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-default-pseudo.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-descendant-gtgt.d.ts b/node_modules/doiuse/types/data/features/css-descendant-gtgt.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-descendant-gtgt.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-deviceadaptation.d.ts b/node_modules/doiuse/types/data/features/css-deviceadaptation.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-deviceadaptation.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-dir-pseudo.d.ts b/node_modules/doiuse/types/data/features/css-dir-pseudo.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-dir-pseudo.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-display-contents.d.ts b/node_modules/doiuse/types/data/features/css-display-contents.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-display-contents.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-element-function.d.ts b/node_modules/doiuse/types/data/features/css-element-function.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-element-function.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-env-function.d.ts b/node_modules/doiuse/types/data/features/css-env-function.d.ts
new file mode 100644
index 00000000..e9abdf25
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-env-function.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ '': string;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-exclusions.d.ts b/node_modules/doiuse/types/data/features/css-exclusions.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-exclusions.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-featurequeries.d.ts b/node_modules/doiuse/types/data/features/css-featurequeries.d.ts
new file mode 100644
index 00000000..5f226387
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-featurequeries.d.ts
@@ -0,0 +1,2 @@
+declare const _default: (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-file-selector-button.d.ts b/node_modules/doiuse/types/data/features/css-file-selector-button.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-file-selector-button.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-filter-function.d.ts b/node_modules/doiuse/types/data/features/css-filter-function.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-filter-function.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-filters.d.ts b/node_modules/doiuse/types/data/features/css-filters.d.ts
new file mode 100644
index 00000000..7d91e054
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-filters.d.ts
@@ -0,0 +1,4 @@
+declare namespace _default {
+ let filter: boolean;
+}
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-first-letter.d.ts b/node_modules/doiuse/types/data/features/css-first-letter.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-first-letter.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-first-line.d.ts b/node_modules/doiuse/types/data/features/css-first-line.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-first-line.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-fixed.d.ts b/node_modules/doiuse/types/data/features/css-fixed.d.ts
new file mode 100644
index 00000000..48be0197
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-fixed.d.ts
@@ -0,0 +1,4 @@
+declare namespace _default {
+ let position: string;
+}
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-focus-visible.d.ts b/node_modules/doiuse/types/data/features/css-focus-visible.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-focus-visible.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-focus-within.d.ts b/node_modules/doiuse/types/data/features/css-focus-within.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-focus-within.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-font-palette.d.ts b/node_modules/doiuse/types/data/features/css-font-palette.d.ts
new file mode 100644
index 00000000..2e9f0c70
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-font-palette.d.ts
@@ -0,0 +1,2 @@
+declare const _default: ((rule: any) => any)[];
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-font-rendering-controls.d.ts b/node_modules/doiuse/types/data/features/css-font-rendering-controls.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-font-rendering-controls.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-font-stretch.d.ts b/node_modules/doiuse/types/data/features/css-font-stretch.d.ts
new file mode 100644
index 00000000..e5d73f80
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-font-stretch.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'font-stretch': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-gencontent.d.ts b/node_modules/doiuse/types/data/features/css-gencontent.d.ts
new file mode 100644
index 00000000..5f226387
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-gencontent.d.ts
@@ -0,0 +1,2 @@
+declare const _default: (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-gradients.d.ts b/node_modules/doiuse/types/data/features/css-gradients.d.ts
new file mode 100644
index 00000000..0f7d08ee
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-gradients.d.ts
@@ -0,0 +1,11 @@
+declare const _default: {
+ background: RegExp;
+ 'background-image': RegExp;
+ 'border-image': RegExp;
+ 'border-image-source': RegExp;
+ content: RegExp;
+ cursor: RegExp;
+ 'list-style': RegExp;
+ 'list-style-image': RegExp;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-grid-animation.d.ts b/node_modules/doiuse/types/data/features/css-grid-animation.d.ts
new file mode 100644
index 00000000..7b363681
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-grid-animation.d.ts
@@ -0,0 +1,5 @@
+declare const _default: {
+ transition: RegExp;
+ 'transition-property': RegExp;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-grid.d.ts b/node_modules/doiuse/types/data/features/css-grid.d.ts
new file mode 100644
index 00000000..0239676e
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-grid.d.ts
@@ -0,0 +1,19 @@
+declare const _default: {
+ display: string[];
+ grid: boolean;
+ 'grid-area': boolean;
+ 'grid-auto-columns': boolean;
+ 'grid-auto-flow': boolean;
+ 'grid-auto-rows': boolean;
+ 'grid-column': boolean;
+ 'grid-column-end': boolean;
+ 'grid-column-start': boolean;
+ 'grid-row': boolean;
+ 'grid-row-end': boolean;
+ 'grid-row-start': boolean;
+ 'grid-template': boolean;
+ 'grid-template-areas': boolean;
+ 'grid-template-columns': boolean;
+ 'grid-template-rows': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-hanging-punctuation.d.ts b/node_modules/doiuse/types/data/features/css-hanging-punctuation.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-hanging-punctuation.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-has.d.ts b/node_modules/doiuse/types/data/features/css-has.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-has.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-hyphens.d.ts b/node_modules/doiuse/types/data/features/css-hyphens.d.ts
new file mode 100644
index 00000000..daa4d458
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-hyphens.d.ts
@@ -0,0 +1,4 @@
+declare namespace _default {
+ let hyphens: boolean;
+}
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-image-orientation.d.ts b/node_modules/doiuse/types/data/features/css-image-orientation.d.ts
new file mode 100644
index 00000000..e0cd313f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-image-orientation.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'image-orientation': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-image-set.d.ts b/node_modules/doiuse/types/data/features/css-image-set.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-image-set.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-in-out-of-range.d.ts b/node_modules/doiuse/types/data/features/css-in-out-of-range.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-in-out-of-range.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-indeterminate-pseudo.d.ts b/node_modules/doiuse/types/data/features/css-indeterminate-pseudo.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-indeterminate-pseudo.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-initial-letter.d.ts b/node_modules/doiuse/types/data/features/css-initial-letter.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-initial-letter.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-initial-value.d.ts b/node_modules/doiuse/types/data/features/css-initial-value.d.ts
new file mode 100644
index 00000000..e9abdf25
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-initial-value.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ '': string;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-lch-lab.d.ts b/node_modules/doiuse/types/data/features/css-lch-lab.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-lch-lab.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-letter-spacing.d.ts b/node_modules/doiuse/types/data/features/css-letter-spacing.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-letter-spacing.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-line-clamp.d.ts b/node_modules/doiuse/types/data/features/css-line-clamp.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-line-clamp.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-logical-props.d.ts b/node_modules/doiuse/types/data/features/css-logical-props.d.ts
new file mode 100644
index 00000000..f214d4c1
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-logical-props.d.ts
@@ -0,0 +1,61 @@
+declare const _default: {
+ 'block-size': boolean;
+ 'inline-size': boolean;
+ 'min-block-size': boolean;
+ 'min-inline-size': boolean;
+ 'max-block-size': boolean;
+ 'max-inline-size': boolean;
+ 'margin-block-start': boolean;
+ 'margin-block-end': boolean;
+ 'margin-inline-start': boolean;
+ 'margin-inline-end': boolean;
+ 'margin-block': boolean;
+ 'margin-inline': boolean;
+ 'inset-block-start': boolean;
+ 'inset-block-end': boolean;
+ 'inset-inline-start': boolean;
+ 'inset-inline-end': boolean;
+ 'inset-block': boolean;
+ 'inset-inline': boolean;
+ inset: boolean;
+ 'padding-block-start': boolean;
+ 'padding-block-end': boolean;
+ 'padding-inline-start': boolean;
+ 'padding-inline-end': boolean;
+ 'padding-block': boolean;
+ 'padding-inline': boolean;
+ 'border-block-start-width': boolean;
+ 'border-block-end-width': boolean;
+ 'border-inline-start-width': boolean;
+ 'border-inline-end-width': boolean;
+ 'border-block-width': boolean;
+ 'border-inline-width': boolean;
+ 'border-block-start-style': boolean;
+ 'border-block-end-style': boolean;
+ 'border-inline-start-style': boolean;
+ 'border-inline-end-style': boolean;
+ 'border-block-style': boolean;
+ 'border-inline-style': boolean;
+ 'border-block-start-color': boolean;
+ 'border-block-end-color': boolean;
+ 'border-inline-start-color': boolean;
+ 'border-inline-end-color': boolean;
+ 'border-block-color': boolean;
+ 'border-inline-color': boolean;
+ 'border-block-start': boolean;
+ 'border-block-end': boolean;
+ 'border-inline-start': boolean;
+ 'border-inline-end': boolean;
+ 'border-block': boolean;
+ 'border-inline': boolean;
+ 'border-start-start-radius': boolean;
+ 'border-start-end-radius': boolean;
+ 'border-end-start-radius': boolean;
+ 'border-end-end-radius': boolean;
+ 'text-align': string[];
+ float: string[];
+ resize: string[];
+ 'overflow-block': boolean;
+ 'overflow-inline': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-marker-pseudo.d.ts b/node_modules/doiuse/types/data/features/css-marker-pseudo.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-marker-pseudo.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-masks.d.ts b/node_modules/doiuse/types/data/features/css-masks.d.ts
new file mode 100644
index 00000000..4e8cb234
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-masks.d.ts
@@ -0,0 +1,39 @@
+declare const _default: {
+ 'clip-path': boolean;
+ mask: boolean;
+ 'mask-border': boolean;
+ 'mask-border-mode': boolean;
+ 'mask-border-outset': boolean;
+ 'mask-border-repeat': boolean;
+ 'mask-border-slice': boolean;
+ 'mask-border-source': boolean;
+ 'mask-border-width': boolean;
+ 'mask-clip': boolean;
+ 'mask-composite': boolean;
+ 'mask-image': boolean;
+ 'mask-mode': boolean;
+ 'mask-origin': boolean;
+ 'mask-position': boolean;
+ 'mask-repeat': boolean;
+ 'mask-size': boolean;
+ 'mask-type': boolean;
+ '-webkit-clip-path': boolean;
+ '-webkit-mask': boolean;
+ '-webkit-mask-border': boolean;
+ '-webkit-mask-border-mode': boolean;
+ '-webkit-mask-border-outset': boolean;
+ '-webkit-mask-border-repeat': boolean;
+ '-webkit-mask-border-slice': boolean;
+ '-webkit-mask-border-source': boolean;
+ '-webkit-mask-border-width': boolean;
+ '-webkit-mask-clip': boolean;
+ '-webkit-mask-composite': boolean;
+ '-webkit-mask-image': boolean;
+ '-webkit-mask-mode': boolean;
+ '-webkit-mask-origin': boolean;
+ '-webkit-mask-position': boolean;
+ '-webkit-mask-repeat': boolean;
+ '-webkit-mask-size': boolean;
+ '-webkit-mask-type': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-matches-pseudo.d.ts b/node_modules/doiuse/types/data/features/css-matches-pseudo.d.ts
new file mode 100644
index 00000000..5f226387
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-matches-pseudo.d.ts
@@ -0,0 +1,2 @@
+declare const _default: (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-math-functions.d.ts b/node_modules/doiuse/types/data/features/css-math-functions.d.ts
new file mode 100644
index 00000000..de2aca6e
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-math-functions.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ '': string[];
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-media-interaction.d.ts b/node_modules/doiuse/types/data/features/css-media-interaction.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-media-interaction.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-media-range-syntax.d.ts b/node_modules/doiuse/types/data/features/css-media-range-syntax.d.ts
new file mode 100644
index 00000000..5f226387
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-media-range-syntax.d.ts
@@ -0,0 +1,2 @@
+declare const _default: (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-media-resolution.d.ts b/node_modules/doiuse/types/data/features/css-media-resolution.d.ts
new file mode 100644
index 00000000..5f226387
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-media-resolution.d.ts
@@ -0,0 +1,2 @@
+declare const _default: (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-media-scripting.d.ts b/node_modules/doiuse/types/data/features/css-media-scripting.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-media-scripting.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-mediaqueries.d.ts b/node_modules/doiuse/types/data/features/css-mediaqueries.d.ts
new file mode 100644
index 00000000..5f226387
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-mediaqueries.d.ts
@@ -0,0 +1,2 @@
+declare const _default: (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-mixblendmode.d.ts b/node_modules/doiuse/types/data/features/css-mixblendmode.d.ts
new file mode 100644
index 00000000..7c651984
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-mixblendmode.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'mix-blend-mode': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-motion-paths.d.ts b/node_modules/doiuse/types/data/features/css-motion-paths.d.ts
new file mode 100644
index 00000000..668aad63
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-motion-paths.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'offset-path': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-namespaces.d.ts b/node_modules/doiuse/types/data/features/css-namespaces.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-namespaces.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-nesting.d.ts b/node_modules/doiuse/types/data/features/css-nesting.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-nesting.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-not-sel-list.d.ts b/node_modules/doiuse/types/data/features/css-not-sel-list.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-not-sel-list.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-nth-child-of.d.ts b/node_modules/doiuse/types/data/features/css-nth-child-of.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-nth-child-of.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-opacity.d.ts b/node_modules/doiuse/types/data/features/css-opacity.d.ts
new file mode 100644
index 00000000..503169ee
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-opacity.d.ts
@@ -0,0 +1,4 @@
+declare namespace _default {
+ let opacity: boolean;
+}
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-optional-pseudo.d.ts b/node_modules/doiuse/types/data/features/css-optional-pseudo.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-optional-pseudo.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-overflow-anchor.d.ts b/node_modules/doiuse/types/data/features/css-overflow-anchor.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-overflow-anchor.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-overflow-overlay.d.ts b/node_modules/doiuse/types/data/features/css-overflow-overlay.d.ts
new file mode 100644
index 00000000..b3f11e17
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-overflow-overlay.d.ts
@@ -0,0 +1,4 @@
+declare namespace _default {
+ let overflow: string;
+}
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-overflow.d.ts b/node_modules/doiuse/types/data/features/css-overflow.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-overflow.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-overscroll-behavior.d.ts b/node_modules/doiuse/types/data/features/css-overscroll-behavior.d.ts
new file mode 100644
index 00000000..fc0a2dce
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-overscroll-behavior.d.ts
@@ -0,0 +1,6 @@
+declare const _default: {
+ 'overscroll-behavior': boolean;
+ 'overscroll-behavior-x': boolean;
+ 'overscroll-behavior-y': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-page-break.d.ts b/node_modules/doiuse/types/data/features/css-page-break.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-page-break.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-paged-media.d.ts b/node_modules/doiuse/types/data/features/css-paged-media.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-paged-media.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-paint-api.d.ts b/node_modules/doiuse/types/data/features/css-paint-api.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-paint-api.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-placeholder-shown.d.ts b/node_modules/doiuse/types/data/features/css-placeholder-shown.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-placeholder-shown.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-placeholder.d.ts b/node_modules/doiuse/types/data/features/css-placeholder.d.ts
new file mode 100644
index 00000000..ead1e0f0
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-placeholder.d.ts
@@ -0,0 +1,2 @@
+declare const _default: ((rule: import("postcss/lib/node.js").ChildNode) => boolean)[];
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-print-color-adjust.d.ts b/node_modules/doiuse/types/data/features/css-print-color-adjust.d.ts
new file mode 100644
index 00000000..69a15267
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-print-color-adjust.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'print-color-adjust': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-read-only-write.d.ts b/node_modules/doiuse/types/data/features/css-read-only-write.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-read-only-write.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-rebeccapurple.d.ts b/node_modules/doiuse/types/data/features/css-rebeccapurple.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-rebeccapurple.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-reflections.d.ts b/node_modules/doiuse/types/data/features/css-reflections.d.ts
new file mode 100644
index 00000000..20d0b51a
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-reflections.d.ts
@@ -0,0 +1,5 @@
+declare const _default: {
+ 'box-reflect': boolean;
+ '-webkit-box-reflect': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-regions.d.ts b/node_modules/doiuse/types/data/features/css-regions.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-regions.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-relative-colors.d.ts b/node_modules/doiuse/types/data/features/css-relative-colors.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-relative-colors.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-repeating-gradients.d.ts b/node_modules/doiuse/types/data/features/css-repeating-gradients.d.ts
new file mode 100644
index 00000000..de2aca6e
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-repeating-gradients.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ '': string[];
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-resize.d.ts b/node_modules/doiuse/types/data/features/css-resize.d.ts
new file mode 100644
index 00000000..f30fce5a
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-resize.d.ts
@@ -0,0 +1,4 @@
+declare namespace _default {
+ let resize: boolean;
+}
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-revert-value.d.ts b/node_modules/doiuse/types/data/features/css-revert-value.d.ts
new file mode 100644
index 00000000..e9abdf25
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-revert-value.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ '': string;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-rrggbbaa.d.ts b/node_modules/doiuse/types/data/features/css-rrggbbaa.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-rrggbbaa.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-scroll-behavior.d.ts b/node_modules/doiuse/types/data/features/css-scroll-behavior.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-scroll-behavior.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-scroll-timeline.d.ts b/node_modules/doiuse/types/data/features/css-scroll-timeline.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-scroll-timeline.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-scrollbar.d.ts b/node_modules/doiuse/types/data/features/css-scrollbar.d.ts
new file mode 100644
index 00000000..d4c79319
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-scrollbar.d.ts
@@ -0,0 +1,5 @@
+declare const _default: {
+ 'scrollbar-color': boolean;
+ 'scrollbar-width': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-sel2.d.ts b/node_modules/doiuse/types/data/features/css-sel2.d.ts
new file mode 100644
index 00000000..ff916920
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-sel2.d.ts
@@ -0,0 +1,9 @@
+export namespace REGEXES {
+ let HAS_ATTRIBUTE: RegExp;
+ let MATCH_ATTRIBUTE: RegExp;
+ let WORD_ATTRIBUTE: RegExp;
+ let SUBCODE_ATTRIBUTE: RegExp;
+ let BRACKET_PARENS: RegExp;
+}
+declare const _default: (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-sel3.d.ts b/node_modules/doiuse/types/data/features/css-sel3.d.ts
new file mode 100644
index 00000000..cfd74e8d
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-sel3.d.ts
@@ -0,0 +1,8 @@
+export namespace REGEXES {
+ let SIBLING_SELECTOR: RegExp;
+ let STARTSWITH_ATTRIBUTE: RegExp;
+ let ENDSWITH_ATTRIBUTE: RegExp;
+ let INSENSITIVE_ATTRIBUTE: RegExp;
+}
+declare const _default: (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-selection.d.ts b/node_modules/doiuse/types/data/features/css-selection.d.ts
new file mode 100644
index 00000000..5f226387
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-selection.d.ts
@@ -0,0 +1,2 @@
+declare const _default: (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-shapes.d.ts b/node_modules/doiuse/types/data/features/css-shapes.d.ts
new file mode 100644
index 00000000..17233b47
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-shapes.d.ts
@@ -0,0 +1,6 @@
+declare const _default: {
+ 'shape-outside': boolean;
+ 'shape-image-threshold': boolean;
+ 'shape-margin': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-snappoints.d.ts b/node_modules/doiuse/types/data/features/css-snappoints.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-snappoints.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-sticky.d.ts b/node_modules/doiuse/types/data/features/css-sticky.d.ts
new file mode 100644
index 00000000..48be0197
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-sticky.d.ts
@@ -0,0 +1,4 @@
+declare namespace _default {
+ let position: string;
+}
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-subgrid.d.ts b/node_modules/doiuse/types/data/features/css-subgrid.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-subgrid.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-supports-api.d.ts b/node_modules/doiuse/types/data/features/css-supports-api.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-supports-api.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-table.d.ts b/node_modules/doiuse/types/data/features/css-table.d.ts
new file mode 100644
index 00000000..8ee6ac9c
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-table.d.ts
@@ -0,0 +1,4 @@
+declare namespace _default {
+ let display: string[];
+}
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-text-align-last.d.ts b/node_modules/doiuse/types/data/features/css-text-align-last.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-text-align-last.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-text-box-trim.d.ts b/node_modules/doiuse/types/data/features/css-text-box-trim.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-text-box-trim.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-text-indent.d.ts b/node_modules/doiuse/types/data/features/css-text-indent.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-text-indent.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-text-justify.d.ts b/node_modules/doiuse/types/data/features/css-text-justify.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-text-justify.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-text-orientation.d.ts b/node_modules/doiuse/types/data/features/css-text-orientation.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-text-orientation.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-text-spacing.d.ts b/node_modules/doiuse/types/data/features/css-text-spacing.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-text-spacing.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-textshadow.d.ts b/node_modules/doiuse/types/data/features/css-textshadow.d.ts
new file mode 100644
index 00000000..f1647e7c
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-textshadow.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'text-shadow': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-touch-action.d.ts b/node_modules/doiuse/types/data/features/css-touch-action.d.ts
new file mode 100644
index 00000000..41e36c8a
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-touch-action.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'touch-action': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-transitions.d.ts b/node_modules/doiuse/types/data/features/css-transitions.d.ts
new file mode 100644
index 00000000..b2b373e7
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-transitions.d.ts
@@ -0,0 +1,8 @@
+declare const _default: {
+ transition: boolean;
+ 'transition-property': boolean;
+ 'transition-duration': boolean;
+ 'transition-delay': boolean;
+ 'transition-timing-function': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-unicode-bidi.d.ts b/node_modules/doiuse/types/data/features/css-unicode-bidi.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-unicode-bidi.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-unset-value.d.ts b/node_modules/doiuse/types/data/features/css-unset-value.d.ts
new file mode 100644
index 00000000..e9abdf25
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-unset-value.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ '': string;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-variables.d.ts b/node_modules/doiuse/types/data/features/css-variables.d.ts
new file mode 100644
index 00000000..2dbf6838
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-variables.d.ts
@@ -0,0 +1,2 @@
+declare function _default(rule: import('postcss').ChildNode): boolean;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-when-else.d.ts b/node_modules/doiuse/types/data/features/css-when-else.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-when-else.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-widows-orphans.d.ts b/node_modules/doiuse/types/data/features/css-widows-orphans.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-widows-orphans.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-width-stretch.d.ts b/node_modules/doiuse/types/data/features/css-width-stretch.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-width-stretch.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-writing-mode.d.ts b/node_modules/doiuse/types/data/features/css-writing-mode.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-writing-mode.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css-zoom.d.ts b/node_modules/doiuse/types/data/features/css-zoom.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css-zoom.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css3-attr.d.ts b/node_modules/doiuse/types/data/features/css3-attr.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css3-attr.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css3-boxsizing.d.ts b/node_modules/doiuse/types/data/features/css3-boxsizing.d.ts
new file mode 100644
index 00000000..2f6e597c
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css3-boxsizing.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'box-sizing': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css3-colors.d.ts b/node_modules/doiuse/types/data/features/css3-colors.d.ts
new file mode 100644
index 00000000..de2aca6e
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css3-colors.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ '': string[];
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css3-cursors-grab.d.ts b/node_modules/doiuse/types/data/features/css3-cursors-grab.d.ts
new file mode 100644
index 00000000..8cea8157
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css3-cursors-grab.d.ts
@@ -0,0 +1,4 @@
+declare namespace _default {
+ let cursor: string[];
+}
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css3-cursors-newer.d.ts b/node_modules/doiuse/types/data/features/css3-cursors-newer.d.ts
new file mode 100644
index 00000000..8cea8157
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css3-cursors-newer.d.ts
@@ -0,0 +1,4 @@
+declare namespace _default {
+ let cursor: string[];
+}
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css3-cursors.d.ts b/node_modules/doiuse/types/data/features/css3-cursors.d.ts
new file mode 100644
index 00000000..8cea8157
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css3-cursors.d.ts
@@ -0,0 +1,4 @@
+declare namespace _default {
+ let cursor: string[];
+}
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/css3-tabsize.d.ts b/node_modules/doiuse/types/data/features/css3-tabsize.d.ts
new file mode 100644
index 00000000..8c68b4f7
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/css3-tabsize.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'tab-size': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/currentcolor.d.ts b/node_modules/doiuse/types/data/features/currentcolor.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/currentcolor.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/devicepixelratio.d.ts b/node_modules/doiuse/types/data/features/devicepixelratio.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/devicepixelratio.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/extended-system-fonts.d.ts b/node_modules/doiuse/types/data/features/extended-system-fonts.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/extended-system-fonts.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/flexbox-gap.d.ts b/node_modules/doiuse/types/data/features/flexbox-gap.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/flexbox-gap.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/flexbox.d.ts b/node_modules/doiuse/types/data/features/flexbox.d.ts
new file mode 100644
index 00000000..aee7362b
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/flexbox.d.ts
@@ -0,0 +1,11 @@
+declare const _default: {
+ display: string[];
+ flex: boolean;
+ 'flex-grow': boolean;
+ 'flex-shrink': boolean;
+ 'flex-basis': boolean;
+ 'flex-direction': boolean;
+ 'flex-wrap': boolean;
+ 'flex-flow': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/flow-root.d.ts b/node_modules/doiuse/types/data/features/flow-root.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/flow-root.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/font-family-system-ui.d.ts b/node_modules/doiuse/types/data/features/font-family-system-ui.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/font-family-system-ui.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/font-feature.d.ts b/node_modules/doiuse/types/data/features/font-feature.d.ts
new file mode 100644
index 00000000..cee8d3b2
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/font-feature.d.ts
@@ -0,0 +1,7 @@
+declare const _default: {
+ 'font-feature-settings': boolean;
+ 'font-variant-ligatures': boolean;
+ 'font-language-override': boolean;
+ 'font-kerning': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/font-kerning.d.ts b/node_modules/doiuse/types/data/features/font-kerning.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/font-kerning.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/font-loading.d.ts b/node_modules/doiuse/types/data/features/font-loading.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/font-loading.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/font-size-adjust.d.ts b/node_modules/doiuse/types/data/features/font-size-adjust.d.ts
new file mode 100644
index 00000000..d271aa3e
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/font-size-adjust.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'font-size-adjust': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/font-smooth.d.ts b/node_modules/doiuse/types/data/features/font-smooth.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/font-smooth.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/font-unicode-range.d.ts b/node_modules/doiuse/types/data/features/font-unicode-range.d.ts
new file mode 100644
index 00000000..b2de26b1
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/font-unicode-range.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'unicode-range': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/font-variant-alternates.d.ts b/node_modules/doiuse/types/data/features/font-variant-alternates.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/font-variant-alternates.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/font-variant-numeric.d.ts b/node_modules/doiuse/types/data/features/font-variant-numeric.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/font-variant-numeric.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/fontface.d.ts b/node_modules/doiuse/types/data/features/fontface.d.ts
new file mode 100644
index 00000000..ead1e0f0
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/fontface.d.ts
@@ -0,0 +1,2 @@
+declare const _default: ((rule: import("postcss/lib/node.js").ChildNode) => boolean)[];
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/fullscreen.d.ts b/node_modules/doiuse/types/data/features/fullscreen.d.ts
new file mode 100644
index 00000000..5f226387
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/fullscreen.d.ts
@@ -0,0 +1,2 @@
+declare const _default: (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/getcomputedstyle.d.ts b/node_modules/doiuse/types/data/features/getcomputedstyle.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/getcomputedstyle.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/inline-block.d.ts b/node_modules/doiuse/types/data/features/inline-block.d.ts
new file mode 100644
index 00000000..076ffde4
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/inline-block.d.ts
@@ -0,0 +1,4 @@
+declare namespace _default {
+ let display: string;
+}
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/intrinsic-width.d.ts b/node_modules/doiuse/types/data/features/intrinsic-width.d.ts
new file mode 100644
index 00000000..a19e9901
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/intrinsic-width.d.ts
@@ -0,0 +1,9 @@
+declare const _default: {
+ width: string[];
+ 'min-width': string[];
+ 'max-width': string[];
+ height: string[];
+ 'min-height': string[];
+ 'max-height': string[];
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/justify-content-space-evenly.d.ts b/node_modules/doiuse/types/data/features/justify-content-space-evenly.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/justify-content-space-evenly.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/kerning-pairs-ligatures.d.ts b/node_modules/doiuse/types/data/features/kerning-pairs-ligatures.d.ts
new file mode 100644
index 00000000..8ef9c98d
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/kerning-pairs-ligatures.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'text-rendering': string;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/mdn-css-unicode-bidi-isolate-override.d.ts b/node_modules/doiuse/types/data/features/mdn-css-unicode-bidi-isolate-override.d.ts
new file mode 100644
index 00000000..63183b7c
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/mdn-css-unicode-bidi-isolate-override.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'unicode-bidi': string;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/mdn-css-unicode-bidi-isolate.d.ts b/node_modules/doiuse/types/data/features/mdn-css-unicode-bidi-isolate.d.ts
new file mode 100644
index 00000000..63183b7c
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/mdn-css-unicode-bidi-isolate.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'unicode-bidi': string;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/mdn-css-unicode-bidi-plaintext.d.ts b/node_modules/doiuse/types/data/features/mdn-css-unicode-bidi-plaintext.d.ts
new file mode 100644
index 00000000..63183b7c
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/mdn-css-unicode-bidi-plaintext.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'unicode-bidi': string;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/mdn-text-decoration-color.d.ts b/node_modules/doiuse/types/data/features/mdn-text-decoration-color.d.ts
new file mode 100644
index 00000000..b795d459
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/mdn-text-decoration-color.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'text-decoration-color': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/mdn-text-decoration-line.d.ts b/node_modules/doiuse/types/data/features/mdn-text-decoration-line.d.ts
new file mode 100644
index 00000000..69fd574c
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/mdn-text-decoration-line.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'text-decoration-line': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/mdn-text-decoration-shorthand.d.ts b/node_modules/doiuse/types/data/features/mdn-text-decoration-shorthand.d.ts
new file mode 100644
index 00000000..a2ccf44f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/mdn-text-decoration-shorthand.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'text-decoration': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/mdn-text-decoration-style.d.ts b/node_modules/doiuse/types/data/features/mdn-text-decoration-style.d.ts
new file mode 100644
index 00000000..f715fd10
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/mdn-text-decoration-style.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'text-decoration-style': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/minmaxwh.d.ts b/node_modules/doiuse/types/data/features/minmaxwh.d.ts
new file mode 100644
index 00000000..758cc182
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/minmaxwh.d.ts
@@ -0,0 +1,7 @@
+declare const _default: {
+ 'min-width': boolean;
+ 'max-width': boolean;
+ 'min-height': boolean;
+ 'max-height': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/multibackgrounds.d.ts b/node_modules/doiuse/types/data/features/multibackgrounds.d.ts
new file mode 100644
index 00000000..2dbf6838
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/multibackgrounds.d.ts
@@ -0,0 +1,2 @@
+declare function _default(rule: import('postcss').ChildNode): boolean;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/multicolumn.d.ts b/node_modules/doiuse/types/data/features/multicolumn.d.ts
new file mode 100644
index 00000000..97aca34e
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/multicolumn.d.ts
@@ -0,0 +1,16 @@
+declare const _default: {
+ columns: boolean;
+ 'column-width': boolean;
+ 'column-gap': boolean;
+ 'column-rule': boolean;
+ 'column-rule-color': boolean;
+ 'column-rule-width': boolean;
+ 'column-count': boolean;
+ 'column-rule-style': boolean;
+ 'column-span': boolean;
+ 'column-fill': boolean;
+ 'break-before': boolean;
+ 'break-after': boolean;
+ 'break-inside': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/object-fit.d.ts b/node_modules/doiuse/types/data/features/object-fit.d.ts
new file mode 100644
index 00000000..54045cea
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/object-fit.d.ts
@@ -0,0 +1,5 @@
+declare const _default: {
+ 'object-fit': boolean;
+ 'object-position': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/outline.d.ts b/node_modules/doiuse/types/data/features/outline.d.ts
new file mode 100644
index 00000000..58053da8
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/outline.d.ts
@@ -0,0 +1,7 @@
+declare const _default: {
+ outline: boolean;
+ 'outline-style': boolean;
+ 'outline-width': boolean;
+ 'outline-color': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/pointer-events.d.ts b/node_modules/doiuse/types/data/features/pointer-events.d.ts
new file mode 100644
index 00000000..f8fecaf9
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/pointer-events.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'pointer-events': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/pointer.d.ts b/node_modules/doiuse/types/data/features/pointer.d.ts
new file mode 100644
index 00000000..41e36c8a
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/pointer.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'touch-action': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/prefers-color-scheme.d.ts b/node_modules/doiuse/types/data/features/prefers-color-scheme.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/prefers-color-scheme.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/prefers-reduced-motion.d.ts b/node_modules/doiuse/types/data/features/prefers-reduced-motion.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/prefers-reduced-motion.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/rem.d.ts b/node_modules/doiuse/types/data/features/rem.d.ts
new file mode 100644
index 00000000..5f226387
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/rem.d.ts
@@ -0,0 +1,2 @@
+declare const _default: (rule: import("postcss/lib/node.js").ChildNode) => boolean;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/run-in.d.ts b/node_modules/doiuse/types/data/features/run-in.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/run-in.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/style-scoped.d.ts b/node_modules/doiuse/types/data/features/style-scoped.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/style-scoped.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/svg-css.d.ts b/node_modules/doiuse/types/data/features/svg-css.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/svg-css.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/text-decoration.d.ts b/node_modules/doiuse/types/data/features/text-decoration.d.ts
new file mode 100644
index 00000000..9f64bd04
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/text-decoration.d.ts
@@ -0,0 +1,10 @@
+declare const _default: {
+ 'text-decoration-style': boolean;
+ 'text-decoration-line': boolean;
+ 'text-decoration-color': boolean;
+ 'text-decoration': RegExp;
+ 'text-decoration-thickness': boolean;
+ 'text-decoration-skip': boolean;
+ 'text-decoration-skip-ink': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/text-emphasis.d.ts b/node_modules/doiuse/types/data/features/text-emphasis.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/text-emphasis.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/text-overflow.d.ts b/node_modules/doiuse/types/data/features/text-overflow.d.ts
new file mode 100644
index 00000000..3d129e43
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/text-overflow.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'text-overflow': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/text-size-adjust.d.ts b/node_modules/doiuse/types/data/features/text-size-adjust.d.ts
new file mode 100644
index 00000000..51ca2e87
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/text-size-adjust.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'text-size-adjust': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/text-stroke.d.ts b/node_modules/doiuse/types/data/features/text-stroke.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/text-stroke.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/transforms2d.d.ts b/node_modules/doiuse/types/data/features/transforms2d.d.ts
new file mode 100644
index 00000000..f870ccec
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/transforms2d.d.ts
@@ -0,0 +1,5 @@
+declare const _default: {
+ transform: boolean;
+ 'transform-origin': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/transforms3d.d.ts b/node_modules/doiuse/types/data/features/transforms3d.d.ts
new file mode 100644
index 00000000..31f3a085
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/transforms3d.d.ts
@@ -0,0 +1,8 @@
+declare const _default: {
+ perspective: boolean;
+ 'perspective-origin': boolean;
+ 'transform-style': boolean;
+ 'backface-visibility': boolean;
+ transform: string;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/ttf.d.ts b/node_modules/doiuse/types/data/features/ttf.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/ttf.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/user-select-none.d.ts b/node_modules/doiuse/types/data/features/user-select-none.d.ts
new file mode 100644
index 00000000..bf7305af
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/user-select-none.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'user-select': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/variable-fonts.d.ts b/node_modules/doiuse/types/data/features/variable-fonts.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/variable-fonts.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/viewport-unit-variants.d.ts b/node_modules/doiuse/types/data/features/viewport-unit-variants.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/viewport-unit-variants.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/viewport-units.d.ts b/node_modules/doiuse/types/data/features/viewport-units.d.ts
new file mode 100644
index 00000000..de2aca6e
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/viewport-units.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ '': string[];
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/webkit-user-drag.d.ts b/node_modules/doiuse/types/data/features/webkit-user-drag.d.ts
new file mode 100644
index 00000000..ba3f665f
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/webkit-user-drag.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import('../features').Feature;
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/will-change.d.ts b/node_modules/doiuse/types/data/features/will-change.d.ts
new file mode 100644
index 00000000..7e1c986d
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/will-change.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'will-change': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/word-break.d.ts b/node_modules/doiuse/types/data/features/word-break.d.ts
new file mode 100644
index 00000000..5163a5e3
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/word-break.d.ts
@@ -0,0 +1,4 @@
+declare const _default: {
+ 'word-break': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/data/features/wordwrap.d.ts b/node_modules/doiuse/types/data/features/wordwrap.d.ts
new file mode 100644
index 00000000..e34cb3cc
--- /dev/null
+++ b/node_modules/doiuse/types/data/features/wordwrap.d.ts
@@ -0,0 +1,5 @@
+declare const _default: {
+ 'overflow-wrap': boolean;
+ 'word-wrap': boolean;
+};
+export default _default;
diff --git a/node_modules/doiuse/types/exports/index.d.ts b/node_modules/doiuse/types/exports/index.d.ts
new file mode 100644
index 00000000..33d2d468
--- /dev/null
+++ b/node_modules/doiuse/types/exports/index.d.ts
@@ -0,0 +1,6 @@
+/**
+ * @param {ConstructorParameters<typeof DoIUse>} options
+ * @return {DoIUse}
+ */
+export default function index(optionsOrBrowserQuery?: import("../lib/DoIUse.js").DoIUseOptions): DoIUse;
+import DoIUse from '../lib/DoIUse.js';
diff --git a/node_modules/doiuse/types/exports/stream.d.ts b/node_modules/doiuse/types/exports/stream.d.ts
new file mode 100644
index 00000000..acaa62d8
--- /dev/null
+++ b/node_modules/doiuse/types/exports/stream.d.ts
@@ -0,0 +1,10 @@
+/**
+ * @param {ConstructorParameters<typeof CssUsageDuplex>} options
+ * @return {CssUsageDuplex}
+ */
+export default function index(options: {
+ browsers: string;
+ ignore?: ("outline" | "background-attachment" | "pointer" | "flow-root" | "font-kerning" | "font-smooth" | "font-variant-alternates" | "font-variant-numeric" | "inline-block" | "prefers-color-scheme" | "prefers-reduced-motion" | "rem" | "run-in" | "text-emphasis" | "text-stroke" | "webkit-user-drag" | "border-image" | "border-radius" | "font-size-adjust" | "text-decoration" | "object-fit" | "pointer-events" | "text-overflow" | "text-size-adjust" | "will-change" | "word-break" | "alternate-stylesheet" | "background-clip-text" | "background-img-opts" | "background-position-x-y" | "background-repeat-round-space" | "calc" | "ch-unit" | "css-all" | "css-animation" | "css-any-link" | "css-appearance" | "css-at-counter-style" | "css-autofill" | "css-backdrop-filter" | "css-background-offsets" | "css-backgroundblendmode" | "css-boxdecorationbreak" | "css-boxshadow" | "css-canvas" | "css-caret-color" | "css-cascade-layers" | "css-case-insensitive" | "css-clip-path" | "css-color-adjust" | "css-color-function" | "css-conic-gradients" | "css-container-queries" | "css-container-queries-style" | "css-container-query-units" | "css-containment" | "css-content-visibility" | "css-counters" | "css-crisp-edges" | "css-cross-fade" | "css-default-pseudo" | "css-descendant-gtgt" | "css-deviceadaptation" | "css-dir-pseudo" | "css-display-contents" | "css-element-function" | "css-env-function" | "css-exclusions" | "css-featurequeries" | "css-file-selector-button" | "css-filter-function" | "css-filters" | "css-first-letter" | "css-first-line" | "css-fixed" | "css-focus-visible" | "css-focus-within" | "css-font-palette" | "css-font-rendering-controls" | "css-font-stretch" | "css-gencontent" | "css-gradients" | "css-grid" | "css-grid-animation" | "css-hanging-punctuation" | "css-has" | "css-hyphens" | "css-image-orientation" | "css-image-set" | "css-in-out-of-range" | "css-indeterminate-pseudo" | "css-initial-letter" | "css-initial-value" | "css-lch-lab" | "css-letter-spacing" | "css-line-clamp" | "css-logical-props" | "css-marker-pseudo" | "css-masks" | "css-matches-pseudo" | "css-math-functions" | "css-media-interaction" | "css-media-range-syntax" | "css-media-resolution" | "css-media-scripting" | "css-mediaqueries" | "css-mixblendmode" | "css-motion-paths" | "css-namespaces" | "css-nesting" | "css-not-sel-list" | "css-nth-child-of" | "css-opacity" | "css-optional-pseudo" | "css-overflow" | "css-overflow-anchor" | "css-overflow-overlay" | "css-overscroll-behavior" | "css-page-break" | "css-paged-media" | "css-paint-api" | "css-placeholder" | "css-placeholder-shown" | "css-print-color-adjust" | "css-read-only-write" | "css-rebeccapurple" | "css-reflections" | "css-regions" | "css-relative-colors" | "css-repeating-gradients" | "css-resize" | "css-revert-value" | "css-rrggbbaa" | "css-scroll-behavior" | "css-scroll-timeline" | "css-scrollbar" | "css-sel2" | "css-sel3" | "css-selection" | "css-shapes" | "css-snappoints" | "css-sticky" | "css-subgrid" | "css-supports-api" | "css-table" | "css-text-align-last" | "css-text-box-trim" | "css-text-indent" | "css-text-justify" | "css-text-orientation" | "css-text-spacing" | "css-textshadow" | "css-touch-action" | "css-transitions" | "css-unicode-bidi" | "css-unset-value" | "css-variables" | "css-when-else" | "css-widows-orphans" | "css-width-stretch" | "css-writing-mode" | "css-zoom" | "css3-attr" | "css3-boxsizing" | "css3-colors" | "css3-cursors" | "css3-cursors-grab" | "css3-cursors-newer" | "css3-tabsize" | "currentcolor" | "devicepixelratio" | "extended-system-fonts" | "flexbox" | "flexbox-gap" | "font-family-system-ui" | "font-feature" | "font-loading" | "font-unicode-range" | "fontface" | "fullscreen" | "getcomputedstyle" | "intrinsic-width" | "justify-content-space-evenly" | "kerning-pairs-ligatures" | "mdn-css-unicode-bidi-isolate" | "mdn-css-unicode-bidi-isolate-override" | "mdn-css-unicode-bidi-plaintext" | "mdn-text-decoration-color" | "mdn-text-decoration-line" | "mdn-text-decoration-shorthand" | "mdn-text-decoration-style" | "minmaxwh" | "multibackgrounds" | "multicolumn" | "style-scoped" | "svg-css" | "transforms2d" | "transforms3d" | "ttf" | "user-select-none" | "variable-fonts" | "viewport-unit-variants" | "viewport-units" | "wordwrap")[];
+ skipErrors?: boolean;
+}, filename?: string): CssUsageDuplex;
+import CssUsageDuplex from '../lib/stream/CssUsageDuplex.js';
diff --git a/node_modules/doiuse/types/lib/BrowserSelection.d.ts b/node_modules/doiuse/types/lib/BrowserSelection.d.ts
new file mode 100644
index 00000000..26b71cc0
--- /dev/null
+++ b/node_modules/doiuse/types/lib/BrowserSelection.d.ts
@@ -0,0 +1,511 @@
+/**
+ * @template T
+ * @typedef {{missing: T, partial: T}} Filter
+ */
+/**
+ * @typedef {Object} MissingSupportResultStats
+ * @prop {string} title
+ * @prop {caniuse.Feature} caniuseData
+ * @prop {string} [missing]
+ * @prop {Record<string, Record<string, string>>} [missingData]
+ * @prop {string} [partial]
+ * @prop {Record<string, Record<string, string>>} [partialData]
+ */
+/**
+ * @typedef {Partial<Record<keyof FEATURES, MissingSupportResultStats>>} BrowserSupportStats
+ */
+/**
+ * @typedef {Object} MissingSupportResult
+ * @prop {string[][]} browsers
+ * @prop {Partial<Record<keyof FEATURES, MissingSupportResultStats>>} features
+ */
+export default class BrowserSelection {
+ /**
+ * @param {Record<string, Record<string, string>>} browserStats
+ * @return {string}
+ */
+ static lackingBrowsers(browserStats: Record<string, Record<string, string>>): string;
+ /**
+ * @see BrowserSelection.compileBrowserSupport
+ * @param {ConstructorParameters<typeof this>} constructorParameters
+ * @return {MissingSupportResult} `{browsers, features}`
+ */
+ static missingSupport(query?: string | string[], from?: string | false): MissingSupportResult;
+ /**
+ * @param {string | string[]} [query]
+ * @param {string | false} [from]
+ */
+ constructor(query?: string | string[], from?: string | false);
+ browsersRequest: string | string[];
+ /**
+ * @param {string} browser
+ * @param {string} version
+ * @return {string[]|undefined}
+ */
+ test(browser: string, version: string): string[] | undefined;
+ list(): string[][];
+ /**
+ * @param {import('caniuse-lite').StatsByAgentID} stats
+ * @return {Filter<Record<string,Record<string, string>>>}
+ */
+ filterStats(stats: import('caniuse-lite').StatsByAgentID): Filter<Record<string, Record<string, string>>>;
+ /**
+ * Get data on CSS features not supported by the given autoprefixer-like
+ * browser selection.
+ * @return {BrowserSupportStats} `features` is an array of:
+ * ```
+ * {
+ * 'feature-name': {
+ * title: 'Title of feature'
+ * missing: "IE (8), Chrome (31)"
+ * missingData: {
+ * // map of browser -> version -> (lack of)support code
+ * ie: { '8': 'n' },
+ * chrome: { '31': 'n' }
+ * }
+ * partialData: {
+ * // map of browser -> version -> (partial)support code
+ * ie: { '7': 'a' },
+ * ff: { '29': 'a #1' }
+ * }
+ * caniuseData: {
+ * // caniuse-db json data for this feature
+ * }
+ * },
+ * 'feature-name-2': {} // etc.
+ * }
+ * ```
+ *
+ * `feature-name` is a caniuse-db slug.
+ */
+ compileBrowserSupport(): BrowserSupportStats;
+ #private;
+}
+export type Filter<T> = {
+ missing: T;
+ partial: T;
+};
+export type MissingSupportResultStats = {
+ title: string;
+ caniuseData: caniuse.Feature;
+ missing?: string;
+ missingData?: Record<string, Record<string, string>>;
+ partial?: string;
+ partialData?: Record<string, Record<string, string>>;
+};
+export type BrowserSupportStats = Partial<Record<keyof {
+ outline: import("../data/features.js").Feature;
+ "background-attachment": import("../data/features.js").Feature;
+ pointer: import("../data/features.js").Feature;
+ "flow-root": import("../data/features.js").Feature;
+ "font-kerning": import("../data/features.js").Feature;
+ "font-smooth": import("../data/features.js").Feature;
+ "font-variant-alternates": import("../data/features.js").Feature;
+ "font-variant-numeric": import("../data/features.js").Feature;
+ "inline-block": import("../data/features.js").Feature;
+ "prefers-color-scheme": import("../data/features.js").Feature;
+ "prefers-reduced-motion": import("../data/features.js").Feature;
+ rem: import("../data/features.js").Feature;
+ "run-in": import("../data/features.js").Feature;
+ "text-emphasis": import("../data/features.js").Feature;
+ "text-stroke": import("../data/features.js").Feature;
+ "webkit-user-drag": import("../data/features.js").Feature;
+ "border-image": import("../data/features.js").Feature;
+ "border-radius": import("../data/features.js").Feature;
+ "font-size-adjust": import("../data/features.js").Feature;
+ "text-decoration": import("../data/features.js").Feature;
+ "object-fit": import("../data/features.js").Feature;
+ "pointer-events": import("../data/features.js").Feature;
+ "text-overflow": import("../data/features.js").Feature;
+ "text-size-adjust": import("../data/features.js").Feature;
+ "will-change": import("../data/features.js").Feature;
+ "word-break": import("../data/features.js").Feature;
+ "alternate-stylesheet": import("../data/features.js").Feature;
+ "background-clip-text": import("../data/features.js").Feature;
+ "background-img-opts": import("../data/features.js").Feature;
+ "background-position-x-y": import("../data/features.js").Feature;
+ "background-repeat-round-space": import("../data/features.js").Feature;
+ calc: import("../data/features.js").Feature;
+ "ch-unit": import("../data/features.js").Feature;
+ "css-all": import("../data/features.js").Feature;
+ "css-animation": import("../data/features.js").Feature;
+ "css-any-link": import("../data/features.js").Feature;
+ "css-appearance": import("../data/features.js").Feature;
+ "css-at-counter-style": import("../data/features.js").Feature;
+ "css-autofill": import("../data/features.js").Feature;
+ "css-backdrop-filter": import("../data/features.js").Feature;
+ "css-background-offsets": import("../data/features.js").Feature;
+ "css-backgroundblendmode": import("../data/features.js").Feature;
+ "css-boxdecorationbreak": import("../data/features.js").Feature;
+ "css-boxshadow": import("../data/features.js").Feature;
+ "css-canvas": import("../data/features.js").Feature;
+ "css-caret-color": import("../data/features.js").Feature;
+ "css-cascade-layers": import("../data/features.js").Feature;
+ "css-case-insensitive": import("../data/features.js").Feature;
+ "css-clip-path": import("../data/features.js").Feature;
+ "css-color-adjust": import("../data/features.js").Feature;
+ "css-color-function": import("../data/features.js").Feature;
+ "css-conic-gradients": import("../data/features.js").Feature;
+ "css-container-queries": import("../data/features.js").Feature;
+ "css-container-queries-style": import("../data/features.js").Feature;
+ "css-container-query-units": import("../data/features.js").Feature;
+ "css-containment": import("../data/features.js").Feature;
+ "css-content-visibility": import("../data/features.js").Feature;
+ "css-counters": import("../data/features.js").Feature;
+ "css-crisp-edges": import("../data/features.js").Feature;
+ "css-cross-fade": import("../data/features.js").Feature;
+ "css-default-pseudo": import("../data/features.js").Feature;
+ "css-descendant-gtgt": import("../data/features.js").Feature;
+ "css-deviceadaptation": import("../data/features.js").Feature;
+ "css-dir-pseudo": import("../data/features.js").Feature;
+ "css-display-contents": import("../data/features.js").Feature;
+ "css-element-function": import("../data/features.js").Feature;
+ "css-env-function": import("../data/features.js").Feature;
+ "css-exclusions": import("../data/features.js").Feature;
+ "css-featurequeries": import("../data/features.js").Feature;
+ "css-file-selector-button": import("../data/features.js").Feature;
+ "css-filter-function": import("../data/features.js").Feature;
+ "css-filters": import("../data/features.js").Feature;
+ "css-first-letter": import("../data/features.js").Feature;
+ "css-first-line": import("../data/features.js").Feature;
+ "css-fixed": import("../data/features.js").Feature;
+ "css-focus-visible": import("../data/features.js").Feature;
+ "css-focus-within": import("../data/features.js").Feature;
+ "css-font-palette": import("../data/features.js").Feature;
+ "css-font-rendering-controls": import("../data/features.js").Feature;
+ "css-font-stretch": import("../data/features.js").Feature;
+ "css-gencontent": import("../data/features.js").Feature;
+ "css-gradients": import("../data/features.js").Feature;
+ "css-grid": import("../data/features.js").Feature;
+ "css-grid-animation": import("../data/features.js").Feature;
+ "css-hanging-punctuation": import("../data/features.js").Feature;
+ "css-has": import("../data/features.js").Feature;
+ "css-hyphens": import("../data/features.js").Feature;
+ "css-image-orientation": import("../data/features.js").Feature;
+ "css-image-set": import("../data/features.js").Feature;
+ "css-in-out-of-range": import("../data/features.js").Feature;
+ "css-indeterminate-pseudo": import("../data/features.js").Feature;
+ "css-initial-letter": import("../data/features.js").Feature;
+ "css-initial-value": import("../data/features.js").Feature;
+ "css-lch-lab": import("../data/features.js").Feature;
+ "css-letter-spacing": import("../data/features.js").Feature;
+ "css-line-clamp": import("../data/features.js").Feature;
+ "css-logical-props": import("../data/features.js").Feature;
+ "css-marker-pseudo": import("../data/features.js").Feature;
+ "css-masks": import("../data/features.js").Feature;
+ "css-matches-pseudo": import("../data/features.js").Feature;
+ "css-math-functions": import("../data/features.js").Feature;
+ "css-media-interaction": import("../data/features.js").Feature;
+ "css-media-range-syntax": import("../data/features.js").Feature;
+ "css-media-resolution": import("../data/features.js").Feature;
+ "css-media-scripting": import("../data/features.js").Feature;
+ "css-mediaqueries": import("../data/features.js").Feature;
+ "css-mixblendmode": import("../data/features.js").Feature;
+ "css-motion-paths": import("../data/features.js").Feature;
+ "css-namespaces": import("../data/features.js").Feature;
+ "css-nesting": import("../data/features.js").Feature;
+ "css-not-sel-list": import("../data/features.js").Feature;
+ "css-nth-child-of": import("../data/features.js").Feature;
+ "css-opacity": import("../data/features.js").Feature;
+ "css-optional-pseudo": import("../data/features.js").Feature;
+ "css-overflow": import("../data/features.js").Feature;
+ "css-overflow-anchor": import("../data/features.js").Feature;
+ "css-overflow-overlay": import("../data/features.js").Feature;
+ "css-overscroll-behavior": import("../data/features.js").Feature;
+ "css-page-break": import("../data/features.js").Feature;
+ "css-paged-media": import("../data/features.js").Feature;
+ "css-paint-api": import("../data/features.js").Feature;
+ "css-placeholder": import("../data/features.js").Feature;
+ "css-placeholder-shown": import("../data/features.js").Feature;
+ "css-print-color-adjust": import("../data/features.js").Feature;
+ "css-read-only-write": import("../data/features.js").Feature;
+ "css-rebeccapurple": import("../data/features.js").Feature;
+ "css-reflections": import("../data/features.js").Feature;
+ "css-regions": import("../data/features.js").Feature;
+ "css-relative-colors": import("../data/features.js").Feature;
+ "css-repeating-gradients": import("../data/features.js").Feature;
+ "css-resize": import("../data/features.js").Feature;
+ "css-revert-value": import("../data/features.js").Feature;
+ "css-rrggbbaa": import("../data/features.js").Feature;
+ "css-scroll-behavior": import("../data/features.js").Feature;
+ "css-scroll-timeline": import("../data/features.js").Feature;
+ "css-scrollbar": import("../data/features.js").Feature;
+ "css-sel2": import("../data/features.js").Feature;
+ "css-sel3": import("../data/features.js").Feature;
+ "css-selection": import("../data/features.js").Feature;
+ "css-shapes": import("../data/features.js").Feature;
+ "css-snappoints": import("../data/features.js").Feature;
+ "css-sticky": import("../data/features.js").Feature;
+ "css-subgrid": import("../data/features.js").Feature;
+ "css-supports-api": import("../data/features.js").Feature;
+ "css-table": import("../data/features.js").Feature;
+ "css-text-align-last": import("../data/features.js").Feature;
+ "css-text-box-trim": import("../data/features.js").Feature;
+ "css-text-indent": import("../data/features.js").Feature;
+ "css-text-justify": import("../data/features.js").Feature;
+ "css-text-orientation": import("../data/features.js").Feature;
+ "css-text-spacing": import("../data/features.js").Feature;
+ "css-textshadow": import("../data/features.js").Feature;
+ "css-touch-action": import("../data/features.js").Feature;
+ "css-transitions": import("../data/features.js").Feature;
+ "css-unicode-bidi": import("../data/features.js").Feature;
+ "css-unset-value": import("../data/features.js").Feature;
+ "css-variables": import("../data/features.js").Feature;
+ "css-when-else": import("../data/features.js").Feature;
+ "css-widows-orphans": import("../data/features.js").Feature;
+ "css-width-stretch": import("../data/features.js").Feature;
+ "css-writing-mode": import("../data/features.js").Feature;
+ "css-zoom": import("../data/features.js").Feature;
+ "css3-attr": import("../data/features.js").Feature;
+ "css3-boxsizing": import("../data/features.js").Feature;
+ "css3-colors": import("../data/features.js").Feature;
+ "css3-cursors": import("../data/features.js").Feature;
+ "css3-cursors-grab": import("../data/features.js").Feature;
+ "css3-cursors-newer": import("../data/features.js").Feature;
+ "css3-tabsize": import("../data/features.js").Feature;
+ currentcolor: import("../data/features.js").Feature;
+ devicepixelratio: import("../data/features.js").Feature;
+ "extended-system-fonts": import("../data/features.js").Feature;
+ flexbox: import("../data/features.js").Feature;
+ "flexbox-gap": import("../data/features.js").Feature;
+ "font-family-system-ui": import("../data/features.js").Feature;
+ "font-feature": import("../data/features.js").Feature;
+ "font-loading": import("../data/features.js").Feature;
+ "font-unicode-range": import("../data/features.js").Feature;
+ fontface: import("../data/features.js").Feature;
+ fullscreen: import("../data/features.js").Feature;
+ getcomputedstyle: import("../data/features.js").Feature;
+ "intrinsic-width": import("../data/features.js").Feature;
+ "justify-content-space-evenly": import("../data/features.js").Feature;
+ "kerning-pairs-ligatures": import("../data/features.js").Feature;
+ "mdn-css-unicode-bidi-isolate": import("../data/features.js").Feature;
+ "mdn-css-unicode-bidi-isolate-override": import("../data/features.js").Feature;
+ "mdn-css-unicode-bidi-plaintext": import("../data/features.js").Feature;
+ "mdn-text-decoration-color": import("../data/features.js").Feature;
+ "mdn-text-decoration-line": import("../data/features.js").Feature;
+ "mdn-text-decoration-shorthand": import("../data/features.js").Feature;
+ "mdn-text-decoration-style": import("../data/features.js").Feature;
+ minmaxwh: import("../data/features.js").Feature;
+ multibackgrounds: import("../data/features.js").Feature;
+ multicolumn: import("../data/features.js").Feature;
+ "style-scoped": import("../data/features.js").Feature;
+ "svg-css": import("../data/features.js").Feature;
+ transforms2d: import("../data/features.js").Feature;
+ transforms3d: import("../data/features.js").Feature;
+ ttf: import("../data/features.js").Feature;
+ "user-select-none": import("../data/features.js").Feature;
+ "variable-fonts": import("../data/features.js").Feature;
+ "viewport-unit-variants": import("../data/features.js").Feature;
+ "viewport-units": import("../data/features.js").Feature;
+ wordwrap: import("../data/features.js").Feature;
+}, MissingSupportResultStats>>;
+export type MissingSupportResult = {
+ browsers: string[][];
+ features: Partial<Record<keyof {
+ outline: import("../data/features.js").Feature;
+ "background-attachment": import("../data/features.js").Feature;
+ pointer: import("../data/features.js").Feature;
+ "flow-root": import("../data/features.js").Feature;
+ "font-kerning": import("../data/features.js").Feature;
+ "font-smooth": import("../data/features.js").Feature;
+ "font-variant-alternates": import("../data/features.js").Feature;
+ "font-variant-numeric": import("../data/features.js").Feature;
+ "inline-block": import("../data/features.js").Feature;
+ "prefers-color-scheme": import("../data/features.js").Feature;
+ "prefers-reduced-motion": import("../data/features.js").Feature;
+ rem: import("../data/features.js").Feature;
+ "run-in": import("../data/features.js").Feature;
+ "text-emphasis": import("../data/features.js").Feature;
+ "text-stroke": import("../data/features.js").Feature;
+ "webkit-user-drag": import("../data/features.js").Feature;
+ "border-image": import("../data/features.js").Feature;
+ "border-radius": import("../data/features.js").Feature;
+ "font-size-adjust": import("../data/features.js").Feature;
+ "text-decoration": import("../data/features.js").Feature;
+ "object-fit": import("../data/features.js").Feature;
+ "pointer-events": import("../data/features.js").Feature;
+ "text-overflow": import("../data/features.js").Feature;
+ "text-size-adjust": import("../data/features.js").Feature;
+ "will-change": import("../data/features.js").Feature;
+ "word-break": import("../data/features.js").Feature;
+ "alternate-stylesheet": import("../data/features.js").Feature;
+ "background-clip-text": import("../data/features.js").Feature;
+ "background-img-opts": import("../data/features.js").Feature;
+ "background-position-x-y": import("../data/features.js").Feature;
+ "background-repeat-round-space": import("../data/features.js").Feature;
+ calc: import("../data/features.js").Feature;
+ "ch-unit": import("../data/features.js").Feature;
+ "css-all": import("../data/features.js").Feature;
+ "css-animation": import("../data/features.js").Feature;
+ "css-any-link": import("../data/features.js").Feature;
+ "css-appearance": import("../data/features.js").Feature;
+ "css-at-counter-style": import("../data/features.js").Feature;
+ "css-autofill": import("../data/features.js").Feature;
+ "css-backdrop-filter": import("../data/features.js").Feature;
+ "css-background-offsets": import("../data/features.js").Feature;
+ "css-backgroundblendmode": import("../data/features.js").Feature;
+ "css-boxdecorationbreak": import("../data/features.js").Feature;
+ "css-boxshadow": import("../data/features.js").Feature;
+ "css-canvas": import("../data/features.js").Feature;
+ "css-caret-color": import("../data/features.js").Feature;
+ "css-cascade-layers": import("../data/features.js").Feature;
+ "css-case-insensitive": import("../data/features.js").Feature;
+ "css-clip-path": import("../data/features.js").Feature;
+ "css-color-adjust": import("../data/features.js").Feature;
+ "css-color-function": import("../data/features.js").Feature;
+ "css-conic-gradients": import("../data/features.js").Feature;
+ "css-container-queries": import("../data/features.js").Feature;
+ "css-container-queries-style": import("../data/features.js").Feature;
+ "css-container-query-units": import("../data/features.js").Feature;
+ "css-containment": import("../data/features.js").Feature;
+ "css-content-visibility": import("../data/features.js").Feature;
+ "css-counters": import("../data/features.js").Feature;
+ "css-crisp-edges": import("../data/features.js").Feature;
+ "css-cross-fade": import("../data/features.js").Feature;
+ "css-default-pseudo": import("../data/features.js").Feature;
+ "css-descendant-gtgt": import("../data/features.js").Feature;
+ "css-deviceadaptation": import("../data/features.js").Feature;
+ "css-dir-pseudo": import("../data/features.js").Feature;
+ "css-display-contents": import("../data/features.js").Feature;
+ "css-element-function": import("../data/features.js").Feature;
+ "css-env-function": import("../data/features.js").Feature;
+ "css-exclusions": import("../data/features.js").Feature;
+ "css-featurequeries": import("../data/features.js").Feature;
+ "css-file-selector-button": import("../data/features.js").Feature;
+ "css-filter-function": import("../data/features.js").Feature;
+ "css-filters": import("../data/features.js").Feature;
+ "css-first-letter": import("../data/features.js").Feature;
+ "css-first-line": import("../data/features.js").Feature;
+ "css-fixed": import("../data/features.js").Feature;
+ "css-focus-visible": import("../data/features.js").Feature;
+ "css-focus-within": import("../data/features.js").Feature;
+ "css-font-palette": import("../data/features.js").Feature;
+ "css-font-rendering-controls": import("../data/features.js").Feature;
+ "css-font-stretch": import("../data/features.js").Feature;
+ "css-gencontent": import("../data/features.js").Feature;
+ "css-gradients": import("../data/features.js").Feature;
+ "css-grid": import("../data/features.js").Feature;
+ "css-grid-animation": import("../data/features.js").Feature;
+ "css-hanging-punctuation": import("../data/features.js").Feature;
+ "css-has": import("../data/features.js").Feature;
+ "css-hyphens": import("../data/features.js").Feature;
+ "css-image-orientation": import("../data/features.js").Feature;
+ "css-image-set": import("../data/features.js").Feature;
+ "css-in-out-of-range": import("../data/features.js").Feature;
+ "css-indeterminate-pseudo": import("../data/features.js").Feature;
+ "css-initial-letter": import("../data/features.js").Feature;
+ "css-initial-value": import("../data/features.js").Feature;
+ "css-lch-lab": import("../data/features.js").Feature;
+ "css-letter-spacing": import("../data/features.js").Feature;
+ "css-line-clamp": import("../data/features.js").Feature;
+ "css-logical-props": import("../data/features.js").Feature;
+ "css-marker-pseudo": import("../data/features.js").Feature;
+ "css-masks": import("../data/features.js").Feature;
+ "css-matches-pseudo": import("../data/features.js").Feature;
+ "css-math-functions": import("../data/features.js").Feature;
+ "css-media-interaction": import("../data/features.js").Feature;
+ "css-media-range-syntax": import("../data/features.js").Feature;
+ "css-media-resolution": import("../data/features.js").Feature;
+ "css-media-scripting": import("../data/features.js").Feature;
+ "css-mediaqueries": import("../data/features.js").Feature;
+ "css-mixblendmode": import("../data/features.js").Feature;
+ "css-motion-paths": import("../data/features.js").Feature;
+ "css-namespaces": import("../data/features.js").Feature;
+ "css-nesting": import("../data/features.js").Feature;
+ "css-not-sel-list": import("../data/features.js").Feature;
+ "css-nth-child-of": import("../data/features.js").Feature;
+ "css-opacity": import("../data/features.js").Feature;
+ "css-optional-pseudo": import("../data/features.js").Feature;
+ "css-overflow": import("../data/features.js").Feature;
+ "css-overflow-anchor": import("../data/features.js").Feature;
+ "css-overflow-overlay": import("../data/features.js").Feature;
+ "css-overscroll-behavior": import("../data/features.js").Feature;
+ "css-page-break": import("../data/features.js").Feature;
+ "css-paged-media": import("../data/features.js").Feature;
+ "css-paint-api": import("../data/features.js").Feature;
+ "css-placeholder": import("../data/features.js").Feature;
+ "css-placeholder-shown": import("../data/features.js").Feature;
+ "css-print-color-adjust": import("../data/features.js").Feature;
+ "css-read-only-write": import("../data/features.js").Feature;
+ "css-rebeccapurple": import("../data/features.js").Feature;
+ "css-reflections": import("../data/features.js").Feature;
+ "css-regions": import("../data/features.js").Feature;
+ "css-relative-colors": import("../data/features.js").Feature;
+ "css-repeating-gradients": import("../data/features.js").Feature;
+ "css-resize": import("../data/features.js").Feature;
+ "css-revert-value": import("../data/features.js").Feature;
+ "css-rrggbbaa": import("../data/features.js").Feature;
+ "css-scroll-behavior": import("../data/features.js").Feature;
+ "css-scroll-timeline": import("../data/features.js").Feature;
+ "css-scrollbar": import("../data/features.js").Feature;
+ "css-sel2": import("../data/features.js").Feature;
+ "css-sel3": import("../data/features.js").Feature;
+ "css-selection": import("../data/features.js").Feature;
+ "css-shapes": import("../data/features.js").Feature;
+ "css-snappoints": import("../data/features.js").Feature;
+ "css-sticky": import("../data/features.js").Feature;
+ "css-subgrid": import("../data/features.js").Feature;
+ "css-supports-api": import("../data/features.js").Feature;
+ "css-table": import("../data/features.js").Feature;
+ "css-text-align-last": import("../data/features.js").Feature;
+ "css-text-box-trim": import("../data/features.js").Feature;
+ "css-text-indent": import("../data/features.js").Feature;
+ "css-text-justify": import("../data/features.js").Feature;
+ "css-text-orientation": import("../data/features.js").Feature;
+ "css-text-spacing": import("../data/features.js").Feature;
+ "css-textshadow": import("../data/features.js").Feature;
+ "css-touch-action": import("../data/features.js").Feature;
+ "css-transitions": import("../data/features.js").Feature;
+ "css-unicode-bidi": import("../data/features.js").Feature;
+ "css-unset-value": import("../data/features.js").Feature;
+ "css-variables": import("../data/features.js").Feature;
+ "css-when-else": import("../data/features.js").Feature;
+ "css-widows-orphans": import("../data/features.js").Feature;
+ "css-width-stretch": import("../data/features.js").Feature;
+ "css-writing-mode": import("../data/features.js").Feature;
+ "css-zoom": import("../data/features.js").Feature;
+ "css3-attr": import("../data/features.js").Feature;
+ "css3-boxsizing": import("../data/features.js").Feature;
+ "css3-colors": import("../data/features.js").Feature;
+ "css3-cursors": import("../data/features.js").Feature;
+ "css3-cursors-grab": import("../data/features.js").Feature;
+ "css3-cursors-newer": import("../data/features.js").Feature;
+ "css3-tabsize": import("../data/features.js").Feature;
+ currentcolor: import("../data/features.js").Feature;
+ devicepixelratio: import("../data/features.js").Feature;
+ "extended-system-fonts": import("../data/features.js").Feature;
+ flexbox: import("../data/features.js").Feature;
+ "flexbox-gap": import("../data/features.js").Feature;
+ "font-family-system-ui": import("../data/features.js").Feature;
+ "font-feature": import("../data/features.js").Feature;
+ "font-loading": import("../data/features.js").Feature;
+ "font-unicode-range": import("../data/features.js").Feature;
+ fontface: import("../data/features.js").Feature;
+ fullscreen: import("../data/features.js").Feature;
+ getcomputedstyle: import("../data/features.js").Feature;
+ "intrinsic-width": import("../data/features.js").Feature;
+ "justify-content-space-evenly": import("../data/features.js").Feature;
+ "kerning-pairs-ligatures": import("../data/features.js").Feature;
+ "mdn-css-unicode-bidi-isolate": import("../data/features.js").Feature;
+ "mdn-css-unicode-bidi-isolate-override": import("../data/features.js").Feature;
+ "mdn-css-unicode-bidi-plaintext": import("../data/features.js").Feature;
+ "mdn-text-decoration-color": import("../data/features.js").Feature;
+ "mdn-text-decoration-line": import("../data/features.js").Feature;
+ "mdn-text-decoration-shorthand": import("../data/features.js").Feature;
+ "mdn-text-decoration-style": import("../data/features.js").Feature;
+ minmaxwh: import("../data/features.js").Feature;
+ multibackgrounds: import("../data/features.js").Feature;
+ multicolumn: import("../data/features.js").Feature;
+ "style-scoped": import("../data/features.js").Feature;
+ "svg-css": import("../data/features.js").Feature;
+ transforms2d: import("../data/features.js").Feature;
+ transforms3d: import("../data/features.js").Feature;
+ ttf: import("../data/features.js").Feature;
+ "user-select-none": import("../data/features.js").Feature;
+ "variable-fonts": import("../data/features.js").Feature;
+ "viewport-unit-variants": import("../data/features.js").Feature;
+ "viewport-units": import("../data/features.js").Feature;
+ wordwrap: import("../data/features.js").Feature;
+ }, MissingSupportResultStats>>;
+};
+import * as caniuse from 'caniuse-lite';
diff --git a/node_modules/doiuse/types/lib/Detector.d.ts b/node_modules/doiuse/types/lib/Detector.d.ts
new file mode 100644
index 00000000..27be89f3
--- /dev/null
+++ b/node_modules/doiuse/types/lib/Detector.d.ts
@@ -0,0 +1,1076 @@
+/**
+ * Detect the use of any of a given list of CSS features.
+ * ```
+ * var detector = new Detector(featureList)
+ * detector.process(css, cb)
+ * ```
+ *
+ * `featureList`: an array of feature slugs (see caniuse-db)
+ * `cb`: a callback that gets called for each usage of one of the given features,
+ * called with an argument like:
+ * ```
+ * {
+ * usage: {} // postcss node where usage was found
+ * feature: {} // caniuse-db feature slug
+ * ignore: {} // caniuse-db feature to ignore in current file
+ * }
+ * ```
+ */
+export default class Detector {
+ /**
+ * @param {(keyof FEATURES & string)[]} featureList an array of feature slugs (see caniuse-db)
+ */
+ constructor(featureList: (keyof {
+ outline: import("../data/features.js").Feature;
+ "background-attachment": import("../data/features.js").Feature;
+ pointer: import("../data/features.js").Feature;
+ "flow-root": import("../data/features.js").Feature;
+ "font-kerning": import("../data/features.js").Feature;
+ "font-smooth": import("../data/features.js").Feature;
+ "font-variant-alternates": import("../data/features.js").Feature;
+ "font-variant-numeric": import("../data/features.js").Feature;
+ "inline-block": import("../data/features.js").Feature;
+ "prefers-color-scheme": import("../data/features.js").Feature;
+ "prefers-reduced-motion": import("../data/features.js").Feature;
+ rem: import("../data/features.js").Feature;
+ "run-in": import("../data/features.js").Feature;
+ "text-emphasis": import("../data/features.js").Feature;
+ "text-stroke": import("../data/features.js").Feature;
+ "webkit-user-drag": import("../data/features.js").Feature;
+ "border-image": import("../data/features.js").Feature;
+ "border-radius": import("../data/features.js").Feature;
+ "font-size-adjust": import("../data/features.js").Feature;
+ "text-decoration": import("../data/features.js").Feature;
+ "object-fit": import("../data/features.js").Feature;
+ "pointer-events": import("../data/features.js").Feature;
+ "text-overflow": import("../data/features.js").Feature;
+ "text-size-adjust": import("../data/features.js").Feature;
+ "will-change": import("../data/features.js").Feature;
+ "word-break": import("../data/features.js").Feature;
+ "alternate-stylesheet": import("../data/features.js").Feature;
+ "background-clip-text": import("../data/features.js").Feature;
+ "background-img-opts": import("../data/features.js").Feature;
+ "background-position-x-y": import("../data/features.js").Feature;
+ "background-repeat-round-space": import("../data/features.js").Feature;
+ calc: import("../data/features.js").Feature;
+ "ch-unit": import("../data/features.js").Feature;
+ "css-all": import("../data/features.js").Feature;
+ "css-animation": import("../data/features.js").Feature;
+ "css-any-link": import("../data/features.js").Feature;
+ "css-appearance": import("../data/features.js").Feature;
+ "css-at-counter-style": import("../data/features.js").Feature;
+ "css-autofill": import("../data/features.js").Feature;
+ "css-backdrop-filter": import("../data/features.js").Feature;
+ "css-background-offsets": import("../data/features.js").Feature;
+ "css-backgroundblendmode": import("../data/features.js").Feature;
+ "css-boxdecorationbreak": import("../data/features.js").Feature;
+ "css-boxshadow": import("../data/features.js").Feature;
+ "css-canvas": import("../data/features.js").Feature;
+ "css-caret-color": import("../data/features.js").Feature;
+ "css-cascade-layers": import("../data/features.js").Feature;
+ "css-case-insensitive": import("../data/features.js").Feature;
+ "css-clip-path": import("../data/features.js").Feature;
+ "css-color-adjust": import("../data/features.js").Feature;
+ "css-color-function": import("../data/features.js").Feature;
+ "css-conic-gradients": import("../data/features.js").Feature;
+ "css-container-queries": import("../data/features.js").Feature;
+ "css-container-queries-style": import("../data/features.js").Feature;
+ "css-container-query-units": import("../data/features.js").Feature;
+ "css-containment": import("../data/features.js").Feature;
+ "css-content-visibility": import("../data/features.js").Feature;
+ "css-counters": import("../data/features.js").Feature;
+ "css-crisp-edges": import("../data/features.js").Feature;
+ "css-cross-fade": import("../data/features.js").Feature;
+ "css-default-pseudo": import("../data/features.js").Feature;
+ "css-descendant-gtgt": import("../data/features.js").Feature;
+ "css-deviceadaptation": import("../data/features.js").Feature;
+ "css-dir-pseudo": import("../data/features.js").Feature;
+ "css-display-contents": import("../data/features.js").Feature;
+ "css-element-function": import("../data/features.js").Feature;
+ "css-env-function": import("../data/features.js").Feature;
+ "css-exclusions": import("../data/features.js").Feature;
+ "css-featurequeries": import("../data/features.js").Feature;
+ "css-file-selector-button": import("../data/features.js").Feature;
+ "css-filter-function": import("../data/features.js").Feature;
+ "css-filters": import("../data/features.js").Feature;
+ "css-first-letter": import("../data/features.js").Feature;
+ "css-first-line": import("../data/features.js").Feature;
+ "css-fixed": import("../data/features.js").Feature;
+ "css-focus-visible": import("../data/features.js").Feature;
+ "css-focus-within": import("../data/features.js").Feature;
+ "css-font-palette": import("../data/features.js").Feature;
+ "css-font-rendering-controls": import("../data/features.js").Feature;
+ "css-font-stretch": import("../data/features.js").Feature;
+ "css-gencontent": import("../data/features.js").Feature;
+ "css-gradients": import("../data/features.js").Feature;
+ "css-grid": import("../data/features.js").Feature;
+ "css-grid-animation": import("../data/features.js").Feature;
+ "css-hanging-punctuation": import("../data/features.js").Feature;
+ "css-has": import("../data/features.js").Feature;
+ "css-hyphens": import("../data/features.js").Feature;
+ "css-image-orientation": import("../data/features.js").Feature;
+ "css-image-set": import("../data/features.js").Feature;
+ "css-in-out-of-range": import("../data/features.js").Feature;
+ "css-indeterminate-pseudo": import("../data/features.js").Feature;
+ "css-initial-letter": import("../data/features.js").Feature;
+ "css-initial-value": import("../data/features.js").Feature;
+ "css-lch-lab": import("../data/features.js").Feature;
+ "css-letter-spacing": import("../data/features.js").Feature;
+ "css-line-clamp": import("../data/features.js").Feature;
+ "css-logical-props": import("../data/features.js").Feature;
+ "css-marker-pseudo": import("../data/features.js").Feature;
+ "css-masks": import("../data/features.js").Feature;
+ "css-matches-pseudo": import("../data/features.js").Feature;
+ "css-math-functions": import("../data/features.js").Feature;
+ "css-media-interaction": import("../data/features.js").Feature;
+ "css-media-range-syntax": import("../data/features.js").Feature;
+ "css-media-resolution": import("../data/features.js").Feature;
+ "css-media-scripting": import("../data/features.js").Feature;
+ "css-mediaqueries": import("../data/features.js").Feature;
+ "css-mixblendmode": import("../data/features.js").Feature;
+ "css-motion-paths": import("../data/features.js").Feature;
+ "css-namespaces": import("../data/features.js").Feature;
+ "css-nesting": import("../data/features.js").Feature;
+ "css-not-sel-list": import("../data/features.js").Feature;
+ "css-nth-child-of": import("../data/features.js").Feature;
+ "css-opacity": import("../data/features.js").Feature;
+ "css-optional-pseudo": import("../data/features.js").Feature;
+ "css-overflow": import("../data/features.js").Feature;
+ "css-overflow-anchor": import("../data/features.js").Feature;
+ "css-overflow-overlay": import("../data/features.js").Feature;
+ "css-overscroll-behavior": import("../data/features.js").Feature;
+ "css-page-break": import("../data/features.js").Feature;
+ "css-paged-media": import("../data/features.js").Feature;
+ "css-paint-api": import("../data/features.js").Feature;
+ "css-placeholder": import("../data/features.js").Feature;
+ "css-placeholder-shown": import("../data/features.js").Feature;
+ "css-print-color-adjust": import("../data/features.js").Feature;
+ "css-read-only-write": import("../data/features.js").Feature;
+ "css-rebeccapurple": import("../data/features.js").Feature;
+ "css-reflections": import("../data/features.js").Feature;
+ "css-regions": import("../data/features.js").Feature;
+ "css-relative-colors": import("../data/features.js").Feature;
+ "css-repeating-gradients": import("../data/features.js").Feature;
+ "css-resize": import("../data/features.js").Feature;
+ "css-revert-value": import("../data/features.js").Feature;
+ "css-rrggbbaa": import("../data/features.js").Feature;
+ "css-scroll-behavior": import("../data/features.js").Feature;
+ "css-scroll-timeline": import("../data/features.js").Feature;
+ "css-scrollbar": import("../data/features.js").Feature;
+ "css-sel2": import("../data/features.js").Feature;
+ "css-sel3": import("../data/features.js").Feature;
+ "css-selection": import("../data/features.js").Feature;
+ "css-shapes": import("../data/features.js").Feature;
+ "css-snappoints": import("../data/features.js").Feature;
+ "css-sticky": import("../data/features.js").Feature;
+ "css-subgrid": import("../data/features.js").Feature;
+ "css-supports-api": import("../data/features.js").Feature;
+ "css-table": import("../data/features.js").Feature;
+ "css-text-align-last": import("../data/features.js").Feature;
+ "css-text-box-trim": import("../data/features.js").Feature;
+ "css-text-indent": import("../data/features.js").Feature;
+ "css-text-justify": import("../data/features.js").Feature;
+ "css-text-orientation": import("../data/features.js").Feature;
+ "css-text-spacing": import("../data/features.js").Feature;
+ "css-textshadow": import("../data/features.js").Feature;
+ "css-touch-action": import("../data/features.js").Feature;
+ "css-transitions": import("../data/features.js").Feature;
+ "css-unicode-bidi": import("../data/features.js").Feature;
+ "css-unset-value": import("../data/features.js").Feature;
+ "css-variables": import("../data/features.js").Feature;
+ "css-when-else": import("../data/features.js").Feature;
+ "css-widows-orphans": import("../data/features.js").Feature;
+ "css-width-stretch": import("../data/features.js").Feature;
+ "css-writing-mode": import("../data/features.js").Feature;
+ "css-zoom": import("../data/features.js").Feature;
+ "css3-attr": import("../data/features.js").Feature;
+ "css3-boxsizing": import("../data/features.js").Feature;
+ "css3-colors": import("../data/features.js").Feature;
+ "css3-cursors": import("../data/features.js").Feature;
+ "css3-cursors-grab": import("../data/features.js").Feature;
+ "css3-cursors-newer": import("../data/features.js").Feature;
+ "css3-tabsize": import("../data/features.js").Feature;
+ currentcolor: import("../data/features.js").Feature;
+ devicepixelratio: import("../data/features.js").Feature;
+ "extended-system-fonts": import("../data/features.js").Feature;
+ flexbox: import("../data/features.js").Feature;
+ "flexbox-gap": import("../data/features.js").Feature;
+ "font-family-system-ui": import("../data/features.js").Feature;
+ "font-feature": import("../data/features.js").Feature;
+ "font-loading": import("../data/features.js").Feature;
+ "font-unicode-range": import("../data/features.js").Feature;
+ fontface: import("../data/features.js").Feature;
+ fullscreen: import("../data/features.js").Feature;
+ getcomputedstyle: import("../data/features.js").Feature;
+ "intrinsic-width": import("../data/features.js").Feature;
+ "justify-content-space-evenly": import("../data/features.js").Feature;
+ "kerning-pairs-ligatures": import("../data/features.js").Feature;
+ "mdn-css-unicode-bidi-isolate": import("../data/features.js").Feature;
+ "mdn-css-unicode-bidi-isolate-override": import("../data/features.js").Feature;
+ "mdn-css-unicode-bidi-plaintext": import("../data/features.js").Feature;
+ "mdn-text-decoration-color": import("../data/features.js").Feature;
+ "mdn-text-decoration-line": import("../data/features.js").Feature;
+ "mdn-text-decoration-shorthand": import("../data/features.js").Feature;
+ "mdn-text-decoration-style": import("../data/features.js").Feature;
+ minmaxwh: import("../data/features.js").Feature;
+ multibackgrounds: import("../data/features.js").Feature;
+ multicolumn: import("../data/features.js").Feature;
+ "style-scoped": import("../data/features.js").Feature;
+ "svg-css": import("../data/features.js").Feature;
+ transforms2d: import("../data/features.js").Feature;
+ transforms3d: import("../data/features.js").Feature;
+ ttf: import("../data/features.js").Feature;
+ "user-select-none": import("../data/features.js").Feature;
+ "variable-fonts": import("../data/features.js").Feature;
+ "viewport-unit-variants": import("../data/features.js").Feature;
+ "viewport-units": import("../data/features.js").Feature;
+ wordwrap: import("../data/features.js").Feature;
+ } & string)[]);
+ /** @type {Partial<FEATURES>} */
+ features: Partial<{
+ outline: import("../data/features.js").Feature;
+ "background-attachment": import("../data/features.js").Feature;
+ pointer: import("../data/features.js").Feature;
+ "flow-root": import("../data/features.js").Feature;
+ "font-kerning": import("../data/features.js").Feature;
+ "font-smooth": import("../data/features.js").Feature;
+ "font-variant-alternates": import("../data/features.js").Feature;
+ "font-variant-numeric": import("../data/features.js").Feature;
+ "inline-block": import("../data/features.js").Feature;
+ "prefers-color-scheme": import("../data/features.js").Feature;
+ "prefers-reduced-motion": import("../data/features.js").Feature;
+ rem: import("../data/features.js").Feature;
+ "run-in": import("../data/features.js").Feature;
+ "text-emphasis": import("../data/features.js").Feature;
+ "text-stroke": import("../data/features.js").Feature;
+ "webkit-user-drag": import("../data/features.js").Feature;
+ "border-image": import("../data/features.js").Feature;
+ "border-radius": import("../data/features.js").Feature;
+ "font-size-adjust": import("../data/features.js").Feature;
+ "text-decoration": import("../data/features.js").Feature;
+ "object-fit": import("../data/features.js").Feature;
+ "pointer-events": import("../data/features.js").Feature;
+ "text-overflow": import("../data/features.js").Feature;
+ "text-size-adjust": import("../data/features.js").Feature;
+ "will-change": import("../data/features.js").Feature;
+ "word-break": import("../data/features.js").Feature;
+ "alternate-stylesheet": import("../data/features.js").Feature;
+ "background-clip-text": import("../data/features.js").Feature;
+ "background-img-opts": import("../data/features.js").Feature;
+ "background-position-x-y": import("../data/features.js").Feature;
+ "background-repeat-round-space": import("../data/features.js").Feature;
+ calc: import("../data/features.js").Feature;
+ "ch-unit": import("../data/features.js").Feature;
+ "css-all": import("../data/features.js").Feature;
+ "css-animation": import("../data/features.js").Feature;
+ "css-any-link": import("../data/features.js").Feature;
+ "css-appearance": import("../data/features.js").Feature;
+ "css-at-counter-style": import("../data/features.js").Feature;
+ "css-autofill": import("../data/features.js").Feature;
+ "css-backdrop-filter": import("../data/features.js").Feature;
+ "css-background-offsets": import("../data/features.js").Feature;
+ "css-backgroundblendmode": import("../data/features.js").Feature;
+ "css-boxdecorationbreak": import("../data/features.js").Feature;
+ "css-boxshadow": import("../data/features.js").Feature;
+ "css-canvas": import("../data/features.js").Feature;
+ "css-caret-color": import("../data/features.js").Feature;
+ "css-cascade-layers": import("../data/features.js").Feature;
+ "css-case-insensitive": import("../data/features.js").Feature;
+ "css-clip-path": import("../data/features.js").Feature;
+ "css-color-adjust": import("../data/features.js").Feature;
+ "css-color-function": import("../data/features.js").Feature;
+ "css-conic-gradients": import("../data/features.js").Feature;
+ "css-container-queries": import("../data/features.js").Feature;
+ "css-container-queries-style": import("../data/features.js").Feature;
+ "css-container-query-units": import("../data/features.js").Feature;
+ "css-containment": import("../data/features.js").Feature;
+ "css-content-visibility": import("../data/features.js").Feature;
+ "css-counters": import("../data/features.js").Feature;
+ "css-crisp-edges": import("../data/features.js").Feature;
+ "css-cross-fade": import("../data/features.js").Feature;
+ "css-default-pseudo": import("../data/features.js").Feature;
+ "css-descendant-gtgt": import("../data/features.js").Feature;
+ "css-deviceadaptation": import("../data/features.js").Feature;
+ "css-dir-pseudo": import("../data/features.js").Feature;
+ "css-display-contents": import("../data/features.js").Feature;
+ "css-element-function": import("../data/features.js").Feature;
+ "css-env-function": import("../data/features.js").Feature;
+ "css-exclusions": import("../data/features.js").Feature;
+ "css-featurequeries": import("../data/features.js").Feature;
+ "css-file-selector-button": import("../data/features.js").Feature;
+ "css-filter-function": import("../data/features.js").Feature;
+ "css-filters": import("../data/features.js").Feature;
+ "css-first-letter": import("../data/features.js").Feature;
+ "css-first-line": import("../data/features.js").Feature;
+ "css-fixed": import("../data/features.js").Feature;
+ "css-focus-visible": import("../data/features.js").Feature;
+ "css-focus-within": import("../data/features.js").Feature;
+ "css-font-palette": import("../data/features.js").Feature;
+ "css-font-rendering-controls": import("../data/features.js").Feature;
+ "css-font-stretch": import("../data/features.js").Feature;
+ "css-gencontent": import("../data/features.js").Feature;
+ "css-gradients": import("../data/features.js").Feature;
+ "css-grid": import("../data/features.js").Feature;
+ "css-grid-animation": import("../data/features.js").Feature;
+ "css-hanging-punctuation": import("../data/features.js").Feature;
+ "css-has": import("../data/features.js").Feature;
+ "css-hyphens": import("../data/features.js").Feature;
+ "css-image-orientation": import("../data/features.js").Feature;
+ "css-image-set": import("../data/features.js").Feature;
+ "css-in-out-of-range": import("../data/features.js").Feature;
+ "css-indeterminate-pseudo": import("../data/features.js").Feature;
+ "css-initial-letter": import("../data/features.js").Feature;
+ "css-initial-value": import("../data/features.js").Feature;
+ "css-lch-lab": import("../data/features.js").Feature;
+ "css-letter-spacing": import("../data/features.js").Feature;
+ "css-line-clamp": import("../data/features.js").Feature;
+ "css-logical-props": import("../data/features.js").Feature;
+ "css-marker-pseudo": import("../data/features.js").Feature;
+ "css-masks": import("../data/features.js").Feature;
+ "css-matches-pseudo": import("../data/features.js").Feature;
+ "css-math-functions": import("../data/features.js").Feature;
+ "css-media-interaction": import("../data/features.js").Feature;
+ "css-media-range-syntax": import("../data/features.js").Feature;
+ "css-media-resolution": import("../data/features.js").Feature;
+ "css-media-scripting": import("../data/features.js").Feature;
+ "css-mediaqueries": import("../data/features.js").Feature;
+ "css-mixblendmode": import("../data/features.js").Feature;
+ "css-motion-paths": import("../data/features.js").Feature;
+ "css-namespaces": import("../data/features.js").Feature;
+ "css-nesting": import("../data/features.js").Feature;
+ "css-not-sel-list": import("../data/features.js").Feature;
+ "css-nth-child-of": import("../data/features.js").Feature;
+ "css-opacity": import("../data/features.js").Feature;
+ "css-optional-pseudo": import("../data/features.js").Feature;
+ "css-overflow": import("../data/features.js").Feature;
+ "css-overflow-anchor": import("../data/features.js").Feature;
+ "css-overflow-overlay": import("../data/features.js").Feature;
+ "css-overscroll-behavior": import("../data/features.js").Feature;
+ "css-page-break": import("../data/features.js").Feature;
+ "css-paged-media": import("../data/features.js").Feature;
+ "css-paint-api": import("../data/features.js").Feature;
+ "css-placeholder": import("../data/features.js").Feature;
+ "css-placeholder-shown": import("../data/features.js").Feature;
+ "css-print-color-adjust": import("../data/features.js").Feature;
+ "css-read-only-write": import("../data/features.js").Feature;
+ "css-rebeccapurple": import("../data/features.js").Feature;
+ "css-reflections": import("../data/features.js").Feature;
+ "css-regions": import("../data/features.js").Feature;
+ "css-relative-colors": import("../data/features.js").Feature;
+ "css-repeating-gradients": import("../data/features.js").Feature;
+ "css-resize": import("../data/features.js").Feature;
+ "css-revert-value": import("../data/features.js").Feature;
+ "css-rrggbbaa": import("../data/features.js").Feature;
+ "css-scroll-behavior": import("../data/features.js").Feature;
+ "css-scroll-timeline": import("../data/features.js").Feature;
+ "css-scrollbar": import("../data/features.js").Feature;
+ "css-sel2": import("../data/features.js").Feature;
+ "css-sel3": import("../data/features.js").Feature;
+ "css-selection": import("../data/features.js").Feature;
+ "css-shapes": import("../data/features.js").Feature;
+ "css-snappoints": import("../data/features.js").Feature;
+ "css-sticky": import("../data/features.js").Feature;
+ "css-subgrid": import("../data/features.js").Feature;
+ "css-supports-api": import("../data/features.js").Feature;
+ "css-table": import("../data/features.js").Feature;
+ "css-text-align-last": import("../data/features.js").Feature;
+ "css-text-box-trim": import("../data/features.js").Feature;
+ "css-text-indent": import("../data/features.js").Feature;
+ "css-text-justify": import("../data/features.js").Feature;
+ "css-text-orientation": import("../data/features.js").Feature;
+ "css-text-spacing": import("../data/features.js").Feature;
+ "css-textshadow": import("../data/features.js").Feature;
+ "css-touch-action": import("../data/features.js").Feature;
+ "css-transitions": import("../data/features.js").Feature;
+ "css-unicode-bidi": import("../data/features.js").Feature;
+ "css-unset-value": import("../data/features.js").Feature;
+ "css-variables": import("../data/features.js").Feature;
+ "css-when-else": import("../data/features.js").Feature;
+ "css-widows-orphans": import("../data/features.js").Feature;
+ "css-width-stretch": import("../data/features.js").Feature;
+ "css-writing-mode": import("../data/features.js").Feature;
+ "css-zoom": import("../data/features.js").Feature;
+ "css3-attr": import("../data/features.js").Feature;
+ "css3-boxsizing": import("../data/features.js").Feature;
+ "css3-colors": import("../data/features.js").Feature;
+ "css3-cursors": import("../data/features.js").Feature;
+ "css3-cursors-grab": import("../data/features.js").Feature;
+ "css3-cursors-newer": import("../data/features.js").Feature;
+ "css3-tabsize": import("../data/features.js").Feature;
+ currentcolor: import("../data/features.js").Feature;
+ devicepixelratio: import("../data/features.js").Feature;
+ "extended-system-fonts": import("../data/features.js").Feature;
+ flexbox: import("../data/features.js").Feature;
+ "flexbox-gap": import("../data/features.js").Feature;
+ "font-family-system-ui": import("../data/features.js").Feature;
+ "font-feature": import("../data/features.js").Feature;
+ "font-loading": import("../data/features.js").Feature;
+ "font-unicode-range": import("../data/features.js").Feature;
+ fontface: import("../data/features.js").Feature;
+ fullscreen: import("../data/features.js").Feature;
+ getcomputedstyle: import("../data/features.js").Feature;
+ "intrinsic-width": import("../data/features.js").Feature;
+ "justify-content-space-evenly": import("../data/features.js").Feature;
+ "kerning-pairs-ligatures": import("../data/features.js").Feature;
+ "mdn-css-unicode-bidi-isolate": import("../data/features.js").Feature;
+ "mdn-css-unicode-bidi-isolate-override": import("../data/features.js").Feature;
+ "mdn-css-unicode-bidi-plaintext": import("../data/features.js").Feature;
+ "mdn-text-decoration-color": import("../data/features.js").Feature;
+ "mdn-text-decoration-line": import("../data/features.js").Feature;
+ "mdn-text-decoration-shorthand": import("../data/features.js").Feature;
+ "mdn-text-decoration-style": import("../data/features.js").Feature;
+ minmaxwh: import("../data/features.js").Feature;
+ multibackgrounds: import("../data/features.js").Feature;
+ multicolumn: import("../data/features.js").Feature;
+ "style-scoped": import("../data/features.js").Feature;
+ "svg-css": import("../data/features.js").Feature;
+ transforms2d: import("../data/features.js").Feature;
+ transforms3d: import("../data/features.js").Feature;
+ ttf: import("../data/features.js").Feature;
+ "user-select-none": import("../data/features.js").Feature;
+ "variable-fonts": import("../data/features.js").Feature;
+ "viewport-unit-variants": import("../data/features.js").Feature;
+ "viewport-units": import("../data/features.js").Feature;
+ wordwrap: import("../data/features.js").Feature;
+ }>;
+ /** @type {(keyof FEATURES & string)[]} */
+ ignore: (keyof {
+ outline: import("../data/features.js").Feature;
+ "background-attachment": import("../data/features.js").Feature;
+ pointer: import("../data/features.js").Feature;
+ "flow-root": import("../data/features.js").Feature;
+ "font-kerning": import("../data/features.js").Feature;
+ "font-smooth": import("../data/features.js").Feature;
+ "font-variant-alternates": import("../data/features.js").Feature;
+ "font-variant-numeric": import("../data/features.js").Feature;
+ "inline-block": import("../data/features.js").Feature;
+ "prefers-color-scheme": import("../data/features.js").Feature;
+ "prefers-reduced-motion": import("../data/features.js").Feature;
+ rem: import("../data/features.js").Feature;
+ "run-in": import("../data/features.js").Feature;
+ "text-emphasis": import("../data/features.js").Feature;
+ "text-stroke": import("../data/features.js").Feature;
+ "webkit-user-drag": import("../data/features.js").Feature;
+ "border-image": import("../data/features.js").Feature;
+ "border-radius": import("../data/features.js").Feature;
+ "font-size-adjust": import("../data/features.js").Feature;
+ "text-decoration": import("../data/features.js").Feature;
+ "object-fit": import("../data/features.js").Feature;
+ "pointer-events": import("../data/features.js").Feature;
+ "text-overflow": import("../data/features.js").Feature;
+ "text-size-adjust": import("../data/features.js").Feature;
+ "will-change": import("../data/features.js").Feature;
+ "word-break": import("../data/features.js").Feature;
+ "alternate-stylesheet": import("../data/features.js").Feature;
+ "background-clip-text": import("../data/features.js").Feature;
+ "background-img-opts": import("../data/features.js").Feature;
+ "background-position-x-y": import("../data/features.js").Feature;
+ "background-repeat-round-space": import("../data/features.js").Feature;
+ calc: import("../data/features.js").Feature;
+ "ch-unit": import("../data/features.js").Feature;
+ "css-all": import("../data/features.js").Feature;
+ "css-animation": import("../data/features.js").Feature;
+ "css-any-link": import("../data/features.js").Feature;
+ "css-appearance": import("../data/features.js").Feature;
+ "css-at-counter-style": import("../data/features.js").Feature;
+ "css-autofill": import("../data/features.js").Feature;
+ "css-backdrop-filter": import("../data/features.js").Feature;
+ "css-background-offsets": import("../data/features.js").Feature;
+ "css-backgroundblendmode": import("../data/features.js").Feature;
+ "css-boxdecorationbreak": import("../data/features.js").Feature;
+ "css-boxshadow": import("../data/features.js").Feature;
+ "css-canvas": import("../data/features.js").Feature;
+ "css-caret-color": import("../data/features.js").Feature;
+ "css-cascade-layers": import("../data/features.js").Feature;
+ "css-case-insensitive": import("../data/features.js").Feature;
+ "css-clip-path": import("../data/features.js").Feature;
+ "css-color-adjust": import("../data/features.js").Feature;
+ "css-color-function": import("../data/features.js").Feature;
+ "css-conic-gradients": import("../data/features.js").Feature;
+ "css-container-queries": import("../data/features.js").Feature;
+ "css-container-queries-style": import("../data/features.js").Feature;
+ "css-container-query-units": import("../data/features.js").Feature;
+ "css-containment": import("../data/features.js").Feature;
+ "css-content-visibility": import("../data/features.js").Feature;
+ "css-counters": import("../data/features.js").Feature;
+ "css-crisp-edges": import("../data/features.js").Feature;
+ "css-cross-fade": import("../data/features.js").Feature;
+ "css-default-pseudo": import("../data/features.js").Feature;
+ "css-descendant-gtgt": import("../data/features.js").Feature;
+ "css-deviceadaptation": import("../data/features.js").Feature;
+ "css-dir-pseudo": import("../data/features.js").Feature;
+ "css-display-contents": import("../data/features.js").Feature;
+ "css-element-function": import("../data/features.js").Feature;
+ "css-env-function": import("../data/features.js").Feature;
+ "css-exclusions": import("../data/features.js").Feature;
+ "css-featurequeries": import("../data/features.js").Feature;
+ "css-file-selector-button": import("../data/features.js").Feature;
+ "css-filter-function": import("../data/features.js").Feature;
+ "css-filters": import("../data/features.js").Feature;
+ "css-first-letter": import("../data/features.js").Feature;
+ "css-first-line": import("../data/features.js").Feature;
+ "css-fixed": import("../data/features.js").Feature;
+ "css-focus-visible": import("../data/features.js").Feature;
+ "css-focus-within": import("../data/features.js").Feature;
+ "css-font-palette": import("../data/features.js").Feature;
+ "css-font-rendering-controls": import("../data/features.js").Feature;
+ "css-font-stretch": import("../data/features.js").Feature;
+ "css-gencontent": import("../data/features.js").Feature;
+ "css-gradients": import("../data/features.js").Feature;
+ "css-grid": import("../data/features.js").Feature;
+ "css-grid-animation": import("../data/features.js").Feature;
+ "css-hanging-punctuation": import("../data/features.js").Feature;
+ "css-has": import("../data/features.js").Feature;
+ "css-hyphens": import("../data/features.js").Feature;
+ "css-image-orientation": import("../data/features.js").Feature;
+ "css-image-set": import("../data/features.js").Feature;
+ "css-in-out-of-range": import("../data/features.js").Feature;
+ "css-indeterminate-pseudo": import("../data/features.js").Feature;
+ "css-initial-letter": import("../data/features.js").Feature;
+ "css-initial-value": import("../data/features.js").Feature;
+ "css-lch-lab": import("../data/features.js").Feature;
+ "css-letter-spacing": import("../data/features.js").Feature;
+ "css-line-clamp": import("../data/features.js").Feature;
+ "css-logical-props": import("../data/features.js").Feature;
+ "css-marker-pseudo": import("../data/features.js").Feature;
+ "css-masks": import("../data/features.js").Feature;
+ "css-matches-pseudo": import("../data/features.js").Feature;
+ "css-math-functions": import("../data/features.js").Feature;
+ "css-media-interaction": import("../data/features.js").Feature;
+ "css-media-range-syntax": import("../data/features.js").Feature;
+ "css-media-resolution": import("../data/features.js").Feature;
+ "css-media-scripting": import("../data/features.js").Feature;
+ "css-mediaqueries": import("../data/features.js").Feature;
+ "css-mixblendmode": import("../data/features.js").Feature;
+ "css-motion-paths": import("../data/features.js").Feature;
+ "css-namespaces": import("../data/features.js").Feature;
+ "css-nesting": import("../data/features.js").Feature;
+ "css-not-sel-list": import("../data/features.js").Feature;
+ "css-nth-child-of": import("../data/features.js").Feature;
+ "css-opacity": import("../data/features.js").Feature;
+ "css-optional-pseudo": import("../data/features.js").Feature;
+ "css-overflow": import("../data/features.js").Feature;
+ "css-overflow-anchor": import("../data/features.js").Feature;
+ "css-overflow-overlay": import("../data/features.js").Feature;
+ "css-overscroll-behavior": import("../data/features.js").Feature;
+ "css-page-break": import("../data/features.js").Feature;
+ "css-paged-media": import("../data/features.js").Feature;
+ "css-paint-api": import("../data/features.js").Feature;
+ "css-placeholder": import("../data/features.js").Feature;
+ "css-placeholder-shown": import("../data/features.js").Feature;
+ "css-print-color-adjust": import("../data/features.js").Feature;
+ "css-read-only-write": import("../data/features.js").Feature;
+ "css-rebeccapurple": import("../data/features.js").Feature;
+ "css-reflections": import("../data/features.js").Feature;
+ "css-regions": import("../data/features.js").Feature;
+ "css-relative-colors": import("../data/features.js").Feature;
+ "css-repeating-gradients": import("../data/features.js").Feature;
+ "css-resize": import("../data/features.js").Feature;
+ "css-revert-value": import("../data/features.js").Feature;
+ "css-rrggbbaa": import("../data/features.js").Feature;
+ "css-scroll-behavior": import("../data/features.js").Feature;
+ "css-scroll-timeline": import("../data/features.js").Feature;
+ "css-scrollbar": import("../data/features.js").Feature;
+ "css-sel2": import("../data/features.js").Feature;
+ "css-sel3": import("../data/features.js").Feature;
+ "css-selection": import("../data/features.js").Feature;
+ "css-shapes": import("../data/features.js").Feature;
+ "css-snappoints": import("../data/features.js").Feature;
+ "css-sticky": import("../data/features.js").Feature;
+ "css-subgrid": import("../data/features.js").Feature;
+ "css-supports-api": import("../data/features.js").Feature;
+ "css-table": import("../data/features.js").Feature;
+ "css-text-align-last": import("../data/features.js").Feature;
+ "css-text-box-trim": import("../data/features.js").Feature;
+ "css-text-indent": import("../data/features.js").Feature;
+ "css-text-justify": import("../data/features.js").Feature;
+ "css-text-orientation": import("../data/features.js").Feature;
+ "css-text-spacing": import("../data/features.js").Feature;
+ "css-textshadow": import("../data/features.js").Feature;
+ "css-touch-action": import("../data/features.js").Feature;
+ "css-transitions": import("../data/features.js").Feature;
+ "css-unicode-bidi": import("../data/features.js").Feature;
+ "css-unset-value": import("../data/features.js").Feature;
+ "css-variables": import("../data/features.js").Feature;
+ "css-when-else": import("../data/features.js").Feature;
+ "css-widows-orphans": import("../data/features.js").Feature;
+ "css-width-stretch": import("../data/features.js").Feature;
+ "css-writing-mode": import("../data/features.js").Feature;
+ "css-zoom": import("../data/features.js").Feature;
+ "css3-attr": import("../data/features.js").Feature;
+ "css3-boxsizing": import("../data/features.js").Feature;
+ "css3-colors": import("../data/features.js").Feature;
+ "css3-cursors": import("../data/features.js").Feature;
+ "css3-cursors-grab": import("../data/features.js").Feature;
+ "css3-cursors-newer": import("../data/features.js").Feature;
+ "css3-tabsize": import("../data/features.js").Feature;
+ currentcolor: import("../data/features.js").Feature;
+ devicepixelratio: import("../data/features.js").Feature;
+ "extended-system-fonts": import("../data/features.js").Feature;
+ flexbox: import("../data/features.js").Feature;
+ "flexbox-gap": import("../data/features.js").Feature;
+ "font-family-system-ui": import("../data/features.js").Feature;
+ "font-feature": import("../data/features.js").Feature;
+ "font-loading": import("../data/features.js").Feature;
+ "font-unicode-range": import("../data/features.js").Feature;
+ fontface: import("../data/features.js").Feature;
+ fullscreen: import("../data/features.js").Feature;
+ getcomputedstyle: import("../data/features.js").Feature;
+ "intrinsic-width": import("../data/features.js").Feature;
+ "justify-content-space-evenly": import("../data/features.js").Feature;
+ "kerning-pairs-ligatures": import("../data/features.js").Feature;
+ "mdn-css-unicode-bidi-isolate": import("../data/features.js").Feature;
+ "mdn-css-unicode-bidi-isolate-override": import("../data/features.js").Feature;
+ "mdn-css-unicode-bidi-plaintext": import("../data/features.js").Feature;
+ "mdn-text-decoration-color": import("../data/features.js").Feature;
+ "mdn-text-decoration-line": import("../data/features.js").Feature;
+ "mdn-text-decoration-shorthand": import("../data/features.js").Feature;
+ "mdn-text-decoration-style": import("../data/features.js").Feature;
+ minmaxwh: import("../data/features.js").Feature;
+ multibackgrounds: import("../data/features.js").Feature;
+ multicolumn: import("../data/features.js").Feature;
+ "style-scoped": import("../data/features.js").Feature;
+ "svg-css": import("../data/features.js").Feature;
+ transforms2d: import("../data/features.js").Feature;
+ transforms3d: import("../data/features.js").Feature;
+ ttf: import("../data/features.js").Feature;
+ "user-select-none": import("../data/features.js").Feature;
+ "variable-fonts": import("../data/features.js").Feature;
+ "viewport-unit-variants": import("../data/features.js").Feature;
+ "viewport-units": import("../data/features.js").Feature;
+ wordwrap: import("../data/features.js").Feature;
+ } & string)[];
+ /**
+ * @param {import('postcss').Comment} comment
+ * @return {void}
+ */
+ comment(comment: import('postcss').Comment): void;
+ /**
+ * @param {import('postcss').Container} node
+ * @param {DetectorCallback} callback
+ * @return {void}
+ */
+ node(node: import('postcss').Container, callback: DetectorCallback): void;
+ /**
+ * @param {import('postcss').Root} node
+ * @param {DetectorCallback} callback
+ * @return {void}
+ */
+ process(node: import('postcss').Root, callback: DetectorCallback): void;
+}
+export type DetectorCallbackArgument = {
+ usage: import('postcss').ChildNode;
+ feature: keyof {
+ outline: import("../data/features.js").Feature;
+ "background-attachment": import("../data/features.js").Feature;
+ pointer: import("../data/features.js").Feature;
+ "flow-root": import("../data/features.js").Feature;
+ "font-kerning": import("../data/features.js").Feature;
+ "font-smooth": import("../data/features.js").Feature;
+ "font-variant-alternates": import("../data/features.js").Feature;
+ "font-variant-numeric": import("../data/features.js").Feature;
+ "inline-block": import("../data/features.js").Feature;
+ "prefers-color-scheme": import("../data/features.js").Feature;
+ "prefers-reduced-motion": import("../data/features.js").Feature;
+ rem: import("../data/features.js").Feature;
+ "run-in": import("../data/features.js").Feature;
+ "text-emphasis": import("../data/features.js").Feature;
+ "text-stroke": import("../data/features.js").Feature;
+ "webkit-user-drag": import("../data/features.js").Feature;
+ "border-image": import("../data/features.js").Feature;
+ "border-radius": import("../data/features.js").Feature;
+ "font-size-adjust": import("../data/features.js").Feature;
+ "text-decoration": import("../data/features.js").Feature;
+ "object-fit": import("../data/features.js").Feature;
+ "pointer-events": import("../data/features.js").Feature;
+ "text-overflow": import("../data/features.js").Feature;
+ "text-size-adjust": import("../data/features.js").Feature;
+ "will-change": import("../data/features.js").Feature;
+ "word-break": import("../data/features.js").Feature;
+ "alternate-stylesheet": import("../data/features.js").Feature;
+ "background-clip-text": import("../data/features.js").Feature;
+ "background-img-opts": import("../data/features.js").Feature;
+ "background-position-x-y": import("../data/features.js").Feature;
+ "background-repeat-round-space": import("../data/features.js").Feature;
+ calc: import("../data/features.js").Feature;
+ "ch-unit": import("../data/features.js").Feature;
+ "css-all": import("../data/features.js").Feature;
+ "css-animation": import("../data/features.js").Feature;
+ "css-any-link": import("../data/features.js").Feature;
+ "css-appearance": import("../data/features.js").Feature;
+ "css-at-counter-style": import("../data/features.js").Feature;
+ "css-autofill": import("../data/features.js").Feature;
+ "css-backdrop-filter": import("../data/features.js").Feature;
+ "css-background-offsets": import("../data/features.js").Feature;
+ "css-backgroundblendmode": import("../data/features.js").Feature;
+ "css-boxdecorationbreak": import("../data/features.js").Feature;
+ "css-boxshadow": import("../data/features.js").Feature;
+ "css-canvas": import("../data/features.js").Feature;
+ "css-caret-color": import("../data/features.js").Feature;
+ "css-cascade-layers": import("../data/features.js").Feature;
+ "css-case-insensitive": import("../data/features.js").Feature;
+ "css-clip-path": import("../data/features.js").Feature;
+ "css-color-adjust": import("../data/features.js").Feature;
+ "css-color-function": import("../data/features.js").Feature;
+ "css-conic-gradients": import("../data/features.js").Feature;
+ "css-container-queries": import("../data/features.js").Feature;
+ "css-container-queries-style": import("../data/features.js").Feature;
+ "css-container-query-units": import("../data/features.js").Feature;
+ "css-containment": import("../data/features.js").Feature;
+ "css-content-visibility": import("../data/features.js").Feature;
+ "css-counters": import("../data/features.js").Feature;
+ "css-crisp-edges": import("../data/features.js").Feature;
+ "css-cross-fade": import("../data/features.js").Feature;
+ "css-default-pseudo": import("../data/features.js").Feature;
+ "css-descendant-gtgt": import("../data/features.js").Feature;
+ "css-deviceadaptation": import("../data/features.js").Feature;
+ "css-dir-pseudo": import("../data/features.js").Feature;
+ "css-display-contents": import("../data/features.js").Feature;
+ "css-element-function": import("../data/features.js").Feature;
+ "css-env-function": import("../data/features.js").Feature;
+ "css-exclusions": import("../data/features.js").Feature;
+ "css-featurequeries": import("../data/features.js").Feature;
+ "css-file-selector-button": import("../data/features.js").Feature;
+ "css-filter-function": import("../data/features.js").Feature;
+ "css-filters": import("../data/features.js").Feature;
+ "css-first-letter": import("../data/features.js").Feature;
+ "css-first-line": import("../data/features.js").Feature;
+ "css-fixed": import("../data/features.js").Feature;
+ "css-focus-visible": import("../data/features.js").Feature;
+ "css-focus-within": import("../data/features.js").Feature;
+ "css-font-palette": import("../data/features.js").Feature;
+ "css-font-rendering-controls": import("../data/features.js").Feature;
+ "css-font-stretch": import("../data/features.js").Feature;
+ "css-gencontent": import("../data/features.js").Feature;
+ "css-gradients": import("../data/features.js").Feature;
+ "css-grid": import("../data/features.js").Feature;
+ "css-grid-animation": import("../data/features.js").Feature;
+ "css-hanging-punctuation": import("../data/features.js").Feature;
+ "css-has": import("../data/features.js").Feature;
+ "css-hyphens": import("../data/features.js").Feature;
+ "css-image-orientation": import("../data/features.js").Feature;
+ "css-image-set": import("../data/features.js").Feature;
+ "css-in-out-of-range": import("../data/features.js").Feature;
+ "css-indeterminate-pseudo": import("../data/features.js").Feature;
+ "css-initial-letter": import("../data/features.js").Feature;
+ "css-initial-value": import("../data/features.js").Feature;
+ "css-lch-lab": import("../data/features.js").Feature;
+ "css-letter-spacing": import("../data/features.js").Feature;
+ "css-line-clamp": import("../data/features.js").Feature;
+ "css-logical-props": import("../data/features.js").Feature;
+ "css-marker-pseudo": import("../data/features.js").Feature;
+ "css-masks": import("../data/features.js").Feature;
+ "css-matches-pseudo": import("../data/features.js").Feature;
+ "css-math-functions": import("../data/features.js").Feature;
+ "css-media-interaction": import("../data/features.js").Feature;
+ "css-media-range-syntax": import("../data/features.js").Feature;
+ "css-media-resolution": import("../data/features.js").Feature;
+ "css-media-scripting": import("../data/features.js").Feature;
+ "css-mediaqueries": import("../data/features.js").Feature;
+ "css-mixblendmode": import("../data/features.js").Feature;
+ "css-motion-paths": import("../data/features.js").Feature;
+ "css-namespaces": import("../data/features.js").Feature;
+ "css-nesting": import("../data/features.js").Feature;
+ "css-not-sel-list": import("../data/features.js").Feature;
+ "css-nth-child-of": import("../data/features.js").Feature;
+ "css-opacity": import("../data/features.js").Feature;
+ "css-optional-pseudo": import("../data/features.js").Feature;
+ "css-overflow": import("../data/features.js").Feature;
+ "css-overflow-anchor": import("../data/features.js").Feature;
+ "css-overflow-overlay": import("../data/features.js").Feature;
+ "css-overscroll-behavior": import("../data/features.js").Feature;
+ "css-page-break": import("../data/features.js").Feature;
+ "css-paged-media": import("../data/features.js").Feature;
+ "css-paint-api": import("../data/features.js").Feature;
+ "css-placeholder": import("../data/features.js").Feature;
+ "css-placeholder-shown": import("../data/features.js").Feature;
+ "css-print-color-adjust": import("../data/features.js").Feature;
+ "css-read-only-write": import("../data/features.js").Feature;
+ "css-rebeccapurple": import("../data/features.js").Feature;
+ "css-reflections": import("../data/features.js").Feature;
+ "css-regions": import("../data/features.js").Feature;
+ "css-relative-colors": import("../data/features.js").Feature;
+ "css-repeating-gradients": import("../data/features.js").Feature;
+ "css-resize": import("../data/features.js").Feature;
+ "css-revert-value": import("../data/features.js").Feature;
+ "css-rrggbbaa": import("../data/features.js").Feature;
+ "css-scroll-behavior": import("../data/features.js").Feature;
+ "css-scroll-timeline": import("../data/features.js").Feature;
+ "css-scrollbar": import("../data/features.js").Feature;
+ "css-sel2": import("../data/features.js").Feature;
+ "css-sel3": import("../data/features.js").Feature;
+ "css-selection": import("../data/features.js").Feature;
+ "css-shapes": import("../data/features.js").Feature;
+ "css-snappoints": import("../data/features.js").Feature;
+ "css-sticky": import("../data/features.js").Feature;
+ "css-subgrid": import("../data/features.js").Feature;
+ "css-supports-api": import("../data/features.js").Feature;
+ "css-table": import("../data/features.js").Feature;
+ "css-text-align-last": import("../data/features.js").Feature;
+ "css-text-box-trim": import("../data/features.js").Feature;
+ "css-text-indent": import("../data/features.js").Feature;
+ "css-text-justify": import("../data/features.js").Feature;
+ "css-text-orientation": import("../data/features.js").Feature;
+ "css-text-spacing": import("../data/features.js").Feature;
+ "css-textshadow": import("../data/features.js").Feature;
+ "css-touch-action": import("../data/features.js").Feature;
+ "css-transitions": import("../data/features.js").Feature;
+ "css-unicode-bidi": import("../data/features.js").Feature;
+ "css-unset-value": import("../data/features.js").Feature;
+ "css-variables": import("../data/features.js").Feature;
+ "css-when-else": import("../data/features.js").Feature;
+ "css-widows-orphans": import("../data/features.js").Feature;
+ "css-width-stretch": import("../data/features.js").Feature;
+ "css-writing-mode": import("../data/features.js").Feature;
+ "css-zoom": import("../data/features.js").Feature;
+ "css3-attr": import("../data/features.js").Feature;
+ "css3-boxsizing": import("../data/features.js").Feature;
+ "css3-colors": import("../data/features.js").Feature;
+ "css3-cursors": import("../data/features.js").Feature;
+ "css3-cursors-grab": import("../data/features.js").Feature;
+ "css3-cursors-newer": import("../data/features.js").Feature;
+ "css3-tabsize": import("../data/features.js").Feature;
+ currentcolor: import("../data/features.js").Feature;
+ devicepixelratio: import("../data/features.js").Feature;
+ "extended-system-fonts": import("../data/features.js").Feature;
+ flexbox: import("../data/features.js").Feature;
+ "flexbox-gap": import("../data/features.js").Feature;
+ "font-family-system-ui": import("../data/features.js").Feature;
+ "font-feature": import("../data/features.js").Feature;
+ "font-loading": import("../data/features.js").Feature;
+ "font-unicode-range": import("../data/features.js").Feature;
+ fontface: import("../data/features.js").Feature;
+ fullscreen: import("../data/features.js").Feature;
+ getcomputedstyle: import("../data/features.js").Feature;
+ "intrinsic-width": import("../data/features.js").Feature;
+ "justify-content-space-evenly": import("../data/features.js").Feature;
+ "kerning-pairs-ligatures": import("../data/features.js").Feature;
+ "mdn-css-unicode-bidi-isolate": import("../data/features.js").Feature;
+ "mdn-css-unicode-bidi-isolate-override": import("../data/features.js").Feature;
+ "mdn-css-unicode-bidi-plaintext": import("../data/features.js").Feature;
+ "mdn-text-decoration-color": import("../data/features.js").Feature;
+ "mdn-text-decoration-line": import("../data/features.js").Feature;
+ "mdn-text-decoration-shorthand": import("../data/features.js").Feature;
+ "mdn-text-decoration-style": import("../data/features.js").Feature;
+ minmaxwh: import("../data/features.js").Feature;
+ multibackgrounds: import("../data/features.js").Feature;
+ multicolumn: import("../data/features.js").Feature;
+ "style-scoped": import("../data/features.js").Feature;
+ "svg-css": import("../data/features.js").Feature;
+ transforms2d: import("../data/features.js").Feature;
+ transforms3d: import("../data/features.js").Feature;
+ ttf: import("../data/features.js").Feature;
+ "user-select-none": import("../data/features.js").Feature;
+ "variable-fonts": import("../data/features.js").Feature;
+ "viewport-unit-variants": import("../data/features.js").Feature;
+ "viewport-units": import("../data/features.js").Feature;
+ wordwrap: import("../data/features.js").Feature;
+ };
+ ignore: (keyof {
+ outline: import("../data/features.js").Feature;
+ "background-attachment": import("../data/features.js").Feature;
+ pointer: import("../data/features.js").Feature;
+ "flow-root": import("../data/features.js").Feature;
+ "font-kerning": import("../data/features.js").Feature;
+ "font-smooth": import("../data/features.js").Feature;
+ "font-variant-alternates": import("../data/features.js").Feature;
+ "font-variant-numeric": import("../data/features.js").Feature;
+ "inline-block": import("../data/features.js").Feature;
+ "prefers-color-scheme": import("../data/features.js").Feature;
+ "prefers-reduced-motion": import("../data/features.js").Feature;
+ rem: import("../data/features.js").Feature;
+ "run-in": import("../data/features.js").Feature;
+ "text-emphasis": import("../data/features.js").Feature;
+ "text-stroke": import("../data/features.js").Feature;
+ "webkit-user-drag": import("../data/features.js").Feature;
+ "border-image": import("../data/features.js").Feature;
+ "border-radius": import("../data/features.js").Feature;
+ "font-size-adjust": import("../data/features.js").Feature;
+ "text-decoration": import("../data/features.js").Feature;
+ "object-fit": import("../data/features.js").Feature;
+ "pointer-events": import("../data/features.js").Feature;
+ "text-overflow": import("../data/features.js").Feature;
+ "text-size-adjust": import("../data/features.js").Feature;
+ "will-change": import("../data/features.js").Feature;
+ "word-break": import("../data/features.js").Feature;
+ "alternate-stylesheet": import("../data/features.js").Feature;
+ "background-clip-text": import("../data/features.js").Feature;
+ "background-img-opts": import("../data/features.js").Feature;
+ "background-position-x-y": import("../data/features.js").Feature;
+ "background-repeat-round-space": import("../data/features.js").Feature;
+ calc: import("../data/features.js").Feature;
+ "ch-unit": import("../data/features.js").Feature;
+ "css-all": import("../data/features.js").Feature;
+ "css-animation": import("../data/features.js").Feature;
+ "css-any-link": import("../data/features.js").Feature;
+ "css-appearance": import("../data/features.js").Feature;
+ "css-at-counter-style": import("../data/features.js").Feature;
+ "css-autofill": import("../data/features.js").Feature;
+ "css-backdrop-filter": import("../data/features.js").Feature;
+ "css-background-offsets": import("../data/features.js").Feature;
+ "css-backgroundblendmode": import("../data/features.js").Feature;
+ "css-boxdecorationbreak": import("../data/features.js").Feature;
+ "css-boxshadow": import("../data/features.js").Feature;
+ "css-canvas": import("../data/features.js").Feature;
+ "css-caret-color": import("../data/features.js").Feature;
+ "css-cascade-layers": import("../data/features.js").Feature;
+ "css-case-insensitive": import("../data/features.js").Feature;
+ "css-clip-path": import("../data/features.js").Feature;
+ "css-color-adjust": import("../data/features.js").Feature;
+ "css-color-function": import("../data/features.js").Feature;
+ "css-conic-gradients": import("../data/features.js").Feature;
+ "css-container-queries": import("../data/features.js").Feature;
+ "css-container-queries-style": import("../data/features.js").Feature;
+ "css-container-query-units": import("../data/features.js").Feature;
+ "css-containment": import("../data/features.js").Feature;
+ "css-content-visibility": import("../data/features.js").Feature;
+ "css-counters": import("../data/features.js").Feature;
+ "css-crisp-edges": import("../data/features.js").Feature;
+ "css-cross-fade": import("../data/features.js").Feature;
+ "css-default-pseudo": import("../data/features.js").Feature;
+ "css-descendant-gtgt": import("../data/features.js").Feature;
+ "css-deviceadaptation": import("../data/features.js").Feature;
+ "css-dir-pseudo": import("../data/features.js").Feature;
+ "css-display-contents": import("../data/features.js").Feature;
+ "css-element-function": import("../data/features.js").Feature;
+ "css-env-function": import("../data/features.js").Feature;
+ "css-exclusions": import("../data/features.js").Feature;
+ "css-featurequeries": import("../data/features.js").Feature;
+ "css-file-selector-button": import("../data/features.js").Feature;
+ "css-filter-function": import("../data/features.js").Feature;
+ "css-filters": import("../data/features.js").Feature;
+ "css-first-letter": import("../data/features.js").Feature;
+ "css-first-line": import("../data/features.js").Feature;
+ "css-fixed": import("../data/features.js").Feature;
+ "css-focus-visible": import("../data/features.js").Feature;
+ "css-focus-within": import("../data/features.js").Feature;
+ "css-font-palette": import("../data/features.js").Feature;
+ "css-font-rendering-controls": import("../data/features.js").Feature;
+ "css-font-stretch": import("../data/features.js").Feature;
+ "css-gencontent": import("../data/features.js").Feature;
+ "css-gradients": import("../data/features.js").Feature;
+ "css-grid": import("../data/features.js").Feature;
+ "css-grid-animation": import("../data/features.js").Feature;
+ "css-hanging-punctuation": import("../data/features.js").Feature;
+ "css-has": import("../data/features.js").Feature;
+ "css-hyphens": import("../data/features.js").Feature;
+ "css-image-orientation": import("../data/features.js").Feature;
+ "css-image-set": import("../data/features.js").Feature;
+ "css-in-out-of-range": import("../data/features.js").Feature;
+ "css-indeterminate-pseudo": import("../data/features.js").Feature;
+ "css-initial-letter": import("../data/features.js").Feature;
+ "css-initial-value": import("../data/features.js").Feature;
+ "css-lch-lab": import("../data/features.js").Feature;
+ "css-letter-spacing": import("../data/features.js").Feature;
+ "css-line-clamp": import("../data/features.js").Feature;
+ "css-logical-props": import("../data/features.js").Feature;
+ "css-marker-pseudo": import("../data/features.js").Feature;
+ "css-masks": import("../data/features.js").Feature;
+ "css-matches-pseudo": import("../data/features.js").Feature;
+ "css-math-functions": import("../data/features.js").Feature;
+ "css-media-interaction": import("../data/features.js").Feature;
+ "css-media-range-syntax": import("../data/features.js").Feature;
+ "css-media-resolution": import("../data/features.js").Feature;
+ "css-media-scripting": import("../data/features.js").Feature;
+ "css-mediaqueries": import("../data/features.js").Feature;
+ "css-mixblendmode": import("../data/features.js").Feature;
+ "css-motion-paths": import("../data/features.js").Feature;
+ "css-namespaces": import("../data/features.js").Feature;
+ "css-nesting": import("../data/features.js").Feature;
+ "css-not-sel-list": import("../data/features.js").Feature;
+ "css-nth-child-of": import("../data/features.js").Feature;
+ "css-opacity": import("../data/features.js").Feature;
+ "css-optional-pseudo": import("../data/features.js").Feature;
+ "css-overflow": import("../data/features.js").Feature;
+ "css-overflow-anchor": import("../data/features.js").Feature;
+ "css-overflow-overlay": import("../data/features.js").Feature;
+ "css-overscroll-behavior": import("../data/features.js").Feature;
+ "css-page-break": import("../data/features.js").Feature;
+ "css-paged-media": import("../data/features.js").Feature;
+ "css-paint-api": import("../data/features.js").Feature;
+ "css-placeholder": import("../data/features.js").Feature;
+ "css-placeholder-shown": import("../data/features.js").Feature;
+ "css-print-color-adjust": import("../data/features.js").Feature;
+ "css-read-only-write": import("../data/features.js").Feature;
+ "css-rebeccapurple": import("../data/features.js").Feature;
+ "css-reflections": import("../data/features.js").Feature;
+ "css-regions": import("../data/features.js").Feature;
+ "css-relative-colors": import("../data/features.js").Feature;
+ "css-repeating-gradients": import("../data/features.js").Feature;
+ "css-resize": import("../data/features.js").Feature;
+ "css-revert-value": import("../data/features.js").Feature;
+ "css-rrggbbaa": import("../data/features.js").Feature;
+ "css-scroll-behavior": import("../data/features.js").Feature;
+ "css-scroll-timeline": import("../data/features.js").Feature;
+ "css-scrollbar": import("../data/features.js").Feature;
+ "css-sel2": import("../data/features.js").Feature;
+ "css-sel3": import("../data/features.js").Feature;
+ "css-selection": import("../data/features.js").Feature;
+ "css-shapes": import("../data/features.js").Feature;
+ "css-snappoints": import("../data/features.js").Feature;
+ "css-sticky": import("../data/features.js").Feature;
+ "css-subgrid": import("../data/features.js").Feature;
+ "css-supports-api": import("../data/features.js").Feature;
+ "css-table": import("../data/features.js").Feature;
+ "css-text-align-last": import("../data/features.js").Feature;
+ "css-text-box-trim": import("../data/features.js").Feature;
+ "css-text-indent": import("../data/features.js").Feature;
+ "css-text-justify": import("../data/features.js").Feature;
+ "css-text-orientation": import("../data/features.js").Feature;
+ "css-text-spacing": import("../data/features.js").Feature;
+ "css-textshadow": import("../data/features.js").Feature;
+ "css-touch-action": import("../data/features.js").Feature;
+ "css-transitions": import("../data/features.js").Feature;
+ "css-unicode-bidi": import("../data/features.js").Feature;
+ "css-unset-value": import("../data/features.js").Feature;
+ "css-variables": import("../data/features.js").Feature;
+ "css-when-else": import("../data/features.js").Feature;
+ "css-widows-orphans": import("../data/features.js").Feature;
+ "css-width-stretch": import("../data/features.js").Feature;
+ "css-writing-mode": import("../data/features.js").Feature;
+ "css-zoom": import("../data/features.js").Feature;
+ "css3-attr": import("../data/features.js").Feature;
+ "css3-boxsizing": import("../data/features.js").Feature;
+ "css3-colors": import("../data/features.js").Feature;
+ "css3-cursors": import("../data/features.js").Feature;
+ "css3-cursors-grab": import("../data/features.js").Feature;
+ "css3-cursors-newer": import("../data/features.js").Feature;
+ "css3-tabsize": import("../data/features.js").Feature;
+ currentcolor: import("../data/features.js").Feature;
+ devicepixelratio: import("../data/features.js").Feature;
+ "extended-system-fonts": import("../data/features.js").Feature;
+ flexbox: import("../data/features.js").Feature;
+ "flexbox-gap": import("../data/features.js").Feature;
+ "font-family-system-ui": import("../data/features.js").Feature;
+ "font-feature": import("../data/features.js").Feature;
+ "font-loading": import("../data/features.js").Feature;
+ "font-unicode-range": import("../data/features.js").Feature;
+ fontface: import("../data/features.js").Feature;
+ fullscreen: import("../data/features.js").Feature;
+ getcomputedstyle: import("../data/features.js").Feature;
+ "intrinsic-width": import("../data/features.js").Feature;
+ "justify-content-space-evenly": import("../data/features.js").Feature;
+ "kerning-pairs-ligatures": import("../data/features.js").Feature;
+ "mdn-css-unicode-bidi-isolate": import("../data/features.js").Feature;
+ "mdn-css-unicode-bidi-isolate-override": import("../data/features.js").Feature;
+ "mdn-css-unicode-bidi-plaintext": import("../data/features.js").Feature;
+ "mdn-text-decoration-color": import("../data/features.js").Feature;
+ "mdn-text-decoration-line": import("../data/features.js").Feature;
+ "mdn-text-decoration-shorthand": import("../data/features.js").Feature;
+ "mdn-text-decoration-style": import("../data/features.js").Feature;
+ minmaxwh: import("../data/features.js").Feature;
+ multibackgrounds: import("../data/features.js").Feature;
+ multicolumn: import("../data/features.js").Feature;
+ "style-scoped": import("../data/features.js").Feature;
+ "svg-css": import("../data/features.js").Feature;
+ transforms2d: import("../data/features.js").Feature;
+ transforms3d: import("../data/features.js").Feature;
+ ttf: import("../data/features.js").Feature;
+ "user-select-none": import("../data/features.js").Feature;
+ "variable-fonts": import("../data/features.js").Feature;
+ "viewport-unit-variants": import("../data/features.js").Feature;
+ "viewport-units": import("../data/features.js").Feature;
+ wordwrap: import("../data/features.js").Feature;
+ } & string)[];
+};
+export type DetectorCallback = (result: DetectorCallbackArgument) => any;
diff --git a/node_modules/doiuse/types/lib/DoIUse.d.ts b/node_modules/doiuse/types/lib/DoIUse.d.ts
new file mode 100644
index 00000000..491be904
--- /dev/null
+++ b/node_modules/doiuse/types/lib/DoIUse.d.ts
@@ -0,0 +1,56 @@
+/** @typedef {import('../data/features.js').FeatureKeys} FeatureKeys */
+/**
+ * @typedef {Object} OnFeatureUsageArguments
+ * @prop {FeatureKeys} feature
+ * @prop {import('./BrowserSelection.js').MissingSupportResultStats|undefined} featureData
+ * @prop {import('postcss').Node} usage
+ * @prop {string} message
+ */
+/**
+ * @callback OnFeatureUsage
+ * @param {OnFeatureUsageArguments} result
+ * @return {any}
+ */
+/**
+ * @typedef {Object} DoIUseOptions
+ * @prop {ConstructorParameters<typeof BrowserSelection>[0]} [browsers]
+ * @prop {FeatureKeys[]} [ignore]
+ * @prop {OnFeatureUsage} [onFeatureUsage]
+ * @prop {string[]} [ignoreFiles]
+ */
+export default class DoIUse {
+ static default: any;
+ /**
+ * @param {DoIUseOptions} [optionsOrBrowserQuery]
+ */
+ constructor(optionsOrBrowserQuery?: DoIUseOptions);
+ browserQuery: string | string[];
+ onFeatureUsage: OnFeatureUsage;
+ ignoreOptions: ("outline" | "background-attachment" | "pointer" | "flow-root" | "font-kerning" | "font-smooth" | "font-variant-alternates" | "font-variant-numeric" | "inline-block" | "prefers-color-scheme" | "prefers-reduced-motion" | "rem" | "run-in" | "text-emphasis" | "text-stroke" | "webkit-user-drag" | "border-image" | "border-radius" | "font-size-adjust" | "text-decoration" | "object-fit" | "pointer-events" | "text-overflow" | "text-size-adjust" | "will-change" | "word-break" | "alternate-stylesheet" | "background-clip-text" | "background-img-opts" | "background-position-x-y" | "background-repeat-round-space" | "calc" | "ch-unit" | "css-all" | "css-animation" | "css-any-link" | "css-appearance" | "css-at-counter-style" | "css-autofill" | "css-backdrop-filter" | "css-background-offsets" | "css-backgroundblendmode" | "css-boxdecorationbreak" | "css-boxshadow" | "css-canvas" | "css-caret-color" | "css-cascade-layers" | "css-case-insensitive" | "css-clip-path" | "css-color-adjust" | "css-color-function" | "css-conic-gradients" | "css-container-queries" | "css-container-queries-style" | "css-container-query-units" | "css-containment" | "css-content-visibility" | "css-counters" | "css-crisp-edges" | "css-cross-fade" | "css-default-pseudo" | "css-descendant-gtgt" | "css-deviceadaptation" | "css-dir-pseudo" | "css-display-contents" | "css-element-function" | "css-env-function" | "css-exclusions" | "css-featurequeries" | "css-file-selector-button" | "css-filter-function" | "css-filters" | "css-first-letter" | "css-first-line" | "css-fixed" | "css-focus-visible" | "css-focus-within" | "css-font-palette" | "css-font-rendering-controls" | "css-font-stretch" | "css-gencontent" | "css-gradients" | "css-grid" | "css-grid-animation" | "css-hanging-punctuation" | "css-has" | "css-hyphens" | "css-image-orientation" | "css-image-set" | "css-in-out-of-range" | "css-indeterminate-pseudo" | "css-initial-letter" | "css-initial-value" | "css-lch-lab" | "css-letter-spacing" | "css-line-clamp" | "css-logical-props" | "css-marker-pseudo" | "css-masks" | "css-matches-pseudo" | "css-math-functions" | "css-media-interaction" | "css-media-range-syntax" | "css-media-resolution" | "css-media-scripting" | "css-mediaqueries" | "css-mixblendmode" | "css-motion-paths" | "css-namespaces" | "css-nesting" | "css-not-sel-list" | "css-nth-child-of" | "css-opacity" | "css-optional-pseudo" | "css-overflow" | "css-overflow-anchor" | "css-overflow-overlay" | "css-overscroll-behavior" | "css-page-break" | "css-paged-media" | "css-paint-api" | "css-placeholder" | "css-placeholder-shown" | "css-print-color-adjust" | "css-read-only-write" | "css-rebeccapurple" | "css-reflections" | "css-regions" | "css-relative-colors" | "css-repeating-gradients" | "css-resize" | "css-revert-value" | "css-rrggbbaa" | "css-scroll-behavior" | "css-scroll-timeline" | "css-scrollbar" | "css-sel2" | "css-sel3" | "css-selection" | "css-shapes" | "css-snappoints" | "css-sticky" | "css-subgrid" | "css-supports-api" | "css-table" | "css-text-align-last" | "css-text-box-trim" | "css-text-indent" | "css-text-justify" | "css-text-orientation" | "css-text-spacing" | "css-textshadow" | "css-touch-action" | "css-transitions" | "css-unicode-bidi" | "css-unset-value" | "css-variables" | "css-when-else" | "css-widows-orphans" | "css-width-stretch" | "css-writing-mode" | "css-zoom" | "css3-attr" | "css3-boxsizing" | "css3-colors" | "css3-cursors" | "css3-cursors-grab" | "css3-cursors-newer" | "css3-tabsize" | "currentcolor" | "devicepixelratio" | "extended-system-fonts" | "flexbox" | "flexbox-gap" | "font-family-system-ui" | "font-feature" | "font-loading" | "font-unicode-range" | "fontface" | "fullscreen" | "getcomputedstyle" | "intrinsic-width" | "justify-content-space-evenly" | "kerning-pairs-ligatures" | "mdn-css-unicode-bidi-isolate" | "mdn-css-unicode-bidi-isolate-override" | "mdn-css-unicode-bidi-plaintext" | "mdn-text-decoration-color" | "mdn-text-decoration-line" | "mdn-text-decoration-shorthand" | "mdn-text-decoration-style" | "minmaxwh" | "multibackgrounds" | "multicolumn" | "style-scoped" | "svg-css" | "transforms2d" | "transforms3d" | "ttf" | "user-select-none" | "variable-fonts" | "viewport-unit-variants" | "viewport-units" | "wordwrap")[];
+ ignoreFiles: string[];
+ /**
+ * @param {Object} [options]
+ * @param {ConstructorParameters<typeof BrowserSelection>[1]} [options.from]
+ */
+ info(options?: {
+ from?: [query?: string | string[], from?: string | false][1];
+ }): {
+ browsers: string[][];
+ features: Partial<Record<"outline" | "background-attachment" | "pointer" | "flow-root" | "font-kerning" | "font-smooth" | "font-variant-alternates" | "font-variant-numeric" | "inline-block" | "prefers-color-scheme" | "prefers-reduced-motion" | "rem" | "run-in" | "text-emphasis" | "text-stroke" | "webkit-user-drag" | "border-image" | "border-radius" | "font-size-adjust" | "text-decoration" | "object-fit" | "pointer-events" | "text-overflow" | "text-size-adjust" | "will-change" | "word-break" | "alternate-stylesheet" | "background-clip-text" | "background-img-opts" | "background-position-x-y" | "background-repeat-round-space" | "calc" | "ch-unit" | "css-all" | "css-animation" | "css-any-link" | "css-appearance" | "css-at-counter-style" | "css-autofill" | "css-backdrop-filter" | "css-background-offsets" | "css-backgroundblendmode" | "css-boxdecorationbreak" | "css-boxshadow" | "css-canvas" | "css-caret-color" | "css-cascade-layers" | "css-case-insensitive" | "css-clip-path" | "css-color-adjust" | "css-color-function" | "css-conic-gradients" | "css-container-queries" | "css-container-queries-style" | "css-container-query-units" | "css-containment" | "css-content-visibility" | "css-counters" | "css-crisp-edges" | "css-cross-fade" | "css-default-pseudo" | "css-descendant-gtgt" | "css-deviceadaptation" | "css-dir-pseudo" | "css-display-contents" | "css-element-function" | "css-env-function" | "css-exclusions" | "css-featurequeries" | "css-file-selector-button" | "css-filter-function" | "css-filters" | "css-first-letter" | "css-first-line" | "css-fixed" | "css-focus-visible" | "css-focus-within" | "css-font-palette" | "css-font-rendering-controls" | "css-font-stretch" | "css-gencontent" | "css-gradients" | "css-grid" | "css-grid-animation" | "css-hanging-punctuation" | "css-has" | "css-hyphens" | "css-image-orientation" | "css-image-set" | "css-in-out-of-range" | "css-indeterminate-pseudo" | "css-initial-letter" | "css-initial-value" | "css-lch-lab" | "css-letter-spacing" | "css-line-clamp" | "css-logical-props" | "css-marker-pseudo" | "css-masks" | "css-matches-pseudo" | "css-math-functions" | "css-media-interaction" | "css-media-range-syntax" | "css-media-resolution" | "css-media-scripting" | "css-mediaqueries" | "css-mixblendmode" | "css-motion-paths" | "css-namespaces" | "css-nesting" | "css-not-sel-list" | "css-nth-child-of" | "css-opacity" | "css-optional-pseudo" | "css-overflow" | "css-overflow-anchor" | "css-overflow-overlay" | "css-overscroll-behavior" | "css-page-break" | "css-paged-media" | "css-paint-api" | "css-placeholder" | "css-placeholder-shown" | "css-print-color-adjust" | "css-read-only-write" | "css-rebeccapurple" | "css-reflections" | "css-regions" | "css-relative-colors" | "css-repeating-gradients" | "css-resize" | "css-revert-value" | "css-rrggbbaa" | "css-scroll-behavior" | "css-scroll-timeline" | "css-scrollbar" | "css-sel2" | "css-sel3" | "css-selection" | "css-shapes" | "css-snappoints" | "css-sticky" | "css-subgrid" | "css-supports-api" | "css-table" | "css-text-align-last" | "css-text-box-trim" | "css-text-indent" | "css-text-justify" | "css-text-orientation" | "css-text-spacing" | "css-textshadow" | "css-touch-action" | "css-transitions" | "css-unicode-bidi" | "css-unset-value" | "css-variables" | "css-when-else" | "css-widows-orphans" | "css-width-stretch" | "css-writing-mode" | "css-zoom" | "css3-attr" | "css3-boxsizing" | "css3-colors" | "css3-cursors" | "css3-cursors-grab" | "css3-cursors-newer" | "css3-tabsize" | "currentcolor" | "devicepixelratio" | "extended-system-fonts" | "flexbox" | "flexbox-gap" | "font-family-system-ui" | "font-feature" | "font-loading" | "font-unicode-range" | "fontface" | "fullscreen" | "getcomputedstyle" | "intrinsic-width" | "justify-content-space-evenly" | "kerning-pairs-ligatures" | "mdn-css-unicode-bidi-isolate" | "mdn-css-unicode-bidi-isolate-override" | "mdn-css-unicode-bidi-plaintext" | "mdn-text-decoration-color" | "mdn-text-decoration-line" | "mdn-text-decoration-shorthand" | "mdn-text-decoration-style" | "minmaxwh" | "multibackgrounds" | "multicolumn" | "style-scoped" | "svg-css" | "transforms2d" | "transforms3d" | "ttf" | "user-select-none" | "variable-fonts" | "viewport-unit-variants" | "viewport-units" | "wordwrap", import("./BrowserSelection.js").MissingSupportResultStats>>;
+ };
+ postcss(root: import("postcss/lib/root.js").default, result: import("postcss/lib/result.js").default): void | Promise<void>;
+}
+export type FeatureKeys = import('../data/features.js').FeatureKeys;
+export type OnFeatureUsageArguments = {
+ feature: FeatureKeys;
+ featureData: import('./BrowserSelection.js').MissingSupportResultStats | undefined;
+ usage: import('postcss').Node;
+ message: string;
+};
+export type OnFeatureUsage = (result: OnFeatureUsageArguments) => any;
+export type DoIUseOptions = {
+ browsers?: [query?: string | string[], from?: string | false][0];
+ ignore?: FeatureKeys[];
+ onFeatureUsage?: OnFeatureUsage;
+ ignoreFiles?: string[];
+};
diff --git a/node_modules/doiuse/types/lib/stream/CssUsageDuplex.d.ts b/node_modules/doiuse/types/lib/stream/CssUsageDuplex.d.ts
new file mode 100644
index 00000000..4b977cb3
--- /dev/null
+++ b/node_modules/doiuse/types/lib/stream/CssUsageDuplex.d.ts
@@ -0,0 +1,17 @@
+/** @typedef {import('../../data/features.js').FeatureKeys} FeatureKeys */
+export default class CssUsageDuplex extends Duplexify.Duplexify {
+ /**
+ * @param {Object} options
+ * @param {string} options.browsers
+ * @param {FeatureKeys[]} [options.ignore]
+ * @param {boolean} [options.skipErrors]
+ * @param {string} [filename] Filename for outputting source code locations.
+ */
+ constructor(options: {
+ browsers: string;
+ ignore?: FeatureKeys[];
+ skipErrors?: boolean;
+ }, filename?: string);
+}
+export type FeatureKeys = import('../../data/features.js').FeatureKeys;
+import Duplexify from 'duplexify';
diff --git a/node_modules/doiuse/types/lib/stream/RuleUsageTransform.d.ts b/node_modules/doiuse/types/lib/stream/RuleUsageTransform.d.ts
new file mode 100644
index 00000000..dc2c0259
--- /dev/null
+++ b/node_modules/doiuse/types/lib/stream/RuleUsageTransform.d.ts
@@ -0,0 +1,26 @@
+/** @typedef {import('../../data/features.js').FeatureKeys} FeatureKeys */
+/** @typedef {import('./SourceMapTransform.js').SourceMapTransformation} SourceMapTransformation */
+export default class RuleUsageTransform extends Transform {
+ /**
+ * @param {Object} options
+ * @param {string} options.browsers
+ * @param {FeatureKeys[]} [options.ignore]
+ * @param {boolean} [options.skipErrors]
+ * @param {string} [filename] Filename for outputting source code locations.
+ */
+ constructor(options: {
+ browsers: string;
+ ignore?: FeatureKeys[];
+ skipErrors?: boolean;
+ }, filename?: string);
+ /**
+ * @param {SourceMapTransformation} rule
+ * @param {any} encoding
+ * @param {Function} callback
+ */
+ _transform(rule: SourceMapTransformation, encoding: any, callback: Function): Promise<void>;
+ #private;
+}
+export type FeatureKeys = import('../../data/features.js').FeatureKeys;
+export type SourceMapTransformation = import('./SourceMapTransform.js').SourceMapTransformation;
+import { Transform } from 'node:stream';
diff --git a/node_modules/doiuse/types/lib/stream/SourceMapTransform.d.ts b/node_modules/doiuse/types/lib/stream/SourceMapTransform.d.ts
new file mode 100644
index 00000000..f7bb4800
--- /dev/null
+++ b/node_modules/doiuse/types/lib/stream/SourceMapTransform.d.ts
@@ -0,0 +1,22 @@
+/**
+ * @typedef {Object} SourceMapTransformation
+ * @prop {number} line
+ * @prop {number} column
+ * @prop {string} content
+ */
+export default class SourceMapTransform extends Transform {
+ constructor();
+ /**
+ * @param {[string,Buffer]} chunk
+ * @param {any} encoding
+ * @param {Function} callback
+ */
+ _transform([type, buf]: [string, Buffer], encoding: any, callback: Function): void;
+ #private;
+}
+export type SourceMapTransformation = {
+ line: number;
+ column: number;
+ content: string;
+};
+import { Transform } from 'node:stream';
diff --git a/node_modules/doiuse/types/scripts/update-features.d.ts b/node_modules/doiuse/types/scripts/update-features.d.ts
new file mode 100644
index 00000000..6370e8f8
--- /dev/null
+++ b/node_modules/doiuse/types/scripts/update-features.d.ts
@@ -0,0 +1,7 @@
+#!/usr/bin/env node
+export type StubOptions = {
+ id: string;
+ name: string;
+ description: string;
+ link: string;
+};
diff --git a/node_modules/doiuse/types/test/caniuse-lite.d.ts b/node_modules/doiuse/types/test/caniuse-lite.d.ts
new file mode 100644
index 00000000..cb0ff5c3
--- /dev/null
+++ b/node_modules/doiuse/types/test/caniuse-lite.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/node_modules/doiuse/types/test/cli.d.ts b/node_modules/doiuse/types/test/cli.d.ts
new file mode 100644
index 00000000..cb0ff5c3
--- /dev/null
+++ b/node_modules/doiuse/types/test/cli.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/node_modules/doiuse/types/test/css-rule-stream.d.ts b/node_modules/doiuse/types/test/css-rule-stream.d.ts
new file mode 100644
index 00000000..cb0ff5c3
--- /dev/null
+++ b/node_modules/doiuse/types/test/css-rule-stream.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/node_modules/doiuse/types/test/detect-feature-use.d.ts b/node_modules/doiuse/types/test/detect-feature-use.d.ts
new file mode 100644
index 00000000..cb0ff5c3
--- /dev/null
+++ b/node_modules/doiuse/types/test/detect-feature-use.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/node_modules/doiuse/types/test/missing-support.d.ts b/node_modules/doiuse/types/test/missing-support.d.ts
new file mode 100644
index 00000000..cb0ff5c3
--- /dev/null
+++ b/node_modules/doiuse/types/test/missing-support.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/node_modules/doiuse/types/test/postcss-plugin.d.ts b/node_modules/doiuse/types/test/postcss-plugin.d.ts
new file mode 100644
index 00000000..cb0ff5c3
--- /dev/null
+++ b/node_modules/doiuse/types/test/postcss-plugin.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/node_modules/doiuse/types/test/regex.d.ts b/node_modules/doiuse/types/test/regex.d.ts
new file mode 100644
index 00000000..cb0ff5c3
--- /dev/null
+++ b/node_modules/doiuse/types/test/regex.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/node_modules/doiuse/types/test/stream.d.ts b/node_modules/doiuse/types/test/stream.d.ts
new file mode 100644
index 00000000..cb0ff5c3
--- /dev/null
+++ b/node_modules/doiuse/types/test/stream.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/node_modules/doiuse/types/test/utils.d.ts b/node_modules/doiuse/types/test/utils.d.ts
new file mode 100644
index 00000000..48ed3372
--- /dev/null
+++ b/node_modules/doiuse/types/test/utils.d.ts
@@ -0,0 +1,7 @@
+/**
+ * @template {Object} T
+ * @param {Tap.Test} t
+ * @param {T} object
+ * @param {(keyof T)[]} keys
+ */
+export function hasKeys<T extends unknown>(t: Tap.Test, object: T, keys: (keyof T)[]): boolean;
diff --git a/node_modules/doiuse/types/utils/getFiles.d.ts b/node_modules/doiuse/types/utils/getFiles.d.ts
new file mode 100644
index 00000000..09b1b1df
--- /dev/null
+++ b/node_modules/doiuse/types/utils/getFiles.d.ts
@@ -0,0 +1,7 @@
+/**
+ * recursively get all files in a directory
+ * @param {string} directory the directory to read
+ * @yields {string} the path to each file
+ * @return {AsyncGenerator<string>} the path to each file
+ */
+export function getFiles(directory: string): AsyncGenerator<string>;
diff --git a/node_modules/doiuse/types/utils/kebabToCamel.d.ts b/node_modules/doiuse/types/utils/kebabToCamel.d.ts
new file mode 100644
index 00000000..398896c0
--- /dev/null
+++ b/node_modules/doiuse/types/utils/kebabToCamel.d.ts
@@ -0,0 +1,6 @@
+/**
+ * given a kebab-case string, returns a camelCase string
+ * @param {string} kebab the kebab-case string
+ * @return {string} the camelCase string
+ */
+export function kebabToCamel(kebab: string): string;
diff --git a/node_modules/doiuse/types/utils/util.d.ts b/node_modules/doiuse/types/utils/util.d.ts
new file mode 100644
index 00000000..c62d04ca
--- /dev/null
+++ b/node_modules/doiuse/types/utils/util.d.ts
@@ -0,0 +1,32 @@
+/** @typedef {RegExp|string|((value:string) => boolean)} FeatureCheck */
+/**
+ * @param {string} browserKey
+ * @param {string[]} [versions]
+ * @return {string}
+ */
+export function formatBrowserName(browserKey: string, versions?: string[]): string;
+/**
+ *
+ * @param {FeatureCheck|FeatureCheck[]} check
+ * @param {?string|undefined} candidate
+ */
+export function performFeatureCheck(check: FeatureCheck | FeatureCheck[], candidate: (string | undefined) | null): any;
+/**
+ * @param {FeatureCheck|FeatureCheck[]} selector
+ * @return {(rule:import('postcss').ChildNode) => boolean}
+ */
+export function checkSelector(selector: FeatureCheck | FeatureCheck[]): (rule: import('postcss').ChildNode) => boolean;
+/**
+ * @param {FeatureCheck|FeatureCheck[]} [name]
+ * @param {FeatureCheck|FeatureCheck[]} [parameters]
+ * @return {(rule:import('postcss').ChildNode) => boolean}
+ */
+export function checkAtRule(name?: FeatureCheck | FeatureCheck[], parameters?: FeatureCheck | FeatureCheck[]): (rule: import('postcss').ChildNode) => boolean;
+/**
+ * @see https://drafts.csswg.org/css-values/#lengths
+ * @see https://drafts.csswg.org/css-values/#number-value
+ * @param {string[]} units
+ * @return {(rule:import('postcss').ChildNode) => boolean}
+ */
+export function checkCSSLengthUnits(...units: string[]): (rule: import('postcss').ChildNode) => boolean;
+export type FeatureCheck = string | RegExp | ((value: string) => boolean);
diff --git a/node_modules/doiuse/utils/getFiles.js b/node_modules/doiuse/utils/getFiles.js
new file mode 100644
index 00000000..3e939420
--- /dev/null
+++ b/node_modules/doiuse/utils/getFiles.js
@@ -0,0 +1,19 @@
+import { readdir } from 'node:fs/promises';
+import { resolve } from 'node:path';
+
+/**
+ * recursively get all files in a directory
+ * @param {string} directory the directory to read
+ * @yields {string} the path to each file
+ * @return {AsyncGenerator<string>} the path to each file
+ */
+export async function* getFiles(directory) {
+ for (const entry of await readdir(directory, { withFileTypes: true })) {
+ const path = resolve(directory, entry.name);
+ if (entry.isDirectory()) {
+ yield* getFiles(path);
+ } else {
+ yield path;
+ }
+ }
+}
diff --git a/node_modules/doiuse/utils/kebabToCamel.js b/node_modules/doiuse/utils/kebabToCamel.js
new file mode 100644
index 00000000..c7237c3c
--- /dev/null
+++ b/node_modules/doiuse/utils/kebabToCamel.js
@@ -0,0 +1,8 @@
+/**
+ * given a kebab-case string, returns a camelCase string
+ * @param {string} kebab the kebab-case string
+ * @return {string} the camelCase string
+ */
+export function kebabToCamel(kebab) {
+ return kebab.replaceAll(/-([a-z])/g, (match, letter) => letter.toUpperCase());
+}
diff --git a/node_modules/doiuse/utils/util.js b/node_modules/doiuse/utils/util.js
new file mode 100644
index 00000000..e9b323e9
--- /dev/null
+++ b/node_modules/doiuse/utils/util.js
@@ -0,0 +1,79 @@
+import { agents } from 'caniuse-lite';
+
+/** @typedef {RegExp|string|((value:string) => boolean)} FeatureCheck */
+
+/**
+ * @param {string} browserKey
+ * @param {string[]} [versions]
+ * @return {string}
+ */
+export function formatBrowserName(browserKey, versions) {
+ const entry = agents[browserKey];
+ const browserName = entry ? entry.browser : null;
+ if (!versions) {
+ return browserName || '';
+ }
+ return (`${browserName} (${versions.join(',')})`);
+}
+
+/**
+ *
+ * @param {FeatureCheck|FeatureCheck[]} check
+ * @param {?string|undefined} candidate
+ */
+export function performFeatureCheck(check, candidate) {
+ if (check == null || candidate == null) return false;
+ if (check instanceof RegExp) {
+ return check.test(candidate);
+ }
+ switch (typeof check) {
+ case 'string':
+ return candidate.includes(check);
+ case 'function':
+ return check(candidate);
+ case 'boolean':
+ return check;
+ case 'object':
+ if (Array.isArray(check)) {
+ return check.some((c) => performFeatureCheck(c, candidate));
+ }
+ // Fallthrough
+ default:
+ console.error(check);
+ throw new TypeError(`Unexpected feature check: ${check}`);
+ }
+}
+
+/**
+ * @param {FeatureCheck|FeatureCheck[]} selector
+ * @return {(rule:import('postcss').ChildNode) => boolean}
+ */
+export function checkSelector(selector) {
+ return (rule) => rule.type === 'rule'
+ && performFeatureCheck(selector, rule.selector);
+}
+
+/**
+ * @param {FeatureCheck|FeatureCheck[]} [name]
+ * @param {FeatureCheck|FeatureCheck[]} [parameters]
+ * @return {(rule:import('postcss').ChildNode) => boolean}
+ */
+export function checkAtRule(name, parameters) {
+ return (rule) => rule.type === 'atrule'
+ && performFeatureCheck(name, rule.name)
+ && (!parameters || performFeatureCheck(parameters, rule.params));
+}
+
+/**
+ * @see https://drafts.csswg.org/css-values/#lengths
+ * @see https://drafts.csswg.org/css-values/#number-value
+ * @param {string[]} units
+ * @return {(rule:import('postcss').ChildNode) => boolean}
+ */
+export function checkCSSLengthUnits(...units) {
+ const regexp = new RegExp(`(\\+-)?[\\d.]*\\.?\\d+(e(\\+-)?\\d+)?(${units.join('|')})`, 'i');
+ return (rule) => (
+ (rule.type === 'decl') ? performFeatureCheck(regexp, rule.value)
+ : ((rule.type === 'atrule') ? performFeatureCheck(regexp, rule.params)
+ : false));
+}