From 6d8f763bf585d8f202f6ec1735cf9c322bcac718 Mon Sep 17 00:00:00 2001 From: TechQuery Date: Sat, 10 Feb 2024 02:25:09 +0800 Subject: [PATCH] [fix] 3 detail bugs [optimize] upgrade to Husky 9 --- .husky/pre-commit | 4 -- .husky/pre-push | 4 -- package.json | 8 ++-- pnpm-lock.yaml | 78 +++++++++++++++++++------------------- source/dist/DOMRenderer.ts | 6 +-- source/jsx-runtime.ts | 1 + test/DOMRenderer.spec.ts | 6 ++- 7 files changed, 50 insertions(+), 57 deletions(-) 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..22b861d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dom-renderer", - "version": "2.1.0", + "version": "2.1.2", "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..948b473 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', () => {