diff --git a/CHANGELOG.md b/CHANGELOG.md index b9b16393..d2422a7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## v1.4.2 + +- [x] fix bug when using remove prefix #120 + ## v1.4.0 ### CSS Module support diff --git a/README.md b/README.md index e23b56d5..2502cea2 100644 --- a/README.md +++ b/README.md @@ -365,6 +365,45 @@ console.debug(render(result.ast.chi[0].chi[1].chi[1], {withParents: true})); ``` +### CSS Modules + +CSS modules features are fully supported. refer to the [CSS modules](https://tbela99.github.io/css-parser/docs/documents/Guide.CSS_modules.html) documentation for more information. + +```javascript +import {transform} from '@tbela99/css-parser'; + +const css = ` +.table { + border-collapse: collapse; + width: 100%; +} + +.table td, .table th { + border: 1px solid #ddd; + padding: 8px; +} + +.table tr:nth-child(even){background-color: #f2f2f2;} + +.table tr:hover {background-color: #ddd;} + +.table th { + padding-top: 12px; + padding-bottom: 12px; + text-align: left; + background-color: #4CAF50; + color: white; +} +`; + +const result = await transform(css, {module: true}); + +// css code +console.log(result.code); +// css mapping +console.log(result.mapping); +``` + ### Convert colors ```javascript diff --git a/dist/index-umd-web.js b/dist/index-umd-web.js index d66514c3..4f505332 100644 --- a/dist/index-umd-web.js +++ b/dist/index-umd-web.js @@ -23205,6 +23205,7 @@ const combinators = ['+', '>', '~', '||', '|']; const definedPropertySettings = { configurable: true, enumerable: false, writable: true }; const notEndingWith = ['(', '['].concat(combinators); + const rules = [exports.EnumToken.AtRuleNodeType, exports.EnumToken.RuleNodeType, exports.EnumToken.AtRuleTokenType, exports.EnumToken.KeyFramesRuleNodeType]; // @ts-ignore const features = Object.values(allFeatures).sort((a, b) => a.ordering - b.ordering); /** @@ -23256,6 +23257,9 @@ if ((feature.processMode & exports.FeatureWalkMode.Pre) === 0 || (feature.accept != null && !feature.accept.has(parent.typ))) { continue; } + if (rules.includes(replacement.typ) && !Array.isArray(replacement.tokens)) { + Object.defineProperty(replacement, 'tokens', { ...definedPropertySettings, value: parseString(replacement.typ == exports.EnumToken.RuleNodeType || replacement.typ == exports.EnumToken.KeyFramesRuleNodeType ? replacement.sel : replacement.val) }); + } const result = feature.run(replacement, options, parent.parent ?? ast, context, exports.FeatureWalkMode.Pre); if (result != null) { replacement = result; @@ -24636,14 +24640,18 @@ })(exports.ResponseType || (exports.ResponseType = {})); /** - * default file or url loader + * load file or url * @param url - * @param currentFile - * + * @param currentDirectory * @param responseType - * @private + * @throws Error file not found + * + * ```ts + * import {load, ResponseType} from '@tbela99/css-parser'; + * const result = await load(file, '.', ResponseType.ArrayBuffer) as ArrayBuffer; + * ``` */ - async function load(url, currentFile = '.', responseType = false) { + async function load(url, currentDirectory = '.', responseType = false) { if (typeof responseType == 'boolean') { responseType = responseType ? exports.ResponseType.ReadableStream : exports.ResponseType.Text; } @@ -24651,11 +24659,11 @@ if (matchUrl.test(url)) { t = new URL(url); } - else if (currentFile != null && matchUrl.test(currentFile)) { - t = new URL(url, currentFile); + else if (currentDirectory != null && matchUrl.test(currentDirectory)) { + t = new URL(url, currentDirectory); } else { - const path = resolve(url, currentFile).absolute; + const path = resolve(url, currentDirectory).absolute; t = new URL(path, self.origin); } return fetch(t, t.origin != self.origin ? { mode: 'cors' } : {}).then(async (response) => { @@ -24665,7 +24673,7 @@ if (responseType == exports.ResponseType.ArrayBuffer) { return response.arrayBuffer(); } - return responseType == exports.ResponseType.ReadableStream ? response.body : await response.text(); + return responseType == exports.ResponseType.ReadableStream ? response.body : response.text(); }); } /** diff --git a/dist/index.cjs b/dist/index.cjs index 3fbc623f..b500e88a 100644 --- a/dist/index.cjs +++ b/dist/index.cjs @@ -23391,6 +23391,7 @@ var allFeatures = /*#__PURE__*/Object.freeze({ const combinators = ['+', '>', '~', '||', '|']; const definedPropertySettings = { configurable: true, enumerable: false, writable: true }; const notEndingWith = ['(', '['].concat(combinators); +const rules = [exports.EnumToken.AtRuleNodeType, exports.EnumToken.RuleNodeType, exports.EnumToken.AtRuleTokenType, exports.EnumToken.KeyFramesRuleNodeType]; // @ts-ignore const features = Object.values(allFeatures).sort((a, b) => a.ordering - b.ordering); /** @@ -23442,6 +23443,9 @@ function minify(ast, options = {}, recursive = false, errors, nestingContent, co if ((feature.processMode & exports.FeatureWalkMode.Pre) === 0 || (feature.accept != null && !feature.accept.has(parent.typ))) { continue; } + if (rules.includes(replacement.typ) && !Array.isArray(replacement.tokens)) { + Object.defineProperty(replacement, 'tokens', { ...definedPropertySettings, value: parseString(replacement.typ == exports.EnumToken.RuleNodeType || replacement.typ == exports.EnumToken.KeyFramesRuleNodeType ? replacement.sel : replacement.val) }); + } const result = feature.run(replacement, options, parent.parent ?? ast, context, exports.FeatureWalkMode.Pre); if (result != null) { replacement = result; @@ -24637,16 +24641,19 @@ function replaceCompoundLiteral(selector, replace) { } /** - * load file or url as stream + * load file or url * @param url - * @param currentFile + * @param currentDirectory * @param responseType * @throws Error file not found * - * @private + * ```ts + * import {load, ResponseType} from '@tbela99/css-parser'; + * const result = await load(file, '.', ResponseType.ArrayBuffer) as ArrayBuffer; + * ``` */ -async function load(url, currentFile = '.', responseType = false) { - const resolved = resolve(url, currentFile); +async function load(url, currentDirectory = '.', responseType = false) { + const resolved = resolve(url, currentDirectory); if (typeof responseType == 'boolean') { responseType = responseType ? exports.ResponseType.ReadableStream : exports.ResponseType.Text; } @@ -24658,18 +24665,18 @@ async function load(url, currentFile = '.', responseType = false) { if (responseType == exports.ResponseType.ArrayBuffer) { return response.arrayBuffer(); } - return responseType == exports.ResponseType.ReadableStream ? response.body : await response.text(); + return responseType == exports.ResponseType.ReadableStream ? response.body : response.text(); }); } try { - if (responseType == exports.ResponseType.Text) { - return promises.readFile(resolved.absolute, 'utf-8'); - } - if (responseType == exports.ResponseType.ArrayBuffer) { - return promises.readFile(resolved.absolute).then(buffer => buffer.buffer); - } const stats = await promises.lstat(resolved.absolute); if (stats.isFile()) { + if (responseType == exports.ResponseType.Text) { + return promises.readFile(resolved.absolute, 'utf-8'); + } + if (responseType == exports.ResponseType.ArrayBuffer) { + return promises.readFile(resolved.absolute).then(buffer => buffer.buffer); + } return node_stream.Readable.toWeb(node_fs.createReadStream(resolved.absolute, { encoding: 'utf-8', highWaterMark: 64 * 1024 diff --git a/dist/index.d.ts b/dist/index.d.ts index a718524f..c4251084 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -3521,11 +3521,11 @@ export declare interface ParserOptions extends MinifyOptions, MinifyFeatureOptio /** * url and file loader * @param url - * @param currentUrl - * @param asStream + * @param currentDirectory + * @param responseType * */ - load?: (url: string, currentUrl?: string, asStream?: boolean) => LoadResult; + load?: (url: string, currentDirectory: string, responseType?: boolean | ResponseType) => Promise>>; /** * get directory name * @param path @@ -4027,7 +4027,7 @@ declare function resolve(url: string, currentDirectory: string, cwd?: string): { /** * response type */ -declare enum ResponseType { +declare enum ResponseType$1 { /** * return text */ @@ -4043,15 +4043,18 @@ declare enum ResponseType { } /** - * load file or url as stream + * load file or url * @param url - * @param currentFile + * @param currentDirectory * @param responseType * @throws Error file not found * - * @private + * ```ts + * import {load, ResponseType} from '@tbela99/css-parser'; + * const result = await load(file, '.', ResponseType.ArrayBuffer) as ArrayBuffer; + * ``` */ -declare function load(url: string, currentFile?: string, responseType?: boolean | ResponseType): Promise>>; +declare function load(url: string, currentDirectory?: string, responseType?: boolean | ResponseType$1): Promise>>; /** * render the ast tree * @param data @@ -4222,5 +4225,5 @@ declare function transformFile(file: string, options?: TransformOptions, asStrea */ declare function transform(css: string | ReadableStream, options?: TransformOptions): Promise; -export { ColorType, EnumToken, FeatureWalkMode, ModuleCaseTransformEnum, ModuleScopeEnumOptions, ResponseType, SourceMap, ValidationLevel, WalkerEvent, WalkerOptionEnum, convertColor, dirname, expand, isOkLabClose, load, mathFuncs, minify, okLabDistance, parse, parseDeclarations, parseFile, parseString, parseTokens, render, renderToken, resolve, transform, transformFile, transformFunctions, walk, walkValues }; +export { ColorType, EnumToken, FeatureWalkMode, ModuleCaseTransformEnum, ModuleScopeEnumOptions, ResponseType$1 as ResponseType, SourceMap, ValidationLevel, WalkerEvent, WalkerOptionEnum, convertColor, dirname, expand, isOkLabClose, load, mathFuncs, minify, okLabDistance, parse, parseDeclarations, parseFile, parseString, parseTokens, render, renderToken, resolve, transform, transformFile, transformFunctions, walk, walkValues }; export type { AddToken, AngleToken, AstAtRule, AstComment, AstDeclaration, AstInvalidAtRule, AstInvalidDeclaration, AstInvalidRule, AstKeyFrameRule, AstKeyframesAtRule, AstKeyframesRule, AstNode$1 as AstNode, AstRule, AstRuleList, AstStyleSheet, AtRuleToken, AtRuleVisitorHandler, AttrEndToken, AttrStartToken, AttrToken, Background, BackgroundAttachmentMapping, BackgroundPosition, BackgroundPositionClass, BackgroundPositionConstraints, BackgroundPositionMapping, BackgroundProperties, BackgroundRepeat, BackgroundRepeatMapping, BackgroundSize, BackgroundSizeMapping, BadCDOCommentToken, BadCommentToken, BadStringToken, BadUrlToken, BaseToken, BinaryExpressionNode, BinaryExpressionToken, BlockEndToken, BlockStartToken, Border, BorderColor, BorderColorClass, BorderProperties, BorderRadius, CDOCommentToken, ChildCombinatorToken, ClassSelectorToken, ColonToken, ColorToken, ColumnCombinatorToken, CommaToken, CommentToken, ComposesSelectorToken, ConstraintsMapping, ContainMatchToken, Context, CssVariableImportTokenType$1 as CssVariableImportTokenType, CssVariableMapTokenType, CssVariableToken$1 as CssVariableToken, DashMatchToken, DashedIdentToken, DeclarationVisitorHandler, DelimToken, DescendantCombinatorToken, DimensionToken, DivToken, EOFToken, EndMatchToken, EqualMatchToken, ErrorDescription, FlexToken, Font, FontFamily, FontProperties, FontWeight, FontWeightConstraints, FontWeightMapping, FractionToken, FrequencyToken, FunctionImageToken, FunctionToken, FunctionURLToken, GenericVisitorAstNodeHandlerMap, GenericVisitorHandler, GenericVisitorResult, GreaterThanOrEqualToken, GreaterThanToken, GridTemplateFuncToken, HashToken, IdentListToken, IdentToken, ImportantToken, IncludeMatchToken, InvalidAttrToken, InvalidClassSelectorToken, LengthToken, LessThanOrEqualToken, LessThanToken, LineHeight, ListToken, LiteralToken, LoadResult, Location, Map$1 as Map, MatchExpressionToken, MatchedSelector, MediaFeatureAndToken, MediaFeatureNotToken, MediaFeatureOnlyToken, MediaFeatureOrToken, MediaFeatureToken, MediaQueryConditionToken, MinifyFeature, MinifyFeatureOptions, MinifyOptions, ModuleOptions, MulToken, NameSpaceAttributeToken, NestingSelectorToken, NextSiblingCombinatorToken, NumberToken, OptimizedSelector, OptimizedSelectorToken, Outline, OutlineProperties, ParensEndToken, ParensStartToken, ParensToken, ParseInfo, ParseResult, ParseResultStats, ParseTokenOptions, ParserOptions, PercentageToken, Position, Prefix, PropertiesConfig, PropertiesConfigProperties, PropertyListOptions, PropertyMapType, PropertySetType, PropertyType, PseudoClassFunctionToken, PseudoClassToken, PseudoElementToken, PseudoPageToken, PurpleBackgroundAttachment, RawSelectorTokens, RenderOptions, RenderResult, ResolutionToken, ResolvedPath, RuleVisitorHandler, SemiColonToken, Separator, ShorthandDef, ShorthandMapType, ShorthandProperties, ShorthandPropertyType, ShorthandType, SourceMapObject, StartMatchToken, StringToken, SubToken, SubsequentCombinatorToken, TimeToken, TimelineFunctionToken, TimingFunctionToken, Token$1 as Token, TokenizeResult, TransformOptions, TransformResult, UnaryExpression, UnaryExpressionNode, UnclosedStringToken, UniversalSelectorToken, UrlToken, ValidationConfiguration, ValidationOptions, ValidationResult, ValidationSelectorOptions, ValidationSyntaxNode, ValidationSyntaxResult, Value, ValueVisitorHandler, VariableScopeInfo, VisitorNodeMap, WalkAttributesResult, WalkResult, WalkerFilter, WalkerOption, WalkerValueFilter, WhitespaceToken }; diff --git a/dist/lib/ast/minify.js b/dist/lib/ast/minify.js index 2ffd07a1..4b65d342 100644 --- a/dist/lib/ast/minify.js +++ b/dist/lib/ast/minify.js @@ -1,4 +1,4 @@ -import { replaceToken, parseString } from '../parser/parse.js'; +import { parseString, replaceToken } from '../parser/parse.js'; import '../parser/tokenize.js'; import '../parser/utils/config.js'; import { EnumToken } from './types.js'; @@ -13,6 +13,7 @@ import { FeatureWalkMode } from './features/type.js'; const combinators = ['+', '>', '~', '||', '|']; const definedPropertySettings = { configurable: true, enumerable: false, writable: true }; const notEndingWith = ['(', '['].concat(combinators); +const rules = [EnumToken.AtRuleNodeType, EnumToken.RuleNodeType, EnumToken.AtRuleTokenType, EnumToken.KeyFramesRuleNodeType]; // @ts-ignore const features = Object.values(index).sort((a, b) => a.ordering - b.ordering); /** @@ -64,6 +65,9 @@ function minify(ast, options = {}, recursive = false, errors, nestingContent, co if ((feature.processMode & FeatureWalkMode.Pre) === 0 || (feature.accept != null && !feature.accept.has(parent.typ))) { continue; } + if (rules.includes(replacement.typ) && !Array.isArray(replacement.tokens)) { + Object.defineProperty(replacement, 'tokens', { ...definedPropertySettings, value: parseString(replacement.typ == EnumToken.RuleNodeType || replacement.typ == EnumToken.KeyFramesRuleNodeType ? replacement.sel : replacement.val) }); + } const result = feature.run(replacement, options, parent.parent ?? ast, context, FeatureWalkMode.Pre); if (result != null) { replacement = result; diff --git a/dist/node.js b/dist/node.js index 0651c54f..3a013b8c 100644 --- a/dist/node.js +++ b/dist/node.js @@ -21,21 +21,24 @@ import './lib/validation/syntax.js'; import { resolve, matchUrl, dirname } from './lib/fs/resolve.js'; import { Readable } from 'node:stream'; import { createReadStream } from 'node:fs'; -import { readFile, lstat } from 'node:fs/promises'; +import { lstat, readFile } from 'node:fs/promises'; import { ResponseType } from './types.js'; export { FeatureWalkMode } from './lib/ast/features/type.js'; /** - * load file or url as stream + * load file or url * @param url - * @param currentFile + * @param currentDirectory * @param responseType * @throws Error file not found * - * @private + * ```ts + * import {load, ResponseType} from '@tbela99/css-parser'; + * const result = await load(file, '.', ResponseType.ArrayBuffer) as ArrayBuffer; + * ``` */ -async function load(url, currentFile = '.', responseType = false) { - const resolved = resolve(url, currentFile); +async function load(url, currentDirectory = '.', responseType = false) { + const resolved = resolve(url, currentDirectory); if (typeof responseType == 'boolean') { responseType = responseType ? ResponseType.ReadableStream : ResponseType.Text; } @@ -47,18 +50,18 @@ async function load(url, currentFile = '.', responseType = false) { if (responseType == ResponseType.ArrayBuffer) { return response.arrayBuffer(); } - return responseType == ResponseType.ReadableStream ? response.body : await response.text(); + return responseType == ResponseType.ReadableStream ? response.body : response.text(); }); } try { - if (responseType == ResponseType.Text) { - return readFile(resolved.absolute, 'utf-8'); - } - if (responseType == ResponseType.ArrayBuffer) { - return readFile(resolved.absolute).then(buffer => buffer.buffer); - } const stats = await lstat(resolved.absolute); if (stats.isFile()) { + if (responseType == ResponseType.Text) { + return readFile(resolved.absolute, 'utf-8'); + } + if (responseType == ResponseType.ArrayBuffer) { + return readFile(resolved.absolute).then(buffer => buffer.buffer); + } return Readable.toWeb(createReadStream(resolved.absolute, { encoding: 'utf-8', highWaterMark: 64 * 1024 diff --git a/dist/web.js b/dist/web.js index 106474a0..727603bd 100644 --- a/dist/web.js +++ b/dist/web.js @@ -22,14 +22,18 @@ import { ResponseType } from './types.js'; export { FeatureWalkMode } from './lib/ast/features/type.js'; /** - * default file or url loader + * load file or url * @param url - * @param currentFile - * + * @param currentDirectory * @param responseType - * @private + * @throws Error file not found + * + * ```ts + * import {load, ResponseType} from '@tbela99/css-parser'; + * const result = await load(file, '.', ResponseType.ArrayBuffer) as ArrayBuffer; + * ``` */ -async function load(url, currentFile = '.', responseType = false) { +async function load(url, currentDirectory = '.', responseType = false) { if (typeof responseType == 'boolean') { responseType = responseType ? ResponseType.ReadableStream : ResponseType.Text; } @@ -37,11 +41,11 @@ async function load(url, currentFile = '.', responseType = false) { if (matchUrl.test(url)) { t = new URL(url); } - else if (currentFile != null && matchUrl.test(currentFile)) { - t = new URL(url, currentFile); + else if (currentDirectory != null && matchUrl.test(currentDirectory)) { + t = new URL(url, currentDirectory); } else { - const path = resolve(url, currentFile).absolute; + const path = resolve(url, currentDirectory).absolute; t = new URL(path, self.origin); } return fetch(t, t.origin != self.origin ? { mode: 'cors' } : {}).then(async (response) => { @@ -51,7 +55,7 @@ async function load(url, currentFile = '.', responseType = false) { if (responseType == ResponseType.ArrayBuffer) { return response.arrayBuffer(); } - return responseType == ResponseType.ReadableStream ? response.body : await response.text(); + return responseType == ResponseType.ReadableStream ? response.body : response.text(); }); } /** diff --git a/docs/assets/highlight.css b/docs/assets/highlight.css index a871854d..41c6b16f 100644 --- a/docs/assets/highlight.css +++ b/docs/assets/highlight.css @@ -27,28 +27,28 @@ --dark-hl-12: #6A9955; --light-hl-13: #267F99; --dark-hl-13: #4EC9B0; - --light-hl-14: #098658; - --dark-hl-14: #B5CEA8; - --light-hl-15: #800000; - --dark-hl-15: #D7BA7D; + --light-hl-14: #800000; + --dark-hl-14: #D7BA7D; + --light-hl-15: #0451A5; + --dark-hl-15: #CE9178; --light-hl-16: #0451A5; - --dark-hl-16: #CE9178; - --light-hl-17: #CD3131; - --dark-hl-17: #F44747; - --light-hl-18: #811F3F; - --dark-hl-18: #D16969; - --light-hl-19: #D16969; - --dark-hl-19: #CE9178; - --light-hl-20: #000000; - --dark-hl-20: #D7BA7D; - --light-hl-21: #EE0000; - --dark-hl-21: #D7BA7D; - --light-hl-22: #EE0000; - --dark-hl-22: #DCDCAA; - --light-hl-23: #0451A5; - --dark-hl-23: #9CDCFE; - --light-hl-24: #000000; - --dark-hl-24: #C8C8C8; + --dark-hl-16: #9CDCFE; + --light-hl-17: #000000; + --dark-hl-17: #C8C8C8; + --light-hl-18: #098658; + --dark-hl-18: #B5CEA8; + --light-hl-19: #CD3131; + --dark-hl-19: #F44747; + --light-hl-20: #811F3F; + --dark-hl-20: #D16969; + --light-hl-21: #D16969; + --dark-hl-21: #CE9178; + --light-hl-22: #000000; + --dark-hl-22: #D7BA7D; + --light-hl-23: #EE0000; + --dark-hl-23: #D7BA7D; + --light-hl-24: #EE0000; + --dark-hl-24: #DCDCAA; --light-code-background: #FFFFFF; --dark-code-background: #1E1E1E; } diff --git a/docs/assets/navigation.js b/docs/assets/navigation.js index 0fe92ac6..33984ffd 100644 --- a/docs/assets/navigation.js +++ b/docs/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "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" \ No newline at end of file +window.navigationData = "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" \ No newline at end of file diff --git a/docs/assets/search.js b/docs/assets/search.js index a81ce16d..0fb0ad5b 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = "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"; \ No newline at end of file +window.searchData = "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"; \ No newline at end of file diff --git a/docs/classes/node.SourceMap.html b/docs/classes/node.SourceMap.html index 52668a0d..630b1343 100644 --- a/docs/classes/node.SourceMap.html +++ b/docs/classes/node.SourceMap.html @@ -157,16 +157,16 @@ --md-sys-color-surface-container-highest: #e9e1d9 }

Class SourceMapInternal

Source map class

-
Index

Constructors

Index

Constructors

Methods

Properties

Constructors

Methods

Properties

lastLocation: Location | null = null

Last location

-

CSS Modules

CSS module is a feature that allows you to use CSS classes in a way that is safe from conflicts with other classes in the same project. +to enable CSS module support, pass the module option to the parse() or transform() function. +for a detailed explanation of the module options, see the module options section.

+

parse(css, {module: boolean | ModuleCaseTransformEnum | ModuleScopeEnumOptions | ModuleOptions});
transform(css, {module: boolean | ModuleCaseTransformEnum | ModuleScopeEnumOptions | ModuleOptions});

parseFile(css, {module: boolean | ModuleCaseTransformEnum | ModuleScopeEnumOptions | ModuleOptions});
transformFile(css, {module: boolean | ModuleCaseTransformEnum | ModuleScopeEnumOptions | ModuleOptions});
+
+ +

the scoped option is used to configure the scope of the generated class names.

+

this is the default scope.

+

import {transform, TransformOptions} from "@tbela99/css-parser";
import type {TransformResult} from "@tbela99/css-parser";

const css = `
.className {
background: red;
color: yellow;
}

.subClass {
composes: className;
background: blue;
}
`;

let result: TransformResult = await transform(css, {

beautify: true,
module: {scoped: ModuleScopeEnumOptions.Local
}
});

console.log(result.code); +
+ +

output

+
.className_vjnt1 {
background: red;
color: #ff0
}
.subClass_sgkqy {
background: blue
} +
+ +

the class names are not scoped unless they are scoped using :local or :local()

+

result = await transform(css, {

beautify: true,
module: {scoped: ModuleScopeEnumOptions.Global
}

});

console.log(result.code); +
+ +

output

+
.className {
background: red;
color: #ff0
}
.subClass {
background: blue
} +
+ +

export css using ICSS format

+

result = await transform(css, {

beautify: true,
module: {scoped: ModuleScopeEnumOptions.ICSS
}

});

console.log(result.code); +
+ +

output

+
:export {
className: className_vjnt1;
subClass: subClass_sgkqy className_vjnt1;
}
.className_vjnt1 {
background: red;
color: #ff0
}
.subClass_sgkqy {
background: blue
} +
+ +

require to use at least one id or class in selectors. it will throw an error it there are no id or class name in the selector.

+

result = await transform(css, {

beautify: true,
module: {scoped: ModuleScopeEnumOptions.Pure
}

});

console.log(result.code); +
+ +

output

+
.className {
background: red;
color: #ff0
}
.subClass {
background: blue
} +
+ +

scopes can be mixed using the bitwise OR operator '|'

+

result = await transform(css, {

beautify: true,
module: {scoped: ModuleScopeEnumOptions.Pure | ModuleScopeEnumOptions.Global | ModuleScopeEnumOptions.ICSS
}

});

console.log(result.code); +
+ +

class composition is supported using the composes property.

+

import {transform, TransformOptions} from "@tbela99/css-parser";

const options: TransformOptions = {

module: true,
beautify: true,
};

const result = await transform(`
.goal .bg-indigo {
background: indigo;
}

.indigo-white {
composes: bg-indigo title;
color: white;
}
`, options);

console.log(result.code);
console.log(result.mapping);

+
+ +

generated css code

+
.goal_r7bhp .bg-indigo_gy28g {
background: indigo
}
.indigo-white_wims0 {
color: #fff
} +
+ +

generated class mapping

+

{
"goal": "goal_r7bhp",
"bg-indigo": "bg-indigo_gy28g",
"indigo-white": "indigo-white_wims0 bg-indigo_gy28g title_qw06e",
"title": "title_qw06e"
} +
+ +

classes can be composed from other files as well as the global scope

+

import {transform, TransformOptions} from "@tbela99/css-parser";

const options: TransformOptions = {

module: true,
beautify: true,
};

const result = await transform(`
.goal .bg-indigo {
background: indigo;
}

.indigo-white {
composes: bg-indigo;
composes: title block ruler from global;
composes: bg-indigo title from './other-file.css';
color: white;
}
`, options);
+
+ +

the naming option is used to configure the case of the generated class names as well as the class mapping.

+

no case transformation

+

import {transform, ModuleCaseTransformEnum} from '@tbela99/css-parser';
import type {TransformResult} from '@tbela99/css-parser';

let css = `

:local(.class-name) {
background: red;
color: yellow;
}

:local(.sub-class) {
composes: class-name;
background: blue;
`;

let result = await transform(css, {

module: {
naming: ModuleCaseTransformEnum.IgnoreCase
}

});

console.log(result.code); +
+ +

use camel case for the mapping key names

+

import {transform, ModuleCaseTransformEnum} from '@tbela99/css-parser';
import type {TransformResult} from '@tbela99/css-parser';

let css = `

:local(.class-name) {
background: red;
color: yellow;
}

:local(.sub-class) {
composes: class-name;
background: blue;
`;

let result = await transform(css, {

module: {
naming: ModuleCaseTransformEnum.CamelCaseOnly
}

});

console.log(result.code); +
+ +

generated css

+
.class-name_agkqy {
background: red;
color: #ff0
}
.sub-class_nfjpx {
background: blue
} +
+ +

generated mapping

+
console.log(result.mapping);
+
+ +
{
"className": "class-name_agkqy",
"subClass": "sub-class_nfjpx"
} +
+ +

use camel case key names and the scoped class names

+

import {transform, ModuleCaseTransformEnum} from '@tbela99/css-parser';
import type {TransformResult} from '@tbela99/css-parser';

let css = `

:local(.class-name) {
background: red;
color: yellow;
}

:local(.sub-class) {
composes: class-name;
background: blue;
`;

let result = await transform(css, {

module: {
naming: ModuleCaseTransformEnum.CamelCaseOnly
}

});

console.log(result.code); +
+ +

generated css

+
.className_agkqy {
background: red;
color: #ff0
}
.subClass_nfjpx {
background: blue
} +
+ +

generated mapping

+
console.log(result.mapping);
+
+ +
{
"className": "className_agkqy",
"subClass": "subClass_nfjpx"
} +
+ +

use dash case for the mapping key names

+

import {transform, ModuleCaseTransformEnum} from '@tbela99/css-parser';
import type {TransformResult} from '@tbela99/css-parser';

let css = `

:local(.className) {
background: red;
color: yellow;
}

:local(.subClass) {
composes: className;
background: blue;
}
`;

let result = await transform(css, {

module: {
naming: ModuleCaseTransformEnum.DashCase
}

});

console.log(result.code); +
+ +

generated css

+
.className_vjnt1 {
background: red;
color: #ff0
}
.subClass_sgkqy {
background: blue
} +
+ +

generated mapping

+
console.log(result.mapping);
+
+ +
{
"class-name": "className_vjnt1",
"sub-class": "subClass_sgkqy className_vjnt1"
} +
+ +

use dash case key names and the scoped class names

+

import {transform, ModuleCaseTransformEnum} from '@tbela99/css-parser';
import type {TransformResult} from '@tbela99/css-parser';

let css = `

:local(.className) {
background: red;
color: yellow;
}

:local(.subClass) {
composes: className;
background: blue;
}
`;

let result = await transform(css, {

module: {
naming: ModuleCaseTransformEnum.DashCaseOnly
}

});

console.log(result.code); +
+ +

generated css

+
.class-name_vjnt1 {
background: red;
color: #ff0
}
.sub-class_sgkqy {
background: blue
} +
+ +

generated mapping

+
console.log(result.mapping);
+
+ +
{
"class-name": "class-name_vjnt1",
"sub-class": "sub-class_sgkqy class-name_vjnt1"
} +
+ +

the pattern option is used to configure the generated scoped names.

+

import {transform, ModulePatternEnum} from '@tbela99/css-parser';
import type {TransformResult} from '@tbela99/css-parser';

const css = `
.className {
background: red;
color: yellow;
}

.subClass {
composes: className;
background: blue;
}
`;

let result: TransformResult = await transform(css, {

beautify: true,
module: {
pattern: '[local]-[hash:sha256]'
}

});

console.log(result.code); +
+ +

generated css

+
.className-b629f {
background: red;
color: #ff0
}
.subClass-a0c35 {
background: blue
} +
+ +

generated mapping

+
console.log(result.mapping);
+
+ +
{
"className": "className-b629f",
"subClass": "subClass-a0c35 className-b629f"
} +
+ +

the supported placeholders are:

+
    +
  • name: the file base name without the extension
  • +
  • hash: the file path hash
  • +
  • local: the local name
  • +
  • path: the file path
  • +
  • folder: the folder name
  • +
  • ext: the file extension
  • +
+

the pattern placeholders can optionally have a maximum number of characters:

+
pattern: '[local:2]-[hash:5]'
+
+ +

the hash pattern can take an algorithm, a maximum number of characters or both:

+
pattern: '[local]-[hash:base64:5]'
+
+ +

or

+
pattern: '[local]-[hash:5]'
+
+ +

or

+
pattern: '[local]-[hash:sha1]'
+
+ +

supported hash algorithms are:

+
    +
  • base64
  • +
  • hex
  • +
  • base64url
  • +
  • sha1
  • +
  • sha256
  • +
  • sha384
  • +
  • sha512
  • +
+
+

← Usage | Minification →

+
diff --git a/docs/documents/Guide.CSS_modules.html b/docs/documents/Guide.CSS_modules.html index 916954bd..e555490d 100644 --- a/docs/documents/Guide.CSS_modules.html +++ b/docs/documents/Guide.CSS_modules.html @@ -1,4 +1,4 @@ -CSS modules | @tbela99/css-parser

CSS Modules

CSS module is a feature that allows you to use CSS classes in a way that is safe from conflicts with other classes in the same project. +

CSS Modules

CSS module is a feature that allows you to use CSS classes in a way that is safe from conflicts with other classes in the same project. to enable CSS module support, pass the module option to the parse() or transform() function. for a detailed explanation of the module options, see the module options section.


parse(css, {module: boolean | ModuleCaseTransformEnum | ModuleScopeEnumOptions | ModuleOptions});
transform(css, {module: boolean | ModuleCaseTransformEnum | ModuleScopeEnumOptions | ModuleOptions});

parseFile(css, {module: boolean | ModuleCaseTransformEnum | ModuleScopeEnumOptions | ModuleOptions});
transformFile(css, {module: boolean | ModuleCaseTransformEnum | ModuleScopeEnumOptions | ModuleOptions});
@@ -168,7 +168,7 @@

output

-
.className_vjnt1 {
background: red;
color: #ff0
}
.subClass_sgkqy {
background: blue
} +
.className_vjnt1 {
background: red;
color: #ff0
}
.subClass_sgkqy {
background: blue
}

the class names are not scoped unless they are scoped using :local or :local()

@@ -176,7 +176,7 @@

output

-
.className {
background: red;
color: #ff0
}
.subClass {
background: blue
} +
.className {
background: red;
color: #ff0
}
.subClass {
background: blue
}

export css using ICSS format

@@ -184,7 +184,7 @@

output

-
:export {
className: className_vjnt1;
subClass: subClass_sgkqy className_vjnt1;
}
.className_vjnt1 {
background: red;
color: #ff0
}
.subClass_sgkqy {
background: blue
} +
:export {
className: className_vjnt1;
subClass: subClass_sgkqy className_vjnt1;
}
.className_vjnt1 {
background: red;
color: #ff0
}
.subClass_sgkqy {
background: blue
}

require to use at least one id or class in selectors. it will throw an error it there are no id or class name in the selector.

@@ -192,7 +192,7 @@

output

-
.className {
background: red;
color: #ff0
}
.subClass {
background: blue
} +
.className {
background: red;
color: #ff0
}
.subClass {
background: blue
}

scopes can be mixed using the bitwise OR operator '|'

@@ -204,11 +204,11 @@

generated css code

-
.goal_r7bhp .bg-indigo_gy28g {
background: indigo
}
.indigo-white_wims0 {
color: #fff
} +
.goal_r7bhp .bg-indigo_gy28g {
background: indigo
}
.indigo-white_wims0 {
color: #fff
}

generated class mapping

-

{
"goal": "goal_r7bhp",
"bg-indigo": "bg-indigo_gy28g",
"indigo-white": "indigo-white_wims0 bg-indigo_gy28g title_qw06e",
"title": "title_qw06e"
} +

{
"goal": "goal_r7bhp",
"bg-indigo": "bg-indigo_gy28g",
"indigo-white": "indigo-white_wims0 bg-indigo_gy28g title_qw06e",
"title": "title_qw06e"
}

classes can be composed from other files as well as the global scope

@@ -225,14 +225,14 @@

generated css

-
.class-name_agkqy {
background: red;
color: #ff0
}
.sub-class_nfjpx {
background: blue
} +
.class-name_agkqy {
background: red;
color: #ff0
}
.sub-class_nfjpx {
background: blue
}

generated mapping

console.log(result.mapping);
 
-
{
"className": "class-name_agkqy",
"subClass": "sub-class_nfjpx"
} +
{
"className": "class-name_agkqy",
"subClass": "sub-class_nfjpx"
}

use camel case key names and the scoped class names

@@ -240,14 +240,14 @@

generated css

-
.className_agkqy {
background: red;
color: #ff0
}
.subClass_nfjpx {
background: blue
} +
.className_agkqy {
background: red;
color: #ff0
}
.subClass_nfjpx {
background: blue
}

generated mapping

console.log(result.mapping);
 
-
{
"className": "className_agkqy",
"subClass": "subClass_nfjpx"
} +
{
"className": "className_agkqy",
"subClass": "subClass_nfjpx"
}

use dash case for the mapping key names

@@ -255,14 +255,14 @@

generated css

-
.className_vjnt1 {
background: red;
color: #ff0
}
.subClass_sgkqy {
background: blue
} +
.className_vjnt1 {
background: red;
color: #ff0
}
.subClass_sgkqy {
background: blue
}

generated mapping

console.log(result.mapping);
 
-
{
"class-name": "className_vjnt1",
"sub-class": "subClass_sgkqy className_vjnt1"
} +
{
"class-name": "className_vjnt1",
"sub-class": "subClass_sgkqy className_vjnt1"
}

use dash case key names and the scoped class names

@@ -270,14 +270,14 @@

generated css

-
.class-name_vjnt1 {
background: red;
color: #ff0
}
.sub-class_sgkqy {
background: blue
} +
.class-name_vjnt1 {
background: red;
color: #ff0
}
.sub-class_sgkqy {
background: blue
}

generated mapping

console.log(result.mapping);
 
-
{
"class-name": "class-name_vjnt1",
"sub-class": "sub-class_sgkqy class-name_vjnt1"
} +
{
"class-name": "class-name_vjnt1",
"sub-class": "sub-class_sgkqy class-name_vjnt1"
}

the pattern option is used to configure the generated scoped names.

@@ -285,14 +285,14 @@

generated css

-
.className-b629f {
background: red;
color: #ff0
}
.subClass-a0c35 {
background: blue
} +
.className-b629f {
background: red;
color: #ff0
}
.subClass-a0c35 {
background: blue
}

generated mapping

console.log(result.mapping);
 
-
{
"className": "className-b629f",
"subClass": "subClass-a0c35 className-b629f"
} +
{
"className": "className-b629f",
"subClass": "subClass-a0c35 className-b629f"
}

the supported placeholders are:

@@ -305,19 +305,19 @@

visitors are used to alter the ast tree produced by the parser. for more information about the visitor object see the typescript definition

+

visitors can be called when the node is entered, visited or left.

+

const options: ParserOptions = {

visitor: [
{

AtRule: [
// called when entering a node
{
type: WalkerEvent.Enter,
handler: (node: AstAtRule): AstAtRule => {

console.error(`> enter '@${node.nam}' node at position ${node.loc!.sta.lin}:${node.loc!.sta.col}`);
return node
}
},
// called when leaving a node
{

type: WalkerEvent.Leave,
handler: (node: AstAtRule): AstAtRule => {

console.error(`> leaving '@${node.nam}' node at position ${node.loc!.sta.lin}:${node.loc!.sta.col}`)
return node
}
},
// called after node enter handlers but before node leave handlers
(node: AstAtRule): AstAtRule => {

console.error(`> visiting '@${node.nam}' node at position ${node.loc!.sta.lin}:${node.loc!.sta.col}`);
return node
}
}
]
}
]
} +
+ +

import {AstAtRule, ParserOptions, transform, VisitorNodeMap, WalkerEvent} from "@tbela99/css-parser";
const options: ParserOptions = {

visitor: [
{

AtRule: [
(node: AstAtRule): AstAtRule => {

console.error(`> visiting '@${node.nam}' node at position ${node.loc!.sta.lin}:${node.loc!.sta.col}`);
return node
}, {

media: (node: AstAtRule): AstAtRule => {

console.error(`> visiting only '@${node.nam}' node at position ${node.loc!.sta.lin}:${node.loc!.sta.col}`);
return node
}
}, {

type: WalkerEvent.Leave,
handler: (node: AstAtRule): AstAtRule => {

console.error(`> leaving '@${node.nam}' node at position ${node.loc!.sta.lin}:${node.loc!.sta.col}`)
return node
}
},
{
type: WalkerEvent.Enter,
handler: (node: AstAtRule): AstAtRule => {

console.error(`> enter '@${node.nam}' node at position ${node.loc!.sta.lin}:${node.loc!.sta.col}`);
return node
}
}]
}] as VisitorNodeMap[]
};

const css = `

@media screen {

.foo {

height: calc(100px * 2/ 15);
}
}

@supports (height: 30pt) {

.foo {

height: calc(100px * 2/ 15);
}
}
`;

const result = await transform(css, options);

console.debug(result.code);

// > enter '@media' node at position 3:1
// > visiting '@media' node at position 3:1
// > visiting only '@media' node at position 3:1
// > leaving '@media' node at position 3:1
// > enter '@supports' node at position 11:1
// > visiting '@supports' node at position 11:1
// > leaving '@supports' node at position 11:1
+
+ +

Example: change media at-rule prelude

+

import {transform, AstAtRule, ParserOptions} from "@tbela99/css-parser";
const options: ParserOptions = {

visitor: {

AtRule: {

media: (node: AstAtRule): AstAtRule => {

node.val = 'tv,screen';
return node
}
}
}
};

const css = `

@media screen {

.foo {

height: calc(100px * 2/ 15);
}
}
`;

const result = await transform(css, options);

console.debug(result.code);

// @media tv,screen{.foo{height:calc(40px/3)}} +
+ +

Example: add 'width: 3px' everytime a declaration with the name 'height' is found

+

import {transform, parseDeclarations} from "@tbela99/css-parser";
const options: ParserOptions = {

removeEmpty: false,
visitor: {

Declaration: {

// called only for height declaration
height: (node: AstDeclaration): AstDeclaration[] => {

return [
node,
{

typ: EnumToken.DeclarationNodeType,
nam: 'width',
val: [
<LengthToken>{
typ: EnumToken.LengthTokenType,
val: 3,
unit: 'px'
}
]
}
];
}
}
}
};

const css = `

.foo {
height: calc(100px * 2/ 15);
}
.selector {
color: lch(from peru calc(l * 0.8) calc(c * 0.7) calc(h + 180))
}
`;

console.debug(await transform(css, options));

// .foo{height:calc(40px/3);width:3px}.selector{color:#0880b0} +
+ +

Example: rename 'margin' to 'padding' and 'height' to 'width'

+

import {AstDeclaration, ParserOptions, transform} from "../src/node.ts";
const options: ParserOptions = {

visitor: {

// called for every declaration
Declaration: (node: AstDeclaration): null => {


if (node.nam == 'height') {

node.nam = 'width';
}

else if (node.nam == 'margin') {

node.nam = 'padding'
}

return null;
}
}
};

const css = `

.foo {
height: calc(100px * 2/ 15);
margin: 10px;
}
.selector {

margin: 20px;}
`;

const result = await transform(css, options);

console.debug(result.code);

// .foo{width:calc(40px/3);padding:10px}.selector{padding:20px} +
+ +

Example: add 'width: 3px' to every rule with the selector '.foo'

+

import {transform, parseDeclarations} from "@tbela99/css-parser";
const options: ParserOptions = {

removeEmpty: false,
visitor: {

Rule: async (node: AstRule): Promise<AstRule | null> => {

if (node.sel == '.foo') {

node.chi.push(...await parseDeclarations('width: 3px'));
return node;
}

return null;
}
}
};

const css = `

.foo {
.foo {
}
}
`;

console.debug(await transform(css, options));

// .foo{width:3px;.foo{width:3px}} +
+ +

keyframes rule visitor is called on each keyframes rule node.

+

the keyframes at-rule visitor is called on each keyframes at-rule node. the visitor can be a function or an object with a property named after the keyframes at-rule prelude.

+

import {transform} from "@tbela99/css-parser";
const css = `
@keyframes slide-in {
from {
transform: translateX(0%);
}

to {
transform: translateX(100%);
}
}
@keyframes identifier {
0% {
top: 0;
left: 0;
}
30% {
top: 50px;
}
68%,
72% {
left: 50px;
}
100% {
top: 100px;
left: 100%;
}
}
`;

const result = await transform(css, {
removePrefix: true,
beautify: true,
visitor: {
KeyframesAtRule: {
slideIn(node) {
node.val = 'slide-in-out';
return node;
}
}
}
});
+
+ +

the value visitor is called on each token of the selector node, declaration value and the at-rule prelude, etc.

+

import {AstAtRule, ParserOptions, transform, VisitorNodeMap, WalkerEvent} from "@tbela99/css-parser";
const options: ParserOptions = {

visitor: {

Value: (node: Token): Token => {

console.error(`> visiting token at position ${node.loc!.sta.lin}:${node.loc!.sta.col}`);
return node
}
} as VisitorNodeMap
}; +
+ +

generic token visitor is a function whose name is a keyof EnumToken. it is called for every token of the specified type.

+

import {transform, parse, parseDeclarations} from "@tbela99/css-parser";
const options: ParserOptions = {

inlineCssVariables: true,
visitor: {

// Stylesheet node visitor
StyleSheetNodeType: async (node) => {

// insert a new rule
node.chi.unshift(await parse('html {--base-color: pink}').then(result => result.ast.chi[0]))
},
ColorTokenType: (node) => {

// dump all color tokens
// console.debug(node);
},
FunctionTokenType: (node) => {

// dump all function tokens
// console.debug(node);
},
DeclarationNodeType: (node) => {

// dump all declaration nodes
// console.debug(node);
}
}
};

const css = `

body { color: color(from var(--base-color) display-p3 r calc(g + 0.24) calc(b + 0.15)); }
`;

console.debug(await transform(css, options));

// body {color:#f3fff0} +
+ +

a visitor that inlines all images under a specific size

+
import {
EnumToken,
FunctionURLToken,
load,
StringToken,
Token,
transform,
UrlToken,
ResponseType,
AstDeclaration,
AstNode
} from "@tbela99/css-parser";
const css = `
.goal .bg-indigo {
background: url(/img/animatecss-opengraph.jpg);
}
`;

// 35 kb or something
const maxSize = 35 * 1024;
// accepted images
const extensions = ['jpg', 'gif', 'png', 'webp']
const result = await transform(css, {
visitor: {
UrlFunctionTokenType: async (node: FunctionURLToken, parent : AstNode) => {

if (parent.typ == EnumToken.DeclarationNodeType) {

const t = node.chi.find(t => t.typ != EnumToken.WhitespaceTokenType && t.typ != EnumToken.CommaTokenType) as Token;

if (t == null) {

return;
}

const url = t.typ == EnumToken.StringTokenType ? (t as StringToken).val.slice(1, -1) : (t as UrlToken).val;

if (url.startsWith('data:')) {

return;
}

const matches = /(.*?\/)?([^/.]+)\.([^?#]+)([?#].*)?$/.exec(url);

if (matches == null || !extensions.includes(matches[3].toLowerCase())) {

return;
}

const buffer = await load(url, '.', ResponseType.ArrayBuffer) as ArrayBuffer ;

if (buffer.byteLength > maxSize) {

return
}

Object.assign(t, {typ: EnumToken.StringTokenType, val: `"data:image/${matches[3].toLowerCase()};base64,${toBase64(new Uint8Array(buffer))}"`})
}
}
}
});

function toBase64(arraybuffer: Uint8Array) {

// @ts-ignore
if (typeof Uint8Array.prototype.toBase64! == 'function') {

// @ts-ignore
return arraybuffer.toBase64();
}

let binary = '';
for (const byte of arraybuffer) {
binary += String.fromCharCode( byte);
}

return btoa( binary );
}

console.error(result.code);
// .goal .bg-indigo{background:url("data:image/jpg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/4QugRXhpZgAA ...")} +
+ +
+

← Minification | Ast →

+
diff --git a/docs/documents/Guide.Custom_transform.html b/docs/documents/Guide.Custom_transform.html index 559e3934..20eb4ede 100644 --- a/docs/documents/Guide.Custom_transform.html +++ b/docs/documents/Guide.Custom_transform.html @@ -1,4 +1,4 @@ -Custom transform | @tbela99/css-parser

visitors are used to alter the ast tree produced by the parser. for more information about the visitor object see the typescript definition

+

visitors are used to alter the ast tree produced by the parser. for more information about the visitor object see the typescript definition

visitors can be called when the node is entered, visited or left.


const options: ParserOptions = {

visitor: [
{

AtRule: [
// called when entering a node
{
type: WalkerEvent.Enter,
handler: (node: AstAtRule): AstAtRule => {

console.error(`> enter '@${node.nam}' node at position ${node.loc!.sta.lin}:${node.loc!.sta.col}`);
return node
}
},
// called when leaving a node
{

type: WalkerEvent.Leave,
handler: (node: AstAtRule): AstAtRule => {

console.error(`> leaving '@${node.nam}' node at position ${node.loc!.sta.lin}:${node.loc!.sta.col}`)
return node
}
},
// called after node enter handlers but before node leave handlers
(node: AstAtRule): AstAtRule => {

console.error(`> visiting '@${node.nam}' node at position ${node.loc!.sta.lin}:${node.loc!.sta.col}`);
return node
}
}
]
}
]
}
@@ -169,7 +169,7 @@
$ npm install @tbela99/css-parser
+
+ +
$ deno add @tbela99/css-parser
+
+ +

the library can be imported as a module in the browser

+
<script type="module">

import {transform, ColorType} from 'https://esm.sh/@tbela99/css-parser@1.3.4/web';

const css = `

.table {
border-collapse: collapse;
width: 100%;
}

.table td, .table th {
border: 1px solid #ddd;
padding: 8px;
}

.table tr:nth-child(even){background-color: #f2f2f2;}

.table tr:hover {background-color: #ddd;}

.table th {
padding-top: 12px;
padding-bottom: 12px;
text-align: left;
background-color: #4CAF50;
color: white;
}
`;

console.debug(await transform(css, {beautify: true, convertColor:.ColorType.OKLCH}).then(r => r.code));
})();
</script> +
+ +

it can also be imported as an umd module

+

<script src="https://unpkg.com/@tbela99/css-parser@1.3.4/dist/index-umd-web.js"></script>
<script>

(async () => {

const css = `

.table {
border-collapse: collapse;
width: 100%;
}

.table td, .table th {
border: 1px solid #ddd;
padding: 8px;
}

.table tr:nth-child(even){background-color: #f2f2f2;}

.table tr:hover {background-color: #ddd;}

.table th {
padding-top: 12px;
padding-bottom: 12px;
text-align: left;
background-color: #4CAF50;
color: white;
}
`;

console.debug(await CSSParser.transform(css, {beautify: true, convertColor: CSSParser.ColorType.OKLCH}).then(r => r.code));
})();

</script> +
+ +
+

← Features | Usage →

+
diff --git a/docs/documents/Guide.Getting_started.html b/docs/documents/Guide.Getting_started.html index 1be5a0c0..771d293f 100644 --- a/docs/documents/Guide.Getting_started.html +++ b/docs/documents/Guide.Getting_started.html @@ -1,4 +1,4 @@ -Getting started | @tbela99/css-parser
$ npm install @tbela99/css-parser
+
$ npm install @tbela99/css-parser
 
$ deno add @tbela99/css-parser
diff --git a/docs/documents/Guide.Minification.html b/docs/documents/Guide.Minification.html
index 770833c9..d5494484 100644
--- a/docs/documents/Guide.Minification.html
+++ b/docs/documents/Guide.Minification.html
@@ -164,7 +164,7 @@ 

output

-
@keyframes slide-in {
0% {
transform: translateX(0)
}
to {
transform: translateX(100%)
}
} +
@keyframes slide-in {
0% {
transform: translateX(0)
}
to {
transform: translateX(100%)
}
}

this feature is disabled by default. @@ -174,7 +174,7 @@

output

-
._19_u :focus {
color: hsl(from green calc((h*2)) s l)
} +
._19_u :focus {
color: hsl(from green calc((h*2)) s l)
}

this feature is enabled by default. it can be disabled using {computeCalcExpression: false}. @@ -183,7 +183,7 @@

output

-
._19_u :focus {
color: navy
} +
._19_u :focus {
color: navy
}

CSS colors level 4&5 are fully supported. the library will convert between all supported color formats. @@ -192,7 +192,7 @@

output

-
.color1 {
--color1: #00800080;
--color2: red;
--color3: #ff7600;
--color4: #ff760080;
--color5: #816d9d;
--color6: #88ca86
} +
.color1 {
--color1: #00800080;
--color2: red;
--color3: #ff7600;
--color4: #ff760080;
--color5: #816d9d;
--color6: #88ca86
}

the color result color format can be specified using the convertColor option.

@@ -200,7 +200,7 @@

output

-
.color1 {
--color1: oklch(.519752 .176858 142.495/50%);
--color2: oklch(.473385 .954378 47.1833);
--color3: oklch(.742513 .219804 51.1597);
--color4: oklch(.742513 .219804 51.1597/50%);
--color5: oklch(.572282 .075648 303.425);
--color6: oklch(.77643 .115501 143.964)
} +
.color1 {
--color1: oklch(.519752 .176858 142.495/50%);
--color2: oklch(.473385 .954378 47.1833);
--color3: oklch(.742513 .219804 51.1597);
--color4: oklch(.742513 .219804 51.1597/50%);
--color5: oklch(.572282 .075648 303.425);
--color6: oklch(.77643 .115501 143.964)
}

compute css transform functions and preserve the shortest possible value. this feature is enabled by default. it can be disabled using {computeTransform: false}.

@@ -208,7 +208,7 @@

output

-
.now{transform:none}.now1{transform:scale(1.5,2)}
+
.now{transform:none}.now1{transform:scale(1.5,2)}
 

dimension and numeric values are minified.

@@ -216,7 +216,7 @@

output

-
.now{width:0}
+
.now{width:0}
 

by default, only the last declaration is preserved. @@ -225,7 +225,7 @@

output

-
.table {
width: 100%;
width: calc(100% + 40px);
margin-left: 20px;
margin-left: min(100%,20px)
} +
.table {
width: 100%;
width: calc(100% + 40px);
margin-left: 20px;
margin-left: min(100%,20px)
}

to preserve only specific declarations, pass an array of declaration names to preserve

@@ -233,7 +233,7 @@

output

-
.table {
width: 100%;
width: calc(100% + 40px);
margin-left: min(100%,20px)
} +
.table {
width: 100%;
width: calc(100% + 40px);
margin-left: min(100%,20px)
}

adjacent rules with common declarations and at-rules with the same name and prelude are merged.

@@ -241,7 +241,7 @@

output

-
@media tv {
.rule {
width: 100%;
width: calc(100% + 40px);
margin-left: min(100%,20px)
}
}
#converted-text {
color: #00b400;
background: -o-linear-gradient(top,#fff,#000);
background: -webkit-gradient(linear,left top,left bottom,from(#fff),to(#000));
background: linear-gradient(to bottom,#fff,#000)
} +
@media tv {
.rule {
width: 100%;
width: calc(100% + 40px);
margin-left: min(100%,20px)
}
}
#converted-text {
color: #00b400;
background: -o-linear-gradient(top,#fff,#000);
background: -webkit-gradient(linear,left top,left bottom,from(#fff),to(#000));
background: linear-gradient(to bottom,#fff,#000)
}

this feature is enabled by default. it can be disabled by turning off minification using {minify: false}. @@ -250,7 +250,7 @@

Copy

output

-
.table {
border-collapse: collapse;
width: 100%
}
.table:is(td,th,tr) {
border: 1px solid #ddd;
padding: 8px
} +
.table {
border-collapse: collapse;
width: 100%
}
.table:is(td,th,tr) {
border: 1px solid #ddd;
padding: 8px
}

this feature is enabled by default. it can be disabled using {nestingRules: false}. @@ -259,7 +259,7 @@

output

-
.table {
border-collapse: collapse;
width: 100%;
& td,& th {
border: 1px solid oklch(.897547 0 0);
padding: 8px
}
& tr {
&:nth-child(2n) {
background-color: oklch(.961151 0 0)
}
&:hover {
background-color: oklch(.897547 0 0)
}
}
& th {
padding-top: 12px;
padding-bottom: 12px;
text-align: left;
background-color: oklch(.673098 .162442 144.208);
color: oklch(1 0 0)
}
} +
.table {
border-collapse: collapse;
width: 100%;
& td,& th {
border: 1px solid oklch(.897547 0 0);
padding: 8px
}
& tr {
&:nth-child(2n) {
background-color: oklch(.961151 0 0)
}
&:hover {
background-color: oklch(.897547 0 0)
}
}
& th {
padding-top: 12px;
padding-bottom: 12px;
text-align: left;
background-color: oklch(.673098 .162442 144.208);
color: oklch(1 0 0)
}
}

utf-8 escape sequences are decoded and replaced by their corresponding characters.

@@ -268,7 +268,7 @@

output

-
::placeholder {
color: grey
}
@supports selector(::placeholder) {
::placeholder {
color: grey
}
}
@media (min-resolution:2x),(-o-min-device-pixel-ratio:2/1),(min-resolution:2x) {
.image {
background-image: url(image@2x.png)
}
}
@keyframes bar {
0% {
height: 10px
}
}
.example,.site {
display: grid
}
.site {
grid-template-columns: 2fr 1fr;
grid-template-areas: "header header""title sidebar""main sidebar""footer footer"
}
.example {
animation: bar 1s infinite;
transition: .5s;
user-select: none;
background: linear-gradient(to bottom,#fff,#000)
}
.site>* {
padding: 30px;
color: #fff;
font-size: 20px
}
.mastheader {
grid-row: 1;
grid-column: 1;
grid-column-end: 2;
grid-area: header
}
.page-title {
grid-row: 2;
grid-column: 1;
grid-area: title
}
.main-content {
grid-row: 3;
grid-column: 1;
grid-area: main
}
.sidebar {
grid-row: 2;
grid-row-end: 2;
grid-column: 2;
grid-area: sidebar
}
.footer {
grid-row: 4;
grid-column: 1;
grid-column-end: 2;
grid-area: footer
} +
::placeholder {
color: grey
}
@supports selector(::placeholder) {
::placeholder {
color: grey
}
}
@media (min-resolution:2x),(-o-min-device-pixel-ratio:2/1),(min-resolution:2x) {
.image {
background-image: url(image@2x.png)
}
}
@keyframes bar {
0% {
height: 10px
}
}
.example,.site {
display: grid
}
.site {
grid-template-columns: 2fr 1fr;
grid-template-areas: "header header""title sidebar""main sidebar""footer footer"
}
.example {
animation: bar 1s infinite;
transition: .5s;
user-select: none;
background: linear-gradient(to bottom,#fff,#000)
}
.site>* {
padding: 30px;
color: #fff;
font-size: 20px
}
.mastheader {
grid-row: 1;
grid-column: 1;
grid-column-end: 2;
grid-area: header
}
.page-title {
grid-row: 2;
grid-column: 1;
grid-area: title
}
.main-content {
grid-row: 3;
grid-column: 1;
grid-area: main
}
.sidebar {
grid-row: 2;
grid-row-end: 2;
grid-column: 2;
grid-area: sidebar
}
.footer {
grid-row: 4;
grid-column: 1;
grid-column-end: 2;
grid-area: footer
}

shorthand properties are computed and default values are removed.

@@ -276,7 +276,7 @@

output

-
.table {
margin: 20px 25px 15px
} +
.table {
margin: 20px 25px 15px
}

list of computed shorthands properties:

@@ -332,7 +332,7 @@

Enumeration ColorType

supported color types enum

-
Index

Enumeration Members

Index

Enumeration Members

A98_RGB CMYK COLOR COLOR_MIX @@ -185,33 +185,33 @@ XYZ_D50 XYZ_D65

Enumeration Members

A98_RGB: 15

color using a98-rgb values

-
CMYK: 7

colors as cmyk values

-
COLOR: 12

colors using color() function

-
COLOR_MIX: 22

color-mix() color function

-
DEVICE_CMYK: 7

alias for cmyk

-
DISPLAY_P3: 17

color using display-p3 values

-
DPSYS: 1

deprecated system colors

-
HEX: 3

colors as hex values

-
HSL: 5

alias for hsl

-
HSLA: 5

colors as hsl values

-
HWB: 6

colors as hwb values

-
LAB: 10

colors as lab values

-
LCH: 11

colors as lch values

-
LIGHT_DARK: 21

light-dark() color function

-
LIT: 2

named colors

-
OKLAB: 8

colors as oklab values

-
OKLCH: 9

colors as oklch values

-
PROPHOTO_RGB: 14

color using prophoto-rgb values

-
REC2020: 16

color using rec2020 values

-
RGB: 4

alias for rgba

-
RGBA: 4

colors as rgb values

-
SRGB: 13

color using srgb values

-
SRGB_LINEAR: 18

color using srgb-linear values

-
SYS: 0

deprecated system colors

-
XYZ: 20

alias for xyz-d65

-
XYZ_D50: 19

color using xyz-d50 values

-
XYZ_D65: 20

color using xyz-d65 values

-

Enumeration EnumToken

enum of all token types

-
Index

Enumeration Members

Add +
Index

Enumeration Members

Enumeration Members

Add: 60

addition token type

-
Angle: 24

alias for angle token type

-
AngleTokenType: 24

angle token type

-
AtRuleNodeType: 3

at-rule node type

-
AtRuleTokenType: 13

at-rule token type

-
AttrEndTokenType: 32

attribute end token type

-
AttrStartTokenType: 31

attribute start token type

-
AttrTokenType: 51

attribute token type

-
BadCdoTokenType: 53

bad cdo token type

-
BadCommentTokenType: 52

bad comment token type

-
BadStringTokenType: 55

bad string token type

-
BadUrlTokenType: 54

bad URL token type

-
BinaryExpressionTokenType: 56

binary expression token type

-
BlockEndTokenType: 30

block end token type

-
BlockStartTokenType: 29

block start token type

-
CDOCOMMNodeType: 1

alias for cdata section node type

-
CDOCOMMTokenType: 1

cdata section token

-
ChildCombinatorTokenType: 76

child combinator token type

-
ClassSelectorTokenType: 74

class selector token type

-
ColonTokenType: 10

colon token type

-
Color: 50

alias for color token type

-
ColorTokenType: 50

color token type

-
ColumnCombinatorTokenType: 64

column combinator token type

-
Comma: 9

alias for comma token type

-
CommaTokenType: 9

comma token type

-
Comment: 0

alias for comment token type

-
CommentNodeType: 0

alias for comment node type

-
CommentTokenType: 0

comment token

-
ComposesSelectorNodeType: 95

composes token node type

-
ContainMatchTokenType: 65

contain match token type

-
CssVariableDeclarationMapTokenType: 98

css variable declaration map token type

-
CssVariableImportTokenType: 97

css variable import token type

-
CssVariableTokenType: 96

css variable token type

-
DashedIden: 8

alias for dashed identifier token type

-
DashedIdenTokenType: 8

dashed identifier token type

-
DashMatchTokenType: 38

dash match token type

-
DeclarationNodeType: 5

declaration node type

-
DelimTokenType: 46

delimiter token type

-
DescendantCombinatorTokenType: 77

descendant combinator token type

-
Dimension: 22

alias for dimension token type

-
DimensionTokenType: 22

dimension token type

-
Div: 62

division token type

-
EndMatchTokenType: 67

end match token type

-
EndParensTokenType: 34

end parentheses token type

-
EOF: 48

alias for end of file token type

-
EOFTokenType: 48

end of file token type

-
EqualMatchTokenType: 39

equal match token type

-
Flex: 58

alias for flex token type

-
FlexTokenType: 58

flex token type

-
FractionTokenType: 70

fraction token type

-
Frequency: 26

alias for frequency token type

-
FrequencyTokenType: 26

frequency token type

-
FunctionTokenType: 15

function token type

-
GridTemplateFunc: 72

alias for grid template function token type

-
GridTemplateFuncTokenType: 72

grid template function token type

-
GteTokenType: 43

greater than or equal to token type

-
GtTokenType: 42

greater than token type

-
Hash: 28

alias for hash token type

-
HashTokenType: 28

hash token type

-
Iden: 7

alias for identifier token type

-
IdenList: 71

alias for identifier list token type

-
IdenListTokenType: 71

identifier list token type

-
IdenTokenType: 7

identifier token type

-
ImageFunc: 19

alias for image function token type

-
ImageFunctionTokenType: 19

image function token type

-
ImportantTokenType: 49

important token type

-
IncludeMatchTokenType: 37

include match token type

-
InvalidAtRuleTokenType: 84

invalid at rule token type

-
InvalidAttrTokenType: 83

invalid attribute token type

-
InvalidClassSelectorTokenType: 82

invalid class selector token type

-
InvalidDeclarationNodeType: 94

invalid declaration node type

-
InvalidRuleTokenType: 81

invalid rule token type

-
KeyframesAtRuleNodeType: 93

keyframe at rule node type

-
KeyFramesRuleNodeType: 73

keyframe rule node type

-
Length: 23

alias for length token type

-
LengthTokenType: 23

length token type

-
ListToken: 59

token list token type

-
Literal: 6

alias for literal token type

-
LiteralTokenType: 6

literal token type

-
LteTokenType: 41

less than or equal to token type

-
LtTokenType: 40

less than token type

-
MatchExpressionTokenType: 68

match expression token type

-
MediaFeatureAndTokenType: 89

media feature and token type

-
MediaFeatureNotTokenType: 88

media feature not token type

-
MediaFeatureOnlyTokenType: 87

media feature only token type

-
MediaFeatureOrTokenType: 90

media feature or token type

-
MediaFeatureTokenType: 86

media feature token type

-
MediaQueryConditionTokenType: 85

media query condition token type

-
Mul: 61

multiplication token type

-
NameSpaceAttributeTokenType: 69

namespace attribute token type

-
NestingSelectorTokenType: 80

nesting selector token type

-
NextSiblingCombinatorTokenType: 78

next sibling combinator token type

-
Number: 12

alias for number token type

-
NumberTokenType: 12

number token type

-
ParensTokenType: 35

parentheses token type

-
Perc: 14

alias for percentage token type

-
PercentageTokenType: 14

percentage token type

-
PseudoClassFuncTokenType: 45

pseudo-class function token type

-
PseudoClassTokenType: 44

pseudo-class token type

-
PseudoElementTokenType: 92

pseudo element token type

-
PseudoPageTokenType: 91

pseudo page token type

-
Resolution: 27

alias for resolution token type

-
ResolutionTokenType: 27

resolution token type

-
RuleNodeType: 4

rule node type

-
SemiColonTokenType: 11

semicolon token type

-
StartMatchTokenType: 66

start match token type

-
StartParensTokenType: 33

start parentheses token type

-
String: 20

alias for string token type

-
StringTokenType: 20

string token type

-
StyleSheetNodeType: 2

style sheet node type

-
Sub: 63

subtraction token type

-
SubsequentSiblingCombinatorTokenType: 79

subsequent sibling combinator token type

-
Time: 25

alias for time token type

-
TimelineFunction: 16

alias for timeline function token type

-
TimelineFunctionTokenType: 16

timeline function token type

-
TimeTokenType: 25

time token type

-
TimingFunction: 17

alias for timing function token type

-
TimingFunctionTokenType: 17

timing function token type

-
UnaryExpressionTokenType: 57

unary expression token type

-
UnclosedStringTokenType: 21

unclosed string token type

-
UniversalSelectorTokenType: 75

universal selector token type

-
UrlFunc: 18

alias for url function token type

-
UrlFunctionTokenType: 18

url function token type

-
UrlTokenTokenType: 47

URL token type

-
Whitespace: 36

alias for whitespace token type

-
WhitespaceTokenType: 36

whitespace token type

-

Enumeration ModuleCaseTransformEnum

Index

Enumeration Members

CamelCase +

Enumeration ModuleCaseTransformEnum

Index

Enumeration Members

CamelCase: 2

transform mapping key name to camel case

-
CamelCaseOnly: 4

transform class names and mapping key name to camel case

-
DashCase: 8

transform mapping key name to dash case

-
DashCaseOnly: 16

transform class names and mapping key name to dash case

-
IgnoreCase: 1

export class names as-is

-

Enumeration ModuleScopeEnumOptions

Index

Enumeration Members

Global +

Enumeration ModuleScopeEnumOptions

Index

Enumeration Members

Enumeration Members

Global: 32

use the global scope

-
ICSS: 256

export using ICSS module format

-
Local: 64

use the local scope

-
Pure: 128

do not allow selector without an id or class

-

Enumeration ResponseType

response type

-
Index

Enumeration Members

Index

Enumeration Members

Enumeration Members

ArrayBuffer: 2

return an arraybuffer

-
ReadableStream: 1

return a readable stream

-
Text: 0

return text

-

Enumeration ValidationLevel

enum of validation levels

-
Index

Enumeration Members

All +
Index

Enumeration Members

All: 7

validate selectors, at-rules and declarations

-
AtRule: 2

validate at-rules

-
Declaration: 4

validate declarations

-
Default: 3

validate selectors and at-rules

-
None: 0

disable validation

-
Selector: 1

validate selectors

-

Enumeration WalkerEvent

event types for the walkValues function

-
Index

Enumeration Members

Index

Enumeration Members

Enumeration Members

Enter: 1

enter node

-
Leave: 2

leave node

-

Enumeration WalkerOptionEnum

options for the walk function

-
Index

Enumeration Members

Index

Enumeration Members

Enumeration Members

Children: 4

ignore the current node and process its children

-
Ignore: 1

ignore the current node and its children

-
IgnoreChildren: 8

ignore the current node children

-
Stop: 2

stop walking the tree

-

Function load

  • load file or url

    +

    Parameters

    • url: string
    • currentDirectory: string = '.'
    • responseType: boolean | ResponseType = false

    Returns Promise<string | ArrayBuffer | ReadableStream<Uint8Array<ArrayBufferLike>>>

    Error file not found

    +
    import {load, ResponseType} from '@tbela99/css-parser';
    const result = await load(file, '.', ResponseType.ArrayBuffer) as ArrayBuffer; +
    + +
diff --git a/docs/functions/node.parse.html b/docs/functions/node.parse.html index 1876fead..04169404 100644 --- a/docs/functions/node.parse.html +++ b/docs/functions/node.parse.html @@ -169,7 +169,7 @@

import {parse} from '@tbela99/css-parser';

const response = await fetch('https://docs.deno.com/styles.css');
const result = await parse(response.body, {beautify: true});

console.log(result.ast);
-

Returns Promise<ParseResult>

Function walkValues

  • walk ast node value tokens

    Parameters

    • values: Token[]
    • root: any = null
    • Optionalfilter:
          | WalkerValueFilter
          | {
              event?: WalkerEvent;
              fn?: WalkerValueFilter;
              type?: EnumToken
              | EnumToken[]
              | ((token: Token) => boolean);
          }
          | null
    • Optionalreverse: boolean

      Example:

      -

      import {AstDeclaration, EnumToken, transform, walkValues} from '@tbela99/css-parser';

      const css = `
      body { color: color(from var(--base-color) display-p3 r calc(g + 0.24) calc(b + 0.15)); }
      `;

      const result = await transform(css);
      const declaration = result.ast.chi[0].chi[0] as AstDeclaration;

      // walk the node attribute's tokens in reverse order
      for (const {value} of walkValues(declaration.val, null, null,true)) {

      console.error([EnumToken[value.typ], value.val]);
      }

      // [ "Color", "color" ]
      // [ "FunctionTokenType", "calc" ]
      // [ "Number", 0.15 ]
      // [ "Add", undefined ]
      // [ "Iden", "b" ]
      // [ "Whitespace", undefined ]
      // [ "FunctionTokenType", "calc" ]
      // [ "Number", 0.24 ]
      // [ "Add", undefined ]
      // [ "Iden", "g" ]
      // [ "Whitespace", undefined ]
      // [ "Iden", "r" ]
      // [ "Whitespace", undefined ]
      // [ "Iden", "display-p3" ]
      // [ "Whitespace", undefined ]
      // [ "FunctionTokenType", "var" ]
      // [ "DashedIden", "--base-color" ]
      // [ "Whitespace", undefined ]
      // [ "Iden", "from" ] +

      import {AstDeclaration, EnumToken, transform, walkValues} from '@tbela99/css-parser';

      const css = `
      body { color: color(from var(--base-color) display-p3 r calc(g + 0.24) calc(b + 0.15)); }
      `;

      const result = await transform(css);
      const declaration = result.ast.chi[0].chi[0] as AstDeclaration;

      // walk the node attribute's tokens in reverse order
      for (const {value} of walkValues(declaration.val, null, null,true)) {

      console.error([EnumToken[value.typ], value.val]);
      }

      // [ "Color", "color" ]
      // [ "FunctionTokenType", "calc" ]
      // [ "Number", 0.15 ]
      // [ "Add", undefined ]
      // [ "Iden", "b" ]
      // [ "Whitespace", undefined ]
      // [ "FunctionTokenType", "calc" ]
      // [ "Number", 0.24 ]
      // [ "Add", undefined ]
      // [ "Iden", "g" ]
      // [ "Whitespace", undefined ]
      // [ "Iden", "r" ]
      // [ "Whitespace", undefined ]
      // [ "Iden", "display-p3" ]
      // [ "Whitespace", undefined ]
      // [ "FunctionTokenType", "var" ]
      // [ "DashedIden", "--base-color" ]
      // [ "Whitespace", undefined ]
      // [ "Iden", "from" ]
      -

    Returns Generator<WalkAttributesResult>

Function load

  • load file or url

    +

    Parameters

    • url: string
    • currentDirectory: string = '.'
    • responseType: boolean | ResponseType = false

    Returns Promise<string | ArrayBuffer | ReadableStream<Uint8Array<ArrayBufferLike>>>

    Error file not found

    +
    import {load, ResponseType} from '@tbela99/css-parser';
    const result = await load(file, '.', ResponseType.ArrayBuffer) as ArrayBuffer; +
    + +
diff --git a/docs/functions/web.parse.html b/docs/functions/web.parse.html index 004c6174..a560e476 100644 --- a/docs/functions/web.parse.html +++ b/docs/functions/web.parse.html @@ -165,7 +165,7 @@

import {parse} from '@tbela99/css-parser/web';

const response = await fetch('https://docs.deno.com/styles.css');
const result = await parse(response.body, {beautify: true});

console.log(result.ast);
-

Returns Promise<ParseResult>

Interface AddToken

Add token

-
interface AddToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: Add;
}

Hierarchy (View Summary)

Index

Properties

interface AddToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: Add;
}

Hierarchy (View Summary)

Index

Properties

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-
typ: Add

token type

-

Interface AngleToken

Angle token

-
interface AngleToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: AngleTokenType;
    unit: string;
    val: number | FractionToken;
}

Hierarchy (View Summary)

Index

Properties

interface AngleToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: AngleTokenType;
    unit: string;
    val: number | FractionToken;
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
unit: string
val: number | FractionToken

Interface AstAtRule

at rule node

-
interface AstAtRule {
    chi?:
        | (AstDeclaration | AstComment | AstInvalidDeclaration)[]
        | (AstRule | AstComment)[];
    loc?: Location;
    nam: string;
    parent?: any;
    tokens?: Token[] | null;
    typ: AtRuleNodeType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

interface AstAtRule {
    chi?:
        | (AstDeclaration | AstComment | AstInvalidDeclaration)[]
        | (AstRule | AstComment)[];
    loc?: Location;
    nam: string;
    parent?: any;
    tokens?: Token[] | null;
    typ: AtRuleNodeType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

chi?:
    | (AstDeclaration | AstComment | AstInvalidDeclaration)[]
    | (AstRule | AstComment)[]
loc?: Location

location info

-
nam: string
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val: string

Interface AstComment

comment node

-
interface AstComment {
    loc?: Location;
    parent?: any;
    tokens?: null;
    typ: CommentTokenType | CDOCOMMTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

interface AstComment {
    loc?: Location;
    parent?: any;
    tokens?: null;
    typ: CommentTokenType | CDOCOMMTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: null

prelude or selector tokens

-

token type

-
val: string

Interface AstDeclaration

declaration node

-
interface AstDeclaration {
    loc?: Location;
    nam: string;
    parent?: any;
    tokens?: null;
    typ: DeclarationNodeType;
    val: Token[];
}

Hierarchy (View Summary)

Index

Properties

interface AstDeclaration {
    loc?: Location;
    nam: string;
    parent?: any;
    tokens?: null;
    typ: DeclarationNodeType;
    val: Token[];
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
nam: string
parent?: any

parent node

-
tokens?: null

prelude or selector tokens

-

token type

-
val: Token[]

Interface AstInvalidAtRule

invalid at rule node

-
interface AstInvalidAtRule {
    chi?: any[];
    loc?: Location;
    nam: string;
    parent?: any;
    tokens?: Token[] | null;
    typ: InvalidAtRuleTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

interface AstInvalidAtRule {
    chi?: any[];
    loc?: Location;
    nam: string;
    parent?: any;
    tokens?: Token[] | null;
    typ: InvalidAtRuleTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

chi?: any[]
loc?: Location

location info

-
nam: string
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val: string

Interface AstInvalidDeclaration

invalid declaration node

-
interface AstInvalidDeclaration {
    loc?: Location;
    parent?: any;
    tokens?: null;
    typ: InvalidDeclarationNodeType;
    val: Token[];
}

Hierarchy (View Summary)

Index

Properties

interface AstInvalidDeclaration {
    loc?: Location;
    parent?: any;
    tokens?: null;
    typ: InvalidDeclarationNodeType;
    val: Token[];
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: null

prelude or selector tokens

-

token type

-
val: Token[]

Interface AstInvalidRule

invalid rule node

-
interface AstInvalidRule {
    chi: any[];
    loc?: Location;
    parent?: any;
    sel: string;
    tokens?: Token[] | null;
    typ: InvalidRuleTokenType;
}

Hierarchy (View Summary)

Index

Properties

chi +
interface AstInvalidRule {
    chi: any[];
    loc?: Location;
    parent?: any;
    sel: string;
    tokens?: Token[] | null;
    typ: InvalidRuleTokenType;
}

Hierarchy (View Summary)

Index

Properties

chi: any[]
loc?: Location

location info

-
parent?: any

parent node

-
sel: string
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface AstKeyFrameRule

keyframe rule node

-
interface AstKeyFrameRule {
    chi: (AstDeclaration | AstComment | AstInvalidDeclaration)[];
    loc?: Location;
    optimized?: OptimizedSelector;
    parent?: any;
    raw?: RawSelectorTokens;
    sel: string;
    tokens?: Token[];
    typ: KeyFramesRuleNodeType;
}

Hierarchy (View Summary)

Index

Properties

chi +
interface AstKeyFrameRule {
    chi: (AstDeclaration | AstComment | AstInvalidDeclaration)[];
    loc?: Location;
    optimized?: OptimizedSelector;
    parent?: any;
    raw?: RawSelectorTokens;
    sel: string;
    tokens?: Token[];
    typ: KeyFramesRuleNodeType;
}

Hierarchy (View Summary)

Index

Properties

chi loc? optimized? parent? @@ -165,11 +165,11 @@ sel tokens? typ -

Properties

loc?: Location

location info

-
optimized?: OptimizedSelector
parent?: any

parent node

-
sel: string
tokens?: Token[]

prelude or selector tokens

-

token type

-

Interface AstKeyFrameRule

keyframe rule node

-
interface AstKeyFrameRule {
    chi: (AstDeclaration | AstComment | AstInvalidDeclaration)[];
    loc?: Location;
    optimized?: OptimizedSelector;
    parent?: any;
    raw?: RawSelectorTokens;
    sel: string;
    tokens?: Token[];
    typ: KeyFramesRuleNodeType;
}

Hierarchy (View Summary)

Index

Properties

chi +
interface AstKeyFrameRule {
    chi: (AstDeclaration | AstComment | AstInvalidDeclaration)[];
    loc?: Location;
    optimized?: OptimizedSelector;
    parent?: any;
    raw?: RawSelectorTokens;
    sel: string;
    tokens?: Token[];
    typ: KeyFramesRuleNodeType;
}

Hierarchy (View Summary)

Index

Properties

chi loc? optimized? parent? @@ -165,11 +165,11 @@ sel tokens? typ -

Properties

loc?: Location

location info

-
optimized?: OptimizedSelector
parent?: any

parent node

-
sel: string
tokens?: Token[]

prelude or selector tokens

-

token type

-

Interface AstKeyframesAtRule

keyframe at rule node

-
interface AstKeyframesAtRule {
    chi: (AstComment | AstKeyframesRule)[];
    loc?: Location;
    nam: string;
    parent?: any;
    tokens?: Token[] | null;
    typ: KeyframesAtRuleNodeType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

chi +
interface AstKeyframesAtRule {
    chi: (AstComment | AstKeyframesRule)[];
    loc?: Location;
    nam: string;
    parent?: any;
    tokens?: Token[] | null;
    typ: KeyframesAtRuleNodeType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
nam: string
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val: string

Interface AstKeyframesRule

keyframe rule node

-
interface AstKeyframesRule {
    chi: (AstDeclaration | AstRuleList | AstComment | AstInvalidDeclaration)[];
    loc?: Location;
    optimized?: OptimizedSelector;
    parent?: any;
    raw?: RawSelectorTokens;
    sel: string;
    tokens?: Token[] | null;
    typ: KeyFramesRuleNodeType;
}

Hierarchy (View Summary)

Index

Properties

chi +
interface AstKeyframesRule {
    chi: (AstDeclaration | AstRuleList | AstComment | AstInvalidDeclaration)[];
    loc?: Location;
    optimized?: OptimizedSelector;
    parent?: any;
    raw?: RawSelectorTokens;
    sel: string;
    tokens?: Token[] | null;
    typ: KeyFramesRuleNodeType;
}

Hierarchy (View Summary)

Index

Properties

chi loc? optimized? parent? @@ -165,11 +165,11 @@ sel tokens? typ -

Properties

loc?: Location

location info

-
optimized?: OptimizedSelector
parent?: any

parent node

-
sel: string
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface AstRule

rule node

-
interface AstRule {
    chi: (
        | AstDeclaration
        | AstAtRule
        | AstInvalidRule
        | AstInvalidAtRule
        | AstRule
        | AstComment
        | AstInvalidDeclaration
    )[];
    loc?: Location;
    optimized?: OptimizedSelector
    | null;
    parent?: any;
    raw?: RawSelectorTokens | null;
    sel: string;
    tokens?: Token[] | null;
    typ: RuleNodeType;
}

Hierarchy (View Summary)

Index

Properties

chi +
interface AstRule {
    chi: (
        | AstDeclaration
        | AstAtRule
        | AstInvalidRule
        | AstInvalidAtRule
        | AstRule
        | AstComment
        | AstInvalidDeclaration
    )[];
    loc?: Location;
    optimized?: OptimizedSelector
    | null;
    parent?: any;
    raw?: RawSelectorTokens | null;
    sel: string;
    tokens?: Token[] | null;
    typ: RuleNodeType;
}

Hierarchy (View Summary)

Index

Properties

chi loc? optimized? parent? @@ -165,11 +165,11 @@ sel tokens? typ -

Properties

chi: (
    | AstDeclaration
    | AstAtRule
    | AstInvalidRule
    | AstInvalidAtRule
    | AstRule
    | AstComment
    | AstInvalidDeclaration
)[]
loc?: Location

location info

-
optimized?: OptimizedSelector | null
parent?: any

parent node

-
raw?: RawSelectorTokens | null
sel: string
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface AstStyleSheet

stylesheet node

-
interface AstStyleSheet {
    chi: any[];
    loc?: Location;
    parent?: any;
    tokens?: null;
    typ: StyleSheetNodeType;
}

Hierarchy (View Summary)

Index

Properties

chi +
interface AstStyleSheet {
    chi: any[];
    loc?: Location;
    parent?: any;
    tokens?: null;
    typ: StyleSheetNodeType;
}

Hierarchy (View Summary)

Index

Properties

Properties

chi: any[]
loc?: Location

location info

-
parent?: any

parent node

-
tokens?: null

prelude or selector tokens

-

token type

-

Interface AtRuleToken

At rule token

-
interface AtRuleToken {
    loc?: Location;
    parent?: any;
    pre: string;
    tokens?: Token[] | null;
    typ: AtRuleTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

interface AtRuleToken {
    loc?: Location;
    parent?: any;
    pre: string;
    tokens?: Token[] | null;
    typ: AtRuleTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
parent?: any

parent node

-
pre: string
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val: string

Interface AttrEndToken

Attribute end token

-
interface AttrEndToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: AttrEndTokenType;
}

Hierarchy (View Summary)

Index

Properties

interface AttrEndToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: AttrEndTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface AttrStartToken

Attribute start token

-
interface AttrStartToken {
    chi?: Token[];
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: AttrStartTokenType;
}

Hierarchy (View Summary)

Index

Properties

interface AttrStartToken {
    chi?: Token[];
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: AttrStartTokenType;
}

Hierarchy (View Summary)

Index

Properties

chi?: Token[]
loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface AttrToken

Attribute token

-
interface AttrToken {
    chi: Token[];
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: AttrTokenType;
}

Hierarchy (View Summary)

Index

Properties

chi +
interface AttrToken {
    chi: Token[];
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: AttrTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

chi: Token[]
loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface BadCDOCommentToken

Bad CDO comment token

-
interface BadCDOCommentToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: BadCdoTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

interface BadCDOCommentToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: BadCdoTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val: string

Interface BadCommentToken

Bad comment token

-
interface BadCommentToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: BadCommentTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

interface BadCommentToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: BadCommentTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val: string

Interface BadStringToken

Bad string token

-
interface BadStringToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: BadStringTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

interface BadStringToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: BadStringTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val: string

Interface BadUrlToken

Bad URL token

-
interface BadUrlToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: BadUrlTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

interface BadUrlToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: BadUrlTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val: string

Interface BaseToken

interface BaseToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: EnumToken;
}

Hierarchy (View Summary)

Index

Properties

loc? +

Interface BaseToken

interface BaseToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: EnumToken;
}

Hierarchy (View Summary)

Index

Properties

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface BinaryExpressionToken

Binary expression token

-
interface BinaryExpressionToken {
    l:
        | ColorToken
        | InvalidClassSelectorToken
        | InvalidAttrToken
        | LiteralToken
        | IdentToken
        | IdentListToken
        | DashedIdentToken
        | CommaToken
        | ColonToken
        | SemiColonToken
        | ClassSelectorToken
        | UniversalSelectorToken
        | ChildCombinatorToken
        | DescendantCombinatorToken
        | NextSiblingCombinatorToken
        | SubsequentCombinatorToken
        | ColumnCombinatorToken
        | NestingSelectorToken
        | MediaQueryConditionToken
        | MediaFeatureToken
        | MediaFeatureNotToken
        | MediaFeatureOnlyToken
        | MediaFeatureAndToken
        | MediaFeatureOrToken
        | AstDeclaration
        | NumberToken
        | AtRuleToken
        | PercentageToken
        | FlexToken
        | FunctionURLToken
        | FunctionImageToken
        | TimingFunctionToken
        | TimelineFunctionToken
        | FunctionToken
        | GridTemplateFuncToken
        | DimensionToken
        | LengthToken
        | AngleToken
        | StringToken
        | TimeToken
        | FrequencyToken
        | ResolutionToken
        | UnclosedStringToken
        | HashToken
        | BadStringToken
        | BlockStartToken
        | BlockEndToken
        | AttrStartToken
        | AttrEndToken
        | ParensStartToken
        | ParensEndToken
        | ParensToken
        | CDOCommentToken
        | BadCDOCommentToken
        | CommentToken
        | BadCommentToken
        | WhitespaceToken
        | IncludeMatchToken
        | StartMatchToken
        | EndMatchToken
        | ContainMatchToken
        | MatchExpressionToken
        | NameSpaceAttributeToken
        | ComposesSelectorToken
        | CssVariableToken
        | DashMatchToken
        | EqualMatchToken
        | LessThanToken
        | LessThanOrEqualToken
        | GreaterThanToken
        | GreaterThanOrEqualToken
        | ListToken
        | PseudoClassToken
        | PseudoPageToken
        | PseudoElementToken
        | PseudoClassFunctionToken
        | DelimToken
        | BinaryExpressionToken
        | UnaryExpression
        | FractionToken
        | AddToken
        | SubToken
        | DivToken
        | MulToken
        | BadUrlToken
        | UrlToken
        | ImportantToken
        | AttrToken
        | EOFToken;
    loc?: Location;
    op: Add
    | Mul
    | Div
    | Sub;
    parent?: any;
    r:
        | ColorToken
        | InvalidClassSelectorToken
        | InvalidAttrToken
        | LiteralToken
        | IdentToken
        | IdentListToken
        | DashedIdentToken
        | CommaToken
        | ColonToken
        | SemiColonToken
        | ClassSelectorToken
        | UniversalSelectorToken
        | ChildCombinatorToken
        | DescendantCombinatorToken
        | NextSiblingCombinatorToken
        | SubsequentCombinatorToken
        | ColumnCombinatorToken
        | NestingSelectorToken
        | MediaQueryConditionToken
        | MediaFeatureToken
        | MediaFeatureNotToken
        | MediaFeatureOnlyToken
        | MediaFeatureAndToken
        | MediaFeatureOrToken
        | AstDeclaration
        | NumberToken
        | AtRuleToken
        | PercentageToken
        | FlexToken
        | FunctionURLToken
        | FunctionImageToken
        | TimingFunctionToken
        | TimelineFunctionToken
        | FunctionToken
        | GridTemplateFuncToken
        | DimensionToken
        | LengthToken
        | AngleToken
        | StringToken
        | TimeToken
        | FrequencyToken
        | ResolutionToken
        | UnclosedStringToken
        | HashToken
        | BadStringToken
        | BlockStartToken
        | BlockEndToken
        | AttrStartToken
        | AttrEndToken
        | ParensStartToken
        | ParensEndToken
        | ParensToken
        | CDOCommentToken
        | BadCDOCommentToken
        | CommentToken
        | BadCommentToken
        | WhitespaceToken
        | IncludeMatchToken
        | StartMatchToken
        | EndMatchToken
        | ContainMatchToken
        | MatchExpressionToken
        | NameSpaceAttributeToken
        | ComposesSelectorToken
        | CssVariableToken
        | DashMatchToken
        | EqualMatchToken
        | LessThanToken
        | LessThanOrEqualToken
        | GreaterThanToken
        | GreaterThanOrEqualToken
        | ListToken
        | PseudoClassToken
        | PseudoPageToken
        | PseudoElementToken
        | PseudoClassFunctionToken
        | DelimToken
        | BinaryExpressionToken
        | UnaryExpression
        | FractionToken
        | AddToken
        | SubToken
        | DivToken
        | MulToken
        | BadUrlToken
        | UrlToken
        | ImportantToken
        | AttrToken
        | EOFToken;
    tokens?: Token[]
    | null;
    typ: BinaryExpressionTokenType;
}

Hierarchy (View Summary)

Index

Properties

l +
interface BinaryExpressionToken {
    l:
        | ColorToken
        | InvalidClassSelectorToken
        | InvalidAttrToken
        | LiteralToken
        | IdentToken
        | IdentListToken
        | DashedIdentToken
        | CommaToken
        | ColonToken
        | SemiColonToken
        | ClassSelectorToken
        | UniversalSelectorToken
        | ChildCombinatorToken
        | DescendantCombinatorToken
        | NextSiblingCombinatorToken
        | SubsequentCombinatorToken
        | ColumnCombinatorToken
        | NestingSelectorToken
        | MediaQueryConditionToken
        | MediaFeatureToken
        | MediaFeatureNotToken
        | MediaFeatureOnlyToken
        | MediaFeatureAndToken
        | MediaFeatureOrToken
        | AstDeclaration
        | NumberToken
        | AtRuleToken
        | PercentageToken
        | FlexToken
        | FunctionURLToken
        | FunctionImageToken
        | TimingFunctionToken
        | TimelineFunctionToken
        | FunctionToken
        | GridTemplateFuncToken
        | DimensionToken
        | LengthToken
        | AngleToken
        | StringToken
        | TimeToken
        | FrequencyToken
        | ResolutionToken
        | UnclosedStringToken
        | HashToken
        | BadStringToken
        | BlockStartToken
        | BlockEndToken
        | AttrStartToken
        | AttrEndToken
        | ParensStartToken
        | ParensEndToken
        | ParensToken
        | CDOCommentToken
        | BadCDOCommentToken
        | CommentToken
        | BadCommentToken
        | WhitespaceToken
        | IncludeMatchToken
        | StartMatchToken
        | EndMatchToken
        | ContainMatchToken
        | MatchExpressionToken
        | NameSpaceAttributeToken
        | ComposesSelectorToken
        | CssVariableToken
        | DashMatchToken
        | EqualMatchToken
        | LessThanToken
        | LessThanOrEqualToken
        | GreaterThanToken
        | GreaterThanOrEqualToken
        | ListToken
        | PseudoClassToken
        | PseudoPageToken
        | PseudoElementToken
        | PseudoClassFunctionToken
        | DelimToken
        | BinaryExpressionToken
        | UnaryExpression
        | FractionToken
        | AddToken
        | SubToken
        | DivToken
        | MulToken
        | BadUrlToken
        | UrlToken
        | ImportantToken
        | AttrToken
        | EOFToken;
    loc?: Location;
    op: Add
    | Mul
    | Div
    | Sub;
    parent?: any;
    r:
        | ColorToken
        | InvalidClassSelectorToken
        | InvalidAttrToken
        | LiteralToken
        | IdentToken
        | IdentListToken
        | DashedIdentToken
        | CommaToken
        | ColonToken
        | SemiColonToken
        | ClassSelectorToken
        | UniversalSelectorToken
        | ChildCombinatorToken
        | DescendantCombinatorToken
        | NextSiblingCombinatorToken
        | SubsequentCombinatorToken
        | ColumnCombinatorToken
        | NestingSelectorToken
        | MediaQueryConditionToken
        | MediaFeatureToken
        | MediaFeatureNotToken
        | MediaFeatureOnlyToken
        | MediaFeatureAndToken
        | MediaFeatureOrToken
        | AstDeclaration
        | NumberToken
        | AtRuleToken
        | PercentageToken
        | FlexToken
        | FunctionURLToken
        | FunctionImageToken
        | TimingFunctionToken
        | TimelineFunctionToken
        | FunctionToken
        | GridTemplateFuncToken
        | DimensionToken
        | LengthToken
        | AngleToken
        | StringToken
        | TimeToken
        | FrequencyToken
        | ResolutionToken
        | UnclosedStringToken
        | HashToken
        | BadStringToken
        | BlockStartToken
        | BlockEndToken
        | AttrStartToken
        | AttrEndToken
        | ParensStartToken
        | ParensEndToken
        | ParensToken
        | CDOCommentToken
        | BadCDOCommentToken
        | CommentToken
        | BadCommentToken
        | WhitespaceToken
        | IncludeMatchToken
        | StartMatchToken
        | EndMatchToken
        | ContainMatchToken
        | MatchExpressionToken
        | NameSpaceAttributeToken
        | ComposesSelectorToken
        | CssVariableToken
        | DashMatchToken
        | EqualMatchToken
        | LessThanToken
        | LessThanOrEqualToken
        | GreaterThanToken
        | GreaterThanOrEqualToken
        | ListToken
        | PseudoClassToken
        | PseudoPageToken
        | PseudoElementToken
        | PseudoClassFunctionToken
        | DelimToken
        | BinaryExpressionToken
        | UnaryExpression
        | FractionToken
        | AddToken
        | SubToken
        | DivToken
        | MulToken
        | BadUrlToken
        | UrlToken
        | ImportantToken
        | AttrToken
        | EOFToken;
    tokens?: Token[]
    | null;
    typ: BinaryExpressionTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

l:
    | ColorToken
    | InvalidClassSelectorToken
    | InvalidAttrToken
    | LiteralToken
    | IdentToken
    | IdentListToken
    | DashedIdentToken
    | CommaToken
    | ColonToken
    | SemiColonToken
    | ClassSelectorToken
    | UniversalSelectorToken
    | ChildCombinatorToken
    | DescendantCombinatorToken
    | NextSiblingCombinatorToken
    | SubsequentCombinatorToken
    | ColumnCombinatorToken
    | NestingSelectorToken
    | MediaQueryConditionToken
    | MediaFeatureToken
    | MediaFeatureNotToken
    | MediaFeatureOnlyToken
    | MediaFeatureAndToken
    | MediaFeatureOrToken
    | AstDeclaration
    | NumberToken
    | AtRuleToken
    | PercentageToken
    | FlexToken
    | FunctionURLToken
    | FunctionImageToken
    | TimingFunctionToken
    | TimelineFunctionToken
    | FunctionToken
    | GridTemplateFuncToken
    | DimensionToken
    | LengthToken
    | AngleToken
    | StringToken
    | TimeToken
    | FrequencyToken
    | ResolutionToken
    | UnclosedStringToken
    | HashToken
    | BadStringToken
    | BlockStartToken
    | BlockEndToken
    | AttrStartToken
    | AttrEndToken
    | ParensStartToken
    | ParensEndToken
    | ParensToken
    | CDOCommentToken
    | BadCDOCommentToken
    | CommentToken
    | BadCommentToken
    | WhitespaceToken
    | IncludeMatchToken
    | StartMatchToken
    | EndMatchToken
    | ContainMatchToken
    | MatchExpressionToken
    | NameSpaceAttributeToken
    | ComposesSelectorToken
    | CssVariableToken
    | DashMatchToken
    | EqualMatchToken
    | LessThanToken
    | LessThanOrEqualToken
    | GreaterThanToken
    | GreaterThanOrEqualToken
    | ListToken
    | PseudoClassToken
    | PseudoPageToken
    | PseudoElementToken
    | PseudoClassFunctionToken
    | DelimToken
    | BinaryExpressionToken
    | UnaryExpression
    | FractionToken
    | AddToken
    | SubToken
    | DivToken
    | MulToken
    | BadUrlToken
    | UrlToken
    | ImportantToken
    | AttrToken
    | EOFToken
loc?: Location

location info

-
op: Add | Mul | Div | Sub
parent?: any

parent node

-
r:
    | ColorToken
    | InvalidClassSelectorToken
    | InvalidAttrToken
    | LiteralToken
    | IdentToken
    | IdentListToken
    | DashedIdentToken
    | CommaToken
    | ColonToken
    | SemiColonToken
    | ClassSelectorToken
    | UniversalSelectorToken
    | ChildCombinatorToken
    | DescendantCombinatorToken
    | NextSiblingCombinatorToken
    | SubsequentCombinatorToken
    | ColumnCombinatorToken
    | NestingSelectorToken
    | MediaQueryConditionToken
    | MediaFeatureToken
    | MediaFeatureNotToken
    | MediaFeatureOnlyToken
    | MediaFeatureAndToken
    | MediaFeatureOrToken
    | AstDeclaration
    | NumberToken
    | AtRuleToken
    | PercentageToken
    | FlexToken
    | FunctionURLToken
    | FunctionImageToken
    | TimingFunctionToken
    | TimelineFunctionToken
    | FunctionToken
    | GridTemplateFuncToken
    | DimensionToken
    | LengthToken
    | AngleToken
    | StringToken
    | TimeToken
    | FrequencyToken
    | ResolutionToken
    | UnclosedStringToken
    | HashToken
    | BadStringToken
    | BlockStartToken
    | BlockEndToken
    | AttrStartToken
    | AttrEndToken
    | ParensStartToken
    | ParensEndToken
    | ParensToken
    | CDOCommentToken
    | BadCDOCommentToken
    | CommentToken
    | BadCommentToken
    | WhitespaceToken
    | IncludeMatchToken
    | StartMatchToken
    | EndMatchToken
    | ContainMatchToken
    | MatchExpressionToken
    | NameSpaceAttributeToken
    | ComposesSelectorToken
    | CssVariableToken
    | DashMatchToken
    | EqualMatchToken
    | LessThanToken
    | LessThanOrEqualToken
    | GreaterThanToken
    | GreaterThanOrEqualToken
    | ListToken
    | PseudoClassToken
    | PseudoPageToken
    | PseudoElementToken
    | PseudoClassFunctionToken
    | DelimToken
    | BinaryExpressionToken
    | UnaryExpression
    | FractionToken
    | AddToken
    | SubToken
    | DivToken
    | MulToken
    | BadUrlToken
    | UrlToken
    | ImportantToken
    | AttrToken
    | EOFToken
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface BlockEndToken

Block end token

-
interface BlockEndToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: BlockEndTokenType;
}

Hierarchy (View Summary)

Index

Properties

interface BlockEndToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: BlockEndTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface BlockStartToken

Block start token

-
interface BlockStartToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: BlockStartTokenType;
}

Hierarchy (View Summary)

Index

Properties

interface BlockStartToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: BlockStartTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface CDOCommentToken

CDO comment token

-
interface CDOCommentToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: CDOCOMMTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

interface CDOCommentToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: CDOCOMMTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val: string

Interface ChildCombinatorToken

Child combinator token

-
interface ChildCombinatorToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: ChildCombinatorTokenType;
}

Hierarchy (View Summary)

Index

Properties

interface ChildCombinatorToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: ChildCombinatorTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface ClassSelectorToken

Class selector token

-
interface ClassSelectorToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: ClassSelectorTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

interface ClassSelectorToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: ClassSelectorTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val: string

Interface ColonToken

Colon token

-
interface ColonToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: ColonTokenType;
}

Hierarchy (View Summary)

Index

Properties

interface ColonToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: ColonTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface ColorToken

Color token

-
interface ColorToken {
    cal?: "rel" | "mix";
    chi?: Token[];
    kin: ColorType;
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: ColorTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

interface ColorToken {
    cal?: "rel" | "mix";
    chi?: Token[];
    kin: ColorType;
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: ColorTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

cal? chi? kin loc? @@ -165,11 +165,11 @@ tokens? typ val -

Properties

cal?: "rel" | "mix"
chi?: Token[]
loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val: string

Interface ColumnCombinatorToken

Column combinator token

-
interface ColumnCombinatorToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: ColumnCombinatorTokenType;
}

Hierarchy (View Summary)

Index

Properties

interface ColumnCombinatorToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: ColumnCombinatorTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface CommaToken

Comma token

-
interface CommaToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: CommaTokenType;
}

Hierarchy (View Summary)

Index

Properties

interface CommaToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: CommaTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface CommentToken

Comment token

-
interface CommentToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: CommentTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

interface CommentToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: CommentTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val: string

Interface ComposesSelectorToken

Composes selector token

-
interface ComposesSelectorToken {
    l: Token[];
    loc?: Location;
    parent?: any;
    r: Token | null;
    tokens?: Token[] | null;
    typ: ComposesSelectorTokenType;
}

Hierarchy (View Summary)

Index

Properties

l +
interface ComposesSelectorToken {
    l: Token[];
    loc?: Location;
    parent?: any;
    r: Token | null;
    tokens?: Token[] | null;
    typ: ComposesSelectorTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

l: Token[]
loc?: Location

location info

-
parent?: any

parent node

-
r: Token | null
tokens?: Token[] | null

prelude or selector tokens

-
typ: ComposesSelectorTokenType

token type

-

Interface ContainMatchToken

Contain match token

-
interface ContainMatchToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: ContainMatchTokenType;
}

Hierarchy (View Summary)

Index

Properties

interface ContainMatchToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: ContainMatchTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface Context<Type>

interface Context<Type> {
    index: number;
    length: number;
    clone<Type>(): Context<Type>;
    consume<Type>(token: Type, howMany?: number): boolean;
    consume<Type>(token: Type, howMany?: number): boolean;
    current<Type>(): Type | null;
    done(): boolean;
    next<Type>(): Type | null;
    peek<Type>(): Type | null;
    slice<Type>(): Type[];
    update<Type>(context: Context<Type>): void;
}

Type Parameters

  • Type
Index

Methods

clone +

Interface Context<Type>

interface Context<Type> {
    index: number;
    length: number;
    clone<Type>(): Context<Type>;
    consume<Type>(token: Type, howMany?: number): boolean;
    consume<Type>(token: Type, howMany?: number): boolean;
    current<Type>(): Type | null;
    done(): boolean;
    next<Type>(): Type | null;
    peek<Type>(): Type | null;
    slice<Type>(): Type[];
    update<Type>(context: Context<Type>): void;
}

Type Parameters

  • Type
Index

Methods

clone consume current done @@ -166,8 +166,8 @@ update

Properties

Methods

Properties

index: number
length: number

The length of the context tokens to be consumed

-

Interface CssVariableImportTokenType

interface CssVariableImportTokenType {
    loc?: Location;
    nam: string;
    parent?: any;
    tokens?: Token[] | null;
    typ: CssVariableImportTokenType;
    val: Token[];
}

Hierarchy (View Summary)

Index

Properties

loc? +

Interface CssVariableImportTokenType

interface CssVariableImportTokenType {
    loc?: Location;
    nam: string;
    parent?: any;
    tokens?: Token[] | null;
    typ: CssVariableImportTokenType;
    val: Token[];
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
nam: string
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val: Token[]

Interface CssVariableMapTokenType

interface CssVariableMapTokenType {
    from: Token[];
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: CssVariableMapTokenType;
    vars: Token[];
}

Hierarchy (View Summary)

Index

Properties

from +

Interface CssVariableMapTokenType

interface CssVariableMapTokenType {
    from: Token[];
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: CssVariableMapTokenType;
    vars: Token[];
}

Hierarchy (View Summary)

Index

Properties

from: Token[]
loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-
typ: CssVariableMapTokenType

token type

-
vars: Token[]

Interface CssVariableToken

Css variable token

-
interface CssVariableToken {
    loc?: Location;
    nam: string;
    parent?: any;
    tokens?: Token[] | null;
    typ: CssVariableTokenType;
    val: Token[];
}

Hierarchy (View Summary)

Index

Properties

interface CssVariableToken {
    loc?: Location;
    nam: string;
    parent?: any;
    tokens?: Token[] | null;
    typ: CssVariableTokenType;
    val: Token[];
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
nam: string
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val: Token[]

Interface DashMatchToken

Dash match token

-
interface DashMatchToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: DashMatchTokenType;
}

Hierarchy (View Summary)

Index

Properties

interface DashMatchToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: DashMatchTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface DashedIdentToken

Dashed ident token

-
interface DashedIdentToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: DashedIdenTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

interface DashedIdentToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: DashedIdenTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val: string

Interface DelimToken

Delim token

-
interface DelimToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: DelimTokenType;
}

Hierarchy (View Summary)

Index

Properties

interface DelimToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: DelimTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface DescendantCombinatorToken

Descendant combinator token

-
interface DescendantCombinatorToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: DescendantCombinatorTokenType;
}

Hierarchy (View Summary)

Index

Properties

interface DescendantCombinatorToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: DescendantCombinatorTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface DimensionToken

Dimension token

-
interface DimensionToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: DimensionTokenType;
    unit: string;
    val: number | FractionToken;
}

Hierarchy (View Summary)

Index

Properties

interface DimensionToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: DimensionTokenType;
    unit: string;
    val: number | FractionToken;
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
unit: string
val: number | FractionToken

Interface DivToken

Div token

-
interface DivToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: Div;
}

Hierarchy (View Summary)

Index

Properties

interface DivToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: Div;
}

Hierarchy (View Summary)

Index

Properties

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-
typ: Div

token type

-

Interface EOFToken

EOF token

-
interface EOFToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: EOFTokenType;
}

Hierarchy (View Summary)

Index

Properties

interface EOFToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: EOFTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface EndMatchToken

End match token

-
interface EndMatchToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: EndMatchTokenType;
}

Hierarchy (View Summary)

Index

Properties

interface EndMatchToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: EndMatchTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface EqualMatchToken

Equal match token

-
interface EqualMatchToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: EqualMatchTokenType;
}

Hierarchy (View Summary)

Index

Properties

interface EqualMatchToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: EqualMatchTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface ErrorDescription

error description

-
interface ErrorDescription {
    action: "drop" | "ignore";
    error?: Error;
    location?: Location;
    message: string;
    node?: any;
    rawTokens?: TokenizeResult[];
    syntax?: string | null;
}
Index

Properties

interface ErrorDescription {
    action: "drop" | "ignore";
    error?: Error;
    location?: Location;
    message: string;
    node?: any;
    rawTokens?: TokenizeResult[];
    syntax?: string | null;
}
Index

Properties

Properties

action: "drop" | "ignore"

drop rule or declaration

-
error?: Error

error object

-
location?: Location

error location

-
message: string

error message

-
node?: any

error node

-
rawTokens?: TokenizeResult[]

raw tokens

-
syntax?: string | null

syntax error description

-

Interface FlexToken

Flex token

-
interface FlexToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: FlexTokenType;
    val: number | FractionToken;
}

Hierarchy (View Summary)

Index

Properties

interface FlexToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: FlexTokenType;
    val: number | FractionToken;
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val: number | FractionToken

Interface FractionToken

Fraction token

-
interface FractionToken {
    l: NumberToken;
    loc?: Location;
    parent?: any;
    r: NumberToken;
    tokens?: Token[] | null;
    typ: FractionTokenType;
}

Hierarchy (View Summary)

Index

Properties

l +
interface FractionToken {
    l: NumberToken;
    loc?: Location;
    parent?: any;
    r: NumberToken;
    tokens?: Token[] | null;
    typ: FractionTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface FrequencyToken

Frequency token

-
interface FrequencyToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: FrequencyTokenType;
    unit: "Hz" | "Khz";
    val: number | FractionToken;
}

Hierarchy (View Summary)

Index

Properties

interface FrequencyToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: FrequencyTokenType;
    unit: "Hz" | "Khz";
    val: number | FractionToken;
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
unit: "Hz" | "Khz"
val: number | FractionToken

Interface FunctionImageToken

Function image token

-
interface FunctionImageToken {
    chi: (CommentToken | UrlToken)[];
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: ImageFunctionTokenType;
    val:
        | "linear-gradient"
        | "radial-gradient"
        | "repeating-linear-gradient"
        | "repeating-radial-gradient"
        | "conic-gradient"
        | "image"
        | "image-set"
        | "element"
        | "cross-fade";
}

Hierarchy (View Summary)

Index

Properties

chi +
interface FunctionImageToken {
    chi: (CommentToken | UrlToken)[];
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: ImageFunctionTokenType;
    val:
        | "linear-gradient"
        | "radial-gradient"
        | "repeating-linear-gradient"
        | "repeating-radial-gradient"
        | "conic-gradient"
        | "image"
        | "image-set"
        | "element"
        | "cross-fade";
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val:
    | "linear-gradient"
    | "radial-gradient"
    | "repeating-linear-gradient"
    | "repeating-radial-gradient"
    | "conic-gradient"
    | "image"
    | "image-set"
    | "element"
    | "cross-fade"

Interface FunctionToken

Function token

-
interface FunctionToken {
    chi: Token[];
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: FunctionTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

chi +
interface FunctionToken {
    chi: Token[];
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: FunctionTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

chi: Token[]
loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val: string

Interface FunctionURLToken

Function URL token

-
interface FunctionURLToken {
    chi: (StringToken | CommentToken | UrlToken)[];
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: UrlFunctionTokenType;
    val: "url";
}

Hierarchy (View Summary)

Index

Properties

chi +
interface FunctionURLToken {
    chi: (StringToken | CommentToken | UrlToken)[];
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: UrlFunctionTokenType;
    val: "url";
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val: "url"

Interface GreaterThanOrEqualToken

Greater than or equal token

-
interface GreaterThanOrEqualToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: GteTokenType;
}

Hierarchy (View Summary)

Index

Properties

interface GreaterThanOrEqualToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: GteTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface GreaterThanToken

Greater than token

-
interface GreaterThanToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: GtTokenType;
}

Hierarchy (View Summary)

Index

Properties

interface GreaterThanToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: GtTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface GridTemplateFuncToken

Grid template function token

-
interface GridTemplateFuncToken {
    chi: Token[];
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: GridTemplateFuncTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

chi +
interface GridTemplateFuncToken {
    chi: Token[];
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: GridTemplateFuncTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

chi: Token[]
loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val: string

Interface HashToken

Hash token

-
interface HashToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: HashTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

interface HashToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: HashTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val: string

Interface IdentListToken

Ident list token

-
interface IdentListToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: IdenListTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

interface IdentListToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: IdenListTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val: string

Interface IdentToken

Ident token

-
interface IdentToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: IdenTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

interface IdentToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: IdenTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val: string

Interface ImportantToken

Important token

-
interface ImportantToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: ImportantTokenType;
}

Hierarchy (View Summary)

Index

Properties

interface ImportantToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: ImportantTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface IncludeMatchToken

Include match token

-
interface IncludeMatchToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: IncludeMatchTokenType;
}

Hierarchy (View Summary)

Index

Properties

interface IncludeMatchToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: IncludeMatchTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface InvalidAttrToken

Invalid attribute token

-
interface InvalidAttrToken {
    chi: Token[];
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: InvalidAttrTokenType;
}

Hierarchy (View Summary)

Index

Properties

chi +
interface InvalidAttrToken {
    chi: Token[];
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: InvalidAttrTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

chi: Token[]
loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface InvalidClassSelectorToken

Invalid class selector token

-
interface InvalidClassSelectorToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: InvalidClassSelectorTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

interface InvalidClassSelectorToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: InvalidClassSelectorTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val: string

Interface LengthToken

Length token

-
interface LengthToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: LengthTokenType;
    unit: string;
    val: number | FractionToken;
}

Hierarchy (View Summary)

Index

Properties

interface LengthToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: LengthTokenType;
    unit: string;
    val: number | FractionToken;
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
unit: string
val: number | FractionToken

Interface LessThanOrEqualToken

Less than or equal token

-
interface LessThanOrEqualToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: LteTokenType;
}

Hierarchy (View Summary)

Index

Properties

interface LessThanOrEqualToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: LteTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface LessThanToken

Less than token

-
interface LessThanToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: LtTokenType;
}

Hierarchy (View Summary)

Index

Properties

interface LessThanToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: LtTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface ListToken

List token

-
interface ListToken {
    chi: Token[];
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: ListToken;
}

Hierarchy (View Summary)

Index

Properties

chi +
interface ListToken {
    chi: Token[];
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: ListToken;
}

Hierarchy (View Summary)

Index

Properties

Properties

chi: Token[]
loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface LiteralToken

Literal token

-
interface LiteralToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: LiteralTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

interface LiteralToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: LiteralTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val: string

Interface Location

token or node location

-
interface Location {
    end: Position;
    src: string;
    sta: Position;
}
Index

Properties

end +
interface Location {
    end: Position;
    src: string;
    sta: Position;
}
Index

Properties

Properties

end position

-
src: string

source file

-

start position

-

Interface MatchExpressionToken

Match expression token

-
interface MatchExpressionToken {
    attr?: "s" | "i";
    l: Token;
    loc?: Location;
    op:
        | IncludeMatchToken
        | StartMatchToken
        | EndMatchToken
        | ContainMatchToken
        | DashMatchToken
        | EqualMatchToken;
    parent?: any;
    r: Token;
    tokens?: Token[]
    | null;
    typ: MatchExpressionTokenType;
}

Hierarchy (View Summary)

Index

Properties

interface MatchExpressionToken {
    attr?: "s" | "i";
    l: Token;
    loc?: Location;
    op:
        | IncludeMatchToken
        | StartMatchToken
        | EndMatchToken
        | ContainMatchToken
        | DashMatchToken
        | EqualMatchToken;
    parent?: any;
    r: Token;
    tokens?: Token[]
    | null;
    typ: MatchExpressionTokenType;
}

Hierarchy (View Summary)

Index

Properties

attr? l loc? op @@ -165,11 +165,11 @@ r tokens? typ -

Properties

attr?: "s" | "i"
loc?: Location

location info

-
op:
    | IncludeMatchToken
    | StartMatchToken
    | EndMatchToken
    | ContainMatchToken
    | DashMatchToken
    | EqualMatchToken
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface MatchedSelectorInternal

matched selector object

-
interface MatchedSelector {
    eq: boolean;
    match: string[][];
    selector1: string[][];
    selector2: string[][];
}
Index

Properties

eq +
interface MatchedSelector {
    eq: boolean;
    match: string[][];
    selector1: string[][];
    selector2: string[][];
}
Index

Properties

eq: boolean

selectors partially match

-
match: string[][]

matched selector

-
selector1: string[][]

selector 1

-
selector2: string[][]

selector 2

-

Interface MediaFeatureAndToken

Media feature and token

-
interface MediaFeatureAndToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: MediaFeatureAndTokenType;
}

Hierarchy (View Summary)

Index

Properties

interface MediaFeatureAndToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: MediaFeatureAndTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface MediaFeatureNotToken

Media feature not token

-
interface MediaFeatureNotToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: MediaFeatureNotTokenType;
    val: Token;
}

Hierarchy (View Summary)

Index

Properties

interface MediaFeatureNotToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: MediaFeatureNotTokenType;
    val: Token;
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val: Token

Interface MediaFeatureOnlyToken

Media feature only token

-
interface MediaFeatureOnlyToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: MediaFeatureOnlyTokenType;
    val: Token;
}

Hierarchy (View Summary)

Index

Properties

interface MediaFeatureOnlyToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: MediaFeatureOnlyTokenType;
    val: Token;
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val: Token

Interface MediaFeatureOrToken

Media feature or token

-
interface MediaFeatureOrToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: MediaFeatureOrTokenType;
}

Hierarchy (View Summary)

Index

Properties

interface MediaFeatureOrToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: MediaFeatureOrTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface MediaFeatureToken

Media feature token

-
interface MediaFeatureToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: MediaFeatureTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

interface MediaFeatureToken {
    loc?: Location;
    parent?: any;
    tokens?: Token[] | null;
    typ: MediaFeatureTokenType;
    val: string;
}

Hierarchy (View Summary)

Index

Properties

loc?: Location

location info

-
parent?: any

parent node

-
tokens?: Token[] | null

prelude or selector tokens

-

token type

-
val: string

Interface MediaQueryConditionToken

Media query condition token

-
interface MediaQueryConditionToken {
    l: Token;
    loc?: Location;
    op:
        | ColonToken
        | LessThanToken
        | LessThanOrEqualToken
        | GreaterThanToken
        | GreaterThanOrEqualToken;
    parent?: any;
    r: Token[];
    tokens?: Token[]
    | null;
    typ: MediaQueryConditionTokenType;
}

Hierarchy (View Summary)

Index

Properties

l +
interface MediaQueryConditionToken {
    l: Token;
    loc?: Location;
    op:
        | ColonToken
        | LessThanToken
        | LessThanOrEqualToken
        | GreaterThanToken
        | GreaterThanOrEqualToken;
    parent?: any;
    r: Token[];
    tokens?: Token[]
    | null;
    typ: MediaQueryConditionTokenType;
}

Hierarchy (View Summary)

Index

Properties

Properties

loc?: Location

location info

-
parent?: any

parent node

-
r: Token[]
tokens?: Token[] | null

prelude or selector tokens

-

token type

-

Interface MinifyFeatureInternal

minify feature

-
interface MinifyFeature {
    accept?: Set<EnumToken>;
    ordering: number;
    processMode: FeatureWalkMode;
    register: (options: ParserOptions | MinifyFeatureOptions) => void;
    run: (
        ast: AstAtRule | AstRule,
        options: ParserOptions,
        parent: AstAtRule | AstStyleSheet | AstRule,
        context: { [key: string]: any },
        mode: FeatureWalkMode,
    ) => any;
}
Index

Properties

interface MinifyFeature {
    accept?: Set<EnumToken>;
    ordering: number;
    processMode: FeatureWalkMode;
    register: (options: ParserOptions | MinifyFeatureOptions) => void;
    run: (
        ast: AstAtRule | AstRule,
        options: ParserOptions,
        parent: AstAtRule | AstStyleSheet | AstRule,
        context: { [key: string]: any },
        mode: FeatureWalkMode,
    ) => any;
}
Index

Properties

accept?: Set<EnumToken>

accepted tokens

-
ordering: number

ordering

-
processMode: FeatureWalkMode

process mode

-
register: (options: ParserOptions | MinifyFeatureOptions) => void

register feature

-
run: (
    ast: AstAtRule | AstRule,
    options: ParserOptions,
    parent: AstAtRule | AstStyleSheet | AstRule,
    context: { [key: string]: any },
    mode: FeatureWalkMode,
) => any

run feature

-

Interface MinifyFeatureOptionsInternal

minify feature options

-

Hierarchy (View Summary)

Interface MinifyOptions

minify options

-
interface MinifyOptions {
    computeCalcExpression?: boolean;
    computeShorthand?: boolean;
    computeTransform?: boolean;
    inlineCssVariables?: boolean;
    minify?: boolean;
    nestingRules?: boolean;
    parseColor?: boolean;
    pass?: number;
    removeDuplicateDeclarations?: string | boolean | string[];
    removeEmpty?: boolean;
    removePrefix?: boolean;
}

Hierarchy (View Summary)

Index

Properties

interface MinifyOptions {
    computeCalcExpression?: boolean;
    computeShorthand?: boolean;
    computeTransform?: boolean;
    inlineCssVariables?: boolean;
    minify?: boolean;
    nestingRules?: boolean;
    parseColor?: boolean;
    pass?: number;
    removeDuplicateDeclarations?: string | boolean | string[];
    removeEmpty?: boolean;
    removePrefix?: boolean;
}

Hierarchy (View Summary)

Index

Properties

computeCalcExpression?: boolean

compute math functions see supported functions mathFuncs

-
computeShorthand?: boolean

compute shorthand properties

-
computeTransform?: boolean

compute transform functions +

computeShorthand?: boolean

compute shorthand properties

+
computeTransform?: boolean

compute transform functions see supported functions transformFunctions

-
inlineCssVariables?: boolean

inline css variables

-
minify?: boolean

enable minification

-
nestingRules?: boolean

generate nested rules

-
parseColor?: boolean

parse color tokens

-
pass?: number

define minification passes.

-
removeDuplicateDeclarations?: string | boolean | string[]

remove duplicate declarations from the same rule. if passed as a string array, duplicated declarations are removed, except for those in the array

+
inlineCssVariables?: boolean

inline css variables

+
minify?: boolean

enable minification

+
nestingRules?: boolean

generate nested rules

+
parseColor?: boolean

parse color tokens

+
pass?: number

define minification passes.

+
removeDuplicateDeclarations?: string | boolean | string[]

remove duplicate declarations from the same rule. if passed as a string array, duplicated declarations are removed, except for those in the array


import {transform} from '@tbela99/css-parser';

const css = `

.table {

width: 100%;
width: calc(100% + 40px);
margin-left: 20px;
margin-left: min(100% , 20px)
}

`;
const result = await transform(css, {

beautify: true,
validation: true,
removeDuplicateDeclarations: ['width']
}
);

console.log(result.code);
-
removeEmpty?: boolean

remove empty ast nodes

-
removePrefix?: boolean

remove css prefix

-

Interface ModuleOptions

interface ModuleOptions {
    filePath?: string;
    generateScopedName?: (
        localName: string,
        filePath: string,
        pattern: string,
        hashLength?: number,
    ) => string | Promise<string>;
    hashLength?: number;
    naming?: ModuleCaseTransformEnum;
    pattern?: string;
    scoped?: boolean | ModuleScopeEnumOptions;
}
Index

Properties

filePath? +

Interface ModuleOptions

interface ModuleOptions {
    filePath?: string;
    generateScopedName?: (
        localName: string,
        filePath: string,
        pattern: string,
        hashLength?: number,
    ) => string | Promise<string>;
    hashLength?: number;
    naming?: ModuleCaseTransformEnum;
    pattern?: string;
    scoped?: boolean | ModuleScopeEnumOptions;
}
Index

Properties

filePath?: string

module output file path. it is used to generate the scoped name. if not provided, options.src will be used

-
generateScopedName?: (
    localName: string,
    filePath: string,
    pattern: string,
    hashLength?: number,
) => string | Promise<string>

optional function to generate scoped name

+
generateScopedName?: (
    localName: string,
    filePath: string,
    pattern: string,
    hashLength?: number,
) => string | Promise<string>

optional function to generate scoped name

Type Declaration

    • (
          localName: string,
          filePath: string,
          pattern: string,
          hashLength?: number,
      ): string | Promise<string>
    • Parameters

      Returns string | Promise<string>

hashLength?: number

generated scope hash length. the default is 5

-

optional. function change the case of the scoped name and the class mapping

+
  • OptionalhashLength: number
  • Returns string | Promise<string>

    hashLength?: number

    generated scope hash length. the default is 5

    +

    optional. function change the case of the scoped name and the class mapping

    -
    pattern?: string

    the pattern used to generate scoped names. the supported placeholders are:

    +
    pattern?: string

    the pattern used to generate scoped names. the supported placeholders are:

    • name: the file base name without the extension
    • hash: the file path hash
    • @@ -184,19 +184,19 @@
    • ext: the file extension

    the pattern can optionally have a maximum number of characters:

    -
    pattern: '[local:2]-[hash:5]'
    +
    pattern: '[local:2]-[hash:5]'
     

    the hash pattern can take an algorithm, a maximum number of characters or both:

    -
    pattern: '[local]-[hash:base64:5]'
    +
    pattern: '[local]-[hash:base64:5]'
     

    or

    -
    pattern: '[local]-[hash:5]'
    +
    pattern: '[local]-[hash:5]'
     

    or

    -
    pattern: '[local]-[hash:sha1]'
    +
    pattern: '[local]-[hash:sha1]'
     

    supported hash algorithms are:

    @@ -213,11 +213,11 @@

    generated css

    -
    .className-b629f {
    background: red;
    color: #ff0
    }
    .subClass-a0c35 {
    background: blue
    } +
    .className-b629f {
    background: red;
    color: #ff0
    }
    .subClass-a0c35 {
    background: blue
    }
    -
    scoped?: boolean | ModuleScopeEnumOptions

    use local scope vs global scope

    -

    Interface MulToken

    Mul token

    -
    interface MulToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: Mul;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface MulToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: Mul;
    }

    Hierarchy (View Summary)

    Index

    Properties

    Properties

    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -
    typ: Mul

    token type

    -

    Interface NameSpaceAttributeToken

    Name space attribute token

    -
    interface NameSpaceAttributeToken {
        l?: Token;
        loc?: Location;
        parent?: any;
        r: Token;
        tokens?: Token[] | null;
        typ: NameSpaceAttributeTokenType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    l? +
    interface NameSpaceAttributeToken {
        l?: Token;
        loc?: Location;
        parent?: any;
        r: Token;
        tokens?: Token[] | null;
        typ: NameSpaceAttributeTokenType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    Properties

    l?: Token
    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -

    Interface NestingSelectorToken

    Nesting selector token

    -
    interface NestingSelectorToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: NestingSelectorTokenType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface NestingSelectorToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: NestingSelectorTokenType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    Properties

    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -

    Interface NextSiblingCombinatorToken

    Next sibling combinator token

    -
    interface NextSiblingCombinatorToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: NextSiblingCombinatorTokenType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface NextSiblingCombinatorToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: NextSiblingCombinatorTokenType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    Properties

    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -

    Interface NumberToken

    Number token

    -
    interface NumberToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: NumberTokenType;
        val: number | FractionToken;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface NumberToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: NumberTokenType;
        val: number | FractionToken;
    }

    Hierarchy (View Summary)

    Index

    Properties

    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -
    val: number | FractionToken

    Interface ParensEndToken

    Parenthesis end token

    -
    interface ParensEndToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: EndParensTokenType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface ParensEndToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: EndParensTokenType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    Properties

    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -

    Interface ParensStartToken

    Parenthesis start token

    -
    interface ParensStartToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: StartParensTokenType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface ParensStartToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: StartParensTokenType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    Properties

    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -

    Interface ParensToken

    Parenthesis token

    -
    interface ParensToken {
        chi: Token[];
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: ParensTokenType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    chi +
    interface ParensToken {
        chi: Token[];
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: ParensTokenType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    Properties

    chi: Token[]
    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -

    Interface ParseInfo

    parse info

    -
    interface ParseInfo {
        buffer: string;
        currentPosition: Position;
        offset: number;
        position: Position;
        stream: string;
    }
    Index

    Properties

    interface ParseInfo {
        buffer: string;
        currentPosition: Position;
        offset: number;
        position: Position;
        stream: string;
    }
    Index

    Properties

    buffer: string

    read buffer

    -
    currentPosition: Position

    current parsing position

    -
    offset: number

    offset

    -
    position: Position

    last token position

    -
    stream: string

    stream

    -

    Interface ParseResult

    parse result object

    -
    interface ParseResult {
        ast: AstStyleSheet;
        cssModuleVariables?: Record<string, CssVariableToken>;
        errors: ErrorDescription[];
        importMapping?: Record<string, Record<string, string>>;
        mapping?: Record<string, string>;
        stats: ParseResultStats;
    }

    Hierarchy (View Summary)

    Index

    Properties

    ast +
    interface ParseResult {
        ast: AstStyleSheet;
        cssModuleVariables?: Record<string, CssVariableToken>;
        errors: ErrorDescription[];
        importMapping?: Record<string, Record<string, string>>;
        mapping?: Record<string, string>;
        stats: ParseResultStats;
    }

    Hierarchy (View Summary)

    Index

    Properties

    parsed ast tree

    -
    cssModuleVariables?: Record<string, CssVariableToken>

    parse errors

    -
    importMapping?: Record<string, Record<string, string>>
    mapping?: Record<string, string>

    css module mapping

    -

    parse stats

    -

    Interface ParseResultStats

    parse result stats object

    -
    interface ParseResultStats {
        bytesIn: number;
        importedBytesIn: number;
        imports: ParseResultStats[];
        minify: string;
        module?: string;
        nodesCount: number;
        parse: string;
        src: string;
        tokensCount: number;
        total: string;
    }
    Index

    Properties

    interface ParseResultStats {
        bytesIn: number;
        importedBytesIn: number;
        imports: ParseResultStats[];
        minify: string;
        module?: string;
        nodesCount: number;
        parse: string;
        src: string;
        tokensCount: number;
        total: string;
    }
    Index

    Properties

    Properties

    bytesIn: number

    bytes read

    -
    importedBytesIn: number

    bytes read from imported files

    -
    imports: ParseResultStats[]

    imported files stats

    -
    minify: string

    minify processing time

    -
    module?: string

    module processing time

    -
    nodesCount: number

    nodes count

    -
    parse: string

    parse processing time

    -
    src: string

    source file

    -
    tokensCount: number

    tokens count

    -
    total: string

    total time

    -

    Interface ParseTokenOptions

    parse token options

    -
    interface ParseTokenOptions {
        computeCalcExpression?: boolean;
        computeShorthand?: boolean;
        computeTransform?: boolean;
        cwd?: string;
        expandNestingRules?: boolean;
        inlineCssVariables?: boolean;
        lenient?: boolean;
        load?: (url: string, currentUrl?: string, asStream?: boolean) => LoadResult;
        minify?: boolean;
        module?:
            | boolean
            | ModuleCaseTransformEnum
            | ModuleScopeEnumOptions
            | ModuleOptions;
        nestingRules?: boolean;
        parseColor?: boolean;
        pass?: number;
        removeCharset?: boolean;
        removeDuplicateDeclarations?: string
        | boolean
        | string[];
        removeEmpty?: boolean;
        removePrefix?: boolean;
        resolve?: (
            url: string,
            currentUrl: string,
            currentWorkingDirectory?: string,
        ) => { absolute: string; relative: string };
        resolveImport?: boolean;
        resolveUrls?: boolean;
        signal?: AbortSignal;
        sourcemap?: boolean | "inline";
        src?: string;
        validation?: boolean | ValidationLevel;
        visitor?: VisitorNodeMap | VisitorNodeMap[];
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface ParseTokenOptions {
        computeCalcExpression?: boolean;
        computeShorthand?: boolean;
        computeTransform?: boolean;
        cwd?: string;
        expandNestingRules?: boolean;
        inlineCssVariables?: boolean;
        lenient?: boolean;
        load?: (
            url: string,
            currentDirectory: string,
            responseType?: boolean | ResponseType,
        ) => Promise<
            string
            | ArrayBuffer
            | ReadableStream<Uint8Array<ArrayBufferLike>>,
        >;
        minify?: boolean;
        module?:
            | boolean
            | ModuleCaseTransformEnum
            | ModuleScopeEnumOptions
            | ModuleOptions;
        nestingRules?: boolean;
        parseColor?: boolean;
        pass?: number;
        removeCharset?: boolean;
        removeDuplicateDeclarations?: string
        | boolean
        | string[];
        removeEmpty?: boolean;
        removePrefix?: boolean;
        resolve?: (
            url: string,
            currentUrl: string,
            currentWorkingDirectory?: string,
        ) => { absolute: string; relative: string };
        resolveImport?: boolean;
        resolveUrls?: boolean;
        signal?: AbortSignal;
        sourcemap?: boolean | "inline";
        src?: string;
        validation?: boolean | ValidationLevel;
        visitor?: VisitorNodeMap | VisitorNodeMap[];
    }

    Hierarchy (View Summary)

    Index

    Properties

    computeCalcExpression?: boolean

    compute math functions see supported functions mathFuncs

    -
    computeShorthand?: boolean

    compute shorthand properties

    -
    computeTransform?: boolean

    compute transform functions +

    computeShorthand?: boolean

    compute shorthand properties

    +
    computeTransform?: boolean

    compute transform functions see supported functions transformFunctions

    -
    cwd?: string

    current working directory

    -
    expandNestingRules?: boolean

    expand nested rules

    -
    inlineCssVariables?: boolean

    inline css variables

    -
    lenient?: boolean

    lenient validation. retain nodes that failed validation

    -
    load?: (url: string, currentUrl?: string, asStream?: boolean) => LoadResult

    url and file loader

    -
    minify?: boolean

    enable minification

    -
    module?:
        | boolean
        | ModuleCaseTransformEnum
        | ModuleScopeEnumOptions
        | ModuleOptions

    css modules options

    -
    nestingRules?: boolean

    generate nested rules

    -
    parseColor?: boolean

    parse color tokens

    -
    pass?: number

    define minification passes.

    -
    removeCharset?: boolean

    remove at-rule charset

    -
    removeDuplicateDeclarations?: string | boolean | string[]

    remove duplicate declarations from the same rule. if passed as a string array, duplicated declarations are removed, except for those in the array

    +
    cwd?: string

    current working directory

    +
    expandNestingRules?: boolean

    expand nested rules

    +
    inlineCssVariables?: boolean

    inline css variables

    +
    lenient?: boolean

    lenient validation. retain nodes that failed validation

    +
    load?: (
        url: string,
        currentDirectory: string,
        responseType?: boolean | ResponseType,
    ) => Promise<
        string
        | ArrayBuffer
        | ReadableStream<Uint8Array<ArrayBufferLike>>,
    >

    url and file loader

    +
    minify?: boolean

    enable minification

    +
    module?:
        | boolean
        | ModuleCaseTransformEnum
        | ModuleScopeEnumOptions
        | ModuleOptions

    css modules options

    +
    nestingRules?: boolean

    generate nested rules

    +
    parseColor?: boolean

    parse color tokens

    +
    pass?: number

    define minification passes.

    +
    removeCharset?: boolean

    remove at-rule charset

    +
    removeDuplicateDeclarations?: string | boolean | string[]

    remove duplicate declarations from the same rule. if passed as a string array, duplicated declarations are removed, except for those in the array


    import {transform} from '@tbela99/css-parser';

    const css = `

    .table {

    width: 100%;
    width: calc(100% + 40px);
    margin-left: 20px;
    margin-left: min(100% , 20px)
    }

    `;
    const result = await transform(css, {

    beautify: true,
    validation: true,
    removeDuplicateDeclarations: ['width']
    }
    );

    console.log(result.code);
    -
    removeEmpty?: boolean

    remove empty ast nodes

    -
    removePrefix?: boolean

    remove css prefix

    -
    resolve?: (
        url: string,
        currentUrl: string,
        currentWorkingDirectory?: string,
    ) => { absolute: string; relative: string }

    url and path resolver

    -
    resolveImport?: boolean

    resolve import

    -
    resolveUrls?: boolean

    resolve urls

    -
    signal?: AbortSignal

    abort signal

    +
    removeEmpty?: boolean

    remove empty ast nodes

    +
    removePrefix?: boolean

    remove css prefix

    +
    resolve?: (
        url: string,
        currentUrl: string,
        currentWorkingDirectory?: string,
    ) => { absolute: string; relative: string }

    url and path resolver

    +
    resolveImport?: boolean

    resolve import

    +
    resolveUrls?: boolean

    resolve urls

    +
    signal?: AbortSignal

    abort signal

    Example: abort after 10 seconds

    -

    const result = await parse(cssString, {
    signal: AbortSignal.timeout(10000)
    });
    +

    const result = await parse(cssString, {
    signal: AbortSignal.timeout(10000)
    });
    -
    sourcemap?: boolean | "inline"

    include sourcemap in the ast. sourcemap info is always generated

    -
    src?: string

    source file to be used for sourcemap

    -
    validation?: boolean | ValidationLevel

    enable css validation

    +
    sourcemap?: boolean | "inline"

    include sourcemap in the ast. sourcemap info is always generated

    +
    src?: string

    source file to be used for sourcemap

    +
    validation?: boolean | ValidationLevel

    enable css validation

    see ValidationLevel

    -

    node visitor +

    node visitor VisitorNodeMap[]

    -

    Interface ParserOptions

    parser options

    -
    interface ParserOptions {
        computeCalcExpression?: boolean;
        computeShorthand?: boolean;
        computeTransform?: boolean;
        cwd?: string;
        expandNestingRules?: boolean;
        inlineCssVariables?: boolean;
        lenient?: boolean;
        load?: (url: string, currentUrl?: string, asStream?: boolean) => LoadResult;
        minify?: boolean;
        module?:
            | boolean
            | ModuleCaseTransformEnum
            | ModuleScopeEnumOptions
            | ModuleOptions;
        nestingRules?: boolean;
        parseColor?: boolean;
        pass?: number;
        removeCharset?: boolean;
        removeDuplicateDeclarations?: string
        | boolean
        | string[];
        removeEmpty?: boolean;
        removePrefix?: boolean;
        resolve?: (
            url: string,
            currentUrl: string,
            currentWorkingDirectory?: string,
        ) => { absolute: string; relative: string };
        resolveImport?: boolean;
        resolveUrls?: boolean;
        signal?: AbortSignal;
        sourcemap?: boolean | "inline";
        src?: string;
        validation?: boolean | ValidationLevel;
        visitor?: VisitorNodeMap | VisitorNodeMap[];
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface ParserOptions {
        computeCalcExpression?: boolean;
        computeShorthand?: boolean;
        computeTransform?: boolean;
        cwd?: string;
        expandNestingRules?: boolean;
        inlineCssVariables?: boolean;
        lenient?: boolean;
        load?: (
            url: string,
            currentDirectory: string,
            responseType?: boolean | ResponseType,
        ) => Promise<
            string
            | ArrayBuffer
            | ReadableStream<Uint8Array<ArrayBufferLike>>,
        >;
        minify?: boolean;
        module?:
            | boolean
            | ModuleCaseTransformEnum
            | ModuleScopeEnumOptions
            | ModuleOptions;
        nestingRules?: boolean;
        parseColor?: boolean;
        pass?: number;
        removeCharset?: boolean;
        removeDuplicateDeclarations?: string
        | boolean
        | string[];
        removeEmpty?: boolean;
        removePrefix?: boolean;
        resolve?: (
            url: string,
            currentUrl: string,
            currentWorkingDirectory?: string,
        ) => { absolute: string; relative: string };
        resolveImport?: boolean;
        resolveUrls?: boolean;
        signal?: AbortSignal;
        sourcemap?: boolean | "inline";
        src?: string;
        validation?: boolean | ValidationLevel;
        visitor?: VisitorNodeMap | VisitorNodeMap[];
    }

    Hierarchy (View Summary)

    Index

    Properties

    computeCalcExpression?: boolean

    compute math functions see supported functions mathFuncs

    -
    computeShorthand?: boolean

    compute shorthand properties

    -
    computeTransform?: boolean

    compute transform functions +

    computeShorthand?: boolean

    compute shorthand properties

    +
    computeTransform?: boolean

    compute transform functions see supported functions transformFunctions

    -
    cwd?: string

    current working directory

    -
    expandNestingRules?: boolean

    expand nested rules

    -
    inlineCssVariables?: boolean

    inline css variables

    -
    lenient?: boolean

    lenient validation. retain nodes that failed validation

    -
    load?: (url: string, currentUrl?: string, asStream?: boolean) => LoadResult

    url and file loader

    -
    minify?: boolean

    enable minification

    -
    module?:
        | boolean
        | ModuleCaseTransformEnum
        | ModuleScopeEnumOptions
        | ModuleOptions

    css modules options

    -
    nestingRules?: boolean

    generate nested rules

    -
    parseColor?: boolean

    parse color tokens

    -
    pass?: number

    define minification passes.

    -
    removeCharset?: boolean

    remove at-rule charset

    -
    removeDuplicateDeclarations?: string | boolean | string[]

    remove duplicate declarations from the same rule. if passed as a string array, duplicated declarations are removed, except for those in the array

    +
    cwd?: string

    current working directory

    +
    expandNestingRules?: boolean

    expand nested rules

    +
    inlineCssVariables?: boolean

    inline css variables

    +
    lenient?: boolean

    lenient validation. retain nodes that failed validation

    +
    load?: (
        url: string,
        currentDirectory: string,
        responseType?: boolean | ResponseType,
    ) => Promise<
        string
        | ArrayBuffer
        | ReadableStream<Uint8Array<ArrayBufferLike>>,
    >

    url and file loader

    +
    minify?: boolean

    enable minification

    +
    module?:
        | boolean
        | ModuleCaseTransformEnum
        | ModuleScopeEnumOptions
        | ModuleOptions

    css modules options

    +
    nestingRules?: boolean

    generate nested rules

    +
    parseColor?: boolean

    parse color tokens

    +
    pass?: number

    define minification passes.

    +
    removeCharset?: boolean

    remove at-rule charset

    +
    removeDuplicateDeclarations?: string | boolean | string[]

    remove duplicate declarations from the same rule. if passed as a string array, duplicated declarations are removed, except for those in the array


    import {transform} from '@tbela99/css-parser';

    const css = `

    .table {

    width: 100%;
    width: calc(100% + 40px);
    margin-left: 20px;
    margin-left: min(100% , 20px)
    }

    `;
    const result = await transform(css, {

    beautify: true,
    validation: true,
    removeDuplicateDeclarations: ['width']
    }
    );

    console.log(result.code);
    -
    removeEmpty?: boolean

    remove empty ast nodes

    -
    removePrefix?: boolean

    remove css prefix

    -
    resolve?: (
        url: string,
        currentUrl: string,
        currentWorkingDirectory?: string,
    ) => { absolute: string; relative: string }

    url and path resolver

    -
    resolveImport?: boolean

    resolve import

    -
    resolveUrls?: boolean

    resolve urls

    -
    signal?: AbortSignal

    abort signal

    +
    removeEmpty?: boolean

    remove empty ast nodes

    +
    removePrefix?: boolean

    remove css prefix

    +
    resolve?: (
        url: string,
        currentUrl: string,
        currentWorkingDirectory?: string,
    ) => { absolute: string; relative: string }

    url and path resolver

    +
    resolveImport?: boolean

    resolve import

    +
    resolveUrls?: boolean

    resolve urls

    +
    signal?: AbortSignal

    abort signal

    Example: abort after 10 seconds

    -

    const result = await parse(cssString, {
    signal: AbortSignal.timeout(10000)
    });
    +

    const result = await parse(cssString, {
    signal: AbortSignal.timeout(10000)
    });
    -
    sourcemap?: boolean | "inline"

    include sourcemap in the ast. sourcemap info is always generated

    -
    src?: string

    source file to be used for sourcemap

    -
    validation?: boolean | ValidationLevel

    enable css validation

    +
    sourcemap?: boolean | "inline"

    include sourcemap in the ast. sourcemap info is always generated

    +
    src?: string

    source file to be used for sourcemap

    +
    validation?: boolean | ValidationLevel

    enable css validation

    see ValidationLevel

    -

    node visitor +

    node visitor VisitorNodeMap[]

    -

    Interface PercentageToken

    Percentage token

    -
    interface PercentageToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: PercentageTokenType;
        val: number | FractionToken;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface PercentageToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: PercentageTokenType;
        val: number | FractionToken;
    }

    Hierarchy (View Summary)

    Index

    Properties

    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -
    val: number | FractionToken

    Interface Position

    Position

    -
    interface Position {
        col: number;
        ind: number;
        lin: number;
    }
    Index

    Properties

    col +
    interface Position {
        col: number;
        ind: number;
        lin: number;
    }
    Index

    Properties

    Properties

    col: number

    column number

    -
    ind: number

    index in the source

    -
    lin: number

    line number

    -

    Interface PropertyListOptions

    interface PropertyListOptions {
        computeShorthand?: boolean;
        removeDuplicateDeclarations?: string | boolean | string[];
    }

    Hierarchy (View Summary)

    Index

    Properties

    computeShorthand? +

    Interface PropertyListOptions

    interface PropertyListOptions {
        computeShorthand?: boolean;
        removeDuplicateDeclarations?: string | boolean | string[];
    }

    Hierarchy (View Summary)

    Index

    Properties

    computeShorthand?: boolean
    removeDuplicateDeclarations?: string | boolean | string[]

    Interface PropertyMapType

    interface PropertyMapType {
        constraints?: { [key: string]: { [key: string]: any } };
        default: string[];
        keywords: string[];
        mapping?: Record<string, string>;
        multiple?: boolean;
        prefix?: {
            typ:
                | "toString"
                | "toLocaleString"
                | "toFixed"
                | "toExponential"
                | "toPrecision"
                | "valueOf";
            val: string;
        };
        previous?: string;
        required?: boolean;
        separator?: {
            typ: | "toString"
            | "toLocaleString"
            | "toFixed"
            | "toExponential"
            | "toPrecision"
            | "valueOf";
        };
        types: string[];
    }
    Index

    Properties

    constraints? +

    Interface PropertyMapType

    interface PropertyMapType {
        constraints?: { [key: string]: { [key: string]: any } };
        default: string[];
        keywords: string[];
        mapping?: Record<string, string>;
        multiple?: boolean;
        prefix?: {
            typ:
                | "toString"
                | "toLocaleString"
                | "toFixed"
                | "toExponential"
                | "toPrecision"
                | "valueOf";
            val: string;
        };
        previous?: string;
        required?: boolean;
        separator?: {
            typ: | "toString"
            | "toLocaleString"
            | "toFixed"
            | "toExponential"
            | "toPrecision"
            | "valueOf";
        };
        types: string[];
    }
    Index

    Properties

    constraints?: { [key: string]: { [key: string]: any } }
    default: string[]
    keywords: string[]
    mapping?: Record<string, string>
    multiple?: boolean
    prefix?: {
        typ:
            | "toString"
            | "toLocaleString"
            | "toFixed"
            | "toExponential"
            | "toPrecision"
            | "valueOf";
        val: string;
    }
    previous?: string
    required?: boolean
    separator?: {
        typ:
            | "toString"
            | "toLocaleString"
            | "toFixed"
            | "toExponential"
            | "toPrecision"
            | "valueOf";
    }
    types: string[]

    Interface PropertySetType

    Indexable

    Interface PropertySetType

    Indexable

    Interface PropertyType

    interface PropertyType {
        shorthand: string;
    }
    Index

    Properties

    Properties

    shorthand: string

    Interface PropertyType

    interface PropertyType {
        shorthand: string;
    }
    Index

    Properties

    Properties

    shorthand: string

    Interface PseudoClassFunctionToken

    Pseudo class function token

    -
    interface PseudoClassFunctionToken {
        chi: Token[];
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: PseudoClassFuncTokenType;
        val: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    chi +
    interface PseudoClassFunctionToken {
        chi: Token[];
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: PseudoClassFuncTokenType;
        val: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    chi: Token[]
    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -
    val: string

    Interface PseudoClassToken

    Pseudo class token

    -
    interface PseudoClassToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: PseudoClassTokenType;
        val: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface PseudoClassToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: PseudoClassTokenType;
        val: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -
    val: string

    Interface PseudoElementToken

    Pseudo element token

    -
    interface PseudoElementToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: PseudoElementTokenType;
        val: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface PseudoElementToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: PseudoElementTokenType;
        val: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -
    val: string

    Interface PseudoPageToken

    Pseudo page token

    -
    interface PseudoPageToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: PseudoPageTokenType;
        val: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface PseudoPageToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: PseudoPageTokenType;
        val: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -
    val: string

    Interface RenderOptions

    ast node render options

    -
    interface RenderOptions {
        beautify?: boolean;
        convertColor?: boolean | ColorType;
        cwd?: string;
        expandNestingRules?: boolean;
        indent?: string;
        minify?: boolean;
        newLine?: string;
        output?: string;
        preserveLicense?: boolean;
        removeComments?: boolean;
        removeEmpty?: boolean;
        resolve?: (
            url: string,
            currentUrl: string,
            currentWorkingDirectory?: string,
        ) => ResolvedPath;
        sourcemap?: boolean | "inline";
        withParents?: boolean;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface RenderOptions {
        beautify?: boolean;
        convertColor?: boolean | ColorType;
        cwd?: string;
        expandNestingRules?: boolean;
        indent?: string;
        minify?: boolean;
        newLine?: string;
        output?: string;
        preserveLicense?: boolean;
        removeComments?: boolean;
        removeEmpty?: boolean;
        resolve?: (
            url: string,
            currentUrl: string,
            currentWorkingDirectory?: string,
        ) => ResolvedPath;
        sourcemap?: boolean | "inline";
        withParents?: boolean;
    }

    Hierarchy (View Summary)

    Index

    Properties

    beautify? convertColor? cwd? expandNestingRules? @@ -175,23 +175,23 @@
    const result = await transform(css, {beautify: true});
     
    -
    convertColor?: boolean | ColorType

    convert color to the specified color space. 'true' will convert to HEX

    -
    cwd?: string

    current working directory

    -
    expandNestingRules?: boolean

    expand nesting rules

    -
    indent?: string

    indent string

    -
    minify?: boolean

    minify css values.

    -
    newLine?: string

    new line string

    -
    output?: string

    output file. used for url resolution

    -
    preserveLicense?: boolean

    preserve license comments. license comments are comments that start with /*!

    -
    removeComments?: boolean

    remove comments

    -
    removeEmpty?: boolean

    remove empty nodes. empty nodes are removed by default

    +
    convertColor?: boolean | ColorType

    convert color to the specified color space. 'true' will convert to HEX

    +
    cwd?: string

    current working directory

    +
    expandNestingRules?: boolean

    expand nesting rules

    +
    indent?: string

    indent string

    +
    minify?: boolean

    minify css values.

    +
    newLine?: string

    new line string

    +
    output?: string

    output file. used for url resolution

    +
    preserveLicense?: boolean

    preserve license comments. license comments are comments that start with /*!

    +
    removeComments?: boolean

    remove comments

    +
    removeEmpty?: boolean

    remove empty nodes. empty nodes are removed by default


    const css = `
    @supports selector(:-ms-input-placeholder) {

    :-ms-input-placeholder {

    }
    }`;
    const result = await transform(css, {removeEmpty: false});
    -
    resolve?: (
        url: string,
        currentUrl: string,
        currentWorkingDirectory?: string,
    ) => ResolvedPath

    resolve path

    -
    sourcemap?: boolean | "inline"

    generate sourcemap object. 'inline' will embed it in the css

    -
    withParents?: boolean

    render the node along with its parents

    -

    Interface RenderResult

    render result object

    -
    interface RenderResult {
        code: string;
        errors: ErrorDescription[];
        map?: SourceMap;
        stats: { total: string };
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface RenderResult {
        code: string;
        errors: ErrorDescription[];
        map?: SourceMap;
        stats: { total: string };
    }

    Hierarchy (View Summary)

    Index

    Properties

    Properties

    code: string

    rendered css

    -

    render errors

    -
    map?: SourceMap

    source map

    -
    stats: { total: string }

    render stats

    +

    render errors

    +
    map?: SourceMap

    source map

    +
    stats: { total: string }

    render stats

    Type Declaration

    • total: string

      render time

      -

    Interface ResolutionToken

    Resolution token

    -
    interface ResolutionToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: ResolutionTokenType;
        unit: "x" | "dpi" | "dpcm" | "dppx";
        val: number | FractionToken;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface ResolutionToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: ResolutionTokenType;
        unit: "x" | "dpi" | "dpcm" | "dppx";
        val: number | FractionToken;
    }

    Hierarchy (View Summary)

    Index

    Properties

    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -
    unit: "x" | "dpi" | "dpcm" | "dppx"
    val: number | FractionToken

    Interface ResolvedPathInternal

    resolved path

    -
    interface ResolvedPath {
        absolute: string;
        relative: string;
    }
    Index

    Properties

    interface ResolvedPath {
        absolute: string;
        relative: string;
    }
    Index

    Properties

    Properties

    absolute: string

    absolute path

    -
    relative: string

    relative path

    -

    Interface SemiColonToken

    Semicolon token

    -
    interface SemiColonToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: SemiColonTokenType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface SemiColonToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: SemiColonTokenType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    Properties

    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -

    Interface ShorthandDef

    interface ShorthandDef {
        defaults: string[];
        keywords: string;
        multiple?: boolean;
        pattern: string;
        separator?: string;
        shorthand: string;
    }
    Index

    Properties

    defaults +

    Interface ShorthandDef

    interface ShorthandDef {
        defaults: string[];
        keywords: string;
        multiple?: boolean;
        pattern: string;
        separator?: string;
        shorthand: string;
    }
    Index

    Properties

    defaults: string[]
    keywords: string
    multiple?: boolean
    pattern: string
    separator?: string
    shorthand: string

    Interface ShorthandMapType

    interface ShorthandMapType {
        default: string[];
        keywords: string[];
        mapping?: Record<string, string>;
        multiple?: boolean;
        pattern: string;
        properties: { [property: string]: PropertyMapType };
        separator?: {
            typ:
                | "toString"
                | "toLocaleString"
                | "toFixed"
                | "toExponential"
                | "toPrecision"
                | "valueOf";
            val?: string;
        };
        set?: Record<string, string[]>;
        shorthand: string;
    }
    Index

    Properties

    default +

    Interface ShorthandMapType

    interface ShorthandMapType {
        default: string[];
        keywords: string[];
        mapping?: Record<string, string>;
        multiple?: boolean;
        pattern: string;
        properties: { [property: string]: PropertyMapType };
        separator?: {
            typ:
                | "toString"
                | "toLocaleString"
                | "toFixed"
                | "toExponential"
                | "toPrecision"
                | "valueOf";
            val?: string;
        };
        set?: Record<string, string[]>;
        shorthand: string;
    }
    Index

    Properties

    Properties

    default: string[]
    keywords: string[]
    mapping?: Record<string, string>
    multiple?: boolean
    pattern: string
    properties: { [property: string]: PropertyMapType }
    separator?: {
        typ:
            | "toString"
            | "toLocaleString"
            | "toFixed"
            | "toExponential"
            | "toPrecision"
            | "valueOf";
        val?: string;
    }
    set?: Record<string, string[]>
    shorthand: string

    Interface ShorthandProperties

    interface ShorthandProperties {
        constraints?: any[];
        default: string[];
        keywords: string[];
        mapping?: { [key: string]: any };
        multiple?: boolean;
        prefix?: string;
        required?: boolean;
        types: EnumToken[];
        validation?: { [key: string]: any };
    }
    Index

    Properties

    constraints? +

    Interface ShorthandProperties

    interface ShorthandProperties {
        constraints?: any[];
        default: string[];
        keywords: string[];
        mapping?: { [key: string]: any };
        multiple?: boolean;
        prefix?: string;
        required?: boolean;
        types: EnumToken[];
        validation?: { [key: string]: any };
    }
    Index

    Properties

    constraints?: any[]
    default: string[]
    keywords: string[]
    mapping?: { [key: string]: any }
    multiple?: boolean
    prefix?: string
    required?: boolean
    types: EnumToken[]
    validation?: { [key: string]: any }

    Interface ShorthandPropertyType

    interface ShorthandPropertyType {
        keywords: string[];
        map?: string;
        multiple: boolean;
        properties: string[];
        separator: {
            typ:
                | "toString"
                | "toLocaleString"
                | "toFixed"
                | "toExponential"
                | "toPrecision"
                | "valueOf";
            val: string;
        };
        shorthand: string;
        types: string[];
    }
    Index

    Properties

    keywords +

    Interface ShorthandPropertyType

    interface ShorthandPropertyType {
        keywords: string[];
        map?: string;
        multiple: boolean;
        properties: string[];
        separator: {
            typ:
                | "toString"
                | "toLocaleString"
                | "toFixed"
                | "toExponential"
                | "toPrecision"
                | "valueOf";
            val: string;
        };
        shorthand: string;
        types: string[];
    }
    Index

    Properties

    keywords: string[]
    map?: string
    multiple: boolean
    properties: string[]
    separator: {
        typ:
            | "toString"
            | "toLocaleString"
            | "toFixed"
            | "toExponential"
            | "toPrecision"
            | "valueOf";
        val: string;
    }
    shorthand: string
    types: string[]

    Interface ShorthandType

    interface ShorthandType {
        properties: ShorthandProperties;
        shorthand: string;
    }
    Index

    Properties

    properties +

    Interface ShorthandType

    interface ShorthandType {
        properties: ShorthandProperties;
        shorthand: string;
    }
    Index

    Properties

    Properties

    shorthand: string

    Interface SourceMapObjectInternal

    source map object

    -
    interface SourceMapObject {
        file?: string;
        mappings: string;
        names?: string[];
        sourceRoot?: string;
        sources?: string[];
        sourcesContent?: (string | null)[];
        version: number;
    }
    Index

    Properties

    interface SourceMapObject {
        file?: string;
        mappings: string;
        names?: string[];
        sourceRoot?: string;
        sources?: string[];
        sourcesContent?: (string | null)[];
        version: number;
    }
    Index

    Properties

    file?: string
    mappings: string
    names?: string[]
    sourceRoot?: string
    sources?: string[]
    sourcesContent?: (string | null)[]
    version: number

    Interface StartMatchToken

    Start match token

    -
    interface StartMatchToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: StartMatchTokenType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface StartMatchToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: StartMatchTokenType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    Properties

    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -

    Interface StringToken

    String token

    -
    interface StringToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: StringTokenType;
        val: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface StringToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: StringTokenType;
        val: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -
    val: string

    Interface SubToken

    Sub token

    -
    interface SubToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: Sub;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface SubToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: Sub;
    }

    Hierarchy (View Summary)

    Index

    Properties

    Properties

    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -
    typ: Sub

    token type

    -

    Interface SubsequentCombinatorToken

    Subsequent sibling combinator token

    -
    interface SubsequentCombinatorToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: SubsequentSiblingCombinatorTokenType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface SubsequentCombinatorToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: SubsequentSiblingCombinatorTokenType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    Properties

    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -

    Interface TimeToken

    Time token

    -
    interface TimeToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: TimeTokenType;
        unit: "s" | "ms";
        val: number | FractionToken;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface TimeToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: TimeTokenType;
        unit: "s" | "ms";
        val: number | FractionToken;
    }

    Hierarchy (View Summary)

    Index

    Properties

    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -
    unit: "s" | "ms"
    val: number | FractionToken

    Interface TimelineFunctionToken

    Timeline function token

    -
    interface TimelineFunctionToken {
        chi: Token[];
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: TimelineFunctionTokenType;
        val: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    chi +
    interface TimelineFunctionToken {
        chi: Token[];
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: TimelineFunctionTokenType;
        val: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    chi: Token[]
    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -
    val: string

    Interface TimingFunctionToken

    Timing function token

    -
    interface TimingFunctionToken {
        chi: Token[];
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: TimingFunctionTokenType;
        val: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    chi +
    interface TimingFunctionToken {
        chi: Token[];
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: TimingFunctionTokenType;
        val: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    chi: Token[]
    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -
    val: string

    Interface TokenizeResultInternal

    tokenize result object

    -
    interface TokenizeResult {
        bytesIn: number;
        end: Position;
        hint?: EnumToken;
        len: number;
        sta: Position;
        token: string;
    }
    Index

    Properties

    interface TokenizeResult {
        bytesIn: number;
        end: Position;
        hint?: EnumToken;
        len: number;
        sta: Position;
        token: string;
    }
    Index

    Properties

    bytesIn: number

    bytes in

    -

    token end position

    -
    hint?: EnumToken

    token type hint

    -
    len: number

    token length

    -

    token start position

    -
    token: string

    token

    -

    Interface TransformOptions

    transform options

    -
    interface TransformOptions {
        beautify?: boolean;
        computeCalcExpression?: boolean;
        computeShorthand?: boolean;
        computeTransform?: boolean;
        convertColor?: boolean | ColorType;
        cwd?: string;
        expandNestingRules?: boolean;
        indent?: string;
        inlineCssVariables?: boolean;
        lenient?: boolean;
        load?: (url: string, currentUrl?: string, asStream?: boolean) => LoadResult;
        minify?: boolean;
        module?:
            | boolean
            | ModuleCaseTransformEnum
            | ModuleScopeEnumOptions
            | ModuleOptions;
        nestingRules?: boolean;
        newLine?: string;
        output?: string;
        parseColor?: boolean;
        pass?: number;
        preserveLicense?: boolean;
        removeCharset?: boolean;
        removeComments?: boolean;
        removeDuplicateDeclarations?: string
        | boolean
        | string[];
        removeEmpty?: boolean;
        removePrefix?: boolean;
        resolve?: (
            url: string,
            currentUrl: string,
            currentWorkingDirectory?: string,
        ) => { absolute: string; relative: string };
        resolveImport?: boolean;
        resolveUrls?: boolean;
        signal?: AbortSignal;
        sourcemap?: boolean | "inline";
        src?: string;
        validation?: boolean | ValidationLevel;
        visitor?: VisitorNodeMap | VisitorNodeMap[];
        withParents?: boolean;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface TransformOptions {
        beautify?: boolean;
        computeCalcExpression?: boolean;
        computeShorthand?: boolean;
        computeTransform?: boolean;
        convertColor?: boolean | ColorType;
        cwd?: string;
        expandNestingRules?: boolean;
        indent?: string;
        inlineCssVariables?: boolean;
        lenient?: boolean;
        load?: (
            url: string,
            currentDirectory: string,
            responseType?: boolean | ResponseType,
        ) => Promise<
            string
            | ArrayBuffer
            | ReadableStream<Uint8Array<ArrayBufferLike>>,
        >;
        minify?: boolean;
        module?:
            | boolean
            | ModuleCaseTransformEnum
            | ModuleScopeEnumOptions
            | ModuleOptions;
        nestingRules?: boolean;
        newLine?: string;
        output?: string;
        parseColor?: boolean;
        pass?: number;
        preserveLicense?: boolean;
        removeCharset?: boolean;
        removeComments?: boolean;
        removeDuplicateDeclarations?: string
        | boolean
        | string[];
        removeEmpty?: boolean;
        removePrefix?: boolean;
        resolve?: (
            url: string,
            currentUrl: string,
            currentWorkingDirectory?: string,
        ) => { absolute: string; relative: string };
        resolveImport?: boolean;
        resolveUrls?: boolean;
        signal?: AbortSignal;
        sourcemap?: boolean | "inline";
        src?: string;
        validation?: boolean | ValidationLevel;
        visitor?: VisitorNodeMap | VisitorNodeMap[];
        withParents?: boolean;
    }

    Hierarchy (View Summary)

    Index

    Properties

    beautify? computeCalcExpression? computeShorthand? computeTransform? @@ -194,50 +194,50 @@
    const result = await transform(css, {beautify: true});
     
    -
    computeCalcExpression?: boolean

    compute math functions +

    computeCalcExpression?: boolean

    compute math functions see supported functions mathFuncs

    -
    computeShorthand?: boolean

    compute shorthand properties

    -
    computeTransform?: boolean

    compute transform functions +

    computeShorthand?: boolean

    compute shorthand properties

    +
    computeTransform?: boolean

    compute transform functions see supported functions transformFunctions

    -
    convertColor?: boolean | ColorType

    convert color to the specified color space. 'true' will convert to HEX

    -
    cwd?: string

    current working directory

    -
    expandNestingRules?: boolean

    expand nested rules

    -
    indent?: string

    indent string

    -
    inlineCssVariables?: boolean

    inline css variables

    -
    lenient?: boolean

    lenient validation. retain nodes that failed validation

    -
    load?: (url: string, currentUrl?: string, asStream?: boolean) => LoadResult

    url and file loader

    -
    minify?: boolean

    enable minification

    -
    module?:
        | boolean
        | ModuleCaseTransformEnum
        | ModuleScopeEnumOptions
        | ModuleOptions

    css modules options

    -
    nestingRules?: boolean

    generate nested rules

    -
    newLine?: string

    new line string

    -
    output?: string

    output file. used for url resolution

    -
    parseColor?: boolean

    parse color tokens

    -
    pass?: number

    define minification passes.

    -
    preserveLicense?: boolean

    preserve license comments. license comments are comments that start with /*!

    -
    removeCharset?: boolean

    remove at-rule charset

    -
    removeComments?: boolean

    remove comments

    -
    removeDuplicateDeclarations?: string | boolean | string[]

    remove duplicate declarations from the same rule. if passed as a string array, duplicated declarations are removed, except for those in the array

    +
    convertColor?: boolean | ColorType

    convert color to the specified color space. 'true' will convert to HEX

    +
    cwd?: string

    current working directory

    +
    expandNestingRules?: boolean

    expand nested rules

    +
    indent?: string

    indent string

    +
    inlineCssVariables?: boolean

    inline css variables

    +
    lenient?: boolean

    lenient validation. retain nodes that failed validation

    +
    load?: (
        url: string,
        currentDirectory: string,
        responseType?: boolean | ResponseType,
    ) => Promise<
        string
        | ArrayBuffer
        | ReadableStream<Uint8Array<ArrayBufferLike>>,
    >

    url and file loader

    +
    minify?: boolean

    enable minification

    +
    module?:
        | boolean
        | ModuleCaseTransformEnum
        | ModuleScopeEnumOptions
        | ModuleOptions

    css modules options

    +
    nestingRules?: boolean

    generate nested rules

    +
    newLine?: string

    new line string

    +
    output?: string

    output file. used for url resolution

    +
    parseColor?: boolean

    parse color tokens

    +
    pass?: number

    define minification passes.

    +
    preserveLicense?: boolean

    preserve license comments. license comments are comments that start with /*!

    +
    removeCharset?: boolean

    remove at-rule charset

    +
    removeComments?: boolean

    remove comments

    +
    removeDuplicateDeclarations?: string | boolean | string[]

    remove duplicate declarations from the same rule. if passed as a string array, duplicated declarations are removed, except for those in the array


    import {transform} from '@tbela99/css-parser';

    const css = `

    .table {

    width: 100%;
    width: calc(100% + 40px);
    margin-left: 20px;
    margin-left: min(100% , 20px)
    }

    `;
    const result = await transform(css, {

    beautify: true,
    validation: true,
    removeDuplicateDeclarations: ['width']
    }
    );

    console.log(result.code);
    -
    removeEmpty?: boolean

    remove empty ast nodes

    -
    removePrefix?: boolean

    remove css prefix

    -
    resolve?: (
        url: string,
        currentUrl: string,
        currentWorkingDirectory?: string,
    ) => { absolute: string; relative: string }

    url and path resolver

    -
    resolveImport?: boolean

    resolve import

    -
    resolveUrls?: boolean

    resolve urls

    -
    signal?: AbortSignal

    abort signal

    +
    removeEmpty?: boolean

    remove empty ast nodes

    +
    removePrefix?: boolean

    remove css prefix

    +
    resolve?: (
        url: string,
        currentUrl: string,
        currentWorkingDirectory?: string,
    ) => { absolute: string; relative: string }

    url and path resolver

    +
    resolveImport?: boolean

    resolve import

    +
    resolveUrls?: boolean

    resolve urls

    +
    signal?: AbortSignal

    abort signal

    Example: abort after 10 seconds

    -

    const result = await parse(cssString, {
    signal: AbortSignal.timeout(10000)
    });
    +

    const result = await parse(cssString, {
    signal: AbortSignal.timeout(10000)
    });
    -
    sourcemap?: boolean | "inline"

    include sourcemap in the ast. sourcemap info is always generated

    -
    src?: string

    source file to be used for sourcemap

    -
    validation?: boolean | ValidationLevel

    enable css validation

    +
    sourcemap?: boolean | "inline"

    include sourcemap in the ast. sourcemap info is always generated

    +
    src?: string

    source file to be used for sourcemap

    +
    validation?: boolean | ValidationLevel

    enable css validation

    see ValidationLevel

    -

    node visitor +

    node visitor VisitorNodeMap[]

    -
    withParents?: boolean

    render the node along with its parents

    -

    Interface TransformResult

    transform result object

    -
    interface TransformResult {
        ast: AstStyleSheet;
        code: string;
        cssModuleVariables?: Record<string, CssVariableToken>;
        errors: ErrorDescription[];
        importMapping?: Record<string, Record<string, string>>;
        map?: SourceMap;
        mapping?: Record<string, string>;
        stats: {
            bytesIn: number;
            bytesOut: number;
            importedBytesIn: number;
            imports: ParseResultStats[];
            minify: string;
            parse: string;
            render: string;
            src: string;
            total: string;
        };
    }

    Hierarchy (View Summary)

    Index

    Properties

    ast +
    interface TransformResult {
        ast: AstStyleSheet;
        code: string;
        cssModuleVariables?: Record<string, CssVariableToken>;
        errors: ErrorDescription[];
        importMapping?: Record<string, Record<string, string>>;
        map?: SourceMap;
        mapping?: Record<string, string>;
        stats: {
            bytesIn: number;
            bytesOut: number;
            importedBytesIn: number;
            imports: ParseResultStats[];
            minify: string;
            parse: string;
            render: string;
            src: string;
            total: string;
        };
    }

    Hierarchy (View Summary)

    Index

    Properties

    Properties

    parsed ast tree

    -
    code: string

    rendered css

    -
    cssModuleVariables?: Record<string, CssVariableToken>

    parse errors

    -
    importMapping?: Record<string, Record<string, string>>
    map?: SourceMap

    source map

    -
    mapping?: Record<string, string>

    css module mapping

    -
    stats: {
        bytesIn: number;
        bytesOut: number;
        importedBytesIn: number;
        imports: ParseResultStats[];
        minify: string;
        parse: string;
        render: string;
        src: string;
        total: string;
    }

    transform stats

    +
    code: string

    rendered css

    +
    cssModuleVariables?: Record<string, CssVariableToken>

    parse errors

    +
    importMapping?: Record<string, Record<string, string>>
    map?: SourceMap

    source map

    +
    mapping?: Record<string, string>

    css module mapping

    +
    stats: {
        bytesIn: number;
        bytesOut: number;
        importedBytesIn: number;
        imports: ParseResultStats[];
        minify: string;
        parse: string;
        render: string;
        src: string;
        total: string;
    }

    transform stats

    Type Declaration

    • bytesIn: number

      bytes read

    • bytesOut: number

      generated css size

    • importedBytesIn: number

      bytes read from imported files

      @@ -180,7 +180,7 @@
    • render: string

      render time

    • src: string

      source file

    • total: string

      total time

      -

    Interface UnaryExpression

    Unary expression token

    -
    interface UnaryExpression {
        loc?: Location;
        parent?: any;
        sign: Add | Sub;
        tokens?: Token[] | null;
        typ: UnaryExpressionTokenType;
        val: UnaryExpressionNode;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface UnaryExpression {
        loc?: Location;
        parent?: any;
        sign: Add | Sub;
        tokens?: Token[] | null;
        typ: UnaryExpressionTokenType;
        val: UnaryExpressionNode;
    }

    Hierarchy (View Summary)

    Index

    Properties

    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    sign: Add | Sub
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -

    Interface UnclosedStringToken

    Unclosed string token

    -
    interface UnclosedStringToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: UnclosedStringTokenType;
        val: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface UnclosedStringToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: UnclosedStringTokenType;
        val: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -
    val: string

    Interface UniversalSelectorToken

    Universal selector token

    -
    interface UniversalSelectorToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: UniversalSelectorTokenType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface UniversalSelectorToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: UniversalSelectorTokenType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    Properties

    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -

    Interface UrlToken

    URL token

    -
    interface UrlToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: UrlTokenTokenType;
        val: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface UrlToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: UrlTokenTokenType;
        val: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -
    val: string

    Interface ValidationConfiguration

    Index

    Properties

    atRules +

    Interface ValidationConfiguration

    Index

    Properties

    declarations: ValidationSyntaxNode

    Interface ValidationOptions

    css validation options

    -
    interface ValidationOptions {
        lenient?: boolean;
        validation?: boolean | ValidationLevel;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface ValidationOptions {
        lenient?: boolean;
        validation?: boolean | ValidationLevel;
    }

    Hierarchy (View Summary)

    Index

    Properties

    lenient?: boolean

    lenient validation. retain nodes that failed validation

    -
    validation?: boolean | ValidationLevel

    enable css validation

    +
    validation?: boolean | ValidationLevel

    enable css validation

    see ValidationLevel

    -

    Interface ValidationResult

    interface ValidationResult {
        cycle?: boolean;
        error: string;
        node: any;
        syntax: string | ValidationToken | null;
        valid: SyntaxValidationResult;
    }

    Hierarchy (View Summary)

    Index

    Properties

    cycle? +

    Interface ValidationResult

    interface ValidationResult {
        cycle?: boolean;
        error: string;
        node: any;
        syntax: string | ValidationToken | null;
        valid: SyntaxValidationResult;
    }

    Hierarchy (View Summary)

    Index

    Properties

    cycle?: boolean
    error: string
    node: any
    syntax: string | ValidationToken | null
    valid: SyntaxValidationResult

    Interface ValidationSelectorOptions

    css validation options

    -
    interface ValidationSelectorOptions {
        lenient?: boolean;
        nestedSelector?: boolean;
        validation?: boolean | ValidationLevel;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface ValidationSelectorOptions {
        lenient?: boolean;
        nestedSelector?: boolean;
        validation?: boolean | ValidationLevel;
    }

    Hierarchy (View Summary)

    Index

    Properties

    lenient?: boolean

    lenient validation. retain nodes that failed validation

    -
    nestedSelector?: boolean
    validation?: boolean | ValidationLevel

    enable css validation

    +
    nestedSelector?: boolean
    validation?: boolean | ValidationLevel

    enable css validation

    see ValidationLevel

    -

    Interface ValidationSyntaxNode

    interface ValidationSyntaxNode {
        ast?: ValidationToken[];
        syntax: string;
    }
    Index

    Properties

    ast? +

    Interface ValidationSyntaxNode

    interface ValidationSyntaxNode {
        ast?: ValidationToken[];
        syntax: string;
    }
    Index

    Properties

    Properties

    ast?: ValidationToken[]
    syntax: string

    Interface ValidationSyntaxResult

    interface ValidationSyntaxResult {
        context: Token[] | Context<Token>;
        cycle?: boolean;
        error: string;
        node: any;
        syntax: string | ValidationToken | null;
        valid: SyntaxValidationResult;
    }

    Hierarchy (View Summary)

    Index

    Properties

    context +

    Interface ValidationSyntaxResult

    interface ValidationSyntaxResult {
        context: Token[] | Context<Token>;
        cycle?: boolean;
        error: string;
        node: any;
        syntax: string | ValidationToken | null;
        valid: SyntaxValidationResult;
    }

    Hierarchy (View Summary)

    Index

    Properties

    context: Token[] | Context<Token>
    cycle?: boolean
    error: string
    node: any
    syntax: string | ValidationToken | null
    valid: SyntaxValidationResult

    Interface VariableScopeInfoInternal

    variable scope info object

    -
    interface VariableScopeInfo {
        declarationCount: number;
        globalScope: boolean;
        node: AstDeclaration;
        parent: Set<AstAtRule | AstRule>;
        replaceable: boolean;
        values: Token[];
    }
    Index

    Properties

    interface VariableScopeInfo {
        declarationCount: number;
        globalScope: boolean;
        node: AstDeclaration;
        parent: Set<AstAtRule | AstRule>;
        replaceable: boolean;
        values: Token[];
    }
    Index

    Properties

    declarationCount: number

    declaration count

    -
    globalScope: boolean

    global scope

    -

    declaration node

    -
    parent: Set<AstAtRule | AstRule>

    parent nodes

    -
    replaceable: boolean

    replaceable

    -
    values: Token[]

    declaration values

    -

    Interface VisitorNodeMap

    node visitor callback map

    -
    Index

    Properties

    Index

    Properties

    AtRule? Declaration? KeyframesAtRule? KeyframesRule? @@ -168,22 +168,22 @@

    import {transform, AstAtRule, ParserOptions} from "@tbela99/css-parser";

    const options: ParserOptions = {

    visitor: {

    AtRule: {

    media: (node: AstAtRule): AstAtRule => {

    node.val = 'tv,screen';
    return node
    }
    }
    }
    };

    const css = `

    @media screen {

    .foo {

    height: calc(100px * 2/ 15);
    }
    }
    `;

    const result = await transform(css, options);

    console.debug(result.code);

    // @media tv,screen{.foo{height:calc(40px/3)}}
    -

    declaration visitor

    +

    declaration visitor

    Example: add 'width: 3px' everytime a declaration with the name 'height' is found

    -

    import {transform, parseDeclarations} from "@tbela99/css-parser";

    const options: ParserOptions = {

    removeEmpty: false,
    visitor: {

    Declaration: {

    // called only for height declaration
    height: (node: AstDeclaration): AstDeclaration[] => {


    return [
    node,
    {

    typ: EnumToken.DeclarationNodeType,
    nam: 'width',
    val: [
    <LengthToken>{
    typ: EnumToken.LengthTokenType,
    val: 3,
    unit: 'px'
    }
    ]
    }
    ];
    }
    }
    }
    };

    const css = `

    .foo {
    height: calc(100px * 2/ 15);
    }
    .selector {
    color: lch(from peru calc(l * 0.8) calc(c * 0.7) calc(h + 180))
    }
    `;

    console.debug(await transform(css, options));

    // .foo{height:calc(40px/3);width:3px}.selector{color:#0880b0} +

    import {transform, parseDeclarations} from "@tbela99/css-parser";

    const options: ParserOptions = {

    removeEmpty: false,
    visitor: {

    Declaration: {

    // called only for height declaration
    height: (node: AstDeclaration): AstDeclaration[] => {


    return [
    node,
    {

    typ: EnumToken.DeclarationNodeType,
    nam: 'width',
    val: [
    <LengthToken>{
    typ: EnumToken.LengthTokenType,
    val: 3,
    unit: 'px'
    }
    ]
    }
    ];
    }
    }
    }
    };

    const css = `

    .foo {
    height: calc(100px * 2/ 15);
    }
    .selector {
    color: lch(from peru calc(l * 0.8) calc(c * 0.7) calc(h + 180))
    }
    `;

    console.debug(await transform(css, options));

    // .foo{height:calc(40px/3);width:3px}.selector{color:#0880b0}

    Example: rename 'margin' to 'padding' and 'height' to 'width'

    import {AstDeclaration, ParserOptions, transform} from "../src/node.ts";

    const options: ParserOptions = {

    visitor: {

    // called for every declaration
    Declaration: (node: AstDeclaration): null => {


    if (node.nam == 'height') {

    node.nam = 'width';
    }

    else if (node.nam == 'margin') {

    node.nam = 'padding'
    }

    return null;
    }
    }
    };

    const css = `

    .foo {
    height: calc(100px * 2/ 15);
    margin: 10px;
    }
    .selector {

    margin: 20px;}
    `;

    const result = await transform(css, options);

    console.debug(result.code);

    // .foo{width:calc(40px/3);padding:10px}.selector{padding:20px}
    -

    rule visitor

    +

    rule visitor

    Example: add 'width: 3px' to every rule with the selector '.foo'


    import {transform, parseDeclarations} from "@tbela99/css-parser";

    const options: ParserOptions = {

    removeEmpty: false,
    visitor: {

    Rule: async (node: AstRule): Promise<AstRule | null> => {

    if (node.sel == '.foo') {

    node.chi.push(...await parseDeclarations('width: 3px'));
    return node;
    }

    return null;
    }
    }
    };

    const css = `

    .foo {
    .foo {
    }
    }
    `;

    console.debug(await transform(css, options));

    // .foo{width:3px;.foo{width:3px}}
    -

    value visitor

    -

    Interface WalkAttributesResult

    interface WalkAttributesResult {
        nextValue: Token | null;
        parent: any;
        previousValue: Token | null;
        root?: any;
        value: Token;
    }
    Index

    Properties

    nextValue +

    Interface WalkAttributesResult

    interface WalkAttributesResult {
        nextValue: Token | null;
        parent: any;
        previousValue: Token | null;
        root?: any;
        value: Token;
    }
    Index

    Properties

    nextValue: Token | null
    parent: any
    previousValue: Token | null
    root?: any
    value: Token

    Interface WalkResult

    interface WalkResult {
        node: any;
        parent?: AstRuleList;
        root?: any;
    }
    Index

    Properties

    node +

    Interface WalkResult

    interface WalkResult {
        node: any;
        parent?: AstRuleList;
        root?: any;
    }
    Index

    Properties

    Properties

    node: any
    parent?: AstRuleList
    root?: any

    Interface WhitespaceToken

    Whitespace token

    -
    interface WhitespaceToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: WhitespaceTokenType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface WhitespaceToken {
        loc?: Location;
        parent?: any;
        tokens?: Token[] | null;
        typ: WhitespaceTokenType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    Properties

    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -

    Interface AstAtRule

    at rule node

    -
    interface AstAtRule {
        chi?:
            | (AstDeclaration | AstComment | AstInvalidDeclaration)[]
            | (AstRule | AstComment)[];
        loc?: Location;
        nam: string;
        parent?: any;
        tokens?: Token[] | null;
        typ: AtRuleNodeType;
        val: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface AstAtRule {
        chi?:
            | (AstDeclaration | AstComment | AstInvalidDeclaration)[]
            | (AstRule | AstComment)[];
        loc?: Location;
        nam: string;
        parent?: any;
        tokens?: Token[] | null;
        typ: AtRuleNodeType;
        val: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    chi?:
        | (AstDeclaration | AstComment | AstInvalidDeclaration)[]
        | (AstRule | AstComment)[]
    loc?: Location

    location info

    -
    nam: string
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -
    val: string

    Interface AstComment

    comment node

    -
    interface AstComment {
        loc?: Location;
        parent?: any;
        tokens?: null;
        typ: CommentTokenType | CDOCOMMTokenType;
        val: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface AstComment {
        loc?: Location;
        parent?: any;
        tokens?: null;
        typ: CommentTokenType | CDOCOMMTokenType;
        val: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: null

    prelude or selector tokens

    -

    token type

    -
    val: string

    Interface AstDeclaration

    declaration node

    -
    interface AstDeclaration {
        loc?: Location;
        nam: string;
        parent?: any;
        tokens?: null;
        typ: DeclarationNodeType;
        val: Token[];
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface AstDeclaration {
        loc?: Location;
        nam: string;
        parent?: any;
        tokens?: null;
        typ: DeclarationNodeType;
        val: Token[];
    }

    Hierarchy (View Summary)

    Index

    Properties

    loc?: Location

    location info

    -
    nam: string
    parent?: any

    parent node

    -
    tokens?: null

    prelude or selector tokens

    -

    token type

    -
    val: Token[]

    Interface AstInvalidAtRule

    invalid at rule node

    -
    interface AstInvalidAtRule {
        chi?: any[];
        loc?: Location;
        nam: string;
        parent?: any;
        tokens?: Token[] | null;
        typ: InvalidAtRuleTokenType;
        val: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface AstInvalidAtRule {
        chi?: any[];
        loc?: Location;
        nam: string;
        parent?: any;
        tokens?: Token[] | null;
        typ: InvalidAtRuleTokenType;
        val: string;
    }

    Hierarchy (View Summary)

    Index

    Properties

    chi?: any[]
    loc?: Location

    location info

    -
    nam: string
    parent?: any

    parent node

    -
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -
    val: string

    Interface AstInvalidDeclaration

    invalid declaration node

    -
    interface AstInvalidDeclaration {
        loc?: Location;
        parent?: any;
        tokens?: null;
        typ: InvalidDeclarationNodeType;
        val: Token[];
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface AstInvalidDeclaration {
        loc?: Location;
        parent?: any;
        tokens?: null;
        typ: InvalidDeclarationNodeType;
        val: Token[];
    }

    Hierarchy (View Summary)

    Index

    Properties

    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: null

    prelude or selector tokens

    -

    token type

    -
    val: Token[]

    Interface AstInvalidRule

    invalid rule node

    -
    interface AstInvalidRule {
        chi: any[];
        loc?: Location;
        parent?: any;
        sel: string;
        tokens?: Token[] | null;
        typ: InvalidRuleTokenType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    chi +
    interface AstInvalidRule {
        chi: any[];
        loc?: Location;
        parent?: any;
        sel: string;
        tokens?: Token[] | null;
        typ: InvalidRuleTokenType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    chi: any[]
    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    sel: string
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -

    Interface AstRule

    rule node

    -
    interface AstRule {
        chi: (
            | AstDeclaration
            | AstAtRule
            | AstInvalidRule
            | AstInvalidAtRule
            | AstRule
            | AstComment
            | AstInvalidDeclaration
        )[];
        loc?: Location;
        optimized?: OptimizedSelector
        | null;
        parent?: any;
        raw?: RawSelectorTokens | null;
        sel: string;
        tokens?: Token[] | null;
        typ: RuleNodeType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    chi +
    interface AstRule {
        chi: (
            | AstDeclaration
            | AstAtRule
            | AstInvalidRule
            | AstInvalidAtRule
            | AstRule
            | AstComment
            | AstInvalidDeclaration
        )[];
        loc?: Location;
        optimized?: OptimizedSelector
        | null;
        parent?: any;
        raw?: RawSelectorTokens | null;
        sel: string;
        tokens?: Token[] | null;
        typ: RuleNodeType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    chi loc? optimized? parent? @@ -165,11 +165,11 @@ sel tokens? typ -

    Properties

    chi: (
        | AstDeclaration
        | AstAtRule
        | AstInvalidRule
        | AstInvalidAtRule
        | AstRule
        | AstComment
        | AstInvalidDeclaration
    )[]
    loc?: Location

    location info

    -
    optimized?: OptimizedSelector | null
    parent?: any

    parent node

    -
    raw?: RawSelectorTokens | null
    sel: string
    tokens?: Token[] | null

    prelude or selector tokens

    -

    token type

    -

    Interface AstStyleSheet

    stylesheet node

    -
    interface AstStyleSheet {
        chi: any[];
        loc?: Location;
        parent?: any;
        tokens?: null;
        typ: StyleSheetNodeType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    chi +
    interface AstStyleSheet {
        chi: any[];
        loc?: Location;
        parent?: any;
        tokens?: null;
        typ: StyleSheetNodeType;
    }

    Hierarchy (View Summary)

    Index

    Properties

    Properties

    chi: any[]
    loc?: Location

    location info

    -
    parent?: any

    parent node

    -
    tokens?: null

    prelude or selector tokens

    -

    token type

    -

    Enumeration EnumToken

    enum of all token types

    -
    Index

    Enumeration Members

    Add +
    Index

    Enumeration Members

    Enumeration Members

    Add: 60

    addition token type

    -
    Angle: 24

    alias for angle token type

    -
    AngleTokenType: 24

    angle token type

    -
    AtRuleNodeType: 3

    at-rule node type

    -
    AtRuleTokenType: 13

    at-rule token type

    -
    AttrEndTokenType: 32

    attribute end token type

    -
    AttrStartTokenType: 31

    attribute start token type

    -
    AttrTokenType: 51

    attribute token type

    -
    BadCdoTokenType: 53

    bad cdo token type

    -
    BadCommentTokenType: 52

    bad comment token type

    -
    BadStringTokenType: 55

    bad string token type

    -
    BadUrlTokenType: 54

    bad URL token type

    -
    BinaryExpressionTokenType: 56

    binary expression token type

    -
    BlockEndTokenType: 30

    block end token type

    -
    BlockStartTokenType: 29

    block start token type

    -
    CDOCOMMNodeType: 1

    alias for cdata section node type

    -
    CDOCOMMTokenType: 1

    cdata section token

    -
    ChildCombinatorTokenType: 76

    child combinator token type

    -
    ClassSelectorTokenType: 74

    class selector token type

    -
    ColonTokenType: 10

    colon token type

    -
    Color: 50

    alias for color token type

    -
    ColorTokenType: 50

    color token type

    -
    ColumnCombinatorTokenType: 64

    column combinator token type

    -
    Comma: 9

    alias for comma token type

    -
    CommaTokenType: 9

    comma token type

    -
    Comment: 0

    alias for comment token type

    -
    CommentNodeType: 0

    alias for comment node type

    -
    CommentTokenType: 0

    comment token

    -
    ComposesSelectorNodeType: 95

    composes token node type

    -
    ContainMatchTokenType: 65

    contain match token type

    -
    CssVariableDeclarationMapTokenType: 98

    css variable declaration map token type

    -
    CssVariableImportTokenType: 97

    css variable import token type

    -
    CssVariableTokenType: 96

    css variable token type

    -
    DashedIden: 8

    alias for dashed identifier token type

    -
    DashedIdenTokenType: 8

    dashed identifier token type

    -
    DashMatchTokenType: 38

    dash match token type

    -
    DeclarationNodeType: 5

    declaration node type

    -
    DelimTokenType: 46

    delimiter token type

    -
    DescendantCombinatorTokenType: 77

    descendant combinator token type

    -
    Dimension: 22

    alias for dimension token type

    -
    DimensionTokenType: 22

    dimension token type

    -
    Div: 62

    division token type

    -
    EndMatchTokenType: 67

    end match token type

    -
    EndParensTokenType: 34

    end parentheses token type

    -
    EOF: 48

    alias for end of file token type

    -
    EOFTokenType: 48

    end of file token type

    -
    EqualMatchTokenType: 39

    equal match token type

    -
    Flex: 58

    alias for flex token type

    -
    FlexTokenType: 58

    flex token type

    -
    FractionTokenType: 70

    fraction token type

    -
    Frequency: 26

    alias for frequency token type

    -
    FrequencyTokenType: 26

    frequency token type

    -
    FunctionTokenType: 15

    function token type

    -
    GridTemplateFunc: 72

    alias for grid template function token type

    -
    GridTemplateFuncTokenType: 72

    grid template function token type

    -
    GteTokenType: 43

    greater than or equal to token type

    -
    GtTokenType: 42

    greater than token type

    -
    Hash: 28

    alias for hash token type

    -
    HashTokenType: 28

    hash token type

    -
    Iden: 7

    alias for identifier token type

    -
    IdenList: 71

    alias for identifier list token type

    -
    IdenListTokenType: 71

    identifier list token type

    -
    IdenTokenType: 7

    identifier token type

    -
    ImageFunc: 19

    alias for image function token type

    -
    ImageFunctionTokenType: 19

    image function token type

    -
    ImportantTokenType: 49

    important token type

    -
    IncludeMatchTokenType: 37

    include match token type

    -
    InvalidAtRuleTokenType: 84

    invalid at rule token type

    -
    InvalidAttrTokenType: 83

    invalid attribute token type

    -
    InvalidClassSelectorTokenType: 82

    invalid class selector token type

    -
    InvalidDeclarationNodeType: 94

    invalid declaration node type

    -
    InvalidRuleTokenType: 81

    invalid rule token type

    -
    KeyframesAtRuleNodeType: 93

    keyframe at rule node type

    -
    KeyFramesRuleNodeType: 73

    keyframe rule node type

    -
    Length: 23

    alias for length token type

    -
    LengthTokenType: 23

    length token type

    -
    ListToken: 59

    token list token type

    -
    Literal: 6

    alias for literal token type

    -
    LiteralTokenType: 6

    literal token type

    -
    LteTokenType: 41

    less than or equal to token type

    -
    LtTokenType: 40

    less than token type

    -
    MatchExpressionTokenType: 68

    match expression token type

    -
    MediaFeatureAndTokenType: 89

    media feature and token type

    -
    MediaFeatureNotTokenType: 88

    media feature not token type

    -
    MediaFeatureOnlyTokenType: 87

    media feature only token type

    -
    MediaFeatureOrTokenType: 90

    media feature or token type

    -
    MediaFeatureTokenType: 86

    media feature token type

    -
    MediaQueryConditionTokenType: 85

    media query condition token type

    -
    Mul: 61

    multiplication token type

    -
    NameSpaceAttributeTokenType: 69

    namespace attribute token type

    -
    NestingSelectorTokenType: 80

    nesting selector token type

    -
    NextSiblingCombinatorTokenType: 78

    next sibling combinator token type

    -
    Number: 12

    alias for number token type

    -
    NumberTokenType: 12

    number token type

    -
    ParensTokenType: 35

    parentheses token type

    -
    Perc: 14

    alias for percentage token type

    -
    PercentageTokenType: 14

    percentage token type

    -
    PseudoClassFuncTokenType: 45

    pseudo-class function token type

    -
    PseudoClassTokenType: 44

    pseudo-class token type

    -
    PseudoElementTokenType: 92

    pseudo element token type

    -
    PseudoPageTokenType: 91

    pseudo page token type

    -
    Resolution: 27

    alias for resolution token type

    -
    ResolutionTokenType: 27

    resolution token type

    -
    RuleNodeType: 4

    rule node type

    -
    SemiColonTokenType: 11

    semicolon token type

    -
    StartMatchTokenType: 66

    start match token type

    -
    StartParensTokenType: 33

    start parentheses token type

    -
    String: 20

    alias for string token type

    -
    StringTokenType: 20

    string token type

    -
    StyleSheetNodeType: 2

    style sheet node type

    -
    Sub: 63

    subtraction token type

    -
    SubsequentSiblingCombinatorTokenType: 79

    subsequent sibling combinator token type

    -
    Time: 25

    alias for time token type

    -
    TimelineFunction: 16

    alias for timeline function token type

    -
    TimelineFunctionTokenType: 16

    timeline function token type

    -
    TimeTokenType: 25

    time token type

    -
    TimingFunction: 17

    alias for timing function token type

    -
    TimingFunctionTokenType: 17

    timing function token type

    -
    UnaryExpressionTokenType: 57

    unary expression token type

    -
    UnclosedStringTokenType: 21

    unclosed string token type

    -
    UniversalSelectorTokenType: 75

    universal selector token type

    -
    UrlFunc: 18

    alias for url function token type

    -
    UrlFunctionTokenType: 18

    url function token type

    -
    UrlTokenTokenType: 47

    URL token type

    -
    Whitespace: 36

    alias for whitespace token type

    -
    WhitespaceTokenType: 36

    whitespace token type

    -

    Interface ErrorDescription

    error description

    -
    interface ErrorDescription {
        action: "drop" | "ignore";
        error?: Error;
        location?: Location;
        message: string;
        node?: any;
        rawTokens?: TokenizeResult[];
        syntax?: string | null;
    }
    Index

    Properties

    interface ErrorDescription {
        action: "drop" | "ignore";
        error?: Error;
        location?: Location;
        message: string;
        node?: any;
        rawTokens?: TokenizeResult[];
        syntax?: string | null;
    }
    Index

    Properties

    Properties

    action: "drop" | "ignore"

    drop rule or declaration

    -
    error?: Error

    error object

    -
    location?: Location

    error location

    -
    message: string

    error message

    -
    node?: any

    error node

    -
    rawTokens?: TokenizeResult[]

    raw tokens

    -
    syntax?: string | null

    syntax error description

    -

    Interface ParseResult

    parse result object

    -
    interface ParseResult {
        ast: AstStyleSheet;
        cssModuleVariables?: Record<string, CssVariableToken>;
        errors: ErrorDescription[];
        importMapping?: Record<string, Record<string, string>>;
        mapping?: Record<string, string>;
        stats: ParseResultStats;
    }

    Hierarchy (View Summary)

    Index

    Properties

    ast +
    interface ParseResult {
        ast: AstStyleSheet;
        cssModuleVariables?: Record<string, CssVariableToken>;
        errors: ErrorDescription[];
        importMapping?: Record<string, Record<string, string>>;
        mapping?: Record<string, string>;
        stats: ParseResultStats;
    }

    Hierarchy (View Summary)

    Index

    Properties

    parsed ast tree

    -
    cssModuleVariables?: Record<string, CssVariableToken>

    parse errors

    -
    importMapping?: Record<string, Record<string, string>>
    mapping?: Record<string, string>

    css module mapping

    -

    parse stats

    -

    Interface ParserOptions

    parser options

    -
    interface ParserOptions {
        computeCalcExpression?: boolean;
        computeShorthand?: boolean;
        computeTransform?: boolean;
        cwd?: string;
        expandNestingRules?: boolean;
        inlineCssVariables?: boolean;
        lenient?: boolean;
        load?: (url: string, currentUrl?: string, asStream?: boolean) => LoadResult;
        minify?: boolean;
        module?:
            | boolean
            | ModuleCaseTransformEnum
            | ModuleScopeEnumOptions
            | ModuleOptions;
        nestingRules?: boolean;
        parseColor?: boolean;
        pass?: number;
        removeCharset?: boolean;
        removeDuplicateDeclarations?: string
        | boolean
        | string[];
        removeEmpty?: boolean;
        removePrefix?: boolean;
        resolve?: (
            url: string,
            currentUrl: string,
            currentWorkingDirectory?: string,
        ) => { absolute: string; relative: string };
        resolveImport?: boolean;
        resolveUrls?: boolean;
        signal?: AbortSignal;
        sourcemap?: boolean | "inline";
        src?: string;
        validation?: boolean | ValidationLevel;
        visitor?: VisitorNodeMap | VisitorNodeMap[];
    }

    Hierarchy (View Summary)

    Index

    Properties

    interface ParserOptions {
        computeCalcExpression?: boolean;
        computeShorthand?: boolean;
        computeTransform?: boolean;
        cwd?: string;
        expandNestingRules?: boolean;
        inlineCssVariables?: boolean;
        lenient?: boolean;
        load?: (
            url: string,
            currentDirectory: string,
            responseType?: boolean | ResponseType,
        ) => Promise<
            string
            | ArrayBuffer
            | ReadableStream<Uint8Array<ArrayBufferLike>>,
        >;
        minify?: boolean;
        module?:
            | boolean
            | ModuleCaseTransformEnum
            | ModuleScopeEnumOptions
            | ModuleOptions;
        nestingRules?: boolean;
        parseColor?: boolean;
        pass?: number;
        removeCharset?: boolean;
        removeDuplicateDeclarations?: string
        | boolean
        | string[];
        removeEmpty?: boolean;
        removePrefix?: boolean;
        resolve?: (
            url: string,
            currentUrl: string,
            currentWorkingDirectory?: string,
        ) => { absolute: string; relative: string };
        resolveImport?: boolean;
        resolveUrls?: boolean;
        signal?: AbortSignal;
        sourcemap?: boolean | "inline";
        src?: string;
        validation?: boolean | ValidationLevel;
        visitor?: VisitorNodeMap | VisitorNodeMap[];
    }

    Hierarchy (View Summary)

    Index

    Properties

    computeCalcExpression?: boolean

    compute math functions see supported functions mathFuncs

    -
    computeShorthand?: boolean

    compute shorthand properties

    -
    computeTransform?: boolean

    compute transform functions +

    computeShorthand?: boolean

    compute shorthand properties

    +
    computeTransform?: boolean

    compute transform functions see supported functions transformFunctions

    -
    cwd?: string

    current working directory

    -
    expandNestingRules?: boolean

    expand nested rules

    -
    inlineCssVariables?: boolean

    inline css variables

    -
    lenient?: boolean

    lenient validation. retain nodes that failed validation

    -
    load?: (url: string, currentUrl?: string, asStream?: boolean) => LoadResult

    url and file loader

    -
    minify?: boolean

    enable minification

    -
    module?:
        | boolean
        | ModuleCaseTransformEnum
        | ModuleScopeEnumOptions
        | ModuleOptions

    css modules options

    -
    nestingRules?: boolean

    generate nested rules

    -
    parseColor?: boolean

    parse color tokens

    -
    pass?: number

    define minification passes.

    -
    removeCharset?: boolean

    remove at-rule charset

    -
    removeDuplicateDeclarations?: string | boolean | string[]

    remove duplicate declarations from the same rule. if passed as a string array, duplicated declarations are removed, except for those in the array

    +
    cwd?: string

    current working directory

    +
    expandNestingRules?: boolean

    expand nested rules

    +
    inlineCssVariables?: boolean

    inline css variables

    +
    lenient?: boolean

    lenient validation. retain nodes that failed validation

    +
    load?: (
        url: string,
        currentDirectory: string,
        responseType?: boolean | ResponseType,
    ) => Promise<
        string
        | ArrayBuffer
        | ReadableStream<Uint8Array<ArrayBufferLike>>,
    >

    url and file loader

    +
    minify?: boolean

    enable minification

    +
    module?:
        | boolean
        | ModuleCaseTransformEnum
        | ModuleScopeEnumOptions
        | ModuleOptions

    css modules options

    +
    nestingRules?: boolean

    generate nested rules

    +
    parseColor?: boolean

    parse color tokens

    +
    pass?: number

    define minification passes.

    +
    removeCharset?: boolean

    remove at-rule charset

    +
    removeDuplicateDeclarations?: string | boolean | string[]

    remove duplicate declarations from the same rule. if passed as a string array, duplicated declarations are removed, except for those in the array


    import {transform} from '@tbela99/css-parser';

    const css = `

    .table {

    width: 100%;
    width: calc(100% + 40px);
    margin-left: 20px;
    margin-left: min(100% , 20px)
    }

    `;
    const result = await transform(css, {

    beautify: true,
    validation: true,
    removeDuplicateDeclarations: ['width']
    }
    );

    console.log(result.code);
    -
    removeEmpty?: boolean

    remove empty ast nodes

    -
    removePrefix?: boolean

    remove css prefix

    -
    resolve?: (
        url: string,
        currentUrl: string,
        currentWorkingDirectory?: string,
    ) => { absolute: string; relative: string }

    url and path resolver

    -
    resolveImport?: boolean

    resolve import

    -
    resolveUrls?: boolean

    resolve urls

    -
    signal?: AbortSignal

    abort signal

    +
    removeEmpty?: boolean

    remove empty ast nodes

    +
    removePrefix?: boolean

    remove css prefix

    +
    resolve?: (
        url: string,
        currentUrl: string,
        currentWorkingDirectory?: string,
    ) => { absolute: string; relative: string }

    url and path resolver

    +
    resolveImport?: boolean

    resolve import

    +
    resolveUrls?: boolean

    resolve urls

    +
    signal?: AbortSignal

    abort signal

    Example: abort after 10 seconds

    -

    const result = await parse(cssString, {
    signal: AbortSignal.timeout(10000)
    });
    +

    const result = await parse(cssString, {
    signal: AbortSignal.timeout(10000)
    });
    -
    sourcemap?: boolean | "inline"

    include sourcemap in the ast. sourcemap info is always generated

    -
    src?: string

    source file to be used for sourcemap

    -
    validation?: boolean | ValidationLevel

    enable css validation

    +
    sourcemap?: boolean | "inline"

    include sourcemap in the ast. sourcemap info is always generated

    +
    src?: string

    source file to be used for sourcemap

    +
    validation?: boolean | ValidationLevel

    enable css validation

    see ValidationLevel

    -

    node visitor +

    node visitor VisitorNodeMap[]

    -

    Type Alias Token

    Token:
        | InvalidClassSelectorToken
        | InvalidAttrToken
        | LiteralToken
        | IdentToken
        | IdentListToken
        | DashedIdentToken
        | CommaToken
        | ColonToken
        | SemiColonToken
        | ClassSelectorToken
        | UniversalSelectorToken
        | ChildCombinatorToken
        | DescendantCombinatorToken
        | NextSiblingCombinatorToken
        | SubsequentCombinatorToken
        | ColumnCombinatorToken
        | NestingSelectorToken
        | MediaQueryConditionToken
        | MediaFeatureToken
        | MediaFeatureNotToken
        | MediaFeatureOnlyToken
        | MediaFeatureAndToken
        | MediaFeatureOrToken
        | AstDeclaration
        | NumberToken
        | AtRuleToken
        | PercentageToken
        | FlexToken
        | FunctionURLToken
        | FunctionImageToken
        | TimingFunctionToken
        | TimelineFunctionToken
        | FunctionToken
        | GridTemplateFuncToken
        | DimensionToken
        | LengthToken
        | AngleToken
        | StringToken
        | TimeToken
        | FrequencyToken
        | ResolutionToken
        | UnclosedStringToken
        | HashToken
        | BadStringToken
        | BlockStartToken
        | BlockEndToken
        | AttrStartToken
        | AttrEndToken
        | ParensStartToken
        | ParensEndToken
        | ParensToken
        | CDOCommentToken
        | BadCDOCommentToken
        | CommentToken
        | BadCommentToken
        | WhitespaceToken
        | IncludeMatchToken
        | StartMatchToken
        | EndMatchToken
        | ContainMatchToken
        | MatchExpressionToken
        | NameSpaceAttributeToken
        | ComposesSelectorToken
        | CssVariableToken
        | DashMatchToken
        | EqualMatchToken
        | LessThanToken
        | LessThanOrEqualToken
        | GreaterThanToken
        | GreaterThanOrEqualToken
        | ListToken
        | PseudoClassToken
        | PseudoPageToken
        | PseudoElementToken
        | PseudoClassFunctionToken
        | DelimToken
        | BinaryExpressionToken
        | UnaryExpression
        | FractionToken
        | AddToken
        | SubToken
        | DivToken
        | MulToken
        | BadUrlToken
        | UrlToken
        | ImportantToken
        | ColorToken
        | AttrToken
        | EOFToken

    Token

    -

    Interface TransformResult

    transform result object

    -
    interface TransformResult {
        ast: AstStyleSheet;
        code: string;
        cssModuleVariables?: Record<string, CssVariableToken>;
        errors: ErrorDescription[];
        importMapping?: Record<string, Record<string, string>>;
        map?: SourceMap;
        mapping?: Record<string, string>;
        stats: {
            bytesIn: number;
            bytesOut: number;
            importedBytesIn: number;
            imports: ParseResultStats[];
            minify: string;
            parse: string;
            render: string;
            src: string;
            total: string;
        };
    }

    Hierarchy (View Summary)

    Index

    Properties

    ast +
    interface TransformResult {
        ast: AstStyleSheet;
        code: string;
        cssModuleVariables?: Record<string, CssVariableToken>;
        errors: ErrorDescription[];
        importMapping?: Record<string, Record<string, string>>;
        map?: SourceMap;
        mapping?: Record<string, string>;
        stats: {
            bytesIn: number;
            bytesOut: number;
            importedBytesIn: number;
            imports: ParseResultStats[];
            minify: string;
            parse: string;
            render: string;
            src: string;
            total: string;
        };
    }

    Hierarchy (View Summary)

    Index

    Properties

    Properties

    parsed ast tree

    -
    code: string

    rendered css

    -
    cssModuleVariables?: Record<string, CssVariableToken>

    parse errors

    -
    importMapping?: Record<string, Record<string, string>>
    map?: SourceMap

    source map

    -
    mapping?: Record<string, string>

    css module mapping

    -
    stats: {
        bytesIn: number;
        bytesOut: number;
        importedBytesIn: number;
        imports: ParseResultStats[];
        minify: string;
        parse: string;
        render: string;
        src: string;
        total: string;
    }

    transform stats

    +
    code: string

    rendered css

    +
    cssModuleVariables?: Record<string, CssVariableToken>

    parse errors

    +
    importMapping?: Record<string, Record<string, string>>
    map?: SourceMap

    source map

    +
    mapping?: Record<string, string>

    css module mapping

    +
    stats: {
        bytesIn: number;
        bytesOut: number;
        importedBytesIn: number;
        imports: ParseResultStats[];
        minify: string;
        parse: string;
        render: string;
        src: string;
        total: string;
    }

    transform stats

    Type Declaration

    • bytesIn: number

      bytes read

    • bytesOut: number

      generated css size

    • importedBytesIn: number

      bytes read from imported files

      @@ -180,7 +180,7 @@
    • render: string

      render time

    • src: string

      source file

    • total: string

      total time

      -

    Enumeration ValidationLevel

    enum of validation levels

    -
    Index

    Enumeration Members

    All +
    Index

    Enumeration Members

    All: 7

    validate selectors, at-rules and declarations

    -
    AtRule: 2

    validate at-rules

    -
    Declaration: 4

    validate declarations

    -
    Default: 3

    validate selectors and at-rules

    -
    None: 0

    disable validation

    -
    Selector: 1

    validate selectors

    -

    Enumeration ValidationLevel

    enum of validation levels

    -
    Index

    Enumeration Members

    All +
    Index

    Enumeration Members

    All: 7

    validate selectors, at-rules and declarations

    -
    AtRule: 2

    validate at-rules

    -
    Declaration: 4

    validate declarations

    -
    Default: 3

    validate selectors and at-rules

    -
    None: 0

    disable validation

    -
    Selector: 1

    validate selectors

    -

    Interface VisitorNodeMap

    node visitor callback map

    -
    Index

    Properties

    Index

    Properties

    AtRule? Declaration? KeyframesAtRule? KeyframesRule? @@ -168,22 +168,22 @@

    import {transform, AstAtRule, ParserOptions} from "@tbela99/css-parser";

    const options: ParserOptions = {

    visitor: {

    AtRule: {

    media: (node: AstAtRule): AstAtRule => {

    node.val = 'tv,screen';
    return node
    }
    }
    }
    };

    const css = `

    @media screen {

    .foo {

    height: calc(100px * 2/ 15);
    }
    }
    `;

    const result = await transform(css, options);

    console.debug(result.code);

    // @media tv,screen{.foo{height:calc(40px/3)}}
    -

    declaration visitor

    +

    declaration visitor

    Example: add 'width: 3px' everytime a declaration with the name 'height' is found

    -

    import {transform, parseDeclarations} from "@tbela99/css-parser";

    const options: ParserOptions = {

    removeEmpty: false,
    visitor: {

    Declaration: {

    // called only for height declaration
    height: (node: AstDeclaration): AstDeclaration[] => {


    return [
    node,
    {

    typ: EnumToken.DeclarationNodeType,
    nam: 'width',
    val: [
    <LengthToken>{
    typ: EnumToken.LengthTokenType,
    val: 3,
    unit: 'px'
    }
    ]
    }
    ];
    }
    }
    }
    };

    const css = `

    .foo {
    height: calc(100px * 2/ 15);
    }
    .selector {
    color: lch(from peru calc(l * 0.8) calc(c * 0.7) calc(h + 180))
    }
    `;

    console.debug(await transform(css, options));

    // .foo{height:calc(40px/3);width:3px}.selector{color:#0880b0} +

    import {transform, parseDeclarations} from "@tbela99/css-parser";

    const options: ParserOptions = {

    removeEmpty: false,
    visitor: {

    Declaration: {

    // called only for height declaration
    height: (node: AstDeclaration): AstDeclaration[] => {


    return [
    node,
    {

    typ: EnumToken.DeclarationNodeType,
    nam: 'width',
    val: [
    <LengthToken>{
    typ: EnumToken.LengthTokenType,
    val: 3,
    unit: 'px'
    }
    ]
    }
    ];
    }
    }
    }
    };

    const css = `

    .foo {
    height: calc(100px * 2/ 15);
    }
    .selector {
    color: lch(from peru calc(l * 0.8) calc(c * 0.7) calc(h + 180))
    }
    `;

    console.debug(await transform(css, options));

    // .foo{height:calc(40px/3);width:3px}.selector{color:#0880b0}

    Example: rename 'margin' to 'padding' and 'height' to 'width'

    import {AstDeclaration, ParserOptions, transform} from "../src/node.ts";

    const options: ParserOptions = {

    visitor: {

    // called for every declaration
    Declaration: (node: AstDeclaration): null => {


    if (node.nam == 'height') {

    node.nam = 'width';
    }

    else if (node.nam == 'margin') {

    node.nam = 'padding'
    }

    return null;
    }
    }
    };

    const css = `

    .foo {
    height: calc(100px * 2/ 15);
    margin: 10px;
    }
    .selector {

    margin: 20px;}
    `;

    const result = await transform(css, options);

    console.debug(result.code);

    // .foo{width:calc(40px/3);padding:10px}.selector{padding:20px}
    -

    rule visitor

    +

    rule visitor

    Example: add 'width: 3px' to every rule with the selector '.foo'


    import {transform, parseDeclarations} from "@tbela99/css-parser";

    const options: ParserOptions = {

    removeEmpty: false,
    visitor: {

    Rule: async (node: AstRule): Promise<AstRule | null> => {

    if (node.sel == '.foo') {

    node.chi.push(...await parseDeclarations('width: 3px'));
    return node;
    }

    return null;
    }
    }
    };

    const css = `

    .foo {
    .foo {
    }
    }
    `;

    console.debug(await transform(css, options));

    // .foo{width:3px;.foo{width:3px}}
    -

    value visitor

    -

    Type Alias WalkerOption

    WalkerOption: WalkerOptionEnum | AstNode | Token | null

    node walker option

    -

    Module node

    Functions

    parse
    parseDeclarations
    parseFile
    render
    transform
    transformFile
    walk
    walkValues

    Classes

    SourceMap

    Enumerations

    ColorType
    EnumToken
    ModuleCaseTransformEnum
    ModuleScopeEnumOptions
    ResponseType
    ValidationLevel
    WalkerEvent
    WalkerOptionEnum

    Interfaces

    AddToken
    AngleToken
    AstAtRule
    AstComment
    AstDeclaration
    AstInvalidAtRule
    AstInvalidDeclaration
    AstInvalidRule
    AstKeyFrameRule
    AstKeyframesAtRule
    AstKeyframesRule
    AstRule
    AstStyleSheet
    AtRuleToken
    AttrEndToken
    AttrStartToken
    AttrToken
    BadCDOCommentToken
    BadCommentToken
    BadStringToken
    BadUrlToken
    BaseToken
    BinaryExpressionToken
    BlockEndToken
    BlockStartToken
    CDOCommentToken
    ChildCombinatorToken
    ClassSelectorToken
    ColonToken
    ColorToken
    ColumnCombinatorToken
    CommaToken
    CommentToken
    ComposesSelectorToken
    ContainMatchToken
    Context
    CssVariableImportTokenType
    CssVariableMapTokenType
    CssVariableToken
    DashedIdentToken
    DashMatchToken
    DelimToken
    DescendantCombinatorToken
    DimensionToken
    DivToken
    EndMatchToken
    EOFToken
    EqualMatchToken
    ErrorDescription
    FlexToken
    FractionToken
    FrequencyToken
    FunctionImageToken
    FunctionToken
    FunctionURLToken
    GreaterThanOrEqualToken
    GreaterThanToken
    GridTemplateFuncToken
    HashToken
    IdentListToken
    IdentToken
    ImportantToken
    IncludeMatchToken
    InvalidAttrToken
    InvalidClassSelectorToken
    LengthToken
    LessThanOrEqualToken
    LessThanToken
    ListToken
    LiteralToken
    Location
    MatchedSelector
    MatchExpressionToken
    MediaFeatureAndToken
    MediaFeatureNotToken
    MediaFeatureOnlyToken
    MediaFeatureOrToken
    MediaFeatureToken
    MediaQueryConditionToken
    MinifyFeature
    MinifyFeatureOptions
    MinifyOptions
    ModuleOptions
    MulToken
    NameSpaceAttributeToken
    NestingSelectorToken
    NextSiblingCombinatorToken
    NumberToken
    ParensEndToken
    ParensStartToken
    ParensToken
    ParseInfo
    ParseResult
    ParseResultStats
    ParserOptions
    ParseTokenOptions
    PercentageToken
    Position
    PropertyListOptions
    PropertyMapType
    PropertySetType
    PropertyType
    PseudoClassFunctionToken
    PseudoClassToken
    PseudoElementToken
    PseudoPageToken
    RenderOptions
    RenderResult
    ResolutionToken
    ResolvedPath
    SemiColonToken
    ShorthandDef
    ShorthandMapType
    ShorthandProperties
    ShorthandPropertyType
    ShorthandType
    SourceMapObject
    StartMatchToken
    StringToken
    SubsequentCombinatorToken
    SubToken
    TimelineFunctionToken
    TimeToken
    TimingFunctionToken
    TokenizeResult
    TransformOptions
    TransformResult
    UnaryExpression
    UnclosedStringToken
    UniversalSelectorToken
    UrlToken
    ValidationConfiguration
    ValidationOptions
    ValidationResult
    ValidationSelectorOptions
    ValidationSyntaxNode
    ValidationSyntaxResult
    VariableScopeInfo
    VisitorNodeMap
    WalkAttributesResult
    WalkResult
    WhitespaceToken

    Type Aliases

    AstNode
    AstRuleList
    AtRuleVisitorHandler
    BinaryExpressionNode
    DeclarationVisitorHandler
    GenericVisitorAstNodeHandlerMap
    GenericVisitorHandler
    GenericVisitorResult
    LoadResult
    RawSelectorTokens
    RuleVisitorHandler
    Token
    UnaryExpressionNode
    ValueVisitorHandler
    WalkerFilter
    WalkerOption
    WalkerValueFilter

    Variables

    mathFuncs
    transformFunctions

    Module node

    Functions

    load
    parse
    parseDeclarations
    parseFile
    render
    transform
    transformFile
    walk
    walkValues

    Classes

    SourceMap

    Enumerations

    ColorType
    EnumToken
    ModuleCaseTransformEnum
    ModuleScopeEnumOptions
    ResponseType
    ValidationLevel
    WalkerEvent
    WalkerOptionEnum

    Interfaces

    AddToken
    AngleToken
    AstAtRule
    AstComment
    AstDeclaration
    AstInvalidAtRule
    AstInvalidDeclaration
    AstInvalidRule
    AstKeyFrameRule
    AstKeyframesAtRule
    AstKeyframesRule
    AstRule
    AstStyleSheet
    AtRuleToken
    AttrEndToken
    AttrStartToken
    AttrToken
    BadCDOCommentToken
    BadCommentToken
    BadStringToken
    BadUrlToken
    BaseToken
    BinaryExpressionToken
    BlockEndToken
    BlockStartToken
    CDOCommentToken
    ChildCombinatorToken
    ClassSelectorToken
    ColonToken
    ColorToken
    ColumnCombinatorToken
    CommaToken
    CommentToken
    ComposesSelectorToken
    ContainMatchToken
    Context
    CssVariableImportTokenType
    CssVariableMapTokenType
    CssVariableToken
    DashedIdentToken
    DashMatchToken
    DelimToken
    DescendantCombinatorToken
    DimensionToken
    DivToken
    EndMatchToken
    EOFToken
    EqualMatchToken
    ErrorDescription
    FlexToken
    FractionToken
    FrequencyToken
    FunctionImageToken
    FunctionToken
    FunctionURLToken
    GreaterThanOrEqualToken
    GreaterThanToken
    GridTemplateFuncToken
    HashToken
    IdentListToken
    IdentToken
    ImportantToken
    IncludeMatchToken
    InvalidAttrToken
    InvalidClassSelectorToken
    LengthToken
    LessThanOrEqualToken
    LessThanToken
    ListToken
    LiteralToken
    Location
    MatchedSelector
    MatchExpressionToken
    MediaFeatureAndToken
    MediaFeatureNotToken
    MediaFeatureOnlyToken
    MediaFeatureOrToken
    MediaFeatureToken
    MediaQueryConditionToken
    MinifyFeature
    MinifyFeatureOptions
    MinifyOptions
    ModuleOptions
    MulToken
    NameSpaceAttributeToken
    NestingSelectorToken
    NextSiblingCombinatorToken
    NumberToken
    ParensEndToken
    ParensStartToken
    ParensToken
    ParseInfo
    ParseResult
    ParseResultStats
    ParserOptions
    ParseTokenOptions
    PercentageToken
    Position
    PropertyListOptions
    PropertyMapType
    PropertySetType
    PropertyType
    PseudoClassFunctionToken
    PseudoClassToken
    PseudoElementToken
    PseudoPageToken
    RenderOptions
    RenderResult
    ResolutionToken
    ResolvedPath
    SemiColonToken
    ShorthandDef
    ShorthandMapType
    ShorthandProperties
    ShorthandPropertyType
    ShorthandType
    SourceMapObject
    StartMatchToken
    StringToken
    SubsequentCombinatorToken
    SubToken
    TimelineFunctionToken
    TimeToken
    TimingFunctionToken
    TokenizeResult
    TransformOptions
    TransformResult
    UnaryExpression
    UnclosedStringToken
    UniversalSelectorToken
    UrlToken
    ValidationConfiguration
    ValidationOptions
    ValidationResult
    ValidationSelectorOptions
    ValidationSyntaxNode
    ValidationSyntaxResult
    VariableScopeInfo
    VisitorNodeMap
    WalkAttributesResult
    WalkResult
    WhitespaceToken

    Type Aliases

    AstNode
    AstRuleList
    AtRuleVisitorHandler
    BinaryExpressionNode
    DeclarationVisitorHandler
    GenericVisitorAstNodeHandlerMap
    GenericVisitorHandler
    GenericVisitorResult
    LoadResult
    RawSelectorTokens
    RuleVisitorHandler
    Token
    UnaryExpressionNode
    ValueVisitorHandler
    WalkerFilter
    WalkerOption
    WalkerValueFilter

    Variables

    mathFuncs
    transformFunctions

    Function walkValues

    • walk ast node value tokens

      Parameters

      • values: Token[]
      • root: any = null
      • Optionalfilter:
            | WalkerValueFilter
            | {
                event?: WalkerEvent;
                fn?: WalkerValueFilter;
                type?: EnumToken
                | EnumToken[]
                | ((token: Token) => boolean);
            }
            | null
      • Optionalreverse: boolean

        Example:

        -

        import {AstDeclaration, EnumToken, transform, walkValues} from '@tbela99/css-parser';

        const css = `
        body { color: color(from var(--base-color) display-p3 r calc(g + 0.24) calc(b + 0.15)); }
        `;

        const result = await transform(css);
        const declaration = result.ast.chi[0].chi[0] as AstDeclaration;

        // walk the node attribute's tokens in reverse order
        for (const {value} of walkValues(declaration.val, null, null,true)) {

        console.error([EnumToken[value.typ], value.val]);
        }

        // [ "Color", "color" ]
        // [ "FunctionTokenType", "calc" ]
        // [ "Number", 0.15 ]
        // [ "Add", undefined ]
        // [ "Iden", "b" ]
        // [ "Whitespace", undefined ]
        // [ "FunctionTokenType", "calc" ]
        // [ "Number", 0.24 ]
        // [ "Add", undefined ]
        // [ "Iden", "g" ]
        // [ "Whitespace", undefined ]
        // [ "Iden", "r" ]
        // [ "Whitespace", undefined ]
        // [ "Iden", "display-p3" ]
        // [ "Whitespace", undefined ]
        // [ "FunctionTokenType", "var" ]
        // [ "DashedIden", "--base-color" ]
        // [ "Whitespace", undefined ]
        // [ "Iden", "from" ] +

        import {AstDeclaration, EnumToken, transform, walkValues} from '@tbela99/css-parser';

        const css = `
        body { color: color(from var(--base-color) display-p3 r calc(g + 0.24) calc(b + 0.15)); }
        `;

        const result = await transform(css);
        const declaration = result.ast.chi[0].chi[0] as AstDeclaration;

        // walk the node attribute's tokens in reverse order
        for (const {value} of walkValues(declaration.val, null, null,true)) {

        console.error([EnumToken[value.typ], value.val]);
        }

        // [ "Color", "color" ]
        // [ "FunctionTokenType", "calc" ]
        // [ "Number", 0.15 ]
        // [ "Add", undefined ]
        // [ "Iden", "b" ]
        // [ "Whitespace", undefined ]
        // [ "FunctionTokenType", "calc" ]
        // [ "Number", 0.24 ]
        // [ "Add", undefined ]
        // [ "Iden", "g" ]
        // [ "Whitespace", undefined ]
        // [ "Iden", "r" ]
        // [ "Whitespace", undefined ]
        // [ "Iden", "display-p3" ]
        // [ "Whitespace", undefined ]
        // [ "FunctionTokenType", "var" ]
        // [ "DashedIden", "--base-color" ]
        // [ "Whitespace", undefined ]
        // [ "Iden", "from" ]
        -

      Returns Generator<WalkAttributesResult>

    Module web

    Functions

    parse
    parseFile
    render
    transform
    transformFile

    References

    AddToken → AddToken
    AngleToken → AngleToken
    AstAtRule → AstAtRule
    AstComment → AstComment
    AstDeclaration → AstDeclaration
    AstInvalidAtRule → AstInvalidAtRule
    AstInvalidDeclaration → AstInvalidDeclaration
    AstInvalidRule → AstInvalidRule
    AstKeyFrameRule → AstKeyFrameRule
    AstKeyframesAtRule → AstKeyframesAtRule
    AstKeyframesRule → AstKeyframesRule
    AstNode → AstNode
    AstRule → AstRule
    AstRuleList → AstRuleList
    AstStyleSheet → AstStyleSheet
    AtRuleToken → AtRuleToken
    AtRuleVisitorHandler → AtRuleVisitorHandler
    AttrEndToken → AttrEndToken
    AttrStartToken → AttrStartToken
    AttrToken → AttrToken
    BadCDOCommentToken → BadCDOCommentToken
    BadCommentToken → BadCommentToken
    BadStringToken → BadStringToken
    BadUrlToken → BadUrlToken
    BaseToken → BaseToken
    BinaryExpressionNode → BinaryExpressionNode
    BinaryExpressionToken → BinaryExpressionToken
    BlockEndToken → BlockEndToken
    BlockStartToken → BlockStartToken
    CDOCommentToken → CDOCommentToken
    ChildCombinatorToken → ChildCombinatorToken
    ClassSelectorToken → ClassSelectorToken
    ColonToken → ColonToken
    ColorToken → ColorToken
    ColorType → ColorType
    ColumnCombinatorToken → ColumnCombinatorToken
    CommaToken → CommaToken
    CommentToken → CommentToken
    ComposesSelectorToken → ComposesSelectorToken
    ContainMatchToken → ContainMatchToken
    Context → Context
    CssVariableImportTokenType → CssVariableImportTokenType
    CssVariableMapTokenType → CssVariableMapTokenType
    CssVariableToken → CssVariableToken
    DashedIdentToken → DashedIdentToken
    DashMatchToken → DashMatchToken
    DeclarationVisitorHandler → DeclarationVisitorHandler
    DelimToken → DelimToken
    DescendantCombinatorToken → DescendantCombinatorToken
    DimensionToken → DimensionToken
    DivToken → DivToken
    EndMatchToken → EndMatchToken
    EnumToken → EnumToken
    EOFToken → EOFToken
    EqualMatchToken → EqualMatchToken
    ErrorDescription → ErrorDescription
    FlexToken → FlexToken
    FractionToken → FractionToken
    FrequencyToken → FrequencyToken
    FunctionImageToken → FunctionImageToken
    FunctionToken → FunctionToken
    FunctionURLToken → FunctionURLToken
    GenericVisitorAstNodeHandlerMap → GenericVisitorAstNodeHandlerMap
    GenericVisitorHandler → GenericVisitorHandler
    GenericVisitorResult → GenericVisitorResult
    GreaterThanOrEqualToken → GreaterThanOrEqualToken
    GreaterThanToken → GreaterThanToken
    GridTemplateFuncToken → GridTemplateFuncToken
    HashToken → HashToken
    IdentListToken → IdentListToken
    IdentToken → IdentToken
    ImportantToken → ImportantToken
    IncludeMatchToken → IncludeMatchToken
    InvalidAttrToken → InvalidAttrToken
    InvalidClassSelectorToken → InvalidClassSelectorToken
    LengthToken → LengthToken
    LessThanOrEqualToken → LessThanOrEqualToken
    LessThanToken → LessThanToken
    ListToken → ListToken
    LiteralToken → LiteralToken
    LoadResult → LoadResult
    Location → Location
    MatchedSelector → MatchedSelector
    MatchExpressionToken → MatchExpressionToken
    mathFuncs → mathFuncs
    MediaFeatureAndToken → MediaFeatureAndToken
    MediaFeatureNotToken → MediaFeatureNotToken
    MediaFeatureOnlyToken → MediaFeatureOnlyToken
    MediaFeatureOrToken → MediaFeatureOrToken
    MediaFeatureToken → MediaFeatureToken
    MediaQueryConditionToken → MediaQueryConditionToken
    MinifyFeature → MinifyFeature
    MinifyFeatureOptions → MinifyFeatureOptions
    MinifyOptions → MinifyOptions
    ModuleCaseTransformEnum → ModuleCaseTransformEnum
    ModuleOptions → ModuleOptions
    ModuleScopeEnumOptions → ModuleScopeEnumOptions
    MulToken → MulToken
    NameSpaceAttributeToken → NameSpaceAttributeToken
    NestingSelectorToken → NestingSelectorToken
    NextSiblingCombinatorToken → NextSiblingCombinatorToken
    NumberToken → NumberToken
    ParensEndToken → ParensEndToken
    ParensStartToken → ParensStartToken
    ParensToken → ParensToken
    parseDeclarations → parseDeclarations
    ParseInfo → ParseInfo
    ParseResult → ParseResult
    ParseResultStats → ParseResultStats
    ParserOptions → ParserOptions
    ParseTokenOptions → ParseTokenOptions
    PercentageToken → PercentageToken
    Position → Position
    PropertyListOptions → PropertyListOptions
    PropertyMapType → PropertyMapType
    PropertySetType → PropertySetType
    PropertyType → PropertyType
    PseudoClassFunctionToken → PseudoClassFunctionToken
    PseudoClassToken → PseudoClassToken
    PseudoElementToken → PseudoElementToken
    PseudoPageToken → PseudoPageToken
    RawSelectorTokens → RawSelectorTokens
    RenderOptions → RenderOptions
    RenderResult → RenderResult
    ResolutionToken → ResolutionToken
    ResolvedPath → ResolvedPath
    ResponseType → ResponseType
    RuleVisitorHandler → RuleVisitorHandler
    SemiColonToken → SemiColonToken
    ShorthandDef → ShorthandDef
    ShorthandMapType → ShorthandMapType
    ShorthandProperties → ShorthandProperties
    ShorthandPropertyType → ShorthandPropertyType
    ShorthandType → ShorthandType
    SourceMap → SourceMap
    SourceMapObject → SourceMapObject
    StartMatchToken → StartMatchToken
    StringToken → StringToken
    SubsequentCombinatorToken → SubsequentCombinatorToken
    SubToken → SubToken
    TimelineFunctionToken → TimelineFunctionToken
    TimeToken → TimeToken
    TimingFunctionToken → TimingFunctionToken
    Token → Token
    TokenizeResult → TokenizeResult
    transformFunctions → transformFunctions
    TransformOptions → TransformOptions
    TransformResult → TransformResult
    UnaryExpression → UnaryExpression
    UnaryExpressionNode → UnaryExpressionNode
    UnclosedStringToken → UnclosedStringToken
    UniversalSelectorToken → UniversalSelectorToken
    UrlToken → UrlToken
    ValidationConfiguration → ValidationConfiguration
    ValidationLevel → ValidationLevel
    ValidationOptions → ValidationOptions
    ValidationResult → ValidationResult
    ValidationSelectorOptions → ValidationSelectorOptions
    ValidationSyntaxNode → ValidationSyntaxNode
    ValidationSyntaxResult → ValidationSyntaxResult
    ValueVisitorHandler → ValueVisitorHandler
    VariableScopeInfo → VariableScopeInfo
    VisitorNodeMap → VisitorNodeMap
    walk → walk
    WalkAttributesResult → WalkAttributesResult
    WalkerEvent → WalkerEvent
    WalkerFilter → WalkerFilter
    WalkerOption → WalkerOption
    WalkerOptionEnum → WalkerOptionEnum
    WalkerValueFilter → WalkerValueFilter
    WalkResult → WalkResult
    walkValues → walkValues
    WhitespaceToken → WhitespaceToken

    Module web

    Functions

    load
    parse
    parseFile
    render
    transform
    transformFile

    References

    AddToken → AddToken
    AngleToken → AngleToken
    AstAtRule → AstAtRule
    AstComment → AstComment
    AstDeclaration → AstDeclaration
    AstInvalidAtRule → AstInvalidAtRule
    AstInvalidDeclaration → AstInvalidDeclaration
    AstInvalidRule → AstInvalidRule
    AstKeyFrameRule → AstKeyFrameRule
    AstKeyframesAtRule → AstKeyframesAtRule
    AstKeyframesRule → AstKeyframesRule
    AstNode → AstNode
    AstRule → AstRule
    AstRuleList → AstRuleList
    AstStyleSheet → AstStyleSheet
    AtRuleToken → AtRuleToken
    AtRuleVisitorHandler → AtRuleVisitorHandler
    AttrEndToken → AttrEndToken
    AttrStartToken → AttrStartToken
    AttrToken → AttrToken
    BadCDOCommentToken → BadCDOCommentToken
    BadCommentToken → BadCommentToken
    BadStringToken → BadStringToken
    BadUrlToken → BadUrlToken
    BaseToken → BaseToken
    BinaryExpressionNode → BinaryExpressionNode
    BinaryExpressionToken → BinaryExpressionToken
    BlockEndToken → BlockEndToken
    BlockStartToken → BlockStartToken
    CDOCommentToken → CDOCommentToken
    ChildCombinatorToken → ChildCombinatorToken
    ClassSelectorToken → ClassSelectorToken
    ColonToken → ColonToken
    ColorToken → ColorToken
    ColorType → ColorType
    ColumnCombinatorToken → ColumnCombinatorToken
    CommaToken → CommaToken
    CommentToken → CommentToken
    ComposesSelectorToken → ComposesSelectorToken
    ContainMatchToken → ContainMatchToken
    Context → Context
    CssVariableImportTokenType → CssVariableImportTokenType
    CssVariableMapTokenType → CssVariableMapTokenType
    CssVariableToken → CssVariableToken
    DashedIdentToken → DashedIdentToken
    DashMatchToken → DashMatchToken
    DeclarationVisitorHandler → DeclarationVisitorHandler
    DelimToken → DelimToken
    DescendantCombinatorToken → DescendantCombinatorToken
    DimensionToken → DimensionToken
    DivToken → DivToken
    EndMatchToken → EndMatchToken
    EnumToken → EnumToken
    EOFToken → EOFToken
    EqualMatchToken → EqualMatchToken
    ErrorDescription → ErrorDescription
    FlexToken → FlexToken
    FractionToken → FractionToken
    FrequencyToken → FrequencyToken
    FunctionImageToken → FunctionImageToken
    FunctionToken → FunctionToken
    FunctionURLToken → FunctionURLToken
    GenericVisitorAstNodeHandlerMap → GenericVisitorAstNodeHandlerMap
    GenericVisitorHandler → GenericVisitorHandler
    GenericVisitorResult → GenericVisitorResult
    GreaterThanOrEqualToken → GreaterThanOrEqualToken
    GreaterThanToken → GreaterThanToken
    GridTemplateFuncToken → GridTemplateFuncToken
    HashToken → HashToken
    IdentListToken → IdentListToken
    IdentToken → IdentToken
    ImportantToken → ImportantToken
    IncludeMatchToken → IncludeMatchToken
    InvalidAttrToken → InvalidAttrToken
    InvalidClassSelectorToken → InvalidClassSelectorToken
    LengthToken → LengthToken
    LessThanOrEqualToken → LessThanOrEqualToken
    LessThanToken → LessThanToken
    ListToken → ListToken
    LiteralToken → LiteralToken
    LoadResult → LoadResult
    Location → Location
    MatchedSelector → MatchedSelector
    MatchExpressionToken → MatchExpressionToken
    mathFuncs → mathFuncs
    MediaFeatureAndToken → MediaFeatureAndToken
    MediaFeatureNotToken → MediaFeatureNotToken
    MediaFeatureOnlyToken → MediaFeatureOnlyToken
    MediaFeatureOrToken → MediaFeatureOrToken
    MediaFeatureToken → MediaFeatureToken
    MediaQueryConditionToken → MediaQueryConditionToken
    MinifyFeature → MinifyFeature
    MinifyFeatureOptions → MinifyFeatureOptions
    MinifyOptions → MinifyOptions
    ModuleCaseTransformEnum → ModuleCaseTransformEnum
    ModuleOptions → ModuleOptions
    ModuleScopeEnumOptions → ModuleScopeEnumOptions
    MulToken → MulToken
    NameSpaceAttributeToken → NameSpaceAttributeToken
    NestingSelectorToken → NestingSelectorToken
    NextSiblingCombinatorToken → NextSiblingCombinatorToken
    NumberToken → NumberToken
    ParensEndToken → ParensEndToken
    ParensStartToken → ParensStartToken
    ParensToken → ParensToken
    parseDeclarations → parseDeclarations
    ParseInfo → ParseInfo
    ParseResult → ParseResult
    ParseResultStats → ParseResultStats
    ParserOptions → ParserOptions
    ParseTokenOptions → ParseTokenOptions
    PercentageToken → PercentageToken
    Position → Position
    PropertyListOptions → PropertyListOptions
    PropertyMapType → PropertyMapType
    PropertySetType → PropertySetType
    PropertyType → PropertyType
    PseudoClassFunctionToken → PseudoClassFunctionToken
    PseudoClassToken → PseudoClassToken
    PseudoElementToken → PseudoElementToken
    PseudoPageToken → PseudoPageToken
    RawSelectorTokens → RawSelectorTokens
    RenderOptions → RenderOptions
    RenderResult → RenderResult
    ResolutionToken → ResolutionToken
    ResolvedPath → ResolvedPath
    ResponseType → ResponseType
    RuleVisitorHandler → RuleVisitorHandler
    SemiColonToken → SemiColonToken
    ShorthandDef → ShorthandDef
    ShorthandMapType → ShorthandMapType
    ShorthandProperties → ShorthandProperties
    ShorthandPropertyType → ShorthandPropertyType
    ShorthandType → ShorthandType
    SourceMap → SourceMap
    SourceMapObject → SourceMapObject
    StartMatchToken → StartMatchToken
    StringToken → StringToken
    SubsequentCombinatorToken → SubsequentCombinatorToken
    SubToken → SubToken
    TimelineFunctionToken → TimelineFunctionToken
    TimeToken → TimeToken
    TimingFunctionToken → TimingFunctionToken
    Token → Token
    TokenizeResult → TokenizeResult
    transformFunctions → transformFunctions
    TransformOptions → TransformOptions
    TransformResult → TransformResult
    UnaryExpression → UnaryExpression
    UnaryExpressionNode → UnaryExpressionNode
    UnclosedStringToken → UnclosedStringToken
    UniversalSelectorToken → UniversalSelectorToken
    UrlToken → UrlToken
    ValidationConfiguration → ValidationConfiguration
    ValidationLevel → ValidationLevel
    ValidationOptions → ValidationOptions
    ValidationResult → ValidationResult
    ValidationSelectorOptions → ValidationSelectorOptions
    ValidationSyntaxNode → ValidationSyntaxNode
    ValidationSyntaxResult → ValidationSyntaxResult
    ValueVisitorHandler → ValueVisitorHandler
    VariableScopeInfo → VariableScopeInfo
    VisitorNodeMap → VisitorNodeMap
    walk → walk
    WalkAttributesResult → WalkAttributesResult
    WalkerEvent → WalkerEvent
    WalkerFilter → WalkerFilter
    WalkerOption → WalkerOption
    WalkerOptionEnum → WalkerOptionEnum
    WalkerValueFilter → WalkerValueFilter
    WalkResult → WalkResult
    walkValues → walkValues
    WhitespaceToken → WhitespaceToken

    Module node

    Functions

    parse
    parseDeclarations
    parseFile
    render
    transform
    transformFile
    walk
    walkValues

    Classes

    SourceMap

    Enumerations

    ColorType
    EnumToken
    ModuleCaseTransformEnum
    ModuleScopeEnumOptions
    ResponseType
    ValidationLevel
    WalkerEvent
    WalkerOptionEnum

    Interfaces

    AddToken
    AngleToken
    AstAtRule
    AstComment
    AstDeclaration
    AstInvalidAtRule
    AstInvalidDeclaration
    AstInvalidRule
    AstKeyFrameRule
    AstKeyframesAtRule
    AstKeyframesRule
    AstRule
    AstStyleSheet
    AtRuleToken
    AttrEndToken
    AttrStartToken
    AttrToken
    BadCDOCommentToken
    BadCommentToken
    BadStringToken
    BadUrlToken
    BaseToken
    BinaryExpressionToken
    BlockEndToken
    BlockStartToken
    CDOCommentToken
    ChildCombinatorToken
    ClassSelectorToken
    ColonToken
    ColorToken
    ColumnCombinatorToken
    CommaToken
    CommentToken
    ComposesSelectorToken
    ContainMatchToken
    Context
    CssVariableImportTokenType
    CssVariableMapTokenType
    CssVariableToken
    DashedIdentToken
    DashMatchToken
    DelimToken
    DescendantCombinatorToken
    DimensionToken
    DivToken
    EndMatchToken
    EOFToken
    EqualMatchToken
    ErrorDescription
    FlexToken
    FractionToken
    FrequencyToken
    FunctionImageToken
    FunctionToken
    FunctionURLToken
    GreaterThanOrEqualToken
    GreaterThanToken
    GridTemplateFuncToken
    HashToken
    IdentListToken
    IdentToken
    ImportantToken
    IncludeMatchToken
    InvalidAttrToken
    InvalidClassSelectorToken
    LengthToken
    LessThanOrEqualToken
    LessThanToken
    ListToken
    LiteralToken
    Location
    MatchedSelector
    MatchExpressionToken
    MediaFeatureAndToken
    MediaFeatureNotToken
    MediaFeatureOnlyToken
    MediaFeatureOrToken
    MediaFeatureToken
    MediaQueryConditionToken
    MinifyFeature
    MinifyFeatureOptions
    MinifyOptions
    ModuleOptions
    MulToken
    NameSpaceAttributeToken
    NestingSelectorToken
    NextSiblingCombinatorToken
    NumberToken
    ParensEndToken
    ParensStartToken
    ParensToken
    ParseInfo
    ParseResult
    ParseResultStats
    ParserOptions
    ParseTokenOptions
    PercentageToken
    Position
    PropertyListOptions
    PropertyMapType
    PropertySetType
    PropertyType
    PseudoClassFunctionToken
    PseudoClassToken
    PseudoElementToken
    PseudoPageToken
    RenderOptions
    RenderResult
    ResolutionToken
    ResolvedPath
    SemiColonToken
    ShorthandDef
    ShorthandMapType
    ShorthandProperties
    ShorthandPropertyType
    ShorthandType
    SourceMapObject
    StartMatchToken
    StringToken
    SubsequentCombinatorToken
    SubToken
    TimelineFunctionToken
    TimeToken
    TimingFunctionToken
    TokenizeResult
    TransformOptions
    TransformResult
    UnaryExpression
    UnclosedStringToken
    UniversalSelectorToken
    UrlToken
    ValidationConfiguration
    ValidationOptions
    ValidationResult
    ValidationSelectorOptions
    ValidationSyntaxNode
    ValidationSyntaxResult
    VariableScopeInfo
    VisitorNodeMap
    WalkAttributesResult
    WalkResult
    WhitespaceToken

    Type Aliases

    AstNode
    AstRuleList
    AtRuleVisitorHandler
    BinaryExpressionNode
    DeclarationVisitorHandler
    GenericVisitorAstNodeHandlerMap
    GenericVisitorHandler
    GenericVisitorResult
    LoadResult
    RawSelectorTokens
    RuleVisitorHandler
    Token
    UnaryExpressionNode
    ValueVisitorHandler
    WalkerFilter
    WalkerOption
    WalkerValueFilter

    Variables

    mathFuncs
    transformFunctions

    Module node

    Functions

    load
    parse
    parseDeclarations
    parseFile
    render
    transform
    transformFile
    walk
    walkValues

    Classes

    SourceMap

    Enumerations

    ColorType
    EnumToken
    ModuleCaseTransformEnum
    ModuleScopeEnumOptions
    ResponseType
    ValidationLevel
    WalkerEvent
    WalkerOptionEnum

    Interfaces

    AddToken
    AngleToken
    AstAtRule
    AstComment
    AstDeclaration
    AstInvalidAtRule
    AstInvalidDeclaration
    AstInvalidRule
    AstKeyFrameRule
    AstKeyframesAtRule
    AstKeyframesRule
    AstRule
    AstStyleSheet
    AtRuleToken
    AttrEndToken
    AttrStartToken
    AttrToken
    BadCDOCommentToken
    BadCommentToken
    BadStringToken
    BadUrlToken
    BaseToken
    BinaryExpressionToken
    BlockEndToken
    BlockStartToken
    CDOCommentToken
    ChildCombinatorToken
    ClassSelectorToken
    ColonToken
    ColorToken
    ColumnCombinatorToken
    CommaToken
    CommentToken
    ComposesSelectorToken
    ContainMatchToken
    Context
    CssVariableImportTokenType
    CssVariableMapTokenType
    CssVariableToken
    DashedIdentToken
    DashMatchToken
    DelimToken
    DescendantCombinatorToken
    DimensionToken
    DivToken
    EndMatchToken
    EOFToken
    EqualMatchToken
    ErrorDescription
    FlexToken
    FractionToken
    FrequencyToken
    FunctionImageToken
    FunctionToken
    FunctionURLToken
    GreaterThanOrEqualToken
    GreaterThanToken
    GridTemplateFuncToken
    HashToken
    IdentListToken
    IdentToken
    ImportantToken
    IncludeMatchToken
    InvalidAttrToken
    InvalidClassSelectorToken
    LengthToken
    LessThanOrEqualToken
    LessThanToken
    ListToken
    LiteralToken
    Location
    MatchedSelector
    MatchExpressionToken
    MediaFeatureAndToken
    MediaFeatureNotToken
    MediaFeatureOnlyToken
    MediaFeatureOrToken
    MediaFeatureToken
    MediaQueryConditionToken
    MinifyFeature
    MinifyFeatureOptions
    MinifyOptions
    ModuleOptions
    MulToken
    NameSpaceAttributeToken
    NestingSelectorToken
    NextSiblingCombinatorToken
    NumberToken
    ParensEndToken
    ParensStartToken
    ParensToken
    ParseInfo
    ParseResult
    ParseResultStats
    ParserOptions
    ParseTokenOptions
    PercentageToken
    Position
    PropertyListOptions
    PropertyMapType
    PropertySetType
    PropertyType
    PseudoClassFunctionToken
    PseudoClassToken
    PseudoElementToken
    PseudoPageToken
    RenderOptions
    RenderResult
    ResolutionToken
    ResolvedPath
    SemiColonToken
    ShorthandDef
    ShorthandMapType
    ShorthandProperties
    ShorthandPropertyType
    ShorthandType
    SourceMapObject
    StartMatchToken
    StringToken
    SubsequentCombinatorToken
    SubToken
    TimelineFunctionToken
    TimeToken
    TimingFunctionToken
    TokenizeResult
    TransformOptions
    TransformResult
    UnaryExpression
    UnclosedStringToken
    UniversalSelectorToken
    UrlToken
    ValidationConfiguration
    ValidationOptions
    ValidationResult
    ValidationSelectorOptions
    ValidationSyntaxNode
    ValidationSyntaxResult
    VariableScopeInfo
    VisitorNodeMap
    WalkAttributesResult
    WalkResult
    WhitespaceToken

    Type Aliases

    AstNode
    AstRuleList
    AtRuleVisitorHandler
    BinaryExpressionNode
    DeclarationVisitorHandler
    GenericVisitorAstNodeHandlerMap
    GenericVisitorHandler
    GenericVisitorResult
    LoadResult
    RawSelectorTokens
    RuleVisitorHandler
    Token
    UnaryExpressionNode
    ValueVisitorHandler
    WalkerFilter
    WalkerOption
    WalkerValueFilter

    Variables

    mathFuncs
    transformFunctions

    Module web

    Functions

    parse
    parseFile
    render
    transform
    transformFile

    References

    AddToken → AddToken
    AngleToken → AngleToken
    AstAtRule → AstAtRule
    AstComment → AstComment
    AstDeclaration → AstDeclaration
    AstInvalidAtRule → AstInvalidAtRule
    AstInvalidDeclaration → AstInvalidDeclaration
    AstInvalidRule → AstInvalidRule
    AstKeyFrameRule → AstKeyFrameRule
    AstKeyframesAtRule → AstKeyframesAtRule
    AstKeyframesRule → AstKeyframesRule
    AstNode → AstNode
    AstRule → AstRule
    AstRuleList → AstRuleList
    AstStyleSheet → AstStyleSheet
    AtRuleToken → AtRuleToken
    AtRuleVisitorHandler → AtRuleVisitorHandler
    AttrEndToken → AttrEndToken
    AttrStartToken → AttrStartToken
    AttrToken → AttrToken
    BadCDOCommentToken → BadCDOCommentToken
    BadCommentToken → BadCommentToken
    BadStringToken → BadStringToken
    BadUrlToken → BadUrlToken
    BaseToken → BaseToken
    BinaryExpressionNode → BinaryExpressionNode
    BinaryExpressionToken → BinaryExpressionToken
    BlockEndToken → BlockEndToken
    BlockStartToken → BlockStartToken
    CDOCommentToken → CDOCommentToken
    ChildCombinatorToken → ChildCombinatorToken
    ClassSelectorToken → ClassSelectorToken
    ColonToken → ColonToken
    ColorToken → ColorToken
    ColorType → ColorType
    ColumnCombinatorToken → ColumnCombinatorToken
    CommaToken → CommaToken
    CommentToken → CommentToken
    ComposesSelectorToken → ComposesSelectorToken
    ContainMatchToken → ContainMatchToken
    Context → Context
    CssVariableImportTokenType → CssVariableImportTokenType
    CssVariableMapTokenType → CssVariableMapTokenType
    CssVariableToken → CssVariableToken
    DashedIdentToken → DashedIdentToken
    DashMatchToken → DashMatchToken
    DeclarationVisitorHandler → DeclarationVisitorHandler
    DelimToken → DelimToken
    DescendantCombinatorToken → DescendantCombinatorToken
    DimensionToken → DimensionToken
    DivToken → DivToken
    EndMatchToken → EndMatchToken
    EnumToken → EnumToken
    EOFToken → EOFToken
    EqualMatchToken → EqualMatchToken
    ErrorDescription → ErrorDescription
    FlexToken → FlexToken
    FractionToken → FractionToken
    FrequencyToken → FrequencyToken
    FunctionImageToken → FunctionImageToken
    FunctionToken → FunctionToken
    FunctionURLToken → FunctionURLToken
    GenericVisitorAstNodeHandlerMap → GenericVisitorAstNodeHandlerMap
    GenericVisitorHandler → GenericVisitorHandler
    GenericVisitorResult → GenericVisitorResult
    GreaterThanOrEqualToken → GreaterThanOrEqualToken
    GreaterThanToken → GreaterThanToken
    GridTemplateFuncToken → GridTemplateFuncToken
    HashToken → HashToken
    IdentListToken → IdentListToken
    IdentToken → IdentToken
    ImportantToken → ImportantToken
    IncludeMatchToken → IncludeMatchToken
    InvalidAttrToken → InvalidAttrToken
    InvalidClassSelectorToken → InvalidClassSelectorToken
    LengthToken → LengthToken
    LessThanOrEqualToken → LessThanOrEqualToken
    LessThanToken → LessThanToken
    ListToken → ListToken
    LiteralToken → LiteralToken
    LoadResult → LoadResult
    Location → Location
    MatchedSelector → MatchedSelector
    MatchExpressionToken → MatchExpressionToken
    mathFuncs → mathFuncs
    MediaFeatureAndToken → MediaFeatureAndToken
    MediaFeatureNotToken → MediaFeatureNotToken
    MediaFeatureOnlyToken → MediaFeatureOnlyToken
    MediaFeatureOrToken → MediaFeatureOrToken
    MediaFeatureToken → MediaFeatureToken
    MediaQueryConditionToken → MediaQueryConditionToken
    MinifyFeature → MinifyFeature
    MinifyFeatureOptions → MinifyFeatureOptions
    MinifyOptions → MinifyOptions
    ModuleCaseTransformEnum → ModuleCaseTransformEnum
    ModuleOptions → ModuleOptions
    ModuleScopeEnumOptions → ModuleScopeEnumOptions
    MulToken → MulToken
    NameSpaceAttributeToken → NameSpaceAttributeToken
    NestingSelectorToken → NestingSelectorToken
    NextSiblingCombinatorToken → NextSiblingCombinatorToken
    NumberToken → NumberToken
    ParensEndToken → ParensEndToken
    ParensStartToken → ParensStartToken
    ParensToken → ParensToken
    parseDeclarations → parseDeclarations
    ParseInfo → ParseInfo
    ParseResult → ParseResult
    ParseResultStats → ParseResultStats
    ParserOptions → ParserOptions
    ParseTokenOptions → ParseTokenOptions
    PercentageToken → PercentageToken
    Position → Position
    PropertyListOptions → PropertyListOptions
    PropertyMapType → PropertyMapType
    PropertySetType → PropertySetType
    PropertyType → PropertyType
    PseudoClassFunctionToken → PseudoClassFunctionToken
    PseudoClassToken → PseudoClassToken
    PseudoElementToken → PseudoElementToken
    PseudoPageToken → PseudoPageToken
    RawSelectorTokens → RawSelectorTokens
    RenderOptions → RenderOptions
    RenderResult → RenderResult
    ResolutionToken → ResolutionToken
    ResolvedPath → ResolvedPath
    ResponseType → ResponseType
    RuleVisitorHandler → RuleVisitorHandler
    SemiColonToken → SemiColonToken
    ShorthandDef → ShorthandDef
    ShorthandMapType → ShorthandMapType
    ShorthandProperties → ShorthandProperties
    ShorthandPropertyType → ShorthandPropertyType
    ShorthandType → ShorthandType
    SourceMap → SourceMap
    SourceMapObject → SourceMapObject
    StartMatchToken → StartMatchToken
    StringToken → StringToken
    SubsequentCombinatorToken → SubsequentCombinatorToken
    SubToken → SubToken
    TimelineFunctionToken → TimelineFunctionToken
    TimeToken → TimeToken
    TimingFunctionToken → TimingFunctionToken
    Token → Token
    TokenizeResult → TokenizeResult
    transformFunctions → transformFunctions
    TransformOptions → TransformOptions
    TransformResult → TransformResult
    UnaryExpression → UnaryExpression
    UnaryExpressionNode → UnaryExpressionNode
    UnclosedStringToken → UnclosedStringToken
    UniversalSelectorToken → UniversalSelectorToken
    UrlToken → UrlToken
    ValidationConfiguration → ValidationConfiguration
    ValidationLevel → ValidationLevel
    ValidationOptions → ValidationOptions
    ValidationResult → ValidationResult
    ValidationSelectorOptions → ValidationSelectorOptions
    ValidationSyntaxNode → ValidationSyntaxNode
    ValidationSyntaxResult → ValidationSyntaxResult
    ValueVisitorHandler → ValueVisitorHandler
    VariableScopeInfo → VariableScopeInfo
    VisitorNodeMap → VisitorNodeMap
    walk → walk
    WalkAttributesResult → WalkAttributesResult
    WalkerEvent → WalkerEvent
    WalkerFilter → WalkerFilter
    WalkerOption → WalkerOption
    WalkerOptionEnum → WalkerOptionEnum
    WalkerValueFilter → WalkerValueFilter
    WalkResult → WalkResult
    walkValues → walkValues
    WhitespaceToken → WhitespaceToken

    Module web

    Functions

    load
    parse
    parseFile
    render
    transform
    transformFile

    References

    AddToken → AddToken
    AngleToken → AngleToken
    AstAtRule → AstAtRule
    AstComment → AstComment
    AstDeclaration → AstDeclaration
    AstInvalidAtRule → AstInvalidAtRule
    AstInvalidDeclaration → AstInvalidDeclaration
    AstInvalidRule → AstInvalidRule
    AstKeyFrameRule → AstKeyFrameRule
    AstKeyframesAtRule → AstKeyframesAtRule
    AstKeyframesRule → AstKeyframesRule
    AstNode → AstNode
    AstRule → AstRule
    AstRuleList → AstRuleList
    AstStyleSheet → AstStyleSheet
    AtRuleToken → AtRuleToken
    AtRuleVisitorHandler → AtRuleVisitorHandler
    AttrEndToken → AttrEndToken
    AttrStartToken → AttrStartToken
    AttrToken → AttrToken
    BadCDOCommentToken → BadCDOCommentToken
    BadCommentToken → BadCommentToken
    BadStringToken → BadStringToken
    BadUrlToken → BadUrlToken
    BaseToken → BaseToken
    BinaryExpressionNode → BinaryExpressionNode
    BinaryExpressionToken → BinaryExpressionToken
    BlockEndToken → BlockEndToken
    BlockStartToken → BlockStartToken
    CDOCommentToken → CDOCommentToken
    ChildCombinatorToken → ChildCombinatorToken
    ClassSelectorToken → ClassSelectorToken
    ColonToken → ColonToken
    ColorToken → ColorToken
    ColorType → ColorType
    ColumnCombinatorToken → ColumnCombinatorToken
    CommaToken → CommaToken
    CommentToken → CommentToken
    ComposesSelectorToken → ComposesSelectorToken
    ContainMatchToken → ContainMatchToken
    Context → Context
    CssVariableImportTokenType → CssVariableImportTokenType
    CssVariableMapTokenType → CssVariableMapTokenType
    CssVariableToken → CssVariableToken
    DashedIdentToken → DashedIdentToken
    DashMatchToken → DashMatchToken
    DeclarationVisitorHandler → DeclarationVisitorHandler
    DelimToken → DelimToken
    DescendantCombinatorToken → DescendantCombinatorToken
    DimensionToken → DimensionToken
    DivToken → DivToken
    EndMatchToken → EndMatchToken
    EnumToken → EnumToken
    EOFToken → EOFToken
    EqualMatchToken → EqualMatchToken
    ErrorDescription → ErrorDescription
    FlexToken → FlexToken
    FractionToken → FractionToken
    FrequencyToken → FrequencyToken
    FunctionImageToken → FunctionImageToken
    FunctionToken → FunctionToken
    FunctionURLToken → FunctionURLToken
    GenericVisitorAstNodeHandlerMap → GenericVisitorAstNodeHandlerMap
    GenericVisitorHandler → GenericVisitorHandler
    GenericVisitorResult → GenericVisitorResult
    GreaterThanOrEqualToken → GreaterThanOrEqualToken
    GreaterThanToken → GreaterThanToken
    GridTemplateFuncToken → GridTemplateFuncToken
    HashToken → HashToken
    IdentListToken → IdentListToken
    IdentToken → IdentToken
    ImportantToken → ImportantToken
    IncludeMatchToken → IncludeMatchToken
    InvalidAttrToken → InvalidAttrToken
    InvalidClassSelectorToken → InvalidClassSelectorToken
    LengthToken → LengthToken
    LessThanOrEqualToken → LessThanOrEqualToken
    LessThanToken → LessThanToken
    ListToken → ListToken
    LiteralToken → LiteralToken
    LoadResult → LoadResult
    Location → Location
    MatchedSelector → MatchedSelector
    MatchExpressionToken → MatchExpressionToken
    mathFuncs → mathFuncs
    MediaFeatureAndToken → MediaFeatureAndToken
    MediaFeatureNotToken → MediaFeatureNotToken
    MediaFeatureOnlyToken → MediaFeatureOnlyToken
    MediaFeatureOrToken → MediaFeatureOrToken
    MediaFeatureToken → MediaFeatureToken
    MediaQueryConditionToken → MediaQueryConditionToken
    MinifyFeature → MinifyFeature
    MinifyFeatureOptions → MinifyFeatureOptions
    MinifyOptions → MinifyOptions
    ModuleCaseTransformEnum → ModuleCaseTransformEnum
    ModuleOptions → ModuleOptions
    ModuleScopeEnumOptions → ModuleScopeEnumOptions
    MulToken → MulToken
    NameSpaceAttributeToken → NameSpaceAttributeToken
    NestingSelectorToken → NestingSelectorToken
    NextSiblingCombinatorToken → NextSiblingCombinatorToken
    NumberToken → NumberToken
    ParensEndToken → ParensEndToken
    ParensStartToken → ParensStartToken
    ParensToken → ParensToken
    parseDeclarations → parseDeclarations
    ParseInfo → ParseInfo
    ParseResult → ParseResult
    ParseResultStats → ParseResultStats
    ParserOptions → ParserOptions
    ParseTokenOptions → ParseTokenOptions
    PercentageToken → PercentageToken
    Position → Position
    PropertyListOptions → PropertyListOptions
    PropertyMapType → PropertyMapType
    PropertySetType → PropertySetType
    PropertyType → PropertyType
    PseudoClassFunctionToken → PseudoClassFunctionToken
    PseudoClassToken → PseudoClassToken
    PseudoElementToken → PseudoElementToken
    PseudoPageToken → PseudoPageToken
    RawSelectorTokens → RawSelectorTokens
    RenderOptions → RenderOptions
    RenderResult → RenderResult
    ResolutionToken → ResolutionToken
    ResolvedPath → ResolvedPath
    ResponseType → ResponseType
    RuleVisitorHandler → RuleVisitorHandler
    SemiColonToken → SemiColonToken
    ShorthandDef → ShorthandDef
    ShorthandMapType → ShorthandMapType
    ShorthandProperties → ShorthandProperties
    ShorthandPropertyType → ShorthandPropertyType
    ShorthandType → ShorthandType
    SourceMap → SourceMap
    SourceMapObject → SourceMapObject
    StartMatchToken → StartMatchToken
    StringToken → StringToken
    SubsequentCombinatorToken → SubsequentCombinatorToken
    SubToken → SubToken
    TimelineFunctionToken → TimelineFunctionToken
    TimeToken → TimeToken
    TimingFunctionToken → TimingFunctionToken
    Token → Token
    TokenizeResult → TokenizeResult
    transformFunctions → transformFunctions
    TransformOptions → TransformOptions
    TransformResult → TransformResult
    UnaryExpression → UnaryExpression
    UnaryExpressionNode → UnaryExpressionNode
    UnclosedStringToken → UnclosedStringToken
    UniversalSelectorToken → UniversalSelectorToken
    UrlToken → UrlToken
    ValidationConfiguration → ValidationConfiguration
    ValidationLevel → ValidationLevel
    ValidationOptions → ValidationOptions
    ValidationResult → ValidationResult
    ValidationSelectorOptions → ValidationSelectorOptions
    ValidationSyntaxNode → ValidationSyntaxNode
    ValidationSyntaxResult → ValidationSyntaxResult
    ValueVisitorHandler → ValueVisitorHandler
    VariableScopeInfo → VariableScopeInfo
    VisitorNodeMap → VisitorNodeMap
    walk → walk
    WalkAttributesResult → WalkAttributesResult
    WalkerEvent → WalkerEvent
    WalkerFilter → WalkerFilter
    WalkerOption → WalkerOption
    WalkerOptionEnum → WalkerOptionEnum
    WalkerValueFilter → WalkerValueFilter
    WalkResult → WalkResult
    walkValues → walkValues
    WhitespaceToken → WhitespaceToken

    Type Alias AstNode

    AstNode:
        | AstStyleSheet
        | AstRuleList
        | AstComment
        | AstAtRule
        | AstRule
        | AstDeclaration
        | AstKeyframesAtRule
        | AstKeyFrameRule
        | AstInvalidRule
        | AstInvalidAtRule
        | AstInvalidDeclaration
        | CssVariableToken
        | CssVariableImportTokenType

    ast node

    -

    Type Alias AstRuleList

    AstRuleList:
        | AstStyleSheet
        | AstAtRule
        | AstRule
        | AstKeyframesAtRule
        | AstKeyFrameRule
        | AstInvalidRule

    rule list node

    -

    Type Alias AtRuleVisitorHandler

    AtRuleVisitorHandler: GenericVisitorHandler<AstAtRule>

    AtRule visitor handler

    -

    Type Alias BinaryExpressionNode

    BinaryExpressionNode:
        | NumberToken
        | DimensionToken
        | PercentageToken
        | FlexToken
        | FractionToken
        | AngleToken
        | LengthToken
        | FrequencyToken
        | BinaryExpressionToken
        | FunctionToken
        | ParensToken

    Binary expression node

    -

    Type Alias DeclarationVisitorHandler

    DeclarationVisitorHandler: GenericVisitorHandler<AstDeclaration>

    Declaration visitor handler

    -

    Type Alias GenericVisitorAstNodeHandlerMap<T>

    GenericVisitorAstNodeHandlerMap:
        | Record<string, GenericVisitorHandler<T>>
        | GenericVisitorHandler<T>
        | { handler: GenericVisitorHandler<T>; type: WalkerEvent }
        | { handler: Record<string, GenericVisitorHandler<T>>; type: WalkerEvent }

    Type Parameters

    • T

    Type Alias GenericVisitorAstNodeHandlerMap<T>

    GenericVisitorAstNodeHandlerMap:
        | Record<string, GenericVisitorHandler<T>>
        | GenericVisitorHandler<T>
        | { handler: GenericVisitorHandler<T>; type: WalkerEvent }
        | { handler: Record<string, GenericVisitorHandler<T>>; type: WalkerEvent }

    Type Parameters

    • T

    Type Alias GenericVisitorHandler<T>

    GenericVisitorHandler: (
        node: T,
        parent?: AstNode | Token,
        root?: AstNode | Token,
    ) => GenericVisitorResult<T>

    Type Parameters

    • T

    Type Declaration

    Type Alias GenericVisitorHandler<T>

    GenericVisitorHandler: (
        node: T,
        parent?: AstNode | Token,
        root?: AstNode | Token,
    ) => GenericVisitorResult<T>

    Type Parameters

    • T

    Type Declaration

    Type Alias GenericVisitorResult<T>

    GenericVisitorResult: T | T[] | Promise<T> | Promise<T[]> | null | Promise<null>

    Type Parameters

    • T

    Type Alias GenericVisitorResult<T>

    GenericVisitorResult: T | T[] | Promise<T> | Promise<T[]> | null | Promise<null>

    Type Parameters

    • T

    Type Alias LoadResult

    LoadResult:
        | Promise<ReadableStream<Uint8Array>>
        | ReadableStream<Uint8Array>
        | string
        | Promise<string>

    Type Alias LoadResult

    LoadResult:
        | Promise<ReadableStream<Uint8Array>>
        | ReadableStream<Uint8Array>
        | string
        | Promise<string>

    Type Alias RawSelectorTokens

    RawSelectorTokens: string[][]

    raw selector tokens

    -

    Type Alias RuleVisitorHandler

    RuleVisitorHandler: GenericVisitorHandler<AstRule>

    Rule visitor handler

    -

    Type Alias Token

    Token:
        | InvalidClassSelectorToken
        | InvalidAttrToken
        | LiteralToken
        | IdentToken
        | IdentListToken
        | DashedIdentToken
        | CommaToken
        | ColonToken
        | SemiColonToken
        | ClassSelectorToken
        | UniversalSelectorToken
        | ChildCombinatorToken
        | DescendantCombinatorToken
        | NextSiblingCombinatorToken
        | SubsequentCombinatorToken
        | ColumnCombinatorToken
        | NestingSelectorToken
        | MediaQueryConditionToken
        | MediaFeatureToken
        | MediaFeatureNotToken
        | MediaFeatureOnlyToken
        | MediaFeatureAndToken
        | MediaFeatureOrToken
        | AstDeclaration
        | NumberToken
        | AtRuleToken
        | PercentageToken
        | FlexToken
        | FunctionURLToken
        | FunctionImageToken
        | TimingFunctionToken
        | TimelineFunctionToken
        | FunctionToken
        | GridTemplateFuncToken
        | DimensionToken
        | LengthToken
        | AngleToken
        | StringToken
        | TimeToken
        | FrequencyToken
        | ResolutionToken
        | UnclosedStringToken
        | HashToken
        | BadStringToken
        | BlockStartToken
        | BlockEndToken
        | AttrStartToken
        | AttrEndToken
        | ParensStartToken
        | ParensEndToken
        | ParensToken
        | CDOCommentToken
        | BadCDOCommentToken
        | CommentToken
        | BadCommentToken
        | WhitespaceToken
        | IncludeMatchToken
        | StartMatchToken
        | EndMatchToken
        | ContainMatchToken
        | MatchExpressionToken
        | NameSpaceAttributeToken
        | ComposesSelectorToken
        | CssVariableToken
        | DashMatchToken
        | EqualMatchToken
        | LessThanToken
        | LessThanOrEqualToken
        | GreaterThanToken
        | GreaterThanOrEqualToken
        | ListToken
        | PseudoClassToken
        | PseudoPageToken
        | PseudoElementToken
        | PseudoClassFunctionToken
        | DelimToken
        | BinaryExpressionToken
        | UnaryExpression
        | FractionToken
        | AddToken
        | SubToken
        | DivToken
        | MulToken
        | BadUrlToken
        | UrlToken
        | ImportantToken
        | ColorToken
        | AttrToken
        | EOFToken

    Token

    -

    Type Alias UnaryExpressionNode

    UnaryExpressionNode:
        | BinaryExpressionNode
        | NumberToken
        | DimensionToken
        | TimeToken
        | LengthToken
        | AngleToken
        | FrequencyToken

    Unary expression node

    -

    Type Alias ValueVisitorHandler

    ValueVisitorHandler: GenericVisitorHandler<Token>

    Type Alias ValueVisitorHandler

    ValueVisitorHandler: GenericVisitorHandler<Token>

    Type Alias WalkerOption

    WalkerOption: WalkerOptionEnum | AstNode | Token | null

    node walker option

    -

    Type Alias WalkerValueFilter

    WalkerValueFilter: (
        node: AstNode | Token,
        parent?: AstNode | Token | AstNode[] | Token[] | null,
        event?: WalkerEvent,
    ) => WalkerOption | null

    filter nodes

    -

    Type Declaration

    Variable mathFuncsConst Internal

    mathFuncs: string[] = ...

    supported math functions

    -

    Variable transformFunctionsConst Internal

    transformFunctions: string[] = ...

    supported transform functions

    -