@herb-tools/config 0.8.10 → 0.9.0

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
@@ -33,7 +33,7 @@ bun add @herb-tools/config
33
33
  The configuration is stored in a `.herb.yml` file in the project root:
34
34
 
35
35
  ```yaml [.herb.yml]
36
- version: 0.8.10
36
+ version: 0.9.0
37
37
 
38
38
  linter:
39
39
  enabled: true
@@ -31,9 +31,18 @@ export const FormatterConfigSchema = z.object({
31
31
  maxLineLength: z.number().int().positive().optional().describe("Maximum line length before wrapping"),
32
32
  rewriter: RewriterConfigSchema.describe("Rewriter configuration for pre and post-format transformations"),
33
33
  }).strict().optional();
34
+ export const ValidatorsConfigSchema = z.object({
35
+ security: z.boolean().optional().describe("Enable or disable the security validator (default: true)"),
36
+ nesting: z.boolean().optional().describe("Enable or disable the nesting validator (default: true)"),
37
+ accessibility: z.boolean().optional().describe("Enable or disable the accessibility validator (default: true)"),
38
+ }).strict().optional();
39
+ export const EngineConfigSchema = z.object({
40
+ validators: ValidatorsConfigSchema.describe("Per-validator enable/disable configuration"),
41
+ }).strict().optional();
34
42
  export const HerbConfigSchema = z.object({
35
43
  version: z.string().describe("Configuration file version"),
36
44
  files: FilesConfigSchema.describe("Top-level file configuration"),
45
+ engine: EngineConfigSchema.describe("Engine configuration"),
37
46
  linter: LinterConfigSchema,
38
47
  formatter: FormatterConfigSchema,
39
48
  }).strict();
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../src/config-schema.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,9 @@ import { HerbConfigSchema } from "./config-schema.js";
9
9
  import { deepMerge } from "./merge.js";
10
10
  import packageJson from "../package.json";
11
11
  import configTemplate from "./config-template.yml";
12
+ import defaultsYaml from "../../../../lib/herb/defaults.yml";
12
13
  const DEFAULT_VERSION = packageJson.version;
14
+ const PARSED_DEFAULTS = parse(defaultsYaml);
13
15
  export class Config {
14
16
  static configPath = ".herb.yml";
15
17
  static PROJECT_INDICATORS = [
@@ -83,8 +85,9 @@ export class Config {
83
85
  }
84
86
  /**
85
87
  * Get the files configuration for a specific tool.
86
- * Tool-specific file config takes precedence over top-level config.
87
- * Include patterns are additive (defaults are already merged in this.config).
88
+ * Both include and exclude patterns are additive:
89
+ * - Include: defaults + files.include + tool.include
90
+ * - Exclude: defaults + files.exclude + tool.exclude
88
91
  * @param tool - The tool to get files config for ('linter' or 'formatter')
89
92
  * @returns The merged files configuration
90
93
  */
@@ -94,7 +97,9 @@ export class Config {
94
97
  const topLevelInclude = topLevelFiles.include || [];
95
98
  const toolInclude = toolConfig?.include || [];
96
99
  const include = [...topLevelInclude, ...toolInclude];
97
- const exclude = toolConfig?.exclude || topLevelFiles.exclude || [];
100
+ const topLevelExclude = topLevelFiles.exclude || [];
101
+ const toolExclude = toolConfig?.exclude || [];
102
+ const exclude = [...topLevelExclude, ...toolExclude];
98
103
  return {
99
104
  include,
100
105
  exclude
@@ -178,7 +183,7 @@ export class Config {
178
183
  }
179
184
  /**
180
185
  * Check if a tool (linter or formatter) is enabled for a specific file path.
181
- * Respects both the tool's enabled state and its exclude patterns.
186
+ * Respects the tool's enabled state and all exclude patterns (defaults + files.exclude + tool.exclude).
182
187
  * @param filePath - The file path to check
183
188
  * @param tool - The tool to check ('linter' or 'formatter')
184
189
  * @returns true if the tool is enabled for this path
@@ -188,8 +193,8 @@ export class Config {
188
193
  if (!isEnabled) {
189
194
  return false;
190
195
  }
191
- const toolConfig = tool === 'linter' ? this.config.linter : this.config.formatter;
192
- const excludePatterns = toolConfig?.exclude || [];
196
+ const filesConfig = this.getFilesConfigForTool(tool);
197
+ const excludePatterns = filesConfig.exclude || [];
193
198
  return !this.isPathExcluded(filePath, excludePatterns);
194
199
  }
195
200
  /**
@@ -212,11 +217,11 @@ export class Config {
212
217
  }
213
218
  /**
214
219
  * Check if a specific rule is enabled for a specific file path.
215
- * Respects linter.enabled, linter.exclude, rule.enabled, rule.include, rule.only, and rule.exclude patterns.
220
+ * Respects rule.enabled, rule.include, rule.only, and rule.exclude patterns.
216
221
  *
217
222
  * Pattern precedence:
218
- * - If rule.only is specified: Only files matching 'only' patterns (ignores all 'include' patterns)
219
- * - If rule.only is NOT specified: Files matching 'include' patterns (if specified, additive)
223
+ * - If rule.only or rule.include matches the path: bypasses parent excludes (linter.exclude, files.exclude, defaults)
224
+ * - If no rule.only/include patterns or path doesn't match: respects all parent excludes
220
225
  * - rule.exclude is always applied regardless of 'only' or 'include'
221
226
  *
222
227
  * @param ruleName - The name of the rule to check
@@ -224,7 +229,7 @@ export class Config {
224
229
  * @returns true if the rule is enabled for this path
225
230
  */
226
231
  isRuleEnabledForPath(ruleName, filePath) {
227
- if (!this.isLinterEnabledForPath(filePath)) {
232
+ if (!this.isLinterEnabled) {
228
233
  return false;
229
234
  }
230
235
  if (this.isRuleDisabled(ruleName)) {
@@ -234,13 +239,25 @@ export class Config {
234
239
  const ruleOnlyPatterns = ruleConfig?.only || [];
235
240
  const ruleIncludePatterns = ruleConfig?.include || [];
236
241
  const ruleExcludePatterns = ruleConfig?.exclude || [];
242
+ let bypassParentExcludes = false;
237
243
  if (ruleOnlyPatterns.length > 0) {
238
- if (!this.isPathIncluded(filePath, ruleOnlyPatterns)) {
244
+ if (this.isPathIncluded(filePath, ruleOnlyPatterns)) {
245
+ bypassParentExcludes = true;
246
+ }
247
+ else {
239
248
  return false;
240
249
  }
241
250
  }
242
251
  else if (ruleIncludePatterns.length > 0) {
243
- if (!this.isPathIncluded(filePath, ruleIncludePatterns)) {
252
+ if (this.isPathIncluded(filePath, ruleIncludePatterns)) {
253
+ bypassParentExcludes = true;
254
+ }
255
+ else {
256
+ return false;
257
+ }
258
+ }
259
+ if (!bypassParentExcludes) {
260
+ if (!this.isLinterEnabledForPath(filePath)) {
244
261
  return false;
245
262
  }
246
263
  }
@@ -577,7 +594,7 @@ export class Config {
577
594
  result.push('');
578
595
  }
579
596
  }
580
- if (/^ [a-z][\w-]*:/.test(line) && prevLine && /^ /.test(prevLine)) {
597
+ if (/^ [a-z][\w-]*:/.test(line) && prevLine && prevLine.startsWith(' ')) {
581
598
  result.push('');
582
599
  }
583
600
  result.push(line);
@@ -731,7 +748,7 @@ export class Config {
731
748
  console.error(`✓ Created default configuration at ${configPath}`);
732
749
  }
733
750
  }
734
- catch (error) {
751
+ catch (_error) {
735
752
  if (!silent) {
736
753
  console.error(`⚠ Could not create config file at ${configPath}, using defaults in-memory`);
737
754
  }
@@ -820,62 +837,57 @@ export class Config {
820
837
  * Read, parse, and validate config file
821
838
  */
822
839
  static async readAndValidateConfig(configPath, projectRoot, version, exitOnError = false) {
840
+ const content = await fs.readFile(configPath, "utf8");
841
+ let parsed;
823
842
  try {
824
- const content = await fs.readFile(configPath, "utf8");
825
- let parsed;
826
- try {
827
- parsed = parse(content);
843
+ parsed = parse(content);
844
+ }
845
+ catch (error) {
846
+ if (exitOnError) {
847
+ console.error(`\n✗ Invalid YAML syntax in ${configPath}`);
848
+ if (error instanceof Error) {
849
+ console.error(` ${error.message}\n`);
850
+ }
851
+ process.exit(1);
828
852
  }
829
- catch (error) {
853
+ else {
854
+ throw new Error(`Invalid YAML syntax in ${configPath}: ${error instanceof Error ? error.message : String(error)}`);
855
+ }
856
+ }
857
+ if (parsed === null || parsed === undefined) {
858
+ parsed = {};
859
+ }
860
+ if (!parsed.version) {
861
+ parsed.version = version;
862
+ }
863
+ try {
864
+ HerbConfigSchema.parse(parsed);
865
+ }
866
+ catch (error) {
867
+ if (error instanceof ZodError) {
868
+ const validationError = fromZodError(error, {
869
+ prefix: `Configuration errors in ${configPath}`,
870
+ });
830
871
  if (exitOnError) {
831
- console.error(`\n✗ Invalid YAML syntax in ${configPath}`);
832
- if (error instanceof Error) {
833
- console.error(` ${error.message}\n`);
834
- }
872
+ console.error(`\n✗ ${validationError.toString()}\n`);
835
873
  process.exit(1);
836
874
  }
837
875
  else {
838
- throw new Error(`Invalid YAML syntax in ${configPath}: ${error instanceof Error ? error.message : String(error)}`);
839
- }
840
- }
841
- if (parsed === null || parsed === undefined) {
842
- parsed = {};
843
- }
844
- if (!parsed.version) {
845
- parsed.version = version;
846
- }
847
- try {
848
- HerbConfigSchema.parse(parsed);
849
- }
850
- catch (error) {
851
- if (error instanceof ZodError) {
852
- const validationError = fromZodError(error, {
853
- prefix: `Configuration errors in ${configPath}`,
854
- });
855
- if (exitOnError) {
856
- console.error(`\n✗ ${validationError.toString()}\n`);
857
- process.exit(1);
858
- }
859
- else {
860
- throw new Error(validationError.toString());
861
- }
876
+ throw new Error(validationError.toString());
862
877
  }
863
- throw error;
864
- }
865
- if (parsed.version && parsed.version !== version) {
866
- console.error(`\n⚠️ Configuration version mismatch in ${configPath}`);
867
- console.error(` Config version: ${parsed.version}`);
868
- console.error(` Current version: ${version}`);
869
- console.error(` Consider updating your .herb.yml file.\n`);
870
878
  }
871
- const defaults = this.getDefaultConfig(version);
872
- const resolved = deepMerge(defaults, parsed);
873
- resolved.version = version;
874
- return new Config(projectRoot, resolved);
875
- }
876
- catch (error) {
877
879
  throw error;
878
880
  }
881
+ if (parsed.version && parsed.version !== version) {
882
+ console.error(`\n⚠️ Configuration version mismatch in ${configPath}`);
883
+ console.error(` Config version: ${parsed.version}`);
884
+ console.error(` Current version: ${version}`);
885
+ console.error(` Consider updating your .herb.yml file.\n`);
886
+ }
887
+ const defaults = this.getDefaultConfig(version);
888
+ const resolved = deepMerge(defaults, parsed);
889
+ resolved.version = version;
890
+ return new Config(projectRoot, resolved);
879
891
  }
880
892
  /**
881
893
  * Get default configuration object
@@ -883,29 +895,7 @@ export class Config {
883
895
  static getDefaultConfig(version = DEFAULT_VERSION) {
884
896
  return {
885
897
  version,
886
- files: {
887
- include: [
888
- '**/*.html',
889
- '**/*.rhtml',
890
- '**/*.html.erb',
891
- '**/*.html+*.erb',
892
- '**/*.turbo_stream.erb'
893
- ],
894
- exclude: [
895
- 'node_modules/**/*',
896
- 'vendor/bundle/**/*',
897
- 'coverage/**/*',
898
- ]
899
- },
900
- linter: {
901
- enabled: true,
902
- rules: {}
903
- },
904
- formatter: {
905
- enabled: false,
906
- indentWidth: 2,
907
- maxLineLength: 80
908
- }
898
+ ...PARSED_DEFAULTS
909
899
  };
910
900
  }
911
901
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -4800,9 +4800,18 @@ const FormatterConfigSchema = object({
4800
4800
  maxLineLength: number().int().positive().optional().describe("Maximum line length before wrapping"),
4801
4801
  rewriter: RewriterConfigSchema.describe("Rewriter configuration for pre and post-format transformations"),
4802
4802
  }).strict().optional();
4803
+ const ValidatorsConfigSchema = object({
4804
+ security: boolean().optional().describe("Enable or disable the security validator (default: true)"),
4805
+ nesting: boolean().optional().describe("Enable or disable the nesting validator (default: true)"),
4806
+ accessibility: boolean().optional().describe("Enable or disable the accessibility validator (default: true)"),
4807
+ }).strict().optional();
4808
+ const EngineConfigSchema = object({
4809
+ validators: ValidatorsConfigSchema.describe("Per-validator enable/disable configuration"),
4810
+ }).strict().optional();
4803
4811
  const HerbConfigSchema = object({
4804
4812
  version: string().describe("Configuration file version"),
4805
4813
  files: FilesConfigSchema.describe("Top-level file configuration"),
4814
+ engine: EngineConfigSchema.describe("Engine configuration"),
4806
4815
  linter: LinterConfigSchema,
4807
4816
  formatter: FormatterConfigSchema,
4808
4817
  }).strict();
@@ -4826,7 +4835,7 @@ function deepMerge(target, source) {
4826
4835
  continue;
4827
4836
  }
4828
4837
  if (Array.isArray(sourceValue)) {
4829
- if (key === 'include' && Array.isArray(targetValue)) {
4838
+ if ((key === 'include' || key === 'exclude') && Array.isArray(targetValue)) {
4830
4839
  output[key] = [...targetValue, ...sourceValue];
4831
4840
  }
4832
4841
  else {
@@ -4844,13 +4853,16 @@ function deepMerge(target, source) {
4844
4853
  return output;
4845
4854
  }
4846
4855
 
4847
- var version = "0.8.10";
4856
+ var version = "0.9.0";
4848
4857
  var packageJson = {
4849
4858
  version: version};
4850
4859
 
4851
- var configTemplate = "# This file configures Herb for your project and team.\n# Settings here take precedence over individual editor preferences.\n#\n# Herb is a suite of tools for HTML+ERB templates including:\n# - Linter: Validates templates and enforces best practices\n# - Formatter: Auto-formats templates with intelligent indentation\n# - Language Server: Provides IDE support (VS Code, Zed, Neovim, etc.)\n#\n# Website: https://herb-tools.dev\n# Configuration: https://herb-tools.dev/configuration\n# GitHub Repo: https://github.com/marcoroth/herb\n#\n\nversion: 0.8.10\n\n# files:\n# # Additional patterns beyond the defaults (**.html, **.rhtml, **.html.erb, etc.)\n# include:\n# - '**/*.xml.erb'\n# - 'custom/**/*.html'\n#\n# # Patterns to exclude (can exclude defaults too)\n# exclude:\n# - 'public/**/*'\n# - 'tmp/**/*'\n\nlinter:\n enabled: true\n\n # # Exit with error code when diagnostics of this severity or higher are present\n # # Valid values: error (default), warning, info, hint\n # failLevel: warning\n\n # # Additional patterns beyond the defaults for linting\n # include:\n # - '**/*.xml.erb'\n #\n # # Patterns to exclude from linting\n # exclude:\n # - 'app/views/admin/**/*'\n\n # rules:\n # erb-no-extra-newline:\n # enabled: false\n #\n # # Rules can have 'include', 'only', and 'exclude' patterns\n # some-rule:\n # # Additional patterns to check (additive, ignored when 'only' is present)\n # include:\n # - 'app/components/**/*'\n # # Don't apply this rule to files matching these patterns\n # exclude:\n # - 'app/views/admin/**/*'\n #\n # another-rule:\n # # Only apply this rule to files matching these patterns (overrides all 'include')\n # only:\n # - 'app/views/**/*'\n # # Exclude still applies even with 'only'\n # exclude:\n # - 'app/views/admin/**/*'\n\nformatter:\n enabled: false\n indentWidth: 2\n maxLineLength: 80\n\n # # Additional patterns beyond the defaults for formatting\n # include:\n # - '**/*.xml.erb'\n #\n # # Patterns to exclude from formatting\n # exclude:\n # - 'app/views/admin/**/*'\n\n # # Rewriters modify templates during formatting\n # rewriter:\n # # Pre-format rewriters (modify AST before formatting)\n # pre:\n # - tailwind-class-sorter\n # # Post-format rewriters (modify formatted output string)\n # post: []\n";
4860
+ var configTemplate = "# This file configures Herb for your project and team.\n# Settings here take precedence over individual editor preferences.\n#\n# Herb is a suite of tools for HTML+ERB templates including:\n# - Linter: Validates templates and enforces best practices\n# - Formatter: Auto-formats templates with intelligent indentation\n# - Language Server: Provides IDE support (VS Code, Zed, Neovim, etc.)\n#\n# Website: https://herb-tools.dev\n# Configuration: https://herb-tools.dev/configuration\n# GitHub Repo: https://github.com/marcoroth/herb\n#\n\nversion: 0.9.0\n\n# files:\n# # Additional patterns beyond the defaults (**.html, **.rhtml, **.html.erb, etc.)\n# include:\n# - '**/*.xml.erb'\n# - 'custom/**/*.html'\n#\n# # Patterns to exclude (can exclude defaults too)\n# exclude:\n# - 'public/**/*'\n# - 'tmp/**/*'\n\n# engine:\n# validators:\n# security: true # default: true\n# nesting: true # default: true\n# accessibility: true # default: true\n\nlinter:\n enabled: true\n\n # # Exit with error code when diagnostics of this severity or higher are present\n # # Valid values: error (default), warning, info, hint\n # failLevel: warning\n\n # # Additional patterns beyond the defaults for linting\n # include:\n # - '**/*.xml.erb'\n #\n # # Patterns to exclude from linting\n # exclude:\n # - 'app/views/admin/**/*'\n\n # rules:\n # erb-no-extra-newline:\n # enabled: false\n #\n # # Rules can have 'include', 'only', and 'exclude' patterns\n # some-rule:\n # # Additional patterns to check (additive, ignored when 'only' is present)\n # include:\n # - 'app/components/**/*'\n # # Don't apply this rule to files matching these patterns\n # exclude:\n # - 'app/views/admin/**/*'\n #\n # another-rule:\n # # Only apply this rule to files matching these patterns (overrides all 'include')\n # only:\n # - 'app/views/**/*'\n # # Exclude still applies even with 'only'\n # exclude:\n # - 'app/views/admin/**/*'\n\nformatter:\n enabled: false\n indentWidth: 2\n maxLineLength: 80\n\n # # Additional patterns beyond the defaults for formatting\n # include:\n # - '**/*.xml.erb'\n #\n # # Patterns to exclude from formatting\n # exclude:\n # - 'app/views/admin/**/*'\n\n # # Rewriters modify templates during formatting\n # rewriter:\n # # Pre-format rewriters (modify AST before formatting)\n # pre:\n # - tailwind-class-sorter\n # # Post-format rewriters (modify formatted output string)\n # post: []\n";
4861
+
4862
+ var defaultsYaml = "files:\n include:\n - \"**/*.herb\"\n - \"**/*.html.erb\"\n - \"**/*.html.herb\"\n - \"**/*.html\"\n - \"**/*.html+*.erb\"\n - \"**/*.rhtml\"\n - \"**/*.turbo_stream.erb\"\n\n exclude:\n - \"coverage/**/*\"\n - \"log/**/*\"\n - \"node_modules/**/*\"\n - \"storage/**/*\"\n - \"tmp/**/*\"\n - \"vendor/**/*\"\n\nengine:\n validators:\n security: true\n nesting: true\n accessibility: true\n\nlinter:\n enabled: true\n rules: {}\n\nformatter:\n enabled: false\n indentWidth: 2\n maxLineLength: 80\n";
4852
4863
 
4853
4864
  const DEFAULT_VERSION = packageJson.version;
4865
+ const PARSED_DEFAULTS = yaml.parse(defaultsYaml);
4854
4866
  class Config {
4855
4867
  static configPath = ".herb.yml";
4856
4868
  static PROJECT_INDICATORS = [
@@ -4924,8 +4936,9 @@ class Config {
4924
4936
  }
4925
4937
  /**
4926
4938
  * Get the files configuration for a specific tool.
4927
- * Tool-specific file config takes precedence over top-level config.
4928
- * Include patterns are additive (defaults are already merged in this.config).
4939
+ * Both include and exclude patterns are additive:
4940
+ * - Include: defaults + files.include + tool.include
4941
+ * - Exclude: defaults + files.exclude + tool.exclude
4929
4942
  * @param tool - The tool to get files config for ('linter' or 'formatter')
4930
4943
  * @returns The merged files configuration
4931
4944
  */
@@ -4935,7 +4948,9 @@ class Config {
4935
4948
  const topLevelInclude = topLevelFiles.include || [];
4936
4949
  const toolInclude = toolConfig?.include || [];
4937
4950
  const include = [...topLevelInclude, ...toolInclude];
4938
- const exclude = toolConfig?.exclude || topLevelFiles.exclude || [];
4951
+ const topLevelExclude = topLevelFiles.exclude || [];
4952
+ const toolExclude = toolConfig?.exclude || [];
4953
+ const exclude = [...topLevelExclude, ...toolExclude];
4939
4954
  return {
4940
4955
  include,
4941
4956
  exclude
@@ -5019,7 +5034,7 @@ class Config {
5019
5034
  }
5020
5035
  /**
5021
5036
  * Check if a tool (linter or formatter) is enabled for a specific file path.
5022
- * Respects both the tool's enabled state and its exclude patterns.
5037
+ * Respects the tool's enabled state and all exclude patterns (defaults + files.exclude + tool.exclude).
5023
5038
  * @param filePath - The file path to check
5024
5039
  * @param tool - The tool to check ('linter' or 'formatter')
5025
5040
  * @returns true if the tool is enabled for this path
@@ -5029,8 +5044,8 @@ class Config {
5029
5044
  if (!isEnabled) {
5030
5045
  return false;
5031
5046
  }
5032
- const toolConfig = tool === 'linter' ? this.config.linter : this.config.formatter;
5033
- const excludePatterns = toolConfig?.exclude || [];
5047
+ const filesConfig = this.getFilesConfigForTool(tool);
5048
+ const excludePatterns = filesConfig.exclude || [];
5034
5049
  return !this.isPathExcluded(filePath, excludePatterns);
5035
5050
  }
5036
5051
  /**
@@ -5053,11 +5068,11 @@ class Config {
5053
5068
  }
5054
5069
  /**
5055
5070
  * Check if a specific rule is enabled for a specific file path.
5056
- * Respects linter.enabled, linter.exclude, rule.enabled, rule.include, rule.only, and rule.exclude patterns.
5071
+ * Respects rule.enabled, rule.include, rule.only, and rule.exclude patterns.
5057
5072
  *
5058
5073
  * Pattern precedence:
5059
- * - If rule.only is specified: Only files matching 'only' patterns (ignores all 'include' patterns)
5060
- * - If rule.only is NOT specified: Files matching 'include' patterns (if specified, additive)
5074
+ * - If rule.only or rule.include matches the path: bypasses parent excludes (linter.exclude, files.exclude, defaults)
5075
+ * - If no rule.only/include patterns or path doesn't match: respects all parent excludes
5061
5076
  * - rule.exclude is always applied regardless of 'only' or 'include'
5062
5077
  *
5063
5078
  * @param ruleName - The name of the rule to check
@@ -5065,7 +5080,7 @@ class Config {
5065
5080
  * @returns true if the rule is enabled for this path
5066
5081
  */
5067
5082
  isRuleEnabledForPath(ruleName, filePath) {
5068
- if (!this.isLinterEnabledForPath(filePath)) {
5083
+ if (!this.isLinterEnabled) {
5069
5084
  return false;
5070
5085
  }
5071
5086
  if (this.isRuleDisabled(ruleName)) {
@@ -5075,13 +5090,25 @@ class Config {
5075
5090
  const ruleOnlyPatterns = ruleConfig?.only || [];
5076
5091
  const ruleIncludePatterns = ruleConfig?.include || [];
5077
5092
  const ruleExcludePatterns = ruleConfig?.exclude || [];
5093
+ let bypassParentExcludes = false;
5078
5094
  if (ruleOnlyPatterns.length > 0) {
5079
- if (!this.isPathIncluded(filePath, ruleOnlyPatterns)) {
5095
+ if (this.isPathIncluded(filePath, ruleOnlyPatterns)) {
5096
+ bypassParentExcludes = true;
5097
+ }
5098
+ else {
5080
5099
  return false;
5081
5100
  }
5082
5101
  }
5083
5102
  else if (ruleIncludePatterns.length > 0) {
5084
- if (!this.isPathIncluded(filePath, ruleIncludePatterns)) {
5103
+ if (this.isPathIncluded(filePath, ruleIncludePatterns)) {
5104
+ bypassParentExcludes = true;
5105
+ }
5106
+ else {
5107
+ return false;
5108
+ }
5109
+ }
5110
+ if (!bypassParentExcludes) {
5111
+ if (!this.isLinterEnabledForPath(filePath)) {
5085
5112
  return false;
5086
5113
  }
5087
5114
  }
@@ -5418,7 +5445,7 @@ class Config {
5418
5445
  result.push('');
5419
5446
  }
5420
5447
  }
5421
- if (/^ [a-z][\w-]*:/.test(line) && prevLine && /^ /.test(prevLine)) {
5448
+ if (/^ [a-z][\w-]*:/.test(line) && prevLine && prevLine.startsWith(' ')) {
5422
5449
  result.push('');
5423
5450
  }
5424
5451
  result.push(line);
@@ -5572,7 +5599,7 @@ class Config {
5572
5599
  console.error(`✓ Created default configuration at ${configPath}`);
5573
5600
  }
5574
5601
  }
5575
- catch (error) {
5602
+ catch (_error) {
5576
5603
  if (!silent) {
5577
5604
  console.error(`⚠ Could not create config file at ${configPath}, using defaults in-memory`);
5578
5605
  }
@@ -5661,62 +5688,57 @@ class Config {
5661
5688
  * Read, parse, and validate config file
5662
5689
  */
5663
5690
  static async readAndValidateConfig(configPath, projectRoot, version, exitOnError = false) {
5691
+ const content = await fs.promises.readFile(configPath, "utf8");
5692
+ let parsed;
5664
5693
  try {
5665
- const content = await fs.promises.readFile(configPath, "utf8");
5666
- let parsed;
5667
- try {
5668
- parsed = yaml.parse(content);
5694
+ parsed = yaml.parse(content);
5695
+ }
5696
+ catch (error) {
5697
+ if (exitOnError) {
5698
+ console.error(`\n✗ Invalid YAML syntax in ${configPath}`);
5699
+ if (error instanceof Error) {
5700
+ console.error(` ${error.message}\n`);
5701
+ }
5702
+ process.exit(1);
5669
5703
  }
5670
- catch (error) {
5704
+ else {
5705
+ throw new Error(`Invalid YAML syntax in ${configPath}: ${error instanceof Error ? error.message : String(error)}`);
5706
+ }
5707
+ }
5708
+ if (parsed === null || parsed === undefined) {
5709
+ parsed = {};
5710
+ }
5711
+ if (!parsed.version) {
5712
+ parsed.version = version;
5713
+ }
5714
+ try {
5715
+ HerbConfigSchema.parse(parsed);
5716
+ }
5717
+ catch (error) {
5718
+ if (error instanceof ZodError) {
5719
+ const validationError = fromZodError(error, {
5720
+ prefix: `Configuration errors in ${configPath}`,
5721
+ });
5671
5722
  if (exitOnError) {
5672
- console.error(`\n✗ Invalid YAML syntax in ${configPath}`);
5673
- if (error instanceof Error) {
5674
- console.error(` ${error.message}\n`);
5675
- }
5723
+ console.error(`\n✗ ${validationError.toString()}\n`);
5676
5724
  process.exit(1);
5677
5725
  }
5678
5726
  else {
5679
- throw new Error(`Invalid YAML syntax in ${configPath}: ${error instanceof Error ? error.message : String(error)}`);
5680
- }
5681
- }
5682
- if (parsed === null || parsed === undefined) {
5683
- parsed = {};
5684
- }
5685
- if (!parsed.version) {
5686
- parsed.version = version;
5687
- }
5688
- try {
5689
- HerbConfigSchema.parse(parsed);
5690
- }
5691
- catch (error) {
5692
- if (error instanceof ZodError) {
5693
- const validationError = fromZodError(error, {
5694
- prefix: `Configuration errors in ${configPath}`,
5695
- });
5696
- if (exitOnError) {
5697
- console.error(`\n✗ ${validationError.toString()}\n`);
5698
- process.exit(1);
5699
- }
5700
- else {
5701
- throw new Error(validationError.toString());
5702
- }
5727
+ throw new Error(validationError.toString());
5703
5728
  }
5704
- throw error;
5705
- }
5706
- if (parsed.version && parsed.version !== version) {
5707
- console.error(`\n⚠️ Configuration version mismatch in ${configPath}`);
5708
- console.error(` Config version: ${parsed.version}`);
5709
- console.error(` Current version: ${version}`);
5710
- console.error(` Consider updating your .herb.yml file.\n`);
5711
5729
  }
5712
- const defaults = this.getDefaultConfig(version);
5713
- const resolved = deepMerge(defaults, parsed);
5714
- resolved.version = version;
5715
- return new Config(projectRoot, resolved);
5716
- }
5717
- catch (error) {
5718
5730
  throw error;
5719
5731
  }
5732
+ if (parsed.version && parsed.version !== version) {
5733
+ console.error(`\n⚠️ Configuration version mismatch in ${configPath}`);
5734
+ console.error(` Config version: ${parsed.version}`);
5735
+ console.error(` Current version: ${version}`);
5736
+ console.error(` Consider updating your .herb.yml file.\n`);
5737
+ }
5738
+ const defaults = this.getDefaultConfig(version);
5739
+ const resolved = deepMerge(defaults, parsed);
5740
+ resolved.version = version;
5741
+ return new Config(projectRoot, resolved);
5720
5742
  }
5721
5743
  /**
5722
5744
  * Get default configuration object
@@ -5724,29 +5746,7 @@ class Config {
5724
5746
  static getDefaultConfig(version = DEFAULT_VERSION) {
5725
5747
  return {
5726
5748
  version,
5727
- files: {
5728
- include: [
5729
- '**/*.html',
5730
- '**/*.rhtml',
5731
- '**/*.html.erb',
5732
- '**/*.html+*.erb',
5733
- '**/*.turbo_stream.erb'
5734
- ],
5735
- exclude: [
5736
- 'node_modules/**/*',
5737
- 'vendor/bundle/**/*',
5738
- 'coverage/**/*',
5739
- ]
5740
- },
5741
- linter: {
5742
- enabled: true,
5743
- rules: {}
5744
- },
5745
- formatter: {
5746
- enabled: false,
5747
- indentWidth: 2,
5748
- maxLineLength: 80
5749
- }
5749
+ ...PARSED_DEFAULTS
5750
5750
  };
5751
5751
  }
5752
5752
  }
@@ -5786,7 +5786,7 @@ function readExtensionsJson(filePath) {
5786
5786
  }
5787
5787
  return parsed;
5788
5788
  }
5789
- catch (error) {
5789
+ catch (_error) {
5790
5790
  console.warn(`Warning: Could not parse ${filePath}, creating new file`);
5791
5791
  return { recommendations: [] };
5792
5792
  }