fix: log miss ftl messages in build (#95)
This commit is contained in:
parent
7738410680
commit
0663e5b0b1
@ -64,83 +64,75 @@ function replaceString(buildTime) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function prepareLocaleFiles() {
|
function prepareLocaleFiles() {
|
||||||
// Walk the builds/addon/locale folder's sub folders and rename *.ftl to addonRef-*.ftl
|
// Prefix Fluent messages in xhtml
|
||||||
const localeDir = path.join(buildDir, "addon/locale");
|
const MessagesInHTML = new Set();
|
||||||
const localeFolders = readdirSync(localeDir, { withFileTypes: true })
|
replaceInFileSync({
|
||||||
.filter((dirent) => dirent.isDirectory())
|
files: [`${buildDir}/addon/**/*.xhtml`, `${buildDir}/addon/**/*.html`],
|
||||||
.map((dirent) => dirent.name);
|
|
||||||
|
|
||||||
for (const localeSubFolder of localeFolders) {
|
|
||||||
const localeSubDir = path.join(localeDir, localeSubFolder);
|
|
||||||
const localeSubFiles = readdirSync(localeSubDir, {
|
|
||||||
withFileTypes: true,
|
|
||||||
})
|
|
||||||
.filter((dirent) => dirent.isFile())
|
|
||||||
.map((dirent) => dirent.name);
|
|
||||||
|
|
||||||
for (const localeSubFile of localeSubFiles) {
|
|
||||||
if (localeSubFile.endsWith(".ftl")) {
|
|
||||||
renameSync(
|
|
||||||
path.join(localeSubDir, localeSubFile),
|
|
||||||
path.join(localeSubDir, `${config.addonRef}-${localeSubFile}`),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const localeMessage = new Set();
|
|
||||||
const localeMessageMiss = new Set();
|
|
||||||
|
|
||||||
const replaceResultFlt = replaceInFileSync({
|
|
||||||
files: [`${buildDir}/addon/locale/**/*.ftl`],
|
|
||||||
processor: (fltContent) => {
|
|
||||||
const lines = fltContent.split("\n");
|
|
||||||
const prefixedLines = lines.map((line) => {
|
|
||||||
// https://regex101.com/r/lQ9x5p/1
|
|
||||||
const match = line.match(
|
|
||||||
/^(?<message>[a-zA-Z]\S*)([ ]*=[ ]*)(?<pattern>.*)$/m,
|
|
||||||
);
|
|
||||||
if (match) {
|
|
||||||
localeMessage.add(match.groups.message);
|
|
||||||
return `${config.addonRef}-${line}`;
|
|
||||||
} else {
|
|
||||||
return line;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return prefixedLines.join("\n");
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const replaceResultXhtml = replaceInFileSync({
|
|
||||||
files: [`${buildDir}/addon/**/*.xhtml`],
|
|
||||||
processor: (input) => {
|
processor: (input) => {
|
||||||
const matchs = [...input.matchAll(/(data-l10n-id)="(\S*)"/g)];
|
const matchs = [...input.matchAll(/(data-l10n-id)="(\S*)"/g)];
|
||||||
matchs.map((match) => {
|
matchs.map((match) => {
|
||||||
if (localeMessage.has(match[2])) {
|
input = input.replace(
|
||||||
input = input.replace(
|
match[0],
|
||||||
match[0],
|
`${match[1]}="${config.addonRef}-${match[2]}"`,
|
||||||
`${match[1]}="${config.addonRef}-${match[2]}"`,
|
);
|
||||||
);
|
MessagesInHTML.add(match[2]);
|
||||||
} else {
|
|
||||||
localeMessageMiss.add(match[2]);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
return input;
|
return input;
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
Logger.debug(
|
// Walk the sub folders of `build/addon/locale`
|
||||||
"[Build] Prepare locale files OK",
|
const localesPath = path.join(buildDir, "addon/locale"),
|
||||||
// replaceResultFlt.filter((f) => f.hasChanged).map((f) => `${f.file} : OK`),
|
localeNames = readdirSync(localesPath, { withFileTypes: true })
|
||||||
// replaceResultXhtml.filter((f) => f.hasChanged).map((f) => `${f.file} : OK`),
|
.filter((dirent) => dirent.isDirectory())
|
||||||
);
|
.map((dirent) => dirent.name);
|
||||||
|
|
||||||
if (localeMessageMiss.size !== 0) {
|
for (const localeName of localeNames) {
|
||||||
Logger.warn(
|
const localePath = path.join(localesPath, localeName);
|
||||||
`[Build] Fluent message [${new Array(
|
const ftlFiles = readdirSync(localePath, {
|
||||||
...localeMessageMiss,
|
withFileTypes: true,
|
||||||
)}] do not exsit in addon's locale files.`,
|
})
|
||||||
);
|
.filter((dirent) => dirent.isFile())
|
||||||
|
.map((dirent) => dirent.name);
|
||||||
|
|
||||||
|
// rename *.ftl to addonRef-*.ftl
|
||||||
|
for (const ftlFile of ftlFiles) {
|
||||||
|
if (ftlFile.endsWith(".ftl")) {
|
||||||
|
renameSync(
|
||||||
|
path.join(localePath, ftlFile),
|
||||||
|
path.join(localePath, `${config.addonRef}-${ftlFile}`),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prefix Fluent messages in each ftl
|
||||||
|
const MessageInThisLang = new Set();
|
||||||
|
replaceInFileSync({
|
||||||
|
files: [`${buildDir}/addon/locale/${localeName}/*.ftl`],
|
||||||
|
processor: (fltContent) => {
|
||||||
|
const lines = fltContent.split("\n");
|
||||||
|
const prefixedLines = lines.map((line) => {
|
||||||
|
// https://regex101.com/r/lQ9x5p/1
|
||||||
|
const match = line.match(
|
||||||
|
/^(?<message>[a-zA-Z]\S*)([ ]*=[ ]*)(?<pattern>.*)$/m,
|
||||||
|
);
|
||||||
|
if (match) {
|
||||||
|
MessageInThisLang.add(match.groups.message);
|
||||||
|
return `${config.addonRef}-${line}`;
|
||||||
|
} else {
|
||||||
|
return line;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return prefixedLines.join("\n");
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
// If a message in xhtml but not in ftl of current language, log it
|
||||||
|
MessagesInHTML.forEach((message) => {
|
||||||
|
if (!MessageInThisLang.has(message)) {
|
||||||
|
Logger.error(`[Build] ${message} don't exist in ${localeName}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -212,19 +204,21 @@ export async function main() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
clearFolder(buildDir);
|
clearFolder(buildDir);
|
||||||
|
|
||||||
copyFolderRecursiveSync("addon", buildDir);
|
copyFolderRecursiveSync("addon", buildDir);
|
||||||
replaceString(buildTime);
|
|
||||||
Logger.debug("[Build] Replace OK");
|
|
||||||
|
|
||||||
|
Logger.debug("[Build] Replacing");
|
||||||
|
replaceString(buildTime);
|
||||||
|
|
||||||
|
Logger.debug("[Build] Preparing locale files");
|
||||||
prepareLocaleFiles();
|
prepareLocaleFiles();
|
||||||
|
|
||||||
|
Logger.debug("[Build] Running esbuild");
|
||||||
await build(esbuildOptions);
|
await build(esbuildOptions);
|
||||||
Logger.debug("[Build] Run esbuild OK");
|
|
||||||
|
|
||||||
Logger.debug("[Build] Addon prepare OK");
|
Logger.debug("[Build] Addon prepare OK");
|
||||||
|
|
||||||
if (process.env.NODE_ENV === "production") {
|
if (process.env.NODE_ENV === "production") {
|
||||||
|
Logger.debug("[Build] Packing Addon");
|
||||||
await zip.compressDir(
|
await zip.compressDir(
|
||||||
path.join(buildDir, "addon"),
|
path.join(buildDir, "addon"),
|
||||||
path.join(buildDir, `${name}.xpi`),
|
path.join(buildDir, `${name}.xpi`),
|
||||||
@ -232,7 +226,6 @@ export async function main() {
|
|||||||
ignoreBase: true,
|
ignoreBase: true,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
Logger.debug("[Build] Addon pack OK");
|
|
||||||
|
|
||||||
prepareUpdateJson();
|
prepareUpdateJson();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user