summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryukineko <27853966+hideki0403@users.noreply.github.com>2023-11-30 14:48:02 +0900
committerGitHub <noreply@github.com>2023-11-30 14:48:02 +0900
commit22d6fa1fdf1dd4b61673d10cac6ca866dd5f26d8 (patch)
tree37d00b712394e319d807e365b831939664f99152
parentfix(docker): cannot build docker image on some environments (#12494) (diff)
downloadsharkey-22d6fa1fdf1dd4b61673d10cac6ca866dd5f26d8.tar.gz
sharkey-22d6fa1fdf1dd4b61673d10cac6ca866dd5f26d8.tar.bz2
sharkey-22d6fa1fdf1dd4b61673d10cac6ca866dd5f26d8.zip
enhance(dev): 開発モード時にlocaleと型定義が自動的に再生成されるように (#12481)
* enhance: localeを任意のタイミングでリビルドできるように * enhance: localeも監視し、必要であればlocaleをリビルドするように * feat: devモードの時のみナビゲーションバーからキャッシュクリアができるように * refactor: キャッシュクリア部分を共通化 * fix: localesのファイル変更イベントが取れないのを修正 * fix: replaceAllでコケるのを修正 * change: 開発モードに関係なくナビゲーションバーからキャッシュクリアできるように * refactor: 必要のないリビルドをしないように * update: CHANGELOG.md --------- Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
-rw-r--r--CHANGELOG.md1
-rw-r--r--locales/generateDTS.js12
-rw-r--r--locales/index.d.ts1
-rw-r--r--locales/index.js58
-rw-r--r--packages/frontend/src/navbar.ts8
-rw-r--r--packages/frontend/src/pages/settings/index.vue12
-rw-r--r--packages/frontend/src/scripts/clear-cache.ts14
-rw-r--r--scripts/build-assets.mjs18
8 files changed, 80 insertions, 44 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0a41c2cef4..db26ffc8ee 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -25,6 +25,7 @@
- Enhance: ユーザーのRawデータを表示するページが復活
- Enhance: リアクション選択時に音を鳴らせるように
- Enhance: サウンドにドライブのファイルを使用できるように
+- Enhance: ナビゲーションバーに項目「キャッシュを削除」を追加
- Enhance: Shareページで投稿を完了すると、親ウィンドウ(親フレーム)にpostMessageするように
- Enhance: チャンネル、クリップ、ページ、Play、ギャラリーにURLのコピーボタンを設置 #11305
- Enhance: ノートプレビューに「内容を隠す」が反映されるように
diff --git a/locales/generateDTS.js b/locales/generateDTS.js
index 7af773f3b1..d3afdd6e15 100644
--- a/locales/generateDTS.js
+++ b/locales/generateDTS.js
@@ -56,6 +56,18 @@ export default function generateDTS() {
ts.NodeFlags.Const | ts.NodeFlags.Ambient | ts.NodeFlags.ContextFlags,
),
),
+ ts.factory.createFunctionDeclaration(
+ [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],
+ undefined,
+ ts.factory.createIdentifier('build'),
+ undefined,
+ [],
+ ts.factory.createTypeReferenceNode(
+ ts.factory.createIdentifier('Locale'),
+ undefined,
+ ),
+ undefined,
+ ),
ts.factory.createExportDefault(ts.factory.createIdentifier('locales')),
];
const printed = ts.createPrinter({
diff --git a/locales/index.d.ts b/locales/index.d.ts
index d72e7d29f5..6036c6fa66 100644
--- a/locales/index.d.ts
+++ b/locales/index.d.ts
@@ -2505,4 +2505,5 @@ export interface Locale {
declare const locales: {
[lang: string]: Locale;
};
+export function build(): Locale;
export default locales;
diff --git a/locales/index.js b/locales/index.js
index 67a406d98d..650e552337 100644
--- a/locales/index.js
+++ b/locales/index.js
@@ -51,33 +51,37 @@ const primaries = {
// 何故か文字列にバックスペース文字が混入することがあり、YAMLが壊れるので取り除く
const clean = (text) => text.replace(new RegExp(String.fromCodePoint(0x08), 'g'), '');
-const locales = languages.reduce((a, c) => (a[c] = yaml.load(clean(fs.readFileSync(new URL(`${c}.yml`, import.meta.url), 'utf-8'))) || {}, a), {});
+export function build() {
+ const locales = languages.reduce((a, c) => (a[c] = yaml.load(clean(fs.readFileSync(new URL(`${c}.yml`, import.meta.url), 'utf-8'))) || {}, a), {});
-// 空文字列が入ることがあり、フォールバックが動作しなくなるのでプロパティごと消す
-const removeEmpty = (obj) => {
- for (const [k, v] of Object.entries(obj)) {
- if (v === '') {
- delete obj[k];
- } else if (typeof v === 'object') {
- removeEmpty(v);
+ // 空文字列が入ることがあり、フォールバックが動作しなくなるのでプロパティごと消す
+ const removeEmpty = (obj) => {
+ for (const [k, v] of Object.entries(obj)) {
+ if (v === '') {
+ delete obj[k];
+ } else if (typeof v === 'object') {
+ removeEmpty(v);
+ }
}
- }
- return obj;
-};
-removeEmpty(locales);
+ return obj;
+ };
+ removeEmpty(locales);
-export default Object.entries(locales)
- .reduce((a, [k ,v]) => (a[k] = (() => {
- const [lang] = k.split('-');
- switch (k) {
- case 'ja-JP': return v;
- case 'ja-KS':
- case 'en-US': return merge(locales['ja-JP'], v);
- default: return merge(
- locales['ja-JP'],
- locales['en-US'],
- locales[`${lang}-${primaries[lang]}`] ?? {},
- v
- );
- }
- })(), a), {});
+ return Object.entries(locales)
+ .reduce((a, [k, v]) => (a[k] = (() => {
+ const [lang] = k.split('-');
+ switch (k) {
+ case 'ja-JP': return v;
+ case 'ja-KS':
+ case 'en-US': return merge(locales['ja-JP'], v);
+ default: return merge(
+ locales['ja-JP'],
+ locales['en-US'],
+ locales[`${lang}-${primaries[lang]}`] ?? {},
+ v
+ );
+ }
+ })(), a), {});
+}
+
+export default build();
diff --git a/packages/frontend/src/navbar.ts b/packages/frontend/src/navbar.ts
index f0ed773f82..78a0945ddb 100644
--- a/packages/frontend/src/navbar.ts
+++ b/packages/frontend/src/navbar.ts
@@ -12,6 +12,7 @@ import * as os from '@/os.js';
import { i18n } from '@/i18n.js';
import { ui } from '@/config.js';
import { unisonReload } from '@/scripts/unison-reload.js';
+import { clearCache } from './scripts/clear-cache.js';
export const navbarItemDef = reactive({
notifications: {
@@ -171,4 +172,11 @@ export const navbarItemDef = reactive({
show: computed(() => $i != null),
to: `/@${$i?.username}`,
},
+ cacheClear: {
+ title: i18n.ts.cacheClear,
+ icon: 'ti ti-trash',
+ action: (ev) => {
+ clearCache();
+ },
+ },
});
diff --git a/packages/frontend/src/pages/settings/index.vue b/packages/frontend/src/pages/settings/index.vue
index 361a6c8c78..5a1a9aedb3 100644
--- a/packages/frontend/src/pages/settings/index.vue
+++ b/packages/frontend/src/pages/settings/index.vue
@@ -33,13 +33,11 @@ import { i18n } from '@/i18n.js';
import MkInfo from '@/components/MkInfo.vue';
import MkSuperMenu from '@/components/MkSuperMenu.vue';
import { signout, $i } from '@/account.js';
-import { unisonReload } from '@/scripts/unison-reload.js';
+import { clearCache } from '@/scripts/clear-cache.js';
import { instance } from '@/instance.js';
import { useRouter } from '@/router.js';
import { definePageMetadata, provideMetadataReceiver } from '@/scripts/page-metadata.js';
import * as os from '@/os.js';
-import { miLocalStorage } from '@/local-storage.js';
-import { fetchCustomEmojis } from '@/custom-emojis.js';
const indexInfo = {
title: i18n.ts.settings,
@@ -182,13 +180,7 @@ const menuDef = computed(() => [{
icon: 'ti ti-trash',
text: i18n.ts.clearCache,
action: async () => {
- os.waiting();
- miLocalStorage.removeItem('locale');
- miLocalStorage.removeItem('theme');
- miLocalStorage.removeItem('emojis');
- miLocalStorage.removeItem('lastEmojisFetchedAt');
- await fetchCustomEmojis(true);
- unisonReload();
+ await clearCache();
},
}, {
type: 'button',
diff --git a/packages/frontend/src/scripts/clear-cache.ts b/packages/frontend/src/scripts/clear-cache.ts
new file mode 100644
index 0000000000..5f27254b8a
--- /dev/null
+++ b/packages/frontend/src/scripts/clear-cache.ts
@@ -0,0 +1,14 @@
+import { unisonReload } from '@/scripts/unison-reload.js';
+import * as os from '@/os.js';
+import { miLocalStorage } from '@/local-storage.js';
+import { fetchCustomEmojis } from '@/custom-emojis.js';
+
+export async function clearCache() {
+ os.waiting();
+ miLocalStorage.removeItem('locale');
+ miLocalStorage.removeItem('theme');
+ miLocalStorage.removeItem('emojis');
+ miLocalStorage.removeItem('lastEmojisFetchedAt');
+ await fetchCustomEmojis(true);
+ unisonReload();
+}
diff --git a/scripts/build-assets.mjs b/scripts/build-assets.mjs
index 1ffcec8aa3..f8f09ec2fb 100644
--- a/scripts/build-assets.mjs
+++ b/scripts/build-assets.mjs
@@ -9,10 +9,12 @@ import cssnano from 'cssnano';
import postcss from 'postcss';
import * as terser from 'terser';
-import locales from '../locales/index.js';
+import { build as buildLocales } from '../locales/index.js';
import generateDTS from '../locales/generateDTS.js';
import meta from '../package.json' assert { type: "json" };
+let locales = buildLocales();
+
async function copyFrontendFonts() {
await fs.cp('./packages/frontend/node_modules/three/examples/fonts', './built/_frontend_dist_/fonts', { dereference: true, recursive: true });
}
@@ -89,10 +91,12 @@ async function build() {
await build();
if (process.argv.includes("--watch")) {
- const watcher = fs.watch('./packages', { recursive: true });
- for await (const event of watcher) {
- if (/^[a-z]+\/src/.test(event.filename)) {
- await build();
- }
- }
+ const watcher = fs.watch('./locales');
+ for await (const event of watcher) {
+ const filename = event.filename?.replaceAll('\\', '/');
+ if (/^[a-z]+-[A-Z]+\.yml/.test(filename)) {
+ locales = buildLocales();
+ await copyFrontendLocales()
+ }
+ }
}