From d3a40b980e0f24c5e294baf5b43982e33afc442f Mon Sep 17 00:00:00 2001 From: syuilo Date: Tue, 12 Dec 2023 17:53:17 +0900 Subject: [PATCH 1/6] Create decoration_blushed.png --- .../avatar-decorations/decoration_blushed.png | Bin 0 -> 9806 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/img/misc/avatar-decorations/decoration_blushed.png diff --git a/public/img/misc/avatar-decorations/decoration_blushed.png b/public/img/misc/avatar-decorations/decoration_blushed.png new file mode 100644 index 0000000000000000000000000000000000000000..0e83aa48702443ad2e35d3ffb22dc492445bff95 GIT binary patch literal 9806 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 O0cK)$q2QdugZ~3;O0(Pm literal 0 HcmV?d00001 From ea7d492b7e18a4bf102efd6c25de8973dd2cf29a Mon Sep 17 00:00:00 2001 From: syuilo Date: Tue, 12 Dec 2023 17:55:39 +0900 Subject: [PATCH 2/6] Create 2023-12-12-gihyo.md --- content/blog/2023-12-12-gihyo.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 content/blog/2023-12-12-gihyo.md diff --git a/content/blog/2023-12-12-gihyo.md b/content/blog/2023-12-12-gihyo.md new file mode 100644 index 00000000..dd2019cd --- /dev/null +++ b/content/blog/2023-12-12-gihyo.md @@ -0,0 +1,10 @@ +--- +description: '「Misskey & Webテクノロジー最前線」の12月の記事が公開されました' +date: 2023-12-12 +--- + +# 「Misskey & Webテクノロジー最前線」12月 + +Webメディア[gihyo.jp](https://gihyo.jp/)にて行われている、Misskeyプロジェクトリーダー syuiloによるMisskeyの技術についての連載「Misskey & Webテクノロジー最前線」の12月の記事が公開されました! + +[「2023年Misskey開発まとめ」](https://gihyo.jp/article/2023/11/misskey-09) From 4cc0ace0e33c27ded3673d2cea8e93a79cb80561 Mon Sep 17 00:00:00 2001 From: kakkokari-gtyih Date: Tue, 12 Dec 2023 19:28:20 +0900 Subject: [PATCH 3/6] =?UTF-8?q?(enhance)=20=E6=97=A7Hub=E3=81=AE=E3=83=AA?= =?UTF-8?q?=E3=83=B3=E3=82=AF=E3=81=AB=E5=AF=BE=E3=81=97=E3=81=A6=E3=83=AA?= =?UTF-8?q?=E3=83=80=E3=82=A4=E3=83=AC=E3=82=AF=E3=83=88=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=20close=20#53?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/data/locales.ts | 17 + assets/data/old-hub-redirects.ts | 1330 +++++++++++++++++ .../4.for-developers}/aiscript.md | 4 +- .../4.for-developers}/api/app.md | 0 nuxt.config.ts | 21 +- scripts/get-old-hub-redirects.ts | 44 + 6 files changed, 1398 insertions(+), 18 deletions(-) create mode 100644 assets/data/locales.ts create mode 100644 assets/data/old-hub-redirects.ts rename content/ja/{.docs-legacy/advanced => docs/4.for-developers}/aiscript.md (97%) rename content/ja/{.docs-legacy => docs/4.for-developers}/api/app.md (100%) create mode 100644 scripts/get-old-hub-redirects.ts diff --git a/assets/data/locales.ts b/assets/data/locales.ts new file mode 100644 index 00000000..ee6d4a07 --- /dev/null +++ b/assets/data/locales.ts @@ -0,0 +1,17 @@ +import type { LocaleObject } from '@nuxtjs/i18n/dist/runtime/composables'; + +export const localesConst = [ + { files: [ 'ja-JP.json' ], code: 'ja', iso: 'ja-JP', name: '日本語' }, + { files: [ 'en-US.json' ], code: 'en', iso: 'en-US', name: 'English' }, + { files: [ 'id-ID.json' ], code: 'id', iso: 'id-ID', name: 'Bahasa Indonesia' }, + { files: [ 'ko-KR.json' ], code: 'ko', iso: 'ko-KR', name: '한국어' }, + { files: [ 'it-IT.json' ], code: 'it', iso: 'it-IT', name: 'Italiano' }, + { files: [ 'pl-PL.json' ], code: 'pl', iso: 'pl-PL', name: 'Polski' }, + { files: [ 'fr-FR.json' ], code: 'fr', iso: 'fr-FR', name: 'Français' }, + { files: [ 'zh-CN.json' ], code: 'cn', iso: 'zh-CN', name: '简体中文' }, + { files: [ 'zh-TW.json' ], code: 'tw', iso: 'zh-TW', name: '繁体中文' }, +] as const; + +export type LocaleCodes = typeof localesConst[number]['code']; + +export const locales = localesConst as unknown as LocaleObject[]; diff --git a/assets/data/old-hub-redirects.ts b/assets/data/old-hub-redirects.ts new file mode 100644 index 00000000..9437bbc2 --- /dev/null +++ b/assets/data/old-hub-redirects.ts @@ -0,0 +1,1330 @@ +export const redirects = [ + [ + "/docs/api/", + "/docs/for-developers/api/" + ], + [ + "/docs/features/", + "/docs/for-users/features/" + ], + [ + "/docs/api/streaming/", + "/docs/for-developers/api/streaming/" + ], + [ + "/docs/api/streaming/channel/", + "/docs/for-developers/api/streaming/channel/" + ], + [ + "/docs/api/streaming/channel/global-timeline.html", + "/docs/for-developers/api/streaming/channel/global-timeline/" + ], + [ + "/docs/api/streaming/channel/global-timeline", + "/docs/api/streaming/channel/global-timeline.html" + ], + [ + "/docs/api/streaming/channel/global-timeline.md", + "/docs/api/streaming/channel/global-timeline.html" + ], + [ + "/docs/api/streaming/channel/home-timeline.html", + "/docs/for-developers/api/streaming/channel/home-timeline/" + ], + [ + "/docs/api/streaming/channel/home-timeline", + "/docs/api/streaming/channel/home-timeline.html" + ], + [ + "/docs/api/streaming/channel/home-timeline.md", + "/docs/api/streaming/channel/home-timeline.html" + ], + [ + "/docs/api/streaming/channel/hybrid-timeline.html", + "/docs/for-developers/api/streaming/channel/hybrid-timeline/" + ], + [ + "/docs/api/streaming/channel/hybrid-timeline", + "/docs/api/streaming/channel/hybrid-timeline.html" + ], + [ + "/docs/api/streaming/channel/hybrid-timeline.md", + "/docs/api/streaming/channel/hybrid-timeline.html" + ], + [ + "/docs/api/streaming/channel/index.html", + "/docs/api/streaming/channel/" + ], + [ + "/docs/api/streaming/channel/index.md", + "/docs/api/streaming/channel/" + ], + [ + "/docs/api/streaming/channel/local-timeline.html", + "/docs/for-developers/api/streaming/channel/local-timeline/" + ], + [ + "/docs/api/streaming/channel/local-timeline", + "/docs/api/streaming/channel/local-timeline.html" + ], + [ + "/docs/api/streaming/channel/local-timeline.md", + "/docs/api/streaming/channel/local-timeline.html" + ], + [ + "/docs/api/streaming/channel/main.html", + "/docs/for-developers/api/streaming/channel/main/" + ], + [ + "/docs/api/streaming/channel/main", + "/docs/api/streaming/channel/main.html" + ], + [ + "/docs/api/streaming/channel/main.md", + "/docs/api/streaming/channel/main.html" + ], + [ + "/docs/api/streaming/index.html", + "/docs/for-developers/api/streaming/" + ], + [ + "/docs/api/streaming/index.md", + "/docs/api/streaming/" + ], + [ + "/docs/api/streaming/note-capture-events.html", + "/docs/for-developers/api/streaming/note-capture-events/" + ], + [ + "/docs/api/streaming/note-capture-events", + "/docs/api/streaming/note-capture-events.html" + ], + [ + "/docs/api/streaming/note-capture-events.md", + "/docs/api/streaming/note-capture-events.html" + ], + [ + "/docs/admin/cdn.html", + "/docs/for-admin/install/resources/cdn/" + ], + [ + "/docs/admin/cdn", + "/docs/admin/cdn.html" + ], + [ + "/docs/admin/cdn.md", + "/docs/admin/cdn.html" + ], + [ + "/docs/admin/nginx.html", + "/docs/for-admin/install/resources/nginx/" + ], + [ + "/docs/admin/nginx", + "/docs/admin/nginx.html" + ], + [ + "/docs/admin/nginx.md", + "/docs/admin/nginx.html" + ], + [ + "/docs/admin/push-docker-hub.html", + "/docs/for-admin/install/resources/push-docker-hub/" + ], + [ + "/docs/admin/push-docker-hub", + "/docs/admin/push-docker-hub.html" + ], + [ + "/docs/admin/push-docker-hub.md", + "/docs/admin/push-docker-hub.html" + ], + [ + "/docs/admin/troubleshooting.html", + "/docs/for-admin/install/resources/troubleshooting/" + ], + [ + "/docs/admin/troubleshooting", + "/docs/admin/troubleshooting.html" + ], + [ + "/docs/admin/troubleshooting.md", + "/docs/admin/troubleshooting.html" + ], + [ + "/docs/advanced/aiscript.html", + "/docs/for-developers/aiscript/" + ], + [ + "/docs/advanced/aiscript", + "/docs/advanced/aiscript.html" + ], + [ + "/docs/advanced/aiscript.md", + "/docs/advanced/aiscript.html" + ], + [ + "/docs/advanced/create-plugin.html", + "/docs/for-developers/plugin/create-plugin/" + ], + [ + "/docs/advanced/create-plugin", + "/docs/advanced/create-plugin.html" + ], + [ + "/docs/advanced/create-plugin.md", + "/docs/advanced/create-plugin.html" + ], + [ + "/docs/advanced/develop-bot.html", + "/docs/for-developers/bot/" + ], + [ + "/docs/advanced/develop-bot", + "/docs/advanced/develop-bot.html" + ], + [ + "/docs/advanced/develop-bot.md", + "/docs/advanced/develop-bot.html" + ], + [ + "/docs/advanced/plugin-api-reference.html", + "/docs/for-developers/plugin/plugin-api-reference/" + ], + [ + "/docs/advanced/plugin-api-reference", + "/docs/advanced/plugin-api-reference.html" + ], + [ + "/docs/advanced/plugin-api-reference.md", + "/docs/advanced/plugin-api-reference.html" + ], + [ + "/docs/advanced/publish-on-your-website.html", + "/docs/for-developers/publish-on-your-website/" + ], + [ + "/docs/advanced/publish-on-your-website", + "/docs/advanced/publish-on-your-website.html" + ], + [ + "/docs/advanced/publish-on-your-website.md", + "/docs/advanced/publish-on-your-website.html" + ], + [ + "/docs/api/app.html", + "/docs/for-developers/api/app/" + ], + [ + "/docs/api/app", + "/docs/api/app.html" + ], + [ + "/docs/api/app.md", + "/docs/api/app.html" + ], + [ + "/docs/api/index.html", + "/docs/api/" + ], + [ + "/docs/api/index.md", + "/docs/api/" + ], + [ + "/docs/api/libraries.html", + "/docs/for-developers/api/libraries/" + ], + [ + "/docs/api/libraries", + "/docs/api/libraries.html" + ], + [ + "/docs/api/libraries.md", + "/docs/api/libraries.html" + ], + [ + "/docs/api/permission.html", + "/docs/for-developers/api/permission/" + ], + [ + "/docs/api/permission", + "/docs/api/permission.html" + ], + [ + "/docs/api/permission.md", + "/docs/api/permission.html" + ], + [ + "/docs/features/ads.html", + "/docs/for-users/features/ads/" + ], + [ + "/docs/features/ads", + "/docs/features/ads.html" + ], + [ + "/docs/features/ads.md", + "/docs/features/ads.html" + ], + [ + "/docs/features/antenna.html", + "/docs/for-users/features/antenna/" + ], + [ + "/docs/features/antenna", + "/docs/features/antenna.html" + ], + [ + "/docs/features/antenna.md", + "/docs/features/antenna.html" + ], + [ + "/docs/features/charts.html", + "/docs/for-users/features/charts/" + ], + [ + "/docs/features/charts", + "/docs/features/charts.html" + ], + [ + "/docs/features/charts.md", + "/docs/features/charts.html" + ], + [ + "/docs/features/clip.html", + "/docs/for-users/features/clip/" + ], + [ + "/docs/features/clip", + "/docs/features/clip.html" + ], + [ + "/docs/features/clip.md", + "/docs/features/clip.html" + ], + [ + "/docs/features/custom-emoji.html", + "/docs/for-users/features/custom-emoji/" + ], + [ + "/docs/features/custom-emoji", + "/docs/features/custom-emoji.html" + ], + [ + "/docs/features/custom-emoji.md", + "/docs/features/custom-emoji.html" + ], + [ + "/docs/features/deck.html", + "/docs/for-users/features/deck/" + ], + [ + "/docs/features/deck", + "/docs/features/deck.html" + ], + [ + "/docs/features/deck.md", + "/docs/features/deck.html" + ], + [ + "/docs/features/drive.html", + "/docs/for-users/features/drive/" + ], + [ + "/docs/features/drive", + "/docs/features/drive.html" + ], + [ + "/docs/features/drive.md", + "/docs/features/drive.html" + ], + [ + "/docs/features/favorite.html", + "/docs/for-users/features/favorite/" + ], + [ + "/docs/features/favorite", + "/docs/features/favorite.html" + ], + [ + "/docs/features/favorite.md", + "/docs/features/favorite.html" + ], + [ + "/docs/features/follow.html", + "/docs/for-users/features/follow/" + ], + [ + "/docs/features/follow", + "/docs/features/follow.html" + ], + [ + "/docs/features/follow.md", + "/docs/features/follow.html" + ], + [ + "/docs/features/hashtag.html", + "/docs/for-users/features/hashtag/" + ], + [ + "/docs/features/hashtag", + "/docs/features/hashtag.html" + ], + [ + "/docs/features/hashtag.md", + "/docs/features/hashtag.html" + ], + [ + "/docs/features/index.html", + "/docs/features/" + ], + [ + "/docs/features/index.md", + "/docs/features/" + ], + [ + "/docs/features/mention.html", + "/docs/for-users/features/mention/" + ], + [ + "/docs/features/mention", + "/docs/features/mention.html" + ], + [ + "/docs/features/mention.md", + "/docs/features/mention.html" + ], + [ + "/docs/features/mfm.html", + "/docs/for-users/features/mfm/" + ], + [ + "/docs/features/mfm", + "/docs/features/mfm.html" + ], + [ + "/docs/features/mfm.md", + "/docs/features/mfm.html" + ], + [ + "/docs/features/mute-and-block.html", + "/docs/for-users/features/mute-and-block/" + ], + [ + "/docs/features/mute-and-block", + "/docs/features/mute-and-block.html" + ], + [ + "/docs/features/mute-and-block.md", + "/docs/features/mute-and-block.html" + ], + [ + "/docs/features/note.html", + "/docs/for-users/features/note/" + ], + [ + "/docs/features/note", + "/docs/features/note.html" + ], + [ + "/docs/features/note.md", + "/docs/features/note.html" + ], + [ + "/docs/features/online-status.html", + "/docs/for-users/features/online-status/" + ], + [ + "/docs/features/online-status", + "/docs/features/online-status.html" + ], + [ + "/docs/features/online-status.md", + "/docs/features/online-status.html" + ], + [ + "/docs/features/pages.html", + "/docs/for-users/features/pages/" + ], + [ + "/docs/features/pages", + "/docs/features/pages.html" + ], + [ + "/docs/features/pages.md", + "/docs/features/pages.html" + ], + [ + "/docs/features/plugin.html", + "/docs/for-users/features/plugin/" + ], + [ + "/docs/features/plugin", + "/docs/features/plugin.html" + ], + [ + "/docs/features/plugin.md", + "/docs/features/plugin.html" + ], + [ + "/docs/features/reaction.html", + "/docs/for-users/features/reaction/" + ], + [ + "/docs/features/reaction", + "/docs/features/reaction.html" + ], + [ + "/docs/features/reaction.md", + "/docs/features/reaction.html" + ], + [ + "/docs/features/share-form.html", + "/docs/for-users/features/share-form/" + ], + [ + "/docs/features/share-form", + "/docs/features/share-form.html" + ], + [ + "/docs/features/share-form.md", + "/docs/features/share-form.html" + ], + [ + "/docs/features/silence.html", + "/docs/for-users/features/silence/" + ], + [ + "/docs/features/silence", + "/docs/features/silence.html" + ], + [ + "/docs/features/silence.md", + "/docs/features/silence.html" + ], + [ + "/docs/features/theme.html", + "/docs/for-users/features/theme/" + ], + [ + "/docs/features/theme", + "/docs/features/theme.html" + ], + [ + "/docs/features/theme.md", + "/docs/features/theme.html" + ], + [ + "/docs/features/thread-mute.html", + "/docs/for-users/features/thread-mute/" + ], + [ + "/docs/features/thread-mute", + "/docs/features/thread-mute.html" + ], + [ + "/docs/features/thread-mute.md", + "/docs/features/thread-mute.html" + ], + [ + "/docs/features/timeline.html", + "/docs/for-users/features/timeline/" + ], + [ + "/docs/features/timeline", + "/docs/features/timeline.html" + ], + [ + "/docs/features/timeline.md", + "/docs/features/timeline.html" + ], + [ + "/docs/features/webhook.html", + "/docs/for-users/features/webhook/" + ], + [ + "/docs/features/webhook", + "/docs/features/webhook.html" + ], + [ + "/docs/features/webhook.md", + "/docs/features/webhook.html" + ], + [ + "/docs/features/widgets.html", + "/docs/for-users/features/widgets/" + ], + [ + "/docs/features/widgets", + "/docs/features/widgets.html" + ], + [ + "/docs/features/widgets.md", + "/docs/features/widgets.html" + ], + [ + "/docs/features/word-mute.html", + "/docs/for-users/features/word-mute/" + ], + [ + "/docs/features/word-mute", + "/docs/features/word-mute.html" + ], + [ + "/docs/features/word-mute.md", + "/docs/features/word-mute.html" + ], + [ + "/docs/install/bash.html", + "/docs/for-admin/install/guides/bash/" + ], + [ + "/docs/install/bash", + "/docs/install/bash.html" + ], + [ + "/docs/install/bash.md", + "/docs/install/bash.html" + ], + [ + "/docs/install/docker.html", + "/docs/for-admin/install/guides/docker/" + ], + [ + "/docs/install/docker", + "/docs/install/docker.html" + ], + [ + "/docs/install/docker.md", + "/docs/install/docker.html" + ], + [ + "/docs/install/kubernetes.html", + "/docs/for-admin/install/guides/kubernetes/" + ], + [ + "/docs/install/kubernetes", + "/docs/install/kubernetes.html" + ], + [ + "/docs/install/kubernetes.md", + "/docs/install/kubernetes.html" + ], + [ + "/docs/install/manual.html", + "/docs/for-admin/install/guides/manual/" + ], + [ + "/docs/install/manual", + "/docs/install/manual.html" + ], + [ + "/docs/install/manual.md", + "/docs/install/manual.html" + ], + [ + "/docs/install/ubuntu-manual.html", + "/docs/for-admin/install/guides/ubuntu-manual/" + ], + [ + "/docs/install/ubuntu-manual", + "/docs/install/ubuntu-manual.html" + ], + [ + "/docs/install/ubuntu-manual.md", + "/docs/install/ubuntu-manual.html" + ], + [ + "/docs/tips/disable-timelines.html", + "/docs/for-admin/moderation-tips/disable-timelines/" + ], + [ + "/docs/tips/disable-timelines", + "/docs/tips/disable-timelines.html" + ], + [ + "/docs/tips/disable-timelines.md", + "/docs/tips/disable-timelines.html" + ], + [ + "/docs/tips/scale-out.html", + "/docs/for-admin/install/resources/scale-out/" + ], + [ + "/docs/tips/scale-out", + "/docs/tips/scale-out.html" + ], + [ + "/docs/tips/scale-out.md", + "/docs/tips/scale-out.html" + ], + [ + "/appendix/assets.html", + "/brand-assets/" + ], + [ + "/appendix/assets", + "/appendix/assets.html" + ], + [ + "/appendix/assets.md", + "/appendix/assets.html" + ], + [ + "/docs/apps.html", + "/docs/for-users/resources/apps/" + ], + [ + "/docs/apps", + "/docs/apps.html" + ], + [ + "/docs/apps.md", + "/docs/apps.html" + ], + [ + "/docs/donate.html", + "/docs/for-users/resources/donate/" + ], + [ + "/docs/donate", + "/docs/donate.html" + ], + [ + "/docs/donate.md", + "/docs/donate.html" + ], + [ + "/docs/faq.html", + "/docs/for-users/resources/faq/" + ], + [ + "/docs/faq", + "/docs/faq.html" + ], + [ + "/docs/faq.md", + "/docs/faq.html" + ], + [ + "/docs/getting-started.html", + "/docs/for-users/onboarding/" + ], + [ + "/docs/getting-started", + "/docs/getting-started.html" + ], + [ + "/docs/getting-started.md", + "/docs/getting-started.html" + ], + [ + "/docs/glossary.html", + "/docs/for-users/resources/glossary/" + ], + [ + "/docs/glossary", + "/docs/glossary.html" + ], + [ + "/docs/glossary.md", + "/docs/glossary.html" + ], + [ + "/docs/index.html", + "/docs/" + ], + [ + "/docs/index.md", + "/docs/" + ], + [ + "/docs/install.html", + "/docs/for-admin/install/guides/" + ], + [ + "/docs/install", + "/docs/install.html" + ], + [ + "/docs/install.md", + "/docs/install.html" + ], + [ + "/docs/misskey-hub.html", + "/docs/for-users/resources/misskey-hub/" + ], + [ + "/docs/misskey-hub", + "/docs/misskey-hub.html" + ], + [ + "/docs/misskey-hub.md", + "/docs/misskey-hub.html" + ], + [ + "/docs/misskey.html", + "/docs/about-misskey/" + ], + [ + "/docs/misskey", + "/docs/misskey.html" + ], + [ + "/docs/misskey.md", + "/docs/misskey.html" + ], + [ + "/docs/notes.html", + "/docs/for-users/onboarding/warning/" + ], + [ + "/docs/notes", + "/docs/notes.html" + ], + [ + "/docs/notes.md", + "/docs/notes.html" + ], + [ + "/docs/releases.html", + "/docs/releases/" + ], + [ + "/docs/releases", + "/docs/releases.html" + ], + [ + "/docs/releases.md", + "/docs/releases.html" + ], + [ + "/docs/troubleshooting.html", + "/docs/for-users/resources/troubleshooting/" + ], + [ + "/docs/troubleshooting", + "/docs/troubleshooting.html" + ], + [ + "/docs/troubleshooting.md", + "/docs/troubleshooting.html" + ], + [ + "/blog/2021-09-11-hello-to-misskey-hub.html", + "/ja/blog/2021-09-11-hello-to-misskey-hub/" + ], + [ + "/blog/2021-09-11-hello-to-misskey-hub", + "/blog/2021-09-11-hello-to-misskey-hub.html" + ], + [ + "/blog/2021-09-11-hello-to-misskey-hub.md", + "/blog/2021-09-11-hello-to-misskey-hub.html" + ], + [ + "/blog/2021-11-05-mac2021.html", + "/ja/blog/2021-11-05-mac2021/" + ], + [ + "/blog/2021-11-05-mac2021", + "/blog/2021-11-05-mac2021.html" + ], + [ + "/blog/2021-11-05-mac2021.md", + "/blog/2021-11-05-mac2021.html" + ], + [ + "/blog/2021-12-01-inside-misskey-hub.html", + "/ja/blog/2021-12-01-inside-misskey-hub/" + ], + [ + "/blog/2021-12-01-inside-misskey-hub", + "/blog/2021-12-01-inside-misskey-hub.html" + ], + [ + "/blog/2021-12-01-inside-misskey-hub.md", + "/blog/2021-12-01-inside-misskey-hub.html" + ], + [ + "/blog/2022-02-11-inside-mfm.html", + "/ja/blog/2022-02-11-inside-mfm/" + ], + [ + "/blog/2022-02-11-inside-mfm", + "/blog/2022-02-11-inside-mfm.html" + ], + [ + "/blog/2022-02-11-inside-mfm.md", + "/blog/2022-02-11-inside-mfm.html" + ], + [ + "/blog/2022-11-28-media-k-tai.html", + "/ja/blog/2022-11-28-media-k-tai/" + ], + [ + "/blog/2022-11-28-media-k-tai", + "/blog/2022-11-28-media-k-tai.html" + ], + [ + "/blog/2022-11-28-media-k-tai.md", + "/blog/2022-11-28-media-k-tai.html" + ], + [ + "/blog/2023-02-08-contribute-to-earn.html", + "/ja/blog/2023-02-08-contribute-to-earn/" + ], + [ + "/blog/2023-02-08-contribute-to-earn", + "/blog/2023-02-08-contribute-to-earn.html" + ], + [ + "/blog/2023-02-08-contribute-to-earn.md", + "/blog/2023-02-08-contribute-to-earn.html" + ], + [ + "/blog/2023-02-13-gihyo.html", + "/ja/blog/2023-02-13-gihyo/" + ], + [ + "/blog/2023-02-13-gihyo", + "/blog/2023-02-13-gihyo.html" + ], + [ + "/blog/2023-02-13-gihyo.md", + "/blog/2023-02-13-gihyo.html" + ], + [ + "/blog/2023-02-13-media-k-tai.html", + "/ja/blog/2023-02-13-media-k-tai/" + ], + [ + "/blog/2023-02-13-media-k-tai", + "/blog/2023-02-13-media-k-tai.html" + ], + [ + "/blog/2023-02-13-media-k-tai.md", + "/blog/2023-02-13-media-k-tai.html" + ], + [ + "/blog/2023-03-04-media-itmedia.html", + "/ja/blog/2023-03-04-media-itmedia/" + ], + [ + "/blog/2023-03-04-media-itmedia", + "/blog/2023-03-04-media-itmedia.html" + ], + [ + "/blog/2023-03-04-media-itmedia.md", + "/blog/2023-03-04-media-itmedia.html" + ], + [ + "/blog/2023-03-22-gihyo.html", + "/ja/blog/2023-03-22-gihyo/" + ], + [ + "/blog/2023-03-22-gihyo", + "/blog/2023-03-22-gihyo.html" + ], + [ + "/blog/2023-03-22-gihyo.md", + "/blog/2023-03-22-gihyo.html" + ], + [ + "/blog/2023-04-08-media-nikkei-linux.html", + "/ja/blog/2023-04-08-media-nikkei-linux/" + ], + [ + "/blog/2023-04-08-media-nikkei-linux", + "/blog/2023-04-08-media-nikkei-linux.html" + ], + [ + "/blog/2023-04-08-media-nikkei-linux.md", + "/blog/2023-04-08-media-nikkei-linux.html" + ], + [ + "/blog/2023-05-15-gihyo.html", + "/ja/blog/2023-05-15-gihyo/" + ], + [ + "/blog/2023-05-15-gihyo", + "/blog/2023-05-15-gihyo.html" + ], + [ + "/blog/2023-05-15-gihyo.md", + "/blog/2023-05-15-gihyo.html" + ], + [ + "/blog/2023-06-14-gihyo.html", + "/ja/blog/2023-06-14-gihyo/" + ], + [ + "/blog/2023-06-14-gihyo", + "/blog/2023-06-14-gihyo.html" + ], + [ + "/blog/2023-06-14-gihyo.md", + "/blog/2023-06-14-gihyo.html" + ], + [ + "/blog/2023-07-01-interview.html", + "/ja/blog/2023-07-01-interview/" + ], + [ + "/blog/2023-07-01-interview", + "/blog/2023-07-01-interview.html" + ], + [ + "/blog/2023-07-01-interview.md", + "/blog/2023-07-01-interview.html" + ], + [ + "/blog/2023-07-10-interview.html", + "/ja/blog/2023-07-10-interview/" + ], + [ + "/blog/2023-07-10-interview", + "/blog/2023-07-10-interview.html" + ], + [ + "/blog/2023-07-10-interview.md", + "/blog/2023-07-10-interview.html" + ], + [ + "/blog/2023-07-12-trademark.html", + "/ja/blog/2023-07-12-trademark/" + ], + [ + "/blog/2023-07-12-trademark", + "/blog/2023-07-12-trademark.html" + ], + [ + "/blog/2023-07-12-trademark.md", + "/blog/2023-07-12-trademark.html" + ], + [ + "/blog/2023-07-14-skeb.html", + "/ja/2023-07-14-skeb/" + ], + [ + "/blog/2023-07-14-skeb", + "/blog/2023-07-14-skeb.html" + ], + [ + "/blog/2023-07-14-skeb.md", + "/blog/2023-07-14-skeb.html" + ], + [ + "/blog/2023-07-14-xserver.html", + "/ja/blog/2023-07-14-xserver/" + ], + [ + "/blog/2023-07-14-xserver", + "/blog/2023-07-14-xserver.html" + ], + [ + "/blog/2023-07-14-xserver.md", + "/blog/2023-07-14-xserver.html" + ], + [ + "/blog/2023-07-16-media-nikkei.html", + "/ja/blog/2023-07-16-media-nikkei/" + ], + [ + "/blog/2023-07-16-media-nikkei", + "/blog/2023-07-16-media-nikkei.html" + ], + [ + "/blog/2023-07-16-media-nikkei.md", + "/blog/2023-07-16-media-nikkei.html" + ], + [ + "/blog/2023-07-18-shindanmaker.html", + "/ja/blog/2023-07-18-shindanmaker/" + ], + [ + "/blog/2023-07-18-shindanmaker", + "/blog/2023-07-18-shindanmaker.html" + ], + [ + "/blog/2023-07-18-shindanmaker.md", + "/blog/2023-07-18-shindanmaker.html" + ], + [ + "/blog/2023-07-19-gihyo.html", + "/ja/blog/2023-07-19-gihyo/" + ], + [ + "/blog/2023-07-19-gihyo", + "/blog/2023-07-19-gihyo.html" + ], + [ + "/blog/2023-07-19-gihyo.md", + "/blog/2023-07-19-gihyo.html" + ], + [ + "/blog/2023-08-08-misskeyhq.html", + "/ja/blog/2023-08-08-misskeyhq/" + ], + [ + "/blog/2023-08-08-misskeyhq", + "/blog/2023-08-08-misskeyhq.html" + ], + [ + "/blog/2023-08-08-misskeyhq.md", + "/blog/2023-08-08-misskeyhq.html" + ], + [ + "/blog/2023-08-30-conoha.html", + "/ja/blog/2023-08-30-conoha/" + ], + [ + "/blog/2023-08-30-conoha", + "/blog/2023-08-30-conoha.html" + ], + [ + "/blog/2023-08-30-conoha.md", + "/blog/2023-08-30-conoha.html" + ], + [ + "/blog/2023-09-04-media-nlab.html", + "/ja/blog/2023-09-04-media-nlab.html" + ], + [ + "/blog/2023-09-04-media-nlab", + "/blog/2023-09-04-media-nlab.html" + ], + [ + "/blog/2023-09-04-media-nlab.md", + "/blog/2023-09-04-media-nlab.html" + ], + [ + "/blog/2023-09-07-hatenablog.html", + "/ja/blog/2023-09-07-hatenablog.html" + ], + [ + "/blog/2023-09-07-hatenablog", + "/blog/2023-09-07-hatenablog.html" + ], + [ + "/blog/2023-09-07-hatenablog.md", + "/blog/2023-09-07-hatenablog.html" + ], + [ + "/blog/2023-09-09-interview.html", + "/ja/blog/2023-09-09-interview.html" + ], + [ + "/blog/2023-09-09-interview", + "/blog/2023-09-09-interview.html" + ], + [ + "/blog/2023-09-09-interview.md", + "/blog/2023-09-09-interview.html" + ], + [ + "/blog/2023-09-11-gihyo.html", + "/ja/blog/2023-09-11-gihyo.html" + ], + [ + "/blog/2023-09-11-gihyo", + "/blog/2023-09-11-gihyo.html" + ], + [ + "/blog/2023-09-11-gihyo.md", + "/blog/2023-09-11-gihyo.html" + ], + [ + "/blog/2023-09-12-sakuravps.html", + "/ja/blog/2023-09-12-sakuravps.html" + ], + [ + "/blog/2023-09-12-sakuravps", + "/blog/2023-09-12-sakuravps.html" + ], + [ + "/blog/2023-09-12-sakuravps.md", + "/blog/2023-09-12-sakuravps.html" + ], + [ + "/blog/2023-09-24-release.html", + "/ja/blog/2023-09-24-release.html" + ], + [ + "/blog/2023-09-24-release", + "/blog/2023-09-24-release.html" + ], + [ + "/blog/2023-09-24-release.md", + "/blog/2023-09-24-release.html" + ], + [ + "/blog/2023-10-10-release.html", + "/ja/blog/2023-10-10-release.html" + ], + [ + "/blog/2023-10-10-release", + "/blog/2023-10-10-release.html" + ], + [ + "/blog/2023-10-10-release.md", + "/blog/2023-10-10-release.html" + ], + [ + "/blog/2023-10-24-gihyo.html", + "/ja/blog/2023-10-24-gihyo.html" + ], + [ + "/blog/2023-10-24-gihyo", + "/blog/2023-10-24-gihyo.html" + ], + [ + "/blog/2023-10-24-gihyo.md", + "/blog/2023-10-24-gihyo.html" + ], + [ + "/blog/2023-10-27-xserver.html", + "/ja/blog/2023-10-27-xserver.html" + ], + [ + "/blog/2023-10-27-xserver", + "/blog/2023-10-27-xserver.html" + ], + [ + "/blog/2023-10-27-xserver.md", + "/blog/2023-10-27-xserver.html" + ], + [ + "/blog/2023-11-05-mac2023.html", + "/ja/blog/2023-11-05-mac2023.html" + ], + [ + "/blog/2023-11-05-mac2023", + "/blog/2023-11-05-mac2023.html" + ], + [ + "/blog/2023-11-05-mac2023.md", + "/blog/2023-11-05-mac2023.html" + ], + [ + "/blog/2023-11-05-release.html", + "/ja/blog/2023-11-05-release.html" + ], + [ + "/blog/2023-11-05-release", + "/blog/2023-11-05-release.html" + ], + [ + "/blog/2023-11-05-release.md", + "/blog/2023-11-05-release.html" + ], + [ + "/blog/2023-11-14-gihyo.html", + "/ja/blog/2023-11-14-gihyo.html" + ], + [ + "/blog/2023-11-14-gihyo", + "/blog/2023-11-14-gihyo.html" + ], + [ + "/blog/2023-11-14-gihyo.md", + "/blog/2023-11-14-gihyo.html" + ], + [ + "/blog/2023-11-17-release.html", + "/ja/blog/2023-11-17-release.html" + ], + [ + "/blog/2023-11-17-release", + "/blog/2023-11-17-release.html" + ], + [ + "/blog/2023-11-17-release.md", + "/blog/2023-11-17-release.html" + ], + [ + "/blog/2023-12-01-2023recap.html", + "/ja/blog/2023-12-01-2023recap.html" + ], + [ + "/blog/2023-12-01-2023recap", + "/blog/2023-12-01-2023recap.html" + ], + [ + "/blog/2023-12-01-2023recap.md", + "/blog/2023-12-01-2023recap.html" + ], + [ + "/blog/index.html", + "/blog/" + ], + [ + "/blog/index.md", + "/blog/" + ], + [ + "/help.html", + "/docs/for-users/" + ], + [ + "/help", + "/help.html" + ], + [ + "/help.md", + "/help.html" + ], + [ + "/home.html", + "/" + ], + [ + "/home", + "/home.html" + ], + [ + "/home.md", + "/home.html" + ], + [ + "/instances.html", + "/servers/" + ], + [ + "/instances", + "/instances.html" + ], + [ + "/instances.md", + "/instances.html" + ], + [ + "/ns.html", + "/ns/" + ], + [ + "/ns", + "/ns.html" + ], + [ + "/ns.md", + "/ns.html" + ], + [ + "/plugins.html", + "/learn-more/" + ], + [ + "/plugins", + "/plugins.html" + ], + [ + "/plugins.md", + "/plugins.html" + ], + [ + "/index.html", + "/" + ], +]; \ No newline at end of file diff --git a/content/ja/.docs-legacy/advanced/aiscript.md b/content/ja/docs/4.for-developers/aiscript.md similarity index 97% rename from content/ja/.docs-legacy/advanced/aiscript.md rename to content/ja/docs/4.for-developers/aiscript.md index 08f03b50..76da369a 100644 --- a/content/ja/.docs-legacy/advanced/aiscript.md +++ b/content/ja/docs/4.for-developers/aiscript.md @@ -1,8 +1,10 @@ # AiScript AiScriptは、Misskeyで使用できるスクリプト言語です。 -::: tip +:::tip + AiScript実装はMisskeyとは別リポジトリで、[オープンソースで公開されています](https://github.com/syuilo/aiscript)。 + ::: ## 使い方 diff --git a/content/ja/.docs-legacy/api/app.md b/content/ja/docs/4.for-developers/api/app.md similarity index 100% rename from content/ja/.docs-legacy/api/app.md rename to content/ja/docs/4.for-developers/api/app.md diff --git a/nuxt.config.ts b/nuxt.config.ts index fd20b415..2faa43b4 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -3,30 +3,16 @@ import yaml from '@rollup/plugin-yaml'; import svgLoader from 'vite-svg-loader'; import { readFileSync } from 'fs'; import { genApiTranslationFiles } from './scripts/gen-api-translations'; -import type { LocaleObject } from '@nuxtjs/i18n/dist/runtime/composables'; +import { getOldHubRedirects } from './scripts/get-old-hub-redirects'; import { genLocalesJson } from './scripts/gen-locales'; import { getStaticEndpoints } from './scripts/get-static-endpoints'; +import { locales } from './assets/data/locales'; import type { NuxtConfig } from 'nuxt/schema'; // 公開時のドメイン(末尾スラッシュなし) const baseUrl = 'https://misskey-hub-next.vercel.app'; -// 言語定義 -export const localesConst = [ - { files: [ 'ja-JP.json' ], code: 'ja', iso: 'ja-JP', name: '日本語' }, - { files: [ 'en-US.json' ], code: 'en', iso: 'en-US', name: 'English' }, - { files: [ 'id-ID.json' ], code: 'id', iso: 'id-ID', name: 'Bahasa Indonesia' }, - { files: [ 'ko-KR.json' ], code: 'ko', iso: 'ko-KR', name: '한국어' }, - { files: [ 'it-IT.json' ], code: 'it', iso: 'it-IT', name: 'Italiano' }, - { files: [ 'pl-PL.json' ], code: 'pl', iso: 'pl-PL', name: 'Polski' }, - { files: [ 'fr-FR.json' ], code: 'fr', iso: 'fr-FR', name: 'Français' }, - { files: [ 'zh-CN.json' ], code: 'cn', iso: 'zh-CN', name: '简体中文' }, - { files: [ 'zh-TW.json' ], code: 'tw', iso: 'zh-TW', name: '繁体中文' }, -] as const; - -export type LocaleCodes = typeof localesConst[number]['code']; - -export const locales = localesConst as unknown as LocaleObject[]; +// 言語定義は /assets/data/locales.ts に移動しました function getRouteRules(): NuxtConfig['routeRules'] { // 言語ごとに割り当てる必要のないRouteRules @@ -63,6 +49,7 @@ function getRouteRules(): NuxtConfig['routeRules'] { return { ...staticRules, ..._localeBasedRules, + ...getOldHubRedirects(), }; } diff --git a/scripts/get-old-hub-redirects.ts b/scripts/get-old-hub-redirects.ts new file mode 100644 index 00000000..5e1b4f98 --- /dev/null +++ b/scripts/get-old-hub-redirects.ts @@ -0,0 +1,44 @@ +import { redirects } from './../assets/data/old-hub-redirects'; +import { localesConst } from './../assets/data/locales'; +import type { LocaleCodes } from './../assets/data/locales'; +import type { NuxtConfig } from 'nuxt/schema'; +import { joinURL } from 'ufo'; + +export function getOldHubRedirects(): NuxtConfig['routeRules'] { + + // 旧Hub時代の各言語のプレフィックス + const hubLocales: Record = { + ja: '/', + en: '/en', + id: '/id', + ko: '/ko', + it: '/it', + pl: '/pl', + fr: '/fr', + cn: '/zh-CN', + tw: '/zh-TW', + }; + + const out: NuxtConfig['routeRules'] = {}; + + localesConst.forEach((locale) => { + redirects.forEach((route) => { + if (route[0].startsWith('/ns')) return; + + let destination = route[1]; + + if (route[0].endsWith('.html') && !new RegExp(`^/(${localesConst.map((e) => e.code).join('|')})/`, 'g').test(destination)) { + destination = joinURL(`/${locale.code}`, destination); + } + + out[joinURL(hubLocales[locale.code], route[0])] = { + redirect: { + to: destination, + statusCode: 301, + }, + }; + }); + }); + + return out; +} \ No newline at end of file From 8993873c5aa5e2da730c9ba1b0de17bd7cde4d60 Mon Sep 17 00:00:00 2001 From: kakkokari-gtyih Date: Tue, 12 Dec 2023 19:31:45 +0900 Subject: [PATCH 4/6] fix paths --- assets/data/old-hub-redirects.ts | 40 +++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/assets/data/old-hub-redirects.ts b/assets/data/old-hub-redirects.ts index 9437bbc2..8483704b 100644 --- a/assets/data/old-hub-redirects.ts +++ b/assets/data/old-hub-redirects.ts @@ -1089,7 +1089,7 @@ export const redirects = [ ], [ "/blog/2023-09-04-media-nlab.html", - "/ja/blog/2023-09-04-media-nlab.html" + "/ja/blog/2023-09-04-media-nlab/" ], [ "/blog/2023-09-04-media-nlab", @@ -1101,7 +1101,7 @@ export const redirects = [ ], [ "/blog/2023-09-07-hatenablog.html", - "/ja/blog/2023-09-07-hatenablog.html" + "/ja/blog/2023-09-07-hatenablog/" ], [ "/blog/2023-09-07-hatenablog", @@ -1113,7 +1113,7 @@ export const redirects = [ ], [ "/blog/2023-09-09-interview.html", - "/ja/blog/2023-09-09-interview.html" + "/ja/blog/2023-09-09-interview/" ], [ "/blog/2023-09-09-interview", @@ -1125,7 +1125,7 @@ export const redirects = [ ], [ "/blog/2023-09-11-gihyo.html", - "/ja/blog/2023-09-11-gihyo.html" + "/ja/blog/2023-09-11-gihyo/" ], [ "/blog/2023-09-11-gihyo", @@ -1137,7 +1137,7 @@ export const redirects = [ ], [ "/blog/2023-09-12-sakuravps.html", - "/ja/blog/2023-09-12-sakuravps.html" + "/ja/blog/2023-09-12-sakuravps/" ], [ "/blog/2023-09-12-sakuravps", @@ -1149,7 +1149,7 @@ export const redirects = [ ], [ "/blog/2023-09-24-release.html", - "/ja/blog/2023-09-24-release.html" + "/ja/blog/2023-09-24-release/" ], [ "/blog/2023-09-24-release", @@ -1161,7 +1161,7 @@ export const redirects = [ ], [ "/blog/2023-10-10-release.html", - "/ja/blog/2023-10-10-release.html" + "/ja/blog/2023-10-10-release/" ], [ "/blog/2023-10-10-release", @@ -1173,7 +1173,7 @@ export const redirects = [ ], [ "/blog/2023-10-24-gihyo.html", - "/ja/blog/2023-10-24-gihyo.html" + "/ja/blog/2023-10-24-gihyo/" ], [ "/blog/2023-10-24-gihyo", @@ -1185,7 +1185,7 @@ export const redirects = [ ], [ "/blog/2023-10-27-xserver.html", - "/ja/blog/2023-10-27-xserver.html" + "/ja/blog/2023-10-27-xserver/" ], [ "/blog/2023-10-27-xserver", @@ -1197,7 +1197,7 @@ export const redirects = [ ], [ "/blog/2023-11-05-mac2023.html", - "/ja/blog/2023-11-05-mac2023.html" + "/ja/blog/2023-11-05-mac2023/" ], [ "/blog/2023-11-05-mac2023", @@ -1209,7 +1209,7 @@ export const redirects = [ ], [ "/blog/2023-11-05-release.html", - "/ja/blog/2023-11-05-release.html" + "/ja/blog/2023-11-05-release/" ], [ "/blog/2023-11-05-release", @@ -1221,7 +1221,7 @@ export const redirects = [ ], [ "/blog/2023-11-14-gihyo.html", - "/ja/blog/2023-11-14-gihyo.html" + "/ja/blog/2023-11-14-gihyo/" ], [ "/blog/2023-11-14-gihyo", @@ -1233,7 +1233,7 @@ export const redirects = [ ], [ "/blog/2023-11-17-release.html", - "/ja/blog/2023-11-17-release.html" + "/ja/blog/2023-11-17-release/" ], [ "/blog/2023-11-17-release", @@ -1245,7 +1245,7 @@ export const redirects = [ ], [ "/blog/2023-12-01-2023recap.html", - "/ja/blog/2023-12-01-2023recap.html" + "/ja/blog/2023-12-01-2023recap/" ], [ "/blog/2023-12-01-2023recap", @@ -1255,6 +1255,18 @@ export const redirects = [ "/blog/2023-12-01-2023recap.md", "/blog/2023-12-01-2023recap.html" ], + [ + "/blog/2023-12-12-gihyo.html", + "/ja/blog/2023-12-12-gihyo/" + ], + [ + "/blog/2023-12-12-gihyo", + "/blog/2023-12-12-gihyo.html" + ], + [ + "/blog/2023-12-12-gihyo.md", + "/blog/2023-12-12-gihyo.html" + ], [ "/blog/index.html", "/blog/" From 11286a3e2e0c37e39a45c4b72e4a6e9aebce5a41 Mon Sep 17 00:00:00 2001 From: kakkokari-gtyih Date: Tue, 12 Dec 2023 20:32:19 +0900 Subject: [PATCH 5/6] =?UTF-8?q?=E4=B8=80=E6=99=82=E7=9A=84=E3=81=AB?= =?UTF-8?q?=E3=83=AA=E3=83=80=E3=82=A4=E3=83=AC=E3=82=AF=E3=83=88=E3=82=92?= =?UTF-8?q?=E3=82=84=E3=82=81=E3=82=8B=EF=BC=88Vercel=E3=81=AE=E5=88=B6?= =?UTF-8?q?=E9=99=90=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nuxt.config.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/nuxt.config.ts b/nuxt.config.ts index 2faa43b4..08abcc41 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -49,7 +49,6 @@ function getRouteRules(): NuxtConfig['routeRules'] { return { ...staticRules, ..._localeBasedRules, - ...getOldHubRedirects(), }; } From f6d147dd55c4190c532d44c7a648f7dca762c0e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=8B=E3=81=A3=E3=81=93=E3=81=8B=E3=82=8A?= <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Tue, 12 Dec 2023 22:46:53 +0900 Subject: [PATCH 6/6] Vercel Redirect Test (#54) --- nuxt.config.ts | 7 ++++ scripts/get-old-hub-redirects.ts | 65 ++++++++++++++++++++++++-------- 2 files changed, 56 insertions(+), 16 deletions(-) diff --git a/nuxt.config.ts b/nuxt.config.ts index 08abcc41..e1f4030e 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -150,6 +150,13 @@ export default defineNuxtConfig({ }, nitro: { preset: 'vercel', + vercel: { + config: { + routes: [ + ...getOldHubRedirects(), + ], + } + }, plugins: [ '@/server/plugins/appendComment.ts', '@/server/plugins/i18nRedirector.ts', diff --git a/scripts/get-old-hub-redirects.ts b/scripts/get-old-hub-redirects.ts index 5e1b4f98..e8c2aff7 100644 --- a/scripts/get-old-hub-redirects.ts +++ b/scripts/get-old-hub-redirects.ts @@ -1,10 +1,30 @@ +import { writeFileSync } from 'fs'; import { redirects } from './../assets/data/old-hub-redirects'; import { localesConst } from './../assets/data/locales'; import type { LocaleCodes } from './../assets/data/locales'; import type { NuxtConfig } from 'nuxt/schema'; -import { joinURL } from 'ufo'; +import { joinURL, cleanDoubleSlashes } from 'ufo'; -export function getOldHubRedirects(): NuxtConfig['routeRules'] { +type VercelRouteSource = { + src: string; + dest?: string; + headers?: Record; + methods?: string[]; + continue?: boolean; + caseSensitive?: boolean; + check?: boolean; + status?: number; + has?: Array; + missing?: Array; + locale?: { + redirect?: Record; + cookie?: string; + }; + middlewareRawSrc?: string[]; + middlewarePath?: string; +}; + +export function getOldHubRedirects():VercelRouteSource[] { // 旧Hub時代の各言語のプレフィックス const hubLocales: Record = { @@ -19,26 +39,39 @@ export function getOldHubRedirects(): NuxtConfig['routeRules'] { tw: '/zh-TW', }; - const out: NuxtConfig['routeRules'] = {}; + const out:VercelRouteSource[] = []; - localesConst.forEach((locale) => { - redirects.forEach((route) => { - if (route[0].startsWith('/ns')) return; + redirects.forEach((route) => { + if (route[0].startsWith('/ns')) return; - let destination = route[1]; + let destination = route[1]; - if (route[0].endsWith('.html') && !new RegExp(`^/(${localesConst.map((e) => e.code).join('|')})/`, 'g').test(destination)) { - destination = joinURL(`/${locale.code}`, destination); - } + if (!new RegExp(`^/(${localesConst.map((e) => e.code).join('|')})/`, 'g').test(destination)) { + destination = joinURL(`$1/`, destination); + } - out[joinURL(hubLocales[locale.code], route[0])] = { - redirect: { - to: destination, - statusCode: 301, - }, - }; + out.push({ + src: joinURL(`(${Object.values(hubLocales).map((v) => v === '/' ? '' : v).join('|')})/`, route[0]).replace(/(?