Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[![playground](https://img.shields.io/badge/playground-try%20it%20now-%230a7398
)](https://tbela99.github.io/css-parser/playground/) [![npm](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Ftbela99%2Fcss-parser%2Fmaster%2Fpackage.json&query=version&logo=npm&label=npm&link=https%3A%2F%2Fwww.npmjs.com%2Fpackage%2F%40tbela99%2Fcss-parser)](https://www.npmjs.com/package/@tbela99/css-parser) [![npm](https://img.shields.io/jsr/v/%40tbela99/css-parser?link=https%3A%2F%2Fjsr.io%2F%40tbela99%2Fcss-parser
)](https://jsr.io/@tbela99/css-parser) [![cov](https://tbela99.github.io/css-parser/badges/coverage.svg)](https://github.com/tbela99/css-parser/actions) [![NPM Downloads](https://img.shields.io/npm/dm/%40tbela99%2Fcss-parser)](https://www.npmjs.com/package/@tbela99/css-parser)
)](https://jsr.io/@tbela99/css-parser) [![cov](https://tbela99.github.io/css-parser/badges/coverage.svg)](https://github.com/tbela99/css-parser/actions) [![NPM Downloads](https://img.shields.io/npm/dm/%40tbela99%2Fcss-parser)](https://www.npmjs.com/package/@tbela99/css-parser) [![bundle size](https://img.shields.io/bundlejs/size/%40tbela99/css-parser%400.9.0?exports=cjs)](https://www.npmjs.com/package/@tbela99/css-parser)

# css-parser

Expand Down Expand Up @@ -65,7 +65,7 @@ import as a module

```javascript

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

// ...
```
Expand Down Expand Up @@ -96,7 +96,7 @@ Javascript module from cdn

<script type="module">

import {transform} from 'https://esm.sh/@tbela99/css-parser@0.4.0/web';
import {transform} from 'https://esm.sh/@tbela99/css-parser@0.9.0/web';


const css = `
Expand Down Expand Up @@ -154,6 +154,7 @@ Include ParseOptions and RenderOptions
> Minify Options

- minify: boolean, optional. default to _true_. optimize ast.
- pass: number, optional. minification pass. default to 1
- nestingRules: boolean, optional. automatically generated nested rules.
- expandNestingRules: boolean, optional. convert nesting rules into separate rules. will automatically set nestingRules
to false.
Expand Down
6 changes: 5 additions & 1 deletion dist/index-umd-web.js
Original file line number Diff line number Diff line change
Expand Up @@ -15910,6 +15910,7 @@
src: '',
sourcemap: false,
minify: true,
pass: 1,
parseColor: true,
nestingRules: false,
resolveImport: false,
Expand Down Expand Up @@ -16089,7 +16090,10 @@
}
if (options.minify) {
if (ast.chi.length > 0) {
minify(ast, options, true, errors, false);
let passes = options.pass ?? 1;
while (passes--) {
minify(ast, options, true, errors, false);
}
}
}
const endTime = performance.now();
Expand Down
6 changes: 5 additions & 1 deletion dist/index.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -15909,6 +15909,7 @@ async function doParse(iterator, options = {}) {
src: '',
sourcemap: false,
minify: true,
pass: 1,
parseColor: true,
nestingRules: false,
resolveImport: false,
Expand Down Expand Up @@ -16088,7 +16089,10 @@ async function doParse(iterator, options = {}) {
}
if (options.minify) {
if (ast.chi.length > 0) {
minify(ast, options, true, errors, false);
let passes = options.pass ?? 1;
while (passes--) {
minify(ast, options, true, errors, false);
}
}
}
const endTime = performance.now();
Expand Down
29 changes: 17 additions & 12 deletions dist/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ declare enum EnumToken {
* @param nestingContent
* @param context
*/
declare function minify(ast: AstNode, options?: ParserOptions | MinifyOptions, recursive?: boolean, errors?: ErrorDescription[], nestingContent?: boolean, context?: {
declare function minify(ast: AstNode, options?: ParserOptions | MinifyFeatureOptions, recursive?: boolean, errors?: ErrorDescription[], nestingContent?: boolean, context?: {
[key: string]: any;
}): AstNode;

Expand Down Expand Up @@ -1035,24 +1035,29 @@ interface ValidationOptions {
lenient?: boolean;
}

export declare interface ParserOptions extends ValidationOptions, PropertyListOptions {
interface MinifyOptions {

minify?: boolean;
src?: string;
sourcemap?: boolean;
nestingRules?: boolean;
expandNestingRules?: boolean;
removeCharset?: boolean;
removeDuplicateDeclarations?: boolean;
computeShorthand?: boolean;
computeCalcExpression?: boolean;
inlineCssVariables?: boolean;
removeEmpty?: boolean;
pass?: number;
}

export declare interface ParserOptions extends MinifyOptions, ValidationOptions, PropertyListOptions {

src?: string;
sourcemap?: boolean;
removeCharset?: boolean;
resolveUrls?: boolean;
resolveImport?: boolean;
cwd?: string;
parseColor?: boolean;
removeDuplicateDeclarations?: boolean;
computeShorthand?: boolean;
removePrefix?: boolean;
inlineCssVariables?: boolean;
computeCalcExpression?: boolean;
load?: (url: string, currentUrl: string) => Promise<string>;
dirname?: (path: string) => string;
resolve?: (url: string, currentUrl: string, currentWorkingDirectory?: string) => {
Expand All @@ -1064,7 +1069,7 @@ export declare interface ParserOptions extends ValidationOptions, PropertyListOp
setParent?: boolean;
}

export declare interface MinifyOptions extends ParserOptions {
export declare interface MinifyFeatureOptions extends ParserOptions {

features: MinifyFeature[];
}
Expand All @@ -1073,7 +1078,7 @@ export declare interface MinifyFeature {

ordering: number;

register(options: MinifyOptions | ParserOptions): void;
register(options: MinifyFeatureOptions | ParserOptions): void;

// run(ast: AstRule | AstAtRule, options: ParserOptions = {}, parent: AstRule | AstAtRule | AstRuleStyleSheet, context: { [key: string]: any }): void;

Expand All @@ -1083,7 +1088,7 @@ export declare interface MinifyFeature {
export declare interface MinifyFeature {

ordering: number;
register: (options: MinifyOptions | ParserOptions) => void;
register: (options: MinifyFeatureOptions | ParserOptions) => void;
run: (ast: AstRule | AstAtRule, options: ParserOptions, parent: AstRule | AstAtRule | AstRuleStyleSheet, context: {
[key: string]: any
}) => void;
Expand Down
6 changes: 5 additions & 1 deletion dist/lib/parser/parse.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ async function doParse(iterator, options = {}) {
src: '',
sourcemap: false,
minify: true,
pass: 1,
parseColor: true,
nestingRules: false,
resolveImport: false,
Expand Down Expand Up @@ -225,7 +226,10 @@ async function doParse(iterator, options = {}) {
}
if (options.minify) {
if (ast.chi.length > 0) {
minify(ast, options, true, errors, false);
let passes = options.pass ?? 1;
while (passes--) {
minify(ast, options, true, errors, false);
}
}
}
const endTime = performance.now();
Expand Down
2 changes: 1 addition & 1 deletion jsr.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@tbela99/css-parser",
"version": "0.9.0",
"version": "0.9.1-alpha1",
"publish": {
"include": [
"src",
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
{
"name": "@tbela99/css-parser",
"description": "CSS parser for node and the browser",
"version": "v0.9.0",
"version": "v0.9.1-alpah1",
"exports": {
".": "./dist/node/index.js",
"./node": "./dist/node/index.js",
"./umd": "./dist/index-umd-web.js",
"./web": "./dist/web/index.js",
"./cjs": "./dist/index.cjs"
Expand Down
27 changes: 16 additions & 11 deletions src/@types/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export declare interface MinifyFeature {

ordering: number;

register(options: MinifyOptions | ParserOptions): void;
register(options: MinifyFeatureOptions | ParserOptions): void;

// run(ast: AstRule | AstAtRule, options: ParserOptions = {}, parent: AstRule | AstAtRule | AstRuleStyleSheet, context: { [key: string]: any }): void;

Expand All @@ -42,24 +42,29 @@ export interface ValidationOptions {
lenient?: boolean;
}

export declare interface ParserOptions extends ValidationOptions, PropertyListOptions {
export interface MinifyOptions {

minify?: boolean;
src?: string;
sourcemap?: boolean;
nestingRules?: boolean;
expandNestingRules?: boolean;
removeCharset?: boolean;
removeDuplicateDeclarations?: boolean;
computeShorthand?: boolean;
computeCalcExpression?: boolean;
inlineCssVariables?: boolean;
removeEmpty?: boolean;
pass?: number;
}

export declare interface ParserOptions extends MinifyOptions, ValidationOptions, PropertyListOptions {

src?: string;
sourcemap?: boolean;
removeCharset?: boolean;
resolveUrls?: boolean;
resolveImport?: boolean;
cwd?: string;
parseColor?: boolean;
removeDuplicateDeclarations?: boolean;
computeShorthand?: boolean;
removePrefix?: boolean;
inlineCssVariables?: boolean;
computeCalcExpression?: boolean;
load?: (url: string, currentUrl: string) => Promise<string>;
dirname?: (path: string) => string;
resolve?: (url: string, currentUrl: string, currentWorkingDirectory?: string) => {
Expand All @@ -71,15 +76,15 @@ export declare interface ParserOptions extends ValidationOptions, PropertyListOp
setParent?: boolean;
}

export declare interface MinifyOptions extends ParserOptions {
export declare interface MinifyFeatureOptions extends ParserOptions {

features: MinifyFeature[];
}

export declare interface MinifyFeature {

ordering: number;
register: (options: MinifyOptions | ParserOptions) => void;
register: (options: MinifyFeatureOptions | ParserOptions) => void;
run: (ast: AstRule | AstAtRule, options: ParserOptions, parent: AstRule | AstAtRule | AstRuleStyleSheet, context: {
[key: string]: any
}) => void;
Expand Down
4 changes: 2 additions & 2 deletions src/lib/ast/features/calc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import type {
AstRule,
BinaryExpressionToken,
FunctionToken,
MinifyOptions,
MinifyFeatureOptions,
NumberToken,
ParensToken,
Token,
Expand All @@ -23,7 +23,7 @@ export class ComputeCalcExpressionFeature {
return 1;
}

static register(options: MinifyOptions): void {
static register(options: MinifyFeatureOptions): void {

if (options.computeCalcExpression) {

Expand Down
4 changes: 2 additions & 2 deletions src/lib/ast/features/inlinecssvariables.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import type {
AstRuleStyleSheet,
CommentToken,
FunctionToken,
MinifyOptions,
MinifyFeatureOptions,
ParserOptions,
VariableScopeInfo
} from "../../../@types";
Expand Down Expand Up @@ -55,7 +55,7 @@ export class InlineCssVariablesFeature {
return 0;
}

static register(options: MinifyOptions): void {
static register(options: MinifyFeatureOptions): void {

if (options.inlineCssVariables) {

Expand Down
4 changes: 2 additions & 2 deletions src/lib/ast/features/prefix.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {EnumToken} from "../types";
import type {AstAtRule, AstDeclaration, AstRule, MinifyOptions, Token} from "../../../@types";
import type {AstAtRule, AstDeclaration, AstRule, MinifyFeatureOptions, Token} from "../../../@types";
import {
getSyntaxConfig,
ValidationAmpersandToken,
Expand All @@ -21,7 +21,7 @@ export class ComputePrefixFeature {
return 2;
}

static register(options: MinifyOptions) {
static register(options: MinifyFeatureOptions) {

if (options.removePrefix) {

Expand Down
4 changes: 2 additions & 2 deletions src/lib/ast/features/shorthand.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import {PropertyList} from "../../parser/declaration";
import {EnumToken} from "../types";
import type {AstAtRule, AstRule, AstRuleStyleSheet, MinifyOptions, PropertyListOptions} from "../../../@types";
import type {AstAtRule, AstRule, AstRuleStyleSheet, MinifyFeatureOptions, PropertyListOptions} from "../../../@types";

export class ComputeShorthandFeature {

static get ordering() {
return 2;
}

static register(options: MinifyOptions) {
static register(options: MinifyFeatureOptions) {

if (options.computeShorthand) {

Expand Down
12 changes: 6 additions & 6 deletions src/lib/ast/minify.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import type {
LiteralToken,
MatchedSelector,
MinifyFeature,
MinifyOptions,
MinifyFeatureOptions,
OptimizedSelector,
ParserOptions,
RawSelectorTokens,
Expand All @@ -38,7 +38,7 @@ const features: MinifyFeature[] = <MinifyFeature[]>Object.values(allFeatures).so
* @param nestingContent
* @param context
*/
export function minify(ast: AstNode, options: ParserOptions | MinifyOptions = {}, recursive: boolean = false, errors?: ErrorDescription[], nestingContent?: boolean, context: {
export function minify(ast: AstNode, options: ParserOptions | MinifyFeatureOptions = {}, recursive: boolean = false, errors?: ErrorDescription[], nestingContent?: boolean, context: {
[key: string]: any
} = {}): AstNode {

Expand All @@ -54,10 +54,10 @@ export function minify(ast: AstNode, options: ParserOptions | MinifyOptions = {}

context.nodes.add(ast);

if (!('features' in <MinifyOptions>options)) {
if (!('features' in <MinifyFeatureOptions>options)) {

// @ts-ignore
options = <MinifyOptions>{
options = <MinifyFeatureOptions>{
removeDuplicateDeclarations: true,
computeShorthand: true,
computeCalcExpression: true,
Expand Down Expand Up @@ -523,7 +523,7 @@ export function minify(ast: AstNode, options: ParserOptions | MinifyOptions = {}

Object.defineProperty(node, 'parent', {...definedPropertySettings, value: parent});

for (const feature of (<MinifyOptions>options).features) {
for (const feature of (<MinifyFeatureOptions>options).features) {

feature.run(<AstRule | AstAtRule>node, options, <AstRule | AstAtRule | AstRuleStyleSheet>parent, context);
}
Expand All @@ -539,7 +539,7 @@ export function minify(ast: AstNode, options: ParserOptions | MinifyOptions = {}
}
}

for (const feature of (<MinifyOptions>options).features) {
for (const feature of (<MinifyFeatureOptions>options).features) {

if ('cleanup' in feature) {

Expand Down
8 changes: 7 additions & 1 deletion src/lib/parser/parse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ export async function doParse(iterator: string, options: ParserOptions = {}): Pr
src: '',
sourcemap: false,
minify: true,
pass: 1,
parseColor: true,
nestingRules: false,
resolveImport: false,
Expand Down Expand Up @@ -391,7 +392,12 @@ export async function doParse(iterator: string, options: ParserOptions = {}): Pr

if (ast.chi.length > 0) {

minify(ast, options, true, errors, false);
let passes: number = options.pass ?? 1 as number;

while (passes--) {

minify(ast, options, true, errors, false);
}
}
}

Expand Down
Loading