mirror of
https://github.com/Matysh/houseplan-card
synced 2026-07-31 08:28:31 +00:00
R3-1 (high): v1.45.0 made the upload safe but left deletion to the client — after a successful save the card asked the backend to remove everything but the file it had just committed. Two open editors cannot be ordered: a delayed request from one deleted the plan the other had just saved, leaving the accepted configuration pointing at nothing, the exact damage copy-on-write was introduced to prevent. houseplan/plan/cleanup is removed. config/set collects inside its own write lock from the two configurations that bracket the commit (plans.collect_plans): a file the old revision referenced and the new one does not is superseded and goes; any other unreferenced upload waits out PLAN_ORPHAN_TTL_S, because a fresh one may belong to a transaction that has not committed yet. The collector lives in a pure module so it can be reasoned about and unit-tested without the HA harness. R3-2: houseplan-space-card signed its plan url and threw the result away — getCardSize() mutated a throwaway model while render() rebuilt its own from the config, so the <image> requested the protected path and got 401 on every render. Both cards now share ContentSigner (src/signing.ts), which also gives the static card batching, expiry handling and periodic re-signing. is released in finally: one failed request no longer wedges a url for the life of the page. Tests: five backend interleaving cases from the report, six unit tests for the pure collector, smoke_space_card_bg (verified to fail against a v1.45.0 build: the raw url reaches the DOM and no retry happens). 57 smokes, 124 unit, 22 backend-pure. Docs: CHANGELOG.md + CHANGELOG.ru.md + ARCHITECTURE.md + TESTING.md + STATUS.md.
29 lines
804 B
JSON
Executable File
29 lines
804 B
JSON
Executable File
{
|
|
"name": "houseplan-card",
|
|
"version": "1.45.1",
|
|
"description": "Interactive house plan Lovelace card for Home Assistant",
|
|
"license": "MIT",
|
|
"type": "module",
|
|
"scripts": {
|
|
"build": "tsc --noEmit && rollup -c",
|
|
"watch": "rollup -c --watch",
|
|
"typecheck": "tsc --noEmit",
|
|
"test": "tsc -p tsconfig.test.json && node scripts/fix-test-build.mjs && node --test test/*.test.mjs"
|
|
},
|
|
"devDependencies": {
|
|
"@mdi/js": "^7.4.47",
|
|
"@rollup/plugin-json": "^6.1.0",
|
|
"@rollup/plugin-node-resolve": "^15.2.3",
|
|
"@rollup/plugin-terser": "^0.4.4",
|
|
"@rollup/plugin-typescript": "^11.1.6",
|
|
"playwright": "^1.62.0",
|
|
"rollup": "^4.18.0",
|
|
"tslib": "^2.6.2",
|
|
"typescript": "^5.4.5"
|
|
},
|
|
"dependencies": {
|
|
"lit": "^3.1.3",
|
|
"polyclip-ts": "^0.16.8"
|
|
}
|
|
}
|