diff options
| author | yukineko <27853966+hideki0403@users.noreply.github.com> | 2023-11-30 14:48:02 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-11-30 14:48:02 +0900 |
| commit | 22d6fa1fdf1dd4b61673d10cac6ca866dd5f26d8 (patch) | |
| tree | 37d00b712394e319d807e365b831939664f99152 | |
| parent | fix(docker): cannot build docker image on some environments (#12494) (diff) | |
| download | sharkey-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.md | 1 | ||||
| -rw-r--r-- | locales/generateDTS.js | 12 | ||||
| -rw-r--r-- | locales/index.d.ts | 1 | ||||
| -rw-r--r-- | locales/index.js | 58 | ||||
| -rw-r--r-- | packages/frontend/src/navbar.ts | 8 | ||||
| -rw-r--r-- | packages/frontend/src/pages/settings/index.vue | 12 | ||||
| -rw-r--r-- | packages/frontend/src/scripts/clear-cache.ts | 14 | ||||
| -rw-r--r-- | scripts/build-assets.mjs | 18 |
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() + } + } } |