diff --git a/app/assets/javascripts/ide/init_gitlab_web_ide.js b/app/assets/javascripts/ide/init_gitlab_web_ide.js index 868830c953a5e371d560ed51be0f90be75bcd5a7..ae3784a4267bba8edf9be9031570ca3d7b44bb0f 100644 --- a/app/assets/javascripts/ide/init_gitlab_web_ide.js +++ b/app/assets/javascripts/ide/init_gitlab_web_ide.js @@ -10,6 +10,7 @@ import { getBaseConfig } from './lib/gitlab_web_ide/get_base_config'; import { setupRootElement } from './lib/gitlab_web_ide/setup_root_element'; import { GITLAB_WEB_IDE_FEEDBACK_ISSUE } from './constants'; import { handleTracking } from './lib/gitlab_web_ide/handle_tracking_event'; +import { getOauthConfig } from './lib/gitlab_web_ide'; const buildRemoteIdeURL = (ideRemotePath, remoteHost, remotePathArg) => { const remotePath = cleanLeadingSeparator(remotePathArg); @@ -43,6 +44,8 @@ export const initGitlabWebIDE = async (el) => { forkInfo: forkInfoJSON, editorFont: editorFontJSON, codeSuggestionsEnabled, + clientId, + callbackUrl, } = el.dataset; const rootEl = setupRootElement(el); @@ -50,16 +53,18 @@ export const initGitlabWebIDE = async (el) => { ? convertObjectPropsToCamelCase(JSON.parse(editorFontJSON), { deep: true }) : null; const forkInfo = forkInfoJSON ? JSON.parse(forkInfoJSON) : null; + const auth = clientId ? getOauthConfig({ clientId, callbackUrl }) : undefined; + // Use same headers as defined in axios_utils + const httpHeaders = !auth + ? { [csrf.headerKey]: csrf.token, 'X-Requested-With': 'XMLHttpRequest' } + : undefined; // See ClientOnlyConfig https://gitlab.com/gitlab-org/gitlab-web-ide/-/blob/main/packages/web-ide-types/src/config.ts#L17 start(rootEl, { ...getBaseConfig(), nonce, - // Use same headers as defined in axios_utils - httpHeaders: { - [csrf.headerKey]: csrf.token, - 'X-Requested-With': 'XMLHttpRequest', - }, + httpHeaders, + auth, projectPath, ref, filePath, diff --git a/app/assets/javascripts/ide/lib/gitlab_web_ide/get_oauth_config.js b/app/assets/javascripts/ide/lib/gitlab_web_ide/get_oauth_config.js new file mode 100644 index 0000000000000000000000000000000000000000..877693f527f8d6416fa72a80b89ee9391fe1a891 --- /dev/null +++ b/app/assets/javascripts/ide/lib/gitlab_web_ide/get_oauth_config.js @@ -0,0 +1,7 @@ +export const getOauthConfig = ({ clientId, callbackUrl }) => ({ + type: 'oauth', + clientId, + callbackUrl, + protectRefreshToken: true, + tokenLifetime: 360, +}); diff --git a/app/assets/javascripts/ide/lib/gitlab_web_ide/index.js b/app/assets/javascripts/ide/lib/gitlab_web_ide/index.js index 8311e11672efbf9fbb6e646234ae2b520550ea33..7ebd0c0b16c65308b9cca35d55288004028ff596 100644 --- a/app/assets/javascripts/ide/lib/gitlab_web_ide/index.js +++ b/app/assets/javascripts/ide/lib/gitlab_web_ide/index.js @@ -1,2 +1,3 @@ export * from './get_base_config'; +export * from './get_oauth_config'; export * from './setup_root_element'; diff --git a/app/assets/javascripts/ide/mount_oauth_callback.js b/app/assets/javascripts/ide/mount_oauth_callback.js new file mode 100644 index 0000000000000000000000000000000000000000..b7cd36b21ea7200d413e5bfa0f3883cfdcc069c8 --- /dev/null +++ b/app/assets/javascripts/ide/mount_oauth_callback.js @@ -0,0 +1,15 @@ +import { oauthCallback } from '@gitlab/web-ide'; +import { getBaseConfig, getOauthConfig } from './lib/gitlab_web_ide'; + +export const mountOAuthCallback = () => { + const el = document.getElementById('ide'); + + const { clientId, callbackUrl } = el?.dataset || {}; + + // TODO handle edge cases and errors + return oauthCallback({ + ...getBaseConfig(), + username: gon.current_username, + auth: getOauthConfig({ clientId, callbackUrl }), + }); +}; diff --git a/app/assets/javascripts/pages/ide/index.js b/app/assets/javascripts/pages/ide/index/index.js similarity index 100% rename from app/assets/javascripts/pages/ide/index.js rename to app/assets/javascripts/pages/ide/index/index.js diff --git a/app/assets/javascripts/pages/ide/oauth_redirect/index.js b/app/assets/javascripts/pages/ide/oauth_redirect/index.js new file mode 100644 index 0000000000000000000000000000000000000000..ee9233fab38cae18d0c70a28de30b310b1f3a7c8 --- /dev/null +++ b/app/assets/javascripts/pages/ide/oauth_redirect/index.js @@ -0,0 +1,3 @@ +import { mountOAuthCallback } from '~/ide/mount_oauth_callback'; + +mountOAuthCallback(); diff --git a/app/controllers/ide_controller.rb b/app/controllers/ide_controller.rb index 4cc943ac2526274b1671b11f01f453dd7b3d0a8c..eabf344b22556e7222fc604cdbceefab9942608e 100644 --- a/app/controllers/ide_controller.rb +++ b/app/controllers/ide_controller.rb @@ -5,7 +5,8 @@ class IdeController < ApplicationController include StaticObjectExternalStorageCSP include Gitlab::Utils::StrongMemoize - before_action :authorize_read_project! + before_action :authorize_read_project!, only: [:index] + before_action :ensure_web_ide_oauth_application!, only: [:index] before_action do push_frontend_feature_flag(:build_service_proxy) @@ -27,12 +28,23 @@ def index render layout: 'fullscreen', locals: { minimal: helpers.use_new_web_ide? } end + def oauth_redirect + render layout: 'fullscreen', locals: { minimal: true } + end + private def authorize_read_project! render_404 unless can?(current_user, :read_project, project) end + def ensure_web_ide_oauth_application! + return unless Feature.enabled?(:web_ide_oauth, current_user) + + ::Gitlab::WebIde::DefaultOauthApplication.ensure_oauth_application!(request) + ::Gitlab::WebIde::DefaultOauthApplication.ensure_oauth_callback_url!(request) + end + def fork_info(project, branch) return if can?(current_user, :push_code, project) diff --git a/app/helpers/ide_helper.rb b/app/helpers/ide_helper.rb index 2582d6fcc348ad241f035fdea9e834b28aa59fdd..fbe9cf2bcf93f0b0cb5bf0d15acc0e8ee73760f0 100644 --- a/app/helpers/ide_helper.rb +++ b/app/helpers/ide_helper.rb @@ -52,6 +52,19 @@ def new_ide_code_suggestions_data {} end + def new_ide_oauth_data + return {} unless Feature.enabled?(:web_ide_oauth, current_user) + + client_id = ::Gitlab::WebIde::DefaultOauthApplication.oauth_application.uid + callback_url = ::Gitlab::WebIde::DefaultOauthApplication.oauth_callback_url(request) + + # TODO - redirect_uri can actually contain multiple values + { + 'client-id' => client_id, + 'callback-url' => callback_url + } + end + def new_ide_data(project:) { 'project-path' => project&.path_with_namespace, @@ -59,7 +72,7 @@ def new_ide_data(project:) # We will replace these placeholders in the FE 'ide-remote-path' => ide_remote_path(remote_host: ':remote_host', remote_path: ':remote_path'), 'editor-font' => new_ide_fonts.to_json - }.merge(new_ide_code_suggestions_data) + }.merge(new_ide_code_suggestions_data).merge(new_ide_oauth_data) end def legacy_ide_data(project:) diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb index 79b1718233f6cdb8139ffebd465fe1232c9b0183..2fbd8ae1711ca8dcc47074b209d0cd52e4acb78d 100644 --- a/app/models/application_setting.rb +++ b/app/models/application_setting.rb @@ -64,6 +64,8 @@ class ApplicationSetting < MainClusterwide::ApplicationRecord sanitizes! :default_branch_name + belongs_to :web_ide_oauth_application, class_name: 'Doorkeeper::Application' + def self.kroki_formats_attributes { blockdiag: { diff --git a/app/views/ide/oauth_redirect.html.haml b/app/views/ide/oauth_redirect.html.haml new file mode 100644 index 0000000000000000000000000000000000000000..3d4b464cc0394d6e227d97df2d8b3709c94b2939 --- /dev/null +++ b/app/views/ide/oauth_redirect.html.haml @@ -0,0 +1,4 @@ +- page_title _("IDE") +- add_page_specific_style 'page_bundles/web_ide_loader' + += render partial: 'shared/ide_root', locals: { data: new_ide_oauth_data, loading_text: _('Authenticating...') } diff --git a/app/views/shared/_ide_root.html.haml b/app/views/shared/_ide_root.html.haml index db3e76e188c4dfdf593217cc99097791bebfb078..173b081d69328e4c435191a92866b4fa0229e6ea 100644 --- a/app/views/shared/_ide_root.html.haml +++ b/app/views/shared/_ide_root.html.haml @@ -5,6 +5,6 @@ -# 100vh because of the presence of the bottom bar #ide.gl-h-full{ data: data } - .web-ide-loader.gl-display-flex.gl-justify-content-center.gl-align-items-center.gl-flex-direction-column.gl-h-full.gl-mr-auto.gl-ml-auto + .web-ide-loader.gl-display-flex.gl-justify-content-center.gl-align-items-center.gl-flex-direction-column.gl-h-full.gl-mx-auto = brand_header_logo %h3.clblack.gl-mt-6= loading_text diff --git a/config/feature_flags/development/web_ide_oauth.yml b/config/feature_flags/development/web_ide_oauth.yml new file mode 100644 index 0000000000000000000000000000000000000000..aab599dfe4d51e7d71c4bf78bf062ab9b1fc51f6 --- /dev/null +++ b/config/feature_flags/development/web_ide_oauth.yml @@ -0,0 +1,8 @@ +--- +name: web_ide_oauth +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/132496 +rollout_issue_url: +milestone: '16.5' +type: development +group: group::ide +default_enabled: false diff --git a/config/routes.rb b/config/routes.rb index 82b2ef84a647429bde42374ab986df3c70731c76..036b804f8f650efdcdf51a8007ee5ac835d9b25e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -138,6 +138,7 @@ scope :ide, as: :ide, format: false do get '/', to: 'ide#index' get '/project', to: 'ide#index' + get '/oauth_redirect', to: 'ide#oauth_redirect' scope path: 'project/:project_id', as: :project, constraints: { project_id: Gitlab::PathRegex.full_namespace_route_regex } do %w[edit tree blob].each do |action| diff --git a/db/migrate/20230923184646_add_web_ide_oauth_application_to_settings.rb b/db/migrate/20230923184646_add_web_ide_oauth_application_to_settings.rb new file mode 100644 index 0000000000000000000000000000000000000000..326883dd851bb428f9fd64127856ace2d8ca7aff --- /dev/null +++ b/db/migrate/20230923184646_add_web_ide_oauth_application_to_settings.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AddWebIdeOauthApplicationToSettings < Gitlab::Database::Migration[2.1] + def change + add_column :application_settings, :web_ide_oauth_application_id, :int, null: true + end +end diff --git a/db/migrate/20230923190816_add_fk_web_ide_oauth_application.rb b/db/migrate/20230923190816_add_fk_web_ide_oauth_application.rb new file mode 100644 index 0000000000000000000000000000000000000000..2ab9abf0d1a846c0b0238d0cc54e902d12576184 --- /dev/null +++ b/db/migrate/20230923190816_add_fk_web_ide_oauth_application.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +class AddFkWebIdeOauthApplication < Gitlab::Database::Migration[2.1] + disable_ddl_transaction! + + def up + add_concurrent_foreign_key :application_settings, :oauth_applications, + column: :web_ide_oauth_application_id, + on_delete: :nullify + end + + def down + with_lock_retries do + remove_foreign_key :application_settings, column: :web_ide_oauth_application_id + end + end +end diff --git a/db/schema_migrations/20230923184646 b/db/schema_migrations/20230923184646 new file mode 100644 index 0000000000000000000000000000000000000000..bc72f3ba93e39b72fee0c9f702055cbe6fc46556 --- /dev/null +++ b/db/schema_migrations/20230923184646 @@ -0,0 +1 @@ +dbc6c49e1f874907a1922bd1c1916ff80c5792e834d4b0eefff142a876be7190 \ No newline at end of file diff --git a/db/schema_migrations/20230923190816 b/db/schema_migrations/20230923190816 new file mode 100644 index 0000000000000000000000000000000000000000..744b44bede3d3931c6caae550d20947e3c7e5152 --- /dev/null +++ b/db/schema_migrations/20230923190816 @@ -0,0 +1 @@ +a3311f9341ab974f6d85d75a1fc055243735074232b21ecaf853ee60bf633264 \ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index 0373c51c155f90f186ff24cf5830e621b0fb4b79..671350e991aa938a064aa94d79db205a68b9d0b2 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -11851,6 +11851,7 @@ CREATE TABLE application_settings ( container_registry_db_enabled boolean DEFAULT false NOT NULL, encrypted_vertex_ai_access_token bytea, encrypted_vertex_ai_access_token_iv bytea, + web_ide_oauth_application_id integer, CONSTRAINT app_settings_container_reg_cleanup_tags_max_list_size_positive CHECK ((container_registry_cleanup_tags_service_max_list_size >= 0)), CONSTRAINT app_settings_container_registry_pre_import_tags_rate_positive CHECK ((container_registry_pre_import_tags_rate >= (0)::numeric)), CONSTRAINT app_settings_dep_proxy_ttl_policies_worker_capacity_positive CHECK ((dependency_proxy_ttl_group_policy_worker_capacity >= 0)), @@ -37732,6 +37733,9 @@ ALTER TABLE ONLY cluster_agents ALTER TABLE ONLY protected_tag_create_access_levels ADD CONSTRAINT fk_f7dfda8c51 FOREIGN KEY (protected_tag_id) REFERENCES protected_tags(id) ON DELETE CASCADE; +ALTER TABLE ONLY application_settings + ADD CONSTRAINT fk_f9867b3540 FOREIGN KEY (web_ide_oauth_application_id) REFERENCES oauth_applications(id) ON DELETE SET NULL; + ALTER TABLE ONLY ci_stages ADD CONSTRAINT fk_fb57e6cc56 FOREIGN KEY (pipeline_id) REFERENCES ci_pipelines(id) ON DELETE CASCADE; diff --git a/lib/gitlab/web_ide/default_oauth_application.rb b/lib/gitlab/web_ide/default_oauth_application.rb new file mode 100644 index 0000000000000000000000000000000000000000..0cff630bea77395fc36137c7b7d4ffbee62d141e --- /dev/null +++ b/lib/gitlab/web_ide/default_oauth_application.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +module Gitlab + module WebIde + module DefaultOauthApplication + class << self + def oauth_application + application_settings.web_ide_oauth_application + end + + def oauth_callback_url(request) + path = Gitlab::Routing.url_helpers.ide_oauth_redirect_path + + "#{request.protocol}#{request.host_with_port}#{path}" + end + + def ensure_oauth_application!(request) + return if oauth_application + + application_settings.transaction do + # question: Is it okay for us to lock on applicaiton_settings?? + # This bit should run **very** rarely so maybe it's okay? + application_settings.lock! + + # We need to double check here so that those waiting on the transaction can now just skip + next if oauth_application + + # question: What if the `gitlab_url` isn't configured correctly? + application = Doorkeeper::Application.new( + name: 'GitLab Web IDE', + redirect_uri: oauth_callback_url(request), + scopes: ['api'], + trusted: true, + confidential: false) + application.save! + application_settings.update!(web_ide_oauth_application: application) + end + end + + def ensure_oauth_callback_url!(request) + expected_url = oauth_callback_url(request) + + return if oauth_application.redirect_uri.include?(expected_url) + + oauth_application.transaction do + oauth_application.lock! + + # We need to double check here so that those waiting on the transaction can now just skip + next if oauth_application.redirect_uri.include?(expected_url) + + new_redirect_uri = "#{oauth_application.redirect_uri}\n#{expected_url}" + + oauth_application.update!(redirect_uri: new_redirect_uri) + end + end + + private + + def application_settings + ::Gitlab::CurrentSettings.current_application_settings + end + end + end + end +end diff --git a/locale/gitlab.pot b/locale/gitlab.pot index b5eaf6f7d6579f8bdffebbeba03009e992393bee..fae98ff6320f1b94db447e45bef2b33eb0c5d30b 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -6952,6 +6952,9 @@ msgstr "" msgid "Authenticated web requests" msgstr "" +msgid "Authenticating..." +msgstr "" + msgid "Authentication" msgstr "" diff --git a/package.json b/package.json index e13816a1d003b1dce05d2e0c084e3c8744cdaeab..078201abcb33fbfa8881d8c4cddd10529c299c9c 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ "@apollo/client": "^3.5.10", "@babel/core": "^7.18.5", "@babel/preset-env": "^7.18.2", - "@cubejs-client/core": "^0.34.0", - "@cubejs-client/vue": "^0.34.0", + "@cubejs-client/core": "^0.33.59", + "@cubejs-client/vue": "^0.33.65", "@floating-ui/dom": "^1.2.9", "@gitlab/application-sdk-browser": "^0.2.8", "@gitlab/at.js": "1.5.7", @@ -63,7 +63,7 @@ "@gitlab/svgs": "3.66.0", "@gitlab/ui": "66.20.0", "@gitlab/visual-review-tools": "1.7.3", - "@gitlab/web-ide": "0.0.1-dev-20231004090414", + "@gitlab/web-ide": "https://gitlab.com/gitlab-org/gitlab-web-ide/-/jobs/5253615828/artifacts/raw/tmp/packages/gitlab-web-ide-0.0.1-dev-20231009233158.tgz", "@mattiasbuelens/web-streams-adapter": "^0.1.0", "@popperjs/core": "^2.11.2", "@rails/actioncable": "7.0.8", @@ -257,7 +257,7 @@ "cheerio": "^1.0.0-rc.9", "commander": "^2.20.3", "custom-jquery-matchers": "^2.1.0", - "eslint": "8.51.0", + "eslint": "8.50.0", "eslint-import-resolver-jest": "3.0.2", "eslint-import-resolver-webpack": "0.13.7", "eslint-plugin-import": "^2.28.1", diff --git a/yarn.lock b/yarn.lock index 2c09a7dfbdb58e3d743303159e86340e0019d5db..15322c5efcf9c63672e9473747015812bf39e3cc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1025,10 +1025,10 @@ resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-3.0.0.tgz#798622546b63847e82389e473fd67f2707d82247" integrity sha512-hBI9tfBtuPIi885ZsZ32IMEU/5nlZH/KOVYJCOh7gyMxaVLGmLedYqFN6Ui1LXkI8JlC8IsuC0rF0btcRZKd5g== -"@cubejs-client/core@^0.34.0": - version "0.34.0" - resolved "https://registry.yarnpkg.com/@cubejs-client/core/-/core-0.34.0.tgz#f02504619a77be1fb70c3faf0b2576f975c9f05d" - integrity sha512-kzwpdPruuZrCiKRmO69G92TdXTb5mZvW2vyvdW6v71avYO10698cM5hivgeENz2bCeLkwKrc1Vx9KihZnDNr1Q== +"@cubejs-client/core@^0.33.59": + version "0.33.59" + resolved "https://registry.yarnpkg.com/@cubejs-client/core/-/core-0.33.59.tgz#985ec795ff94411f508a4c28b0f92347f1eaafc6" + integrity sha512-BNJnxDPYrLjiZU+OAp+qL/twHVdjKPH8aeVDx3oxrk8GR7hA9xN2bjoJxScdGqUNwtyXn9a9iu/tzsXcut0IBQ== dependencies: "@babel/runtime" "^7.1.2" core-js "^3.6.5" @@ -1038,12 +1038,12 @@ url-search-params-polyfill "^7.0.0" uuid "^8.3.2" -"@cubejs-client/vue@^0.34.0": - version "0.34.0" - resolved "https://registry.yarnpkg.com/@cubejs-client/vue/-/vue-0.34.0.tgz#a61c1e6139b298ac19c1955b05ca2950efd82cfd" - integrity sha512-UYHRWbGufxt4AkB4CPP9D/+MRI9TTOi37GHJKBPux8DMSUNyR9u6pre+VPRAdgSRJk6LYUoENTAvaxRfytdnmQ== +"@cubejs-client/vue@^0.33.65": + version "0.33.65" + resolved "https://registry.yarnpkg.com/@cubejs-client/vue/-/vue-0.33.65.tgz#1b1f371393173c2cb2fe23a1be4e8d91bf240083" + integrity sha512-vzFxMGlYrBxa+7fIEqG17mZqqKPSE83a+I1incb67ICqabN1lG8yw23Es/sl+mkM50/UprKF3kM48vfpyBK0KQ== dependencies: - "@cubejs-client/core" "^0.34.0" + "@cubejs-client/core" "^0.33.59" core-js "^3.6.5" ramda "^0.27.2" @@ -1194,10 +1194,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.51.0": - version "8.51.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.51.0.tgz#6d419c240cfb2b66da37df230f7e7eef801c32fa" - integrity sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg== +"@eslint/js@8.50.0": + version "8.50.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.50.0.tgz#9e93b850f0f3fa35f5fa59adfd03adae8488e484" + integrity sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ== "@floating-ui/core@^1.2.6": version "1.2.6" @@ -1274,10 +1274,10 @@ resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-3.66.0.tgz#5dbe98f9811001942d78395756b9d7c588300c01" integrity sha512-FdkoMAprxjJJnl90GJYoCMeIpvCaYPNAnRkrlsmo7NY3Ce8fpRb/XE/ZakqULeadj82S7R1IRuTHYfWB06vVtA== -"@gitlab/ui@66.20.0": - version "66.20.0" - resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-66.20.0.tgz#66a48f1e0f356e96be79c01626350cca04cd0049" - integrity sha512-wavhvYuziLV0atwPe1qdcIM3RgAKGkPvaiFfR5CWdOS61fgPbPCe8PQTqXaVZItgYe176Mq/b3AuYcjoLE+S/w== +"@gitlab/ui@66.7.0": + version "66.7.0" + resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-66.7.0.tgz#ff83e27dd7c7187e3ee42bc7da10cf3ad3ee79be" + integrity sha512-OgWE3RcLiYS0YowlMV9CO2fmmL1clBTdP6USOhtB4nH34CFlU3pBSNKyw2NxtSg9f3kKR+FyEVDXxBwHJsQo4w== dependencies: "@floating-ui/dom" "1.2.9" bootstrap-vue "2.23.1" @@ -1292,10 +1292,9 @@ resolved "https://registry.yarnpkg.com/@gitlab/visual-review-tools/-/visual-review-tools-1.7.3.tgz#9ea641146436da388ffbad25d7f2abe0df52c235" integrity sha512-NMV++7Ew1FSBDN1xiZaauU9tfeSfgDHcOLpn+8bGpP+O5orUPm2Eu66R5eC5gkjBPaXosNAxNWtriee+aFk4+g== -"@gitlab/web-ide@0.0.1-dev-20231004090414": - version "0.0.1-dev-20231004090414" - resolved "https://registry.yarnpkg.com/@gitlab/web-ide/-/web-ide-0.0.1-dev-20231004090414.tgz#925c9e942917acbbb17c4ea77b0841649ae186ad" - integrity sha512-NfkRzvz5Z3uDceQC5QN8W5u1ETlHbbEXjrnKxiYM4TD1d+bOV567GYglRKjyOhQMTYRGpqbisLSAPgvShAQB6g== +"@gitlab/web-ide@https://gitlab.com/gitlab-org/gitlab-web-ide/-/jobs/5253615828/artifacts/raw/tmp/packages/gitlab-web-ide-0.0.1-dev-20231009233158.tgz": + version "0.0.1-dev-20231009233158" + resolved "https://gitlab.com/gitlab-org/gitlab-web-ide/-/jobs/5253615828/artifacts/raw/tmp/packages/gitlab-web-ide-0.0.1-dev-20231009233158.tgz#5c5dbf9a8db504c1a4867d2d73378ddbaeb35077" "@graphql-eslint/eslint-plugin@3.20.1": version "3.20.1" @@ -6329,15 +6328,15 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@8.51.0: - version "8.51.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.51.0.tgz#4a82dae60d209ac89a5cff1604fea978ba4950f3" - integrity sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA== +eslint@8.50.0: + version "8.50.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.50.0.tgz#2ae6015fee0240fcd3f83e1e25df0287f487d6b2" + integrity sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.2" - "@eslint/js" "8.51.0" + "@eslint/js" "8.50.0" "@humanwhocodes/config-array" "^0.11.11" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8"