diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 052df39f..9f5e7e2b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -31,7 +31,7 @@ jobs: strategy: matrix: - node-version: [18.x] + node-version: [18.x, 22.x] steps: - uses: actions/checkout@v4 @@ -42,13 +42,17 @@ jobs: cache: npm - run: npm ci - run: npm run test:coverage + - uses: codecov/codecov-action@v5 + if: matrix.node-version == '22.x' + with: + token: ${{ secrets.CODECOV_TOKEN }} build: runs-on: ubuntu-latest strategy: matrix: - node-version: [16.x, 18.x, 20.x] + node-version: [18.x, 20.x, 22.x] steps: - uses: actions/checkout@v4 diff --git a/.gitignore b/.gitignore index 4d63d414..71cb394c 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,6 @@ yarn-error.log /es6 .idea/ .vscode/ -/disttest/ + /dist/ tsconfig.tsbuildinfo diff --git a/package-lock.json b/package-lock.json index cd22169e..f0a09961 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,19 +27,15 @@ "@types/react-dom": "^18.3.0", "@types/react-test-renderer": "^18.3.0", "auto-changelog": "^2.0.0", - "builder": "file:./scripts/builder", "c8": "^8.0.1", - "codecov": "^3.6.5", - "cross-env": "^7.0.2", - "esbuild": "^0.21.5", + "esbuild": "~0.28.0", "npm-run-all": "^4.1.5", "react": "^18.3.1", "react-dom": "^18.3.1", "react-test-renderer": "^18.3.1", - "rimraf": "^3.0.2", "screenfull": "^5.0.2", "sinon": "^16.0.0", - "tester": "file:./scripts/tester", + "tsx": "^4.23.15", "typescript": "^5.4.5", "zora": "^5.2.0" }, @@ -220,9 +216,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", "cpu": [ "ppc64" ], @@ -233,13 +229,13 @@ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", "cpu": [ "arm" ], @@ -250,13 +246,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", "cpu": [ "arm64" ], @@ -267,13 +263,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", "cpu": [ "x64" ], @@ -284,13 +280,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", "cpu": [ "arm64" ], @@ -301,13 +297,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", "cpu": [ "x64" ], @@ -318,13 +314,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", "cpu": [ "arm64" ], @@ -335,13 +331,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", "cpu": [ "x64" ], @@ -352,13 +348,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", "cpu": [ "arm" ], @@ -369,13 +365,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", "cpu": [ "arm64" ], @@ -386,13 +382,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", "cpu": [ "ia32" ], @@ -403,13 +399,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", "cpu": [ "loong64" ], @@ -420,13 +416,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", "cpu": [ "mips64el" ], @@ -437,13 +433,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", "cpu": [ "ppc64" ], @@ -454,13 +450,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", "cpu": [ "riscv64" ], @@ -471,13 +467,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", "cpu": [ "s390x" ], @@ -488,13 +484,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", "cpu": [ "x64" ], @@ -505,13 +501,30 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", "cpu": [ "x64" ], @@ -522,13 +535,30 @@ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", "cpu": [ "x64" ], @@ -539,13 +569,30 @@ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", "cpu": [ "x64" ], @@ -556,13 +603,13 @@ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", "cpu": [ "arm64" ], @@ -573,13 +620,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", "cpu": [ "ia32" ], @@ -590,13 +637,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", "cpu": [ "x64" ], @@ -607,7 +654,7 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@istanbuljs/schema": { @@ -832,15 +879,6 @@ "@svta/cml-utils": "1.5.0" } }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/@types/estree": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", @@ -1366,18 +1404,6 @@ "node": ">=0.4.0" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/ajv": { "version": "8.20.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", @@ -1438,25 +1464,6 @@ "node": ">=4" } }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/argv": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", - "integrity": "sha512-dEamhpPEwRUBpLNHeuCm/v+g0anFByHahxodVO/BbAarHVBBg2MccCwf9K+o1Pof+2btdnkJelYVUWjW/VrATw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "engines": { - "node": ">=0.6.10" - } - }, "node_modules/array-buffer-byte-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", @@ -1609,10 +1616,6 @@ "license": "MIT", "peer": true }, - "node_modules/builder": { - "resolved": "scripts/builder", - "link": true - }, "node_modules/c8": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/c8/-/c8-8.0.1.tgz", @@ -1759,26 +1762,6 @@ "node": ">=8" } }, - "node_modules/codecov": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.8.3.tgz", - "integrity": "sha512-Y8Hw+V3HgR7V71xWH2vQ9lyS358CbGCldWlJFR0JirqoGtOoas3R3/OclRTvgUYFK29mmJICDPauVKmpqbwhOA==", - "deprecated": "https://about.codecov.io/blog/codecov-uploader-deprecation-plan/", - "dev": true, - "dependencies": { - "argv": "0.0.2", - "ignore-walk": "3.0.4", - "js-yaml": "3.14.1", - "teeny-request": "7.1.1", - "urlgrey": "1.0.0" - }, - "bin": { - "codecov": "bin/codecov" - }, - "engines": { - "node": ">=4.0" - } - }, "node_modules/codem-isoboxer": { "version": "0.3.10", "resolved": "https://registry.npmjs.org/codem-isoboxer/-/codem-isoboxer-0.3.10.tgz", @@ -1821,24 +1804,6 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, - "node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1935,23 +1900,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -2196,9 +2144,9 @@ } }, "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2206,32 +2154,35 @@ "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" } }, "node_modules/escalade": { @@ -2252,19 +2203,6 @@ "node": ">=0.8.0" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -2298,21 +2236,6 @@ "license": "BSD-3-Clause", "peer": true }, - "node_modules/fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", - "dev": true, - "dependencies": { - "punycode": "^1.3.2" - } - }, - "node_modules/fast-url-parser/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -2357,6 +2280,21 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -2628,42 +2566,6 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ignore-walk": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", - "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", - "dev": true, - "dependencies": { - "minimatch": "^3.0.4" - } - }, "node_modules/immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", @@ -3027,19 +2929,6 @@ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -3250,12 +3139,6 @@ } } }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/mux-embed": { "version": "5.18.1", "resolved": "https://registry.npmjs.org/mux-embed/-/mux-embed-5.18.1.tgz", @@ -4086,21 +3969,6 @@ "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", "dev": true }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/stream-events": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", - "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", - "dev": true, - "dependencies": { - "stubs": "^3.0.0" - } - }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -4212,12 +4080,6 @@ "node": ">=4" } }, - "node_modules/stubs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", - "dev": true - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -4256,22 +4118,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/teeny-request": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.1.1.tgz", - "integrity": "sha512-iwY6rkW5DDGq8hE2YgNQlKbptYpY5Nn2xecjQiNjOXWbKzPGUfmeUBCSQbbr306d7Z7U2N0TPl+/SwYRfua1Dg==", - "dev": true, - "dependencies": { - "http-proxy-agent": "^4.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.1", - "stream-events": "^1.0.5", - "uuid": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/terser": { "version": "5.51.2", "resolved": "https://registry.npmjs.org/terser/-/terser-5.51.2.tgz", @@ -4312,16 +4158,31 @@ "node": ">=8" } }, - "node_modules/tester": { - "resolved": "scripts/tester", - "link": true - }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, + "node_modules/tsx": { + "version": "4.23.15", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.15.tgz", + "integrity": "sha512-Yiex1Ovn8z2xPpOWckIiysV1SSyRMY9BkLF++q0yKiDxCqRhosKfMg3janKkiLBwZ5c/YryloKwGZcrEmtwxKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.28.0" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -4482,24 +4343,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/urlgrey": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-1.0.0.tgz", - "integrity": "sha512-hJfIzMPJmI9IlLkby8QrsCykQ+SXDeO2W5Q9QTW3QpqZVTx4a/K7p8/5q+/isD8vsbVaFgql/gvAoQCRQ2Cb5w==", - "dev": true, - "dependencies": { - "fast-url-parser": "^1.1.3" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/v8-to-istanbul": { "version": "9.1.3", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz", @@ -4802,14 +4645,14 @@ }, "scripts/builder": { "version": "0.0.0", - "dev": true, + "extraneous": true, "bin": { "builder": "builder.js" } }, "scripts/tester": { "version": "0.0.0", - "dev": true, + "extraneous": true, "bin": { "tester": "tester.js" } diff --git a/package.json b/package.json index b6bf7e68..11a74a9d 100644 --- a/package.json +++ b/package.json @@ -28,17 +28,15 @@ } }, "scripts": { - "clean": "rimraf dist demo coverage", - "start": "run-p 'types -- -w' 'build:esm -- --watch=forever' 'build:demo -- --watch=forever --servedir=demo'", + "clean": "rm -rf dist demo coverage tsconfig.tsbuildinfo", + "start": "run-p 'build:esm -- --watch' 'build:demo -- --watch=forever --servedir=demo'", "lint": "biome lint src/*", - "test": "tester test/*.tsx test/*/*.tsx test/*.js test/*/*.js --outdir=disttest --platform=node --format=esm --bundle --external:sinon --external:zora --target=esnext --sourcemap=inline", - "test:coverage": "c8 --src src --exclude 'test/**' --exclude 'node_modules/**' --exclude 'scripts/**' --exclude-after-remap npm test", - "test:codecov": "npm run test:coverage && c8 report --reporter json && codecov -f coverage/coverage-final.json", - "types": "tsc", - "build": "run-s types build:*", - "build:esm": "builder \"src/**/*.*s*\" --outdir=dist --format=esm", - "prebuild:demo": "rimraf demo && cp -r examples/react/public demo", - "build:demo": "builder ./examples/react/src/index.js --format=esm --splitting --bundle --outdir=demo --minify --target=es2020", + "test": "node --import tsx --test test/*.test.tsx test/*/*.test.*", + "test:coverage": "c8 --src src --exclude 'test/**' --exclude 'node_modules/**' --exclude-after-remap --reporter=text --reporter=lcov npm test", + "build": "run-s build:*", + "build:esm": "tsc", + "prebuild:demo": "rm -rf demo && cp -r examples/react/public demo", + "build:demo": "esbuild ./examples/react/src/index.tsx --format=esm --splitting --bundle --outdir=demo --minify --target=es2020", "preversion": "run-s lint test", "version": "auto-changelog -p && git add CHANGELOG.md", "prepublishOnly": "npm run build", @@ -68,19 +66,15 @@ "@types/react-dom": "^18.3.0", "@types/react-test-renderer": "^18.3.0", "auto-changelog": "^2.0.0", - "builder": "file:./scripts/builder", "c8": "^8.0.1", - "codecov": "^3.6.5", - "cross-env": "^7.0.2", - "esbuild": "^0.21.5", + "esbuild": "~0.28.0", "npm-run-all": "^4.1.5", "react": "^18.3.1", "react-dom": "^18.3.1", "react-test-renderer": "^18.3.1", - "rimraf": "^3.0.2", "screenfull": "^5.0.2", "sinon": "^16.0.0", - "tester": "file:./scripts/tester", + "tsx": "^4.23.15", "typescript": "^5.4.5", "zora": "^5.2.0" }, diff --git a/scripts/builder/builder.js b/scripts/builder/builder.js deleted file mode 100755 index 7c7adc20..00000000 --- a/scripts/builder/builder.js +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/env node -import { parseArgs } from 'node:util' -import esbuild from 'esbuild' -import process from 'node:process' -import { realpath } from 'node:fs/promises' -import { fileURLToPath } from 'node:url' - -const nodePath = await realpath(process.argv[1]) -const modulePath = await realpath(fileURLToPath(import.meta.url)) -const isCLI = nodePath === modulePath - -if (isCLI) cliBuild() - -export async function cliBuild () { - const { values: args, positionals } = parseArgs({ - options: {}, - strict: false, - allowPositionals: true - }) - - await build(positionals, args) -} - -export async function build (positionals, args) { - // https://esbuild.github.io/api/#live-reload - const livereloadJs = 'new EventSource(\'/esbuild\').addEventListener(\'change\', () => location.reload());' - - // Assigns external modules to global variables. - // https://github.com/evanw/esbuild/issues/337 - const plugins = { - 'global-externals': (arg) => { - const options = JSON.parse(arg) - const filter = new RegExp(`^${Object.keys(options)}$`) - - return { - name: 'global-externals-plugin', - setup (build) { - build.onResolve({ filter }, (args) => ({ - path: args.path, - namespace: 'global-externals-plugin' - })) - build.onLoad({ filter: /.*/, namespace: 'global-externals-plugin' }, (args) => { - const contents = `module.exports = ${options[args.path]}` - return { contents } - }) - } - } - } - } - - const options = { - logLevel: 'info', - entryPoints: positionals, - outfile: args.outfile, - outdir: args.outfile ? undefined : args.outdir ?? 'dist', - target: args.target ?? 'es2019', - bundle: args.bundle, - minify: args.minify, - format: args.format, - platform: args.platform, - sourcemap: args.sourcemap, - splitting: args.splitting, - globalName: args['global-name'], - external: argsArray(args, 'external'), - outExtension: argsObject(args, 'out-extension'), - banner: argsObject(args, 'banner'), - plugins: Object.entries(argsObject(args, 'plugin')) - .map(([name, options]) => plugins[name](options)), - define: { - 'globalThis.__TEST__': 'false', - ...argsObject(args, 'define') - }, - loader: { - '.js': 'jsx', - ...argsObject(args, 'loader') - }, - footer: { - ...argsObject(args, 'footer'), - js: (args['footer:js'] ?? '') + - (args.livereload ? `\n${livereloadJs}` : '') - } - } - - if (process.env.NODE_ENV) { - options.define['process.env.NODE_ENV'] ||= `"${process.env.NODE_ENV}"` - } - - // console.log(options) - - if (args.watch) { - const ctx = await esbuild.context(options) - - await ctx.watch() - - if (args.servedir) { - await ctx.serve({ - servedir: args.servedir - }) - } - - return - } - - await esbuild.build(options) -} - -function argsArray (args, name) { - return Object.keys(args) - .filter(k => k.startsWith(`${name}:`)) - .map(k => k.slice(`${name}:`.length)) -} - -function argsObject (args, name) { - return Object.keys(args) - .filter(k => k.startsWith(`${name}:`)) - .reduce((acc, k) => { - const key = k.slice(`${name}:`.length) - acc[key] = args[k] - return acc - }, {}) -} diff --git a/scripts/builder/package.json b/scripts/builder/package.json deleted file mode 100644 index 02632261..00000000 --- a/scripts/builder/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "private": true, - "name": "builder", - "version": "0.0.0", - "type": "module", - "main": "./builder.js", - "bin": { - "builder": "./builder.js" - } -} diff --git a/scripts/tester/package.json b/scripts/tester/package.json deleted file mode 100644 index 476c3ff9..00000000 --- a/scripts/tester/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "private": true, - "name": "tester", - "version": "0.0.0", - "type": "module", - "main": "./tester.js", - "bin": { - "tester": "./tester.js" - } -} diff --git a/scripts/tester/tester.js b/scripts/tester/tester.js deleted file mode 100755 index 1ab897dd..00000000 --- a/scripts/tester/tester.js +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env node -import { parseArgs, promisify } from 'node:util'; -import process from 'node:process'; -import { realpath } from 'node:fs/promises'; -import { exec } from 'node:child_process'; -import { fileURLToPath } from 'node:url'; -import { build } from 'builder'; - -const asyncExec = promisify(exec); -const nodePath = await realpath(process.argv[1]); -const modulePath = await realpath(fileURLToPath(import.meta.url)); -const isCLI = nodePath === modulePath; - -if (isCLI) cliTest(); - -export async function cliTest() { - console.time('\n⚡ Tested in'); - - const { values: args, positionals } = parseArgs({ - options: {}, - strict: false, - allowPositionals: true, - }); - - await test(positionals, args); - - console.timeEnd('\n⚡ Tested in'); -} - -export async function test(positionals, args) { - // Set flag for running tests in development mode, required for `act()`. - args['define:process.env.NODE_ENV'] = '"development"'; - - // Set flag for adding stubs used in tests. - args['define:globalThis.__TEST__'] = 'true'; - - await build(positionals, args); - - await cmd(`echo '{"type": "module"}' > ${args.outdir}/package.json`); - - // Ignore test/helpers/ folder for running tests. - positionals = positionals.filter((p) => !p.startsWith('test/helpers/')); - - for (let file of positionals) { - file = file.replace(/\.tsx?/, '.js'); - console.log(await cmd(`node --enable-source-maps dist${file}`)); - } -} - -async function cmd(command, opts = {}) { - command = command.trim().replace(/\s+/g, ' '); - - if (opts.verbose) console.log(`${command}`); - - const { stdout, stderr } = await asyncExec(command); - - if (stderr) { - console.error(`\n${stderr}`); - } - - return stdout.trim(); -} diff --git a/src/patterns.ts b/src/patterns.ts index 37809c31..e3504c3b 100644 --- a/src/patterns.ts +++ b/src/patterns.ts @@ -1,45 +1,21 @@ +import { resolveAdapterType, resolveMimeType, type AdapterType } from '@videojs/react'; + export const AUDIO_EXTENSIONS = /\.(m4a|m4b|mp4a|mpga|mp2|mp2a|mp3|m2a|m3a|wav|weba|aac|oga|spx)($|\?)/i; export const VIDEO_EXTENSIONS = /\.(mp4|og[gv]|webm|mov|m4v)(#t=[,\d+]+)?($|\?)/i; -export const HLS_EXTENSIONS = /\.(m3u8)($|\?)/i; -export const DASH_EXTENSIONS = /\.(mpd)($|\?)/i; -// Match Mux m3u8 URLs without the extension so users can use hls.js with Mux by adding the `.m3u8` extension. https://regexr.com/7um5f -export const MATCH_URL_MUX = /stream\.mux\.com\/(?!\w+\.m3u8)(\w+)/; -export const MATCH_URL_YOUTUBE = - /(?:youtu\.be\/|youtube(?:-nocookie|education)?\.com\/(?:embed\/|v\/|watch\/|watch\?v=|watch\?.+&v=|shorts\/|live\/))((\w|-){11})|youtube\.com\/playlist\?list=|youtube\.com\/user\//; -export const MATCH_URL_VIMEO = /vimeo\.com\/(?!progressive_redirect).+/; -export const MATCH_URL_WISTIA = - /(?:wistia\.(?:com|net)|wi\.st)\/(?:medias|embed)\/(?:iframe\/)?([^?]+)/; -export const MATCH_URL_SPOTIFY = /open\.spotify\.com\/(\w+)\/(\w+)/i; -export const MATCH_URL_TWITCH = /(?:www\.|go\.)?twitch\.tv\/([a-zA-Z0-9_]+|(videos?\/|\?video=)\d+)($|\?)/; -export const MATCH_URL_TIKTOK = /tiktok\.com\/(?:player\/v1\/|share\/video\/|@[^/]+\/video\/)([0-9]+)/; -const canPlayFile = (url: string, test: (u: string) => boolean) => { - if (Array.isArray(url)) { - for (const item of url) { - if (typeof item === 'string' && canPlayFile(item, test)) { - return true; - } - if (canPlayFile(item.src, test)) { - return true; - } - } - return false; - } - return test(url); -}; +export type PlayerKey = Exclude | 'html'; -export const canPlay = { - html: (url: string) => - canPlayFile(url, (u: string) => AUDIO_EXTENSIONS.test(u) || VIDEO_EXTENSIONS.test(u)), - hls: (url: string) => canPlayFile(url, (u: string) => HLS_EXTENSIONS.test(u)), - dash: (url: string) => canPlayFile(url, (u: string) => DASH_EXTENSIONS.test(u)), - mux: (url: string) => MATCH_URL_MUX.test(url), - youtube: (url: string) => MATCH_URL_YOUTUBE.test(url), - vimeo: (url: string) => - MATCH_URL_VIMEO.test(url) && !VIDEO_EXTENSIONS.test(url) && !HLS_EXTENSIONS.test(url), - wistia: (url: string) => MATCH_URL_WISTIA.test(url), - spotify: (url: string) => MATCH_URL_SPOTIFY.test(url), - twitch: (url: string) => MATCH_URL_TWITCH.test(url), - tiktok: (url: string) => MATCH_URL_TIKTOK.test(url), +/** The key of the built-in player that plays `url`, from its Video.js adapter type. */ +const resolvePlayerKey = (url: string): PlayerKey | null => { + const type = resolveAdapterType(url); + // Mux stream URLs with the `.m3u8` extension resolve to `mux`, but are played with hls.js so + // users can opt into it by adding the extension. + if (type === 'mux' && resolveMimeType(url) === 'application/x-mpegurl') return 'hls'; + if (type === 'video' || type === 'audio') return 'html'; + // The extension patterns cover formats Video.js doesn't recognize (e.g. m4v, weba, oga). + if (!type && (AUDIO_EXTENSIONS.test(url) || VIDEO_EXTENSIONS.test(url))) return 'html'; + return type; }; + +export const canPlay = (key: PlayerKey) => (url: string) => resolvePlayerKey(url) === key; diff --git a/src/players.ts b/src/players.ts index de4167db..97b40d08 100644 --- a/src/players.ts +++ b/src/players.ts @@ -26,7 +26,7 @@ const lazyMedia =

( const Players: PlayerEntry[] = [ { key: 'hls', - canPlay: canPlay.hls, + canPlay: canPlay('hls'), canEnablePIP: () => true, player: lazyMedia( () => @@ -37,7 +37,7 @@ const Players: PlayerEntry[] = [ }, { key: 'dash', - canPlay: canPlay.dash, + canPlay: canPlay('dash'), canEnablePIP: () => true, player: lazyMedia( () => @@ -48,7 +48,7 @@ const Players: PlayerEntry[] = [ }, { key: 'mux', - canPlay: canPlay.mux, + canPlay: canPlay('mux'), canEnablePIP: () => true, player: lazyMedia( () => @@ -60,7 +60,7 @@ const Players: PlayerEntry[] = [ }, { key: 'youtube', - canPlay: canPlay.youtube, + canPlay: canPlay('youtube'), player: lazyMedia( () => import( @@ -70,7 +70,7 @@ const Players: PlayerEntry[] = [ }, { key: 'vimeo', - canPlay: canPlay.vimeo, + canPlay: canPlay('vimeo'), player: lazyMedia( () => import(/* webpackChunkName: 'reactPlayerVimeo' */ '@videojs/react/media/vimeo-video').then( @@ -80,7 +80,7 @@ const Players: PlayerEntry[] = [ }, { key: 'wistia', - canPlay: canPlay.wistia, + canPlay: canPlay('wistia'), canEnablePIP: () => true, player: lazyMedia( () => @@ -92,7 +92,7 @@ const Players: PlayerEntry[] = [ }, { key: 'spotify', - canPlay: canPlay.spotify, + canPlay: canPlay('spotify'), canEnablePIP: () => false, player: lazyMedia( () => @@ -103,7 +103,7 @@ const Players: PlayerEntry[] = [ }, { key: 'twitch', - canPlay: canPlay.twitch, + canPlay: canPlay('twitch'), canEnablePIP: () => false, player: lazyMedia( () => @@ -114,7 +114,7 @@ const Players: PlayerEntry[] = [ }, { key: 'tiktok', - canPlay: canPlay.tiktok, + canPlay: canPlay('tiktok'), canEnablePIP: () => false, player: lazyMedia( () => @@ -125,7 +125,7 @@ const Players: PlayerEntry[] = [ }, { key: 'html', - canPlay: canPlay.html, + canPlay: canPlay('html'), canEnablePIP: () => true, player: HtmlPlayer, }, diff --git a/test/Player.test.tsx b/test/Player.test.tsx index 9fa85322..371d7269 100644 --- a/test/Player.test.tsx +++ b/test/Player.test.tsx @@ -1,8 +1,117 @@ import './helpers/server-safe-globals.js'; import { test } from 'zora'; import sinon from 'sinon'; +import { act } from 'react-test-renderer'; import React from 'react'; import Player from '../src/Player'; +import HtmlPlayer from '../src/HtmlPlayer'; +import { render } from './helpers/helpers'; + +test('video.load()', async (t) => { + const videoRef: React.Ref = React.createRef(); + render(); + + const loadstart = sinon.fake(); + videoRef.current?.addEventListener('loadstart', loadstart); + + await Promise.resolve(); + t.ok(loadstart.calledOnce); +}); + +test('video.play()', async (t) => { + const videoRef: React.Ref = React.createRef(); + const wrapper = render(); + + const play = sinon.fake(); + videoRef.current?.addEventListener('play', play); + + act(() => { + wrapper.update(); + }); + await Promise.resolve(); + + t.ok(play.calledOnce); + t.equal(videoRef.current?.paused, false); +}); + +test('video.pause()', async (t) => { + const videoRef: React.Ref = React.createRef(); + const wrapper = render(); + + const pause = sinon.fake(); + videoRef.current?.addEventListener('pause', pause); + + act(() => { + wrapper.update(); + }); + await Promise.resolve(); + + t.ok(pause.calledOnce); + t.equal(videoRef.current?.paused, true); +}); + +test('video.volume = 0.5', async (t) => { + const videoRef: React.Ref = React.createRef(); + const wrapper = render(); + + act(() => { + wrapper.update(); + }); + await Promise.resolve(); + + t.equal(videoRef.current?.volume, 0.5); +}); + +test('video.muted = true', async (t) => { + let videoRef: React.Ref = React.createRef(); + const wrapper = render(); + t.equal(videoRef.current?.muted, false); + + act(() => { + videoRef = React.createRef(); + wrapper.update(); + }); + await Promise.resolve(); + + t.equal(videoRef.current?.muted, true); +}); + +test('video.muted = false', async (t) => { + let videoRef: React.Ref = React.createRef(); + const wrapper = render(); + t.equal(videoRef.current?.muted, true); + + act(() => { + videoRef = React.createRef(); + wrapper.update(); + }); + await Promise.resolve(); + + t.equal(videoRef.current?.muted, false); +}); + +test('video.playbackRate = 0.5', async (t) => { + const videoRef: React.Ref = React.createRef(); + const wrapper = render(); + + act(() => { + wrapper.update(); + }); + await Promise.resolve(); + + t.equal(videoRef.current?.playbackRate, 0.5); +}); + +await test('video.duration', async (t) => { + const videoRef: React.Ref = React.createRef(); + render(); + + await new Promise((resolve) => { + videoRef.current?.addEventListener('durationchange', resolve); + }); + + t.equal(videoRef.current?.duration, 10); +}); // Mock the activePlayer component const MockActivePlayer = React.forwardRef((props, ref) => { diff --git a/test/Player.tsx b/test/Player.tsx deleted file mode 100644 index 48201759..00000000 --- a/test/Player.tsx +++ /dev/null @@ -1,114 +0,0 @@ -import './helpers/server-safe-globals.js'; -import { test } from 'zora'; -import sinon from 'sinon'; -import { act } from 'react-test-renderer'; -import React from 'react'; -import Player from '../src/Player'; -import HtmlPlayer from '../src/HtmlPlayer'; -import { render } from './helpers/helpers'; - -test('video.load()', async (t) => { - const videoRef: React.Ref = React.createRef(); - render(); - - const loadstart = sinon.fake(); - videoRef.current?.addEventListener('loadstart', loadstart); - - await Promise.resolve(); - t.ok(loadstart.calledOnce); -}); - -test('video.play()', async (t) => { - const videoRef: React.Ref = React.createRef(); - const wrapper = render(); - - const play = sinon.fake(); - videoRef.current?.addEventListener('play', play); - - act(() => { - wrapper.update(); - }); - await Promise.resolve(); - - t.ok(play.calledOnce); - t.equal(videoRef.current?.paused, false); -}); - -test('video.pause()', async (t) => { - const videoRef: React.Ref = React.createRef(); - const wrapper = render(); - - const pause = sinon.fake(); - videoRef.current?.addEventListener('pause', pause); - - act(() => { - wrapper.update(); - }); - await Promise.resolve(); - - t.ok(pause.calledOnce); - t.equal(videoRef.current?.paused, true); -}); - -test('video.volume = 0.5', async (t) => { - const videoRef: React.Ref = React.createRef(); - const wrapper = render(); - - act(() => { - wrapper.update(); - }); - await Promise.resolve(); - - t.equal(videoRef.current?.volume, 0.5); -}); - -test('video.muted = true', async (t) => { - let videoRef: React.Ref = React.createRef(); - const wrapper = render(); - t.equal(videoRef.current?.muted, false); - - act(() => { - videoRef = React.createRef(); - wrapper.update(); - }); - await Promise.resolve(); - - t.equal(videoRef.current?.muted, true); -}); - -test('video.muted = false', async (t) => { - let videoRef: React.Ref = React.createRef(); - const wrapper = render(); - t.equal(videoRef.current?.muted, true); - - act(() => { - videoRef = React.createRef(); - wrapper.update(); - }); - await Promise.resolve(); - - t.equal(videoRef.current?.muted, false); -}); - -test('video.playbackRate = 0.5', async (t) => { - const videoRef: React.Ref = React.createRef(); - const wrapper = render(); - - act(() => { - wrapper.update(); - }); - await Promise.resolve(); - - t.equal(videoRef.current?.playbackRate, 0.5); -}); - -await test('video.duration', async (t) => { - const videoRef: React.Ref = React.createRef(); - render(); - - await new Promise((resolve) => { - videoRef.current?.addEventListener('durationchange', resolve); - }); - - t.equal(videoRef.current?.duration, 10); -}); diff --git a/test/ReactPlayer/instanceMethods.js b/test/ReactPlayer/instanceMethods.js deleted file mode 100644 index eddd189f..00000000 --- a/test/ReactPlayer/instanceMethods.js +++ /dev/null @@ -1,56 +0,0 @@ -import { test } from 'zora'; -import sinon from 'sinon'; -import React from 'react'; -import { create } from 'react-test-renderer'; -import ReactPlayer from '../../src/index'; - -const COMMON_METHODS = ['getDuration', 'getCurrentTime', 'getSecondsLoaded', 'getInternalPlayer']; - -// for (const method of COMMON_METHODS) { -// test(`${method}()`, t => { -// const instance = create().getInstance() -// instance.references.player({ [method]: () => 123 }) -// t.ok(instance[method]() === 123) -// }) - -// test(`${method}() - null`, t => { -// const instance = create().getInstance() -// t.ok(instance[method]() === null) -// }) -// } - -// test('getInternalPlayer() - default', t => { -// const instance = create().getInstance() -// const getInternalPlayer = sinon.fake.returns('abc') -// instance.references.player({ getInternalPlayer }) -// t.ok(instance.getInternalPlayer() === 'abc') -// t.ok(getInternalPlayer.calledOnceWith('player')) -// }) - -// test('seekTo()', t => { -// const instance = create().getInstance() -// instance.references.player({ seekTo: sinon.fake() }) -// instance.seekTo(5) -// t.ok(instance.player.seekTo.calledOnce) -// t.ok(instance.player.seekTo.calledWith(5)) -// }) - -// test('seekTo() - null', t => { -// const instance = create().getInstance() -// t.ok(instance.seekTo() === null) -// }) - -// test('onReady()', t => { -// const onReady = sinon.fake() -// const instance = create().getInstance() -// instance.handleReady() -// t.ok(onReady.calledWith(instance)) -// }) - -// test('refs', t => { -// const instance = create().getInstance() -// instance.references.player('abc') -// instance.references.wrapper('def') -// t.ok(instance.player === 'abc') -// t.ok(instance.wrapper === 'def') -// }) diff --git a/test/ReactPlayer/props.tsx b/test/ReactPlayer/props.test.tsx similarity index 100% rename from test/ReactPlayer/props.tsx rename to test/ReactPlayer/props.test.tsx diff --git a/test/ReactPlayer/render.js b/test/ReactPlayer/render.js deleted file mode 100644 index 15a28ebc..00000000 --- a/test/ReactPlayer/render.js +++ /dev/null @@ -1,22 +0,0 @@ -import React from 'react'; -import { test } from 'zora'; -import { create } from 'react-test-renderer'; -import ReactPlayer from '../../src/index'; -import Player from '../../src/Player'; -import HtmlPlayer from '../../src/HtmlPlayer'; - -globalThis.window = { MediaStream: Object }; - -test.skip('render', (t) => { - const wrapper = create(); - t.ok(wrapper.equals(

{null}
)); -}); - -test.skip('fallback player', (t) => { - const wrapper = create(); - t.ok( - wrapper - .childAt(0) - .matchesElement() - ); -}); diff --git a/test/ReactPlayer/staticMethods.js b/test/ReactPlayer/staticMethods.test.jsx similarity index 100% rename from test/ReactPlayer/staticMethods.js rename to test/ReactPlayer/staticMethods.test.jsx diff --git a/test/helpers/server-safe-globals.js b/test/helpers/server-safe-globals.js index 471848c9..782a2666 100644 --- a/test/helpers/server-safe-globals.js +++ b/test/helpers/server-safe-globals.js @@ -1,3 +1,7 @@ +// Load zora before the `window` shim below, so it starts in Node mode rather than waiting for a +// browser `load` event. +import 'zora'; + // Prevent from Node.Timeout to hang the process const oldSetTimeout = globalThis.setTimeout; // @ts-ignore @@ -12,6 +16,7 @@ class Element extends EventTarget { style = {}; querySelector = () => new Element(); contains = () => true; + setAttribute() {} } class HTMLVideoElement extends Element { @@ -99,12 +104,22 @@ const document = { const globalThisShim = { location: { origin: 'origin' }, - navigator: {}, - URL: { createObjectURL: () => 'mockObjectURL' }, + navigator: { userAgent: 'node' }, + URL: class extends URL { + static createObjectURL = () => 'mockObjectURL'; + }, document, MediaStream, }; -globalThis.document = document; globalThis.window = globalThisShim; -Object.assign(globalThis, globalThisShim); +// defineProperty rather than assignment: Node 21+ defines `navigator` as a getter-only global. +Object.defineProperties( + globalThis, + Object.fromEntries( + Object.entries(globalThisShim).map(([key, value]) => [ + key, + { value, writable: true, configurable: true }, + ]) + ) +); diff --git a/test/react-player-tests.tsx b/test/react-player-tests.tsx deleted file mode 100644 index ecbad954..00000000 --- a/test/react-player-tests.tsx +++ /dev/null @@ -1,227 +0,0 @@ -// const COMMON_METHODS = ['getDuration', 'getCurrentTime', 'getSecondsLoaded'] - -// for (const method of COMMON_METHODS) { -// test(`${method}()`, t => { -// const instance = create().getInstance() -// instance.player = { [method]: () => 123 } -// instance.isReady = true -// t.ok(instance[method]() === 123) -// }) - -// test(`${method}() - null`, t => { -// const instance = create().getInstance() -// t.ok(instance[method]() === null) -// }) -// } - -// test('progress()', t => { -// const load = sinon.fake() -// const onProgress = sinon.fake() -// const instance = create().getInstance() -// instance.handlePlayerMount({ -// load, -// getCurrentTime: sinon.fake.returns(10), -// getSecondsLoaded: sinon.fake.returns(20), -// getDuration: sinon.fake.returns(40) -// }) -// instance.isReady = true -// instance.progress() -// instance.progress() // Call twice to ensure onProgress is not called again -// t.ok(onProgress.calledOnceWith({ -// loaded: 0.5, -// loadedSeconds: 20, -// played: 0.25, -// playedSeconds: 10 -// })) -// }) - -// test('progress() handlePlayerMount', t => { -// const load = sinon.fake() -// const onProgress = sinon.fake() -// const instance = create().getInstance() -// instance.isReady = true -// instance.handlePlayerMount({ -// load, -// getCurrentTime: sinon.fake.returns(10), -// getSecondsLoaded: sinon.fake.returns(20), -// getDuration: sinon.fake.returns(40) -// }) -// t.ok(onProgress.calledWith({ -// loaded: 0.5, -// loadedSeconds: 20, -// played: 0.25, -// playedSeconds: 10 -// })) -// }) - -// test('seekTo() - seconds', t => { -// const load = sinon.fake() -// const seekTo = sinon.fake() -// const instance = create().getInstance() -// instance.handlePlayerMount({ load, seekTo }) -// instance.isReady = true -// instance.seekTo(10) -// t.ok(seekTo.calledOnceWith(10)) -// }) - -// test('seekTo() - fraction', t => { -// const load = sinon.fake() -// const seekTo = sinon.fake() -// const instance = create().getInstance() -// instance.handlePlayerMount({ -// load, -// seekTo, -// getDuration: sinon.fake.returns(10) -// }) -// instance.isReady = true -// instance.seekTo(0.5) -// t.ok(seekTo.calledOnceWith(5)) -// }) - -// test('seekTo() - warning', t => { -// const stub = sinon.stub(console, 'warn') -// const load = sinon.fake() -// const seekTo = sinon.fake() -// const instance = create().getInstance() -// instance.handlePlayerMount({ -// load, -// seekTo, -// getDuration: sinon.fake.returns(null) -// }) -// instance.isReady = true -// instance.seekTo(0.5) -// t.ok(seekTo.notCalled) -// t.ok(stub.calledOnce) -// stub.restore() -// }) - -// test('seekTo() - set seekOnPlay', t => { -// const load = sinon.fake() -// const seekTo = sinon.fake() -// const instance = create().getInstance() -// instance.handlePlayerMount({ load, seekTo }) -// instance.isReady = false -// instance.seekTo(10) -// t.ok(seekTo.notCalled) -// t.ok(instance.seekOnPlay === 10) -// }) - -// test('onReady()', t => { -// const onReady = sinon.fake() -// const load = sinon.fake() -// const setVolume = sinon.fake() -// const play = sinon.fake() -// const instance = create().getInstance() -// instance.handlePlayerMount({ load, setVolume, play }) -// instance.handleDurationCheck = sinon.fake() -// instance.isReady = true -// instance.handleReady() -// t.ok(setVolume.calledOnceWith(1)) -// t.ok(play.calledOnce) -// }) - -// test('loadOnReady', t => { -// const load = sinon.fake() -// const play = sinon.fake() -// const instance = create().getInstance() -// instance.handlePlayerMount({ load, play }) -// instance.handleDurationCheck = sinon.fake() -// instance.loadOnReady = 'file.mp4' -// instance.handleReady() -// t.ok(load.calledWith('file.mp4')) -// t.ok(play.notCalled) -// }) - -// test('onPlay()', t => { -// const onPlay = sinon.fake() -// const instance = create().getInstance() -// instance.handlePlayerMount({ load: () => {} }) -// instance.handleDurationCheck = sinon.fake() -// instance.handlePlay() -// t.ok(onPlay.calledOnce) -// t.ok(instance.isPlaying) -// t.notOk(instance.isLoading) -// }) - -// test('onStart()', t => { -// const onStart = sinon.fake() -// const instance = create().getInstance() -// instance.handlePlayerMount({ load: () => {} }) -// instance.handleDurationCheck = sinon.fake() -// instance.startOnPlay = true -// instance.handlePlay() -// t.ok(onStart.calledOnce) -// t.notOk(instance.startOnPlay) -// }) - -// test('seekOnPlay', t => { -// const seekTo = sinon.stub(Player.prototype, 'seekTo') -// const instance = create().getInstance() -// instance.handlePlayerMount({ load: () => {} }) -// instance.handleDurationCheck = sinon.fake() -// instance.seekOnPlay = 10 -// instance.handlePlay() -// t.ok(seekTo.calledOnceWith(10)) -// t.ok(instance.seekOnPlay === null) -// seekTo.restore() -// }) - -// test('onPause()', t => { -// const onPause = sinon.fake() -// const instance = create().getInstance() -// instance.isLoading = false -// instance.handlePause() -// t.ok(onPause.calledOnce) -// t.notOk(instance.isPlaying) -// }) - -// test('onPause() - isLoading', t => { -// const onPause = sinon.fake() -// const instance = create().getInstance() -// instance.isLoading = true -// instance.handlePause() -// t.ok(onPause.notCalled) -// }) - -// test('onEnded()', t => { -// const activePlayer = () => null -// const onEnded = sinon.fake() -// const instance = create().getInstance() -// instance.isPlaying = true -// instance.handleEnded() -// t.ok(onEnded.calledOnce) -// t.notOk(instance.isPlaying) -// }) - -// test('loopOnEnded', t => { -// const activePlayer = () => null -// activePlayer.loopOnEnded = true -// const seekTo = sinon.stub(Player.prototype, 'seekTo') -// const instance = create().getInstance() -// instance.handlePlayerMount({ load: () => {} }) -// instance.isPlaying = true -// instance.handleEnded() -// t.ok(seekTo.calledOnceWith(0)) -// t.ok(instance.isPlaying) -// seekTo.restore() -// }) - -// test('handleDurationCheck', t => { -// const onDuration = sinon.fake() -// const instance = create().getInstance() -// instance.getDuration = sinon.fake.returns(10) -// instance.handleDurationCheck() -// instance.handleDurationCheck() // Call twice to ensure onDuration is not called again -// t.ok(onDuration.calledOnceWith(10)) -// t.ok(instance.onDurationCalled) -// }) - -// test('durationCheckTimeout', t => { -// const onDuration = sinon.fake() -// const instance = create().getInstance() -// instance.getDuration = sinon.fake.returns(null) -// instance.durationCheckTimeout = null -// instance.handleDurationCheck() -// t.ok(onDuration.notCalled) -// t.truthy(instance.durationCheckTimeout) -// }) diff --git a/tsconfig.json b/tsconfig.json index 21b7f6a9..3d5da4b5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "preserveWatchOutput": true, - "target": "es2022", + "target": "es2019", "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, @@ -14,7 +14,6 @@ "jsx": "react", "incremental": true, "declaration": true, - "emitDeclarationOnly": true, "rootDir": "src", "outDir": "dist", },