mirror of
				https://github.com/home-assistant/frontend.git
				synced 2025-10-30 22:19:55 +00:00 
			
		
		
		
	Compare commits
	
		
			1 Commits
		
	
	
		
			fix_new_sc
			...
			delete-bad
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 282710dacd | 
| @@ -4,12 +4,13 @@ | |||||||
| # - released in the last year + current alpha/beta versions | # - released in the last year + current alpha/beta versions | ||||||
| # - Firefox extended support release (ESR) | # - Firefox extended support release (ESR) | ||||||
| # - with global utilization at or above 0.5% | # - with global utilization at or above 0.5% | ||||||
| # - exclude dead browsers (no security maintenance for 2+ years) | # - must support dynamic import of ES modules | ||||||
|  | # - exclude browsers no longer being maintained | ||||||
| # - exclude KaiOS, QQ, and UC browsers due to lack of sufficient feature support data | # - exclude KaiOS, QQ, and UC browsers due to lack of sufficient feature support data | ||||||
| unreleased versions | unreleased versions | ||||||
| last 1 year | last 1 year | ||||||
| Firefox ESR | Firefox ESR | ||||||
| >= 0.5% | >= 0.5% and supports es6-module-dynamic-import | ||||||
| not dead | not dead | ||||||
| not KaiOS > 0 | not KaiOS > 0 | ||||||
| not QQAndroid > 0 | not QQAndroid > 0 | ||||||
| @@ -19,18 +20,23 @@ not UCAndroid > 0 | |||||||
| # Legacy builds are served when modern requirements are not met and support browsers: | # Legacy builds are served when modern requirements are not met and support browsers: | ||||||
| # - released in the last 7 years + current alpha/beta versionss | # - released in the last 7 years + current alpha/beta versionss | ||||||
| # - with global utilization at or above 0.05% | # - with global utilization at or above 0.05% | ||||||
| # - exclude dead browsers (no security maintenance for 2+ years) | # The lattermost query ensures that support for popular old browsers is not dropped too early | ||||||
| # - exclude Opera Mini which does not support web sockets | # (e.g. IE 11, Android 4.4, or Samsung 4). | ||||||
|  | # | ||||||
|  | # In addition, legacy browsers must support some minimum features that cannot be polyfilled: | ||||||
|  | # - ES5 (strict mode) | ||||||
|  | # - web sockets to communicate with backend | ||||||
|  | # - inline SVG used widely in buttons, widgets, etc. | ||||||
|  | # - custom events used for most user interactions | ||||||
|  | # - CSS flexbox used in the majority of the layout | ||||||
|  | # Nearly all of these are redundant with the above rules. | ||||||
|  | # As of May 2023, only web sockets must be added to the query. | ||||||
| unreleased versions | unreleased versions | ||||||
| last 7 years | last 7 years | ||||||
| >= 0.05% | >= 0.05% and supports websockets | ||||||
| not dead |  | ||||||
| not op_mini all |  | ||||||
|  |  | ||||||
| [legacy-sw] | [legacy-sw] | ||||||
| # Same as legacy plus supports service workers | # Same as legacy plus supports service workers | ||||||
| unreleased versions | unreleased versions | ||||||
| last 7 years | last 7 years | ||||||
| >= 0.05% and supports serviceworkers | >= 0.05% and supports websockets and supports serviceworkers | ||||||
| not dead |  | ||||||
| not op_mini all |  | ||||||
|   | |||||||
							
								
								
									
										130
									
								
								.eslintrc.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										130
									
								
								.eslintrc.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,130 @@ | |||||||
|  | { | ||||||
|  |   "extends": [ | ||||||
|  |     "airbnb-base", | ||||||
|  |     "airbnb-typescript/base", | ||||||
|  |     "plugin:@typescript-eslint/recommended", | ||||||
|  |     "plugin:wc/recommended", | ||||||
|  |     "plugin:lit/all", | ||||||
|  |     "plugin:lit-a11y/recommended", | ||||||
|  |     "prettier" | ||||||
|  |   ], | ||||||
|  |   "parser": "@typescript-eslint/parser", | ||||||
|  |   "parserOptions": { | ||||||
|  |     "ecmaVersion": 2020, | ||||||
|  |     "ecmaFeatures": { | ||||||
|  |       "modules": true | ||||||
|  |     }, | ||||||
|  |     "sourceType": "module", | ||||||
|  |     "project": "./tsconfig.json" | ||||||
|  |   }, | ||||||
|  |   "settings": { | ||||||
|  |     "import/resolver": { | ||||||
|  |       "webpack": { | ||||||
|  |         "config": "./webpack.config.cjs" | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "globals": { | ||||||
|  |     "__DEV__": false, | ||||||
|  |     "__DEMO__": false, | ||||||
|  |     "__BUILD__": false, | ||||||
|  |     "__VERSION__": false, | ||||||
|  |     "__STATIC_PATH__": false, | ||||||
|  |     "__SUPERVISOR__": false, | ||||||
|  |     "Polymer": true | ||||||
|  |   }, | ||||||
|  |   "env": { | ||||||
|  |     "browser": true, | ||||||
|  |     "es6": true | ||||||
|  |   }, | ||||||
|  |   "rules": { | ||||||
|  |     "class-methods-use-this": "off", | ||||||
|  |     "new-cap": "off", | ||||||
|  |     "prefer-template": "off", | ||||||
|  |     "object-shorthand": "off", | ||||||
|  |     "func-names": "off", | ||||||
|  |     "no-underscore-dangle": "off", | ||||||
|  |     "strict": "off", | ||||||
|  |     "no-plusplus": "off", | ||||||
|  |     "no-bitwise": "error", | ||||||
|  |     "comma-dangle": "off", | ||||||
|  |     "vars-on-top": "off", | ||||||
|  |     "no-continue": "off", | ||||||
|  |     "no-param-reassign": "off", | ||||||
|  |     "no-multi-assign": "off", | ||||||
|  |     "no-console": "error", | ||||||
|  |     "radix": "off", | ||||||
|  |     "no-alert": "off", | ||||||
|  |     "no-nested-ternary": "off", | ||||||
|  |     "prefer-destructuring": "off", | ||||||
|  |     "no-restricted-globals": [2, "event"], | ||||||
|  |     "prefer-promise-reject-errors": "off", | ||||||
|  |     "import/prefer-default-export": "off", | ||||||
|  |     "import/no-default-export": "off", | ||||||
|  |     "import/no-unresolved": "off", | ||||||
|  |     "import/no-cycle": "off", | ||||||
|  |     "import/extensions": [ | ||||||
|  |       "error", | ||||||
|  |       "ignorePackages", | ||||||
|  |       { | ||||||
|  |         "ts": "never", | ||||||
|  |         "js": "never" | ||||||
|  |       } | ||||||
|  |     ], | ||||||
|  |     "no-restricted-syntax": ["error", "LabeledStatement", "WithStatement"], | ||||||
|  |     "object-curly-newline": "off", | ||||||
|  |     "default-case": "off", | ||||||
|  |     "wc/no-self-class": "off", | ||||||
|  |     "no-shadow": "off", | ||||||
|  |     "@typescript-eslint/camelcase": "off", | ||||||
|  |     "@typescript-eslint/ban-ts-comment": "off", | ||||||
|  |     "@typescript-eslint/no-use-before-define": "off", | ||||||
|  |     "@typescript-eslint/no-non-null-assertion": "off", | ||||||
|  |     "@typescript-eslint/no-explicit-any": "off", | ||||||
|  |     "@typescript-eslint/explicit-function-return-type": "off", | ||||||
|  |     "@typescript-eslint/explicit-module-boundary-types": "off", | ||||||
|  |     "@typescript-eslint/no-shadow": ["error"], | ||||||
|  |     "@typescript-eslint/naming-convention": [ | ||||||
|  |       "off", | ||||||
|  |       { | ||||||
|  |         "selector": "default", | ||||||
|  |         "format": ["camelCase", "snake_case"], | ||||||
|  |         "leadingUnderscore": "allow", | ||||||
|  |         "trailingUnderscore": "allow" | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         "selector": ["variable"], | ||||||
|  |         "format": ["camelCase", "snake_case", "UPPER_CASE"], | ||||||
|  |         "leadingUnderscore": "allow", | ||||||
|  |         "trailingUnderscore": "allow" | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         "selector": "typeLike", | ||||||
|  |         "format": ["PascalCase"] | ||||||
|  |       } | ||||||
|  |     ], | ||||||
|  |     "@typescript-eslint/no-unused-vars": "off", | ||||||
|  |     "unused-imports/no-unused-vars": [ | ||||||
|  |       "error", | ||||||
|  |       { | ||||||
|  |         "vars": "all", | ||||||
|  |         "varsIgnorePattern": "^_", | ||||||
|  |         "args": "after-used", | ||||||
|  |         "argsIgnorePattern": "^_", | ||||||
|  |         "ignoreRestSiblings": true | ||||||
|  |       } | ||||||
|  |     ], | ||||||
|  |     "unused-imports/no-unused-imports": "error", | ||||||
|  |     "lit/attribute-names": "warn", | ||||||
|  |     "lit/attribute-value-entities": "off", | ||||||
|  |     "lit/no-template-map": "off", | ||||||
|  |     "lit/no-native-attributes": "warn", | ||||||
|  |     "lit/no-this-assign-in-render": "warn", | ||||||
|  |     "lit-a11y/click-events-have-key-events": ["off"], | ||||||
|  |     "lit-a11y/no-autofocus": "off", | ||||||
|  |     "lit-a11y/alt-text": "warn", | ||||||
|  |     "lit-a11y/anchor-is-valid": "warn", | ||||||
|  |     "lit-a11y/role-has-required-aria-attrs": "warn" | ||||||
|  |   }, | ||||||
|  |   "plugins": ["unused-imports"] | ||||||
|  | } | ||||||
							
								
								
									
										8
									
								
								.github/workflows/cast_deployment.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/cast_deployment.yaml
									
									
									
									
										vendored
									
									
								
							| @@ -21,12 +21,12 @@ jobs: | |||||||
|       url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }} |       url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }} | ||||||
|     steps: |     steps: | ||||||
|       - name: Check out files from GitHub |       - name: Check out files from GitHub | ||||||
|         uses: actions/checkout@v4.2.2 |         uses: actions/checkout@v4.2.1 | ||||||
|         with: |         with: | ||||||
|           ref: dev |           ref: dev | ||||||
|  |  | ||||||
|       - name: Setup Node |       - name: Setup Node | ||||||
|         uses: actions/setup-node@v4.1.0 |         uses: actions/setup-node@v4.0.4 | ||||||
|         with: |         with: | ||||||
|           node-version-file: ".nvmrc" |           node-version-file: ".nvmrc" | ||||||
|           cache: yarn |           cache: yarn | ||||||
| @@ -57,12 +57,12 @@ jobs: | |||||||
|       url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }} |       url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }} | ||||||
|     steps: |     steps: | ||||||
|       - name: Check out files from GitHub |       - name: Check out files from GitHub | ||||||
|         uses: actions/checkout@v4.2.2 |         uses: actions/checkout@v4.2.1 | ||||||
|         with: |         with: | ||||||
|           ref: master |           ref: master | ||||||
|  |  | ||||||
|       - name: Setup Node |       - name: Setup Node | ||||||
|         uses: actions/setup-node@v4.1.0 |         uses: actions/setup-node@v4.0.4 | ||||||
|         with: |         with: | ||||||
|           node-version-file: ".nvmrc" |           node-version-file: ".nvmrc" | ||||||
|           cache: yarn |           cache: yarn | ||||||
|   | |||||||
							
								
								
									
										52
									
								
								.github/workflows/ci.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										52
									
								
								.github/workflows/ci.yaml
									
									
									
									
										vendored
									
									
								
							| @@ -24,26 +24,20 @@ jobs: | |||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     steps: |     steps: | ||||||
|       - name: Check out files from GitHub |       - name: Check out files from GitHub | ||||||
|         uses: actions/checkout@v4.2.2 |         uses: actions/checkout@v4.2.1 | ||||||
|       - name: Setup Node |       - name: Setup Node | ||||||
|         id: setup-node |         uses: actions/setup-node@v4.0.4 | ||||||
|         uses: actions/setup-node@v4.1.0 |  | ||||||
|         with: |         with: | ||||||
|           node-version-file: ".nvmrc" |           node-version-file: ".nvmrc" | ||||||
|           cache: yarn |           cache: yarn | ||||||
|       - uses: actions/cache@v4.2.0 |  | ||||||
|         id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) |  | ||||||
|         with: |  | ||||||
|           path: "node_modules" |  | ||||||
|           key: ${{ runner.os }}-yarn-${{ hashFiles('.yarnrc.yml') }}-${{ steps.setup-node.outputs.node-version }}-${{ hashFiles('yarn.lock') }} |  | ||||||
|           restore-keys: ${{ runner.os }}-yarn-${{ hashFiles('.yarnrc.yml') }}-${{ steps.setup-node.outputs.node-version }} |  | ||||||
|       - name: Install dependencies |       - name: Install dependencies | ||||||
|         if: steps.yarn-cache.outputs.cache-hit != 'true' |  | ||||||
|         run: yarn install --immutable |         run: yarn install --immutable | ||||||
|  |       - name: Check for duplicate dependencies | ||||||
|  |         run: yarn dedupe --check | ||||||
|       - name: Build resources |       - name: Build resources | ||||||
|         run: ./node_modules/.bin/gulp gen-icons-json build-translations build-locale-data gather-gallery-pages |         run: ./node_modules/.bin/gulp gen-icons-json build-translations build-locale-data gather-gallery-pages | ||||||
|       - name: Setup lint cache |       - name: Setup lint cache | ||||||
|         uses: actions/cache@v4.2.0 |         uses: actions/cache@v4.1.1 | ||||||
|         with: |         with: | ||||||
|           path: | |           path: | | ||||||
|             node_modules/.cache/prettier |             node_modules/.cache/prettier | ||||||
| @@ -64,21 +58,13 @@ jobs: | |||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     steps: |     steps: | ||||||
|       - name: Check out files from GitHub |       - name: Check out files from GitHub | ||||||
|         uses: actions/checkout@v4.2.2 |         uses: actions/checkout@v4.2.1 | ||||||
|       - name: Setup Node |       - name: Setup Node | ||||||
|         id: setup-node |         uses: actions/setup-node@v4.0.4 | ||||||
|         uses: actions/setup-node@v4.1.0 |  | ||||||
|         with: |         with: | ||||||
|           node-version-file: ".nvmrc" |           node-version-file: ".nvmrc" | ||||||
|           cache: yarn |           cache: yarn | ||||||
|       - uses: actions/cache@v4.2.0 |  | ||||||
|         id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) |  | ||||||
|         with: |  | ||||||
|           path: "node_modules" |  | ||||||
|           key: ${{ runner.os }}-yarn-${{ hashFiles('.yarnrc.yml') }}-${{ steps.setup-node.outputs.node-version }}-${{ hashFiles('yarn.lock') }} |  | ||||||
|           restore-keys: ${{ runner.os }}-yarn-${{ hashFiles('.yarnrc.yml') }}-${{ steps.setup-node.outputs.node-version }} |  | ||||||
|       - name: Install dependencies |       - name: Install dependencies | ||||||
|         if: steps.yarn-cache.outputs.cache-hit != 'true' |  | ||||||
|         run: yarn install --immutable |         run: yarn install --immutable | ||||||
|       - name: Build resources |       - name: Build resources | ||||||
|         run: ./node_modules/.bin/gulp gen-icons-json build-translations build-locale-data |         run: ./node_modules/.bin/gulp gen-icons-json build-translations build-locale-data | ||||||
| @@ -90,21 +76,13 @@ jobs: | |||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     steps: |     steps: | ||||||
|       - name: Check out files from GitHub |       - name: Check out files from GitHub | ||||||
|         uses: actions/checkout@v4.2.2 |         uses: actions/checkout@v4.2.1 | ||||||
|       - name: Setup Node |       - name: Setup Node | ||||||
|         id: setup-node |         uses: actions/setup-node@v4.0.4 | ||||||
|         uses: actions/setup-node@v4.1.0 |  | ||||||
|         with: |         with: | ||||||
|           node-version-file: ".nvmrc" |           node-version-file: ".nvmrc" | ||||||
|           cache: yarn |           cache: yarn | ||||||
|       - uses: actions/cache@v4.2.0 |  | ||||||
|         id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) |  | ||||||
|         with: |  | ||||||
|           path: "node_modules" |  | ||||||
|           key: ${{ runner.os }}-yarn-${{ hashFiles('.yarnrc.yml') }}-${{ steps.setup-node.outputs.node-version }}-${{ hashFiles('yarn.lock') }} |  | ||||||
|           restore-keys: ${{ runner.os }}-yarn-${{ hashFiles('.yarnrc.yml') }}-${{ steps.setup-node.outputs.node-version }} |  | ||||||
|       - name: Install dependencies |       - name: Install dependencies | ||||||
|         if: steps.yarn-cache.outputs.cache-hit != 'true' |  | ||||||
|         run: yarn install --immutable |         run: yarn install --immutable | ||||||
|       - name: Build Application |       - name: Build Application | ||||||
|         run: ./node_modules/.bin/gulp build-app |         run: ./node_modules/.bin/gulp build-app | ||||||
| @@ -122,21 +100,13 @@ jobs: | |||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     steps: |     steps: | ||||||
|       - name: Check out files from GitHub |       - name: Check out files from GitHub | ||||||
|         uses: actions/checkout@v4.2.2 |         uses: actions/checkout@v4.2.1 | ||||||
|       - name: Setup Node |       - name: Setup Node | ||||||
|         id: setup-node |         uses: actions/setup-node@v4.0.4 | ||||||
|         uses: actions/setup-node@v4.1.0 |  | ||||||
|         with: |         with: | ||||||
|           node-version-file: ".nvmrc" |           node-version-file: ".nvmrc" | ||||||
|           cache: yarn |           cache: yarn | ||||||
|       - uses: actions/cache@v4.2.0 |  | ||||||
|         id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) |  | ||||||
|         with: |  | ||||||
|           path: "node_modules" |  | ||||||
|           key: ${{ runner.os }}-yarn-${{ hashFiles('.yarnrc.yml') }}-${{ steps.setup-node.outputs.node-version }}-${{ hashFiles('yarn.lock') }} |  | ||||||
|           restore-keys: ${{ runner.os }}-yarn-${{ hashFiles('.yarnrc.yml') }}-${{ steps.setup-node.outputs.node-version }} |  | ||||||
|       - name: Install dependencies |       - name: Install dependencies | ||||||
|         if: steps.yarn-cache.outputs.cache-hit != 'true' |  | ||||||
|         run: yarn install --immutable |         run: yarn install --immutable | ||||||
|       - name: Build Application |       - name: Build Application | ||||||
|         run: ./node_modules/.bin/gulp build-hassio |         run: ./node_modules/.bin/gulp build-hassio | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								.github/workflows/codeql-analysis.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/codeql-analysis.yml
									
									
									
									
										vendored
									
									
								
							| @@ -23,7 +23,7 @@ jobs: | |||||||
|  |  | ||||||
|     steps: |     steps: | ||||||
|       - name: Checkout repository |       - name: Checkout repository | ||||||
|         uses: actions/checkout@v4.2.2 |         uses: actions/checkout@v4.2.1 | ||||||
|         with: |         with: | ||||||
|           # We must fetch at least the immediate parents so that if this is |           # We must fetch at least the immediate parents so that if this is | ||||||
|           # a pull request then we can checkout the head. |           # a pull request then we can checkout the head. | ||||||
|   | |||||||
							
								
								
									
										8
									
								
								.github/workflows/demo_deployment.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/demo_deployment.yaml
									
									
									
									
										vendored
									
									
								
							| @@ -22,12 +22,12 @@ jobs: | |||||||
|       url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }} |       url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }} | ||||||
|     steps: |     steps: | ||||||
|       - name: Check out files from GitHub |       - name: Check out files from GitHub | ||||||
|         uses: actions/checkout@v4.2.2 |         uses: actions/checkout@v4.2.1 | ||||||
|         with: |         with: | ||||||
|           ref: dev |           ref: dev | ||||||
|  |  | ||||||
|       - name: Setup Node |       - name: Setup Node | ||||||
|         uses: actions/setup-node@v4.1.0 |         uses: actions/setup-node@v4.0.4 | ||||||
|         with: |         with: | ||||||
|           node-version-file: ".nvmrc" |           node-version-file: ".nvmrc" | ||||||
|           cache: yarn |           cache: yarn | ||||||
| @@ -58,12 +58,12 @@ jobs: | |||||||
|       url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }} |       url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }} | ||||||
|     steps: |     steps: | ||||||
|       - name: Check out files from GitHub |       - name: Check out files from GitHub | ||||||
|         uses: actions/checkout@v4.2.2 |         uses: actions/checkout@v4.2.1 | ||||||
|         with: |         with: | ||||||
|           ref: master |           ref: master | ||||||
|  |  | ||||||
|       - name: Setup Node |       - name: Setup Node | ||||||
|         uses: actions/setup-node@v4.1.0 |         uses: actions/setup-node@v4.0.4 | ||||||
|         with: |         with: | ||||||
|           node-version-file: ".nvmrc" |           node-version-file: ".nvmrc" | ||||||
|           cache: yarn |           cache: yarn | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								.github/workflows/design_deployment.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/design_deployment.yaml
									
									
									
									
										vendored
									
									
								
							| @@ -16,10 +16,10 @@ jobs: | |||||||
|       url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }} |       url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }} | ||||||
|     steps: |     steps: | ||||||
|       - name: Check out files from GitHub |       - name: Check out files from GitHub | ||||||
|         uses: actions/checkout@v4.2.2 |         uses: actions/checkout@v4.2.1 | ||||||
|  |  | ||||||
|       - name: Setup Node |       - name: Setup Node | ||||||
|         uses: actions/setup-node@v4.1.0 |         uses: actions/setup-node@v4.0.4 | ||||||
|         with: |         with: | ||||||
|           node-version-file: ".nvmrc" |           node-version-file: ".nvmrc" | ||||||
|           cache: yarn |           cache: yarn | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								.github/workflows/design_preview.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/design_preview.yaml
									
									
									
									
										vendored
									
									
								
							| @@ -21,10 +21,10 @@ jobs: | |||||||
|     if: github.repository == 'home-assistant/frontend' && contains(github.event.pull_request.labels.*.name, 'needs design preview') |     if: github.repository == 'home-assistant/frontend' && contains(github.event.pull_request.labels.*.name, 'needs design preview') | ||||||
|     steps: |     steps: | ||||||
|       - name: Check out files from GitHub |       - name: Check out files from GitHub | ||||||
|         uses: actions/checkout@v4.2.2 |         uses: actions/checkout@v4.2.1 | ||||||
|  |  | ||||||
|       - name: Setup Node |       - name: Setup Node | ||||||
|         uses: actions/setup-node@v4.1.0 |         uses: actions/setup-node@v4.0.4 | ||||||
|         with: |         with: | ||||||
|           node-version-file: ".nvmrc" |           node-version-file: ".nvmrc" | ||||||
|           cache: yarn |           cache: yarn | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								.github/workflows/nightly.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/nightly.yaml
									
									
									
									
										vendored
									
									
								
							| @@ -20,7 +20,7 @@ jobs: | |||||||
|       contents: write |       contents: write | ||||||
|     steps: |     steps: | ||||||
|       - name: Checkout the repository |       - name: Checkout the repository | ||||||
|         uses: actions/checkout@v4.2.2 |         uses: actions/checkout@v4.2.1 | ||||||
|  |  | ||||||
|       - name: Set up Python ${{ env.PYTHON_VERSION }} |       - name: Set up Python ${{ env.PYTHON_VERSION }} | ||||||
|         uses: actions/setup-python@v5 |         uses: actions/setup-python@v5 | ||||||
| @@ -28,7 +28,7 @@ jobs: | |||||||
|           python-version: ${{ env.PYTHON_VERSION }} |           python-version: ${{ env.PYTHON_VERSION }} | ||||||
|  |  | ||||||
|       - name: Setup Node |       - name: Setup Node | ||||||
|         uses: actions/setup-node@v4.1.0 |         uses: actions/setup-node@v4.0.4 | ||||||
|         with: |         with: | ||||||
|           node-version-file: ".nvmrc" |           node-version-file: ".nvmrc" | ||||||
|           cache: yarn |           cache: yarn | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								.github/workflows/relative-ci.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/relative-ci.yaml
									
									
									
									
										vendored
									
									
								
							| @@ -17,7 +17,7 @@ jobs: | |||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     steps: |     steps: | ||||||
|       - name: Send bundle stats and build information to RelativeCI |       - name: Send bundle stats and build information to RelativeCI | ||||||
|         uses: relative-ci/agent-action@v2.1.14 |         uses: relative-ci/agent-action@v2.1.12 | ||||||
|         with: |         with: | ||||||
|           key: ${{ secrets[format('RELATIVE_CI_KEY_{0}_{1}', matrix.bundle, matrix.build)] }} |           key: ${{ secrets[format('RELATIVE_CI_KEY_{0}_{1}', matrix.bundle, matrix.build)] }} | ||||||
|           token: ${{ github.token }} |           token: ${{ github.token }} | ||||||
|   | |||||||
							
								
								
									
										66
									
								
								.github/workflows/release.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										66
									
								
								.github/workflows/release.yaml
									
									
									
									
										vendored
									
									
								
							| @@ -23,7 +23,7 @@ jobs: | |||||||
|       contents: write # Required to upload release assets |       contents: write # Required to upload release assets | ||||||
|     steps: |     steps: | ||||||
|       - name: Checkout the repository |       - name: Checkout the repository | ||||||
|         uses: actions/checkout@v4.2.2 |         uses: actions/checkout@v4.2.1 | ||||||
|  |  | ||||||
|       - name: Verify version |       - name: Verify version | ||||||
|         uses: home-assistant/actions/helpers/verify-version@master |         uses: home-assistant/actions/helpers/verify-version@master | ||||||
| @@ -34,7 +34,7 @@ jobs: | |||||||
|           python-version: ${{ env.PYTHON_VERSION }} |           python-version: ${{ env.PYTHON_VERSION }} | ||||||
|  |  | ||||||
|       - name: Setup Node |       - name: Setup Node | ||||||
|         uses: actions/setup-node@v4.1.0 |         uses: actions/setup-node@v4.0.4 | ||||||
|         with: |         with: | ||||||
|           node-version-file: ".nvmrc" |           node-version-file: ".nvmrc" | ||||||
|           cache: yarn |           cache: yarn | ||||||
| @@ -55,7 +55,7 @@ jobs: | |||||||
|           script/release |           script/release | ||||||
|  |  | ||||||
|       - name: Upload release assets |       - name: Upload release assets | ||||||
|         uses: softprops/action-gh-release@v2.1.0 |         uses: softprops/action-gh-release@v2.0.8 | ||||||
|         with: |         with: | ||||||
|           files: | |           files: | | ||||||
|             dist/*.whl |             dist/*.whl | ||||||
| @@ -74,68 +74,10 @@ jobs: | |||||||
|           echo "home-assistant-frontend==$version" > ./requirements.txt |           echo "home-assistant-frontend==$version" > ./requirements.txt | ||||||
|  |  | ||||||
|       - name: Build wheels |       - name: Build wheels | ||||||
|         uses: home-assistant/wheels@2024.11.0 |         uses: home-assistant/wheels@2024.07.1 | ||||||
|         with: |         with: | ||||||
|           abi: cp312 |           abi: cp312 | ||||||
|           tag: musllinux_1_2 |           tag: musllinux_1_2 | ||||||
|           arch: amd64 |           arch: amd64 | ||||||
|           wheels-key: ${{ secrets.WHEELS_KEY }} |           wheels-key: ${{ secrets.WHEELS_KEY }} | ||||||
|           requirements: "requirements.txt" |           requirements: "requirements.txt" | ||||||
|  |  | ||||||
|   release-landing-page: |  | ||||||
|     name: Release landing-page frontend |  | ||||||
|     if: github.event.release.prerelease == false |  | ||||||
|     runs-on: ubuntu-latest |  | ||||||
|     permissions: |  | ||||||
|       contents: write # Required to upload release assets |  | ||||||
|     steps: |  | ||||||
|       - name: Checkout the repository |  | ||||||
|         uses: actions/checkout@v4.2.2 |  | ||||||
|       - name: Setup Node |  | ||||||
|         uses: actions/setup-node@v4.1.0 |  | ||||||
|         with: |  | ||||||
|           node-version-file: ".nvmrc" |  | ||||||
|           cache: yarn |  | ||||||
|       - name: Install dependencies |  | ||||||
|         run: yarn install |  | ||||||
|       - name: Download Translations |  | ||||||
|         run: ./script/translations_download |  | ||||||
|         env: |  | ||||||
|           LOKALISE_TOKEN: ${{ secrets.LOKALISE_TOKEN }} |  | ||||||
|       - name: Build landing-page |  | ||||||
|         run: landing-page/script/build_landing_page |  | ||||||
|       - name: Tar folder |  | ||||||
|         run: tar -czf landing-page/home_assistant_frontend_landingpage-${{ github.event.release.tag_name }}.tar.gz -C landing-page/dist . |  | ||||||
|       - name: Upload release asset |  | ||||||
|         uses: softprops/action-gh-release@v2.1.0 |  | ||||||
|         with: |  | ||||||
|           files: landing-page/home_assistant_frontend_landingpage-${{ github.event.release.tag_name }}.tar.gz |  | ||||||
|  |  | ||||||
|   release-supervisor: |  | ||||||
|     name: Release supervisor frontend |  | ||||||
|     if: github.event.release.prerelease == false |  | ||||||
|     runs-on: ubuntu-latest |  | ||||||
|     permissions: |  | ||||||
|       contents: write # Required to upload release assets |  | ||||||
|     steps: |  | ||||||
|       - name: Checkout the repository |  | ||||||
|         uses: actions/checkout@v4.2.2 |  | ||||||
|       - name: Setup Node |  | ||||||
|         uses: actions/setup-node@v4.1.0 |  | ||||||
|         with: |  | ||||||
|           node-version-file: ".nvmrc" |  | ||||||
|           cache: yarn |  | ||||||
|       - name: Install dependencies |  | ||||||
|         run: yarn install |  | ||||||
|       - name: Download Translations |  | ||||||
|         run: ./script/translations_download |  | ||||||
|         env: |  | ||||||
|           LOKALISE_TOKEN: ${{ secrets.LOKALISE_TOKEN }} |  | ||||||
|       - name: Build supervisor |  | ||||||
|         run: hassio/script/build_hassio |  | ||||||
|       - name: Tar folder |  | ||||||
|         run: tar -czf hassio/home_assistant_frontend_supervisor-${{ github.event.release.tag_name }}.tar.gz -C hassio/build . |  | ||||||
|       - name: Upload release asset |  | ||||||
|         uses: softprops/action-gh-release@v2.1.0 |  | ||||||
|         with: |  | ||||||
|           files: hassio/home_assistant_frontend_supervisor-${{ github.event.release.tag_name }}.tar.gz |  | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								.github/workflows/translations.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/translations.yaml
									
									
									
									
										vendored
									
									
								
							| @@ -13,7 +13,7 @@ jobs: | |||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     steps: |     steps: | ||||||
|       - name: Checkout the repository |       - name: Checkout the repository | ||||||
|         uses: actions/checkout@v4.2.2 |         uses: actions/checkout@v4.2.1 | ||||||
|  |  | ||||||
|       - name: Upload Translations |       - name: Upload Translations | ||||||
|         run: | |         run: | | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -50,6 +50,3 @@ src/cast/dev_const.ts | |||||||
|  |  | ||||||
| # Jetbrains | # Jetbrains | ||||||
| /.idea/ | /.idea/ | ||||||
|  |  | ||||||
| # test coverage |  | ||||||
| test/coverage/ |  | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								.vscode/extensions.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.vscode/extensions.json
									
									
									
									
										vendored
									
									
								
							| @@ -4,7 +4,6 @@ | |||||||
|     "esbenp.prettier-vscode", |     "esbenp.prettier-vscode", | ||||||
|     "runem.lit-plugin", |     "runem.lit-plugin", | ||||||
|     "github.vscode-pull-request-github", |     "github.vscode-pull-request-github", | ||||||
|     "eamodio.gitlens", |     "eamodio.gitlens" | ||||||
|     "vitest.explorer" |  | ||||||
|   ] |   ] | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										32
									
								
								.vscode/tasks.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										32
									
								
								.vscode/tasks.json
									
									
									
									
										vendored
									
									
								
							| @@ -100,38 +100,6 @@ | |||||||
|         "instanceLimit": 1 |         "instanceLimit": 1 | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     { |  | ||||||
|       "label": "Develop Landing Page", |  | ||||||
|       "type": "gulp", |  | ||||||
|       "task": "develop-landing-page", |  | ||||||
|       "problemMatcher": { |  | ||||||
|         "owner": "ha-build", |  | ||||||
|         "source": "ha-build", |  | ||||||
|         "fileLocation": "absolute", |  | ||||||
|         "severity": "error", |  | ||||||
|         "pattern": [ |  | ||||||
|           { |  | ||||||
|             "regexp": "(SyntaxError): (.+): (.+) \\((\\d+):(\\d+)\\)", |  | ||||||
|             "severity": 1, |  | ||||||
|             "file": 2, |  | ||||||
|             "message": 3, |  | ||||||
|             "line": 4, |  | ||||||
|             "column": 5 |  | ||||||
|           } |  | ||||||
|         ], |  | ||||||
|         "background": { |  | ||||||
|           "activeOnStart": true, |  | ||||||
|           "beginsPattern": "Changes detected. Starting compilation", |  | ||||||
|           "endsPattern": "Build done @" |  | ||||||
|         } |  | ||||||
|       }, |  | ||||||
|  |  | ||||||
|       "isBackground": true, |  | ||||||
|       "group": "build", |  | ||||||
|       "runOptions": { |  | ||||||
|         "instanceLimit": 1 |  | ||||||
|       } |  | ||||||
|     }, |  | ||||||
|     { |     { | ||||||
|       "label": "Develop Demo", |       "label": "Develop Demo", | ||||||
|       "type": "gulp", |       "type": "gulp", | ||||||
|   | |||||||
							
								
								
									
										925
									
								
								.yarn/releases/yarn-4.5.0.cjs
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										925
									
								
								.yarn/releases/yarn-4.5.0.cjs
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										934
									
								
								.yarn/releases/yarn-4.5.3.cjs
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										934
									
								
								.yarn/releases/yarn-4.5.3.cjs
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @@ -6,4 +6,4 @@ enableGlobalCache: false | |||||||
|  |  | ||||||
| nodeLinker: node-modules | nodeLinker: node-modules | ||||||
|  |  | ||||||
| yarnPath: .yarn/releases/yarn-4.5.3.cjs | yarnPath: .yarn/releases/yarn-4.5.0.cjs | ||||||
|   | |||||||
							
								
								
									
										12
									
								
								build-scripts/.eslintrc.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								build-scripts/.eslintrc.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | |||||||
|  | { | ||||||
|  |   "extends": "../.eslintrc.json", | ||||||
|  |   "rules": { | ||||||
|  |     "no-console": "off", | ||||||
|  |     "import/no-extraneous-dependencies": "off", | ||||||
|  |     "import/extensions": "off", | ||||||
|  |     "import/no-dynamic-require": "off", | ||||||
|  |     "global-require": "off", | ||||||
|  |     "@typescript-eslint/no-var-requires": "off", | ||||||
|  |     "prefer-arrow-callback": "off" | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -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. | 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. Both of these programs bundle the converted files in both production and development. | We currently rely on Webpack but also have experimental Rollup support. 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. | For development, bundling is optional. We just want to get the right files in the browser. | ||||||
|  |  | ||||||
|   | |||||||
| @@ -147,7 +147,6 @@ const polyfillMap = { | |||||||
|       ...Object.fromEntries( |       ...Object.fromEntries( | ||||||
|         [ |         [ | ||||||
|           "DateTimeFormat", |           "DateTimeFormat", | ||||||
|           "DurationFormat", |  | ||||||
|           "DisplayNames", |           "DisplayNames", | ||||||
|           "ListFormat", |           "ListFormat", | ||||||
|           "NumberFormat", |           "NumberFormat", | ||||||
|   | |||||||
| @@ -53,11 +53,6 @@ module.exports.definedVars = ({ isProdBuild, latestBuild, defineOverlay }) => ({ | |||||||
|   __SUPERVISOR__: false, |   __SUPERVISOR__: false, | ||||||
|   __BACKWARDS_COMPAT__: false, |   __BACKWARDS_COMPAT__: false, | ||||||
|   __STATIC_PATH__: "/static/", |   __STATIC_PATH__: "/static/", | ||||||
|   __HASS_URL__: `\`${ |  | ||||||
|     "HASS_URL" in process.env |  | ||||||
|       ? process.env["HASS_URL"] |  | ||||||
|       : "${location.protocol}//${location.host}" |  | ||||||
|   }\``, |  | ||||||
|   "process.env.NODE_ENV": JSON.stringify( |   "process.env.NODE_ENV": JSON.stringify( | ||||||
|     isProdBuild ? "production" : "development" |     isProdBuild ? "production" : "development" | ||||||
|   ), |   ), | ||||||
| @@ -157,6 +152,7 @@ module.exports.babelOptions = ({ | |||||||
|   exclude: [ |   exclude: [ | ||||||
|     // \\ for Windows, / for Mac OS and Linux |     // \\ for Windows, / for Mac OS and Linux | ||||||
|     /node_modules[\\/]core-js/, |     /node_modules[\\/]core-js/, | ||||||
|  |     /node_modules[\\/]webpack[\\/]buildin/, | ||||||
|   ], |   ], | ||||||
|   sourceMaps: !isTestBuild, |   sourceMaps: !isTestBuild, | ||||||
|   overrides: [ |   overrides: [ | ||||||
| @@ -230,7 +226,8 @@ module.exports.config = { | |||||||
|     return { |     return { | ||||||
|       name: "frontend" + nameSuffix(latestBuild), |       name: "frontend" + nameSuffix(latestBuild), | ||||||
|       entry: { |       entry: { | ||||||
|         "service-worker": !latestBuild |         "service-worker": | ||||||
|  |           !env.useRollup() && !latestBuild | ||||||
|             ? { |             ? { | ||||||
|                 import: "./src/entrypoints/service-worker.ts", |                 import: "./src/entrypoints/service-worker.ts", | ||||||
|                 layer: "sw", |                 layer: "sw", | ||||||
| @@ -331,17 +328,4 @@ module.exports.config = { | |||||||
|       }, |       }, | ||||||
|     }; |     }; | ||||||
|   }, |   }, | ||||||
|  |  | ||||||
|   landingPage({ isProdBuild, latestBuild }) { |  | ||||||
|     return { |  | ||||||
|       name: "landing-page" + nameSuffix(latestBuild), |  | ||||||
|       entry: { |  | ||||||
|         entrypoint: path.resolve(paths.landingPage_dir, "src/entrypoint.js"), |  | ||||||
|       }, |  | ||||||
|       outputPath: outputPath(paths.landingPage_output_root, latestBuild), |  | ||||||
|       publicPath: publicPath(latestBuild), |  | ||||||
|       isProdBuild, |  | ||||||
|       latestBuild, |  | ||||||
|     }; |  | ||||||
|   }, |  | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -2,22 +2,26 @@ const fs = require("fs"); | |||||||
| const path = require("path"); | const path = require("path"); | ||||||
| const paths = require("./paths.cjs"); | const paths = require("./paths.cjs"); | ||||||
|  |  | ||||||
| const isTrue = (value) => value === "1" || value?.toLowerCase() === "true"; |  | ||||||
|  |  | ||||||
| module.exports = { | module.exports = { | ||||||
|  |   useRollup() { | ||||||
|  |     return process.env.ROLLUP === "1"; | ||||||
|  |   }, | ||||||
|  |   useWDS() { | ||||||
|  |     return process.env.WDS === "1"; | ||||||
|  |   }, | ||||||
|   isProdBuild() { |   isProdBuild() { | ||||||
|     return ( |     return ( | ||||||
|       process.env.NODE_ENV === "production" || module.exports.isStatsBuild() |       process.env.NODE_ENV === "production" || module.exports.isStatsBuild() | ||||||
|     ); |     ); | ||||||
|   }, |   }, | ||||||
|   isStatsBuild() { |   isStatsBuild() { | ||||||
|     return isTrue(process.env.STATS); |     return process.env.STATS === "1"; | ||||||
|   }, |   }, | ||||||
|   isTestBuild() { |   isTestBuild() { | ||||||
|     return isTrue(process.env.IS_TEST); |     return process.env.IS_TEST === "true"; | ||||||
|   }, |   }, | ||||||
|   isNetlify() { |   isNetlify() { | ||||||
|     return isTrue(process.env.NETLIFY); |     return process.env.NETLIFY === "true"; | ||||||
|   }, |   }, | ||||||
|   version() { |   version() { | ||||||
|     const version = fs |     const version = fs | ||||||
| @@ -29,6 +33,6 @@ module.exports = { | |||||||
|     return version[1]; |     return version[1]; | ||||||
|   }, |   }, | ||||||
|   isDevContainer() { |   isDevContainer() { | ||||||
|     return isTrue(process.env.DEV_CONTAINER); |     return process.env.DEV_CONTAINER === "1"; | ||||||
|   }, |   }, | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -1,16 +0,0 @@ | |||||||
| import rootConfig from "../eslint.config.mjs"; |  | ||||||
|  |  | ||||||
| export default [ |  | ||||||
|   ...rootConfig, |  | ||||||
|   { |  | ||||||
|     rules: { |  | ||||||
|       "no-console": "off", |  | ||||||
|       "import/no-extraneous-dependencies": "off", |  | ||||||
|       "import/extensions": "off", |  | ||||||
|       "import/no-dynamic-require": "off", |  | ||||||
|       "global-require": "off", |  | ||||||
|       "@typescript-eslint/no-var-requires": "off", |  | ||||||
|       "prefer-arrow-callback": "off", |  | ||||||
|     }, |  | ||||||
|   }, |  | ||||||
| ]; |  | ||||||
| @@ -6,9 +6,11 @@ import "./entry-html.js"; | |||||||
| import "./gather-static.js"; | import "./gather-static.js"; | ||||||
| import "./gen-icons-json.js"; | import "./gen-icons-json.js"; | ||||||
| import "./locale-data.js"; | import "./locale-data.js"; | ||||||
|  | import "./rollup.js"; | ||||||
| import "./service-worker.js"; | import "./service-worker.js"; | ||||||
| import "./translations.js"; | import "./translations.js"; | ||||||
| import "./rspack.js"; | import "./wds.js"; | ||||||
|  | import "./webpack.js"; | ||||||
|  |  | ||||||
| gulp.task( | gulp.task( | ||||||
|   "develop-app", |   "develop-app", | ||||||
| @@ -25,7 +27,11 @@ gulp.task( | |||||||
|       "build-locale-data" |       "build-locale-data" | ||||||
|     ), |     ), | ||||||
|     "copy-static-app", |     "copy-static-app", | ||||||
|     "rspack-watch-app" |     env.useWDS() | ||||||
|  |       ? "wds-watch-app" | ||||||
|  |       : env.useRollup() | ||||||
|  |         ? "rollup-watch-app" | ||||||
|  |         : "webpack-watch-app" | ||||||
|   ) |   ) | ||||||
| ); | ); | ||||||
|  |  | ||||||
| @@ -38,20 +44,9 @@ gulp.task( | |||||||
|     "clean", |     "clean", | ||||||
|     gulp.parallel("gen-icons-json", "build-translations", "build-locale-data"), |     gulp.parallel("gen-icons-json", "build-translations", "build-locale-data"), | ||||||
|     "copy-static-app", |     "copy-static-app", | ||||||
|     "rspack-prod-app", |     env.useRollup() ? "rollup-prod-app" : "webpack-prod-app", | ||||||
|     gulp.parallel("gen-pages-app-prod", "gen-service-worker-app-prod"), |     gulp.parallel("gen-pages-app-prod", "gen-service-worker-app-prod"), | ||||||
|     // Don't compress running tests |     // Don't compress running tests | ||||||
|     ...(env.isTestBuild() || env.isStatsBuild() ? [] : ["compress-app"]) |     ...(env.isTestBuild() ? [] : ["compress-app"]) | ||||||
|   ) |  | ||||||
| ); |  | ||||||
|  |  | ||||||
| gulp.task( |  | ||||||
|   "analyze-app", |  | ||||||
|   gulp.series( |  | ||||||
|     async function setEnv() { |  | ||||||
|       process.env.STATS = "1"; |  | ||||||
|     }, |  | ||||||
|     "clean", |  | ||||||
|     "rspack-prod-app" |  | ||||||
|   ) |   ) | ||||||
| ); | ); | ||||||
|   | |||||||
| @@ -1,10 +1,12 @@ | |||||||
| import gulp from "gulp"; | import gulp from "gulp"; | ||||||
|  | import env from "../env.cjs"; | ||||||
| import "./clean.js"; | import "./clean.js"; | ||||||
| import "./entry-html.js"; | import "./entry-html.js"; | ||||||
| import "./gather-static.js"; | import "./gather-static.js"; | ||||||
|  | import "./rollup.js"; | ||||||
| import "./service-worker.js"; | import "./service-worker.js"; | ||||||
| import "./translations.js"; | import "./translations.js"; | ||||||
| import "./rspack.js"; | import "./webpack.js"; | ||||||
|  |  | ||||||
| gulp.task( | gulp.task( | ||||||
|   "develop-cast", |   "develop-cast", | ||||||
| @@ -17,7 +19,7 @@ gulp.task( | |||||||
|     gulp.parallel("gen-icons-json", "build-translations", "build-locale-data"), |     gulp.parallel("gen-icons-json", "build-translations", "build-locale-data"), | ||||||
|     "copy-static-cast", |     "copy-static-cast", | ||||||
|     "gen-pages-cast-dev", |     "gen-pages-cast-dev", | ||||||
|     "rspack-dev-server-cast" |     env.useRollup() ? "rollup-dev-server-cast" : "webpack-dev-server-cast" | ||||||
|   ) |   ) | ||||||
| ); | ); | ||||||
|  |  | ||||||
| @@ -31,7 +33,7 @@ gulp.task( | |||||||
|     "translations-enable-merge-backend", |     "translations-enable-merge-backend", | ||||||
|     gulp.parallel("gen-icons-json", "build-translations", "build-locale-data"), |     gulp.parallel("gen-icons-json", "build-translations", "build-locale-data"), | ||||||
|     "copy-static-cast", |     "copy-static-cast", | ||||||
|     "rspack-prod-cast", |     env.useRollup() ? "rollup-prod-cast" : "webpack-prod-cast", | ||||||
|     "gen-pages-cast-prod" |     "gen-pages-cast-prod" | ||||||
|   ) |   ) | ||||||
| ); | ); | ||||||
|   | |||||||
| @@ -38,14 +38,3 @@ gulp.task( | |||||||
|     ]) |     ]) | ||||||
|   ) |   ) | ||||||
| ); | ); | ||||||
|  |  | ||||||
| gulp.task( |  | ||||||
|   "clean-landing-page", |  | ||||||
|   gulp.parallel("clean-translations", async () => |  | ||||||
|     deleteSync([ |  | ||||||
|       paths.landingPage_output_root, |  | ||||||
|       paths.landingPage_build, |  | ||||||
|       paths.build_dir, |  | ||||||
|     ]) |  | ||||||
|   ) |  | ||||||
| ); |  | ||||||
|   | |||||||
| @@ -3,6 +3,7 @@ | |||||||
| import { constants } from "node:zlib"; | import { constants } from "node:zlib"; | ||||||
| import gulp from "gulp"; | import gulp from "gulp"; | ||||||
| import brotli from "gulp-brotli"; | import brotli from "gulp-brotli"; | ||||||
|  | import zopfli from "gulp-zopfli-green"; | ||||||
| import paths from "../paths.cjs"; | import paths from "../paths.cjs"; | ||||||
|  |  | ||||||
| const filesGlob = "*.{js,json,css,svg,xml}"; | const filesGlob = "*.{js,json,css,svg,xml}"; | ||||||
| @@ -12,6 +13,7 @@ const brotliOptions = { | |||||||
|     [constants.BROTLI_PARAM_QUALITY]: constants.BROTLI_MAX_QUALITY, |     [constants.BROTLI_PARAM_QUALITY]: constants.BROTLI_MAX_QUALITY, | ||||||
|   }, |   }, | ||||||
| }; | }; | ||||||
|  | const zopfliOptions = { threshold: 150 }; | ||||||
|  |  | ||||||
| const compressDistBrotli = (rootDir, modernDir, compressServiceWorker = true) => | const compressDistBrotli = (rootDir, modernDir, compressServiceWorker = true) => | ||||||
|   gulp |   gulp | ||||||
| @@ -27,6 +29,20 @@ const compressDistBrotli = (rootDir, modernDir, compressServiceWorker = true) => | |||||||
|     .pipe(brotli(brotliOptions)) |     .pipe(brotli(brotliOptions)) | ||||||
|     .pipe(gulp.dest(rootDir)); |     .pipe(gulp.dest(rootDir)); | ||||||
|  |  | ||||||
|  | const compressDistZopfli = (rootDir, modernDir, compressModern = false) => | ||||||
|  |   gulp | ||||||
|  |     .src( | ||||||
|  |       [ | ||||||
|  |         `${rootDir}/**/${filesGlob}`, | ||||||
|  |         compressModern ? undefined : `!${modernDir}/**/${filesGlob}`, | ||||||
|  |         `!${rootDir}/{sw-modern,service_worker}.js`, | ||||||
|  |         `${rootDir}/{authorize,onboarding}.html`, | ||||||
|  |       ].filter(Boolean), | ||||||
|  |       { base: rootDir } | ||||||
|  |     ) | ||||||
|  |     .pipe(zopfli(zopfliOptions)) | ||||||
|  |     .pipe(gulp.dest(rootDir)); | ||||||
|  |  | ||||||
| const compressAppBrotli = () => | const compressAppBrotli = () => | ||||||
|   compressDistBrotli(paths.app_output_root, paths.app_output_latest); |   compressDistBrotli(paths.app_output_root, paths.app_output_latest); | ||||||
| const compressHassioBrotli = () => | const compressHassioBrotli = () => | ||||||
| @@ -36,5 +52,17 @@ const compressHassioBrotli = () => | |||||||
|     false |     false | ||||||
|   ); |   ); | ||||||
|  |  | ||||||
| gulp.task("compress-app", compressAppBrotli); | const compressAppZopfli = () => | ||||||
| gulp.task("compress-hassio", compressHassioBrotli); |   compressDistZopfli(paths.app_output_root, paths.app_output_latest); | ||||||
|  | const compressHassioZopfli = () => | ||||||
|  |   compressDistZopfli( | ||||||
|  |     paths.hassio_output_root, | ||||||
|  |     paths.hassio_output_latest, | ||||||
|  |     true | ||||||
|  |   ); | ||||||
|  |  | ||||||
|  | gulp.task("compress-app", gulp.parallel(compressAppBrotli, compressAppZopfli)); | ||||||
|  | gulp.task( | ||||||
|  |   "compress-hassio", | ||||||
|  |   gulp.parallel(compressHassioBrotli, compressHassioZopfli) | ||||||
|  | ); | ||||||
|   | |||||||
| @@ -1,11 +1,13 @@ | |||||||
| import gulp from "gulp"; | import gulp from "gulp"; | ||||||
|  | import env from "../env.cjs"; | ||||||
| import "./clean.js"; | import "./clean.js"; | ||||||
| import "./entry-html.js"; | import "./entry-html.js"; | ||||||
| import "./gather-static.js"; | import "./gather-static.js"; | ||||||
| import "./gen-icons-json.js"; | import "./gen-icons-json.js"; | ||||||
|  | import "./rollup.js"; | ||||||
| import "./service-worker.js"; | import "./service-worker.js"; | ||||||
| import "./translations.js"; | import "./translations.js"; | ||||||
| import "./rspack.js"; | import "./webpack.js"; | ||||||
|  |  | ||||||
| gulp.task( | gulp.task( | ||||||
|   "develop-demo", |   "develop-demo", | ||||||
| @@ -22,7 +24,7 @@ gulp.task( | |||||||
|       "build-locale-data" |       "build-locale-data" | ||||||
|     ), |     ), | ||||||
|     "copy-static-demo", |     "copy-static-demo", | ||||||
|     "rspack-dev-server-demo" |     env.useRollup() ? "rollup-dev-server-demo" : "webpack-dev-server-demo" | ||||||
|   ) |   ) | ||||||
| ); | ); | ||||||
|  |  | ||||||
| @@ -37,18 +39,7 @@ gulp.task( | |||||||
|     "translations-enable-merge-backend", |     "translations-enable-merge-backend", | ||||||
|     gulp.parallel("gen-icons-json", "build-translations", "build-locale-data"), |     gulp.parallel("gen-icons-json", "build-translations", "build-locale-data"), | ||||||
|     "copy-static-demo", |     "copy-static-demo", | ||||||
|     "rspack-prod-demo", |     env.useRollup() ? "rollup-prod-demo" : "webpack-prod-demo", | ||||||
|     "gen-pages-demo-prod" |     "gen-pages-demo-prod" | ||||||
|   ) |   ) | ||||||
| ); | ); | ||||||
|  |  | ||||||
| gulp.task( |  | ||||||
|   "analyze-demo", |  | ||||||
|   gulp.series( |  | ||||||
|     async function setEnv() { |  | ||||||
|       process.env.STATS = "1"; |  | ||||||
|     }, |  | ||||||
|     "clean", |  | ||||||
|     "rspack-prod-demo" |  | ||||||
|   ) |  | ||||||
| ); |  | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ const srcMeta = "src/translations/translationMetadata.json"; | |||||||
| const encoding = "utf8"; | const encoding = "utf8"; | ||||||
|  |  | ||||||
| function hasHtml(data) { | function hasHtml(data) { | ||||||
|   return /<\S*>/i.test(data); |   return /<[a-z][\s\S]*>/i.test(data); | ||||||
| } | } | ||||||
|  |  | ||||||
| function recursiveCheckHasHtml(file, data, errors, recKey) { | function recursiveCheckHasHtml(file, data, errors, recKey) { | ||||||
| @@ -127,7 +127,6 @@ gulp.task("fetch-lokalise", async function () { | |||||||
|           replace_breaks: false, |           replace_breaks: false, | ||||||
|           json_unescaped_slashes: true, |           json_unescaped_slashes: true, | ||||||
|           export_empty_as: "skip", |           export_empty_as: "skip", | ||||||
|           filter_data: ["verified"], |  | ||||||
|         }) |         }) | ||||||
|         .then((download) => fetch(download.bundle_url)) |         .then((download) => fetch(download.bundle_url)) | ||||||
|         .then((response) => { |         .then((response) => { | ||||||
|   | |||||||
| @@ -11,6 +11,7 @@ import { minify } from "html-minifier-terser"; | |||||||
| import template from "lodash.template"; | import template from "lodash.template"; | ||||||
| import { dirname, extname, resolve } from "node:path"; | import { dirname, extname, resolve } from "node:path"; | ||||||
| import { htmlMinifierOptions, terserOptions } from "../bundle.cjs"; | import { htmlMinifierOptions, terserOptions } from "../bundle.cjs"; | ||||||
|  | import env from "../env.cjs"; | ||||||
| import paths from "../paths.cjs"; | import paths from "../paths.cjs"; | ||||||
|  |  | ||||||
| // macOS companion app has no way to obtain the Safari version used by WKWebView, | // macOS companion app has no way to obtain the Safari version used by WKWebView, | ||||||
| @@ -55,6 +56,8 @@ const getCommonTemplateVars = () => { | |||||||
|     { ignorePatch: true, allowHigherVersions: true } |     { ignorePatch: true, allowHigherVersions: true } | ||||||
|   ); |   ); | ||||||
|   return { |   return { | ||||||
|  |     useRollup: env.useRollup(), | ||||||
|  |     useWDS: env.useWDS(), | ||||||
|     modernRegex: compileRegex(browserRegexes.concat(haMacOSRegex)).toString(), |     modernRegex: compileRegex(browserRegexes.concat(haMacOSRegex)).toString(), | ||||||
|   }; |   }; | ||||||
| }; | }; | ||||||
| @@ -90,11 +93,13 @@ const minifyHtml = (content, ext) => { | |||||||
| }; | }; | ||||||
|  |  | ||||||
| // Function to generate a dev task for each project's configuration | // Function to generate a dev task for each project's configuration | ||||||
|  | // Note Currently WDS paths are hard-coded to only work for app | ||||||
| const genPagesDevTask = | const genPagesDevTask = | ||||||
|   ( |   ( | ||||||
|     pageEntries, |     pageEntries, | ||||||
|     inputRoot, |     inputRoot, | ||||||
|     outputRoot, |     outputRoot, | ||||||
|  |     useWDS = false, | ||||||
|     inputSub = "src/html", |     inputSub = "src/html", | ||||||
|     publicRoot = "" |     publicRoot = "" | ||||||
|   ) => |   ) => | ||||||
| @@ -105,13 +110,17 @@ const genPagesDevTask = | |||||||
|         resolve(inputRoot, inputSub, `${page}.template`), |         resolve(inputRoot, inputSub, `${page}.template`), | ||||||
|         { |         { | ||||||
|           ...commonVars, |           ...commonVars, | ||||||
|           latestEntryJS: entries.map( |           latestEntryJS: entries.map((entry) => | ||||||
|             (entry) => `${publicRoot}/frontend_latest/${entry}.js` |             useWDS | ||||||
|  |               ? `http://localhost:8000/src/entrypoints/${entry}.ts` | ||||||
|  |               : `${publicRoot}/frontend_latest/${entry}.js` | ||||||
|           ), |           ), | ||||||
|           es5EntryJS: entries.map( |           es5EntryJS: entries.map( | ||||||
|             (entry) => `${publicRoot}/frontend_es5/${entry}.js` |             (entry) => `${publicRoot}/frontend_es5/${entry}.js` | ||||||
|           ), |           ), | ||||||
|           latestCustomPanelJS: `${publicRoot}/frontend_latest/custom-panel.js`, |           latestCustomPanelJS: useWDS | ||||||
|  |             ? "http://localhost:8000/src/entrypoints/custom-panel.ts" | ||||||
|  |             : `${publicRoot}/frontend_latest/custom-panel.js`, | ||||||
|           es5CustomPanelJS: `${publicRoot}/frontend_es5/custom-panel.js`, |           es5CustomPanelJS: `${publicRoot}/frontend_es5/custom-panel.js`, | ||||||
|         } |         } | ||||||
|       ); |       ); | ||||||
| @@ -168,7 +177,12 @@ const APP_PAGE_ENTRIES = { | |||||||
|  |  | ||||||
| gulp.task( | gulp.task( | ||||||
|   "gen-pages-app-dev", |   "gen-pages-app-dev", | ||||||
|   genPagesDevTask(APP_PAGE_ENTRIES, paths.polymer_dir, paths.app_output_root) |   genPagesDevTask( | ||||||
|  |     APP_PAGE_ENTRIES, | ||||||
|  |     paths.polymer_dir, | ||||||
|  |     paths.app_output_root, | ||||||
|  |     env.useWDS() | ||||||
|  |   ) | ||||||
| ); | ); | ||||||
|  |  | ||||||
| gulp.task( | gulp.task( | ||||||
| @@ -244,28 +258,6 @@ gulp.task( | |||||||
|   ) |   ) | ||||||
| ); | ); | ||||||
|  |  | ||||||
| const LANDING_PAGE_PAGE_ENTRIES = { "index.html": ["entrypoint"] }; |  | ||||||
|  |  | ||||||
| gulp.task( |  | ||||||
|   "gen-pages-landing-page-dev", |  | ||||||
|   genPagesDevTask( |  | ||||||
|     LANDING_PAGE_PAGE_ENTRIES, |  | ||||||
|     paths.landingPage_dir, |  | ||||||
|     paths.landingPage_output_root |  | ||||||
|   ) |  | ||||||
| ); |  | ||||||
|  |  | ||||||
| gulp.task( |  | ||||||
|   "gen-pages-landing-page-prod", |  | ||||||
|   genPagesProdTask( |  | ||||||
|     LANDING_PAGE_PAGE_ENTRIES, |  | ||||||
|     paths.landingPage_dir, |  | ||||||
|     paths.landingPage_output_root, |  | ||||||
|     paths.landingPage_output_latest, |  | ||||||
|     paths.landingPage_output_es5 |  | ||||||
|   ) |  | ||||||
| ); |  | ||||||
|  |  | ||||||
| const HASSIO_PAGE_ENTRIES = { "entrypoint.js": ["entrypoint"] }; | const HASSIO_PAGE_ENTRIES = { "entrypoint.js": ["entrypoint"] }; | ||||||
|  |  | ||||||
| gulp.task( | gulp.task( | ||||||
| @@ -274,6 +266,7 @@ gulp.task( | |||||||
|     HASSIO_PAGE_ENTRIES, |     HASSIO_PAGE_ENTRIES, | ||||||
|     paths.hassio_dir, |     paths.hassio_dir, | ||||||
|     paths.hassio_output_root, |     paths.hassio_output_root, | ||||||
|  |     undefined, | ||||||
|     "src", |     "src", | ||||||
|     paths.hassio_publicPath |     paths.hassio_publicPath | ||||||
|   ) |   ) | ||||||
|   | |||||||
| @@ -66,7 +66,7 @@ gulp.task("fetch-nightly-translations", async function () { | |||||||
|       tokenAuth = JSON.parse(await readFile(TOKEN_FILE, "utf-8")); |       tokenAuth = JSON.parse(await readFile(TOKEN_FILE, "utf-8")); | ||||||
|     } catch { |     } catch { | ||||||
|       if (!allowTokenSetup) { |       if (!allowTokenSetup) { | ||||||
|         console.log("No token found so build will continue with English only"); |         console.log("No token found so  build wil continue with English only"); | ||||||
|         return; |         return; | ||||||
|       } |       } | ||||||
|       const auth = createOAuthDeviceAuth({ |       const auth = createOAuthDeviceAuth({ | ||||||
|   | |||||||
| @@ -4,14 +4,16 @@ import gulp from "gulp"; | |||||||
| import yaml from "js-yaml"; | import yaml from "js-yaml"; | ||||||
| import { marked } from "marked"; | import { marked } from "marked"; | ||||||
| import path from "path"; | import path from "path"; | ||||||
|  | import env from "../env.cjs"; | ||||||
| import paths from "../paths.cjs"; | import paths from "../paths.cjs"; | ||||||
| import "./clean.js"; | import "./clean.js"; | ||||||
| import "./entry-html.js"; | import "./entry-html.js"; | ||||||
| import "./gather-static.js"; | import "./gather-static.js"; | ||||||
| import "./gen-icons-json.js"; | import "./gen-icons-json.js"; | ||||||
|  | import "./rollup.js"; | ||||||
| import "./service-worker.js"; | import "./service-worker.js"; | ||||||
| import "./translations.js"; | import "./translations.js"; | ||||||
| import "./rspack.js"; | import "./webpack.js"; | ||||||
|  |  | ||||||
| gulp.task("gather-gallery-pages", async function gatherPages() { | gulp.task("gather-gallery-pages", async function gatherPages() { | ||||||
|   const pageDir = path.resolve(paths.gallery_dir, "src/pages"); |   const pageDir = path.resolve(paths.gallery_dir, "src/pages"); | ||||||
| @@ -156,7 +158,9 @@ gulp.task( | |||||||
|     "copy-static-gallery", |     "copy-static-gallery", | ||||||
|     "gen-pages-gallery-dev", |     "gen-pages-gallery-dev", | ||||||
|     gulp.parallel( |     gulp.parallel( | ||||||
|       "rspack-dev-server-gallery", |       env.useRollup() | ||||||
|  |         ? "rollup-dev-server-gallery" | ||||||
|  |         : "webpack-dev-server-gallery", | ||||||
|       async function watchMarkdownFiles() { |       async function watchMarkdownFiles() { | ||||||
|         gulp.watch( |         gulp.watch( | ||||||
|           [ |           [ | ||||||
| @@ -185,7 +189,7 @@ gulp.task( | |||||||
|       "gather-gallery-pages" |       "gather-gallery-pages" | ||||||
|     ), |     ), | ||||||
|     "copy-static-gallery", |     "copy-static-gallery", | ||||||
|     "rspack-prod-gallery", |     env.useRollup() ? "rollup-prod-gallery" : "webpack-prod-gallery", | ||||||
|     "gen-pages-gallery-prod" |     "gen-pages-gallery-prod" | ||||||
|   ) |   ) | ||||||
| ); | ); | ||||||
|   | |||||||
| @@ -4,6 +4,7 @@ import fs from "fs-extra"; | |||||||
| 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"; | ||||||
|  | import env from "../env.cjs"; | ||||||
|  |  | ||||||
| const npmPath = (...parts) => | const npmPath = (...parts) => | ||||||
|   path.resolve(paths.polymer_dir, "node_modules", ...parts); |   path.resolve(paths.polymer_dir, "node_modules", ...parts); | ||||||
| @@ -68,6 +69,9 @@ function copyPolyfills(staticDir) { | |||||||
| } | } | ||||||
|  |  | ||||||
| function copyLoaderJS(staticDir) { | function copyLoaderJS(staticDir) { | ||||||
|  |   if (!env.useRollup()) { | ||||||
|  |     return; | ||||||
|  |   } | ||||||
|   const staticPath = genStaticPath(staticDir); |   const staticPath = genStaticPath(staticDir); | ||||||
|   copyFileDir(npmPath("systemjs/dist/s.min.js"), staticPath("js")); |   copyFileDir(npmPath("systemjs/dist/s.min.js"), staticPath("js")); | ||||||
|   copyFileDir(npmPath("systemjs/dist/s.min.js.map"), staticPath("js")); |   copyFileDir(npmPath("systemjs/dist/s.min.js.map"), staticPath("js")); | ||||||
| @@ -102,14 +106,6 @@ function copyMapPanel(staticDir) { | |||||||
|   ); |   ); | ||||||
| } | } | ||||||
|  |  | ||||||
| function copyZXingWasm(staticDir) { |  | ||||||
|   const staticPath = genStaticPath(staticDir); |  | ||||||
|   copyFileDir( |  | ||||||
|     npmPath("zxing-wasm/dist/reader/zxing_reader.wasm"), |  | ||||||
|     staticPath("js") |  | ||||||
|   ); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| gulp.task("copy-locale-data", async () => { | gulp.task("copy-locale-data", async () => { | ||||||
|   const staticDir = paths.app_output_static; |   const staticDir = paths.app_output_static; | ||||||
|   copyLocaleData(staticDir); |   copyLocaleData(staticDir); | ||||||
| @@ -125,11 +121,6 @@ gulp.task("copy-translations-supervisor", async () => { | |||||||
|   copyTranslations(staticDir); |   copyTranslations(staticDir); | ||||||
| }); | }); | ||||||
|  |  | ||||||
| gulp.task("copy-translations-landing-page", async () => { |  | ||||||
|   const staticDir = paths.landingPage_output_static; |  | ||||||
|   copyTranslations(staticDir); |  | ||||||
| }); |  | ||||||
|  |  | ||||||
| gulp.task("copy-static-supervisor", async () => { | gulp.task("copy-static-supervisor", async () => { | ||||||
|   const staticDir = paths.hassio_output_static; |   const staticDir = paths.hassio_output_static; | ||||||
|   copyLocaleData(staticDir); |   copyLocaleData(staticDir); | ||||||
| @@ -152,7 +143,6 @@ gulp.task("copy-static-app", async () => { | |||||||
|   copyMapPanel(staticDir); |   copyMapPanel(staticDir); | ||||||
|  |  | ||||||
|   // Qr Scanner assets |   // Qr Scanner assets | ||||||
|   copyZXingWasm(staticDir); |  | ||||||
|   copyQrScannerWorker(staticDir); |   copyQrScannerWorker(staticDir); | ||||||
| }); | }); | ||||||
|  |  | ||||||
| @@ -204,14 +194,3 @@ gulp.task("copy-static-gallery", async () => { | |||||||
|   copyLocaleData(paths.gallery_output_static); |   copyLocaleData(paths.gallery_output_static); | ||||||
|   copyMdiIcons(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); |  | ||||||
| }); |  | ||||||
|   | |||||||
| @@ -5,8 +5,9 @@ import "./compress.js"; | |||||||
| import "./entry-html.js"; | import "./entry-html.js"; | ||||||
| import "./gather-static.js"; | import "./gather-static.js"; | ||||||
| import "./gen-icons-json.js"; | import "./gen-icons-json.js"; | ||||||
|  | import "./rollup.js"; | ||||||
| import "./translations.js"; | import "./translations.js"; | ||||||
| import "./rspack.js"; | import "./webpack.js"; | ||||||
|  |  | ||||||
| gulp.task( | gulp.task( | ||||||
|   "develop-hassio", |   "develop-hassio", | ||||||
| @@ -21,7 +22,7 @@ gulp.task( | |||||||
|     "copy-translations-supervisor", |     "copy-translations-supervisor", | ||||||
|     "build-locale-data", |     "build-locale-data", | ||||||
|     "copy-static-supervisor", |     "copy-static-supervisor", | ||||||
|     "rspack-watch-hassio" |     env.useRollup() ? "rollup-watch-hassio" : "webpack-watch-hassio" | ||||||
|   ) |   ) | ||||||
| ); | ); | ||||||
|  |  | ||||||
| @@ -37,7 +38,7 @@ gulp.task( | |||||||
|     "copy-translations-supervisor", |     "copy-translations-supervisor", | ||||||
|     "build-locale-data", |     "build-locale-data", | ||||||
|     "copy-static-supervisor", |     "copy-static-supervisor", | ||||||
|     "rspack-prod-hassio", |     env.useRollup() ? "rollup-prod-hassio" : "webpack-prod-hassio", | ||||||
|     "gen-pages-hassio-prod", |     "gen-pages-hassio-prod", | ||||||
|     ...// Don't compress running tests |     ...// Don't compress running tests | ||||||
|     (env.isTestBuild() ? [] : ["compress-hassio"]) |     (env.isTestBuild() ? [] : ["compress-hassio"]) | ||||||
|   | |||||||
| @@ -1,41 +0,0 @@ | |||||||
| import gulp from "gulp"; |  | ||||||
| import "./clean.js"; |  | ||||||
| import "./compress.js"; |  | ||||||
| import "./entry-html.js"; |  | ||||||
| import "./gather-static.js"; |  | ||||||
| import "./gen-icons-json.js"; |  | ||||||
| import "./translations.js"; |  | ||||||
| import "./rspack.js"; |  | ||||||
|  |  | ||||||
| gulp.task( |  | ||||||
|   "develop-landing-page", |  | ||||||
|   gulp.series( |  | ||||||
|     async function setEnv() { |  | ||||||
|       process.env.NODE_ENV = "development"; |  | ||||||
|     }, |  | ||||||
|     "clean-landing-page", |  | ||||||
|     "translations-enable-merge-backend", |  | ||||||
|     "build-landing-page-translations", |  | ||||||
|     "copy-translations-landing-page", |  | ||||||
|     "build-locale-data", |  | ||||||
|     "copy-static-landing-page", |  | ||||||
|     "gen-pages-landing-page-dev", |  | ||||||
|     "rspack-watch-landing-page" |  | ||||||
|   ) |  | ||||||
| ); |  | ||||||
|  |  | ||||||
| gulp.task( |  | ||||||
|   "build-landing-page", |  | ||||||
|   gulp.series( |  | ||||||
|     async function setEnv() { |  | ||||||
|       process.env.NODE_ENV = "production"; |  | ||||||
|     }, |  | ||||||
|     "clean-landing-page", |  | ||||||
|     "build-landing-page-translations", |  | ||||||
|     "copy-translations-landing-page", |  | ||||||
|     "build-locale-data", |  | ||||||
|     "copy-static-landing-page", |  | ||||||
|     "rspack-prod-landing-page", |  | ||||||
|     "gen-pages-landing-page-prod" |  | ||||||
|   ) |  | ||||||
| ); |  | ||||||
| @@ -24,11 +24,8 @@ const convertToJSON = async ( | |||||||
| ) => { | ) => { | ||||||
|   let localeData; |   let localeData; | ||||||
|   try { |   try { | ||||||
|     // use "pt" for "pt-BR", because "pt-BR" is unsupported by @formatjs |  | ||||||
|     const language = lang === "pt-BR" ? "pt" : lang; |  | ||||||
|  |  | ||||||
|     localeData = await readFile( |     localeData = await readFile( | ||||||
|       join(formatjsDir, pkg, subDir, `${language}.js`), |       join(formatjsDir, pkg, subDir, `${lang}.js`), | ||||||
|       "utf-8" |       "utf-8" | ||||||
|     ); |     ); | ||||||
|   } catch (e) { |   } catch (e) { | ||||||
|   | |||||||
							
								
								
									
										147
									
								
								build-scripts/gulp/rollup.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								build-scripts/gulp/rollup.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,147 @@ | |||||||
|  | // 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, | ||||||
|  |     }) | ||||||
|  |   ) | ||||||
|  | ); | ||||||
| @@ -172,14 +172,12 @@ const createMasterTranslation = () => | |||||||
|  |  | ||||||
| const FRAGMENTS = ["base"]; | const FRAGMENTS = ["base"]; | ||||||
|  |  | ||||||
| const setFragment = (fragment) => async () => { | const toggleSupervisorFragment = async () => { | ||||||
|   FRAGMENTS[0] = fragment; |   FRAGMENTS[0] = "supervisor"; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| const panelFragment = (fragment) => | const panelFragment = (fragment) => | ||||||
|   fragment !== "base" && |   fragment !== "base" && fragment !== "supervisor"; | ||||||
|   fragment !== "supervisor" && |  | ||||||
|   fragment !== "landing-page"; |  | ||||||
|  |  | ||||||
| const HASHES = new Map(); | const HASHES = new Map(); | ||||||
|  |  | ||||||
| @@ -226,9 +224,6 @@ const createTranslations = async () => { | |||||||
|             case "supervisor": |             case "supervisor": | ||||||
|               // Supervisor key is at the top level |               // Supervisor key is at the top level | ||||||
|               return [flatten(data.supervisor), ""]; |               return [flatten(data.supervisor), ""]; | ||||||
|             case "landing-page": |  | ||||||
|               // landing-page key is at the top level |  | ||||||
|               return [flatten(data["landing-page"]), ""]; |  | ||||||
|             default: |             default: | ||||||
|               // Create a fragment with only the given panel |               // Create a fragment with only the given panel | ||||||
|               return [ |               return [ | ||||||
| @@ -327,10 +322,5 @@ gulp.task( | |||||||
|  |  | ||||||
| gulp.task( | gulp.task( | ||||||
|   "build-supervisor-translations", |   "build-supervisor-translations", | ||||||
|   gulp.series(setFragment("supervisor"), "build-translations") |   gulp.series(toggleSupervisorFragment, "build-translations") | ||||||
| ); |  | ||||||
|  |  | ||||||
| gulp.task( |  | ||||||
|   "build-landing-page-translations", |  | ||||||
|   gulp.series(setFragment("landing-page"), "build-translations") |  | ||||||
| ); | ); | ||||||
|   | |||||||
							
								
								
									
										10
									
								
								build-scripts/gulp/wds.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								build-scripts/gulp/wds.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | |||||||
|  | import gulp from "gulp"; | ||||||
|  | import { startDevServer } from "@web/dev-server"; | ||||||
|  |  | ||||||
|  | gulp.task("wds-watch-app", async () => { | ||||||
|  |   startDevServer({ | ||||||
|  |     config: { | ||||||
|  |       watch: true, | ||||||
|  |     }, | ||||||
|  |   }); | ||||||
|  | }); | ||||||
| @@ -1,11 +1,11 @@ | |||||||
| // Tasks to run rspack.
 | // Tasks to run webpack.
 | ||||||
| 
 | 
 | ||||||
| import fs from "fs"; | import fs from "fs"; | ||||||
| import path from "path"; | import path from "path"; | ||||||
| import log from "fancy-log"; | import log from "fancy-log"; | ||||||
| import gulp from "gulp"; | import gulp from "gulp"; | ||||||
| import rspack from "@rspack/core"; | import webpack from "webpack"; | ||||||
| import { RspackDevServer } from "@rspack/dev-server"; | import WebpackDevServer from "webpack-dev-server"; | ||||||
| import env from "../env.cjs"; | import env from "../env.cjs"; | ||||||
| import paths from "../paths.cjs"; | import paths from "../paths.cjs"; | ||||||
| import { | import { | ||||||
| @@ -14,8 +14,7 @@ import { | |||||||
|   createDemoConfig, |   createDemoConfig, | ||||||
|   createGalleryConfig, |   createGalleryConfig, | ||||||
|   createHassioConfig, |   createHassioConfig, | ||||||
|   createLandingPageConfig, | } from "../webpack.cjs"; | ||||||
| } from "../rspack.cjs"; |  | ||||||
| 
 | 
 | ||||||
| const bothBuilds = (createConfigFunc, params) => [ | const bothBuilds = (createConfigFunc, params) => [ | ||||||
|   createConfigFunc({ ...params, latestBuild: true }), |   createConfigFunc({ ...params, latestBuild: true }), | ||||||
| @@ -31,7 +30,7 @@ const isWsl = | |||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * @param {{ |  * @param {{ | ||||||
|  *   compiler: import("@rspack/core").Compiler, |  *   compiler: import("webpack").Compiler, | ||||||
|  *   contentBase: string, |  *   contentBase: string, | ||||||
|  *   port: number, |  *   port: number, | ||||||
|  *   listenHost?: string |  *   listenHost?: string | ||||||
| @@ -42,13 +41,12 @@ const runDevServer = async ({ | |||||||
|   contentBase, |   contentBase, | ||||||
|   port, |   port, | ||||||
|   listenHost = undefined, |   listenHost = undefined, | ||||||
|   proxy = undefined, |  | ||||||
| }) => { | }) => { | ||||||
|   if (listenHost === undefined) { |   if (listenHost === undefined) { | ||||||
|     // For dev container, we need to listen on all hosts
 |     // For dev container, we need to listen on all hosts
 | ||||||
|     listenHost = env.isDevContainer() ? "0.0.0.0" : "localhost"; |     listenHost = env.isDevContainer() ? "0.0.0.0" : "localhost"; | ||||||
|   } |   } | ||||||
|   const server = new RspackDevServer( |   const server = new WebpackDevServer( | ||||||
|     { |     { | ||||||
|       hot: false, |       hot: false, | ||||||
|       open: true, |       open: true, | ||||||
| @@ -58,14 +56,13 @@ const runDevServer = async ({ | |||||||
|         directory: contentBase, |         directory: contentBase, | ||||||
|         watch: true, |         watch: true, | ||||||
|       }, |       }, | ||||||
|       proxy, |  | ||||||
|     }, |     }, | ||||||
|     compiler |     compiler | ||||||
|   ); |   ); | ||||||
| 
 | 
 | ||||||
|   await server.start(); |   await server.start(); | ||||||
|   // Server listening
 |   // Server listening
 | ||||||
|   log("[rspack-dev-server]", `Project is running at http://localhost:${port}`); |   log("[webpack-dev-server]", `Project is running at http://localhost:${port}`); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| const doneHandler = (done) => (err, stats) => { | const doneHandler = (done) => (err, stats) => { | ||||||
| @@ -90,16 +87,16 @@ const doneHandler = (done) => (err, stats) => { | |||||||
| 
 | 
 | ||||||
| const prodBuild = (conf) => | const prodBuild = (conf) => | ||||||
|   new Promise((resolve) => { |   new Promise((resolve) => { | ||||||
|     rspack( |     webpack( | ||||||
|       conf, |       conf, | ||||||
|       // Resolve promise when done. Because we pass a callback, rspack closes itself
 |       // Resolve promise when done. Because we pass a callback, webpack closes itself
 | ||||||
|       doneHandler(resolve) |       doneHandler(resolve) | ||||||
|     ); |     ); | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
| gulp.task("rspack-watch-app", () => { | gulp.task("webpack-watch-app", () => { | ||||||
|   // This command will run forever because we don't close compiler
 |   // This command will run forever because we don't close compiler
 | ||||||
|   rspack( |   webpack( | ||||||
|     process.env.ES5 |     process.env.ES5 | ||||||
|       ? bothBuilds(createAppConfig, { isProdBuild: false }) |       ? bothBuilds(createAppConfig, { isProdBuild: false }) | ||||||
|       : createAppConfig({ isProdBuild: false, latestBuild: true }) |       : createAppConfig({ isProdBuild: false, latestBuild: true }) | ||||||
| @@ -110,7 +107,7 @@ gulp.task("rspack-watch-app", () => { | |||||||
|   ); |   ); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| gulp.task("rspack-prod-app", () => | gulp.task("webpack-prod-app", () => | ||||||
|   prodBuild( |   prodBuild( | ||||||
|     bothBuilds(createAppConfig, { |     bothBuilds(createAppConfig, { | ||||||
|       isProdBuild: true, |       isProdBuild: true, | ||||||
| @@ -120,9 +117,9 @@ gulp.task("rspack-prod-app", () => | |||||||
|   ) |   ) | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| gulp.task("rspack-dev-server-demo", () => | gulp.task("webpack-dev-server-demo", () => | ||||||
|   runDevServer({ |   runDevServer({ | ||||||
|     compiler: rspack( |     compiler: webpack( | ||||||
|       createDemoConfig({ isProdBuild: false, latestBuild: true }) |       createDemoConfig({ isProdBuild: false, latestBuild: true }) | ||||||
|     ), |     ), | ||||||
|     contentBase: paths.demo_output_root, |     contentBase: paths.demo_output_root, | ||||||
| @@ -130,18 +127,17 @@ gulp.task("rspack-dev-server-demo", () => | |||||||
|   }) |   }) | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| gulp.task("rspack-prod-demo", () => | gulp.task("webpack-prod-demo", () => | ||||||
|   prodBuild( |   prodBuild( | ||||||
|     bothBuilds(createDemoConfig, { |     bothBuilds(createDemoConfig, { | ||||||
|       isProdBuild: true, |       isProdBuild: true, | ||||||
|       isStatsBuild: env.isStatsBuild(), |  | ||||||
|     }) |     }) | ||||||
|   ) |   ) | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| gulp.task("rspack-dev-server-cast", () => | gulp.task("webpack-dev-server-cast", () => | ||||||
|   runDevServer({ |   runDevServer({ | ||||||
|     compiler: rspack( |     compiler: webpack( | ||||||
|       createCastConfig({ isProdBuild: false, latestBuild: true }) |       createCastConfig({ isProdBuild: false, latestBuild: true }) | ||||||
|     ), |     ), | ||||||
|     contentBase: paths.cast_output_root, |     contentBase: paths.cast_output_root, | ||||||
| @@ -151,7 +147,7 @@ gulp.task("rspack-dev-server-cast", () => | |||||||
|   }) |   }) | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| gulp.task("rspack-prod-cast", () => | gulp.task("webpack-prod-cast", () => | ||||||
|   prodBuild( |   prodBuild( | ||||||
|     bothBuilds(createCastConfig, { |     bothBuilds(createCastConfig, { | ||||||
|       isProdBuild: true, |       isProdBuild: true, | ||||||
| @@ -159,9 +155,9 @@ gulp.task("rspack-prod-cast", () => | |||||||
|   ) |   ) | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| gulp.task("rspack-watch-hassio", () => { | gulp.task("webpack-watch-hassio", () => { | ||||||
|   // This command will run forever because we don't close compiler
 |   // This command will run forever because we don't close compiler
 | ||||||
|   rspack( |   webpack( | ||||||
|     createHassioConfig({ |     createHassioConfig({ | ||||||
|       isProdBuild: false, |       isProdBuild: false, | ||||||
|       latestBuild: true, |       latestBuild: true, | ||||||
| @@ -174,7 +170,7 @@ gulp.task("rspack-watch-hassio", () => { | |||||||
|   ); |   ); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| gulp.task("rspack-prod-hassio", () => | gulp.task("webpack-prod-hassio", () => | ||||||
|   prodBuild( |   prodBuild( | ||||||
|     bothBuilds(createHassioConfig, { |     bothBuilds(createHassioConfig, { | ||||||
|       isProdBuild: true, |       isProdBuild: true, | ||||||
| @@ -184,9 +180,9 @@ gulp.task("rspack-prod-hassio", () => | |||||||
|   ) |   ) | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| gulp.task("rspack-dev-server-gallery", () => | gulp.task("webpack-dev-server-gallery", () => | ||||||
|   runDevServer({ |   runDevServer({ | ||||||
|     compiler: rspack( |     compiler: webpack( | ||||||
|       createGalleryConfig({ isProdBuild: false, latestBuild: true }) |       createGalleryConfig({ isProdBuild: false, latestBuild: true }) | ||||||
|     ), |     ), | ||||||
|     contentBase: paths.gallery_output_root, |     contentBase: paths.gallery_output_root, | ||||||
| @@ -195,7 +191,7 @@ gulp.task("rspack-dev-server-gallery", () => | |||||||
|   }) |   }) | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| gulp.task("rspack-prod-gallery", () => | gulp.task("webpack-prod-gallery", () => | ||||||
|   prodBuild( |   prodBuild( | ||||||
|     createGalleryConfig({ |     createGalleryConfig({ | ||||||
|       isProdBuild: true, |       isProdBuild: true, | ||||||
| @@ -203,30 +199,3 @@ gulp.task("rspack-prod-gallery", () => | |||||||
|     }) |     }) | ||||||
|   ) |   ) | ||||||
| ); | ); | ||||||
| 
 |  | ||||||
| gulp.task("rspack-watch-landing-page", () => { |  | ||||||
|   // This command will run forever because we don't close compiler
 |  | ||||||
|   rspack( |  | ||||||
|     process.env.ES5 |  | ||||||
|       ? bothBuilds(createLandingPageConfig, { isProdBuild: false }) |  | ||||||
|       : createLandingPageConfig({ isProdBuild: false, latestBuild: true }) |  | ||||||
|   ).watch({ poll: isWsl }, doneHandler()); |  | ||||||
| 
 |  | ||||||
|   gulp.watch( |  | ||||||
|     path.join(paths.translations_src, "en.json"), |  | ||||||
|     gulp.series( |  | ||||||
|       "build-landing-page-translations", |  | ||||||
|       "copy-translations-landing-page" |  | ||||||
|     ) |  | ||||||
|   ); |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| gulp.task("rspack-prod-landing-page", () => |  | ||||||
|   prodBuild( |  | ||||||
|     bothBuilds(createLandingPageConfig, { |  | ||||||
|       isProdBuild: true, |  | ||||||
|       isStatsBuild: env.isStatsBuild(), |  | ||||||
|       isTestBuild: env.isTestBuild(), |  | ||||||
|     }) |  | ||||||
|   ) |  | ||||||
| ); |  | ||||||
| @@ -33,22 +33,6 @@ module.exports = { | |||||||
|   ), |   ), | ||||||
|   gallery_output_static: path.resolve(__dirname, "../gallery/dist/static"), |   gallery_output_static: path.resolve(__dirname, "../gallery/dist/static"), | ||||||
|  |  | ||||||
|   landingPage_dir: path.resolve(__dirname, "../landing-page"), |  | ||||||
|   landingPage_build: path.resolve(__dirname, "../landing-page/build"), |  | ||||||
|   landingPage_output_root: path.resolve(__dirname, "../landing-page/dist"), |  | ||||||
|   landingPage_output_latest: path.resolve( |  | ||||||
|     __dirname, |  | ||||||
|     "../landing-page/dist/frontend_latest" |  | ||||||
|   ), |  | ||||||
|   landingPage_output_es5: path.resolve( |  | ||||||
|     __dirname, |  | ||||||
|     "../landing-page/dist/frontend_es5" |  | ||||||
|   ), |  | ||||||
|   landingPage_output_static: path.resolve( |  | ||||||
|     __dirname, |  | ||||||
|     "../landing-page/dist/static" |  | ||||||
|   ), |  | ||||||
|  |  | ||||||
|   hassio_dir: path.resolve(__dirname, "../hassio"), |   hassio_dir: path.resolve(__dirname, "../hassio"), | ||||||
|   hassio_output_root: path.resolve(__dirname, "../hassio/build"), |   hassio_output_root: path.resolve(__dirname, "../hassio/build"), | ||||||
|   hassio_output_static: path.resolve(__dirname, "../hassio/build/static"), |   hassio_output_static: path.resolve(__dirname, "../hassio/build/static"), | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								build-scripts/rollup-plugins/dont-hash-plugin.cjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								build-scripts/rollup-plugins/dont-hash-plugin.cjs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | |||||||
|  | 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; | ||||||
|  |     }, | ||||||
|  |   }; | ||||||
|  | }; | ||||||
							
								
								
									
										24
									
								
								build-scripts/rollup-plugins/ignore-plugin.cjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								build-scripts/rollup-plugins/ignore-plugin.cjs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | |||||||
|  | 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; | ||||||
|  |     }, | ||||||
|  |   }; | ||||||
|  | }; | ||||||
							
								
								
									
										34
									
								
								build-scripts/rollup-plugins/manifest-plugin.cjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								build-scripts/rollup-plugins/manifest-plugin.cjs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | |||||||
|  | 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", | ||||||
|  |       }); | ||||||
|  |     }, | ||||||
|  |   }; | ||||||
|  | }; | ||||||
							
								
								
									
										152
									
								
								build-scripts/rollup-plugins/worker-plugin.cjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										152
									
								
								build-scripts/rollup-plugins/worker-plugin.cjs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,152 @@ | |||||||
|  | // 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 }), | ||||||
|  |       }; | ||||||
|  |     }, | ||||||
|  |   }; | ||||||
|  | }; | ||||||
							
								
								
									
										146
									
								
								build-scripts/rollup.cjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								build-scripts/rollup.cjs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,146 @@ | |||||||
|  | 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, | ||||||
|  | }; | ||||||
| @@ -1,13 +1,16 @@ | |||||||
| const { existsSync } = require("fs"); | const { existsSync } = require("fs"); | ||||||
| const path = require("path"); | const path = require("path"); | ||||||
| const rspack = require("@rspack/core"); | const webpack = require("webpack"); | ||||||
| const { RsdoctorRspackPlugin } = require("@rsdoctor/rspack-plugin"); |  | ||||||
| const { StatsWriterPlugin } = require("webpack-stats-plugin"); | const { StatsWriterPlugin } = require("webpack-stats-plugin"); | ||||||
| const filterStats = require("@bundle-stats/plugin-webpack-filter").default; | const filterStats = require("@bundle-stats/plugin-webpack-filter").default; | ||||||
| const TerserPlugin = require("terser-webpack-plugin"); | const TerserPlugin = require("terser-webpack-plugin"); | ||||||
| const { WebpackManifestPlugin } = require("rspack-manifest-plugin"); | const { WebpackManifestPlugin } = require("webpack-manifest-plugin"); | ||||||
| const log = require("fancy-log"); | const log = require("fancy-log"); | ||||||
| const WebpackBar = require("webpackbar/rspack"); | const WebpackBar = require("webpackbar"); | ||||||
|  | const { | ||||||
|  |   TransformAsyncModulesPlugin, | ||||||
|  | } = require("transform-async-modules-webpack-plugin"); | ||||||
|  | const { dependencies } = require("../package.json"); | ||||||
| const paths = require("./paths.cjs"); | const paths = require("./paths.cjs"); | ||||||
| const bundle = require("./bundle.cjs"); | const bundle = require("./bundle.cjs"); | ||||||
| 
 | 
 | ||||||
| @@ -25,7 +28,7 @@ class LogStartCompilePlugin { | |||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| const createRspackConfig = ({ | const createWebpackConfig = ({ | ||||||
|   name, |   name, | ||||||
|   entry, |   entry, | ||||||
|   outputPath, |   outputPath, | ||||||
| @@ -99,18 +102,13 @@ const createRspackConfig = ({ | |||||||
|       splitChunks: { |       splitChunks: { | ||||||
|         // Disable splitting for web workers and worklets because imports of
 |         // Disable splitting for web workers and worklets because imports of
 | ||||||
|         // external chunks are broken for:
 |         // external chunks are broken for:
 | ||||||
|         chunks: !isProdBuild |         // - ESM output: https://github.com/webpack/webpack/issues/17014
 | ||||||
|           ? // improve incremental build speed, but blows up bundle size
 |  | ||||||
|             new RegExp( |  | ||||||
|               `^(?!(${Object.keys(entry).join("|")}|.*work(?:er|let))$)` |  | ||||||
|             ) |  | ||||||
|           : // - ESM output: https://github.com/webpack/webpack/issues/17014
 |  | ||||||
|         // - Worklets use `importScripts`: https://github.com/webpack/webpack/issues/11543
 |         // - Worklets use `importScripts`: https://github.com/webpack/webpack/issues/11543
 | ||||||
|             (chunk) => |         chunks: (chunk) => | ||||||
|           !chunk.canBeInitial() && |           !chunk.canBeInitial() && | ||||||
|               !new RegExp( |           !new RegExp(`^.+-work${latestBuild ? "(?:let|er)" : "let"}$`).test( | ||||||
|                 `^.+-work${latestBuild ? "(?:let|er)" : "let"}$` |             chunk.name | ||||||
|               ).test(chunk.name), |           ), | ||||||
|       }, |       }, | ||||||
|     }, |     }, | ||||||
|     plugins: [ |     plugins: [ | ||||||
| @@ -119,10 +117,10 @@ const createRspackConfig = ({ | |||||||
|         // Only include the JS of entrypoints
 |         // Only include the JS of entrypoints
 | ||||||
|         filter: (file) => file.isInitial && !file.name.endsWith(".map"), |         filter: (file) => file.isInitial && !file.name.endsWith(".map"), | ||||||
|       }), |       }), | ||||||
|       new rspack.DefinePlugin( |       new webpack.DefinePlugin( | ||||||
|         bundle.definedVars({ isProdBuild, latestBuild, defineOverlay }) |         bundle.definedVars({ isProdBuild, latestBuild, defineOverlay }) | ||||||
|       ), |       ), | ||||||
|       new rspack.IgnorePlugin({ |       new webpack.IgnorePlugin({ | ||||||
|         checkResource(resource, context) { |         checkResource(resource, context) { | ||||||
|           // Only use ignore to intercept imports that we don't control
 |           // Only use ignore to intercept imports that we don't control
 | ||||||
|           // inside node_module dependencies.
 |           // inside node_module dependencies.
 | ||||||
| @@ -154,7 +152,7 @@ const createRspackConfig = ({ | |||||||
|           ); |           ); | ||||||
|         }, |         }, | ||||||
|       }), |       }), | ||||||
|       new rspack.NormalModuleReplacementPlugin( |       new webpack.NormalModuleReplacementPlugin( | ||||||
|         new RegExp( |         new RegExp( | ||||||
|           bundle.emptyPackages({ latestBuild, isHassioBuild }).join("|") |           bundle.emptyPackages({ latestBuild, isHassioBuild }).join("|") | ||||||
|         ), |         ), | ||||||
| @@ -170,14 +168,10 @@ const createRspackConfig = ({ | |||||||
|           stats: { assets: true, chunks: true, modules: true }, |           stats: { assets: true, chunks: true, modules: true }, | ||||||
|           transform: (stats) => JSON.stringify(filterStats(stats)), |           transform: (stats) => JSON.stringify(filterStats(stats)), | ||||||
|         }), |         }), | ||||||
|       isProdBuild && |       !latestBuild && | ||||||
|         isStatsBuild && |         new TransformAsyncModulesPlugin({ | ||||||
|         new RsdoctorRspackPlugin({ |           browserslistEnv: "legacy", | ||||||
|           reportDir: path.join(paths.build_dir, "rsdoctor"), |           runtime: { version: dependencies["@babel/runtime"] }, | ||||||
|           features: ["plugins", "bundle"], |  | ||||||
|           supports: { |  | ||||||
|             generateTileGraph: true, |  | ||||||
|           }, |  | ||||||
|         }), |         }), | ||||||
|     ].filter(Boolean), |     ].filter(Boolean), | ||||||
|     resolve: { |     resolve: { | ||||||
| @@ -194,7 +188,6 @@ const createRspackConfig = ({ | |||||||
|         "lit/directives/cache$": "lit/directives/cache.js", |         "lit/directives/cache$": "lit/directives/cache.js", | ||||||
|         "lit/directives/repeat$": "lit/directives/repeat.js", |         "lit/directives/repeat$": "lit/directives/repeat.js", | ||||||
|         "lit/directives/live$": "lit/directives/live.js", |         "lit/directives/live$": "lit/directives/live.js", | ||||||
|         "lit/directives/keyed$": "lit/directives/keyed.js", |  | ||||||
|         "lit/polyfill-support$": "lit/polyfill-support.js", |         "lit/polyfill-support$": "lit/polyfill-support.js", | ||||||
|         "@lit-labs/virtualizer/layouts/grid": |         "@lit-labs/virtualizer/layouts/grid": | ||||||
|           "@lit-labs/virtualizer/layouts/grid.js", |           "@lit-labs/virtualizer/layouts/grid.js", | ||||||
| @@ -216,6 +209,8 @@ const createRspackConfig = ({ | |||||||
|         isProdBuild && !isStatsBuild ? "[id].[contenthash][ext]" : "[id][ext]", |         isProdBuild && !isStatsBuild ? "[id].[contenthash][ext]" : "[id][ext]", | ||||||
|       crossOriginLoading: "use-credentials", |       crossOriginLoading: "use-credentials", | ||||||
|       hashFunction: "xxhash64", |       hashFunction: "xxhash64", | ||||||
|  |       hashDigest: "base64url", | ||||||
|  |       hashDigestLength: 11, // full length of 64 bit base64url
 | ||||||
|       path: outputPath, |       path: outputPath, | ||||||
|       publicPath, |       publicPath, | ||||||
|       // To silence warning in worker plugin
 |       // To silence warning in worker plugin
 | ||||||
| @@ -257,17 +252,17 @@ const createAppConfig = ({ | |||||||
|   isStatsBuild, |   isStatsBuild, | ||||||
|   isTestBuild, |   isTestBuild, | ||||||
| }) => | }) => | ||||||
|   createRspackConfig( |   createWebpackConfig( | ||||||
|     bundle.config.app({ isProdBuild, latestBuild, isStatsBuild, isTestBuild }) |     bundle.config.app({ isProdBuild, latestBuild, isStatsBuild, isTestBuild }) | ||||||
|   ); |   ); | ||||||
| 
 | 
 | ||||||
| const createDemoConfig = ({ isProdBuild, latestBuild, isStatsBuild }) => | const createDemoConfig = ({ isProdBuild, latestBuild, isStatsBuild }) => | ||||||
|   createRspackConfig( |   createWebpackConfig( | ||||||
|     bundle.config.demo({ isProdBuild, latestBuild, isStatsBuild }) |     bundle.config.demo({ isProdBuild, latestBuild, isStatsBuild }) | ||||||
|   ); |   ); | ||||||
| 
 | 
 | ||||||
| const createCastConfig = ({ isProdBuild, latestBuild }) => | const createCastConfig = ({ isProdBuild, latestBuild }) => | ||||||
|   createRspackConfig(bundle.config.cast({ isProdBuild, latestBuild })); |   createWebpackConfig(bundle.config.cast({ isProdBuild, latestBuild })); | ||||||
| 
 | 
 | ||||||
| const createHassioConfig = ({ | const createHassioConfig = ({ | ||||||
|   isProdBuild, |   isProdBuild, | ||||||
| @@ -275,7 +270,7 @@ const createHassioConfig = ({ | |||||||
|   isStatsBuild, |   isStatsBuild, | ||||||
|   isTestBuild, |   isTestBuild, | ||||||
| }) => | }) => | ||||||
|   createRspackConfig( |   createWebpackConfig( | ||||||
|     bundle.config.hassio({ |     bundle.config.hassio({ | ||||||
|       isProdBuild, |       isProdBuild, | ||||||
|       latestBuild, |       latestBuild, | ||||||
| @@ -285,10 +280,7 @@ const createHassioConfig = ({ | |||||||
|   ); |   ); | ||||||
| 
 | 
 | ||||||
| const createGalleryConfig = ({ isProdBuild, latestBuild }) => | const createGalleryConfig = ({ isProdBuild, latestBuild }) => | ||||||
|   createRspackConfig(bundle.config.gallery({ isProdBuild, latestBuild })); |   createWebpackConfig(bundle.config.gallery({ isProdBuild, latestBuild })); | ||||||
| 
 |  | ||||||
| const createLandingPageConfig = ({ isProdBuild, latestBuild }) => |  | ||||||
|   createRspackConfig(bundle.config.landingPage({ isProdBuild, latestBuild })); |  | ||||||
| 
 | 
 | ||||||
| module.exports = { | module.exports = { | ||||||
|   createAppConfig, |   createAppConfig, | ||||||
| @@ -296,6 +288,5 @@ module.exports = { | |||||||
|   createCastConfig, |   createCastConfig, | ||||||
|   createHassioConfig, |   createHassioConfig, | ||||||
|   createGalleryConfig, |   createGalleryConfig, | ||||||
|   createRspackConfig, |   createWebpackConfig, | ||||||
|   createLandingPageConfig, |  | ||||||
| }; | }; | ||||||
							
								
								
									
										10
									
								
								cast/rollup.config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								cast/rollup.config.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | |||||||
|  | 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 }; | ||||||
| @@ -1,12 +1,10 @@ | |||||||
| import "@material/mwc-button/mwc-button"; | import "@material/mwc-button/mwc-button"; | ||||||
| import "@material/mwc-list/mwc-list"; | import { ActionDetail } from "@material/mwc-list/mwc-list"; | ||||||
| import type { ActionDetail } from "@material/mwc-list/mwc-list"; |  | ||||||
| import { mdiCast, mdiCastConnected, mdiViewDashboard } from "@mdi/js"; | import { mdiCast, mdiCastConnected, mdiViewDashboard } from "@mdi/js"; | ||||||
| import type { Auth, Connection } from "home-assistant-js-websocket"; | import { Auth, Connection } from "home-assistant-js-websocket"; | ||||||
| import type { CSSResultGroup, TemplateResult } from "lit"; | import { CSSResultGroup, LitElement, TemplateResult, css, html } from "lit"; | ||||||
| import { LitElement, css, html } from "lit"; |  | ||||||
| import { customElement, property, state } from "lit/decorators"; | import { customElement, property, state } from "lit/decorators"; | ||||||
| import type { CastManager } from "../../../../src/cast/cast_manager"; | import { CastManager } from "../../../../src/cast/cast_manager"; | ||||||
| import { | import { | ||||||
|   castSendShowLovelaceView, |   castSendShowLovelaceView, | ||||||
|   ensureConnectedCastSession, |   ensureConnectedCastSession, | ||||||
| @@ -25,7 +23,7 @@ import { | |||||||
|   getLovelaceCollection, |   getLovelaceCollection, | ||||||
| } from "../../../../src/data/lovelace"; | } from "../../../../src/data/lovelace"; | ||||||
| import { isStrategyDashboard } from "../../../../src/data/lovelace/config/types"; | import { isStrategyDashboard } from "../../../../src/data/lovelace/config/types"; | ||||||
| import type { LovelaceViewConfig } from "../../../../src/data/lovelace/config/view"; | import { LovelaceViewConfig } from "../../../../src/data/lovelace/config/view"; | ||||||
| import "../../../../src/layouts/hass-loading-screen"; | import "../../../../src/layouts/hass-loading-screen"; | ||||||
| import { generateDefaultViewConfig } from "../../../../src/panels/lovelace/common/generate-lovelace-config"; | import { generateDefaultViewConfig } from "../../../../src/panels/lovelace/common/generate-lovelace-config"; | ||||||
| import "./hc-layout"; | import "./hc-layout"; | ||||||
| @@ -91,8 +89,8 @@ class HcCast extends LitElement { | |||||||
|                       generateDefaultViewConfig({}, {}, {}, {}, () => ""), |                       generateDefaultViewConfig({}, {}, {}, {}, () => ""), | ||||||
|                     ] |                     ] | ||||||
|                   ).map( |                   ).map( | ||||||
|                     (view, idx) => html` |                     (view, idx) => | ||||||
|                       <ha-list-item |                       html`<ha-list-item | ||||||
|                         graphic="avatar" |                         graphic="avatar" | ||||||
|                         .activated=${this.castManager.status?.lovelacePath === |                         .activated=${this.castManager.status?.lovelacePath === | ||||||
|                         (view.path ?? idx)} |                         (view.path ?? idx)} | ||||||
| @@ -110,9 +108,8 @@ class HcCast extends LitElement { | |||||||
|                           : html`<ha-svg-icon |                           : html`<ha-svg-icon | ||||||
|                               slot="item-icon" |                               slot="item-icon" | ||||||
|                               .path=${mdiViewDashboard} |                               .path=${mdiViewDashboard} | ||||||
|                             ></ha-svg-icon>`} |                             ></ha-svg-icon>`}</ha-list-item | ||||||
|                       </ha-list-item> |                       > ` | ||||||
|                     ` |  | ||||||
|                   )}</mwc-list |                   )}</mwc-list | ||||||
|                 > |                 > | ||||||
|               `} |               `} | ||||||
|   | |||||||
| @@ -1,23 +1,19 @@ | |||||||
| import "@material/mwc-button"; | import "@material/mwc-button"; | ||||||
| import { mdiCastConnected, mdiCast } from "@mdi/js"; | import { mdiCastConnected, mdiCast } from "@mdi/js"; | ||||||
| import type { | import { | ||||||
|   Auth, |   Auth, | ||||||
|   Connection, |   Connection, | ||||||
|   getAuthOptions, |  | ||||||
| } from "home-assistant-js-websocket"; |  | ||||||
| import { |  | ||||||
|   createConnection, |   createConnection, | ||||||
|   ERR_CANNOT_CONNECT, |   ERR_CANNOT_CONNECT, | ||||||
|   ERR_HASS_HOST_REQUIRED, |   ERR_HASS_HOST_REQUIRED, | ||||||
|   ERR_INVALID_AUTH, |   ERR_INVALID_AUTH, | ||||||
|   ERR_INVALID_HTTPS_TO_HTTP, |   ERR_INVALID_HTTPS_TO_HTTP, | ||||||
|   getAuth, |   getAuth, | ||||||
|  |   getAuthOptions, | ||||||
| } from "home-assistant-js-websocket"; | } from "home-assistant-js-websocket"; | ||||||
| import type { CSSResultGroup, TemplateResult } from "lit"; | import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; | ||||||
| import { css, html, LitElement } from "lit"; |  | ||||||
| import { customElement, state } from "lit/decorators"; | import { customElement, state } from "lit/decorators"; | ||||||
| import type { CastManager } from "../../../../src/cast/cast_manager"; | import { CastManager, getCastManager } from "../../../../src/cast/cast_manager"; | ||||||
| import { getCastManager } from "../../../../src/cast/cast_manager"; |  | ||||||
| import { castSendShowDemo } from "../../../../src/cast/receiver_messages"; | import { castSendShowDemo } from "../../../../src/cast/receiver_messages"; | ||||||
| import { | import { | ||||||
|   loadTokens, |   loadTokens, | ||||||
|   | |||||||
| @@ -1,7 +1,10 @@ | |||||||
| import type { Auth, Connection, HassUser } from "home-assistant-js-websocket"; | import { | ||||||
| import { getUser } from "home-assistant-js-websocket"; |   Auth, | ||||||
| import type { CSSResultGroup, TemplateResult } from "lit"; |   Connection, | ||||||
| import { css, html, LitElement } from "lit"; |   getUser, | ||||||
|  |   HassUser, | ||||||
|  | } from "home-assistant-js-websocket"; | ||||||
|  | import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; | ||||||
| import { customElement, property } from "lit/decorators"; | import { customElement, property } from "lit/decorators"; | ||||||
| import "../../../../src/components/ha-card"; | import "../../../../src/components/ha-card"; | ||||||
|  |  | ||||||
| @@ -85,7 +88,7 @@ class HcLayout extends LitElement { | |||||||
|       } |       } | ||||||
|  |  | ||||||
|       .card-header { |       .card-header { | ||||||
|         color: var(--ha-card-header-color, var(--primary-text-color)); |         color: var(--ha-card-header-color, --primary-text-color); | ||||||
|         font-family: var(--ha-card-header-font-family, inherit); |         font-family: var(--ha-card-header-font-family, inherit); | ||||||
|         font-size: var(--ha-card-header-font-size, 24px); |         font-size: var(--ha-card-header-font-size, 24px); | ||||||
|         letter-spacing: -0.012em; |         letter-spacing: -0.012em; | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| import type { Entity } from "../../../../src/fake_data/entity"; | import { convertEntities, Entity } from "../../../../src/fake_data/entity"; | ||||||
| import { convertEntities } from "../../../../src/fake_data/entity"; |  | ||||||
|  |  | ||||||
| export const castDemoEntities: () => Entity[] = () => | export const castDemoEntities: () => Entity[] = () => | ||||||
|   convertEntities({ |   convertEntities({ | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| import type { LovelaceCardConfig } from "../../../../src/data/lovelace/config/card"; | import { LovelaceCardConfig } from "../../../../src/data/lovelace/config/card"; | ||||||
| import type { LovelaceConfig } from "../../../../src/data/lovelace/config/types"; | import { LovelaceConfig } from "../../../../src/data/lovelace/config/types"; | ||||||
| import { castContext } from "../cast_context"; | import { castContext } from "../cast_context"; | ||||||
|  |  | ||||||
| export const castDemoLovelace: () => LovelaceConfig = () => { | export const castDemoLovelace: () => LovelaceConfig = () => { | ||||||
|   | |||||||
| @@ -1,10 +1,10 @@ | |||||||
| import { framework } from "./cast_framework"; | import { framework } from "./cast_framework"; | ||||||
| import { CAST_NS } from "../../../src/cast/const"; | import { CAST_NS } from "../../../src/cast/const"; | ||||||
| import type { HassMessage } from "../../../src/cast/receiver_messages"; | import { HassMessage } from "../../../src/cast/receiver_messages"; | ||||||
| import "../../../src/resources/custom-card-support"; | import "../../../src/resources/custom-card-support"; | ||||||
| import { castContext } from "./cast_context"; | import { castContext } from "./cast_context"; | ||||||
| import { HcMain } from "./layout/hc-main"; | import { HcMain } from "./layout/hc-main"; | ||||||
| import type { ReceivedMessage } from "./types"; | import { ReceivedMessage } from "./types"; | ||||||
|  |  | ||||||
| const lovelaceController = new HcMain(); | const lovelaceController = new HcMain(); | ||||||
| document.body.append(lovelaceController); | document.body.append(lovelaceController); | ||||||
|   | |||||||
| @@ -1,11 +1,13 @@ | |||||||
| import { html, nothing } from "lit"; | import { html, nothing } from "lit"; | ||||||
| import { customElement, property, state } from "lit/decorators"; | import { customElement, property, state } from "lit/decorators"; | ||||||
| import { mockHistory } from "../../../../demo/src/stubs/history"; | import { mockHistory } from "../../../../demo/src/stubs/history"; | ||||||
| import type { LovelaceConfig } from "../../../../src/data/lovelace/config/types"; | import { LovelaceConfig } from "../../../../src/data/lovelace/config/types"; | ||||||
| import type { MockHomeAssistant } from "../../../../src/fake_data/provide_hass"; | import { | ||||||
| import { provideHass } from "../../../../src/fake_data/provide_hass"; |   MockHomeAssistant, | ||||||
|  |   provideHass, | ||||||
|  | } from "../../../../src/fake_data/provide_hass"; | ||||||
| import { HassElement } from "../../../../src/state/hass-element"; | import { HassElement } from "../../../../src/state/hass-element"; | ||||||
| import type { HomeAssistant } from "../../../../src/types"; | import { HomeAssistant } from "../../../../src/types"; | ||||||
| import { castDemoEntities } from "../demo/cast-demo-entities"; | import { castDemoEntities } from "../demo/cast-demo-entities"; | ||||||
| import { castDemoLovelace } from "../demo/cast-demo-lovelace"; | import { castDemoLovelace } from "../demo/cast-demo-lovelace"; | ||||||
| import "./hc-lovelace"; | import "./hc-lovelace"; | ||||||
|   | |||||||
| @@ -1,7 +1,6 @@ | |||||||
| import type { CSSResultGroup, TemplateResult } from "lit"; | import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; | ||||||
| import { css, html, LitElement } from "lit"; |  | ||||||
| import { customElement, property } from "lit/decorators"; | import { customElement, property } from "lit/decorators"; | ||||||
| import type { HomeAssistant } from "../../../../src/types"; | import { HomeAssistant } from "../../../../src/types"; | ||||||
|  |  | ||||||
| @customElement("hc-launch-screen") | @customElement("hc-launch-screen") | ||||||
| class HcLaunchScreen extends LitElement { | class HcLaunchScreen extends LitElement { | ||||||
|   | |||||||
| @@ -1,18 +1,11 @@ | |||||||
| import { | import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; | ||||||
|   css, | import { customElement, property, query } from "lit/decorators"; | ||||||
|   type CSSResultGroup, |  | ||||||
|   html, |  | ||||||
|   LitElement, |  | ||||||
|   type TemplateResult, |  | ||||||
| } from "lit"; |  | ||||||
| import { customElement, property } from "lit/decorators"; |  | ||||||
| import { fireEvent } from "../../../../src/common/dom/fire_event"; | import { fireEvent } from "../../../../src/common/dom/fire_event"; | ||||||
| import type { LovelaceConfig } from "../../../../src/data/lovelace/config/types"; | import { LovelaceConfig } from "../../../../src/data/lovelace/config/types"; | ||||||
| import { getPanelTitleFromUrlPath } from "../../../../src/data/panel"; | import { getPanelTitleFromUrlPath } from "../../../../src/data/panel"; | ||||||
| import type { Lovelace } from "../../../../src/panels/lovelace/types"; | import { Lovelace } from "../../../../src/panels/lovelace/types"; | ||||||
| import "../../../../src/panels/lovelace/views/hui-view"; | import "../../../../src/panels/lovelace/views/hui-view"; | ||||||
| import "../../../../src/panels/lovelace/views/hui-view-container"; | import { HomeAssistant } from "../../../../src/types"; | ||||||
| import type { HomeAssistant } from "../../../../src/types"; |  | ||||||
| import "./hc-launch-screen"; | import "./hc-launch-screen"; | ||||||
|  |  | ||||||
| (window as any).loadCardHelpers = () => | (window as any).loadCardHelpers = () => | ||||||
| @@ -25,9 +18,11 @@ class HcLovelace extends LitElement { | |||||||
|   @property({ attribute: false }) |   @property({ attribute: false }) | ||||||
|   public lovelaceConfig!: LovelaceConfig; |   public lovelaceConfig!: LovelaceConfig; | ||||||
|  |  | ||||||
|   @property({ attribute: false }) public viewPath?: string | number | null; |   @property() public viewPath?: string | number | null; | ||||||
|  |  | ||||||
|   @property({ attribute: false }) public urlPath: string | null = null; |   @property() public urlPath: string | null = null; | ||||||
|  |  | ||||||
|  |   @query("hui-view") private _huiView?: HTMLElement; | ||||||
|  |  | ||||||
|   protected render(): TemplateResult { |   protected render(): TemplateResult { | ||||||
|     const index = this._viewIndex; |     const index = this._viewIndex; | ||||||
| @@ -50,24 +45,13 @@ class HcLovelace extends LitElement { | |||||||
|       saveConfig: async () => undefined, |       saveConfig: async () => undefined, | ||||||
|       deleteConfig: async () => undefined, |       deleteConfig: async () => undefined, | ||||||
|       setEditMode: () => undefined, |       setEditMode: () => undefined, | ||||||
|       showToast: () => undefined, |  | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     const viewConfig = this.lovelaceConfig.views[index]; |  | ||||||
|     const background = viewConfig.background || this.lovelaceConfig.background; |  | ||||||
|  |  | ||||||
|     return html` |     return html` | ||||||
|       <hui-view-container |  | ||||||
|         .hass=${this.hass} |  | ||||||
|         .background=${background} |  | ||||||
|         .theme=${viewConfig.theme} |  | ||||||
|       > |  | ||||||
|       <hui-view |       <hui-view | ||||||
|         .hass=${this.hass} |         .hass=${this.hass} | ||||||
|         .lovelace=${lovelace} |         .lovelace=${lovelace} | ||||||
|         .index=${index} |         .index=${index} | ||||||
|       ></hui-view> |       ></hui-view> | ||||||
|       </hui-view-container> |  | ||||||
|     `; |     `; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -97,6 +81,26 @@ class HcLovelace extends LitElement { | |||||||
|                 }${viewTitle || ""}` |                 }${viewTitle || ""}` | ||||||
|               : undefined, |               : undefined, | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|  |         const configBackground = | ||||||
|  |           this.lovelaceConfig.views[index].background || | ||||||
|  |           this.lovelaceConfig.background; | ||||||
|  |  | ||||||
|  |         const backgroundStyle = | ||||||
|  |           typeof configBackground === "string" | ||||||
|  |             ? configBackground | ||||||
|  |             : configBackground?.image | ||||||
|  |               ? `center / cover no-repeat url('${configBackground.image}')` | ||||||
|  |               : undefined; | ||||||
|  |  | ||||||
|  |         if (backgroundStyle) { | ||||||
|  |           this._huiView!.style.setProperty( | ||||||
|  |             "--lovelace-background", | ||||||
|  |             backgroundStyle | ||||||
|  |           ); | ||||||
|  |         } else { | ||||||
|  |           this._huiView!.style.removeProperty("--lovelace-background"); | ||||||
|  |         } | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| @@ -120,15 +124,19 @@ class HcLovelace extends LitElement { | |||||||
|  |  | ||||||
|   static get styles(): CSSResultGroup { |   static get styles(): CSSResultGroup { | ||||||
|     return css` |     return css` | ||||||
|       hui-view-container { |       :host { | ||||||
|         display: flex; |  | ||||||
|         position: relative; |  | ||||||
|         min-height: 100vh; |         min-height: 100vh; | ||||||
|  |         height: 0; | ||||||
|  |         display: flex; | ||||||
|  |         flex-direction: column; | ||||||
|         box-sizing: border-box; |         box-sizing: border-box; | ||||||
|  |         background: var(--primary-background-color); | ||||||
|  |       } | ||||||
|  |       :host > * { | ||||||
|  |         flex: 1; | ||||||
|       } |       } | ||||||
|       hui-view { |       hui-view { | ||||||
|         flex: 1 1 100%; |         background: var(--lovelace-background, var(--primary-background-color)); | ||||||
|         max-width: 100%; |  | ||||||
|       } |       } | ||||||
|     `; |     `; | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -1,33 +1,35 @@ | |||||||
| import type { UnsubscribeFunc } from "home-assistant-js-websocket"; | import { | ||||||
| import { createConnection, getAuth } from "home-assistant-js-websocket"; |   createConnection, | ||||||
| import type { TemplateResult } from "lit"; |   getAuth, | ||||||
| import { html } from "lit"; |   UnsubscribeFunc, | ||||||
|  | } from "home-assistant-js-websocket"; | ||||||
|  | import { html, TemplateResult } from "lit"; | ||||||
| import { customElement, state } from "lit/decorators"; | import { customElement, state } from "lit/decorators"; | ||||||
| import { CAST_NS } from "../../../../src/cast/const"; | import { CAST_NS } from "../../../../src/cast/const"; | ||||||
| import type { | import { | ||||||
|   ConnectMessage, |   ConnectMessage, | ||||||
|   GetStatusMessage, |   GetStatusMessage, | ||||||
|   HassMessage, |   HassMessage, | ||||||
|   ShowDemoMessage, |   ShowDemoMessage, | ||||||
|   ShowLovelaceViewMessage, |   ShowLovelaceViewMessage, | ||||||
| } from "../../../../src/cast/receiver_messages"; | } from "../../../../src/cast/receiver_messages"; | ||||||
| import type { | import { | ||||||
|  |   ReceiverErrorCode, | ||||||
|   ReceiverErrorMessage, |   ReceiverErrorMessage, | ||||||
|   ReceiverStatusMessage, |   ReceiverStatusMessage, | ||||||
| } from "../../../../src/cast/sender_messages"; | } from "../../../../src/cast/sender_messages"; | ||||||
| import { ReceiverErrorCode } from "../../../../src/cast/sender_messages"; |  | ||||||
| import { atLeastVersion } from "../../../../src/common/config/version"; | import { atLeastVersion } from "../../../../src/common/config/version"; | ||||||
| import { isNavigationClick } from "../../../../src/common/dom/is-navigation-click"; | import { isNavigationClick } from "../../../../src/common/dom/is-navigation-click"; | ||||||
| import { | import { | ||||||
|   getLegacyLovelaceCollection, |   getLegacyLovelaceCollection, | ||||||
|   getLovelaceCollection, |   getLovelaceCollection, | ||||||
| } from "../../../../src/data/lovelace"; | } from "../../../../src/data/lovelace"; | ||||||
| import type { | import { | ||||||
|  |   isStrategyDashboard, | ||||||
|   LegacyLovelaceConfig, |   LegacyLovelaceConfig, | ||||||
|   LovelaceConfig, |   LovelaceConfig, | ||||||
|   LovelaceDashboardStrategyConfig, |   LovelaceDashboardStrategyConfig, | ||||||
| } from "../../../../src/data/lovelace/config/types"; | } from "../../../../src/data/lovelace/config/types"; | ||||||
| import { isStrategyDashboard } from "../../../../src/data/lovelace/config/types"; |  | ||||||
| import { fetchResources } from "../../../../src/data/lovelace/resource"; | import { fetchResources } from "../../../../src/data/lovelace/resource"; | ||||||
| import { loadLovelaceResources } from "../../../../src/panels/lovelace/common/load-resources"; | import { loadLovelaceResources } from "../../../../src/panels/lovelace/common/load-resources"; | ||||||
| import { HassElement } from "../../../../src/state/hass-element"; | import { HassElement } from "../../../../src/state/hass-element"; | ||||||
| @@ -144,10 +146,10 @@ export class HcMain extends HassElement { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (senderId) { |     if (senderId) { | ||||||
|       this._sendMessage(senderId, status); |       this.sendMessage(senderId, status); | ||||||
|     } else { |     } else { | ||||||
|       for (const sender of castContext.getSenders()) { |       for (const sender of castContext.getSenders()) { | ||||||
|         this._sendMessage(sender.id, status); |         this.sendMessage(sender.id, status); | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| @@ -164,10 +166,10 @@ export class HcMain extends HassElement { | |||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     if (senderId) { |     if (senderId) { | ||||||
|       this._sendMessage(senderId, error); |       this.sendMessage(senderId, error); | ||||||
|     } else { |     } else { | ||||||
|       for (const sender of castContext.getSenders()) { |       for (const sender of castContext.getSenders()) { | ||||||
|         this._sendMessage(sender.id, error); |         this.sendMessage(sender.id, error); | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| @@ -394,7 +396,7 @@ export class HcMain extends HassElement { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   private _sendMessage(senderId: string, response: any) { |   private sendMessage(senderId: string, response: any) { | ||||||
|     castContext.sendCustomMessage(CAST_NS, senderId, response); |     castContext.sendCustomMessage(CAST_NS, senderId, response); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										8
									
								
								cast/webpack.config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								cast/webpack.config.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | import webpack from "../build-scripts/webpack.cjs"; | ||||||
|  | import env from "../build-scripts/env.cjs"; | ||||||
|  |  | ||||||
|  | export default webpack.createCastConfig({ | ||||||
|  |   isProdBuild: env.isProdBuild(), | ||||||
|  |   isStatsBuild: env.isStatsBuild(), | ||||||
|  |   latestBuild: true, | ||||||
|  | }); | ||||||
							
								
								
									
										10
									
								
								demo/rollup.config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								demo/rollup.config.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | |||||||
|  | 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 }; | ||||||
| @@ -4,6 +4,11 @@ | |||||||
| # Stop on errors | # Stop on errors | ||||||
| set -e | set -e | ||||||
|  |  | ||||||
| cd "$(dirname "$0")/../.." | cd "$(dirname "$0")/.." | ||||||
|  |  | ||||||
| ./node_modules/.bin/gulp analyze-demo | export STATS=1 | ||||||
|  | statsfile="compilation-stats-demo.json" | ||||||
|  |  | ||||||
|  | ./node_modules/.bin/webpack-cli --profile --node-env=production --json=$statsfile | ||||||
|  | npx webpack-bundle-analyzer $statsfile dist/frontend_latest | ||||||
|  | rm -f $statsfile | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| import { convertEntities } from "../../../../src/fake_data/entity"; | import { convertEntities } from "../../../../src/fake_data/entity"; | ||||||
| import type { DemoConfig } from "../types"; | import { DemoConfig } from "../types"; | ||||||
|  |  | ||||||
| export const demoEntitiesArsaboo: DemoConfig["entities"] = (localize) => | export const demoEntitiesArsaboo: DemoConfig["entities"] = (localize) => | ||||||
|   convertEntities({ |   convertEntities({ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| import type { DemoConfig } from "../types"; | import { DemoConfig } from "../types"; | ||||||
| import { demoEntitiesArsaboo } from "./entities"; | import { demoEntitiesArsaboo } from "./entities"; | ||||||
| import { demoLovelaceArsaboo } from "./lovelace"; | import { demoLovelaceArsaboo } from "./lovelace"; | ||||||
| import { demoThemeArsaboo } from "./theme"; | import { demoThemeArsaboo } from "./theme"; | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| import type { DemoConfig } from "../types"; | import { DemoConfig } from "../types"; | ||||||
|  |  | ||||||
| export const demoLovelaceArsaboo: DemoConfig["lovelace"] = (localize) => ({ | export const demoLovelaceArsaboo: DemoConfig["lovelace"] = (localize) => ({ | ||||||
|   title: "Home Assistant", |   title: "Home Assistant", | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | import { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | ||||||
| import type { Lovelace } from "../../../src/panels/lovelace/types"; | import { Lovelace } from "../../../src/panels/lovelace/types"; | ||||||
| import { energyEntities } from "../stubs/entities"; | import { energyEntities } from "../stubs/entities"; | ||||||
| import type { DemoConfig } from "./types"; | import { DemoConfig } from "./types"; | ||||||
|  |  | ||||||
| export const demoConfigs: Array<() => Promise<DemoConfig>> = [ | export const demoConfigs: Array<() => Promise<DemoConfig>> = [ | ||||||
|   () => import("./sections").then((mod) => mod.demoSections), |   () => import("./sections").then((mod) => mod.demoSections), | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| import { convertEntities } from "../../../../src/fake_data/entity"; | import { convertEntities } from "../../../../src/fake_data/entity"; | ||||||
| import type { DemoConfig } from "../types"; | import { DemoConfig } from "../types"; | ||||||
|  |  | ||||||
| export const demoEntitiesJimpower: DemoConfig["entities"] = () => | export const demoEntitiesJimpower: DemoConfig["entities"] = () => | ||||||
|   convertEntities({ |   convertEntities({ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| import type { DemoConfig } from "../types"; | import { DemoConfig } from "../types"; | ||||||
| import { demoEntitiesJimpower } from "./entities"; | import { demoEntitiesJimpower } from "./entities"; | ||||||
| import { demoLovelaceJimpower } from "./lovelace"; | import { demoLovelaceJimpower } from "./lovelace"; | ||||||
| import { demoThemeJimpower } from "./theme"; | import { demoThemeJimpower } from "./theme"; | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| import "../../custom-cards/card-modder"; | import "../../custom-cards/card-modder"; | ||||||
| import type { DemoConfig } from "../types"; | import { DemoConfig } from "../types"; | ||||||
|  |  | ||||||
| export const demoLovelaceJimpower: DemoConfig["lovelace"] = () => ({ | export const demoLovelaceJimpower: DemoConfig["lovelace"] = () => ({ | ||||||
|   name: "Kingia Castle", |   name: "Kingia Castle", | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| import { convertEntities } from "../../../../src/fake_data/entity"; | import { convertEntities } from "../../../../src/fake_data/entity"; | ||||||
| import type { DemoConfig } from "../types"; | import { DemoConfig } from "../types"; | ||||||
|  |  | ||||||
| export const demoEntitiesKernehed: DemoConfig["entities"] = () => | export const demoEntitiesKernehed: DemoConfig["entities"] = () => | ||||||
|   convertEntities({ |   convertEntities({ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| import type { DemoConfig } from "../types"; | import { DemoConfig } from "../types"; | ||||||
| import { demoEntitiesKernehed } from "./entities"; | import { demoEntitiesKernehed } from "./entities"; | ||||||
| import { demoLovelaceKernehed } from "./lovelace"; | import { demoLovelaceKernehed } from "./lovelace"; | ||||||
| import { demoThemeKernehed } from "./theme"; | import { demoThemeKernehed } from "./theme"; | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| import type { DemoConfig } from "../types"; | import { DemoConfig } from "../types"; | ||||||
|  |  | ||||||
| export const demoLovelaceKernehed: DemoConfig["lovelace"] = () => ({ | export const demoLovelaceKernehed: DemoConfig["lovelace"] = () => ({ | ||||||
|   name: "Hem", |   name: "Hem", | ||||||
|   | |||||||
							
								
								
									
										16
									
								
								demo/src/configs/sections/description.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								demo/src/configs/sections/description.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | |||||||
|  | import { html } from "lit"; | ||||||
|  | import { DemoConfig } from "../types"; | ||||||
|  |  | ||||||
|  | export const demoLovelaceDescription: DemoConfig["description"] = ( | ||||||
|  |   localize | ||||||
|  | ) => html` | ||||||
|  |   <p> | ||||||
|  |     ${localize("ui.panel.page-demo.config.sections.description", { | ||||||
|  |       blog_post: html`<a | ||||||
|  |         href="https://www.home-assistant.io/blog/2024/03/04/dashboard-chapter-1/" | ||||||
|  |         target="_blank" | ||||||
|  |         >${localize("ui.panel.page-demo.config.sections.description_blog_post")} | ||||||
|  |       </a>`, | ||||||
|  |     })} | ||||||
|  |   </p> | ||||||
|  | `; | ||||||
| @@ -1,5 +1,5 @@ | |||||||
| import { convertEntities } from "../../../../src/fake_data/entity"; | import { convertEntities } from "../../../../src/fake_data/entity"; | ||||||
| import type { DemoConfig } from "../types"; | import { DemoConfig } from "../types"; | ||||||
|  |  | ||||||
| export const demoEntitiesSections: DemoConfig["entities"] = (localize) => | export const demoEntitiesSections: DemoConfig["entities"] = (localize) => | ||||||
|   convertEntities({ |   convertEntities({ | ||||||
|   | |||||||
| @@ -1,4 +1,5 @@ | |||||||
| import type { DemoConfig } from "../types"; | import { DemoConfig } from "../types"; | ||||||
|  | import { demoLovelaceDescription } from "./description"; | ||||||
| import { demoEntitiesSections } from "./entities"; | import { demoEntitiesSections } from "./entities"; | ||||||
| import { demoLovelaceSections } from "./lovelace"; | import { demoLovelaceSections } from "./lovelace"; | ||||||
|  |  | ||||||
| @@ -6,6 +7,7 @@ export const demoSections: DemoConfig = { | |||||||
|   authorName: "Home Assistant", |   authorName: "Home Assistant", | ||||||
|   authorUrl: "https://github.com/home-assistant/frontend/", |   authorUrl: "https://github.com/home-assistant/frontend/", | ||||||
|   name: "Home Demo", |   name: "Home Demo", | ||||||
|  |   description: demoLovelaceDescription, | ||||||
|   lovelace: demoLovelaceSections, |   lovelace: demoLovelaceSections, | ||||||
|   entities: demoEntitiesSections, |   entities: demoEntitiesSections, | ||||||
|   theme: () => ({}), |   theme: () => ({}), | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| import { isFrontpageEmbed } from "../../util/is_frontpage"; | import { isFrontpageEmbed } from "../../util/is_frontpage"; | ||||||
| import type { DemoConfig } from "../types"; | import { DemoConfig } from "../types"; | ||||||
|  |  | ||||||
| export const demoLovelaceSections: DemoConfig["lovelace"] = (localize) => ({ | export const demoLovelaceSections: DemoConfig["lovelace"] = (localize) => ({ | ||||||
|   title: "Home Assistant Demo", |   title: "Home Assistant Demo", | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| import { convertEntities } from "../../../../src/fake_data/entity"; | import { convertEntities } from "../../../../src/fake_data/entity"; | ||||||
| import type { DemoConfig } from "../types"; | import { DemoConfig } from "../types"; | ||||||
|  |  | ||||||
| export const demoEntitiesTeachingbirds: DemoConfig["entities"] = () => | export const demoEntitiesTeachingbirds: DemoConfig["entities"] = () => | ||||||
|   convertEntities({ |   convertEntities({ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| import type { DemoConfig } from "../types"; | import { DemoConfig } from "../types"; | ||||||
| import { demoEntitiesTeachingbirds } from "./entities"; | import { demoEntitiesTeachingbirds } from "./entities"; | ||||||
| import { demoLovelaceTeachingbirds } from "./lovelace"; | import { demoLovelaceTeachingbirds } from "./lovelace"; | ||||||
| import { demoThemeTeachingbirds } from "./theme"; | import { demoThemeTeachingbirds } from "./theme"; | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| import type { DemoConfig } from "../types"; | import { DemoConfig } from "../types"; | ||||||
|  |  | ||||||
| export const demoLovelaceTeachingbirds: DemoConfig["lovelace"] = () => ({ | export const demoLovelaceTeachingbirds: DemoConfig["lovelace"] = () => ({ | ||||||
|   title: "Home", |   title: "Home", | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| import type { TemplateResult } from "lit"; | import { TemplateResult } from "lit"; | ||||||
| import type { LocalizeFunc } from "../../../src/common/translations/localize"; | import { LocalizeFunc } from "../../../src/common/translations/localize"; | ||||||
| import type { LovelaceConfig } from "../../../src/data/lovelace/config/types"; | import { LovelaceConfig } from "../../../src/data/lovelace/config/types"; | ||||||
| import type { Entity } from "../../../src/fake_data/entity"; | import { Entity } from "../../../src/fake_data/entity"; | ||||||
|  |  | ||||||
| export interface DemoConfig { | export interface DemoConfig { | ||||||
|   index?: number; |   index?: number; | ||||||
|   | |||||||
| @@ -1,15 +1,14 @@ | |||||||
| import { mdiTelevision } from "@mdi/js"; | import { mdiTelevision } from "@mdi/js"; | ||||||
| import type { CSSResultGroup } from "lit"; | import { css, CSSResultGroup, html, LitElement, nothing } from "lit"; | ||||||
| import { css, html, LitElement, nothing } from "lit"; |  | ||||||
| import { customElement, state } from "lit/decorators"; | import { customElement, state } from "lit/decorators"; | ||||||
| import type { CastManager } from "../../../src/cast/cast_manager"; | import { CastManager } from "../../../src/cast/cast_manager"; | ||||||
| import { castSendShowDemo } from "../../../src/cast/receiver_messages"; | import { castSendShowDemo } from "../../../src/cast/receiver_messages"; | ||||||
| import "../../../src/components/ha-icon"; | import "../../../src/components/ha-icon"; | ||||||
| import type { | import { | ||||||
|   CastConfig, |   CastConfig, | ||||||
|   LovelaceRow, |   LovelaceRow, | ||||||
| } from "../../../src/panels/lovelace/entity-rows/types"; | } from "../../../src/panels/lovelace/entity-rows/types"; | ||||||
| import type { HomeAssistant } from "../../../src/types"; | import { HomeAssistant } from "../../../src/types"; | ||||||
|  |  | ||||||
| @customElement("cast-demo-row") | @customElement("cast-demo-row") | ||||||
| class CastDemoRow extends LitElement implements LovelaceRow { | class CastDemoRow extends LitElement implements LovelaceRow { | ||||||
| @@ -46,6 +45,7 @@ class CastDemoRow extends LitElement implements LovelaceRow { | |||||||
|           this.requestUpdate(); |           this.requestUpdate(); | ||||||
|         }); |         }); | ||||||
|         mgr.castContext.addEventListener( |         mgr.castContext.addEventListener( | ||||||
|  |           // eslint-disable-next-line no-undef | ||||||
|           cast.framework.CastContextEventType.SESSION_STATE_CHANGED, |           cast.framework.CastContextEventType.SESSION_STATE_CHANGED, | ||||||
|           (ev) => { |           (ev) => { | ||||||
|             // On Android, opening a new session always results in SESSION_RESUMED. |             // On Android, opening a new session always results in SESSION_RESUMED. | ||||||
|   | |||||||
| @@ -1,17 +1,13 @@ | |||||||
| import type { CSSResultGroup } from "lit"; | import { css, CSSResultGroup, html, LitElement, nothing } from "lit"; | ||||||
| import { css, html, LitElement, nothing } from "lit"; |  | ||||||
| import { customElement, property, state } from "lit/decorators"; | import { customElement, property, state } from "lit/decorators"; | ||||||
| import { until } from "lit/directives/until"; | import { until } from "lit/directives/until"; | ||||||
| import { fireEvent } from "../../../src/common/dom/fire_event"; | import { fireEvent } from "../../../src/common/dom/fire_event"; | ||||||
| import "../../../src/components/ha-card"; | import "../../../src/components/ha-card"; | ||||||
| import "../../../src/components/ha-button"; | import "../../../src/components/ha-button"; | ||||||
| import "../../../src/components/ha-circular-progress"; | import "../../../src/components/ha-circular-progress"; | ||||||
| import type { LovelaceCardConfig } from "../../../src/data/lovelace/config/card"; | import { LovelaceCardConfig } from "../../../src/data/lovelace/config/card"; | ||||||
| import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | import { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | ||||||
| import type { | import { Lovelace, LovelaceCard } from "../../../src/panels/lovelace/types"; | ||||||
|   Lovelace, |  | ||||||
|   LovelaceCard, |  | ||||||
| } from "../../../src/panels/lovelace/types"; |  | ||||||
| import { | import { | ||||||
|   demoConfigs, |   demoConfigs, | ||||||
|   selectedDemoConfig, |   selectedDemoConfig, | ||||||
| @@ -26,7 +22,7 @@ export class HADemoCard extends LitElement implements LovelaceCard { | |||||||
|  |  | ||||||
|   @state() private _switching = false; |   @state() private _switching = false; | ||||||
|  |  | ||||||
|   private _hidden = window.localStorage.getItem("hide_demo_card"); |   private _hidden = localStorage.hide_demo_card; | ||||||
|  |  | ||||||
|   public getCardSize() { |   public getCardSize() { | ||||||
|     return this._hidden ? 0 : 2; |     return this._hidden ? 0 : 2; | ||||||
|   | |||||||
| @@ -3,10 +3,12 @@ import "../../src/resources/compatibility"; | |||||||
| import { customElement } from "lit/decorators"; | import { customElement } from "lit/decorators"; | ||||||
| import { isNavigationClick } from "../../src/common/dom/is-navigation-click"; | import { isNavigationClick } from "../../src/common/dom/is-navigation-click"; | ||||||
| import { navigate } from "../../src/common/navigate"; | import { navigate } from "../../src/common/navigate"; | ||||||
| import type { MockHomeAssistant } from "../../src/fake_data/provide_hass"; | import { | ||||||
| import { provideHass } from "../../src/fake_data/provide_hass"; |   MockHomeAssistant, | ||||||
|  |   provideHass, | ||||||
|  | } from "../../src/fake_data/provide_hass"; | ||||||
| import { HomeAssistantAppEl } from "../../src/layouts/home-assistant"; | import { HomeAssistantAppEl } from "../../src/layouts/home-assistant"; | ||||||
| import type { HomeAssistant } from "../../src/types"; | import { HomeAssistant } from "../../src/types"; | ||||||
| import { selectedDemoConfig } from "./configs/demo-configs"; | import { selectedDemoConfig } from "./configs/demo-configs"; | ||||||
| import { mockAreaRegistry } from "./stubs/area_registry"; | import { mockAreaRegistry } from "./stubs/area_registry"; | ||||||
| import { mockAuth } from "./stubs/auth"; | import { mockAuth } from "./stubs/auth"; | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| import type { AreaRegistryEntry } from "../../../src/data/area_registry"; | import { AreaRegistryEntry } from "../../../src/data/area_registry"; | ||||||
| import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | ||||||
|  |  | ||||||
| export const mockAreaRegistry = ( | export const mockAreaRegistry = ( | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | import { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | ||||||
|  |  | ||||||
| export const mockAuth = (hass: MockHomeAssistant) => { | export const mockAuth = (hass: MockHomeAssistant) => { | ||||||
|   hass.mockWS("config/auth/list", () => []); |   hass.mockWS("config/auth/list", () => []); | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | import { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | ||||||
|  |  | ||||||
| export const mockConfig = (hass: MockHomeAssistant) => { | export const mockConfig = (hass: MockHomeAssistant) => { | ||||||
|   hass.mockWS("validate_config", () => ({ |   hass.mockWS("validate_config", () => ({ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | import { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | ||||||
|  |  | ||||||
| export const mockConfigEntries = (hass: MockHomeAssistant) => { | export const mockConfigEntries = (hass: MockHomeAssistant) => { | ||||||
|   hass.mockWS("config_entries/get", () => ({ |   hass.mockWS("config_entries/get", () => ({ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| import type { DeviceRegistryEntry } from "../../../src/data/device_registry"; | import { DeviceRegistryEntry } from "../../../src/data/device_registry"; | ||||||
| import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | ||||||
|  |  | ||||||
| export const mockDeviceRegistry = ( | export const mockDeviceRegistry = ( | ||||||
|   | |||||||
| @@ -1,11 +1,11 @@ | |||||||
| import { format, startOfToday, startOfTomorrow } from "date-fns"; | import { format, startOfToday, startOfTomorrow } from "date-fns"; | ||||||
| import type { | import { | ||||||
|   EnergyInfo, |   EnergyInfo, | ||||||
|   EnergyPreferences, |   EnergyPreferences, | ||||||
|   EnergySolarForecasts, |   EnergySolarForecasts, | ||||||
|   FossilEnergyConsumption, |   FossilEnergyConsumption, | ||||||
| } from "../../../src/data/energy"; | } from "../../../src/data/energy"; | ||||||
| import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | import { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | ||||||
|  |  | ||||||
| export const mockEnergy = (hass: MockHomeAssistant) => { | export const mockEnergy = (hass: MockHomeAssistant) => { | ||||||
|   hass.mockWS( |   hass.mockWS( | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| import type { EntityRegistryEntry } from "../../../src/data/entity_registry"; | import { EntityRegistryEntry } from "../../../src/data/entity_registry"; | ||||||
| import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | ||||||
|  |  | ||||||
| export const mockEntityRegistry = ( | export const mockEntityRegistry = ( | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | import { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | ||||||
|  |  | ||||||
| export const mockEvents = (hass: MockHomeAssistant) => { | export const mockEvents = (hass: MockHomeAssistant) => { | ||||||
|   hass.mockAPI("events", () => []); |   hass.mockAPI("events", () => []); | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| import type { FloorRegistryEntry } from "../../../src/data/floor_registry"; | import { FloorRegistryEntry } from "../../../src/data/floor_registry"; | ||||||
| import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | ||||||
|  |  | ||||||
| export const mockFloorRegistry = ( | export const mockFloorRegistry = ( | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | import { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | ||||||
|  |  | ||||||
| export const mockFrontend = (hass: MockHomeAssistant) => { | export const mockFrontend = (hass: MockHomeAssistant) => { | ||||||
|   hass.mockWS("frontend/get_user_data", () => ({ |   hass.mockWS("frontend/get_user_data", () => ({ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| import type { HassioSupervisorInfo } from "../../../src/data/hassio/supervisor"; | import { HassioSupervisorInfo } from "../../../src/data/hassio/supervisor"; | ||||||
| import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | ||||||
|  |  | ||||||
| export const mockHassioSupervisor = (hass: MockHomeAssistant) => { | export const mockHassioSupervisor = (hass: MockHomeAssistant) => { | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| import type { HassEntity } from "home-assistant-js-websocket"; | import { HassEntity } from "home-assistant-js-websocket"; | ||||||
| import type { HistoryStates } from "../../../src/data/history"; | import { HistoryStates } from "../../../src/data/history"; | ||||||
| import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | import { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | ||||||
|  |  | ||||||
| const generateStateHistory = ( | const generateStateHistory = ( | ||||||
|   state: HassEntity, |   state: HassEntity, | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| import type { IconCategory } from "../../../src/data/icons"; | import { IconCategory } from "../../../src/data/icons"; | ||||||
| import { ENTITY_COMPONENT_ICONS } from "../../../src/fake_data/entity_component_icons"; | import { ENTITY_COMPONENT_ICONS } from "../../../src/fake_data/entity_component_icons"; | ||||||
| import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | import { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | ||||||
|  |  | ||||||
| export const mockIcons = (hass: MockHomeAssistant) => { | export const mockIcons = (hass: MockHomeAssistant) => { | ||||||
|   hass.mockWS( |   hass.mockWS( | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| import type { LabelRegistryEntry } from "../../../src/data/label_registry"; | import { LabelRegistryEntry } from "../../../src/data/label_registry"; | ||||||
| import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | ||||||
|  |  | ||||||
| export const mockLabelRegistry = ( | export const mockLabelRegistry = ( | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | import { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | ||||||
|  |  | ||||||
| export const mockMediaPlayer = (hass: MockHomeAssistant) => { | export const mockMediaPlayer = (hass: MockHomeAssistant) => { | ||||||
|   hass.mockWS("media_player_thumbnail", () => Promise.reject()); |   hass.mockWS("media_player_thumbnail", () => Promise.reject()); | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| import type { PersistentNotificationMessage } from "../../../src/data/persistent_notification"; | import { PersistentNotificationMessage } from "../../../src/data/persistent_notification"; | ||||||
| import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | import { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | ||||||
|  |  | ||||||
| export const mockPersistentNotification = (hass: MockHomeAssistant) => { | export const mockPersistentNotification = (hass: MockHomeAssistant) => { | ||||||
|   hass.mockWS("persistent_notification/subscribe", (_msg, _hass, onChange) => { |   hass.mockWS("persistent_notification/subscribe", (_msg, _hass, onChange) => { | ||||||
|   | |||||||
| @@ -5,12 +5,12 @@ import { | |||||||
|   differenceInHours, |   differenceInHours, | ||||||
|   endOfDay, |   endOfDay, | ||||||
| } from "date-fns"; | } from "date-fns"; | ||||||
| import type { | import { | ||||||
|   Statistics, |   Statistics, | ||||||
|   StatisticsMetaData, |   StatisticsMetaData, | ||||||
|   StatisticValue, |   StatisticValue, | ||||||
| } from "../../../src/data/recorder"; | } from "../../../src/data/recorder"; | ||||||
| import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | import { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; | ||||||
|  |  | ||||||
| const generateMeanStatistics = ( | const generateMeanStatistics = ( | ||||||
|   start: Date, |   start: Date, | ||||||
|   | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user