eslint-plugin-conventions 4.0.7 → 4.2.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/CHANGELOG.md +149 -0
- package/LICENSE +23 -0
- package/README.md +51 -21
- package/package.json +20 -3
- package/src/index.d.ts +49 -0
- package/src/index.js +15 -1
- package/src/index.js.map +1 -1
- package/src/lib/eslint-plugin-conventions.js.map +1 -1
- package/src/oxlint.d.ts +20 -0
- package/src/oxlint.js +22 -0
- package/src/oxlint.js.map +1 -0
- package/src/rules/conventions/analytics-event-naming.d.ts +41 -0
- package/src/rules/conventions/analytics-event-naming.js +104 -0
- package/src/rules/conventions/analytics-event-naming.js.map +1 -0
- package/src/rules/conventions/consistent-existence-index-check.js +5 -1
- package/src/rules/conventions/consistent-existence-index-check.js.map +1 -1
- package/src/rules/conventions/expiring-todo-comments.d.ts +41 -0
- package/src/rules/conventions/expiring-todo-comments.js +174 -165
- package/src/rules/conventions/expiring-todo-comments.js.map +1 -1
- package/src/rules/conventions/filename-case.js +13 -4
- package/src/rules/conventions/filename-case.js.map +1 -1
- package/src/rules/conventions/no-commented-code.js +3 -2
- package/src/rules/conventions/no-commented-code.js.map +1 -1
- package/src/rules/conventions/no-console-spaces.js +5 -0
- package/src/rules/conventions/no-console-spaces.js.map +1 -1
- package/src/rules/conventions/no-json-schema-tags.js +2 -1
- package/src/rules/conventions/no-json-schema-tags.js.map +1 -1
- package/src/rules/conventions/no-magic-numbers.d.ts +41 -0
- package/src/rules/conventions/no-magic-numbers.js +205 -0
- package/src/rules/conventions/no-magic-numbers.js.map +1 -0
- package/src/rules/conventions/no-raw-cross-property-href.d.ts +24 -0
- package/src/rules/conventions/no-raw-cross-property-href.js +86 -0
- package/src/rules/conventions/no-raw-cross-property-href.js.map +1 -0
- package/src/rules/conventions/prefer-code-point.js +4 -1
- package/src/rules/conventions/prefer-code-point.js.map +1 -1
- package/src/rules/conventions/prefer-dependency-version-strategy.d.ts +5 -5
- package/src/rules/conventions/prefer-dependency-version-strategy.js +1 -0
- package/src/rules/conventions/prefer-dependency-version-strategy.js.map +1 -1
- package/src/rules/conventions/prefer-dom-node-text-content.js +7 -7
- package/src/rules/conventions/prefer-dom-node-text-content.js.map +1 -1
- package/src/rules/conventions/require-data-testid.d.ts +56 -0
- package/src/rules/conventions/require-data-testid.js +209 -0
- package/src/rules/conventions/require-data-testid.js.map +1 -0
- package/src/rules/conventions/utm-taxonomy.d.ts +25 -0
- package/src/rules/conventions/utm-taxonomy.js +117 -0
- package/src/rules/conventions/utm-taxonomy.js.map +1 -0
- package/src/rules/deprecation/no-deprecated-api.js +6 -1
- package/src/rules/deprecation/no-deprecated-api.js.map +1 -1
|
@@ -29,6 +29,7 @@ exports.filenameCase = (0, eslint_devkit_1.createRule)({
|
|
|
29
29
|
meta: {
|
|
30
30
|
type: 'problem',
|
|
31
31
|
docs: {
|
|
32
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-conventions/docs/rules/filename-case.md',
|
|
32
33
|
description: 'Enforce filename case conventions for consistency',
|
|
33
34
|
},
|
|
34
35
|
hasSuggestions: true,
|
|
@@ -108,9 +109,11 @@ exports.filenameCase = (0, eslint_devkit_1.createRule)({
|
|
|
108
109
|
const [options] = context.options;
|
|
109
110
|
const { case: caseType = 'kebabCase', ignore = [], allowedUppercaseFiles = DEFAULT_ALLOWED_UPPERCASE_FILES, allowedKebabCase = [], allowedSnakeCase = [], allowedCamelCase = [], allowedPascalCase = [], } = options || {};
|
|
110
111
|
// Convert to different case formats
|
|
112
|
+
// oxlint-disable-next-line consistent-function-scoping
|
|
111
113
|
function toCamelCase(str) {
|
|
112
114
|
return str.replace(/[-_](.)/g, (_, letter) => letter.toUpperCase());
|
|
113
115
|
}
|
|
116
|
+
// oxlint-disable-next-line consistent-function-scoping
|
|
114
117
|
function toKebabCase(str) {
|
|
115
118
|
return str
|
|
116
119
|
.replace(/([a-z])([A-Z])/g, '$1-$2')
|
|
@@ -121,6 +124,7 @@ exports.filenameCase = (0, eslint_devkit_1.createRule)({
|
|
|
121
124
|
const camel = toCamelCase(str);
|
|
122
125
|
return camel.charAt(0).toUpperCase() + camel.slice(1);
|
|
123
126
|
}
|
|
127
|
+
// oxlint-disable-next-line consistent-function-scoping
|
|
124
128
|
function toSnakeCase(str) {
|
|
125
129
|
return str
|
|
126
130
|
.replace(/([a-z])([A-Z])/g, '$1_$2')
|
|
@@ -128,18 +132,22 @@ exports.filenameCase = (0, eslint_devkit_1.createRule)({
|
|
|
128
132
|
.toLowerCase();
|
|
129
133
|
}
|
|
130
134
|
// Check if filename matches the expected case pattern
|
|
135
|
+
// oxlint-disable-next-line consistent-function-scoping
|
|
131
136
|
function isCamelCase(str) {
|
|
132
137
|
// camelCase: starts with lowercase, no separators, can have uppercase after first char
|
|
133
138
|
return /^[a-z][a-zA-Z0-9]*$/.test(str);
|
|
134
139
|
}
|
|
140
|
+
// oxlint-disable-next-line consistent-function-scoping
|
|
135
141
|
function isKebabCase(str) {
|
|
136
142
|
// kebab-case: all lowercase with hyphens as separators
|
|
137
143
|
return /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/.test(str);
|
|
138
144
|
}
|
|
145
|
+
// oxlint-disable-next-line consistent-function-scoping
|
|
139
146
|
function isPascalCase(str) {
|
|
140
147
|
// PascalCase: starts with uppercase, no separators
|
|
141
148
|
return /^[A-Z][a-zA-Z0-9]*$/.test(str);
|
|
142
149
|
}
|
|
150
|
+
// oxlint-disable-next-line consistent-function-scoping
|
|
143
151
|
function isSnakeCase(str) {
|
|
144
152
|
// snake_case: all lowercase with underscores as separators
|
|
145
153
|
return /^[a-z][a-z0-9]*(_[a-z0-9]+)*$/.test(str);
|
|
@@ -160,7 +168,10 @@ exports.filenameCase = (0, eslint_devkit_1.createRule)({
|
|
|
160
168
|
}
|
|
161
169
|
// Generate suggested filename
|
|
162
170
|
function getSuggestedName(basename, nameWithoutExt, targetCase) {
|
|
163
|
-
|
|
171
|
+
// Initialized to the untransformed name; every valid CaseType below
|
|
172
|
+
// overwrites it. (An unknown case never reaches here — matchesCase
|
|
173
|
+
// returns true for unknown cases, so no rename is ever suggested.)
|
|
174
|
+
let transformed = nameWithoutExt;
|
|
164
175
|
switch (targetCase) {
|
|
165
176
|
case 'camelCase':
|
|
166
177
|
transformed = toCamelCase(nameWithoutExt);
|
|
@@ -174,8 +185,6 @@ exports.filenameCase = (0, eslint_devkit_1.createRule)({
|
|
|
174
185
|
case 'snakeCase':
|
|
175
186
|
transformed = toSnakeCase(nameWithoutExt);
|
|
176
187
|
break;
|
|
177
|
-
default:
|
|
178
|
-
transformed = nameWithoutExt;
|
|
179
188
|
}
|
|
180
189
|
// Add back the extension
|
|
181
190
|
const ext = basename.slice(nameWithoutExt.length);
|
|
@@ -184,7 +193,7 @@ exports.filenameCase = (0, eslint_devkit_1.createRule)({
|
|
|
184
193
|
return {
|
|
185
194
|
Program(node) {
|
|
186
195
|
// Get filename from context
|
|
187
|
-
const filename = context.
|
|
196
|
+
const filename = context.filename;
|
|
188
197
|
if (!filename) {
|
|
189
198
|
return;
|
|
190
199
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filename-case.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"filename-case.js","sourceRoot":"","sources":["../../../../src/rules/conventions/filename-case.ts"],"names":[],"mappings":"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"}
|
|
@@ -81,6 +81,7 @@ exports.noCommentedCode = (0, eslint_devkit_2.createRule)({
|
|
|
81
81
|
meta: {
|
|
82
82
|
type: 'suggestion',
|
|
83
83
|
docs: {
|
|
84
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-conventions/docs/rules/no-commented-code.md',
|
|
84
85
|
description: 'Detects commented-out code blocks',
|
|
85
86
|
},
|
|
86
87
|
hasSuggestions: true,
|
|
@@ -144,12 +145,12 @@ exports.noCommentedCode = (0, eslint_devkit_2.createRule)({
|
|
|
144
145
|
],
|
|
145
146
|
create(context, [options = {}]) {
|
|
146
147
|
const { ignoreSingleLine = false, ignoreInTests = true, minLines = 1, } = options || {};
|
|
147
|
-
const filename = context.
|
|
148
|
+
const filename = context.filename;
|
|
148
149
|
const isTestFile = ignoreInTests && /\.(test|spec)\.(ts|tsx|js|jsx)$/.test(filename);
|
|
149
150
|
if (isTestFile) {
|
|
150
151
|
return {};
|
|
151
152
|
}
|
|
152
|
-
const sourceCode = context.sourceCode
|
|
153
|
+
const sourceCode = context.sourceCode;
|
|
153
154
|
/**
|
|
154
155
|
* Check comment nodes
|
|
155
156
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-commented-code.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"no-commented-code.js","sourceRoot":"","sources":["../../../../src/rules/conventions/no-commented-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ exports.noConsoleSpaces = (0, eslint_devkit_1.createRule)({
|
|
|
13
13
|
meta: {
|
|
14
14
|
type: 'problem',
|
|
15
15
|
docs: {
|
|
16
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-conventions/docs/rules/no-console-spaces.md',
|
|
16
17
|
description: 'Prevent leading/trailing space between console.log parameters',
|
|
17
18
|
},
|
|
18
19
|
fixable: 'code',
|
|
@@ -43,6 +44,7 @@ exports.noConsoleSpaces = (0, eslint_devkit_1.createRule)({
|
|
|
43
44
|
'group',
|
|
44
45
|
'groupCollapsed',
|
|
45
46
|
]);
|
|
47
|
+
// oxlint-disable-next-line consistent-function-scoping
|
|
46
48
|
function isInAllowedContext() {
|
|
47
49
|
// For simplicity, we'll skip the allow option for now
|
|
48
50
|
return false;
|
|
@@ -58,6 +60,7 @@ exports.noConsoleSpaces = (0, eslint_devkit_1.createRule)({
|
|
|
58
60
|
}
|
|
59
61
|
return false;
|
|
60
62
|
}
|
|
63
|
+
// oxlint-disable-next-line consistent-function-scoping
|
|
61
64
|
function getConsoleMethodName(node) {
|
|
62
65
|
// Safe extraction of console method name
|
|
63
66
|
if (node.callee.type === 'MemberExpression' &&
|
|
@@ -66,12 +69,14 @@ exports.noConsoleSpaces = (0, eslint_devkit_1.createRule)({
|
|
|
66
69
|
}
|
|
67
70
|
return 'console';
|
|
68
71
|
}
|
|
72
|
+
// oxlint-disable-next-line consistent-function-scoping
|
|
69
73
|
function hasLeadingOrTrailingSpaces(text) {
|
|
70
74
|
// Check if string starts or ends with whitespace, but not if it's only whitespace
|
|
71
75
|
// Only flag if there's actual content with leading/trailing spaces
|
|
72
76
|
const trimmed = text.trim();
|
|
73
77
|
return trimmed.length > 0 && /^\s|\s$/.test(text);
|
|
74
78
|
}
|
|
79
|
+
// oxlint-disable-next-line consistent-function-scoping
|
|
75
80
|
function hasLeadingOrTrailingSpacesInTemplate(text) {
|
|
76
81
|
// For template literals, even whitespace-only quasis should be flagged
|
|
77
82
|
return /^\s|\s$/.test(text);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-console-spaces.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"no-console-spaces.js","sourceRoot":"","sources":["../../../../src/rules/conventions/no-console-spaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -76,6 +76,7 @@ exports.noJsonSchemaTags = (0, eslint_devkit_1.createRule)({
|
|
|
76
76
|
meta: {
|
|
77
77
|
type: 'suggestion',
|
|
78
78
|
docs: {
|
|
79
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-conventions/docs/rules/no-json-schema-tags.md',
|
|
79
80
|
description: 'Disallow JSON Schema keywords used as JSDoc tags (e.g. @minimum, @maximum)',
|
|
80
81
|
},
|
|
81
82
|
hasSuggestions: true,
|
|
@@ -120,7 +121,7 @@ exports.noJsonSchemaTags = (0, eslint_devkit_1.createRule)({
|
|
|
120
121
|
for (const tag of additionalForbiddenTags) {
|
|
121
122
|
forbiddenTags.add(tag);
|
|
122
123
|
}
|
|
123
|
-
const sourceCode = context.sourceCode
|
|
124
|
+
const sourceCode = context.sourceCode;
|
|
124
125
|
return {
|
|
125
126
|
Program() {
|
|
126
127
|
const comments = sourceCode.getAllComments();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-json-schema-tags.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"no-json-schema-tags.js","sourceRoot":"","sources":["../../../../src/rules/conventions/no-json-schema-tags.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Ofri Peretz
|
|
3
|
+
* Licensed under the MIT License. Use of this source code is governed by the
|
|
4
|
+
* MIT license that can be found in the LICENSE file.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* ESLint Rule: no-magic-numbers
|
|
8
|
+
* Flags numeric literals that are not self-documenting — i.e., numbers that
|
|
9
|
+
* appear in code without a named constant explaining their meaning.
|
|
10
|
+
*
|
|
11
|
+
* Beats ESLint core's no-magic-numbers in two ways:
|
|
12
|
+
* 1. Built-in allowlist covers idiomatic JS patterns (array indices, bit
|
|
13
|
+
* masks, HTTP status codes family boundaries) so teams don't need to
|
|
14
|
+
* enumerate common safe values.
|
|
15
|
+
* 2. Skips enums, default parameter values, and export declarations where
|
|
16
|
+
* the context already provides naming.
|
|
17
|
+
*
|
|
18
|
+
* @see https://refactoring.guru/replace-magic-literal
|
|
19
|
+
*/
|
|
20
|
+
import type { TSESLint } from '@interlace/eslint-devkit';
|
|
21
|
+
type MessageIds = 'noMagicNumber' | 'extractConst';
|
|
22
|
+
export interface Options {
|
|
23
|
+
/**
|
|
24
|
+
* Numbers that are always allowed regardless of context.
|
|
25
|
+
* Defaults to [-1, 0, 1, 2] — universally idiomatic.
|
|
26
|
+
*/
|
|
27
|
+
ignore?: number[];
|
|
28
|
+
/** Allow numbers used as array indices (e.g., `items[2]`). Default: true */
|
|
29
|
+
ignoreArrayIndexes?: boolean;
|
|
30
|
+
/** Allow numbers in default parameter values (e.g., `function f(n = 10)`). Default: true */
|
|
31
|
+
ignoreDefaultValues?: boolean;
|
|
32
|
+
/** Allow numbers in enum member initializers. Default: true */
|
|
33
|
+
ignoreEnums?: boolean;
|
|
34
|
+
/** Allow numbers in bitwise expressions. Default: false */
|
|
35
|
+
ignoreBitwiseExpressions?: boolean;
|
|
36
|
+
}
|
|
37
|
+
type RuleOptions = [Options?];
|
|
38
|
+
export declare const noMagicNumbers: TSESLint.RuleModule<MessageIds, RuleOptions, unknown, TSESLint.RuleListener> & {
|
|
39
|
+
name: string;
|
|
40
|
+
};
|
|
41
|
+
export {};
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright (c) 2025 Ofri Peretz
|
|
4
|
+
* Licensed under the MIT License. Use of this source code is governed by the
|
|
5
|
+
* MIT license that can be found in the LICENSE file.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.noMagicNumbers = void 0;
|
|
9
|
+
const eslint_devkit_1 = require("@interlace/eslint-devkit");
|
|
10
|
+
const eslint_devkit_2 = require("@interlace/eslint-devkit");
|
|
11
|
+
/** Numbers that are universally idiomatic in JS/TS and need no naming. */
|
|
12
|
+
const DEFAULT_IGNORE = new Set([-1, 0, 1, 2]);
|
|
13
|
+
/** Build a SCREAMING_SNAKE_CASE const name from a numeric value. */
|
|
14
|
+
function constNameFor(value) {
|
|
15
|
+
// e.g. 5000 → MAGIC_5000 · -3 → MAGIC_NEG_3 · 1.5 → MAGIC_1_5
|
|
16
|
+
const prefix = value < 0 ? 'MAGIC_NEG_' : 'MAGIC_';
|
|
17
|
+
const digits = String(Math.abs(value)).replace('.', '_');
|
|
18
|
+
return `${prefix}${digits}`;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Walk up the AST to find the nearest statement ancestor that can be used
|
|
22
|
+
* as the insertion point for a const declaration.
|
|
23
|
+
*/
|
|
24
|
+
function nearestStatement(node) {
|
|
25
|
+
const STATEMENT_TYPES = new Set([
|
|
26
|
+
'ExpressionStatement', 'VariableDeclaration', 'ReturnStatement',
|
|
27
|
+
'IfStatement', 'WhileStatement', 'ForStatement', 'ForInStatement',
|
|
28
|
+
'ForOfStatement', 'ThrowStatement', 'SwitchStatement',
|
|
29
|
+
]);
|
|
30
|
+
let current = node.parent;
|
|
31
|
+
while (current) {
|
|
32
|
+
if (STATEMENT_TYPES.has(current.type))
|
|
33
|
+
return current;
|
|
34
|
+
current = current.parent;
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
exports.noMagicNumbers = (0, eslint_devkit_1.createRule)({
|
|
39
|
+
name: 'no-magic-numbers',
|
|
40
|
+
meta: {
|
|
41
|
+
type: 'suggestion',
|
|
42
|
+
docs: {
|
|
43
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-conventions/docs/rules/no-magic-numbers.md',
|
|
44
|
+
description: 'Disallow magic numbers (numeric literals without a named constant)',
|
|
45
|
+
},
|
|
46
|
+
hasSuggestions: true,
|
|
47
|
+
messages: {
|
|
48
|
+
noMagicNumber: (0, eslint_devkit_2.formatLLMMessage)({
|
|
49
|
+
icon: eslint_devkit_2.MessageIcons.INFO,
|
|
50
|
+
issueName: 'Magic Number',
|
|
51
|
+
description: 'The number {{value}} is a magic literal. Extract it to a named constant to make the intent clear.',
|
|
52
|
+
severity: 'LOW',
|
|
53
|
+
fix: 'const TIMEOUT_MS = {{value}}; // use the named constant everywhere',
|
|
54
|
+
documentationLink: 'https://refactoring.guru/replace-magic-literal',
|
|
55
|
+
}),
|
|
56
|
+
extractConst: 'Extract {{value}} to a named constant ({{constName}})',
|
|
57
|
+
},
|
|
58
|
+
schema: [
|
|
59
|
+
{
|
|
60
|
+
type: 'object',
|
|
61
|
+
properties: {
|
|
62
|
+
ignore: {
|
|
63
|
+
type: 'array',
|
|
64
|
+
items: { type: 'number' },
|
|
65
|
+
description: 'Additional numbers to allow',
|
|
66
|
+
},
|
|
67
|
+
ignoreArrayIndexes: { type: 'boolean', default: true },
|
|
68
|
+
ignoreDefaultValues: { type: 'boolean', default: true },
|
|
69
|
+
ignoreEnums: { type: 'boolean', default: true },
|
|
70
|
+
ignoreBitwiseExpressions: { type: 'boolean', default: false },
|
|
71
|
+
},
|
|
72
|
+
additionalProperties: false,
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
},
|
|
76
|
+
defaultOptions: [
|
|
77
|
+
{
|
|
78
|
+
ignore: [],
|
|
79
|
+
ignoreArrayIndexes: true,
|
|
80
|
+
ignoreDefaultValues: true,
|
|
81
|
+
ignoreEnums: true,
|
|
82
|
+
ignoreBitwiseExpressions: false,
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
create(context) {
|
|
86
|
+
const [options = {}] = context.options;
|
|
87
|
+
const { ignore = [], ignoreArrayIndexes = true, ignoreDefaultValues = true, ignoreEnums = true, ignoreBitwiseExpressions = false, } = options;
|
|
88
|
+
const ignoredValues = new Set([...DEFAULT_IGNORE, ...ignore]);
|
|
89
|
+
function isIgnoredNumber(value) {
|
|
90
|
+
return ignoredValues.has(value);
|
|
91
|
+
}
|
|
92
|
+
function isArrayIndex(node) {
|
|
93
|
+
if (!ignoreArrayIndexes)
|
|
94
|
+
return false;
|
|
95
|
+
const parent = node.parent;
|
|
96
|
+
return (parent?.type === 'MemberExpression' &&
|
|
97
|
+
parent.computed &&
|
|
98
|
+
parent.property === node);
|
|
99
|
+
}
|
|
100
|
+
function isDefaultValue(node) {
|
|
101
|
+
if (!ignoreDefaultValues)
|
|
102
|
+
return false;
|
|
103
|
+
const parent = node.parent;
|
|
104
|
+
return (parent?.type === 'AssignmentPattern' &&
|
|
105
|
+
parent.right === node);
|
|
106
|
+
}
|
|
107
|
+
function isEnumMember(node) {
|
|
108
|
+
if (!ignoreEnums)
|
|
109
|
+
return false;
|
|
110
|
+
const parent = node.parent;
|
|
111
|
+
return parent?.type === 'TSEnumMember';
|
|
112
|
+
}
|
|
113
|
+
function isBitwiseContext(node) {
|
|
114
|
+
if (!ignoreBitwiseExpressions)
|
|
115
|
+
return false;
|
|
116
|
+
const parent = node.parent;
|
|
117
|
+
const BITWISE_OPS = new Set(['&', '|', '^', '<<', '>>', '>>>']);
|
|
118
|
+
return (parent?.type === 'BinaryExpression' &&
|
|
119
|
+
BITWISE_OPS.has(parent.operator));
|
|
120
|
+
}
|
|
121
|
+
function isVariableDeclarator(node) {
|
|
122
|
+
// const FOO = 42 — the literal is the named constant itself
|
|
123
|
+
const parent = node.parent;
|
|
124
|
+
return parent?.type === 'VariableDeclarator';
|
|
125
|
+
}
|
|
126
|
+
function isExportedConst(node) {
|
|
127
|
+
// export const FOO = 42
|
|
128
|
+
let current = node;
|
|
129
|
+
while (current) {
|
|
130
|
+
if (current.type === 'ExportNamedDeclaration')
|
|
131
|
+
return true;
|
|
132
|
+
if (current.type === 'VariableDeclaration' ||
|
|
133
|
+
current.type === 'VariableDeclarator') {
|
|
134
|
+
current = current.parent;
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
function isPropertyKey(node) {
|
|
142
|
+
// { 42: 'value' } — numeric key in object literal
|
|
143
|
+
const parent = node.parent;
|
|
144
|
+
return (parent?.type === 'Property' &&
|
|
145
|
+
parent.key === node);
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
Literal(node) {
|
|
149
|
+
if (typeof node.value !== 'number')
|
|
150
|
+
return;
|
|
151
|
+
const value = node.value;
|
|
152
|
+
// Skip universally ignored values
|
|
153
|
+
if (isIgnoredNumber(value))
|
|
154
|
+
return;
|
|
155
|
+
// Skip NaN / Infinity (not numeric literals per se)
|
|
156
|
+
if (!isFinite(value))
|
|
157
|
+
return;
|
|
158
|
+
// Context-based skips
|
|
159
|
+
if (isVariableDeclarator(node))
|
|
160
|
+
return; // const X = 42
|
|
161
|
+
if (isExportedConst(node))
|
|
162
|
+
return;
|
|
163
|
+
if (isArrayIndex(node))
|
|
164
|
+
return;
|
|
165
|
+
if (isDefaultValue(node))
|
|
166
|
+
return;
|
|
167
|
+
if (isEnumMember(node))
|
|
168
|
+
return;
|
|
169
|
+
if (isBitwiseContext(node))
|
|
170
|
+
return;
|
|
171
|
+
if (isPropertyKey(node))
|
|
172
|
+
return;
|
|
173
|
+
const constName = constNameFor(value);
|
|
174
|
+
const sourceCode = context.sourceCode;
|
|
175
|
+
context.report({
|
|
176
|
+
node,
|
|
177
|
+
messageId: 'noMagicNumber',
|
|
178
|
+
data: { value: String(value) },
|
|
179
|
+
suggest: [
|
|
180
|
+
{
|
|
181
|
+
messageId: 'extractConst',
|
|
182
|
+
data: { value: String(value), constName },
|
|
183
|
+
fix(fixer) {
|
|
184
|
+
const stmt = nearestStatement(node);
|
|
185
|
+
if (!stmt)
|
|
186
|
+
return null;
|
|
187
|
+
// Determine indentation from the statement's first token.
|
|
188
|
+
const firstToken = sourceCode.getFirstToken(stmt);
|
|
189
|
+
if (!firstToken)
|
|
190
|
+
return null;
|
|
191
|
+
const col = firstToken.loc.start.column;
|
|
192
|
+
const indent = ' '.repeat(col);
|
|
193
|
+
return [
|
|
194
|
+
fixer.insertTextBefore(stmt, `const ${constName} = ${value};\n${indent}`),
|
|
195
|
+
fixer.replaceText(node, constName),
|
|
196
|
+
];
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
],
|
|
200
|
+
});
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
//# sourceMappingURL=no-magic-numbers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-magic-numbers.js","sourceRoot":"","sources":["../../../../src/rules/conventions/no-magic-numbers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Ofri Peretz
|
|
3
|
+
* Licensed under the MIT License. Use of this source code is governed by the
|
|
4
|
+
* MIT license that can be found in the LICENSE file.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* ESLint Rule: no-raw-cross-property-href
|
|
8
|
+
*
|
|
9
|
+
* Flags hand-written `<a href="https://*.interlace.tools/…">` and
|
|
10
|
+
* `<a href="https://ofriperetz.dev/…">` JSX literals. UTM_PHILOSOPHY.md
|
|
11
|
+
* principle 9: the only blessed way to construct a cross-property URL is the
|
|
12
|
+
* `buildUtmHref()` helper, which stamps the source/medium/campaign/content
|
|
13
|
+
* and (for cross-eTLD+1 outbound) appends `ph_distinct_id` for identity
|
|
14
|
+
* stitching.
|
|
15
|
+
*
|
|
16
|
+
* The rule fires on JSX `href` attributes whose value is a string Literal
|
|
17
|
+
* (not an expression). Wrapping the URL in `buildUtmHref(...)` produces a
|
|
18
|
+
* JSXExpressionContainer instead of a Literal, which is the intended escape
|
|
19
|
+
* hatch — no separate detection needed.
|
|
20
|
+
*/
|
|
21
|
+
import type { TSESLint } from '@interlace/eslint-devkit';
|
|
22
|
+
export declare const noRawCrossPropertyHref: TSESLint.RuleModule<"rawCrossPropertyHref", [], unknown, TSESLint.RuleListener> & {
|
|
23
|
+
name: string;
|
|
24
|
+
};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright (c) 2025 Ofri Peretz
|
|
4
|
+
* Licensed under the MIT License. Use of this source code is governed by the
|
|
5
|
+
* MIT license that can be found in the LICENSE file.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.noRawCrossPropertyHref = void 0;
|
|
9
|
+
const eslint_devkit_1 = require("@interlace/eslint-devkit");
|
|
10
|
+
const eslint_devkit_2 = require("@interlace/eslint-devkit");
|
|
11
|
+
// Fixed list of cross-property hosts. Mirrors UTM_PHILOSOPHY.md's
|
|
12
|
+
// cross-property travel matrix and ANALYTICS_PHILOSOPHY.md principle 1's
|
|
13
|
+
// list of measured surfaces. Edit there and here together.
|
|
14
|
+
const CROSS_PROPERTY_HOSTS = new Set([
|
|
15
|
+
'ofriperetz.dev',
|
|
16
|
+
'interlace.tools',
|
|
17
|
+
'eslint.interlace.tools',
|
|
18
|
+
'serverless.interlace.tools',
|
|
19
|
+
'ds.interlace.tools',
|
|
20
|
+
'storybook.interlace.tools',
|
|
21
|
+
]);
|
|
22
|
+
exports.noRawCrossPropertyHref = (0, eslint_devkit_1.createRule)({
|
|
23
|
+
name: 'no-raw-cross-property-href',
|
|
24
|
+
meta: {
|
|
25
|
+
type: 'problem',
|
|
26
|
+
docs: {
|
|
27
|
+
url: 'https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-conventions/docs/rules/no-raw-cross-property-href.md',
|
|
28
|
+
description: 'Forbid hand-written cross-property hrefs; use buildUtmHref() from lib/utm.ts',
|
|
29
|
+
},
|
|
30
|
+
fixable: undefined,
|
|
31
|
+
hasSuggestions: false,
|
|
32
|
+
messages: {
|
|
33
|
+
rawCrossPropertyHref: (0, eslint_devkit_2.formatLLMMessage)({
|
|
34
|
+
icon: eslint_devkit_2.MessageIcons.WARNING,
|
|
35
|
+
issueName: 'Raw cross-property href',
|
|
36
|
+
description: 'href "{{href}}" points to a cross-property surface ({{host}}). Use buildUtmHref() from lib/utm.ts so the link carries UTM and ph_distinct_id.',
|
|
37
|
+
severity: 'HIGH',
|
|
38
|
+
fix: 'Replace with buildUtmHref(\'{{href}}\', { source, medium, campaign, content }).',
|
|
39
|
+
documentationLink: 'https://github.com/ofri-peretz/eslint/blob/main/UTM_PHILOSOPHY.md',
|
|
40
|
+
}),
|
|
41
|
+
},
|
|
42
|
+
schema: [],
|
|
43
|
+
},
|
|
44
|
+
defaultOptions: [],
|
|
45
|
+
create(context) {
|
|
46
|
+
function parseHost(value) {
|
|
47
|
+
// Only absolute URLs with a hostname.
|
|
48
|
+
if (!/^https?:\/\//i.test(value))
|
|
49
|
+
return null;
|
|
50
|
+
try {
|
|
51
|
+
return new URL(value).hostname.toLowerCase();
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function isCrossPropertyHref(href) {
|
|
58
|
+
const host = parseHost(href);
|
|
59
|
+
if (!host)
|
|
60
|
+
return null;
|
|
61
|
+
if (!CROSS_PROPERTY_HOSTS.has(host))
|
|
62
|
+
return null;
|
|
63
|
+
return { host };
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
JSXAttribute(node) {
|
|
67
|
+
if (node.name.type !== 'JSXIdentifier' ||
|
|
68
|
+
node.name.name !== 'href' ||
|
|
69
|
+
!node.value ||
|
|
70
|
+
node.value.type !== 'Literal' ||
|
|
71
|
+
typeof node.value.value !== 'string') {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const result = isCrossPropertyHref(node.value.value);
|
|
75
|
+
if (!result)
|
|
76
|
+
return;
|
|
77
|
+
context.report({
|
|
78
|
+
node: node.value,
|
|
79
|
+
messageId: 'rawCrossPropertyHref',
|
|
80
|
+
data: { href: node.value.value, host: result.host },
|
|
81
|
+
});
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=no-raw-cross-property-href.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-raw-cross-property-href.js","sourceRoot":"","sources":["../../../../src/rules/conventions/no-raw-cross-property-href.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAkBH,4DAAsD;AACtD,4DAA0E;AAK1E,kEAAkE;AAClE,yEAAyE;AACzE,2DAA2D;AAC3D,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IACnC,gBAAgB;IAChB,iBAAiB;IACjB,wBAAwB;IACxB,4BAA4B;IAC5B,oBAAoB;IACpB,2BAA2B;CAC5B,CAAC,CAAC;AAEU,QAAA,sBAAsB,GAAG,IAAA,0BAAU,EAA0B;IACxE,IAAI,EAAE,4BAA4B;IAClC,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,GAAG,EAAE,6HAA6H;YAClI,WAAW,EACT,8EAA8E;SACjF;QACD,OAAO,EAAE,SAAS;QAClB,cAAc,EAAE,KAAK;QACrB,QAAQ,EAAE;YACR,oBAAoB,EAAE,IAAA,gCAAgB,EAAC;gBACrC,IAAI,EAAE,4BAAY,CAAC,OAAO;gBAC1B,SAAS,EAAE,yBAAyB;gBACpC,WAAW,EACT,+IAA+I;gBACjJ,QAAQ,EAAE,MAAM;gBAChB,GAAG,EAAE,iFAAiF;gBACtF,iBAAiB,EACf,mEAAmE;aACtE,CAAC;SACH;QACD,MAAM,EAAE,EAAE;KACX;IACD,cAAc,EAAE,EAAE;IAElB,MAAM,CAAC,OAAsD;QAC3D,SAAS,SAAS,CAAC,KAAa;YAC9B,sCAAsC;YACtC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC9C,IAAI,CAAC;gBACH,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC/C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,SAAS,mBAAmB,CAAC,IAAY;YAGvC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAC;YACvB,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YACjD,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,CAAC;QAED,OAAO;YACL,YAAY,CAAC,IAA2B;gBACtC,IACE,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,eAAe;oBAClC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM;oBACzB,CAAC,IAAI,CAAC,KAAK;oBACX,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS;oBAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,QAAQ,EACpC,CAAC;oBACD,OAAO;gBACT,CAAC;gBACD,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACrD,IAAI,CAAC,MAAM;oBAAE,OAAO;gBACpB,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI,EAAE,IAAI,CAAC,KAAK;oBAChB,SAAS,EAAE,sBAAsB;oBACjC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;iBACpD,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|