mirror of
https://github.com/home-assistant/frontend.git
synced 2025-07-10 10:56:34 +00:00
Minify and compress Intl locale data (#17506)
This commit is contained in:
parent
edcdc865c4
commit
945c8e0320
@ -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));
|
|
||||||
});
|
|
||||||
|
@ -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"
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
|
@ -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",
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user