diff --git a/.husky/pre-commit b/.husky/pre-commit
index 06c2b40..72c4429 100644
--- a/.husky/pre-commit
+++ b/.husky/pre-commit
@@ -1,5 +1 @@
-#!/bin/sh
-
-. "$(dirname "$0")/_/husky.sh"
-
npm test
diff --git a/.husky/pre-push b/.husky/pre-push
index 952f7e3..d6cb288 100644
--- a/.husky/pre-push
+++ b/.husky/pre-push
@@ -1,5 +1 @@
-#!/bin/sh
-
-. "$(dirname "$0")/_/husky.sh"
-
npm run build
diff --git a/package.json b/package.json
index 3eb2faa..b2e3be0 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "dom-renderer",
- "version": "2.1.0",
+ "version": "2.1.3",
"license": "LGPL-3.0-or-later",
"author": "shiy2008@gmail.com",
"description": "A light-weight DOM Renderer supports Web components standard & TypeScript language",
@@ -29,8 +29,8 @@
},
"devDependencies": {
"@types/jest": "^29.5.12",
- "@types/node": "^18.19.14",
- "husky": "^8.0.3",
+ "@types/node": "^18.19.15",
+ "husky": "^9.0.10",
"jest": "^29.7.0",
"jest-environment-jsdom": "^29.7.0",
"lint-staged": "^15.2.2",
@@ -56,7 +56,7 @@
},
"browserslist": "> 0.5%, last 2 versions, not dead, IE 11",
"scripts": {
- "prepare": "husky install",
+ "prepare": "husky",
"test": "lint-staged && jest",
"parcel": "tsc -p tsconfig.json && mv dist/jsx-runtime.* . && cp jsx-runtime.js jsx-dev-runtime.js && mv dist/dist/* dist/ && rm -rf dist/dist",
"build": "rm -rf dist/ docs/ && typedoc && npm run parcel",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 80d5bd2..45763ad 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -17,14 +17,14 @@ devDependencies:
specifier: ^29.5.12
version: 29.5.12
'@types/node':
- specifier: ^18.19.14
- version: 18.19.14
+ specifier: ^18.19.15
+ version: 18.19.15
husky:
- specifier: ^8.0.3
- version: 8.0.3
+ specifier: ^9.0.10
+ version: 9.0.10
jest:
specifier: ^29.7.0
- version: 29.7.0(@types/node@18.19.14)
+ version: 29.7.0(@types/node@18.19.15)
jest-environment-jsdom:
specifier: ^29.7.0
version: 29.7.0
@@ -410,7 +410,7 @@ packages:
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
dependencies:
'@jest/types': 29.6.3
- '@types/node': 18.19.14
+ '@types/node': 18.19.15
chalk: 4.1.2
jest-message-util: 29.7.0
jest-util: 29.7.0
@@ -431,14 +431,14 @@ packages:
'@jest/test-result': 29.7.0
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 18.19.14
+ '@types/node': 18.19.15
ansi-escapes: 4.3.2
chalk: 4.1.2
ci-info: 3.9.0
exit: 0.1.2
graceful-fs: 4.2.11
jest-changed-files: 29.7.0
- jest-config: 29.7.0(@types/node@18.19.14)
+ jest-config: 29.7.0(@types/node@18.19.15)
jest-haste-map: 29.7.0
jest-message-util: 29.7.0
jest-regex-util: 29.6.3
@@ -466,7 +466,7 @@ packages:
dependencies:
'@jest/fake-timers': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 18.19.14
+ '@types/node': 18.19.15
jest-mock: 29.7.0
dev: true
@@ -493,7 +493,7 @@ packages:
dependencies:
'@jest/types': 29.6.3
'@sinonjs/fake-timers': 10.3.0
- '@types/node': 18.19.14
+ '@types/node': 18.19.15
jest-message-util: 29.7.0
jest-mock: 29.7.0
jest-util: 29.7.0
@@ -526,7 +526,7 @@ packages:
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
'@jridgewell/trace-mapping': 0.3.20
- '@types/node': 18.19.14
+ '@types/node': 18.19.15
chalk: 4.1.2
collect-v8-coverage: 1.0.2
exit: 0.1.2
@@ -614,7 +614,7 @@ packages:
'@jest/schemas': 29.6.3
'@types/istanbul-lib-coverage': 2.0.6
'@types/istanbul-reports': 3.0.4
- '@types/node': 18.19.14
+ '@types/node': 18.19.15
'@types/yargs': 17.0.32
chalk: 4.1.2
dev: true
@@ -712,7 +712,7 @@ packages:
/@types/graceful-fs@4.1.9:
resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==}
dependencies:
- '@types/node': 18.19.14
+ '@types/node': 18.19.15
dev: true
/@types/istanbul-lib-coverage@2.0.6:
@@ -741,13 +741,13 @@ packages:
/@types/jsdom@20.0.1:
resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==}
dependencies:
- '@types/node': 18.19.14
+ '@types/node': 18.19.15
'@types/tough-cookie': 4.0.5
parse5: 7.1.2
dev: true
- /@types/node@18.19.14:
- resolution: {integrity: sha512-EnQ4Us2rmOS64nHDWr0XqAD8DsO6f3XR6lf9UIIrZQpUzPVdN/oPuEzfDWNHSyXLvoGgjuEm/sPwFGSSs35Wtg==}
+ /@types/node@18.19.15:
+ resolution: {integrity: sha512-AMZ2UWx+woHNfM11PyAEQmfSxi05jm9OlkxczuHeEqmvwPkYj6MWv44gbzDPefYOLysTOFyI3ziiy2ONmUZfpA==}
dependencies:
undici-types: 5.26.5
dev: true
@@ -1136,7 +1136,7 @@ packages:
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
dev: true
- /create-jest@29.7.0(@types/node@18.19.14):
+ /create-jest@29.7.0(@types/node@18.19.15):
resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
hasBin: true
@@ -1145,7 +1145,7 @@ packages:
chalk: 4.1.2
exit: 0.1.2
graceful-fs: 4.2.11
- jest-config: 29.7.0(@types/node@18.19.14)
+ jest-config: 29.7.0(@types/node@18.19.15)
jest-util: 29.7.0
prompts: 2.4.2
transitivePeerDependencies:
@@ -1564,9 +1564,9 @@ packages:
engines: {node: '>=16.17.0'}
dev: true
- /husky@8.0.3:
- resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==}
- engines: {node: '>=14'}
+ /husky@9.0.10:
+ resolution: {integrity: sha512-TQGNknoiy6bURzIO77pPRu+XHi6zI7T93rX+QnJsoYFf3xdjKOur+IlfqzJGMHIK/wXrLg+GsvMs8Op7vI2jVA==}
+ engines: {node: '>=18'}
hasBin: true
dev: true
@@ -1758,7 +1758,7 @@ packages:
'@jest/expect': 29.7.0
'@jest/test-result': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 18.19.14
+ '@types/node': 18.19.15
chalk: 4.1.2
co: 4.6.0
dedent: 1.5.1
@@ -1779,7 +1779,7 @@ packages:
- supports-color
dev: true
- /jest-cli@29.7.0(@types/node@18.19.14):
+ /jest-cli@29.7.0(@types/node@18.19.15):
resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
hasBin: true
@@ -1793,10 +1793,10 @@ packages:
'@jest/test-result': 29.7.0
'@jest/types': 29.6.3
chalk: 4.1.2
- create-jest: 29.7.0(@types/node@18.19.14)
+ create-jest: 29.7.0(@types/node@18.19.15)
exit: 0.1.2
import-local: 3.1.0
- jest-config: 29.7.0(@types/node@18.19.14)
+ jest-config: 29.7.0(@types/node@18.19.15)
jest-util: 29.7.0
jest-validate: 29.7.0
yargs: 17.7.2
@@ -1807,7 +1807,7 @@ packages:
- ts-node
dev: true
- /jest-config@29.7.0(@types/node@18.19.14):
+ /jest-config@29.7.0(@types/node@18.19.15):
resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
peerDependencies:
@@ -1822,7 +1822,7 @@ packages:
'@babel/core': 7.23.6
'@jest/test-sequencer': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 18.19.14
+ '@types/node': 18.19.15
babel-jest: 29.7.0(@babel/core@7.23.6)
chalk: 4.1.2
ci-info: 3.9.0
@@ -1888,7 +1888,7 @@ packages:
'@jest/fake-timers': 29.7.0
'@jest/types': 29.6.3
'@types/jsdom': 20.0.1
- '@types/node': 18.19.14
+ '@types/node': 18.19.15
jest-mock: 29.7.0
jest-util: 29.7.0
jsdom: 20.0.3
@@ -1905,7 +1905,7 @@ packages:
'@jest/environment': 29.7.0
'@jest/fake-timers': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 18.19.14
+ '@types/node': 18.19.15
jest-mock: 29.7.0
jest-util: 29.7.0
dev: true
@@ -1921,7 +1921,7 @@ packages:
dependencies:
'@jest/types': 29.6.3
'@types/graceful-fs': 4.1.9
- '@types/node': 18.19.14
+ '@types/node': 18.19.15
anymatch: 3.1.3
fb-watchman: 2.0.2
graceful-fs: 4.2.11
@@ -1972,7 +1972,7 @@ packages:
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
dependencies:
'@jest/types': 29.6.3
- '@types/node': 18.19.14
+ '@types/node': 18.19.15
jest-util: 29.7.0
dev: true
@@ -2027,7 +2027,7 @@ packages:
'@jest/test-result': 29.7.0
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 18.19.14
+ '@types/node': 18.19.15
chalk: 4.1.2
emittery: 0.13.1
graceful-fs: 4.2.11
@@ -2058,7 +2058,7 @@ packages:
'@jest/test-result': 29.7.0
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 18.19.14
+ '@types/node': 18.19.15
chalk: 4.1.2
cjs-module-lexer: 1.2.3
collect-v8-coverage: 1.0.2
@@ -2110,7 +2110,7 @@ packages:
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
dependencies:
'@jest/types': 29.6.3
- '@types/node': 18.19.14
+ '@types/node': 18.19.15
chalk: 4.1.2
ci-info: 3.9.0
graceful-fs: 4.2.11
@@ -2135,7 +2135,7 @@ packages:
dependencies:
'@jest/test-result': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 18.19.14
+ '@types/node': 18.19.15
ansi-escapes: 4.3.2
chalk: 4.1.2
emittery: 0.13.1
@@ -2147,13 +2147,13 @@ packages:
resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
dependencies:
- '@types/node': 18.19.14
+ '@types/node': 18.19.15
jest-util: 29.7.0
merge-stream: 2.0.0
supports-color: 8.1.1
dev: true
- /jest@29.7.0(@types/node@18.19.14):
+ /jest@29.7.0(@types/node@18.19.15):
resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
hasBin: true
@@ -2166,7 +2166,7 @@ packages:
'@jest/core': 29.7.0
'@jest/types': 29.6.3
import-local: 3.1.0
- jest-cli: 29.7.0(@types/node@18.19.14)
+ jest-cli: 29.7.0(@types/node@18.19.15)
transitivePeerDependencies:
- '@types/node'
- babel-plugin-macros
@@ -3009,7 +3009,7 @@ packages:
dependencies:
bs-logger: 0.2.6
fast-json-stable-stringify: 2.1.0
- jest: 29.7.0(@types/node@18.19.14)
+ jest: 29.7.0(@types/node@18.19.15)
jest-util: 29.7.0
json5: 2.2.3
lodash.memoize: 4.1.2
diff --git a/source/dist/DOMRenderer.ts b/source/dist/DOMRenderer.ts
index 7844e47..064c58d 100644
--- a/source/dist/DOMRenderer.ts
+++ b/source/dist/DOMRenderer.ts
@@ -90,10 +90,8 @@ export class DOMRenderer {
for (const oldNode of [...root.childNodes]) {
const index = newNodes.indexOf(oldNode);
- if (index < 0) {
- oldNode.remove();
- continue;
- } else if (index === 0) {
+ if (index < 0) continue;
+ else if (index === 0) {
newNodes.shift();
continue;
}
diff --git a/source/jsx-runtime.ts b/source/jsx-runtime.ts
index 0704f09..caeead8 100644
--- a/source/jsx-runtime.ts
+++ b/source/jsx-runtime.ts
@@ -31,6 +31,7 @@ export function jsx(
}
export const jsxs = jsx;
+export const jsxDEV = jsx;
/**
* @see {@link https://babeljs.io/docs/babel-plugin-transform-react-jsx#react-automatic-runtime-1}
diff --git a/test/DOMRenderer.spec.ts b/test/DOMRenderer.spec.ts
index 0aef116..d2c4dec 100644
--- a/test/DOMRenderer.spec.ts
+++ b/test/DOMRenderer.spec.ts
@@ -58,17 +58,19 @@ describe('DOM Renderer', () => {
});
it('should update DOM children without keys', () => {
- const newNode = renderer.patch(
+ var newNode = renderer.patch(
{ ...root },
{ ...root, children: [{ children: [new VNode({ tagName: 'i' })] }] }
);
expect(document.body.innerHTML).toBe('');
- renderer.patch(newNode, {
+ newNode = renderer.patch(newNode, {
...root,
children: [{ children: [new VNode({ tagName: 'a' })] }]
});
expect(document.body.innerHTML).toBe('');
+
+ renderer.patch(newNode, root);
});
it('should not invoke duplicated Connected Callbacks during updating', () => {