diff --git a/fe/eslint.config.js b/fe/eslint.config.js
index eeaf8d7b..d1b02dcf 100644
--- a/fe/eslint.config.js
+++ b/fe/eslint.config.js
@@ -520,15 +520,15 @@ const rules = [{ // as of eslint-plugin-unicorn@50.0.1
},
}];
-import withNuxt from './.nuxt/eslint.config.mjs';
+import { withNuxt } from './.nuxt/eslint.config.mjs';
import * as vueESLintParser from 'vue-eslint-parser';
// eslint-disable-next-line import-x/extensions
import vueESLintConfigTypescriptRecommendedExtends from '@vue/eslint-config-typescript/recommended.js';
import pluginVue from 'eslint-plugin-vue';
-import { fixupConfigRules } from '@eslint/compat';
import { FlatCompat } from '@eslint/eslintrc';
import eslintJs from '@eslint/js';
import pluginStylistic from '@stylistic/eslint-plugin';
+import pluginTanstackQuery from '@tanstack/eslint-plugin-query';
import * as typescriptESLintParser from '@typescript-eslint/parser';
import pluginImportX from 'eslint-plugin-import-x';
import pluginPinia from 'eslint-plugin-pinia';
@@ -543,18 +543,16 @@ const compat = new FlatCompat();
export default withNuxt(
eslintJs.configs.recommended,
...pluginVue.configs['flat/recommended'],
- ...compat.config(vueESLintConfigTypescriptRecommendedExtends), // https://github.com/vuejs/eslint-config-typescript/issues/76#issuecomment-2051234597
+ ...compat.config(vueESLintConfigTypescriptRecommendedExtends), // https://github.com/vuejs/eslint-config-typescript/issues/76#issuecomment-2148720004
...compat.extends( // https://github.com/ota-meshi/typescript-eslint-parser-for-extra-files/issues/95#issuecomment-2148604881
'plugin:@typescript-eslint/strict-type-checked',
'plugin:@typescript-eslint/stylistic-type-checked',
),
- ...compat.config(pluginImportX.configs.recommended), // https://github.com/un-ts/eslint-plugin-import-x/pull/85
- pluginImportX.configs.typescript, // https://github.com/import-js/eslint-plugin-import/issues/2556#issuecomment-2119520339
- ...fixupConfigRules(...compat.extends(
- 'plugin:@tanstack/eslint-plugin-query/recommended', // https://github.com/TanStack/query/pull/7253
- )),
+ pluginImportX.flatConfigs.recommended,
+ pluginImportX.flatConfigs.typescript,
+ ...pluginTanstackQuery.configs['flat/recommended'],
pluginUnicorn.configs['flat/recommended'],
- ...compat.config(pluginPinia.configs.all),
+ pluginPinia.configs['all-flat'],
{ languageOptions: { ecmaVersion: 'latest' } },
{ ignores: ['node_modules/', '.nuxt/', '.yarn/', '.pnp.*'] },
{ linterOptions: { reportUnusedDisableDirectives: 'error' } },
diff --git a/fe/src/components/post/badge/TimeView.vue b/fe/src/components/post/badge/TimeView.vue
index 16b944f7..c46cdd0b 100644
--- a/fe/src/components/post/badge/TimeView.vue
+++ b/fe/src/components/post/badge/TimeView.vue
@@ -37,7 +37,9 @@ const tippyCotentRelativeTo = computed(() => (props.relativeTo === undefined ||
? ''
: `${props.relativeToText}:
${props.relativeTo.toLocaleString(DateTime.DATETIME_FULL_WITH_SECONDS)}
- 相差 ${props.current.diff(props.relativeTo).rescale().toHuman()}`));
+ 相差 ${props.current
+ .diff(props.relativeTo, undefined, { conversionAccuracy: 'longterm' })
+ .rescale().toHuman()}`));
const tippyContent = computed(() => `本${props.postType}${props.timestampType}:
${hydrationStore.isHydratingOrSSR
? currentInChina.value.toLocaleString(DateTime.DATETIME_FULL_WITH_SECONDS)
diff --git a/fe/src/stores/relativeTime.ts b/fe/src/stores/relativeTime.ts
index 00acdb5b..87ad04a8 100644
--- a/fe/src/stores/relativeTime.ts
+++ b/fe/src/stores/relativeTime.ts
@@ -13,7 +13,9 @@ export const useRelativeTimeStore = defineStore('relativeTime', () => {
});
}
const registerRelative = (dateTime: DateTime, options?: ToRelativeOptions) => computed(() => {
- const relativeDuration = dateTime.diff(DateTime.now()).shiftTo(...units);
+ const relativeDuration = dateTime
+ .diff(DateTime.now(), undefined, { conversionAccuracy: 'longterm' })
+ .shiftTo(...units);
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const { unit } = units
.map(unit => ({ unit, value: relativeDuration.get(unit) }))