From 1c4a6034d18063f34f36078370661e42544d5c28 Mon Sep 17 00:00:00 2001 From: zzxming Date: Sun, 1 Sep 2024 19:12:24 +0800 Subject: [PATCH 1/3] feat: add eslint plugin to lint code --- .eslintignore | 4 +- .eslintrc.js | 116 +- jest.config.js | 2 +- package.json | 10 +- .../fluent-editor/.vitepress/theme/index.ts | 10 +- .../fluent-editor/demos/basic-usage.spec.ts | 16 +- .../docs/fluent-editor/demos/basic-usage.vue | 2 +- .../demos/code-block-highlight.vue | 8 +- .../fluent-editor/demos/custom-toolbar.vue | 8 +- packages/docs/fluent-editor/demos/emoji.vue | 10 +- .../docs/fluent-editor/demos/file-upload.vue | 8 +- .../docs/fluent-editor/demos/image-upload.vue | 8 +- .../demos/mention-custom-list.vue | 22 +- packages/docs/fluent-editor/demos/mention.vue | 18 +- packages/docs/fluent-editor/demos/table.vue | 16 +- packages/docs/package.json | 4 +- packages/docs/playwright.config.ts | 4 +- packages/fluent-editor/scripts/pre-release.js | 2 +- packages/fluent-editor/src/config.ts | 72 +- .../fluent-editor/src/config/base64-image.ts | 14 +- .../fluent-editor/src/config/editor.utils.ts | 30 +- .../fluent-editor/src/config/i18n/en-us.ts | 132 +- .../fluent-editor/src/config/i18n/zh-cn.ts | 132 +- .../additional-toolbar-item.interface.ts | 2 +- .../config/types/counter-option.interface.ts | 2 +- .../config/types/editor-modules.interface.ts | 26 +- .../config/types/file-operation.interface.ts | 2 +- .../config/types/image-upload.interface.ts | 2 +- .../config/types/paste-change.interface.ts | 2 +- .../fluent-editor/src/config/types/type.ts | 2 +- packages/fluent-editor/src/counter/index.ts | 65 +- .../fluent-editor/src/custom-clipboard.ts | 156 +- .../src/custom-image/BlotFormatter.ts | 162 +- .../fluent-editor/src/custom-image/Options.ts | 52 +- .../src/custom-image/actions/Action.ts | 4 +- .../actions/CustomResizeAction.ts | 223 +- .../src/custom-image/actions/DeleteAction.ts | 22 +- .../fluent-editor/src/custom-image/image.ts | 119 +- .../src/custom-image/specs/BlotSpec.ts | 16 +- .../src/custom-image/specs/CustomImageSpec.ts | 118 +- .../src/custom-image/specs/ImageSpec.ts | 24 +- packages/fluent-editor/src/custom-uploader.ts | 53 +- .../fluent-editor/src/emoji/emoji-list.ts | 6 +- .../src/emoji/emoji-list/index.ts | 2 +- .../src/emoji/emoji-list/people.ts | 6 +- packages/fluent-editor/src/emoji/emoji-map.ts | 10 +- .../src/emoji/formats/emoji-blot.ts | 60 +- packages/fluent-editor/src/emoji/index.ts | 8 +- .../fluent-editor/src/emoji/modules/emoji.ts | 338 +- .../src/emoji/modules/toolbar-emoji.ts | 223 +- packages/fluent-editor/src/emoji/utils.ts | 12 +- .../fluent-editor/src/file/formats/file.ts | 72 +- packages/fluent-editor/src/file/index.ts | 39 +- .../src/file/modules/file-bar.ts | 31 +- packages/fluent-editor/src/fluent-editor.ts | 71 +- .../src/global-link/constants.ts | 6 +- .../formats/customer-widget-link.ts | 33 +- .../src/global-link/formats/doc-link.ts | 64 +- .../src/global-link/formats/wiki-link.ts | 46 +- .../src/global-link/formats/work-item-link.ts | 50 +- .../src/global-link/global-link-panel.ts | 22 +- .../fluent-editor/src/global-link/index.ts | 165 +- .../src/global-link/utils/createTable.ts | 52 +- packages/fluent-editor/src/index.ts | 4 +- packages/fluent-editor/src/lineheight.ts | 6 +- .../fluent-editor/src/link/formats/link.ts | 51 +- packages/fluent-editor/src/link/index.ts | 35 +- .../fluent-editor/src/link/modules/tooltip.ts | 338 +- packages/fluent-editor/src/mention/Mention.ts | 400 +- .../fluent-editor/src/mention/MentionLink.ts | 56 +- .../fluent-editor/src/mention/constants.ts | 6 +- .../fluent-editor/src/quick-menu/index.ts | 124 +- .../fluent-editor/src/screenshot/index.ts | 173 +- .../fluent-editor/src/soft-break/index.ts | 34 +- packages/fluent-editor/src/strike/index.ts | 18 +- packages/fluent-editor/src/syntax/index.ts | 12 +- .../fluent-editor/src/table/better-table.ts | 530 +- .../fluent-editor/src/table/formats/header.ts | 116 +- .../fluent-editor/src/table/formats/list.ts | 228 +- .../fluent-editor/src/table/formats/table.ts | 1141 +-- .../src/table/modules/table-column-tool.ts | 571 +- .../src/table/modules/table-operation-menu.ts | 461 +- .../src/table/modules/table-scroll-bar.ts | 272 +- .../src/table/modules/table-selection.ts | 426 +- .../fluent-editor/src/table/table-config.ts | 36 +- .../fluent-editor/src/table/utils/index.ts | 21 +- .../src/table/utils/node-matchers.ts | 338 +- .../src/toolbar/better-picker.ts | 357 +- packages/fluent-editor/src/toolbar/index.ts | 193 +- packages/fluent-editor/src/utils/debounce.ts | 4 +- packages/fluent-editor/src/utils/method.ts | 45 +- packages/fluent-editor/src/video/index.ts | 81 +- packages/fluent-editor/vite.config.ts | 6 +- pnpm-lock.yaml | 8401 +++++++++-------- pnpm-workspace.yaml | 3 +- verifyCommit.js | 18 +- 96 files changed, 9336 insertions(+), 8185 deletions(-) diff --git a/.eslintignore b/.eslintignore index 63a06c9..7c9387c 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,4 +1,6 @@ # Common node_modules dist -# Examples \ No newline at end of file + +**/*.json +**/*.yaml diff --git a/.eslintrc.js b/.eslintrc.js index 61affda..288cc8e 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,52 +1,72 @@ +const stylistic = require('@stylistic/eslint-plugin') + +const customized = stylistic.configs.customize({ + // the following options are the default values + indent: 2, + quotes: 'single', + semi: false, +}) + module.exports = { - parser: 'vue-eslint-parser', - parserOptions: { - parser: '@typescript-eslint/parser', - sourceType: 'module', - }, - env: { - browser: true, - node: true, - }, - plugins: ['@typescript-eslint'], - extends: [ - 'plugin:@typescript-eslint/recommended', - 'plugin:vue/vue3-recommended', + parser: 'vue-eslint-parser', + parserOptions: { + parser: '@typescript-eslint/parser', + sourceType: 'module', + }, + env: { + browser: true, + node: true, + }, + plugins: [ + '@typescript-eslint', + '@stylistic', + ], + extends: [ + 'plugin:@typescript-eslint/recommended', + 'plugin:vue/vue3-recommended', + ], + rules: { + ...customized.rules, + // js/ts + 'eol-last': 'error', + 'no-trailing-spaces': 'error', + 'comma-style': ['error', 'last'], + 'comma-dangle': ['error', 'always-multiline'], + 'no-multi-spaces': 'error', + 'quotes': [ + 'error', + 'single', + { avoidEscape: true, allowTemplateLiterals: true }, ], - rules: { - // js/ts - 'eol-last': 'error', - 'no-trailing-spaces': 'error', - 'comma-style': ['error', 'last'], - 'comma-dangle': ['error', 'always-multiline'], - 'no-multi-spaces': 'error', - quotes: [ - 'error', - 'single', - { avoidEscape: true, allowTemplateLiterals: true }, - ], - camelcase: ['error', { properties: 'never' }], - 'object-curly-spacing': ['error', 'always'], - '@typescript-eslint/explicit-module-boundary-types': 'off', - '@typescript-eslint/no-explicit-any': 'off', - '@typescript-eslint/no-var-requires': 'off', - '@typescript-eslint/no-unused-vars': [ - 'warn', - { - 'args': 'all', - 'argsIgnorePattern': '^_', - 'caughtErrors': 'all', - 'caughtErrorsIgnorePattern': '^_', - 'destructuredArrayIgnorePattern': '^_', - 'varsIgnorePattern': '^_', - 'ignoreRestSiblings': true, - }, - ], - '@typescript-eslint/no-this-alias': 'off', - '@typescript-eslint/ban-ts-comment': 'off', - '@typescript-eslint/no-empty-function': 'off', + 'camelcase': ['error', { properties: 'never' }], + 'object-curly-spacing': ['error', 'always'], + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/no-unused-vars': [ + 'warn', + { + args: 'all', + argsIgnorePattern: '^_', + caughtErrors: 'all', + caughtErrorsIgnorePattern: '^_', + destructuredArrayIgnorePattern: '^_', + varsIgnorePattern: '^_', + ignoreRestSiblings: true, + }, + ], + '@typescript-eslint/no-this-alias': 'off', + '@typescript-eslint/ban-ts-comment': 'off', + '@typescript-eslint/no-empty-function': 'off', + }, + overrides: [ + { + files: ['packages/docs/**/*.vue'], + rules: { + 'vue/multi-word-component-names': 'off', + '@typescript-eslint/no-unused-vars': 'off', + }, }, - } - - + ], +} diff --git a/jest.config.js b/jest.config.js index 5645fa7..ee1640b 100644 --- a/jest.config.js +++ b/jest.config.js @@ -5,4 +5,4 @@ module.exports = { '^.+\\.vue$': 'vue-jest', }, moduleFileExtensions: ['vue', 'js', 'json', 'jsx', 'ts', 'tsx', 'node'], -}; +} diff --git a/package.json b/package.json index 09fddf5..6d40b4f 100644 --- a/package.json +++ b/package.json @@ -26,17 +26,19 @@ "dev": "pnpm -F fluent-editor-docs dev", "build": "pnpm -F fluent-editor-docs build", "build:lib": "pnpm -F @opentiny/fluent-editor build", - "lint": "eslint . --cache", - "lint:fix": "eslint . --fix", + "lint": "eslint \"packages/**/*.{js,ts,vue}\" --cache", + "lint:fix": "eslint \"packages/**/*.{js,ts,vue}\" --fix", "install:browser": "pnpm -F fluent-editor-docs install:browser", "test": "pnpm -F fluent-editor-docs test", "report": "pnpm -F fluent-editor-docs report" }, "devDependencies": { - "eslint-plugin-vue": "^9.27.0", + "@types/node": "^15.0.2", + "@stylistic/eslint-plugin": "^2.7.2", "@typescript-eslint/eslint-plugin": "^5.7.0", "@typescript-eslint/parser": "^5.7.0", - "eslint": "^8.5.0", + "eslint": "^8.57.0", + "eslint-plugin-vue": "^9.27.0", "lint-staged": "^12.1.4" }, "gitHooks": { diff --git a/packages/docs/fluent-editor/.vitepress/theme/index.ts b/packages/docs/fluent-editor/.vitepress/theme/index.ts index eb28a68..7d92f3d 100644 --- a/packages/docs/fluent-editor/.vitepress/theme/index.ts +++ b/packages/docs/fluent-editor/.vitepress/theme/index.ts @@ -1,13 +1,15 @@ -import Theme from 'vitepress/theme' +import type { Theme } from 'vitepress'; +import DefaultTheme from 'vitepress/theme' import DemoPreview, { useComponents } from '@vitepress-code-preview/container' import '@vitepress-code-preview/container/dist/style.css' import './style.css' import { insertBaiduScript } from './insert-baidu-script' -export default { - ...Theme, +export const define = (value: T): T => value; +export default define({ + ...DefaultTheme, enhanceApp({ app }) { useComponents(app, DemoPreview) insertBaiduScript() } -} +}); diff --git a/packages/docs/fluent-editor/demos/basic-usage.spec.ts b/packages/docs/fluent-editor/demos/basic-usage.spec.ts index 231e108..e43c63e 100644 --- a/packages/docs/fluent-editor/demos/basic-usage.spec.ts +++ b/packages/docs/fluent-editor/demos/basic-usage.spec.ts @@ -1,13 +1,13 @@ -import { test, expect } from '@playwright/test'; +import { test, expect } from '@playwright/test' test('has toolbar', async ({ page }) => { - page.on('pageerror', (exception) => expect(exception).toBeNull()); - await page.goto('http://localhost:5173/fluent-editor/docs/basic-usage'); + page.on('pageerror', exception => expect(exception).toBeNull()) + await page.goto('http://localhost:5173/fluent-editor/docs/basic-usage') - const toolbar = page.locator('.ql-toolbar'); - const editor = page.locator('.ql-editor'); + const toolbar = page.locator('.ql-toolbar') + const editor = page.locator('.ql-editor') - await expect(toolbar).toBeVisible(); + await expect(toolbar).toBeVisible() await expect(await editor.innerHTML()).toEqual( [ '

', @@ -16,5 +16,5 @@ test('has toolbar', async ({ page }) => { '!', `

`, ].join(''), - ); -}); + ) +}) diff --git a/packages/docs/fluent-editor/demos/basic-usage.vue b/packages/docs/fluent-editor/demos/basic-usage.vue index 3ea9b43..1d49b37 100644 --- a/packages/docs/fluent-editor/demos/basic-usage.vue +++ b/packages/docs/fluent-editor/demos/basic-usage.vue @@ -10,7 +10,7 @@ onMounted(() => { const FluentEditor = module.default editor = new FluentEditor('#editor', { - theme: 'snow' + theme: 'snow', }) }) }) diff --git a/packages/docs/fluent-editor/demos/code-block-highlight.vue b/packages/docs/fluent-editor/demos/code-block-highlight.vue index 4a81c30..0f24a84 100644 --- a/packages/docs/fluent-editor/demos/code-block-highlight.vue +++ b/packages/docs/fluent-editor/demos/code-block-highlight.vue @@ -9,7 +9,7 @@ const TOOLBAR_CONFIG = [ ['bold', 'italic', 'underline', 'link'], [{ list: 'ordered' }, { list: 'bullet' }], ['clean'], - ['code-block'] + ['code-block'], ] onMounted(() => { @@ -21,13 +21,13 @@ onMounted(() => { theme: 'snow', modules: { toolbar: TOOLBAR_CONFIG, - syntax: true - } + syntax: true, + }, }) }) }) diff --git a/packages/docs/fluent-editor/demos/custom-toolbar.vue b/packages/docs/fluent-editor/demos/custom-toolbar.vue index 86b955c..bb30110 100644 --- a/packages/docs/fluent-editor/demos/custom-toolbar.vue +++ b/packages/docs/fluent-editor/demos/custom-toolbar.vue @@ -6,7 +6,7 @@ let editor const TOOLBAR_CONFIG = [ ['undo', 'redo', 'clean'], - [{ header: [1, 2, 3, 4, 5, 6, false] }, { size: ['12px', '14px', '16px', '18px', '20px', '24px', '32px', '36px', '48px', '72px']}], + [{ header: [1, 2, 3, 4, 5, 6, false] }, { size: ['12px', '14px', '16px', '18px', '20px', '24px', '32px', '36px', '48px', '72px'] }], ['bold', 'italic', 'strike', 'underline'], [{ color: [] }, { background: [] }], [{ align: [] }, { list: 'ordered' }, { list: 'bullet' }, { list: 'check' }], @@ -21,13 +21,13 @@ onMounted(() => { editor = new FluentEditor('#editor', { theme: 'snow', modules: { - toolbar: TOOLBAR_CONFIG - } + toolbar: TOOLBAR_CONFIG, + }, }) }) }) diff --git a/packages/docs/fluent-editor/demos/emoji.vue b/packages/docs/fluent-editor/demos/emoji.vue index 58d911c..7c3994d 100644 --- a/packages/docs/fluent-editor/demos/emoji.vue +++ b/packages/docs/fluent-editor/demos/emoji.vue @@ -9,7 +9,7 @@ const TOOLBAR_CONFIG = [ ['bold', 'italic', 'underline', 'link'], [{ list: 'ordered' }, { list: 'bullet' }], ['clean'], - ['emoji'] + ['emoji'], ] onMounted(() => { @@ -20,14 +20,14 @@ onMounted(() => { editor = new FluentEditor('#editor', { theme: 'snow', modules: { - toolbar: TOOLBAR_CONFIG, - 'emoji-toolbar': true - } + 'toolbar': TOOLBAR_CONFIG, + 'emoji-toolbar': true, + }, }) }) }) diff --git a/packages/docs/fluent-editor/demos/file-upload.vue b/packages/docs/fluent-editor/demos/file-upload.vue index 702a13b..f728d31 100644 --- a/packages/docs/fluent-editor/demos/file-upload.vue +++ b/packages/docs/fluent-editor/demos/file-upload.vue @@ -9,7 +9,7 @@ const TOOLBAR_CONFIG = [ ['bold', 'italic', 'underline', 'link'], [{ list: 'ordered' }, { list: 'bullet' }], ['clean'], - ['file'] + ['file'], ] onMounted(() => { @@ -21,13 +21,13 @@ onMounted(() => { theme: 'snow', modules: { toolbar: TOOLBAR_CONFIG, - file: true - } + file: true, + }, }) }) }) diff --git a/packages/docs/fluent-editor/demos/image-upload.vue b/packages/docs/fluent-editor/demos/image-upload.vue index 74c2967..da078c8 100644 --- a/packages/docs/fluent-editor/demos/image-upload.vue +++ b/packages/docs/fluent-editor/demos/image-upload.vue @@ -9,7 +9,7 @@ const TOOLBAR_CONFIG = [ ['bold', 'italic', 'underline', 'link'], [{ list: 'ordered' }, { list: 'bullet' }], ['clean'], - ['image'] + ['image'], ] onMounted(() => { @@ -20,8 +20,8 @@ onMounted(() => { editor = new FluentEditor('#editor', { theme: 'snow', modules: { - toolbar: TOOLBAR_CONFIG - } + toolbar: TOOLBAR_CONFIG, + }, }) }) }) @@ -29,5 +29,5 @@ onMounted(() => { diff --git a/packages/docs/fluent-editor/demos/mention-custom-list.vue b/packages/docs/fluent-editor/demos/mention-custom-list.vue index 414f89b..c0e0634 100644 --- a/packages/docs/fluent-editor/demos/mention-custom-list.vue +++ b/packages/docs/fluent-editor/demos/mention-custom-list.vue @@ -11,20 +11,20 @@ const mentionList = [ name: 'kagol', cn: '卡哥', followers: 156, - avatar: 'https://avatars.githubusercontent.com/u/9566362?v=4' + avatar: 'https://avatars.githubusercontent.com/u/9566362?v=4', }, { name: 'zzcr', cn: '超哥', followers: 10, - avatar: 'https://avatars.githubusercontent.com/u/18521562?v=4' + avatar: 'https://avatars.githubusercontent.com/u/18521562?v=4', }, { name: 'hexqi', cn: '小伍哥', followers: 2, - avatar: 'https://avatars.githubusercontent.com/u/18585869?v=4' - } + avatar: 'https://avatars.githubusercontent.com/u/18585869?v=4', + }, ] onMounted(() => { @@ -39,12 +39,12 @@ onMounted(() => { containerClass: 'ql-mention-list-container__custom-list', itemKey: 'cn', searchKey, - search: function(term) { - return mentionList.filter(item => { + search: function (term) { + return mentionList.filter((item) => { return item[searchKey] && String(item[searchKey]).includes(term) }) }, - renderMentionItem: function(item) { + renderMentionItem: function (item) { return `
@@ -54,16 +54,16 @@ onMounted(() => {
${item.followers}粉丝
` - } - } - } + }, + }, + }, }) }) })