eslint-plugin-conventions 5.3.2 → 5.3.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-conventions",
3
- "version": "5.3.2",
3
+ "version": "5.3.4",
4
4
  "description": "ESLint plugin for team code conventions — enforces filename case, magic-number bans, commented-out code, expiring TODOs, and deprecated-API usage.",
5
5
  "type": "commonjs",
6
6
  "main": "./src/index.js",
package/src/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.configs=exports.plugin=exports.rules=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");exports.rules={get"no-commented-code"(){return require("./rules/conventions/no-commented-code").noCommentedCode},get"expiring-todo-comments"(){return require("./rules/conventions/expiring-todo-comments").expiringTodoComments},get"prefer-code-point"(){return require("./rules/conventions/prefer-code-point").preferCodePoint},get"prefer-dom-node-text-content"(){return require("./rules/conventions/prefer-dom-node-text-content").preferDomNodeTextContent},get"no-console-spaces"(){return require("./rules/conventions/no-console-spaces").noConsoleSpaces},get"no-deprecated-api"(){return require("./rules/deprecation/no-deprecated-api").noDeprecatedApi},get"prefer-dependency-version-strategy"(){return require("./rules/conventions/prefer-dependency-version-strategy").preferDependencyVersionStrategy},get"filename-case"(){return require("./rules/conventions/filename-case").filenameCase},get"consistent-existence-index-check"(){return require("./rules/conventions/consistent-existence-index-check").consistentExistenceIndexCheck},get"no-json-schema-tags"(){return require("./rules/conventions/no-json-schema-tags").noJsonSchemaTags},get"require-data-testid"(){return require("./rules/conventions/require-data-testid").requireDataTestId},get"utm-taxonomy"(){return require("./rules/conventions/utm-taxonomy").utmTaxonomy},get"no-raw-cross-property-href"(){return require("./rules/conventions/no-raw-cross-property-href").noRawCrossPropertyHref},get"analytics-event-naming"(){return require("./rules/conventions/analytics-event-naming").analyticsEventNaming},get"no-magic-numbers"(){return require("./rules/conventions/no-magic-numbers").noMagicNumbers}};(0,eslint_devkit_1.withCanonicalDocsUrls)("plugin-conventions",exports.rules);exports.plugin={meta:{name:"eslint-plugin-conventions",version:"5.3.2"},rules:exports.rules};exports.configs={recommended:{plugins:{conventions:exports.plugin},rules:{"conventions/no-commented-code":"warn","conventions/expiring-todo-comments":"warn","conventions/no-deprecated-api":"warn","conventions/utm-taxonomy":"error","conventions/no-raw-cross-property-href":"error","conventions/analytics-event-naming":"error"}}};exports.default=exports.plugin;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.configs=exports.plugin=exports.rules=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");exports.rules={get"no-commented-code"(){return require("./rules/conventions/no-commented-code").noCommentedCode},get"expiring-todo-comments"(){return require("./rules/conventions/expiring-todo-comments").expiringTodoComments},get"prefer-code-point"(){return require("./rules/conventions/prefer-code-point").preferCodePoint},get"prefer-dom-node-text-content"(){return require("./rules/conventions/prefer-dom-node-text-content").preferDomNodeTextContent},get"no-console-spaces"(){return require("./rules/conventions/no-console-spaces").noConsoleSpaces},get"no-deprecated-api"(){return require("./rules/deprecation/no-deprecated-api").noDeprecatedApi},get"prefer-dependency-version-strategy"(){return require("./rules/conventions/prefer-dependency-version-strategy").preferDependencyVersionStrategy},get"filename-case"(){return require("./rules/conventions/filename-case").filenameCase},get"consistent-existence-index-check"(){return require("./rules/conventions/consistent-existence-index-check").consistentExistenceIndexCheck},get"no-json-schema-tags"(){return require("./rules/conventions/no-json-schema-tags").noJsonSchemaTags},get"require-data-testid"(){return require("./rules/conventions/require-data-testid").requireDataTestId},get"utm-taxonomy"(){return require("./rules/conventions/utm-taxonomy").utmTaxonomy},get"no-raw-cross-property-href"(){return require("./rules/conventions/no-raw-cross-property-href").noRawCrossPropertyHref},get"analytics-event-naming"(){return require("./rules/conventions/analytics-event-naming").analyticsEventNaming},get"no-magic-numbers"(){return require("./rules/conventions/no-magic-numbers").noMagicNumbers}};(0,eslint_devkit_1.withCanonicalDocsUrls)("plugin-conventions",exports.rules);exports.plugin={meta:{name:"eslint-plugin-conventions",version:"5.3.4"},rules:exports.rules};exports.configs={recommended:{plugins:{conventions:exports.plugin},rules:{"conventions/no-commented-code":"warn","conventions/expiring-todo-comments":"warn","conventions/no-deprecated-api":"warn","conventions/utm-taxonomy":"error","conventions/no-raw-cross-property-href":"error","conventions/analytics-event-naming":"error"}}};exports.default=exports.plugin;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noConsoleSpaces=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");exports.noConsoleSpaces=(0,eslint_devkit_1.createRule)({name:"no-console-spaces",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-conventions/docs/rules/no-console-spaces.md",description:"Prevent leading/trailing space between console.log parameters"},fixable:"code",messages:{noConsoleSpaces:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.WARNING,issueName:"Console Spaces",description:"Remove leading/trailing spaces in console method parameters",severity:"MEDIUM",fix:"Remove spaces from console method arguments",documentationLink:"https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-console-spaces.md"})},schema:[]},defaultOptions:[],create(context){const consoleMethods=new Set(["log","debug","info","warn","error","table","trace","group","groupCollapsed"]);function isInAllowedContext(){return false}function isConsoleMethodCall(node){if(node.callee.type==="MemberExpression"&&node.callee.object.type==="Identifier"&&node.callee.object.name==="console"&&(0,eslint_devkit_1.namesOneOf)((0,eslint_devkit_1.propertyName)(node.callee),consoleMethods)){return true}return false}function getConsoleMethodName(node){return(0,eslint_devkit_1.propertyName)(node.callee)}function hasLeadingOrTrailingSpaces(text){const trimmed=text.trim();return trimmed.length>0&&/^\s|\s$/.test(text)}function hasLeadingOrTrailingSpacesInTemplate(text){return/^\s|\s$/.test(text)}return{CallExpression(node){if(isConsoleMethodCall(node)&&!isInAllowedContext()){for(const arg of node.arguments){const staticText=arg.type==="TemplateLiteral"?null:(0,eslint_devkit_1.staticString)(arg);if(staticText!==null){if(hasLeadingOrTrailingSpaces(staticText)){context.report({node:arg,messageId:"noConsoleSpaces",data:{method:getConsoleMethodName(node),arg:staticText},fix(fixer){const trimmed=staticText.trim();return fixer.replaceText(arg,`'${trimmed}'`)}})}}else if(arg.type==="TemplateLiteral"){let hasSpacesInTemplate=false;for(const quasi of arg.quasis){if(hasLeadingOrTrailingSpacesInTemplate(quasi.value.raw)){hasSpacesInTemplate=true;break}}if(hasSpacesInTemplate){context.report({node:arg,messageId:"noConsoleSpaces",data:{method:getConsoleMethodName(node),arg:"template literal with spaces"},fix:null})}}}}}}}});
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noConsoleSpaces=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");exports.noConsoleSpaces=(0,eslint_devkit_1.createRule)({name:"no-console-spaces",meta:{type:"problem",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-conventions/docs/rules/no-console-spaces.md",description:"Prevent leading/trailing space between console.log parameters"},fixable:"code",messages:{noConsoleSpaces:(0,eslint_devkit_2.formatLLMMessage)({icon:eslint_devkit_2.MessageIcons.WARNING,issueName:"Console Spaces",description:"Remove leading/trailing spaces in console method parameters",severity:"MEDIUM",fix:"Remove spaces from console method arguments",documentationLink:"https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-console-spaces.md"})},schema:[]},defaultOptions:[],create(context){const consoleMethods=new Set(["log","debug","info","warn","error","table","trace","group","groupCollapsed"]);function isInAllowedContext(){return false}function isConsoleMethodCall(node){if(node.callee.type==="MemberExpression"&&node.callee.object.type==="Identifier"&&node.callee.object.name==="console"&&(0,eslint_devkit_1.namesOneOf)((0,eslint_devkit_1.propertyName)(node.callee),consoleMethods)){return true}return false}function getConsoleMethodName(node){return(0,eslint_devkit_1.propertyName)(node.callee)}function hasLeadingOrTrailingSpaces(text){const trimmed=text.trim();return trimmed.length>0&&/^\s|\s$/.test(text)}function templateHasLeadingOrTrailingSpaces(node){const first=node.quasis[0].value.raw;const last=node.quasis[node.quasis.length-1].value.raw;return/^\s/.test(first)||/\s$/.test(last)}return{CallExpression(node){if(isConsoleMethodCall(node)&&!isInAllowedContext()){for(const arg of node.arguments){const staticText=arg.type==="TemplateLiteral"?null:(0,eslint_devkit_1.staticString)(arg);if(staticText!==null){if(hasLeadingOrTrailingSpaces(staticText)){context.report({node:arg,messageId:"noConsoleSpaces",data:{method:getConsoleMethodName(node),arg:staticText},fix(fixer){const trimmed=staticText.trim();return fixer.replaceText(arg,`'${trimmed}'`)}})}}else if(arg.type==="TemplateLiteral"){if(templateHasLeadingOrTrailingSpaces(arg)){context.report({node:arg,messageId:"noConsoleSpaces",data:{method:getConsoleMethodName(node),arg:"template literal with spaces"},fix:null})}}}}}}}});
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.preferDependencyVersionStrategy=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");exports.preferDependencyVersionStrategy=(0,eslint_devkit_2.createRule)({name:"prefer-dependency-version-strategy",meta:{type:"suggestion",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-conventions/docs/rules/prefer-dependency-version-strategy.md",description:"Enforce consistent version strategy (caret, tilde, exact, etc.) for package.json dependencies"},fixable:"code",messages:{preferStrategy:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.PACKAGE,issueName:"Dependency Version Strategy",description:'Dependency "{{name}}" should use {{strategy}} version',severity:"MEDIUM",fix:'Change "{{current}}" to "{{expected}}" for version flexibility',documentationLink:"https://docs.npmjs.com/cli/v10/configuring-npm/package-json#dependencies"}),invalidStrategy:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.WARNING,issueName:"Invalid Version Strategy",description:'Strategy "{{strategy}}" is not valid',severity:"MEDIUM",fix:"Use one of: caret (^), tilde (~), exact (no prefix), range (<, >, ||), or any",documentationLink:"https://docs.npmjs.com/cli/v10/configuring-npm/package-json#dependencies"})},schema:[{type:"object",properties:{strategy:{type:"string",enum:["caret","tilde","exact","range","any"],description:"Version strategy to enforce: caret (^), tilde (~), exact (no prefix), range (allows <, >, ||), or any (allows all)"},allowWorkspace:{type:"boolean",description:"Allow workspace: protocol versions",default:true},allowFile:{type:"boolean",description:"Allow file: protocol versions",default:true},allowLink:{type:"boolean",description:"Allow link: protocol versions",default:true},overrides:{type:"object",additionalProperties:{type:"string",enum:["caret","tilde","exact","range","any"]},description:'Package-specific strategy overrides. Key is package name, value is strategy. Example: { "react": "exact", "lodash": "tilde" }'}},additionalProperties:false}]},defaultOptions:[{strategy:"caret",allowWorkspace:true,allowFile:true,allowLink:true,overrides:{}}],create(context){const options=context.options[0]||{};const{strategy="caret",allowWorkspace=true,allowFile=true,allowLink=true,overrides={}}=options;const validStrategies=["caret","tilde","exact","range","any"];if(!validStrategies.includes(strategy)){context.report({loc:{line:1,column:0},messageId:"invalidStrategy",data:{strategy}});return{}}if(strategy==="any"){return{}}function checkVersion(node,depName,version){if(allowWorkspace&&version.startsWith("workspace:"))return;if(allowFile&&version.startsWith("file:"))return;if(allowLink&&version.startsWith("link:"))return;if(!version.match(/^[\^~<>=]?\d+\.\d+\.\d+/))return;const packageStrategy=overrides[depName]||strategy;if(packageStrategy==="any")return;let expectedVersion=version;let needsFix=false;const baseVersion=version.replace(/^[\^~<>=]+/,"");switch(packageStrategy){case"caret":if(!version.startsWith("^")){expectedVersion=`^${baseVersion}`;needsFix=true}break;case"tilde":if(!version.startsWith("~")){expectedVersion=`~${baseVersion}`;needsFix=true}break;case"exact":{if(version!==baseVersion){expectedVersion=baseVersion;needsFix=true}break}case"range":if(!version.includes("||")&&!version.includes(">=")&&!version.includes("<=")&&!version.includes(">")&&!version.includes("<")&&!version.includes(" - ")){expectedVersion=`^${baseVersion}`;needsFix=true}break}if(needsFix){context.report({node:node.value,messageId:"preferStrategy",data:{name:depName,strategy:packageStrategy,current:version,expected:expectedVersion},fix(fixer){return fixer.replaceText(node.value,JSON.stringify(expectedVersion))}})}}const checkObjectExpression=node=>{for(const prop of node.properties){if(prop.type==="Property"&&prop.key&&prop.value&&prop.value.type==="Literal"){const depName=prop.key.type==="Identifier"?prop.key.name:prop.key.type==="Literal"?String(prop.key.value):null;if(depName&&typeof prop.value.value==="string"){checkVersion(prop,depName,prop.value.value)}}}};return{'Property[key.value="dependencies"], Property[key.value="devDependencies"], Property[key.value="peerDependencies"]'(node){if(node.value.type!=="ObjectExpression")return;checkObjectExpression(node.value)},ObjectExpression(node){const hasVersionLikeValues=node.properties.some(prop=>{if(prop.type==="Property"&&prop.value.type==="Literal"){const value=String(prop.value.value);return/^[\^~]?\d+\.\d+\.\d+/.test(value)||value.startsWith("workspace:")}return false});if(hasVersionLikeValues){checkObjectExpression(node)}}}}});
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.preferDependencyVersionStrategy=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const eslint_devkit_2=require("@interlace/eslint-devkit");const VERSION_SPECIFIER=/^(?:[\^~<>=]*\s*\d|[*x]$|latest$|next$|(?:workspace|file|link|npm|git\+[a-z]+|github|https?):)/i;exports.preferDependencyVersionStrategy=(0,eslint_devkit_2.createRule)({name:"prefer-dependency-version-strategy",meta:{type:"suggestion",docs:{url:"https://github.com/ofri-peretz/eslint/blob/main/packages/eslint-plugin-conventions/docs/rules/prefer-dependency-version-strategy.md",description:"Enforce consistent version strategy (caret, tilde, exact, etc.) for package.json dependencies"},fixable:"code",messages:{preferStrategy:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.PACKAGE,issueName:"Dependency Version Strategy",description:'Dependency "{{name}}" should use {{strategy}} version',severity:"MEDIUM",fix:'Change "{{current}}" to "{{expected}}" for version flexibility',documentationLink:"https://docs.npmjs.com/cli/v10/configuring-npm/package-json#dependencies"}),invalidStrategy:(0,eslint_devkit_1.formatLLMMessage)({icon:eslint_devkit_1.MessageIcons.WARNING,issueName:"Invalid Version Strategy",description:'Strategy "{{strategy}}" is not valid',severity:"MEDIUM",fix:"Use one of: caret (^), tilde (~), exact (no prefix), range (<, >, ||), or any",documentationLink:"https://docs.npmjs.com/cli/v10/configuring-npm/package-json#dependencies"})},schema:[{type:"object",properties:{strategy:{type:"string",enum:["caret","tilde","exact","range","any"],description:"Version strategy to enforce: caret (^), tilde (~), exact (no prefix), range (allows <, >, ||), or any (allows all)"},allowWorkspace:{type:"boolean",description:"Allow workspace: protocol versions",default:true},allowFile:{type:"boolean",description:"Allow file: protocol versions",default:true},allowLink:{type:"boolean",description:"Allow link: protocol versions",default:true},overrides:{type:"object",additionalProperties:{type:"string",enum:["caret","tilde","exact","range","any"]},description:'Package-specific strategy overrides. Key is package name, value is strategy. Example: { "react": "exact", "lodash": "tilde" }'}},additionalProperties:false}]},defaultOptions:[{strategy:"caret",allowWorkspace:true,allowFile:true,allowLink:true,overrides:{}}],create(context){const options=context.options[0]||{};const{strategy="caret",allowWorkspace=true,allowFile=true,allowLink=true,overrides={}}=options;const validStrategies=["caret","tilde","exact","range","any"];if(!validStrategies.includes(strategy)){context.report({loc:{line:1,column:0},messageId:"invalidStrategy",data:{strategy}});return{}}if(strategy==="any"){return{}}function checkVersion(node,depName,version){if(allowWorkspace&&version.startsWith("workspace:"))return;if(allowFile&&version.startsWith("file:"))return;if(allowLink&&version.startsWith("link:"))return;if(!version.match(/^[\^~<>=]?\d+\.\d+\.\d+/))return;const packageStrategy=overrides[depName]||strategy;if(packageStrategy==="any")return;let expectedVersion=version;let needsFix=false;const baseVersion=version.replace(/^[\^~<>=]+/,"");switch(packageStrategy){case"caret":if(!version.startsWith("^")){expectedVersion=`^${baseVersion}`;needsFix=true}break;case"tilde":if(!version.startsWith("~")){expectedVersion=`~${baseVersion}`;needsFix=true}break;case"exact":{if(version!==baseVersion){expectedVersion=baseVersion;needsFix=true}break}case"range":if(!version.includes("||")&&!version.includes(">=")&&!version.includes("<=")&&!version.includes(">")&&!version.includes("<")&&!version.includes(" - ")){expectedVersion=`^${baseVersion}`;needsFix=true}break}if(needsFix){context.report({node:node.value,messageId:"preferStrategy",data:{name:depName,strategy:packageStrategy,current:version,expected:expectedVersion},fix(fixer){return fixer.replaceText(node.value,JSON.stringify(expectedVersion))}})}}const checkObjectExpression=node=>{for(const prop of node.properties){if(prop.type==="Property"&&prop.key&&prop.value&&prop.value.type==="Literal"){const depName=prop.key.type==="Identifier"?prop.key.name:prop.key.type==="Literal"?String(prop.key.value):null;if(depName&&typeof prop.value.value==="string"){checkVersion(prop,depName,prop.value.value)}}}};return{'Property[key.value="dependencies"], Property[key.value="devDependencies"], Property[key.value="peerDependencies"]'(node){if(node.value.type!=="ObjectExpression")return;checkObjectExpression(node.value)},ObjectExpression(node){let sawSpecifier=false;for(const prop of node.properties){if(prop.type!=="Property")continue;if(prop.value.type!=="Literal"||typeof prop.value.value!=="string"||!VERSION_SPECIFIER.test(prop.value.value)){return}sawSpecifier=true}if(sawSpecifier){checkObjectExpression(node)}}}}});