feat: migrate to starlight

This commit is contained in:
DuroCodes
2024-05-06 17:15:30 -04:00
parent 767acedea7
commit bb190f2d81
15140 changed files with 2828326 additions and 35408 deletions

286
node_modules/css-selector-parser/dist/cjs/ast.d.ts generated vendored Normal file
View File

@@ -0,0 +1,286 @@
/**
* CSS Selector AST root.
* Contains list of CSS rules (separated by a comma in the input CSS selector string).
* Generated by {@link AstFactory.selector ast.selector}.
*/
export interface AstSelector {
type: 'Selector';
/**
* List of CSS rules. Every rule contains conditions. Selector is considered matched once at least one rule matches.
*/
rules: AstRule[];
}
/**
* A single CSS rule that contains match conditions.
* Can nest another rule with or without a combinator (i.e. `"div > span"`).
* Generated by {@link AstFactory.rule ast.rule}.
*/
export interface AstRule {
type: 'Rule';
/** Items of a CSS rule. Can be tag, ids, class names, pseudo-classes and pseudo-elements. */
items: (AstTagName | AstWildcardTag | AstId | AstClassName | AstAttribute | AstPseudoClass | AstPseudoElement)[];
/** Rule combinator which was used to nest this rule (i.e. `">"` in case of `"div > span"` if the current rule is `"span"`). */
combinator?: string;
/** Nested rule if specified (i.e. `"div > span"`). */
nestedRule?: AstRule;
}
/**
* Named tag, i.e. `"div"`. Part of CSS Qualified Names.
* Generated by {@link AstFactory.tagName ast.tagName}.
* @see https://developer.mozilla.org/en-US/docs/Web/CSS/Type_selectors
* @see https://drafts.csswg.org/css-namespaces-3/#css-qnames
*/
export interface AstTagName {
type: 'TagName';
/** Tag name, i.e. `"div"`. */
name: string;
/** Namespace according to https://www.w3.org/TR/css3-namespace/. */
namespace?: AstNamespaceName | AstWildcardNamespace | AstNoNamespace;
}
/**
* ID condition. Matches by id attribute value.
* Generated by {@link AstFactory.id ast.id}.
* https://developer.mozilla.org/en-US/docs/Web/CSS/ID_selectors
* @example "#root"
*/
export interface AstId {
type: 'Id';
/** ID name. I.e. `#root` -> `"root"`. */
name: string;
}
/**
* Class name condition. Matches by class attribute value.
* Generated by {@link AstFactory.className ast.className}.
* https://developer.mozilla.org/en-US/docs/Web/CSS/ID_selectors
* @example ".user"
*/
export interface AstClassName {
type: 'ClassName';
/** ID name. I.e. `.user` -> `"user"`. */
name: string;
}
/**
* Wildcard tag (universal selector): `*`.
* Generated by {@link AstFactory.wildcardTag ast.wildcardTag}.
* @see https://developer.mozilla.org/en-US/docs/Web/CSS/Universal_selectors
* @see https://drafts.csswg.org/css-namespaces-3/#css-qnames
*/
export interface AstWildcardTag {
type: 'WildcardTag';
/** Namespace according to https://www.w3.org/TR/css3-namespace/. */
namespace?: AstNamespaceName | AstWildcardNamespace | AstNoNamespace;
}
/**
* Named namespace declaration (i.e. `ns|div`).
* Generated by {@link AstFactory.namespaceName ast.namespaceName}.
* @see https://drafts.csswg.org/css-namespaces-3/#css-qnames
*/
export interface AstNamespaceName {
type: 'NamespaceName';
/** Namespace name (i.e. `"ns"` in case of `"ns|div"`). "*/
name: string;
}
/**
* Wildcard namespace (universal selector): `*`.
* Generated by {@link AstFactory.wildcardNamespace ast.wildcardNamespace}.
* @see https://developer.mozilla.org/en-US/docs/Web/CSS/Universal_selectors
* @see https://drafts.csswg.org/css-namespaces-3/#css-qnames
*/
export interface AstWildcardNamespace {
type: 'WildcardNamespace';
}
/**
* Explicit no-namespace declaration (i.e. `|div`).
* Generated by {@link AstFactory.noNamespace ast.noNamespace}.
* @see https://drafts.csswg.org/css-namespaces-3/#css-qnames
*/
export interface AstNoNamespace {
type: 'NoNamespace';
}
/**
* Attribute selector.
* Generated by {@link AstFactory.attribute ast.attribute}.
* @example "[role='button' i]"
*/
export interface AstAttribute {
type: 'Attribute';
/** Attribute name (i.e. `"href"` in case if `"[href]"`). */
name: string;
/** Namespace according to https://drafts.csswg.org/selectors/#attrnmsp. */
namespace?: AstNamespaceName | AstWildcardNamespace | AstNoNamespace;
/** Comparison operator (i.e. `"|="` in case if `"[role|=button]"`). */
operator?: string;
/** Comparison value (i.e. `"button"` in case if `"[role=button]"`). */
value?: AstString | AstSubstitution;
/** Comparison case sensitivity modifier (i.e. `"i"` in case if `"[role='button' i]"`). */
caseSensitivityModifier?: string;
}
/**
* Pseudo-class selector.
* Generated by {@link AstFactory.pseudoClass ast.pseudoClass}.
* @see https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors/Pseudo-classes_and_pseudo-elements
* @example ":lang(en)"
*/
export interface AstPseudoClass {
type: 'PseudoClass';
/** Pseudo-class name (i.e. `"hover"` in case of `":hover"`). */
name: string;
/** Pseudo-class value (i.e. `"en"` in case of `":lang(en)"`). */
argument?: AstSubstitution | AstSelector | AstString | AstFormula | AstFormulaOfSelector;
}
/**
* Pseudo-class selector.
* Generated by {@link AstFactory.pseudoElement ast.pseudoElement}.
* @see https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors/Pseudo-classes_and_pseudo-elements
* @example "::before"
*/
export interface AstPseudoElement {
type: 'PseudoElement';
/** Pseudo-element name (i.e. `"before"` in case of `"::before"`). */
name: string;
/** Pseudo-element value (i.e. `"foo"` in case of `"::part(foo)"`). */
argument?: AstSubstitution | AstString | AstSelector;
}
/**
* String value. Can be used as attribute value of pseudo-class string value.
* For instance `:lang(en)` -> `{type: 'AstPseudoClass'..., argument: {type: 'String', value: 'en'}}`.
* Generated by {@link AstFactory.string ast.string}.
*/
export interface AstString {
type: 'String';
/** The actual string value. */
value: string;
}
/**
* Pseudo-class formula value. `a` is multiplier of `n` and `b` us added on top. Formula: `an + b`.
* For instance `:nth-child(2n + 1)` -> `{type: 'AstPseudoClass'..., argument: {type: 'Formula', a: 2, b: 1}}`.
* Generated by {@link AstFactory.formula ast.formula}.
* @see https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-child#functional_notation
*/
export interface AstFormula {
type: 'Formula';
/** Multiplier of `n`. */
a: number;
/** Constant added to `a*n`. */
b: number;
}
/**
* Pseudo-class formula of selector value. `a` is multiplier of `n` and `b` us added on top. Formula: `an + b`.
* Formula is followed by `of` keyword and then goes a CSS selector.
* For instance `:nth-child(2n + 1 of div)` ->
* `{type: 'AstPseudoClass'..., argument: {type: 'FormulaOfSelector', a: 2, b: 1, selector: {type: 'Selector', rules: [{type: 'Rule', items: [{type: 'TagName', name: 'div'}]}]}}}`.
* Generated by {@link AstFactory.formulaOfSelector ast.formulaOfSelector}.
* @see https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-child#functional_notation
*/
export interface AstFormulaOfSelector {
type: 'FormulaOfSelector';
/** Multiplier of `n`. */
a: number;
/** Constant added to `a*n`. */
b: number;
/** Selector that goes after formula (i.e. `"div -> span"` in case of `":nth-child(2n + 1 of div > span)"` */
selector: AstRule;
}
/**
* Substitution is not part of CSS spec, but rather a useful extension on top of CSS if you need to pass variables.
* Generated by {@link AstFactory.substitution ast.substitution}.
*/
export interface AstSubstitution {
type: 'Substitution';
/** Substitution name (i.e. "var" in case of `"[role=$var]"` or `":lang($var)"`). */
name: string;
}
/** One of pseudo-class argument types. */
export type AstPseudoClassArgument = AstSubstitution | AstSelector | AstString | AstFormula | AstFormulaOfSelector;
/** One of pseudo-element argument types. */
export type AstPseudoElementArgument = AstSubstitution | AstString | AstSelector;
/** One of CSS AST entity types. */
export type AstEntity = AstSelector | AstRule | AstTagName | AstWildcardTag | AstId | AstClassName | AstNamespaceName | AstWildcardNamespace | AstNoNamespace | AstSubstitution | AstString | AstFormula | AstFormulaOfSelector | AstPseudoClass | AstAttribute | AstPseudoElement;
type UnionToIntersection<T> = (T extends any ? (x: T) => any : never) extends (x: infer R) => any ? R : never;
type ToAstFactory<T> = UnionToIntersection<T extends {
type: infer Type;
} ? Type extends string ? {
[K in Uncapitalize<Type>]: {} extends Omit<T, 'type'> ? (props?: {
[PK in keyof Omit<T, 'type'>]: Omit<T, 'type'>[PK];
}) => T : (props: {
[PK in keyof Omit<T, 'type'>]: Omit<T, 'type'>[PK];
}) => T;
} & {
[K in `is${Type}`]: (entity: unknown) => entity is T;
} : never : never>;
/** @internal */
type AstFactoryBase = {
[K in keyof ToAstFactory<AstEntity>]: ToAstFactory<AstEntity>[K];
};
/**
* AST structure generators and matchers.
* For instance, `ast.selector({rules: [...]})` creates AstSelector and `ast.isSelector(...)` checks if
* AstSelector was specified.
*
* @example
*
* // Represents CSS selector: ns|div#user-34.user.user-active[role="button"]:lang(en)::before > *
* const selector = ast.selector({
* rules: [
* ast.rule({
* items: [
* ast.tagName({name: 'div', namespace: ast.namespaceName({name: 'ns'})}),
* ast.id({name: 'user-34'}),
* ast.className({name: 'user'}),
* ast.className({name: 'user-active'}),
* ast.attribute({
* name: 'role',
* operator: '=',
* value: ast.string({value: 'button'})
* }),
* ast.pseudoClass({
* name: 'lang',
* argument: ast.string({value: 'en'})
* }),
* ast.pseudoElement({name: 'before'})
* ],
* nestedRule: ast.rule({combinator: '>', items: [ast.wildcardTag()]})
* })
* ]
* });
* console.log(ast.isSelector(selector)); // prints true
* console.log(ast.isRule(selector)); // prints false
*/
export interface AstFactory extends AstFactoryBase {
}
/**
* AST structure generators and matchers.
* For instance, `ast.selector({rules: [...]})` creates AstSelector and `ast.isSelector(...)` checks if
* AstSelector was specified.
*
* @example
*
* // Represents CSS selector: ns|div#user-34.user.user-active[role="button"]:lang(en)::before > *
* const selector = ast.selector({
* rules: [
* ast.rule({
* items: [
* ast.tagName({name: 'div', namespace: ast.namespaceName({name: 'ns'})}),
* ast.id({name: 'user-34'}),
* ast.className({name: 'user'}),
* ast.className({name: 'user-active'}),
* ast.attribute({
* name: 'role',
* operator: '=',
* value: ast.string({value: 'button'})
* }),
* ast.pseudoClass({
* name: 'lang',
* argument: ast.string({value: 'en'})
* }),
* ast.pseudoElement({name: 'before'})
* ],
* nestedRule: ast.rule({combinator: '>', items: [ast.wildcardTag()]})
* })
* ]
* });
* console.log(ast.isSelector(selector)); // prints true
* console.log(ast.isRule(selector)); // prints false
*/
export declare const ast: AstFactory;
export {};

60
node_modules/css-selector-parser/dist/cjs/ast.js generated vendored Normal file
View File

@@ -0,0 +1,60 @@
"use strict";
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ast = void 0;
function astMethods(type) {
return function (generatorName, checkerName) {
var _a;
return (_a = {},
_a[generatorName] = function (props) { return (__assign({ type: type }, props)); },
_a[checkerName] = function (entity) {
return typeof entity === 'object' && entity !== null && entity.type === type;
},
_a);
};
}
/**
* AST structure generators and matchers.
* For instance, `ast.selector({rules: [...]})` creates AstSelector and `ast.isSelector(...)` checks if
* AstSelector was specified.
*
* @example
*
* // Represents CSS selector: ns|div#user-34.user.user-active[role="button"]:lang(en)::before > *
* const selector = ast.selector({
* rules: [
* ast.rule({
* items: [
* ast.tagName({name: 'div', namespace: ast.namespaceName({name: 'ns'})}),
* ast.id({name: 'user-34'}),
* ast.className({name: 'user'}),
* ast.className({name: 'user-active'}),
* ast.attribute({
* name: 'role',
* operator: '=',
* value: ast.string({value: 'button'})
* }),
* ast.pseudoClass({
* name: 'lang',
* argument: ast.string({value: 'en'})
* }),
* ast.pseudoElement({name: 'before'})
* ],
* nestedRule: ast.rule({combinator: '>', items: [ast.wildcardTag()]})
* })
* ]
* });
* console.log(ast.isSelector(selector)); // prints true
* console.log(ast.isRule(selector)); // prints false
*/
exports.ast = __assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign({}, astMethods('Selector')('selector', 'isSelector')), astMethods('Rule')('rule', 'isRule')), astMethods('TagName')('tagName', 'isTagName')), astMethods('Id')('id', 'isId')), astMethods('ClassName')('className', 'isClassName')), astMethods('WildcardTag')('wildcardTag', 'isWildcardTag')), astMethods('NamespaceName')('namespaceName', 'isNamespaceName')), astMethods('WildcardNamespace')('wildcardNamespace', 'isWildcardNamespace')), astMethods('NoNamespace')('noNamespace', 'isNoNamespace')), astMethods('Attribute')('attribute', 'isAttribute')), astMethods('PseudoClass')('pseudoClass', 'isPseudoClass')), astMethods('PseudoElement')('pseudoElement', 'isPseudoElement')), astMethods('String')('string', 'isString')), astMethods('Formula')('formula', 'isFormula')), astMethods('FormulaOfSelector')('formulaOfSelector', 'isFormulaOfSelector')), astMethods('Substitution')('substitution', 'isSubstitution'));

4
node_modules/css-selector-parser/dist/cjs/index.d.ts generated vendored Normal file
View File

@@ -0,0 +1,4 @@
export { createParser, Parser, ParserError } from './parser.js';
export { render } from './render.js';
export { ast, AstAttribute, AstClassName, AstEntity, AstFactory, AstFormula, AstFormulaOfSelector, AstId, AstNamespaceName, AstNoNamespace, AstPseudoClass, AstPseudoElement, AstRule, AstSelector, AstString, AstSubstitution, AstTagName, AstWildcardNamespace, AstWildcardTag } from './ast.js';
export { CssLevel, SyntaxDefinition } from './syntax-definitions.js';

9
node_modules/css-selector-parser/dist/cjs/index.js generated vendored Normal file
View File

@@ -0,0 +1,9 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ast = exports.render = exports.createParser = void 0;
var parser_js_1 = require("./parser.js");
Object.defineProperty(exports, "createParser", { enumerable: true, get: function () { return parser_js_1.createParser; } });
var render_js_1 = require("./render.js");
Object.defineProperty(exports, "render", { enumerable: true, get: function () { return render_js_1.render; } });
var ast_js_1 = require("./ast.js");
Object.defineProperty(exports, "ast", { enumerable: true, get: function () { return ast_js_1.ast; } });

13
node_modules/css-selector-parser/dist/cjs/indexes.d.ts generated vendored Normal file
View File

@@ -0,0 +1,13 @@
export interface MulticharIndex {
[key: string]: MulticharIndexChar;
}
export interface MulticharIndexChar {
chars: MulticharIndex;
self?: string;
}
type RegularIndex = Record<string, boolean>;
export declare const emptyMulticharIndex: MulticharIndex;
export declare const emptyRegularIndex: RegularIndex;
export declare function createMulticharIndex(items: string[]): MulticharIndex;
export declare function createRegularIndex(items: string[]): RegularIndex;
export {};

41
node_modules/css-selector-parser/dist/cjs/indexes.js generated vendored Normal file
View File

@@ -0,0 +1,41 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createRegularIndex = exports.createMulticharIndex = exports.emptyRegularIndex = exports.emptyMulticharIndex = void 0;
exports.emptyMulticharIndex = {};
exports.emptyRegularIndex = {};
function extendIndex(item, index) {
var currentIndex = index;
for (var pos = 0; pos < item.length; pos++) {
var isLast = pos === item.length - 1;
var char = item.charAt(pos);
var charIndex = currentIndex[char] || (currentIndex[char] = { chars: {} });
if (isLast) {
charIndex.self = item;
}
currentIndex = charIndex.chars;
}
}
function createMulticharIndex(items) {
if (items.length === 0) {
return exports.emptyMulticharIndex;
}
var index = {};
for (var _i = 0, items_1 = items; _i < items_1.length; _i++) {
var item = items_1[_i];
extendIndex(item, index);
}
return index;
}
exports.createMulticharIndex = createMulticharIndex;
function createRegularIndex(items) {
if (items.length === 0) {
return exports.emptyRegularIndex;
}
var result = {};
for (var _i = 0, items_2 = items; _i < items_2.length; _i++) {
var item = items_2[_i];
result[item] = true;
}
return result;
}
exports.createRegularIndex = createRegularIndex;

View File

@@ -0,0 +1 @@
{"type": "commonjs"}

41
node_modules/css-selector-parser/dist/cjs/parser.d.ts generated vendored Normal file
View File

@@ -0,0 +1,41 @@
import { AstSelector } from './ast.js';
import { CssLevel, SyntaxDefinition } from './syntax-definitions.js';
/**
* This error is thrown when parser encounters problems in CSS string.
* On top of the usual error, it has `position` property to indicate where in the input string the error happened.
*/
export interface ParserError extends Error {
message: string;
name: 'ParserError';
position: number;
}
/**
* Parses CSS selector string and returns CSS selector AST.
* @throws {ParserError}
*/
export type Parser = (input: string) => AstSelector;
/**
* Creates a parse function to be used later to parse CSS selectors.
*/
export declare function createParser(options?: {
/**
* CSS Syntax options to be used for parsing.
* Can either be one of the predefined CSS levels ({@link CssLevel}) or a more detailed syntax definition ({@link SyntaxDefinition}).
* Default: `"latest"`
*/
syntax?: CssLevel | SyntaxDefinition;
/**
* Flag to enable substitutes.
* This is not part of CSS syntax, but rather a useful feature to pass variables into CSS selectors.
* Default: `false`
* @example "[attr=$variable]"
*/
substitutes?: boolean;
/**
* CSS selector parser in modern browsers is very forgiving. For instance, it works fine with unclosed attribute
* selectors: `"[attr=value"`.
* Set to `false` in order to mimic browser behaviour.
* Default: `true`
*/
strict?: boolean;
}): Parser;

726
node_modules/css-selector-parser/dist/cjs/parser.js generated vendored Normal file
View File

@@ -0,0 +1,726 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createParser = void 0;
var indexes_js_1 = require("./indexes.js");
var pseudo_signatures_js_1 = require("./pseudo-signatures.js");
var syntax_definitions_js_1 = require("./syntax-definitions.js");
var utils_js_1 = require("./utils.js");
var errorPrefix = "css-selector-parser parse error: ";
/**
* Creates a parse function to be used later to parse CSS selectors.
*/
function createParser(options) {
if (options === void 0) { options = {}; }
var _a = options.syntax, syntax = _a === void 0 ? 'latest' : _a, substitutes = options.substitutes, _b = options.strict, strict = _b === void 0 ? true : _b;
var syntaxDefinition = typeof syntax === 'object' ? syntax : syntax_definitions_js_1.cssSyntaxDefinitions[syntax];
if (syntaxDefinition.baseSyntax) {
syntaxDefinition = (0, syntax_definitions_js_1.extendSyntaxDefinition)(syntax_definitions_js_1.cssSyntaxDefinitions[syntaxDefinition.baseSyntax], syntaxDefinition);
}
var _c = syntaxDefinition.tag
? [true, Boolean((0, syntax_definitions_js_1.getXmlOptions)(syntaxDefinition.tag).wildcard)]
: [false, false], tagNameEnabled = _c[0], tagNameWildcardEnabled = _c[1];
var idEnabled = Boolean(syntaxDefinition.ids);
var classNamesEnabled = Boolean(syntaxDefinition.classNames);
var namespaceEnabled = Boolean(syntaxDefinition.namespace);
var namespaceWildcardEnabled = syntaxDefinition.namespace &&
(syntaxDefinition.namespace === true || syntaxDefinition.namespace.wildcard === true);
if (namespaceEnabled && !tagNameEnabled) {
throw new Error("".concat(errorPrefix, "Namespaces cannot be enabled while tags are disabled."));
}
var substitutesEnabled = Boolean(substitutes);
var combinatorsIndex = syntaxDefinition.combinators
? (0, indexes_js_1.createMulticharIndex)(syntaxDefinition.combinators)
: indexes_js_1.emptyMulticharIndex;
var _d = syntaxDefinition.attributes
? [
true,
syntaxDefinition.attributes.operators
? (0, indexes_js_1.createMulticharIndex)(syntaxDefinition.attributes.operators)
: indexes_js_1.emptyMulticharIndex,
syntaxDefinition.attributes.caseSensitivityModifiers
? (0, indexes_js_1.createRegularIndex)(syntaxDefinition.attributes.caseSensitivityModifiers)
: indexes_js_1.emptyRegularIndex,
syntaxDefinition.attributes.unknownCaseSensitivityModifiers === 'accept'
]
: [false, indexes_js_1.emptyMulticharIndex, indexes_js_1.emptyRegularIndex, false], attributesEnabled = _d[0], attributesOperatorsIndex = _d[1], attributesCaseSensitivityModifiers = _d[2], attributesAcceptUnknownCaseSensitivityModifiers = _d[3];
var attributesCaseSensitivityModifiersEnabled = attributesAcceptUnknownCaseSensitivityModifiers || Object.keys(attributesCaseSensitivityModifiers).length > 0;
var _e = syntaxDefinition.pseudoClasses
? [
true,
syntaxDefinition.pseudoClasses.definitions
? (0, pseudo_signatures_js_1.calculatePseudoSignatures)(syntaxDefinition.pseudoClasses.definitions)
: pseudo_signatures_js_1.emptyPseudoSignatures,
syntaxDefinition.pseudoClasses.unknown === 'accept'
]
: [false, pseudo_signatures_js_1.emptyPseudoSignatures, false], pseudoClassesEnabled = _e[0], pseudoClassesDefinitions = _e[1], pseudoClassesAcceptUnknown = _e[2];
var _f = syntaxDefinition.pseudoElements
? [
true,
syntaxDefinition.pseudoElements.notation === 'singleColon' ||
syntaxDefinition.pseudoElements.notation === 'both',
!syntaxDefinition.pseudoElements.notation ||
syntaxDefinition.pseudoElements.notation === 'doubleColon' ||
syntaxDefinition.pseudoElements.notation === 'both',
syntaxDefinition.pseudoElements.definitions
? (0, pseudo_signatures_js_1.calculatePseudoSignatures)(Array.isArray(syntaxDefinition.pseudoElements.definitions)
? { NoArgument: syntaxDefinition.pseudoElements.definitions }
: syntaxDefinition.pseudoElements.definitions)
: pseudo_signatures_js_1.emptyPseudoSignatures,
syntaxDefinition.pseudoElements.unknown === 'accept'
]
: [false, false, false, pseudo_signatures_js_1.emptyPseudoSignatures, false], pseudoElementsEnabled = _f[0], pseudoElementsSingleColonNotationEnabled = _f[1], pseudoElementsDoubleColonNotationEnabled = _f[2], pseudoElementsDefinitions = _f[3], pseudoElementsAcceptUnknown = _f[4];
var str = '';
var l = str.length;
var pos = 0;
var chr = '';
var is = function (comparison) { return chr === comparison; };
var isTagStart = function () { return is('*') || (0, utils_js_1.isIdentStart)(chr); };
var rewind = function (newPos) {
pos = newPos;
chr = str.charAt(pos);
};
var next = function () {
pos++;
chr = str.charAt(pos);
};
var readAndNext = function () {
var current = chr;
pos++;
chr = str.charAt(pos);
return current;
};
/** @throws ParserError */
function fail(errorMessage) {
var position = Math.min(l - 1, pos);
var error = new Error("".concat(errorPrefix).concat(errorMessage, " Pos: ").concat(position, "."));
error.position = position;
error.name = 'ParserError';
throw error;
}
function assert(condition, errorMessage) {
if (!condition) {
return fail(errorMessage);
}
}
var assertNonEof = function () {
assert(pos < l, 'Unexpected end of input.');
};
var isEof = function () { return pos >= l; };
var pass = function (character) {
assert(pos < l, "Expected \"".concat(character, "\" but end of input reached."));
assert(chr === character, "Expected \"".concat(character, "\" but \"").concat(chr, "\" found."));
pos++;
chr = str.charAt(pos);
};
function matchMulticharIndex(index) {
var match = matchMulticharIndexPos(index, pos);
if (match) {
pos += match.length;
chr = str.charAt(pos);
return match;
}
}
function matchMulticharIndexPos(index, subPos) {
var char = str.charAt(subPos);
var charIndex = index[char];
if (charIndex) {
var subMatch = matchMulticharIndexPos(charIndex.chars, subPos + 1);
if (subMatch) {
return subMatch;
}
if (charIndex.self) {
return charIndex.self;
}
}
}
/**
* @see https://www.w3.org/TR/css-syntax/#hex-digit-diagram
*/
function parseHex() {
var hex = readAndNext();
var count = 1;
while ((0, utils_js_1.isHex)(chr) && count < utils_js_1.maxHexLength) {
hex += readAndNext();
count++;
}
skipSingleWhitespace();
return String.fromCharCode(parseInt(hex, 16));
}
/**
* @see https://www.w3.org/TR/css-syntax/#string-token-diagram
*/
function parseString(quote) {
var result = '';
pass(quote);
while (pos < l) {
if (is(quote)) {
next();
return result;
}
else if (is('\\')) {
next();
if (is(quote)) {
result += quote;
next();
}
else if (chr === '\n' || chr === '\f') {
next();
}
else if (chr === '\r') {
next();
if (is('\n')) {
next();
}
}
else if ((0, utils_js_1.isHex)(chr)) {
result += parseHex();
}
else {
result += chr;
next();
}
}
else {
result += chr;
next();
}
}
return result;
}
/**
* @see https://www.w3.org/TR/css-syntax/#ident-token-diagram
*/
function parseIdentifier() {
if (!(0, utils_js_1.isIdentStart)(chr)) {
return null;
}
var result = '';
while (is('-')) {
result += chr;
next();
}
if (result === '-' && !(0, utils_js_1.isIdent)(chr) && !is('\\')) {
fail('Identifiers cannot consist of a single hyphen.');
}
if (strict && result.length >= 2) {
// Checking this only for strict mode since browsers work fine with these identifiers.
fail('Identifiers cannot start with two hyphens with strict mode on.');
}
if (utils_js_1.digitsChars[chr]) {
fail('Identifiers cannot start with hyphens followed by digits.');
}
while (pos < l) {
if ((0, utils_js_1.isIdent)(chr)) {
result += readAndNext();
}
else if (is('\\')) {
next();
assertNonEof();
if ((0, utils_js_1.isHex)(chr)) {
result += parseHex();
}
else {
result += readAndNext();
}
}
else {
break;
}
}
return result;
}
function parsePseudoClassString() {
var result = '';
while (pos < l) {
if (is(')')) {
break;
}
else if (is('\\')) {
next();
if (isEof() && !strict) {
return (result + '\\').trim();
}
assertNonEof();
if ((0, utils_js_1.isHex)(chr)) {
result += parseHex();
}
else {
result += readAndNext();
}
}
else {
result += readAndNext();
}
}
return result.trim();
}
function skipSingleWhitespace() {
if (chr === ' ' || chr === '\t' || chr === '\f' || chr === '\n') {
next();
return;
}
if (chr === '\r') {
next();
}
if (chr === '\n') {
next();
}
}
function skipWhitespace() {
while (utils_js_1.whitespaceChars[chr]) {
next();
}
}
function parseSelector(relative) {
if (relative === void 0) { relative = false; }
skipWhitespace();
var rules = [parseRule(relative)];
while (is(',')) {
next();
skipWhitespace();
rules.push(parseRule(relative));
}
return {
type: 'Selector',
rules: rules
};
}
function parseAttribute() {
pass('[');
skipWhitespace();
var attr;
if (is('|')) {
assert(namespaceEnabled, 'Namespaces are not enabled.');
next();
var name_1 = parseIdentifier();
assert(name_1, 'Expected attribute name.');
attr = {
type: 'Attribute',
name: name_1,
namespace: { type: 'NoNamespace' }
};
}
else if (is('*')) {
assert(namespaceEnabled, 'Namespaces are not enabled.');
assert(namespaceWildcardEnabled, 'Wildcard namespace is not enabled.');
next();
pass('|');
var name_2 = parseIdentifier();
assert(name_2, 'Expected attribute name.');
attr = {
type: 'Attribute',
name: name_2,
namespace: { type: 'WildcardNamespace' }
};
}
else {
var identifier = parseIdentifier();
assert(identifier, 'Expected attribute name.');
attr = {
type: 'Attribute',
name: identifier
};
if (is('|')) {
var savedPos = pos;
next();
if ((0, utils_js_1.isIdentStart)(chr)) {
assert(namespaceEnabled, 'Namespaces are not enabled.');
var name_3 = parseIdentifier();
assert(name_3, 'Expected attribute name.');
attr = {
type: 'Attribute',
name: name_3,
namespace: { type: 'NamespaceName', name: identifier }
};
}
else {
rewind(savedPos);
}
}
}
assert(attr.name, 'Expected attribute name.');
skipWhitespace();
if (isEof() && !strict) {
return attr;
}
if (is(']')) {
next();
}
else {
attr.operator = matchMulticharIndex(attributesOperatorsIndex);
assert(attr.operator, 'Expected a valid attribute selector operator.');
skipWhitespace();
assertNonEof();
if (utils_js_1.quoteChars[chr]) {
attr.value = {
type: 'String',
value: parseString(chr)
};
}
else if (substitutesEnabled && is('$')) {
next();
var name_4 = parseIdentifier();
assert(name_4, 'Expected substitute name.');
attr.value = {
type: 'Substitution',
name: name_4
};
}
else {
var value = parseIdentifier();
assert(value, 'Expected attribute value.');
attr.value = {
type: 'String',
value: value
};
}
skipWhitespace();
if (isEof() && !strict) {
return attr;
}
if (!is(']')) {
var caseSensitivityModifier = parseIdentifier();
assert(caseSensitivityModifier, 'Expected end of attribute selector.');
attr.caseSensitivityModifier = caseSensitivityModifier;
assert(attributesCaseSensitivityModifiersEnabled, 'Attribute case sensitivity modifiers are not enabled.');
assert(attributesAcceptUnknownCaseSensitivityModifiers ||
attributesCaseSensitivityModifiers[attr.caseSensitivityModifier], 'Unknown attribute case sensitivity modifier.');
skipWhitespace();
if (isEof() && !strict) {
return attr;
}
}
pass(']');
}
return attr;
}
function parseNumber() {
var result = '';
while (utils_js_1.digitsChars[chr]) {
result += readAndNext();
}
assert(result !== '', 'Formula parse error.');
return parseInt(result);
}
var isNumberStart = function () { return is('-') || is('+') || utils_js_1.digitsChars[chr]; };
function parseFormula() {
if (is('e') || is('o')) {
var ident = parseIdentifier();
if (ident === 'even') {
skipWhitespace();
return [2, 0];
}
if (ident === 'odd') {
skipWhitespace();
return [2, 1];
}
}
var firstNumber = null;
var firstNumberMultiplier = 1;
if (is('-')) {
next();
firstNumberMultiplier = -1;
}
if (isNumberStart()) {
if (is('+')) {
next();
}
firstNumber = parseNumber();
if (!is('\\') && !is('n')) {
return [0, firstNumber * firstNumberMultiplier];
}
}
if (firstNumber === null) {
firstNumber = 1;
}
firstNumber *= firstNumberMultiplier;
var identifier;
if (is('\\')) {
next();
if ((0, utils_js_1.isHex)(chr)) {
identifier = parseHex();
}
else {
identifier = readAndNext();
}
}
else {
identifier = readAndNext();
}
assert(identifier === 'n', 'Formula parse error: expected "n".');
skipWhitespace();
if (is('+') || is('-')) {
var sign = is('+') ? 1 : -1;
next();
skipWhitespace();
return [firstNumber, sign * parseNumber()];
}
else {
return [firstNumber, 0];
}
}
function parsePseudoArgument(pseudoName, type, signature) {
var argument;
if (is('(')) {
next();
skipWhitespace();
if (substitutesEnabled && is('$')) {
next();
var name_5 = parseIdentifier();
assert(name_5, 'Expected substitute name.');
argument = {
type: 'Substitution',
name: name_5
};
}
else if (signature.type === 'String') {
argument = {
type: 'String',
value: parsePseudoClassString()
};
assert(argument.value, "Expected ".concat(type, " argument value."));
}
else if (signature.type === 'Selector') {
argument = parseSelector(true);
}
else if (signature.type === 'Formula') {
var _a = parseFormula(), a = _a[0], b = _a[1];
argument = {
type: 'Formula',
a: a,
b: b
};
if (signature.ofSelector) {
skipWhitespace();
if (is('o') || is('\\')) {
var ident = parseIdentifier();
assert(ident === 'of', 'Formula of selector parse error.');
skipWhitespace();
argument = {
type: 'FormulaOfSelector',
a: a,
b: b,
selector: parseRule()
};
}
}
}
else {
return fail("Invalid ".concat(type, " signature."));
}
skipWhitespace();
if (isEof() && !strict) {
return argument;
}
pass(')');
}
else {
assert(signature.optional, "Argument is required for ".concat(type, " \"").concat(pseudoName, "\"."));
}
return argument;
}
function parseTagName() {
if (is('*')) {
assert(tagNameWildcardEnabled, 'Wildcard tag name is not enabled.');
next();
return { type: 'WildcardTag' };
}
else if ((0, utils_js_1.isIdentStart)(chr)) {
assert(tagNameEnabled, 'Tag names are not enabled.');
var name_6 = parseIdentifier();
assert(name_6, 'Expected tag name.');
return {
type: 'TagName',
name: name_6
};
}
else {
return fail('Expected tag name.');
}
}
function parseTagNameWithNamespace() {
if (is('*')) {
var savedPos = pos;
next();
if (!is('|')) {
rewind(savedPos);
return parseTagName();
}
next();
if (!isTagStart()) {
rewind(savedPos);
return parseTagName();
}
assert(namespaceEnabled, 'Namespaces are not enabled.');
assert(namespaceWildcardEnabled, 'Wildcard namespace is not enabled.');
var tagName = parseTagName();
tagName.namespace = { type: 'WildcardNamespace' };
return tagName;
}
else if (is('|')) {
assert(namespaceEnabled, 'Namespaces are not enabled.');
next();
var tagName = parseTagName();
tagName.namespace = { type: 'NoNamespace' };
return tagName;
}
else if ((0, utils_js_1.isIdentStart)(chr)) {
var identifier = parseIdentifier();
assert(identifier, 'Expected tag name.');
if (!is('|')) {
assert(tagNameEnabled, 'Tag names are not enabled.');
return {
type: 'TagName',
name: identifier
};
}
var savedPos = pos;
next();
if (!isTagStart()) {
rewind(savedPos);
return {
type: 'TagName',
name: identifier
};
}
assert(namespaceEnabled, 'Namespaces are not enabled.');
var tagName = parseTagName();
tagName.namespace = { type: 'NamespaceName', name: identifier };
return tagName;
}
else {
return fail('Expected tag name.');
}
}
function parseRule(relative) {
var _a, _b;
if (relative === void 0) { relative = false; }
var rule = { type: 'Rule', items: [] };
if (relative) {
var combinator = matchMulticharIndex(combinatorsIndex);
if (combinator) {
rule.combinator = combinator;
skipWhitespace();
}
}
while (pos < l) {
if (isTagStart()) {
assert(rule.items.length === 0, 'Unexpected tag/namespace start.');
rule.items.push(parseTagNameWithNamespace());
}
else if (is('|')) {
var savedPos = pos;
next();
if (isTagStart()) {
assert(rule.items.length === 0, 'Unexpected tag/namespace start.');
rewind(savedPos);
rule.items.push(parseTagNameWithNamespace());
}
else {
rewind(savedPos);
break;
}
}
else if (is('.')) {
assert(classNamesEnabled, 'Class names are not enabled.');
next();
var className = parseIdentifier();
assert(className, 'Expected class name.');
rule.items.push({ type: 'ClassName', name: className });
}
else if (is('#')) {
assert(idEnabled, 'IDs are not enabled.');
next();
var idName = parseIdentifier();
assert(idName, 'Expected ID name.');
rule.items.push({ type: 'Id', name: idName });
}
else if (is('[')) {
assert(attributesEnabled, 'Attributes are not enabled.');
rule.items.push(parseAttribute());
}
else if (is(':')) {
var isDoubleColon = false;
var isPseudoElement = false;
next();
if (is(':')) {
assert(pseudoElementsEnabled, 'Pseudo elements are not enabled.');
assert(pseudoElementsDoubleColonNotationEnabled, 'Pseudo elements double colon notation is not enabled.');
isDoubleColon = true;
next();
}
var pseudoName = parseIdentifier();
assert(isDoubleColon || pseudoName, 'Expected pseudo-class name.');
assert(!isDoubleColon || pseudoName, 'Expected pseudo-element name.');
assert(pseudoName, 'Expected pseudo-class name.');
assert(!isDoubleColon ||
pseudoElementsAcceptUnknown ||
Object.prototype.hasOwnProperty.call(pseudoElementsDefinitions, pseudoName), "Unknown pseudo-element \"".concat(pseudoName, "\"."));
isPseudoElement =
pseudoElementsEnabled &&
(isDoubleColon ||
(!isDoubleColon &&
pseudoElementsSingleColonNotationEnabled &&
Object.prototype.hasOwnProperty.call(pseudoElementsDefinitions, pseudoName)));
if (isPseudoElement) {
var signature = (_a = pseudoElementsDefinitions[pseudoName]) !== null && _a !== void 0 ? _a : (pseudoElementsAcceptUnknown && pseudo_signatures_js_1.defaultPseudoSignature);
var pseudoElement = {
type: 'PseudoElement',
name: pseudoName
};
var argument = parsePseudoArgument(pseudoName, 'pseudo-element', signature);
if (argument) {
assert(argument.type !== 'Formula' && argument.type !== 'FormulaOfSelector', 'Pseudo-elements cannot have formula argument.');
pseudoElement.argument = argument;
}
rule.items.push(pseudoElement);
}
else {
assert(pseudoClassesEnabled, 'Pseudo-classes are not enabled.');
var signature = (_b = pseudoClassesDefinitions[pseudoName]) !== null && _b !== void 0 ? _b : (pseudoClassesAcceptUnknown && pseudo_signatures_js_1.defaultPseudoSignature);
assert(signature, "Unknown pseudo-class: \"".concat(pseudoName, "\"."));
var argument = parsePseudoArgument(pseudoName, 'pseudo-class', signature);
var pseudoClass = {
type: 'PseudoClass',
name: pseudoName
};
if (argument) {
pseudoClass.argument = argument;
}
rule.items.push(pseudoClass);
}
}
else {
break;
}
}
if (rule.items.length === 0) {
if (isEof()) {
return fail('Expected rule but end of input reached.');
}
else {
return fail("Expected rule but \"".concat(chr, "\" found."));
}
}
skipWhitespace();
if (!isEof() && !is(',') && !is(')')) {
var combinator = matchMulticharIndex(combinatorsIndex);
skipWhitespace();
rule.nestedRule = parseRule();
rule.nestedRule.combinator = combinator;
}
return rule;
}
return function (input) {
// noinspection SuspiciousTypeOfGuard
if (typeof input !== 'string') {
throw new Error("".concat(errorPrefix, "Expected string input."));
}
str = input;
l = str.length;
pos = 0;
chr = str.charAt(0);
return parseSelector();
};
}
exports.createParser = createParser;

View File

@@ -0,0 +1,25 @@
import { PseudoClassType } from './syntax-definitions.js';
export type PseudoSignature = {
optional: boolean;
} & ({
type: 'Formula';
ofSelector?: boolean;
} | {
type: 'String';
} | {
type: 'Selector';
} | {
type: 'NoArgument';
});
export type PseudoSignatures = Record<string, PseudoSignature>;
export declare const emptyPseudoSignatures: PseudoSignatures;
export declare const defaultPseudoSignature: PseudoSignature;
type PseudoArgumentType = PseudoClassType;
export type CategoriesIndex<T1 extends string, T2 extends string> = {
[K in T1]?: T2[];
};
export declare function inverseCategories<T1 extends string, T2 extends string>(obj: CategoriesIndex<T1, T2>): CategoriesIndex<T2, T1>;
export declare function calculatePseudoSignatures<T extends PseudoArgumentType>(definitions: {
[K in T]?: string[];
}): PseudoSignatures;
export {};

View File

@@ -0,0 +1,68 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.calculatePseudoSignatures = exports.inverseCategories = exports.defaultPseudoSignature = exports.emptyPseudoSignatures = void 0;
exports.emptyPseudoSignatures = {};
exports.defaultPseudoSignature = {
type: 'String',
optional: true
};
function calculatePseudoSignature(types) {
var result = {
type: 'NoArgument',
optional: false
};
function setResultType(type) {
if (result.type && result.type !== type && result.type !== 'NoArgument') {
throw new Error("Conflicting pseudo-class argument type: \"".concat(result.type, "\" vs \"").concat(type, "\"."));
}
result.type = type;
}
for (var _i = 0, types_1 = types; _i < types_1.length; _i++) {
var type = types_1[_i];
if (type === 'NoArgument') {
result.optional = true;
}
if (type === 'Formula') {
setResultType('Formula');
}
if (type === 'FormulaOfSelector') {
setResultType('Formula');
result.ofSelector = true;
}
if (type === 'String') {
setResultType('String');
}
if (type === 'Selector') {
setResultType('Selector');
}
}
return result;
}
function inverseCategories(obj) {
var result = {};
for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) {
var category = _a[_i];
var items = obj[category];
if (items) {
for (var _b = 0, _c = items; _b < _c.length; _b++) {
var item = _c[_b];
(result[item] || (result[item] = [])).push(category);
}
}
}
return result;
}
exports.inverseCategories = inverseCategories;
function calculatePseudoSignatures(definitions) {
var pseudoClassesToArgumentTypes = inverseCategories(definitions);
var result = {};
for (var _i = 0, _a = Object.keys(pseudoClassesToArgumentTypes); _i < _a.length; _i++) {
var pseudoClass = _a[_i];
var argumentTypes = pseudoClassesToArgumentTypes[pseudoClass];
if (argumentTypes) {
result[pseudoClass] = calculatePseudoSignature(argumentTypes);
}
}
return result;
}
exports.calculatePseudoSignatures = calculatePseudoSignatures;

25
node_modules/css-selector-parser/dist/cjs/render.d.ts generated vendored Normal file
View File

@@ -0,0 +1,25 @@
import { AstEntity } from './ast.js';
/**
* Renders CSS Selector AST back to a string.
*
* @example
*
* import {ast, render} from 'css-selector-parser';
*
* const selector = ast.selector({
* rules: [
* ast.rule({
* items: [
* ast.tagName({name: 'a'}),
* ast.id({name: 'user-23'}),
* ast.className({name: 'user'}),
* ast.pseudoClass({name: 'visited'}),
* ast.pseudoElement({name: 'before'})
* ]
* })
* ]
* });
*
* console.log(render(selector)); // a#user-23.user:visited::before
*/
export declare function render(entity: AstEntity): string;

150
node_modules/css-selector-parser/dist/cjs/render.js generated vendored Normal file
View File

@@ -0,0 +1,150 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.render = void 0;
var utils_js_1 = require("./utils.js");
var errorPrefix = "css-selector-parser render error: ";
function renderNamespace(namespace) {
if (namespace.type === 'WildcardNamespace') {
return '*|';
}
else if (namespace.type === 'NamespaceName') {
return "".concat((0, utils_js_1.escapeIdentifier)(namespace.name), "|");
}
else if (namespace.type === 'NoNamespace') {
return '|';
}
throw new Error("".concat(errorPrefix, "Unknown namespace type: ").concat(namespace.type, "."));
}
function renderSubstitution(sub) {
return "$".concat((0, utils_js_1.escapeIdentifier)(sub.name));
}
function renderFormula(a, b) {
if (a) {
var result = "".concat(a === 1 ? '' : a === -1 ? '-' : a, "n");
if (b) {
result += "".concat(b > 0 ? '+' : '').concat(b);
}
return result;
}
else {
return String(b);
}
}
/**
* Renders CSS Selector AST back to a string.
*
* @example
*
* import {ast, render} from 'css-selector-parser';
*
* const selector = ast.selector({
* rules: [
* ast.rule({
* items: [
* ast.tagName({name: 'a'}),
* ast.id({name: 'user-23'}),
* ast.className({name: 'user'}),
* ast.pseudoClass({name: 'visited'}),
* ast.pseudoElement({name: 'before'})
* ]
* })
* ]
* });
*
* console.log(render(selector)); // a#user-23.user:visited::before
*/
function render(entity) {
if (entity.type === 'Selector') {
return entity.rules.map(render).join(', ');
}
if (entity.type === 'Rule') {
var result = '';
var items = entity.items, combinator = entity.combinator, nestedRule = entity.nestedRule;
if (combinator) {
result += "".concat(combinator, " ");
}
for (var _i = 0, items_1 = items; _i < items_1.length; _i++) {
var item = items_1[_i];
result += render(item);
}
if (nestedRule) {
result += " ".concat(render(nestedRule));
}
return result;
}
else if (entity.type === 'TagName' || entity.type === 'WildcardTag') {
var result = '';
var namespace = entity.namespace;
if (namespace) {
result += renderNamespace(namespace);
}
if (entity.type === 'TagName') {
result += (0, utils_js_1.escapeIdentifier)(entity.name);
}
else if (entity.type === 'WildcardTag') {
result += '*';
}
return result;
}
else if (entity.type === 'Id') {
return "#".concat((0, utils_js_1.escapeIdentifier)(entity.name));
}
else if (entity.type === 'ClassName') {
return ".".concat((0, utils_js_1.escapeIdentifier)(entity.name));
}
else if (entity.type === 'Attribute') {
var name_1 = entity.name, namespace = entity.namespace, operator = entity.operator, value = entity.value, caseSensitivityModifier = entity.caseSensitivityModifier;
var result = '[';
if (namespace) {
result += renderNamespace(namespace);
}
result += (0, utils_js_1.escapeIdentifier)(name_1);
if (operator && value) {
result += operator;
if (value.type === 'String') {
result += (0, utils_js_1.escapeString)(value.value);
}
else if (value.type === 'Substitution') {
result += renderSubstitution(value);
}
else {
throw new Error("Unknown attribute value type: ".concat(value.type, "."));
}
if (caseSensitivityModifier) {
result += " ".concat((0, utils_js_1.escapeIdentifier)(caseSensitivityModifier));
}
}
result += ']';
return result;
}
else if (entity.type === 'PseudoClass') {
var name_2 = entity.name, argument = entity.argument;
var result = ":".concat((0, utils_js_1.escapeIdentifier)(name_2));
if (argument) {
result += "(".concat(argument.type === 'String' ? (0, utils_js_1.escapeIdentifier)(argument.value) : render(argument), ")");
}
return result;
}
else if (entity.type === 'PseudoElement') {
var name_3 = entity.name, argument = entity.argument;
var result = "::".concat((0, utils_js_1.escapeIdentifier)(name_3));
if (argument) {
result += "(".concat(argument.type === 'String' ? (0, utils_js_1.escapeIdentifier)(argument.value) : render(argument), ")");
}
return result;
}
else if (entity.type === 'String') {
throw new Error("".concat(errorPrefix, "String cannot be rendered outside of context."));
}
else if (entity.type === 'Formula') {
return renderFormula(entity.a, entity.b);
}
else if (entity.type === 'FormulaOfSelector') {
return renderFormula(entity.a, entity.b) + ' of ' + render(entity.selector);
}
else if (entity.type === 'Substitution') {
return "$".concat((0, utils_js_1.escapeIdentifier)(entity.name));
}
throw new Error("Unknown type specified to render method: ".concat(entity.type, "."));
}
exports.render = render;

View File

@@ -0,0 +1,134 @@
import { AstPseudoClassArgument, AstPseudoElementArgument } from './ast.js';
export type PseudoClassType = Exclude<'NoArgument' | AstPseudoClassArgument['type'], 'Substitution'>;
export type PseudoElementType = Exclude<'NoArgument' | AstPseudoElementArgument['type'], 'Substitution'>;
export type CssLevel = 'css1' | 'css2' | 'css3' | 'selectors-3' | 'selectors-4' | 'latest' | 'progressive';
/**
* CSS Selector Syntax Definition can be used to define custom CSS selector parsing rules.
*/
export interface SyntaxDefinition {
/**
* When specified, syntax will be based on the specified predefined CSS standard.
* If not specified, syntax will be defined from scratch.
*/
baseSyntax?: CssLevel;
/**
* CSS Tag (type).
* @example div
* @see https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors/Type_Class_and_ID_Selectors
*/
tag?: {
/**
* Allows using wildcard (*).
*/
wildcard?: boolean;
} | boolean;
/**
* CSS3 Namespaces.
* @example ns|div
* @see https://www.w3.org/TR/css3-namespace/
*/
namespace?: {
/**
* Allows using wildcard (*).
*/
wildcard?: boolean;
} | boolean;
/**
* CSS IDs (yes, there can be multiple).
* @example #root#root
* @see https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors/Type_Class_and_ID_Selectors
*/
ids?: boolean;
/**
* CSS Class Names
* @example .element.highlighted
* @see https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors/Type_Class_and_ID_Selectors
*/
classNames?: boolean;
/**
* CSS selector rule nesting combinators.
* @example div.class > span
* @see https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors/Combinators
*/
combinators?: string[];
/**
* CSS Attribute Selector.
* @example [href="#"]
* @see https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors/Attribute_selectors
*/
attributes?: {
/**
* Attribute comparison operator list.
* @example ['=', '~=', '|=', '^=', '$=', '*=']
* @see https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors#syntax
*/
operators?: string[];
/**
* How to handle unknown case sensitivity modifiers.
* `accept` - still parse.
* `reject` - throw an error.
*/
unknownCaseSensitivityModifiers?: 'accept' | 'reject';
/**
* List of pre-defined case sensitivity modifiers.
* @example ['i', 'I', 's', 'S']
* @see https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors#syntax
*/
caseSensitivityModifiers?: string[];
} | false;
/**
* CSS Pseudo-elements.
* @example ::before
* @see https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors/Pseudo-classes_and_pseudo-elements
*/
pseudoElements?: {
/**
* How to handle unknown pseudo-elements.
* `accept` - still parse.
* `reject` - throw an error.
*/
unknown?: 'accept' | 'reject';
/**
* In the past pseudo selements were defined starting with a single colon.
* Later this notation changed to double colon.
*/
notation?: 'singleColon' | 'doubleColon' | 'both';
/**
* List of predefined pseudo-elements. If string array is specified, the pseudo-elements are assumed to be
* NoArgument.
* @example ['before', 'after']
* @example {NoArgument: ['before', 'after'], String: ['highlight'], Selector: ['slotted']}
*/
definitions?: string[] | {
[K in PseudoElementType]?: string[];
};
} | false;
/**
* CSS Pseudo-classes.
* @example :nth-child(2n+1)
* @see https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors/Pseudo-classes_and_pseudo-elements
*/
pseudoClasses?: {
/**
* How to handle unknown pseudo-classes.
* `accept` - still parse.
* `reject` - throw an error.
*/
unknown?: 'accept' | 'reject';
/**
* Predefined pseudo-classes.
* @example {NoArgument: ['first-child'], Formula: ['nth-child'], String: ['dir'], Selector: ['not']}
*/
definitions?: {
[K in PseudoClassType]?: string[];
};
} | false;
}
interface SyntaxDefinitionXmlOptions {
wildcard?: boolean;
}
export declare function getXmlOptions(param: SyntaxDefinitionXmlOptions | boolean | undefined): SyntaxDefinitionXmlOptions;
type MergeMethod<T> = (base: T, extension: T) => T;
export declare const extendSyntaxDefinition: MergeMethod<SyntaxDefinition>;
export declare const cssSyntaxDefinitions: Record<CssLevel, SyntaxDefinition>;
export {};

View File

@@ -0,0 +1,255 @@
"use strict";
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.cssSyntaxDefinitions = exports.extendSyntaxDefinition = exports.getXmlOptions = void 0;
var emptyXmlOptions = {};
var defaultXmlOptions = { wildcard: true };
function getXmlOptions(param) {
if (param) {
if (typeof param === 'boolean') {
return defaultXmlOptions;
}
else {
return param;
}
}
else {
return emptyXmlOptions;
}
}
exports.getXmlOptions = getXmlOptions;
function withMigration(migration, merge) {
return function (base, extension) { return merge(migration(base), migration(extension)); };
}
function withNoNegative(merge) {
return function (base, extension) {
var result = merge(base, extension);
if (!result) {
throw new Error("Syntax definition cannot be null or undefined.");
}
return result;
};
}
function withPositive(positive, merge) {
return function (base, extension) {
if (extension === true) {
return positive;
}
return merge(base === true ? positive : base, extension);
};
}
function mergeSection(values) {
return function (base, extension) {
if (!extension || !base) {
return extension;
}
if (typeof extension !== 'object' || extension === null) {
throw new Error("Unexpected syntax definition extension type: ".concat(extension, "."));
}
var result = __assign({}, base);
for (var _i = 0, _a = Object.entries(extension); _i < _a.length; _i++) {
var _b = _a[_i], key = _b[0], value = _b[1];
var mergeSchema = values[key];
result[key] = mergeSchema(base[key], value);
}
return result;
};
}
function replaceValueIfSpecified(base, extension) {
if (extension !== undefined) {
return extension;
}
return base;
}
function concatArray(base, extension) {
if (!extension) {
return base;
}
if (!base) {
return extension;
}
return base.concat(extension);
}
function mergeDefinitions(base, extension) {
if (!extension) {
return base;
}
if (!base) {
return extension;
}
var result = __assign({}, base);
for (var _i = 0, _a = Object.entries(extension); _i < _a.length; _i++) {
var _b = _a[_i], key = _b[0], value = _b[1];
if (!value) {
delete result[key];
continue;
}
var baseValue = base[key];
if (!baseValue) {
result[key] = value;
continue;
}
result[key] = baseValue.concat(value);
}
return result;
}
exports.extendSyntaxDefinition = withNoNegative(mergeSection({
baseSyntax: replaceValueIfSpecified,
tag: withPositive(defaultXmlOptions, mergeSection({
wildcard: replaceValueIfSpecified
})),
ids: replaceValueIfSpecified,
classNames: replaceValueIfSpecified,
namespace: withPositive(defaultXmlOptions, mergeSection({
wildcard: replaceValueIfSpecified
})),
combinators: concatArray,
attributes: mergeSection({
operators: concatArray,
caseSensitivityModifiers: concatArray,
unknownCaseSensitivityModifiers: replaceValueIfSpecified
}),
pseudoClasses: mergeSection({
unknown: replaceValueIfSpecified,
definitions: mergeDefinitions
}),
pseudoElements: mergeSection({
unknown: replaceValueIfSpecified,
notation: replaceValueIfSpecified,
definitions: withMigration(function (definitions) { return (Array.isArray(definitions) ? { NoArgument: definitions } : definitions); }, mergeDefinitions)
})
}));
var css1SyntaxDefinition = {
tag: {},
ids: true,
classNames: true,
combinators: [],
pseudoElements: {
unknown: 'reject',
notation: 'singleColon',
definitions: ['first-letter', 'first-line']
},
pseudoClasses: {
unknown: 'reject',
definitions: {
NoArgument: ['link', 'visited', 'active']
}
}
};
var css2SyntaxDefinition = (0, exports.extendSyntaxDefinition)(css1SyntaxDefinition, {
tag: { wildcard: true },
combinators: ['>', '+'],
attributes: {
unknownCaseSensitivityModifiers: 'reject',
operators: ['=', '~=', '|=']
},
pseudoElements: {
definitions: ['before', 'after']
},
pseudoClasses: {
unknown: 'reject',
definitions: {
NoArgument: ['hover', 'focus', 'first-child'],
String: ['lang']
}
}
});
var selectors3SyntaxDefinition = (0, exports.extendSyntaxDefinition)(css2SyntaxDefinition, {
namespace: {
wildcard: true
},
combinators: ['~'],
attributes: {
operators: ['^=', '$=', '*=']
},
pseudoElements: {
notation: 'both'
},
pseudoClasses: {
definitions: {
NoArgument: [
'root',
'last-child',
'first-of-type',
'last-of-type',
'only-child',
'only-of-type',
'empty',
'target',
'enabled',
'disabled',
'checked',
'indeterminate'
],
Formula: ['nth-child', 'nth-last-child', 'nth-of-type', 'nth-last-of-type'],
Selector: ['not']
}
}
});
var selectors4SyntaxDefinition = (0, exports.extendSyntaxDefinition)(selectors3SyntaxDefinition, {
combinators: ['||'],
attributes: {
caseSensitivityModifiers: ['i', 'I', 's', 'S']
},
pseudoClasses: {
definitions: {
NoArgument: [
'any-link',
'local-link',
'target-within',
'scope',
'current',
'past',
'future',
'focus-within',
'focus-visible',
'read-write',
'read-only',
'placeholder-shown',
'default',
'valid',
'invalid',
'in-range',
'out-of-range',
'required',
'optional',
'blank',
'user-invalid'
],
Formula: ['nth-col', 'nth-last-col'],
String: ['dir'],
FormulaOfSelector: ['nth-child', 'nth-last-child'],
Selector: ['current', 'is', 'where', 'has']
}
}
});
var progressiveSyntaxDefinition = (0, exports.extendSyntaxDefinition)(selectors4SyntaxDefinition, {
pseudoElements: {
unknown: 'accept'
},
pseudoClasses: {
unknown: 'accept'
},
attributes: {
unknownCaseSensitivityModifiers: 'accept'
}
});
exports.cssSyntaxDefinitions = {
css1: css1SyntaxDefinition,
css2: css2SyntaxDefinition,
css3: selectors3SyntaxDefinition,
'selectors-3': selectors3SyntaxDefinition,
'selectors-4': selectors4SyntaxDefinition,
latest: selectors4SyntaxDefinition,
progressive: progressiveSyntaxDefinition
};

11
node_modules/css-selector-parser/dist/cjs/utils.d.ts generated vendored Normal file
View File

@@ -0,0 +1,11 @@
export declare function isIdentStart(c: string): boolean;
export declare function isIdent(c: string): boolean;
export declare function isHex(c: string): boolean;
export declare const identEscapeChars: Record<string, boolean>;
export declare const stringRenderEscapeChars: Record<string, boolean>;
export declare const whitespaceChars: Record<string, boolean>;
export declare const quoteChars: Record<string, boolean>;
export declare const digitsChars: Record<string, boolean>;
export declare const maxHexLength = 6;
export declare function escapeIdentifier(s: string): string;
export declare function escapeString(s: string): string;

137
node_modules/css-selector-parser/dist/cjs/utils.js generated vendored Normal file
View File

@@ -0,0 +1,137 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.escapeString = exports.escapeIdentifier = exports.maxHexLength = exports.digitsChars = exports.quoteChars = exports.whitespaceChars = exports.stringRenderEscapeChars = exports.identEscapeChars = exports.isHex = exports.isIdent = exports.isIdentStart = void 0;
function isIdentStart(c) {
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c === '-' || c === '_' || c === '\\' || c >= '\u00a0';
}
exports.isIdentStart = isIdentStart;
function isIdent(c) {
return ((c >= 'a' && c <= 'z') ||
(c >= 'A' && c <= 'Z') ||
(c >= '0' && c <= '9') ||
c === '-' ||
c === '_' ||
c >= '\u00a0');
}
exports.isIdent = isIdent;
function isHex(c) {
return (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F') || (c >= '0' && c <= '9');
}
exports.isHex = isHex;
exports.identEscapeChars = {
'!': true,
'"': true,
'#': true,
$: true,
'%': true,
'&': true,
"'": true,
'(': true,
')': true,
'*': true,
'+': true,
',': true,
'.': true,
'/': true,
';': true,
'<': true,
'=': true,
'>': true,
'?': true,
'@': true,
'[': true,
'\\': true,
']': true,
'^': true,
'`': true,
'{': true,
'|': true,
'}': true,
'~': true
};
exports.stringRenderEscapeChars = {
'\n': true,
'\r': true,
'\t': true,
'\f': true,
'\v': true
};
exports.whitespaceChars = {
' ': true,
'\t': true,
'\n': true,
'\r': true,
'\f': true
};
exports.quoteChars = {
'"': true,
"'": true
};
exports.digitsChars = {
0: true,
1: true,
2: true,
3: true,
4: true,
5: true,
6: true,
7: true,
8: true,
9: true
};
exports.maxHexLength = 6;
function escapeIdentifier(s) {
var len = s.length;
var result = '';
var i = 0;
while (i < len) {
var chr = s.charAt(i);
if (exports.identEscapeChars[chr] || (chr === '-' && i === 1 && s.charAt(0) === '-')) {
result += '\\' + chr;
}
else {
if (chr === '-' ||
chr === '_' ||
(chr >= 'A' && chr <= 'Z') ||
(chr >= 'a' && chr <= 'z') ||
(chr >= '0' && chr <= '9' && i !== 0 && !(i === 1 && s.charAt(0) === '-'))) {
result += chr;
}
else {
var charCode = chr.charCodeAt(0);
if ((charCode & 0xf800) === 0xd800) {
var extraCharCode = s.charCodeAt(i++);
if ((charCode & 0xfc00) !== 0xd800 || (extraCharCode & 0xfc00) !== 0xdc00) {
throw Error('UCS-2(decode): illegal sequence');
}
charCode = ((charCode & 0x3ff) << 10) + (extraCharCode & 0x3ff) + 0x10000;
}
result += '\\' + charCode.toString(16) + ' ';
}
}
i++;
}
return result.trim();
}
exports.escapeIdentifier = escapeIdentifier;
function escapeString(s) {
var len = s.length;
var result = '';
var i = 0;
while (i < len) {
var chr = s.charAt(i);
if (chr === '"') {
chr = '\\"';
}
else if (chr === '\\') {
chr = '\\\\';
}
else if (exports.stringRenderEscapeChars[chr]) {
chr = '\\' + chr.charCodeAt(0).toString(16) + (i === len - 1 ? '' : ' ');
}
result += chr;
i++;
}
return "\"".concat(result, "\"");
}
exports.escapeString = escapeString;

286
node_modules/css-selector-parser/dist/mjs/ast.d.ts generated vendored Normal file
View File

@@ -0,0 +1,286 @@
/**
* CSS Selector AST root.
* Contains list of CSS rules (separated by a comma in the input CSS selector string).
* Generated by {@link AstFactory.selector ast.selector}.
*/
export interface AstSelector {
type: 'Selector';
/**
* List of CSS rules. Every rule contains conditions. Selector is considered matched once at least one rule matches.
*/
rules: AstRule[];
}
/**
* A single CSS rule that contains match conditions.
* Can nest another rule with or without a combinator (i.e. `"div > span"`).
* Generated by {@link AstFactory.rule ast.rule}.
*/
export interface AstRule {
type: 'Rule';
/** Items of a CSS rule. Can be tag, ids, class names, pseudo-classes and pseudo-elements. */
items: (AstTagName | AstWildcardTag | AstId | AstClassName | AstAttribute | AstPseudoClass | AstPseudoElement)[];
/** Rule combinator which was used to nest this rule (i.e. `">"` in case of `"div > span"` if the current rule is `"span"`). */
combinator?: string;
/** Nested rule if specified (i.e. `"div > span"`). */
nestedRule?: AstRule;
}
/**
* Named tag, i.e. `"div"`. Part of CSS Qualified Names.
* Generated by {@link AstFactory.tagName ast.tagName}.
* @see https://developer.mozilla.org/en-US/docs/Web/CSS/Type_selectors
* @see https://drafts.csswg.org/css-namespaces-3/#css-qnames
*/
export interface AstTagName {
type: 'TagName';
/** Tag name, i.e. `"div"`. */
name: string;
/** Namespace according to https://www.w3.org/TR/css3-namespace/. */
namespace?: AstNamespaceName | AstWildcardNamespace | AstNoNamespace;
}
/**
* ID condition. Matches by id attribute value.
* Generated by {@link AstFactory.id ast.id}.
* https://developer.mozilla.org/en-US/docs/Web/CSS/ID_selectors
* @example "#root"
*/
export interface AstId {
type: 'Id';
/** ID name. I.e. `#root` -> `"root"`. */
name: string;
}
/**
* Class name condition. Matches by class attribute value.
* Generated by {@link AstFactory.className ast.className}.
* https://developer.mozilla.org/en-US/docs/Web/CSS/ID_selectors
* @example ".user"
*/
export interface AstClassName {
type: 'ClassName';
/** ID name. I.e. `.user` -> `"user"`. */
name: string;
}
/**
* Wildcard tag (universal selector): `*`.
* Generated by {@link AstFactory.wildcardTag ast.wildcardTag}.
* @see https://developer.mozilla.org/en-US/docs/Web/CSS/Universal_selectors
* @see https://drafts.csswg.org/css-namespaces-3/#css-qnames
*/
export interface AstWildcardTag {
type: 'WildcardTag';
/** Namespace according to https://www.w3.org/TR/css3-namespace/. */
namespace?: AstNamespaceName | AstWildcardNamespace | AstNoNamespace;
}
/**
* Named namespace declaration (i.e. `ns|div`).
* Generated by {@link AstFactory.namespaceName ast.namespaceName}.
* @see https://drafts.csswg.org/css-namespaces-3/#css-qnames
*/
export interface AstNamespaceName {
type: 'NamespaceName';
/** Namespace name (i.e. `"ns"` in case of `"ns|div"`). "*/
name: string;
}
/**
* Wildcard namespace (universal selector): `*`.
* Generated by {@link AstFactory.wildcardNamespace ast.wildcardNamespace}.
* @see https://developer.mozilla.org/en-US/docs/Web/CSS/Universal_selectors
* @see https://drafts.csswg.org/css-namespaces-3/#css-qnames
*/
export interface AstWildcardNamespace {
type: 'WildcardNamespace';
}
/**
* Explicit no-namespace declaration (i.e. `|div`).
* Generated by {@link AstFactory.noNamespace ast.noNamespace}.
* @see https://drafts.csswg.org/css-namespaces-3/#css-qnames
*/
export interface AstNoNamespace {
type: 'NoNamespace';
}
/**
* Attribute selector.
* Generated by {@link AstFactory.attribute ast.attribute}.
* @example "[role='button' i]"
*/
export interface AstAttribute {
type: 'Attribute';
/** Attribute name (i.e. `"href"` in case if `"[href]"`). */
name: string;
/** Namespace according to https://drafts.csswg.org/selectors/#attrnmsp. */
namespace?: AstNamespaceName | AstWildcardNamespace | AstNoNamespace;
/** Comparison operator (i.e. `"|="` in case if `"[role|=button]"`). */
operator?: string;
/** Comparison value (i.e. `"button"` in case if `"[role=button]"`). */
value?: AstString | AstSubstitution;
/** Comparison case sensitivity modifier (i.e. `"i"` in case if `"[role='button' i]"`). */
caseSensitivityModifier?: string;
}
/**
* Pseudo-class selector.
* Generated by {@link AstFactory.pseudoClass ast.pseudoClass}.
* @see https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors/Pseudo-classes_and_pseudo-elements
* @example ":lang(en)"
*/
export interface AstPseudoClass {
type: 'PseudoClass';
/** Pseudo-class name (i.e. `"hover"` in case of `":hover"`). */
name: string;
/** Pseudo-class value (i.e. `"en"` in case of `":lang(en)"`). */
argument?: AstSubstitution | AstSelector | AstString | AstFormula | AstFormulaOfSelector;
}
/**
* Pseudo-class selector.
* Generated by {@link AstFactory.pseudoElement ast.pseudoElement}.
* @see https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors/Pseudo-classes_and_pseudo-elements
* @example "::before"
*/
export interface AstPseudoElement {
type: 'PseudoElement';
/** Pseudo-element name (i.e. `"before"` in case of `"::before"`). */
name: string;
/** Pseudo-element value (i.e. `"foo"` in case of `"::part(foo)"`). */
argument?: AstSubstitution | AstString | AstSelector;
}
/**
* String value. Can be used as attribute value of pseudo-class string value.
* For instance `:lang(en)` -> `{type: 'AstPseudoClass'..., argument: {type: 'String', value: 'en'}}`.
* Generated by {@link AstFactory.string ast.string}.
*/
export interface AstString {
type: 'String';
/** The actual string value. */
value: string;
}
/**
* Pseudo-class formula value. `a` is multiplier of `n` and `b` us added on top. Formula: `an + b`.
* For instance `:nth-child(2n + 1)` -> `{type: 'AstPseudoClass'..., argument: {type: 'Formula', a: 2, b: 1}}`.
* Generated by {@link AstFactory.formula ast.formula}.
* @see https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-child#functional_notation
*/
export interface AstFormula {
type: 'Formula';
/** Multiplier of `n`. */
a: number;
/** Constant added to `a*n`. */
b: number;
}
/**
* Pseudo-class formula of selector value. `a` is multiplier of `n` and `b` us added on top. Formula: `an + b`.
* Formula is followed by `of` keyword and then goes a CSS selector.
* For instance `:nth-child(2n + 1 of div)` ->
* `{type: 'AstPseudoClass'..., argument: {type: 'FormulaOfSelector', a: 2, b: 1, selector: {type: 'Selector', rules: [{type: 'Rule', items: [{type: 'TagName', name: 'div'}]}]}}}`.
* Generated by {@link AstFactory.formulaOfSelector ast.formulaOfSelector}.
* @see https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-child#functional_notation
*/
export interface AstFormulaOfSelector {
type: 'FormulaOfSelector';
/** Multiplier of `n`. */
a: number;
/** Constant added to `a*n`. */
b: number;
/** Selector that goes after formula (i.e. `"div -> span"` in case of `":nth-child(2n + 1 of div > span)"` */
selector: AstRule;
}
/**
* Substitution is not part of CSS spec, but rather a useful extension on top of CSS if you need to pass variables.
* Generated by {@link AstFactory.substitution ast.substitution}.
*/
export interface AstSubstitution {
type: 'Substitution';
/** Substitution name (i.e. "var" in case of `"[role=$var]"` or `":lang($var)"`). */
name: string;
}
/** One of pseudo-class argument types. */
export type AstPseudoClassArgument = AstSubstitution | AstSelector | AstString | AstFormula | AstFormulaOfSelector;
/** One of pseudo-element argument types. */
export type AstPseudoElementArgument = AstSubstitution | AstString | AstSelector;
/** One of CSS AST entity types. */
export type AstEntity = AstSelector | AstRule | AstTagName | AstWildcardTag | AstId | AstClassName | AstNamespaceName | AstWildcardNamespace | AstNoNamespace | AstSubstitution | AstString | AstFormula | AstFormulaOfSelector | AstPseudoClass | AstAttribute | AstPseudoElement;
type UnionToIntersection<T> = (T extends any ? (x: T) => any : never) extends (x: infer R) => any ? R : never;
type ToAstFactory<T> = UnionToIntersection<T extends {
type: infer Type;
} ? Type extends string ? {
[K in Uncapitalize<Type>]: {} extends Omit<T, 'type'> ? (props?: {
[PK in keyof Omit<T, 'type'>]: Omit<T, 'type'>[PK];
}) => T : (props: {
[PK in keyof Omit<T, 'type'>]: Omit<T, 'type'>[PK];
}) => T;
} & {
[K in `is${Type}`]: (entity: unknown) => entity is T;
} : never : never>;
/** @internal */
type AstFactoryBase = {
[K in keyof ToAstFactory<AstEntity>]: ToAstFactory<AstEntity>[K];
};
/**
* AST structure generators and matchers.
* For instance, `ast.selector({rules: [...]})` creates AstSelector and `ast.isSelector(...)` checks if
* AstSelector was specified.
*
* @example
*
* // Represents CSS selector: ns|div#user-34.user.user-active[role="button"]:lang(en)::before > *
* const selector = ast.selector({
* rules: [
* ast.rule({
* items: [
* ast.tagName({name: 'div', namespace: ast.namespaceName({name: 'ns'})}),
* ast.id({name: 'user-34'}),
* ast.className({name: 'user'}),
* ast.className({name: 'user-active'}),
* ast.attribute({
* name: 'role',
* operator: '=',
* value: ast.string({value: 'button'})
* }),
* ast.pseudoClass({
* name: 'lang',
* argument: ast.string({value: 'en'})
* }),
* ast.pseudoElement({name: 'before'})
* ],
* nestedRule: ast.rule({combinator: '>', items: [ast.wildcardTag()]})
* })
* ]
* });
* console.log(ast.isSelector(selector)); // prints true
* console.log(ast.isRule(selector)); // prints false
*/
export interface AstFactory extends AstFactoryBase {
}
/**
* AST structure generators and matchers.
* For instance, `ast.selector({rules: [...]})` creates AstSelector and `ast.isSelector(...)` checks if
* AstSelector was specified.
*
* @example
*
* // Represents CSS selector: ns|div#user-34.user.user-active[role="button"]:lang(en)::before > *
* const selector = ast.selector({
* rules: [
* ast.rule({
* items: [
* ast.tagName({name: 'div', namespace: ast.namespaceName({name: 'ns'})}),
* ast.id({name: 'user-34'}),
* ast.className({name: 'user'}),
* ast.className({name: 'user-active'}),
* ast.attribute({
* name: 'role',
* operator: '=',
* value: ast.string({value: 'button'})
* }),
* ast.pseudoClass({
* name: 'lang',
* argument: ast.string({value: 'en'})
* }),
* ast.pseudoElement({name: 'before'})
* ],
* nestedRule: ast.rule({combinator: '>', items: [ast.wildcardTag()]})
* })
* ]
* });
* console.log(ast.isSelector(selector)); // prints true
* console.log(ast.isRule(selector)); // prints false
*/
export declare const ast: AstFactory;
export {};

57
node_modules/css-selector-parser/dist/mjs/ast.js generated vendored Normal file
View File

@@ -0,0 +1,57 @@
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
function astMethods(type) {
return function (generatorName, checkerName) {
var _a;
return (_a = {},
_a[generatorName] = function (props) { return (__assign({ type: type }, props)); },
_a[checkerName] = function (entity) {
return typeof entity === 'object' && entity !== null && entity.type === type;
},
_a);
};
}
/**
* AST structure generators and matchers.
* For instance, `ast.selector({rules: [...]})` creates AstSelector and `ast.isSelector(...)` checks if
* AstSelector was specified.
*
* @example
*
* // Represents CSS selector: ns|div#user-34.user.user-active[role="button"]:lang(en)::before > *
* const selector = ast.selector({
* rules: [
* ast.rule({
* items: [
* ast.tagName({name: 'div', namespace: ast.namespaceName({name: 'ns'})}),
* ast.id({name: 'user-34'}),
* ast.className({name: 'user'}),
* ast.className({name: 'user-active'}),
* ast.attribute({
* name: 'role',
* operator: '=',
* value: ast.string({value: 'button'})
* }),
* ast.pseudoClass({
* name: 'lang',
* argument: ast.string({value: 'en'})
* }),
* ast.pseudoElement({name: 'before'})
* ],
* nestedRule: ast.rule({combinator: '>', items: [ast.wildcardTag()]})
* })
* ]
* });
* console.log(ast.isSelector(selector)); // prints true
* console.log(ast.isRule(selector)); // prints false
*/
export var ast = __assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign({}, astMethods('Selector')('selector', 'isSelector')), astMethods('Rule')('rule', 'isRule')), astMethods('TagName')('tagName', 'isTagName')), astMethods('Id')('id', 'isId')), astMethods('ClassName')('className', 'isClassName')), astMethods('WildcardTag')('wildcardTag', 'isWildcardTag')), astMethods('NamespaceName')('namespaceName', 'isNamespaceName')), astMethods('WildcardNamespace')('wildcardNamespace', 'isWildcardNamespace')), astMethods('NoNamespace')('noNamespace', 'isNoNamespace')), astMethods('Attribute')('attribute', 'isAttribute')), astMethods('PseudoClass')('pseudoClass', 'isPseudoClass')), astMethods('PseudoElement')('pseudoElement', 'isPseudoElement')), astMethods('String')('string', 'isString')), astMethods('Formula')('formula', 'isFormula')), astMethods('FormulaOfSelector')('formulaOfSelector', 'isFormulaOfSelector')), astMethods('Substitution')('substitution', 'isSubstitution'));

4
node_modules/css-selector-parser/dist/mjs/index.d.ts generated vendored Normal file
View File

@@ -0,0 +1,4 @@
export { createParser, Parser, ParserError } from './parser.js';
export { render } from './render.js';
export { ast, AstAttribute, AstClassName, AstEntity, AstFactory, AstFormula, AstFormulaOfSelector, AstId, AstNamespaceName, AstNoNamespace, AstPseudoClass, AstPseudoElement, AstRule, AstSelector, AstString, AstSubstitution, AstTagName, AstWildcardNamespace, AstWildcardTag } from './ast.js';
export { CssLevel, SyntaxDefinition } from './syntax-definitions.js';

3
node_modules/css-selector-parser/dist/mjs/index.js generated vendored Normal file
View File

@@ -0,0 +1,3 @@
export { createParser } from './parser.js';
export { render } from './render.js';
export { ast } from './ast.js';

13
node_modules/css-selector-parser/dist/mjs/indexes.d.ts generated vendored Normal file
View File

@@ -0,0 +1,13 @@
export interface MulticharIndex {
[key: string]: MulticharIndexChar;
}
export interface MulticharIndexChar {
chars: MulticharIndex;
self?: string;
}
type RegularIndex = Record<string, boolean>;
export declare const emptyMulticharIndex: MulticharIndex;
export declare const emptyRegularIndex: RegularIndex;
export declare function createMulticharIndex(items: string[]): MulticharIndex;
export declare function createRegularIndex(items: string[]): RegularIndex;
export {};

36
node_modules/css-selector-parser/dist/mjs/indexes.js generated vendored Normal file
View File

@@ -0,0 +1,36 @@
export var emptyMulticharIndex = {};
export var emptyRegularIndex = {};
function extendIndex(item, index) {
var currentIndex = index;
for (var pos = 0; pos < item.length; pos++) {
var isLast = pos === item.length - 1;
var char = item.charAt(pos);
var charIndex = currentIndex[char] || (currentIndex[char] = { chars: {} });
if (isLast) {
charIndex.self = item;
}
currentIndex = charIndex.chars;
}
}
export function createMulticharIndex(items) {
if (items.length === 0) {
return emptyMulticharIndex;
}
var index = {};
for (var _i = 0, items_1 = items; _i < items_1.length; _i++) {
var item = items_1[_i];
extendIndex(item, index);
}
return index;
}
export function createRegularIndex(items) {
if (items.length === 0) {
return emptyRegularIndex;
}
var result = {};
for (var _i = 0, items_2 = items; _i < items_2.length; _i++) {
var item = items_2[_i];
result[item] = true;
}
return result;
}

View File

@@ -0,0 +1 @@
{"type": "module"}

41
node_modules/css-selector-parser/dist/mjs/parser.d.ts generated vendored Normal file
View File

@@ -0,0 +1,41 @@
import { AstSelector } from './ast.js';
import { CssLevel, SyntaxDefinition } from './syntax-definitions.js';
/**
* This error is thrown when parser encounters problems in CSS string.
* On top of the usual error, it has `position` property to indicate where in the input string the error happened.
*/
export interface ParserError extends Error {
message: string;
name: 'ParserError';
position: number;
}
/**
* Parses CSS selector string and returns CSS selector AST.
* @throws {ParserError}
*/
export type Parser = (input: string) => AstSelector;
/**
* Creates a parse function to be used later to parse CSS selectors.
*/
export declare function createParser(options?: {
/**
* CSS Syntax options to be used for parsing.
* Can either be one of the predefined CSS levels ({@link CssLevel}) or a more detailed syntax definition ({@link SyntaxDefinition}).
* Default: `"latest"`
*/
syntax?: CssLevel | SyntaxDefinition;
/**
* Flag to enable substitutes.
* This is not part of CSS syntax, but rather a useful feature to pass variables into CSS selectors.
* Default: `false`
* @example "[attr=$variable]"
*/
substitutes?: boolean;
/**
* CSS selector parser in modern browsers is very forgiving. For instance, it works fine with unclosed attribute
* selectors: `"[attr=value"`.
* Set to `false` in order to mimic browser behaviour.
* Default: `true`
*/
strict?: boolean;
}): Parser;

722
node_modules/css-selector-parser/dist/mjs/parser.js generated vendored Normal file
View File

@@ -0,0 +1,722 @@
import { createMulticharIndex, createRegularIndex, emptyMulticharIndex, emptyRegularIndex } from './indexes.js';
import { calculatePseudoSignatures, defaultPseudoSignature, emptyPseudoSignatures } from './pseudo-signatures.js';
import { cssSyntaxDefinitions, extendSyntaxDefinition, getXmlOptions } from './syntax-definitions.js';
import { digitsChars, isHex, isIdent, isIdentStart, maxHexLength, quoteChars, whitespaceChars } from './utils.js';
var errorPrefix = "css-selector-parser parse error: ";
/**
* Creates a parse function to be used later to parse CSS selectors.
*/
export function createParser(options) {
if (options === void 0) { options = {}; }
var _a = options.syntax, syntax = _a === void 0 ? 'latest' : _a, substitutes = options.substitutes, _b = options.strict, strict = _b === void 0 ? true : _b;
var syntaxDefinition = typeof syntax === 'object' ? syntax : cssSyntaxDefinitions[syntax];
if (syntaxDefinition.baseSyntax) {
syntaxDefinition = extendSyntaxDefinition(cssSyntaxDefinitions[syntaxDefinition.baseSyntax], syntaxDefinition);
}
var _c = syntaxDefinition.tag
? [true, Boolean(getXmlOptions(syntaxDefinition.tag).wildcard)]
: [false, false], tagNameEnabled = _c[0], tagNameWildcardEnabled = _c[1];
var idEnabled = Boolean(syntaxDefinition.ids);
var classNamesEnabled = Boolean(syntaxDefinition.classNames);
var namespaceEnabled = Boolean(syntaxDefinition.namespace);
var namespaceWildcardEnabled = syntaxDefinition.namespace &&
(syntaxDefinition.namespace === true || syntaxDefinition.namespace.wildcard === true);
if (namespaceEnabled && !tagNameEnabled) {
throw new Error("".concat(errorPrefix, "Namespaces cannot be enabled while tags are disabled."));
}
var substitutesEnabled = Boolean(substitutes);
var combinatorsIndex = syntaxDefinition.combinators
? createMulticharIndex(syntaxDefinition.combinators)
: emptyMulticharIndex;
var _d = syntaxDefinition.attributes
? [
true,
syntaxDefinition.attributes.operators
? createMulticharIndex(syntaxDefinition.attributes.operators)
: emptyMulticharIndex,
syntaxDefinition.attributes.caseSensitivityModifiers
? createRegularIndex(syntaxDefinition.attributes.caseSensitivityModifiers)
: emptyRegularIndex,
syntaxDefinition.attributes.unknownCaseSensitivityModifiers === 'accept'
]
: [false, emptyMulticharIndex, emptyRegularIndex, false], attributesEnabled = _d[0], attributesOperatorsIndex = _d[1], attributesCaseSensitivityModifiers = _d[2], attributesAcceptUnknownCaseSensitivityModifiers = _d[3];
var attributesCaseSensitivityModifiersEnabled = attributesAcceptUnknownCaseSensitivityModifiers || Object.keys(attributesCaseSensitivityModifiers).length > 0;
var _e = syntaxDefinition.pseudoClasses
? [
true,
syntaxDefinition.pseudoClasses.definitions
? calculatePseudoSignatures(syntaxDefinition.pseudoClasses.definitions)
: emptyPseudoSignatures,
syntaxDefinition.pseudoClasses.unknown === 'accept'
]
: [false, emptyPseudoSignatures, false], pseudoClassesEnabled = _e[0], pseudoClassesDefinitions = _e[1], pseudoClassesAcceptUnknown = _e[2];
var _f = syntaxDefinition.pseudoElements
? [
true,
syntaxDefinition.pseudoElements.notation === 'singleColon' ||
syntaxDefinition.pseudoElements.notation === 'both',
!syntaxDefinition.pseudoElements.notation ||
syntaxDefinition.pseudoElements.notation === 'doubleColon' ||
syntaxDefinition.pseudoElements.notation === 'both',
syntaxDefinition.pseudoElements.definitions
? calculatePseudoSignatures(Array.isArray(syntaxDefinition.pseudoElements.definitions)
? { NoArgument: syntaxDefinition.pseudoElements.definitions }
: syntaxDefinition.pseudoElements.definitions)
: emptyPseudoSignatures,
syntaxDefinition.pseudoElements.unknown === 'accept'
]
: [false, false, false, emptyPseudoSignatures, false], pseudoElementsEnabled = _f[0], pseudoElementsSingleColonNotationEnabled = _f[1], pseudoElementsDoubleColonNotationEnabled = _f[2], pseudoElementsDefinitions = _f[3], pseudoElementsAcceptUnknown = _f[4];
var str = '';
var l = str.length;
var pos = 0;
var chr = '';
var is = function (comparison) { return chr === comparison; };
var isTagStart = function () { return is('*') || isIdentStart(chr); };
var rewind = function (newPos) {
pos = newPos;
chr = str.charAt(pos);
};
var next = function () {
pos++;
chr = str.charAt(pos);
};
var readAndNext = function () {
var current = chr;
pos++;
chr = str.charAt(pos);
return current;
};
/** @throws ParserError */
function fail(errorMessage) {
var position = Math.min(l - 1, pos);
var error = new Error("".concat(errorPrefix).concat(errorMessage, " Pos: ").concat(position, "."));
error.position = position;
error.name = 'ParserError';
throw error;
}
function assert(condition, errorMessage) {
if (!condition) {
return fail(errorMessage);
}
}
var assertNonEof = function () {
assert(pos < l, 'Unexpected end of input.');
};
var isEof = function () { return pos >= l; };
var pass = function (character) {
assert(pos < l, "Expected \"".concat(character, "\" but end of input reached."));
assert(chr === character, "Expected \"".concat(character, "\" but \"").concat(chr, "\" found."));
pos++;
chr = str.charAt(pos);
};
function matchMulticharIndex(index) {
var match = matchMulticharIndexPos(index, pos);
if (match) {
pos += match.length;
chr = str.charAt(pos);
return match;
}
}
function matchMulticharIndexPos(index, subPos) {
var char = str.charAt(subPos);
var charIndex = index[char];
if (charIndex) {
var subMatch = matchMulticharIndexPos(charIndex.chars, subPos + 1);
if (subMatch) {
return subMatch;
}
if (charIndex.self) {
return charIndex.self;
}
}
}
/**
* @see https://www.w3.org/TR/css-syntax/#hex-digit-diagram
*/
function parseHex() {
var hex = readAndNext();
var count = 1;
while (isHex(chr) && count < maxHexLength) {
hex += readAndNext();
count++;
}
skipSingleWhitespace();
return String.fromCharCode(parseInt(hex, 16));
}
/**
* @see https://www.w3.org/TR/css-syntax/#string-token-diagram
*/
function parseString(quote) {
var result = '';
pass(quote);
while (pos < l) {
if (is(quote)) {
next();
return result;
}
else if (is('\\')) {
next();
if (is(quote)) {
result += quote;
next();
}
else if (chr === '\n' || chr === '\f') {
next();
}
else if (chr === '\r') {
next();
if (is('\n')) {
next();
}
}
else if (isHex(chr)) {
result += parseHex();
}
else {
result += chr;
next();
}
}
else {
result += chr;
next();
}
}
return result;
}
/**
* @see https://www.w3.org/TR/css-syntax/#ident-token-diagram
*/
function parseIdentifier() {
if (!isIdentStart(chr)) {
return null;
}
var result = '';
while (is('-')) {
result += chr;
next();
}
if (result === '-' && !isIdent(chr) && !is('\\')) {
fail('Identifiers cannot consist of a single hyphen.');
}
if (strict && result.length >= 2) {
// Checking this only for strict mode since browsers work fine with these identifiers.
fail('Identifiers cannot start with two hyphens with strict mode on.');
}
if (digitsChars[chr]) {
fail('Identifiers cannot start with hyphens followed by digits.');
}
while (pos < l) {
if (isIdent(chr)) {
result += readAndNext();
}
else if (is('\\')) {
next();
assertNonEof();
if (isHex(chr)) {
result += parseHex();
}
else {
result += readAndNext();
}
}
else {
break;
}
}
return result;
}
function parsePseudoClassString() {
var result = '';
while (pos < l) {
if (is(')')) {
break;
}
else if (is('\\')) {
next();
if (isEof() && !strict) {
return (result + '\\').trim();
}
assertNonEof();
if (isHex(chr)) {
result += parseHex();
}
else {
result += readAndNext();
}
}
else {
result += readAndNext();
}
}
return result.trim();
}
function skipSingleWhitespace() {
if (chr === ' ' || chr === '\t' || chr === '\f' || chr === '\n') {
next();
return;
}
if (chr === '\r') {
next();
}
if (chr === '\n') {
next();
}
}
function skipWhitespace() {
while (whitespaceChars[chr]) {
next();
}
}
function parseSelector(relative) {
if (relative === void 0) { relative = false; }
skipWhitespace();
var rules = [parseRule(relative)];
while (is(',')) {
next();
skipWhitespace();
rules.push(parseRule(relative));
}
return {
type: 'Selector',
rules: rules
};
}
function parseAttribute() {
pass('[');
skipWhitespace();
var attr;
if (is('|')) {
assert(namespaceEnabled, 'Namespaces are not enabled.');
next();
var name_1 = parseIdentifier();
assert(name_1, 'Expected attribute name.');
attr = {
type: 'Attribute',
name: name_1,
namespace: { type: 'NoNamespace' }
};
}
else if (is('*')) {
assert(namespaceEnabled, 'Namespaces are not enabled.');
assert(namespaceWildcardEnabled, 'Wildcard namespace is not enabled.');
next();
pass('|');
var name_2 = parseIdentifier();
assert(name_2, 'Expected attribute name.');
attr = {
type: 'Attribute',
name: name_2,
namespace: { type: 'WildcardNamespace' }
};
}
else {
var identifier = parseIdentifier();
assert(identifier, 'Expected attribute name.');
attr = {
type: 'Attribute',
name: identifier
};
if (is('|')) {
var savedPos = pos;
next();
if (isIdentStart(chr)) {
assert(namespaceEnabled, 'Namespaces are not enabled.');
var name_3 = parseIdentifier();
assert(name_3, 'Expected attribute name.');
attr = {
type: 'Attribute',
name: name_3,
namespace: { type: 'NamespaceName', name: identifier }
};
}
else {
rewind(savedPos);
}
}
}
assert(attr.name, 'Expected attribute name.');
skipWhitespace();
if (isEof() && !strict) {
return attr;
}
if (is(']')) {
next();
}
else {
attr.operator = matchMulticharIndex(attributesOperatorsIndex);
assert(attr.operator, 'Expected a valid attribute selector operator.');
skipWhitespace();
assertNonEof();
if (quoteChars[chr]) {
attr.value = {
type: 'String',
value: parseString(chr)
};
}
else if (substitutesEnabled && is('$')) {
next();
var name_4 = parseIdentifier();
assert(name_4, 'Expected substitute name.');
attr.value = {
type: 'Substitution',
name: name_4
};
}
else {
var value = parseIdentifier();
assert(value, 'Expected attribute value.');
attr.value = {
type: 'String',
value: value
};
}
skipWhitespace();
if (isEof() && !strict) {
return attr;
}
if (!is(']')) {
var caseSensitivityModifier = parseIdentifier();
assert(caseSensitivityModifier, 'Expected end of attribute selector.');
attr.caseSensitivityModifier = caseSensitivityModifier;
assert(attributesCaseSensitivityModifiersEnabled, 'Attribute case sensitivity modifiers are not enabled.');
assert(attributesAcceptUnknownCaseSensitivityModifiers ||
attributesCaseSensitivityModifiers[attr.caseSensitivityModifier], 'Unknown attribute case sensitivity modifier.');
skipWhitespace();
if (isEof() && !strict) {
return attr;
}
}
pass(']');
}
return attr;
}
function parseNumber() {
var result = '';
while (digitsChars[chr]) {
result += readAndNext();
}
assert(result !== '', 'Formula parse error.');
return parseInt(result);
}
var isNumberStart = function () { return is('-') || is('+') || digitsChars[chr]; };
function parseFormula() {
if (is('e') || is('o')) {
var ident = parseIdentifier();
if (ident === 'even') {
skipWhitespace();
return [2, 0];
}
if (ident === 'odd') {
skipWhitespace();
return [2, 1];
}
}
var firstNumber = null;
var firstNumberMultiplier = 1;
if (is('-')) {
next();
firstNumberMultiplier = -1;
}
if (isNumberStart()) {
if (is('+')) {
next();
}
firstNumber = parseNumber();
if (!is('\\') && !is('n')) {
return [0, firstNumber * firstNumberMultiplier];
}
}
if (firstNumber === null) {
firstNumber = 1;
}
firstNumber *= firstNumberMultiplier;
var identifier;
if (is('\\')) {
next();
if (isHex(chr)) {
identifier = parseHex();
}
else {
identifier = readAndNext();
}
}
else {
identifier = readAndNext();
}
assert(identifier === 'n', 'Formula parse error: expected "n".');
skipWhitespace();
if (is('+') || is('-')) {
var sign = is('+') ? 1 : -1;
next();
skipWhitespace();
return [firstNumber, sign * parseNumber()];
}
else {
return [firstNumber, 0];
}
}
function parsePseudoArgument(pseudoName, type, signature) {
var argument;
if (is('(')) {
next();
skipWhitespace();
if (substitutesEnabled && is('$')) {
next();
var name_5 = parseIdentifier();
assert(name_5, 'Expected substitute name.');
argument = {
type: 'Substitution',
name: name_5
};
}
else if (signature.type === 'String') {
argument = {
type: 'String',
value: parsePseudoClassString()
};
assert(argument.value, "Expected ".concat(type, " argument value."));
}
else if (signature.type === 'Selector') {
argument = parseSelector(true);
}
else if (signature.type === 'Formula') {
var _a = parseFormula(), a = _a[0], b = _a[1];
argument = {
type: 'Formula',
a: a,
b: b
};
if (signature.ofSelector) {
skipWhitespace();
if (is('o') || is('\\')) {
var ident = parseIdentifier();
assert(ident === 'of', 'Formula of selector parse error.');
skipWhitespace();
argument = {
type: 'FormulaOfSelector',
a: a,
b: b,
selector: parseRule()
};
}
}
}
else {
return fail("Invalid ".concat(type, " signature."));
}
skipWhitespace();
if (isEof() && !strict) {
return argument;
}
pass(')');
}
else {
assert(signature.optional, "Argument is required for ".concat(type, " \"").concat(pseudoName, "\"."));
}
return argument;
}
function parseTagName() {
if (is('*')) {
assert(tagNameWildcardEnabled, 'Wildcard tag name is not enabled.');
next();
return { type: 'WildcardTag' };
}
else if (isIdentStart(chr)) {
assert(tagNameEnabled, 'Tag names are not enabled.');
var name_6 = parseIdentifier();
assert(name_6, 'Expected tag name.');
return {
type: 'TagName',
name: name_6
};
}
else {
return fail('Expected tag name.');
}
}
function parseTagNameWithNamespace() {
if (is('*')) {
var savedPos = pos;
next();
if (!is('|')) {
rewind(savedPos);
return parseTagName();
}
next();
if (!isTagStart()) {
rewind(savedPos);
return parseTagName();
}
assert(namespaceEnabled, 'Namespaces are not enabled.');
assert(namespaceWildcardEnabled, 'Wildcard namespace is not enabled.');
var tagName = parseTagName();
tagName.namespace = { type: 'WildcardNamespace' };
return tagName;
}
else if (is('|')) {
assert(namespaceEnabled, 'Namespaces are not enabled.');
next();
var tagName = parseTagName();
tagName.namespace = { type: 'NoNamespace' };
return tagName;
}
else if (isIdentStart(chr)) {
var identifier = parseIdentifier();
assert(identifier, 'Expected tag name.');
if (!is('|')) {
assert(tagNameEnabled, 'Tag names are not enabled.');
return {
type: 'TagName',
name: identifier
};
}
var savedPos = pos;
next();
if (!isTagStart()) {
rewind(savedPos);
return {
type: 'TagName',
name: identifier
};
}
assert(namespaceEnabled, 'Namespaces are not enabled.');
var tagName = parseTagName();
tagName.namespace = { type: 'NamespaceName', name: identifier };
return tagName;
}
else {
return fail('Expected tag name.');
}
}
function parseRule(relative) {
var _a, _b;
if (relative === void 0) { relative = false; }
var rule = { type: 'Rule', items: [] };
if (relative) {
var combinator = matchMulticharIndex(combinatorsIndex);
if (combinator) {
rule.combinator = combinator;
skipWhitespace();
}
}
while (pos < l) {
if (isTagStart()) {
assert(rule.items.length === 0, 'Unexpected tag/namespace start.');
rule.items.push(parseTagNameWithNamespace());
}
else if (is('|')) {
var savedPos = pos;
next();
if (isTagStart()) {
assert(rule.items.length === 0, 'Unexpected tag/namespace start.');
rewind(savedPos);
rule.items.push(parseTagNameWithNamespace());
}
else {
rewind(savedPos);
break;
}
}
else if (is('.')) {
assert(classNamesEnabled, 'Class names are not enabled.');
next();
var className = parseIdentifier();
assert(className, 'Expected class name.');
rule.items.push({ type: 'ClassName', name: className });
}
else if (is('#')) {
assert(idEnabled, 'IDs are not enabled.');
next();
var idName = parseIdentifier();
assert(idName, 'Expected ID name.');
rule.items.push({ type: 'Id', name: idName });
}
else if (is('[')) {
assert(attributesEnabled, 'Attributes are not enabled.');
rule.items.push(parseAttribute());
}
else if (is(':')) {
var isDoubleColon = false;
var isPseudoElement = false;
next();
if (is(':')) {
assert(pseudoElementsEnabled, 'Pseudo elements are not enabled.');
assert(pseudoElementsDoubleColonNotationEnabled, 'Pseudo elements double colon notation is not enabled.');
isDoubleColon = true;
next();
}
var pseudoName = parseIdentifier();
assert(isDoubleColon || pseudoName, 'Expected pseudo-class name.');
assert(!isDoubleColon || pseudoName, 'Expected pseudo-element name.');
assert(pseudoName, 'Expected pseudo-class name.');
assert(!isDoubleColon ||
pseudoElementsAcceptUnknown ||
Object.prototype.hasOwnProperty.call(pseudoElementsDefinitions, pseudoName), "Unknown pseudo-element \"".concat(pseudoName, "\"."));
isPseudoElement =
pseudoElementsEnabled &&
(isDoubleColon ||
(!isDoubleColon &&
pseudoElementsSingleColonNotationEnabled &&
Object.prototype.hasOwnProperty.call(pseudoElementsDefinitions, pseudoName)));
if (isPseudoElement) {
var signature = (_a = pseudoElementsDefinitions[pseudoName]) !== null && _a !== void 0 ? _a : (pseudoElementsAcceptUnknown && defaultPseudoSignature);
var pseudoElement = {
type: 'PseudoElement',
name: pseudoName
};
var argument = parsePseudoArgument(pseudoName, 'pseudo-element', signature);
if (argument) {
assert(argument.type !== 'Formula' && argument.type !== 'FormulaOfSelector', 'Pseudo-elements cannot have formula argument.');
pseudoElement.argument = argument;
}
rule.items.push(pseudoElement);
}
else {
assert(pseudoClassesEnabled, 'Pseudo-classes are not enabled.');
var signature = (_b = pseudoClassesDefinitions[pseudoName]) !== null && _b !== void 0 ? _b : (pseudoClassesAcceptUnknown && defaultPseudoSignature);
assert(signature, "Unknown pseudo-class: \"".concat(pseudoName, "\"."));
var argument = parsePseudoArgument(pseudoName, 'pseudo-class', signature);
var pseudoClass = {
type: 'PseudoClass',
name: pseudoName
};
if (argument) {
pseudoClass.argument = argument;
}
rule.items.push(pseudoClass);
}
}
else {
break;
}
}
if (rule.items.length === 0) {
if (isEof()) {
return fail('Expected rule but end of input reached.');
}
else {
return fail("Expected rule but \"".concat(chr, "\" found."));
}
}
skipWhitespace();
if (!isEof() && !is(',') && !is(')')) {
var combinator = matchMulticharIndex(combinatorsIndex);
skipWhitespace();
rule.nestedRule = parseRule();
rule.nestedRule.combinator = combinator;
}
return rule;
}
return function (input) {
// noinspection SuspiciousTypeOfGuard
if (typeof input !== 'string') {
throw new Error("".concat(errorPrefix, "Expected string input."));
}
str = input;
l = str.length;
pos = 0;
chr = str.charAt(0);
return parseSelector();
};
}

View File

@@ -0,0 +1,25 @@
import { PseudoClassType } from './syntax-definitions.js';
export type PseudoSignature = {
optional: boolean;
} & ({
type: 'Formula';
ofSelector?: boolean;
} | {
type: 'String';
} | {
type: 'Selector';
} | {
type: 'NoArgument';
});
export type PseudoSignatures = Record<string, PseudoSignature>;
export declare const emptyPseudoSignatures: PseudoSignatures;
export declare const defaultPseudoSignature: PseudoSignature;
type PseudoArgumentType = PseudoClassType;
export type CategoriesIndex<T1 extends string, T2 extends string> = {
[K in T1]?: T2[];
};
export declare function inverseCategories<T1 extends string, T2 extends string>(obj: CategoriesIndex<T1, T2>): CategoriesIndex<T2, T1>;
export declare function calculatePseudoSignatures<T extends PseudoArgumentType>(definitions: {
[K in T]?: string[];
}): PseudoSignatures;
export {};

View File

@@ -0,0 +1,63 @@
export var emptyPseudoSignatures = {};
export var defaultPseudoSignature = {
type: 'String',
optional: true
};
function calculatePseudoSignature(types) {
var result = {
type: 'NoArgument',
optional: false
};
function setResultType(type) {
if (result.type && result.type !== type && result.type !== 'NoArgument') {
throw new Error("Conflicting pseudo-class argument type: \"".concat(result.type, "\" vs \"").concat(type, "\"."));
}
result.type = type;
}
for (var _i = 0, types_1 = types; _i < types_1.length; _i++) {
var type = types_1[_i];
if (type === 'NoArgument') {
result.optional = true;
}
if (type === 'Formula') {
setResultType('Formula');
}
if (type === 'FormulaOfSelector') {
setResultType('Formula');
result.ofSelector = true;
}
if (type === 'String') {
setResultType('String');
}
if (type === 'Selector') {
setResultType('Selector');
}
}
return result;
}
export function inverseCategories(obj) {
var result = {};
for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) {
var category = _a[_i];
var items = obj[category];
if (items) {
for (var _b = 0, _c = items; _b < _c.length; _b++) {
var item = _c[_b];
(result[item] || (result[item] = [])).push(category);
}
}
}
return result;
}
export function calculatePseudoSignatures(definitions) {
var pseudoClassesToArgumentTypes = inverseCategories(definitions);
var result = {};
for (var _i = 0, _a = Object.keys(pseudoClassesToArgumentTypes); _i < _a.length; _i++) {
var pseudoClass = _a[_i];
var argumentTypes = pseudoClassesToArgumentTypes[pseudoClass];
if (argumentTypes) {
result[pseudoClass] = calculatePseudoSignature(argumentTypes);
}
}
return result;
}

25
node_modules/css-selector-parser/dist/mjs/render.d.ts generated vendored Normal file
View File

@@ -0,0 +1,25 @@
import { AstEntity } from './ast.js';
/**
* Renders CSS Selector AST back to a string.
*
* @example
*
* import {ast, render} from 'css-selector-parser';
*
* const selector = ast.selector({
* rules: [
* ast.rule({
* items: [
* ast.tagName({name: 'a'}),
* ast.id({name: 'user-23'}),
* ast.className({name: 'user'}),
* ast.pseudoClass({name: 'visited'}),
* ast.pseudoElement({name: 'before'})
* ]
* })
* ]
* });
*
* console.log(render(selector)); // a#user-23.user:visited::before
*/
export declare function render(entity: AstEntity): string;

146
node_modules/css-selector-parser/dist/mjs/render.js generated vendored Normal file
View File

@@ -0,0 +1,146 @@
import { escapeIdentifier, escapeString } from './utils.js';
var errorPrefix = "css-selector-parser render error: ";
function renderNamespace(namespace) {
if (namespace.type === 'WildcardNamespace') {
return '*|';
}
else if (namespace.type === 'NamespaceName') {
return "".concat(escapeIdentifier(namespace.name), "|");
}
else if (namespace.type === 'NoNamespace') {
return '|';
}
throw new Error("".concat(errorPrefix, "Unknown namespace type: ").concat(namespace.type, "."));
}
function renderSubstitution(sub) {
return "$".concat(escapeIdentifier(sub.name));
}
function renderFormula(a, b) {
if (a) {
var result = "".concat(a === 1 ? '' : a === -1 ? '-' : a, "n");
if (b) {
result += "".concat(b > 0 ? '+' : '').concat(b);
}
return result;
}
else {
return String(b);
}
}
/**
* Renders CSS Selector AST back to a string.
*
* @example
*
* import {ast, render} from 'css-selector-parser';
*
* const selector = ast.selector({
* rules: [
* ast.rule({
* items: [
* ast.tagName({name: 'a'}),
* ast.id({name: 'user-23'}),
* ast.className({name: 'user'}),
* ast.pseudoClass({name: 'visited'}),
* ast.pseudoElement({name: 'before'})
* ]
* })
* ]
* });
*
* console.log(render(selector)); // a#user-23.user:visited::before
*/
export function render(entity) {
if (entity.type === 'Selector') {
return entity.rules.map(render).join(', ');
}
if (entity.type === 'Rule') {
var result = '';
var items = entity.items, combinator = entity.combinator, nestedRule = entity.nestedRule;
if (combinator) {
result += "".concat(combinator, " ");
}
for (var _i = 0, items_1 = items; _i < items_1.length; _i++) {
var item = items_1[_i];
result += render(item);
}
if (nestedRule) {
result += " ".concat(render(nestedRule));
}
return result;
}
else if (entity.type === 'TagName' || entity.type === 'WildcardTag') {
var result = '';
var namespace = entity.namespace;
if (namespace) {
result += renderNamespace(namespace);
}
if (entity.type === 'TagName') {
result += escapeIdentifier(entity.name);
}
else if (entity.type === 'WildcardTag') {
result += '*';
}
return result;
}
else if (entity.type === 'Id') {
return "#".concat(escapeIdentifier(entity.name));
}
else if (entity.type === 'ClassName') {
return ".".concat(escapeIdentifier(entity.name));
}
else if (entity.type === 'Attribute') {
var name_1 = entity.name, namespace = entity.namespace, operator = entity.operator, value = entity.value, caseSensitivityModifier = entity.caseSensitivityModifier;
var result = '[';
if (namespace) {
result += renderNamespace(namespace);
}
result += escapeIdentifier(name_1);
if (operator && value) {
result += operator;
if (value.type === 'String') {
result += escapeString(value.value);
}
else if (value.type === 'Substitution') {
result += renderSubstitution(value);
}
else {
throw new Error("Unknown attribute value type: ".concat(value.type, "."));
}
if (caseSensitivityModifier) {
result += " ".concat(escapeIdentifier(caseSensitivityModifier));
}
}
result += ']';
return result;
}
else if (entity.type === 'PseudoClass') {
var name_2 = entity.name, argument = entity.argument;
var result = ":".concat(escapeIdentifier(name_2));
if (argument) {
result += "(".concat(argument.type === 'String' ? escapeIdentifier(argument.value) : render(argument), ")");
}
return result;
}
else if (entity.type === 'PseudoElement') {
var name_3 = entity.name, argument = entity.argument;
var result = "::".concat(escapeIdentifier(name_3));
if (argument) {
result += "(".concat(argument.type === 'String' ? escapeIdentifier(argument.value) : render(argument), ")");
}
return result;
}
else if (entity.type === 'String') {
throw new Error("".concat(errorPrefix, "String cannot be rendered outside of context."));
}
else if (entity.type === 'Formula') {
return renderFormula(entity.a, entity.b);
}
else if (entity.type === 'FormulaOfSelector') {
return renderFormula(entity.a, entity.b) + ' of ' + render(entity.selector);
}
else if (entity.type === 'Substitution') {
return "$".concat(escapeIdentifier(entity.name));
}
throw new Error("Unknown type specified to render method: ".concat(entity.type, "."));
}

View File

@@ -0,0 +1,134 @@
import { AstPseudoClassArgument, AstPseudoElementArgument } from './ast.js';
export type PseudoClassType = Exclude<'NoArgument' | AstPseudoClassArgument['type'], 'Substitution'>;
export type PseudoElementType = Exclude<'NoArgument' | AstPseudoElementArgument['type'], 'Substitution'>;
export type CssLevel = 'css1' | 'css2' | 'css3' | 'selectors-3' | 'selectors-4' | 'latest' | 'progressive';
/**
* CSS Selector Syntax Definition can be used to define custom CSS selector parsing rules.
*/
export interface SyntaxDefinition {
/**
* When specified, syntax will be based on the specified predefined CSS standard.
* If not specified, syntax will be defined from scratch.
*/
baseSyntax?: CssLevel;
/**
* CSS Tag (type).
* @example div
* @see https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors/Type_Class_and_ID_Selectors
*/
tag?: {
/**
* Allows using wildcard (*).
*/
wildcard?: boolean;
} | boolean;
/**
* CSS3 Namespaces.
* @example ns|div
* @see https://www.w3.org/TR/css3-namespace/
*/
namespace?: {
/**
* Allows using wildcard (*).
*/
wildcard?: boolean;
} | boolean;
/**
* CSS IDs (yes, there can be multiple).
* @example #root#root
* @see https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors/Type_Class_and_ID_Selectors
*/
ids?: boolean;
/**
* CSS Class Names
* @example .element.highlighted
* @see https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors/Type_Class_and_ID_Selectors
*/
classNames?: boolean;
/**
* CSS selector rule nesting combinators.
* @example div.class > span
* @see https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors/Combinators
*/
combinators?: string[];
/**
* CSS Attribute Selector.
* @example [href="#"]
* @see https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors/Attribute_selectors
*/
attributes?: {
/**
* Attribute comparison operator list.
* @example ['=', '~=', '|=', '^=', '$=', '*=']
* @see https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors#syntax
*/
operators?: string[];
/**
* How to handle unknown case sensitivity modifiers.
* `accept` - still parse.
* `reject` - throw an error.
*/
unknownCaseSensitivityModifiers?: 'accept' | 'reject';
/**
* List of pre-defined case sensitivity modifiers.
* @example ['i', 'I', 's', 'S']
* @see https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors#syntax
*/
caseSensitivityModifiers?: string[];
} | false;
/**
* CSS Pseudo-elements.
* @example ::before
* @see https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors/Pseudo-classes_and_pseudo-elements
*/
pseudoElements?: {
/**
* How to handle unknown pseudo-elements.
* `accept` - still parse.
* `reject` - throw an error.
*/
unknown?: 'accept' | 'reject';
/**
* In the past pseudo selements were defined starting with a single colon.
* Later this notation changed to double colon.
*/
notation?: 'singleColon' | 'doubleColon' | 'both';
/**
* List of predefined pseudo-elements. If string array is specified, the pseudo-elements are assumed to be
* NoArgument.
* @example ['before', 'after']
* @example {NoArgument: ['before', 'after'], String: ['highlight'], Selector: ['slotted']}
*/
definitions?: string[] | {
[K in PseudoElementType]?: string[];
};
} | false;
/**
* CSS Pseudo-classes.
* @example :nth-child(2n+1)
* @see https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors/Pseudo-classes_and_pseudo-elements
*/
pseudoClasses?: {
/**
* How to handle unknown pseudo-classes.
* `accept` - still parse.
* `reject` - throw an error.
*/
unknown?: 'accept' | 'reject';
/**
* Predefined pseudo-classes.
* @example {NoArgument: ['first-child'], Formula: ['nth-child'], String: ['dir'], Selector: ['not']}
*/
definitions?: {
[K in PseudoClassType]?: string[];
};
} | false;
}
interface SyntaxDefinitionXmlOptions {
wildcard?: boolean;
}
export declare function getXmlOptions(param: SyntaxDefinitionXmlOptions | boolean | undefined): SyntaxDefinitionXmlOptions;
type MergeMethod<T> = (base: T, extension: T) => T;
export declare const extendSyntaxDefinition: MergeMethod<SyntaxDefinition>;
export declare const cssSyntaxDefinitions: Record<CssLevel, SyntaxDefinition>;
export {};

View File

@@ -0,0 +1,251 @@
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var emptyXmlOptions = {};
var defaultXmlOptions = { wildcard: true };
export function getXmlOptions(param) {
if (param) {
if (typeof param === 'boolean') {
return defaultXmlOptions;
}
else {
return param;
}
}
else {
return emptyXmlOptions;
}
}
function withMigration(migration, merge) {
return function (base, extension) { return merge(migration(base), migration(extension)); };
}
function withNoNegative(merge) {
return function (base, extension) {
var result = merge(base, extension);
if (!result) {
throw new Error("Syntax definition cannot be null or undefined.");
}
return result;
};
}
function withPositive(positive, merge) {
return function (base, extension) {
if (extension === true) {
return positive;
}
return merge(base === true ? positive : base, extension);
};
}
function mergeSection(values) {
return function (base, extension) {
if (!extension || !base) {
return extension;
}
if (typeof extension !== 'object' || extension === null) {
throw new Error("Unexpected syntax definition extension type: ".concat(extension, "."));
}
var result = __assign({}, base);
for (var _i = 0, _a = Object.entries(extension); _i < _a.length; _i++) {
var _b = _a[_i], key = _b[0], value = _b[1];
var mergeSchema = values[key];
result[key] = mergeSchema(base[key], value);
}
return result;
};
}
function replaceValueIfSpecified(base, extension) {
if (extension !== undefined) {
return extension;
}
return base;
}
function concatArray(base, extension) {
if (!extension) {
return base;
}
if (!base) {
return extension;
}
return base.concat(extension);
}
function mergeDefinitions(base, extension) {
if (!extension) {
return base;
}
if (!base) {
return extension;
}
var result = __assign({}, base);
for (var _i = 0, _a = Object.entries(extension); _i < _a.length; _i++) {
var _b = _a[_i], key = _b[0], value = _b[1];
if (!value) {
delete result[key];
continue;
}
var baseValue = base[key];
if (!baseValue) {
result[key] = value;
continue;
}
result[key] = baseValue.concat(value);
}
return result;
}
export var extendSyntaxDefinition = withNoNegative(mergeSection({
baseSyntax: replaceValueIfSpecified,
tag: withPositive(defaultXmlOptions, mergeSection({
wildcard: replaceValueIfSpecified
})),
ids: replaceValueIfSpecified,
classNames: replaceValueIfSpecified,
namespace: withPositive(defaultXmlOptions, mergeSection({
wildcard: replaceValueIfSpecified
})),
combinators: concatArray,
attributes: mergeSection({
operators: concatArray,
caseSensitivityModifiers: concatArray,
unknownCaseSensitivityModifiers: replaceValueIfSpecified
}),
pseudoClasses: mergeSection({
unknown: replaceValueIfSpecified,
definitions: mergeDefinitions
}),
pseudoElements: mergeSection({
unknown: replaceValueIfSpecified,
notation: replaceValueIfSpecified,
definitions: withMigration(function (definitions) { return (Array.isArray(definitions) ? { NoArgument: definitions } : definitions); }, mergeDefinitions)
})
}));
var css1SyntaxDefinition = {
tag: {},
ids: true,
classNames: true,
combinators: [],
pseudoElements: {
unknown: 'reject',
notation: 'singleColon',
definitions: ['first-letter', 'first-line']
},
pseudoClasses: {
unknown: 'reject',
definitions: {
NoArgument: ['link', 'visited', 'active']
}
}
};
var css2SyntaxDefinition = extendSyntaxDefinition(css1SyntaxDefinition, {
tag: { wildcard: true },
combinators: ['>', '+'],
attributes: {
unknownCaseSensitivityModifiers: 'reject',
operators: ['=', '~=', '|=']
},
pseudoElements: {
definitions: ['before', 'after']
},
pseudoClasses: {
unknown: 'reject',
definitions: {
NoArgument: ['hover', 'focus', 'first-child'],
String: ['lang']
}
}
});
var selectors3SyntaxDefinition = extendSyntaxDefinition(css2SyntaxDefinition, {
namespace: {
wildcard: true
},
combinators: ['~'],
attributes: {
operators: ['^=', '$=', '*=']
},
pseudoElements: {
notation: 'both'
},
pseudoClasses: {
definitions: {
NoArgument: [
'root',
'last-child',
'first-of-type',
'last-of-type',
'only-child',
'only-of-type',
'empty',
'target',
'enabled',
'disabled',
'checked',
'indeterminate'
],
Formula: ['nth-child', 'nth-last-child', 'nth-of-type', 'nth-last-of-type'],
Selector: ['not']
}
}
});
var selectors4SyntaxDefinition = extendSyntaxDefinition(selectors3SyntaxDefinition, {
combinators: ['||'],
attributes: {
caseSensitivityModifiers: ['i', 'I', 's', 'S']
},
pseudoClasses: {
definitions: {
NoArgument: [
'any-link',
'local-link',
'target-within',
'scope',
'current',
'past',
'future',
'focus-within',
'focus-visible',
'read-write',
'read-only',
'placeholder-shown',
'default',
'valid',
'invalid',
'in-range',
'out-of-range',
'required',
'optional',
'blank',
'user-invalid'
],
Formula: ['nth-col', 'nth-last-col'],
String: ['dir'],
FormulaOfSelector: ['nth-child', 'nth-last-child'],
Selector: ['current', 'is', 'where', 'has']
}
}
});
var progressiveSyntaxDefinition = extendSyntaxDefinition(selectors4SyntaxDefinition, {
pseudoElements: {
unknown: 'accept'
},
pseudoClasses: {
unknown: 'accept'
},
attributes: {
unknownCaseSensitivityModifiers: 'accept'
}
});
export var cssSyntaxDefinitions = {
css1: css1SyntaxDefinition,
css2: css2SyntaxDefinition,
css3: selectors3SyntaxDefinition,
'selectors-3': selectors3SyntaxDefinition,
'selectors-4': selectors4SyntaxDefinition,
latest: selectors4SyntaxDefinition,
progressive: progressiveSyntaxDefinition
};

11
node_modules/css-selector-parser/dist/mjs/utils.d.ts generated vendored Normal file
View File

@@ -0,0 +1,11 @@
export declare function isIdentStart(c: string): boolean;
export declare function isIdent(c: string): boolean;
export declare function isHex(c: string): boolean;
export declare const identEscapeChars: Record<string, boolean>;
export declare const stringRenderEscapeChars: Record<string, boolean>;
export declare const whitespaceChars: Record<string, boolean>;
export declare const quoteChars: Record<string, boolean>;
export declare const digitsChars: Record<string, boolean>;
export declare const maxHexLength = 6;
export declare function escapeIdentifier(s: string): string;
export declare function escapeString(s: string): string;

129
node_modules/css-selector-parser/dist/mjs/utils.js generated vendored Normal file
View File

@@ -0,0 +1,129 @@
export function isIdentStart(c) {
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c === '-' || c === '_' || c === '\\' || c >= '\u00a0';
}
export function isIdent(c) {
return ((c >= 'a' && c <= 'z') ||
(c >= 'A' && c <= 'Z') ||
(c >= '0' && c <= '9') ||
c === '-' ||
c === '_' ||
c >= '\u00a0');
}
export function isHex(c) {
return (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F') || (c >= '0' && c <= '9');
}
export var identEscapeChars = {
'!': true,
'"': true,
'#': true,
$: true,
'%': true,
'&': true,
"'": true,
'(': true,
')': true,
'*': true,
'+': true,
',': true,
'.': true,
'/': true,
';': true,
'<': true,
'=': true,
'>': true,
'?': true,
'@': true,
'[': true,
'\\': true,
']': true,
'^': true,
'`': true,
'{': true,
'|': true,
'}': true,
'~': true
};
export var stringRenderEscapeChars = {
'\n': true,
'\r': true,
'\t': true,
'\f': true,
'\v': true
};
export var whitespaceChars = {
' ': true,
'\t': true,
'\n': true,
'\r': true,
'\f': true
};
export var quoteChars = {
'"': true,
"'": true
};
export var digitsChars = {
0: true,
1: true,
2: true,
3: true,
4: true,
5: true,
6: true,
7: true,
8: true,
9: true
};
export var maxHexLength = 6;
export function escapeIdentifier(s) {
var len = s.length;
var result = '';
var i = 0;
while (i < len) {
var chr = s.charAt(i);
if (identEscapeChars[chr] || (chr === '-' && i === 1 && s.charAt(0) === '-')) {
result += '\\' + chr;
}
else {
if (chr === '-' ||
chr === '_' ||
(chr >= 'A' && chr <= 'Z') ||
(chr >= 'a' && chr <= 'z') ||
(chr >= '0' && chr <= '9' && i !== 0 && !(i === 1 && s.charAt(0) === '-'))) {
result += chr;
}
else {
var charCode = chr.charCodeAt(0);
if ((charCode & 0xf800) === 0xd800) {
var extraCharCode = s.charCodeAt(i++);
if ((charCode & 0xfc00) !== 0xd800 || (extraCharCode & 0xfc00) !== 0xdc00) {
throw Error('UCS-2(decode): illegal sequence');
}
charCode = ((charCode & 0x3ff) << 10) + (extraCharCode & 0x3ff) + 0x10000;
}
result += '\\' + charCode.toString(16) + ' ';
}
}
i++;
}
return result.trim();
}
export function escapeString(s) {
var len = s.length;
var result = '';
var i = 0;
while (i < len) {
var chr = s.charAt(i);
if (chr === '"') {
chr = '\\"';
}
else if (chr === '\\') {
chr = '\\\\';
}
else if (stringRenderEscapeChars[chr]) {
chr = '\\' + chr.charCodeAt(0).toString(16) + (i === len - 1 ? '' : ' ');
}
result += chr;
i++;
}
return "\"".concat(result, "\"");
}