From 55d1f2d08a1b579c65809282f6f0f240a3303f58 Mon Sep 17 00:00:00 2001 From: Jesse Hines Date: Tue, 30 Jun 2026 19:50:20 -0400 Subject: [PATCH] Glob all i18n files --- esbuild.config.mjs | 28 ++++++++++++++++++++++++++++ src/glob.d.ts | 5 +++++ src/i18n.ts | 7 +------ 3 files changed, 34 insertions(+), 6 deletions(-) create mode 100644 src/glob.d.ts diff --git a/esbuild.config.mjs b/esbuild.config.mjs index 25bd5c0..31626d2 100644 --- a/esbuild.config.mjs +++ b/esbuild.config.mjs @@ -1,6 +1,8 @@ import esbuild from "esbuild"; import process from "process"; import { builtinModules } from "node:module"; +import path from "path"; +import fs from "fs"; const banner = `/* @@ -17,6 +19,32 @@ const context = await esbuild.context({ }, entryPoints: ["src/main.ts"], bundle: true, + plugins: [{ + name: "import-glob", + setup: (build) => { + build.onResolve({ filter: /^glob:.*$/ }, async (args) => { + return { + path: args.path.replace(/^glob:/, ''), + namespace: 'import-glob', + pluginData: { resolveDir: args.resolveDir }, + }; + }); + build.onLoad({ filter: /.*/, namespace: 'import-glob' }, async (args) => { + const files = fs.globSync(args.path, {cwd: args.pluginData.resolveDir}) + .map((f) => f.split(path.sep).join('/')) + .sort(); + return { + contents: [ + ...files.map((module, i) => `import m${i} from './${module}'`), + "export default {", + ...files.map((f, i) => `${JSON.stringify(path.basename(f, path.extname(f)))}: m${i},`), + "}", + ].join("\n"), + resolveDir: args.pluginData.resolveDir, + }; + }); + }, + }], external: [ "obsidian", "electron", diff --git a/src/glob.d.ts b/src/glob.d.ts new file mode 100644 index 0000000..5de6616 --- /dev/null +++ b/src/glob.d.ts @@ -0,0 +1,5 @@ + +declare module 'glob:*' { + const modules: Record; + export default modules; +} diff --git a/src/i18n.ts b/src/i18n.ts index fe8a5fc..c2d0823 100644 --- a/src/i18n.ts +++ b/src/i18n.ts @@ -1,11 +1,6 @@ import i18next from 'i18next'; import { getLanguage } from 'obsidian'; - -// esbuild doesn't have an easy way to include all files in a dir, so we'll list them manually -import en from './locales/en.json'; -const locales = { - en, -} +import locales from 'glob:./locales/*.json'; export async function initializeI18n() { return await i18next.init({