diff --git a/.prettierrc.yml b/.prettierrc.yml index 5094c31..49faf19 120000 --- a/.prettierrc.yml +++ b/.prettierrc.yml @@ -1 +1 @@ -./src/{% if odoo_version > 12 %}.prettierrc.yml{% endif %} \ No newline at end of file +src/{% if 12 < odoo_version < 18 %}.prettierrc.yml{% endif %} \ No newline at end of file diff --git a/copier.yml b/copier.yml index f69b265..0fa2fd7 100644 --- a/copier.yml +++ b/copier.yml @@ -5,6 +5,7 @@ _min_copier_version: "9" _tasks: - rm -f {% if ci != "Travis" %}.travis.yml{% endif %} .t2d.yml + - rm -f .prettierrc.yml .eslintrc.yml _migrations: - version: v1.3.6 diff --git a/src/.pre-commit-config.yaml.jinja b/src/.pre-commit-config.yaml.jinja index 0ec619c..603aced 100644 --- a/src/.pre-commit-config.yaml.jinja +++ b/src/.pre-commit-config.yaml.jinja @@ -5,7 +5,7 @@ {%- if odoo_version < 15 %} {%- set repo_rev.autoflake = "v1.4" %} {%- set repo_rev.black = "22.3.0" %} - {%- set repo_rev.eslint = "v7.8.1" %} + {%- set repo_rev.eslint = "7.8.1" %} {%- set repo_rev.flake8 = "3.8.3" %} {%- set repo_rev.flake8_bugbear = "20.1.4" %} {%- set repo_rev.isort = "5.12.0" %} @@ -23,7 +23,7 @@ {%- elif odoo_version < 16 %} {%- set repo_rev.autoflake = "v1.4" %} {%- set repo_rev.black = "22.3.0" %} - {%- set repo_rev.eslint = "v7.32.0" %} + {%- set repo_rev.eslint = "7.32.0" %} {%- set repo_rev.flake8 = "3.9.2" %} {%- set repo_rev.flake8_bugbear = "21.9.2" %} {%- set repo_rev.isort = "5.12.0" %} @@ -41,7 +41,7 @@ {%- elif odoo_version < 18 %} {%- set repo_rev.autoflake = "v1.6.1" %} {%- set repo_rev.black = "22.8.0" %} - {%- set repo_rev.eslint = "v8.24.0" %} + {%- set repo_rev.eslint = "8.24.0" %} {%- set repo_rev.flake8 = "3.9.2" %} {%- set repo_rev.flake8_bugbear = "21.9.2" %} {%- set repo_rev.isort = "5.12.0" %} @@ -58,16 +58,17 @@ {%- else %} {%- set repo_rev.autoflake = "v1.6.1" %} {%- set repo_rev.black = "22.8.0" %} - {%- set repo_rev.eslint = "v8.24.0" %} + {%- set repo_rev.eslint = "9.12.0" %} + {%- set repo_rev.eslint_jsdoc = "50.3.1" %} {%- set repo_rev.flake8 = "3.9.2" %} {%- set repo_rev.flake8_bugbear = "21.9.2" %} {%- set repo_rev.isort = "5.12.0" %} {%- set repo_rev.maintainer_tools = "bf9ecb9938b6a5deca0ff3d870fbd3f33341fded" %} - {%- set repo_rev.nodejs = "16.17.0" %} + {%- set repo_rev.nodejs = "22.9.0" %} {%- set repo_rev.odoo_pre_commit_hooks = "v0.0.33" %} {%- set repo_rev.pre_commit_hooks = "v4.6.0" %} - {%- set repo_rev.prettier = "2.7.1" %} - {%- set repo_rev.prettier_xml = "2.2.0" %} + {%- set repo_rev.prettier = "3.3.3" %} + {%- set repo_rev.prettier_xml = "3.4.1" %} {%- set repo_rev.pylint_odoo = "v9.1.2" %} {%- set repo_rev.pyupgrade = "v2.38.2" %} {%- set repo_rev.ruff = "v0.6.8" %} @@ -94,7 +95,7 @@ exclude: | # Files and folders generated by bots, to avoid loops ^setup/|/static/description/index\.html$| # We don't want to mess with tool-generated files - .svg$|/tests/([^/]+/)?cassettes/|^.copier-answers.yml$|^.github/| + .svg$|/tests/([^/]+/)?cassettes/|^.copier-answers.yml$|^.github/|^eslint.config.cjs|^prettier.config.cjs| # Maybe reactivate this when all README files include prettier ignore tags? ^README\.md$| # Library files can have extraneous formatting (even minimized) @@ -178,25 +179,35 @@ repos: hooks: - id: black {%- endif %} - - repo: https://github.com/pre-commit/mirrors-prettier - rev: v{{ repo_rev.prettier }} + - repo: local hooks: - id: prettier name: prettier (with plugin-xml) + entry: prettier + args: + - --write + - --list-different + - --ignore-unknown + types: [text] + files: \.(css|htm|html|js|json|jsx|less|md|scss|toml|ts|xml|yaml|yml)$ + language: node additional_dependencies: - "prettier@{{ repo_rev.prettier }}" - "@prettier/plugin-xml@{{ repo_rev.prettier_xml }}" - args: - - --plugin=@prettier/plugin-xml - files: \.(css|htm|html|js|json|jsx|less|md|scss|toml|ts|xml|yaml|yml)$ - - repo: https://github.com/pre-commit/mirrors-eslint - rev: {{ repo_rev.eslint }} + - repo: local hooks: - id: eslint - verbose: true + name: eslint + entry: eslint args: - --color - --fix + verbose: true + types: [javascript] + language: node + additional_dependencies: + - "eslint@{{ repo_rev.eslint }}" + - "eslint-plugin-jsdoc@{{ repo_rev.eslint_jsdoc }}" - repo: https://github.com/pre-commit/pre-commit-hooks rev: {{ repo_rev.pre_commit_hooks }} hooks: diff --git a/src/{% if odoo_version > 12 %}.eslintrc.yml{% endif %}.jinja b/src/{% if 12 < odoo_version < 18 %}.eslintrc.yml{% endif %}.jinja similarity index 100% rename from src/{% if odoo_version > 12 %}.eslintrc.yml{% endif %}.jinja rename to src/{% if 12 < odoo_version < 18 %}.eslintrc.yml{% endif %}.jinja diff --git a/src/{% if odoo_version > 12 %}.prettierrc.yml{% endif %} b/src/{% if 12 < odoo_version < 18 %}.prettierrc.yml{% endif %} similarity index 100% rename from src/{% if odoo_version > 12 %}.prettierrc.yml{% endif %} rename to src/{% if 12 < odoo_version < 18 %}.prettierrc.yml{% endif %} diff --git a/src/{% if odoo_version >= 18 %}eslint.config.cjs{% endif %} b/src/{% if odoo_version >= 18 %}eslint.config.cjs{% endif %} new file mode 100644 index 0000000..0d5731f --- /dev/null +++ b/src/{% if odoo_version >= 18 %}eslint.config.cjs{% endif %} @@ -0,0 +1,202 @@ +jsdoc = require("eslint-plugin-jsdoc"); + +const config = [{ + plugins: { + jsdoc, + }, + + languageOptions: { + globals: { + _: "readonly", + $: "readonly", + fuzzy: "readonly", + jQuery: "readonly", + moment: "readonly", + odoo: "readonly", + openerp: "readonly", + owl: "readonly", + luxon: "readonly", + }, + + ecmaVersion: 2024, + sourceType: "script", + }, + + rules: { + "accessor-pairs": "warn", + "array-callback-return": "warn", + "callback-return": "warn", + "capitalized-comments": ["warn", "always", { + ignoreConsecutiveComments: true, + ignoreInlineComments: true, + }], + complexity: ["warn", 15], + "constructor-super": "warn", + "dot-notation": "warn", + eqeqeq: "warn", + "global-require": "warn", + "handle-callback-err": "warn", + "id-blacklist": "warn", + "id-match": "warn", + "init-declarations": "error", + "max-depth": "warn", + "max-nested-callbacks": "warn", + "max-statements-per-line": "warn", + "no-alert": "warn", + "no-array-constructor": "warn", + "no-caller": "warn", + "no-case-declarations": "warn", + "no-class-assign": "warn", + "no-cond-assign": "error", + "no-const-assign": "error", + "no-constant-condition": "warn", + "no-control-regex": "warn", + "no-debugger": "error", + "no-delete-var": "warn", + "no-div-regex": "warn", + "no-dupe-args": "error", + "no-dupe-class-members": "error", + "no-dupe-keys": "error", + "no-duplicate-case": "error", + "no-duplicate-imports": "error", + "no-else-return": "warn", + "no-empty-character-class": "warn", + "no-empty-function": "error", + "no-empty-pattern": "error", + "no-empty": "warn", + "no-eq-null": "error", + "no-eval": "error", + "no-ex-assign": "error", + "no-extend-native": "warn", + "no-extra-bind": "warn", + "no-extra-boolean-cast": "warn", + "no-extra-label": "warn", + "no-fallthrough": "warn", + "no-func-assign": "error", + "no-global-assign": "error", + "no-implicit-coercion": ["warn", { + allow: ["~"], + }], + "no-implicit-globals": "warn", + "no-implied-eval": "warn", + "no-inline-comments": "warn", + "no-inner-declarations": "warn", + "no-invalid-regexp": "warn", + "no-irregular-whitespace": "warn", + "no-iterator": "warn", + "no-label-var": "warn", + "no-labels": "warn", + "no-lone-blocks": "warn", + "no-lonely-if": "error", + "no-mixed-requires": "error", + "no-multi-str": "warn", + "no-native-reassign": "error", + "no-negated-condition": "warn", + "no-negated-in-lhs": "error", + "no-new-func": "warn", + "no-new-object": "warn", + "no-new-require": "warn", + "no-new-symbol": "warn", + "no-new-wrappers": "warn", + "no-new": "warn", + "no-obj-calls": "warn", + "no-octal-escape": "warn", + "no-octal": "warn", + "no-param-reassign": "warn", + "no-path-concat": "warn", + "no-process-env": "warn", + "no-process-exit": "warn", + "no-proto": "warn", + "no-prototype-builtins": "warn", + "no-redeclare": "warn", + "no-regex-spaces": "warn", + "no-restricted-globals": "warn", + "no-restricted-imports": "warn", + "no-restricted-modules": "warn", + "no-restricted-syntax": "warn", + "no-return-assign": "error", + "no-script-url": "warn", + "no-self-assign": "warn", + "no-self-compare": "warn", + "no-sequences": "warn", + "no-shadow-restricted-names": "warn", + "no-shadow": "warn", + "no-sparse-arrays": "warn", + "no-sync": "warn", + "no-this-before-super": "warn", + "no-throw-literal": "warn", + "no-undef-init": "warn", + "no-undef": "error", + "no-unmodified-loop-condition": "warn", + "no-unneeded-ternary": "error", + "no-unreachable": "error", + "no-unsafe-finally": "error", + "no-unused-expressions": "error", + "no-unused-labels": "error", + "no-unused-vars": "error", + "no-use-before-define": "error", + "no-useless-call": "warn", + "no-useless-computed-key": "warn", + "no-useless-concat": "warn", + "no-useless-constructor": "warn", + "no-useless-escape": "warn", + "no-useless-rename": "warn", + "no-void": "warn", + "no-with": "warn", + "operator-assignment": ["error", "always"], + "prefer-const": "warn", + radix: "warn", + "require-yield": "warn", + "sort-imports": "warn", + "spaced-comment": ["error", "always"], + strict: ["error", "function"], + "use-isnan": "error", + + "jsdoc/check-tag-names": "warn", + "jsdoc/check-types": "warn", + "jsdoc/require-param-description": "off", + "jsdoc/require-return": "off", + "jsdoc/require-return-description": "off", + "jsdoc/require-return-type": "off", + + "valid-typeof": "warn", + yoda: "warn", + }, + + settings: { + jsdoc: { + tagNamePreference: { + arg: "param", + argument: "param", + augments: "extends", + constructor: "class", + exception: "throws", + func: "function", + method: "function", + prop: "property", + return: "returns", + virtual: "abstract", + yield: "yields", + }, + preferredTypes: { + array: "Array", + bool: "Boolean", + boolean: "Boolean", + number: "Number", + object: "Object", + str: "String", + string: "String", + }, + }, + }, + +}, { + files: ["**/*.esm.js"], + + languageOptions: { + ecmaVersion: 2024, + sourceType: "module", + }, +}]; + +module.exports = config diff --git a/src/{% if odoo_version >= 18 %}prettier.config.cjs{% endif %} b/src/{% if odoo_version >= 18 %}prettier.config.cjs{% endif %} new file mode 100644 index 0000000..e66cd82 --- /dev/null +++ b/src/{% if odoo_version >= 18 %}prettier.config.cjs{% endif %} @@ -0,0 +1,14 @@ +/** @type {import('prettier').Config} */ + +const config = { + // https://github.com/prettier/prettier/issues/15388#issuecomment-1717746872 + plugins: [require.resolve("@prettier/plugin-xml")], + bracketSpacing: false, + printWidth: 88, + proseWrap: "always", + semi: true, + trailingComma: "es5", + xmlWhitespaceSensitivity: "preserve", +}; + +module.exports = config;