" \t// The module cache\n\tvar installedModules = {};\n\n\t// The require function\n\tfunction __webpack_require__(moduleId) {\n\n\t\t// Check if module is in cache\n\t\tif(installedModules[moduleId]) {\n\t\t\treturn installedModules[moduleId].exports;\n\t\t}\n\t\t// Create a new module (and put it into the cache)\n\t\tvar module = installedModules[moduleId] = {\n\t\t\ti: moduleId,\n\t\t\tl: false,\n\t\t\texports: {}\n\t\t};\n\n\t\t// Execute the module function\n\t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t\t// Flag the module as loaded\n\t\tmodule.l = true;\n\n\t\t// Return the exports of the module\n\t\treturn module.exports;\n\t}\n\n\n\t// expose the modules object (__webpack_modules__)\n\t__webpack_require__.m = modules;\n\n\t// expose the module cache\n\t__webpack_require__.c = installedModules;\n\n\t// define getter function for harmony exports\n\t__webpack_require__.d = function(exports, name, getter) {\n\t\tif(!__webpack_require__.o(exports, name)) {\n\t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n\t\t}\n\t};\n\n\t// define __esModule on exports\n\t__webpack_require__.r = function(exports) {\n\t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t\t}\n\t\tObject.defineProperty(exports, '__esModule', { value: true });\n\t};\n\n\t// create a fake namespace object\n\t// mode & 1: value is a module id, require it\n\t// mode & 2: merge all properties of value into the ns\n\t// mode & 4: return value when already ns object\n\t// mode & 8|1: behave like require\n\t__webpack_require__.t = function(value, mode) {\n\t\tif(mode & 1) value = __webpack_require__(value);\n\t\tif(mode & 8) return value;\n\t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n\t\tvar ns = Object.create(null);\n\t\t__webpack_require__.r(ns);\n\t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n\t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n\t\treturn ns;\n\t};\n\n\t// getDefaultExport function for compatibility with non-harmony modules\n\t__webpack_require__.n = function(module) {\n\t\tvar getter = module && module.__esModule ?\n\t\t\tfunction getDefault() { return module['default']; } :\n\t\t\tfunction getModuleExports() { return module; };\n\t\t__webpack_require__.d(getter, 'a', getter);\n\t\treturn getter;\n\t};\n\n\t// Object.prototype.hasOwnProperty.call\n\t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n\t// __webpack_public_path__\n\t__webpack_require__.p = \"/static/\";\n\n\n\t// Load entry module and return exports\n\treturn __webpack_require__(__webpack_require__.s = 240);\n",
"/**\n * Copyright (C) 2018-2020 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\nfunction genSwhLink(data, type) {\n if (type === 'display') {\n if (data && data.startsWith('swh')) {\n let browseUrl = Urls.browse_swh_id(data);\n return `<a href=\"${browseUrl}\">${data}</a>`;\n }\n }\n return data;\n}\n\nfunction filterDataWithExcludePattern(data, excludePattern) {\n /* Return true if the data is to be filtered, false otherwise.\n\n Args:\n data (dict): row dict data\n excludePattern (str): pattern to lookup in data columns\n\n Returns:\n true if the data is to be excluded (because it matches), false otherwise\n\n */\n if (excludePattern === '') {\n return false; // otherwise, everything gets excluded\n }\n for (const key in data) {\n let value = data[key];\n if ((typeof value === 'string' || value instanceof String) &&\n value.search(excludePattern) !== -1) {\n return true; // exclude the data from filtering\n }\n }\n return false;\n}\n\nexport function initDepositAdmin() {\n let depositsTable;\n $(document).ready(() => {\n $.fn.dataTable.ext.errMode = 'none';\n depositsTable = $('#swh-admin-deposit-list')\n .on('error.dt', (e, settings, techNote, message) => {\n $('#swh-admin-deposit-list-error').text(message);\n })\n .DataTable({\n serverSide: true,\n processing: true,\n // let's define the order of table options display\n // f: (f)ilter\n // l: (l)ength changing\n // r: p(r)ocessing\n // t: (t)able\n // i: (i)nfo\n // p: (p)agination\n // see https://datatables.net/examples/basic_init/dom.html\n dom: '<<f<\"#list-exclude\">l>rt<\"bottom\"ip>>',\n // div#list-exclude is a custom filter added next to dataTable\n // initialization below through js dom manipulation, see\n // https://datatables.net/examples/advanced_init/dom_toolbar.html\n ajax: {\n url: Urls.admin_deposit_list(),\n // filtering data set depending on the exclude search input\n dataFilter: function(dataResponse) {\n /* Filter out data returned by the server to exclude entries\n matching the exclude pattern.\n\n Args\n dataResponse (str): the json response in string\n\n Returns:\n json response altered (in string)\n */\n //\n let data = jQuery.parseJSON(dataResponse);\n let excludePattern = $('#swh-admin-deposit-list-exclude-filter').val();\n let recordsFiltered = 0;\n let filteredData = [];\n for (const row of data.data) {\n if (filterDataWithExcludePattern(row, excludePattern)) {\n recordsFiltered += 1;\n } else {\n filteredData.push(row);\n }\n }\n // update data values\n data['recordsFiltered'] = recordsFiltered;\n data['data'] = filteredData;\n return JSON.stringify(data);\n }\n },\n columns: [\n {\n data: 'id',\n name: 'id'\n },\n {\n data: 'swh_id_context',\n name: 'swh_id_context',\n render: (data, type, row) => {\n if (data && type === 'display') {\n let originPattern = ';origin=';\n let originPatternIdx = data.indexOf(originPattern);\n if (originPatternIdx !== -1) {\n let originUrl = data.slice(originPatternIdx + originPattern.length);\n let nextSepPattern = ';';\n let nextSepPatternIdx = originUrl.indexOf(nextSepPattern);\n if (nextSepPatternIdx !== -1) { /* Remove extra context */\n originUrl = originUrl.slice(0, nextSepPatternIdx);\n }\n return `<a href=\"${originUrl}\">${originUrl}</a>`;\n }\n }\n return data;\n }\n },\n {\n data: 'reception_date',\n name: 'reception_date',\n render: (data, type, row) => {\n if (type === 'display') {\n let date = new Date(data);\n return date.toLocaleString();\n }\n return data;\n }\n },\n {\n data: 'status',\n name: 'status'\n },\n {\n data: 'status_detail',\n name: 'status_detail',\n render: (data, type, row) => {\n if (type === 'display' && data) {\n let text = data;\n if (typeof data === 'object') {\n text = JSON.stringify(data, null, 4);\n }\n return `<div style=\"width: 200px; white-space: pre; overflow-x: auto;\">${text}</div>`;\n }\n return data;\n },\n orderable: false,\n visible: false\n },\n {\n data: 'swh_id',\n name: 'swh_id',\n render: (data, type, row) => {\n return genSwhLink(data, type);\n },\n orderable: false,\n visible: false\n },\n {\n data: 'swh_id_context',\n name: 'swh_id_context',\n render: (data, type, row) => {\n return genSwhLink(data, type);\n },\n orderable: false,\n visible: false\n }\n ],\n scrollX: true,\n scrollY: '50vh',\n scrollCollapse: true,\n order: [[0, 'desc']]\n });\n\n // Some more customization is needed on the table\n $('div#list-exclude').html(`<div id=\"swh-admin-deposit-list-exclude-wrapper\">\n <div id=\"swh-admin-deposit-list-exclude-div-wrapper\" class=\"dataTables_filter\">\n <label>\n Exclude:<input id=\"swh-admin-deposit-list-exclude-filter\"\n type=\"search\"\n value=\"check-deposit\"\n class=\"form-control form-control-sm\"\n placeholder=\"exclude-pattern\" aria-controls=\"swh-admin-deposit-list\">\n </input>\n </label>\n </div>\n </div>\n`);\n // Adding exclusion pattern update behavior, when typing, update search\n $('#swh-admin-deposit-list-exclude-filter').keyup(function() {\n depositsTable.draw();\n });\n // at last draw the table\n depositsTable.draw();\n });\n\n $('a.toggle-col').on('click', function(e) {\n e.preventDefault();\n var column = depositsTable.column($(this).attr('data-column'));\n column.visible(!column.visible());\n if (column.visible()) {\n $(this).removeClass('col-hidden');\n } else {\n $(this).addClass('col-hidden');\n }\n });\n\n}\n",
"/**\n * Copyright (C) 2018-2020 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\nimport {handleFetchError, csrfPost, htmlAlert} from 'utils/functions';\nimport {swhSpinnerSrc} from 'utils/constants';\n\nlet authorizedOriginTable;\nlet unauthorizedOriginTable;\nlet pendingSaveRequestsTable;\nlet acceptedSaveRequestsTable;\nlet rejectedSaveRequestsTable;\n\nfunction enableRowSelection(tableSel) {\n $(`${tableSel} tbody`).on('click', 'tr', function() {\n if ($(this).hasClass('selected')) {\n $(this).removeClass('selected');\n $(tableSel).closest('.tab-pane').find('.swh-action-need-selection').prop('disabled', true);\n } else {\n $(`${tableSel} tr.selected`).removeClass('selected');\n $(this).addClass('selected');\n $(tableSel).closest('.tab-pane').find('.swh-action-need-selection').prop('disabled', false);\n }\n });\n}\n\nexport function initOriginSaveAdmin() {\n $(document).ready(() => {\n\n $.fn.dataTable.ext.errMode = 'throw';\n\n authorizedOriginTable = $('#swh-authorized-origin-urls').DataTable({\n serverSide: true,\n ajax: Urls.admin_origin_save_authorized_urls_list(),\n columns: [{data: 'url', name: 'url'}],\n scrollY: '50vh',\n scrollCollapse: true,\n info: false\n });\n enableRowSelection('#swh-authorized-origin-urls');\n swh.webapp.addJumpToPagePopoverToDataTable(authorizedOriginTable);\n\n unauthorizedOriginTable = $('#swh-unauthorized-origin-urls').DataTable({\n serverSide: true,\n ajax: Urls.admin_origin_save_unauthorized_urls_list(),\n columns: [{data: 'url', name: 'url'}],\n scrollY: '50vh',\n scrollCollapse: true,\n info: false\n });\n enableRowSelection('#swh-unauthorized-origin-urls');\n swh.webapp.addJumpToPagePopoverToDataTable(unauthorizedOriginTable);\n\n let columnsData = [\n {\n data: 'id',\n name: 'id',\n visible: false,\n searchable: false\n },\n {\n data: 'save_request_date',\n name: 'request_date',\n render: (data, type, row) => {\n if (type === 'display') {\n let date = new Date(data);\n return date.toLocaleString();\n }\n return data;\n }\n },\n {\n data: 'visit_type',\n name: 'visit_type'\n },\n {\n data: 'origin_url',\n name: 'origin_url',\n render: (data, type, row) => {\n if (type === 'display') {\n const sanitizedURL = $.fn.dataTable.render.text().display(data);\n return `<a href=\"${sanitizedURL}\">${sanitizedURL}</a>`;\n }\n return data;\n }\n }\n ];\n\n pendingSaveRequestsTable = $('#swh-origin-save-pending-requests').DataTable({\n serverSide: true,\n processing: true,\n language: {\n processing: `<img src=\"${swhSpinnerSrc}\"></img>`\n },\n ajax: Urls.origin_save_requests_list('pending'),\n searchDelay: 1000,\n columns: columnsData,\n scrollY: '50vh',\n scrollCollapse: true,\n order: [[0, 'desc']],\n responsive: {\n details: {\n type: 'none'\n }\n }\n });\n enableRowSelection('#swh-origin-save-pending-requests');\n swh.webapp.addJumpToPagePopoverToDataTable(pendingSaveRequestsTable);\n\n rejectedSaveRequestsTable = $('#swh-origin-save-rejected-requests').DataTable({\n serverSide: true,\n processing: true,\n language: {\n processing: `<img src=\"${swhSpinnerSrc}\"></img>`\n },\n ajax: Urls.origin_save_requests_list('rejected'),\n searchDelay: 1000,\n columns: columnsData,\n scrollY: '50vh',\n scrollCollapse: true,\n order: [[0, 'desc']],\n responsive: {\n details: {\n type: 'none'\n }\n }\n });\n enableRowSelection('#swh-origin-save-rejected-requests');\n swh.webapp.addJumpToPagePopoverToDataTable(rejectedSaveRequestsTable);\n\n columnsData.push({\n data: 'save_task_status',\n name: 'save_task_status',\n render: (data, type, row) => {\n if (data === 'succeed' && row.visit_date) {\n let browseOriginUrl = `${Urls.browse_origin()}?origin_url=${row.origin_url}`;\n browseOriginUrl += `×tamp=${row.visit_date}`;\n return `<a href=\"${browseOriginUrl}\">${data}</a>`;\n }\n return data;\n }\n });\n\n columnsData.push({\n name: 'info',\n render: (data, type, row) => {\n if (row.save_task_status === 'succeed' || row.save_task_status === 'failed') {\n return '<i class=\"fa fa-info-circle swh-save-request-info\" aria-hidden=\"true\" style=\"cursor: pointer\"' +\n `onclick=\"swh.admin.displaySaveRequestInfo(event, ${row.id})\"></i>`;\n } else {\n return '';\n }\n }\n });\n\n acceptedSaveRequestsTable = $('#swh-origin-save-accepted-requests').DataTable({\n serverSide: true,\n processing: true,\n language: {\n processing: `<img src=\"${swhSpinnerSrc}\"></img>`\n },\n ajax: Urls.origin_save_requests_list('accepted'),\n searchDelay: 1000,\n columns: columnsData,\n scrollY: '50vh',\n scrollCollapse: true,\n order: [[0, 'desc']],\n responsive: {\n details: {\n type: 'none'\n }\n }\n });\n enableRowSelection('#swh-origin-save-accepted-requests');\n swh.webapp.addJumpToPagePopoverToDataTable(acceptedSaveRequestsTable);\n\n $('#swh-origin-save-requests-nav-item').on('shown.bs.tab', () => {\n pendingSaveRequestsTable.draw();\n });\n\n $('#swh-origin-save-url-filters-nav-item').on('shown.bs.tab', () => {\n authorizedOriginTable.draw();\n });\n\n $('#swh-authorized-origins-tab').on('shown.bs.tab', () => {\n authorizedOriginTable.draw();\n });\n\n $('#swh-unauthorized-origins-tab').on('shown.bs.tab', () => {\n unauthorizedOriginTable.draw();\n });\n\n $('#swh-save-requests-pending-tab').on('shown.bs.tab', () => {\n pendingSaveRequestsTable.draw();\n });\n\n $('#swh-save-requests-accepted-tab').on('shown.bs.tab', () => {\n acceptedSaveRequestsTable.draw();\n });\n\n $('#swh-save-requests-rejected-tab').on('shown.bs.tab', () => {\n rejectedSaveRequestsTable.draw();\n });\n\n $('#swh-save-requests-pending-tab').click(() => {\n pendingSaveRequestsTable.ajax.reload(null, false);\n });\n\n $('#swh-save-requests-accepted-tab').click(() => {\n acceptedSaveRequestsTable.ajax.reload(null, false);\n });\n\n $('#swh-save-requests-rejected-tab').click(() => {\n rejectedSaveRequestsTable.ajax.reload(null, false);\n });\n\n $('body').on('click', e => {\n if ($(e.target).parents('.popover').length > 0) {\n event.stopPropagation();\n } else if ($(e.target).parents('.swh-save-request-info').length === 0) {\n $('.swh-save-request-info').popover('dispose');\n }\n });\n\n });\n}\n\nexport function addAuthorizedOriginUrl() {\n let originUrl = $('#swh-authorized-url-prefix').val();\n let addOriginUrl = Urls.admin_origin_save_add_authorized_url(originUrl);\n csrfPost(addOriginUrl)\n .then(handleFetchError)\n .then(() => {\n authorizedOriginTable.row.add({'url': originUrl}).draw();\n $('.swh-add-authorized-origin-status').html(\n htmlAlert('success', 'The origin url prefix has been successfully added in the authorized list.', true)\n );\n })\n .catch(response => {\n $('.swh-add-authorized-origin-status').html(\n htmlAlert('warning', 'The provided origin url prefix is already registered in the authorized list.', true)\n );\n });\n}\n\nexport function removeAuthorizedOriginUrl() {\n let originUrl = $('#swh-authorized-origin-urls tr.selected').text();\n if (originUrl) {\n let removeOriginUrl = Urls.admin_origin_save_remove_authorized_url(originUrl);\n csrfPost(removeOriginUrl)\n .then(handleFetchError)\n .then(() => {\n authorizedOriginTable.row('.selected').remove().draw();\n })\n .catch(() => {});\n }\n}\n\nexport function addUnauthorizedOriginUrl() {\n let originUrl = $('#swh-unauthorized-url-prefix').val();\n let addOriginUrl = Urls.admin_origin_save_add_unauthorized_url(originUrl);\n csrfPost(addOriginUrl)\n .then(handleFetchError)\n .then(() => {\n unauthorizedOriginTable.row.add({'url': originUrl}).draw();\n $('.swh-add-unauthorized-origin-status').html(\n htmlAlert('success', 'The origin url prefix has been successfully added in the unauthorized list.', true)\n );\n })\n .catch(() => {\n $('.swh-add-unauthorized-origin-status').html(\n htmlAlert('warning', 'The provided origin url prefix is already registered in the unauthorized list.', true)\n );\n });\n}\n\nexport function removeUnauthorizedOriginUrl() {\n let originUrl = $('#swh-unauthorized-origin-urls tr.selected').text();\n if (originUrl) {\n let removeOriginUrl = Urls.admin_origin_save_remove_unauthorized_url(originUrl);\n csrfPost(removeOriginUrl)\n .then(handleFetchError)\n .then(() => {\n unauthorizedOriginTable.row('.selected').remove().draw();\n })\n .catch(() => {});\n }\n}\n\nexport function acceptOriginSaveRequest() {\n let selectedRow = pendingSaveRequestsTable.row('.selected');\n if (selectedRow.length) {\n let acceptOriginSaveRequestCallback = () => {\n let rowData = selectedRow.data();\n let acceptSaveRequestUrl = Urls.admin_origin_save_request_accept(rowData['visit_type'], rowData['origin_url']);\n csrfPost(acceptSaveRequestUrl)\n .then(() => {\n pendingSaveRequestsTable.ajax.reload(null, false);\n });\n };\n\n swh.webapp.showModalConfirm(\n 'Accept origin save request ?',\n 'Are you sure to accept this origin save request ?',\n acceptOriginSaveRequestCallback);\n }\n}\n\nexport function rejectOriginSaveRequest() {\n let selectedRow = pendingSaveRequestsTable.row('.selected');\n if (selectedRow.length) {\n let rejectOriginSaveRequestCallback = () => {\n let rowData = selectedRow.data();\n let rejectSaveRequestUrl = Urls.admin_origin_save_request_reject(rowData['visit_type'], rowData['origin_url']);\n csrfPost(rejectSaveRequestUrl)\n .then(() => {\n pendingSaveRequestsTable.ajax.reload(null, false);\n });\n };\n\n swh.webapp.showModalConfirm(\n 'Reject origin save request ?',\n 'Are you sure to reject this origin save request ?',\n rejectOriginSaveRequestCallback);\n }\n}\n\nfunction removeOriginSaveRequest(requestTable) {\n let selectedRow = requestTable.row('.selected');\n if (selectedRow.length) {\n let requestId = selectedRow.data()['id'];\n let removeOriginSaveRequestCallback = () => {\n let removeSaveRequestUrl = Urls.admin_origin_save_request_remove(requestId);\n csrfPost(removeSaveRequestUrl)\n .then(() => {\n requestTable.ajax.reload(null, false);\n });\n };\n\n swh.webapp.showModalConfirm(\n 'Remove origin save request ?',\n 'Are you sure to remove this origin save request ?',\n removeOriginSaveRequestCallback);\n }\n}\n\nexport function removePendingOriginSaveRequest() {\n removeOriginSaveRequest(pendingSaveRequestsTable);\n}\n\nexport function removeAcceptedOriginSaveRequest() {\n removeOriginSaveRequest(acceptedSaveRequestsTable);\n}\n\nexport function removeRejectedOriginSaveRequest() {\n removeOriginSaveRequest(rejectedSaveRequestsTable);\n}\n\nexport function displaySaveRequestInfo(event, saveRequestId) {\n event.stopPropagation();\n const saveRequestTaskInfoUrl = Urls.admin_origin_save_task_info(saveRequestId);\n $('.swh-save-request-info').popover('dispose');\n $(event.target).popover({\n 'title': 'Save request task information',\n 'content': `<div class=\"swh-popover\">\n <div class=\"text-center\">\n <img src=${swhSpinnerSrc}></img>\n <p>Fetching task information ...</p>\n </div>\n </div>`,\n 'html': true,\n 'placement': 'left',\n 'sanitizeFn': swh.webapp.filterXSS\n });\n $(event.target).popover('show');\n fetch(saveRequestTaskInfoUrl)\n .then(response => response.json())\n .then(saveRequestTaskInfo => {\n let content;\n if ($.isEmptyObject(saveRequestTaskInfo)) {\n content = 'Not available';\n } else {\n let saveRequestInfo = [];\n saveRequestInfo.push({\n key: 'Task type',\n value: saveRequestTaskInfo.type\n });\n if (saveRequestTaskInfo.hasOwnProperty('task_name')) {\n saveRequestInfo.push({\n key: 'Task name',\n value: saveRequestTaskInfo.name\n });\n }\n saveRequestInfo.push({\n key: 'Task arguments',\n value: JSON.stringify(saveRequestTaskInfo.arguments, null, 2)\n });\n saveRequestInfo.push({\n key: 'Task id',\n value: saveRequestTaskInfo.id\n });\n saveRequestInfo.push({\n key: 'Task backend id',\n value: saveRequestTaskInfo.backend_id\n });\n saveRequestInfo.push({\n key: 'Task scheduling date',\n value: new Date(saveRequestTaskInfo.scheduled).toLocaleString()\n });\n saveRequestInfo.push({\n key: 'Task termination date',\n value: new Date(saveRequestTaskInfo.ended).toLocaleString()\n });\n if (saveRequestTaskInfo.hasOwnProperty('duration')) {\n saveRequestInfo.push({\n key: 'Task duration',\n value: saveRequestTaskInfo.duration + ' s'\n });\n }\n if (saveRequestTaskInfo.hasOwnProperty('worker')) {\n saveRequestInfo.push({\n key: 'Task executor',\n value: saveRequestTaskInfo.worker\n });\n }\n if (saveRequestTaskInfo.hasOwnProperty('message')) {\n saveRequestInfo.push({\n key: 'Task log',\n value: saveRequestTaskInfo.message\n });\n }\n content = '<table class=\"table\"><tbody>';\n for (let info of saveRequestInfo) {\n content +=\n `<tr>\n <th class=\"swh-metadata-table-row swh-metadata-table-key\">${info.key}</th>\n <td class=\"swh-metadata-table-row swh-metadata-table-value\">\n <pre>${info.value}</pre>\n </td>\n </tr>`;\n }\n content += '</tbody></table>';\n }\n $('.swh-popover').html(content);\n $(event.target).popover('update');\n });\n}\n",
"/**\n * Copyright (C) 2018-2020 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\n// utility functions\n\nexport function handleFetchError(response) {\n if (!response.ok) {\n throw response;\n }\n return response;\n}\n\nexport function handleFetchErrors(responses) {\n for (let i = 0; i < responses.length; ++i) {\n if (!responses[i].ok) {\n throw responses[i];\n }\n }\n return responses;\n}\n\nexport function staticAsset(asset) {\n return `${__STATIC__}${asset}`;\n}\n\nexport function csrfPost(url, headers = {}, body = null) {\n headers['X-CSRFToken'] = Cookies.get('csrftoken');\n return fetch(url, {\n credentials: 'include',\n headers: headers,\n method: 'POST',\n body: body\n });\n}\n\nexport function isGitRepoUrl(url, domain) {\n let endOfPattern = '\\\\/[\\\\w\\\\.-]+\\\\/?(?!=.git)(?:\\\\.git(?:\\\\/?|\\\\#[\\\\w\\\\.\\\\-_]+)?)?$';\n let pattern = `(?:git|https?|git@)(?:\\\\:\\\\/\\\\/)?${domain}[/|:][A-Za-z0-9-/]+?` + endOfPattern;\n let re = new RegExp(pattern);\n return re.test(url);\n};\n\nexport function removeUrlFragment() {\n history.replaceState('', document.title, window.location.pathname + window.location.search);\n}\n\nexport function selectText(startNode, endNode) {\n let selection = window.getSelection();\n selection.removeAllRanges();\n let range = document.createRange();\n range.setStart(startNode, 0);\n if (endNode.nodeName !== '#text') {\n range.setEnd(endNode, endNode.childNodes.length);\n } else {\n range.setEnd(endNode, endNode.textContent.length);\n }\n selection.addRange(range);\n}\n\nexport function htmlAlert(type, message, closable = false) {\n let closeButton = '';\n let extraClasses = '';\n if (closable) {\n closeButton =\n `<button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-label=\"Close\">\n <span aria-hidden=\"true\">×</span>\n </button>`;\n extraClasses = 'alert-dismissible';\n }\n return `<div class=\"alert alert-${type} ${extraClasses}\" role=\"alert\">${message}${closeButton}</div>`;\n}\n",
"/**\n * Copyright (C) 2019 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\nimport {staticAsset} from 'utils/functions';\n\n// Constants defining Bootstrap Breakpoints\nexport const BREAKPOINT_SM = 768;\nexport const BREAKPOINT_MD = 992;\nexport const BREAKPOINT_LG = 1200;\n\nexport const swhSpinnerSrc = staticAsset('img/swh-spinner.gif');\n",
"/**\n * Copyright (C) 2018 The Software Heritage developers\n * See the AUTHORS file at the top-level directory of this distribution\n * License: GNU Affero General Public License version 3, or any later version\n * See top-level LICENSE file for more information\n */\n\nexport * from './deposit';\nexport * from './origin-save';\n"