{"version":3,"sources":["webpack:////build/source/node_modules/lodash/zip.js","webpack:////build/source/node_modules/lodash/_baseClone.js","webpack:////build/source/node_modules/lodash/unzip.js","webpack:////build/source/node_modules/lodash/isSet.js","webpack:////build/source/node_modules/lodash/_initCloneByTag.js","webpack:////build/source/node_modules/lodash/_baseIsSet.js","webpack:////build/source/node_modules/lodash/_arrayIncludesWith.js","webpack:///./analytics/shared/constants.js","webpack:////build/source/node_modules/lodash/_baseAssign.js","webpack:////build/source/node_modules/lodash/_createSet.js","webpack:////build/source/node_modules/lodash/_cloneSymbol.js","webpack:///./vue_shared/components/filtered_search_bar/constants.js","webpack:////build/source/node_modules/lodash/_initCloneArray.js","webpack:////build/source/node_modules/lodash/_baseUniq.js","webpack:////build/source/node_modules/lodash/isMap.js","webpack:////build/source/node_modules/lodash/_copySymbols.js","webpack:////build/source/ee/app/assets/javascripts/analytics/shared/utils.js","webpack:///./analytics/shared/utils.js","webpack:////build/source/node_modules/lodash/cloneDeep.js","webpack:////build/source/node_modules/lodash/_copySymbolsIn.js","webpack:////build/source/node_modules/lodash/_cloneDataView.js","webpack:////build/source/node_modules/lodash/_baseAssignIn.js","webpack:////build/source/node_modules/lodash/uniqWith.js","webpack:////build/source/node_modules/lodash/_baseIsMap.js","webpack:////build/source/ee/app/assets/javascripts/analytics/shared/constants.js","webpack:////build/source/node_modules/lodash/_cloneRegExp.js"],"names":["zip","baseRest","module","exports","Stack","arrayEach","assignValue","baseAssign","baseAssignIn","cloneBuffer","copyArray","copySymbols","copySymbolsIn","getAllKeys","getAllKeysIn","getTag","initCloneArray","initCloneByTag","initCloneObject","isArray","isBuffer","isMap","isObject","isSet","keys","keysIn","cloneableTags","baseClone","value","bitmask","customizer","key","object","stack","result","isDeep","isFlat","isFull","undefined","isArr","tag","isFunc","stacked","get","set","forEach","subValue","add","props","arrayFilter","arrayMap","baseProperty","baseTimes","isArrayLikeObject","nativeMax","Math","max","array","length","group","index","baseIsSet","baseUnary","nodeUtil","nodeIsSet","cloneArrayBuffer","cloneDataView","cloneRegExp","cloneSymbol","cloneTypedArray","Ctor","constructor","isObjectLike","comparator","DATE_RANGE_LIMIT","PROJECTS_PER_PAGE","isoDate","masks","dateFormats","defaultDate","defaultDateTime","month","TODAY","getCurrentUtcDate","startOfToday","getStartOfDay","Date","utc","LAST_30_DAYS","nDaysBefore","lastXDays","__","lastWeek","nWeeksBefore","last90Days","last180Days","mrThroughputStartDate","formatDateParam","d","dateFormat","DATE_RANGE_CUSTOM_VALUE","DATE_RANGE_LAST_30_DAYS_VALUE","DEFAULT_DROPDOWN_DATE_RANGES","text","startDate","endDate","sprintf","days","MAX_DATE_RANGE_TEXT","maxDateRange","MAX_METRIC_PRECISION","UNITS","COUNT","DAYS","PER_DAY","PERCENT","NUMBER_OF_DAYS_SELECTED","numDays","n__","METRIC_POPOVER_LABEL","s__","ALL_METRICS_QUERY_TYPE","DORA_METRICS_QUERY_TYPE","FLOW_METRICS_QUERY_TYPE","FLOW_METRICS","LEAD_TIME","CYCLE_TIME","ISSUES","ISSUES_COMPLETED","COMMITS","DEPLOYS","MEDIAN_TIME_TO_MERGE","DORA_METRICS","DEPLOYMENT_FREQUENCY","LEAD_TIME_FOR_CHANGES","TIME_TO_RESTORE_SERVICE","CHANGE_FAILURE_RATE","VSA_METRICS_GROUPS","title","VULNERABILITY_METRICS","CRITICAL","HIGH","MERGE_REQUEST_METRICS","THROUGHPUT","CONTRIBUTOR_METRICS","AI_METRICS","CODE_SUGGESTIONS_USAGE_RATE","CODE_SUGGESTIONS_ACCEPTANCE_RATE","DUO_CHAT_USAGE_RATE","DUO_USAGE_RATE","VALUE_STREAM_METRIC_DISPLAY_UNITS","VALUE_STREAM_METRIC_TILE_METADATA","label","unit","description","groupLink","projectLink","docsLink","helpPagePath","anchor","VALUE_STREAM_METRIC_METADATA","USAGE_OVERVIEW_NO_DATA_ERROR","USAGE_OVERVIEW_DEFAULT_DATE_RANGE","nYearsBefore","USAGE_OVERVIEW_IDENTIFIER_GROUPS","USAGE_OVERVIEW_IDENTIFIER_PROJECTS","USAGE_OVERVIEW_IDENTIFIER_USERS","USAGE_OVERVIEW_IDENTIFIER_ISSUES","USAGE_OVERVIEW_IDENTIFIER_MERGE_REQUESTS","USAGE_OVERVIEW_IDENTIFIER_PIPELINES","USAGE_OVERVIEW_METADATA","options","titleIcon","USAGE_OVERVIEW_QUERY_INCLUDE_KEYS","copyObject","source","Set","noop","setToArray","createSet","values","Symbol","symbolProto","prototype","symbolValueOf","valueOf","symbol","Object","call","DEBOUNCE_DELAY","MAX_RECENT_TOKENS_SIZE","FILTER_NONE","FILTER_ANY","FILTER_CURRENT","FILTER_UPCOMING","FILTER_STARTED","FILTERS_NONE_ANY","OPERATOR_IS","OPERATOR_IS_TEXT","OPERATOR_NOT","OPERATOR_NOT_TEXT","OPERATOR_OR","OPERATOR_OR_TEXT","OPERATOR_AFTER","OPERATOR_AFTER_TEXT","OPERATOR_BEFORE","OPERATOR_BEFORE_TEXT","OPERATORS_IS","OPERATORS_NOT","OPERATORS_OR","OPERATORS_AFTER","OPERATORS_BEFORE","OPERATORS_IS_NOT","OPERATORS_IS_NOT_OR","OPERATORS_AFTER_BEFORE","OPERATORS_TO_GROUP","OPTION_NONE","OPTION_ANY","OPTION_CURRENT","OPTION_STARTED","OPTION_UPCOMING","OPTIONS_NONE_ANY","DEFAULT_MILESTONES","concat","SORT_DIRECTION","descending","ascending","FILTERED_SEARCH_TERM","TOKEN_EMPTY_SEARCH_TERM","type","data","TOKEN_TITLE_APPROVED_BY","TOKEN_TITLE_MERGE_USER","TOKEN_TITLE_APPROVER","TOKEN_TITLE_ASSIGNEE","TOKEN_TITLE_AUTHOR","TOKEN_TITLE_CONFIDENTIAL","TOKEN_TITLE_CONTACT","TOKEN_TITLE_DRAFT","TOKEN_TITLE_GROUP","TOKEN_TITLE_LABEL","TOKEN_TITLE_PROJECT","TOKEN_TITLE_MILESTONE","TOKEN_TITLE_MY_REACTION","TOKEN_TITLE_ORGANIZATION","TOKEN_TITLE_RELEASE","TOKEN_TITLE_REVIEWER","TOKEN_TITLE_SOURCE_BRANCH","TOKEN_TITLE_STATUS","TOKEN_TITLE_JOBS_RUNNER_TYPE","TOKEN_TITLE_TARGET_BRANCH","TOKEN_TITLE_TYPE","TOKEN_TITLE_VERSION","TOKEN_TITLE_SEARCH_WITHIN","TOKEN_TITLE_CREATED","TOKEN_TITLE_CLOSED","TOKEN_TITLE_DEPLOYED_BEFORE","TOKEN_TITLE_DEPLOYED_AFTER","TOKEN_TITLE_ASSIGNED_SEAT","TOKEN_TITLE_ENVIRONMENT","TOKEN_TYPE_APPROVER","TOKEN_TYPE_APPROVED_BY","TOKEN_TYPE_MERGE_USER","TOKEN_TYPE_ASSIGNEE","TOKEN_TYPE_AUTHOR","TOKEN_TYPE_CONFIDENTIAL","TOKEN_TYPE_CONTACT","TOKEN_TYPE_DRAFT","TOKEN_TYPE_GROUP","TOKEN_TYPE_GROUP_INVITE","TOKEN_TYPE_EPIC","TOKEN_TYPE_ASSIGNED_SEAT","TOKEN_TYPE_PROJECT","TOKEN_TYPE_HEALTH","TOKEN_TYPE_ITERATION","TOKEN_TYPE_LABEL","TOKEN_TYPE_MILESTONE","TOKEN_TYPE_MY_REACTION","TOKEN_TYPE_ORGANIZATION","TOKEN_TYPE_RELEASE","TOKEN_TYPE_REVIEWER","TOKEN_TYPE_SOURCE_BRANCH","TOKEN_TYPE_STATUS","TOKEN_TYPE_JOBS_RUNNER_TYPE","TOKEN_TYPE_TARGET_BRANCH","TOKEN_TYPE_TYPE","TOKEN_TYPE_VERSION","TOKEN_TYPE_WEIGHT","TOKEN_TYPE_SEARCH_WITHIN","TOKEN_TYPE_CREATED","TOKEN_TYPE_CLOSED","TOKEN_TYPE_DEPLOYED_BEFORE","TOKEN_TYPE_DEPLOYED_AFTER","TOKEN_TYPE_ENVIRONMENT","ENTITY_TYPES","USER","AUTHOR","GROUP","PROJECT","hasOwnProperty","input","SetCache","arrayIncludes","arrayIncludesWith","cacheHas","iteratee","includes","isCommon","seen","outer","computed","seenIndex","push","baseIsMap","nodeIsMap","getSymbols","formattedDate","buildValueStreamFromJson","valueStream","id","name","is_custom","isCustom","JSON","parse","buildDefaultStagesFromJSON","stages","buildGroupFromDataset","dataset","groupId","groupName","groupFullPath","groupAvatarUrl","groupParentId","Number","full_path","avatar_url","parent_id","buildProjectFromDataset","projectGid","projectName","projectPathWithNamespace","projectAvatarUrl","path_with_namespace","buildProjectsFromJSON","projects","map","fullPath","rest","buildCycleAnalyticsInitialData","projectId","createdBefore","createdAfter","groupPath","labelsPath","milestonesPath","defaultStages","stage","aggregationEnabled","aggregationLastRunAt","aggregationNextRunAt","namespaceName","namespaceRestApiRequestPath","namespaceType","namespacePath","canEdit","enableVsdLink","enableCustomizableStages","enableProjectsFilter","canReadCycleAnalytics","selectedValueStream","convertObjectPropsToCamelCase","newDate","selectedProjects","proj","defaultStageConfig","capitalizeFirstCharacter","aggregation","enabled","parseBoolean","lastRunAt","nextRunAt","features","extractVSAFeaturesFromGON","namespace","restApiRequestPath","path","parseInt","lerp","valueAtT0","valueAtT1","t","buildNullSeries","seriesData","nullSeriesTitle","seriesDataOptions","DEFAULT_SERIES_DATA_OPTIONS","nullSeriesOptions","DEFAULT_NULL_SERIES_OPTIONS","nonNullSeries","_cloneDeep","seriesGaps","currentGap","startIndex","previousValue","startValue","endIndex","endValue","nullSeriesData","date","gap","_gap$startIndex","_ref","_gap$startValue","_gap$endIndex","_ref2","_gap$endValue","i","_merge","pairDataAndLabels","datasetNames","datasets","axisLabels","datasetIndex","_zip","calculateRegression","slope","intercept","timeInMilliseconds","rounding","roundOffFloat","linearRegression","timeSeriesData","forecastAmount","x","element","getTime","y","avgX","reduce","prev","curr","xDifferencesToAverage","SSxx","avgY","yDifferencesToAverage","calculateSlopeAndInterceptFromDataset","lastDate","maxDays","futureDates","getDateInFuture","generateFutureDateRange","futureDate","filterBySearchTerm","searchTerm","filterByKey","filter","item","toLowerCase","toYmd","extractFilterQueryParameters","url","source_branch_name","selectedSourceBranch","target_branch_name","selectedTargetBranch","author_username","selectedAuthor","milestone_title","selectedMilestone","assignee_username","selectedAssigneeList","label_name","selectedLabelList","urlQueryToFilter","extractPaginationQueryParameters","sort","direction","page","getDataZoomOption","totalItems","maxItemsPerPage","dataZoom","bottom","start","intervalEnd","ceil","end","removeFlash","_document$querySelect","document","querySelector","click","formatAsPercentageWithoutSymbol","decimalValue","precision","isNaN","toFixed","secondsToDays","seconds","SECONDS_IN_DAY","scaledValueForDisplay","units","prepareMetricValue","identifier","rawMetricToMetricTile","metric","metricRest","metadataRest","generateValueStreamsDashboardLink","isProjectNamespace","formattedNamespacePath","segments","gon","relative_url_root","joinPaths","_gon","_gon2","_gon3","cycleAnalyticsForGroups","Boolean","licensed_features","cycleAnalyticsForProjects","groupLevelAnalyticsDashboard","extractQueryResponseFromNamespace","resultKey","project","CLONE_DEEP_FLAG","getSymbolsIn","dataView","buffer","byteOffset","byteLength","baseUniq","scatterChartLineProps","default","showSymbol","zlevel","DATA_REFETCH_DELAY","DEFAULT_DEBOUNCE_AND_THROTTLE_MS","BASE_SERIES_DATA_OPTIONS","showAllSymbol","symbolSize","lineStyle","color","DATA_VIZ_BLUE_500","itemStyle","areaStyle","opacity","BASE_NULL_SERIES_OPTIONS","GRAY_300","BASE_FORECAST_SERIES_OPTIONS","defaultAreaOpacity","GRAY_50","STACKED_AREA_CHART_SERIES_OPTIONS","STACKED_AREA_CHART_NULL_SERIES_OPTIONS","reFlags","regexp","exec","lastIndex"],"mappings":"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","file":"40.5860894a.chunk.js","sourcesContent":["var baseRest = require('./_baseRest'),\n unzip = require('./unzip');\n\n/**\n * Creates an array of grouped elements, the first of which contains the\n * first elements of the given arrays, the second of which contains the\n * second elements of the given arrays, and so on.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zip(['a', 'b'], [1, 2], [true, false]);\n * // => [['a', 1, true], ['b', 2, false]]\n */\nvar zip = baseRest(unzip);\n\nmodule.exports = zip;\n","var Stack = require('./_Stack'),\n arrayEach = require('./_arrayEach'),\n assignValue = require('./_assignValue'),\n baseAssign = require('./_baseAssign'),\n baseAssignIn = require('./_baseAssignIn'),\n cloneBuffer = require('./_cloneBuffer'),\n copyArray = require('./_copyArray'),\n copySymbols = require('./_copySymbols'),\n copySymbolsIn = require('./_copySymbolsIn'),\n getAllKeys = require('./_getAllKeys'),\n getAllKeysIn = require('./_getAllKeysIn'),\n getTag = require('./_getTag'),\n initCloneArray = require('./_initCloneArray'),\n initCloneByTag = require('./_initCloneByTag'),\n initCloneObject = require('./_initCloneObject'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isMap = require('./isMap'),\n isObject = require('./isObject'),\n isSet = require('./isSet'),\n keys = require('./keys'),\n keysIn = require('./keysIn');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (isSet(value)) {\n value.forEach(function(subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n } else if (isMap(value)) {\n value.forEach(function(subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n }\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n}\n\nmodule.exports = baseClone;\n","var arrayFilter = require('./_arrayFilter'),\n arrayMap = require('./_arrayMap'),\n baseProperty = require('./_baseProperty'),\n baseTimes = require('./_baseTimes'),\n isArrayLikeObject = require('./isArrayLikeObject');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * This method is like `_.zip` except that it accepts an array of grouped\n * elements and creates an array regrouping the elements to their pre-zip\n * configuration.\n *\n * @static\n * @memberOf _\n * @since 1.2.0\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n * // => [['a', 1, true], ['b', 2, false]]\n *\n * _.unzip(zipped);\n * // => [['a', 'b'], [1, 2], [true, false]]\n */\nfunction unzip(array) {\n if (!(array && array.length)) {\n return [];\n }\n var length = 0;\n array = arrayFilter(array, function(group) {\n if (isArrayLikeObject(group)) {\n length = nativeMax(group.length, length);\n return true;\n }\n });\n return baseTimes(length, function(index) {\n return arrayMap(array, baseProperty(index));\n });\n}\n\nmodule.exports = unzip;\n","var baseIsSet = require('./_baseIsSet'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nmodule.exports = isSet;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer'),\n cloneDataView = require('./_cloneDataView'),\n cloneRegExp = require('./_cloneRegExp'),\n cloneSymbol = require('./_cloneSymbol'),\n cloneTypedArray = require('./_cloneTypedArray');\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return new Ctor;\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return new Ctor;\n\n case symbolTag:\n return cloneSymbol(object);\n }\n}\n\nmodule.exports = initCloneByTag;\n","var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n}\n\nmodule.exports = baseIsSet;\n","/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arrayIncludesWith;\n","import dateFormat, { masks } from '~/lib/dateformat';\nimport {\n nDaysBefore,\n getStartOfDay,\n getCurrentUtcDate,\n nWeeksBefore,\n nYearsBefore,\n} from '~/lib/utils/datetime_utility';\nimport { s__, __, sprintf, n__ } from '~/locale';\nimport { helpPagePath } from '~/helpers/help_page_helper';\n\nexport const DATE_RANGE_LIMIT = 180;\nexport const PROJECTS_PER_PAGE = 50;\n\nconst { isoDate } = masks;\nexport const dateFormats = {\n isoDate,\n defaultDate: 'mmm dd, yyyy',\n defaultDateTime: 'mmm dd, yyyy h:MMtt',\n month: 'mmmm',\n};\n\nconst TODAY = getCurrentUtcDate();\nconst SAME_DAY_OFFSET = 1;\n\nconst startOfToday = getStartOfDay(new Date(), { utc: true });\n\nexport const LAST_30_DAYS = nDaysBefore(TODAY, 30 - SAME_DAY_OFFSET, { utc: true });\n\nconst lastXDays = __('Last %{days} days');\nconst lastWeek = nWeeksBefore(TODAY, 1, { utc: true });\nconst last90Days = nDaysBefore(TODAY, 90 - SAME_DAY_OFFSET, { utc: true });\nconst last180Days = nDaysBefore(TODAY, 180 - SAME_DAY_OFFSET, { utc: true });\nconst mrThroughputStartDate = nDaysBefore(startOfToday, DATE_RANGE_LIMIT, { utc: true });\nconst formatDateParam = (d) => dateFormat(d, dateFormats.isoDate, true);\n\nexport const DATE_RANGE_CUSTOM_VALUE = 'custom';\nexport const DATE_RANGE_LAST_30_DAYS_VALUE = 'last_30_days';\n\nexport const DEFAULT_DROPDOWN_DATE_RANGES = [\n {\n text: __('Last week'),\n value: 'last_week',\n startDate: lastWeek,\n endDate: TODAY,\n },\n {\n text: sprintf(lastXDays, { days: 30 }),\n value: DATE_RANGE_LAST_30_DAYS_VALUE,\n startDate: LAST_30_DAYS,\n endDate: TODAY,\n },\n {\n text: sprintf(lastXDays, { days: 90 }),\n value: 'last_90_days',\n startDate: last90Days,\n endDate: TODAY,\n },\n {\n text: sprintf(lastXDays, { days: 180 }),\n value: 'last_180_days',\n startDate: last180Days,\n endDate: TODAY,\n },\n];\n\nexport const MAX_DATE_RANGE_TEXT = (maxDateRange) => {\n return sprintf(\n __(\n 'Showing data for workflow items completed in this date range. Date range limited to %{maxDateRange} days.',\n ),\n {\n maxDateRange,\n },\n );\n};\n\n// Limits the number of decimals we round values to\nexport const MAX_METRIC_PRECISION = 4;\n\nexport const UNITS = {\n COUNT: 'COUNT',\n DAYS: 'DAYS',\n PER_DAY: 'PER_DAY',\n PERCENT: 'PERCENT',\n};\n\nexport const NUMBER_OF_DAYS_SELECTED = (numDays) => {\n return n__('1 day selected', '%d days selected', numDays);\n};\n\nexport const METRIC_POPOVER_LABEL = s__('ValueStreamAnalytics|View details');\n\nexport const ISSUES_COMPLETED_TYPE = 'issues_completed';\n\nexport const ALL_METRICS_QUERY_TYPE = 'ALL_METRICS_QUERY_TYPE';\nexport const DORA_METRICS_QUERY_TYPE = 'DORA_METRICS_QUERY_TYPE';\nexport const FLOW_METRICS_QUERY_TYPE = 'FLOW_METRICS_QUERY_TYPE';\n\nexport const FLOW_METRICS = {\n LEAD_TIME: 'lead_time',\n CYCLE_TIME: 'cycle_time',\n ISSUES: 'issues',\n ISSUES_COMPLETED: ISSUES_COMPLETED_TYPE,\n COMMITS: 'commits',\n DEPLOYS: 'deploys',\n MEDIAN_TIME_TO_MERGE: 'median_time_to_merge',\n};\n\nexport const DORA_METRICS = {\n DEPLOYMENT_FREQUENCY: 'deployment_frequency',\n LEAD_TIME_FOR_CHANGES: 'lead_time_for_changes',\n TIME_TO_RESTORE_SERVICE: 'time_to_restore_service',\n CHANGE_FAILURE_RATE: 'change_failure_rate',\n};\n\nexport const VSA_METRICS_GROUPS = [\n {\n key: 'lifecycle_metrics',\n title: s__('ValueStreamAnalytics|Lifecycle metrics'),\n keys: [\n FLOW_METRICS.LEAD_TIME,\n FLOW_METRICS.CYCLE_TIME,\n FLOW_METRICS.ISSUES,\n FLOW_METRICS.COMMITS,\n FLOW_METRICS.DEPLOYS,\n ],\n },\n];\n\nexport const VULNERABILITY_CRITICAL_TYPE = 'vulnerability_critical';\nexport const VULNERABILITY_HIGH_TYPE = 'vulnerability_high';\n\nexport const VULNERABILITY_METRICS = {\n CRITICAL: VULNERABILITY_CRITICAL_TYPE,\n HIGH: VULNERABILITY_HIGH_TYPE,\n};\n\nexport const MERGE_REQUEST_THROUGHPUT_TYPE = 'merge_request_throughput';\n\nexport const MERGE_REQUEST_METRICS = {\n THROUGHPUT: MERGE_REQUEST_THROUGHPUT_TYPE,\n};\n\nexport const CONTRIBUTOR_COUNT_TYPE = 'contributor_count';\n\nexport const CONTRIBUTOR_METRICS = {\n COUNT: CONTRIBUTOR_COUNT_TYPE,\n};\n\nexport const AI_METRICS = {\n CODE_SUGGESTIONS_USAGE_RATE: 'code_suggestions_usage_rate',\n CODE_SUGGESTIONS_ACCEPTANCE_RATE: 'code_suggestions_acceptance_rate',\n DUO_CHAT_USAGE_RATE: 'duo_chat_usage_rate',\n DUO_USAGE_RATE: 'duo_usage_rate',\n};\n\nexport const VALUE_STREAM_METRIC_DISPLAY_UNITS = {\n [UNITS.COUNT]: '',\n [UNITS.DAYS]: __('days'),\n [UNITS.PER_DAY]: __('/day'),\n [UNITS.PERCENT]: '%',\n};\n\n// NOTE: ideally we would return these fields in the metrics queries\n// the flow metrics query returns some but not all fields we need\n// while the DORA query do not return any.\nexport const VALUE_STREAM_METRIC_TILE_METADATA = {\n [DORA_METRICS.DEPLOYMENT_FREQUENCY]: {\n label: s__('DORA4Metrics|Deployment frequency'),\n unit: UNITS.PER_DAY,\n description: s__(\n 'ValueStreamAnalytics|Average number of deployments to production per day. This metric measures how often value is delivered to end users.',\n ),\n groupLink: '-/analytics/ci_cd?tab=deployment-frequency',\n projectLink: '-/pipelines/charts?chart=deployment-frequency',\n docsLink: helpPagePath('user/analytics/dora_metrics', { anchor: 'deployment-frequency' }),\n },\n [DORA_METRICS.LEAD_TIME_FOR_CHANGES]: {\n label: s__('DORA4Metrics|Lead time for changes'),\n unit: UNITS.DAYS,\n description: s__(\n 'ValueStreamAnalytics|The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines.',\n ),\n groupLink: '-/analytics/ci_cd?tab=lead-time',\n projectLink: '-/pipelines/charts?chart=lead-time',\n docsLink: helpPagePath('user/analytics/dora_metrics', { anchor: 'lead-time-for-changes' }),\n },\n [DORA_METRICS.TIME_TO_RESTORE_SERVICE]: {\n label: s__('DORA4Metrics|Time to restore service'),\n unit: UNITS.DAYS,\n description: s__(\n 'ValueStreamAnalytics|The time it takes an organization to recover from a failure in production.',\n ),\n groupLink: '-/analytics/ci_cd?tab=time-to-restore-service',\n projectLink: '-/pipelines/charts?chart=time-to-restore-service',\n docsLink: helpPagePath('user/analytics/dora_metrics', { anchor: 'time-to-restore-service' }),\n },\n [DORA_METRICS.CHANGE_FAILURE_RATE]: {\n label: s__('DORA4Metrics|Change failure rate'),\n description: s__(\n 'ValueStreamAnalytics|Percentage of deployments that cause an incident in production.',\n ),\n groupLink: '-/analytics/ci_cd?tab=change-failure-rate',\n projectLink: '-/pipelines/charts?chart=change-failure-rate',\n docsLink: helpPagePath('user/analytics/dora_metrics', { anchor: 'change-failure-rate' }),\n unit: UNITS.PERCENT,\n },\n [FLOW_METRICS.LEAD_TIME]: {\n label: s__('DORA4Metrics|Lead time'),\n description: s__('ValueStreamAnalytics|Median time from issue created to issue closed.'),\n groupLink: '-/analytics/value_stream_analytics',\n projectLink: '-/value_stream_analytics',\n docsLink: helpPagePath('user/group/value_stream_analytics/index', {\n anchor: 'lifecycle-metrics',\n }),\n unit: UNITS.DAYS,\n },\n [FLOW_METRICS.CYCLE_TIME]: {\n label: s__('DORA4Metrics|Cycle time'),\n description: s__(\n \"ValueStreamAnalytics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed.\",\n ),\n groupLink: '-/analytics/value_stream_analytics',\n projectLink: '-/value_stream_analytics',\n docsLink: helpPagePath('user/group/value_stream_analytics/index', {\n anchor: 'lifecycle-metrics',\n }),\n unit: UNITS.DAYS,\n },\n [FLOW_METRICS.ISSUES]: {\n label: s__('DORA4Metrics|New issues'),\n unit: UNITS.COUNT,\n description: s__('ValueStreamAnalytics|Number of new issues created.'),\n groupLink: '-/issues_analytics',\n projectLink: '-/analytics/issues_analytics',\n docsLink: helpPagePath('user/group/issues_analytics/index'),\n },\n [FLOW_METRICS.COMMITS]: {\n label: s__('DORA4Metrics|Commits'),\n unit: UNITS.COUNT,\n description: s__('ValueStreamAnalytics|Number of commits pushed to the default branch'),\n },\n [FLOW_METRICS.DEPLOYS]: {\n label: s__('DORA4Metrics|Deploys'),\n unit: UNITS.COUNT,\n description: s__('ValueStreamAnalytics|Total number of deploys to production.'),\n groupLink: '-/analytics/productivity_analytics',\n projectLink: '-/analytics/merge_request_analytics',\n docsLink: helpPagePath('user/analytics/merge_request_analytics'),\n },\n};\n\nexport const VALUE_STREAM_METRIC_METADATA = {\n ...VALUE_STREAM_METRIC_TILE_METADATA,\n [FLOW_METRICS.ISSUES_COMPLETED]: {\n description: s__('ValueStreamAnalytics|Number of issues closed by month.'),\n groupLink: '-/issues_analytics',\n projectLink: '-/analytics/issues_analytics',\n docsLink: helpPagePath('user/group/issues_analytics/index'),\n },\n [CONTRIBUTOR_METRICS.COUNT]: {\n description: s__(\n 'ValueStreamAnalytics|Number of monthly unique users with contributions in the group.',\n ),\n groupLink: '-/contribution_analytics',\n docsLink: helpPagePath('user/profile/contributions_calendar.html', {\n anchor: 'user-contribution-events',\n }),\n },\n [VULNERABILITY_METRICS.CRITICAL]: {\n description: s__(\n 'ValueStreamAnalytics|Number of critical vulnerabilities identified per month.',\n ),\n groupLink: '-/security/vulnerabilities?severity=CRITICAL',\n projectLink: '-/security/vulnerability_report?severity=CRITICAL',\n docsLink: helpPagePath('user/application_security/vulnerabilities/severities.html'),\n },\n [VULNERABILITY_METRICS.HIGH]: {\n description: s__('ValueStreamAnalytics|High vulnerabilities over time.'),\n groupLink: '-/security/vulnerabilities?severity=HIGH',\n projectLink: '-/security/vulnerability_report?severity=HIGH',\n docsLink: helpPagePath('user/application_security/vulnerabilities/severities.html'),\n },\n [MERGE_REQUEST_METRICS.THROUGHPUT]: {\n description: s__('ValueStreamAnalytics|Number of merge requests merged by month.'),\n groupLink: '-/analytics/productivity_analytics',\n projectLink: `-/analytics/merge_request_analytics?start_date=${formatDateParam(\n mrThroughputStartDate,\n )}&end_date=${formatDateParam(startOfToday)}`,\n docsLink: helpPagePath('user/analytics/merge_request_analytics', {\n anchor: 'view-the-number-of-merge-requests-in-a-date-range',\n }),\n },\n [FLOW_METRICS.MEDIAN_TIME_TO_MERGE]: {\n description: s__(\n 'ValueStreamAnalytics|Median time between merge request created and merge request merged.',\n ),\n groupLink: '-/analytics/productivity_analytics',\n projectLink: '-/analytics/merge_request_analytics',\n docsLink: helpPagePath('user/analytics/merge_request_analytics'),\n },\n [AI_METRICS.CODE_SUGGESTIONS_USAGE_RATE]: {\n description: s__(\n 'AiImpactAnalytics|Monthly user engagement with AI Code Suggestions. Percentage ratio calculated as monthly unique Code Suggestions users / total monthly unique code contributors.',\n ),\n groupLink: '',\n projectLink: '',\n docsLink: helpPagePath('user/project/repository/code_suggestions/index'),\n },\n};\n\nexport const USAGE_OVERVIEW_NO_DATA_ERROR = s__(\n 'ValueStreamAnalytics|Failed to load usage overview data',\n);\n\nexport const USAGE_OVERVIEW_DEFAULT_DATE_RANGE = {\n endDate: TODAY,\n startDate: nYearsBefore(TODAY, 1),\n};\n\nexport const USAGE_OVERVIEW_IDENTIFIER_GROUPS = 'groups';\nexport const USAGE_OVERVIEW_IDENTIFIER_PROJECTS = 'projects';\nexport const USAGE_OVERVIEW_IDENTIFIER_USERS = 'users';\nexport const USAGE_OVERVIEW_IDENTIFIER_ISSUES = 'issues';\nexport const USAGE_OVERVIEW_IDENTIFIER_MERGE_REQUESTS = 'merge_requests';\nexport const USAGE_OVERVIEW_IDENTIFIER_PIPELINES = 'pipelines';\n\n// Defines the constants used for querying the API as well as the order they appear\nexport const USAGE_OVERVIEW_METADATA = {\n [USAGE_OVERVIEW_IDENTIFIER_GROUPS]: { options: { title: __('Groups'), titleIcon: 'group' } },\n [USAGE_OVERVIEW_IDENTIFIER_PROJECTS]: {\n options: { title: __('Projects'), titleIcon: 'project' },\n },\n [USAGE_OVERVIEW_IDENTIFIER_USERS]: {\n options: { title: __('Users'), titleIcon: 'user' },\n },\n [USAGE_OVERVIEW_IDENTIFIER_ISSUES]: {\n options: { title: __('Issues'), titleIcon: 'issues' },\n },\n [USAGE_OVERVIEW_IDENTIFIER_MERGE_REQUESTS]: {\n options: { title: __('Merge requests'), titleIcon: 'merge-request' },\n },\n [USAGE_OVERVIEW_IDENTIFIER_PIPELINES]: {\n options: { title: __('Pipelines'), titleIcon: 'pipeline' },\n },\n};\n\nexport const USAGE_OVERVIEW_QUERY_INCLUDE_KEYS = {\n [USAGE_OVERVIEW_IDENTIFIER_GROUPS]: 'includeGroups',\n [USAGE_OVERVIEW_IDENTIFIER_PROJECTS]: 'includeProjects',\n [USAGE_OVERVIEW_IDENTIFIER_USERS]: 'includeUsers',\n [USAGE_OVERVIEW_IDENTIFIER_ISSUES]: 'includeIssues',\n [USAGE_OVERVIEW_IDENTIFIER_MERGE_REQUESTS]: 'includeMergeRequests',\n [USAGE_OVERVIEW_IDENTIFIER_PIPELINES]: 'includePipelines',\n};\n","var copyObject = require('./_copyObject'),\n keys = require('./keys');\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n}\n\nmodule.exports = baseAssign;\n","var Set = require('./_Set'),\n noop = require('./noop'),\n setToArray = require('./_setToArray');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n};\n\nmodule.exports = createSet;\n","var Symbol = require('./_Symbol');\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\nmodule.exports = cloneSymbol;\n","import { __, s__ } from '~/locale';\n\nexport const DEBOUNCE_DELAY = 500;\nexport const MAX_RECENT_TOKENS_SIZE = 3;\n\nexport const FILTER_NONE = 'None';\nexport const FILTER_ANY = 'Any';\nexport const FILTER_CURRENT = 'Current';\nexport const FILTER_UPCOMING = 'Upcoming';\nexport const FILTER_STARTED = 'Started';\n\nexport const FILTERS_NONE_ANY = [FILTER_NONE, FILTER_ANY];\n\nexport const OPERATOR_IS = '=';\nexport const OPERATOR_IS_TEXT = __('is');\nexport const OPERATOR_NOT = '!=';\nexport const OPERATOR_NOT_TEXT = __('is not one of');\nexport const OPERATOR_OR = '||';\nexport const OPERATOR_OR_TEXT = __('is one of');\nexport const OPERATOR_AFTER = '≥';\nexport const OPERATOR_AFTER_TEXT = __('on or after');\nexport const OPERATOR_BEFORE = '<';\nexport const OPERATOR_BEFORE_TEXT = __('before');\n\nexport const OPERATORS_IS = [{ value: OPERATOR_IS, description: OPERATOR_IS_TEXT }];\nexport const OPERATORS_NOT = [{ value: OPERATOR_NOT, description: OPERATOR_NOT_TEXT }];\nexport const OPERATORS_OR = [{ value: OPERATOR_OR, description: OPERATOR_OR_TEXT }];\nexport const OPERATORS_AFTER = [{ value: OPERATOR_AFTER, description: OPERATOR_AFTER_TEXT }];\nexport const OPERATORS_BEFORE = [{ value: OPERATOR_BEFORE, description: OPERATOR_BEFORE_TEXT }];\nexport const OPERATORS_IS_NOT = [...OPERATORS_IS, ...OPERATORS_NOT];\nexport const OPERATORS_IS_NOT_OR = [...OPERATORS_IS, ...OPERATORS_NOT, ...OPERATORS_OR];\nexport const OPERATORS_AFTER_BEFORE = [...OPERATORS_AFTER, ...OPERATORS_BEFORE];\n\nexport const OPERATORS_TO_GROUP = [OPERATOR_OR, OPERATOR_NOT];\n\nexport const OPTION_NONE = { value: FILTER_NONE, text: __('None'), title: __('None') };\nexport const OPTION_ANY = { value: FILTER_ANY, text: __('Any'), title: __('Any') };\nexport const OPTION_CURRENT = { value: FILTER_CURRENT, text: __('Current') };\nexport const OPTION_STARTED = { value: FILTER_STARTED, text: __('Started'), title: __('Started') };\nexport const OPTION_UPCOMING = {\n value: FILTER_UPCOMING,\n text: __('Upcoming'),\n title: __('Upcoming'),\n};\n\nexport const OPTIONS_NONE_ANY = [OPTION_NONE, OPTION_ANY];\n\nexport const DEFAULT_MILESTONES = OPTIONS_NONE_ANY.concat([OPTION_UPCOMING, OPTION_STARTED]);\n\nexport const SORT_DIRECTION = {\n descending: 'descending',\n ascending: 'ascending',\n};\n\nexport const FILTERED_SEARCH_TERM = 'filtered-search-term';\n\nexport const TOKEN_EMPTY_SEARCH_TERM = {\n type: FILTERED_SEARCH_TERM,\n value: {\n data: '',\n },\n};\n\nexport const TOKEN_TITLE_APPROVED_BY = __('Approved-By');\nexport const TOKEN_TITLE_MERGE_USER = __('Merged-By');\nexport const TOKEN_TITLE_APPROVER = __('Approver');\nexport const TOKEN_TITLE_ASSIGNEE = s__('SearchToken|Assignee');\nexport const TOKEN_TITLE_AUTHOR = __('Author');\nexport const TOKEN_TITLE_CONFIDENTIAL = __('Confidential');\nexport const TOKEN_TITLE_CONTACT = s__('Crm|Contact');\nexport const TOKEN_TITLE_DRAFT = s__('MergeRequests|Draft');\nexport const TOKEN_TITLE_GROUP = __('Group');\nexport const TOKEN_TITLE_GROUP_INVITE = __('Group invite');\nexport const TOKEN_TITLE_LABEL = __('Label');\nexport const TOKEN_TITLE_PROJECT = __('Project');\nexport const TOKEN_TITLE_MILESTONE = __('Milestone');\nexport const TOKEN_TITLE_MY_REACTION = __('My-Reaction');\nexport const TOKEN_TITLE_ORGANIZATION = s__('Crm|Organization');\nexport const TOKEN_TITLE_RELEASE = __('Release');\nexport const TOKEN_TITLE_REVIEWER = s__('SearchToken|Reviewer');\nexport const TOKEN_TITLE_SOURCE_BRANCH = __('Source Branch');\nexport const TOKEN_TITLE_STATUS = __('Status');\nexport const TOKEN_TITLE_JOBS_RUNNER_TYPE = s__('Job|Runner type');\nexport const TOKEN_TITLE_TARGET_BRANCH = __('Target Branch');\nexport const TOKEN_TITLE_TYPE = __('Type');\nexport const TOKEN_TITLE_VERSION = __('Version');\nexport const TOKEN_TITLE_SEARCH_WITHIN = __('Search Within');\nexport const TOKEN_TITLE_CREATED = __('Created date');\nexport const TOKEN_TITLE_CLOSED = __('Closed date');\nexport const TOKEN_TITLE_DEPLOYED_BEFORE = __('Deployed-before');\nexport const TOKEN_TITLE_DEPLOYED_AFTER = __('Deployed-after');\nexport const TOKEN_TITLE_ASSIGNED_SEAT = __('Assigned seat');\nexport const TOKEN_TITLE_ENVIRONMENT = __('Environment');\n\nexport const TOKEN_TYPE_APPROVER = 'approver';\nexport const TOKEN_TYPE_APPROVED_BY = 'approved-by';\nexport const TOKEN_TYPE_MERGE_USER = 'merge-user';\nexport const TOKEN_TYPE_ASSIGNEE = 'assignee';\nexport const TOKEN_TYPE_AUTHOR = 'author';\nexport const TOKEN_TYPE_CONFIDENTIAL = 'confidential';\nexport const TOKEN_TYPE_CONTACT = 'contact';\nexport const TOKEN_TYPE_DRAFT = 'draft';\nexport const TOKEN_TYPE_GROUP = 'group';\nexport const TOKEN_TYPE_GROUP_INVITE = 'group-invite';\nexport const TOKEN_TYPE_EPIC = 'epic';\nexport const TOKEN_TYPE_ASSIGNED_SEAT = 'assigned-seat';\n// As health status gets reused between issue lists and boards\n// this is in the shared constants. Until we have not decoupled the EE filtered search bar\n// from the CE component, we need to keep this in the CE code.\n// https://gitlab.com/gitlab-org/gitlab/-/issues/377838\nexport const TOKEN_TYPE_PROJECT = 'project';\nexport const TOKEN_TYPE_HEALTH = 'health';\nexport const TOKEN_TYPE_ITERATION = 'iteration';\nexport const TOKEN_TYPE_LABEL = 'label';\nexport const TOKEN_TYPE_MILESTONE = 'milestone';\nexport const TOKEN_TYPE_MY_REACTION = 'my-reaction';\nexport const TOKEN_TYPE_ORGANIZATION = 'organization';\nexport const TOKEN_TYPE_RELEASE = 'release';\nexport const TOKEN_TYPE_REVIEWER = 'reviewer';\nexport const TOKEN_TYPE_SOURCE_BRANCH = 'source-branch';\nexport const TOKEN_TYPE_STATUS = 'status';\nexport const TOKEN_TYPE_JOBS_RUNNER_TYPE = 'jobs-runner-type';\nexport const TOKEN_TYPE_TARGET_BRANCH = 'target-branch';\nexport const TOKEN_TYPE_TYPE = 'type';\nexport const TOKEN_TYPE_VERSION = 'version';\nexport const TOKEN_TYPE_WEIGHT = 'weight';\nexport const TOKEN_TYPE_SEARCH_WITHIN = 'in';\nexport const TOKEN_TYPE_CREATED = 'created';\nexport const TOKEN_TYPE_CLOSED = 'closed';\nexport const TOKEN_TYPE_DEPLOYED_BEFORE = 'deployed-before';\nexport const TOKEN_TYPE_DEPLOYED_AFTER = 'deployed-after';\nexport const TOKEN_TYPE_ENVIRONMENT = 'environment';\n\n// Due to the i18n eslint rule we can't have a capitalized string even if it is a case-aware URL param\n/* eslint-disable @gitlab/require-i18n-strings */\nexport const ENTITY_TYPES = {\n USER: 'User',\n AUTHOR: 'Author',\n GROUP: 'Group',\n PROJECT: 'Project',\n};\n/* eslint-enable @gitlab/require-i18n-strings */\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n}\n\nmodule.exports = initCloneArray;\n","var SetCache = require('./_SetCache'),\n arrayIncludes = require('./_arrayIncludes'),\n arrayIncludesWith = require('./_arrayIncludesWith'),\n cacheHas = require('./_cacheHas'),\n createSet = require('./_createSet'),\n setToArray = require('./_setToArray');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n}\n\nmodule.exports = baseUniq;\n","var baseIsMap = require('./_baseIsMap'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nmodule.exports = isMap;\n","var copyObject = require('./_copyObject'),\n getSymbols = require('./_getSymbols');\n\n/**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n}\n\nmodule.exports = copySymbols;\n","import { merge, cloneDeep, zip } from 'lodash';\nimport { dateFormats } from '~/analytics/shared/constants';\nimport { extractVSAFeaturesFromGON } from '~/analytics/shared/utils';\nimport dateFormat from '~/lib/dateformat';\nimport {\n convertObjectPropsToCamelCase,\n parseBoolean,\n roundOffFloat,\n} from '~/lib/utils/common_utils';\nimport { getDateInFuture, newDate } from '~/lib/utils/datetime/date_calculation_utility';\nimport { capitalizeFirstCharacter } from '~/lib/utils/text_utility';\nimport { DEFAULT_NULL_SERIES_OPTIONS, DEFAULT_SERIES_DATA_OPTIONS } from './constants';\n\nexport const formattedDate = (d) => dateFormat(d, dateFormats.defaultDate);\n\n/**\n * Creates a value stream object from a dataset. Returns null if no valueStreamId is present.\n *\n * @param {Object} dataset - The raw value stream object\n * @returns {Object} - A value stream object\n */\nexport const buildValueStreamFromJson = (valueStream) => {\n const { id, name, is_custom: isCustom } = valueStream ? JSON.parse(valueStream) : {};\n return id ? { id, name, isCustom } : null;\n};\n\n/**\n * Creates an array of stage objects from a json string. Returns an empty array if no stages are present.\n *\n * @param {String} stages - JSON encoded array of stages\n * @returns {Array} - An array of stage objects\n */\nconst buildDefaultStagesFromJSON = (stages = '') => {\n if (!stages.length) return [];\n return JSON.parse(stages);\n};\n\n/**\n * Creates a group object from a dataset. Returns null if no groupId is present.\n *\n * @param {Object} dataset - The container's dataset\n * @returns {Object} - A group object\n */\nexport const buildGroupFromDataset = (dataset) => {\n const { groupId, groupName, groupFullPath, groupAvatarUrl, groupParentId } = dataset;\n\n if (groupId) {\n return {\n id: Number(groupId),\n name: groupName,\n full_path: groupFullPath,\n avatar_url: groupAvatarUrl,\n parent_id: groupParentId,\n };\n }\n\n return null;\n};\n\n/**\n * Creates a project object from a dataset. Returns null if no projectId is present.\n *\n * @param {Object} dataset - The container's dataset\n * @returns {Object} - A project object\n */\nexport const buildProjectFromDataset = (dataset) => {\n const { projectGid, projectName, projectPathWithNamespace, projectAvatarUrl } = dataset;\n\n if (projectGid) {\n return {\n id: projectGid,\n name: projectName,\n path_with_namespace: projectPathWithNamespace,\n avatar_url: projectAvatarUrl,\n };\n }\n\n return null;\n};\n\n/**\n * Creates an array of project objects from a json string. Returns null if no projects are present.\n *\n * @param {String} data - JSON encoded array of projects\n * @returns {Array} - An array of project objects\n */\nconst buildProjectsFromJSON = (projects = '') => {\n if (!projects.length) return [];\n return JSON.parse(projects).map(({ path_with_namespace: fullPath, ...rest }) => ({\n ...rest,\n full_path: fullPath,\n }));\n};\n\n/**\n * Builds the initial data object for Value Stream Analytics with data loaded from the backend\n *\n * @param {Object} dataset - dataset object paseed to the frontend via data-* properties\n * @returns {Object} - The initial data to load the app with\n */\nexport const buildCycleAnalyticsInitialData = ({\n valueStream = null,\n projectId = null,\n groupId = null,\n createdBefore = null,\n createdAfter = null,\n projects = null,\n groupName = null,\n groupPath = null,\n groupFullPath = null,\n groupParentId = null,\n groupAvatarUrl = null,\n labelsPath = '',\n milestonesPath = '',\n defaultStages = null,\n stage = null,\n aggregationEnabled = false,\n aggregationLastRunAt = null,\n aggregationNextRunAt = null,\n namespaceName = null,\n namespaceRestApiRequestPath = null,\n namespaceType = null,\n namespacePath = null,\n canEdit = false,\n enableVsdLink = false,\n enableCustomizableStages = false,\n enableProjectsFilter = false,\n canReadCycleAnalytics = false,\n} = {}) => ({\n selectedValueStream: buildValueStreamFromJson(valueStream),\n group: groupId\n ? convertObjectPropsToCamelCase(\n buildGroupFromDataset({\n groupId,\n groupName,\n groupFullPath,\n groupPath,\n groupAvatarUrl,\n groupParentId,\n }),\n )\n : null,\n groupPath: groupPath || groupFullPath,\n createdBefore: createdBefore ? newDate(createdBefore) : null,\n createdAfter: createdAfter ? newDate(createdAfter) : null,\n selectedProjects: projects\n ? buildProjectsFromJSON(projects).map((proj) => ({\n ...convertObjectPropsToCamelCase(proj),\n fullPath: proj.path_with_namespace,\n }))\n : null,\n labelsPath,\n milestonesPath,\n defaultStageConfig: defaultStages\n ? buildDefaultStagesFromJSON(defaultStages).map(({ name, ...rest }) => ({\n ...convertObjectPropsToCamelCase(rest),\n name: capitalizeFirstCharacter(name),\n }))\n : [],\n stage: JSON.parse(stage),\n aggregation: {\n enabled: parseBoolean(aggregationEnabled),\n lastRunAt: aggregationLastRunAt,\n nextRunAt: aggregationNextRunAt,\n },\n features: extractVSAFeaturesFromGON(),\n namespace: {\n name: namespaceName,\n restApiRequestPath: namespaceRestApiRequestPath,\n type: namespaceType,\n path: namespacePath,\n },\n canEdit: parseBoolean(canEdit),\n enableVsdLink: parseBoolean(enableVsdLink),\n enableCustomizableStages: parseBoolean(enableCustomizableStages),\n enableProjectsFilter: parseBoolean(enableProjectsFilter),\n projectId: parseInt(projectId, 10),\n canReadCycleAnalytics: parseBoolean(canReadCycleAnalytics),\n});\n\n/**\n * Linearly interpolates between two values\n *\n * @param {Number} valueAtT0 The value at t = 0\n * @param {Number} valueAtT1 The value at t = 1\n * @param {Number} t The current value of t\n *\n * @returns {Number} The result of the linear interpolation.\n */\nconst lerp = (valueAtT0, valueAtT1, t) => {\n return valueAtT0 * (1 - t) + valueAtT1 * t;\n};\n\n/**\n * Builds a second series that visually represents the \"no data\" (i.e. \"null\")\n * data points, and returns a new series Array that includes both the \"null\"\n * and \"non-null\" data sets.\n * This function returns new series data and does not modify the original instance.\n *\n * @param {object} params - function arguments\n * @param {Array} params.seriesData The time series data that has already been processed\n * by the `apiDataToChartSeries` function.\n * @param {string} params.nullSeriesTitle Sets the title name for the null series\n * @param {object} params.seriesDataOptions Adds additional options for the series data\n * @param {object} params.nullSeriesOptions Adds additional options for the null data\n * @returns {Array} A new series Array\n */\nexport const buildNullSeries = ({\n seriesData,\n nullSeriesTitle,\n seriesDataOptions = DEFAULT_SERIES_DATA_OPTIONS,\n nullSeriesOptions = DEFAULT_NULL_SERIES_OPTIONS,\n}) => {\n const nonNullSeries = cloneDeep(seriesData[0]);\n // Loop through the series data and build a list of all the \"gaps\". A \"gap\" is\n // a section of the data set that only include `null` values. Each gap object\n // includes the start and end indices and the start and end values of the gap.\n const seriesGaps = [];\n let currentGap = null;\n nonNullSeries.data.forEach(([, value], index) => {\n if (value == null && currentGap == null) {\n currentGap = {};\n\n if (index > 0) {\n currentGap.startIndex = index - 1;\n const [, previousValue] = nonNullSeries.data[index - 1];\n currentGap.startValue = previousValue;\n }\n\n seriesGaps.push(currentGap);\n } else if (value != null && currentGap != null) {\n currentGap.endIndex = index;\n currentGap.endValue = value;\n currentGap = null;\n }\n });\n\n // Create a copy of the non-null series, but with all the data point values set to `null`\n const nullSeriesData = nonNullSeries.data.map(([date]) => [date, null]);\n\n // Render each of the gaps to the \"null\" series. Values are determined by linearly\n // interpolating between the start and end values.\n seriesGaps.forEach((gap) => {\n const startIndex = gap.startIndex ?? 0;\n const startValue = gap.startValue ?? gap.endValue ?? 0;\n const endIndex = gap.endIndex ?? nonNullSeries.data.length - 1;\n const endValue = gap.endValue ?? gap.startValue ?? 0;\n\n for (let i = startIndex; i <= endIndex; i += 1) {\n const t = (i - startIndex) / (endIndex - startIndex);\n nullSeriesData[i][1] = lerp(startValue, endValue, t);\n }\n });\n\n merge(nonNullSeries, seriesDataOptions);\n\n const nullSeries = {\n ...nullSeriesOptions,\n name: nullSeriesTitle,\n data: nullSeriesData,\n };\n\n return [nullSeries, nonNullSeries];\n};\n\n/**\n * Takes an ordered array of axisLabels and 1 or more datasets and creates\n * pairs, each pair consists of the axisLabel and the value from one or more datasets at\n * the current index.\n *\n * datasetName: 'Cool dataset'\n * axisLabels: ['label 1', 'label 2']\n * dataset: [10, 20]\n * returns [{ name: 'Cool dataset', data: [['label 1', 10], ['label 2', 20]]}]\n *\n * @param {object} params - function arguments\n * @param {Array} params.datasetNames - Name parameter for each dataset\n * @param {Array} params.datasets - Array of datasets\n * @param {Array} params.axisLabels - Array of axis labels to be applied to each point in each dataset\n * @returns {Array} Array of objects with the name and paired dataset\n */\nexport const pairDataAndLabels = ({ datasetNames, datasets = [], axisLabels }) => [\n ...datasets.map((dataset, datasetIndex) => ({\n name: datasetNames[datasetIndex],\n data: zip(axisLabels, dataset.data),\n })),\n];\n\n/**\n * This function takes a time series of data and computes a\n * slope and intercept to be used for linear regression over the dataset\n *\n * @param {Array} timeSeriesData - The historic time series data which will be used for the linear regression\n * @returns {Object} an object containing the `slope` and `intercept` values\n */\nexport const calculateSlopeAndInterceptFromDataset = (timeSeriesData) => {\n const x = timeSeriesData.map((element) => new Date(element.date).getTime());\n const y = timeSeriesData.map((element) => element.value);\n const sumX = x.reduce((prev, curr) => prev + curr, 0);\n const avgX = sumX / x.length;\n const xDifferencesToAverage = x.map((value) => avgX - value);\n const xDifferencesToAverageSquared = xDifferencesToAverage.map((value) => value ** 2);\n const SSxx = xDifferencesToAverageSquared.reduce((prev, curr) => prev + curr, 0);\n const sumY = y.reduce((prev, curr) => prev + curr, 0);\n const avgY = sumY / y.length;\n const yDifferencesToAverage = y.map((value) => avgY - value);\n const xAndYDifferencesMultiplied = xDifferencesToAverage.map(\n (curr, index) => curr * yDifferencesToAverage[index],\n );\n const SSxy = xAndYDifferencesMultiplied.reduce((prev, curr) => prev + curr, 0);\n const slope = SSxy / SSxx;\n const intercept = avgY - slope * avgX;\n\n return {\n slope,\n intercept,\n };\n};\n\n/**\n * This function generates a sequential array of dates in the future\n *\n * @param {Date} startDate - the date to start generating from\n * @param {Number} maxDays - the maximum number of days to calculate in the future\n * @returns {Array} an array of dates\n */\nexport const generateFutureDateRange = (startDate, maxDays) => {\n const futureDates = [];\n for (let i = 1; i <= maxDays; i += 1) {\n futureDates.push(getDateInFuture(startDate, i));\n }\n return futureDates;\n};\n\nconst calculateRegression = ({ slope, intercept, timeInMilliseconds, rounding }) => {\n return roundOffFloat(intercept + slope * timeInMilliseconds, rounding);\n};\n\n/**\n * This function accepts time series data and provides forecasted time series data\n * by applying a least squares linear regression\n *\n * Example input times series data format:\n *\n * [\n * {\"date\":\"2023-01-12\",\"value\":160},\n * {\"date\":\"2023-01-13\",\"value\":52},\n * {\"date\":\"2023-01-14\",\"value\":47},\n * {\"date\":\"2023-01-15\",\"value\":37},\n * {\"date\":\"2023-01-16\",\"value\":106},\n * ]\n *\n *\n * @param {Array} timeSeriesData - The historic time series data which will be used for the linear regression\n * @param {Number} forecastAmount - The number of days which should be forecasted\n * @param {Number} rounding - The number of decimal places to round to\n * @returns {Array} Array of objects with the same time series format, but future dates equal to the forecastAmount value\n */\nexport const linearRegression = (timeSeriesData, forecastAmount = 30, rounding = 0) => {\n if (!timeSeriesData.length) return [];\n\n const { slope, intercept } = calculateSlopeAndInterceptFromDataset(timeSeriesData);\n\n const { date: lastDate } = timeSeriesData[timeSeriesData.length - 1];\n const nextDate = new Date(lastDate);\n const futureDates = generateFutureDateRange(nextDate, forecastAmount);\n\n return futureDates.map((futureDate) => ({\n date: dateFormat(futureDate, dateFormats.isoDate),\n value: calculateRegression({\n timeInMilliseconds: futureDate.getTime(),\n intercept,\n slope,\n rounding,\n }),\n }));\n};\n","import { flatten } from 'lodash';\nimport dateFormat from '~/lib/dateformat';\nimport { SECONDS_IN_DAY } from '~/lib/utils/datetime_utility';\nimport { slugify } from '~/lib/utils/text_utility';\nimport { joinPaths } from '~/lib/utils/url_utility';\nimport { urlQueryToFilter } from '~/vue_shared/components/filtered_search_bar/filtered_search_utils';\nimport {\n dateFormats,\n FLOW_METRICS,\n MAX_METRIC_PRECISION,\n UNITS,\n VALUE_STREAM_METRIC_DISPLAY_UNITS,\n VALUE_STREAM_METRIC_TILE_METADATA,\n} from './constants';\n\nexport const filterBySearchTerm = (data = [], searchTerm = '', filterByKey = 'name') => {\n if (!searchTerm?.length) return data;\n return data.filter((item) => item[filterByKey].toLowerCase().includes(searchTerm.toLowerCase()));\n};\n\nexport const toYmd = (date) => dateFormat(date, dateFormats.isoDate);\n\n/**\n * Takes a url and extracts query parameters used for the shared\n * filter bar\n *\n * @param {string} url The URL to extract query parameters from\n * @returns {Object}\n */\nexport const extractFilterQueryParameters = (url = '') => {\n const {\n source_branch_name: selectedSourceBranch = null,\n target_branch_name: selectedTargetBranch = null,\n author_username: selectedAuthor = null,\n milestone_title: selectedMilestone = null,\n assignee_username: selectedAssigneeList = [],\n label_name: selectedLabelList = [],\n } = urlQueryToFilter(url);\n\n return {\n selectedSourceBranch,\n selectedTargetBranch,\n selectedAuthor,\n selectedMilestone,\n selectedAssigneeList,\n selectedLabelList,\n };\n};\n\n/**\n * Takes a url and extracts sorting and pagination query parameters into an object\n *\n * @param {string} url The URL to extract query parameters from\n * @returns {Object}\n */\nexport const extractPaginationQueryParameters = (url = '') => {\n const { sort, direction, page } = urlQueryToFilter(url);\n return {\n sort: sort?.value || null,\n direction: direction?.value || null,\n page: page?.value || null,\n };\n};\n\nexport const getDataZoomOption = ({\n totalItems = 0,\n maxItemsPerPage = 40,\n dataZoom = [{ type: 'slider', bottom: 10, start: 0 }],\n}) => {\n if (totalItems <= maxItemsPerPage) {\n return {};\n }\n\n const intervalEnd = Math.ceil((maxItemsPerPage / totalItems) * 100);\n\n return dataZoom.map((item) => {\n return {\n ...item,\n end: intervalEnd,\n };\n });\n};\n\nexport const removeFlash = (type = 'alert') => {\n // flash-warning don't have dismiss button.\n document.querySelector(`.flash-${type} .js-close`)?.click();\n};\n\n/**\n * Prepares metric data to be rendered in the metric_card component\n *\n * @param {MetricData[]} data - The metric data to be rendered\n * @param {Object} popoverContent - Key value pair of data to display in the popover\n * @returns {TransformedMetricData[]} An array of metrics ready to render in the metric_card\n */\nexport const prepareTimeMetricsData = (data = [], popoverContent = {}) =>\n data.map(({ title: label, identifier, ...rest }) => {\n const metricIdentifier = identifier || slugify(label);\n return {\n ...rest,\n label,\n identifier: metricIdentifier,\n description: popoverContent[metricIdentifier]?.description || '',\n };\n });\n\nconst requestData = ({ request, endpoint, requestPath, params, name }) => {\n return request({ endpoint, params, requestPath })\n .then(({ data }) => data)\n .catch(() => {\n throw new Error(name);\n });\n};\n\n/**\n * Takes a configuration array of metrics requests (key metrics and DORA) and returns\n * a flat array of all the responses. Different metrics are retrieved from different endpoints\n * additionally we only support certain metrics for FOSS users.\n *\n * @param {Array} requests - array of metric api requests to be made\n * @param {String} requestPath - path for the group / project we are requesting\n * @param {Object} params - optional parameters to filter, including `created_after` and `created_before` dates\n * @returns a flat array of metrics\n */\nexport const fetchMetricsData = (requests = [], requestPath, params) => {\n const promises = requests.map((r) => requestData({ ...r, requestPath, params }));\n return Promise.all(promises).then((responses) =>\n prepareTimeMetricsData(flatten(responses), VALUE_STREAM_METRIC_TILE_METADATA),\n );\n};\n\n/**\n * Formats any valid number as percentage\n *\n * @param {number|string} decimalValue Decimal value between 0 and 1 to be converted to a percentage\n * @param {number} precision The number of decimal places to round to\n *\n * @returns {string} Returns a formatted string multiplied by 100\n */\nexport const formatAsPercentageWithoutSymbol = (decimalValue = 0, precision = 1) => {\n const parsed = Number.isNaN(Number(decimalValue)) ? 0 : decimalValue;\n return (parsed * 100).toFixed(precision);\n};\n\n/**\n * Converts a time in seconds to number of days, with variable precision\n *\n * @param {Number} seconds Time in seconds\n * @param {Number} precision Specifies the number of digits after the decimal\n *\n * @returns {Float} The number of days\n */\nexport const secondsToDays = (seconds, precision = 1) =>\n (seconds / SECONDS_IN_DAY).toFixed(precision);\n\nexport const scaledValueForDisplay = (value, units, precision = MAX_METRIC_PRECISION) => {\n switch (units) {\n case UNITS.PERCENT:\n return formatAsPercentageWithoutSymbol(value);\n case UNITS.DAYS:\n return secondsToDays(value, precision);\n default:\n return value;\n }\n};\n\nconst prepareMetricValue = ({ identifier, value, unit }) => {\n // NOTE: the flow metrics graphql endpoint returns values already scaled for display\n if (!value) {\n // ensures we return `-` for 0/null etc\n return '-';\n }\n return Object.values(FLOW_METRICS).includes(identifier)\n ? value\n : scaledValueForDisplay(value, unit);\n};\n\n/**\n * Prepares metric data to be rendered in the metric_tile component\n *\n * @param {MetricData[]} data - The metric data to be rendered\n * @returns {TransformedMetricData[]} An array of metrics ready to render in the metric_tile\n */\nexport const rawMetricToMetricTile = (metric) => {\n const { identifier, value, ...metricRest } = metric;\n const { unit, label, ...metadataRest } = VALUE_STREAM_METRIC_TILE_METADATA[identifier];\n return {\n ...metadataRest,\n ...metricRest,\n title: label,\n identifier,\n label,\n unit: VALUE_STREAM_METRIC_DISPLAY_UNITS[unit],\n value: prepareMetricValue({ value, unit, identifier }),\n };\n};\n\n/**\n * Generates a URL link to the VSD dashboard based on the\n * namespace path passed into the method.\n *\n * @param {String} namespacePath - Path of the specified namespace\n * @param {Boolean} isProjectNamespace\n * @returns a URL or blank string if there is no namespacePath set\n */\nexport const generateValueStreamsDashboardLink = (\n namespacePath = null,\n isProjectNamespace = false,\n) => {\n if (!namespacePath) return '';\n\n const dashboardsSlug = '/-/analytics/dashboards/value_streams_dashboard';\n const formattedNamespacePath = isProjectNamespace ? namespacePath : `groups/${namespacePath}`;\n const segments = [gon.relative_url_root || '', '/', formattedNamespacePath, dashboardsSlug];\n\n return joinPaths(...segments);\n};\n\n/**\n * Extracts the relevant feature and license flags needed for VSA\n *\n * @param {Object} gon the global `window.gon` object populated when the page loads\n * @returns an object containing the extracted feature flags and their boolean status\n */\nexport const extractVSAFeaturesFromGON = () => ({\n // licensed feature toggles\n cycleAnalyticsForGroups: Boolean(gon?.licensed_features?.cycleAnalyticsForGroups),\n cycleAnalyticsForProjects: Boolean(gon?.licensed_features?.cycleAnalyticsForProjects),\n groupLevelAnalyticsDashboard: Boolean(gon?.licensed_features?.groupLevelAnalyticsDashboard),\n});\n\n/**\n * Takes a raw GraphQL response which could contain data for a group or project namespace,\n * and returns the data for the namespace which is present in the response.\n *\n * @param {Object} params\n * @param {string} params.resultKey - The data to be extracted from the namespace.\n * @param {Object} params.result\n * @param {Object} params.result.data\n * @param {Object} params.result.data.group - The group GraphQL response.\n * @param {Object} params.result.data.project - The project GraphQL response.\n * @returns {Object} The data extracted from either group[resultKey] or project[resultKey].\n */\nexport const extractQueryResponseFromNamespace = ({ result, resultKey }) => {\n const { group = null, project = null } = result.data;\n if (group || project) {\n const namespace = group ?? project;\n return namespace[resultKey] || {};\n }\n return {};\n};\n","var baseClone = require('./_baseClone');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\nfunction cloneDeep(value) {\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n}\n\nmodule.exports = cloneDeep;\n","var copyObject = require('./_copyObject'),\n getSymbolsIn = require('./_getSymbolsIn');\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n}\n\nmodule.exports = copySymbolsIn;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nmodule.exports = cloneDataView;\n","var copyObject = require('./_copyObject'),\n keysIn = require('./keysIn');\n\n/**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssignIn(object, source) {\n return object && copyObject(source, keysIn(source), object);\n}\n\nmodule.exports = baseAssignIn;\n","var baseUniq = require('./_baseUniq');\n\n/**\n * This method is like `_.uniq` except that it accepts `comparator` which\n * is invoked to compare elements of `array`. The order of result values is\n * determined by the order they occur in the array.The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.uniqWith(objects, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n */\nfunction uniqWith(array, comparator) {\n comparator = typeof comparator == 'function' ? comparator : undefined;\n return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n}\n\nmodule.exports = uniqWith;\n","var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nmodule.exports = baseIsMap;\n","import { DATA_VIZ_BLUE_500, GRAY_300, GRAY_50 } from '@gitlab/ui/src/tokens/build/js/tokens';\nimport { defaultAreaOpacity } from '@gitlab/ui/dist/utils/charts/config';\nimport { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';\n\nexport const scatterChartLineProps = {\n default: {\n type: 'line',\n showSymbol: false,\n // By default zlevel is 2 for all series types.\n // By increasing the zlevel to 3 we make sure that the trendline gets drawn in front of the dots in the chart.\n zlevel: 3,\n },\n};\n\nexport const DATA_REFETCH_DELAY = DEFAULT_DEBOUNCE_AND_THROTTLE_MS;\n\nexport const BASE_SERIES_DATA_OPTIONS = {\n showSymbol: true,\n showAllSymbol: true,\n symbolSize: 8,\n lineStyle: {\n color: DATA_VIZ_BLUE_500,\n },\n itemStyle: {\n color: DATA_VIZ_BLUE_500,\n },\n};\n\nexport const DEFAULT_SERIES_DATA_OPTIONS = {\n ...BASE_SERIES_DATA_OPTIONS,\n areaStyle: {\n opacity: 0,\n },\n};\n\nexport const BASE_NULL_SERIES_OPTIONS = {\n showSymbol: false,\n lineStyle: {\n type: 'dashed',\n color: GRAY_300,\n },\n itemStyle: {\n color: GRAY_300,\n },\n};\n\nexport const DEFAULT_NULL_SERIES_OPTIONS = {\n ...BASE_NULL_SERIES_OPTIONS,\n areaStyle: {\n color: 'none',\n },\n};\n\nexport const BASE_FORECAST_SERIES_OPTIONS = {\n lineStyle: { type: 'dashed', color: DATA_VIZ_BLUE_500 },\n areaStyle: { opacity: defaultAreaOpacity, color: GRAY_50 },\n};\n\nexport const STACKED_AREA_CHART_SERIES_OPTIONS = {\n stack: 'chart',\n};\n\nexport const STACKED_AREA_CHART_NULL_SERIES_OPTIONS = {\n stack: 'null',\n};\n","/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n}\n\nmodule.exports = cloneRegExp;\n"],"sourceRoot":""}