diff --git a/build-scripts/README.md b/build-scripts/README.md index 0a6963f7e926..8e7933d2f8a9 100644 --- a/build-scripts/README.md +++ b/build-scripts/README.md @@ -15,7 +15,7 @@ The Home Assistant build pipeline contains various steps to prepare a build. Currently in Home Assistant we use a bundler to convert TypeScript, CSS and JSON files to JavaScript files that the browser understands. -We currently rely on Webpack but also have experimental Rollup support. Both of these programs bundle the converted files in both production and development. +We currently rely on Webpack. Both of these programs bundle the converted files in both production and development. For development, bundling is optional. We just want to get the right files in the browser. diff --git a/build-scripts/bundle.cjs b/build-scripts/bundle.cjs index 84e1490f995b..6b2f308b3d3a 100644 --- a/build-scripts/bundle.cjs +++ b/build-scripts/bundle.cjs @@ -226,13 +226,12 @@ module.exports.config = { return { name: "frontend" + nameSuffix(latestBuild), entry: { - "service-worker": - !env.useRollup() && !latestBuild - ? { - import: "./src/entrypoints/service-worker.ts", - layer: "sw", - } - : "./src/entrypoints/service-worker.ts", + "service-worker": !latestBuild + ? { + import: "./src/entrypoints/service-worker.ts", + layer: "sw", + } + : "./src/entrypoints/service-worker.ts", app: "./src/entrypoints/app.ts", authorize: "./src/entrypoints/authorize.ts", onboarding: "./src/entrypoints/onboarding.ts", diff --git a/build-scripts/env.cjs b/build-scripts/env.cjs index 6f208b779b33..6f2bb4be589b 100644 --- a/build-scripts/env.cjs +++ b/build-scripts/env.cjs @@ -3,9 +3,6 @@ const path = require("path"); const paths = require("./paths.cjs"); module.exports = { - useRollup() { - return process.env.ROLLUP === "1"; - }, useWDS() { return process.env.WDS === "1"; }, diff --git a/build-scripts/gulp/app.js b/build-scripts/gulp/app.js index 3b4343a49530..7d2264eba793 100644 --- a/build-scripts/gulp/app.js +++ b/build-scripts/gulp/app.js @@ -6,7 +6,6 @@ import "./entry-html.js"; import "./gather-static.js"; import "./gen-icons-json.js"; import "./locale-data.js"; -import "./rollup.js"; import "./service-worker.js"; import "./translations.js"; import "./wds.js"; @@ -27,11 +26,7 @@ gulp.task( "build-locale-data" ), "copy-static-app", - env.useWDS() - ? "wds-watch-app" - : env.useRollup() - ? "rollup-watch-app" - : "webpack-watch-app" + env.useWDS() ? "wds-watch-app" : "webpack-watch-app" ) ); @@ -44,7 +39,7 @@ gulp.task( "clean", gulp.parallel("gen-icons-json", "build-translations", "build-locale-data"), "copy-static-app", - env.useRollup() ? "rollup-prod-app" : "webpack-prod-app", + "webpack-prod-app", gulp.parallel("gen-pages-app-prod", "gen-service-worker-app-prod"), // Don't compress running tests ...(env.isTestBuild() ? [] : ["compress-app"]) diff --git a/build-scripts/gulp/cast.js b/build-scripts/gulp/cast.js index adde0f212c98..d883deac5d83 100644 --- a/build-scripts/gulp/cast.js +++ b/build-scripts/gulp/cast.js @@ -1,9 +1,7 @@ import gulp from "gulp"; -import env from "../env.cjs"; import "./clean.js"; import "./entry-html.js"; import "./gather-static.js"; -import "./rollup.js"; import "./service-worker.js"; import "./translations.js"; import "./webpack.js"; @@ -19,7 +17,7 @@ gulp.task( gulp.parallel("gen-icons-json", "build-translations", "build-locale-data"), "copy-static-cast", "gen-pages-cast-dev", - env.useRollup() ? "rollup-dev-server-cast" : "webpack-dev-server-cast" + "webpack-dev-server-cast" ) ); @@ -33,7 +31,7 @@ gulp.task( "translations-enable-merge-backend", gulp.parallel("gen-icons-json", "build-translations", "build-locale-data"), "copy-static-cast", - env.useRollup() ? "rollup-prod-cast" : "webpack-prod-cast", + "webpack-prod-cast", "gen-pages-cast-prod" ) ); diff --git a/build-scripts/gulp/demo.js b/build-scripts/gulp/demo.js index 8ed7a65953c3..27ba3439080d 100644 --- a/build-scripts/gulp/demo.js +++ b/build-scripts/gulp/demo.js @@ -1,10 +1,8 @@ import gulp from "gulp"; -import env from "../env.cjs"; import "./clean.js"; import "./entry-html.js"; import "./gather-static.js"; import "./gen-icons-json.js"; -import "./rollup.js"; import "./service-worker.js"; import "./translations.js"; import "./webpack.js"; @@ -24,7 +22,7 @@ gulp.task( "build-locale-data" ), "copy-static-demo", - env.useRollup() ? "rollup-dev-server-demo" : "webpack-dev-server-demo" + "webpack-dev-server-demo" ) ); @@ -39,7 +37,7 @@ gulp.task( "translations-enable-merge-backend", gulp.parallel("gen-icons-json", "build-translations", "build-locale-data"), "copy-static-demo", - env.useRollup() ? "rollup-prod-demo" : "webpack-prod-demo", + "webpack-prod-demo", "gen-pages-demo-prod" ) ); diff --git a/build-scripts/gulp/entry-html.js b/build-scripts/gulp/entry-html.js index 86e2e22ee09e..d8bf587f6c01 100644 --- a/build-scripts/gulp/entry-html.js +++ b/build-scripts/gulp/entry-html.js @@ -56,7 +56,6 @@ const getCommonTemplateVars = () => { { ignorePatch: true, allowHigherVersions: true } ); return { - useRollup: env.useRollup(), useWDS: env.useWDS(), modernRegex: compileRegex(browserRegexes.concat(haMacOSRegex)).toString(), }; diff --git a/build-scripts/gulp/gallery.js b/build-scripts/gulp/gallery.js index efbb3f9ea5e1..16255b27cad8 100644 --- a/build-scripts/gulp/gallery.js +++ b/build-scripts/gulp/gallery.js @@ -4,13 +4,11 @@ import gulp from "gulp"; import yaml from "js-yaml"; import { marked } from "marked"; import path from "path"; -import env from "../env.cjs"; import paths from "../paths.cjs"; import "./clean.js"; import "./entry-html.js"; import "./gather-static.js"; import "./gen-icons-json.js"; -import "./rollup.js"; import "./service-worker.js"; import "./translations.js"; import "./webpack.js"; @@ -158,9 +156,7 @@ gulp.task( "copy-static-gallery", "gen-pages-gallery-dev", gulp.parallel( - env.useRollup() - ? "rollup-dev-server-gallery" - : "webpack-dev-server-gallery", + "webpack-dev-server-gallery", async function watchMarkdownFiles() { gulp.watch( [ @@ -189,7 +185,7 @@ gulp.task( "gather-gallery-pages" ), "copy-static-gallery", - env.useRollup() ? "rollup-prod-gallery" : "webpack-prod-gallery", + "webpack-prod-gallery", "gen-pages-gallery-prod" ) ); diff --git a/build-scripts/gulp/gather-static.js b/build-scripts/gulp/gather-static.js index c02511abff2d..653e863dcde7 100644 --- a/build-scripts/gulp/gather-static.js +++ b/build-scripts/gulp/gather-static.js @@ -4,7 +4,6 @@ import fs from "fs-extra"; import gulp from "gulp"; import path from "path"; import paths from "../paths.cjs"; -import env from "../env.cjs"; const npmPath = (...parts) => path.resolve(paths.polymer_dir, "node_modules", ...parts); @@ -69,9 +68,6 @@ function copyPolyfills(staticDir) { } function copyLoaderJS(staticDir) { - if (!env.useRollup()) { - return; - } const staticPath = genStaticPath(staticDir); copyFileDir(npmPath("systemjs/dist/s.min.js"), staticPath("js")); copyFileDir(npmPath("systemjs/dist/s.min.js.map"), staticPath("js")); diff --git a/build-scripts/gulp/hassio.js b/build-scripts/gulp/hassio.js index db97991e4b38..a177100f7763 100644 --- a/build-scripts/gulp/hassio.js +++ b/build-scripts/gulp/hassio.js @@ -5,7 +5,6 @@ import "./compress.js"; import "./entry-html.js"; import "./gather-static.js"; import "./gen-icons-json.js"; -import "./rollup.js"; import "./translations.js"; import "./webpack.js"; @@ -22,7 +21,7 @@ gulp.task( "copy-translations-supervisor", "build-locale-data", "copy-static-supervisor", - env.useRollup() ? "rollup-watch-hassio" : "webpack-watch-hassio" + "webpack-watch-hassio" ) ); @@ -38,7 +37,7 @@ gulp.task( "copy-translations-supervisor", "build-locale-data", "copy-static-supervisor", - env.useRollup() ? "rollup-prod-hassio" : "webpack-prod-hassio", + "webpack-prod-hassio", "gen-pages-hassio-prod", ...// Don't compress running tests (env.isTestBuild() ? [] : ["compress-hassio"]) diff --git a/build-scripts/gulp/rollup.js b/build-scripts/gulp/rollup.js deleted file mode 100644 index 83810abbe215..000000000000 --- a/build-scripts/gulp/rollup.js +++ /dev/null @@ -1,147 +0,0 @@ -// Tasks to run Rollup - -import log from "fancy-log"; -import gulp from "gulp"; -import http from "http"; -import open from "open"; -import path from "path"; -import { rollup } from "rollup"; -import handler from "serve-handler"; -import paths from "../paths.cjs"; -import rollupConfig from "../rollup.cjs"; - -const bothBuilds = (createConfigFunc, params) => - gulp.series( - async function buildLatest() { - await buildRollup( - createConfigFunc({ - ...params, - latestBuild: true, - }) - ); - }, - async function buildES5() { - await buildRollup( - createConfigFunc({ - ...params, - latestBuild: false, - }) - ); - } - ); - -function createServer(serveOptions) { - const server = http.createServer((request, response) => - handler(request, response, { - public: serveOptions.root, - }) - ); - - server.listen( - serveOptions.port, - serveOptions.networkAccess ? "0.0.0.0" : undefined, - () => { - log.info(`Available at http://localhost:${serveOptions.port}`); - open(`http://localhost:${serveOptions.port}`); - } - ); -} - -function watchRollup(createConfig, extraWatchSrc = [], serveOptions = null) { - const { inputOptions, outputOptions } = createConfig({ - isProdBuild: false, - latestBuild: true, - }); - - const watcher = rollup.watch({ - ...inputOptions, - output: [outputOptions], - watch: { - include: ["src/**"] + extraWatchSrc, - }, - }); - - let startedHttp = false; - - watcher.on("event", (event) => { - if (event.code === "BUNDLE_END") { - log(`Build done @ ${new Date().toLocaleTimeString()}`); - } else if (event.code === "ERROR") { - log.error(event.error); - } else if (event.code === "END") { - if (startedHttp || !serveOptions) { - return; - } - startedHttp = true; - createServer(serveOptions); - } - }); - - gulp.watch( - path.join(paths.translations_src, "en.json"), - gulp.series("build-translations", "copy-translations-app") - ); -} - -async function buildRollup(config) { - const bundle = await rollup.rollup(config.inputOptions); - await bundle.write(config.outputOptions); -} - -gulp.task("rollup-watch-app", () => { - watchRollup(rollupConfig.createAppConfig); -}); - -gulp.task("rollup-watch-hassio", () => { - watchRollup(rollupConfig.createHassioConfig, ["hassio/src/**"]); -}); - -gulp.task("rollup-dev-server-demo", () => { - watchRollup(rollupConfig.createDemoConfig, ["demo/src/**"], { - root: paths.demo_output_root, - port: 8090, - }); -}); - -gulp.task("rollup-dev-server-cast", () => { - watchRollup(rollupConfig.createCastConfig, ["cast/src/**"], { - root: paths.cast_output_root, - port: 8080, - networkAccess: true, - }); -}); - -gulp.task("rollup-dev-server-gallery", () => { - watchRollup(rollupConfig.createGalleryConfig, ["gallery/src/**"], { - root: paths.gallery_output_root, - port: 8100, - }); -}); - -gulp.task( - "rollup-prod-app", - bothBuilds(rollupConfig.createAppConfig, { isProdBuild: true }) -); - -gulp.task( - "rollup-prod-demo", - bothBuilds(rollupConfig.createDemoConfig, { isProdBuild: true }) -); - -gulp.task( - "rollup-prod-cast", - bothBuilds(rollupConfig.createCastConfig, { isProdBuild: true }) -); - -gulp.task("rollup-prod-hassio", () => - bothBuilds(rollupConfig.createHassioConfig, { isProdBuild: true }) -); - -gulp.task("rollup-prod-gallery", () => - buildRollup( - rollupConfig.createGalleryConfig({ - isProdBuild: true, - latestBuild: true, - }) - ) -); diff --git a/build-scripts/rollup-plugins/dont-hash-plugin.cjs b/build-scripts/rollup-plugins/dont-hash-plugin.cjs deleted file mode 100644 index 89082b90c21a..000000000000 --- a/build-scripts/rollup-plugins/dont-hash-plugin.cjs +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = function (opts = {}) { - const dontHash = opts.dontHash || new Set(); - - return { - name: "dont-hash", - renderChunk(_code, chunk, _options) { - if (!chunk.isEntry || !dontHash.has(chunk.name)) { - return null; - } - chunk.fileName = `${chunk.name}.js`; - return null; - }, - }; -}; diff --git a/build-scripts/rollup-plugins/ignore-plugin.cjs b/build-scripts/rollup-plugins/ignore-plugin.cjs deleted file mode 100644 index 5819958092ca..000000000000 --- a/build-scripts/rollup-plugins/ignore-plugin.cjs +++ /dev/null @@ -1,24 +0,0 @@ -module.exports = function (userOptions = {}) { - // Files need to be absolute paths. - // This only works if the file has no exports - // and only is imported for its side effects - const files = userOptions.files || []; - - if (files.length === 0) { - return { - name: "ignore", - }; - } - - return { - name: "ignore", - - load(id) { - return files.some((toIgnorePath) => id.startsWith(toIgnorePath)) - ? { - code: "", - } - : null; - }, - }; -}; diff --git a/build-scripts/rollup-plugins/manifest-plugin.cjs b/build-scripts/rollup-plugins/manifest-plugin.cjs deleted file mode 100644 index bf4bbaac0539..000000000000 --- a/build-scripts/rollup-plugins/manifest-plugin.cjs +++ /dev/null @@ -1,34 +0,0 @@ -const url = require("url"); - -const defaultOptions = { - publicPath: "", -}; - -module.exports = function (userOptions = {}) { - const options = { ...defaultOptions, ...userOptions }; - - return { - name: "manifest", - generateBundle(outputOptions, bundle) { - const manifest = {}; - - for (const chunk of Object.values(bundle)) { - if (!chunk.isEntry) { - continue; - } - // Add js extension to mimic Webpack manifest. - manifest[`${chunk.name}.js`] = url.resolve( - options.publicPath, - chunk.fileName - ); - } - - this.emitFile({ - type: "asset", - source: JSON.stringify(manifest, undefined, 2), - name: "manifest.json", - fileName: "manifest.json", - }); - }, - }; -}; diff --git a/build-scripts/rollup-plugins/worker-plugin.cjs b/build-scripts/rollup-plugins/worker-plugin.cjs deleted file mode 100644 index 007d5eadb8e3..000000000000 --- a/build-scripts/rollup-plugins/worker-plugin.cjs +++ /dev/null @@ -1,152 +0,0 @@ -// Worker plugin -// Each worker will include all of its dependencies -// instead of relying on an importer. - -// Forked from v.1.4.1 -// https://github.com/surma/rollup-plugin-off-main-thread -/** - * Copyright 2018 Google Inc. All Rights Reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -const rollup = require("rollup"); -const path = require("path"); -const MagicString = require("magic-string"); - -const defaultOpts = { - // A RegExp to find `new Workers()` calls. The second capture group _must_ - // capture the provided file name without the quotes. - workerRegexp: /new Worker\((["'])(.+?)\1(,[^)]+)?\)/g, - plugins: ["node-resolve", "commonjs", "babel", "terser", "ignore"], -}; - -async function getBundledWorker(workerPath, rollupOptions) { - const bundle = await rollup.rollup({ - ...rollupOptions, - input: { - worker: workerPath, - }, - }); - const { output } = await bundle.generate({ - // Generates cleanest output, we shouldn't have any imports/exports - // that would be incompatible with ES5. - format: "es", - // We should not export anything. This will fail build if we are. - exports: "none", - }); - - let code; - - for (const chunkOrAsset of output) { - if (chunkOrAsset.name === "worker") { - code = chunkOrAsset.code; - } else if (chunkOrAsset.type !== "asset") { - throw new Error("Unexpected extra output"); - } - } - - return code; -} - -module.exports = function (opts = {}) { - opts = { ...defaultOpts, ...opts }; - - let rollupOptions; - let refIds; - - return { - name: "hass-worker", - - async buildStart(options) { - refIds = {}; - rollupOptions = { - plugins: options.plugins.filter((plugin) => - opts.plugins.includes(plugin.name) - ), - }; - }, - - async transform(code, id) { - // Copy the regexp as they are stateful and this hook is async. - const workerRegexp = new RegExp( - opts.workerRegexp.source, - opts.workerRegexp.flags - ); - if (!workerRegexp.test(code)) { - return undefined; - } - - const ms = new MagicString(code); - // Reset the regexp - workerRegexp.lastIndex = 0; - for (;;) { - const match = workerRegexp.exec(code); - if (!match) { - break; - } - - const workerFile = match[2]; - let optionsObject = {}; - // Parse the optional options object - if (match[3] && match[3].length > 0) { - // FIXME: ooooof! - // eslint-disable-next-line @typescript-eslint/no-implied-eval - optionsObject = new Function(`return ${match[3].slice(1)};`)(); - } - delete optionsObject.type; - - if (!/^.*\//.test(workerFile)) { - this.warn( - `Paths passed to the Worker constructor must be relative or absolute, i.e. start with /, ./ or ../ (just like dynamic import!). Ignoring "${workerFile}".` - ); - continue; - } - - // Find worker file and store it as a chunk with ID prefixed for our loader - // eslint-disable-next-line no-await-in-loop - const resolvedWorkerFile = (await this.resolve(workerFile, id)).id; - let chunkRefId; - if (resolvedWorkerFile in refIds) { - chunkRefId = refIds[resolvedWorkerFile]; - } else { - this.addWatchFile(resolvedWorkerFile); - // eslint-disable-next-line no-await-in-loop - const source = await getBundledWorker( - resolvedWorkerFile, - rollupOptions - ); - chunkRefId = refIds[resolvedWorkerFile] = this.emitFile({ - name: path.basename(resolvedWorkerFile), - source, - type: "asset", - }); - } - - const workerParametersStartIndex = match.index + "new Worker(".length; - const workerParametersEndIndex = - match.index + match[0].length - ")".length; - - ms.overwrite( - workerParametersStartIndex, - workerParametersEndIndex, - `import.meta.ROLLUP_FILE_URL_${chunkRefId}, ${JSON.stringify( - optionsObject - )}` - ); - } - - return { - code: ms.toString(), - map: ms.generateMap({ hires: true }), - }; - }, - }; -}; diff --git a/build-scripts/rollup.cjs b/build-scripts/rollup.cjs deleted file mode 100644 index e3becb97aeb7..000000000000 --- a/build-scripts/rollup.cjs +++ /dev/null @@ -1,146 +0,0 @@ -const path = require("path"); - -const commonjs = require("@rollup/plugin-commonjs"); -const resolve = require("@rollup/plugin-node-resolve"); -const json = require("@rollup/plugin-json"); -const { babel } = require("@rollup/plugin-babel"); -const replace = require("@rollup/plugin-replace"); -const visualizer = require("rollup-plugin-visualizer"); -const { string } = require("rollup-plugin-string"); -const { terser } = require("rollup-plugin-terser"); -const manifest = require("./rollup-plugins/manifest-plugin.cjs"); -const worker = require("./rollup-plugins/worker-plugin.cjs"); -const dontHashPlugin = require("./rollup-plugins/dont-hash-plugin.cjs"); -const ignore = require("./rollup-plugins/ignore-plugin.cjs"); - -const bundle = require("./bundle.cjs"); -const paths = require("./paths.cjs"); - -const extensions = [".js", ".ts"]; - -/** - * @param {Object} arg - * @param { import("rollup").InputOption } arg.input - */ -const createRollupConfig = ({ - entry, - outputPath, - defineOverlay, - isProdBuild, - latestBuild, - isStatsBuild, - publicPath, - dontHash, - isWDS, -}) => ({ - /** - * @type { import("rollup").InputOptions } - */ - inputOptions: { - input: entry, - // Some entry points contain no JavaScript. This setting silences a warning about that. - // https://rollupjs.org/configuration-options/#preserveentrysignatures - preserveEntrySignatures: false, - plugins: [ - ignore({ - files: bundle - .emptyPackages({ latestBuild }) - // TEMP HACK: Makes Rollup build work again - .concat( - require.resolve( - "@webcomponents/scoped-custom-element-registry/scoped-custom-element-registry.min" - ) - ), - }), - resolve({ - extensions, - preferBuiltins: false, - browser: true, - rootDir: paths.polymer_dir, - }), - commonjs(), - json(), - babel({ - ...bundle.babelOptions({ latestBuild, isProdBuild }), - extensions, - babelHelpers: isWDS ? "inline" : "bundled", - }), - string({ - // Import certain extensions as strings - include: [path.join(paths.polymer_dir, "node_modules/**/*.css")], - }), - replace(bundle.definedVars({ isProdBuild, latestBuild, defineOverlay })), - !isWDS && - manifest({ - publicPath, - }), - !isWDS && worker(), - !isWDS && dontHashPlugin({ dontHash }), - !isWDS && isProdBuild && terser(bundle.terserOptions({ latestBuild })), - !isWDS && - isStatsBuild && - visualizer({ - // https://github.com/btd/rollup-plugin-visualizer#options - open: true, - sourcemap: true, - }), - ].filter(Boolean), - }, - /** - * @type { import("rollup").OutputOptions } - */ - outputOptions: { - // https://rollupjs.org/configuration-options/#output-dir - dir: outputPath, - // https://rollupjs.org/configuration-options/#output-format - format: latestBuild ? "es" : "systemjs", - // https://rollupjs.org/configuration-options/#output-externallivebindings - externalLiveBindings: false, - // https://rollupjs.org/configuration-options/#output-entryfilenames - // https://rollupjs.org/configuration-options/#output-chunkfilenames - // https://rollupjs.org/configuration-options/#output-assetfilenames - entryFileNames: - isProdBuild && !isStatsBuild ? "[name]-[hash].js" : "[name].js", - chunkFileNames: isProdBuild && !isStatsBuild ? "c.[hash].js" : "[name].js", - assetFileNames: isProdBuild && !isStatsBuild ? "a.[hash].js" : "[name].js", - // https://rollupjs.org/configuration-options/#output-sourcemap - sourcemap: isProdBuild ? true : "inline", - }, -}); - -const createAppConfig = ({ isProdBuild, latestBuild, isStatsBuild, isWDS }) => - createRollupConfig( - bundle.config.app({ - isProdBuild, - latestBuild, - isStatsBuild, - isWDS, - }) - ); - -const createDemoConfig = ({ isProdBuild, latestBuild, isStatsBuild }) => - createRollupConfig( - bundle.config.demo({ - isProdBuild, - latestBuild, - isStatsBuild, - }) - ); - -const createCastConfig = ({ isProdBuild, latestBuild }) => - createRollupConfig(bundle.config.cast({ isProdBuild, latestBuild })); - -const createHassioConfig = ({ isProdBuild, latestBuild }) => - createRollupConfig(bundle.config.hassio({ isProdBuild, latestBuild })); - -const createGalleryConfig = ({ isProdBuild, latestBuild }) => - createRollupConfig(bundle.config.gallery({ isProdBuild, latestBuild })); - -module.exports = { - createAppConfig, - createDemoConfig, - createCastConfig, - createHassioConfig, - createGalleryConfig, - createRollupConfig, -}; diff --git a/cast/rollup.config.js b/cast/rollup.config.js deleted file mode 100644 index f598f1a4fa09..000000000000 --- a/cast/rollup.config.js +++ /dev/null @@ -1,10 +0,0 @@ -import rollup from "../build-scripts/rollup.cjs"; -import env from "../build-scripts/env.cjs"; - -const config = rollup.createCastConfig({ - isProdBuild: env.isProdBuild(), - latestBuild: true, - isStatsBuild: env.isStatsBuild(), -}); - -export default { ...config.inputOptions, output: config.outputOptions }; diff --git a/demo/rollup.config.js b/demo/rollup.config.js deleted file mode 100644 index 90cff26a9551..000000000000 --- a/demo/rollup.config.js +++ /dev/null @@ -1,10 +0,0 @@ -import rollup from "../build-scripts/rollup.cjs"; -import env from "../build-scripts/env.cjs"; - -const config = rollup.createDemoConfig({ - isProdBuild: env.isProdBuild(), - latestBuild: true, - isStatsBuild: env.isStatsBuild(), -}); - -export default { ...config.inputOptions, output: config.outputOptions }; diff --git a/gallery/rollup.config.js b/gallery/rollup.config.js deleted file mode 100644 index 850407482284..000000000000 --- a/gallery/rollup.config.js +++ /dev/null @@ -1,10 +0,0 @@ -import rollup from "../build-scripts/rollup.cjs"; -import env from "../build-scripts/env.cjs"; - -const config = rollup.createGalleryConfig({ - isProdBuild: env.isProdBuild(), - latestBuild: true, - isStatsBuild: env.isStatsBuild(), -}); - -export default { ...config.inputOptions, output: config.outputOptions }; diff --git a/gallery/src/pages/components/ha-form.ts b/gallery/src/pages/components/ha-form.ts index 61495e4f785d..fe877ad1d8c5 100644 --- a/gallery/src/pages/components/ha-form.ts +++ b/gallery/src/pages/components/ha-form.ts @@ -510,6 +510,7 @@ class DemoHaForm extends LitElement { .computeError=${(error) => translations[error] || error} .computeLabel=${(schema) => translations[schema.name] || schema.name} + .computeHelper=${() => "Helper text"} @value-changed=${(e) => { this.data[idx] = e.detail.value; this.requestUpdate(); diff --git a/hassio/rollup.config.js b/hassio/rollup.config.js deleted file mode 100644 index 41835a7fa86f..000000000000 --- a/hassio/rollup.config.js +++ /dev/null @@ -1,10 +0,0 @@ -import rollup from "../build-scripts/rollup.cjs"; -import env from "../build-scripts/env.cjs"; - -const config = rollup.createHassioConfig({ - isProdBuild: env.isProdBuild(), - latestBuild: false, - isStatsBuild: env.isStatsBuild(), -}); - -export default { ...config.inputOptions, output: config.outputOptions }; diff --git a/hassio/src/addon-view/log/hassio-addon-log-tab.ts b/hassio/src/addon-view/log/hassio-addon-log-tab.ts index a40454fe8367..34ce4f462669 100644 --- a/hassio/src/addon-view/log/hassio-addon-log-tab.ts +++ b/hassio/src/addon-view/log/hassio-addon-log-tab.ts @@ -47,7 +47,6 @@ class HassioAddonLogDashboard extends LitElement { .localizeFunc=${this.supervisor.localize} .header=${this.addon.name} .provider=${this.addon.slug} - show .filter=${this._filter} > diff --git a/package.json b/package.json index 72ff03898ee5..7de09cbd8d8a 100644 --- a/package.json +++ b/package.json @@ -30,10 +30,10 @@ "@codemirror/autocomplete": "6.18.2", "@codemirror/commands": "6.7.1", "@codemirror/language": "6.10.3", - "@codemirror/legacy-modes": "6.4.1", + "@codemirror/legacy-modes": "6.4.2", "@codemirror/search": "6.5.7", "@codemirror/state": "6.4.1", - "@codemirror/view": "6.34.1", + "@codemirror/view": "6.34.2", "@egjs/hammerjs": "2.0.17", "@formatjs/intl-datetimeformat": "6.16.3", "@formatjs/intl-displaynames": "6.8.3", @@ -89,8 +89,8 @@ "@polymer/polymer": "3.5.2", "@replit/codemirror-indentation-markers": "6.5.3", "@thomasloven/round-slider": "0.6.0", - "@vaadin/combo-box": "24.5.1", - "@vaadin/vaadin-themable-mixin": "24.5.1", + "@vaadin/combo-box": "24.5.2", + "@vaadin/vaadin-themable-mixin": "24.5.2", "@vibrant/color": "3.2.1-alpha.1", "@vibrant/core": "3.2.1-alpha.1", "@vibrant/quantizer-mmcq": "3.2.1-alpha.1", @@ -165,11 +165,6 @@ "@octokit/plugin-retry": "7.1.2", "@octokit/rest": "21.0.2", "@open-wc/dev-server-hmr": "0.1.4", - "@rollup/plugin-babel": "6.0.4", - "@rollup/plugin-commonjs": "26.0.1", - "@rollup/plugin-json": "6.1.0", - "@rollup/plugin-node-resolve": "15.2.4", - "@rollup/plugin-replace": "5.0.7", "@types/babel__plugin-transform-runtime": "7.9.5", "@types/chromecast-caf-receiver": "6.0.17", "@types/chromecast-caf-sender": "1.0.10", @@ -191,7 +186,6 @@ "@typescript-eslint/eslint-plugin": "7.18.0", "@typescript-eslint/parser": "7.18.0", "@web/dev-server": "0.1.38", - "@web/dev-server-rollup": "0.4.1", "babel-loader": "9.2.1", "babel-plugin-template-html-minifier": "4.1.0", "browserslist-useragent-regexp": "4.1.3", @@ -230,10 +224,6 @@ "open": "10.1.0", "pinst": "3.0.0", "prettier": "3.3.3", - "rollup": "2.79.2", - "rollup-plugin-string": "3.0.0", - "rollup-plugin-terser": "7.0.2", - "rollup-plugin-visualizer": "5.12.0", "serve-handler": "6.1.6", "sinon": "19.0.2", "systemjs": "6.15.1", diff --git a/rollup.config.js b/rollup.config.js deleted file mode 100644 index 0b59a654d213..000000000000 --- a/rollup.config.js +++ /dev/null @@ -1,10 +0,0 @@ -import rollup from "../build-scripts/rollup.cjs"; -import env from "../build-scripts/env.cjs"; - -const config = rollup.createAppConfig({ - isProdBuild: env.isProdBuild(), - latestBuild: true, - isStatsBuild: env.isStatsBuild(), -}); - -export default { ...config.inputOptions, output: config.outputOptions }; diff --git a/src/components/ha-form/ha-form-boolean.ts b/src/components/ha-form/ha-form-boolean.ts index b56ccd2d2481..11c7033e0a4d 100644 --- a/src/components/ha-form/ha-form-boolean.ts +++ b/src/components/ha-form/ha-form-boolean.ts @@ -1,6 +1,6 @@ import "@material/mwc-formfield"; -import type { TemplateResult } from "lit"; -import { html, LitElement } from "lit"; +import type { CSSResultGroup, TemplateResult } from "lit"; +import { css, html, LitElement, nothing } from "lit"; import { customElement, property, query } from "lit/decorators"; import { fireEvent } from "../../common/dom/fire_event"; import type { @@ -19,6 +19,8 @@ export class HaFormBoolean extends LitElement implements HaFormElement { @property() public label!: string; + @property() public helper?: string; + @property({ type: Boolean }) public disabled = false; @query("ha-checkbox", true) private _input?: HTMLElement; @@ -37,6 +39,12 @@ export class HaFormBoolean extends LitElement implements HaFormElement { .disabled=${this.disabled} @change=${this._valueChanged} > + +

${this.label}

+ ${this.helper + ? html`

${this.helper}

` + : nothing} +
`; } @@ -46,6 +54,28 @@ export class HaFormBoolean extends LitElement implements HaFormElement { value: (ev.target as HaCheckbox).checked, }); } + + static get styles(): CSSResultGroup { + return css` + ha-formfield { + display: flex; + min-height: 56px; + align-items: center; + --mdc-typography-body2-font-size: 1em; + } + p { + margin: 0; + } + .secondary { + direction: var(--direction); + padding-top: 4px; + box-sizing: border-box; + color: var(--secondary-text-color); + font-size: 0.875rem; + font-weight: var(--mdc-typography-body2-font-weight, 400); + } + `; + } } declare global { diff --git a/src/components/ha-sortable.ts b/src/components/ha-sortable.ts index 2dc997440020..88feb7dfbafe 100644 --- a/src/components/ha-sortable.ts +++ b/src/components/ha-sortable.ts @@ -135,6 +135,10 @@ export class HaSortable extends LitElement { const Sortable = (await import("../resources/sortable")).default; const options: SortableInstance.Options = { + scroll: true, + // Force the autoscroll fallback because it works better than the native one + forceAutoScrollFallback: true, + scrollSpeed: 20, animation: 150, ...this.options, onChoose: this._handleChoose, diff --git a/src/data/entity_registry.ts b/src/data/entity_registry.ts index 1af01d3575cd..05659e276628 100644 --- a/src/data/entity_registry.ts +++ b/src/data/entity_registry.ts @@ -10,8 +10,6 @@ import type { LightColor } from "./light"; import { computeDomain } from "../common/entity/compute_domain"; import type { RegistryEntry } from "./registry"; -export { subscribeEntityRegistryDisplay } from "./ws-entity_registry_display"; - type EntityCategory = "config" | "diagnostic"; export interface EntityRegistryDisplayEntry { diff --git a/src/html/_script_loader.html.template b/src/html/_script_loader.html.template index 5ea3f23ac476..f56c5c01b182 100644 --- a/src/html/_script_loader.html.template +++ b/src/html/_script_loader.html.template @@ -9,16 +9,8 @@ diff --git a/src/panels/config/core/updates/dialog-join-beta.ts b/src/panels/config/core/updates/dialog-join-beta.ts index 5a96530f36ca..7b4d7381c56c 100644 --- a/src/panels/config/core/updates/dialog-join-beta.ts +++ b/src/panels/config/core/updates/dialog-join-beta.ts @@ -48,7 +48,7 @@ export class DialogJoinBeta ${this.hass.localize("ui.dialogs.join_beta_channel.backup")}

- ${this.hass.localize("ui.dialogs.join_beta_channel.warning")} + ${this.hass.localize("ui.dialogs.join_beta_channel.warning")}.
${this.hass.localize("ui.dialogs.join_beta_channel.release_items")}