{"version":3,"sources":["webpack:///./gfm_auto_complete.js","webpack:///./lib/utils/regexp.js","webpack:///./lib/utils/jquery_at_who.js","webpack:////build/source/ee/app/assets/javascripts/gfm_auto_complete.js"],"names":["busyBadge","_memoize","renderVueComponentForLegacyJS","GlBadge","class","props","variant","size","s__","outerHTML","escape","string","encodedString","decodedString","decodeURIComponent","_escape","replace","showAndHideHelper","$input","alias","on","removeClass","addClass","createMemberSearchString","member","name","username","membersBeforeSave","members","map","title","count","mentionsDisabled","autoCompleteAvatar","avatar_url","charAt","toUpperCase","rectAvatarClass","type","imgAvatar","txtAvatar","avatarIcon","spriteIcon","avatarTag","length","search","icon","availability","highlighter","li","query","escapedQuery","_escapeRegExp","regexp","RegExp","str","$1","$2","$3","setupSubcommands","cmd","data","filter","atwho","at","Object","keys","maxLen","displayTpl","header","description","defaultAutocompleteConfig","emojis","issues","mergeRequests","epics","iterations","milestones","labels","snippets","vulnerabilities","contacts","wikis","GfmAutoComplete","constructor","dataSources","this","cachedData","isLoadingData","previousQuery","undefined","currentBackendFilterRequestController","setup","input","enableMap","$","setupLifecycle","_this","each","i","hasClass","off","setupAtWho","bind","dispatchEvent","Event","trigger","clearCache","setupEmoji","setupMembers","setupIssues","setupMilestones","setupMergeRequests","setupLabels","setupSnippets","setupContacts","setupWikis","searchKey","limit","skipSpecialCharacterTest","skipMarkdownCharacterTest","defaultLoadingData","value","cssClasses","isLoading","Loading","template","tpl","aliases","params","warning","push","_template","className","join","insertTpl","referencePrefix","match","exec","test","interpolate","suffix","callbacks","getDefaultCallbacks","beforeSave","commands","c","matcher","flag","subtext","setSubmitReviewStates","REVIEW_STATES","reviewed","__","approve","requested_changes","fetchData","Emoji","templateFunction","insertTemplateFunction","unicodeLetters","items","$inputor","sorter","setting","highlightFirst","alwaysHighlightFirst","instance","MEMBER_COMMAND","ASSIGN","UNASSIGN","ASSIGN_REVIEWER","UNASSIGN_REVIEWER","REASSIGN","CC","REQUEST_REVIEW","assignees","reviewers","command","tmpl","Members","availabilityStatus","isUserBusy","delay","DEFAULT_DEBOUNCE_AND_THROTTLE_MS","_SidebarMediator$sing","_state$issuable","subtextNodes","split","pop","regexSubtext","find","node","values","includes","SidebarMediator","singleton","store","state","issuable","nodes","defaultMatcher","app","controllers","sort","Issues","id","iid","reference","iconName","icon_name","Milestones","expired","parsedMilestones","m","dueDate","due_date","newDate","Date","now","getTime","mA","mB","merges","LABEL_COMMAND","LABEL","LABELS","UNLABEL","RELABEL","Labels","color","set","endsWith","lastCandidate","label","startsWith","fn","default","Wikis","beforeInsert","slug","substr","toLowerCase","email","Contacts","firstName","first_name","lastName","last_name","contact","self","isTypeWithBackendFiltering","withoutAt","substring","regex","_this2","dataSource","atTypeMap","_this$cachedData$at","loadData","abort","AbortController","axios","get","signal","then","catch","finally","loadEmojiData","AjaxCache","retrieve","loadSubcommands","some","glEmojiTag","updateDataSources","newDataSources","destroy","dataToInspect","loadingState","atSymbolsWithBar","atSymbolsWithoutBar","targetSubtext","resultantFlag","accentAChar","decodeURI","accentYChar","typesWithBackendFiltering","emoji","item","escapedFieldValue","fieldValue","slice","nameOrUsernameStartsWith","nameOrUsernameIncludes","lowercaseQuery","_sortBy","mappedIconName","ISSUABLE_EPIC","WORK_ITEMS_TYPE_MAP","WORK_ITEM_TYPE_ENUM_EPIC","sprintf","milestone","slugSpan","loadingSpinner","loadingIconForLegacyJS","inline","classes","semverRegex","noSpacesRegex","containsPotentialRegex","Q_ISSUE_SUB_COMMANDS","dev","transform","Q_MERGE_REQUEST_SUB_COMMANDS","fix","review","Q_MERGE_REQUEST_CAN_SUGGEST_SUB_COMMANDS","Iterations","GfmAutoCompleteEE","args","_defineProperty","defaultCallbacks","setupAutoCompleteEpics","setupAutoCompleteIterations","setupAutoCompleteVulnerabilities","super","MERGE_REQUEST_NOTEABLE_TYPE","canSuggest","getQSubCommands"],"mappings":"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","file":"5.54f14766.chunk.js","sourcesContent":["import { GlBadge } from '@gitlab/ui';\nimport $ from 'jquery';\nimport '~/lib/utils/jquery_at_who';\nimport { escape as lodashEscape, sortBy, template, escapeRegExp, memoize } from 'lodash';\nimport * as Emoji from '~/emoji';\nimport axios from '~/lib/utils/axios_utils';\nimport { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';\nimport { loadingIconForLegacyJS } from '~/loading_icon_for_legacy_js';\nimport { s__, __, sprintf } from '~/locale';\nimport { isUserBusy } from '~/set_status_modal/utils';\nimport SidebarMediator from '~/sidebar/sidebar_mediator';\nimport { state } from '~/sidebar/components/reviewers/sidebar_reviewers.vue';\nimport {\n ISSUABLE_EPIC,\n WORK_ITEMS_TYPE_MAP,\n WORK_ITEM_TYPE_ENUM_EPIC,\n} from '~/work_items/constants';\nimport AjaxCache from './lib/utils/ajax_cache';\nimport { spriteIcon } from './lib/utils/common_utils';\nimport { newDate } from './lib/utils/datetime_utility';\nimport { unicodeLetters } from './lib/utils/regexp';\nimport { renderVueComponentForLegacyJS } from './render_vue_component_for_legacy_js';\n\nconst USERS_ALIAS = 'users';\nconst ISSUES_ALIAS = 'issues';\nconst MILESTONES_ALIAS = 'milestones';\nconst MERGEREQUESTS_ALIAS = 'mergerequests';\nconst LABELS_ALIAS = 'labels';\nconst SNIPPETS_ALIAS = 'snippets';\nconst CONTACTS_ALIAS = 'contacts';\nconst WIKIS_ALIAS = 'wikis';\n\nconst CADENCE_REFERENCE_PREFIX = '[cadence:';\nconst ITERATION_REFERENCE_PREFIX = '*iteration:';\n\nexport const AT_WHO_ACTIVE_CLASS = 'at-who-active';\nexport const CONTACT_STATE_ACTIVE = 'active';\nexport const CONTACTS_ADD_COMMAND = '/add_contacts';\nexport const CONTACTS_REMOVE_COMMAND = '/remove_contacts';\n\nconst busyBadge = memoize(\n () =>\n renderVueComponentForLegacyJS(\n GlBadge,\n {\n class: 'gl-ml-2',\n props: {\n variant: 'warning',\n size: 'sm',\n },\n },\n s__('UserProfile|Busy'),\n ).outerHTML,\n);\n\n/**\n * Escapes user input before we pass it to at.js, which\n * renders it as HTML in the autocomplete dropdown.\n *\n * at.js allows you to reference data using `${}` syntax\n * (e.g. ${search}) which it replaces with the actual data\n * before rendering it in the autocomplete dropdown.\n * To prevent user input from executing this `${}` syntax,\n * we also need to escape the $ character.\n *\n * @param string user input\n * @return {string} escaped user input\n */\nexport function escape(string) {\n // To prevent double (or multiple) enconding attack\n // Decode the user input repeatedly prior to escaping the final decoded string.\n let encodedString = string;\n let decodedString = decodeURIComponent(encodedString);\n\n while (decodedString !== encodedString) {\n encodedString = decodeURIComponent(decodedString);\n decodedString = decodeURIComponent(encodedString);\n }\n\n return lodashEscape(decodedString.replace(/\\$/g, '$'));\n}\n\nexport function showAndHideHelper($input, alias = '') {\n $input.on(`hidden${alias ? '-' : ''}${alias}.atwho`, () => {\n $input.removeClass(AT_WHO_ACTIVE_CLASS);\n });\n $input.on(`shown${alias ? '-' : ''}${alias}.atwho`, () => {\n $input.addClass(AT_WHO_ACTIVE_CLASS);\n });\n}\n\n// This should be kept in sync with the backend filtering in\n// `User#gfm_autocomplete_search` and `Namespace#gfm_autocomplete_search`\nfunction createMemberSearchString(member) {\n return `${member.name.replace(/ /g, '')} ${member.username}`;\n}\n\nexport function membersBeforeSave(members) {\n return members.map((member) => {\n const GROUP_TYPE = 'Group';\n\n let title = '';\n if (member.username == null) {\n return member;\n }\n title = member.name;\n if (member.count && !member.mentionsDisabled) {\n title += ` (${member.count})`;\n }\n\n const autoCompleteAvatar = member.avatar_url || member.username.charAt(0).toUpperCase();\n\n const rectAvatarClass = member.type === GROUP_TYPE ? 'rect-avatar' : '';\n const imgAvatar = `\"${member.username}\"`;\n const txtAvatar = `
${autoCompleteAvatar}
`;\n const avatarIcon = member.mentionsDisabled\n ? spriteIcon('notifications-off', 's16 vertical-align-middle gl-ml-2')\n : '';\n\n return {\n username: member.username,\n avatarTag: autoCompleteAvatar.length === 1 ? txtAvatar : imgAvatar,\n title,\n search: createMemberSearchString(member),\n icon: avatarIcon,\n availability: member?.availability,\n };\n });\n}\n\nexport const highlighter = (li, query) => {\n // override default behaviour to escape dot character\n // see https://github.com/ichord/At.js/pull/576\n if (!query) {\n return li;\n }\n const escapedQuery = escapeRegExp(query);\n const regexp = new RegExp(`>\\\\s*([^<]*?)(${escapedQuery})([^<]*)\\\\s*<`, 'ig');\n // eslint-disable-next-line max-params\n return li.replace(regexp, (str, $1, $2, $3) => `> ${$1}${$2}${$3} <`);\n};\n\n/**\n * Sets up subommands for quickaction for the given\n * input with the provided command and the subcommand descriptions.\n *\n * @param {Object} $input input element\n * @param {string} cmd command that triggers subcommand selection\n * @param {Record} data object containing names of commands as keys with description and header as values\n *\n */\nexport const setupSubcommands = ($input, cmd, data) => {\n $input.filter('[data-supports-quick-actions=\"true\"]').atwho({\n // Always keep the trailing space otherwise the command won't display correctly\n at: `/${cmd} `,\n alias: cmd,\n data: Object.keys(data),\n maxLen: 100,\n displayTpl({ name }) {\n const { header, description } = data[name];\n\n return `
  • ${lodashEscape(header)}${lodashEscape(description)}
  • `;\n },\n });\n};\n\nexport const defaultAutocompleteConfig = {\n emojis: true,\n members: true,\n issues: true,\n mergeRequests: true,\n epics: true,\n iterations: true,\n milestones: true,\n labels: true,\n snippets: true,\n vulnerabilities: true,\n contacts: true,\n wikis: true,\n};\n\nclass GfmAutoComplete {\n constructor(dataSources = {}) {\n this.dataSources = dataSources;\n this.cachedData = {};\n this.isLoadingData = {};\n this.previousQuery = undefined;\n this.currentBackendFilterRequestController = null;\n }\n\n setup(input, enableMap = defaultAutocompleteConfig) {\n // Add GFM auto-completion to all input fields, that accept GFM input.\n this.input = input || $('.js-gfm-input');\n this.enableMap = enableMap;\n this.setupLifecycle();\n }\n\n setupLifecycle() {\n this.input.each((i, input) => {\n const $input = $(input);\n if (!$input.hasClass('js-gfm-input-initialized')) {\n // eslint-disable-next-line @gitlab/no-global-event-off\n $input.off('focus.setupAtWho').on('focus.setupAtWho', this.setupAtWho.bind(this, $input));\n $input.on('change.atwho', () => input.dispatchEvent(new Event('input')));\n // This triggers at.js again\n // Needed for quick actions with suffixes (ex: /label ~)\n $input.on('inserted-commands.atwho', $input.trigger.bind($input, 'keyup'));\n $input.on('clear-commands-cache.atwho', () => this.clearCache());\n $input.addClass('js-gfm-input-initialized');\n }\n });\n }\n\n setupAtWho($input) {\n if (this.enableMap.emojis) this.setupEmoji($input);\n if (this.enableMap.members) this.setupMembers($input);\n if (this.enableMap.issues) this.setupIssues($input);\n if (this.enableMap.milestones) this.setupMilestones($input);\n if (this.enableMap.mergeRequests) this.setupMergeRequests($input);\n if (this.enableMap.labels) this.setupLabels($input);\n if (this.enableMap.snippets) this.setupSnippets($input);\n if (this.enableMap.contacts) this.setupContacts($input);\n if (this.enableMap.wikis) this.setupWikis($input);\n\n $input.filter('[data-supports-quick-actions=\"true\"]').atwho({\n at: '/',\n alias: 'commands',\n searchKey: 'search',\n limit: 100,\n skipSpecialCharacterTest: true,\n skipMarkdownCharacterTest: true,\n data: GfmAutoComplete.defaultLoadingData,\n maxLen: 100,\n displayTpl(value) {\n const cssClasses = [];\n\n if (GfmAutoComplete.isLoading(value)) return GfmAutoComplete.Loading.template;\n // eslint-disable-next-line no-template-curly-in-string\n let tpl = '
  • \">/${name}';\n if (value.aliases.length > 0) {\n tpl += ' (or /<%- aliases.join(\", /\") %>)';\n }\n if (value.params.length > 0) {\n tpl += ' <%- params.join(\" \") %>';\n }\n if (value.warning && value.icon && value.icon === 'confidential') {\n tpl += `${spriteIcon(\n 'eye-slash',\n 's16 gl-mr-2',\n )}<%- warning %>`;\n } else if (value.warning) {\n tpl += '<%- warning %>';\n } else if (value.description !== '') {\n tpl += '<%- description %>';\n }\n tpl += '
  • ';\n\n if (value.warning) {\n cssClasses.push('has-warning');\n }\n\n return template(tpl)({\n ...value,\n className: cssClasses.join(' '),\n });\n },\n insertTpl(value) {\n // eslint-disable-next-line no-template-curly-in-string\n let tpl = '/${name} ';\n let referencePrefix = null;\n if (value.params.length > 0) {\n const regexp = /^\\[[a-z]+:/;\n const match = regexp.exec(value.params);\n if (match) {\n [referencePrefix] = match;\n\n // EE-ONLY; iteration quick action should autocomplete iteration reference only\n if (referencePrefix === CADENCE_REFERENCE_PREFIX)\n referencePrefix = ITERATION_REFERENCE_PREFIX;\n\n tpl += '<%- referencePrefix %>';\n } else {\n [[referencePrefix]] = value.params;\n if (/^[@%~]/.test(referencePrefix)) {\n tpl += '<%- referencePrefix %>';\n } else if (/^[*]/.test(referencePrefix)) {\n // EE-ONLY\n referencePrefix = ITERATION_REFERENCE_PREFIX;\n tpl += '<%- referencePrefix %>';\n }\n }\n }\n return template(tpl, { interpolate: /<%=([\\s\\S]+?)%>/g })({ referencePrefix });\n },\n suffix: '',\n callbacks: {\n ...this.getDefaultCallbacks(),\n beforeSave(commands) {\n if (GfmAutoComplete.isLoading(commands)) return commands;\n return $.map(commands, (c) => {\n let search = c.name;\n if (c.aliases.length > 0) {\n search = `${search} ${c.aliases.join(' ')}`;\n }\n return {\n name: c.name,\n aliases: c.aliases,\n params: c.params,\n description: c.description,\n warning: c.warning,\n icon: c.icon,\n search,\n };\n });\n },\n matcher(flag, subtext) {\n const regexp = /(?:^|\\n)\\/([A-Za-z_]*)$/gi;\n const match = regexp.exec(subtext);\n if (match) {\n return match[1];\n }\n return null;\n },\n },\n });\n }\n\n // eslint-disable-next-line class-methods-use-this\n setSubmitReviewStates($input) {\n const REVIEW_STATES = {\n reviewed: {\n header: __('Comment'),\n description: __('Submit general feedback without explicit approval.'),\n },\n approve: {\n header: __('Approve'),\n description: __('Submit feedback and approve these changes.'),\n },\n requested_changes: {\n header: __('Request changes'),\n description: __('Submit feedback that should be addressed before merging.'),\n },\n };\n\n setupSubcommands($input, 'submit_review', REVIEW_STATES);\n }\n\n setupEmoji($input) {\n const fetchData = this.fetchData.bind(this);\n\n // Emoji\n $input.atwho({\n at: ':',\n displayTpl: GfmAutoComplete.Emoji.templateFunction,\n insertTpl: GfmAutoComplete.Emoji.insertTemplateFunction,\n skipSpecialCharacterTest: true,\n data: GfmAutoComplete.defaultLoadingData,\n maxLen: 100,\n callbacks: {\n ...this.getDefaultCallbacks(),\n matcher(flag, subtext) {\n const regexp = new RegExp(`(?:[^${unicodeLetters}0-9:]|\\n|^):([^ :][^:]*)?$`, 'gi');\n const match = regexp.exec(subtext);\n\n if (match && match.length) {\n // Since we have \"?\" on the group, it's possible it is undefined\n return match[1] || '';\n }\n\n return null;\n },\n filter(query, items) {\n if (GfmAutoComplete.isLoading(items)) {\n fetchData(this.$inputor, this.at);\n return items;\n }\n\n return GfmAutoComplete.Emoji.filter(query);\n },\n sorter(query, items) {\n this.setting.highlightFirst = this.setting.alwaysHighlightFirst || query.length > 0;\n if (GfmAutoComplete.isLoading(items)) {\n this.setting.highlightFirst = false;\n return items;\n }\n\n if (query.length === 0) {\n return items;\n }\n\n return GfmAutoComplete.Emoji.sorter(items);\n },\n },\n });\n showAndHideHelper($input);\n }\n\n setupMembers($input) {\n const instance = this;\n const fetchData = this.fetchData.bind(this);\n const MEMBER_COMMAND = {\n ASSIGN: '/assign',\n UNASSIGN: '/unassign',\n ASSIGN_REVIEWER: '/assign_reviewer',\n UNASSIGN_REVIEWER: '/unassign_reviewer',\n REASSIGN: '/reassign',\n CC: '/cc',\n REQUEST_REVIEW: '/request_review',\n };\n let assignees = [];\n let reviewers = [];\n let command = '';\n\n // Team Members\n $input.atwho({\n at: '@',\n alias: USERS_ALIAS,\n maxLen: 100,\n displayTpl(value) {\n let tmpl = GfmAutoComplete.Loading.template;\n const { avatarTag, username, title, icon, availability } = value;\n if (username != null) {\n tmpl = GfmAutoComplete.Members.templateFunction({\n avatarTag,\n username,\n title,\n icon,\n availabilityStatus: availability && isUserBusy(availability) ? busyBadge() : '',\n });\n }\n return tmpl;\n },\n // eslint-disable-next-line no-template-curly-in-string\n insertTpl: '${atwho-at}${username}',\n limit: 10,\n delay: DEFAULT_DEBOUNCE_AND_THROTTLE_MS,\n searchKey: 'search',\n alwaysHighlightFirst: true,\n skipSpecialCharacterTest: true,\n data: GfmAutoComplete.defaultLoadingData,\n callbacks: {\n ...this.getDefaultCallbacks(),\n beforeSave: membersBeforeSave,\n matcher(flag, subtext) {\n const subtextNodes = subtext.split(/\\n+/g).pop().split(GfmAutoComplete.regexSubtext);\n\n // Check if @ is followed by '/assign', '/reassign', '/unassign' or '/cc' commands.\n command = subtextNodes.find((node) => {\n if (Object.values(MEMBER_COMMAND).includes(node)) {\n return node;\n }\n return null;\n });\n\n // Cache assignees & reviewers list for easier filtering later\n assignees =\n SidebarMediator.singleton?.store?.assignees?.map(createMemberSearchString) || [];\n reviewers = state.issuable?.reviewers?.nodes?.map(createMemberSearchString) || [];\n\n const match = GfmAutoComplete.defaultMatcher(flag, subtext, this.app.controllers);\n return match && match.length ? match[1] : null;\n },\n filter(query, data) {\n if (GfmAutoComplete.isLoading(data) || instance.previousQuery !== query) {\n instance.previousQuery = query;\n\n fetchData(this.$inputor, this.at, query);\n return data;\n }\n\n if (command === MEMBER_COMMAND.ASSIGN) {\n // Only include members which are not assigned to Issuable currently\n return data.filter((member) => !assignees.includes(member.search));\n }\n if (command === MEMBER_COMMAND.UNASSIGN) {\n // Only include members which are assigned to Issuable currently\n return data.filter((member) => assignees.includes(member.search));\n }\n if (command === MEMBER_COMMAND.ASSIGN_REVIEWER) {\n // Only include members which are not assigned as a reviewer to Issuable currently\n return data.filter((member) => !reviewers.includes(member.search));\n }\n if (command === MEMBER_COMMAND.UNASSIGN_REVIEWER) {\n // Only include members which are not assigned as a reviewer to Issuable currently\n return data.filter((member) => reviewers.includes(member.search));\n }\n\n return data;\n },\n sorter(query, items) {\n // Disable auto-selecting the loading icon\n this.setting.highlightFirst = this.setting.alwaysHighlightFirst;\n if (GfmAutoComplete.isLoading(items)) {\n this.setting.highlightFirst = false;\n return items;\n }\n\n if (!query) {\n return items;\n }\n\n return GfmAutoComplete.Members.sort(query, items);\n },\n },\n });\n showAndHideHelper($input, USERS_ALIAS);\n }\n\n setupIssues($input) {\n $input.atwho({\n at: '#',\n alias: ISSUES_ALIAS,\n searchKey: 'search',\n maxLen: 100,\n delay: DEFAULT_DEBOUNCE_AND_THROTTLE_MS,\n displayTpl(value) {\n let tmpl = GfmAutoComplete.Loading.template;\n if (value.title != null) {\n tmpl = GfmAutoComplete.Issues.templateFunction(value);\n }\n return tmpl;\n },\n data: GfmAutoComplete.defaultLoadingData,\n insertTpl: GfmAutoComplete.Issues.insertTemplateFunction,\n skipSpecialCharacterTest: true,\n callbacks: {\n ...this.getDefaultCallbacks(),\n beforeSave(issues) {\n return $.map(issues, (i) => {\n if (i.title == null) {\n return i;\n }\n return {\n id: i.iid,\n title: i.title,\n reference: i.reference,\n search: `${i.iid} ${i.title}`,\n iconName: i.icon_name,\n };\n });\n },\n },\n });\n showAndHideHelper($input, ISSUES_ALIAS);\n }\n\n setupMilestones($input) {\n $input.atwho({\n at: '%',\n alias: MILESTONES_ALIAS,\n searchKey: 'search',\n // eslint-disable-next-line no-template-curly-in-string\n insertTpl: '${atwho-at}${title}',\n maxLen: 100,\n displayTpl(value) {\n let tmpl = GfmAutoComplete.Loading.template;\n if (value.title != null) {\n tmpl = GfmAutoComplete.Milestones.templateFunction(value.title, value.expired);\n }\n return tmpl;\n },\n data: GfmAutoComplete.defaultLoadingData,\n callbacks: {\n ...this.getDefaultCallbacks(),\n beforeSave(milestones) {\n const parsedMilestones = $.map(milestones, (m) => {\n if (m.title == null) {\n return m;\n }\n\n const dueDate = m.due_date ? newDate(m.due_date) : null;\n const expired = dueDate ? Date.now() > dueDate.getTime() : false;\n\n return {\n id: m.iid,\n title: m.title,\n search: m.title,\n expired,\n dueDate,\n };\n });\n\n // Sort milestones by due date when present.\n if (typeof parsedMilestones[0] === 'object') {\n return parsedMilestones.sort((mA, mB) => {\n // Move all expired milestones to the bottom.\n if (mA.expired) return 1;\n if (mB.expired) return -1;\n\n // Move milestones without due dates just above expired milestones.\n if (!mA.dueDate) return 1;\n if (!mB.dueDate) return -1;\n\n // Sort by due date in ascending order.\n return mA.dueDate - mB.dueDate;\n });\n }\n return parsedMilestones;\n },\n },\n });\n showAndHideHelper($input, MILESTONES_ALIAS);\n }\n\n setupMergeRequests($input) {\n $input.atwho({\n at: '!',\n alias: MERGEREQUESTS_ALIAS,\n searchKey: 'search',\n maxLen: 100,\n displayTpl(value) {\n let tmpl = GfmAutoComplete.Loading.template;\n if (value.title != null) {\n tmpl = GfmAutoComplete.Issues.templateFunction(value);\n }\n return tmpl;\n },\n data: GfmAutoComplete.defaultLoadingData,\n insertTpl: GfmAutoComplete.Issues.insertTemplateFunction,\n skipSpecialCharacterTest: true,\n callbacks: {\n ...this.getDefaultCallbacks(),\n beforeSave(merges) {\n return $.map(merges, (m) => {\n if (m.title == null) {\n return m;\n }\n return {\n id: m.iid,\n title: m.title,\n reference: m.reference,\n search: `${m.iid} ${m.title}`,\n };\n });\n },\n },\n });\n showAndHideHelper($input, MERGEREQUESTS_ALIAS);\n }\n\n setupLabels($input) {\n const instance = this;\n const fetchData = this.fetchData.bind(this);\n const LABEL_COMMAND = {\n LABEL: '/label',\n LABELS: '/labels',\n UNLABEL: '/unlabel',\n RELABEL: '/relabel',\n };\n let command = '';\n\n $input.atwho({\n at: '~',\n alias: LABELS_ALIAS,\n searchKey: 'search',\n data: GfmAutoComplete.defaultLoadingData,\n maxLen: 100,\n displayTpl(value) {\n let tmpl = GfmAutoComplete.Labels.templateFunction(value.color, value.title);\n if (GfmAutoComplete.isLoading(value)) {\n tmpl = GfmAutoComplete.Loading.template;\n }\n return tmpl;\n },\n // eslint-disable-next-line no-template-curly-in-string\n insertTpl: '${atwho-at}${title}',\n limit: 20,\n callbacks: {\n ...this.getDefaultCallbacks(),\n beforeSave(merges) {\n if (GfmAutoComplete.isLoading(merges)) return merges;\n return $.map(merges, (m) => ({\n title: m.title,\n color: m.color,\n search: m.title,\n set: m.set,\n }));\n },\n matcher(flag, subtext) {\n const subtextNodes = subtext.split(/\\n+/g).pop().split(GfmAutoComplete.regexSubtext);\n\n // Check if ~ is followed by '/label', '/labels', '/relabel' or '/unlabel' commands.\n command = subtextNodes.find((node) => {\n if (Object.values(LABEL_COMMAND).includes(node)) {\n return node;\n }\n return null;\n });\n\n // If any label matches the inserted text after the last `~`, suggest those labels,\n // even if any spaces or funky characters were typed.\n // This allows matching labels like \"Accepting merge requests\".\n const labels = instance.cachedData[flag];\n if (labels) {\n if (!subtext.includes(flag)) {\n // Do not match if there is no `~` before the cursor\n return null;\n }\n if (subtext.endsWith('~~')) {\n // Do not match if there are two consecutive `~` characters (strikethrough) before the cursor\n return null;\n }\n const lastCandidate = subtext.split(flag).pop();\n if (labels.find((label) => label.title.startsWith(lastCandidate))) {\n return lastCandidate;\n }\n }\n\n const match = GfmAutoComplete.defaultMatcher(flag, subtext, this.app.controllers);\n return match && match.length ? match[1] : null;\n },\n filter(query, data, searchKey) {\n if (GfmAutoComplete.isLoading(data)) {\n fetchData(this.$inputor, this.at);\n return data;\n }\n\n if (data === GfmAutoComplete.defaultLoadingData) {\n return $.fn.atwho.default.callbacks.filter(query, data, searchKey);\n }\n\n // The `LABEL_COMMAND.RELABEL` is intentionally skipped\n // because we want to return all the labels (unfiltered) for that command.\n if (command === LABEL_COMMAND.LABEL || command === LABEL_COMMAND.LABELS) {\n // Return labels with set: undefined.\n return data.filter((label) => !label.set);\n }\n if (command === LABEL_COMMAND.UNLABEL) {\n // Return labels with set: true.\n return data.filter((label) => label.set);\n }\n\n return data;\n },\n },\n });\n showAndHideHelper($input, LABELS_ALIAS);\n }\n\n setupSnippets($input) {\n $input.atwho({\n at: '$',\n alias: SNIPPETS_ALIAS,\n searchKey: 'search',\n maxLen: 100,\n displayTpl(value) {\n let tmpl = GfmAutoComplete.Loading.template;\n if (value.title != null) {\n tmpl = GfmAutoComplete.Issues.templateFunction(value);\n }\n return tmpl;\n },\n data: GfmAutoComplete.defaultLoadingData,\n // eslint-disable-next-line no-template-curly-in-string\n insertTpl: '${atwho-at}${id}',\n callbacks: {\n ...this.getDefaultCallbacks(),\n beforeSave(snippets) {\n return $.map(snippets, (m) => {\n if (m.title == null) {\n return m;\n }\n return {\n id: m.id,\n title: m.title,\n search: `${m.id} ${m.title}`,\n };\n });\n },\n },\n });\n showAndHideHelper($input, SNIPPETS_ALIAS);\n }\n\n setupWikis($input) {\n $input.atwho({\n at: '[[',\n suffix: ']]',\n alias: WIKIS_ALIAS,\n searchKey: 'title',\n data: GfmAutoComplete.defaultLoadingData,\n displayTpl(value) {\n let tmpl = GfmAutoComplete.Loading.template;\n if (value.title != null) {\n tmpl = GfmAutoComplete.Wikis.templateFunction(value);\n }\n return tmpl;\n },\n // eslint-disable-next-line no-template-curly-in-string\n insertTpl: '${atwho-at}${title}|${slug}',\n callbacks: {\n ...this.getDefaultCallbacks(),\n beforeInsert(value) {\n const [title, slug] = value.substr(2).split('|');\n if (title.toLowerCase() === slug.toLowerCase()) {\n return `[[${slug}`;\n }\n return `[[${title}|${slug}`;\n },\n beforeSave(wikis) {\n return $.map(wikis, (m) => {\n if (m.title == null) {\n return m;\n }\n return {\n title: m.title,\n slug: m.slug,\n };\n });\n },\n },\n });\n showAndHideHelper($input, WIKIS_ALIAS);\n }\n\n setupContacts($input) {\n const fetchData = this.fetchData.bind(this);\n let command = '';\n\n $input.atwho({\n at: '[contact:',\n suffix: ']',\n alias: CONTACTS_ALIAS,\n searchKey: 'search',\n maxLen: 100,\n displayTpl(value) {\n let tmpl = GfmAutoComplete.Loading.template;\n if (value.email != null) {\n tmpl = GfmAutoComplete.Contacts.templateFunction(value);\n }\n return tmpl;\n },\n data: GfmAutoComplete.defaultLoadingData,\n // eslint-disable-next-line no-template-curly-in-string\n insertTpl: '${atwho-at}${email}',\n callbacks: {\n ...this.getDefaultCallbacks(),\n beforeSave(contacts) {\n return $.map(contacts, (m) => {\n if (m.email == null) {\n return m;\n }\n return {\n id: m.id,\n email: m.email,\n firstName: m.first_name,\n lastName: m.last_name,\n search: `${m.email}`,\n state: m.state,\n set: m.set,\n };\n });\n },\n matcher(flag, subtext) {\n const subtextNodes = subtext.split(/\\n+/g).pop().split(GfmAutoComplete.regexSubtext);\n\n command = subtextNodes.find((node) => {\n if (node === CONTACTS_ADD_COMMAND || node === CONTACTS_REMOVE_COMMAND) {\n return node;\n }\n return null;\n });\n\n const match = GfmAutoComplete.defaultMatcher(flag, subtext, this.app.controllers);\n return match?.length ? match[1] : null;\n },\n filter(query, data, searchKey) {\n if (GfmAutoComplete.isLoading(data)) {\n fetchData(this.$inputor, this.at);\n return data;\n }\n\n if (data === GfmAutoComplete.defaultLoadingData) {\n return $.fn.atwho.default.callbacks.filter(query, data, searchKey);\n }\n\n if (command === CONTACTS_ADD_COMMAND) {\n // Return contacts that are active and not already on the issue\n return data.filter((contact) => contact.state === CONTACT_STATE_ACTIVE && !contact.set);\n }\n if (command === CONTACTS_REMOVE_COMMAND) {\n // Return contacts already on the issue\n return data.filter((contact) => contact.set);\n }\n\n return data;\n },\n },\n });\n showAndHideHelper($input, CONTACTS_ALIAS);\n }\n\n getDefaultCallbacks() {\n const self = this;\n\n return {\n sorter(query, items, searchKey) {\n this.setting.highlightFirst = this.setting.alwaysHighlightFirst || query.length > 0;\n if (GfmAutoComplete.isLoading(items)) {\n this.setting.highlightFirst = false;\n return items;\n }\n return $.fn.atwho.default.callbacks.sorter(query, items, searchKey);\n },\n filter(query, data, searchKey) {\n if (GfmAutoComplete.isTypeWithBackendFiltering(this.at)) {\n if (GfmAutoComplete.isLoading(data) || self.previousQuery !== query) {\n self.previousQuery = query;\n self.fetchData(this.$inputor, this.at, query);\n return data;\n }\n }\n\n if (GfmAutoComplete.isLoading(data)) {\n self.fetchData(this.$inputor, this.at);\n return data;\n }\n\n return $.fn.atwho.default.callbacks.filter(query, data, searchKey);\n },\n beforeInsert(value) {\n let withoutAt = value.substring(1);\n const at = value.charAt();\n\n if (value && !this.setting.skipSpecialCharacterTest) {\n const regex = at === '~' ? /\\W|^\\d+$/ : /\\W/;\n if (withoutAt && regex.test(withoutAt)) {\n withoutAt = `\"${withoutAt}\"`;\n }\n }\n\n // We can ignore this for quick actions because they are processed\n // before Markdown.\n if (!this.setting.skipMarkdownCharacterTest) {\n withoutAt = withoutAt\n .replace(/(~~|`|\\*)/g, '\\\\$1')\n .replace(/(\\b)(_+)/g, '$1\\\\$2') // only escape underscores at the start\n .replace(/(_+)(\\b)/g, '\\\\$1$2'); // or end of words\n }\n\n return `${at}${withoutAt}`;\n },\n matcher(flag, subtext) {\n const match = GfmAutoComplete.defaultMatcher(flag, subtext, this.app.controllers);\n\n if (match) {\n return match[1];\n }\n return null;\n },\n highlighter,\n };\n }\n\n fetchData($input, at, search) {\n if (this.isLoadingData[at] && !GfmAutoComplete.isTypeWithBackendFiltering(at)) return;\n\n this.isLoadingData[at] = true;\n const dataSource = this.dataSources[GfmAutoComplete.atTypeMap[at]];\n\n if (GfmAutoComplete.isTypeWithBackendFiltering(at)) {\n if (this.cachedData[at]?.[search]) {\n this.loadData($input, at, this.cachedData[at][search], { search });\n } else {\n if (this.currentBackendFilterRequestController) {\n this.currentBackendFilterRequestController.abort();\n }\n\n this.currentBackendFilterRequestController = new AbortController();\n\n axios\n .get(dataSource, {\n params: { search },\n signal: this.currentBackendFilterRequestController.signal,\n })\n .then(({ data }) => {\n this.loadData($input, at, data, { search });\n })\n .catch(() => {\n this.isLoadingData[at] = false;\n })\n .finally(() => {\n this.currentBackendFilterRequestController = null;\n });\n }\n } else if (this.cachedData[at]) {\n this.loadData($input, at, this.cachedData[at]);\n } else if (GfmAutoComplete.atTypeMap[at] === 'emojis') {\n this.loadEmojiData($input, at).catch(() => {});\n } else if (dataSource) {\n AjaxCache.retrieve(dataSource, true)\n .then((data) => {\n this.loadSubcommands($input, data);\n this.loadData($input, at, data);\n })\n .catch(() => {\n this.isLoadingData[at] = false;\n });\n } else {\n this.isLoadingData[at] = false;\n }\n }\n\n loadSubcommands($input, data) {\n if (data.some((c) => c.name === 'submit_review')) {\n this.setSubmitReviewStates($input);\n }\n }\n\n // eslint-disable-next-line max-params\n loadData($input, at, data, { search } = {}) {\n this.isLoadingData[at] = false;\n\n if (search !== undefined) {\n if (this.cachedData[at] === undefined) {\n this.cachedData[at] = {};\n }\n\n this.cachedData[at][search] = data;\n } else {\n this.cachedData[at] = data;\n }\n\n $input.atwho('load', at, data);\n // This trigger at.js again\n // otherwise we would be stuck with loading until the user types\n return $input.trigger('keyup');\n }\n\n async loadEmojiData($input, at) {\n await Emoji.initEmojiMap();\n\n this.loadData($input, at, ['loaded']);\n\n GfmAutoComplete.glEmojiTag = Emoji.glEmojiTag;\n }\n\n updateDataSources(newDataSources) {\n this.dataSources = { ...this.dataSources, ...newDataSources };\n this.clearCache();\n }\n\n clearCache() {\n this.cachedData = {};\n }\n\n destroy() {\n this.input.each((i, input) => {\n const $input = $(input);\n $input.atwho('destroy');\n });\n }\n\n static isLoading(data) {\n let dataToInspect = data;\n if (data && data.length > 0) {\n [dataToInspect] = data;\n }\n\n const loadingState = GfmAutoComplete.defaultLoadingData[0];\n return dataToInspect && (dataToInspect === loadingState || dataToInspect.name === loadingState);\n }\n\n static defaultMatcher(flag, subtext, controllers) {\n // The below is taken from At.js source\n // Tweaked to commands to start without a space only if char before is a non-word character\n // https://github.com/ichord/At.js\n const atSymbolsWithBar = Object.keys(controllers)\n .join('|')\n .replace(/[$]/, '\\\\$&')\n .replace(/([[\\]:])/g, '\\\\$1')\n .replace(/([*])/g, '\\\\$1');\n\n const atSymbolsWithoutBar = Object.keys(controllers).join('');\n const targetSubtext = subtext.split(GfmAutoComplete.regexSubtext).pop();\n const resultantFlag = flag.replace(/[-[\\]/{}()*+?.\\\\^$|]/g, '\\\\$&');\n\n const accentAChar = decodeURI('%C3%80');\n const accentYChar = decodeURI('%C3%BF');\n\n // Holy regex, batman!\n const regexp = new RegExp(\n `^(?:\\\\B|[^a-zA-Z0-9_\\`${atSymbolsWithoutBar}]|\\\\s)${resultantFlag}(?!${atSymbolsWithBar})((?:[A-Za-z${accentAChar}-${accentYChar}0-9_'.+-:]|[^\\\\x00-\\\\x7a])*)$`,\n 'gi',\n );\n\n return regexp.exec(targetSubtext);\n }\n}\n\nGfmAutoComplete.regexSubtext = /\\s+/g;\n\nGfmAutoComplete.defaultLoadingData = ['loading'];\n\nGfmAutoComplete.atTypeMap = {\n ':': 'emojis',\n '@': 'members',\n '#': 'issues',\n '!': 'mergeRequests',\n '&': 'epics',\n '*iteration:': 'iterations',\n '~': 'labels',\n '%': 'milestones',\n '/': 'commands',\n '[vulnerability:': 'vulnerabilities',\n $: 'snippets',\n '[contact:': 'contacts',\n '[[': 'wikis',\n};\n\nGfmAutoComplete.typesWithBackendFiltering = ['vulnerabilities', 'members', 'issues'];\n\nGfmAutoComplete.isTypeWithBackendFiltering = (type) =>\n GfmAutoComplete.typesWithBackendFiltering.includes(GfmAutoComplete.atTypeMap[type]);\n\n// Emoji\nGfmAutoComplete.glEmojiTag = null;\nGfmAutoComplete.Emoji = {\n insertTemplateFunction(value) {\n return `:${value.emoji.name}:`;\n },\n templateFunction(item) {\n if (GfmAutoComplete.isLoading(item)) {\n return GfmAutoComplete.Loading.template;\n }\n\n const escapedFieldValue = escape(item.fieldValue);\n if (!GfmAutoComplete.glEmojiTag) {\n return `
  • ${escapedFieldValue}
  • `;\n }\n\n return `
  • ${GfmAutoComplete.glEmojiTag(item.emoji.name)} ${escapedFieldValue}
  • `;\n },\n filter(query) {\n if (query.length === 0) {\n return Emoji.getAllEmoji()\n .map((emoji) => ({\n emoji,\n fieldValue: emoji.name,\n }))\n .slice(0, 20);\n }\n\n return Emoji.searchEmoji(query);\n },\n sorter(items) {\n return items.sort(Emoji.sortEmoji);\n },\n};\n// Team Members\nGfmAutoComplete.Members = {\n templateFunction({ avatarTag, username, title, icon, availabilityStatus }) {\n return `
  • ${avatarTag} ${username} ${escape(\n title,\n )}${availabilityStatus} ${icon}
  • `;\n },\n nameOrUsernameStartsWith(member, query) {\n // `member.search` is a name:username string like `MargeSimpson msimpson`\n return member.search.split(' ').some((name) => name.toLowerCase().startsWith(query));\n },\n nameOrUsernameIncludes(member, query) {\n // `member.search` is a name:username string like `MargeSimpson msimpson`\n return member.search.toLowerCase().includes(query);\n },\n // This should be kept in sync with the backend sorting in\n // `User#gfm_autocomplete_search` and `Namespace#gfm_autocomplete_search`\n sort(query, members) {\n const lowercaseQuery = query.toLowerCase();\n const { nameOrUsernameStartsWith, nameOrUsernameIncludes } = GfmAutoComplete.Members;\n\n return sortBy(\n members.filter((member) => nameOrUsernameIncludes(member, lowercaseQuery)),\n (member) => (nameOrUsernameStartsWith(member, lowercaseQuery) ? -1 : 0),\n );\n },\n};\nGfmAutoComplete.Labels = {\n templateFunction(color, title) {\n return `
  • ${escape(title)}
  • `;\n },\n};\n// Issues, MergeRequests and Snippets\nGfmAutoComplete.Issues = {\n insertTemplateFunction(value) {\n // eslint-disable-next-line no-template-curly-in-string\n return value.reference || '${atwho-at}${id}';\n },\n templateFunction({ id, title, reference, iconName }) {\n const mappedIconName =\n iconName === ISSUABLE_EPIC ? WORK_ITEMS_TYPE_MAP[WORK_ITEM_TYPE_ENUM_EPIC].icon : iconName;\n const icon = mappedIconName\n ? spriteIcon(mappedIconName, 'gl-fill-icon-subtle s16 gl-mr-2')\n : '';\n return `
  • ${icon}${escape(reference || id)} ${escape(title)}
  • `;\n },\n};\n// Milestones\nGfmAutoComplete.Milestones = {\n templateFunction(title, expired) {\n if (expired) {\n return `
  • ${sprintf(__('%{milestone} (expired)'), {\n milestone: escape(title),\n })}
  • `;\n }\n return `
  • ${escape(title)}
  • `;\n },\n};\nGfmAutoComplete.Contacts = {\n templateFunction({ email, firstName, lastName }) {\n return `
  • ${escape(firstName)} ${escape(lastName)} ${escape(email)}
  • `;\n },\n};\nGfmAutoComplete.Wikis = {\n templateFunction({ title, slug }) {\n const icon = spriteIcon('document', 's16 vertical-align-middle gl-mr-2');\n const slugSpan =\n title.toLowerCase() !== slug.toLowerCase() ? ` (${escape(slug)})` : '';\n return `
  • ${icon} ${escape(title)} ${slugSpan}
  • `;\n },\n};\n\nconst loadingSpinner = loadingIconForLegacyJS({\n inline: true,\n classes: ['gl-mr-2'],\n}).outerHTML;\n\nGfmAutoComplete.Loading = {\n template: `
  • ${loadingSpinner}Loading...
  • `,\n};\n\nexport default GfmAutoComplete;\n","/**\n * Regexp utility for the convenience of working with regular expressions.\n */\n\n// Inspired by https://github.com/mishoo/UglifyJS/blob/2bc1d02363db3798d5df41fb5059a19edca9b7eb/lib/parse-js.js#L203\n// Unicode 6.1\nexport const unicodeLetters =\n '\\\\u0041-\\\\u005A\\\\u0061-\\\\u007A\\\\u00AA\\\\u00B5\\\\u00BA\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u0527\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0620-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0800-\\\\u0815\\\\u081A\\\\u0824\\\\u0828\\\\u0840-\\\\u0858\\\\u08A0\\\\u08A2-\\\\u08AC\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971-\\\\u0977\\\\u0979-\\\\u097F\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BD\\\\u09CE\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E1\\\\u09F0\\\\u09F1\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A72-\\\\u0A74\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABD\\\\u0AD0\\\\u0AE0\\\\u0AE1\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3D\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B61\\\\u0B71\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BD0\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C33\\\\u0C35-\\\\u0C39\\\\u0C3D\\\\u0C58\\\\u0C59\\\\u0C60\\\\u0C61\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBD\\\\u0CDE\\\\u0CE0\\\\u0CE1\\\\u0CF1\\\\u0CF2\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D\\\\u0D4E\\\\u0D60\\\\u0D61\\\\u0D7A-\\\\u0D7F\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0E01-\\\\u0E30\\\\u0E32\\\\u0E33\\\\u0E40-\\\\u0E46\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB0\\\\u0EB2\\\\u0EB3\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8C\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F0\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191C\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19C1-\\\\u19C7\\\\u1A00-\\\\u1A16\\\\u1A20-\\\\u1A54\\\\u1AA7\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1BBA-\\\\u1BE5\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\u1CE9-\\\\u1CEC\\\\u1CEE-\\\\u1CF1\\\\u1CF5\\\\u1CF6\\\\u1D00-\\\\u1DBF\\\\u1E00-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CEE\\\\u2CF2\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u3029\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA66E\\\\uA67F-\\\\uA697\\\\uA6A0-\\\\uA6EF\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA793\\\\uA7A0-\\\\uA7AA\\\\uA7F8-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA8F2-\\\\uA8F7\\\\uA8FB\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uA960-\\\\uA97C\\\\uA984-\\\\uA9B2\\\\uA9CF\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAA60-\\\\uAA76\\\\uAA7A\\\\uAA80-\\\\uAAAF\\\\uAAB1\\\\uAAB5\\\\uAAB6\\\\uAAB9-\\\\uAABD\\\\uAAC0\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEA\\\\uAAF2-\\\\uAAF4\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uABC0-\\\\uABE2\\\\uAC00-\\\\uD7A3\\\\uD7B0-\\\\uD7C6\\\\uD7CB-\\\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D\\\\uFB1F-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF21-\\\\uFF3A\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC';\n\nexport const semverRegex =\n /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\n\nexport const noSpacesRegex = /^\\S+$/;\n\n/**\n * Checks if a string contains potential regular expression elements.\n *\n * @param {string} str - The string to check for potential regex elements.\n * @returns {boolean} - Returns true if the string contains regex elements, otherwise false.\n */\n\nexport const containsPotentialRegex = (str) => {\n const regexPattern = /[*+?^${}()|[\\]\\\\]/;\n return regexPattern.test(str);\n};\n","import 'jquery';\nimport 'jquery.caret'; // required by at.js\nimport '@gitlab/at.js';\n","import $ from 'jquery';\nimport { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';\nimport '~/lib/utils/jquery_at_who';\nimport GfmAutoComplete, { showAndHideHelper, escape, setupSubcommands } from '~/gfm_auto_complete';\nimport { s__ } from '~/locale';\nimport { MERGE_REQUEST_NOTEABLE_TYPE } from '~/notes/constants';\n\n/**\n * This is added to keep the export parity with the CE counterpart.\n *\n * Some modules import `defaultAutocompleteConfig` or `membersBeforeSave`\n * which will be undefined if not exported from here in EE.\n */\nexport {\n escape,\n defaultAutocompleteConfig,\n membersBeforeSave,\n highlighter,\n CONTACT_STATE_ACTIVE,\n CONTACTS_ADD_COMMAND,\n CONTACTS_REMOVE_COMMAND,\n} from '~/gfm_auto_complete';\n\nconst EPICS_ALIAS = 'epics';\nconst ITERATIONS_ALIAS = 'iterations';\nconst VULNERABILITIES_ALIAS = 'vulnerabilities';\n\nexport const Q_ISSUE_SUB_COMMANDS = {\n dev: {\n header: s__('AmazonQ|dev'),\n description: s__('AmazonQ|Create a merge request to incorporate Amazon Q suggestions (Beta)'),\n },\n transform: {\n header: s__('AmazonQ|transform'),\n description: s__('AmazonQ|Upgrade Java Maven application to Java 17 (Beta)'),\n },\n};\n\nexport const Q_MERGE_REQUEST_SUB_COMMANDS = {\n dev: {\n header: s__('AmazonQ|dev'),\n description: s__('AmazonQ|Apply changes to this merge request based on the comments (Beta)'),\n },\n fix: {\n header: s__('AmazonQ|fix'),\n description: s__('AmazonQ|Create fixes for review findings (Beta)'),\n },\n review: {\n header: s__('AmazonQ|review'),\n description: s__('AmazonQ|Review merge request for code quality and security issues (Beta)'),\n },\n};\n\nexport const Q_MERGE_REQUEST_CAN_SUGGEST_SUB_COMMANDS = {\n test: {\n header: s__('AmazonQ|test'),\n description: s__(\n 'AmazonQ|Create unit tests for selected lines of code in Java or Python files (Beta)',\n ),\n },\n};\n\nconst getQSubCommands = ($input) => {\n if ($input.data('noteableType') === MERGE_REQUEST_NOTEABLE_TYPE) {\n const canSuggest = $input.data('canSuggest');\n\n return {\n ...Q_MERGE_REQUEST_SUB_COMMANDS,\n ...(canSuggest ? Q_MERGE_REQUEST_CAN_SUGGEST_SUB_COMMANDS : {}),\n };\n }\n\n return Q_ISSUE_SUB_COMMANDS;\n};\n\nGfmAutoComplete.Iterations = {\n templateFunction({ id, title }) {\n return `
  • *iteration:${id} ${escape(title)}
  • `;\n },\n};\n\nclass GfmAutoCompleteEE extends GfmAutoComplete {\n setupAtWho($input) {\n if (this.enableMap.epics) {\n this.setupAutoCompleteEpics($input, this.getDefaultCallbacks());\n }\n\n if (this.enableMap.iterations) {\n this.setupAutoCompleteIterations($input, this.getDefaultCallbacks());\n }\n\n if (this.enableMap.vulnerabilities) {\n this.setupAutoCompleteVulnerabilities($input, this.getDefaultCallbacks());\n }\n\n super.setupAtWho($input);\n }\n\n loadSubcommands($input, data) {\n if (data.some((c) => c.name === 'q')) {\n setupSubcommands($input, 'q', getQSubCommands($input));\n }\n\n super.loadSubcommands($input, data);\n }\n\n // eslint-disable-next-line class-methods-use-this\n setupAutoCompleteEpics = ($input, defaultCallbacks) => {\n $input.atwho({\n at: '&',\n alias: EPICS_ALIAS,\n searchKey: 'search',\n displayTpl(value) {\n let tmpl = GfmAutoComplete.Loading.template;\n if (value.title != null) {\n tmpl = GfmAutoComplete.Issues.templateFunction(value);\n }\n return tmpl;\n },\n data: GfmAutoComplete.defaultLoadingData,\n insertTpl: GfmAutoComplete.Issues.insertTemplateFunction,\n skipSpecialCharacterTest: true,\n callbacks: {\n ...defaultCallbacks,\n beforeSave(merges) {\n return $.map(merges, (m) => {\n if (m.title == null) {\n return m;\n }\n return {\n id: m.iid,\n reference: m.reference,\n title: m.title,\n search: `${m.iid} ${m.title}`,\n };\n });\n },\n },\n });\n showAndHideHelper($input, EPICS_ALIAS);\n };\n\n // eslint-disable-next-line class-methods-use-this\n setupAutoCompleteIterations = ($input, defaultCallbacks) => {\n $input.atwho({\n at: '*iteration:',\n alias: ITERATIONS_ALIAS,\n searchKey: 'search',\n displayTpl(value) {\n let tmpl = GfmAutoComplete.Loading.template;\n if (value.id != null) {\n tmpl = GfmAutoComplete.Iterations.templateFunction(value);\n }\n return tmpl;\n },\n data: GfmAutoComplete.defaultLoadingData,\n // eslint-disable-next-line no-template-curly-in-string\n insertTpl: '${atwho-at}${id}',\n skipSpecialCharacterTest: true,\n callbacks: {\n ...defaultCallbacks,\n beforeSave(merges) {\n return $.map(merges, (m) => {\n if (m.id == null) {\n return m;\n }\n\n return {\n id: m.id,\n title: m.title,\n search: `${m.id} ${m.title}`,\n };\n });\n },\n },\n });\n showAndHideHelper($input, ITERATIONS_ALIAS);\n };\n\n // eslint-disable-next-line class-methods-use-this\n setupAutoCompleteVulnerabilities = ($input, defaultCallbacks) => {\n $input.atwho({\n at: '[vulnerability:',\n suffix: ']',\n alias: VULNERABILITIES_ALIAS,\n delay: DEFAULT_DEBOUNCE_AND_THROTTLE_MS,\n searchKey: 'search',\n displayTpl(value) {\n let tmpl = GfmAutoComplete.Loading.template;\n if (value.title != null) {\n tmpl = GfmAutoComplete.Issues.templateFunction(value);\n }\n return tmpl;\n },\n data: GfmAutoComplete.defaultLoadingData,\n insertTpl: GfmAutoComplete.Issues.insertTemplateFunction,\n skipSpecialCharacterTest: true,\n callbacks: {\n ...defaultCallbacks,\n beforeSave(merges) {\n return merges.map((m) => {\n if (m.title == null) {\n return m;\n }\n return {\n id: m.id,\n title: m.title,\n reference: m.reference,\n search: `${m.id} ${m.title}`,\n };\n });\n },\n },\n });\n showAndHideHelper($input, VULNERABILITIES_ALIAS);\n };\n}\n\nexport default GfmAutoCompleteEE;\n"],"sourceRoot":""}