Skip to content

Commit 0b4e61b

Browse files
ascorbicCopilotemdashbot[bot]
authored
fix(admin): use import.meta.glob for locale catalog resolution (#499)
* fix(admin): use import.meta.glob for locale catalog resolution The dynamic import in admin.astro used a template literal to load locale catalogs cross-package, which failed in non-monorepo installs because Vite's SSR module runner couldn't resolve the path. The Vite alias entry intended to fix this used `*` in the find string, which is treated as a literal character, not a wildcard. Moves locale loading into the admin package via `loadMessages()` using `import.meta.glob`, so Vite resolves catalogs at build time with reliable relative paths. Removes the no-op Vite alias. * fix(locales): use Messages type from @lingui/core and DEFAULT_LOCALE for fallback Agent-Logs-Url: https://github.com/emdash-cms/emdash/sessions/c16c31e9-70d6-4dcc-9a07-27184ed47cd8 Co-authored-by: ascorbic <213306+ascorbic@users.noreply.github.com> * style: format --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: ascorbic <213306+ascorbic@users.noreply.github.com> Co-authored-by: emdashbot[bot] <emdashbot[bot]@users.noreply.github.com>
1 parent 8bdcf1d commit 0b4e61b

File tree

5 files changed

+44
-6
lines changed

5 files changed

+44
-6
lines changed

.changeset/rich-drinks-hug.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"emdash": patch
3+
"@emdash-cms/admin": patch
4+
---
5+
6+
Fixes admin failing to load when installed from npm due to broken locale catalog resolution.

packages/admin/src/locales/index.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
import type { Messages } from "@lingui/core";
2+
3+
import { DEFAULT_LOCALE } from "./config.js";
4+
15
export { useLocale } from "./useLocale.js";
26
export {
37
SUPPORTED_LOCALES,
@@ -7,3 +11,18 @@ export {
711
resolveLocale,
812
} from "./config.js";
913
export type { SupportedLocale } from "./config.js";
14+
15+
const LOCALE_LOADERS = import.meta.glob<{ messages: Messages }>("./**/messages.mjs");
16+
17+
export async function loadMessages(locale: string): Promise<Messages> {
18+
const key = `./${locale}/messages.mjs`;
19+
const fallbackKey = `./${DEFAULT_LOCALE}/messages.mjs`;
20+
const loader = LOCALE_LOADERS[key] ?? LOCALE_LOADERS[fallbackKey];
21+
if (!loader) {
22+
throw new Error(
23+
`No locale catalog found for "${locale}" or "${DEFAULT_LOCALE}". Run \`pnpm locale:compile\` to generate catalogs.`,
24+
);
25+
}
26+
const { messages } = await loader();
27+
return messages;
28+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { expect, test } from "vitest";
2+
3+
import { loadMessages, SUPPORTED_LOCALES } from "../../src/locales/index.js";
4+
5+
for (const { code } of SUPPORTED_LOCALES) {
6+
test(`loadMessages resolves catalog for supported locale "${code}"`, async () => {
7+
const messages = await loadMessages(code);
8+
expect(messages).toBeDefined();
9+
expect(typeof messages).toBe("object");
10+
expect(Object.keys(messages).length).toBeGreaterThan(0);
11+
});
12+
}
13+
14+
test("loadMessages falls back to English for unknown locale", async () => {
15+
const [fallback, english] = await Promise.all([loadMessages("xx"), loadMessages("en")]);
16+
expect(fallback).toEqual(english);
17+
});

packages/core/src/astro/integration/vite-config.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -293,10 +293,6 @@ export function createViteConfig(
293293
// "@emdash-cms/admin/styles.css" through the source directory.
294294
alias: [
295295
{ find: "@emdash-cms/admin/styles.css", replacement: resolve(adminDistPath, "styles.css") },
296-
{
297-
find: "@emdash-cms/admin/locales/*",
298-
replacement: resolve(adminDistPath, "locales", "*"),
299-
},
300296
{ find: "@emdash-cms/admin", replacement: useSource ? adminSourcePath : adminDistPath },
301297
],
302298
},

packages/core/src/astro/routes/admin.astro

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ import AdminWrapper from "emdash/routes/PluginRegistry";
1212
1313
export const prerender = false;
1414
15-
import { resolveLocale } from "@emdash-cms/admin/locales";
15+
import { resolveLocale, loadMessages } from "@emdash-cms/admin/locales";
1616
1717
const resolvedLocale = resolveLocale(Astro.request);
18-
const { messages } = await import(`@emdash-cms/admin/locales/${resolvedLocale}/messages.mjs`);
18+
const messages = await loadMessages(resolvedLocale);
1919
---
2020

2121
<!doctype html>

0 commit comments

Comments
 (0)