From c3af1698e1a806262d462d951730ddd7da480494 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 00:08:58 +0300 Subject: [PATCH 01/34] some outstanding issues --- build/check-versions.mjs | 41 ---------------------------------------- build/commit_hash.js | 2 +- build/update-emoji.js | 8 ++++---- 3 files changed, 5 insertions(+), 46 deletions(-) delete mode 100644 build/check-versions.mjs diff --git a/build/check-versions.mjs b/build/check-versions.mjs deleted file mode 100644 index c22004b00..000000000 --- a/build/check-versions.mjs +++ /dev/null @@ -1,41 +0,0 @@ -import chalk from 'chalk' -import semver from 'semver' - -import packageConfig from '../package.json' with { type: 'json' } - -var versionRequirements = [ - { - name: 'node', - currentVersion: semver.clean(process.version), - versionRequirement: packageConfig.engines.node, - }, -] - -export default function () { - const warnings = [] - for (let i = 0; i < versionRequirements.length; i++) { - const mod = versionRequirements[i] - if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { - warnings.push( - mod.name + - ': ' + - chalk.red(mod.currentVersion) + - ' should be ' + - chalk.green(mod.versionRequirement), - ) - } - } - - if (warnings.length) { - console.warn( - chalk.yellow( - '\nTo use this template, you must update following to modules:\n', - ), - ) - for (let i = 0; i < warnings.length; i++) { - const warning = warnings[i] - console.warn(' ' + warning) - } - process.exit(1) - } -} diff --git a/build/commit_hash.js b/build/commit_hash.js index c60355804..480672fa3 100644 --- a/build/commit_hash.js +++ b/build/commit_hash.js @@ -1,4 +1,4 @@ -import childProcess from 'child_process' +import childProcess from 'node:child_process' export const getCommitHash = () => { const subst = '$Format:%h$' diff --git a/build/update-emoji.js b/build/update-emoji.js index 4ff7e1de8..562caa3f0 100644 --- a/build/update-emoji.js +++ b/build/update-emoji.js @@ -1,10 +1,10 @@ import emojis from '@kazvmoe-infra/unicode-emoji-json/data-by-group.json' with { type: 'json', } -import fs from 'fs' +import fs from 'node:fs' Object.keys(emojis).map((k) => { - emojis[k].map((e) => { + emojis[k].forEach((e) => { delete e.unicode_version delete e.emoji_version delete e.skin_tone_support_unicode_version @@ -12,8 +12,8 @@ Object.keys(emojis).map((k) => { }) const res = {} -Object.keys(emojis).map((k) => { - const groupId = k.replace('&', 'and').replace(/ /g, '-').toLowerCase() +Object.keys(emojis).forEach((k) => { + const groupId = k.replace('&', 'and').replaceAll(/ /, '-').toLowerCase() res[groupId] = emojis[k] }) From 5ce2ce63bef01a9ae8f982c3fb5901397d38ff6c Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 00:18:12 +0300 Subject: [PATCH 02/34] lint regex --- build/commit_hash.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/commit_hash.js b/build/commit_hash.js index 480672fa3..8225817ee 100644 --- a/build/commit_hash.js +++ b/build/commit_hash.js @@ -2,7 +2,7 @@ import childProcess from 'node:child_process' export const getCommitHash = () => { const subst = '$Format:%h$' - if (!subst.match(/Format:/)) { + if (!/Format:/.exec(subst)) { return subst } else { try { From 11c4239cebcc9e34522002cc9b953334a2cda838 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 00:19:34 +0300 Subject: [PATCH 03/34] javascript:S7770 --- src/api/admin.js | 4 ++-- src/components/rich_content/rich_content.jsx | 2 +- src/components/settings_modal/tabs/appearance_tab.js | 2 +- .../settings_modal/tabs/style_tab/style_tab.js | 2 +- src/services/style_setter/style_setter.js | 2 +- src/services/theme_data/css_utils.js | 10 +++++----- src/services/theme_data/iss_serializer.js | 2 +- src/services/theme_data/theme2_to_theme3.js | 4 ++-- src/services/theme_data/theme_data_3.service.js | 8 ++++---- src/stores/interface.js | 2 +- 10 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/api/admin.js b/src/api/admin.js index c33f863a7..d4a9e8ff9 100644 --- a/src/api/admin.js +++ b/src/api/admin.js @@ -39,7 +39,7 @@ const USERS_URL_LIST = ({ isAdmin && 'is_admin', isModerator && 'is_moderator', ] - .filter((x) => x) + .filter(Boolean) .join(',') return `/api/v1/pleroma/admin/users?page=${page}&page_size=${pageSize}&filters=${filters_str}&query=${query}&name=${name}&email=${email}` } @@ -236,7 +236,7 @@ export const changeStatusScope = ({ opts: { id, sensitive, visibility }, credentials, }) => { - var payload = {} + const payload = {} if (typeof sensitive !== 'undefined') { payload['sensitive'] = sensitive } diff --git a/src/components/rich_content/rich_content.jsx b/src/components/rich_content/rich_content.jsx index 432250548..55f8179ff 100644 --- a/src/components/rich_content/rich_content.jsx +++ b/src/components/rich_content/rich_content.jsx @@ -335,7 +335,7 @@ export default { this.pauseMfm ? '-pause' : '', this.scaleMfm ? '-scale' : '', ] - .filter((x) => x) + .filter(Boolean) .join(' ') newAttrs['data-mfm-operator'] = mfmOperator switch (mfmOperator) { diff --git a/src/components/settings_modal/tabs/appearance_tab.js b/src/components/settings_modal/tabs/appearance_tab.js index c11579e53..0fe9bc022 100644 --- a/src/components/settings_modal/tabs/appearance_tab.js +++ b/src/components/settings_modal/tabs/appearance_tab.js @@ -401,7 +401,7 @@ const AppearanceTab = { } theme3 = init({ - inputRuleset: [...input, paletteRule].filter((x) => x), + inputRuleset: [...input, paletteRule].filter(Boolean), ultimateBackgroundColor: '#000000', liteMode: true, onlyNormalState: true, diff --git a/src/components/settings_modal/tabs/style_tab/style_tab.js b/src/components/settings_modal/tabs/style_tab/style_tab.js index 4d3ed1695..a023b4415 100644 --- a/src/components/settings_modal/tabs/style_tab/style_tab.js +++ b/src/components/settings_modal/tabs/style_tab/style_tab.js @@ -602,7 +602,7 @@ export default { .map((x) => Object.entries(x.directives)) .flat() }) - .filter((x) => x) + .filter(Boolean) .flat() .map(([name, value]) => { const [valType, valVal] = value.split('|') diff --git a/src/services/style_setter/style_setter.js b/src/services/style_setter/style_setter.js index 974d75ec0..83dc6ce2c 100644 --- a/src/services/style_setter/style_setter.js +++ b/src/services/style_setter/style_setter.js @@ -126,7 +126,7 @@ const generateTheme = (inputRuleset, callbacks, debug) => { const chunk = chunks[counter] Promise.all(chunk.map((x) => x())).then((result) => { getCssRules( - result.filter((x) => x), + result.filter(Boolean), debug, ).forEach((rule) => { onNewRule(rule, true) diff --git a/src/services/theme_data/css_utils.js b/src/services/theme_data/css_utils.js index 2e3758ad5..990db652c 100644 --- a/src/services/theme_data/css_utils.js +++ b/src/services/theme_data/css_utils.js @@ -104,7 +104,7 @@ export const getCssRules = (rules, debug) => : '', ' --background: ' + v, ] - .filter((x) => x) + .filter(Boolean) .join(';\n') } const color = getCssColorString( @@ -115,7 +115,7 @@ export const getCssRules = (rules, debug) => if (rule.directives.backgroundNoCssColor !== 'yes') { cssDirectives.push('background-color: ' + color) } - return cssDirectives.filter((x) => x).join(';\n') + return cssDirectives.filter(Boolean).join(';\n') } case 'blur': { const cssDirectives = [] @@ -157,7 +157,7 @@ export const getCssRules = (rules, debug) => return null } }) - .filter((x) => x) + .filter(Boolean) .map((x) => ' ' + x + ';') .join('\n') @@ -172,10 +172,10 @@ export const getCssRules = (rules, debug) => virtualDirectives, footer, ] - .filter((x) => x) + .filter(Boolean) .join('\n') }) - .filter((x) => x) + .filter(Boolean) export const getScopedVersion = (rules, newScope) => { return rules.map((x) => { diff --git a/src/services/theme_data/iss_serializer.js b/src/services/theme_data/iss_serializer.js index a9c3887dd..5a336f10b 100644 --- a/src/services/theme_data/iss_serializer.js +++ b/src/services/theme_data/iss_serializer.js @@ -62,6 +62,6 @@ export const serialize = (ruleset) => { return `${header} {\n${content.join(';\n')}\n}` }) - .filter((x) => x) + .filter(Boolean) .join('\n\n') } diff --git a/src/services/theme_data/theme2_to_theme3.js b/src/services/theme_data/theme2_to_theme3.js index aa323ac91..5bab4818c 100644 --- a/src/services/theme_data/theme2_to_theme3.js +++ b/src/services/theme_data/theme2_to_theme3.js @@ -558,9 +558,9 @@ export const convertTheme2To3 = (data) => { ) const flatExtRules = extendedRules - .filter((x) => x) + .filter(Boolean) .reduce((acc, x) => [...acc, ...x], []) - .filter((x) => x) + .filter(Boolean) .reduce((acc, x) => [...acc, ...x], []) return [ diff --git a/src/services/theme_data/theme_data_3.service.js b/src/services/theme_data/theme_data_3.service.js index 0c5c82991..626d7daeb 100644 --- a/src/services/theme_data/theme_data_3.service.js +++ b/src/services/theme_data/theme_data_3.service.js @@ -338,10 +338,10 @@ export const init = ({ const relevantRules = ruleset.filter((r) => r.component === component.name) const backgrounds = relevantRules .map((r) => r.directives.background) - .filter((x) => x) + .filter(Boolean) const opacities = relevantRules .map((r) => r.directives.opacity) - .filter((x) => x) + .filter(Boolean) if ( backgrounds.some((x) => x.match(/--parent/)) || opacities.some((x) => x != null && x < 1) @@ -596,7 +596,7 @@ export const init = ({ const shadow = value .split(/,/g) .map((s) => s.trim()) - .filter((x) => x) + .filter(Boolean) dynamicVars[k] = shadow if (combination.component === rootComponentName) { staticVars[k.substring(2)] = shadow @@ -752,7 +752,7 @@ export const init = ({ return processCombination(combination) } }) - .filter((x) => x) + .filter(Boolean) const t2 = performance.now() if (debug) { console.debug('Eager processing took ' + (t2 - t1) + ' ms') diff --git a/src/stores/interface.js b/src/stores/interface.js index 48d7cb061..8c101b9f4 100644 --- a/src/stores/interface.js +++ b/src/stores/interface.js @@ -749,7 +749,7 @@ export const useInterfaceStore = defineStore('interface', { this.styleDataUsed, paletteIss, hacks, - ].filter((x) => x) + ].filter(Boolean) return applyTheme( rulesetArray.flat(), From 100783b05b8eea344e5e9d0213ba73d66dd2d98f Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 00:23:27 +0300 Subject: [PATCH 04/34] sw plugin cleanup --- build/sw_plugin.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build/sw_plugin.js b/build/sw_plugin.js index 2f0a4819d..e6be7a738 100644 --- a/build/sw_plugin.js +++ b/build/sw_plugin.js @@ -31,7 +31,6 @@ export const buildSwPlugin = ({ swSrc, swDest }) => { name: 'build-sw-plugin', enforce: 'post', configResolved(resolvedConfig) { - resolvedConfig config = { define: resolvedConfig.define, resolve: resolvedConfig.resolve, @@ -60,7 +59,7 @@ export const buildSwPlugin = ({ swSrc, swDest }) => { sequential: true, async handler(_, bundle) { const assets = Object.keys(bundle) - .filter((name) => !/\.map$/.test(name)) + .filter((name) => !name.endsWith('.map')) .map((name) => '/' + name) config.plugins.push({ From 924baf6b017a96b4fa79f3618a17c758e3b80e37 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 00:23:54 +0300 Subject: [PATCH 05/34] docker e2e --- docker/e2e/Dockerfile.e2e | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docker/e2e/Dockerfile.e2e b/docker/e2e/Dockerfile.e2e index 7e3fbfbf1..b6a1af2e2 100644 --- a/docker/e2e/Dockerfile.e2e +++ b/docker/e2e/Dockerfile.e2e @@ -1,5 +1,10 @@ FROM mcr.microsoft.com/playwright:v1.61.0-jammy +RUN addgroup -S playwright \ + && adduser -S playwright -G playwright + +USER playwright + WORKDIR /app ENV PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 From d62716e301c68c1e4bb259b37868fb17c334e458 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 00:29:19 +0300 Subject: [PATCH 06/34] small cleanups and lints --- index.html | 2 +- public/static/terms-of-service.html | 2 +- src/App.scss | 7 +++---- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/index.html b/index.html index 26eeee19b..346b9f06c 100644 --- a/index.html +++ b/index.html @@ -31,7 +31,7 @@
- + A cute mascot
diff --git a/public/static/terms-of-service.html b/public/static/terms-of-service.html index 2b7bf7697..19db6408e 100644 --- a/public/static/terms-of-service.html +++ b/public/static/terms-of-service.html @@ -6,4 +6,4 @@ Pleroma install containing the real ToS for your instance.

See the Pleroma documentation for more information.


- +Pleroma Logo diff --git a/src/App.scss b/src/App.scss index 0de5a3577..6748dbaa7 100644 --- a/src/App.scss +++ b/src/App.scss @@ -1,10 +1,10 @@ +@import '@fortawesome/fontawesome-svg-core/styles.css'; +@import '@kazvmoe-infra/pinch-zoom-element/dist/pinch-zoom.css'; + // stylelint-disable rscss/class-format /* stylelint-disable no-descending-specificity */ @use "panel"; -@import '@fortawesome/fontawesome-svg-core/styles.css'; -@import '@kazvmoe-infra/pinch-zoom-element/dist/pinch-zoom.css'; - :root { --status-margin: 0.75em; --post-line-height: 1.4; @@ -934,7 +934,6 @@ option { #splash { pointer-events: none; - // transition: opacity 0.5s; #status { &.css-ok { From 0eb63de20936a254d6db46f864fea50a7a4486c3 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 00:31:24 +0300 Subject: [PATCH 07/34] undefined typeof --- src/boot/after_store.js | 6 +++--- src/components/chat/chat.js | 4 ++-- src/components/color_input/color_input.vue | 2 +- src/components/opacity_input/opacity_input.vue | 2 +- src/components/range_input/range_input.vue | 2 +- src/components/roundness_input/roundness_input.vue | 2 +- src/components/settings_modal/helpers/setting.js | 2 +- .../tabs/old_theme_tab/old_theme_tab.js | 12 ++++++------ src/components/timeline/timeline.js | 4 ++-- src/components/video_attachment/video_attachment.js | 6 +++--- src/services/color_convert/color_convert.js | 2 +- .../entity_normalizer/entity_normalizer.service.js | 2 +- src/services/theme_data/theme_data.service.js | 4 ++-- 13 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/boot/after_store.js b/src/boot/after_store.js index 4ccfa4d41..5ba5e8d76 100644 --- a/src/boot/after_store.js +++ b/src/boot/after_store.js @@ -409,7 +409,7 @@ const getNodeInfo = async ({ store }) => { useInstanceCapabilitiesStore().set( 'tagPolicyAvailable', - typeof federation.mrf_policies === 'undefined' + federation.mrf_policies === undefined ? false : metadata.federation.mrf_policies.includes('TagPolicy'), ) @@ -421,7 +421,7 @@ const getNodeInfo = async ({ store }) => { useInstanceStore().set({ path: 'federating', value: - typeof federation.enabled === 'undefined' ? true : federation.enabled, + federation.enabled === undefined ? true : federation.enabled, }) const accountActivationRequired = metadata.accountActivationRequired @@ -547,7 +547,7 @@ const afterStoreSetup = async ({ pinia, store, storageError, i18n }) => { const overrides = window.___pleromafe_dev_overrides || {} const server = - typeof overrides.target !== 'undefined' + overrides.target !== undefined ? overrides.target : window.location.origin useInstanceStore().set({ path: 'server', value: server }) diff --git a/src/components/chat/chat.js b/src/components/chat/chat.js index ca7a025ec..6ac51902b 100644 --- a/src/components/chat/chat.js +++ b/src/components/chat/chat.js @@ -59,7 +59,7 @@ const Chat = { }, mounted() { window.addEventListener('scroll', this.handleScroll) - if (typeof document.hidden !== 'undefined') { + if (document.hidden !== undefined) { document.addEventListener( 'visibilitychange', this.handleVisibilityChange, @@ -74,7 +74,7 @@ const Chat = { unmounted() { window.removeEventListener('scroll', this.handleScroll) window.removeEventListener('resize', this.handleResize) - if (typeof document.hidden !== 'undefined') + if (document.hidden !== undefined) document.removeEventListener( 'visibilitychange', this.handleVisibilityChange, diff --git a/src/components/color_input/color_input.vue b/src/components/color_input/color_input.vue index 208bdf2dc..d6667c28f 100644 --- a/src/components/color_input/color_input.vue +++ b/src/components/color_input/color_input.vue @@ -134,7 +134,7 @@ export default { emits: ['update:modelValue'], computed: { present() { - return typeof this.modelValue !== 'undefined' + return this.modelValue !== undefined }, validColor() { return hex2rgb(this.modelValue || this.fallback) diff --git a/src/components/opacity_input/opacity_input.vue b/src/components/opacity_input/opacity_input.vue index 761aeb216..e6b736fa3 100644 --- a/src/components/opacity_input/opacity_input.vue +++ b/src/components/opacity_input/opacity_input.vue @@ -42,7 +42,7 @@ export default { emits: ['update:modelValue'], computed: { present() { - return typeof this.modelValue !== 'undefined' + return this.modelValue !== undefined }, }, } diff --git a/src/components/range_input/range_input.vue b/src/components/range_input/range_input.vue index 91d3dcc3b..40c427784 100644 --- a/src/components/range_input/range_input.vue +++ b/src/components/range_input/range_input.vue @@ -68,7 +68,7 @@ export default { emits: ['update:modelValue'], computed: { present() { - return typeof this.modelValue !== 'undefined' + return this.modelValue !== undefined }, }, } diff --git a/src/components/roundness_input/roundness_input.vue b/src/components/roundness_input/roundness_input.vue index caf21763b..36fa8fd47 100644 --- a/src/components/roundness_input/roundness_input.vue +++ b/src/components/roundness_input/roundness_input.vue @@ -42,7 +42,7 @@ export default { emits: ['update:modelValue'], computed: { present() { - return typeof this.modelValue !== 'undefined' + return this.modelValue !== undefined }, }, } diff --git a/src/components/settings_modal/helpers/setting.js b/src/components/settings_modal/helpers/setting.js index 3b76708fe..c2f5279f6 100644 --- a/src/components/settings_modal/helpers/setting.js +++ b/src/components/settings_modal/helpers/setting.js @@ -159,7 +159,7 @@ export default { return this.source || this.defaultSource }, realDraftMode() { - return typeof this.draftMode === 'undefined' + return this.draftMode === undefined ? this.defaultDraftMode : this.draftMode }, diff --git a/src/components/settings_modal/tabs/old_theme_tab/old_theme_tab.js b/src/components/settings_modal/tabs/old_theme_tab/old_theme_tab.js index 83f993c86..cce4a764f 100644 --- a/src/components/settings_modal/tabs/old_theme_tab/old_theme_tab.js +++ b/src/components/settings_modal/tabs/old_theme_tab/old_theme_tab.js @@ -147,7 +147,7 @@ export default { }) }, mounted() { - if (typeof this.shadowSelected === 'undefined') { + if (this.shadowSelected === undefined) { this.shadowSelected = this.shadowsAvailable[0] } }, @@ -634,15 +634,15 @@ export default { if (input.version) version = input.version // Old v1 naming: fg is text, btn is foreground if ( - typeof colors.text === 'undefined' && - typeof colors.fg !== 'undefined' + colors.text === undefined && + colors.fg !== undefined ) { version = 1 } // New v2 naming: text is text, fg is foreground if ( - typeof colors.text !== 'undefined' && - typeof colors.fg !== 'undefined' + colors.text !== undefined && + colors.fg !== undefined ) { version = 2 } @@ -679,7 +679,7 @@ export default { if (opacity && !this.keepOpacity) { this.clearOpacity() Object.entries(opacity).forEach(([k, v]) => { - if (typeof v === 'undefined' || v === null || Number.isNaN(v)) return + if (v === undefined || v === null || Number.isNaN(v)) return this[k + 'OpacityLocal'] = v }) } diff --git a/src/components/timeline/timeline.js b/src/components/timeline/timeline.js index 50b2acd90..8c5f4f251 100644 --- a/src/components/timeline/timeline.js +++ b/src/components/timeline/timeline.js @@ -154,7 +154,7 @@ const Timeline = { }) }, mounted() { - if (typeof document.hidden !== 'undefined') { + if (document.hidden !== undefined) { document.addEventListener( 'visibilitychange', this.handleVisibilityChange, @@ -168,7 +168,7 @@ const Timeline = { unmounted() { window.removeEventListener('scroll', this.handleScroll) window.removeEventListener('keydown', this.handleShortKey) - if (typeof document.hidden !== 'undefined') + if (document.hidden !== undefined) document.removeEventListener( 'visibilitychange', this.handleVisibilityChange, diff --git a/src/components/video_attachment/video_attachment.js b/src/components/video_attachment/video_attachment.js index 690409169..5e702723d 100644 --- a/src/components/video_attachment/video_attachment.js +++ b/src/components/video_attachment/video_attachment.js @@ -34,15 +34,15 @@ const VideoAttachment = { // If hasAudio is false, we've already marked this video to not have audio, // a video can't gain audio out of nowhere so don't bother checking again. if (!this.hasAudio) return - if (typeof target.webkitAudioDecodedByteCount !== 'undefined') { + if (target.webkitAudioDecodedByteCount !== undefined) { // non-zero if video has audio track if (target.webkitAudioDecodedByteCount > 0) return } - if (typeof target.mozHasAudio !== 'undefined') { + if (target.mozHasAudio !== undefined) { // true if video has audio track if (target.mozHasAudio) return } - if (typeof target.audioTracks !== 'undefined') { + if (target.audioTracks !== undefined) { if (target.audioTracks.length > 0) return } this.hasAudio = false diff --git a/src/services/color_convert/color_convert.js b/src/services/color_convert/color_convert.js index 9840f9726..26f279764 100644 --- a/src/services/color_convert/color_convert.js +++ b/src/services/color_convert/color_convert.js @@ -271,7 +271,7 @@ export const getTextColor = function (bg, text, preserve) { contrast = getContrastRatio(bg, convert(result).rgb) } - const base = typeof text.a !== 'undefined' ? { a: text.a } : {} + const base = text.a !== undefined ? { a: text.a } : {} return Object.assign(convert(result).rgb, base) } diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js index 94a5681be..8721189d1 100644 --- a/src/services/entity_normalizer/entity_normalizer.service.js +++ b/src/services/entity_normalizer/entity_normalizer.service.js @@ -177,7 +177,7 @@ export const parseUser = (data) => { // deactivated was changed to is_active in Pleroma 2.3.0 // so check if is_active is present output.deactivated = - typeof data.pleroma.is_active !== 'undefined' + data.pleroma.is_active !== undefined ? !data.pleroma.is_active // new backend : data.pleroma.deactivated // old backend diff --git a/src/services/theme_data/theme_data.service.js b/src/services/theme_data/theme_data.service.js index 7dcb97fed..201cd9ab4 100644 --- a/src/services/theme_data/theme_data.service.js +++ b/src/services/theme_data/theme_data.service.js @@ -523,7 +523,7 @@ export const generateColors = (themeData) => { (acc, [k, v]) => { if (!v) return acc acc.solid[k] = rgb2hex(v) - acc.complete[k] = typeof v.a === 'undefined' ? rgb2hex(v) : rgba2css(v) + acc.complete[k] = v.a === undefined ? rgb2hex(v) : rgba2css(v) return acc }, { complete: {}, solid: {} }, @@ -545,7 +545,7 @@ export const generateColors = (themeData) => { export const generateRadii = (input) => { let inputRadii = input.radii || {} // v1 -> v2 - if (typeof input.btnRadius !== 'undefined') { + if (input.btnRadius !== undefined) { inputRadii = Object.entries(input) .filter(([k]) => k.endsWith('Radius')) .reduce((acc, e) => { From 8bcc43905a650177163108528aaab4d350266ffa Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 00:33:53 +0300 Subject: [PATCH 08/34] helpers --- src/api/helpers.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/api/helpers.js b/src/api/helpers.js index 4bf16e0cc..f48cc0163 100644 --- a/src/api/helpers.js +++ b/src/api/helpers.js @@ -6,12 +6,12 @@ export const paramsString = (params = {}) => { if (params == null || params === undefined) return '' if (typeof params !== 'object' || Array.isArray(params)) { - throw new Error('Params are not an object!') + throw new TypeError('Params are not an object!') } const entries = (() => { if (params instanceof Map) { - return params.entries() + return [...params.entries()] } else { return Object.entries(params) } @@ -26,7 +26,7 @@ export const paramsString = (params = {}) => { (typeof v === 'object' && !Array.isArray(v)) || typeof v === 'function' ) { - throw new Error('Param cannot be non-primitive!') + throw new TypeError('Param cannot be non-primitive!') } if (Array.isArray(v)) { arrays.push([k, v]) @@ -42,7 +42,7 @@ export const paramsString = (params = {}) => { typeof v === 'function' || typeof v === 'undefined' ) - throw new Error('Array param cannot contain non-primitives!') + throw new TypeError('Array param cannot contain non-primitives!') }) }) From 0745ccf99570044df732c905c169bc22b64766af Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 00:34:48 +0300 Subject: [PATCH 09/34] parseInt --- src/api/helpers.js | 2 +- src/api/user.js | 4 ++-- src/boot/after_store.js | 8 ++++---- src/components/settings_modal/helpers/number_setting.js | 2 +- src/services/color_convert/color_convert.js | 6 +++--- .../entity_normalizer/entity_normalizer.service.js | 6 +++--- src/services/style_setter/style_setter.js | 2 +- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/api/helpers.js b/src/api/helpers.js index f48cc0163..829615e38 100644 --- a/src/api/helpers.js +++ b/src/api/helpers.js @@ -109,7 +109,7 @@ export const promisedRequest = async ({ .get('content-type') .split(';') .map((x) => x.toLowerCase().trim()) - const contentLength = parseInt(response.headers.get('content-length')) + const contentLength = Number.parseInt(response.headers.get('content-length')) if (contentLength === 0) return null switch (contentType) { diff --git a/src/api/user.js b/src/api/user.js index 17e13195d..89b37dba0 100644 --- a/src/api/user.js +++ b/src/api/user.js @@ -220,7 +220,7 @@ export const postStatus = ({ }) if (pollOptions.some((option) => option !== '')) { const normalizedPoll = { - expires_in: parseInt(poll.expiresIn, 10), + expires_in: Number.parseInt(poll.expiresIn, 10), multiple: poll.multiple, } Object.keys(normalizedPoll).forEach((key) => { @@ -278,7 +278,7 @@ export const editStatus = ({ if (pollOptions.some((option) => option !== '')) { const normalizedPoll = { - expires_in: parseInt(poll.expiresIn, 10), + expires_in: Number.parseInt(poll.expiresIn, 10), multiple: poll.multiple, } Object.keys(normalizedPoll).forEach((key) => { diff --git a/src/boot/after_store.js b/src/boot/after_store.js index 5ba5e8d76..47d9793cc 100644 --- a/src/boot/after_store.js +++ b/src/boot/after_store.js @@ -353,19 +353,19 @@ const getNodeInfo = async ({ store }) => { const uploadLimits = metadata.uploadLimits useInstanceStore().set({ path: 'limits.uploadlimit', - value: parseInt(uploadLimits.general), + value: Number.parseInt(uploadLimits.general), }) useInstanceStore().set({ path: 'limits.avatarlimit', - value: parseInt(uploadLimits.avatar), + value: Number.parseInt(uploadLimits.avatar), }) useInstanceStore().set({ path: 'limits.backgroundlimit', - value: parseInt(uploadLimits.background), + value: Number.parseInt(uploadLimits.background), }) useInstanceStore().set({ path: 'limits.bannerlimit', - value: parseInt(uploadLimits.banner), + value: Number.parseInt(uploadLimits.banner), }) useInstanceStore().set({ path: 'limits.fieldsLimits', diff --git a/src/components/settings_modal/helpers/number_setting.js b/src/components/settings_modal/helpers/number_setting.js index e037ece28..d0b23c919 100644 --- a/src/components/settings_modal/helpers/number_setting.js +++ b/src/components/settings_modal/helpers/number_setting.js @@ -29,7 +29,7 @@ export default { ...Setting.methods, getValue(e) { if (!this.truncate === 1) { - return parseInt(e.target.value) + return Number.parseInt(e.target.value) } else if (this.truncate > 1) { return Math.trunc(e.target.value / this.truncate) * this.truncate } diff --git a/src/services/color_convert/color_convert.js b/src/services/color_convert/color_convert.js index 26f279764..dded73da3 100644 --- a/src/services/color_convert/color_convert.js +++ b/src/services/color_convert/color_convert.js @@ -173,9 +173,9 @@ export const hex2rgb = (hex) => { return result ? { - r: parseInt(result[1], 16), - g: parseInt(result[2], 16), - b: parseInt(result[3], 16), + r: Number.parseInt(result[1], 16), + g: Number.parseInt(result[2], 16), + b: Number.parseInt(result[3], 16), } : null } diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js index 8721189d1..d2df5e869 100644 --- a/src/services/entity_normalizer/entity_normalizer.service.js +++ b/src/services/entity_normalizer/entity_normalizer.service.js @@ -372,7 +372,7 @@ export const parseNotification = (data) => { } output.created_at = new Date(data.created_at) - output.id = parseInt(data.id) + output.id = Number.parseInt(data.id) return output } @@ -385,8 +385,8 @@ export const parseLinkHeaderPagination = (linkHeader, opts = {}) => { const minId = parsedLinkHeader.prev?.min_id return { - maxId: flakeId ? maxId : parseInt(maxId, 10), - minId: flakeId ? minId : parseInt(minId, 10), + maxId: flakeId ? maxId : Number.parseInt(maxId, 10), + minId: flakeId ? minId : Number.parseInt(minId, 10), } } diff --git a/src/services/style_setter/style_setter.js b/src/services/style_setter/style_setter.js index 83dc6ce2c..168104c73 100644 --- a/src/services/style_setter/style_setter.js +++ b/src/services/style_setter/style_setter.js @@ -253,7 +253,7 @@ const extractStyleConfig = ({ contentColumnWidth, notifsColumnWidth, themeEditorMinWidth: - parseInt(themeEditorMinWidth) === 0 ? 'fit-content' : themeEditorMinWidth, + Number.parseInt(themeEditorMinWidth) === 0 ? 'fit-content' : themeEditorMinWidth, emojiReactionsScale, emojiSize, navbarSize, From 0a7bfce95b0d5c1a008705aae1c098836cc43019 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 00:37:18 +0300 Subject: [PATCH 10/34] api cleanup --- src/api/public.js | 2 +- src/api/user.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/api/public.js b/src/api/public.js index e001ba749..78db90bfe 100644 --- a/src/api/public.js +++ b/src/api/public.js @@ -105,7 +105,7 @@ export const fetchUserByName = ({ name, credentials }) => }) .then(({ data }) => data.id) .catch((error) => { - if (error && error.statusCode === 404) { + if (error?.statusCode === 404) { // Either the backend does not support lookup endpoint, // or there is no user with such name. Fallback and treat name as id. return name diff --git a/src/api/user.js b/src/api/user.js index 89b37dba0..aa111e305 100644 --- a/src/api/user.js +++ b/src/api/user.js @@ -613,7 +613,7 @@ export const listAliases = ({ credentials }) => method: 'GET', credentials, params: { - _cacheBooster: new Date().getTime(), + _cacheBooster: Date().now(), }, }) @@ -799,7 +799,7 @@ export const listBackups = ({ credentials }) => method: 'GET', credentials, params: { - _cacheBooster: new Date().getTime(), + _cacheBooster: Date().now(), }, }) From ed4b21c2c7065e93f2bd2144a55528eb8eb9c100 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 00:38:28 +0300 Subject: [PATCH 11/34] websocket cleanup --- src/api/websocket.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/api/websocket.js b/src/api/websocket.js index d952372e5..ae2e5358f 100644 --- a/src/api/websocket.js +++ b/src/api/websocket.js @@ -141,13 +141,11 @@ export const handleMastoWS = ( if (data.result === 'success') { console.debug('[WS] Successfully authenticated') onAuthenticated() + } else if (data.error === 'already_authenticated') { + onAuthenticated() } else { - if (data.error === 'already_authenticated') { - onAuthenticated() - } else { - console.error('[WS] Unable to authenticate:', data.error) - wsEvent.target.close() - } + console.error('[WS] Unable to authenticate:', data.error) + wsEvent.target.close() } } return null From 19cd21cf0b53bce187fc85859f1ffebe843caf1e Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 00:39:57 +0300 Subject: [PATCH 12/34] charCode --- src/boot/after_store.js | 2 +- src/services/sw/sw.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/boot/after_store.js b/src/boot/after_store.js index 47d9793cc..fa59ba2b5 100644 --- a/src/boot/after_store.js +++ b/src/boot/after_store.js @@ -63,7 +63,7 @@ const parsedInitialResults = () => { const decodeUTF8Base64 = (data) => { const rawData = atob(data) - const array = Uint8Array.from([...rawData].map((char) => char.charCodeAt(0))) + const array = Uint8Array.from([...rawData].map((char) => char.codePointAt(0))) const text = new TextDecoder().decode(array) return text } diff --git a/src/services/sw/sw.js b/src/services/sw/sw.js index e744e37aa..b45409b28 100644 --- a/src/services/sw/sw.js +++ b/src/services/sw/sw.js @@ -4,7 +4,7 @@ function urlBase64ToUint8Array(base64String) { const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/') const rawData = window.atob(base64) - return Uint8Array.from([...rawData].map((char) => char.charCodeAt(0))) + return Uint8Array.from([...rawData].map((char) => char.codePointAt(0))) } export function isSWSupported() { From ab6ac91072d435c6f1233c4cae9abd7564fd406b Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 00:47:01 +0300 Subject: [PATCH 13/34] object assign --- src/components/desktop_nav/desktop_nav.js | 20 +-- .../entity_normalizer.spec.js | 162 +++++++++--------- 2 files changed, 86 insertions(+), 96 deletions(-) diff --git a/src/components/desktop_nav/desktop_nav.js b/src/components/desktop_nav/desktop_nav.js index df855500a..4c778f23f 100644 --- a/src/components/desktop_nav/desktop_nav.js +++ b/src/components/desktop_nav/desktop_nav.js @@ -73,17 +73,15 @@ export default { } }, logoBgStyle() { - return Object.assign( - { - margin: `${this.logoMargin} 0`, - opacity: this.searchBarHidden ? 1 : 0, - }, - this.enableMask - ? {} - : { - 'background-color': this.enableMask ? '' : 'transparent', - }, - ) + const mask = this.enableMask + ? {} + : {'background-color': this.enableMask ? '' : 'transparent'} + + return { + margin: `${this.logoMargin} 0`, + opacity: this.searchBarHidden ? 1 : 0, + ...mask, + } }, ...mapState(useInstanceStore, ['privateMode']), ...mapState(useInstanceStore, { diff --git a/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js b/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js index afd17e56b..54934d8b0 100644 --- a/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js +++ b/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js @@ -7,100 +7,92 @@ import { } from 'src/services/entity_normalizer/entity_normalizer.service.js' const makeMockUserMasto = (overrides = {}) => { - return Object.assign( - { - acct: 'hj', - avatar: - 'https://shigusegubu.club/media/1657b945-8d5b-4ce6-aafb-4c3fc5772120/8ce851029af84d55de9164e30cc7f46d60cbf12eee7e96c5c0d35d9038ddade1.png', - avatar_static: - 'https://shigusegubu.club/media/1657b945-8d5b-4ce6-aafb-4c3fc5772120/8ce851029af84d55de9164e30cc7f46d60cbf12eee7e96c5c0d35d9038ddade1.png', - bot: false, - created_at: '2017-12-17T21:54:14.000Z', - display_name: 'whatever whatever whatever witch', - emojis: [], - fields: [], - followers_count: 705, - following_count: 326, - header: - 'https://shigusegubu.club/media/7ab024d9-2a8a-4fbc-9ce8-da06756ae2db/6aadefe4e264133bc377ab450e6b045b6f5458542a5c59e6c741f86107f0388b.png', - header_static: - 'https://shigusegubu.club/media/7ab024d9-2a8a-4fbc-9ce8-da06756ae2db/6aadefe4e264133bc377ab450e6b045b6f5458542a5c59e6c741f86107f0388b.png', - id: '1', - locked: false, - note: 'Volatile Internet Weirdo. Name pronounced as Hee Jay. JS and Java dark arts mage, Elixir trainee. I love sampo and lain. Matrix is @hj:matrix.heldscal.la Pronouns are whatever. Do not DM me unless it\'s truly private matter and you\'re instance\'s admin or you risk your DM to be reposted publicly.Wish i was Finnish girl.', - pleroma: { confirmation_pending: false, tags: null }, - source: { note: '', privacy: 'public', sensitive: false }, - statuses_count: 41775, - url: 'https://shigusegubu.club/users/hj', - username: 'hj', - }, - overrides, - ) + return { + acct: 'hj', + avatar: + 'https://shigusegubu.club/media/1657b945-8d5b-4ce6-aafb-4c3fc5772120/8ce851029af84d55de9164e30cc7f46d60cbf12eee7e96c5c0d35d9038ddade1.png', + avatar_static: + 'https://shigusegubu.club/media/1657b945-8d5b-4ce6-aafb-4c3fc5772120/8ce851029af84d55de9164e30cc7f46d60cbf12eee7e96c5c0d35d9038ddade1.png', + bot: false, + created_at: '2017-12-17T21:54:14.000Z', + display_name: 'whatever whatever whatever witch', + emojis: [], + fields: [], + followers_count: 705, + following_count: 326, + header: + 'https://shigusegubu.club/media/7ab024d9-2a8a-4fbc-9ce8-da06756ae2db/6aadefe4e264133bc377ab450e6b045b6f5458542a5c59e6c741f86107f0388b.png', + header_static: + 'https://shigusegubu.club/media/7ab024d9-2a8a-4fbc-9ce8-da06756ae2db/6aadefe4e264133bc377ab450e6b045b6f5458542a5c59e6c741f86107f0388b.png', + id: '1', + locked: false, + note: 'Volatile Internet Weirdo. Name pronounced as Hee Jay. JS and Java dark arts mage, Elixir trainee. I love sampo and lain. Matrix is @hj:matrix.heldscal.la Pronouns are whatever. Do not DM me unless it\'s truly private matter and you\'re instance\'s admin or you risk your DM to be reposted publicly.Wish i was Finnish girl.', + pleroma: { confirmation_pending: false, tags: null }, + source: { note: '', privacy: 'public', sensitive: false }, + statuses_count: 41775, + url: 'https://shigusegubu.club/users/hj', + username: 'hj', + ...overrides, + } } const makeMockStatusMasto = (overrides = {}) => { - return Object.assign( - { - account: makeMockUserMasto(), - application: { name: 'Web', website: null }, - content: - '@sampo god i wish i was there', - created_at: '2019-01-17T16:29:23.000Z', - emojis: [], - favourited: false, - favourites_count: 1, - id: '10423476', - in_reply_to_account_id: '14660', - in_reply_to_id: '10423197', - language: null, - media_attachments: [], - mentions: [ - { - acct: 'sampo@pleroma.soykaf.com', - id: '14660', - url: 'https://pleroma.soykaf.com/users/sampo', - username: 'sampo', - }, - ], - muted: false, - reblog: null, - reblogged: false, - reblogs_count: 0, - replies_count: 0, - sensitive: false, - spoiler_text: '', - tags: [], - uri: 'https://shigusegubu.club/objects/16033fbb-97c0-4f0e-b834-7abb92fb8639', - url: 'https://shigusegubu.club/objects/16033fbb-97c0-4f0e-b834-7abb92fb8639', - visibility: 'public', - pleroma: { - local: true, + return { + account: makeMockUserMasto(), + application: { name: 'Web', website: null }, + content: + '@sampo god i wish i was there', + created_at: '2019-01-17T16:29:23.000Z', + emojis: [], + favourited: false, + favourites_count: 1, + id: '10423476', + in_reply_to_account_id: '14660', + in_reply_to_id: '10423197', + language: null, + media_attachments: [], + mentions: [ + { + acct: 'sampo@pleroma.soykaf.com', + id: '14660', + url: 'https://pleroma.soykaf.com/users/sampo', + username: 'sampo', }, + ], + muted: false, + reblog: null, + reblogged: false, + reblogs_count: 0, + replies_count: 0, + sensitive: false, + spoiler_text: '', + tags: [], + uri: 'https://shigusegubu.club/objects/16033fbb-97c0-4f0e-b834-7abb92fb8639', + url: 'https://shigusegubu.club/objects/16033fbb-97c0-4f0e-b834-7abb92fb8639', + visibility: 'public', + pleroma: { + local: true, }, - overrides, - ) + ...overrides, + } } const makeMockEmojiMasto = (overrides = [{}]) => { return [ - Object.assign( - { - shortcode: 'image', - static_url: 'https://example.com/image.png', - url: 'https://example.com/image.png', - visible_in_picker: false, - }, - overrides[0], - ), - Object.assign( - { - shortcode: 'thinking', - static_url: 'https://example.com/think.png', - url: 'https://example.com/think.png', - visible_in_picker: false, - }, - overrides[1], - ), + { + shortcode: 'image', + static_url: 'https://example.com/image.png', + url: 'https://example.com/image.png', + visible_in_picker: false, + ...overrides[0], + }, + { + shortcode: 'thinking', + static_url: 'https://example.com/think.png', + url: 'https://example.com/think.png', + visible_in_picker: false, + ...overrides[1], + }, ] } From 62e8bc58c6865a193db8567981e41d1b0e6f1d85 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 00:54:29 +0300 Subject: [PATCH 14/34] after_store cleanup --- src/boot/after_store.js | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/boot/after_store.js b/src/boot/after_store.js index fa59ba2b5..3d7648eaf 100644 --- a/src/boot/after_store.js +++ b/src/boot/after_store.js @@ -70,7 +70,7 @@ const decodeUTF8Base64 = (data) => { const preloadFetch = async (request) => { const data = parsedInitialResults() - if (!data || !data[request]) { + if (data?.[request]) { return window.fetch(request) } const decoded = decodeUTF8Base64(data[request]) @@ -170,9 +170,9 @@ const setSettings = async ({ apiConfig, staticConfig, store }) => { let config = {} if (overrides.staticConfigPreference && env === 'development') { console.warn('OVERRIDING API CONFIG WITH STATIC CONFIG') - config = Object.assign({}, apiConfig, staticConfig) + config = { ...apiConfig, ...staticConfig } } else { - config = Object.assign({}, staticConfig, apiConfig) + config = { ...staticConfig, ...apiConfig } } Object.keys(INSTANCE_IDENTITY_DEFAULT_DEFINITIONS).forEach((source) => { @@ -443,7 +443,7 @@ const getNodeInfo = async ({ store }) => { const setConfig = async ({ store }) => { // apiConfig, staticConfig const configInfos = await Promise.all([ - getBackendProvidedConfig({ store }), + getBackendProvidedConfig(), getStaticConfig(), ]) const apiConfig = configInfos[0] @@ -457,7 +457,7 @@ const checkOAuthToken = async ({ store }) => { if (oauth.userToken) { return store.dispatch('loginUser', oauth.userToken) } - return Promise.resolve() + return } const afterStoreSetup = async ({ pinia, store, storageError, i18n }) => { @@ -485,7 +485,7 @@ const afterStoreSetup = async ({ pinia, store, storageError, i18n }) => { if (process.env.NODE_ENV === 'development') { // do some checks to avoid common errors if (!Object.keys(allStores).length) { - throw new Error( + throw new TypeError( 'No stores are available. Check the code in src/boot/after_store.js', ) } @@ -495,7 +495,7 @@ const afterStoreSetup = async ({ pinia, store, storageError, i18n }) => { const isStoreName = (name) => name.startsWith('use') if (process.env.NODE_ENV === 'development') { if (Object.keys(mod).filter(isStoreName).length !== 1) { - throw new Error( + throw new TypeError( 'Each store file must export exactly one store as a named export. Check your code in src/stores/', ) } @@ -504,13 +504,13 @@ const afterStoreSetup = async ({ pinia, store, storageError, i18n }) => { if (storeFuncName && typeof mod[storeFuncName] === 'function') { const p = mod[storeFuncName]().$persistLoaded if (!(p instanceof Promise)) { - throw new Error( + throw new TypeError( `${name} store's $persistLoaded is not a Promise. The persist plugin is not applied.`, ) } await p } else { - throw new Error( + throw new TypeError( `Store module ${name} does not export a 'use...' function`, ) } @@ -518,14 +518,15 @@ const afterStoreSetup = async ({ pinia, store, storageError, i18n }) => { ) } + let newStorageError try { await waitForAllStoresToLoad() } catch (e) { console.error('Cannot load stores:', e) - storageError = e + newStorageError = e } - if (storageError) { + if (storageError || newStorageError) { useInterfaceStore().pushGlobalNotice({ messageKey: 'errors.storage_unavailable', level: 'error', @@ -561,7 +562,7 @@ const afterStoreSetup = async ({ pinia, store, storageError, i18n }) => { }) } catch (e) { window.splashError(e) - return Promise.reject(e) + throw e } applyStyleConfig(useMergedConfigStore().mergedConfig, i18n.global) @@ -573,7 +574,7 @@ const afterStoreSetup = async ({ pinia, store, storageError, i18n }) => { getInstancePanel({ store }), getNodeInfo({ store }), getInstanceConfig({ store }), - ]).catch((e) => Promise.reject(e)) + ]) getTOS({ store }) getStickers({ store }) @@ -583,7 +584,7 @@ const afterStoreSetup = async ({ pinia, store, storageError, i18n }) => { routes: routes(store), scrollBehavior: (to, _from, savedPosition) => { if (to.matched.some((m) => m.meta.dontScroll)) { - return false + return {} } return savedPosition || { left: 0, top: 0 } }, From 2e039561c96572303887fda84ae9fe17e9549959 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 00:56:04 +0300 Subject: [PATCH 15/34] lint --- build/update-emoji.js | 2 +- src/api/helpers.js | 4 +++- src/boot/after_store.js | 7 ++----- src/components/desktop_nav/desktop_nav.js | 2 +- .../settings_modal/tabs/old_theme_tab/old_theme_tab.js | 10 ++-------- src/services/style_setter/style_setter.js | 9 ++++----- .../entity_normalizer/entity_normalizer.spec.js | 10 +++++----- 7 files changed, 18 insertions(+), 26 deletions(-) diff --git a/build/update-emoji.js b/build/update-emoji.js index 562caa3f0..bae3af34a 100644 --- a/build/update-emoji.js +++ b/build/update-emoji.js @@ -1,7 +1,7 @@ +import fs from 'node:fs' import emojis from '@kazvmoe-infra/unicode-emoji-json/data-by-group.json' with { type: 'json', } -import fs from 'node:fs' Object.keys(emojis).map((k) => { emojis[k].forEach((e) => { diff --git a/src/api/helpers.js b/src/api/helpers.js index 829615e38..cb2f2bdd5 100644 --- a/src/api/helpers.js +++ b/src/api/helpers.js @@ -109,7 +109,9 @@ export const promisedRequest = async ({ .get('content-type') .split(';') .map((x) => x.toLowerCase().trim()) - const contentLength = Number.parseInt(response.headers.get('content-length')) + const contentLength = Number.parseInt( + response.headers.get('content-length'), + ) if (contentLength === 0) return null switch (contentType) { diff --git a/src/boot/after_store.js b/src/boot/after_store.js index 3d7648eaf..316119ecd 100644 --- a/src/boot/after_store.js +++ b/src/boot/after_store.js @@ -420,8 +420,7 @@ const getNodeInfo = async ({ store }) => { }) useInstanceStore().set({ path: 'federating', - value: - federation.enabled === undefined ? true : federation.enabled, + value: federation.enabled === undefined ? true : federation.enabled, }) const accountActivationRequired = metadata.accountActivationRequired @@ -548,9 +547,7 @@ const afterStoreSetup = async ({ pinia, store, storageError, i18n }) => { const overrides = window.___pleromafe_dev_overrides || {} const server = - overrides.target !== undefined - ? overrides.target - : window.location.origin + overrides.target !== undefined ? overrides.target : window.location.origin useInstanceStore().set({ path: 'server', value: server }) await setConfig({ store }) diff --git a/src/components/desktop_nav/desktop_nav.js b/src/components/desktop_nav/desktop_nav.js index 4c778f23f..fb23299d2 100644 --- a/src/components/desktop_nav/desktop_nav.js +++ b/src/components/desktop_nav/desktop_nav.js @@ -75,7 +75,7 @@ export default { logoBgStyle() { const mask = this.enableMask ? {} - : {'background-color': this.enableMask ? '' : 'transparent'} + : { 'background-color': this.enableMask ? '' : 'transparent' } return { margin: `${this.logoMargin} 0`, diff --git a/src/components/settings_modal/tabs/old_theme_tab/old_theme_tab.js b/src/components/settings_modal/tabs/old_theme_tab/old_theme_tab.js index cce4a764f..13bcc3ae6 100644 --- a/src/components/settings_modal/tabs/old_theme_tab/old_theme_tab.js +++ b/src/components/settings_modal/tabs/old_theme_tab/old_theme_tab.js @@ -633,17 +633,11 @@ export default { if (version === 0) { if (input.version) version = input.version // Old v1 naming: fg is text, btn is foreground - if ( - colors.text === undefined && - colors.fg !== undefined - ) { + if (colors.text === undefined && colors.fg !== undefined) { version = 1 } // New v2 naming: text is text, fg is foreground - if ( - colors.text !== undefined && - colors.fg !== undefined - ) { + if (colors.text !== undefined && colors.fg !== undefined) { version = 2 } } diff --git a/src/services/style_setter/style_setter.js b/src/services/style_setter/style_setter.js index 168104c73..cb445d2c1 100644 --- a/src/services/style_setter/style_setter.js +++ b/src/services/style_setter/style_setter.js @@ -125,10 +125,7 @@ const generateTheme = (inputRuleset, callbacks, debug) => { const processChunk = () => { const chunk = chunks[counter] Promise.all(chunk.map((x) => x())).then((result) => { - getCssRules( - result.filter(Boolean), - debug, - ).forEach((rule) => { + getCssRules(result.filter(Boolean), debug).forEach((rule) => { onNewRule(rule, true) }) // const t1 = performance.now() @@ -253,7 +250,9 @@ const extractStyleConfig = ({ contentColumnWidth, notifsColumnWidth, themeEditorMinWidth: - Number.parseInt(themeEditorMinWidth) === 0 ? 'fit-content' : themeEditorMinWidth, + Number.parseInt(themeEditorMinWidth) === 0 + ? 'fit-content' + : themeEditorMinWidth, emojiReactionsScale, emojiSize, navbarSize, diff --git a/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js b/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js index 54934d8b0..da3f88636 100644 --- a/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js +++ b/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js @@ -10,9 +10,9 @@ const makeMockUserMasto = (overrides = {}) => { return { acct: 'hj', avatar: - 'https://shigusegubu.club/media/1657b945-8d5b-4ce6-aafb-4c3fc5772120/8ce851029af84d55de9164e30cc7f46d60cbf12eee7e96c5c0d35d9038ddade1.png', + 'https://shigusegubu.club/media/1657b945-8d5b-4ce6-aafb-4c3fc5772120/8ce851029af84d55de9164e30cc7f46d60cbf12eee7e96c5c0d35d9038ddade1.png', avatar_static: - 'https://shigusegubu.club/media/1657b945-8d5b-4ce6-aafb-4c3fc5772120/8ce851029af84d55de9164e30cc7f46d60cbf12eee7e96c5c0d35d9038ddade1.png', + 'https://shigusegubu.club/media/1657b945-8d5b-4ce6-aafb-4c3fc5772120/8ce851029af84d55de9164e30cc7f46d60cbf12eee7e96c5c0d35d9038ddade1.png', bot: false, created_at: '2017-12-17T21:54:14.000Z', display_name: 'whatever whatever whatever witch', @@ -21,9 +21,9 @@ const makeMockUserMasto = (overrides = {}) => { followers_count: 705, following_count: 326, header: - 'https://shigusegubu.club/media/7ab024d9-2a8a-4fbc-9ce8-da06756ae2db/6aadefe4e264133bc377ab450e6b045b6f5458542a5c59e6c741f86107f0388b.png', + 'https://shigusegubu.club/media/7ab024d9-2a8a-4fbc-9ce8-da06756ae2db/6aadefe4e264133bc377ab450e6b045b6f5458542a5c59e6c741f86107f0388b.png', header_static: - 'https://shigusegubu.club/media/7ab024d9-2a8a-4fbc-9ce8-da06756ae2db/6aadefe4e264133bc377ab450e6b045b6f5458542a5c59e6c741f86107f0388b.png', + 'https://shigusegubu.club/media/7ab024d9-2a8a-4fbc-9ce8-da06756ae2db/6aadefe4e264133bc377ab450e6b045b6f5458542a5c59e6c741f86107f0388b.png', id: '1', locked: false, note: 'Volatile Internet Weirdo. Name pronounced as Hee Jay. JS and Java dark arts mage, Elixir trainee. I love sampo and lain. Matrix is @hj:matrix.heldscal.la Pronouns are whatever. Do not DM me unless it\'s truly private matter and you\'re instance\'s admin or you risk your DM to be reposted publicly.Wish i was Finnish girl.', @@ -41,7 +41,7 @@ const makeMockStatusMasto = (overrides = {}) => { account: makeMockUserMasto(), application: { name: 'Web', website: null }, content: - '@sampo god i wish i was there', + '@sampo god i wish i was there', created_at: '2019-01-17T16:29:23.000Z', emojis: [], favourited: false, From a16c6c5be76c18cf68f81f2514ea1c769e5a2827 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 00:59:45 +0300 Subject: [PATCH 16/34] fix --- build/update-emoji.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/update-emoji.js b/build/update-emoji.js index bae3af34a..151a46cb3 100644 --- a/build/update-emoji.js +++ b/build/update-emoji.js @@ -13,7 +13,7 @@ Object.keys(emojis).map((k) => { const res = {} Object.keys(emojis).forEach((k) => { - const groupId = k.replace('&', 'and').replaceAll(/ /, '-').toLowerCase() + const groupId = k.replace('&', 'and').replaceAll(' ', '-').toLowerCase() res[groupId] = emojis[k] }) From 7e2a11f7c18223f2fe27393f5e733a9eb05fa714 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 01:08:11 +0300 Subject: [PATCH 17/34] ahaha oh wow --- src/App.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/App.scss b/src/App.scss index 6748dbaa7..b30ccafba 100644 --- a/src/App.scss +++ b/src/App.scss @@ -1,9 +1,9 @@ +@use "panel"; @import '@fortawesome/fontawesome-svg-core/styles.css'; @import '@kazvmoe-infra/pinch-zoom-element/dist/pinch-zoom.css'; // stylelint-disable rscss/class-format /* stylelint-disable no-descending-specificity */ -@use "panel"; :root { --status-margin: 0.75em; @@ -22,7 +22,7 @@ html { font-size: var(--textSize, 1rem); - +kjkkkk --navbar-height: var(--navbarSize, 3.5rem); --emoji-size: var(--emojiSize, 32px); --panel-header-height: var(--panelHeaderSize, 3.2rem); From 3d2cd66b25b483f0a096df0fa756bd08accc76b2 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 01:15:27 +0300 Subject: [PATCH 18/34] oops --- src/App.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App.scss b/src/App.scss index b30ccafba..13acdd36f 100644 --- a/src/App.scss +++ b/src/App.scss @@ -22,7 +22,7 @@ html { font-size: var(--textSize, 1rem); -kjkkkk + --navbar-height: var(--navbarSize, 3.5rem); --emoji-size: var(--emojiSize, 32px); --panel-header-height: var(--panelHeaderSize, 3.2rem); From 7076c0a390da8da0e1e844aa7f2939c418feda9a Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 01:41:57 +0300 Subject: [PATCH 19/34] ooops --- src/App.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/src/App.scss b/src/App.scss index 13acdd36f..ccdf636bb 100644 --- a/src/App.scss +++ b/src/App.scss @@ -1,4 +1,5 @@ @use "panel"; + @import '@fortawesome/fontawesome-svg-core/styles.css'; @import '@kazvmoe-infra/pinch-zoom-element/dist/pinch-zoom.css'; From d7e45ade84030fed3a4d9bf70d0e8e2a921d20f6 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 01:47:32 +0300 Subject: [PATCH 20/34] solve ambiguity --- docker/e2e/Dockerfile.e2e | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/e2e/Dockerfile.e2e b/docker/e2e/Dockerfile.e2e index b6a1af2e2..da9c2499d 100644 --- a/docker/e2e/Dockerfile.e2e +++ b/docker/e2e/Dockerfile.e2e @@ -1,7 +1,7 @@ FROM mcr.microsoft.com/playwright:v1.61.0-jammy RUN addgroup -S playwright \ - && adduser -S playwright -G playwright + && adduser --system playwright -G playwright --shell=/bin/bash USER playwright From e4872d1bb5540158d036a9ec0d4e065924fffee0 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 02:11:45 +0300 Subject: [PATCH 21/34] i'll just use root anyway --- docker/e2e/Dockerfile.e2e | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docker/e2e/Dockerfile.e2e b/docker/e2e/Dockerfile.e2e index da9c2499d..cc7cbf633 100644 --- a/docker/e2e/Dockerfile.e2e +++ b/docker/e2e/Dockerfile.e2e @@ -1,7 +1,8 @@ FROM mcr.microsoft.com/playwright:v1.61.0-jammy -RUN addgroup -S playwright \ - && adduser --system playwright -G playwright --shell=/bin/bash +RUN npm install -g yarn@1.22.22 + +RUN adduser --system playwright --group --shell=/bin/bash USER playwright @@ -9,8 +10,6 @@ WORKDIR /app ENV PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 -RUN npm install -g yarn@1.22.22 - COPY package.json yarn.lock ./ RUN yarn --frozen-lockfile From 6e0f7c017fa892c39df774864a23d16c997d8290 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 02:22:24 +0300 Subject: [PATCH 22/34] accept failure in emoji updating script --- build/update-emoji.js | 8 ++++++-- docker/e2e/Dockerfile.e2e | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/build/update-emoji.js b/build/update-emoji.js index 151a46cb3..a1acc2ceb 100644 --- a/build/update-emoji.js +++ b/build/update-emoji.js @@ -18,5 +18,9 @@ Object.keys(emojis).forEach((k) => { }) console.info('Updating emojis...') -fs.writeFileSync('src/assets/emoji.json', JSON.stringify(res)) -console.info('Done.') +try { + fs.writeFileSync('src/assets/emoji.json', JSON.stringify(res)) + console.info('Done.') +} catch (e) { + console.error('Failed updating emoji') +} diff --git a/docker/e2e/Dockerfile.e2e b/docker/e2e/Dockerfile.e2e index cc7cbf633..ef1780aaf 100644 --- a/docker/e2e/Dockerfile.e2e +++ b/docker/e2e/Dockerfile.e2e @@ -13,7 +13,7 @@ ENV PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 COPY package.json yarn.lock ./ RUN yarn --frozen-lockfile -COPY . . +COPY --chown=playwright . . ENV CI=1 From 8c053d9fad778195c1b8427cf834d77027fdb6ec Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 15:10:12 +0300 Subject: [PATCH 23/34] lint --- build/update-emoji.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/update-emoji.js b/build/update-emoji.js index a1acc2ceb..dd965cf66 100644 --- a/build/update-emoji.js +++ b/build/update-emoji.js @@ -22,5 +22,5 @@ try { fs.writeFileSync('src/assets/emoji.json', JSON.stringify(res)) console.info('Done.') } catch (e) { - console.error('Failed updating emoji') + console.error('Failed updating emoji', e) } From a028f1c48aafc7d534943c9da197fa3e76b70a2e Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 15:26:13 +0300 Subject: [PATCH 24/34] fix boot? --- src/boot/after_store.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/boot/after_store.js b/src/boot/after_store.js index 316119ecd..933796261 100644 --- a/src/boot/after_store.js +++ b/src/boot/after_store.js @@ -566,12 +566,16 @@ const afterStoreSetup = async ({ pinia, store, storageError, i18n }) => { // Now we can try getting the server settings and logging in // Most of these are preloaded into the index.html so blocking is minimized - await Promise.all([ - checkOAuthToken({ store }), - getInstancePanel({ store }), - getNodeInfo({ store }), - getInstanceConfig({ store }), - ]) + try { + await Promise.all([ + checkOAuthToken({ store }), + getInstancePanel({ store }), + getNodeInfo({ store }), + getInstanceConfig({ store }), + ]) + } catch (e) { + console.error('Error loading instance data:', e) + } getTOS({ store }) getStickers({ store }) From 8e4858b80be65584bff2b4a2fdb31116146fa7e0 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 15:29:32 +0300 Subject: [PATCH 25/34] ah. --- src/boot/after_store.js | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/boot/after_store.js b/src/boot/after_store.js index 933796261..986586a80 100644 --- a/src/boot/after_store.js +++ b/src/boot/after_store.js @@ -70,7 +70,7 @@ const decodeUTF8Base64 = (data) => { const preloadFetch = async (request) => { const data = parsedInitialResults() - if (data?.[request]) { + if (!data?.[request]) { return window.fetch(request) } const decoded = decodeUTF8Base64(data[request]) @@ -566,16 +566,12 @@ const afterStoreSetup = async ({ pinia, store, storageError, i18n }) => { // Now we can try getting the server settings and logging in // Most of these are preloaded into the index.html so blocking is minimized - try { - await Promise.all([ - checkOAuthToken({ store }), - getInstancePanel({ store }), - getNodeInfo({ store }), - getInstanceConfig({ store }), - ]) - } catch (e) { - console.error('Error loading instance data:', e) - } + await Promise.all([ + checkOAuthToken({ store }), + getInstancePanel({ store }), + getNodeInfo({ store }), + getInstanceConfig({ store }), + ]) getTOS({ store }) getStickers({ store }) From 051b9412a0823be555cffd47bc187e19ea1c6678 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 15:32:09 +0300 Subject: [PATCH 26/34] boolean --- src/components/settings_modal/tabs/style_tab/style_tab.js | 2 +- src/services/style_setter/style_setter.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/settings_modal/tabs/style_tab/style_tab.js b/src/components/settings_modal/tabs/style_tab/style_tab.js index a023b4415..f9ee7f1e4 100644 --- a/src/components/settings_modal/tabs/style_tab/style_tab.js +++ b/src/components/settings_modal/tabs/style_tab/style_tab.js @@ -394,7 +394,7 @@ export default { }, }) - const getEditedElement = (component, directive, postProcess = (x) => x) => + const getEditedElement = (component, directive, postProcess = Boolean) => computed({ get() { let usedRule diff --git a/src/services/style_setter/style_setter.js b/src/services/style_setter/style_setter.js index cb445d2c1..14529dd65 100644 --- a/src/services/style_setter/style_setter.js +++ b/src/services/style_setter/style_setter.js @@ -307,7 +307,7 @@ export const applyStyleConfig = (input) => { adoptStyleSheets() } -export const getResourcesIndex = async (url, parser = (x) => x) => { +export const getResourcesIndex = async (url, parser = Boolean) => { const cache = 'no-store' const customUrl = url.replace(/\.(\w+)$/, '.custom.$1') let builtin From 59f3ca65ca2114b3f354f059a4acf2d86bfa385c Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 15:51:10 +0300 Subject: [PATCH 27/34] oopsie --- src/components/settings_modal/tabs/style_tab/style_tab.js | 2 +- src/services/style_setter/style_setter.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/settings_modal/tabs/style_tab/style_tab.js b/src/components/settings_modal/tabs/style_tab/style_tab.js index f9ee7f1e4..a023b4415 100644 --- a/src/components/settings_modal/tabs/style_tab/style_tab.js +++ b/src/components/settings_modal/tabs/style_tab/style_tab.js @@ -394,7 +394,7 @@ export default { }, }) - const getEditedElement = (component, directive, postProcess = Boolean) => + const getEditedElement = (component, directive, postProcess = (x) => x) => computed({ get() { let usedRule diff --git a/src/services/style_setter/style_setter.js b/src/services/style_setter/style_setter.js index 14529dd65..cb445d2c1 100644 --- a/src/services/style_setter/style_setter.js +++ b/src/services/style_setter/style_setter.js @@ -307,7 +307,7 @@ export const applyStyleConfig = (input) => { adoptStyleSheets() } -export const getResourcesIndex = async (url, parser = Boolean) => { +export const getResourcesIndex = async (url, parser = (x) => x) => { const cache = 'no-store' const customUrl = url.replace(/\.(\w+)$/, '.custom.$1') let builtin From cf85b00c0a074625747ab0b1cb7e9c3fc99d7be3 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 4 Aug 2026 15:59:52 +0300 Subject: [PATCH 28/34] optional chaining --- src/components/chat_list_item/chat_list_item.js | 2 +- src/components/chat_message/chat_message.js | 2 +- src/components/chat_message/chat_message.vue | 2 +- src/components/chat_title/chat_title.vue | 2 +- src/components/desktop_nav/desktop_nav.vue | 2 +- src/components/follow_request_card/follow_request_card.js | 2 +- src/components/popover/popover.js | 2 +- src/components/quote/quote_form.js | 4 ++-- src/components/settings_modal/admin_tabs/emoji_tab.vue | 6 +++--- .../settings_modal/helpers/vertical_tab_switcher.jsx | 2 +- src/components/settings_modal/tabs/appearance_tab.js | 2 +- .../settings_modal/tabs/data_import_export_tab.js | 2 +- .../settings_modal/tabs/mutes_and_blocks_tab.js | 2 +- src/components/side_drawer/side_drawer.vue | 2 +- src/components/status/status.js | 8 ++++---- src/components/status/status.vue | 4 ++-- src/components/tab_switcher/tab_switcher.jsx | 2 +- src/components/timeline/timeline.js | 2 +- .../unicode_domain_indicator/unicode_domain_indicator.vue | 2 +- src/components/user_card/user_card.vue | 2 +- src/services/errors/errors.js | 2 +- src/services/theme_data/theme_data.service.js | 4 ++-- .../user_profile_link_generator.js | 2 +- src/stores/announcements.js | 2 +- src/stores/interface.js | 2 +- test/fixtures/setup_test.js | 2 +- 26 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/components/chat_list_item/chat_list_item.js b/src/components/chat_list_item/chat_list_item.js index c95895def..8bb2afd93 100644 --- a/src/components/chat_list_item/chat_list_item.js +++ b/src/components/chat_list_item/chat_list_item.js @@ -39,7 +39,7 @@ const ChatListItem = { messageForStatusContent() { const message = this.chat.lastMessage const messageEmojis = message ? message.emojis : [] - const isYou = message && message.account_id === this.currentUser.id + const isYou = message?.account_id === this.currentUser.id const content = message ? this.attachmentInfo || message.content : '' const messagePreview = isYou ? `${this.$t('chats.you')} ${content}` diff --git a/src/components/chat_message/chat_message.js b/src/components/chat_message/chat_message.js index 78be870b4..aabdec31f 100644 --- a/src/components/chat_message/chat_message.js +++ b/src/components/chat_message/chat_message.js @@ -111,7 +111,7 @@ const ChatMessage = { const user = this.$store.getters.findUser( this.message.in_reply_to_user_id, ) - return user && user.screen_name_ui + return user?.screen_name_ui } }, replyProfileLink() { diff --git a/src/components/chat_message/chat_message.vue b/src/components/chat_message/chat_message.vue index b772a9b20..394cce4b7 100644 --- a/src/components/chat_message/chat_message.vue +++ b/src/components/chat_message/chat_message.vue @@ -53,7 +53,7 @@ :user-screen-name="message.in_reply_to_screen_name" /> -