Minify and compress Intl locale data (#17506)

This commit is contained in:
Steve Repsher 2023-08-07 05:59:02 -04:00 committed by GitHub
parent edcdc865c4
commit 945c8e0320
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 59 additions and 89 deletions

View File

@ -2,44 +2,15 @@
import gulp from "gulp"; import gulp from "gulp";
import zopfli from "gulp-zopfli-green"; import zopfli from "gulp-zopfli-green";
import merge from "merge-stream";
import path from "path";
import paths from "../paths.cjs"; import paths from "../paths.cjs";
const zopfliOptions = { threshold: 150 }; const zopfliOptions = { threshold: 150 };
gulp.task("compress-app", function compressApp() { const compressDist = (rootDir) =>
const jsLatest = gulp gulp
.src(path.resolve(paths.app_output_latest, "**/*.js")) .src([`${rootDir}/**/*.{js,json,css,svg}`])
.pipe(zopfli(zopfliOptions)) .pipe(zopfli(zopfliOptions))
.pipe(gulp.dest(paths.app_output_latest)); .pipe(gulp.dest(rootDir));
const jsEs5 = gulp gulp.task("compress-app", () => compressDist(paths.app_output_root));
.src(path.resolve(paths.app_output_es5, "**/*.js")) gulp.task("compress-hassio", () => compressDist(paths.hassio_output_root));
.pipe(zopfli(zopfliOptions))
.pipe(gulp.dest(paths.app_output_es5));
const polyfills = gulp
.src(path.resolve(paths.app_output_static, "polyfills/*.js"))
.pipe(zopfli(zopfliOptions))
.pipe(gulp.dest(path.resolve(paths.app_output_static, "polyfills")));
const translations = gulp
.src(path.resolve(paths.app_output_static, "translations/**/*.json"))
.pipe(zopfli(zopfliOptions))
.pipe(gulp.dest(path.resolve(paths.app_output_static, "translations")));
const icons = gulp
.src(path.resolve(paths.app_output_static, "mdi/*.json"))
.pipe(zopfli(zopfliOptions))
.pipe(gulp.dest(path.resolve(paths.app_output_static, "mdi")));
return merge(jsLatest, jsEs5, polyfills, translations, icons);
});
gulp.task("compress-hassio", function compressApp() {
return gulp
.src(path.resolve(paths.hassio_output_root, "**/*.js"))
.pipe(zopfli(zopfliOptions))
.pipe(gulp.dest(paths.hassio_output_root));
});

View File

@ -1,18 +1,12 @@
import { deleteSync } from "del"; import { deleteSync } from "del";
import fs from "fs"; import { mkdir, readFile, writeFile } from "fs/promises";
import gulp from "gulp"; import gulp from "gulp";
import path from "path"; import path from "path";
import paths from "../paths.cjs"; import paths from "../paths.cjs";
const outDir = "build/locale-data"; const outDir = path.join(paths.build_dir, "locale-data");
gulp.task("clean-locale-data", async () => deleteSync([outDir])); const INTL_PACKAGES = {
gulp.task("ensure-locale-data-build-dir", async () => {
fs.mkdirSync(outDir, { recursive: true });
});
const modules = {
"intl-relativetimeformat": "RelativeTimeFormat", "intl-relativetimeformat": "RelativeTimeFormat",
"intl-datetimeformat": "DateTimeFormat", "intl-datetimeformat": "DateTimeFormat",
"intl-numberformat": "NumberFormat", "intl-numberformat": "NumberFormat",
@ -20,53 +14,60 @@ const modules = {
"intl-listformat": "ListFormat", "intl-listformat": "ListFormat",
}; };
gulp.task("create-locale-data", (done) => { const convertToJSON = async (pkg, lang) => {
let localeData;
try {
localeData = await readFile(
path.resolve(
paths.polymer_dir,
`node_modules/@formatjs/${pkg}/locale-data/${lang}.js`
),
"utf-8"
);
} catch (e) {
// Ignore if language is missing (i.e. not supported by @formatjs)
if (e.code === "ENOENT") {
return;
} else {
throw e;
}
}
// Convert to JSON
const className = INTL_PACKAGES[pkg];
localeData = localeData
.replace(
new RegExp(
`\\/\\*\\s*@generated\\s*\\*\\/\\s*\\/\\/\\s*prettier-ignore\\s*if\\s*\\(Intl\\.${className}\\s*&&\\s*typeof\\s*Intl\\.${className}\\.__addLocaleData\\s*===\\s*'function'\\)\\s*{\\s*Intl\\.${className}\\.__addLocaleData\\(`,
"im"
),
""
)
.replace(/\)\s*}/im, "");
// Parse to validate JSON, then stringify to minify
localeData = JSON.stringify(JSON.parse(localeData));
await writeFile(path.join(outDir, `${pkg}/${lang}.json`), localeData);
};
gulp.task("clean-locale-data", async () => deleteSync([outDir]));
gulp.task("create-locale-data", async () => {
const translationMeta = JSON.parse( const translationMeta = JSON.parse(
fs.readFileSync( await readFile(
path.join(paths.translations_src, "translationMetadata.json") path.resolve(paths.translations_src, "translationMetadata.json"),
"utf-8"
) )
); );
Object.entries(modules).forEach(([module, className]) => { const conversions = [];
Object.keys(translationMeta).forEach((lang) => { for (const pkg of Object.keys(INTL_PACKAGES)) {
try { await mkdir(path.join(outDir, pkg), { recursive: true });
const localeData = fs for (const lang of Object.keys(translationMeta)) {
.readFileSync( conversions.push(convertToJSON(pkg, lang));
path.resolve( }
paths.polymer_dir, }
`node_modules/@formatjs/${module}/locale-data/${lang}.js` await Promise.all(conversions);
),
"utf-8"
)
.replace(
new RegExp(
`\\/\\*\\s*@generated\\s*\\*\\/\\s*\\/\\/\\s*prettier-ignore\\s*if\\s*\\(Intl\\.${className}\\s*&&\\s*typeof\\s*Intl\\.${className}\\.__addLocaleData\\s*===\\s*'function'\\)\\s*{\\s*Intl\\.${className}\\.__addLocaleData\\(`,
"im"
),
""
)
.replace(/\)\s*}/im, "");
// make sure we have valid JSON
JSON.parse(localeData);
fs.mkdirSync(path.join(outDir, module), { recursive: true });
fs.writeFileSync(
path.join(outDir, `${module}/${lang}.json`),
localeData
);
} catch (e) {
if (e.code !== "ENOENT") {
throw e;
}
}
});
done();
});
}); });
gulp.task( gulp.task(
"build-locale-data", "build-locale-data",
gulp.series( gulp.series("clean-locale-data", "create-locale-data")
"clean-locale-data",
"ensure-locale-data-build-dir",
"create-locale-data"
)
); );

View File

@ -222,7 +222,6 @@
"lodash.template": "4.5.0", "lodash.template": "4.5.0",
"magic-string": "0.30.2", "magic-string": "0.30.2",
"map-stream": "0.0.7", "map-stream": "0.0.7",
"merge-stream": "2.0.0",
"mocha": "10.2.0", "mocha": "10.2.0",
"object-hash": "3.0.0", "object-hash": "3.0.0",
"open": "9.1.0", "open": "9.1.0",

View File

@ -9804,7 +9804,6 @@ __metadata:
map-stream: 0.0.7 map-stream: 0.0.7
marked: 4.3.0 marked: 4.3.0
memoize-one: 6.0.0 memoize-one: 6.0.0
merge-stream: 2.0.0
mocha: 10.2.0 mocha: 10.2.0
node-vibrant: 3.2.1-alpha.1 node-vibrant: 3.2.1-alpha.1
object-hash: 3.0.0 object-hash: 3.0.0
@ -11844,7 +11843,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"merge-stream@npm:2.0.0, merge-stream@npm:^2.0.0": "merge-stream@npm:^2.0.0":
version: 2.0.0 version: 2.0.0
resolution: "merge-stream@npm:2.0.0" resolution: "merge-stream@npm:2.0.0"
checksum: 6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4 checksum: 6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4