315 lines
6.6 KiB
Markdown
315 lines
6.6 KiB
Markdown
# API Reference
|
|
|
|
## Overview
|
|
|
|
`@adobe/css-tools` provides a modern CSS parser and stringifier with comprehensive TypeScript support. It can parse CSS into an Abstract Syntax Tree (AST) and convert the AST back to CSS with various formatting options.
|
|
|
|
## Installation
|
|
|
|
```bash
|
|
npm install @adobe/css-tools
|
|
```
|
|
|
|
## Core Functions
|
|
|
|
### `parse(code, options?)`
|
|
|
|
Parses CSS code and returns an Abstract Syntax Tree (AST).
|
|
|
|
#### Parameters
|
|
|
|
- `code` (string) - The CSS code to parse
|
|
- `options` (object, optional) - Parsing options
|
|
- `silent` (boolean) - Silently fail on parse errors instead of throwing. When `true`, errors are collected in `ast.stylesheet.parsingErrors`
|
|
- `source` (string) - File path for better error reporting
|
|
|
|
#### Returns
|
|
|
|
- `CssStylesheetAST` - The parsed CSS as an AST
|
|
|
|
#### Example
|
|
|
|
```javascript
|
|
import { parse } from '@adobe/css-tools';
|
|
|
|
const css = `
|
|
.example {
|
|
color: red;
|
|
font-size: 16px;
|
|
}
|
|
`;
|
|
|
|
const ast = parse(css);
|
|
console.log(ast.stylesheet.rules);
|
|
```
|
|
|
|
### `stringify(ast, options?)`
|
|
|
|
Converts a CSS AST back to CSS string with configurable formatting.
|
|
|
|
#### Parameters
|
|
|
|
- `ast` (CssStylesheetAST) - The CSS AST to stringify
|
|
- `options` (CompilerOptions, optional) - Stringification options
|
|
- `indent` (string) - Indentation string (default: `' '`)
|
|
- `compress` (boolean) - Whether to compress/minify the output (default: `false`)
|
|
|
|
#### Returns
|
|
|
|
- `string` - The formatted CSS string
|
|
|
|
#### Example
|
|
|
|
```javascript
|
|
import { parse, stringify } from '@adobe/css-tools';
|
|
|
|
const css = '.example { color: red; }';
|
|
const ast = parse(css);
|
|
|
|
// Pretty print
|
|
const formatted = stringify(ast, { indent: ' ' });
|
|
console.log(formatted);
|
|
// Output:
|
|
// .example {
|
|
// color: red;
|
|
// }
|
|
|
|
// Compressed
|
|
const minified = stringify(ast, { compress: true });
|
|
console.log(minified);
|
|
// Output: .example{color:red}
|
|
```
|
|
|
|
## Type Definitions
|
|
|
|
### Core Types
|
|
|
|
#### `CssStylesheetAST`
|
|
The root AST node representing a complete CSS stylesheet.
|
|
|
|
```typescript
|
|
type CssStylesheetAST = {
|
|
type: CssTypes.stylesheet;
|
|
stylesheet: {
|
|
source?: string;
|
|
rules: CssRuleAST[];
|
|
parsingErrors?: CssParseError[];
|
|
};
|
|
};
|
|
```
|
|
|
|
#### `CssRuleAST`
|
|
Represents a CSS rule (selector + declarations).
|
|
|
|
```typescript
|
|
type CssRuleAST = {
|
|
type: CssTypes.rule;
|
|
selectors: string[];
|
|
declarations: CssDeclarationAST[];
|
|
position?: CssPosition;
|
|
parent?: CssStylesheetAST;
|
|
};
|
|
```
|
|
|
|
#### `CssDeclarationAST`
|
|
Represents a CSS property declaration.
|
|
|
|
```typescript
|
|
type CssDeclarationAST = {
|
|
type: CssTypes.declaration;
|
|
property: string;
|
|
value: string;
|
|
position?: CssPosition;
|
|
parent?: CssRuleAST;
|
|
};
|
|
```
|
|
|
|
#### `CssMediaAST`
|
|
Represents a CSS @media rule.
|
|
|
|
```typescript
|
|
type CssMediaAST = {
|
|
type: CssTypes.media;
|
|
media: string;
|
|
rules: CssRuleAST[];
|
|
position?: CssPosition;
|
|
parent?: CssStylesheetAST;
|
|
};
|
|
```
|
|
|
|
#### `CssKeyframesAST`
|
|
Represents a CSS @keyframes rule.
|
|
|
|
```typescript
|
|
type CssKeyframesAST = {
|
|
type: CssTypes.keyframes;
|
|
name: string;
|
|
keyframes: CssKeyframeAST[];
|
|
position?: CssPosition;
|
|
parent?: CssStylesheetAST;
|
|
};
|
|
```
|
|
|
|
#### `CssPosition`
|
|
Represents source position information.
|
|
|
|
```typescript
|
|
type CssPosition = {
|
|
source?: string;
|
|
start: {
|
|
line: number;
|
|
column: number;
|
|
};
|
|
end: {
|
|
line: number;
|
|
column: number;
|
|
};
|
|
};
|
|
```
|
|
|
|
#### `CssParseError`
|
|
Represents a parsing error.
|
|
|
|
```typescript
|
|
type CssParseError = {
|
|
message: string;
|
|
reason: string;
|
|
filename?: string;
|
|
line: number;
|
|
column: number;
|
|
source?: string;
|
|
};
|
|
```
|
|
|
|
### Compiler Options
|
|
|
|
#### `CompilerOptions`
|
|
Options for the stringifier.
|
|
|
|
```typescript
|
|
type CompilerOptions = {
|
|
indent?: string; // Default: ' '
|
|
compress?: boolean; // Default: false
|
|
};
|
|
```
|
|
|
|
## Error Handling
|
|
|
|
### Silent Parsing
|
|
|
|
When parsing malformed CSS, you can use the `silent` option to collect errors instead of throwing:
|
|
|
|
```javascript
|
|
import { parse } from '@adobe/css-tools';
|
|
|
|
const malformedCss = `
|
|
body { color: red; }
|
|
{ color: blue; } /* Missing selector */
|
|
.valid { background: green; }
|
|
`;
|
|
|
|
const result = parse(malformedCss, { silent: true });
|
|
|
|
if (result.stylesheet.parsingErrors) {
|
|
result.stylesheet.parsingErrors.forEach(error => {
|
|
console.log(`Error at line ${error.line}: ${error.message}`);
|
|
});
|
|
}
|
|
|
|
// Valid rules are still parsed
|
|
console.log('Valid rules:', result.stylesheet.rules.length);
|
|
```
|
|
|
|
### Source Tracking
|
|
|
|
Enable source tracking for better error reporting:
|
|
|
|
```javascript
|
|
import { parse } from '@adobe/css-tools';
|
|
|
|
const css = 'body { color: red; }';
|
|
const ast = parse(css, { source: 'styles.css' });
|
|
|
|
const rule = ast.stylesheet.rules[0];
|
|
console.log(rule.position?.source); // "styles.css"
|
|
console.log(rule.position?.start); // { line: 1, column: 1 }
|
|
console.log(rule.position?.end); // { line: 1, column: 20 }
|
|
```
|
|
|
|
## Advanced Usage
|
|
|
|
### Working with At-Rules
|
|
|
|
```javascript
|
|
import { parse, stringify } from '@adobe/css-tools';
|
|
|
|
const css = `
|
|
@media (max-width: 768px) {
|
|
.container {
|
|
padding: 10px;
|
|
}
|
|
}
|
|
|
|
@keyframes fadeIn {
|
|
from { opacity: 0; }
|
|
to { opacity: 1; }
|
|
}
|
|
`;
|
|
|
|
const ast = parse(css);
|
|
|
|
// Access media rules
|
|
const mediaRule = ast.stylesheet.rules.find(rule => rule.type === 'media');
|
|
console.log(mediaRule.media); // "(max-width: 768px)"
|
|
|
|
// Access keyframes
|
|
const keyframesRule = ast.stylesheet.rules.find(rule => rule.type === 'keyframes');
|
|
console.log(keyframesRule.name); // "fadeIn"
|
|
```
|
|
|
|
### Custom Formatting
|
|
|
|
```javascript
|
|
import { parse, stringify } from '@adobe/css-tools';
|
|
|
|
const css = '.example{color:red;font-size:16px}';
|
|
const ast = parse(css);
|
|
|
|
// Custom indentation
|
|
const formatted = stringify(ast, { indent: ' ' });
|
|
console.log(formatted);
|
|
// Output:
|
|
// .example {
|
|
// color: red;
|
|
// font-size: 16px;
|
|
// }
|
|
|
|
// Compressed with no spaces
|
|
const compressed = stringify(ast, { compress: true });
|
|
console.log(compressed);
|
|
// Output: .example{color:red;font-size:16px}
|
|
```
|
|
|
|
## TypeScript Integration
|
|
|
|
The library provides comprehensive TypeScript support with full type definitions for all AST nodes and functions:
|
|
|
|
```typescript
|
|
import { parse, stringify, type CssStylesheetAST } from '@adobe/css-tools';
|
|
|
|
const css: string = '.example { color: red; }';
|
|
const ast: CssStylesheetAST = parse(css);
|
|
const output: string = stringify(ast);
|
|
```
|
|
|
|
## Performance Considerations
|
|
|
|
- The parser is optimized for large CSS files
|
|
- AST nodes are lightweight and memory-efficient
|
|
- Stringification is fast and supports streaming for large outputs
|
|
- Consider using `compress: true` for production builds to reduce file size
|
|
|
|
## Browser Support
|
|
|
|
The library works in all modern browsers and Node.js environments. For older environments, you may need to use a bundler with appropriate polyfills.
|