mirror of
https://github.com/home-assistant/frontend.git
synced 2026-09-29 16:33:43 +01:00
* Remove web components polyfills and ES5 custom elements adapter All supported browsers (legacy floor: Chrome 59, Safari/iOS 12, Firefox 94) have native shadow DOM and custom elements, so the webcomponents bundle, ShadyCSS branch, and lit polyfill-support are unreachable. The legacy build now emits ES2017 classes, so custom-elements-es5-adapter and the window.loadES5Adapter hook (no known third-party consumers) are removed. Also stops shipping the never-loaded dialog-polyfill css and drops both now-unused dependencies. * Remove keyed-es5 Terser workaround The custom keyed directive existed because Terser with ecma: 5 miscompiled the destructured update() parameters (#28732). The legacy build now minifies with ecma: 2017, so the stock lit-html keyed directive works in both builds. * Remove old-browser JS shims and stale ES5 build references Drops the IE-only navigator.msMaxTouchPoints check, replaces the toggleAttribute helper with the native method (polyfilled automatically for Chrome < 69 in the legacy build), and removes babel excludes for the uninstalled proxy-polyfill and unfetch packages. Updates comments that still described the legacy build as ES5. * Remove vendor prefixes for no-longer-supported browsers Deletes -ms- prefixes (IE/EdgeHTML only) and -webkit-/-moz- prefixed declarations that every supported browser understands unprefixed, or that Lightning CSS re-adds automatically from the unprefixed property in production builds. Blocks that only had prefixed user-select now use the standard property (previously Firefox got no user-select there at all). Converts the four -webkit-linear-gradient() declarations - the sole gradient syntax on those sliders - to standard linear-gradient(). * Remove dead html_url custom panel support html_url pointed to an HTML Import, a Polymer-era feature removed from Chrome in 2019 and never shipped elsewhere. The loader has not handled the html type for years (it fell through to a rejection), and core's panel_custom integration no longer accepts the option, so the branch was unreachable. Also drops the ha-panel-${name} legacy tag naming that was keyed on html_url. * Repair list-plugins-and-polyfills script for Babel 8 The audit script died at startup since the Babel 8 update: preset-env no longer exposes lib/debug.js (logPlugin is now inlined locally, built on the public getInclusionReasons helper) and babel-plugin-polyfill-corejs3 v1 no longer ships lib/shipped-proposals.js (list inlined). Instead of invoking the preset with a hand-mocked plugin API - the part that kept drifting - the plugin listing now runs a real transform of an empty file with preset-env in debug mode, declaring the same caller capabilities as babel-loader. The polyfill listing now passes the configured core-js version to core-js-compat, mirroring the provider's own filtering so the report cannot list modules the installed core-js lacks. Output is byte-identical to the direct-invocation approach. Also documents the script in the build-scripts README. * Correct macOS floor for Safari 26 in companion app UA regex Safari 26 ships for macOS 14 Sonoma and 15 Sequoia, not only macOS 26, so the SAFARI_TO_MACOS entry breaking the minimum-supported-macOS pattern would have sent updated macOS 14/15 companion apps to the legacy build once the modern floor reaches Safari 26. * Remove orphaned values left behind by vendor prefix removal * Require macOS 14.6 for Safari 26 in companion app UA regex
198 lines
5.6 KiB
JavaScript
198 lines
5.6 KiB
JavaScript
// Gulp task to gather all static files.
|
|
|
|
import fs from "fs-extra";
|
|
import gulp from "gulp";
|
|
import path from "path";
|
|
import paths from "../paths.cjs";
|
|
import { ensureMapAssets, mapAssetsDir } from "./map-assets.js";
|
|
|
|
const npmPath = (...parts) =>
|
|
path.resolve(paths.root_dir, "node_modules", ...parts);
|
|
const polyPath = (...parts) => path.resolve(paths.root_dir, ...parts);
|
|
|
|
const copyFileDir = (fromFile, toDir) =>
|
|
fs.copySync(fromFile, path.join(toDir, path.basename(fromFile)));
|
|
|
|
const genStaticPath =
|
|
(staticDir) =>
|
|
(...parts) =>
|
|
path.resolve(staticDir, ...parts);
|
|
|
|
function copyTranslations(staticDir) {
|
|
const staticPath = genStaticPath(staticDir);
|
|
|
|
// Translation output
|
|
fs.copySync(
|
|
polyPath("build/translations/output"),
|
|
staticPath("translations")
|
|
);
|
|
}
|
|
|
|
function copyLocaleData(staticDir) {
|
|
const staticPath = genStaticPath(staticDir);
|
|
|
|
// Locale data output
|
|
fs.copySync(polyPath("build/locale-data"), staticPath("locale-data"));
|
|
}
|
|
|
|
function copyMdiIcons(staticDir) {
|
|
const staticPath = genStaticPath(staticDir);
|
|
|
|
// MDI icons output
|
|
fs.copySync(polyPath("build/mdi"), staticPath("mdi"));
|
|
}
|
|
|
|
function copyFonts(staticDir) {
|
|
const staticPath = genStaticPath(staticDir);
|
|
// Local fonts
|
|
fs.copySync(
|
|
npmPath("roboto-fontface/fonts/roboto/"),
|
|
staticPath("fonts/roboto/"),
|
|
{
|
|
filter: (src) => !src.includes(".") || src.endsWith(".woff2"),
|
|
}
|
|
);
|
|
}
|
|
|
|
function copyQrScannerWorker(staticDir) {
|
|
const staticPath = genStaticPath(staticDir);
|
|
copyFileDir(npmPath("qr-scanner/qr-scanner-worker.min.js"), staticPath("js"));
|
|
}
|
|
|
|
async function copyMapPanel(staticDir) {
|
|
const staticPath = genStaticPath(staticDir);
|
|
copyFileDir(
|
|
npmPath("leaflet/dist/leaflet.css"),
|
|
staticPath("images/leaflet/")
|
|
);
|
|
copyFileDir(
|
|
npmPath("leaflet.markercluster/dist/MarkerCluster.css"),
|
|
staticPath("images/leaflet/")
|
|
);
|
|
fs.copySync(
|
|
npmPath("leaflet/dist/images"),
|
|
staticPath("images/leaflet/images/")
|
|
);
|
|
|
|
// Style, glyphs and sprites for the vector base map
|
|
await ensureMapAssets();
|
|
fs.copySync(mapAssetsDir, staticPath("map/"));
|
|
copyFileDir(
|
|
npmPath("@mapbox/mapbox-gl-rtl-text/dist/mapbox-gl-rtl-text.js"),
|
|
staticPath("map/")
|
|
);
|
|
}
|
|
|
|
function copyZXingWasm(staticDir) {
|
|
const staticPath = genStaticPath(staticDir);
|
|
copyFileDir(
|
|
npmPath("zxing-wasm/dist/reader/zxing_reader.wasm"),
|
|
staticPath("js")
|
|
);
|
|
}
|
|
|
|
gulp.task("copy-locale-data", async () => {
|
|
const staticDir = paths.app_output_static;
|
|
copyLocaleData(staticDir);
|
|
});
|
|
|
|
gulp.task("copy-translations-app", async () => {
|
|
const staticDir = paths.app_output_static;
|
|
copyTranslations(staticDir);
|
|
});
|
|
|
|
gulp.task("copy-translations-landing-page", async () => {
|
|
const staticDir = paths.landingPage_output_static;
|
|
copyTranslations(staticDir);
|
|
});
|
|
|
|
gulp.task("copy-static-app", async () => {
|
|
const staticDir = paths.app_output_static;
|
|
// Basic static files
|
|
fs.copySync(polyPath("public"), paths.app_output_root);
|
|
copyFonts(staticDir);
|
|
copyTranslations(staticDir);
|
|
copyLocaleData(staticDir);
|
|
copyMdiIcons(staticDir);
|
|
|
|
// Panel assets
|
|
await copyMapPanel(staticDir);
|
|
|
|
// Qr Scanner assets
|
|
copyZXingWasm(staticDir);
|
|
copyQrScannerWorker(staticDir);
|
|
});
|
|
|
|
gulp.task("copy-static-demo", async () => {
|
|
// Copy app static files
|
|
fs.copySync(
|
|
polyPath("public/static"),
|
|
path.resolve(paths.demo_output_root, "static")
|
|
);
|
|
// Copy demo static files
|
|
fs.copySync(path.resolve(paths.demo_dir, "public"), paths.demo_output_root);
|
|
await copyMapPanel(paths.demo_output_static);
|
|
copyFonts(paths.demo_output_static);
|
|
copyTranslations(paths.demo_output_static);
|
|
copyLocaleData(paths.demo_output_static);
|
|
copyMdiIcons(paths.demo_output_static);
|
|
});
|
|
|
|
gulp.task("copy-static-cast", async () => {
|
|
// Copy app static files
|
|
fs.copySync(polyPath("public/static"), paths.cast_output_static);
|
|
// Copy cast static files
|
|
fs.copySync(path.resolve(paths.cast_dir, "public"), paths.cast_output_root);
|
|
await copyMapPanel(paths.cast_output_static);
|
|
copyFonts(paths.cast_output_static);
|
|
copyTranslations(paths.cast_output_static);
|
|
copyLocaleData(paths.cast_output_static);
|
|
copyMdiIcons(paths.cast_output_static);
|
|
});
|
|
|
|
gulp.task("copy-static-gallery", async () => {
|
|
// Copy app static files
|
|
fs.copySync(polyPath("public/static"), paths.gallery_output_static);
|
|
// Copy gallery static files
|
|
fs.copySync(
|
|
path.resolve(paths.gallery_dir, "public"),
|
|
paths.gallery_output_root
|
|
);
|
|
|
|
await copyMapPanel(paths.gallery_output_static);
|
|
copyFonts(paths.gallery_output_static);
|
|
copyTranslations(paths.gallery_output_static);
|
|
copyLocaleData(paths.gallery_output_static);
|
|
copyMdiIcons(paths.gallery_output_static);
|
|
});
|
|
|
|
gulp.task("copy-static-landing-page", async () => {
|
|
// Copy landing-page static files
|
|
fs.copySync(
|
|
path.resolve(paths.landingPage_dir, "public"),
|
|
paths.landingPage_output_root
|
|
);
|
|
|
|
copyFonts(paths.landingPage_output_static);
|
|
copyTranslations(paths.landingPage_output_static);
|
|
});
|
|
|
|
gulp.task("copy-static-e2e-test-app", async () => {
|
|
// Copy app static files (icons, polyfills, etc.)
|
|
fs.copySync(
|
|
polyPath("public/static"),
|
|
path.resolve(paths.e2eTestApp_output_root, "static")
|
|
);
|
|
// Copy e2e test app public files (manifest, sw stubs)
|
|
const e2ePublic = path.resolve(paths.e2eTestApp_dir, "public");
|
|
if (fs.existsSync(e2ePublic)) {
|
|
fs.copySync(e2ePublic, paths.e2eTestApp_output_root);
|
|
}
|
|
|
|
await copyMapPanel(paths.e2eTestApp_output_static);
|
|
copyFonts(paths.e2eTestApp_output_static);
|
|
copyTranslations(paths.e2eTestApp_output_static);
|
|
copyLocaleData(paths.e2eTestApp_output_static);
|
|
copyMdiIcons(paths.e2eTestApp_output_static);
|
|
});
|