@inlang/paraglide-js
Version:
[](https://inlang.com)
94 lines (93 loc) • 3.72 kB
JavaScript
import { compileBundle } from "./compile-bundle.js";
import { selectBundleNested } from "@inlang/sdk";
import { lookup } from "../services/lookup.js";
import * as localeModules from "./output-structure/locale-modules.js";
import * as messageModules from "./output-structure/message-modules.js";
import { defaultCompilerOptions, } from "./compiler-options.js";
import { createRuntimeFile } from "./runtime/create-runtime.js";
import { createServerFile } from "./server/create-server-file.js";
import { createRegistry } from "./registry.js";
const outputStructures = {
"locale-modules": localeModules,
"message-modules": messageModules,
};
/**
* Takes an inlang project and compiles it into a set of files.
*
* Use this function for more programmatic control than `compile()`.
* You can adjust the output structure and get the compiled files as a return value.
*
* @example
* const output = await compileProject({ project });
* await writeOutput('path', output, fs.promises);
*/
export const compileProject = async (args) => {
const optionsWithDefaults = {
...defaultCompilerOptions,
...args.compilerOptions,
};
const settings = await args.project.settings.get();
const bundles = await selectBundleNested(args.project.db).execute();
//Maps each language to it's fallback
//If there is no fallback, it will be undefined
const fallbackMap = getFallbackMap(settings.locales, settings.baseLocale);
const outputStructure = outputStructures[optionsWithDefaults.outputStructure];
const compiledBundles = bundles.map((bundle) => compileBundle({
bundle,
fallbackMap,
messageReferenceExpression: outputStructure.messageReferenceExpression,
settings,
}));
const output = {
["runtime.js"]: createRuntimeFile({
baseLocale: settings.baseLocale,
locales: settings.locales,
compilerOptions: optionsWithDefaults,
}),
["server.js"]: createServerFile({
compiledBundles,
compilerOptions: optionsWithDefaults,
}),
["registry.js"]: createRegistry(),
["messages.js"]: [
"export * from './messages/_index.js'",
"// enabling auto-import by exposing all messages as m",
"export * as m from './messages/_index.js'",
].join("\n"),
};
// generate the output modules
Object.assign(output, outputStructure.generateOutput(compiledBundles, settings, fallbackMap));
if (optionsWithDefaults.emitGitIgnore) {
output[".gitignore"] = ignoreDirectory;
}
if (optionsWithDefaults.emitPrettierIgnore) {
output[".prettierignore"] = ignoreDirectory;
}
for (const [filename, content] of Object.entries(optionsWithDefaults.additionalFiles ?? {})) {
output[filename] = content;
}
for (const [filename, content] of Object.entries(output)) {
if (optionsWithDefaults.includeEslintDisableComment) {
if (filename.endsWith(".js")) {
output[filename] = `// eslint-disable\n${content}`;
}
}
}
return output;
};
export function getFallbackMap(locales, baseLocale) {
return Object.fromEntries(locales.map((lang) => {
const fallbackLanguage = lookup(lang, {
locales: locales.filter((l) => l !== lang),
baseLocale,
});
if (lang === fallbackLanguage)
return [lang, undefined];
else
return [lang, fallbackLanguage];
}));
}
const ignoreDirectory = `# ignore everything because the directory is auto-generated by inlang paraglide-js
# for more info visit https://inlang.com/m/gerre34r/paraglide-js
*
`;