diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000..c4461eed9 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,9 @@ +node_modules +dist +bin +docs +libraries +spec +spec-es6 +coverage +play diff --git a/.eslintrc.js b/.eslintrc.js index c554a263c..86b84a4cf 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,16 +1,215 @@ module.exports = { - "env": { - "browser": true, - "commonjs": true, - "es2021": true, - "node": true + env: { + browser: true, + commonjs: true, + es2021: true, + node: true, }, - "extends": "eslint:recommended", - "overrides": [ + plugins: ['prettier'], + + extends: ['eslint:recommended', 'airbnb-base', 'plugin:jsonc/recommended-with-jsonc', 'prettier'], + overrides: [ + { + files: ['*.json', '*.json5', '*.jsonc'], + parser: 'jsonc-eslint-parser', + }, + { + files: ['package.json'], + parser: 'jsonc-eslint-parser', + rules: { + 'jsonc/sort-keys': [ + 'error', + { + pathPattern: '^$', + order: [ + 'name', + 'version', + 'private', + 'packageManager', + 'description', + 'type', + 'keywords', + 'homepage', + 'bugs', + 'license', + 'author', + 'contributors', + 'funding', + 'files', + 'main', + 'module', + 'exports', + 'unpkg', + 'jsdelivr', + 'browser', + 'bin', + 'man', + 'directories', + 'repository', + 'publishConfig', + 'scripts', + 'peerDependencies', + 'peerDependenciesMeta', + 'optionalDependencies', + 'dependencies', + 'devDependencies', + 'engines', + 'config', + 'overrides', + 'pnpm', + 'husky', + 'lint-staged', + 'eslintConfig', + ], + }, + { + pathPattern: '^(?:dev|peer|optional|bundled)?[Dd]ependencies$', + order: { type: 'asc' }, + }, + ], + }, + }, ], - "parserOptions": { - "ecmaVersion": "latest" + globals: { + $: true, + jQuery: true, + glob: true, + log: true, + EditorWatchdog: true, + baseApiUrl: true, + // \src\share\canvas_share.js + React: true, + appState: true, + ExcalidrawLib: true, + elements: true, + files: true, + ReactDOM: true, + // src\public\app\widgets\type_widgets\relation_map.js + jsPlumb: true, + panzoom: true, + logError: true, + // src\public\app\widgets\type_widgets\image.js + WZoom: true, + // \src\public\app\widgets\type_widgets\read_only_text.js + renderMathInElement: true, + // \src\public\app\widgets\type_widgets\editable_text.js + BalloonEditor: true, + CKEditorInspector: true, + // \src\public\app\widgets\type_widgets\editable_code.js + CodeMirror: true, + // \src\public\app\services\resizer.js + Split: true, + // \src\public\app\services\note_content_renderer.js + mermaid: true, + // src\public\app\services\frontend_script_api.js + dayjs: true, + // \src\public\app\widgets\dialogs\markdown_import.js + commonmark: true, + // \src\public\app\widgets\note_map.js + ForceGraph: true, + // \src\public\app\setup.js + ko: true, + syncInProgress: true, + // src\public\app\services\utils.js + logInfo: true, + __non_webpack_require__: true, + // }, - "rules": { - } -} + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + rules: { + // hi adam, those rules are //temporary off, you can turn them on one by one to check if we really need it. (to be deleted) + + // eslint:recommended + 'no-unused-vars': 'off', + 'linebreak-style': 'off', + 'no-useless-escape': 'off', + 'no-empty': 'off', + 'no-constant-condition': 'off', + 'getter-return': 'off', + 'no-cond-assign': 'off', + 'no-async-promise-executor': 'off', + 'no-extra-semi': 'off', + 'no-inner-declarations': 'off', + + // prettier + 'prettier/prettier': ['error', { endOfLine: 'auto' }], + + // airbnb-base + 'no-console': 'off', + 'no-plusplus': 'off', + 'no-param-reassign': 'off', + 'global-require': 'off', + 'no-use-before-define': 'off', + 'no-await-in-loop': 'off', + radix: 'off', + 'import/order': 'off', + 'import/no-extraneous-dependencies': 'off', + 'prefer-destructuring': 'off', + 'no-shadow': 'off', + 'no-new': 'off', + 'no-restricted-syntax': 'off', + strict: 'off', + 'class-methods-use-this': 'off', + 'no-else-return': 'off', + 'import/no-dynamic-require': 'off', + 'no-underscore-dangle': 'off', + 'prefer-template': 'off', + 'consistent-return': 'off', + 'no-continue': 'off', + 'object-shorthand': 'off', + 'one-var': 'off', + 'prefer-const': 'off', + 'spaced-comment': 'off', + 'no-loop-func': 'off', + 'arrow-body-style': 'off', + + 'guard-for-in': 'off', + 'no-return-assign': 'off', + 'dot-notation': 'off', + + 'func-names': 'off', + 'import/no-useless-path-segments': 'off', + 'default-param-last': 'off', + 'prefer-arrow-callback': 'off', + 'no-unneeded-ternary': 'off', + 'no-return-await': 'off', + 'import/extensions': 'off', + + 'no-var': 'off', + 'import/newline-after-import': 'off', + 'no-restricted-globals': 'off', + 'operator-assignment': 'off', + 'no-eval': 'off', + 'max-classes-per-file': 'off', + 'vars-on-top': 'off', + 'no-bitwise': 'off', + 'no-lonely-if': 'off', + 'no-multi-assign': 'off', + 'no-promise-executor-return': 'off', + 'no-empty-function': 'off', + 'import/no-unresolved': 'off', + camelcase: 'off', + eqeqeq: 'off', + 'lines-between-class-members': 'off', + 'import/no-cycle': 'off', + 'new-cap': 'off', + 'prefer-object-spread': 'off', + 'no-new-func': 'off', + 'no-unused-expressions': 'off', + 'lines-around-directive': 'off', + 'prefer-exponentiation-operator': 'off', + 'no-restricted-properties': 'off', + 'prefer-rest-params': 'off', + 'no-unreachable-loop': 'off', + 'no-alert': 'off', + 'no-useless-return': 'off', + 'no-nested-ternary': 'off', + 'prefer-regex-literals': 'off', + 'import/no-named-as-default-member': 'off', + yoda: 'off', + 'no-script-url': 'off', + }, +}; diff --git a/.gitignore b/.gitignore index 01eac268c..6c7f73ae1 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ server-package.json .idea/httpRequests/ data/ tmp/ +.eslintcache \ No newline at end of file diff --git a/.husky/.gitignore b/.husky/.gitignore new file mode 100644 index 000000000..31354ec13 --- /dev/null +++ b/.husky/.gitignore @@ -0,0 +1 @@ +_ diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 000000000..e2f476b94 --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,11 @@ +//https://prettier.io/docs/en/options.html +module.exports = { + semi: true, + trailingComma: 'es5', + singleQuote: true, + printWidth: 120, + tabWidth: 4, + // useTabs: false, + // bracketSpacing: true, + // htmlWhitespaceSensitivity: 'ignore', +}; diff --git a/package.json b/package.json index 114689b85..3a1cbc79e 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,9 @@ "test-jasmine": "jasmine", "test-es6": "node -r esm spec-es6/attribute_parser.spec.js ", "test": "npm run test-jasmine && npm run test-es6", - "postinstall": "rimraf ./node_modules/canvas" + "postinstall": "rimraf ./node_modules/canvas", + "lint": "eslint . --cache", + "prepare": "husky install" }, "dependencies": { "@braintree/sanitize-url": "6.0.2", @@ -100,15 +102,27 @@ "electron-packager": "17.1.1", "electron-rebuild": "3.2.9", "eslint": "^8.38.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-jsonc": "^2.7.0", + "eslint-plugin-prettier": "^4.2.1", "esm": "3.2.25", + "husky": "^8.0.3", "jasmine": "4.5.0", "jsdoc": "4.0.1", + "jsonc-eslint-parser": "^2.2.0", + "lint-staged": "^13.2.1", "lorem-ipsum": "2.0.8", + "prettier": "2.8.7", "rcedit": "3.0.1", "webpack": "5.75.0", "webpack-cli": "5.0.1" }, "optionalDependencies": { "electron-installer-debian": "3.1.0" + }, + "lint-staged": { + "*.js": "eslint --cache --fix" } }