Frontend refactor, PascalCase to camelCase, remove unused code (#17365)

* Frontend refactor, PascalCase to camelCase, remove unused code

* fix
This commit is contained in:
wxiaoguang 2021-10-21 15:37:43 +08:00 committed by GitHub
parent 5879ab83b5
commit 2add8fe9be
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
42 changed files with 162 additions and 182 deletions

View File

@ -9,7 +9,6 @@ import (
"net/url"
"testing"
"github.com/PuerkitoBio/goquery"
"github.com/stretchr/testify/assert"
"github.com/unknwon/i18n"
)
@ -62,7 +61,7 @@ func branchAction(t *testing.T, button string) (*HTMLDoc, string) {
}
req = NewRequestWithValues(t, "POST", link, map[string]string{
"_csrf": getCsrf(t, htmlDoc.doc),
"_csrf": htmlDoc.GetCSRF(),
})
session.MakeRequest(t, req, http.StatusOK)
@ -73,9 +72,3 @@ func branchAction(t *testing.T, button string) (*HTMLDoc, string) {
return NewHTMLParser(t, resp.Body), url.Query().Get("name")
}
func getCsrf(t *testing.T, doc *goquery.Document) string {
csrf, exists := doc.Find("meta[name=\"_csrf\"]").Attr("content")
assert.True(t, exists)
return csrf
}

View File

@ -44,7 +44,7 @@ func (doc *HTMLDoc) Find(selector string) *goquery.Selection {
return doc.doc.Find(selector)
}
// GetCSRF for get CSRC token value from input
// GetCSRF for getting CSRF token value from input
func (doc *HTMLDoc) GetCSRF() string {
return doc.GetInputValueByName("_csrf")
}

View File

@ -114,7 +114,7 @@ func testUIDeleteBranch(t *testing.T, session *TestSession, ownerName, repoName,
htmlDoc := NewHTMLParser(t, resp.Body)
req = NewRequestWithValues(t, "POST", relURL+"/delete", map[string]string{
"_csrf": getCsrf(t, htmlDoc.doc),
"_csrf": htmlDoc.GetCSRF(),
"name": branchName,
})
session.MakeRequest(t, req, http.StatusOK)
@ -127,7 +127,7 @@ func testDeleteRepository(t *testing.T, session *TestSession, ownerName, repoNam
htmlDoc := NewHTMLParser(t, resp.Body)
req = NewRequestWithValues(t, "POST", relURL+"?action=delete", map[string]string{
"_csrf": getCsrf(t, htmlDoc.doc),
"_csrf": htmlDoc.GetCSRF(),
"repo_name": repoName,
})
session.MakeRequest(t, req, http.StatusFound)

View File

@ -645,7 +645,7 @@ func Contexter() func(next http.Handler) http.Handler {
"CurrentURL": setting.AppSubURL + req.URL.RequestURI(),
"PageStartTime": startTime,
"Link": link,
"IsProd": setting.IsProd,
"RunModeIsProd": setting.IsProd,
},
}
// PageData is passed by reference, and it will be rendered to `window.config.pageData` in `head.tmpl` for JavaScript modules

View File

@ -205,7 +205,6 @@ func DeleteProject(ctx *context.Context) {
// EditProject allows a project to be edited
func EditProject(ctx *context.Context) {
ctx.Data["Title"] = ctx.Tr("repo.projects.edit")
ctx.Data["PageIsProjects"] = true
ctx.Data["PageIsEditProjects"] = true
ctx.Data["CanWriteProjects"] = ctx.Repo.Permission.CanWrite(models.UnitTypeProjects)
@ -233,7 +232,6 @@ func EditProject(ctx *context.Context) {
func EditProjectPost(ctx *context.Context) {
form := web.GetForm(ctx).(*forms.CreateProjectForm)
ctx.Data["Title"] = ctx.Tr("repo.projects.edit")
ctx.Data["PageIsProjects"] = true
ctx.Data["PageIsEditProjects"] = true
ctx.Data["CanWriteProjects"] = ctx.Repo.Permission.CanWrite(models.UnitTypeProjects)
@ -335,8 +333,6 @@ func ViewProject(ctx *context.Context) {
ctx.Data["CanWriteProjects"] = ctx.Repo.Permission.CanWrite(models.UnitTypeProjects)
ctx.Data["Project"] = project
ctx.Data["Boards"] = boards
ctx.Data["PageIsProjects"] = true
ctx.Data["RequiresDraggable"] = true
ctx.HTML(http.StatusOK, tplProjectsView)
}

View File

@ -11,7 +11,6 @@
<meta name="description" content="{{if .Repository}}{{.Repository.Name}}{{if .Repository.Description}} - {{.Repository.Description}}{{end}}{{else}}{{MetaDescription}}{{end}}" />
<meta name="keywords" content="{{MetaKeywords}}">
<meta name="referrer" content="no-referrer" />
<meta name="_csrf" content="{{.CsrfToken}}" />
{{if .GoGetImport}}
<meta name="go-import" content="{{.GoGetImport}} git {{.CloneLink.HTTPS}}">
<meta name="go-source" content="{{.GoGetImport}} _ {{.GoDocDirectory}} {{.GoDocFile}}">
@ -19,25 +18,17 @@
<script>
<!-- /* eslint-disable */ -->
window.config = {
AppVer: '{{AppVer}}',
AppSubUrl: '{{AppSubUrl}}',
AssetUrlPrefix: '{{AssetUrlPrefix}}',
IsProd: {{.IsProd}},
CustomEmojis: {{CustomEmojis}},
UseServiceWorker: {{UseServiceWorker}},
csrf: '{{.CsrfToken}}',
appVer: '{{AppVer}}',
appSubUrl: '{{AppSubUrl}}',
assetUrlPrefix: '{{AssetUrlPrefix}}',
runModeIsProd: {{.RunModeIsProd}},
customEmojis: {{CustomEmojis}},
useServiceWorker: {{UseServiceWorker}},
csrfToken: '{{.CsrfToken}}',
pageData: {{.PageData}},
HighlightJS: {{if .RequireHighlightJS}}true{{else}}false{{end}},
SimpleMDE: {{if .RequireSimpleMDE}}true{{else}}false{{end}},
Tribute: {{if .RequireTribute}}true{{else}}false{{end}},
NotificationSettings: {
MinTimeout: {{NotificationSettings.MinTimeout}},
TimeoutStep: {{NotificationSettings.TimeoutStep}},
MaxTimeout: {{NotificationSettings.MaxTimeout}},
EventSourceUpdateTime: {{NotificationSettings.EventSourceUpdateTime}},
},
EnableTimetracking: {{if EnableTimetracking}}true{{else}}false{{end}},
PageIsProjects: {{if .PageIsProjects }}true{{else}}false{{end}},
requireTribute: {{.RequireTribute}},
notificationSettings: {{NotificationSettings}}, {{/*a map provided by NewFuncMap in helper.go*/}}
enableTimeTracking: {{EnableTimetracking}},
{{if .RequireTribute}}
tributeValues: Array.from(new Map([
{{ range .Participants }}
@ -54,7 +45,7 @@
{{ end }}
]).values()),
{{end}}
MermaidMaxSourceCharacters: {{MermaidMaxSourceCharacters}},
mermaidMaxSourceCharacters: {{MermaidMaxSourceCharacters}},
};
</script>
<link rel="icon" href="{{AssetUrlPrefix}}/img/logo.svg" type="image/svg+xml">

View File

@ -1,5 +1,5 @@
{{template "base/head" .}}
<div class="page-content repository milestones">
<div class="page-content repository projects milestones">
{{template "repo/header" .}}
<div class="ui container">
<div class="navbar">

View File

@ -1,5 +1,5 @@
{{template "base/head" .}}
<div class="page-content repository new milestone">
<div class="page-content repository projects edit-project new milestone">
{{template "repo/header" .}}
<div class="ui container">
<div class="navbar">

View File

@ -1,5 +1,5 @@
{{template "base/head" .}}
<div class="page-content repository">
<div class="page-content repository projects view-project">
{{template "repo/header" .}}
<div class="ui container">
<div class="ui two column stackable grid">
@ -7,7 +7,7 @@
{{template "repo/issue/navbar" .}}
</div>
<div class="column right aligned">
{{if and .CanWriteProjects (not .Repository.IsArchived) .PageIsProjects}}
{{if and .CanWriteProjects (not .Repository.IsArchived)}}
<a class="ui green button show-modal item" href="{{$.RepoLink}}/issues/new?project={{$.Project.ID}}">{{.i18n.Tr "repo.issues.new"}}</a>
<a class="ui green button show-modal item" data-modal="#new-board-item">{{.i18n.Tr "new_project_board"}}</a>
{{end}}
@ -83,7 +83,7 @@
<div class="ui segment board-column" style="background: {{.Color}} !important;" data-id="{{.ID}}" data-sorting="{{.Sorting}}" data-url="{{$.RepoLink}}/projects/{{$.Project.ID}}/{{.ID}}">
<div class="board-column-header df ac sb">
<div class="ui large label board-label py-2">{{.Title}}</div>
{{if and $.CanWriteProjects (not $.Repository.IsArchived) $.PageIsProjects (ne .ID 0)}}
{{if and $.CanWriteProjects (not $.Repository.IsArchived) (ne .ID 0)}}
<div class="ui dropdown jump item poping up" data-variation="tiny inverted">
<div class="not-mobile px-3" tabindex="-1">
{{svg "octicon-kebab-horizontal"}}
@ -232,7 +232,7 @@
{{if .Labels}}
<div class="extra content labels-list p-0 pt-2">
{{ range .Labels }}
<a class="ui label" href="{{$.RepoLink}}/issues?labels={{.ID}}" style="color: {{.ForegroundColor}}; background-color: {{.Color}}" title="{{.Description | RenderEmojiPlain}}">{{.Name | RenderEmoji}}</a>
<a class="ui label" href="{{$.RepoLink}}/issues?labels={{.ID}}" style="color: {{.ForegroundColor}}; background-color: {{.Color}};" title="{{.Description | RenderEmojiPlain}}">{{.Name | RenderEmoji}}</a>
{{ end }}
</div>
{{end}}

View File

@ -22,7 +22,7 @@
<script>
import {SvgIcon} from '../svg.js';
const {AppSubUrl} = window.config;
const {appSubUrl} = window.config;
// NOTE: see models/issue_label.go for similar implementation
const srgbToLinear = (color) => {
@ -112,7 +112,7 @@ export default {
methods: {
load(data, callback) {
this.loading = true;
$.get(`${AppSubUrl}/api/v1/repos/${data.owner}/${data.repo}/issues/${data.index}`, (issue) => {
$.get(`${appSubUrl}/api/v1/repos/${data.owner}/${data.repo}/issues/${data.index}`, (issue) => {
this.issue = issue;
this.loading = false;
this.$nextTick(() => {

View File

@ -1,7 +1,7 @@
import Vue from 'vue';
import {initVueSvg, vueDelimiters} from './VueComponentLoader.js';
const {AppSubUrl, AssetUrlPrefix, pageData} = window.config;
const {appSubUrl, assetUrlPrefix, pageData} = window.config;
function initVueComponents() {
Vue.component('repo-search', {
@ -95,7 +95,7 @@ function initVueComponents() {
finalPage: 1,
searchQuery,
isLoading: false,
staticPrefix: AssetUrlPrefix,
staticPrefix: assetUrlPrefix,
counts: {},
repoTypes: {
all: {
@ -361,7 +361,7 @@ export function initDashboardRepoList() {
data: () => {
return {
searchLimit: dashboardRepoListData.searchLimit || 0,
subUrl: AppSubUrl,
subUrl: appSubUrl,
uid: dashboardRepoListData.uid || 0,
};
},

View File

@ -8,7 +8,7 @@ export function initVueEnv() {
if (vueEnvInited) return;
vueEnvInited = true;
const isProd = window.config.IsProd;
const isProd = window.config.runModeIsProd;
Vue.config.productionTip = false;
Vue.config.devtools = !isProd;
}

View File

@ -1,4 +1,4 @@
const {csrf} = window.config;
const {csrfToken} = window.config;
export function initAdminCommon() {
if ($('.admin').length === 0) {
@ -204,7 +204,7 @@ export function initAdminCommon() {
}
});
$.post($this.data('link'), {
_csrf: csrf,
_csrf: csrfToken,
ids
}).done(() => {
window.location.href = $this.data('redirect');

View File

@ -4,7 +4,7 @@ import {initCompColorPicker} from './comp/ColorPicker.js';
import 'jquery.are-you-sure';
const {csrf} = window.config;
const {csrfToken} = window.config;
export function initGlobalFormDirtyLeaveConfirm() {
// Warn users that try to leave a page after entering data into a form.
@ -136,7 +136,7 @@ export async function initGlobalDropzone() {
const $dropzone = $(el);
await createDropzone(el, {
url: $dropzone.data('upload-url'),
headers: {'X-Csrf-Token': csrf},
headers: {'X-Csrf-Token': csrfToken},
maxFiles: $dropzone.data('max-file'),
maxFilesize: $dropzone.data('max-size'),
acceptedFiles: (['*/*', ''].includes($dropzone.data('accepts'))) ? null : $dropzone.data('accepts'),
@ -159,7 +159,7 @@ export async function initGlobalDropzone() {
if ($dropzone.data('remove-url')) {
$.post($dropzone.data('remove-url'), {
file: file.uuid,
_csrf: csrf,
_csrf: csrfToken,
});
}
});
@ -194,7 +194,7 @@ export function initGlobalLinkActions() {
}
const postData = {
_csrf: csrf,
_csrf: csrfToken,
};
for (const [key, value] of Object.entries(dataArray)) {
if (key && key.startsWith('data')) {
@ -232,7 +232,7 @@ export function initGlobalLinkActions() {
}
$.post($this.data('url'), {
_csrf: csrf,
_csrf: csrfToken,
id: $this.data('id')
}).done((data) => {
window.location.href = data.redirect;
@ -247,7 +247,7 @@ export function initGlobalLinkActions() {
const $this = $(this);
const redirect = $this.data('redirect');
$.post($this.data('url'), {
_csrf: csrf
_csrf: csrfToken
}).done((data) => {
if (data.redirect) {
window.location.href = data.redirect;
@ -270,7 +270,7 @@ export function initGlobalLinkActions() {
$('.undo-button').on('click', function () {
const $this = $(this);
$.post($this.data('url'), {
_csrf: csrf,
_csrf: csrfToken,
id: $this.data('id')
}).done((data) => {
window.location.href = data.redirect;
@ -298,7 +298,7 @@ export function initGlobalButtons() {
$('.delete-post.button').on('click', function () {
const $this = $(this);
$.post($this.data('request-url'), {
_csrf: csrf
_csrf: csrfToken
}).done(() => {
window.location.href = $this.data('done-url');
});

View File

@ -1,4 +1,4 @@
const {AppSubUrl, csrf} = window.config;
const {appSubUrl, csrfToken} = window.config;
async function uploadFile(file, uploadUrl) {
const formData = new FormData();
@ -6,7 +6,7 @@ async function uploadFile(file, uploadUrl) {
const res = await fetch(uploadUrl, {
method: 'POST',
headers: {'X-Csrf-Token': csrf},
headers: {'X-Csrf-Token': csrfToken},
body: formData,
});
return await res.json();
@ -67,7 +67,7 @@ export function initCompImagePaste($target) {
const name = img.name.substr(0, img.name.lastIndexOf('.'));
insertAtCursor(textarea, `![${name}]()`);
const data = await uploadFile(img, uploadUrl);
replaceAndKeepCursor(textarea, `![${name}]()`, `![${name}](${AppSubUrl}/attachments/${data.uuid})`);
replaceAndKeepCursor(textarea, `![${name}]()`, `![${name}](${appSubUrl}/attachments/${data.uuid})`);
const input = $(`<input id="${data.uuid}" name="files" type="hidden">`).val(data.uuid);
dropzoneFiles.appendChild(input[0]);
}
@ -83,7 +83,7 @@ export function initSimpleMDEImagePaste(simplemde, dropzone, files) {
const name = img.name.substr(0, img.name.lastIndexOf('.'));
const data = await uploadFile(img, uploadUrl);
const pos = simplemde.codemirror.getCursor();
simplemde.codemirror.replaceRange(`![${name}](${AppSubUrl}/attachments/${data.uuid})`, pos);
simplemde.codemirror.replaceRange(`![${name}](${appSubUrl}/attachments/${data.uuid})`, pos);
const input = $(`<input id="${data.uuid}" name="files" type="hidden">`).val(data.uuid);
files.append(input);
}

View File

@ -1,6 +1,6 @@
import {initMarkupContent} from '../../markup/content.js';
const {csrf} = window.config;
const {csrfToken} = window.config;
export function initCompMarkupContentPreviewTab($form) {
const $tabMenu = $form.find('.tabular.menu');
@ -8,7 +8,7 @@ export function initCompMarkupContentPreviewTab($form) {
$tabMenu.find(`.item[data-tab="${$tabMenu.data('preview')}"]`).on('click', function () {
const $this = $(this);
$.post($this.data('url'), {
_csrf: csrf,
_csrf: csrfToken,
mode: 'comment',
context: $this.data('context'),
text: $form.find(`.tab[data-tab="${$tabMenu.data('write')}"] textarea`).val()

View File

@ -1,4 +1,4 @@
const {csrf} = window.config;
const {csrfToken} = window.config;
export function initCompReactionSelector(parent) {
let reactions = '';
@ -20,7 +20,7 @@ export function initCompReactionSelector(parent) {
type: 'POST',
url,
data: {
_csrf: csrf,
_csrf: csrfToken,
content: $(this).data('content')
}
}).done((resp) => {

View File

@ -1,13 +1,13 @@
import {htmlEscape} from 'escape-goat';
const {AppSubUrl} = window.config;
const {appSubUrl} = window.config;
export function initSearchUserBox() {
const $searchUserBox = $('#search-user-box');
$searchUserBox.search({
minCharacters: 2,
apiSettings: {
url: `${AppSubUrl}/api/v1/users/search?q={query}`,
url: `${appSubUrl}/api/v1/users/search?q={query}`,
onResponse(response) {
const items = [];
const searchQueryUppercase = $searchUserBox.find('input').val().toUpperCase();

View File

@ -1,4 +1,4 @@
const {csrf} = window.config;
const {csrfToken} = window.config;
export function initWebHookEditor() {
if ($('.new.webhook').length === 0) {
@ -30,7 +30,7 @@ export function initWebHookEditor() {
const $this = $(this);
$this.addClass('loading disabled');
$.post($this.data('link'), {
_csrf: csrf
_csrf: csrfToken
}).done(
setTimeout(() => {
window.location.href = $this.data('redirect');

View File

@ -1,9 +1,9 @@
import emojis from '../../../assets/emoji.json';
const {AssetUrlPrefix} = window.config;
const {CustomEmojis} = window.config;
const {assetUrlPrefix} = window.config;
const {customEmojis} = window.config;
const tempMap = {...CustomEmojis};
const tempMap = {...customEmojis};
for (const {emoji, aliases} of emojis) {
for (const alias of aliases || []) {
tempMap[alias] = emoji;
@ -24,8 +24,8 @@ for (const key of emojiKeys) {
// retrieve HTML for given emoji name
export function emojiHTML(name) {
let inner;
if (Object.prototype.hasOwnProperty.call(CustomEmojis, name)) {
inner = `<img alt=":${name}:" src="${AssetUrlPrefix}/img/emoji/${name}.png">`;
if (Object.prototype.hasOwnProperty.call(customEmojis, name)) {
inner = `<img alt=":${name}:" src="${assetUrlPrefix}/img/emoji/${name}.png">`;
} else {
inner = emojiString(name);
}

View File

@ -1,6 +1,6 @@
import {svg} from '../svg.js';
const {AppSubUrl, csrf} = window.config;
const {appSubUrl, csrfToken} = window.config;
let i18nTextEdited;
let i18nTextOptions;
@ -37,7 +37,7 @@ function showContentHistoryDetail(issueBaseUrl, commentId, historyId, itemTitleH
if (optionItem === 'delete') {
if (window.confirm(i18nTextDeleteFromHistoryConfirm)) {
$.post(`${issueBaseUrl}/content-history/soft-delete?comment_id=${commentId}&history_id=${historyId}`, {
_csrf: csrf,
_csrf: csrfToken,
}).done((resp) => {
if (resp.ok) {
$dialog.modal('hide');
@ -59,7 +59,7 @@ function showContentHistoryDetail(issueBaseUrl, commentId, historyId, itemTitleH
$.ajax({
url: `${issueBaseUrl}/content-history/detail?comment_id=${commentId}&history_id=${historyId}`,
data: {
_csrf: csrf,
_csrf: csrfToken,
},
}).done((resp) => {
$dialog.find('.content').html(resp.diffHtml);
@ -110,12 +110,12 @@ export function initIssueContentHistory() {
if (!issueIndex || !$itemIssue.length) return;
const repoLink = $('#repolink').val();
const issueBaseUrl = `${AppSubUrl}/${repoLink}/issues/${issueIndex}`;
const issueBaseUrl = `${appSubUrl}/${repoLink}/issues/${issueIndex}`;
$.ajax({
url: `${issueBaseUrl}/content-history/overview`,
data: {
_csrf: csrf,
_csrf: csrfToken,
},
}).done((resp) => {
i18nTextEdited = resp.i18n.textEdited;

View File

@ -1,4 +1,4 @@
const {csrf} = window.config;
const {csrfToken} = window.config;
export async function initLastCommitLoader() {
const entryMap = {};
@ -18,7 +18,7 @@ export async function initLastCommitLoader() {
if (entries.length > 200) {
$.post(lastCommitLoaderURL, {
_csrf: csrf,
_csrf: csrfToken,
}, (data) => {
$('table#repo-files-table').replaceWith(data);
});
@ -26,7 +26,7 @@ export async function initLastCommitLoader() {
}
$.post(lastCommitLoaderURL, {
_csrf: csrf,
_csrf: csrfToken,
'f': entries,
}, (data) => {
$(data).find('tr').each((_, row) => {

View File

@ -1,4 +1,4 @@
const {AppSubUrl, csrf, NotificationSettings} = window.config;
const {appSubUrl, csrfToken, notificationSettings} = window.config;
let notificationSequenceNumber = 0;
@ -47,7 +47,7 @@ export async function initNotificationCount() {
return;
}
if (NotificationSettings.EventSourceUpdateTime > 0 && !!window.EventSource && window.SharedWorker) {
if (notificationSettings.EventSourceUpdateTime > 0 && !!window.EventSource && window.SharedWorker) {
// Try to connect to the event source via the shared worker first
const worker = new SharedWorker(`${__webpack_public_path__}js/eventsource.sharedworker.js`, 'notification-worker');
worker.addEventListener('error', (event) => {
@ -58,7 +58,7 @@ export async function initNotificationCount() {
});
worker.port.postMessage({
type: 'start',
url: `${window.location.origin}${AppSubUrl}/user/events`,
url: `${window.location.origin}${appSubUrl}/user/events`,
});
worker.port.addEventListener('message', (event) => {
if (!event.data || !event.data.type) {
@ -77,7 +77,7 @@ export async function initNotificationCount() {
type: 'close',
});
worker.port.close();
window.location.href = AppSubUrl;
window.location.href = appSubUrl;
} else if (event.data.type === 'close') {
worker.port.postMessage({
type: 'close',
@ -99,7 +99,7 @@ export async function initNotificationCount() {
return;
}
if (NotificationSettings.MinTimeout <= 0) {
if (notificationSettings.MinTimeout <= 0) {
return;
}
@ -109,13 +109,13 @@ export async function initNotificationCount() {
}, timeout);
};
fn(NotificationSettings.MinTimeout, notificationCount.text());
fn(notificationSettings.MinTimeout, notificationCount.text());
}
async function updateNotificationCountWithCallback(callback, timeout, lastCount) {
const currentCount = $('.notification_count').text();
if (lastCount !== currentCount) {
callback(NotificationSettings.MinTimeout, currentCount);
callback(notificationSettings.MinTimeout, currentCount);
return;
}
@ -124,9 +124,9 @@ async function updateNotificationCountWithCallback(callback, timeout, lastCount)
if (lastCount !== newCount) {
needsUpdate = true;
timeout = NotificationSettings.MinTimeout;
} else if (timeout < NotificationSettings.MaxTimeout) {
timeout += NotificationSettings.TimeoutStep;
timeout = notificationSettings.MinTimeout;
} else if (timeout < notificationSettings.MaxTimeout) {
timeout += notificationSettings.TimeoutStep;
}
callback(timeout, newCount);
@ -140,7 +140,7 @@ async function updateNotificationTable() {
if (notificationDiv.length > 0) {
const data = await $.ajax({
type: 'GET',
url: `${AppSubUrl}/notifications?${notificationDiv.data('params')}`,
url: `${appSubUrl}/notifications?${notificationDiv.data('params')}`,
data: {
'div-only': true,
'sequence-number': ++notificationSequenceNumber,
@ -156,9 +156,9 @@ async function updateNotificationTable() {
async function updateNotificationCount() {
const data = await $.ajax({
type: 'GET',
url: `${AppSubUrl}/api/v1/notifications/new`,
url: `${appSubUrl}/api/v1/notifications/new`,
headers: {
'X-Csrf-Token': csrf,
'X-Csrf-Token': csrfToken,
},
});
@ -183,7 +183,7 @@ async function updateNotification(url, status, page, q, notificationID) {
type: 'POST',
url,
data: {
_csrf: csrf,
_csrf: csrfToken,
notification_id: notificationID,
status,
page,

View File

@ -1,4 +1,4 @@
const {AppSubUrl} = window.config;
const {appSubUrl} = window.config;
export function initOrgTeamSettings() {
// Change team access mode
@ -18,7 +18,7 @@ export function initOrgTeamSearchRepoBox() {
$searchRepoBox.search({
minCharacters: 2,
apiSettings: {
url: `${AppSubUrl}/api/v1/repos/search?q={query}&uid=${$searchRepoBox.data('uid')}`,
url: `${appSubUrl}/api/v1/repos/search?q={query}&uid=${$searchRepoBox.data('uid')}`,
onResponse(response) {
const items = [];
$.each(response.data, (_i, item) => {

View File

@ -1,7 +1,7 @@
const {csrf, PageIsProjects} = window.config;
const {csrfToken} = window.config;
export default async function initProject() {
if (!PageIsProjects) {
if (!$('.repository.projects').length) {
return;
}
@ -25,7 +25,7 @@ export default async function initProject() {
url: $(column).data('url'),
data: JSON.stringify({sorting: i, color: rgbToHex($(column).css('backgroundColor'))}),
headers: {
'X-Csrf-Token': csrf,
'X-Csrf-Token': csrfToken,
'X-Remote': true,
},
contentType: 'application/json',
@ -47,7 +47,7 @@ export default async function initProject() {
onAdd: (e) => {
$.ajax(`${e.to.dataset.url}/${e.item.dataset.issue}`, {
headers: {
'X-Csrf-Token': csrf,
'X-Csrf-Token': csrfToken,
'X-Remote': true,
},
contentType: 'application/json',
@ -83,7 +83,7 @@ export default async function initProject() {
url: $(this).data('url'),
data: JSON.stringify({title: projectTitleInput.val(), color: projectColorInput.val()}),
headers: {
'X-Csrf-Token': csrf,
'X-Csrf-Token': csrfToken,
'X-Remote': true,
},
contentType: 'application/json',
@ -107,7 +107,7 @@ export default async function initProject() {
method: 'POST',
url: $(this).data('url'),
headers: {
'X-Csrf-Token': csrf,
'X-Csrf-Token': csrfToken,
'X-Remote': true,
},
contentType: 'application/json',
@ -123,7 +123,7 @@ export default async function initProject() {
$.ajax({
url: $(this).data('url'),
headers: {
'X-Csrf-Token': csrf,
'X-Csrf-Token': csrfToken,
'X-Remote': true,
},
contentType: 'application/json',
@ -144,7 +144,7 @@ export default async function initProject() {
url: $(this).data('url'),
data: JSON.stringify({title: boardTitle.val(), color: projectColorInput.val()}),
headers: {
'X-Csrf-Token': csrf,
'X-Csrf-Token': csrfToken,
'X-Remote': true,
},
contentType: 'application/json',

View File

@ -1,11 +1,11 @@
const {csrf} = window.config;
const {csrfToken} = window.config;
function getArchive($target, url, first) {
$.ajax({
url,
type: 'POST',
data: {
_csrf: csrf,
_csrf: csrfToken,
},
complete(xhr) {
if (xhr.status === 200) {

View File

@ -1,6 +1,6 @@
import {initCompReactionSelector} from './comp/ReactionSelector.js';
const {csrf} = window.config;
const {csrfToken} = window.config;
export function initRepoDiffReviewButton() {
$(document).on('click', 'button[name="is_review"]', (e) => {
@ -45,7 +45,7 @@ export function initRepoDiffConversationForm() {
const action = $(this).data('action');
const url = $(this).data('update-url');
const data = await $.post(url, {_csrf: csrf, origin, action, comment_id});
const data = await $.post(url, {_csrf: csrfToken, origin, action, comment_id});
if ($(this).closest('.conversation-holder').length) {
const conversation = $(data);

View File

@ -1,7 +1,7 @@
import {initMarkupContent} from '../markup/content.js';
import {createCodeEditor} from './codeeditor.js';
const {csrf} = window.config;
const {csrfToken} = window.config;
let previewFileModes;
@ -21,7 +21,7 @@ function initEditPreviewTab($form) {
}
context = context.substring(0, context.lastIndexOf('/'));
$.post($this.data('url'), {
_csrf: csrf,
_csrf: csrfToken,
mode,
context,
text: $form.find(`.tab[data-tab="${$tabMenu.data('write')}"] textarea`).val()
@ -40,7 +40,7 @@ function initEditDiffTab($form) {
$tabMenu.find(`.item[data-tab="${$tabMenu.data('diff')}"]`).on('click', function () {
const $this = $(this);
$.post($this.data('url'), {
_csrf: csrf,
_csrf: csrfToken,
context: $this.data('context'),
content: $form.find(`.tab[data-tab="${$tabMenu.data('write')}"] textarea`).val()
}, (data) => {

View File

@ -1,6 +1,6 @@
import {stripTags} from '../utils.js';
const {AppSubUrl, csrf} = window.config;
const {appSubUrl, csrfToken} = window.config;
export function initRepoTopicBar() {
const mgrBtn = $('#manage_topic');
@ -30,7 +30,7 @@ export function initRepoTopicBar() {
const topics = $('input[name=topics]').val();
$.post(saveBtn.data('link'), {
_csrf: csrf,
_csrf: csrfToken,
topics
}, (_data, _textStatus, xhr) => {
if (xhr.responseJSON.status === 'ok') {
@ -41,7 +41,7 @@ export function initRepoTopicBar() {
const last = viewDiv.children('a').last();
for (let i = 0; i < topicArray.length; i++) {
const link = $('<a class="ui repo-topic large label topic"></a>');
link.attr('href', `${AppSubUrl}/explore/repos?q=${encodeURIComponent(topicArray[i])}&topic=1`);
link.attr('href', `${appSubUrl}/explore/repos?q=${encodeURIComponent(topicArray[i])}&topic=1`);
link.text(topicArray[i]);
link.insertBefore(last);
}
@ -90,7 +90,7 @@ export function initRepoTopicBar() {
label: 'ui small label'
},
apiSettings: {
url: `${AppSubUrl}/api/v1/topics/search?q={query}`,
url: `${appSubUrl}/api/v1/topics/search?q={query}`,
throttle: 500,
cache: false,
onResponse(res) {

View File

@ -4,7 +4,7 @@ import {createCommentSimpleMDE} from './comp/CommentSimpleMDE.js';
import {initCompImagePaste} from './comp/ImagePaste.js';
import {initCompMarkupContentPreviewTab} from './comp/MarkupContentPreview.js';
const {AppSubUrl, csrf} = window.config;
const {appSubUrl, csrfToken} = window.config;
export function initRepoIssueTimeTracking() {
$(document).on('click', '.issue-add-time', () => {
@ -58,7 +58,7 @@ function updateDeadline(deadlineString) {
due_date: realDeadline,
}),
headers: {
'X-Csrf-Token': csrf,
'X-Csrf-Token': csrfToken,
'X-Remote': true,
},
contentType: 'application/json',
@ -91,9 +91,9 @@ export function initRepoIssueList() {
const repoId = $('#repoId').val();
const crossRepoSearch = $('#crossRepoSearch').val();
const tp = $('#type').val();
let issueSearchUrl = `${AppSubUrl}/api/v1/repos/${repolink}/issues?q={query}&type=${tp}`;
let issueSearchUrl = `${appSubUrl}/api/v1/repos/${repolink}/issues?q={query}&type=${tp}`;
if (crossRepoSearch === 'true') {
issueSearchUrl = `${AppSubUrl}/api/v1/repos/issues/search?q={query}&priority_repo_id=${repoId}&type=${tp}`;
issueSearchUrl = `${appSubUrl}/api/v1/repos/issues/search?q={query}&priority_repo_id=${repoId}&type=${tp}`;
}
$('#new-dependency-drop-list')
.dropdown({
@ -157,7 +157,7 @@ export function initRepoIssueCommentDelete() {
const $this = $(this);
if (window.confirm($this.data('locale'))) {
$.post($this.data('url'), {
_csrf: csrf,
_csrf: csrfToken,
}).done(() => {
const $conversationHolder = $this.closest('.conversation-holder');
$(`#${$this.data('comment-id')}`).remove();
@ -258,7 +258,7 @@ export function initRepoPullRequestUpdate() {
const redirect = $this.data('redirect');
$this.addClass('loading');
$.post($this.data('do'), {
_csrf: csrf
_csrf: csrfToken
}).done((data) => {
if (data.redirect) {
window.location.href = data.redirect;
@ -291,7 +291,7 @@ export function initRepoIssueReferenceRepositorySearch() {
$('.issue_reference_repository_search')
.dropdown({
apiSettings: {
url: `${AppSubUrl}/api/v1/repos/search?q={query}&limit=20`,
url: `${appSubUrl}/api/v1/repos/search?q={query}&limit=20`,
onResponse(response) {
const filteredResponse = {success: true, results: []};
$.each(response.data, (_r, repo) => {
@ -306,7 +306,7 @@ export function initRepoIssueReferenceRepositorySearch() {
},
onChange(_value, _text, $choice) {
const $form = $choice.closest('form');
$form.attr('action', `${AppSubUrl}/${_text}/issues/new`);
$form.attr('action', `${appSubUrl}/${_text}/issues/new`);
},
fullTextSearch: true
});
@ -338,7 +338,7 @@ export function updateIssuesMeta(url, action, issueIds, elementId) {
type: 'POST',
url,
data: {
_csrf: csrf,
_csrf: csrfToken,
action,
issue_ids: issueIds,
id: elementId,
@ -556,7 +556,7 @@ export function initRepoIssueWipToggle() {
e.preventDefault();
const {title, wipPrefix, updateUrl} = e.currentTarget.closest('.toggle-wip').dataset;
await $.post(updateUrl, {
_csrf: csrf,
_csrf: csrfToken,
title: title?.startsWith(wipPrefix) ? title.substr(wipPrefix.length).trim() : `${wipPrefix.trim()} ${title}`,
});
window.location.reload();
@ -591,7 +591,7 @@ export function initRepoIssueTitleEdit() {
return false;
}
$.post(update_url, {
_csrf: csrf,
_csrf: csrfToken,
target_branch: targetBranch
}).done((data) => {
$branchTarget.text(data.base_branch);
@ -606,7 +606,7 @@ export function initRepoIssueTitleEdit() {
pullrequest_targetbranch_change(pullrequest_target_update_url);
} else {
$.post($(this).data('update-url'), {
_csrf: csrf,
_csrf: csrfToken,
title: $editInput.val()
}, (data) => {
$editInput.val(data.title);

View File

@ -27,7 +27,7 @@ import {initCommentContent, initMarkupContent} from '../markup/content.js';
import {initCompReactionSelector} from './comp/ReactionSelector.js';
import {initRepoSettingBranches} from './repo-settings.js';
const {csrf} = window.config;
const {csrfToken} = window.config;
const commentMDEditors = {};
@ -54,7 +54,7 @@ export function initRepoCommentForm() {
if (editMode === 'true') {
const form = $('#update_issueref_form');
$.post(form.attr('action'), {_csrf: csrf, ref: selectedValue}, () => window.location.reload());
$.post(form.attr('action'), {_csrf: csrfToken, ref: selectedValue}, () => window.location.reload());
} else if (editMode === '') {
$selectBranch.find('.ui .branch-name').text(selectedValue);
}
@ -370,7 +370,7 @@ export async function initRepository() {
const fileUuidDict = {};
dz = await createDropzone($dropzone[0], {
url: $dropzone.data('upload-url'),
headers: {'X-Csrf-Token': csrf},
headers: {'X-Csrf-Token': csrfToken},
maxFiles: $dropzone.data('max-file'),
maxFilesize: $dropzone.data('max-size'),
acceptedFiles: (['*/*', ''].includes($dropzone.data('accepts'))) ? null : $dropzone.data('accepts'),
@ -396,7 +396,7 @@ export async function initRepository() {
if ($dropzone.data('remove-url') && !fileUuidDict[file.uuid].submitted) {
$.post($dropzone.data('remove-url'), {
file: file.uuid,
_csrf: csrf,
_csrf: csrfToken,
});
}
});
@ -458,7 +458,7 @@ export async function initRepository() {
return $(this).val();
}).get();
$.post($editContentZone.data('update-url'), {
_csrf: csrf,
_csrf: csrfToken,
content: $textarea.val(),
context: $editContentZone.data('context'),
files: $attachments,

View File

@ -1,4 +1,4 @@
const {AppSubUrl, csrf} = window.config;
const {appSubUrl, csrfToken} = window.config;
export function initRepoMigrationStatusChecker() {
const migrating = $('#repo_migrating');
@ -12,9 +12,9 @@ export function initRepoMigrationStatusChecker() {
}
$.ajax({
type: 'GET',
url: `${AppSubUrl}/user/task/${task}`,
url: `${appSubUrl}/user/task/${task}`,
data: {
_csrf: csrf,
_csrf: csrfToken,
},
complete(xhr) {
if (xhr.status === 200 && xhr.responseJSON) {

View File

@ -1,14 +1,14 @@
import {createMonaco} from './codeeditor.js';
import {initRepoCommonFilterSearchDropdown} from './repo-common.js';
const {AppSubUrl, csrf} = window.config;
const {appSubUrl, csrfToken} = window.config;
export function initRepoSettingsCollaboration() {
// Change collaborator access mode
$('.access-mode.menu .item').on('click', function () {
const $menu = $(this).parent();
$.post($menu.data('url'), {
_csrf: csrf,
_csrf: csrfToken,
uid: $menu.data('uid'),
mode: $(this).data('value')
});
@ -20,8 +20,8 @@ export function initRepoSettingSearchTeamBox() {
$searchTeamBox.search({
minCharacters: 2,
apiSettings: {
url: `${AppSubUrl}/api/v1/orgs/${$searchTeamBox.data('org')}/teams/search?q={query}`,
headers: {'X-Csrf-Token': csrf},
url: `${appSubUrl}/api/v1/orgs/${$searchTeamBox.data('org')}/teams/search?q={query}`,
headers: {'X-Csrf-Token': csrfToken},
onResponse(response) {
const items = [];
$.each(response.data, (_i, item) => {

View File

@ -1,6 +1,6 @@
import {htmlEscape} from 'escape-goat';
const {AppSubUrl} = window.config;
const {appSubUrl} = window.config;
export function initRepoTemplateSearch() {
const $repoTemplate = $('#repo_template');
@ -22,7 +22,7 @@ export function initRepoTemplateSearch() {
$('#repo_template_search')
.dropdown({
apiSettings: {
url: `${AppSubUrl}/api/v1/repos/search?q={query}&template=true&priority_owner_id=${$('#uid').val()}`,
url: `${appSubUrl}/api/v1/repos/search?q={query}&template=true&priority_owner_id=${$('#uid').val()}`,
onResponse(response) {
const filteredResponse = {success: true, results: []};
filteredResponse.results.push({

View File

@ -1,7 +1,7 @@
import {initMarkupContent} from '../markup/content.js';
import {initCompMarkupContentPreviewTab} from './comp/MarkupContentPreview.js';
const {csrf} = window.config;
const {csrfToken} = window.config;
export function initRepoWikiForm() {
const $editArea = $('.repository.wiki textarea#edit_area');
@ -22,7 +22,7 @@ export function initRepoWikiForm() {
sideBySideTimeout = null;
}
$.post($editArea.data('url'), {
_csrf: csrf,
_csrf: csrfToken,
mode: 'gfm',
context: $editArea.data('context'),
text: plainText,

View File

@ -1,8 +1,8 @@
import {joinPaths} from '../utils.js';
const {UseServiceWorker, AssetUrlPrefix, AppVer} = window.config;
const {useServiceWorker, assetUrlPrefix, appVer} = window.config;
const cachePrefix = 'static-cache-v'; // actual version is set in the service worker script
const workerAssetPath = joinPaths(AssetUrlPrefix, 'serviceworker.js');
const workerAssetPath = joinPaths(assetUrlPrefix, 'serviceworker.js');
async function unregisterAll() {
for (const registration of await navigator.serviceWorker.getRegistrations()) {
@ -24,7 +24,7 @@ async function invalidateCache() {
}
async function checkCacheValidity() {
const cacheKey = AppVer;
const cacheKey = appVer;
const storedCacheKey = localStorage.getItem('staticCacheKey');
// invalidate cache if it belongs to a different gitea version
@ -37,7 +37,7 @@ async function checkCacheValidity() {
export default async function initServiceWorker() {
if (!('serviceWorker' in navigator)) return;
if (UseServiceWorker) {
if (useServiceWorker) {
// unregister all service workers where scriptURL does not match the current one
await unregisterOtherWorkers();
try {

View File

@ -1,10 +1,10 @@
import prettyMilliseconds from 'pretty-ms';
const {AppSubUrl, csrf, NotificationSettings, EnableTimetracking} = window.config;
const {appSubUrl, csrfToken, notificationSettings, enableTimeTracking} = window.config;
let updateTimeInterval = null; // holds setInterval id when active
export async function initStopwatch() {
if (!EnableTimetracking) {
if (!enableTimeTracking) {
return;
}
@ -25,7 +25,7 @@ export async function initStopwatch() {
$(this).parent().trigger('submit');
});
if (NotificationSettings.EventSourceUpdateTime > 0 && !!window.EventSource && window.SharedWorker) {
if (notificationSettings.EventSourceUpdateTime > 0 && !!window.EventSource && window.SharedWorker) {
// Try to connect to the event source via the shared worker first
const worker = new SharedWorker(`${__webpack_public_path__}js/eventsource.sharedworker.js`, 'notification-worker');
worker.addEventListener('error', (event) => {
@ -36,7 +36,7 @@ export async function initStopwatch() {
});
worker.port.postMessage({
type: 'start',
url: `${window.location.origin}${AppSubUrl}/user/events`,
url: `${window.location.origin}${appSubUrl}/user/events`,
});
worker.port.addEventListener('message', (event) => {
if (!event.data || !event.data.type) {
@ -55,7 +55,7 @@ export async function initStopwatch() {
type: 'close',
});
worker.port.close();
window.location.href = AppSubUrl;
window.location.href = appSubUrl;
} else if (event.data.type === 'close') {
worker.port.postMessage({
type: 'close',
@ -77,7 +77,7 @@ export async function initStopwatch() {
return;
}
if (NotificationSettings.MinTimeout <= 0) {
if (notificationSettings.MinTimeout <= 0) {
return;
}
@ -87,7 +87,7 @@ export async function initStopwatch() {
}, timeout);
};
fn(NotificationSettings.MinTimeout);
fn(notificationSettings.MinTimeout);
const currSeconds = $('.stopwatch-time').data('seconds');
if (currSeconds) {
@ -99,9 +99,9 @@ async function updateStopwatchWithCallback(callback, timeout) {
const isSet = await updateStopwatch();
if (!isSet) {
timeout = NotificationSettings.MinTimeout;
} else if (timeout < NotificationSettings.MaxTimeout) {
timeout += NotificationSettings.TimeoutStep;
timeout = notificationSettings.MinTimeout;
} else if (timeout < notificationSettings.MaxTimeout) {
timeout += notificationSettings.TimeoutStep;
}
callback(timeout);
@ -110,8 +110,8 @@ async function updateStopwatchWithCallback(callback, timeout) {
async function updateStopwatch() {
const data = await $.ajax({
type: 'GET',
url: `${AppSubUrl}/api/v1/user/stopwatches`,
headers: {'X-Csrf-Token': csrf},
url: `${appSubUrl}/api/v1/user/stopwatches`,
headers: {'X-Csrf-Token': csrfToken},
});
if (updateTimeInterval) {
@ -129,7 +129,7 @@ async function updateStopwatchData(data) {
btnEl.addClass('hidden');
} else {
const {repo_owner_name, repo_name, issue_index, seconds} = watch;
const issueUrl = `${AppSubUrl}/${repo_owner_name}/${repo_name}/issues/${issue_index}`;
const issueUrl = `${appSubUrl}/${repo_owner_name}/${repo_name}/issues/${issue_index}`;
$('.stopwatch-link').attr('href', issueUrl);
$('.stopwatch-commit').attr('action', `${issueUrl}/times/stopwatch/toggle`);
$('.stopwatch-cancel').attr('action', `${issueUrl}/times/stopwatch/cancel`);

View File

@ -49,7 +49,7 @@ function makeCollections({mentions, emoji}) {
}
export default async function attachTribute(elementOrNodeList, {mentions, emoji} = {}) {
if (!window.config.Tribute || !elementOrNodeList) return;
if (!window.config.requireTribute || !elementOrNodeList) return;
const nodes = Array.from('length' in elementOrNodeList ? elementOrNodeList : [elementOrNodeList]);
if (!nodes.length) return;

View File

@ -1,11 +1,11 @@
const {AppSubUrl, csrf} = window.config;
const {appSubUrl, csrfToken} = window.config;
export function initUserAuthU2fAuth() {
if ($('#wait-for-key').length === 0) {
return;
}
u2fApi.ensureSupport().then(() => {
$.getJSON(`${AppSubUrl}/user/u2f/challenge`).done((req) => {
$.getJSON(`${appSubUrl}/user/u2f/challenge`).done((req) => {
u2fApi.sign(req.appId, req.challenge, req.registeredKeys, 30)
.then(u2fSigned)
.catch((err) => {
@ -18,15 +18,15 @@ export function initUserAuthU2fAuth() {
});
}).catch(() => {
// Fallback in case browser do not support U2F
window.location.href = `${AppSubUrl}/user/two_factor`;
window.location.href = `${appSubUrl}/user/two_factor`;
});
}
function u2fSigned(resp) {
$.ajax({
url: `${AppSubUrl}/user/u2f/sign`,
url: `${appSubUrl}/user/u2f/sign`,
type: 'POST',
headers: {'X-Csrf-Token': csrf},
headers: {'X-Csrf-Token': csrfToken},
data: JSON.stringify(resp),
contentType: 'application/json; charset=utf-8',
}).done((res) => {
@ -41,9 +41,9 @@ function u2fRegistered(resp) {
return;
}
$.ajax({
url: `${AppSubUrl}/user/settings/security/u2f/register`,
url: `${appSubUrl}/user/settings/security/u2f/register`,
type: 'POST',
headers: {'X-Csrf-Token': csrf},
headers: {'X-Csrf-Token': csrfToken},
data: JSON.stringify(resp),
contentType: 'application/json; charset=utf-8',
success() {
@ -99,8 +99,8 @@ export function initUserAuthU2fRegister() {
}
function u2fRegisterRequest() {
$.post(`${AppSubUrl}/user/settings/security/u2f/request_register`, {
_csrf: csrf,
$.post(`${appSubUrl}/user/settings/security/u2f/request_register`, {
_csrf: csrfToken,
name: $('#nickname').val()
}).done((req) => {
$('#nickname').closest('div.field').removeClass('error');

View File

@ -1,4 +1,4 @@
const {MermaidMaxSourceCharacters} = window.config;
const {mermaidMaxSourceCharacters} = window.config;
function displayError(el, err) {
el.closest('pre').classList.remove('is-loading');
@ -26,8 +26,8 @@ export async function renderMermaid(els) {
});
for (const el of els) {
if (MermaidMaxSourceCharacters >= 0 && el.textContent.length > MermaidMaxSourceCharacters) {
displayError(el, new Error(`Mermaid source of ${el.textContent.length} characters exceeds the maximum allowed length of ${MermaidMaxSourceCharacters}.`));
if (mermaidMaxSourceCharacters >= 0 && el.textContent.length > mermaidMaxSourceCharacters) {
displayError(el, new Error(`Mermaid source of ${el.textContent.length} characters exceeds the maximum allowed length of ${mermaidMaxSourceCharacters}.`));
continue;
}

View File

@ -47,7 +47,7 @@ export function initMarkupTasklist() {
await $.post(updateUrl, {
ignore_attachments: true,
_csrf: window.config.csrf,
_csrf: window.config.csrfToken,
content: newContent,
context
});

View File

@ -1,6 +1,6 @@
// This sets up the URL prefix used in webpack's chunk loading.
// This file must be imported before any lazy-loading is being attempted.
import {joinPaths} from './utils.js';
const {AssetUrlPrefix} = window.config;
const {assetUrlPrefix} = window.config;
__webpack_public_path__ = joinPaths(AssetUrlPrefix, '/');
__webpack_public_path__ = joinPaths(assetUrlPrefix, '/');