diff --git a/postcss-selector-parser.d.ts b/postcss-selector-parser.d.ts index 9f0a233..0625005 100644 --- a/postcss-selector-parser.d.ts +++ b/postcss-selector-parser.d.ts @@ -18,12 +18,12 @@ export = parser; type Diff = T extends U ? never : T; // TODO: Conditional types in TS 1.8 will really clean this up. -declare function parser(): parser.Processor; -declare function parser(processor: parser.AsyncProcessor): parser.Processor; -declare function parser(processor: parser.AsyncProcessor): parser.Processor; -declare function parser(processor: parser.SyncProcessor): parser.Processor; -declare function parser(processor: parser.SyncProcessor): parser.Processor; -declare function parser(processor?: parser.SyncProcessor | parser.AsyncProcessor): parser.Processor; +declare function parser(processor?: undefined, options?: Partial): parser.Processor; +declare function parser(processor: parser.AsyncProcessor, options?: Partial): parser.Processor; +declare function parser(processor: parser.AsyncProcessor, options?: Partial): parser.Processor; +declare function parser(processor: parser.SyncProcessor, options?: Partial): parser.Processor; +declare function parser(processor: parser.SyncProcessor, options?: Partial): parser.Processor; +declare function parser(processor?: parser.SyncProcessor | parser.AsyncProcessor, options?: Partial): parser.Processor; /*~ If you want to expose types from your module as well, you can *~ place them in this block. Often you will want to describe the diff --git a/postcss-selector-parser.test.ts b/postcss-selector-parser.test.ts index 5ba3fa7..e2d1fb7 100644 --- a/postcss-selector-parser.test.ts +++ b/postcss-selector-parser.test.ts @@ -1,5 +1,15 @@ import * as parser from './postcss-selector-parser'; +parser(undefined, { lossless: false }).processSync('a > b'); +parser(() => {}, { lossless: false }).processSync('a > b'); +parser(() => 1, { lossless: false }).transformSync('a > b') satisfies number; +declare const asyncProcessor: parser.AsyncProcessor; +declare const asyncVoidProcessor: parser.AsyncProcessor; +parser(asyncVoidProcessor, { lossless: false }).process('a > b'); +parser(asyncProcessor, { lossless: false }).transform('a > b') satisfies Promise; +// @ts-expect-error An async processor cannot be called synchronously. +parser(asyncProcessor, { lossless: false }).processSync('a > b'); + parser((root) => { root.each((node, index) => { node satisfies parser.Selector; diff --git a/src/__tests__/parser.mjs b/src/__tests__/parser.mjs index cc5ccc0..48e65a1 100644 --- a/src/__tests__/parser.mjs +++ b/src/__tests__/parser.mjs @@ -49,6 +49,42 @@ test("no operation", (t) => { t.notThrows(() => parser().processSync("h1 h2 h3")); }); +test("default options work sync and can be overridden", (t) => { + const processor = parser(undefined, { lossless: false }); + t.is(processor.processSync("a > b"), "a>b"); + t.is(processor.processSync("a > b", { lossless: true }), "a > b"); + t.is(processor.processSync("a > b"), "a>b"); +}); + +test("default options work async and can be overridden", async (t) => { + const processor = parser(undefined, { lossless: false }); + t.is(await processor.process("a > b"), "a>b"); + t.is(await processor.process("a > b", { lossless: true }), "a > b"); + t.is(await processor.process("a > b"), "a>b"); +}); + +test("default maxNestingDepth works and can be overridden", (t) => { + const processor = parser(undefined, { maxNestingDepth: 1 }); + const selector = ":not(:not(a))"; + t.throws(() => processor.processSync(selector), { instanceOf: Error }); + t.is(processor.processSync(selector, { maxNestingDepth: 10 }), selector); +}); + +test("default updateSelector works async and can be overridden", async (t) => { + const processor = parser( + (root) => + root.walkClasses((node) => { + node.value = "bar"; + }), + { updateSelector: false }, + ); + const rule = { selector: ".foo" }; + t.is(await processor.process(rule), ".bar"); + t.is(rule.selector, ".foo"); + t.is(await processor.process(rule, { updateSelector: true }), ".bar"); + t.is(rule.selector, ".bar"); +}); + test("empty selector string", (t) => { t.notThrows(() => { return parser((selectors) => { diff --git a/src/index.ts b/src/index.ts index 0d34e3f..e5889a6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,7 @@ import Processor from "./processor"; import * as selectors from "./selectors"; -const parser = (processor?: any) => new Processor(processor); +const parser = (processor?: any, options?: any) => new Processor(processor, options); Object.assign(parser, selectors);