chore: Update ha-nunjucks to 1.6.2 (#2549)
- Replaces: https://github.com/dermotduffy/advanced-camera-card/pull/2515
This commit is contained in:
committed by
dermotduffy
parent
015fb1876d
commit
c3d3dd3934
@@ -20,6 +20,12 @@ The Advanced Camera Card uses
|
|||||||
Consult its documentation for the wide variety of different template values
|
Consult its documentation for the wide variety of different template values
|
||||||
supported.
|
supported.
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> To keep the card lightweight, some template features are not available. If a
|
||||||
|
> template feature you need is missing,
|
||||||
|
> [open an issue](https://github.com/dermotduffy/advanced-camera-card/issues) to
|
||||||
|
> request it.
|
||||||
|
|
||||||
See [an example](../examples.md?id=accessing-home-assistant-state) that
|
See [an example](../examples.md?id=accessing-home-assistant-state) that
|
||||||
accesses Home Assistant state.
|
accesses Home Assistant state.
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -31,7 +31,7 @@
|
|||||||
"date-fns": "^3.6.0",
|
"date-fns": "^3.6.0",
|
||||||
"embla-carousel": "^8.6.0",
|
"embla-carousel": "^8.6.0",
|
||||||
"embla-carousel-wheel-gestures": "^8.0.1",
|
"embla-carousel-wheel-gestures": "^8.0.1",
|
||||||
"ha-nunjucks": "^1.3.0",
|
"ha-nunjucks": "~1.6.2",
|
||||||
"home-assistant-js-websocket": "^9.4.0",
|
"home-assistant-js-websocket": "^9.4.0",
|
||||||
"js-yaml": "^4.1.0",
|
"js-yaml": "^4.1.0",
|
||||||
"keycharm": "^0.4.0",
|
"keycharm": "^0.4.0",
|
||||||
|
|||||||
+10
-1
@@ -35,7 +35,16 @@ const serveopts = {
|
|||||||
* @type {import('rollup').RollupOptions['plugins']}
|
* @type {import('rollup').RollupOptions['plugins']}
|
||||||
*/
|
*/
|
||||||
const plugins = [
|
const plugins = [
|
||||||
gitInfo.default({ enableBuildDate: true, updateVersion: false }),
|
gitInfo.default(
|
||||||
|
// Limit git-info to the project's own package.json. Without this it also
|
||||||
|
// rewrites any dependency's imported package.json into ESM, which then breaks
|
||||||
|
// the json() plugin downstream (ha-nunjucks imports its own package.json).
|
||||||
|
{
|
||||||
|
enableBuildDate: true,
|
||||||
|
updateVersion: false,
|
||||||
|
include: 'package.json',
|
||||||
|
},
|
||||||
|
),
|
||||||
styles({
|
styles({
|
||||||
modules: false,
|
modules: false,
|
||||||
// Behavior of inject mode, without actually injecting style
|
// Behavior of inject mode, without actually injecting style
|
||||||
|
|||||||
@@ -8,8 +8,15 @@ import type {
|
|||||||
BrowseMediaMetadata,
|
BrowseMediaMetadata,
|
||||||
RichBrowseMedia,
|
RichBrowseMedia,
|
||||||
} from '../../../../src/ha/browse-media/types';
|
} from '../../../../src/ha/browse-media/types';
|
||||||
import { createHASS, createMockTemplateRenderer } from '../../../test-utils';
|
import {
|
||||||
|
createHASS,
|
||||||
|
createMockTemplateRenderer,
|
||||||
|
stubConnectedHomeAssistant,
|
||||||
|
} from '../../../test-utils';
|
||||||
|
|
||||||
|
// The `with template matcher` test loads the real ha-nunjucks engine, which
|
||||||
|
// reads `window`/`document` at import, so this suite needs a DOM environment.
|
||||||
|
// @vitest-environment jsdom
|
||||||
describe('MediaMatcher', () => {
|
describe('MediaMatcher', () => {
|
||||||
// A mock renderer for the matcher plumbing, which never renders templates.
|
// A mock renderer for the matcher plumbing, which never renders templates.
|
||||||
// The `value_template` suite below uses its own real, loaded engine.
|
// The `value_template` suite below uses its own real, loaded engine.
|
||||||
@@ -153,6 +160,7 @@ describe('MediaMatcher', () => {
|
|||||||
// renderer (rather than the shared mock).
|
// renderer (rather than the shared mock).
|
||||||
const templateManager = new TemplateManager();
|
const templateManager = new TemplateManager();
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
|
stubConnectedHomeAssistant();
|
||||||
await templateManager.loadRenderer();
|
await templateManager.loadRenderer();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,19 @@
|
|||||||
import { describe, expect, it, vi } from 'vitest';
|
import { beforeAll, describe, expect, it, vi } from 'vitest';
|
||||||
|
|
||||||
import { TemplateManager } from '../../../src/card-controller/templates/index';
|
import { TemplateManager } from '../../../src/card-controller/templates/index';
|
||||||
import { createConfig, createHASS, createStateEntity } from '../../test-utils';
|
import {
|
||||||
|
createConfig,
|
||||||
|
createHASS,
|
||||||
|
createStateEntity,
|
||||||
|
stubConnectedHomeAssistant,
|
||||||
|
} from '../../test-utils';
|
||||||
|
|
||||||
|
// ha-nunjucks reads `window`/`document` at import and renders via a
|
||||||
|
// `window.haNunjucks` global, so the renderer needs a DOM environment.
|
||||||
|
// @vitest-environment jsdom
|
||||||
describe('TemplateManager', () => {
|
describe('TemplateManager', () => {
|
||||||
|
beforeAll(() => stubConnectedHomeAssistant());
|
||||||
|
|
||||||
describe('loadRenderer', () => {
|
describe('loadRenderer', () => {
|
||||||
it('should render a template raw before the engine is loaded', () => {
|
it('should render a template raw before the engine is loaded', () => {
|
||||||
const manager = new TemplateManager();
|
const manager = new TemplateManager();
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import {
|
|||||||
createHASS,
|
createHASS,
|
||||||
createMockTemplateRenderer,
|
createMockTemplateRenderer,
|
||||||
createStateEntity,
|
createStateEntity,
|
||||||
|
stubConnectedHomeAssistant,
|
||||||
} from '../../test-utils';
|
} from '../../test-utils';
|
||||||
|
|
||||||
// @vitest-environment jsdom
|
// @vitest-environment jsdom
|
||||||
@@ -66,6 +67,7 @@ describe('renderTimePeriodToSeconds', () => {
|
|||||||
const templateManager = new TemplateManager();
|
const templateManager = new TemplateManager();
|
||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
|
stubConnectedHomeAssistant();
|
||||||
await templateManager.loadRenderer();
|
await templateManager.loadRenderer();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import {
|
|||||||
createHASS,
|
createHASS,
|
||||||
createMockTemplateRenderer,
|
createMockTemplateRenderer,
|
||||||
createStateEntity,
|
createStateEntity,
|
||||||
|
stubConnectedHomeAssistant,
|
||||||
} from '../../test-utils';
|
} from '../../test-utils';
|
||||||
|
|
||||||
// A mock renderer for the orchestration tests, which never render templates.
|
// A mock renderer for the orchestration tests, which never render templates.
|
||||||
@@ -198,6 +199,7 @@ describe('ConditionsManager', () => {
|
|||||||
// loaded for the synchronous renderer (rather than the shared mock).
|
// loaded for the synchronous renderer (rather than the shared mock).
|
||||||
const templateManager = new TemplateManager();
|
const templateManager = new TemplateManager();
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
|
stubConnectedHomeAssistant();
|
||||||
await templateManager.loadRenderer();
|
await templateManager.loadRenderer();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import {
|
|||||||
createHASS,
|
createHASS,
|
||||||
createMockTemplateRenderer,
|
createMockTemplateRenderer,
|
||||||
createStateEntity,
|
createStateEntity,
|
||||||
|
stubConnectedHomeAssistant,
|
||||||
} from '../../../test-utils';
|
} from '../../../test-utils';
|
||||||
import { createEvaluatorContext } from './test-utils';
|
import { createEvaluatorContext } from './test-utils';
|
||||||
|
|
||||||
@@ -131,6 +132,7 @@ describe('numeric state condition', () => {
|
|||||||
// This case renders a real value_template, so load the lazily-imported
|
// This case renders a real value_template, so load the lazily-imported
|
||||||
// engine for the synchronous renderer.
|
// engine for the synchronous renderer.
|
||||||
const templateManager = new TemplateManager();
|
const templateManager = new TemplateManager();
|
||||||
|
stubConnectedHomeAssistant();
|
||||||
await templateManager.loadRenderer();
|
await templateManager.loadRenderer();
|
||||||
|
|
||||||
const evaluator = createConditionEvaluator(
|
const evaluator = createConditionEvaluator(
|
||||||
|
|||||||
@@ -2,7 +2,11 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|||||||
|
|
||||||
import { TemplateManager } from '../../../../src/card-controller/templates';
|
import { TemplateManager } from '../../../../src/card-controller/templates';
|
||||||
import { createConditionEvaluator } from '../../../../src/condition-trigger/conditions/factory';
|
import { createConditionEvaluator } from '../../../../src/condition-trigger/conditions/factory';
|
||||||
import { createHASS, createStateEntity } from '../../../test-utils';
|
import {
|
||||||
|
createHASS,
|
||||||
|
createStateEntity,
|
||||||
|
stubConnectedHomeAssistant,
|
||||||
|
} from '../../../test-utils';
|
||||||
import { createEvaluatorContext } from './test-utils';
|
import { createEvaluatorContext } from './test-utils';
|
||||||
|
|
||||||
// @vitest-environment jsdom
|
// @vitest-environment jsdom
|
||||||
@@ -340,6 +344,7 @@ describe('state condition', () => {
|
|||||||
// This case renders a real templated `for`, so load the lazily-imported
|
// This case renders a real templated `for`, so load the lazily-imported
|
||||||
// engine for the synchronous renderer.
|
// engine for the synchronous renderer.
|
||||||
const templateManager = new TemplateManager();
|
const templateManager = new TemplateManager();
|
||||||
|
stubConnectedHomeAssistant();
|
||||||
await templateManager.loadRenderer();
|
await templateManager.loadRenderer();
|
||||||
|
|
||||||
const evaluator = createConditionEvaluator(
|
const evaluator = createConditionEvaluator(
|
||||||
|
|||||||
@@ -2,13 +2,18 @@ import { beforeAll, describe, expect, it } from 'vitest';
|
|||||||
|
|
||||||
import { TemplateManager } from '../../../../src/card-controller/templates';
|
import { TemplateManager } from '../../../../src/card-controller/templates';
|
||||||
import { createConditionEvaluator } from '../../../../src/condition-trigger/conditions/factory';
|
import { createConditionEvaluator } from '../../../../src/condition-trigger/conditions/factory';
|
||||||
import { createHASS, createStateEntity } from '../../../test-utils';
|
import {
|
||||||
|
createHASS,
|
||||||
|
createStateEntity,
|
||||||
|
stubConnectedHomeAssistant,
|
||||||
|
} from '../../../test-utils';
|
||||||
import { createEvaluatorContext } from './test-utils';
|
import { createEvaluatorContext } from './test-utils';
|
||||||
|
|
||||||
// @vitest-environment jsdom
|
// @vitest-environment jsdom
|
||||||
describe('template condition', () => {
|
describe('template condition', () => {
|
||||||
const templateManager = new TemplateManager();
|
const templateManager = new TemplateManager();
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
|
stubConnectedHomeAssistant();
|
||||||
await templateManager.loadRenderer();
|
await templateManager.loadRenderer();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import {
|
|||||||
createHASSManager,
|
createHASSManager,
|
||||||
createMockTemplateRenderer,
|
createMockTemplateRenderer,
|
||||||
createStateEntity,
|
createStateEntity,
|
||||||
|
stubConnectedHomeAssistant,
|
||||||
} from '../../test-utils';
|
} from '../../test-utils';
|
||||||
|
|
||||||
const templateManager = createMockTemplateRenderer();
|
const templateManager = createMockTemplateRenderer();
|
||||||
@@ -126,6 +127,7 @@ describe('TriggersManager', () => {
|
|||||||
// loaded for the synchronous renderer (rather than the shared mock).
|
// loaded for the synchronous renderer (rather than the shared mock).
|
||||||
const templateManager = new TemplateManager();
|
const templateManager = new TemplateManager();
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
|
stubConnectedHomeAssistant();
|
||||||
await templateManager.loadRenderer();
|
await templateManager.loadRenderer();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,11 @@ import {
|
|||||||
import { ConditionStateManager } from '../../../../src/condition-trigger/conditions/state-manager';
|
import { ConditionStateManager } from '../../../../src/condition-trigger/conditions/state-manager';
|
||||||
import { NumericStateTrigger } from '../../../../src/condition-trigger/triggers/triggers/numeric-state';
|
import { NumericStateTrigger } from '../../../../src/condition-trigger/triggers/triggers/numeric-state';
|
||||||
import type { TriggerOfType } from '../../../../src/condition-trigger/triggers/triggers/types';
|
import type { TriggerOfType } from '../../../../src/condition-trigger/triggers/triggers/types';
|
||||||
import { createHASS, createStateEntity } from '../../../test-utils';
|
import {
|
||||||
|
createHASS,
|
||||||
|
createStateEntity,
|
||||||
|
stubConnectedHomeAssistant,
|
||||||
|
} from '../../../test-utils';
|
||||||
import { createTriggerEvaluatorContext } from './test-utils';
|
import { createTriggerEvaluatorContext } from './test-utils';
|
||||||
|
|
||||||
const SENSOR = 'sensor.temperature';
|
const SENSOR = 'sensor.temperature';
|
||||||
@@ -163,6 +167,7 @@ describe('NumericStateTrigger', () => {
|
|||||||
|
|
||||||
it('should match the rendered value_template', async () => {
|
it('should match the rendered value_template', async () => {
|
||||||
const templateManager = new TemplateManager();
|
const templateManager = new TemplateManager();
|
||||||
|
stubConnectedHomeAssistant();
|
||||||
await templateManager.loadRenderer();
|
await templateManager.loadRenderer();
|
||||||
|
|
||||||
const { trigger, stateManager, callback } = create(
|
const { trigger, stateManager, callback } = create(
|
||||||
|
|||||||
@@ -13,11 +13,16 @@ import { TemplateManager } from '../../../../src/card-controller/templates';
|
|||||||
import { ConditionStateManager } from '../../../../src/condition-trigger/conditions/state-manager';
|
import { ConditionStateManager } from '../../../../src/condition-trigger/conditions/state-manager';
|
||||||
import { TemplateTrigger } from '../../../../src/condition-trigger/triggers/triggers/template';
|
import { TemplateTrigger } from '../../../../src/condition-trigger/triggers/triggers/template';
|
||||||
import type { TriggerOfType } from '../../../../src/condition-trigger/triggers/triggers/types';
|
import type { TriggerOfType } from '../../../../src/condition-trigger/triggers/triggers/types';
|
||||||
import { createHASS, createStateEntity } from '../../../test-utils';
|
import {
|
||||||
|
createHASS,
|
||||||
|
createStateEntity,
|
||||||
|
stubConnectedHomeAssistant,
|
||||||
|
} from '../../../test-utils';
|
||||||
import { createTriggerEvaluatorContext } from './test-utils';
|
import { createTriggerEvaluatorContext } from './test-utils';
|
||||||
|
|
||||||
const templateManager = new TemplateManager();
|
const templateManager = new TemplateManager();
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
|
stubConnectedHomeAssistant();
|
||||||
await templateManager.loadRenderer();
|
await templateManager.loadRenderer();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -758,6 +758,36 @@ export const createMockTemplateRenderer = (): TemplateManager => {
|
|||||||
return renderer;
|
return renderer;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// At import the real ha-nunjucks engine waits for a connected `home-assistant`
|
||||||
|
// element before finishing initialization, retrying on a timer that can outlive
|
||||||
|
// the test (and throw `document is not defined` once the environment is torn
|
||||||
|
// down). Test suites that load the real engine call this first, in a jsdom
|
||||||
|
// environment, so it initializes immediately as it does in a real Home
|
||||||
|
// Assistant frontend. Idempotent.
|
||||||
|
//
|
||||||
|
// Workaround for an upstream bug; remove once it is fixed:
|
||||||
|
// https://github.com/Nerwyn/ha-nunjucks/issues/11
|
||||||
|
export const stubConnectedHomeAssistant = (): void => {
|
||||||
|
if (document.querySelector('home-assistant')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const ha = document.createElement('home-assistant');
|
||||||
|
Object.assign(ha, {
|
||||||
|
hass: {
|
||||||
|
// The readiness gate the engine polls for.
|
||||||
|
connected: true,
|
||||||
|
connection: {
|
||||||
|
connected: true,
|
||||||
|
// Awaited by the engine's label-registry fetch during init.
|
||||||
|
sendMessagePromise: () => Promise.resolve([]),
|
||||||
|
},
|
||||||
|
language: 'en',
|
||||||
|
states: {},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
document.body.appendChild(ha);
|
||||||
|
};
|
||||||
|
|
||||||
export const createCardAPI = (): CardController => {
|
export const createCardAPI = (): CardController => {
|
||||||
const api = mock<CardController>();
|
const api = mock<CardController>();
|
||||||
|
|
||||||
|
|||||||
@@ -2662,7 +2662,7 @@ __metadata:
|
|||||||
eslint-config-airbnb-base: "npm:^15.0.0"
|
eslint-config-airbnb-base: "npm:^15.0.0"
|
||||||
eslint-config-prettier: "npm:^9.1.0"
|
eslint-config-prettier: "npm:^9.1.0"
|
||||||
eslint-plugin-import: "npm:^2.29.1"
|
eslint-plugin-import: "npm:^2.29.1"
|
||||||
ha-nunjucks: "npm:^1.3.0"
|
ha-nunjucks: "npm:~1.6.2"
|
||||||
home-assistant-js-websocket: "npm:^9.4.0"
|
home-assistant-js-websocket: "npm:^9.4.0"
|
||||||
js-yaml: "npm:^4.1.0"
|
js-yaml: "npm:^4.1.0"
|
||||||
jsdom: "npm:^21.1.2"
|
jsdom: "npm:^21.1.2"
|
||||||
@@ -5786,14 +5786,15 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"ha-nunjucks@npm:^1.3.0":
|
"ha-nunjucks@npm:~1.6.2":
|
||||||
version: 1.3.0
|
version: 1.6.2
|
||||||
resolution: "ha-nunjucks@npm:1.3.0"
|
resolution: "ha-nunjucks@npm:1.6.2"
|
||||||
dependencies:
|
dependencies:
|
||||||
home-assistant-js-websocket: "npm:latest"
|
home-assistant-js-websocket: "npm:latest"
|
||||||
nunjucks: "npm:latest"
|
nunjucks: "npm:latest"
|
||||||
|
slugify: "npm:latest"
|
||||||
ts-py-datetime: "npm:latest"
|
ts-py-datetime: "npm:latest"
|
||||||
checksum: 10c0/9c346ee9866f748b41d98dbefefd46ddb0a43f7d563e4456e000047e273e5441e5a15321ba8684325a81d746a9e9c32c5c0f4f1a58637291babebcae45329442
|
checksum: 10c0/f3953be5de5f27e7cf5c111bb9fc969e2e7a7732547c0549c88a5fed2480c12bdb058feff81e68059570831b1464cf26bf356df6f60dfcc904d16d2c6f844ee8
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
@@ -10283,6 +10284,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"slugify@npm:latest":
|
||||||
|
version: 1.6.9
|
||||||
|
resolution: "slugify@npm:1.6.9"
|
||||||
|
checksum: 10c0/8473c566ae00c5db26bfbf6182a4a9478ab3c912a9c926e1fdb410736a77228bfca4fdc5c755b46fafa7d2d9900de482fd7a9bd5e5c91128c4743c2c072d88da
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"smart-buffer@npm:^4.2.0":
|
"smart-buffer@npm:^4.2.0":
|
||||||
version: 4.2.0
|
version: 4.2.0
|
||||||
resolution: "smart-buffer@npm:4.2.0"
|
resolution: "smart-buffer@npm:4.2.0"
|
||||||
|
|||||||
Reference in New Issue
Block a user