diff --git a/package-lock.json b/package-lock.json index 4997940a2..de5ccb037 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,8 +29,8 @@ "leaflet": "^1.9.4", "leaflet.locatecontrol": "^0.81.1", "mapml-extension": "git+https://github.com/Maps4HTML/mapml-extension", - "media-query-parser": "^3.0.2", - "media-query-solver": "^0.1.3", + "media-query-parser": "file:vendor/media-query-parser", + "media-query-solver": "file:vendor/media-query-solver", "path": "^0.12.7", "playwright": "^1.39.0", "proj4": "^2.6.2", @@ -1966,30 +1966,12 @@ } }, "node_modules/media-query-parser": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/media-query-parser/-/media-query-parser-3.0.2.tgz", - "integrity": "sha512-3WLXSFQZVuo1d9xpt72Ul0khXy72qgtz1KqDBO6KbmyvMsBsQRcePhYYR2U5QBSOz/u5pb5zj2s2FmgJe8jaTw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.5.0" - } + "resolved": "vendor/media-query-parser", + "link": true }, "node_modules/media-query-solver": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/media-query-solver/-/media-query-solver-0.1.3.tgz", - "integrity": "sha512-OkL4tpvexcAOG09rNdbAO1MebJzRa2s0RK7hTO9gVAL1jefbm6rLG9jcRYbwO1M3N8UGhHymMtOXK2ciDy3r8w==", - "dev": true, - "license": "MIT", - "bin": { - "media-query-solver": "dist/cjs/cli.js" - }, - "engines": { - "node": ">=16.0.0 || ^14.13.1" - }, - "peerDependencies": { - "media-query-parser": "^3.0.2" - } + "resolved": "vendor/media-query-solver", + "link": true }, "node_modules/media-typer": { "version": "0.3.0", @@ -3027,6 +3009,28 @@ "version": "1.0.2", "dev": true, "license": "ISC" + }, + "vendor/media-query-parser": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.5.0" + } + }, + "vendor/media-query-solver": { + "version": "0.1.3", + "dev": true, + "license": "MIT", + "bin": { + "media-query-solver": "dist/cjs/cli.js" + }, + "engines": { + "node": ">=16.0.0 || ^14.13.1" + }, + "peerDependencies": { + "media-query-parser": "^3.0.2" + } } } } diff --git a/package.json b/package.json index 20e695d84..5400446ec 100644 --- a/package.json +++ b/package.json @@ -56,8 +56,8 @@ "leaflet": "^1.9.4", "leaflet.locatecontrol": "^0.81.1", "mapml-extension": "git+https://github.com/Maps4HTML/mapml-extension", - "media-query-parser": "^3.0.2", - "media-query-solver": "^0.1.3", + "media-query-parser": "file:vendor/media-query-parser", + "media-query-solver": "file:vendor/media-query-solver", "path": "^0.12.7", "playwright": "^1.39.0", "proj4": "^2.6.2", diff --git a/src/map-tile.js b/src/map-tile.js index 0eb6f16d6..ea8b9dc0d 100644 --- a/src/map-tile.js +++ b/src/map-tile.js @@ -149,7 +149,21 @@ export class HTMLTileElement extends HTMLElement { // If this was the last tile in the layer, clean up the layer if (this._tileLayer._mapTiles && this._tileLayer._mapTiles.length === 0) { - this._tileLayer.remove(); + // _createOrGetTileLayer added this MapTileLayer to a LayerGroup, so it + // has to be removed from that group. Layer.remove() only detaches it + // from the map - and does nothing at all while the group itself is off + // the map (e.g. the layer is unchecked), because the layer has no + // _map. Either way the group keeps its reference, and LayerGroup.onAdd + // re-adds every layer it holds, so each dead MapTileLayer reappears - + // container, stale tiles and all - the next time the layer is checked. + const parentLayerGroup = this._parentEl._templatedLayer?.removeLayer + ? this._parentEl._templatedLayer + : this._parentEl._layer; + if (parentLayerGroup?.removeLayer) { + parentLayerGroup.removeLayer(this._tileLayer); + } else { + this._tileLayer.remove(); + } this._tileLayer = null; delete this._tileLayer; } diff --git a/src/mapml/layers/MapTileLayer.js b/src/mapml/layers/MapTileLayer.js index 2e05f7ce3..f034acac7 100644 --- a/src/mapml/layers/MapTileLayer.js +++ b/src/mapml/layers/MapTileLayer.js @@ -58,8 +58,18 @@ export var MapTileLayer = GridLayer.extend({ onRemove: function (map) { // Clean up pending tiles this._pendingTiles = {}; - // remove _container from the dom, but don't delete it - DomUtil.remove(this._container); + const container = this._container; + // GridLayer.onRemove discards the rendered tiles and releases the zoom + // limits this layer registered with the map. Skipping it leaves the + // previously rendered tiles inside the detached container, so when the + // layer is added back (e.g. its map-layer is checked again) onAdd + // re-appends them and GridLayer.onAdd renders a second copy alongside. + GridLayer.prototype.onRemove.call(this, map); + // GridLayer.onRemove nulls _container, but onAdd re-appends this one + // rather than creating another, so put it back, emptied of the levels + // GridLayer.onAdd would otherwise orphan inside it. + container.textContent = ''; + this._container = container; }, setZIndex: function (zIndex) { this.options.zIndex = zIndex; diff --git a/test/e2e/elements/map-tile/map-tile.test.js b/test/e2e/elements/map-tile/map-tile.test.js index 3a9a366e9..f15cc3f25 100644 --- a/test/e2e/elements/map-tile/map-tile.test.js +++ b/test/e2e/elements/map-tile/map-tile.test.js @@ -358,6 +358,76 @@ test.describe('Map Tile Dynamic Updates Tests', () => { expect(finalState.tile2Src).toBe('tiles/green-tile.png'); }); + test('tile content replaced while a layer is unchecked is not restored when it is checked again', async () => { + // Regression test for a whose children are + // generated, as a script rendering tiles for the current view does. + // Replacing them while the layer is unchecked used to leave the discarded + // tiles attached to the map, so checking the layer again drew them again + // alongside the current ones - two generations of content at once, and a + // doubled copy of the current generation. + await page.reload(); + await page.waitForTimeout(1000); + + const viewer = page.getByTestId('viewer'); + const renderedTileSources = () => + viewer.evaluate((v) => { + const sources = {}; + for (const img of v.shadowRoot.querySelectorAll('img')) { + // ignore the map's own control imagery, count only tile images + if (!img.currentSrc.endsWith('-tile.png')) continue; + const name = img.currentSrc.split('/').pop(); + sources[name] = (sources[name] || 0) + 1; + } + return sources; + }); + + // the fixture starts out showing green tiles + expect((await renderedTileSources())['green-tile.png']).toBeGreaterThan(0); + + await viewer.evaluate((v) => + v.querySelector('map-layer').removeAttribute('checked') + ); + await page.waitForTimeout(500); + expect(await renderedTileSources()).toEqual({}); + + // While the layer is hidden, replace every tile with a new set drawn from + // a different image, the way a generator regenerates content for a view + // that changed while the layer was switched off. + await viewer.evaluate((v) => { + const layer = v.querySelector('map-layer'); + layer.querySelectorAll('map-tile').forEach((tile) => tile.remove()); + for (const [col, row] of [ + [9, 10], + [9, 11], + [10, 10], + [10, 11] + ]) { + const tile = document.createElement('map-tile'); + tile.setAttribute('zoom', '2'); + tile.setAttribute('col', String(col)); + tile.setAttribute('row', String(row)); + tile.setAttribute('src', 'tiles/red-tile.png'); + layer.appendChild(tile); + } + }); + await page.waitForTimeout(500); + // nothing is drawn while the layer is unchecked + expect(await renderedTileSources()).toEqual({}); + + await viewer.evaluate((v) => + v.querySelector('map-layer').setAttribute('checked', '') + ); + await page.waitForTimeout(1000); + + // only the tiles that are still in the DOM may be drawn, each once + const afterToggle = await renderedTileSources(); + expect(afterToggle['green-tile.png']).toBeUndefined(); + expect(afterToggle['red-tile.png']).toBeGreaterThan(0); + expect(afterToggle['red-tile.png']).toBeLessThanOrEqual( + await viewer.evaluate((v) => v.querySelectorAll('map-tile').length) + ); + }); + test.afterAll(async () => { await context.close(); }); diff --git a/vendor/README.md b/vendor/README.md new file mode 100644 index 000000000..67b71e3a1 --- /dev/null +++ b/vendor/README.md @@ -0,0 +1,20 @@ +# Vendored dependencies + +These packages are build-time (dev) dependencies that are bundled into +`dist/` by Rollup. They are kept here because `media-query-solver` was +unpublished from the npm registry on 2026-09-30, which broke `npm ci`. +`media-query-parser` is by the same author and is vendored pre-emptively. + +| Package | Version | Original npm tarball integrity | Source | +|---|---|---|---| +| `media-query-parser` | 3.0.2 | `sha512-3WLXSFQZVuo1d9xpt72Ul0khXy72qgtz1KqDBO6KbmyvMsBsQRcePhYYR2U5QBSOz/u5pb5zj2s2FmgJe8jaTw==` | [prushforth/media-query-parser](https://github.com/prushforth/media-query-parser) (fork of `tmgldn/media-query-parser`) | +| `media-query-solver` | 0.1.3 | `sha512-OkL4tpvexcAOG09rNdbAO1MebJzRa2s0RK7hTO9gVAL1jefbm6rLG9jcRYbwO1M3N8UGhHymMtOXK2ciDy3r8w==` | [prushforth/media-query-solver](https://github.com/prushforth/media-query-solver) (fork of `tmgldn/media-query-solver`) | + +Each directory is the unmodified contents of the published npm tarball +(verified against the integrity hashes above), except that the +development-only fields (`scripts`, `devDependencies`, `simple-git-hooks`, +`prettier`, `lint-time`, `jest`) were removed from `package.json`. Without +that, npm would install the packages' own dev tooling and run their +`prepare` script when resolving the `file:` dependencies. + +Both packages are MIT licensed; see the `LICENSE` file in each directory, and the entry in the MapML.js LICENSE.md file. diff --git a/vendor/media-query-parser/LICENSE b/vendor/media-query-parser/LICENSE new file mode 100644 index 000000000..6333c3545 --- /dev/null +++ b/vendor/media-query-parser/LICENSE @@ -0,0 +1,18 @@ +MIT License + +Copyright (c) 2023 Tom Golden + +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/vendor/media-query-parser/README.md b/vendor/media-query-parser/README.md new file mode 100644 index 000000000..a6687629f --- /dev/null +++ b/vendor/media-query-parser/README.md @@ -0,0 +1,132 @@ +# `media-query-parser` + +[![npm](https://img.shields.io/npm/v/media-query-parser)](https://www.npmjs.com/package/media-query-parser) +[![npm type definitions](https://img.shields.io/npm/types/media-query-parser)](#) +[![license](https://img.shields.io/npm/l/media-query-parser)](#) +[![npm downloads](https://img.shields.io/npm/dw/media-query-parser)](https://www.npmjs.com/package/media-query-parser) +[![install size](https://packagephobia.com/badge?p=media-query-parser)](https://packagephobia.com/result?p=media-query-parser) + +- **Create a JS object from a CSS media queries** +- **Create a CSS media query from a JS object** +- **Returns a ParserError for invalid CSS media queries** +- **Spec-compliant** - https://www.w3.org/TR/mediaqueries-5/ + - **All valid queries parsed + e.g. `(100px < width < 200px)`** +- **Zero-dependencies** +- **Well tested** - every single line +- **TypeScript friendly** + +[![demo](demo.png)](https://tbjgolden.github.io/media-query-parser/playground/) +[Try it!](https://tbjgolden.github.io/media-query-parser/playground/) + +## Why? + +Other CSS parsers (e.g. css-tree and postcss) do not support all media query syntax out of the box. + +Further, the only other media query parser that I'm aware of is `postcss-media-query-parser` - which +is specific to postcss and doesn't parse newer syntax like range expressions (i.e. +`(width >= 768px)`). + +This package is a spec-compliant media query parser that can be used in Node/Deno/etc, or on the +client that precisely matches the spec right down to the quirks. + +These are valid media queries that this library supports: + +```css +@media (768px <= width < 1200px); +@media only print and (color); +@media not (not (not (((hover) or ((not (color))))))); +@media (🐈: 😸 /* if cat happy */) { + /* this query has valid syntax, but is clearly not a real feature 😿 */ + /* For extensions to this project, check out "Libraries that use this" at the bottom of this README */ +} +``` + +These are invalid media queries that this library will detect: + +```css +@media (color) or (hover); /* or cannot be at top level */ +@media (min-width: calc(50vw + 10px)); /* functions aren't valid values */ +@media not((color)); /* whitespace must follow `not` */ +@media (768px < = width < 1200px); /* cannot have a space between `<` and `=` */ +``` + +## Install + +This package is available from the `npm` registry. + +```sh +npm install media-query-parser +``` + +## Usage + +Supports JavaScript + TypeScript: + +```ts +import { parseMediaQuery } from "media-query-parser"; + +const mediaQuery = parseMediaQuery("screen and (min-width: 768px)"); +if (!isParserError(mediaQuery)) { + console.log(mediaQuery); + // { + // _t: "query", + // type: "screen", + // condition: { + // _t: "condition", + // op: "and", + // nodes: [ + // { + // _t: "in-parens", + // node: { + // _t: "feature", + // context: "value", + // feature: "min-width", + // value: { + // _t: "dimension", + // value: 768, + // unit: "px", + // }, + // }, + // }, + // ], + // }, + // } + // // start/end omitted for brevity + + console.log(stringify(mediaQuery.condition)); + // "(min-width: 768px)" +} +``` + +Can also be imported via `require("media-query-parser")`. + +### [**v3 (Current) Docs**](https://tbjgolden.github.io/media-query-parser/) + +###### [_v2 API docs_](https://github.com/tbjgolden/media-query-parser/tree/v2.0.2/docs/api#functions) + +## Libraries that use this + +- (See GitHub for dynamically updated list) + +## Node versions + +This source code of this library supports `node >=6.5.0` via `require()` and +`node >=16.0.0 || ^14.13.1` via import. (Below v6.5.0 is possible but you'd need to transpile the +CommonJS code from ES6 yourself) + +## Contributing + +- PRs welcome and accepted, simply fork and create +- Issues also very welcome +- Treat others with common courtesy and respect 🤝 + +Dev environment (for contributing) requires: + +- node >= 16.14.0 +- npm >= 6.8.0 +- git >= 2.11 + +## Licence + +MIT diff --git a/vendor/media-query-parser/dist/cjs/ast/ast.d.ts b/vendor/media-query-parser/dist/cjs/ast/ast.d.ts new file mode 100644 index 000000000..9fb8356da --- /dev/null +++ b/vendor/media-query-parser/dist/cjs/ast/ast.d.ts @@ -0,0 +1,18 @@ +import { BooleanFeatureNode, ConditionNode, ConditionWithoutOrNode, FeatureNode, GeneralEnclosedNode, InParensNode, ParserToken, PlainFeatureNode, QueryListNode, QueryNode } from "../utils.js"; +export type Match = { + t: T; + i: number; +} | undefined; +export declare const matchPlain: (ts: ParserToken[], i?: number) => Match; +export declare const matchBoolean: (ts: ParserToken[], i?: number) => Match; +export declare const matchFeature: (ts: ParserToken[], i?: number) => Match; +export declare const matchGeneralEnclosed: (ts: ParserToken[], i?: number) => Match; +export declare const matchInParens: (ts: ParserToken[], i?: number) => Match; +export declare const matchOr: (ts: ParserToken[], i?: number) => Match; +export declare const matchAnd: (ts: ParserToken[], i?: number) => Match; +export declare const matchNot: (ts: ParserToken[], i?: number) => Match; +export declare const matchCondition: (ts: ParserToken[], i?: number) => Match; +export declare const matchConditionWithoutOr: (ts: ParserToken[], i?: number) => Match; +export declare const matchQuery: (ts: ParserToken[]) => Match; +export declare const matchQueryList: (parsingTokens: ParserToken[]) => QueryListNode; +export declare const splitMediaQueryList: (tokens: ParserToken[]) => Array; diff --git a/vendor/media-query-parser/dist/cjs/ast/ast.js b/vendor/media-query-parser/dist/cjs/ast/ast.js new file mode 100644 index 000000000..760a5dcea --- /dev/null +++ b/vendor/media-query-parser/dist/cjs/ast/ast.js @@ -0,0 +1,444 @@ +Object.defineProperty(exports, '__esModule', {value: !0}), + (exports.splitMediaQueryList = + exports.matchQueryList = + exports.matchQuery = + exports.matchConditionWithoutOr = + exports.matchCondition = + exports.matchNot = + exports.matchAnd = + exports.matchOr = + exports.matchInParens = + exports.matchGeneralEnclosed = + exports.matchFeature = + exports.matchBoolean = + exports.matchPlain = + void 0) +const t = '<'.codePointAt(0), + e = '>'.codePointAt(0), + n = '='.codePointAt(0), + i = '/'.codePointAt(0), + o = (e, i = 0) => { + const o = e.at(i) + if ('delim' === (null == o ? void 0 : o._t) && o.value === t) { + const t = e.at(i + 1), + o = 'delim' === (null == t ? void 0 : t._t) && t.value === n && !t.isAfterSpace + return {t: {t: 'lt', isIncl: o}, i: i + (o ? 2 : 1)} + } + }, + r = (t, i = 0) => { + const o = t.at(i) + if ('delim' === (null == o ? void 0 : o._t) && o.value === e) { + const e = t.at(i + 1), + o = 'delim' === (null == e ? void 0 : e._t) && e.value === n && !e.isAfterSpace + return {t: {t: 'gt', isIncl: o}, i: i + (o ? 2 : 1)} + } + }, + a = (t, e = 0) => { + var i, a + return null !== (a = null !== (i = o(t, e)) && void 0 !== i ? i : r(t, e)) && void 0 !== a + ? a + : ((t, e = 0) => { + const i = t.at(e) + if ('delim' === (null == i ? void 0 : i._t) && i.value === n) + return {t: {t: 'eq'}, i: e + 1} + })(t, e) + }, + s = (t, e = 0) => { + const n = ((t, e = 0) => { + const n = t.at(e) + if ('number' === (null == n ? void 0 : n._t) && n.value >= 0) { + const o = t.at(e + 1) + if ('delim' === (null == o ? void 0 : o._t) && o.value === i) { + const i = t.at(e + 2) + if ('number' === (null == i ? void 0 : i._t) && i.value >= 0) + return { + t: {_t: 'ratio', left: n.value, right: i.value, start: n.start, end: i.end}, + i: e + 3 + } + } + } + })(t, e) + if (n) return n + const o = t.at(e) + if (o && ('number' === o._t || 'dimension' === o._t)) { + return { + t: + 'number' === o._t + ? {_t: 'number', value: o.value, flag: o.flag, start: o.start, end: o.end} + : {_t: 'dimension', value: o.value, unit: o.unit, start: o.start, end: o.end}, + i: e + 1 + } + } + }, + u = (t, e = 0) => { + const n = s(t, e) + if (n) return n + const i = t.at(e) + return 'ident' === (null == i ? void 0 : i._t) + ? {t: {_t: 'ident', value: i.value, start: i.start, end: i.end}, i: e + 1} + : void 0 + } +exports.matchPlain = (t, e = 0) => { + const n = t.at(e) + if ('ident' === (null == n ? void 0 : n._t)) { + const i = t.at(e + 1) + if ('colon' === (null == i ? void 0 : i._t)) { + const i = u(t, e + 2) + if (i) + return { + t: { + _t: 'feature', + context: 'value', + feature: n.value, + value: i.t, + start: n.start, + end: i.t.end + }, + i: i.i + } + } + } +} +exports.matchBoolean = (t, e = 0) => { + const n = t.at(e) + if ('ident' === (null == n ? void 0 : n._t)) + return { + t: {_t: 'feature', context: 'boolean', feature: n.value, start: n.start, end: n.end}, + i: e + 1 + } +} +exports.matchFeature = (t, e = 0) => { + var n, i + const s = t.at(e) + if ('(' === (null == s ? void 0 : s._t)) { + const s = + null !== + (i = + null !== (n = (0, exports.matchPlain)(t, e + 1)) && void 0 !== n + ? n + : ((t, e = 0) => { + var n + const i = u(t, e) + if (i) { + const e = a(t, i.i) + if (e) { + const a = u(t, e.i) + if (a) { + const s = null !== (n = o(t, a.i)) && void 0 !== n ? n : r(t, a.i) + if (s) { + const n = u(t, s.i) + if (n && 'ident' === a.t._t && 'ident' !== i.t._t && 'ident' !== n.t._t) { + if ('lt' === e.t.t && 'lt' === s.t.t) + return { + t: { + _t: 'feature', + context: 'range', + ops: 2, + feature: a.t.value, + minValue: i.t, + minOp: e.t.isIncl ? '<=' : '<', + maxOp: s.t.isIncl ? '<=' : '<', + maxValue: n.t, + start: i.t.start, + end: n.t.end + }, + i: n.i + } + if ('gt' === e.t.t && 'gt' === s.t.t) + return { + t: { + _t: 'feature', + context: 'range', + ops: 2, + feature: a.t.value, + minValue: n.t, + minOp: s.t.isIncl ? '<=' : '<', + maxOp: e.t.isIncl ? '<=' : '<', + maxValue: i.t, + start: i.t.start, + end: n.t.end + }, + i: n.i + } + } + } + let c = '=' + if ( + ('lt' === e.t.t + ? (c = e.t.isIncl ? '<=' : '<') + : 'gt' === e.t.t && (c = e.t.isIncl ? '>=' : '>'), + 'ident' === i.t._t && 'ident' !== a.t._t) + ) + return { + t: { + _t: 'feature', + context: 'range', + feature: i.t.value, + ops: 1, + op: c, + value: a.t, + start: i.t.start, + end: a.t.end + }, + i: a.i + } + if ('ident' === a.t._t && 'ident' !== i.t._t) { + let t = '=' + return ( + '<' === c + ? (t = '>') + : '<=' === c + ? (t = '>=') + : '>' === c + ? (t = '<') + : '>=' === c && (t = '<='), + { + t: { + _t: 'feature', + context: 'range', + feature: a.t.value, + ops: 1, + op: t, + value: i.t, + start: i.t.start, + end: a.t.end + }, + i: a.i + } + ) + } + } + } + } + })(t, e + 1)) && void 0 !== i + ? i + : (0, exports.matchBoolean)(t, e + 1) + if (s) { + const e = t.at(s.i) + if (')' === (null == e ? void 0 : e._t)) return {t: s.t, i: s.i + 1} + } + } +} +exports.matchGeneralEnclosed = (t, e = 0) => { + var n + const i = t.at(e) + if (i && ('function' === i._t || '(' === i._t)) { + const o = ['('] + let r = e + 1, + a = t.at(r) + t: for (; a; ) { + switch (a._t) { + case 'function': + case '(': + o.push('(') + break + case '{': + case '[': + o.push(a._t) + break + case ')': + if (('(' === o.at(-1) && o.pop(), 0 === o.length)) break t + break + case ']': + '[' === o.at(-1) && o.pop() + break + case '}': + '{' === o.at(-1) && o.pop() + } + a = t.at(++r) + } + if (0 === o.length) + return { + t: { + _t: 'general-enclosed', + tokens: t.slice(e, r), + start: i.start, + end: (null !== (n = t.at(r)) && void 0 !== n ? n : t[r - 1]).end + }, + i: r + } + } +} +exports.matchInParens = (t, e = 0) => { + const n = (0, exports.matchFeature)(t, e) + if (n) return {t: {_t: 'in-parens', node: n.t}, i: n.i} + const i = t.at(e) + if ('(' === (null == i ? void 0 : i._t)) { + const n = (0, exports.matchCondition)(t, e + 1) + if (n) { + const e = t.at(n.i) + if (')' === (null == e ? void 0 : e._t)) return {t: {_t: 'in-parens', node: n.t}, i: n.i + 1} + } + } + const o = (0, exports.matchGeneralEnclosed)(t, e) + return o ? {t: {_t: 'in-parens', node: o.t}, i: o.i} : void 0 +} +exports.matchOr = (t, e = 0) => { + const n = t.at(e) + if ('ident' === (null == n ? void 0 : n._t) && 'or' === n.value) { + const n = (0, exports.matchInParens)(t, e + 1) + if (n) return {t: n.t, i: n.i} + } +} +exports.matchAnd = (t, e = 0) => { + const n = t.at(e) + if ('ident' === (null == n ? void 0 : n._t) && 'and' === n.value) { + const n = (0, exports.matchInParens)(t, e + 1) + if (n) return {t: n.t, i: n.i} + } +} +exports.matchNot = (t, e = 0) => { + const n = t.at(e) + if ('ident' === (null == n ? void 0 : n._t) && 'not' === n.value) { + const n = (0, exports.matchInParens)(t, e + 1) + if (n) return {t: n.t, i: n.i} + } +} +exports.matchCondition = (t, e = 0) => { + const n = (0, exports.matchNot)(t, e) + if (n) + return { + t: {_t: 'condition', op: 'not', nodes: [n.t], start: t[e].start, end: t[n.i - 1].end}, + i: n.i + } + { + const n = (0, exports.matchInParens)(t, e) + if (n) { + const i = (0, exports.matchAnd)(t, n.i) + if (i) { + const o = [i.t] + let r = i.i, + a = (0, exports.matchAnd)(t, i.i) + for (; a; ) o.push(a.t), (r = a.i), (a = (0, exports.matchAnd)(t, a.i)) + return { + t: {_t: 'condition', op: 'and', nodes: [n.t, ...o], start: t[e].start, end: t[r - 1].end}, + i: r + } + } + const o = (0, exports.matchOr)(t, n.i) + if (o) { + const i = [o.t] + let r = o.i, + a = (0, exports.matchOr)(t, o.i) + for (; a; ) i.push(a.t), (r = a.i), (a = (0, exports.matchOr)(t, a.i)) + return { + t: {_t: 'condition', op: 'or', nodes: [n.t, ...i], start: t[e].start, end: t[r - 1].end}, + i: r + } + } + return { + t: {_t: 'condition', op: 'and', nodes: [n.t], start: t[e].start, end: t[n.i - 1].end}, + i: n.i + } + } + } +} +exports.matchConditionWithoutOr = (t, e = 0) => { + const n = (0, exports.matchNot)(t, e) + if (n) + return { + t: {_t: 'condition', op: 'not', nodes: [n.t], start: t[e].start, end: t[n.i - 1].end}, + i: n.i + } + { + const n = (0, exports.matchInParens)(t, e) + if (n) { + const i = (0, exports.matchAnd)(t, n.i) + if (i) { + const o = [i.t] + let r = i.i, + a = (0, exports.matchAnd)(t, i.i) + for (; a; ) o.push(a.t), (r = a.i), (a = (0, exports.matchAnd)(t, a.i)) + return { + t: {_t: 'condition', op: 'and', nodes: [n.t, ...o], start: t[e].start, end: t[r - 1].end}, + i: r + } + } + return { + t: {_t: 'condition', op: 'and', nodes: [n.t], start: t[e].start, end: t[n.i - 1].end}, + i: n.i + } + } + } +} +exports.matchQuery = t => { + const e = (0, exports.matchCondition)(t, 0) + if (e) return {t: {_t: 'query', condition: e.t, start: 0, end: t[e.i - 1].end}, i: e.i} + { + const e = t.at(0) + if ('ident' === (null == e ? void 0 : e._t)) { + if ('not' === e.value || 'only' === e.value) { + const n = t.at(1) + if ('ident' === (null == n ? void 0 : n._t)) { + const i = t.at(2) + if ('ident' === (null == i ? void 0 : i._t) && 'and' === i.value) { + const i = (0, exports.matchConditionWithoutOr)(t, 3) + if (i) + return { + t: { + _t: 'query', + condition: i.t, + type: n.value, + prefix: e.value, + start: 0, + end: t[i.i - 1].end + }, + i: i.i + } + } + return {t: {_t: 'query', type: n.value, prefix: e.value, start: 0, end: n.end}, i: 2} + } + } + const n = t.at(1) + if ('ident' === (null == n ? void 0 : n._t) && 'and' === n.value) { + const n = (0, exports.matchConditionWithoutOr)(t, 2) + if (n) + return { + t: {_t: 'query', condition: n.t, type: e.value, start: 0, end: t[n.i - 1].end}, + i: n.i + } + } + return {t: {_t: 'query', type: e.value, start: 0, end: e.end}, i: 1} + } + } +} +exports.matchQueryList = t => { + const e = (0, exports.splitMediaQueryList)(t) + if (1 === e.length && 0 === e[0].length) + return {_t: 'query-list', nodes: [{_t: 'query', type: 'all', start: 0, end: 0}]} + { + const t = [] + for (const n of e) { + const e = (0, exports.matchQuery)(n) + e && e.i === n.length ? t.push(e.t) : t.push(void 0) + } + return {_t: 'query-list', nodes: t} + } +} +exports.splitMediaQueryList = t => { + const e = [[]], + n = [] + for (const i of t) + if ('comma' === i._t && 0 === n.length) e.push([]) + else { + switch (i._t) { + case 'function': + case '(': + n.push(')') + break + case '[': + n.push(']') + break + case '{': + n.push('}') + break + case ')': + case ']': + case '}': + n.at(-1) === i._t && n.pop() + break + } + e[e.length - 1].push(i) + } + return e +} diff --git a/vendor/media-query-parser/dist/cjs/generator/generator.d.ts b/vendor/media-query-parser/dist/cjs/generator/generator.d.ts new file mode 100644 index 000000000..5fe684bff --- /dev/null +++ b/vendor/media-query-parser/dist/cjs/generator/generator.d.ts @@ -0,0 +1,16 @@ +import { QueryListNode, QueryNode, ConditionNode, FeatureNode, BooleanFeatureNode, PlainFeatureNode, ValueNode, RatioNode, IdentNode, NumberNode, ConditionWithoutOrNode, InParensNode, DimensionNode, RangeFeatureNode, DoubleRangeFeatureNode, SingleRangeFeatureNode } from "../utils.js"; +export declare const generateQueryList: (queryList: QueryListNode) => string; +export declare const generateQuery: (mediaQuery: QueryNode) => string; +export declare const generateInParens: (inParens: InParensNode) => string; +export declare const generateCondition: (condition: ConditionNode | ConditionWithoutOrNode) => string; +export declare const generateFeature: (feature: FeatureNode) => string; +export declare const generateFeatureBoolean: (feature: BooleanFeatureNode) => string; +export declare const generateFeatureValue: (feature: PlainFeatureNode) => string; +export declare const generateFeatureRange: (feature: RangeFeatureNode) => string; +export declare const generateFeatureSingleRange: (feature: SingleRangeFeatureNode) => string; +export declare const generateFeatureDoubleRange: (feature: DoubleRangeFeatureNode) => string; +export declare const generateValue: (value: ValueNode) => string; +export declare const generateRatio: (ratio: RatioNode) => string; +export declare const generateNumber: (number: NumberNode) => string; +export declare const generateDimension: (dimension: DimensionNode) => string; +export declare const generateIdent: (ident: IdentNode) => string; diff --git a/vendor/media-query-parser/dist/cjs/generator/generator.js b/vendor/media-query-parser/dist/cjs/generator/generator.js new file mode 100644 index 000000000..51d0935c1 --- /dev/null +++ b/vendor/media-query-parser/dist/cjs/generator/generator.js @@ -0,0 +1,78 @@ +Object.defineProperty(exports, '__esModule', {value: !0}), + (exports.generateIdent = + exports.generateDimension = + exports.generateNumber = + exports.generateRatio = + exports.generateValue = + exports.generateFeatureDoubleRange = + exports.generateFeatureSingleRange = + exports.generateFeatureRange = + exports.generateFeatureValue = + exports.generateFeatureBoolean = + exports.generateFeature = + exports.generateCondition = + exports.generateInParens = + exports.generateQuery = + exports.generateQueryList = + void 0) +exports.generateQueryList = e => + e.nodes.map(e => (e ? (0, exports.generateQuery)(e) : 'not all')).join(', ') +exports.generateQuery = e => { + var t + let r = '' + e.prefix && (r += e.prefix + ' ') + return ( + (void 0 !== e.prefix || !e.condition || void 0 !== e.type) && + ((r += null !== (t = e.type) && void 0 !== t ? t : 'all'), e.condition && (r += ' and')), + e.condition && ('' !== r && (r += ' '), (r += (0, exports.generateCondition)(e.condition))), + r + ) +} +exports.generateInParens = e => + 'condition' === e.node._t + ? '(' + (0, exports.generateCondition)(e.node) + ')' + : 'feature' === e.node._t + ? (0, exports.generateFeature)(e.node) + : '(general enclosed)' +exports.generateCondition = e => { + var t + return 'not' === e.op + ? 'not ' + (0, exports.generateInParens)(e.nodes[0]) + : (null !== (t = e.nodes) && void 0 !== t ? t : []) + .map(e => `${(0, exports.generateInParens)(e)}`) + .join(` ${e.op} `) +} +exports.generateFeature = e => { + let t = '(' + return ( + 'boolean' === e.context + ? (t += (0, exports.generateFeatureBoolean)(e)) + : 'value' === e.context + ? (t += (0, exports.generateFeatureValue)(e)) + : (t += (0, exports.generateFeatureRange)(e)), + (t += ')'), + t + ) +} +exports.generateFeatureBoolean = e => e.feature +exports.generateFeatureValue = e => e.feature + ': ' + (0, exports.generateValue)(e.value) +exports.generateFeatureRange = e => + 1 === e.ops + ? (0, exports.generateFeatureSingleRange)(e) + : (0, exports.generateFeatureDoubleRange)(e) +exports.generateFeatureSingleRange = e => + `${e.feature} ${e.op} ${(0, exports.generateValue)(e.value)}` +exports.generateFeatureDoubleRange = e => + `${(0, exports.generateValue)(e.minValue)} ${e.minOp} ${e.feature} ${e.maxOp} ${(0, exports.generateValue)(e.maxValue)}` +exports.generateValue = e => + 'dimension' === e._t + ? (0, exports.generateDimension)(e) + : 'ident' === e._t + ? (0, exports.generateIdent)(e) + : 'ratio' === e._t + ? (0, exports.generateRatio)(e) + : (0, exports.generateNumber)(e) +exports.generateRatio = e => `${e.left}/${e.right}` +exports.generateNumber = e => `${e.value}` +exports.generateDimension = e => `${e.value}${e.unit}` +exports.generateIdent = e => e.value diff --git a/vendor/media-query-parser/dist/cjs/index.d.ts b/vendor/media-query-parser/dist/cjs/index.d.ts new file mode 100644 index 000000000..4f9333839 --- /dev/null +++ b/vendor/media-query-parser/dist/cjs/index.d.ts @@ -0,0 +1,165 @@ +import { ConditionNode, FeatureNode, ParserError, QueryListNode, QueryNode, ValueNode } from "./utils.js"; +/** + * creates an AST from a **media-query-list** string; parses comma-separated media queries correctly + * + * Important: + * + * - _an invalid media-query child **does not** make the media-query-list invalid_ + * - each invalid media query child is replaced with undefined + * - can **return** a ParserError (e.g. when there is a CSS syntax error, like an invalid string) + * + * @example + * ```ts + * console.log(parseMediaQueryList(`print, #invalid, (min-width: 1000px)`)); + * // { + * // _t: "query-list", + * // nodes: [ + * // { _t: "query", type: "print", start: 0, end: 4 }, + * // undefined, + * // { + * // _t: "query", + * // condition: { + * // _t: "condition", + * // op: "and", + * // nodes: [ + * // { + * // _t: "in-parens", + * // node: { + * // _t: "feature", + * // context: "value", + * // feature: "min-width", + * // value: { _t: "dimension", value: 1000, unit: "px", start: 29, end: 34 }, + * // start: 18, + * // end: 34, + * // }, + * // }, + * // ], + * // start: 17, + * // end: 35, + * // }, + * // start: 0, + * // end: 35, + * // }, + * // ], + * // } + * ``` + */ +export declare const parseMediaQueryList: (str: string) => QueryListNode | ParserError; +/** + * creates an AST from a **media-query** string + * @example + * ```ts + * console.log(parseMediaQuery(`screen and (monochrome)`)); + * // { + * // _t: "query", + * // condition: { + * // _t: "condition", + * // op: "and", + * // nodes: [ + * // { + * // _t: "in-parens", + * // node: { _t: "feature", context: "boolean", feature: "monochrome", start: 12, end: 21 }, + * // }, + * // ], + * // start: 11, + * // end: 22, + * // }, + * // type: "screen", + * // start: 0, + * // end: 22, + * // } + * ``` + */ +export declare const parseMediaQuery: (str: string) => QueryNode | ParserError; +/** + * creates an AST from a **media-condition** string + * + * @example + * ```ts + * console.log(parseMediaCondition(`((aspect-ratio > 1/2) or (monochrome))`)); + * // { + * // _t: "condition", + * // op: "and", + * // nodes: [ + * // { + * // _t: "in-parens", + * // node: { + * // _t: "condition", + * // op: "or", + * // nodes: [ + * // { + * // _t: "in-parens", + * // node: { + * // _t: "feature", + * // context: "range", + * // feature: "aspect-ratio", + * // ops: 1, + * // op: ">", + * // value: { _t: "ratio", left: 1, right: 2, start: 17, end: 19 }, + * // start: 2, + * // end: 19, + * // }, + * // }, + * // { + * // _t: "in-parens", + * // node: { _t: "feature", context: "boolean", feature: "monochrome", start: 26, end: 35 }, + * // }, + * // ], + * // start: 1, + * // end: 36, + * // }, + * // }, + * // ], + * // start: 0, + * // end: 37, + * // } + * ``` + */ +export declare const parseMediaCondition: (str: string) => ConditionNode | ParserError; +/** + * creates an AST from a **media-feature** string - including parentheses + * + * @example + * ```ts + * console.log(parseMediaFeature(`(min-width: 768px)`)); + * // { + * // _t: "feature", + * // context: "value", + * // feature: "min-width", + * // value: { _t: "dimension", value: 768, unit: "px", start: 12, end: 16 }, + * // start: 1, + * // end: 16, + * // } + * ``` + */ +export declare const parseMediaFeature: (str: string) => FeatureNode | ParserError; +/** + * turns an AST into an equivalent string + * + * @example + * ```ts + * console.log( + * stringify({ + * "_t": "query", + * "condition": { + * "_t": "condition", + * "op": "and", + * "nodes": [ + * { + * "_t": "in-parens", + * "node": { + * "_t": "feature", + * "context": "boolean", + * "feature": "monochrome", + * } + * } + * ], + * }, + * "type": "screen", + * }) + * ); + * // 'screen and (monochrome)' + * ``` + */ +export declare const stringify: (node: QueryListNode | QueryNode | ConditionNode | FeatureNode | ValueNode) => string; +export * from "./utils.js"; diff --git a/vendor/media-query-parser/dist/cjs/index.js b/vendor/media-query-parser/dist/cjs/index.js new file mode 100644 index 000000000..dcd1406a8 --- /dev/null +++ b/vendor/media-query-parser/dist/cjs/index.js @@ -0,0 +1,118 @@ +/**! media-query-parser | Tom Golden (https://tom.bio) | @license MIT */ +/*! v3.0.2 */ +var e = + (this && this.__createBinding) || + (Object.create + ? function (e, r, t, i) { + void 0 === i && (i = t) + var n = Object.getOwnPropertyDescriptor(r, t) + ;(n && !('get' in n ? !r.__esModule : n.writable || n.configurable)) || + (n = { + enumerable: !0, + get: function () { + return r[t] + } + }), + Object.defineProperty(e, i, n) + } + : function (e, r, t, i) { + void 0 === i && (i = t), (e[i] = r[t]) + }), + r = + (this && this.__exportStar) || + function (r, t) { + for (var i in r) 'default' === i || Object.prototype.hasOwnProperty.call(t, i) || e(t, r, i) + } +Object.defineProperty(exports, '__esModule', {value: !0}), + (exports.stringify = + exports.parseMediaFeature = + exports.parseMediaCondition = + exports.parseMediaQuery = + exports.parseMediaQueryList = + void 0) +const t = require('./ast/ast.js'), + i = require('./generator/generator.js'), + n = require('./lexer/lexer.js'), + o = require('./utils.js') +exports.parseMediaQueryList = e => { + const r = (0, n.lexer)(e) + return (0, o.isParserError)(r) ? r : (0, t.matchQueryList)(r) +} +exports.parseMediaQuery = e => { + var r, i, a, s + const u = (0, n.lexer)(e) + if ((0, o.isParserError)(u)) return u + { + const e = (0, t.matchQuery)(u) + return e && e.i === u.length + ? e.t + : { + _errid: 'INVALID_QUERY', + start: + null !== (i = null === (r = u.at(0)) || void 0 === r ? void 0 : r.start) && void 0 !== i + ? i + : 0, + end: + null !== (s = null === (a = u.at(-1)) || void 0 === a ? void 0 : a.end) && void 0 !== s + ? s + : 0 + } + } +} +exports.parseMediaCondition = e => { + var r, i, a, s + const u = (0, n.lexer)(e) + if ((0, o.isParserError)(u)) return u + { + const e = (0, t.matchCondition)(u) + return e && e.i === u.length + ? e.t + : { + _errid: 'INVALID_CONDITION', + start: + null !== (i = null === (r = u.at(0)) || void 0 === r ? void 0 : r.start) && void 0 !== i + ? i + : 0, + end: + null !== (s = null === (a = u.at(-1)) || void 0 === a ? void 0 : a.end) && void 0 !== s + ? s + : 0 + } + } +} +exports.parseMediaFeature = e => { + var r, i, a, s + const u = (0, n.lexer)(e) + if ((0, o.isParserError)(u)) return u + { + const e = (0, t.matchFeature)(u) + return e && e.i === u.length + ? e.t + : { + _errid: 'INVALID_FEATURE', + start: + null !== (i = null === (r = u.at(0)) || void 0 === r ? void 0 : r.start) && void 0 !== i + ? i + : 0, + end: + null !== (s = null === (a = u.at(-1)) || void 0 === a ? void 0 : a.end) && void 0 !== s + ? s + : 0 + } + } +} +;(exports.stringify = e => { + switch (e._t) { + case 'query-list': + return (0, i.generateQueryList)(e) + case 'query': + return (0, i.generateQuery)(e) + case 'condition': + return (0, i.generateCondition)(e) + case 'feature': + return (0, i.generateFeature)(e) + default: + return (0, i.generateValue)(e) + } +}), + r(require('./utils.js'), exports) diff --git a/vendor/media-query-parser/dist/cjs/internals.d.ts b/vendor/media-query-parser/dist/cjs/internals.d.ts new file mode 100644 index 000000000..d7c0d302c --- /dev/null +++ b/vendor/media-query-parser/dist/cjs/internals.d.ts @@ -0,0 +1,3 @@ +export type Simplify = { + [KeyType in keyof T]: T[KeyType]; +} & {}; diff --git a/vendor/media-query-parser/dist/cjs/internals.js b/vendor/media-query-parser/dist/cjs/internals.js new file mode 100644 index 000000000..5d0d8e99d --- /dev/null +++ b/vendor/media-query-parser/dist/cjs/internals.js @@ -0,0 +1 @@ +Object.defineProperty(exports, '__esModule', {value: !0}) diff --git a/vendor/media-query-parser/dist/cjs/lexer/codepoints.d.ts b/vendor/media-query-parser/dist/cjs/lexer/codepoints.d.ts new file mode 100644 index 000000000..75ca3ab61 --- /dev/null +++ b/vendor/media-query-parser/dist/cjs/lexer/codepoints.d.ts @@ -0,0 +1 @@ +export declare const readCodepoints: (cssStr: string) => number[]; diff --git a/vendor/media-query-parser/dist/cjs/lexer/codepoints.js b/vendor/media-query-parser/dist/cjs/lexer/codepoints.js new file mode 100644 index 000000000..fd8a19b03 --- /dev/null +++ b/vendor/media-query-parser/dist/cjs/lexer/codepoints.js @@ -0,0 +1,39 @@ +Object.defineProperty(exports, '__esModule', {value: !0}), (exports.readCodepoints = void 0) +let e +exports.readCodepoints = s => { + const t = (() => { + let s + return e ? (s = e) : ((s = new TextEncoder()), (e = s)), s + })().encode(s), + r = [], + o = t.length + for (let e = 0; e < o; e += 1) { + const s = t.at(e) + if (s < 128) + switch (s) { + case 0: + r.push(65533) + break + case 12: + r.push(10) + break + case 13: + r.push(10), 10 === t.at(e + 1) && (e += 1) + break + default: + r.push(s) + } + else + s < 224 + ? r.push(((s << 59) >>> 53) | ((t[++e] << 58) >>> 58)) + : s < 240 + ? r.push(((s << 60) >>> 48) | ((t[++e] << 58) >>> 52) | ((t[++e] << 58) >>> 58)) + : r.push( + ((s << 61) >>> 43) | + ((t[++e] << 58) >>> 46) | + ((t[++e] << 58) >>> 52) | + ((t[++e] << 58) >>> 58) + ) + } + return r +} diff --git a/vendor/media-query-parser/dist/cjs/lexer/lexer.d.ts b/vendor/media-query-parser/dist/cjs/lexer/lexer.d.ts new file mode 100644 index 000000000..81afab517 --- /dev/null +++ b/vendor/media-query-parser/dist/cjs/lexer/lexer.d.ts @@ -0,0 +1,2 @@ +import { ParserToken, ParserError } from "../utils.js"; +export declare const lexer: (cssStr: string) => ParserToken[] | ParserError; diff --git a/vendor/media-query-parser/dist/cjs/lexer/lexer.js b/vendor/media-query-parser/dist/cjs/lexer/lexer.js new file mode 100644 index 000000000..194be4ae3 --- /dev/null +++ b/vendor/media-query-parser/dist/cjs/lexer/lexer.js @@ -0,0 +1,9 @@ +Object.defineProperty(exports, '__esModule', {value: !0}), (exports.lexer = void 0) +const e = require('../utils.js'), + r = require('./codepoints.js'), + o = require('./process.js'), + s = require('./tokens.js') +exports.lexer = t => { + const i = (0, s.codepointsToTokens)((0, r.readCodepoints)(t)) + return (0, e.isParserError)(i) ? i : (0, o.convertToParserTokens)(i) +} diff --git a/vendor/media-query-parser/dist/cjs/lexer/process.d.ts b/vendor/media-query-parser/dist/cjs/lexer/process.d.ts new file mode 100644 index 000000000..6ce0ed8f0 --- /dev/null +++ b/vendor/media-query-parser/dist/cjs/lexer/process.d.ts @@ -0,0 +1,2 @@ +import { LexerToken, ParserToken, ParserError } from "../utils.js"; +export declare const convertToParserTokens: (cssTokens: LexerToken[]) => ParserToken[] | ParserError; diff --git a/vendor/media-query-parser/dist/cjs/lexer/process.js b/vendor/media-query-parser/dist/cjs/lexer/process.js new file mode 100644 index 000000000..316130175 --- /dev/null +++ b/vendor/media-query-parser/dist/cjs/lexer/process.js @@ -0,0 +1,20 @@ +Object.defineProperty(exports, '__esModule', {value: !0}), (exports.convertToParserTokens = void 0) +exports.convertToParserTokens = e => { + const r = [] + let t = !1 + for (const s of e) + switch (s._t) { + case '{': + return {_errid: 'NO_LCURLY', start: s.start, end: s.end} + case 'semicolon': + return {_errid: 'NO_SEMICOLON', start: s.start, end: s.end} + case 'whitespace': + t = !0 + break + case 'EOF': + break + default: + r.push(Object.assign(Object.assign({}, s), {isAfterSpace: t})), (t = !1) + } + return r +} diff --git a/vendor/media-query-parser/dist/cjs/lexer/tokens.d.ts b/vendor/media-query-parser/dist/cjs/lexer/tokens.d.ts new file mode 100644 index 000000000..ba53131e3 --- /dev/null +++ b/vendor/media-query-parser/dist/cjs/lexer/tokens.d.ts @@ -0,0 +1,14 @@ +import { LexerToken, ParserError } from "../utils.js"; +export declare const codepointsToTokens: (codepoints: number[], index?: number) => LexerToken[] | ParserError; +export declare const consumeString: (codepoints: number[], index: number) => [number, string] | null; +export declare const wouldStartIdentifier: (codepoints: number[], index: number) => boolean; +export declare const consumeEscape: (codepoints: number[], index: number) => [number, number] | null; +export declare const consumeNumeric: (codepoints: number[], index: number) => [ + number, + (["number", number, "number" | "integer"] | ["percentage", number] | ["dimension", number, string]) +] | null; +export declare const consumeNumber: (codepoints: number[], index: number) => [number, number, "integer" | "number"] | null; +export declare const consumeIdentUnsafe: (codepoints: number[], index: number) => [number, string] | null; +export declare const consumeIdent: (codepoints: number[], index: number) => [number, string] | null; +export declare const consumeUrl: (codepoints: number[], index: number) => [number, string] | null; +export declare const consumeIdentLike: (codepoints: number[], index: number) => [number, string, "ident" | "function" | "url"] | null; diff --git a/vendor/media-query-parser/dist/cjs/lexer/tokens.js b/vendor/media-query-parser/dist/cjs/lexer/tokens.js new file mode 100644 index 000000000..1c7c74dba --- /dev/null +++ b/vendor/media-query-parser/dist/cjs/lexer/tokens.js @@ -0,0 +1,397 @@ +Object.defineProperty(exports, '__esModule', {value: !0}), + (exports.consumeIdentLike = + exports.consumeUrl = + exports.consumeIdent = + exports.consumeIdentUnsafe = + exports.consumeNumber = + exports.consumeNumeric = + exports.consumeEscape = + exports.wouldStartIdentifier = + exports.consumeString = + exports.codepointsToTokens = + void 0) +const t = 10, + e = 32, + n = 45, + s = 48, + r = 57, + u = 65, + o = 92, + l = 97, + i = 122, + a = 128 +exports.codepointsToTokens = (f, c = 0) => { + const p = [] + for (; c < f.length; c += 1) { + const d = f.at(c), + m = c + if (47 === d && 42 === f.at(c + 1)) { + c += 2 + for (let t = f.at(c); void 0 !== t; t = f.at(++c)) + if (42 === t && 47 === f.at(c + 1)) { + c += 1 + break + } + } else if (9 === d || d === e || d === t) { + let n = f.at(++c) + for (; 9 === n || n === e || n === t; ) n = f.at(++c) + c -= 1 + const s = p.at(-1) + 'whitespace' === (null == s ? void 0 : s._t) + ? (p.pop(), p.push({_t: 'whitespace', start: s.start, end: c})) + : p.push({_t: 'whitespace', start: m, end: c}) + } else if (34 === d) { + const t = (0, exports.consumeString)(f, c) + if (null === t) return {_errid: 'INVALID_STRING', start: c, end: c} + const [e, n] = t + ;(c = e), p.push({_t: 'string', value: n, start: m, end: c}) + } else if (35 === d) { + if (c + 1 < f.length) { + const e = f.at(c + 1) + if ( + 95 === e || + (e >= u && e <= 90) || + (e >= l && e <= i) || + e >= a || + (e >= s && e <= r) || + (e === o && c + 2 < f.length && f.at(c + 2) !== t) + ) { + const t = (0, exports.wouldStartIdentifier)(f, c + 1) ? 'id' : 'unrestricted', + e = (0, exports.consumeIdentUnsafe)(f, c + 1) + if (null !== e) { + const [n, s] = e + ;(c = n), p.push({_t: 'hash', value: s.toLowerCase(), flag: t, start: m, end: c}) + continue + } + } + } + p.push({_t: 'delim', value: d, start: m, end: c}) + } else if (39 === d) { + const t = (0, exports.consumeString)(f, c) + if (null === t) return {_errid: 'INVALID_STRING', start: c, end: c} + const [e, n] = t + ;(c = e), p.push({_t: 'string', value: n, start: m, end: c}) + } else if (40 === d) p.push({_t: '(', start: m, end: c}) + else if (41 === d) p.push({_t: ')', start: m, end: c}) + else if (43 === d) { + const t = (0, exports.consumeNumeric)(f, c) + if (null === t) p.push({_t: 'delim', value: d, start: m, end: c}) + else { + const [e, n] = t + ;(c = e), + 'dimension' === n[0] + ? p.push({ + _t: 'dimension', + value: n[1], + unit: n[2].toLowerCase(), + flag: 'number', + start: m, + end: c + }) + : 'number' === n[0] + ? p.push({_t: n[0], value: n[1], flag: n[2], start: m, end: c}) + : p.push({_t: n[0], value: n[1], flag: 'number', start: m, end: c}) + } + } else if (44 === d) p.push({_t: 'comma', start: m, end: c}) + else if (d === n) { + const t = (0, exports.consumeNumeric)(f, c) + if (null !== t) { + const [e, n] = t + ;(c = e), + 'dimension' === n[0] + ? p.push({ + _t: 'dimension', + value: n[1], + unit: n[2].toLowerCase(), + flag: 'number', + start: m, + end: c + }) + : 'number' === n[0] + ? p.push({_t: n[0], value: n[1], flag: n[2], start: m, end: c}) + : p.push({_t: n[0], value: n[1], flag: 'number', start: m, end: c}) + continue + } + if (c + 2 < f.length) { + const t = f.at(c + 1), + e = f.at(c + 2) + if (t === n && 62 === e) { + ;(c += 2), p.push({_t: 'CDC', start: m, end: c}) + continue + } + } + const e = (0, exports.consumeIdentLike)(f, c) + if (null !== e) { + const [t, n, s] = e + ;(c = t), p.push({_t: s, value: n, start: m, end: c}) + continue + } + p.push({_t: 'delim', value: d, start: m, end: c}) + } else if (46 === d) { + const t = (0, exports.consumeNumeric)(f, c) + if (null !== t) { + const [e, n] = t + ;(c = e), + 'dimension' === n[0] + ? p.push({ + _t: 'dimension', + value: n[1], + unit: n[2].toLowerCase(), + flag: 'number', + start: m, + end: c + }) + : 'number' === n[0] + ? p.push({_t: n[0], value: n[1], flag: n[2], start: m, end: c}) + : p.push({_t: n[0], value: n[1], flag: 'number', start: m, end: c}) + continue + } + p.push({_t: 'delim', value: d, start: m, end: c}) + } else if (58 === d) p.push({_t: 'colon', start: m, end: c}) + else if (59 === d) p.push({_t: 'semicolon', start: m, end: c}) + else if (60 === d) { + if (c + 3 < f.length) { + const t = f.at(c + 1), + e = f.at(c + 2), + s = f.at(c + 3) + if (33 === t && e === n && s === n) { + ;(c += 3), p.push({_t: 'CDO', start: m, end: c}) + continue + } + } + p.push({_t: 'delim', value: d, start: m, end: c}) + } else if (64 === d) { + const t = (0, exports.consumeIdent)(f, c + 1) + if (null !== t) { + const [e, n] = t + ;(c = e), p.push({_t: 'at-keyword', value: n.toLowerCase(), start: m, end: c}) + continue + } + p.push({_t: 'delim', value: d, start: m, end: c}) + } else if (91 === d) p.push({_t: '[', start: m, end: c}) + else if (93 === d) p.push({_t: ']', start: m, end: c}) + else if (123 === d) p.push({_t: '{', start: m, end: c}) + else if (125 === d) p.push({_t: '}', start: m, end: c}) + else if (d >= s && d <= r) { + const t = (0, exports.consumeNumeric)(f, c), + [e, n] = t + ;(c = e), + 'dimension' === n[0] + ? p.push({ + _t: 'dimension', + value: n[1], + unit: n[2].toLowerCase(), + flag: 'number', + start: m, + end: c + }) + : 'number' === n[0] + ? p.push({_t: n[0], value: n[1], flag: n[2], start: m, end: c}) + : p.push({_t: n[0], value: n[1], flag: 'number', start: m, end: c}) + } else if (95 === d || (d >= u && d <= 90) || (d >= l && d <= i) || d >= a || d === o) { + const t = (0, exports.consumeIdentLike)(f, c) + if (null === t) p.push({_t: 'delim', value: d, start: m, end: c}) + else { + const [e, n, s] = t + ;(c = e), p.push({_t: s, value: n, start: m, end: c}) + } + } else p.push({_t: 'delim', value: d, start: m, end: c}) + } + return p.push({_t: 'EOF', start: c, end: c}), p +} +exports.consumeString = (e, n) => { + if (e.length <= n + 1) return null + const s = e.at(n), + r = [] + for (let u = n + 1; u < e.length; u += 1) { + const n = e.at(u) + if (n === s) return [u, String.fromCodePoint(...r)] + if (n === o) { + const t = (0, exports.consumeEscape)(e, u) + if (null === t) return null + const [n, s] = t + r.push(s), (u = n) + } else { + if (n === t) return null + r.push(n) + } + } + return null +} +exports.wouldStartIdentifier = (e, s) => { + const r = e.at(s) + if (void 0 === r) return !1 + if (r === n) { + const r = e.at(s + 1) + if (void 0 === r) return !1 + if (r === n || 95 === r || (r >= u && r <= 90) || (r >= l && r <= i) || r >= a) return !0 + if (r === o) { + if (e.length <= s + 2) return !1 + return e.at(s + 2) !== t + } + return !1 + } + if (95 === r || (r >= u && r <= 90) || (r >= l && r <= i) || r >= a) return !0 + if (r === o) { + if (e.length <= s + 1) return !1 + return e.at(s + 1) !== t + } + return !1 +} +exports.consumeEscape = (n, i) => { + if (n.length <= i + 1) return null + if (n.at(i) !== o) return null + const a = n.at(i + 1) + if (a === t) return null + if ((a >= s && a <= r) || (a >= u && a <= 70) || (a >= l && a <= 102)) { + const o = [a], + f = Math.min(i + 7, n.length) + let c = i + 2 + for (; c < f; c += 1) { + const t = n.at(c) + if (!((t >= s && t <= r) || (t >= u && t <= 70) || (t >= l && t <= 102))) break + o.push(t) + } + if (c < n.length) { + const s = n.at(c) + ;(9 !== s && s !== e && s !== t) || (c += 1) + } + return [c - 1, Number.parseInt(String.fromCodePoint(...o), 16)] + } + return [i + 1, a] +} +exports.consumeNumeric = (t, e) => { + const n = (0, exports.consumeNumber)(t, e) + if (null === n) return null + const [s, r, u] = n, + o = (0, exports.consumeIdent)(t, s + 1) + if (null !== o) { + const [t, e] = o + return [t, ['dimension', r, e]] + } + return s + 1 < t.length && 37 === t.at(s + 1) ? [s + 1, ['percentage', r]] : [s, ['number', r, u]] +} +exports.consumeNumber = (t, e) => { + const u = t.at(e) + if (void 0 === u) return null + let o = 'integer' + const l = [] + for ((43 !== u && u !== n) || ((e += 1), u === n && l.push(n)); e < t.length; ) { + const n = t.at(e) + if (!(n >= s && n <= r)) break + l.push(n), (e += 1) + } + if (e + 1 < t.length) { + const n = t.at(e), + u = t.at(e + 1) + if (46 === n && u >= s && u <= r) + for (l.push(n, u), o = 'number', e += 2; e < t.length; ) { + const n = t.at(e) + if (!(n >= s && n <= r)) break + l.push(n), (e += 1) + } + } + if (e + 1 < t.length) { + const u = t.at(e), + i = t.at(e + 1), + a = t.at(e + 2) + if (69 === u || 101 === u) { + let u = !1 + if ( + (i >= s && i <= r + ? (l.push(69, i), (e += 2), (u = !0)) + : (i === n || 43 === i) && + void 0 !== a && + a >= s && + a <= r && + (l.push(69), i === n && l.push(n), l.push(a), (e += 3), (u = !0)), + u) + ) + for (o = 'number'; e < t.length; ) { + const n = t.at(e) + if (!(n >= s && n <= r)) break + l.push(n), (e += 1) + } + } + } + const i = String.fromCodePoint(...l) + let a = 'number' === o ? Number.parseFloat(i) : Number.parseInt(i) + return 0 === a && (a = 0), Number.isNaN(a) ? null : [e - 1, a, o] +} +exports.consumeIdentUnsafe = (t, e) => { + if (t.length <= e) return null + const o = [] + for (let f = t.at(e); e < t.length; f = t.at(++e)) { + if ( + !( + f === n || + 95 === f || + (f >= u && f <= 90) || + (f >= l && f <= i) || + f >= a || + (f >= s && f <= r) + ) + ) { + { + const n = (0, exports.consumeEscape)(t, e) + if (null !== n) { + const [t, s] = n + o.push(s), (e = t) + continue + } + } + break + } + o.push(f) + } + return 0 === e ? null : [e - 1, String.fromCodePoint(...o)] +} +exports.consumeIdent = (t, e) => + (0, exports.wouldStartIdentifier)(t, e) ? (0, exports.consumeIdentUnsafe)(t, e) : null +exports.consumeUrl = (n, s) => { + let r = n.at(s) + for (; 9 === r || r === e || r === t; ) r = n.at(++s) + const u = [] + let l = !1 + for (; s < n.length; ) { + if (41 === r) return [s, String.fromCodePoint(...u)] + if (34 === r || 39 === r || 40 === r) return null + if (9 === r || r === e || r === t) !l && u.length > 0 && (l = !0) + else if (r === o) { + const t = (0, exports.consumeEscape)(n, s) + if (null === t || l) return null + const [e, r] = t + u.push(r), (s = e) + } else { + if (l) return null + u.push(r) + } + r = n.at(++s) + } + return null +} +exports.consumeIdentLike = (n, s) => { + const r = (0, exports.consumeIdent)(n, s) + if (null === r) return null + const [u, o] = r + if ('url' === o.toLowerCase()) { + if (n.length > u + 1) { + if (40 === n.at(u + 1)) { + for (let s = 2; u + s < n.length; s += 1) { + const r = n.at(u + s) + if (34 === r || 39 === r) return [u + 1, o.toLowerCase(), 'function'] + if (9 !== r && r !== e && r !== t) { + const t = (0, exports.consumeUrl)(n, u + s) + if (null === t) return null + const [e, r] = t + return [e, r, 'url'] + } + } + return [u + 1, o.toLowerCase(), 'function'] + } + } + } else if (n.length > u + 1) { + if (40 === n.at(u + 1)) return [u + 1, o.toLowerCase(), 'function'] + } + return [u, o.toLowerCase(), 'ident'] +} diff --git a/vendor/media-query-parser/dist/cjs/package.json b/vendor/media-query-parser/dist/cjs/package.json new file mode 100644 index 000000000..5bbefffba --- /dev/null +++ b/vendor/media-query-parser/dist/cjs/package.json @@ -0,0 +1,3 @@ +{ + "type": "commonjs" +} diff --git a/vendor/media-query-parser/dist/cjs/utils.d.ts b/vendor/media-query-parser/dist/cjs/utils.d.ts new file mode 100644 index 000000000..461ce578c --- /dev/null +++ b/vendor/media-query-parser/dist/cjs/utils.d.ts @@ -0,0 +1,251 @@ +import { Simplify } from "./internals.js"; +type FileRange = { + start: number; + end: number; +}; +export type LexerToken = WhitespaceToken | StringToken | HashToken | DelimToken | CommaToken | LeftParenToken | RightParenToken | DimensionToken | NumberToken | PercentageToken | IdentToken | FunctionToken | UrlToken | CDCToken | ColonToken | SemicolonToken | CDOToken | AtKeywordToken | LeftBracketToken | RightBracketToken | LeftCurlyToken | RightCurlyToken | EOFToken; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-whitespace-token */ +export type WhitespaceToken = Simplify<{ + _t: "whitespace"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-string-token */ +export type StringToken = Simplify<{ + _t: "string"; + value: string; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-hash-token */ +export type HashToken = Simplify<{ + _t: "hash"; + value: string; + flag: "id" | "unrestricted"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-delim-token */ +export type DelimToken = Simplify<{ + _t: "delim"; + value: number; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-comma-token */ +export type CommaToken = Simplify<{ + _t: "comma"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#tokendef-open-paren */ +export type LeftParenToken = Simplify<{ + _t: "("; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#tokendef-close-paren */ +export type RightParenToken = Simplify<{ + _t: ")"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-dimension-token */ +export type DimensionToken = Simplify<{ + _t: "dimension"; + value: number; + unit: string; + flag: "number"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-number-token */ +export type NumberToken = Simplify<{ + _t: "number"; + value: number; + flag: "number" | "integer"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-percentage-token */ +export type PercentageToken = Simplify<{ + _t: "percentage"; + value: number; + flag: "number"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-cdc-token */ +export type CDCToken = Simplify<{ + _t: "CDC"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-colon-token */ +export type ColonToken = Simplify<{ + _t: "colon"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-semicolon-token */ +export type SemicolonToken = Simplify<{ + _t: "semicolon"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-cdo-token */ +export type CDOToken = Simplify<{ + _t: "CDO"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-at-keyword-token */ +export type AtKeywordToken = Simplify<{ + _t: "at-keyword"; + value: string; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#tokendef-open-square */ +export type LeftBracketToken = Simplify<{ + _t: "["; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#tokendef-close-square */ +export type RightBracketToken = Simplify<{ + _t: "]"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#tokendef-open-curly */ +export type LeftCurlyToken = Simplify<{ + _t: "{"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#tokendef-close-curly */ +export type RightCurlyToken = Simplify<{ + _t: "}"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-ident-token */ +export type IdentToken = Simplify<{ + _t: "ident"; + value: string; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-function-token */ +export type FunctionToken = Simplify<{ + _t: "function"; + value: string; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-url-token */ +export type UrlToken = Simplify<{ + _t: "url"; + value: string; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-eof-token */ +export type EOFToken = Simplify<{ + _t: "EOF"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#tokenization */ +export type ParserToken = Simplify & { + isAfterSpace: boolean; +}>; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-media-query-list */ +export type QueryListNode = { + _t: "query-list"; + nodes: Array; +}; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-media-query */ +export type QueryNode = Simplify<({ + _t: "query"; + prefix?: undefined; + type?: undefined; + condition: ConditionNode; +} | { + _t: "query"; + prefix?: "not" | "only"; + type: string; + condition?: ConditionWithoutOrNode; +}) & FileRange>; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-media-feature */ +export type FeatureNode = BooleanFeatureNode | PlainFeatureNode | SingleRangeFeatureNode | DoubleRangeFeatureNode; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-mf-boolean */ +export type BooleanFeatureNode = Simplify<{ + _t: "feature"; + context: "boolean"; + feature: string; +} & FileRange>; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-mf-plain */ +export type PlainFeatureNode = Simplify<{ + _t: "feature"; + context: "value"; + feature: string; + value: ValueNode; +} & FileRange>; +/** first 2 productions of https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-mf-range */ +export type SingleRangeFeatureNode = Simplify<{ + _t: "feature"; + context: "range"; + ops: 1; + feature: string; + op: ">" | ">=" | "<" | "<=" | "="; + value: NumericValueNode; +} & FileRange>; +/** last 2 productions of https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-mf-range */ +export type DoubleRangeFeatureNode = Simplify<{ + _t: "feature"; + context: "range"; + ops: 2; + feature: string; + minOp: "<" | "<="; + minValue: NumericValueNode; + maxOp: "<" | "<="; + maxValue: NumericValueNode; +} & FileRange>; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-mf-range */ +export type RangeFeatureNode = SingleRangeFeatureNode | DoubleRangeFeatureNode; +/** https://www.w3.org/TR/2023/WD-css-values-4-20231218/#numbers */ +export type NumberNode = Simplify<{ + _t: "number"; + value: number; + flag: "number" | "integer"; +} & FileRange>; +/** https://www.w3.org/TR/2023/WD-css-values-4-20231218/#dimensions */ +export type DimensionNode = Simplify<{ + _t: "dimension"; + value: number; + unit: string; +} & FileRange>; +/** https://www.w3.org/TR/2023/WD-css-values-4-20231218/#ratios */ +export type RatioNode = Simplify<{ + _t: "ratio"; + left: number; + right: number; +} & FileRange>; +/** https://www.w3.org/TR/2023/WD-css-values-4-20231218/#keywords */ +export type IdentNode = Simplify<{ + _t: "ident"; + value: string; +} & FileRange>; +/** + * https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-mf-value + * + * (spec change pending: https://github.com/w3c/csswg-drafts/issues/8998#issuecomment-1663108401) + */ +export type NumericValueNode = NumberNode | DimensionNode | RatioNode; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-mf-value */ +export type ValueNode = NumericValueNode | IdentNode; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-media-not */ +export type NotConditionNode = Simplify<{ + _t: "condition"; + op: "not"; + nodes: [InParensNode]; +} & FileRange>; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-media-and */ +export type AndConditionNode = Simplify<{ + _t: "condition"; + op: "and"; + nodes: [InParensNode, ...InParensNode[]]; +} & FileRange>; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-media-or */ +export type OrConditionNode = Simplify<{ + _t: "condition"; + op: "or"; + nodes: [InParensNode, ...InParensNode[]]; +} & FileRange>; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-media-condition */ +export type ConditionNode = Simplify; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-media-condition-without-or */ +export type ConditionWithoutOrNode = Simplify; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-general-enclosed */ +export type GeneralEnclosedNode = Simplify<{ + _t: "general-enclosed"; + tokens: ParserToken[]; +} & FileRange>; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-media-in-parens */ +export type InParensNode = Simplify<{ + _t: "in-parens"; + node: ConditionNode | FeatureNode | GeneralEnclosedNode; +}>; +export type ParserErrId = "INVALID_QUERY" | "INVALID_CONDITION" | "INVALID_FEATURE" | "INVALID_STRING" | "NO_LCURLY" | "NO_SEMICOLON"; +/** + * Metadata about the error including an id that can be used for i18n error messages + */ +export type ParserError = { + _errid: ParserErrId; + start: number; + end: number; + child?: ParserError; +}; +/** + * a type guard that asserts whether `value` is of type ParserError + * + * tolerant of any input type, you can assume it will be true if (and only if) it is a ParserError + */ +export declare const isParserError: (value: unknown) => value is ParserError; +export {}; diff --git a/vendor/media-query-parser/dist/cjs/utils.js b/vendor/media-query-parser/dist/cjs/utils.js new file mode 100644 index 000000000..2074d24b2 --- /dev/null +++ b/vendor/media-query-parser/dist/cjs/utils.js @@ -0,0 +1,2 @@ +Object.defineProperty(exports, '__esModule', {value: !0}), (exports.isParserError = void 0) +exports.isParserError = r => 'object' == typeof r && null !== r && '_errid' in r diff --git a/vendor/media-query-parser/dist/esm/ast/ast.d.ts b/vendor/media-query-parser/dist/esm/ast/ast.d.ts new file mode 100644 index 000000000..9fb8356da --- /dev/null +++ b/vendor/media-query-parser/dist/esm/ast/ast.d.ts @@ -0,0 +1,18 @@ +import { BooleanFeatureNode, ConditionNode, ConditionWithoutOrNode, FeatureNode, GeneralEnclosedNode, InParensNode, ParserToken, PlainFeatureNode, QueryListNode, QueryNode } from "../utils.js"; +export type Match = { + t: T; + i: number; +} | undefined; +export declare const matchPlain: (ts: ParserToken[], i?: number) => Match; +export declare const matchBoolean: (ts: ParserToken[], i?: number) => Match; +export declare const matchFeature: (ts: ParserToken[], i?: number) => Match; +export declare const matchGeneralEnclosed: (ts: ParserToken[], i?: number) => Match; +export declare const matchInParens: (ts: ParserToken[], i?: number) => Match; +export declare const matchOr: (ts: ParserToken[], i?: number) => Match; +export declare const matchAnd: (ts: ParserToken[], i?: number) => Match; +export declare const matchNot: (ts: ParserToken[], i?: number) => Match; +export declare const matchCondition: (ts: ParserToken[], i?: number) => Match; +export declare const matchConditionWithoutOr: (ts: ParserToken[], i?: number) => Match; +export declare const matchQuery: (ts: ParserToken[]) => Match; +export declare const matchQueryList: (parsingTokens: ParserToken[]) => QueryListNode; +export declare const splitMediaQueryList: (tokens: ParserToken[]) => Array; diff --git a/vendor/media-query-parser/dist/esm/ast/ast.js b/vendor/media-query-parser/dist/esm/ast/ast.js new file mode 100644 index 000000000..bc12b5ba8 --- /dev/null +++ b/vendor/media-query-parser/dist/esm/ast/ast.js @@ -0,0 +1,429 @@ +const t = '<'.codePointAt(0), + n = '>'.codePointAt(0), + e = '='.codePointAt(0), + i = '/'.codePointAt(0), + a = (n, i = 0) => { + const a = n.at(i) + if ('delim' === (null == a ? void 0 : a._t) && a.value === t) { + const t = n.at(i + 1), + a = 'delim' === (null == t ? void 0 : t._t) && t.value === e && !t.isAfterSpace + return {t: {t: 'lt', isIncl: a}, i: i + (a ? 2 : 1)} + } + }, + o = (t, i = 0) => { + const a = t.at(i) + if ('delim' === (null == a ? void 0 : a._t) && a.value === n) { + const n = t.at(i + 1), + a = 'delim' === (null == n ? void 0 : n._t) && n.value === e && !n.isAfterSpace + return {t: {t: 'gt', isIncl: a}, i: i + (a ? 2 : 1)} + } + }, + r = (t, n = 0) => { + var i, r + return null !== (r = null !== (i = a(t, n)) && void 0 !== i ? i : o(t, n)) && void 0 !== r + ? r + : ((t, n = 0) => { + const i = t.at(n) + if ('delim' === (null == i ? void 0 : i._t) && i.value === e) + return {t: {t: 'eq'}, i: n + 1} + })(t, n) + }, + s = (t, n = 0) => { + const e = ((t, n = 0) => { + const e = t.at(n) + if ('number' === (null == e ? void 0 : e._t) && e.value >= 0) { + const a = t.at(n + 1) + if ('delim' === (null == a ? void 0 : a._t) && a.value === i) { + const i = t.at(n + 2) + if ('number' === (null == i ? void 0 : i._t) && i.value >= 0) + return { + t: {_t: 'ratio', left: e.value, right: i.value, start: e.start, end: i.end}, + i: n + 3 + } + } + } + })(t, n) + if (e) return e + const a = t.at(n) + if (a && ('number' === a._t || 'dimension' === a._t)) { + return { + t: + 'number' === a._t + ? {_t: 'number', value: a.value, flag: a.flag, start: a.start, end: a.end} + : {_t: 'dimension', value: a.value, unit: a.unit, start: a.start, end: a.end}, + i: n + 1 + } + } + }, + c = (t, n = 0) => { + const e = s(t, n) + if (e) return e + const i = t.at(n) + return 'ident' === (null == i ? void 0 : i._t) + ? {t: {_t: 'ident', value: i.value, start: i.start, end: i.end}, i: n + 1} + : void 0 + } +export const matchPlain = (t, n = 0) => { + const e = t.at(n) + if ('ident' === (null == e ? void 0 : e._t)) { + const i = t.at(n + 1) + if ('colon' === (null == i ? void 0 : i._t)) { + const i = c(t, n + 2) + if (i) + return { + t: { + _t: 'feature', + context: 'value', + feature: e.value, + value: i.t, + start: e.start, + end: i.t.end + }, + i: i.i + } + } + } +} +export const matchBoolean = (t, n = 0) => { + const e = t.at(n) + if ('ident' === (null == e ? void 0 : e._t)) + return { + t: {_t: 'feature', context: 'boolean', feature: e.value, start: e.start, end: e.end}, + i: n + 1 + } +} +export const matchFeature = (t, n = 0) => { + var e, i + const s = t.at(n) + if ('(' === (null == s ? void 0 : s._t)) { + const s = + null !== + (i = + null !== (e = matchPlain(t, n + 1)) && void 0 !== e + ? e + : ((t, n = 0) => { + var e + const i = c(t, n) + if (i) { + const n = r(t, i.i) + if (n) { + const r = c(t, n.i) + if (r) { + const s = null !== (e = a(t, r.i)) && void 0 !== e ? e : o(t, r.i) + if (s) { + const e = c(t, s.i) + if (e && 'ident' === r.t._t && 'ident' !== i.t._t && 'ident' !== e.t._t) { + if ('lt' === n.t.t && 'lt' === s.t.t) + return { + t: { + _t: 'feature', + context: 'range', + ops: 2, + feature: r.t.value, + minValue: i.t, + minOp: n.t.isIncl ? '<=' : '<', + maxOp: s.t.isIncl ? '<=' : '<', + maxValue: e.t, + start: i.t.start, + end: e.t.end + }, + i: e.i + } + if ('gt' === n.t.t && 'gt' === s.t.t) + return { + t: { + _t: 'feature', + context: 'range', + ops: 2, + feature: r.t.value, + minValue: e.t, + minOp: s.t.isIncl ? '<=' : '<', + maxOp: n.t.isIncl ? '<=' : '<', + maxValue: i.t, + start: i.t.start, + end: e.t.end + }, + i: e.i + } + } + } + let u = '=' + if ( + ('lt' === n.t.t + ? (u = n.t.isIncl ? '<=' : '<') + : 'gt' === n.t.t && (u = n.t.isIncl ? '>=' : '>'), + 'ident' === i.t._t && 'ident' !== r.t._t) + ) + return { + t: { + _t: 'feature', + context: 'range', + feature: i.t.value, + ops: 1, + op: u, + value: r.t, + start: i.t.start, + end: r.t.end + }, + i: r.i + } + if ('ident' === r.t._t && 'ident' !== i.t._t) { + let t = '=' + return ( + '<' === u + ? (t = '>') + : '<=' === u + ? (t = '>=') + : '>' === u + ? (t = '<') + : '>=' === u && (t = '<='), + { + t: { + _t: 'feature', + context: 'range', + feature: r.t.value, + ops: 1, + op: t, + value: i.t, + start: i.t.start, + end: r.t.end + }, + i: r.i + } + ) + } + } + } + } + })(t, n + 1)) && void 0 !== i + ? i + : matchBoolean(t, n + 1) + if (s) { + const n = t.at(s.i) + if (')' === (null == n ? void 0 : n._t)) return {t: s.t, i: s.i + 1} + } + } +} +export const matchGeneralEnclosed = (t, n = 0) => { + var e + const i = t.at(n) + if (i && ('function' === i._t || '(' === i._t)) { + const a = ['('] + let o = n + 1, + r = t.at(o) + t: for (; r; ) { + switch (r._t) { + case 'function': + case '(': + a.push('(') + break + case '{': + case '[': + a.push(r._t) + break + case ')': + if (('(' === a.at(-1) && a.pop(), 0 === a.length)) break t + break + case ']': + '[' === a.at(-1) && a.pop() + break + case '}': + '{' === a.at(-1) && a.pop() + } + r = t.at(++o) + } + if (0 === a.length) + return { + t: { + _t: 'general-enclosed', + tokens: t.slice(n, o), + start: i.start, + end: (null !== (e = t.at(o)) && void 0 !== e ? e : t[o - 1]).end + }, + i: o + } + } +} +export const matchInParens = (t, n = 0) => { + const e = matchFeature(t, n) + if (e) return {t: {_t: 'in-parens', node: e.t}, i: e.i} + const i = t.at(n) + if ('(' === (null == i ? void 0 : i._t)) { + const e = matchCondition(t, n + 1) + if (e) { + const n = t.at(e.i) + if (')' === (null == n ? void 0 : n._t)) return {t: {_t: 'in-parens', node: e.t}, i: e.i + 1} + } + } + const a = matchGeneralEnclosed(t, n) + return a ? {t: {_t: 'in-parens', node: a.t}, i: a.i} : void 0 +} +export const matchOr = (t, n = 0) => { + const e = t.at(n) + if ('ident' === (null == e ? void 0 : e._t) && 'or' === e.value) { + const e = matchInParens(t, n + 1) + if (e) return {t: e.t, i: e.i} + } +} +export const matchAnd = (t, n = 0) => { + const e = t.at(n) + if ('ident' === (null == e ? void 0 : e._t) && 'and' === e.value) { + const e = matchInParens(t, n + 1) + if (e) return {t: e.t, i: e.i} + } +} +export const matchNot = (t, n = 0) => { + const e = t.at(n) + if ('ident' === (null == e ? void 0 : e._t) && 'not' === e.value) { + const e = matchInParens(t, n + 1) + if (e) return {t: e.t, i: e.i} + } +} +export const matchCondition = (t, n = 0) => { + const e = matchNot(t, n) + if (e) + return { + t: {_t: 'condition', op: 'not', nodes: [e.t], start: t[n].start, end: t[e.i - 1].end}, + i: e.i + } + { + const e = matchInParens(t, n) + if (e) { + const i = matchAnd(t, e.i) + if (i) { + const a = [i.t] + let o = i.i, + r = matchAnd(t, i.i) + for (; r; ) a.push(r.t), (o = r.i), (r = matchAnd(t, r.i)) + return { + t: {_t: 'condition', op: 'and', nodes: [e.t, ...a], start: t[n].start, end: t[o - 1].end}, + i: o + } + } + const a = matchOr(t, e.i) + if (a) { + const i = [a.t] + let o = a.i, + r = matchOr(t, a.i) + for (; r; ) i.push(r.t), (o = r.i), (r = matchOr(t, r.i)) + return { + t: {_t: 'condition', op: 'or', nodes: [e.t, ...i], start: t[n].start, end: t[o - 1].end}, + i: o + } + } + return { + t: {_t: 'condition', op: 'and', nodes: [e.t], start: t[n].start, end: t[e.i - 1].end}, + i: e.i + } + } + } +} +export const matchConditionWithoutOr = (t, n = 0) => { + const e = matchNot(t, n) + if (e) + return { + t: {_t: 'condition', op: 'not', nodes: [e.t], start: t[n].start, end: t[e.i - 1].end}, + i: e.i + } + { + const e = matchInParens(t, n) + if (e) { + const i = matchAnd(t, e.i) + if (i) { + const a = [i.t] + let o = i.i, + r = matchAnd(t, i.i) + for (; r; ) a.push(r.t), (o = r.i), (r = matchAnd(t, r.i)) + return { + t: {_t: 'condition', op: 'and', nodes: [e.t, ...a], start: t[n].start, end: t[o - 1].end}, + i: o + } + } + return { + t: {_t: 'condition', op: 'and', nodes: [e.t], start: t[n].start, end: t[e.i - 1].end}, + i: e.i + } + } + } +} +export const matchQuery = t => { + const n = matchCondition(t, 0) + if (n) return {t: {_t: 'query', condition: n.t, start: 0, end: t[n.i - 1].end}, i: n.i} + { + const n = t.at(0) + if ('ident' === (null == n ? void 0 : n._t)) { + if ('not' === n.value || 'only' === n.value) { + const e = t.at(1) + if ('ident' === (null == e ? void 0 : e._t)) { + const i = t.at(2) + if ('ident' === (null == i ? void 0 : i._t) && 'and' === i.value) { + const i = matchConditionWithoutOr(t, 3) + if (i) + return { + t: { + _t: 'query', + condition: i.t, + type: e.value, + prefix: n.value, + start: 0, + end: t[i.i - 1].end + }, + i: i.i + } + } + return {t: {_t: 'query', type: e.value, prefix: n.value, start: 0, end: e.end}, i: 2} + } + } + const e = t.at(1) + if ('ident' === (null == e ? void 0 : e._t) && 'and' === e.value) { + const e = matchConditionWithoutOr(t, 2) + if (e) + return { + t: {_t: 'query', condition: e.t, type: n.value, start: 0, end: t[e.i - 1].end}, + i: e.i + } + } + return {t: {_t: 'query', type: n.value, start: 0, end: n.end}, i: 1} + } + } +} +export const matchQueryList = t => { + const n = splitMediaQueryList(t) + if (1 === n.length && 0 === n[0].length) + return {_t: 'query-list', nodes: [{_t: 'query', type: 'all', start: 0, end: 0}]} + { + const t = [] + for (const e of n) { + const n = matchQuery(e) + n && n.i === e.length ? t.push(n.t) : t.push(void 0) + } + return {_t: 'query-list', nodes: t} + } +} +export const splitMediaQueryList = t => { + const n = [[]], + e = [] + for (const i of t) + if ('comma' === i._t && 0 === e.length) n.push([]) + else { + switch (i._t) { + case 'function': + case '(': + e.push(')') + break + case '[': + e.push(']') + break + case '{': + e.push('}') + break + case ')': + case ']': + case '}': + e.at(-1) === i._t && e.pop() + break + } + n[n.length - 1].push(i) + } + return n +} diff --git a/vendor/media-query-parser/dist/esm/generator/generator.d.ts b/vendor/media-query-parser/dist/esm/generator/generator.d.ts new file mode 100644 index 000000000..5fe684bff --- /dev/null +++ b/vendor/media-query-parser/dist/esm/generator/generator.d.ts @@ -0,0 +1,16 @@ +import { QueryListNode, QueryNode, ConditionNode, FeatureNode, BooleanFeatureNode, PlainFeatureNode, ValueNode, RatioNode, IdentNode, NumberNode, ConditionWithoutOrNode, InParensNode, DimensionNode, RangeFeatureNode, DoubleRangeFeatureNode, SingleRangeFeatureNode } from "../utils.js"; +export declare const generateQueryList: (queryList: QueryListNode) => string; +export declare const generateQuery: (mediaQuery: QueryNode) => string; +export declare const generateInParens: (inParens: InParensNode) => string; +export declare const generateCondition: (condition: ConditionNode | ConditionWithoutOrNode) => string; +export declare const generateFeature: (feature: FeatureNode) => string; +export declare const generateFeatureBoolean: (feature: BooleanFeatureNode) => string; +export declare const generateFeatureValue: (feature: PlainFeatureNode) => string; +export declare const generateFeatureRange: (feature: RangeFeatureNode) => string; +export declare const generateFeatureSingleRange: (feature: SingleRangeFeatureNode) => string; +export declare const generateFeatureDoubleRange: (feature: DoubleRangeFeatureNode) => string; +export declare const generateValue: (value: ValueNode) => string; +export declare const generateRatio: (ratio: RatioNode) => string; +export declare const generateNumber: (number: NumberNode) => string; +export declare const generateDimension: (dimension: DimensionNode) => string; +export declare const generateIdent: (ident: IdentNode) => string; diff --git a/vendor/media-query-parser/dist/esm/generator/generator.js b/vendor/media-query-parser/dist/esm/generator/generator.js new file mode 100644 index 000000000..e7fd4e527 --- /dev/null +++ b/vendor/media-query-parser/dist/esm/generator/generator.js @@ -0,0 +1,58 @@ +export const generateQueryList = e => + e.nodes.map(e => (e ? generateQuery(e) : 'not all')).join(', ') +export const generateQuery = e => { + var t + let n = '' + e.prefix && (n += e.prefix + ' ') + return ( + (void 0 !== e.prefix || !e.condition || void 0 !== e.type) && + ((n += null !== (t = e.type) && void 0 !== t ? t : 'all'), e.condition && (n += ' and')), + e.condition && ('' !== n && (n += ' '), (n += generateCondition(e.condition))), + n + ) +} +export const generateInParens = e => + 'condition' === e.node._t + ? '(' + generateCondition(e.node) + ')' + : 'feature' === e.node._t + ? generateFeature(e.node) + : '(general enclosed)' +export const generateCondition = e => { + var t + return 'not' === e.op + ? 'not ' + generateInParens(e.nodes[0]) + : (null !== (t = e.nodes) && void 0 !== t ? t : []) + .map(e => `${generateInParens(e)}`) + .join(` ${e.op} `) +} +export const generateFeature = e => { + let t = '(' + return ( + 'boolean' === e.context + ? (t += generateFeatureBoolean(e)) + : 'value' === e.context + ? (t += generateFeatureValue(e)) + : (t += generateFeatureRange(e)), + (t += ')'), + t + ) +} +export const generateFeatureBoolean = e => e.feature +export const generateFeatureValue = e => e.feature + ': ' + generateValue(e.value) +export const generateFeatureRange = e => + 1 === e.ops ? generateFeatureSingleRange(e) : generateFeatureDoubleRange(e) +export const generateFeatureSingleRange = e => `${e.feature} ${e.op} ${generateValue(e.value)}` +export const generateFeatureDoubleRange = e => + `${generateValue(e.minValue)} ${e.minOp} ${e.feature} ${e.maxOp} ${generateValue(e.maxValue)}` +export const generateValue = e => + 'dimension' === e._t + ? generateDimension(e) + : 'ident' === e._t + ? generateIdent(e) + : 'ratio' === e._t + ? generateRatio(e) + : generateNumber(e) +export const generateRatio = e => `${e.left}/${e.right}` +export const generateNumber = e => `${e.value}` +export const generateDimension = e => `${e.value}${e.unit}` +export const generateIdent = e => e.value diff --git a/vendor/media-query-parser/dist/esm/index.d.ts b/vendor/media-query-parser/dist/esm/index.d.ts new file mode 100644 index 000000000..002a80e55 --- /dev/null +++ b/vendor/media-query-parser/dist/esm/index.d.ts @@ -0,0 +1,166 @@ +/**! media-query-parser | Tom Golden (https://tom.bio) | @license MIT */ +import { ConditionNode, FeatureNode, ParserError, QueryListNode, QueryNode, ValueNode } from "./utils.js"; +/** + * creates an AST from a **media-query-list** string; parses comma-separated media queries correctly + * + * Important: + * + * - _an invalid media-query child **does not** make the media-query-list invalid_ + * - each invalid media query child is replaced with undefined + * - can **return** a ParserError (e.g. when there is a CSS syntax error, like an invalid string) + * + * @example + * ```ts + * console.log(parseMediaQueryList(`print, #invalid, (min-width: 1000px)`)); + * // { + * // _t: "query-list", + * // nodes: [ + * // { _t: "query", type: "print", start: 0, end: 4 }, + * // undefined, + * // { + * // _t: "query", + * // condition: { + * // _t: "condition", + * // op: "and", + * // nodes: [ + * // { + * // _t: "in-parens", + * // node: { + * // _t: "feature", + * // context: "value", + * // feature: "min-width", + * // value: { _t: "dimension", value: 1000, unit: "px", start: 29, end: 34 }, + * // start: 18, + * // end: 34, + * // }, + * // }, + * // ], + * // start: 17, + * // end: 35, + * // }, + * // start: 0, + * // end: 35, + * // }, + * // ], + * // } + * ``` + */ +export declare const parseMediaQueryList: (str: string) => QueryListNode | ParserError; +/** + * creates an AST from a **media-query** string + * @example + * ```ts + * console.log(parseMediaQuery(`screen and (monochrome)`)); + * // { + * // _t: "query", + * // condition: { + * // _t: "condition", + * // op: "and", + * // nodes: [ + * // { + * // _t: "in-parens", + * // node: { _t: "feature", context: "boolean", feature: "monochrome", start: 12, end: 21 }, + * // }, + * // ], + * // start: 11, + * // end: 22, + * // }, + * // type: "screen", + * // start: 0, + * // end: 22, + * // } + * ``` + */ +export declare const parseMediaQuery: (str: string) => QueryNode | ParserError; +/** + * creates an AST from a **media-condition** string + * + * @example + * ```ts + * console.log(parseMediaCondition(`((aspect-ratio > 1/2) or (monochrome))`)); + * // { + * // _t: "condition", + * // op: "and", + * // nodes: [ + * // { + * // _t: "in-parens", + * // node: { + * // _t: "condition", + * // op: "or", + * // nodes: [ + * // { + * // _t: "in-parens", + * // node: { + * // _t: "feature", + * // context: "range", + * // feature: "aspect-ratio", + * // ops: 1, + * // op: ">", + * // value: { _t: "ratio", left: 1, right: 2, start: 17, end: 19 }, + * // start: 2, + * // end: 19, + * // }, + * // }, + * // { + * // _t: "in-parens", + * // node: { _t: "feature", context: "boolean", feature: "monochrome", start: 26, end: 35 }, + * // }, + * // ], + * // start: 1, + * // end: 36, + * // }, + * // }, + * // ], + * // start: 0, + * // end: 37, + * // } + * ``` + */ +export declare const parseMediaCondition: (str: string) => ConditionNode | ParserError; +/** + * creates an AST from a **media-feature** string - including parentheses + * + * @example + * ```ts + * console.log(parseMediaFeature(`(min-width: 768px)`)); + * // { + * // _t: "feature", + * // context: "value", + * // feature: "min-width", + * // value: { _t: "dimension", value: 768, unit: "px", start: 12, end: 16 }, + * // start: 1, + * // end: 16, + * // } + * ``` + */ +export declare const parseMediaFeature: (str: string) => FeatureNode | ParserError; +/** + * turns an AST into an equivalent string + * + * @example + * ```ts + * console.log( + * stringify({ + * "_t": "query", + * "condition": { + * "_t": "condition", + * "op": "and", + * "nodes": [ + * { + * "_t": "in-parens", + * "node": { + * "_t": "feature", + * "context": "boolean", + * "feature": "monochrome", + * } + * } + * ], + * }, + * "type": "screen", + * }) + * ); + * // 'screen and (monochrome)' + * ``` + */ +export declare const stringify: (node: QueryListNode | QueryNode | ConditionNode | FeatureNode | ValueNode) => string; +export * from "./utils.js"; diff --git a/vendor/media-query-parser/dist/esm/index.js b/vendor/media-query-parser/dist/esm/index.js new file mode 100644 index 000000000..ede575dde --- /dev/null +++ b/vendor/media-query-parser/dist/esm/index.js @@ -0,0 +1,99 @@ +/**! media-query-parser | Tom Golden (https://tom.bio) | @license MIT */ +/*! v3.0.2 */ +import { + matchCondition as t, + matchFeature as r, + matchQuery as e, + matchQueryList as n +} from './ast/ast.js' +import { + generateQueryList as o, + generateQuery as i, + generateCondition as s, + generateFeature as a, + generateValue as d +} from './generator/generator.js' +import {lexer as l} from './lexer/lexer.js' +import {isParserError as u} from './utils.js' +export const parseMediaQueryList = t => { + const r = l(t) + return u(r) ? r : n(r) +} +export const parseMediaQuery = t => { + var r, n, o, i + const s = l(t) + if (u(s)) return s + { + const t = e(s) + return t && t.i === s.length + ? t.t + : { + _errid: 'INVALID_QUERY', + start: + null !== (n = null === (r = s.at(0)) || void 0 === r ? void 0 : r.start) && void 0 !== n + ? n + : 0, + end: + null !== (i = null === (o = s.at(-1)) || void 0 === o ? void 0 : o.end) && void 0 !== i + ? i + : 0 + } + } +} +export const parseMediaCondition = r => { + var e, n, o, i + const s = l(r) + if (u(s)) return s + { + const r = t(s) + return r && r.i === s.length + ? r.t + : { + _errid: 'INVALID_CONDITION', + start: + null !== (n = null === (e = s.at(0)) || void 0 === e ? void 0 : e.start) && void 0 !== n + ? n + : 0, + end: + null !== (i = null === (o = s.at(-1)) || void 0 === o ? void 0 : o.end) && void 0 !== i + ? i + : 0 + } + } +} +export const parseMediaFeature = t => { + var e, n, o, i + const s = l(t) + if (u(s)) return s + { + const t = r(s) + return t && t.i === s.length + ? t.t + : { + _errid: 'INVALID_FEATURE', + start: + null !== (n = null === (e = s.at(0)) || void 0 === e ? void 0 : e.start) && void 0 !== n + ? n + : 0, + end: + null !== (i = null === (o = s.at(-1)) || void 0 === o ? void 0 : o.end) && void 0 !== i + ? i + : 0 + } + } +} +export const stringify = t => { + switch (t._t) { + case 'query-list': + return o(t) + case 'query': + return i(t) + case 'condition': + return s(t) + case 'feature': + return a(t) + default: + return d(t) + } +} +export * from './utils.js' diff --git a/vendor/media-query-parser/dist/esm/internals.d.ts b/vendor/media-query-parser/dist/esm/internals.d.ts new file mode 100644 index 000000000..d7c0d302c --- /dev/null +++ b/vendor/media-query-parser/dist/esm/internals.d.ts @@ -0,0 +1,3 @@ +export type Simplify = { + [KeyType in keyof T]: T[KeyType]; +} & {}; diff --git a/vendor/media-query-parser/dist/esm/internals.js b/vendor/media-query-parser/dist/esm/internals.js new file mode 100644 index 000000000..336ce12bb --- /dev/null +++ b/vendor/media-query-parser/dist/esm/internals.js @@ -0,0 +1 @@ +export {} diff --git a/vendor/media-query-parser/dist/esm/lexer/codepoints.d.ts b/vendor/media-query-parser/dist/esm/lexer/codepoints.d.ts new file mode 100644 index 000000000..75ca3ab61 --- /dev/null +++ b/vendor/media-query-parser/dist/esm/lexer/codepoints.d.ts @@ -0,0 +1 @@ +export declare const readCodepoints: (cssStr: string) => number[]; diff --git a/vendor/media-query-parser/dist/esm/lexer/codepoints.js b/vendor/media-query-parser/dist/esm/lexer/codepoints.js new file mode 100644 index 000000000..a636a8476 --- /dev/null +++ b/vendor/media-query-parser/dist/esm/lexer/codepoints.js @@ -0,0 +1,38 @@ +let e +export const readCodepoints = s => { + const t = (() => { + let s + return e ? (s = e) : ((s = new TextEncoder()), (e = s)), s + })().encode(s), + r = [], + a = t.length + for (let e = 0; e < a; e += 1) { + const s = t.at(e) + if (s < 128) + switch (s) { + case 0: + r.push(65533) + break + case 12: + r.push(10) + break + case 13: + r.push(10), 10 === t.at(e + 1) && (e += 1) + break + default: + r.push(s) + } + else + s < 224 + ? r.push(((s << 59) >>> 53) | ((t[++e] << 58) >>> 58)) + : s < 240 + ? r.push(((s << 60) >>> 48) | ((t[++e] << 58) >>> 52) | ((t[++e] << 58) >>> 58)) + : r.push( + ((s << 61) >>> 43) | + ((t[++e] << 58) >>> 46) | + ((t[++e] << 58) >>> 52) | + ((t[++e] << 58) >>> 58) + ) + } + return r +} diff --git a/vendor/media-query-parser/dist/esm/lexer/lexer.d.ts b/vendor/media-query-parser/dist/esm/lexer/lexer.d.ts new file mode 100644 index 000000000..81afab517 --- /dev/null +++ b/vendor/media-query-parser/dist/esm/lexer/lexer.d.ts @@ -0,0 +1,2 @@ +import { ParserToken, ParserError } from "../utils.js"; +export declare const lexer: (cssStr: string) => ParserToken[] | ParserError; diff --git a/vendor/media-query-parser/dist/esm/lexer/lexer.js b/vendor/media-query-parser/dist/esm/lexer/lexer.js new file mode 100644 index 000000000..13096c5c1 --- /dev/null +++ b/vendor/media-query-parser/dist/esm/lexer/lexer.js @@ -0,0 +1,8 @@ +import {isParserError as o} from '../utils.js' +import {readCodepoints as r} from './codepoints.js' +import {convertToParserTokens as s} from './process.js' +import {codepointsToTokens as t} from './tokens.js' +export const lexer = m => { + const e = t(r(m)) + return o(e) ? e : s(e) +} diff --git a/vendor/media-query-parser/dist/esm/lexer/process.d.ts b/vendor/media-query-parser/dist/esm/lexer/process.d.ts new file mode 100644 index 000000000..6ce0ed8f0 --- /dev/null +++ b/vendor/media-query-parser/dist/esm/lexer/process.d.ts @@ -0,0 +1,2 @@ +import { LexerToken, ParserToken, ParserError } from "../utils.js"; +export declare const convertToParserTokens: (cssTokens: LexerToken[]) => ParserToken[] | ParserError; diff --git a/vendor/media-query-parser/dist/esm/lexer/process.js b/vendor/media-query-parser/dist/esm/lexer/process.js new file mode 100644 index 000000000..02a6f78f3 --- /dev/null +++ b/vendor/media-query-parser/dist/esm/lexer/process.js @@ -0,0 +1,19 @@ +export const convertToParserTokens = e => { + const r = [] + let t = !1 + for (const s of e) + switch (s._t) { + case '{': + return {_errid: 'NO_LCURLY', start: s.start, end: s.end} + case 'semicolon': + return {_errid: 'NO_SEMICOLON', start: s.start, end: s.end} + case 'whitespace': + t = !0 + break + case 'EOF': + break + default: + r.push({...s, isAfterSpace: t}), (t = !1) + } + return r +} diff --git a/vendor/media-query-parser/dist/esm/lexer/tokens.d.ts b/vendor/media-query-parser/dist/esm/lexer/tokens.d.ts new file mode 100644 index 000000000..ba53131e3 --- /dev/null +++ b/vendor/media-query-parser/dist/esm/lexer/tokens.d.ts @@ -0,0 +1,14 @@ +import { LexerToken, ParserError } from "../utils.js"; +export declare const codepointsToTokens: (codepoints: number[], index?: number) => LexerToken[] | ParserError; +export declare const consumeString: (codepoints: number[], index: number) => [number, string] | null; +export declare const wouldStartIdentifier: (codepoints: number[], index: number) => boolean; +export declare const consumeEscape: (codepoints: number[], index: number) => [number, number] | null; +export declare const consumeNumeric: (codepoints: number[], index: number) => [ + number, + (["number", number, "number" | "integer"] | ["percentage", number] | ["dimension", number, string]) +] | null; +export declare const consumeNumber: (codepoints: number[], index: number) => [number, number, "integer" | "number"] | null; +export declare const consumeIdentUnsafe: (codepoints: number[], index: number) => [number, string] | null; +export declare const consumeIdent: (codepoints: number[], index: number) => [number, string] | null; +export declare const consumeUrl: (codepoints: number[], index: number) => [number, string] | null; +export declare const consumeIdentLike: (codepoints: number[], index: number) => [number, string, "ident" | "function" | "url"] | null; diff --git a/vendor/media-query-parser/dist/esm/lexer/tokens.js b/vendor/media-query-parser/dist/esm/lexer/tokens.js new file mode 100644 index 000000000..addc73924 --- /dev/null +++ b/vendor/media-query-parser/dist/esm/lexer/tokens.js @@ -0,0 +1,384 @@ +const t = 10, + e = 32, + n = 45, + s = 48, + u = 57, + r = 65, + o = 92, + l = 97, + i = 122, + a = 128 +export const codepointsToTokens = (f, c = 0) => { + const d = [] + for (; c < f.length; c += 1) { + const h = f.at(c), + p = c + if (47 === h && 42 === f.at(c + 1)) { + c += 2 + for (let t = f.at(c); void 0 !== t; t = f.at(++c)) + if (42 === t && 47 === f.at(c + 1)) { + c += 1 + break + } + } else if (9 === h || h === e || h === t) { + let n = f.at(++c) + for (; 9 === n || n === e || n === t; ) n = f.at(++c) + c -= 1 + const s = d.at(-1) + 'whitespace' === (null == s ? void 0 : s._t) + ? (d.pop(), d.push({_t: 'whitespace', start: s.start, end: c})) + : d.push({_t: 'whitespace', start: p, end: c}) + } else if (34 === h) { + const t = consumeString(f, c) + if (null === t) return {_errid: 'INVALID_STRING', start: c, end: c} + const [e, n] = t + ;(c = e), d.push({_t: 'string', value: n, start: p, end: c}) + } else if (35 === h) { + if (c + 1 < f.length) { + const e = f.at(c + 1) + if ( + 95 === e || + (e >= r && e <= 90) || + (e >= l && e <= i) || + e >= a || + (e >= s && e <= u) || + (e === o && c + 2 < f.length && f.at(c + 2) !== t) + ) { + const t = wouldStartIdentifier(f, c + 1) ? 'id' : 'unrestricted', + e = consumeIdentUnsafe(f, c + 1) + if (null !== e) { + const [n, s] = e + ;(c = n), d.push({_t: 'hash', value: s.toLowerCase(), flag: t, start: p, end: c}) + continue + } + } + } + d.push({_t: 'delim', value: h, start: p, end: c}) + } else if (39 === h) { + const t = consumeString(f, c) + if (null === t) return {_errid: 'INVALID_STRING', start: c, end: c} + const [e, n] = t + ;(c = e), d.push({_t: 'string', value: n, start: p, end: c}) + } else if (40 === h) d.push({_t: '(', start: p, end: c}) + else if (41 === h) d.push({_t: ')', start: p, end: c}) + else if (43 === h) { + const t = consumeNumeric(f, c) + if (null === t) d.push({_t: 'delim', value: h, start: p, end: c}) + else { + const [e, n] = t + ;(c = e), + 'dimension' === n[0] + ? d.push({ + _t: 'dimension', + value: n[1], + unit: n[2].toLowerCase(), + flag: 'number', + start: p, + end: c + }) + : 'number' === n[0] + ? d.push({_t: n[0], value: n[1], flag: n[2], start: p, end: c}) + : d.push({_t: n[0], value: n[1], flag: 'number', start: p, end: c}) + } + } else if (44 === h) d.push({_t: 'comma', start: p, end: c}) + else if (h === n) { + const t = consumeNumeric(f, c) + if (null !== t) { + const [e, n] = t + ;(c = e), + 'dimension' === n[0] + ? d.push({ + _t: 'dimension', + value: n[1], + unit: n[2].toLowerCase(), + flag: 'number', + start: p, + end: c + }) + : 'number' === n[0] + ? d.push({_t: n[0], value: n[1], flag: n[2], start: p, end: c}) + : d.push({_t: n[0], value: n[1], flag: 'number', start: p, end: c}) + continue + } + if (c + 2 < f.length) { + const t = f.at(c + 1), + e = f.at(c + 2) + if (t === n && 62 === e) { + ;(c += 2), d.push({_t: 'CDC', start: p, end: c}) + continue + } + } + const e = consumeIdentLike(f, c) + if (null !== e) { + const [t, n, s] = e + ;(c = t), d.push({_t: s, value: n, start: p, end: c}) + continue + } + d.push({_t: 'delim', value: h, start: p, end: c}) + } else if (46 === h) { + const t = consumeNumeric(f, c) + if (null !== t) { + const [e, n] = t + ;(c = e), + 'dimension' === n[0] + ? d.push({ + _t: 'dimension', + value: n[1], + unit: n[2].toLowerCase(), + flag: 'number', + start: p, + end: c + }) + : 'number' === n[0] + ? d.push({_t: n[0], value: n[1], flag: n[2], start: p, end: c}) + : d.push({_t: n[0], value: n[1], flag: 'number', start: p, end: c}) + continue + } + d.push({_t: 'delim', value: h, start: p, end: c}) + } else if (58 === h) d.push({_t: 'colon', start: p, end: c}) + else if (59 === h) d.push({_t: 'semicolon', start: p, end: c}) + else if (60 === h) { + if (c + 3 < f.length) { + const t = f.at(c + 1), + e = f.at(c + 2), + s = f.at(c + 3) + if (33 === t && e === n && s === n) { + ;(c += 3), d.push({_t: 'CDO', start: p, end: c}) + continue + } + } + d.push({_t: 'delim', value: h, start: p, end: c}) + } else if (64 === h) { + const t = consumeIdent(f, c + 1) + if (null !== t) { + const [e, n] = t + ;(c = e), d.push({_t: 'at-keyword', value: n.toLowerCase(), start: p, end: c}) + continue + } + d.push({_t: 'delim', value: h, start: p, end: c}) + } else if (91 === h) d.push({_t: '[', start: p, end: c}) + else if (93 === h) d.push({_t: ']', start: p, end: c}) + else if (123 === h) d.push({_t: '{', start: p, end: c}) + else if (125 === h) d.push({_t: '}', start: p, end: c}) + else if (h >= s && h <= u) { + const t = consumeNumeric(f, c), + [e, n] = t + ;(c = e), + 'dimension' === n[0] + ? d.push({ + _t: 'dimension', + value: n[1], + unit: n[2].toLowerCase(), + flag: 'number', + start: p, + end: c + }) + : 'number' === n[0] + ? d.push({_t: n[0], value: n[1], flag: n[2], start: p, end: c}) + : d.push({_t: n[0], value: n[1], flag: 'number', start: p, end: c}) + } else if (95 === h || (h >= r && h <= 90) || (h >= l && h <= i) || h >= a || h === o) { + const t = consumeIdentLike(f, c) + if (null === t) d.push({_t: 'delim', value: h, start: p, end: c}) + else { + const [e, n, s] = t + ;(c = e), d.push({_t: s, value: n, start: p, end: c}) + } + } else d.push({_t: 'delim', value: h, start: p, end: c}) + } + return d.push({_t: 'EOF', start: c, end: c}), d +} +export const consumeString = (e, n) => { + if (e.length <= n + 1) return null + const s = e.at(n), + u = [] + for (let r = n + 1; r < e.length; r += 1) { + const n = e.at(r) + if (n === s) return [r, String.fromCodePoint(...u)] + if (n === o) { + const t = consumeEscape(e, r) + if (null === t) return null + const [n, s] = t + u.push(s), (r = n) + } else { + if (n === t) return null + u.push(n) + } + } + return null +} +export const wouldStartIdentifier = (e, s) => { + const u = e.at(s) + if (void 0 === u) return !1 + if (u === n) { + const u = e.at(s + 1) + if (void 0 === u) return !1 + if (u === n || 95 === u || (u >= r && u <= 90) || (u >= l && u <= i) || u >= a) return !0 + if (u === o) { + if (e.length <= s + 2) return !1 + return e.at(s + 2) !== t + } + return !1 + } + if (95 === u || (u >= r && u <= 90) || (u >= l && u <= i) || u >= a) return !0 + if (u === o) { + if (e.length <= s + 1) return !1 + return e.at(s + 1) !== t + } + return !1 +} +export const consumeEscape = (n, i) => { + if (n.length <= i + 1) return null + if (n.at(i) !== o) return null + const a = n.at(i + 1) + if (a === t) return null + if ((a >= s && a <= u) || (a >= r && a <= 70) || (a >= l && a <= 102)) { + const o = [a], + f = Math.min(i + 7, n.length) + let c = i + 2 + for (; c < f; c += 1) { + const t = n.at(c) + if (!((t >= s && t <= u) || (t >= r && t <= 70) || (t >= l && t <= 102))) break + o.push(t) + } + if (c < n.length) { + const s = n.at(c) + ;(9 !== s && s !== e && s !== t) || (c += 1) + } + return [c - 1, Number.parseInt(String.fromCodePoint(...o), 16)] + } + return [i + 1, a] +} +export const consumeNumeric = (t, e) => { + const n = consumeNumber(t, e) + if (null === n) return null + const [s, u, r] = n, + o = consumeIdent(t, s + 1) + if (null !== o) { + const [t, e] = o + return [t, ['dimension', u, e]] + } + return s + 1 < t.length && 37 === t.at(s + 1) ? [s + 1, ['percentage', u]] : [s, ['number', u, r]] +} +export const consumeNumber = (t, e) => { + const r = t.at(e) + if (void 0 === r) return null + let o = 'integer' + const l = [] + for ((43 !== r && r !== n) || ((e += 1), r === n && l.push(n)); e < t.length; ) { + const n = t.at(e) + if (!(n >= s && n <= u)) break + l.push(n), (e += 1) + } + if (e + 1 < t.length) { + const n = t.at(e), + r = t.at(e + 1) + if (46 === n && r >= s && r <= u) + for (l.push(n, r), o = 'number', e += 2; e < t.length; ) { + const n = t.at(e) + if (!(n >= s && n <= u)) break + l.push(n), (e += 1) + } + } + if (e + 1 < t.length) { + const r = t.at(e), + i = t.at(e + 1), + a = t.at(e + 2) + if (69 === r || 101 === r) { + let r = !1 + if ( + (i >= s && i <= u + ? (l.push(69, i), (e += 2), (r = !0)) + : (i === n || 43 === i) && + void 0 !== a && + a >= s && + a <= u && + (l.push(69), i === n && l.push(n), l.push(a), (e += 3), (r = !0)), + r) + ) + for (o = 'number'; e < t.length; ) { + const n = t.at(e) + if (!(n >= s && n <= u)) break + l.push(n), (e += 1) + } + } + } + const i = String.fromCodePoint(...l) + let a = 'number' === o ? Number.parseFloat(i) : Number.parseInt(i) + return 0 === a && (a = 0), Number.isNaN(a) ? null : [e - 1, a, o] +} +export const consumeIdentUnsafe = (t, e) => { + if (t.length <= e) return null + const o = [] + for (let f = t.at(e); e < t.length; f = t.at(++e)) { + if ( + !( + f === n || + 95 === f || + (f >= r && f <= 90) || + (f >= l && f <= i) || + f >= a || + (f >= s && f <= u) + ) + ) { + { + const n = consumeEscape(t, e) + if (null !== n) { + const [t, s] = n + o.push(s), (e = t) + continue + } + } + break + } + o.push(f) + } + return 0 === e ? null : [e - 1, String.fromCodePoint(...o)] +} +export const consumeIdent = (t, e) => (wouldStartIdentifier(t, e) ? consumeIdentUnsafe(t, e) : null) +export const consumeUrl = (n, s) => { + let u = n.at(s) + for (; 9 === u || u === e || u === t; ) u = n.at(++s) + const r = [] + let l = !1 + for (; s < n.length; ) { + if (41 === u) return [s, String.fromCodePoint(...r)] + if (34 === u || 39 === u || 40 === u) return null + if (9 === u || u === e || u === t) !l && r.length > 0 && (l = !0) + else if (u === o) { + const t = consumeEscape(n, s) + if (null === t || l) return null + const [e, u] = t + r.push(u), (s = e) + } else { + if (l) return null + r.push(u) + } + u = n.at(++s) + } + return null +} +export const consumeIdentLike = (n, s) => { + const u = consumeIdent(n, s) + if (null === u) return null + const [r, o] = u + if ('url' === o.toLowerCase()) { + if (n.length > r + 1) { + if (40 === n.at(r + 1)) { + for (let s = 2; r + s < n.length; s += 1) { + const u = n.at(r + s) + if (34 === u || 39 === u) return [r + 1, o.toLowerCase(), 'function'] + if (9 !== u && u !== e && u !== t) { + const t = consumeUrl(n, r + s) + if (null === t) return null + const [e, u] = t + return [e, u, 'url'] + } + } + return [r + 1, o.toLowerCase(), 'function'] + } + } + } else if (n.length > r + 1) { + if (40 === n.at(r + 1)) return [r + 1, o.toLowerCase(), 'function'] + } + return [r, o.toLowerCase(), 'ident'] +} diff --git a/vendor/media-query-parser/dist/esm/utils.d.ts b/vendor/media-query-parser/dist/esm/utils.d.ts new file mode 100644 index 000000000..461ce578c --- /dev/null +++ b/vendor/media-query-parser/dist/esm/utils.d.ts @@ -0,0 +1,251 @@ +import { Simplify } from "./internals.js"; +type FileRange = { + start: number; + end: number; +}; +export type LexerToken = WhitespaceToken | StringToken | HashToken | DelimToken | CommaToken | LeftParenToken | RightParenToken | DimensionToken | NumberToken | PercentageToken | IdentToken | FunctionToken | UrlToken | CDCToken | ColonToken | SemicolonToken | CDOToken | AtKeywordToken | LeftBracketToken | RightBracketToken | LeftCurlyToken | RightCurlyToken | EOFToken; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-whitespace-token */ +export type WhitespaceToken = Simplify<{ + _t: "whitespace"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-string-token */ +export type StringToken = Simplify<{ + _t: "string"; + value: string; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-hash-token */ +export type HashToken = Simplify<{ + _t: "hash"; + value: string; + flag: "id" | "unrestricted"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-delim-token */ +export type DelimToken = Simplify<{ + _t: "delim"; + value: number; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-comma-token */ +export type CommaToken = Simplify<{ + _t: "comma"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#tokendef-open-paren */ +export type LeftParenToken = Simplify<{ + _t: "("; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#tokendef-close-paren */ +export type RightParenToken = Simplify<{ + _t: ")"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-dimension-token */ +export type DimensionToken = Simplify<{ + _t: "dimension"; + value: number; + unit: string; + flag: "number"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-number-token */ +export type NumberToken = Simplify<{ + _t: "number"; + value: number; + flag: "number" | "integer"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-percentage-token */ +export type PercentageToken = Simplify<{ + _t: "percentage"; + value: number; + flag: "number"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-cdc-token */ +export type CDCToken = Simplify<{ + _t: "CDC"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-colon-token */ +export type ColonToken = Simplify<{ + _t: "colon"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-semicolon-token */ +export type SemicolonToken = Simplify<{ + _t: "semicolon"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-cdo-token */ +export type CDOToken = Simplify<{ + _t: "CDO"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-at-keyword-token */ +export type AtKeywordToken = Simplify<{ + _t: "at-keyword"; + value: string; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#tokendef-open-square */ +export type LeftBracketToken = Simplify<{ + _t: "["; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#tokendef-close-square */ +export type RightBracketToken = Simplify<{ + _t: "]"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#tokendef-open-curly */ +export type LeftCurlyToken = Simplify<{ + _t: "{"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#tokendef-close-curly */ +export type RightCurlyToken = Simplify<{ + _t: "}"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-ident-token */ +export type IdentToken = Simplify<{ + _t: "ident"; + value: string; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-function-token */ +export type FunctionToken = Simplify<{ + _t: "function"; + value: string; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-url-token */ +export type UrlToken = Simplify<{ + _t: "url"; + value: string; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-eof-token */ +export type EOFToken = Simplify<{ + _t: "EOF"; +} & FileRange>; +/** https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#tokenization */ +export type ParserToken = Simplify & { + isAfterSpace: boolean; +}>; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-media-query-list */ +export type QueryListNode = { + _t: "query-list"; + nodes: Array; +}; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-media-query */ +export type QueryNode = Simplify<({ + _t: "query"; + prefix?: undefined; + type?: undefined; + condition: ConditionNode; +} | { + _t: "query"; + prefix?: "not" | "only"; + type: string; + condition?: ConditionWithoutOrNode; +}) & FileRange>; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-media-feature */ +export type FeatureNode = BooleanFeatureNode | PlainFeatureNode | SingleRangeFeatureNode | DoubleRangeFeatureNode; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-mf-boolean */ +export type BooleanFeatureNode = Simplify<{ + _t: "feature"; + context: "boolean"; + feature: string; +} & FileRange>; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-mf-plain */ +export type PlainFeatureNode = Simplify<{ + _t: "feature"; + context: "value"; + feature: string; + value: ValueNode; +} & FileRange>; +/** first 2 productions of https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-mf-range */ +export type SingleRangeFeatureNode = Simplify<{ + _t: "feature"; + context: "range"; + ops: 1; + feature: string; + op: ">" | ">=" | "<" | "<=" | "="; + value: NumericValueNode; +} & FileRange>; +/** last 2 productions of https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-mf-range */ +export type DoubleRangeFeatureNode = Simplify<{ + _t: "feature"; + context: "range"; + ops: 2; + feature: string; + minOp: "<" | "<="; + minValue: NumericValueNode; + maxOp: "<" | "<="; + maxValue: NumericValueNode; +} & FileRange>; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-mf-range */ +export type RangeFeatureNode = SingleRangeFeatureNode | DoubleRangeFeatureNode; +/** https://www.w3.org/TR/2023/WD-css-values-4-20231218/#numbers */ +export type NumberNode = Simplify<{ + _t: "number"; + value: number; + flag: "number" | "integer"; +} & FileRange>; +/** https://www.w3.org/TR/2023/WD-css-values-4-20231218/#dimensions */ +export type DimensionNode = Simplify<{ + _t: "dimension"; + value: number; + unit: string; +} & FileRange>; +/** https://www.w3.org/TR/2023/WD-css-values-4-20231218/#ratios */ +export type RatioNode = Simplify<{ + _t: "ratio"; + left: number; + right: number; +} & FileRange>; +/** https://www.w3.org/TR/2023/WD-css-values-4-20231218/#keywords */ +export type IdentNode = Simplify<{ + _t: "ident"; + value: string; +} & FileRange>; +/** + * https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-mf-value + * + * (spec change pending: https://github.com/w3c/csswg-drafts/issues/8998#issuecomment-1663108401) + */ +export type NumericValueNode = NumberNode | DimensionNode | RatioNode; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-mf-value */ +export type ValueNode = NumericValueNode | IdentNode; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-media-not */ +export type NotConditionNode = Simplify<{ + _t: "condition"; + op: "not"; + nodes: [InParensNode]; +} & FileRange>; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-media-and */ +export type AndConditionNode = Simplify<{ + _t: "condition"; + op: "and"; + nodes: [InParensNode, ...InParensNode[]]; +} & FileRange>; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-media-or */ +export type OrConditionNode = Simplify<{ + _t: "condition"; + op: "or"; + nodes: [InParensNode, ...InParensNode[]]; +} & FileRange>; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-media-condition */ +export type ConditionNode = Simplify; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-media-condition-without-or */ +export type ConditionWithoutOrNode = Simplify; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-general-enclosed */ +export type GeneralEnclosedNode = Simplify<{ + _t: "general-enclosed"; + tokens: ParserToken[]; +} & FileRange>; +/** https://www.w3.org/TR/2021/WD-mediaqueries-5-20211218/#typedef-media-in-parens */ +export type InParensNode = Simplify<{ + _t: "in-parens"; + node: ConditionNode | FeatureNode | GeneralEnclosedNode; +}>; +export type ParserErrId = "INVALID_QUERY" | "INVALID_CONDITION" | "INVALID_FEATURE" | "INVALID_STRING" | "NO_LCURLY" | "NO_SEMICOLON"; +/** + * Metadata about the error including an id that can be used for i18n error messages + */ +export type ParserError = { + _errid: ParserErrId; + start: number; + end: number; + child?: ParserError; +}; +/** + * a type guard that asserts whether `value` is of type ParserError + * + * tolerant of any input type, you can assume it will be true if (and only if) it is a ParserError + */ +export declare const isParserError: (value: unknown) => value is ParserError; +export {}; diff --git a/vendor/media-query-parser/dist/esm/utils.js b/vendor/media-query-parser/dist/esm/utils.js new file mode 100644 index 000000000..8966cc68a --- /dev/null +++ b/vendor/media-query-parser/dist/esm/utils.js @@ -0,0 +1 @@ +export const isParserError = r => 'object' == typeof r && null !== r && '_errid' in r diff --git a/vendor/media-query-parser/package.json b/vendor/media-query-parser/package.json new file mode 100644 index 000000000..0fb09ef1d --- /dev/null +++ b/vendor/media-query-parser/package.json @@ -0,0 +1,39 @@ +{ + "name": "media-query-parser", + "description": "Parse CSS media queries (spec-compliant)", + "version": "3.0.2", + "license": "MIT", + "keywords": [ + "media", + "query", + "parser", + "compiler", + "token", + "typescript" + ], + "type": "module", + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.js", + "exports": { + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js" + }, + "types": "./dist/esm/index.d.ts", + "sideEffects": false, + "homepage": "https://github.com/tbjgolden/media-query-parser", + "repository": { + "type": "git", + "url": "https://github.com/tbjgolden/media-query-parser.git" + }, + "author": { + "name": "Tom Golden", + "email": "oss@tom.bio", + "url": "https://tom.bio" + }, + "engines": { + "node": ">=6.5.0" + }, + "files": [ + "dist" + ] +} diff --git a/vendor/media-query-solver/LICENSE b/vendor/media-query-solver/LICENSE new file mode 100644 index 000000000..6333c3545 --- /dev/null +++ b/vendor/media-query-solver/LICENSE @@ -0,0 +1,18 @@ +MIT License + +Copyright (c) 2023 Tom Golden + +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/vendor/media-query-solver/README.md b/vendor/media-query-solver/README.md new file mode 100644 index 000000000..9c2b368bb --- /dev/null +++ b/vendor/media-query-solver/README.md @@ -0,0 +1,62 @@ +# `media-query-solver` + +![npm](https://img.shields.io/npm/v/media-query-solver) +![npm type definitions](https://img.shields.io/npm/types/media-query-solver) +![license](https://img.shields.io/npm/l/media-query-solver) +![npm downloads](https://img.shields.io/npm/dw/media-query-solver) +[![install size](https://packagephobia.com/badge?p=media-query-solver)](https://packagephobia.com/result?p=media-query-solver) + +Solve media queries (and detect useless ones!) + +> Try with `npx`: +> +> ```sh +> npx media-query-solver 'not all, ((width > 100px) or (monochrome))' +> ``` +> +> ![cli output](cli-output.png) + +## Install + +This package is available from the `npm` registry. + +```sh +npm install media-query-solver +``` + +## Usage + +Supports JavaScript + TypeScript: + +```ts +import { solveMediaQueryList } from "media-query-solver"; + +solveMediaQueryList(`not all`); +// => "false" +solveMediaQueryList(`all`); +// => "true" +solveMediaQueryList(`(width > 100px)`); +// => "unknown" +solveMediaQueryList(`(width > 100px)`, { + solveUnknownFeature: () => "true", +}); +// => "true" +``` + +Can also be imported via `require("media-query-solver")`. + +## Contributing + +- PRs welcome and accepted, simply fork and create +- Issues also very welcome +- Treat others with common courtesy and respect 🤝 + +Dev environment (for contributing) requires: + +- node >= 16.14.0 +- npm >= 6.8.0 +- git >= 2.11 + +## Licence + +MIT diff --git a/vendor/media-query-solver/dist/cjs/cli.d.ts b/vendor/media-query-solver/dist/cjs/cli.d.ts new file mode 100644 index 000000000..b7988016d --- /dev/null +++ b/vendor/media-query-solver/dist/cjs/cli.d.ts @@ -0,0 +1,2 @@ +#!/usr/bin/env node +export {}; diff --git a/vendor/media-query-solver/dist/cjs/cli.js b/vendor/media-query-solver/dist/cjs/cli.js new file mode 100755 index 000000000..d48f5be7e --- /dev/null +++ b/vendor/media-query-solver/dist/cjs/cli.js @@ -0,0 +1,31 @@ +#!/usr/bin/env node +Object.defineProperty(exports, '__esModule', {value: !0}) +const e = require('./solveMediaQueryList.js'), + o = !process.env.NO_COLOR, + s = (e, s) => `${o ? `[${s}m` : ''}${e}${o ? '' : ''}`, + l = process.argv.slice(2) +if (0 === l.length) console.log('usage:\n\nmedia-query-solver '), process.exit(1) +else { + console.log(s('solving this media query:', '36')), + console.log(''), + console.log(s('@media ', '37') + l[0] + s(' { /* ... */ }', '37')), + console.log('') + const o = (0, e.solveMediaQueryList)(l[0]) + console.log(`${s('=>', '37')} ${s(s(o, '1'), '33')}`), + console.log(''), + 'unknown' === o + ? console.log(s('some (but not all browsers) will match this media query', '33 ')) + : 'true' === o + ? console.log( + s( + 'all browsers will match this media query\n\nit is equivalent to @media all {}', + '33 ' + ) + ) + : console.log( + s( + 'no browsers will match this media query\n\nit can safely be removed along with its contents', + '33 ' + ) + ) +} diff --git a/vendor/media-query-solver/dist/cjs/index.d.ts b/vendor/media-query-solver/dist/cjs/index.d.ts new file mode 100644 index 000000000..64159fd6e --- /dev/null +++ b/vendor/media-query-solver/dist/cjs/index.d.ts @@ -0,0 +1,6 @@ +export { solveMediaQueryList } from "./solveMediaQueryList.js"; +export { solveMediaQuery } from "./solveMediaQuery.js"; +export { solveMediaInParens } from "./solveMediaInParens.js"; +export { solveMediaCondition } from "./solveMediaCondition.js"; +export { solveMediaFeature } from "./solveMediaFeature.js"; +export * from "./valueHelpers.js"; diff --git a/vendor/media-query-solver/dist/cjs/index.js b/vendor/media-query-solver/dist/cjs/index.js new file mode 100644 index 000000000..45306b777 --- /dev/null +++ b/vendor/media-query-solver/dist/cjs/index.js @@ -0,0 +1,68 @@ +/**! media-query-solver | Tom Golden (https://tom.bio) | @license MIT */ +/*! v0.1.3 */ +var e = + (this && this.__createBinding) || + (Object.create + ? function (e, r, t, o) { + void 0 === o && (o = t) + var i = Object.getOwnPropertyDescriptor(r, t) + ;(i && !('get' in i ? !r.__esModule : i.writable || i.configurable)) || + (i = { + enumerable: !0, + get: function () { + return r[t] + } + }), + Object.defineProperty(e, o, i) + } + : function (e, r, t, o) { + void 0 === o && (o = t), (e[o] = r[t]) + }), + r = + (this && this.__exportStar) || + function (r, t) { + for (var o in r) 'default' === o || Object.prototype.hasOwnProperty.call(t, o) || e(t, r, o) + } +Object.defineProperty(exports, '__esModule', {value: !0}), + (exports.solveMediaFeature = + exports.solveMediaCondition = + exports.solveMediaInParens = + exports.solveMediaQuery = + exports.solveMediaQueryList = + void 0) +var t = require('./solveMediaQueryList.js') +Object.defineProperty(exports, 'solveMediaQueryList', { + enumerable: !0, + get: function () { + return t.solveMediaQueryList + } +}) +var o = require('./solveMediaQuery.js') +Object.defineProperty(exports, 'solveMediaQuery', { + enumerable: !0, + get: function () { + return o.solveMediaQuery + } +}) +var i = require('./solveMediaInParens.js') +Object.defineProperty(exports, 'solveMediaInParens', { + enumerable: !0, + get: function () { + return i.solveMediaInParens + } +}) +var n = require('./solveMediaCondition.js') +Object.defineProperty(exports, 'solveMediaCondition', { + enumerable: !0, + get: function () { + return n.solveMediaCondition + } +}) +var s = require('./solveMediaFeature.js') +Object.defineProperty(exports, 'solveMediaFeature', { + enumerable: !0, + get: function () { + return s.solveMediaFeature + } +}), + r(require('./valueHelpers.js'), exports) diff --git a/vendor/media-query-solver/dist/cjs/package.json b/vendor/media-query-solver/dist/cjs/package.json new file mode 100644 index 000000000..5bbefffba --- /dev/null +++ b/vendor/media-query-solver/dist/cjs/package.json @@ -0,0 +1,3 @@ +{ + "type": "commonjs" +} diff --git a/vendor/media-query-solver/dist/cjs/solveMediaCondition.d.ts b/vendor/media-query-solver/dist/cjs/solveMediaCondition.d.ts new file mode 100644 index 000000000..29c33bba0 --- /dev/null +++ b/vendor/media-query-solver/dist/cjs/solveMediaCondition.d.ts @@ -0,0 +1,4 @@ +import { ConditionNode, ParserError } from "media-query-parser"; +import { Kleene3, SolverConfig, SolverConfigInput } from "./solveMediaQueryList.js"; +export declare const solveMediaCondition: (condition: string | ConditionNode | ParserError, configInput?: SolverConfigInput) => Kleene3; +export declare const solveMediaCondition_: (condition: ConditionNode, config: SolverConfig) => Kleene3; diff --git a/vendor/media-query-solver/dist/cjs/solveMediaCondition.js b/vendor/media-query-solver/dist/cjs/solveMediaCondition.js new file mode 100644 index 000000000..143897549 --- /dev/null +++ b/vendor/media-query-solver/dist/cjs/solveMediaCondition.js @@ -0,0 +1,17 @@ +Object.defineProperty(exports, '__esModule', {value: !0}), + (exports.solveMediaCondition_ = exports.solveMediaCondition = void 0) +const e = require('media-query-parser'), + o = require('./solveMediaQueryList.js'), + r = require('./solveMediaInParens.js') +exports.solveMediaCondition = (r, s) => { + const i = 'string' == typeof r ? (0, e.parseMediaCondition)(r) : r + return (0, e.isParserError)(i) + ? 'false' + : (0, exports.solveMediaCondition_)(i, (0, o.createSolverConfig)(s)) +} +exports.solveMediaCondition_ = (e, s) => + 'and' === e.op + ? (0, o.and)(...e.nodes.map(e => (0, r.solveMediaInParens_)(e, s))) + : 'or' === e.op + ? (0, o.or)(...e.nodes.map(e => (0, r.solveMediaInParens_)(e, s))) + : (0, o.not)((0, r.solveMediaInParens_)(e.nodes[0], s)) diff --git a/vendor/media-query-solver/dist/cjs/solveMediaFeature.d.ts b/vendor/media-query-solver/dist/cjs/solveMediaFeature.d.ts new file mode 100644 index 000000000..bdd8743eb --- /dev/null +++ b/vendor/media-query-solver/dist/cjs/solveMediaFeature.d.ts @@ -0,0 +1,4 @@ +import { FeatureNode, ParserError } from "media-query-parser"; +import { Kleene3, SolverConfig, SolverConfigInput } from "./solveMediaQueryList.js"; +export declare const solveMediaFeature: (feature: string | FeatureNode | ParserError, configInput?: SolverConfigInput) => Kleene3; +export declare const solveMediaFeature_: (feature: FeatureNode, config: SolverConfig) => Kleene3; diff --git a/vendor/media-query-solver/dist/cjs/solveMediaFeature.js b/vendor/media-query-solver/dist/cjs/solveMediaFeature.js new file mode 100644 index 000000000..30052afa7 --- /dev/null +++ b/vendor/media-query-solver/dist/cjs/solveMediaFeature.js @@ -0,0 +1,229 @@ +Object.defineProperty(exports, '__esModule', {value: !0}), + (exports.solveMediaFeature_ = exports.solveMediaFeature = void 0) +const e = require('media-query-parser'), + a = require('./solveMediaQueryList.js'), + t = require('./valueHelpers.js'), + r = require('./solveMediaCondition.js') +exports.solveMediaFeature = (t, r) => { + const u = 'string' == typeof t ? (0, e.parseMediaFeature)(t) : t + return (0, e.isParserError)(u) + ? 'false' + : (0, exports.solveMediaFeature_)(u, (0, a.createSolverConfig)(r)) +} +exports.solveMediaFeature_ = (e, a) => { + const u = e.feature.startsWith('min-'), + n = e.feature.startsWith('max-') + if ((u || n) && 'value' === e.context && 'ident' !== e.value._t) + return (0, exports.solveMediaFeature_)( + { + _t: 'feature', + context: 'range', + ops: 1, + feature: e.feature.slice(4), + op: u ? '>=' : '<=', + value: e.value, + start: e.start, + end: e.end + }, + a + ) + { + const u = a.features.get(e.feature) + if (u) { + if ('boolean' === e.context) { + return ('discrete' === u.type && (u.values.has('none') || u.values.has(0))) || + ('range' === u.type && ('ratio' === u.valueType ? u.canNumeratorBeZero : u.canBeZero)) + ? a.solveUnknownFeature(e) + : 'true' + } + if ('value' === e.context) { + if ('discrete' === u.type) { + let t + if ('ident' === e.value._t) t = e.value.value + else { + if ('number' !== e.value._t || 'integer' !== e.value.flag) return 'false' + t = e.value.value + } + return u.values.has(t) ? a.solveUnknownFeature(e) : 'false' + } + if ('integer' === u.valueType) { + if ((0, t.isValueInteger)(e.value)) { + return (e.value.value < 0 && !u.canBeNegative) || (0 === e.value.value && !u.canBeZero) + ? 'false' + : a.solveUnknownFeature(e) + } + return 'false' + } + if ('length' === u.valueType) { + if ((0, t.isValueLength)(e.value)) { + const r = (0, t.compareLength)(e.value, { + _t: 'number', + value: 0, + flag: 'integer', + start: 0, + end: 0 + }) + return ('lt' === r && !u.canBeNegative) || ('eq' === r && !u.canBeZero) + ? 'false' + : a.solveUnknownFeature(e) + } + return 'false' + } + if ('ratio' === u.valueType) { + if ((0, t.isValueRatio)(e.value)) { + return 'eq' === + (0, t.compareRatio)(e.value, { + _t: 'number', + value: 0, + flag: 'integer', + start: 0, + end: 0 + }) && !u.canNumeratorBeZero + ? 'false' + : a.solveUnknownFeature(e) + } + return 'false' + } + if ((0, t.isValueResolution)(e.value)) { + const r = (0, t.compareResolution)(e.value, { + _t: 'dimension', + value: 0, + unit: 'x', + start: 0, + end: 0 + }) + return ('lt' === r && !u.canBeNegative) || ('eq' === r && !u.canBeZero) + ? 'false' + : a.solveUnknownFeature(e) + } + return 'false' + } + if ('discrete' === u.type) return 'false' + if (2 === e.ops) + return (0, r.solveMediaCondition_)( + { + _t: 'condition', + op: 'and', + nodes: [ + { + _t: 'in-parens', + node: { + _t: 'feature', + context: 'range', + ops: 1, + feature: e.feature, + op: '<' === e.minOp ? '>' : '>=', + value: e.minValue, + start: e.minValue.start, + end: e.minValue.end + } + }, + { + _t: 'in-parens', + node: { + _t: 'feature', + context: 'range', + ops: 1, + feature: e.feature, + op: e.maxOp, + value: e.maxValue, + start: e.maxValue.start, + end: e.maxValue.end + } + } + ], + start: e.start, + end: e.end + }, + a + ) + if ('ratio' === u.valueType) { + if ((0, t.isValueRatio)(e.value)) { + const t = 'number' === e.value._t ? e.value.value : e.value.left, + r = 'number' === e.value._t ? 1 : e.value.right + if ( + (0 === t && + 0 !== r && + (('=' === e.op && !u.canNumeratorBeZero) || + ('<=' === e.op && !u.canNumeratorBeZero) || + '<' === e.op)) || + (0 === t && + 0 === r && + (!u.canNumeratorBeZero || !u.canDenominatorBeZero) && + ('<' === e.op || '>' === e.op)) + ) + return 'false' + return ('>=' === e.op && 0 === t && 0 !== r && !u.canDenominatorBeZero) || + ('>' === e.op && + 0 === t && + 0 !== r && + !u.canNumeratorBeZero && + u.canDenominatorBeZero) || + ('<=' === e.op && + 0 !== t && + 0 === r && + !(u.canNumeratorBeZero && u.canDenominatorBeZero)) || + ('<' === e.op && 0 !== t && 0 === r && !u.canDenominatorBeZero) + ? 'true' + : a.solveUnknownFeature(e) + } + return 'false' + } + if ('integer' === u.valueType) { + if ((0, t.isValueInteger)(e.value)) { + if ( + ('=' === e.op && !u.canBeNegative && e.value.value < 0) || + ('=' === e.op && !u.canBeZero && 0 === e.value.value) || + ('<=' === e.op && !u.canBeNegative && e.value.value < 0) || + ('<=' === e.op && !u.canBeNegative && !u.canBeZero && 0 === e.value.value) || + ('<' === e.op && !u.canBeNegative && e.value.value <= 0) || + ('<' === e.op && !u.canBeNegative && !u.canBeZero && 1 === e.value.value) + ) + return 'false' + return ('>=' === e.op && !u.canBeNegative && e.value.value <= 0) || + ('>=' === e.op && !u.canBeNegative && !u.canBeZero && 1 === e.value.value) || + ('>' === e.op && !u.canBeNegative && e.value.value < 0) || + ('>' === e.op && !u.canBeNegative && !u.canBeZero && 0 === e.value.value) + ? 'true' + : a.solveUnknownFeature(e) + } + return 'false' + } + if ('length' === u.valueType) { + if ((0, t.isValueLength)(e.value)) { + if ( + ('=' === e.op && !u.canBeNegative && e.value.value < 0) || + ('=' === e.op && !u.canBeZero && 0 === e.value.value) || + ('<=' === e.op && !u.canBeNegative && e.value.value < 0) || + ('<=' === e.op && !u.canBeNegative && !u.canBeZero && 0 === e.value.value) || + ('<' === e.op && !u.canBeNegative && e.value.value <= 0) + ) + return 'false' + return ('>=' === e.op && !u.canBeNegative && e.value.value <= 0) || + ('>' === e.op && !u.canBeNegative && e.value.value < 0) || + ('>' === e.op && !u.canBeNegative && !u.canBeZero && 0 === e.value.value) + ? 'true' + : a.solveUnknownFeature(e) + } + return 'false' + } + if ((0, t.isValueResolution)(e.value)) { + if ( + ('=' === e.op && !u.canBeNegative && e.value.value < 0) || + ('=' === e.op && !u.canBeZero && 0 === e.value.value) || + ('<=' === e.op && !u.canBeNegative && e.value.value < 0) || + ('<=' === e.op && !u.canBeNegative && !u.canBeZero && 0 === e.value.value) || + ('<' === e.op && !u.canBeNegative && e.value.value <= 0) + ) + return 'false' + return ('>=' === e.op && !u.canBeNegative && e.value.value <= 0) || + ('>' === e.op && !u.canBeNegative && e.value.value < 0) || + ('>' === e.op && !u.canBeNegative && !u.canBeZero && 0 === e.value.value) + ? 'true' + : a.solveUnknownFeature(e) + } + return 'false' + } + return 'false' + } +} diff --git a/vendor/media-query-solver/dist/cjs/solveMediaInParens.d.ts b/vendor/media-query-solver/dist/cjs/solveMediaInParens.d.ts new file mode 100644 index 000000000..c5823e286 --- /dev/null +++ b/vendor/media-query-solver/dist/cjs/solveMediaInParens.d.ts @@ -0,0 +1,4 @@ +import { InParensNode, ParserError } from "media-query-parser"; +import { Kleene3, SolverConfig, SolverConfigInput } from "./solveMediaQueryList.js"; +export declare const solveMediaInParens: (inParens: string | InParensNode | ParserError, configInput?: SolverConfigInput) => Kleene3; +export declare const solveMediaInParens_: (inParens: InParensNode, config: SolverConfig) => Kleene3; diff --git a/vendor/media-query-solver/dist/cjs/solveMediaInParens.js b/vendor/media-query-solver/dist/cjs/solveMediaInParens.js new file mode 100644 index 000000000..450ad9abc --- /dev/null +++ b/vendor/media-query-solver/dist/cjs/solveMediaInParens.js @@ -0,0 +1,22 @@ +Object.defineProperty(exports, '__esModule', {value: !0}), + (exports.solveMediaInParens_ = exports.solveMediaInParens = void 0) +const e = require('media-query-parser'), + r = require('./solveMediaQueryList.js'), + o = require('./solveMediaCondition.js'), + s = require('./solveMediaFeature.js') +exports.solveMediaInParens = (o, s) => { + let i + if ('string' == typeof o) { + const r = (0, e.parseMediaCondition)('(' + o + ')') + i = (0, e.isParserError)(r) ? r : r.nodes[0] + } else i = o + return (0, e.isParserError)(i) + ? 'false' + : (0, exports.solveMediaInParens_)(i, (0, r.createSolverConfig)(s)) +} +exports.solveMediaInParens_ = (e, r) => + 'condition' === e.node._t + ? (0, o.solveMediaCondition_)(e.node, r) + : 'feature' === e.node._t + ? (0, s.solveMediaFeature_)(e.node, r) + : r.solveGeneralEnclosed(e.node) diff --git a/vendor/media-query-solver/dist/cjs/solveMediaQuery.d.ts b/vendor/media-query-solver/dist/cjs/solveMediaQuery.d.ts new file mode 100644 index 000000000..93aa7a489 --- /dev/null +++ b/vendor/media-query-solver/dist/cjs/solveMediaQuery.d.ts @@ -0,0 +1,4 @@ +import { ParserError, QueryNode } from "media-query-parser"; +import { Kleene3, SolverConfig, SolverConfigInput } from "./solveMediaQueryList.js"; +export declare const solveMediaQuery: (mediaQuery: string | QueryNode | ParserError, configInput?: SolverConfigInput) => Kleene3; +export declare const solveMediaQuery_: (mediaQuery: QueryNode, config: SolverConfig) => Kleene3; diff --git a/vendor/media-query-solver/dist/cjs/solveMediaQuery.js b/vendor/media-query-solver/dist/cjs/solveMediaQuery.js new file mode 100644 index 000000000..698940756 --- /dev/null +++ b/vendor/media-query-solver/dist/cjs/solveMediaQuery.js @@ -0,0 +1,26 @@ +Object.defineProperty(exports, '__esModule', {value: !0}), + (exports.solveMediaQuery_ = exports.solveMediaQuery = void 0) +const e = require('media-query-parser'), + r = require('./solveMediaQueryList.js'), + o = require('./solveMediaCondition.js') +exports.solveMediaQuery = (o, i) => { + const s = 'string' == typeof o ? (0, e.parseMediaQuery)(o) : o + return (0, e.isParserError)(s) + ? 'false' + : (0, exports.solveMediaQuery_)(s, (0, r.createSolverConfig)(i)) +} +exports.solveMediaQuery_ = (e, i) => { + if ('true' === i.isLegacyBrowser && 'only' === e.prefix) return 'false' + let s + s = + void 0 === e.type || 'all' === e.type + ? 'true' + : 'screen' === e.type + ? i.isMediaTypeScreen + : 'print' === e.type + ? (0, r.not)(i.isMediaTypeScreen) + : 'false' + const t = void 0 === e.condition ? 'true' : (0, o.solveMediaCondition_)(e.condition, i), + n = (0, r.and)(s, t) + return 'not' === e.prefix ? (0, r.not)(n) : n +} diff --git a/vendor/media-query-solver/dist/cjs/solveMediaQueryList.d.ts b/vendor/media-query-solver/dist/cjs/solveMediaQueryList.d.ts new file mode 100644 index 000000000..9e9adca72 --- /dev/null +++ b/vendor/media-query-solver/dist/cjs/solveMediaQueryList.d.ts @@ -0,0 +1,49 @@ +import { FeatureNode, GeneralEnclosedNode, ParserError, QueryListNode } from "media-query-parser"; +export type Kleene3 = "true" | "false" | "unknown"; +export declare const not: (kleene3: Kleene3) => Kleene3; +export declare const and: (...kleene3s: Kleene3[]) => Kleene3; +export declare const or: (...kleene3s: Kleene3[]) => Kleene3; +export type SolverConfig = { + solveUnknownFeature: (node: FeatureNode) => Kleene3; + solveGeneralEnclosed: (node: GeneralEnclosedNode) => Kleene3; + isLegacyBrowser: Kleene3; + isMediaTypeScreen: Kleene3; + features: Map; + } | { + type: "range"; + valueType: "length" | "integer" | "resolution"; + canBeZero: boolean; + canBeNegative: boolean; + extraValues: Map; + } | { + type: "range"; + valueType: "ratio"; + canNumeratorBeZero: boolean; + canDenominatorBeZero: boolean; + extraValues: Map; + }>; +}; +export type SolverConfigInput = Partial & { + features: Record; + } | { + type: "range"; + valueType: "length" | "integer" | "resolution"; + canBeZero: boolean; + canBeNegative: boolean; + extraValues?: Record; + } | { + type: "range"; + valueType: "ratio"; + canNumeratorBeZero: boolean; + canDenominatorBeZero: boolean; + extraValues?: Record; + }>; +}>; +export declare const DEFAULT_KNOWN_FEATURES: SolverConfigInput["features"]; +export declare const createSolverConfig: (solverConfigInput?: SolverConfigInput | undefined) => SolverConfig; +export declare const solveMediaQueryList: (mediaQueryList: string | QueryListNode | ParserError, configInput?: SolverConfigInput) => Kleene3; +export declare const solveMediaQueryList_: (mediaQueryList: QueryListNode, config: SolverConfig) => Kleene3; diff --git a/vendor/media-query-solver/dist/cjs/solveMediaQueryList.js b/vendor/media-query-solver/dist/cjs/solveMediaQueryList.js new file mode 100644 index 000000000..a9bae8cc6 --- /dev/null +++ b/vendor/media-query-solver/dist/cjs/solveMediaQueryList.js @@ -0,0 +1,159 @@ +Object.defineProperty(exports, '__esModule', {value: !0}), + (exports.solveMediaQueryList_ = + exports.solveMediaQueryList = + exports.createSolverConfig = + exports.DEFAULT_KNOWN_FEATURES = + exports.or = + exports.and = + exports.not = + void 0) +const e = require('media-query-parser'), + r = require('./solveMediaQuery.js') +exports.not = e => ('true' === e ? 'false' : 'false' === e ? 'true' : 'unknown') +exports.and = (...e) => + e.reduce( + (e, r) => + 'false' === e || 'false' === r + ? 'false' + : 'unknown' === e || 'unknown' === r + ? 'unknown' + : 'true', + 'true' + ) +;(exports.or = (...e) => + e.reduce( + (e, r) => + 'true' === e || 'true' === r + ? 'true' + : 'unknown' === e || 'unknown' === r + ? 'unknown' + : 'false', + 'false' + )), + (exports.DEFAULT_KNOWN_FEATURES = { + 'color-gamut': {type: 'discrete', values: ['srgb', 'p3', 'rec2020']}, + 'display-mode': { + type: 'discrete', + values: ['fullscreen', 'standalone', 'minimal-ui', 'browser'] + }, + 'dynamic-range': {type: 'discrete', values: ['standard', 'high']}, + 'environment-blending': {type: 'discrete', values: ['opaque', 'additive', 'subtractive']}, + orientation: {type: 'discrete', values: ['portrait', 'landscape']}, + 'prefers-color-scheme': {type: 'discrete', values: ['light', 'dark']}, + 'prefers-contrast': {type: 'discrete', values: ['no-preference', 'less', 'more', 'custom']}, + 'prefers-reduced-data': {type: 'discrete', values: ['no-preference', 'reduce']}, + 'prefers-reduced-motion': {type: 'discrete', values: ['no-preference', 'reduce']}, + 'prefers-reduced-transparency': {type: 'discrete', values: ['no-preference', 'reduce']}, + scan: {type: 'discrete', values: ['interlace', 'progressive']}, + 'video-color-gamut': {type: 'discrete', values: ['srgb', 'p3', 'rec2020']}, + 'video-dynamic-range': {type: 'discrete', values: ['standard', 'high']}, + 'any-hover': {type: 'discrete', values: ['none', 'hover']}, + 'any-pointer': {type: 'discrete', values: ['none', 'coarse', 'fine']}, + 'forced-colors': {type: 'discrete', values: ['none', 'active']}, + hover: {type: 'discrete', values: ['none', 'hover']}, + 'inverted-colors': {type: 'discrete', values: ['none', 'inverted']}, + 'nav-controls': {type: 'discrete', values: ['none', 'back']}, + 'overflow-block': {type: 'discrete', values: ['none', 'scroll', 'paged']}, + 'overflow-inline': {type: 'discrete', values: ['none', 'scroll']}, + pointer: {type: 'discrete', values: ['none', 'coarse', 'fine']}, + update: {type: 'discrete', values: ['none', 'slow', 'fast']}, + scripting: {type: 'discrete', values: ['none', 'initial-only', 'enabled']}, + grid: {type: 'discrete', values: [0, 1]}, + resolution: { + type: 'range', + valueType: 'resolution', + canBeZero: !0, + canBeNegative: !1, + extraValues: {infinite: Number.POSITIVE_INFINITY} + }, + 'device-height': {type: 'range', valueType: 'length', canBeZero: !0, canBeNegative: !1}, + 'device-width': {type: 'range', valueType: 'length', canBeZero: !0, canBeNegative: !1}, + height: {type: 'range', valueType: 'length', canBeZero: !0, canBeNegative: !1}, + width: {type: 'range', valueType: 'length', canBeZero: !0, canBeNegative: !1}, + 'device-aspect-ratio': { + type: 'range', + valueType: 'ratio', + canNumeratorBeZero: !0, + canDenominatorBeZero: !0 + }, + 'aspect-ratio': { + type: 'range', + valueType: 'ratio', + canNumeratorBeZero: !0, + canDenominatorBeZero: !0 + }, + color: {type: 'range', valueType: 'integer', canBeZero: !0, canBeNegative: !1}, + 'horizontal-viewport-segments': { + type: 'range', + valueType: 'integer', + canBeZero: !0, + canBeNegative: !1 + }, + 'color-index': {type: 'range', valueType: 'integer', canBeZero: !0, canBeNegative: !1}, + monochrome: {type: 'range', valueType: 'integer', canBeZero: !0, canBeNegative: !1}, + 'vertical-viewport-segments': { + type: 'range', + valueType: 'integer', + canBeZero: !0, + canBeNegative: !1 + } + }) +const n = e => Object.entries(e) +exports.createSolverConfig = e => { + var r, t, a, o, s, i + const l = new Map() + for (const [a, o] of n( + Object.assign( + Object.assign({}, exports.DEFAULT_KNOWN_FEATURES), + null == e ? void 0 : e.features + ) + )) + 'discrete' === o.type + ? l.set( + a, + Object.assign(Object.assign({}, o), { + values: new Set(null !== (r = o.values) && void 0 !== r ? r : []) + }) + ) + : l.set( + a, + Object.assign(Object.assign({}, o), { + extraValues: new Map( + n(null !== (t = null == o ? void 0 : o.extraValues) && void 0 !== t ? t : {}) + ) + }) + ) + return { + solveUnknownFeature: + null !== (a = null == e ? void 0 : e.solveUnknownFeature) && void 0 !== a + ? a + : () => 'unknown', + solveGeneralEnclosed: + null !== (o = null == e ? void 0 : e.solveGeneralEnclosed) && void 0 !== o + ? o + : () => 'unknown', + isMediaTypeScreen: + null !== (s = null == e ? void 0 : e.isMediaTypeScreen) && void 0 !== s ? s : 'unknown', + isLegacyBrowser: + null !== (i = null == e ? void 0 : e.isLegacyBrowser) && void 0 !== i ? i : 'unknown', + features: l + } +} +exports.solveMediaQueryList = (r, n) => { + const t = 'string' == typeof r ? (0, e.parseMediaQueryList)(r) : r + return (0, e.isParserError)(t) + ? 'false' + : (0, exports.solveMediaQueryList_)(t, (0, exports.createSolverConfig)(n)) +} +exports.solveMediaQueryList_ = (e, n) => { + const t = e.nodes.map(e => (void 0 === e ? 'false' : (0, r.solveMediaQuery_)(e, n))) + if (0 === t.length) return 'true' + { + let e = 'false' + for (const r of t) { + if ('true' === r) return 'true' + 'unknown' === r && (e = 'unknown') + } + return e + } +} diff --git a/vendor/media-query-solver/dist/cjs/valueHelpers.d.ts b/vendor/media-query-solver/dist/cjs/valueHelpers.d.ts new file mode 100644 index 000000000..8b28905a6 --- /dev/null +++ b/vendor/media-query-solver/dist/cjs/valueHelpers.d.ts @@ -0,0 +1,26 @@ +import { NumberNode, RatioNode, ValueNode, DimensionNode } from "media-query-parser"; +type IntegerValueNode = Omit & { + flag: "integer"; +}; +type LengthValueNode = (Omit & { + flag: "integer"; + value: 0; +}) | (Omit & { + unit: LengthUnit; +}); +type ResolutionValueNode = Omit & { + unit: ResolutionUnit; +}; +type RatioValueNode = IntegerValueNode | RatioNode; +export declare const isValueInteger: (value: ValueNode) => value is IntegerValueNode; +export declare const isValueLength: (value: ValueNode) => value is LengthValueNode; +export declare const isValueResolution: (value: ValueNode) => value is ResolutionValueNode; +export declare const isValueRatio: (value: ValueNode) => value is RatioValueNode; +type AbsoluteLengthUnit = "cm" | "mm" | "q" | "in" | "pc" | "pt" | "px"; +type RelativeLengthUnit = "em" | "ex" | "cap" | "ch" | "ic" | "rem" | "lh" | "rlh" | "vw" | "vh" | "vi" | "vb" | "vmin" | "vmax" | "svw" | "svh" | "svi" | "svb" | "svmin" | "svmax" | "lvw" | "lvh" | "lvi" | "lvb" | "lvmin" | "lvmax" | "dvw" | "dvh" | "dvi" | "dvb" | "dvmin" | "dvmax" | "cqw" | "cqh" | "cqi" | "cqb" | "cqmin" | "cqmax"; +type LengthUnit = AbsoluteLengthUnit | RelativeLengthUnit; +export declare const compareLength: (a: LengthValueNode, b: LengthValueNode) => "lt" | "eq" | "gt" | "unknown"; +export declare const compareRatio: (a: RatioValueNode, b: RatioValueNode) => "lt" | "eq" | "gt" | "incomparable"; +type ResolutionUnit = "dpi" | "dpcm" | "dppx" | "x"; +export declare const compareResolution: (a: ResolutionValueNode, b: ResolutionValueNode) => "lt" | "eq" | "gt"; +export {}; diff --git a/vendor/media-query-solver/dist/cjs/valueHelpers.js b/vendor/media-query-solver/dist/cjs/valueHelpers.js new file mode 100644 index 000000000..42eb0395b --- /dev/null +++ b/vendor/media-query-solver/dist/cjs/valueHelpers.js @@ -0,0 +1,119 @@ +Object.defineProperty(exports, '__esModule', {value: !0}), + (exports.compareResolution = + exports.compareRatio = + exports.compareLength = + exports.isValueRatio = + exports.isValueResolution = + exports.isValueLength = + exports.isValueInteger = + void 0) +exports.isValueInteger = e => 'number' === e._t && 'integer' === e.flag +exports.isValueLength = e => + ('dimension' === e._t && r(e.unit)) || + ('number' === e._t && 'integer' === e.flag && 0 === e.value) +exports.isValueResolution = e => 'dimension' === e._t && u(e.unit) +exports.isValueRatio = e => 'ratio' === e._t || ((0, exports.isValueInteger)(e) && e.value >= 0) +const e = new Set(['cm', 'mm', 'q', 'in', 'pc', 'pt', 'px']), + t = t => e.has(t.unit), + n = new Set([ + ...e, + 'em', + 'ex', + 'cap', + 'ch', + 'ic', + 'rem', + 'lh', + 'rlh', + 'vw', + 'vh', + 'vi', + 'vb', + 'vmin', + 'vmax', + 'svw', + 'svh', + 'svi', + 'svb', + 'svmin', + 'svmax', + 'lvw', + 'lvh', + 'lvi', + 'lvb', + 'lvmin', + 'lvmax', + 'dvw', + 'dvh', + 'dvi', + 'dvb', + 'dvmin', + 'dvmax', + 'cqw', + 'cqh', + 'cqi', + 'cqb', + 'cqmin', + 'cqmax' + ]), + r = e => n.has(e) +exports.compareLength = (e, n) => { + const r = + 'number' === e._t ? {_t: 'dimension', value: 0, unit: 'px', start: e.start, end: n.end} : e, + i = 'number' === n._t ? {_t: 'dimension', value: 0, unit: 'px', start: e.start, end: n.end} : n + if (t(r)) { + const e = o(r) + if (t(i)) { + const t = o(i) + return e === t ? 'eq' : e > t ? 'gt' : 'lt' + } + return 0 === e && 0 === i.value ? 'eq' : 'unknown' + } + if (t(i)) { + const e = (0, exports.compareLength)(i, r) + return 'lt' === e ? 'gt' : 'gt' === e ? 'lt' : e + } + return 0 === r.value && 0 === i.value ? 'eq' : 'unknown' +} +const i = new Map([ + ['cm', 96 / 2.54], + ['mm', 96 / 25.4], + ['q', 96 / 101.6], + ['in', 96], + ['pc', 16], + ['pt', 96 / 72] + ]), + o = e => { + var t + return e.value * (null !== (t = i.get(e.unit)) && void 0 !== t ? t : 1) + } +exports.compareRatio = (e, t) => { + const n = 'number' === e._t ? e.value : e.left, + r = 'number' === e._t ? 1 : e.right, + i = 'number' === t._t ? t.value : t.left, + o = 'number' === t._t ? 1 : t.right + if (0 === n && 0 === r) return 0 === i && 0 === o ? 'eq' : 'incomparable' + if (0 === i && 0 === o) return 'incomparable' + if (0 === n && 0 === i) return 'eq' + if (0 === r && 0 === o) return 'eq' + if (0 !== n && 0 !== i && 0 !== r && 0 !== o && n * o == i * r) return 'eq' + const s = n / r, + u = i / o + return s > u ? 'gt' : s < u ? 'lt' : 'eq' +} +const s = new Set(['dpi', 'dpcm', 'dppx', 'x']), + u = e => s.has(e) +exports.compareResolution = (e, t) => { + const n = l(e), + r = l(t) + return n === r ? 'eq' : n > r ? 'gt' : 'lt' +} +const a = new Map([ + ['dpi', 96], + ['dpcm', 96 / 2.54], + ['dppx', 1] + ]), + l = e => { + var t + return e.value * (null !== (t = a.get(e.unit)) && void 0 !== t ? t : 1) + } diff --git a/vendor/media-query-solver/dist/esm/cli.d.ts b/vendor/media-query-solver/dist/esm/cli.d.ts new file mode 100644 index 000000000..b7988016d --- /dev/null +++ b/vendor/media-query-solver/dist/esm/cli.d.ts @@ -0,0 +1,2 @@ +#!/usr/bin/env node +export {}; diff --git a/vendor/media-query-solver/dist/esm/cli.js b/vendor/media-query-solver/dist/esm/cli.js new file mode 100755 index 000000000..ca2c578f2 --- /dev/null +++ b/vendor/media-query-solver/dist/esm/cli.js @@ -0,0 +1,30 @@ +#!/usr/bin/env node +import {solveMediaQueryList as o} from './solveMediaQueryList.js' +const e = !process.env.NO_COLOR, + l = (o, l) => `${e ? `[${l}m` : ''}${o}${e ? '' : ''}`, + s = process.argv.slice(2) +if (0 === s.length) console.log('usage:\n\nmedia-query-solver '), process.exit(1) +else { + console.log(l('solving this media query:', '36')), + console.log(''), + console.log(l('@media ', '37') + s[0] + l(' { /* ... */ }', '37')), + console.log('') + const e = o(s[0]) + console.log(`${l('=>', '37')} ${l(l(e, '1'), '33')}`), + console.log(''), + 'unknown' === e + ? console.log(l('some (but not all browsers) will match this media query', '33 ')) + : 'true' === e + ? console.log( + l( + 'all browsers will match this media query\n\nit is equivalent to @media all {}', + '33 ' + ) + ) + : console.log( + l( + 'no browsers will match this media query\n\nit can safely be removed along with its contents', + '33 ' + ) + ) +} diff --git a/vendor/media-query-solver/dist/esm/index.d.ts b/vendor/media-query-solver/dist/esm/index.d.ts new file mode 100644 index 000000000..764245dbd --- /dev/null +++ b/vendor/media-query-solver/dist/esm/index.d.ts @@ -0,0 +1,7 @@ +/**! media-query-solver | Tom Golden (https://tom.bio) | @license MIT */ +export { solveMediaQueryList } from "./solveMediaQueryList.js"; +export { solveMediaQuery } from "./solveMediaQuery.js"; +export { solveMediaInParens } from "./solveMediaInParens.js"; +export { solveMediaCondition } from "./solveMediaCondition.js"; +export { solveMediaFeature } from "./solveMediaFeature.js"; +export * from "./valueHelpers.js"; diff --git a/vendor/media-query-solver/dist/esm/index.js b/vendor/media-query-solver/dist/esm/index.js new file mode 100644 index 000000000..162347b8f --- /dev/null +++ b/vendor/media-query-solver/dist/esm/index.js @@ -0,0 +1,8 @@ +/**! media-query-solver | Tom Golden (https://tom.bio) | @license MIT */ +/*! v0.1.3 */ +export {solveMediaQueryList} from './solveMediaQueryList.js' +export {solveMediaQuery} from './solveMediaQuery.js' +export {solveMediaInParens} from './solveMediaInParens.js' +export {solveMediaCondition} from './solveMediaCondition.js' +export {solveMediaFeature} from './solveMediaFeature.js' +export * from './valueHelpers.js' diff --git a/vendor/media-query-solver/dist/esm/solveMediaCondition.d.ts b/vendor/media-query-solver/dist/esm/solveMediaCondition.d.ts new file mode 100644 index 000000000..29c33bba0 --- /dev/null +++ b/vendor/media-query-solver/dist/esm/solveMediaCondition.d.ts @@ -0,0 +1,4 @@ +import { ConditionNode, ParserError } from "media-query-parser"; +import { Kleene3, SolverConfig, SolverConfigInput } from "./solveMediaQueryList.js"; +export declare const solveMediaCondition: (condition: string | ConditionNode | ParserError, configInput?: SolverConfigInput) => Kleene3; +export declare const solveMediaCondition_: (condition: ConditionNode, config: SolverConfig) => Kleene3; diff --git a/vendor/media-query-solver/dist/esm/solveMediaCondition.js b/vendor/media-query-solver/dist/esm/solveMediaCondition.js new file mode 100644 index 000000000..48c14b348 --- /dev/null +++ b/vendor/media-query-solver/dist/esm/solveMediaCondition.js @@ -0,0 +1,13 @@ +import {isParserError as o, parseMediaCondition as e} from 'media-query-parser' +import {and as s, createSolverConfig as i, not as n, or as r} from './solveMediaQueryList.js' +import {solveMediaInParens_ as t} from './solveMediaInParens.js' +export const solveMediaCondition = (s, n) => { + const r = 'string' == typeof s ? e(s) : s + return o(r) ? 'false' : solveMediaCondition_(r, i(n)) +} +export const solveMediaCondition_ = (o, e) => + 'and' === o.op + ? s(...o.nodes.map(o => t(o, e))) + : 'or' === o.op + ? r(...o.nodes.map(o => t(o, e))) + : n(t(o.nodes[0], e)) diff --git a/vendor/media-query-solver/dist/esm/solveMediaFeature.d.ts b/vendor/media-query-solver/dist/esm/solveMediaFeature.d.ts new file mode 100644 index 000000000..bdd8743eb --- /dev/null +++ b/vendor/media-query-solver/dist/esm/solveMediaFeature.d.ts @@ -0,0 +1,4 @@ +import { FeatureNode, ParserError } from "media-query-parser"; +import { Kleene3, SolverConfig, SolverConfigInput } from "./solveMediaQueryList.js"; +export declare const solveMediaFeature: (feature: string | FeatureNode | ParserError, configInput?: SolverConfigInput) => Kleene3; +export declare const solveMediaFeature_: (feature: FeatureNode, config: SolverConfig) => Kleene3; diff --git a/vendor/media-query-solver/dist/esm/solveMediaFeature.js b/vendor/media-query-solver/dist/esm/solveMediaFeature.js new file mode 100644 index 000000000..2d2bc54e8 --- /dev/null +++ b/vendor/media-query-solver/dist/esm/solveMediaFeature.js @@ -0,0 +1,216 @@ +import {isParserError as e, parseMediaFeature as a} from 'media-query-parser' +import {createSolverConfig as t} from './solveMediaQueryList.js' +import { + compareLength as n, + compareRatio as r, + compareResolution as u, + isValueInteger as l, + isValueLength as o, + isValueRatio as v, + isValueResolution as i +} from './valueHelpers.js' +import {solveMediaCondition_ as s} from './solveMediaCondition.js' +export const solveMediaFeature = (n, r) => { + const u = 'string' == typeof n ? a(n) : n + return e(u) ? 'false' : solveMediaFeature_(u, t(r)) +} +export const solveMediaFeature_ = (e, a) => { + const t = e.feature.startsWith('min-'), + c = e.feature.startsWith('max-') + if ((t || c) && 'value' === e.context && 'ident' !== e.value._t) + return solveMediaFeature_( + { + _t: 'feature', + context: 'range', + ops: 1, + feature: e.feature.slice(4), + op: t ? '>=' : '<=', + value: e.value, + start: e.start, + end: e.end + }, + a + ) + { + const t = a.features.get(e.feature) + if (t) { + if ('boolean' === e.context) { + return ('discrete' === t.type && (t.values.has('none') || t.values.has(0))) || + ('range' === t.type && ('ratio' === t.valueType ? t.canNumeratorBeZero : t.canBeZero)) + ? a.solveUnknownFeature(e) + : 'true' + } + if ('value' === e.context) { + if ('discrete' === t.type) { + let n + if ('ident' === e.value._t) n = e.value.value + else { + if ('number' !== e.value._t || 'integer' !== e.value.flag) return 'false' + n = e.value.value + } + return t.values.has(n) ? a.solveUnknownFeature(e) : 'false' + } + if ('integer' === t.valueType) { + if (l(e.value)) { + return (e.value.value < 0 && !t.canBeNegative) || (0 === e.value.value && !t.canBeZero) + ? 'false' + : a.solveUnknownFeature(e) + } + return 'false' + } + if ('length' === t.valueType) { + if (o(e.value)) { + const r = n(e.value, {_t: 'number', value: 0, flag: 'integer', start: 0, end: 0}) + return ('lt' === r && !t.canBeNegative) || ('eq' === r && !t.canBeZero) + ? 'false' + : a.solveUnknownFeature(e) + } + return 'false' + } + if ('ratio' === t.valueType) { + if (v(e.value)) { + return 'eq' === + r(e.value, {_t: 'number', value: 0, flag: 'integer', start: 0, end: 0}) && + !t.canNumeratorBeZero + ? 'false' + : a.solveUnknownFeature(e) + } + return 'false' + } + if (i(e.value)) { + const n = u(e.value, {_t: 'dimension', value: 0, unit: 'x', start: 0, end: 0}) + return ('lt' === n && !t.canBeNegative) || ('eq' === n && !t.canBeZero) + ? 'false' + : a.solveUnknownFeature(e) + } + return 'false' + } + if ('discrete' === t.type) return 'false' + if (2 === e.ops) + return s( + { + _t: 'condition', + op: 'and', + nodes: [ + { + _t: 'in-parens', + node: { + _t: 'feature', + context: 'range', + ops: 1, + feature: e.feature, + op: '<' === e.minOp ? '>' : '>=', + value: e.minValue, + start: e.minValue.start, + end: e.minValue.end + } + }, + { + _t: 'in-parens', + node: { + _t: 'feature', + context: 'range', + ops: 1, + feature: e.feature, + op: e.maxOp, + value: e.maxValue, + start: e.maxValue.start, + end: e.maxValue.end + } + } + ], + start: e.start, + end: e.end + }, + a + ) + if ('ratio' === t.valueType) { + if (v(e.value)) { + const n = 'number' === e.value._t ? e.value.value : e.value.left, + r = 'number' === e.value._t ? 1 : e.value.right + if ( + (0 === n && + 0 !== r && + (('=' === e.op && !t.canNumeratorBeZero) || + ('<=' === e.op && !t.canNumeratorBeZero) || + '<' === e.op)) || + (0 === n && + 0 === r && + (!t.canNumeratorBeZero || !t.canDenominatorBeZero) && + ('<' === e.op || '>' === e.op)) + ) + return 'false' + return ('>=' === e.op && 0 === n && 0 !== r && !t.canDenominatorBeZero) || + ('>' === e.op && + 0 === n && + 0 !== r && + !t.canNumeratorBeZero && + t.canDenominatorBeZero) || + ('<=' === e.op && + 0 !== n && + 0 === r && + !(t.canNumeratorBeZero && t.canDenominatorBeZero)) || + ('<' === e.op && 0 !== n && 0 === r && !t.canDenominatorBeZero) + ? 'true' + : a.solveUnknownFeature(e) + } + return 'false' + } + if ('integer' === t.valueType) { + if (l(e.value)) { + if ( + ('=' === e.op && !t.canBeNegative && e.value.value < 0) || + ('=' === e.op && !t.canBeZero && 0 === e.value.value) || + ('<=' === e.op && !t.canBeNegative && e.value.value < 0) || + ('<=' === e.op && !t.canBeNegative && !t.canBeZero && 0 === e.value.value) || + ('<' === e.op && !t.canBeNegative && e.value.value <= 0) || + ('<' === e.op && !t.canBeNegative && !t.canBeZero && 1 === e.value.value) + ) + return 'false' + return ('>=' === e.op && !t.canBeNegative && e.value.value <= 0) || + ('>=' === e.op && !t.canBeNegative && !t.canBeZero && 1 === e.value.value) || + ('>' === e.op && !t.canBeNegative && e.value.value < 0) || + ('>' === e.op && !t.canBeNegative && !t.canBeZero && 0 === e.value.value) + ? 'true' + : a.solveUnknownFeature(e) + } + return 'false' + } + if ('length' === t.valueType) { + if (o(e.value)) { + if ( + ('=' === e.op && !t.canBeNegative && e.value.value < 0) || + ('=' === e.op && !t.canBeZero && 0 === e.value.value) || + ('<=' === e.op && !t.canBeNegative && e.value.value < 0) || + ('<=' === e.op && !t.canBeNegative && !t.canBeZero && 0 === e.value.value) || + ('<' === e.op && !t.canBeNegative && e.value.value <= 0) + ) + return 'false' + return ('>=' === e.op && !t.canBeNegative && e.value.value <= 0) || + ('>' === e.op && !t.canBeNegative && e.value.value < 0) || + ('>' === e.op && !t.canBeNegative && !t.canBeZero && 0 === e.value.value) + ? 'true' + : a.solveUnknownFeature(e) + } + return 'false' + } + if (i(e.value)) { + if ( + ('=' === e.op && !t.canBeNegative && e.value.value < 0) || + ('=' === e.op && !t.canBeZero && 0 === e.value.value) || + ('<=' === e.op && !t.canBeNegative && e.value.value < 0) || + ('<=' === e.op && !t.canBeNegative && !t.canBeZero && 0 === e.value.value) || + ('<' === e.op && !t.canBeNegative && e.value.value <= 0) + ) + return 'false' + return ('>=' === e.op && !t.canBeNegative && e.value.value <= 0) || + ('>' === e.op && !t.canBeNegative && e.value.value < 0) || + ('>' === e.op && !t.canBeNegative && !t.canBeZero && 0 === e.value.value) + ? 'true' + : a.solveUnknownFeature(e) + } + return 'false' + } + return 'false' + } +} diff --git a/vendor/media-query-solver/dist/esm/solveMediaInParens.d.ts b/vendor/media-query-solver/dist/esm/solveMediaInParens.d.ts new file mode 100644 index 000000000..c5823e286 --- /dev/null +++ b/vendor/media-query-solver/dist/esm/solveMediaInParens.d.ts @@ -0,0 +1,4 @@ +import { InParensNode, ParserError } from "media-query-parser"; +import { Kleene3, SolverConfig, SolverConfigInput } from "./solveMediaQueryList.js"; +export declare const solveMediaInParens: (inParens: string | InParensNode | ParserError, configInput?: SolverConfigInput) => Kleene3; +export declare const solveMediaInParens_: (inParens: InParensNode, config: SolverConfig) => Kleene3; diff --git a/vendor/media-query-solver/dist/esm/solveMediaInParens.js b/vendor/media-query-solver/dist/esm/solveMediaInParens.js new file mode 100644 index 000000000..1838b103c --- /dev/null +++ b/vendor/media-query-solver/dist/esm/solveMediaInParens.js @@ -0,0 +1,18 @@ +import {isParserError as e, parseMediaCondition as o} from 'media-query-parser' +import {createSolverConfig as n} from './solveMediaQueryList.js' +import {solveMediaCondition_ as r} from './solveMediaCondition.js' +import {solveMediaFeature_ as s} from './solveMediaFeature.js' +export const solveMediaInParens = (r, s) => { + let t + if ('string' == typeof r) { + const n = o('(' + r + ')') + t = e(n) ? n : n.nodes[0] + } else t = r + return e(t) ? 'false' : solveMediaInParens_(t, n(s)) +} +export const solveMediaInParens_ = (e, o) => + 'condition' === e.node._t + ? r(e.node, o) + : 'feature' === e.node._t + ? s(e.node, o) + : o.solveGeneralEnclosed(e.node) diff --git a/vendor/media-query-solver/dist/esm/solveMediaQuery.d.ts b/vendor/media-query-solver/dist/esm/solveMediaQuery.d.ts new file mode 100644 index 000000000..93aa7a489 --- /dev/null +++ b/vendor/media-query-solver/dist/esm/solveMediaQuery.d.ts @@ -0,0 +1,4 @@ +import { ParserError, QueryNode } from "media-query-parser"; +import { Kleene3, SolverConfig, SolverConfigInput } from "./solveMediaQueryList.js"; +export declare const solveMediaQuery: (mediaQuery: string | QueryNode | ParserError, configInput?: SolverConfigInput) => Kleene3; +export declare const solveMediaQuery_: (mediaQuery: QueryNode, config: SolverConfig) => Kleene3; diff --git a/vendor/media-query-solver/dist/esm/solveMediaQuery.js b/vendor/media-query-solver/dist/esm/solveMediaQuery.js new file mode 100644 index 000000000..99bbfee53 --- /dev/null +++ b/vendor/media-query-solver/dist/esm/solveMediaQuery.js @@ -0,0 +1,22 @@ +import {isParserError as e, parseMediaQuery as r} from 'media-query-parser' +import {and as o, createSolverConfig as i, not as t} from './solveMediaQueryList.js' +import {solveMediaCondition_ as s} from './solveMediaCondition.js' +export const solveMediaQuery = (o, t) => { + const s = 'string' == typeof o ? r(o) : o + return e(s) ? 'false' : solveMediaQuery_(s, i(t)) +} +export const solveMediaQuery_ = (e, r) => { + if ('true' === r.isLegacyBrowser && 'only' === e.prefix) return 'false' + let i + i = + void 0 === e.type || 'all' === e.type + ? 'true' + : 'screen' === e.type + ? r.isMediaTypeScreen + : 'print' === e.type + ? t(r.isMediaTypeScreen) + : 'false' + const n = void 0 === e.condition ? 'true' : s(e.condition, r), + p = o(i, n) + return 'not' === e.prefix ? t(p) : p +} diff --git a/vendor/media-query-solver/dist/esm/solveMediaQueryList.d.ts b/vendor/media-query-solver/dist/esm/solveMediaQueryList.d.ts new file mode 100644 index 000000000..9e9adca72 --- /dev/null +++ b/vendor/media-query-solver/dist/esm/solveMediaQueryList.d.ts @@ -0,0 +1,49 @@ +import { FeatureNode, GeneralEnclosedNode, ParserError, QueryListNode } from "media-query-parser"; +export type Kleene3 = "true" | "false" | "unknown"; +export declare const not: (kleene3: Kleene3) => Kleene3; +export declare const and: (...kleene3s: Kleene3[]) => Kleene3; +export declare const or: (...kleene3s: Kleene3[]) => Kleene3; +export type SolverConfig = { + solveUnknownFeature: (node: FeatureNode) => Kleene3; + solveGeneralEnclosed: (node: GeneralEnclosedNode) => Kleene3; + isLegacyBrowser: Kleene3; + isMediaTypeScreen: Kleene3; + features: Map; + } | { + type: "range"; + valueType: "length" | "integer" | "resolution"; + canBeZero: boolean; + canBeNegative: boolean; + extraValues: Map; + } | { + type: "range"; + valueType: "ratio"; + canNumeratorBeZero: boolean; + canDenominatorBeZero: boolean; + extraValues: Map; + }>; +}; +export type SolverConfigInput = Partial & { + features: Record; + } | { + type: "range"; + valueType: "length" | "integer" | "resolution"; + canBeZero: boolean; + canBeNegative: boolean; + extraValues?: Record; + } | { + type: "range"; + valueType: "ratio"; + canNumeratorBeZero: boolean; + canDenominatorBeZero: boolean; + extraValues?: Record; + }>; +}>; +export declare const DEFAULT_KNOWN_FEATURES: SolverConfigInput["features"]; +export declare const createSolverConfig: (solverConfigInput?: SolverConfigInput | undefined) => SolverConfig; +export declare const solveMediaQueryList: (mediaQueryList: string | QueryListNode | ParserError, configInput?: SolverConfigInput) => Kleene3; +export declare const solveMediaQueryList_: (mediaQueryList: QueryListNode, config: SolverConfig) => Kleene3; diff --git a/vendor/media-query-solver/dist/esm/solveMediaQueryList.js b/vendor/media-query-solver/dist/esm/solveMediaQueryList.js new file mode 100644 index 000000000..0d56044ea --- /dev/null +++ b/vendor/media-query-solver/dist/esm/solveMediaQueryList.js @@ -0,0 +1,133 @@ +import {isParserError as e, parseMediaQueryList as n} from 'media-query-parser' +import {solveMediaQuery_ as r} from './solveMediaQuery.js' +export const not = e => ('true' === e ? 'false' : 'false' === e ? 'true' : 'unknown') +export const and = (...e) => + e.reduce( + (e, n) => + 'false' === e || 'false' === n + ? 'false' + : 'unknown' === e || 'unknown' === n + ? 'unknown' + : 'true', + 'true' + ) +export const or = (...e) => + e.reduce( + (e, n) => + 'true' === e || 'true' === n + ? 'true' + : 'unknown' === e || 'unknown' === n + ? 'unknown' + : 'false', + 'false' + ) +export const DEFAULT_KNOWN_FEATURES = { + 'color-gamut': {type: 'discrete', values: ['srgb', 'p3', 'rec2020']}, + 'display-mode': {type: 'discrete', values: ['fullscreen', 'standalone', 'minimal-ui', 'browser']}, + 'dynamic-range': {type: 'discrete', values: ['standard', 'high']}, + 'environment-blending': {type: 'discrete', values: ['opaque', 'additive', 'subtractive']}, + orientation: {type: 'discrete', values: ['portrait', 'landscape']}, + 'prefers-color-scheme': {type: 'discrete', values: ['light', 'dark']}, + 'prefers-contrast': {type: 'discrete', values: ['no-preference', 'less', 'more', 'custom']}, + 'prefers-reduced-data': {type: 'discrete', values: ['no-preference', 'reduce']}, + 'prefers-reduced-motion': {type: 'discrete', values: ['no-preference', 'reduce']}, + 'prefers-reduced-transparency': {type: 'discrete', values: ['no-preference', 'reduce']}, + scan: {type: 'discrete', values: ['interlace', 'progressive']}, + 'video-color-gamut': {type: 'discrete', values: ['srgb', 'p3', 'rec2020']}, + 'video-dynamic-range': {type: 'discrete', values: ['standard', 'high']}, + 'any-hover': {type: 'discrete', values: ['none', 'hover']}, + 'any-pointer': {type: 'discrete', values: ['none', 'coarse', 'fine']}, + 'forced-colors': {type: 'discrete', values: ['none', 'active']}, + hover: {type: 'discrete', values: ['none', 'hover']}, + 'inverted-colors': {type: 'discrete', values: ['none', 'inverted']}, + 'nav-controls': {type: 'discrete', values: ['none', 'back']}, + 'overflow-block': {type: 'discrete', values: ['none', 'scroll', 'paged']}, + 'overflow-inline': {type: 'discrete', values: ['none', 'scroll']}, + pointer: {type: 'discrete', values: ['none', 'coarse', 'fine']}, + update: {type: 'discrete', values: ['none', 'slow', 'fast']}, + scripting: {type: 'discrete', values: ['none', 'initial-only', 'enabled']}, + grid: {type: 'discrete', values: [0, 1]}, + resolution: { + type: 'range', + valueType: 'resolution', + canBeZero: !0, + canBeNegative: !1, + extraValues: {infinite: Number.POSITIVE_INFINITY} + }, + 'device-height': {type: 'range', valueType: 'length', canBeZero: !0, canBeNegative: !1}, + 'device-width': {type: 'range', valueType: 'length', canBeZero: !0, canBeNegative: !1}, + height: {type: 'range', valueType: 'length', canBeZero: !0, canBeNegative: !1}, + width: {type: 'range', valueType: 'length', canBeZero: !0, canBeNegative: !1}, + 'device-aspect-ratio': { + type: 'range', + valueType: 'ratio', + canNumeratorBeZero: !0, + canDenominatorBeZero: !0 + }, + 'aspect-ratio': { + type: 'range', + valueType: 'ratio', + canNumeratorBeZero: !0, + canDenominatorBeZero: !0 + }, + color: {type: 'range', valueType: 'integer', canBeZero: !0, canBeNegative: !1}, + 'horizontal-viewport-segments': { + type: 'range', + valueType: 'integer', + canBeZero: !0, + canBeNegative: !1 + }, + 'color-index': {type: 'range', valueType: 'integer', canBeZero: !0, canBeNegative: !1}, + monochrome: {type: 'range', valueType: 'integer', canBeZero: !0, canBeNegative: !1}, + 'vertical-viewport-segments': { + type: 'range', + valueType: 'integer', + canBeZero: !0, + canBeNegative: !1 + } +} +const t = e => Object.entries(e) +export const createSolverConfig = e => { + var n, r, a, o, s, i + const l = new Map() + for (const [a, o] of t({...DEFAULT_KNOWN_FEATURES, ...(null == e ? void 0 : e.features)})) + 'discrete' === o.type + ? l.set(a, {...o, values: new Set(null !== (n = o.values) && void 0 !== n ? n : [])}) + : l.set(a, { + ...o, + extraValues: new Map( + t(null !== (r = null == o ? void 0 : o.extraValues) && void 0 !== r ? r : {}) + ) + }) + return { + solveUnknownFeature: + null !== (a = null == e ? void 0 : e.solveUnknownFeature) && void 0 !== a + ? a + : () => 'unknown', + solveGeneralEnclosed: + null !== (o = null == e ? void 0 : e.solveGeneralEnclosed) && void 0 !== o + ? o + : () => 'unknown', + isMediaTypeScreen: + null !== (s = null == e ? void 0 : e.isMediaTypeScreen) && void 0 !== s ? s : 'unknown', + isLegacyBrowser: + null !== (i = null == e ? void 0 : e.isLegacyBrowser) && void 0 !== i ? i : 'unknown', + features: l + } +} +export const solveMediaQueryList = (r, t) => { + const a = 'string' == typeof r ? n(r) : r + return e(a) ? 'false' : solveMediaQueryList_(a, createSolverConfig(t)) +} +export const solveMediaQueryList_ = (e, n) => { + const t = e.nodes.map(e => (void 0 === e ? 'false' : r(e, n))) + if (0 === t.length) return 'true' + { + let e = 'false' + for (const n of t) { + if ('true' === n) return 'true' + 'unknown' === n && (e = 'unknown') + } + return e + } +} diff --git a/vendor/media-query-solver/dist/esm/valueHelpers.d.ts b/vendor/media-query-solver/dist/esm/valueHelpers.d.ts new file mode 100644 index 000000000..8b28905a6 --- /dev/null +++ b/vendor/media-query-solver/dist/esm/valueHelpers.d.ts @@ -0,0 +1,26 @@ +import { NumberNode, RatioNode, ValueNode, DimensionNode } from "media-query-parser"; +type IntegerValueNode = Omit & { + flag: "integer"; +}; +type LengthValueNode = (Omit & { + flag: "integer"; + value: 0; +}) | (Omit & { + unit: LengthUnit; +}); +type ResolutionValueNode = Omit & { + unit: ResolutionUnit; +}; +type RatioValueNode = IntegerValueNode | RatioNode; +export declare const isValueInteger: (value: ValueNode) => value is IntegerValueNode; +export declare const isValueLength: (value: ValueNode) => value is LengthValueNode; +export declare const isValueResolution: (value: ValueNode) => value is ResolutionValueNode; +export declare const isValueRatio: (value: ValueNode) => value is RatioValueNode; +type AbsoluteLengthUnit = "cm" | "mm" | "q" | "in" | "pc" | "pt" | "px"; +type RelativeLengthUnit = "em" | "ex" | "cap" | "ch" | "ic" | "rem" | "lh" | "rlh" | "vw" | "vh" | "vi" | "vb" | "vmin" | "vmax" | "svw" | "svh" | "svi" | "svb" | "svmin" | "svmax" | "lvw" | "lvh" | "lvi" | "lvb" | "lvmin" | "lvmax" | "dvw" | "dvh" | "dvi" | "dvb" | "dvmin" | "dvmax" | "cqw" | "cqh" | "cqi" | "cqb" | "cqmin" | "cqmax"; +type LengthUnit = AbsoluteLengthUnit | RelativeLengthUnit; +export declare const compareLength: (a: LengthValueNode, b: LengthValueNode) => "lt" | "eq" | "gt" | "unknown"; +export declare const compareRatio: (a: RatioValueNode, b: RatioValueNode) => "lt" | "eq" | "gt" | "incomparable"; +type ResolutionUnit = "dpi" | "dpcm" | "dppx" | "x"; +export declare const compareResolution: (a: ResolutionValueNode, b: ResolutionValueNode) => "lt" | "eq" | "gt"; +export {}; diff --git a/vendor/media-query-solver/dist/esm/valueHelpers.js b/vendor/media-query-solver/dist/esm/valueHelpers.js new file mode 100644 index 000000000..85f2e69d7 --- /dev/null +++ b/vendor/media-query-solver/dist/esm/valueHelpers.js @@ -0,0 +1,110 @@ +export const isValueInteger = t => 'number' === t._t && 'integer' === t.flag +export const isValueLength = t => + ('dimension' === t._t && r(t.unit)) || + ('number' === t._t && 'integer' === t.flag && 0 === t.value) +export const isValueResolution = t => 'dimension' === t._t && o(t.unit) +export const isValueRatio = t => 'ratio' === t._t || (isValueInteger(t) && t.value >= 0) +const t = new Set(['cm', 'mm', 'q', 'in', 'pc', 'pt', 'px']), + e = e => t.has(e.unit), + n = new Set([ + ...t, + 'em', + 'ex', + 'cap', + 'ch', + 'ic', + 'rem', + 'lh', + 'rlh', + 'vw', + 'vh', + 'vi', + 'vb', + 'vmin', + 'vmax', + 'svw', + 'svh', + 'svi', + 'svb', + 'svmin', + 'svmax', + 'lvw', + 'lvh', + 'lvi', + 'lvb', + 'lvmin', + 'lvmax', + 'dvw', + 'dvh', + 'dvi', + 'dvb', + 'dvmin', + 'dvmax', + 'cqw', + 'cqh', + 'cqi', + 'cqb', + 'cqmin', + 'cqmax' + ]), + r = t => n.has(t) +export const compareLength = (t, n) => { + const r = + 'number' === t._t ? {_t: 'dimension', value: 0, unit: 'px', start: t.start, end: n.end} : t, + i = 'number' === n._t ? {_t: 'dimension', value: 0, unit: 'px', start: t.start, end: n.end} : n + if (e(r)) { + const t = u(r) + if (e(i)) { + const e = u(i) + return t === e ? 'eq' : t > e ? 'gt' : 'lt' + } + return 0 === t && 0 === i.value ? 'eq' : 'unknown' + } + if (e(i)) { + const t = compareLength(i, r) + return 'lt' === t ? 'gt' : 'gt' === t ? 'lt' : t + } + return 0 === r.value && 0 === i.value ? 'eq' : 'unknown' +} +const i = new Map([ + ['cm', 96 / 2.54], + ['mm', 96 / 25.4], + ['q', 96 / 101.6], + ['in', 96], + ['pc', 16], + ['pt', 96 / 72] + ]), + u = t => { + var e + return t.value * (null !== (e = i.get(t.unit)) && void 0 !== e ? e : 1) + } +export const compareRatio = (t, e) => { + const n = 'number' === t._t ? t.value : t.left, + r = 'number' === t._t ? 1 : t.right, + i = 'number' === e._t ? e.value : e.left, + u = 'number' === e._t ? 1 : e.right + if (0 === n && 0 === r) return 0 === i && 0 === u ? 'eq' : 'incomparable' + if (0 === i && 0 === u) return 'incomparable' + if (0 === n && 0 === i) return 'eq' + if (0 === r && 0 === u) return 'eq' + if (0 !== n && 0 !== i && 0 !== r && 0 !== u && n * u == i * r) return 'eq' + const a = n / r, + o = i / u + return a > o ? 'gt' : a < o ? 'lt' : 'eq' +} +const a = new Set(['dpi', 'dpcm', 'dppx', 'x']), + o = t => a.has(t) +export const compareResolution = (t, e) => { + const n = l(t), + r = l(e) + return n === r ? 'eq' : n > r ? 'gt' : 'lt' +} +const s = new Map([ + ['dpi', 96], + ['dpcm', 96 / 2.54], + ['dppx', 1] + ]), + l = t => { + var e + return t.value * (null !== (e = s.get(t.unit)) && void 0 !== e ? e : 1) + } diff --git a/vendor/media-query-solver/package.json b/vendor/media-query-solver/package.json new file mode 100644 index 000000000..91d1c8d81 --- /dev/null +++ b/vendor/media-query-solver/package.json @@ -0,0 +1,51 @@ +{ + "name": "media-query-solver", + "description": "Solve and evaluate media queries", + "version": "0.1.3", + "license": "MIT", + "keywords": [ + "media", + "query", + "solver", + "parser", + "compile", + "tester", + "check", + "checker", + "evaluate", + "evaluation", + "compiler", + "typescript" + ], + "type": "module", + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.js", + "bin": { + "media-query-solver": "./dist/cjs/cli.js" + }, + "exports": { + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js" + }, + "types": "./dist/esm/index.d.ts", + "sideEffects": false, + "homepage": "https://github.com/tbjgolden/media-query-solver", + "repository": { + "type": "git", + "url": "https://github.com/tbjgolden/media-query-solver.git" + }, + "author": { + "name": "Tom Golden", + "email": "oss@tom.bio", + "url": "https://tom.bio" + }, + "engines": { + "node": ">=16.0.0 || ^14.13.1" + }, + "peerDependencies": { + "media-query-parser": "^3.0.2" + }, + "files": [ + "dist" + ] +}