@herb-tools/linter 0.8.8 → 0.8.9

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/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@herb-tools/linter",
3
- "version": "0.8.8",
3
+ "version": "0.8.9",
4
4
  "description": "HTML+ERB linter for validating HTML structure and enforcing best practices",
5
5
  "license": "MIT",
6
6
  "homepage": "https://herb-tools.dev",
@@ -45,12 +45,12 @@
45
45
  }
46
46
  },
47
47
  "dependencies": {
48
- "@herb-tools/config": "0.8.8",
49
- "@herb-tools/core": "0.8.8",
50
- "@herb-tools/highlighter": "0.8.8",
51
- "@herb-tools/node-wasm": "0.8.8",
52
- "@herb-tools/printer": "0.8.8",
53
- "@herb-tools/rewriter": "0.8.8",
48
+ "@herb-tools/config": "0.8.9",
49
+ "@herb-tools/core": "0.8.9",
50
+ "@herb-tools/highlighter": "0.8.9",
51
+ "@herb-tools/node-wasm": "0.8.9",
52
+ "@herb-tools/printer": "0.8.9",
53
+ "@herb-tools/rewriter": "0.8.9",
54
54
  "picomatch": "^4.0.2",
55
55
  "tinyglobby": "^0.2.15"
56
56
  },
@@ -2,7 +2,7 @@ import { BaseRuleVisitor } from "./rule-utils.js";
2
2
  import { ParserRule } from "../types.js";
3
3
  import { isPartialFile } from "./file-utils.js";
4
4
  import { hasBalancedParentheses, splitByTopLevelComma } from "./string-utils.js";
5
- export const STRICT_LOCALS_PATTERN = /^locals:\s*\([^)]*\)\s*$/;
5
+ export const STRICT_LOCALS_PATTERN = /^locals:\s+\([^)]*\)\s*$/;
6
6
  function isValidStrictLocalsFormat(content) {
7
7
  return STRICT_LOCALS_PATTERN.test(content);
8
8
  }
@@ -32,6 +32,9 @@ function detectSingularLocal(content) {
32
32
  function detectMissingColonBeforeParens(content) {
33
33
  return /^locals\s+\(/.test(content);
34
34
  }
35
+ function detectMissingSpaceAfterColon(content) {
36
+ return /^locals:\(/.test(content);
37
+ }
35
38
  function detectMissingParentheses(content) {
36
39
  return /^locals:\s*[^(]/.test(content);
37
40
  }
@@ -178,6 +181,10 @@ class ERBStrictLocalsCommentSyntaxVisitor extends BaseRuleVisitor {
178
181
  this.addOffense("Use `locals:` with a colon before the parentheses, not `locals (`.", node.location);
179
182
  return;
180
183
  }
184
+ if (detectMissingSpaceAfterColon(commentContent)) {
185
+ this.addOffense("Missing space after `locals:`. Rails Strict Locals require a space after the colon: `<%# locals: (...) %>`.", node.location);
186
+ return;
187
+ }
181
188
  if (detectMissingParentheses(commentContent)) {
182
189
  this.addOffense("Wrap parameters in parentheses: `locals: (name:)` or `locals: (name: default)`.", node.location);
183
190
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"erb-strict-locals-comment-syntax.js","sourceRoot":"","sources":["../../../src/rules/erb-strict-locals-comment-syntax.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"erb-strict-locals-comment-syntax.js","sourceRoot":"","sources":["../../../src/rules/erb-strict-locals-comment-syntax.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@herb-tools/linter",
3
- "version": "0.8.8",
3
+ "version": "0.8.9",
4
4
  "description": "HTML+ERB linter for validating HTML structure and enforcing best practices",
5
5
  "license": "MIT",
6
6
  "homepage": "https://herb-tools.dev",
@@ -45,12 +45,12 @@
45
45
  }
46
46
  },
47
47
  "dependencies": {
48
- "@herb-tools/config": "0.8.8",
49
- "@herb-tools/core": "0.8.8",
50
- "@herb-tools/highlighter": "0.8.8",
51
- "@herb-tools/node-wasm": "0.8.8",
52
- "@herb-tools/printer": "0.8.8",
53
- "@herb-tools/rewriter": "0.8.8",
48
+ "@herb-tools/config": "0.8.9",
49
+ "@herb-tools/core": "0.8.9",
50
+ "@herb-tools/highlighter": "0.8.9",
51
+ "@herb-tools/node-wasm": "0.8.9",
52
+ "@herb-tools/printer": "0.8.9",
53
+ "@herb-tools/rewriter": "0.8.9",
54
54
  "picomatch": "^4.0.2",
55
55
  "tinyglobby": "^0.2.15"
56
56
  },
@@ -7,7 +7,7 @@ import { hasBalancedParentheses, splitByTopLevelComma } from "./string-utils.js"
7
7
  import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js"
8
8
  import type { ParseResult, ERBContentNode } from "@herb-tools/core"
9
9
 
10
- export const STRICT_LOCALS_PATTERN = /^locals:\s*\([^)]*\)\s*$/
10
+ export const STRICT_LOCALS_PATTERN = /^locals:\s+\([^)]*\)\s*$/
11
11
 
12
12
  function isValidStrictLocalsFormat(content: string): boolean {
13
13
  return STRICT_LOCALS_PATTERN.test(content)
@@ -49,6 +49,10 @@ function detectMissingColonBeforeParens(content: string): boolean {
49
49
  return /^locals\s+\(/.test(content)
50
50
  }
51
51
 
52
+ function detectMissingSpaceAfterColon(content: string): boolean {
53
+ return /^locals:\(/.test(content)
54
+ }
55
+
52
56
  function detectMissingParentheses(content: string): boolean {
53
57
  return /^locals:\s*[^(]/.test(content)
54
58
  }
@@ -240,6 +244,11 @@ class ERBStrictLocalsCommentSyntaxVisitor extends BaseRuleVisitor {
240
244
  return
241
245
  }
242
246
 
247
+ if (detectMissingSpaceAfterColon(commentContent)) {
248
+ this.addOffense("Missing space after `locals:`. Rails Strict Locals require a space after the colon: `<%# locals: (...) %>`.", node.location)
249
+ return
250
+ }
251
+
243
252
  if (detectMissingParentheses(commentContent)) {
244
253
  this.addOffense("Wrap parameters in parentheses: `locals: (name:)` or `locals: (name: default)`.", node.location)
245
254
  return