diff --git a/.eslintrc.yml b/.eslintrc.yml index 70a71baa590fdc8764376984ee62918d16db1ba4..59eec634e8b6b8cf14d9c8f0e90a037821f38729 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -10,6 +10,7 @@ plugins: - import - "@gitlab/i18n" - "@gitlab/vue-i18n" + - no-jquery settings: import/resolver: webpack: @@ -36,6 +37,11 @@ rules: vue/no-use-v-if-with-v-for: off vue/no-v-html: off vue/use-v-on-exact: off + no-jquery/no-ajax: error + no-jquery/no-ajax-events: error + no-jquery/no-load: error + no-jquery/no-load-shorthand: error + no-jquery/no-serialize: error overrides: files: - '**/spec/**/*' diff --git a/app/assets/javascripts/filterable_list.js b/app/assets/javascripts/filterable_list.js index 77080691dcb32c49b0ec58a6483ba22fa2589560..c21fba06d42c50322a759e24ff267ce859aae7d2 100644 --- a/app/assets/javascripts/filterable_list.js +++ b/app/assets/javascripts/filterable_list.js @@ -22,6 +22,7 @@ export default class FilterableList { getPagePath() { const action = this.filterForm.getAttribute('action'); + // eslint-disable-next-line no-jquery/no-serialize const params = $(this.filterForm).serialize(); return `${action}${action.indexOf('?') > 0 ? '&' : '?'}${params}`; } diff --git a/app/assets/javascripts/integrations/integration_settings_form.js b/app/assets/javascripts/integrations/integration_settings_form.js index a7746bb3a0b7d4f73bc9f582c631231a36d71432..1c9b94ade8ac902183db67f08aecfcb2579ac9a3 100644 --- a/app/assets/javascripts/integrations/integration_settings_form.js +++ b/app/assets/javascripts/integrations/integration_settings_form.js @@ -42,6 +42,7 @@ export default class IntegrationSettingsForm { // and test the service using provided configuration. if (this.$form.get(0).checkValidity() && this.canTestService) { e.preventDefault(); + // eslint-disable-next-line no-jquery/no-serialize this.testSettings(this.$form.serialize()); } } diff --git a/app/assets/javascripts/main.js b/app/assets/javascripts/main.js index 49be11d466d2ef72baa2bb5d7b6fae681bc6a9b4..c19a845eb69d88a4b5efa8480915422e6fb3788f 100644 --- a/app/assets/javascripts/main.js +++ b/app/assets/javascripts/main.js @@ -314,6 +314,7 @@ document.addEventListener('DOMContentLoaded', () => { const action = `${this.action}${link.search === '' ? '?' : '&'}`; event.preventDefault(); + // eslint-disable-next-line no-jquery/no-serialize visitUrl(`${action}${$(this).serialize()}`); }); diff --git a/app/assets/javascripts/notes.js b/app/assets/javascripts/notes.js index 9cc56b34c757e66767a4f424d7428b9c3556f38c..ed52eec8b188395feddb9c34889f89654dbbbecb 100644 --- a/app/assets/javascripts/notes.js +++ b/app/assets/javascripts/notes.js @@ -1461,6 +1461,7 @@ export default class Notes { getFormData($form) { const content = $form.find('.js-note-text').val(); return { + // eslint-disable-next-line no-jquery/no-serialize formData: $form.serialize(), formContent: _.escape(content), formAction: $form.attr('action'), diff --git a/app/assets/javascripts/pages/projects/commit/pipelines/index.js b/app/assets/javascripts/pages/projects/commit/pipelines/index.js index 8cc3cb0a57c92ca0038d558b8373261948f73f95..9f08260c3d6cd516fe5af4c4c575826376dc39fd 100644 --- a/app/assets/javascripts/pages/projects/commit/pipelines/index.js +++ b/app/assets/javascripts/pages/projects/commit/pipelines/index.js @@ -6,6 +6,7 @@ document.addEventListener('DOMContentLoaded', () => { new MiniPipelineGraph({ container: '.js-commit-pipeline-graph', }).bindEvents(); + // eslint-disable-next-line no-jquery/no-load $('.commit-info.branches').load(document.querySelector('.js-commit-box').dataset.commitPath); initPipelines(); }); diff --git a/app/assets/javascripts/pages/projects/commit/show/index.js b/app/assets/javascripts/pages/projects/commit/show/index.js index 6fc982967eb3f7bd00ce77090070feba711315b3..5aa4734244e702fed6e8b073e3003522b43084b8 100644 --- a/app/assets/javascripts/pages/projects/commit/show/index.js +++ b/app/assets/javascripts/pages/projects/commit/show/index.js @@ -21,6 +21,7 @@ document.addEventListener('DOMContentLoaded', () => { }).bindEvents(); initNotes(); initChangesDropdown(document.querySelector('.navbar-gitlab').offsetHeight + performanceHeight); + // eslint-disable-next-line no-jquery/no-load $('.commit-info.branches').load(document.querySelector('.js-commit-box').dataset.commitPath); fetchCommitMergeRequests(); initDiffNotes(); diff --git a/ee/app/assets/javascripts/jira_connect.js b/ee/app/assets/javascripts/jira_connect.js index 0716a94ea8512eb2c7ff069ae94bf58318b19656..4ab5d6368d0e79452940eaa98a33505309241d66 100644 --- a/ee/app/assets/javascripts/jira_connect.js +++ b/ee/app/assets/javascripts/jira_connect.js @@ -24,6 +24,7 @@ e.preventDefault(); AP.context.getToken(function(token) { + // eslint-disable-next-line no-jquery/no-ajax $.post(actionUrl, { jwt: token, namespace_path: $('#namespace-input').val(), @@ -39,6 +40,7 @@ e.preventDefault(); AP.context.getToken(function(token) { + // eslint-disable-next-line no-jquery/no-ajax $.ajax({ url: href, method: 'DELETE', diff --git a/ee/app/assets/javascripts/projects/custom_project_templates.js b/ee/app/assets/javascripts/projects/custom_project_templates.js index 9f7f0e53edb42c78d2e3ffba97c65a06ab00697c..f4930f73fc01421ecaab12914d7972adb959dd64 100644 --- a/ee/app/assets/javascripts/projects/custom_project_templates.js +++ b/ee/app/assets/javascripts/projects/custom_project_templates.js @@ -120,10 +120,12 @@ export default () => { $groupTabContent.on('ajax:success', bindEvents); $navElement.one('click', () => { + // eslint-disable-next-line no-jquery/no-ajax $.get($tabContent.data('initialTemplates')); }); $groupNavElement.one('click', () => { + // eslint-disable-next-line no-jquery/no-ajax $.get($groupTabContent.data('initialTemplates')); }); diff --git a/package.json b/package.json index 3e9b7fca77311d3764ed1b5d2b8da95510fa22ab..9e1ea86b6925bf17544accbce3a81b2b24a26cbe 100644 --- a/package.json +++ b/package.json @@ -166,6 +166,7 @@ "eslint-plugin-import": "^2.14.0", "eslint-plugin-jasmine": "^2.10.1", "eslint-plugin-jest": "^22.3.0", + "eslint-plugin-no-jquery": "^2.1.0", "gettext-extractor": "^3.4.3", "gettext-extractor-vue": "^4.0.2", "graphql-tag": "^2.10.0", diff --git a/spec/javascripts/integrations/integration_settings_form_spec.js b/spec/javascripts/integrations/integration_settings_form_spec.js index 069e2cb07b5bc8277a78d72c449d8652936485c4..82d1f815ca8195a8514876cf813f1ee815079c55 100644 --- a/spec/javascripts/integrations/integration_settings_form_spec.js +++ b/spec/javascripts/integrations/integration_settings_form_spec.js @@ -126,6 +126,7 @@ describe('IntegrationSettingsForm', () => { spyOn(axios, 'put').and.callThrough(); integrationSettingsForm = new IntegrationSettingsForm('.js-integration-settings-form'); + // eslint-disable-next-line no-jquery/no-serialize formData = integrationSettingsForm.$form.serialize(); }); diff --git a/yarn.lock b/yarn.lock index 923f0305ea4b6b39a540f1f3885aba1f945bef1d..8e6fd5b1a2e8c383ca9636a2a7ea6ec3efbc061e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4624,6 +4624,11 @@ eslint-plugin-jest@^22.3.0: resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-22.3.0.tgz#a10f10dedfc92def774ec9bb5bfbd2fb8e1c96d2" integrity sha512-P1mYVRNlOEoO5T9yTqOfucjOYf1ktmJ26NjwjH8sxpCFQa6IhBGr5TpKl3hcAAT29hOsRJVuMWmTsHoUVo9FoA== +eslint-plugin-no-jquery@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-2.1.0.tgz#d03b74224c5cfbc7fc0bdd12ce4eb400d09e0c0b" + integrity sha512-5sr5tOJRfuRviyAvFTe/mr80TXWxTteD/JHRuJtDN8q/bxAh16eSKoKLAevLC7wZCRN2iwnEfhQPQV4rp/gYtg== + eslint-plugin-promise@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.1.1.tgz#1e08cb68b5b2cd8839f8d5864c796f56d82746db"