(nuxt) replace NUXT_PUBLIC_BASE_URL with calculating it from NUXT_PUBLIC_DOMAIN_BASE

This commit is contained in:
Valentyne Stigloher 2025-02-25 12:04:51 +01:00
parent dd5a8f49b0
commit 8959e84889
23 changed files with 119 additions and 107 deletions

View File

@ -1,7 +1,5 @@
NUXT_PUBLIC_DOMAIN_BASE=http://{locale}.localhost:3000
NUXT_PUBLIC_BASE_URL=http://localhost:3000
SECRET=changeMeOnProd!
MAILER_TRANSPORT=

View File

@ -1,15 +1,15 @@
<script setup lang="ts">
import { useNuxtApp, useRuntimeConfig } from 'nuxt/app';
import { useNuxtApp } from 'nuxt/app';
import { useHead, useSeoMeta } from '#imports';
import useConfig from '~/composables/useConfig.ts';
import { getDefaultSeo } from '~/composables/useSimpleHead.ts';
import { getUrlForLocale } from '~/src/domain.ts';
const { $translator: translator } = useNuxtApp();
const runtimeConfig = useRuntimeConfig();
const config = useConfig();
const defaultSeo = getDefaultSeo(translator, runtimeConfig);
const defaultSeo = getDefaultSeo(config, translator);
const colour = '#C71585';
useHead({
@ -49,7 +49,7 @@ useSeoMeta({
twitterCard: 'summary_large_image',
twitterTitle: defaultSeo.title,
twitterDescription: defaultSeo.description,
twitterSite: runtimeConfig.public.baseUrl,
twitterSite: getUrlForLocale(config.locale),
twitterImage: defaultSeo.banner,
});
</script>

View File

@ -347,7 +347,7 @@ import { socialProviders } from '../src/socialProviders.ts';
import { usernameRegex } from '../src/username.ts';
import { useMainStore } from '../store/index.ts';
import { getUrlsForAllLocales } from '~/src/domain.ts';
import { getUrlForLocale, getUrlsForAllLocales } from '~/src/domain.ts';
import type { Profile } from '~/src/profile.ts';
export default defineComponent({
@ -371,11 +371,11 @@ export default defineComponent({
});
const config = useConfig();
const runtimeConfig = useRuntimeConfig();
const baseUrl = getUrlForLocale(config.locale);
return {
config,
universalDomains: getUrlsForAllLocales(config.locale).filter((x) => x !== runtimeConfig.public.baseUrl),
universalDomains: getUrlsForAllLocales(config.locale).filter((url) => url !== baseUrl),
dialogue,
user,
username: ref(user.value.username),

View File

@ -3,6 +3,8 @@ import { EventLevel } from '../src/calendar/helpers.ts';
import type { Event, Day } from '../src/calendar/helpers.ts';
import { newDate } from '../src/helpers.ts';
import { getUrlForLocale } from '~/src/domain.ts';
const props = withDefaults(defineProps<{
event: Event;
year?: number;
@ -61,7 +63,7 @@ const eventParam = computed((): string | null => {
<LinkedText v-else :text="eventName" />
<a
v-if="ics && event.level !== EventLevel.CustomDay"
:href="`/api/queer-calendar-${config.locale}-${year}-${event.getUuid($config.public.baseUrl)}.ics`"
:href="`/api/queer-calendar-${config.locale}-${year}-${event.getUuid(getUrlForLocale(config.locale))}.ics`"
class="small"
:aria-label="`${$t('crud.download')} .ics`"
:title="`${$t('crud.download')} .ics`"

View File

@ -80,6 +80,8 @@ import useConfig from '../composables/useConfig.ts';
import { socialLinks } from '../src/contact.ts';
import { clearUrl, newDate } from '../src/helpers.ts';
import { getUrlForLocale } from '~/src/domain.js';
export default {
props: {
day: {},
@ -102,7 +104,7 @@ export default {
computed: {
icsLink() {
const yearSuffix = this.year.year === newDate().getFullYear() ? '' : `-${this.year.year}`;
return `${this.$config.public.baseUrl}/api/queer-calendar-${this.config.locale}${yearSuffix}.ics`;
return `${getUrlForLocale(this.config.locale)}/api/queer-calendar-${this.config.locale}${yearSuffix}.ics`;
},
},
};

View File

@ -1,3 +1,30 @@
<script setup lang="ts">
import { getUrlForLocale } from '~/src/domain.ts';
const config = useConfig();
const exportStarted = ref(false);
const importSuccessful = ref(false);
const exportLink = computed(() => {
return `${getUrlForLocale(config.locale)}/api/profile/export`;
});
const importLink = computed(() => {
return `${getUrlForLocale(config.locale)}/api/profile/import`;
});
const startExport = () => {
exportStarted.value = true;
setTimeout(() => exportStarted.value = false, 5000);
};
const importDone = () => {
importSuccessful.value = true;
setTimeout(() => window.location.reload(), 3000);
};
</script>
<template>
<section>
<h5>
@ -37,32 +64,3 @@
</div>
</section>
</template>
<script>
export default {
data() {
return {
exportStarted: false,
importSuccessful: false,
};
},
computed: {
exportLink() {
return `${this.$config.public.baseUrl}/api/profile/export`;
},
importLink() {
return `${this.$config.public.baseUrl}/api/profile/import`;
},
},
methods: {
startExport() {
this.exportStarted = true;
setTimeout(() => this.exportStarted = false, 5000);
},
importDone() {
this.importSuccessful = true;
setTimeout(() => window.location.reload(), 3000);
},
},
};
</script>

View File

@ -2,11 +2,13 @@
import { importSPKI, jwtVerify } from 'jose';
import type { FetchOptions } from 'ofetch';
import { getUrlForLocale } from '~/src/domain.ts';
import { socialProviders } from '~/src/socialProviders.ts';
import type { User } from '~/src/user.ts';
const { $setToken: setToken } = useNuxtApp();
const runtimeConfig = useRuntimeConfig();
const config = useConfig();
const token = ref<string | null>(null);
const usernameOrEmail = ref('');
@ -29,11 +31,12 @@ watchEffect(async () => {
await setToken(token.value);
const importedPublicKey = await importSPKI(runtimeConfig.public.publicKey, 'RS256');
const baseUrl = getUrlForLocale(config.locale);
const result = await jwtVerify<User>(token.value, importedPublicKey, {
algorithms: ['RS256'],
audience: runtimeConfig.public.baseUrl,
issuer: runtimeConfig.public.baseUrl,
audience: baseUrl,
issuer: baseUrl,
});
payload.value = result.payload;

View File

@ -1,4 +1,5 @@
<script setup lang="ts">
import { getUrlForLocale } from '~/src/domain.ts';
import { addSlash } from '~/src/helpers.ts';
import { addPronounInjectionKey } from '~/src/injectionKeys.ts';
@ -11,7 +12,6 @@ const props = defineProps<{
const addPronoun = inject(addPronounInjectionKey, undefined);
const runtimeConfig = useRuntimeConfig();
const config = useConfig();
const open = ref(props.initiallyOpen ?? false);
@ -21,7 +21,7 @@ const link = computed((): string | null => {
return null;
}
return addSlash(`${runtimeConfig.public.baseUrl + (config.pronouns.prefix || '')}/${props.path}`);
return addSlash(`${getUrlForLocale(config.locale) + (config.pronouns.prefix || '')}/${props.path}`);
});
</script>

View File

@ -1,4 +1,3 @@
import { useRuntimeConfig } from 'nuxt/app';
import { computed } from 'vue';
import { buildPronoun, buildPronounUsage } from '../src/buildPronoun.ts';
@ -9,6 +8,8 @@ import type { Translator } from '../src/translator';
import useConfig from './useConfig.ts';
import { getUrlForLocale } from '~/src/domain.ts';
export interface PronounOpinion extends PronounUsage {
link: string;
opinion: string;
@ -19,7 +20,6 @@ export default (
profile: Ref<Partial<Pick<Profile, 'pronouns'>> | null>,
translator: Translator,
) => {
const runtimeConfig = useRuntimeConfig();
const config = useConfig();
const pronouns = pronounLibrary.pronouns;
const pronounOpinions = computed((): PronounOpinion[] => {
@ -28,10 +28,11 @@ export default (
}
return (profile.value.pronouns ?? [])
.map(({ value: pronoun, opinion }) => {
const baseUrl = getUrlForLocale(config.locale);
let link = pronoun
.trim()
.replace(new RegExp(`^${runtimeConfig.public.baseUrl}`), '')
.replace(new RegExp(`^${runtimeConfig.public.baseUrl.replace(/^https?:\/\//, '')}`), '')
.replace(new RegExp(`^${baseUrl}`), '')
.replace(new RegExp(`^${baseUrl.replace(/^https?:\/\//, '')}`), '')
.replace(new RegExp('^/'), '');
try {

View File

@ -1,6 +1,4 @@
import type { UseSeoMetaInput } from '@unhead/vue';
import { useRuntimeConfig } from 'nuxt/app';
import type { RuntimeConfig } from 'nuxt/schema';
import { unref } from 'vue';
import type { MaybeRef } from 'vue';
@ -8,12 +6,14 @@ import { clearLinkedText } from '../src/helpers.ts';
import type { Translator } from '../src/translator';
import { useSeoMeta } from '#imports';
import type { Config } from '~/locale/config.ts';
import { getUrlForLocale } from '~/src/domain.ts';
export const getDefaultSeo = (translator: Translator, runtimeConfig: RuntimeConfig) => ({
export const getDefaultSeo = (config: Config, translator: Translator) => ({
title: translator.translate('title'),
description: translator.translate('description'),
keywords: (translator.translate<string[]>('seo.keywords') || []).join(', '),
banner: `${runtimeConfig.public.baseUrl}/api/banner/zaimki.png`,
banner: `${getUrlForLocale(config.locale)}/api/banner/zaimki.png`,
});
export interface HeadParams {
@ -30,8 +30,8 @@ export default (
{ title, description, banner, noindex = false, keywords }: HeadParams,
translator: Translator,
): void => {
const runtimeConfig = useRuntimeConfig();
const defaultSeo = getDefaultSeo(translator, runtimeConfig);
const config = useConfig();
const defaultSeo = getDefaultSeo(config, translator);
const seo: UseSeoMetaInput = {};
const seoTitle = () => {
@ -66,6 +66,7 @@ export default (
seo.ogDescription = seoDescription;
seo.twitterDescription = seoDescription;
const baseUrl = getUrlForLocale(config.locale);
const seoImage = () => {
let bannerUnwrapped = unref(banner);
if (!bannerUnwrapped) {
@ -73,7 +74,7 @@ export default (
}
bannerUnwrapped = bannerUnwrapped.replace(/^\//, '');
if (!bannerUnwrapped.startsWith('https://')) {
bannerUnwrapped = `${runtimeConfig.public.baseUrl}/${bannerUnwrapped}`;
bannerUnwrapped = `${baseUrl}/${bannerUnwrapped}`;
}
return bannerUnwrapped;
};

View File

@ -1,11 +1,8 @@
import { useRuntimeConfig } from 'nuxt/app';
import { useMainStore } from '../store/index.ts';
import { getUrlForLocale } from '~/src/domain.ts';
export default () => {
const runtimeConfig = useRuntimeConfig();
const store = useMainStore();
const buildSocialLoginConnectLink = (
@ -16,7 +13,7 @@ export default () => {
): string => {
const url = providerOptions.redirectViaHome
? new URL(`/api/user/social-redirect/${provider}/${locale}`, getUrlForLocale('_'))
: new URL(`/api/connect/${provider}`, runtimeConfig.public.baseUrl);
: new URL(`/api/connect/${provider}`, getUrlForLocale(locale));
if (providerOptions.instanceRequired && instance) {
url.searchParams.append('instance', instance ?? '');

View File

@ -79,7 +79,6 @@ export default defineNuxtConfig({
public: {
domainBase: undefined as string | undefined,
env: 'home',
baseUrl: 'https://pronouns.page',
version,
publicKey: '',
turnstileSitekey: '',

View File

@ -3,6 +3,7 @@ import { useNuxtApp } from 'nuxt/app';
import useConfig from '~/composables/useConfig.ts';
import useSimpleHead from '~/composables/useSimpleHead.ts';
import { getUrlForLocale } from '~/src/domain.ts';
interface Group {
enabled: boolean | undefined;
@ -120,7 +121,7 @@ const groups = computed((): Group[] => {
<code>{{ path }}</code>
<a
v-for="example in config.api.examples[endpoint]"
:href="$config.public.baseUrl + example"
:href="getUrlForLocale(config.locale) + example"
class="badge bg-light text-dark border mx-1"
target="_blank"
rel="noopener"

View File

@ -8,6 +8,7 @@ import type { LocaleDescription } from '~/locale/locales.ts';
import type { TermsEntryRaw } from '~/src/classes.ts';
import { longtimeCookieSetting } from '~/src/cookieSettings.ts';
import { loadPronounLibrary } from '~/src/data.ts';
import { getUrlForLocale } from '~/src/domain.ts';
import { buildFlags } from '~/src/flags.ts';
import { sleep } from '~/src/helpers.ts';
import opinions from '~/src/opinions.ts';
@ -110,9 +111,8 @@ const verifiedLinks = computed(() => {
.flat())];
});
const runtimeConfig = useRuntimeConfig();
const icsLink = computed(() => {
return `${runtimeConfig.public.baseUrl}/api/queer-calendar-${config.locale}-@${username.value}.ics`;
return `${getUrlForLocale(config.locale)}/api/queer-calendar-${config.locale}-@${username.value}.ics`;
});
onMounted(async () => {

View File

@ -12,6 +12,7 @@ import type { Config } from '~/locale/config.ts';
import { birthdateRange, formatDate, parseDate } from '~/src/birthdate.ts';
import { buildPronounUsage } from '~/src/buildPronoun.ts';
import { loadCalendar, loadPronounLibrary } from '~/src/data.ts';
import { getUrlForLocale } from '~/src/domain.ts';
import { buildList, isValidLink } from '~/src/helpers.ts';
import { addPronounInjectionKey } from '~/src/injectionKeys.ts';
import opinions from '~/src/opinions.ts';
@ -222,7 +223,6 @@ const visibilityIcons = {
[ProfileVisibility.Internal]: ['user-shield'],
} as Record<ProfileVisibility, string[]>;
const runtimeConfig = useRuntimeConfig();
const year = (await loadCalendar()).getCurrentYear();
const { mainPronoun } = useMainPronoun(pronounLibrary, formData, translator);
@ -282,12 +282,13 @@ const save = async (): Promise<void> => {
};
const normalisePronoun = (pronoun: string): string | null => {
const baseUrl = getUrlForLocale(config.locale);
try {
return decodeURIComponent(pronoun
.toLowerCase()
.trim()
.replace(new RegExp(`^${runtimeConfig.public.baseUrl}`), '')
.replace(new RegExp(`^${runtimeConfig.public.baseUrl.replace(/^https?:\/\//, '')}`), '')
.replace(new RegExp(`^${baseUrl}`), '')
.replace(new RegExp(`^${baseUrl.replace(/^https?:\/\//, '')}`), '')
.replace(new RegExp('^/'), ''));
} catch {
return null;

View File

@ -9,13 +9,13 @@ import type { Config } from '../locale/config.ts';
import dbConnection from './db.ts';
import { loadSuml } from '~/server/loader.ts';
import localeDescriptions from '~/locale/locales.ts';
import { loadConfig } from '~/server/data.ts';
import { buildCalendar } from '~/src/calendar/calendar.ts';
import { getLocaleUrls } from '~/src/domain.ts';
const __dirname = new URL('.', import.meta.url).pathname;
const config = loadSuml('config') as Config;
const force = process.argv[2] === '-f' || process.argv[2] === '--force';
const shoot = async (url: string, filename: string): Promise<void> => {
@ -26,7 +26,7 @@ const shoot = async (url: string, filename: string): Promise<void> => {
headless: 'new',
},
});
pr.source(process.env.NUXT_PUBLIC_BASE_URL + url, ['1500x300']);
pr.source(url, ['1500x300']);
for (const buffer of await pr.run()) {
fs.mkdirSync(path.dirname(filename), { recursive: true });
console.log(filename);
@ -34,7 +34,7 @@ const shoot = async (url: string, filename: string): Promise<void> => {
}
};
const dumpNameDays = async (): Promise<void> => {
const dumpNameDays = async (config: Config): Promise<void> => {
if (!config.names || !config.names.enabled || !config.names.namedays) {
return;
}
@ -53,7 +53,7 @@ const dumpNameDays = async (): Promise<void> => {
fs.writeFileSync(`${__dirname}/../locale/${config.locale}/names/namedays.json`, JSON.stringify(output));
};
(async (): Promise<void> => {
const run = async (config: Config, baseUrl: string): Promise<void> => {
if (!config.calendar?.enabled) {
return;
}
@ -69,7 +69,7 @@ const dumpNameDays = async (): Promise<void> => {
for (const day of Object.keys(current)) {
const year = day.substring(0, 4);
if (current[day] !== prev[day] || !fs.existsSync(`${dir}/${day}.png`) || force) {
await shoot(`/${config.calendar.route}/${day}?layout=basic`, `${dir}/${day}.png`);
await shoot(`${baseUrl}/${config.calendar.route}/${day}?layout=basic`, `${dir}/${day}.png`);
changedYears.add(year);
}
if (!fs.existsSync(`${dir}/${year}-overview.png`) || !fs.existsSync(`${dir}/${year}-labels.png`) || force) {
@ -78,11 +78,25 @@ const dumpNameDays = async (): Promise<void> => {
}
for (const year of changedYears) {
await shoot(`/${config.calendar.route}/${year}?layout=basic`, `${dir}/${year}-overview.png`);
await shoot(`/${config.calendar.route}/${year}?layout=basic&labels=true`, `${dir}/${year}-labels.png`);
await shoot(
`${baseUrl}/${config.calendar.route}/${year}?layout=basic`,
`${dir}/${year}-overview.png`,
);
await shoot(
`${baseUrl}/${config.calendar.route}/${year}?layout=basic&labels=true`,
`${dir}/${year}-labels.png`,
);
}
fs.writeFileSync(prevPath, JSON.stringify(current, null, 4));
await dumpNameDays();
await dumpNameDays(config);
};
(async () => {
const localeUrls = getLocaleUrls(process.env.NUXT_PUBLIC_DOMAIN_BASE);
for (const localeDescription of localeDescriptions) {
const config = await loadConfig(localeDescription.code);
await run(config, localeUrls[config.locale]);
}
})();

View File

@ -6,28 +6,20 @@ import Pageres from 'pageres';
import type { Screenshot } from 'pageres';
import { ulid } from 'ulid';
import allLocales from '../locale/locales.ts';
import { awsConfig, awsParams } from './aws.ts';
import dbConnection from './db.ts';
import type { Database } from './db.ts';
import { env } from './env.ts';
import isHighLoadTime from './overload.js';
import jwt from '~/server/jwt.ts';
import { getUrlsForAllLocales } from '~/src/domain.ts';
const s3 = new S3(awsConfig);
const urlBases: Record<string, string> = {};
if ((env === 'development' || process.env.NUXT_PUBLIC_ENV === 'test') && process.env.NUXT_PUBLIC_BASE_URL) {
for (const { code } of allLocales) {
urlBases[code] = `${process.env.NUXT_PUBLIC_BASE_URL}/card/@`;
}
} else {
for (const { code, url } of allLocales) {
urlBases[code] = `${url}/card/@`;
}
for (const [locale, url] of Object.entries(getUrlsForAllLocales('_', true))) {
urlBases[locale] = `${url}/card/@`;
}
const sleep = (ms: number): Promise<void> => new Promise((res) => setTimeout(res, ms));

View File

@ -10,7 +10,7 @@ import { buildCalendar } from '~/src/calendar/calendar.ts';
import type { Calendar } from '~/src/calendar/helpers.ts';
import { PronounLibrary } from '~/src/classes.ts';
import type { Pronoun, PronounGroup } from '~/src/classes.ts';
import { getLocaleForUrl } from '~/src/domain.ts';
import { getLocaleForUrl, getUrlForLocale } from '~/src/domain.ts';
import { Translator } from '~/src/translator.ts';
import { loadTsv } from '~/src/tsv.ts';
@ -81,8 +81,7 @@ export const loadPronounExamples = async (locale: string): Promise<PronounExampl
const calendarByLocale: Map<string, Calendar> = new Map();
export const loadCalendar = async (locale: string): Promise<Calendar> => {
return setDefault(calendarByLocale, locale, async () => {
const runtimeConfig = useRuntimeConfig();
const localEvents = await localeEventImports[locale]();
return buildCalendar(localEvents, runtimeConfig.public.baseUrl);
return buildCalendar(localEvents, getUrlForLocale(locale));
});
};

View File

@ -7,7 +7,7 @@ import type { KeyLike, JWTPayload } from 'jose';
import { rootDir } from './paths.ts';
import { getUrlsForAllLocales } from '~/src/domain.ts';
import { getUrlForLocale, getUrlsForAllLocales } from '~/src/domain.ts';
class Jwt {
constructor(private privateKey: KeyLike, private publicKey: KeyLike) {}
@ -26,7 +26,7 @@ class Jwt {
.setProtectedHeader({ alg: 'RS256' })
.setExpirationTime(expiresIn)
.setAudience(getUrlsForAllLocales(locale))
.setIssuer(process.env.NUXT_PUBLIC_BASE_URL!)
.setIssuer(getUrlForLocale(locale))
.sign(this.privateKey);
}

View File

@ -3,23 +3,24 @@ import marked from 'marked';
import { getPosts } from '~/server/blog.ts';
import { getLocale, loadConfig, loadTranslator } from '~/server/data.ts';
import { getUrlForLocale } from '~/src/domain.ts';
import parseMarkdown from '~/src/parseMarkdown.ts';
export default defineCachedEventHandler(async (event) => {
const runtimeConfig = useRuntimeConfig();
const locale = getLocale(event);
const [config, translator] = await Promise.all([loadConfig(locale), loadTranslator(locale)]);
const baseUrl = getUrlForLocale(locale);
const posts = await getPosts(config);
const feed = new Feed({
title: `${translator.translate('title')}${translator.translate('links.blog')}`,
description: translator.translate('description'),
id: runtimeConfig.public.baseUrl,
link: `${runtimeConfig.public.baseUrl}/blog.atom`,
id: baseUrl,
link: `${baseUrl}/blog.atom`,
language: config.locale,
image: `${runtimeConfig.public.baseUrl}/icon.png`,
favicon: `${runtimeConfig.public.baseUrl}/icon.png`,
image: `${baseUrl}/icon.png`,
favicon: `${baseUrl}/icon.png`,
updated: new Date(posts[0].date),
copyright: '',
});
@ -30,16 +31,16 @@ export default defineCachedEventHandler(async (event) => {
feed.addItem({
title: post.title,
id: `${runtimeConfig.public.baseUrl}/${config.links.blogRoute}/${post.slug}`,
link: `${runtimeConfig.public.baseUrl}/${config.links.blogRoute}/${post.slug}`,
id: `${baseUrl}/${config.links.blogRoute}/${post.slug}`,
link: `${baseUrl}/${config.links.blogRoute}/${post.slug}`,
description: parsed.intro ?? undefined,
content: parsed.content ?? undefined,
author: post.authors.map((author) => ({
name: author,
link: author.startsWith('@') ? `${runtimeConfig.public.baseUrl}/${author}` : undefined,
link: author.startsWith('@') ? `${baseUrl}/${author}` : undefined,
})),
date: new Date(post.date),
image: post.hero ? `${runtimeConfig.public.baseUrl}${post.hero.src}` : undefined,
image: post.hero ? `${baseUrl}${post.hero.src}` : undefined,
});
}

View File

@ -5,6 +5,8 @@ import { importPKCS8, SignJWT } from 'jose';
import { rootDir } from './paths.ts';
import { getUrlForLocale } from '~/src/domain.ts';
const getAppleClientSecret = async (): Promise<string | undefined> => {
const headers = {
alg: 'ES256',
@ -61,7 +63,7 @@ const enableApple = appleIsEnabled();
export const config: GrantConfig = {
defaults: {
origin: process.env.NUXT_PUBLIC_BASE_URL,
origin: getUrlForLocale('_'),
transport: 'session',
state: true,
prefix: '/api/connect',

View File

@ -6,7 +6,7 @@ import type { Config } from '~/locale/config.ts';
import type { PronounExamplesData } from '~/locale/data.ts';
import type { Translations } from '~/locale/translations.ts';
import { buildCalendar } from '~/src/calendar/calendar.ts';
import { getLocaleForUrl } from '~/src/domain.ts';
import { getLocaleForUrl, getUrlForLocale } from '~/src/domain.ts';
export const getLocale = () => {
return getLocaleForUrl(useRequestURL()) ?? '_';
@ -110,8 +110,9 @@ export const loadNameCount = async () => {
};
export const loadCalendar = async () => {
const runtimeConfig = useRuntimeConfig();
const localEvents = (await import(`~/locale/${getLocale()}/calendar/events.ts`)).default;
const locale = getLocale();
const baseUrl = getUrlForLocale(locale);
const localEvents = (await import(`~/locale/${locale}/calendar/events.ts`)).default;
/* const rawNamedays = (await import(`~/locale/${config.locale}/names/namedays.json`)).default;
const namedays = Object.entries(rawNamedays as Record<string, string[]>)
.flatMap(([name, namedays]) => {
@ -120,5 +121,5 @@ export const loadCalendar = async () => {
return new Event(`nameday$${name}`, null, parseInt(m), day(parseInt(d)), EventLevel.Nameday);
});
}); */
return buildCalendar(localEvents, runtimeConfig.public.baseUrl);
return buildCalendar(localEvents, baseUrl);
};

View File

@ -1,7 +1,7 @@
import localeDescriptions from '~/locale/locales.ts';
import buildLocaleList from '~/src/buildLocaleList.ts';
const getLocaleUrls = (domainBase: string | undefined): Record<string, string> => {
export const getLocaleUrls = (domainBase: string | undefined): Record<string, string> => {
if (domainBase) {
return Object.fromEntries([
['_', domainBase.replace('{locale}', '')