From 09238161ac353aec38ab4fb048b696fef5a4b847 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 24 Jan 2024 14:08:17 +0100 Subject: [PATCH] name rule --- ...enforce-element-suffix-on-element-name.cjs | 41 +++++++++++++++++++ .../eslint-local-rules.cjs | 5 ++- 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 src/Umbraco.Web.UI.Client/devops/eslint/rules/enforce-element-suffix-on-element-name.cjs diff --git a/src/Umbraco.Web.UI.Client/devops/eslint/rules/enforce-element-suffix-on-element-name.cjs b/src/Umbraco.Web.UI.Client/devops/eslint/rules/enforce-element-suffix-on-element-name.cjs new file mode 100644 index 0000000000..267e0a2fdd --- /dev/null +++ b/src/Umbraco.Web.UI.Client/devops/eslint/rules/enforce-element-suffix-on-element-name.cjs @@ -0,0 +1,41 @@ +/** @type {import('eslint').Rule.RuleModule} */ +module.exports = { + meta: { + type: 'suggestion', + docs: { + description: 'Enforce Custom Element names to start with "umb-".', + category: 'Naming', + recommended: true, + }, + schema: [], + }, + create: function (context) { + return { + CallExpression(node) { + // check if the expression is @customElement decorator + const isCustomElementDecorator = + node.callee.type === 'Identifier' && + node.callee.name === 'customElement' && + node.arguments.length === 1 && + node.arguments[0].type === 'Literal' && + typeof node.arguments[0].value === 'string'; + + if (isCustomElementDecorator) { + const elementName = node.arguments[0].value; + + // check if the element name starts with 'umb-' + const isElementNameValid = elementName.startsWith('umb-'); + + if (!isElementNameValid) { + context.report({ + node, + message: 'Custom Element name should start with "umb-".', + // There is no fixer on purpose because it's not safe to automatically rename the element name. + // Renaming should be done manually with consideration of potential impacts. + }); + } + } + }, + }; + }, +}; diff --git a/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs b/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs index 1f7e56aea0..c5257765a9 100644 --- a/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs +++ b/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs @@ -2,8 +2,10 @@ const badTypeImportRule = require('./devops/eslint/rules/bad-type-import.cjs'); const enforceElementSuffixOnElementClassNameRule = require('./devops/eslint/rules/enforce-element-suffix-on-element-class-name.cjs'); +const enforceElementSuffixOnElementNameRule = require('./devops/eslint/rules/enforce-element-suffix-on-element-name.cjs'); const enforceUmbracoExternalImportsRule = require('./devops/eslint/rules/enforce-umbraco-external-imports.cjs'); const ensureRelativeImportUseJsExtensionRule = require('./devops/eslint/rules/ensure-relative-import-use-js-extension.cjs'); +const exportedStringConstantNaming = require('./devops/eslint/rules/exported-string-constant-naming.cjs'); const noDirectApiImportRule = require('./devops/eslint/rules/no-direct-api-import.cjs'); const preferImportAliasesRule = require('./devops/eslint/rules/prefer-import-aliases.cjs'); const preferStaticStylesLastRule = require('./devops/eslint/rules/prefer-static-styles-last.cjs'); @@ -12,11 +14,12 @@ const umbClassPrefixRule = require('./devops/eslint/rules/umb-class-prefix.cjs') module.exports = { 'bad-type-import': badTypeImportRule, 'enforce-element-suffix-on-element-class-name': enforceElementSuffixOnElementClassNameRule, + 'enforce-element-suffix-on-element-name': enforceElementSuffixOnElementNameRule, 'enforce-umbraco-external-imports': enforceUmbracoExternalImportsRule, 'ensure-relative-import-use-js-extension': ensureRelativeImportUseJsExtensionRule, + 'exported-string-constant-naming': exportedStringConstantNaming, 'no-direct-api-import': noDirectApiImportRule, 'prefer-import-aliases': preferImportAliasesRule, 'prefer-static-styles-last': preferStaticStylesLastRule, 'umb-class-prefix': umbClassPrefixRule, - 'exported-string-constant-naming': require('./devops/eslint/rules/exported-string-constant-naming.cjs'), };