@cleaver/breakcheck-core 0.2.3 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -98,6 +98,8 @@ The core of the tool is comparing two snapshots. The `runComparison` function co
98
98
 
99
99
  String `ruleset` values are directories containing `rules.breakcheck`. Relative paths resolve from `process.cwd()`, the directory where the consuming project invokes Breakcheck. In a monorepo, invoke it from the package that owns the rules or use an absolute path.
100
100
 
101
+ Rules may also be supplied inline as a typed `Ruleset`. `RulesEngine.create()` eagerly validates non-empty selectors and actions, Cheerio selector syntax, region names and uniqueness, supported modifier combinations, and JavaScript regular expressions. It compiles and clones the rules so later caller mutation cannot change processing. The DSL accepts full Cheerio-compatible CSS selectors on a single rule-header line; modifier values are double-quoted, with `\"` and `\\` decoded while regex escapes remain intact. `include` is an intentional compatibility no-op, and `rewrite_content` preserves nested markup by rewriting each descendant text node independently.
102
+
101
103
  ```javascript
102
104
  import { runComparison } from "@cleaver/breakcheck-core";
103
105
 
@@ -1,303 +1,200 @@
1
- import { createToken, CstParser, Lexer } from "chevrotain";
2
- import { readFileSync } from "fs";
3
- import { resolve } from "path";
1
+ import { createToken, CstParser, EOF, Lexer } from "chevrotain";
2
+ import { readFile } from "node:fs/promises";
3
+ import { resolve } from "node:path";
4
4
  import { logger } from "../../lib/logger.js";
5
- import { REGION_NAME_PATTERN, } from "../../types/rules.js";
6
- function isRegionDeclaration(action) {
7
- return "kind" in action && action.kind === "region";
5
+ function isRegion(value) {
6
+ return typeof value === "object" && value !== null && "kind" in value && value.kind === "region" && "name" in value && typeof value.name === "string";
8
7
  }
9
- // --- LEXER ---
10
- const Css = createToken({ name: "Css", pattern: /css:/i });
11
- const Do = createToken({ name: "Do", pattern: /do:/i });
12
- const DoBlock = createToken({ name: "DoBlock", pattern: /do/i });
13
- const End = createToken({ name: "End", pattern: /end/i });
14
- const Include = createToken({ name: "Include", pattern: /include/i });
15
- const Exclude = createToken({ name: "Exclude", pattern: /exclude/i });
16
- const RemoveAttr = createToken({ name: "RemoveAttr", pattern: /remove_attr/i });
17
- const RewriteAttr = createToken({
18
- name: "RewriteAttr",
19
- pattern: /rewrite_attr/i,
20
- });
21
- const RewriteContent = createToken({
22
- name: "RewriteContent",
23
- pattern: /rewrite_content/i,
24
- });
25
- const RegionKeyword = createToken({
26
- name: "Region",
27
- pattern: /region(?=\s+name:)/i,
28
- });
8
+ function isAction(value) {
9
+ return typeof value === "object" && value !== null && "action" in value && typeof value.action === "string";
10
+ }
11
+ function isRule(value) {
12
+ return typeof value === "object" && value !== null && "selector" in value && typeof value.selector === "string" && "actions" in value && Array.isArray(value.actions);
13
+ }
14
+ function isNamedRegion(value) {
15
+ return typeof value === "object" && value !== null && "selector" in value && typeof value.selector === "string" && "name" in value && typeof value.name === "string";
16
+ }
17
+ function isRuleset(value) {
18
+ return typeof value === "object" && value !== null && "name" in value && typeof value.name === "string" && "rules" in value && Array.isArray(value.rules) && (!("regions" in value) || value.regions === undefined || Array.isArray(value.regions));
19
+ }
20
+ const Css = createToken({ name: "Css", pattern: /css:/i, push_mode: "selector" });
21
+ function matchSelector(text, offset) {
22
+ let quote;
23
+ let escaped = false;
24
+ let brackets = 0;
25
+ let parentheses = 0;
26
+ const endings = [text.indexOf("\n", offset), text.indexOf("\r", offset)].filter((value) => value >= 0);
27
+ const lineEnd = endings.length === 0 ? text.length : Math.min(...endings);
28
+ for (let index = offset; index < lineEnd; index += 1) {
29
+ const character = text[index];
30
+ if (escaped) {
31
+ escaped = false;
32
+ continue;
33
+ }
34
+ if (character === "\\") {
35
+ escaped = true;
36
+ continue;
37
+ }
38
+ if (quote) {
39
+ if (character === quote)
40
+ quote = undefined;
41
+ continue;
42
+ }
43
+ if (character === "\"" || character === "'") {
44
+ quote = character;
45
+ continue;
46
+ }
47
+ if (character === "[")
48
+ brackets += 1;
49
+ else if (character === "]" && brackets > 0)
50
+ brackets -= 1;
51
+ else if (character === "(")
52
+ parentheses += 1;
53
+ else if (character === ")" && parentheses > 0)
54
+ parentheses -= 1;
55
+ if (brackets || parentheses || index === offset || !/\s/.test(text[index - 1] ?? ""))
56
+ continue;
57
+ const remainder = text.slice(index, lineEnd);
58
+ if (/^do:/i.test(remainder) || /^do(?=[ \t]*(?:--[^\r\n]*)?(?![\s\S]))/i.test(remainder)) {
59
+ const image = text.slice(offset, index).trimEnd();
60
+ if (!image)
61
+ return null;
62
+ const match = [image];
63
+ match.index = offset;
64
+ match.input = text;
65
+ return match;
66
+ }
67
+ }
68
+ return null;
69
+ }
70
+ const Selector = createToken({ name: "Selector", pattern: matchSelector, line_breaks: false });
71
+ const SelectorWhitespace = createToken({ name: "SelectorWhitespace", pattern: /[ \t]+/, group: Lexer.SKIPPED });
72
+ const Do = createToken({ name: "Do", pattern: /do:/i, pop_mode: true });
73
+ const DoBlock = createToken({ name: "DoBlock", pattern: /do(?=[ \t]*(?:--[^\r\n]*)?(?:\r?\n|(?![\s\S])))/i, pop_mode: true });
74
+ const End = createToken({ name: "End", pattern: /end\b/i });
75
+ const Include = createToken({ name: "Include", pattern: /include\b/i });
76
+ const Exclude = createToken({ name: "Exclude", pattern: /exclude\b/i });
77
+ const RemoveAttr = createToken({ name: "RemoveAttr", pattern: /remove_attr\b/i });
78
+ const RewriteAttr = createToken({ name: "RewriteAttr", pattern: /rewrite_attr\b/i });
79
+ const RewriteContent = createToken({ name: "RewriteContent", pattern: /rewrite_content\b/i });
80
+ const RegionKeyword = createToken({ name: "Region", pattern: /region\b/i });
81
+ const ContentRegex = createToken({ name: "ContentRegex", pattern: /content_regex:/i });
29
82
  const Attr = createToken({ name: "Attr", pattern: /attr:/i });
30
83
  const RegionName = createToken({ name: "RegionName", pattern: /name:/i });
31
84
  const Regex = createToken({ name: "Regex", pattern: /regex:/i });
32
85
  const Replace = createToken({ name: "Replace", pattern: /replace:/i });
33
- const ContentRegex = createToken({
34
- name: "ContentRegex",
35
- pattern: /content_regex:/i,
36
- });
37
- const StringLiteral = createToken({
38
- name: "StringLiteral",
39
- pattern: /"[^"]*"/,
40
- });
41
- const Selector = createToken({
42
- name: "Selector",
43
- pattern: /[\w.#\[\]*='"-]+/,
44
- });
45
- const Comment = createToken({
46
- name: "Comment",
47
- pattern: /--[^\n\r]*/,
48
- group: Lexer.SKIPPED,
49
- });
50
- const WhiteSpace = createToken({
51
- name: "WhiteSpace",
52
- pattern: /\s+/,
53
- group: Lexer.SKIPPED,
54
- });
55
- const allTokens = [
56
- WhiteSpace,
57
- Comment,
58
- Css,
59
- Do,
60
- DoBlock,
61
- End,
62
- Include,
63
- Exclude,
64
- RemoveAttr,
65
- RewriteAttr,
66
- RewriteContent,
67
- RegionKeyword,
68
- Attr,
69
- RegionName,
70
- Regex,
71
- Replace,
72
- ContentRegex,
73
- StringLiteral,
74
- Selector,
75
- ];
76
- const RulesLexer = new Lexer(allTokens, {
77
- // Longer matches should be preferred over shorter ones
78
- ensureOptimizations: true,
79
- });
80
- // --- PARSER ---
86
+ const StringLiteral = createToken({ name: "StringLiteral", pattern: /"(?:\\.|[^"\\\r\n])*"/ });
87
+ const Comment = createToken({ name: "Comment", pattern: /--[^\n\r]*/, group: Lexer.SKIPPED });
88
+ const WhiteSpace = createToken({ name: "WhiteSpace", pattern: /\s+/, group: Lexer.SKIPPED });
89
+ const normalTokens = [WhiteSpace, Comment, Css, ContentRegex, RemoveAttr, RewriteAttr, RewriteContent, Include, Exclude, RegionKeyword, End, Attr, RegionName, Regex, Replace, StringLiteral];
90
+ const selectorTokens = [SelectorWhitespace, Selector, Do, DoBlock];
91
+ const allTokens = [...normalTokens, ...selectorTokens];
92
+ const RulesLexer = new Lexer({ defaultMode: "normal", modes: { normal: normalTokens, selector: selectorTokens } });
81
93
  class RulesParser extends CstParser {
82
- constructor() {
83
- super(allTokens);
84
- this.performSelfAnalysis();
85
- }
86
- ruleset = this.RULE("ruleset", () => {
87
- this.MANY(() => {
88
- this.SUBRULE(this.rule);
89
- });
90
- });
91
- rule = this.RULE("rule", () => {
92
- this.CONSUME(Css);
93
- this.CONSUME(Selector);
94
- this.OR([
95
- { ALT: () => this.SUBRULE(this.singleAction) },
96
- { ALT: () => this.SUBRULE(this.actionBlock) },
97
- ]);
98
- });
99
- singleAction = this.RULE("singleAction", () => {
100
- this.CONSUME(Do);
101
- this.OR([
102
- { ALT: () => this.SUBRULE(this.action) },
103
- { ALT: () => this.SUBRULE(this.regionAction) },
104
- ]);
105
- });
106
- actionBlock = this.RULE("actionBlock", () => {
107
- this.CONSUME(DoBlock);
108
- this.MANY(() => {
109
- this.SUBRULE(this.action);
110
- });
111
- this.CONSUME(End);
112
- });
113
- action = this.RULE("action", () => {
114
- this.OR([
115
- { ALT: () => this.SUBRULE(this.includeAction) },
116
- { ALT: () => this.SUBRULE(this.excludeAction) },
117
- { ALT: () => this.SUBRULE(this.removeAttrAction) },
118
- { ALT: () => this.SUBRULE(this.rewriteAttrAction) },
119
- { ALT: () => this.SUBRULE(this.rewriteContentAction) },
120
- ]);
121
- });
122
- regionAction = this.RULE("regionAction", () => {
123
- this.CONSUME(RegionKeyword);
124
- this.CONSUME(RegionName);
125
- this.CONSUME(StringLiteral);
126
- });
127
- includeAction = this.RULE("includeAction", () => {
128
- this.CONSUME(Include);
129
- this.OPTION(() => this.SUBRULE(this.contentRegexModifier));
130
- });
131
- excludeAction = this.RULE("excludeAction", () => {
132
- this.CONSUME(Exclude);
133
- this.OPTION(() => this.SUBRULE(this.contentRegexModifier));
134
- });
135
- removeAttrAction = this.RULE("removeAttrAction", () => {
136
- this.CONSUME(RemoveAttr);
137
- this.CONSUME(Attr);
138
- this.CONSUME(StringLiteral);
139
- });
140
- rewriteAttrAction = this.RULE("rewriteAttrAction", () => {
141
- this.CONSUME(RewriteAttr);
142
- this.CONSUME(Attr);
143
- this.CONSUME1(StringLiteral, { LABEL: "attr" });
144
- this.CONSUME(Regex);
145
- this.CONSUME2(StringLiteral, { LABEL: "regex" });
146
- this.CONSUME(Replace);
147
- this.CONSUME3(StringLiteral, { LABEL: "replace" });
148
- });
149
- rewriteContentAction = this.RULE("rewriteContentAction", () => {
150
- this.CONSUME(RewriteContent);
151
- this.CONSUME(Regex);
152
- this.CONSUME1(StringLiteral, { LABEL: "regex" });
153
- this.CONSUME(Replace);
154
- this.CONSUME2(StringLiteral, { LABEL: "replace" });
155
- });
156
- contentRegexModifier = this.RULE("contentRegexModifier", () => {
157
- this.CONSUME(ContentRegex);
158
- this.CONSUME(StringLiteral);
159
- });
94
+ constructor() { super(allTokens, { recoveryEnabled: false }); this.performSelfAnalysis(); }
95
+ ruleset = this.RULE("ruleset", () => { this.MANY(() => this.SUBRULE(this.rule)); this.CONSUME(EOF); });
96
+ rule = this.RULE("rule", () => { this.CONSUME(Css); this.CONSUME(Selector); this.OR([{ ALT: () => this.SUBRULE(this.singleAction) }, { ALT: () => this.SUBRULE(this.actionBlock) }]); });
97
+ singleAction = this.RULE("singleAction", () => { this.CONSUME(Do); this.OR([{ ALT: () => this.SUBRULE(this.action) }, { ALT: () => this.SUBRULE(this.regionAction) }]); });
98
+ actionBlock = this.RULE("actionBlock", () => { this.CONSUME(DoBlock); this.AT_LEAST_ONE(() => this.SUBRULE(this.action)); this.CONSUME(End); });
99
+ action = this.RULE("action", () => { this.OR([{ ALT: () => this.SUBRULE(this.includeAction) }, { ALT: () => this.SUBRULE(this.excludeAction) }, { ALT: () => this.SUBRULE(this.removeAttrAction) }, { ALT: () => this.SUBRULE(this.rewriteAttrAction) }, { ALT: () => this.SUBRULE(this.rewriteContentAction) }]); });
100
+ regionAction = this.RULE("regionAction", () => { this.CONSUME(RegionKeyword); this.CONSUME(RegionName); this.CONSUME(StringLiteral); });
101
+ includeAction = this.RULE("includeAction", () => { this.CONSUME(Include); this.OPTION(() => this.SUBRULE(this.contentRegexModifier)); });
102
+ excludeAction = this.RULE("excludeAction", () => { this.CONSUME(Exclude); this.OPTION(() => this.SUBRULE(this.contentRegexModifier)); });
103
+ removeAttrAction = this.RULE("removeAttrAction", () => { this.CONSUME(RemoveAttr); this.CONSUME(Attr); this.CONSUME(StringLiteral); });
104
+ rewriteAttrAction = this.RULE("rewriteAttrAction", () => { this.CONSUME(RewriteAttr); this.CONSUME(Attr); this.CONSUME1(StringLiteral, { LABEL: "attr" }); this.CONSUME(Regex); this.CONSUME2(StringLiteral, { LABEL: "regex" }); this.CONSUME(Replace); this.CONSUME3(StringLiteral, { LABEL: "replace" }); });
105
+ rewriteContentAction = this.RULE("rewriteContentAction", () => { this.CONSUME(RewriteContent); this.CONSUME(Regex); this.CONSUME1(StringLiteral, { LABEL: "regex" }); this.CONSUME(Replace); this.CONSUME2(StringLiteral, { LABEL: "replace" }); });
106
+ contentRegexModifier = this.RULE("contentRegexModifier", () => { this.CONSUME(ContentRegex); this.CONSUME(StringLiteral); });
160
107
  }
161
108
  const parser = new RulesParser();
162
- // --- VISITOR ---
109
+ function decodeString(token) {
110
+ const value = token.image.slice(1, -1);
111
+ return value.replace(/\\([\\"])/g, "$1");
112
+ }
113
+ function parsedAction(value) {
114
+ if (isAction(value) || isRegion(value))
115
+ return value;
116
+ throw new Error("Invalid action visitor result.");
117
+ }
163
118
  class CstToAstVisitor extends parser.getBaseCstVisitorConstructor() {
164
- constructor() {
165
- super();
166
- this.validateVisitor();
167
- }
119
+ constructor() { super(); this.validateVisitor(); }
168
120
  ruleset(ctx) {
169
- const parsedRules = (ctx.rule?.map((r) => this.visit(r)) || []);
170
121
  const rules = [];
171
122
  const regions = [];
172
- const regionNames = new Set();
173
- for (const parsedRule of parsedRules) {
174
- if ("name" in parsedRule) {
175
- if (!REGION_NAME_PATTERN.test(parsedRule.name)) {
176
- throw new Error(`Invalid region name "${parsedRule.name}". Region names must match [A-Za-z_][A-Za-z0-9_]*.`);
177
- }
178
- if (regionNames.has(parsedRule.name)) {
179
- throw new Error(`Duplicate region name: ${parsedRule.name}`);
180
- }
181
- regionNames.add(parsedRule.name);
182
- regions.push(parsedRule);
183
- }
184
- else {
185
- rules.push(parsedRule);
186
- }
123
+ for (const node of ctx.rule ?? []) {
124
+ const value = this.visit(node);
125
+ if (isRule(value))
126
+ rules.push(value);
127
+ else if (isNamedRegion(value))
128
+ regions.push(value);
129
+ else
130
+ throw new Error("Invalid rule visitor result.");
187
131
  }
188
132
  return { name: "ruleset", rules, regions };
189
133
  }
190
134
  rule(ctx) {
191
- const selector = ctx.Selector[0].image.trim();
192
- const actionNode = ctx.singleAction || ctx.actionBlock;
193
- if (!actionNode) {
194
- throw new Error("Invalid 'rule' node in CST: No action node found.");
195
- }
196
- const actions = this.visit(actionNode[0]);
197
- const regionAction = actions.find(isRegionDeclaration);
198
- if (regionAction && actions.length === 1) {
199
- return { selector, name: regionAction.name };
200
- }
201
- if (regionAction) {
135
+ const node = ctx.singleAction?.[0] ?? ctx.actionBlock?.[0];
136
+ if (!node)
137
+ throw new Error("Invalid rule action.");
138
+ const value = this.visit(node);
139
+ if (!Array.isArray(value))
140
+ throw new Error("Invalid rule action result.");
141
+ const actions = value.map(parsedAction);
142
+ const region = actions.find(isRegion);
143
+ if (region && actions.length === 1)
144
+ return { selector: ctx.Selector[0].image.trim(), name: region.name };
145
+ if (region)
202
146
  throw new Error("A named region must be declared as the only action for a selector.");
203
- }
204
- return {
205
- selector,
206
- actions: actions.filter((action) => !isRegionDeclaration(action)),
207
- };
208
- }
209
- singleAction(ctx) {
210
- const actionNode = ctx.action?.[0] || ctx.regionAction?.[0];
211
- if (!actionNode) {
212
- throw new Error("Invalid 'singleAction' node in CST.");
213
- }
214
- return [this.visit(actionNode)];
215
- }
216
- actionBlock(ctx) {
217
- return ctx.action?.map((a) => this.visit(a)) || [];
218
- }
219
- action(ctx) {
220
- // Find which specific action was parsed (e.g., includeAction, excludeAction)
221
- const actionAlternative = ctx.includeAction ||
222
- ctx.excludeAction ||
223
- ctx.removeAttrAction ||
224
- ctx.rewriteAttrAction ||
225
- ctx.rewriteContentAction;
226
- if (!actionAlternative) {
227
- logger.error({ context: ctx }, "Invalid 'action' node in CST: No action alternative found");
228
- throw new Error("Invalid 'action' node in CST: No action alternative found.");
229
- }
230
- const actionNode = actionAlternative[0];
231
- // Visit that specific action's node
232
- return this.visit(actionNode);
233
- }
234
- regionAction(ctx) {
235
- const name = ctx.StringLiteral[0].image.slice(1, -1);
236
- return { kind: "region", name };
237
- }
238
- includeAction(ctx) {
239
- const modifiers = ctx.contentRegexModifier
240
- ? this.visit(ctx.contentRegexModifier[0])
241
- : {};
242
- return { action: "include", modifiers };
243
- }
244
- excludeAction(ctx) {
245
- const modifiers = ctx.contentRegexModifier
246
- ? this.visit(ctx.contentRegexModifier[0])
247
- : {};
248
- return { action: "exclude", modifiers };
249
- }
250
- removeAttrAction(ctx) {
251
- const attr = ctx.StringLiteral[0].image.slice(1, -1);
252
- return { action: "remove_attr", modifiers: { attr } };
253
- }
254
- rewriteAttrAction(ctx) {
255
- const attr = ctx.attr[0].image.slice(1, -1);
256
- const regex = ctx.regex[0].image.slice(1, -1);
257
- const replace = ctx.replace[0].image.slice(1, -1);
258
- return { action: "rewrite_attr", modifiers: { attr, regex, replace } };
259
- }
260
- rewriteContentAction(ctx) {
261
- const regex = ctx.regex[0].image.slice(1, -1);
262
- const replace = ctx.replace[0].image.slice(1, -1);
263
- return { action: "rewrite_content", modifiers: { regex, replace } };
264
- }
265
- contentRegexModifier(ctx) {
266
- const content_regex = ctx.StringLiteral[0].image.slice(1, -1);
267
- return { content_regex };
147
+ return { selector: ctx.Selector[0].image.trim(), actions: actions.filter(isAction) };
148
+ }
149
+ singleAction(ctx) { const node = ctx.action?.[0] ?? ctx.regionAction?.[0]; if (!node)
150
+ throw new Error("Invalid single action."); return [parsedAction(this.visit(node))]; }
151
+ actionBlock(ctx) { return ctx.action.map((node) => { const value = parsedAction(this.visit(node)); if (!isAction(value))
152
+ throw new Error("Invalid block action."); return value; }); }
153
+ action(ctx) { const nodes = ctx.includeAction ?? ctx.excludeAction ?? ctx.removeAttrAction ?? ctx.rewriteAttrAction ?? ctx.rewriteContentAction; if (!nodes?.[0])
154
+ throw new Error("Invalid action."); const value = parsedAction(this.visit(nodes[0])); if (!isAction(value))
155
+ throw new Error("Invalid action."); return value; }
156
+ regionAction(ctx) { return { kind: "region", name: decodeString(ctx.StringLiteral[0]) }; }
157
+ includeAction(ctx) { return { action: "include", modifiers: this.optionalContentRegex(ctx) }; }
158
+ excludeAction(ctx) { return { action: "exclude", modifiers: this.optionalContentRegex(ctx) }; }
159
+ removeAttrAction(ctx) { return { action: "remove_attr", modifiers: { attr: decodeString(ctx.StringLiteral[0]) } }; }
160
+ rewriteAttrAction(ctx) { return { action: "rewrite_attr", modifiers: { attr: decodeString(ctx.attr[0]), regex: decodeString(ctx.regex[0]), replace: decodeString(ctx.replace[0]) } }; }
161
+ rewriteContentAction(ctx) { return { action: "rewrite_content", modifiers: { regex: decodeString(ctx.regex[0]), replace: decodeString(ctx.replace[0]) } }; }
162
+ contentRegexModifier(ctx) { return { content_regex: decodeString(ctx.StringLiteral[0]) }; }
163
+ optionalContentRegex(ctx) {
164
+ if (!ctx.contentRegexModifier)
165
+ return {};
166
+ const value = this.visit(ctx.contentRegexModifier[0]);
167
+ if (typeof value !== "object" || value === null || !("content_regex" in value) || typeof value.content_regex !== "string")
168
+ throw new Error("Invalid content regex result.");
169
+ return { content_regex: value.content_regex };
268
170
  }
269
171
  }
270
172
  const visitor = new CstToAstVisitor();
271
- // --- Main processing function ---
173
+ function isFileError(error) { return error instanceof Error && "code" in error; }
272
174
  export async function processRulesDsl(rulesDirectory) {
273
175
  const rulesPath = resolve(process.cwd(), rulesDirectory, "rules.breakcheck");
274
- let rulesContent;
176
+ let content;
275
177
  try {
276
- rulesContent = readFileSync(rulesPath, "utf-8");
178
+ content = await readFile(rulesPath, "utf8");
277
179
  }
278
180
  catch (error) {
279
- logger.error({ error, rulesPath }, "Rules file not found");
280
- throw new Error(`Rules file not found: ${rulesPath}`);
281
- }
282
- const lexResult = RulesLexer.tokenize(rulesContent);
283
- if (lexResult.errors.length > 0) {
284
- const errors = lexResult.errors
285
- .map((err) => `Lexical error at line ${err.line}, column ${err.column}: ${err.message}`)
286
- .join("\n");
287
- logger.error({ errors: lexResult.errors, rulesDirectory }, "Lexical errors in rules file");
288
- throw new Error(`Lexical errors in rules file:\n${errors}`);
181
+ if (isFileError(error) && error.code === "ENOENT") {
182
+ logger.error({ error, rulesPath }, "Rules file not found");
183
+ throw new Error(`Rules file not found: ${rulesPath}`, { cause: error });
184
+ }
185
+ logger.error({ error, rulesPath }, "Failed to read rules file");
186
+ throw new Error(`Failed to read rules file: ${rulesPath}`, { cause: error });
289
187
  }
290
- parser.input = lexResult.tokens;
188
+ const lexed = RulesLexer.tokenize(content);
189
+ if (lexed.errors.length)
190
+ throw new Error(`Lexical errors in rules file:\n${lexed.errors.map((error) => `Lexical error at line ${error.line}, column ${error.column}: ${error.message}`).join("\n")}`);
191
+ parser.input = lexed.tokens;
291
192
  const cst = parser.ruleset();
292
- if (parser.errors.length > 0) {
293
- const errors = parser.errors
294
- .map((err) => `Syntax error at line ${err.token.startLine}, column ${err.token.startColumn}: ${err.message}`)
295
- .join("\n");
296
- logger.error({ errors: parser.errors, rulesDirectory }, "Syntax errors in rules file");
297
- throw new Error(`Syntax errors in rules file:\n${errors}`);
298
- }
299
- // Use the visitor to transform the CST to the final AST
193
+ if (parser.errors.length)
194
+ throw new Error(`Syntax errors in rules file:\n${parser.errors.map((error) => `Syntax error at line ${error.token.startLine}, column ${error.token.startColumn}: ${error.message}`).join("\n")}`);
300
195
  const result = visitor.visit(cst);
196
+ if (!isRuleset(result))
197
+ throw new Error("Invalid ruleset visitor result.");
301
198
  return { ...result, name: rulesDirectory };
302
199
  }
303
200
  //# sourceMappingURL=RulesDsl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RulesDsl.js","sourceRoot":"","sources":["../../../src/core/rules/RulesDsl.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RulesDsl.js","sourceRoot":"","sources":["../../../src/core/rules/RulesDsl.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,10 @@
1
1
  import { Ruleset } from "../../types/rules.js";
2
2
  export declare class RulesEngine {
3
- private ruleset;
3
+ private readonly ruleset;
4
4
  private constructor();
5
5
  static create(rulesDirectoryOrRuleset?: string | Ruleset): Promise<RulesEngine>;
6
6
  process(html: string): string;
7
- private validateRegions;
8
7
  private serializeRegions;
9
8
  private applyAction;
9
+ private rewriteTextNodes;
10
10
  }
@@ -1,116 +1,163 @@
1
1
  import * as cheerio from "cheerio";
2
- import { REGION_NAME_PATTERN, } from "../../types/rules.js";
2
+ import { REGION_NAME_PATTERN } from "../../types/rules.js";
3
3
  import { processRulesDsl } from "./RulesDsl.js";
4
+ function objectValue(value, context) {
5
+ if (typeof value !== "object" || value === null || Array.isArray(value))
6
+ throw new Error(`${context} must be an object.`);
7
+ return value;
8
+ }
9
+ function keysAre(modifiers, allowed, context) {
10
+ const extra = Object.keys(modifiers).find((key) => !allowed.includes(key));
11
+ if (extra)
12
+ throw new Error(`${context} has unsupported modifier "${extra}".`);
13
+ }
14
+ function requiredString(modifiers, key, context, nonEmpty = false) {
15
+ const value = modifiers[key];
16
+ if (typeof value !== "string" || (nonEmpty && value.length === 0))
17
+ throw new Error(`${context} requires ${nonEmpty ? "a non-empty" : "a string"} "${key}" modifier.`);
18
+ return value;
19
+ }
20
+ function compileRegex(pattern, context, modifier) {
21
+ try {
22
+ return new RegExp(pattern);
23
+ }
24
+ catch (error) {
25
+ throw new Error(`${context} has invalid ${modifier} regex: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
26
+ }
27
+ }
28
+ function compileAction(value, selector, ruleIndex, actionIndex) {
29
+ const action = objectValue(value, `Rule ${ruleIndex} action ${actionIndex}`);
30
+ const actionName = action.action;
31
+ const context = `Rule ${ruleIndex} selector "${selector}" action ${actionIndex}`;
32
+ const modifiers = action.modifiers === undefined ? {} : objectValue(action.modifiers, `${context} modifiers`);
33
+ switch (actionName) {
34
+ case "include":
35
+ case "exclude": {
36
+ keysAre(modifiers, ["content_regex"], context);
37
+ const contentPattern = modifiers.content_regex;
38
+ if (contentPattern !== undefined && typeof contentPattern !== "string")
39
+ throw new Error(`${context} modifier "content_regex" must be a string.`);
40
+ return { action: actionName, ...(typeof contentPattern === "string" ? { contentRegex: compileRegex(contentPattern, context, "content_regex") } : {}) };
41
+ }
42
+ case "remove_attr":
43
+ keysAre(modifiers, ["attr"], context);
44
+ return { action: "remove_attr", attr: requiredString(modifiers, "attr", context, true) };
45
+ case "rewrite_attr": {
46
+ keysAre(modifiers, ["attr", "regex", "replace"], context);
47
+ const attr = requiredString(modifiers, "attr", context, true);
48
+ const pattern = requiredString(modifiers, "regex", context);
49
+ return { action: "rewrite_attr", attr, regex: compileRegex(pattern, context, "regex"), replace: requiredString(modifiers, "replace", context) };
50
+ }
51
+ case "rewrite_content": {
52
+ keysAre(modifiers, ["regex", "replace"], context);
53
+ const pattern = requiredString(modifiers, "regex", context);
54
+ return { action: "rewrite_content", regex: compileRegex(pattern, context, "regex"), replace: requiredString(modifiers, "replace", context) };
55
+ }
56
+ default:
57
+ throw new Error(`${context} has unsupported action "${String(actionName)}".`);
58
+ }
59
+ }
60
+ function validateSelector(selector, context) {
61
+ if (typeof selector !== "string" || selector.trim().length === 0)
62
+ throw new Error(`${context} requires a non-empty selector.`);
63
+ const cloned = selector.slice();
64
+ try {
65
+ cheerio.load("", {}, false)(cloned);
66
+ }
67
+ catch (error) {
68
+ throw new Error(`${context} has invalid selector "${cloned}": ${error instanceof Error ? error.message : String(error)}`, { cause: error });
69
+ }
70
+ return cloned;
71
+ }
72
+ function compileRuleset(value) {
73
+ const input = objectValue(value, "Ruleset");
74
+ if (!Array.isArray(input.rules))
75
+ throw new Error("Ruleset rules must be an array.");
76
+ const rules = input.rules.map((candidate, ruleIndex) => {
77
+ const rule = objectValue(candidate, `Rule ${ruleIndex}`);
78
+ const selector = validateSelector(rule.selector, `Rule ${ruleIndex}`);
79
+ if (!Array.isArray(rule.actions) || rule.actions.length === 0)
80
+ throw new Error(`Rule ${ruleIndex} selector "${selector}" requires at least one action.`);
81
+ return { selector, actions: rule.actions.map((action, actionIndex) => compileAction(action, selector, ruleIndex, actionIndex)) };
82
+ });
83
+ const regionsValue = input.regions ?? [];
84
+ if (!Array.isArray(regionsValue))
85
+ throw new Error("Ruleset regions must be an array.");
86
+ const names = new Set();
87
+ const regions = regionsValue.map((candidate, regionIndex) => {
88
+ const region = objectValue(candidate, `Region ${regionIndex}`);
89
+ const selector = validateSelector(region.selector, `Region ${regionIndex}`);
90
+ if (typeof region.name !== "string" || !REGION_NAME_PATTERN.test(region.name))
91
+ throw new Error(`Invalid region name "${String(region.name)}". Region names must match [A-Za-z_][A-Za-z0-9_]*.`);
92
+ if (names.has(region.name))
93
+ throw new Error(`Duplicate region name: ${region.name}`);
94
+ names.add(region.name);
95
+ return { selector, name: region.name.slice() };
96
+ });
97
+ return { rules, regions };
98
+ }
4
99
  export class RulesEngine {
5
100
  ruleset;
6
101
  constructor(ruleset) {
7
- const regions = ruleset.regions ?? [];
8
- this.validateRegions(regions);
9
- this.ruleset = { ...ruleset, regions };
102
+ this.ruleset = ruleset;
10
103
  }
11
104
  static async create(rulesDirectoryOrRuleset) {
12
- const ruleset = typeof rulesDirectoryOrRuleset === "string"
13
- ? await processRulesDsl(rulesDirectoryOrRuleset)
14
- : rulesDirectoryOrRuleset ?? { name: "none", rules: [] };
15
- return new RulesEngine(ruleset);
105
+ const ruleset = typeof rulesDirectoryOrRuleset === "string" ? await processRulesDsl(rulesDirectoryOrRuleset) : rulesDirectoryOrRuleset ?? { name: "none", rules: [] };
106
+ return new RulesEngine(compileRuleset(ruleset));
16
107
  }
17
108
  process(html) {
18
109
  const $ = cheerio.load(html);
19
- // Apply ordinary rules in declaration order before selecting regions.
20
110
  for (const rule of this.ruleset.rules) {
21
- const elements = $(rule.selector);
22
- elements.each((_, element) => {
23
- if (element.type === "tag") {
24
- for (const action of rule.actions) {
111
+ $(rule.selector).each((_, element) => {
112
+ if (element.type === "tag")
113
+ for (const action of rule.actions)
25
114
  this.applyAction($, element, action);
26
- }
27
- }
28
115
  });
29
116
  }
30
- const regions = this.ruleset.regions ?? [];
31
- if (regions.length > 0) {
32
- return this.serializeRegions($, regions);
33
- }
34
- return $.html();
117
+ return this.ruleset.regions.length ? this.serializeRegions($) : $.html();
35
118
  }
36
- validateRegions(regions) {
37
- const names = new Set();
38
- for (const region of regions) {
39
- if (!REGION_NAME_PATTERN.test(region.name)) {
40
- throw new Error(`Invalid region name "${region.name}". Region names must match [A-Za-z_][A-Za-z0-9_]*.`);
41
- }
42
- if (names.has(region.name)) {
43
- throw new Error(`Duplicate region name: ${region.name}`);
44
- }
45
- names.add(region.name);
46
- }
47
- }
48
- serializeRegions($, regions) {
119
+ serializeRegions($) {
49
120
  const output = cheerio.load("<breakcheck-regions></breakcheck-regions>", {}, false);
50
121
  const root = output("breakcheck-regions");
51
- const sortedRegions = [...regions].sort((left, right) => left.name < right.name ? -1 : left.name > right.name ? 1 : 0);
52
- for (const region of sortedRegions) {
122
+ const regions = [...this.ruleset.regions].sort((left, right) => left.name.localeCompare(right.name));
123
+ for (const region of regions) {
53
124
  const fragments = [];
54
- $(region.selector).each((_, element) => {
55
- if (element.type === "tag") {
56
- fragments.push($.html(element));
57
- }
58
- });
59
- if (fragments.length === 0) {
60
- continue;
61
- }
62
- const wrapper = output("<region></region>").attr("name", region.name);
63
- wrapper.append(fragments.join(""));
64
- root.append(wrapper);
125
+ $(region.selector).each((_, element) => { if (element.type === "tag")
126
+ fragments.push($.html(element)); });
127
+ if (fragments.length)
128
+ root.append(output("<region></region>").attr("name", region.name).append(fragments.join("")));
65
129
  }
66
130
  return output.html();
67
131
  }
68
132
  applyAction($, element, action) {
69
- const $element = $(element);
70
- // Check content regex if specified
71
- if (action.modifiers?.content_regex) {
72
- const content = $element.text();
73
- const regex = new RegExp(action.modifiers.content_regex);
74
- if (!regex.test(content)) {
75
- return;
76
- }
77
- }
133
+ const selected = $(element);
134
+ if ("contentRegex" in action && action.contentRegex && !action.contentRegex.test(selected.text()))
135
+ return;
78
136
  switch (action.action) {
137
+ case "include": return;
79
138
  case "exclude":
80
- $element.remove();
81
- break;
82
- case "include":
83
- // No action needed for include
84
- break;
139
+ selected.remove();
140
+ return;
85
141
  case "remove_attr":
86
- if (action.modifiers && "attr" in action.modifiers) {
87
- $element.removeAttr(action.modifiers.attr);
88
- }
89
- break;
90
- case "rewrite_attr":
91
- if (action.modifiers &&
92
- "attr" in action.modifiers &&
93
- "regex" in action.modifiers &&
94
- "replace" in action.modifiers) {
95
- const currentValue = $element.attr(action.modifiers.attr);
96
- if (currentValue) {
97
- const regex = new RegExp(action.modifiers.regex);
98
- const newValue = currentValue.replace(regex, action.modifiers.replace);
99
- $element.attr(action.modifiers.attr, newValue);
100
- }
101
- }
102
- break;
142
+ selected.removeAttr(action.attr);
143
+ return;
144
+ case "rewrite_attr": {
145
+ const current = selected.attr(action.attr);
146
+ if (current !== undefined)
147
+ selected.attr(action.attr, current.replace(action.regex, action.replace));
148
+ return;
149
+ }
103
150
  case "rewrite_content":
104
- if (action.modifiers &&
105
- "regex" in action.modifiers &&
106
- "replace" in action.modifiers) {
107
- const content = $element.text();
108
- const regex = new RegExp(action.modifiers.regex);
109
- const newContent = content.replace(regex, action.modifiers.replace);
110
- $element.text(newContent);
111
- }
112
- break;
151
+ this.rewriteTextNodes($, element, action.regex, action.replace);
113
152
  }
114
153
  }
154
+ rewriteTextNodes($, element, regex, replace) {
155
+ $(element).contents().each((_, child) => {
156
+ if (child.type === "text")
157
+ child.data = child.data.replace(regex, replace);
158
+ else if (child.type === "tag")
159
+ this.rewriteTextNodes($, child, regex, replace);
160
+ });
161
+ }
115
162
  }
116
163
  //# sourceMappingURL=RulesEngine.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RulesEngine.js","sourceRoot":"","sources":["../../../src/core/rules/RulesEngine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RulesEngine.js","sourceRoot":"","sources":["../../../src/core/rules/RulesEngine.ts"],"names":[],"mappings":"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"}
@@ -13,19 +13,19 @@ export declare const REGION_NAME_PATTERN: RegExp;
13
13
  /**
14
14
  * Base interface for action modifiers
15
15
  */
16
- interface BaseActionModifiers {
16
+ export interface ContentFilterModifiers {
17
17
  content_regex?: string;
18
18
  }
19
19
  /**
20
20
  * Modifiers for remove_attr action
21
21
  */
22
- interface RemoveAttrModifiers extends BaseActionModifiers {
22
+ export interface RemoveAttrModifiers {
23
23
  attr: string;
24
24
  }
25
25
  /**
26
26
  * Modifiers for rewrite_attr action
27
27
  */
28
- interface RewriteAttrModifiers extends BaseActionModifiers {
28
+ export interface RewriteAttrModifiers {
29
29
  attr: string;
30
30
  regex: string;
31
31
  replace: string;
@@ -33,21 +33,30 @@ interface RewriteAttrModifiers extends BaseActionModifiers {
33
33
  /**
34
34
  * Modifiers for rewrite_content action
35
35
  */
36
- interface RewriteContentModifiers extends BaseActionModifiers {
36
+ export interface RewriteContentModifiers {
37
37
  regex: string;
38
38
  replace: string;
39
39
  }
40
40
  /**
41
41
  * Union type for all possible action modifiers
42
42
  */
43
- export type ActionModifiers = RemoveAttrModifiers | RewriteAttrModifiers | RewriteContentModifiers | BaseActionModifiers;
43
+ export type ActionModifiers = RemoveAttrModifiers | RewriteAttrModifiers | RewriteContentModifiers | ContentFilterModifiers;
44
44
  /**
45
45
  * Represents a single action to be performed
46
46
  */
47
- export interface Action {
48
- action: ActionType;
49
- modifiers?: ActionModifiers;
50
- }
47
+ export type Action = {
48
+ action: "include" | "exclude";
49
+ modifiers?: ContentFilterModifiers;
50
+ } | {
51
+ action: "remove_attr";
52
+ modifiers: RemoveAttrModifiers;
53
+ } | {
54
+ action: "rewrite_attr";
55
+ modifiers: RewriteAttrModifiers;
56
+ } | {
57
+ action: "rewrite_content";
58
+ modifiers: RewriteContentModifiers;
59
+ };
51
60
  /**
52
61
  * Represents a single rule with a selector and its actions
53
62
  */
@@ -71,4 +80,3 @@ export interface Ruleset {
71
80
  /** Named regions are optional for backwards-compatible inline rulesets. */
72
81
  regions?: Region[];
73
82
  }
74
- export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cleaver/breakcheck-core",
3
- "version": "0.2.3",
3
+ "version": "0.2.4",
4
4
  "type": "module",
5
5
  "engines": {
6
6
  "node": ">=22"