From 9393a3c6c4bb14bbf03aa496d2399a7ee2a00e54 Mon Sep 17 00:00:00 2001 From: Gregg Tavares Date: Wed, 16 Oct 2024 16:15:20 +0900 Subject: [PATCH 1/2] Update chokidar to v4 chokidar v3 is no longer supported. v4 requires node 20 so 1. Added a check for v20+ 2. Make script exit if any spawn gets an error. This required watching for processes to exit and killing the other processes. 3. Update to use glob as chokidar v4 no longer does it Also fixed a minor warning in sample/utis.ts --- build/lib/copyAndWatch.js | 3 +- build/tools/serve.js | 18 ++++- package-lock.json | 159 ++++++++++++++------------------------ package.json | 4 +- rollup.config.js | 6 ++ sample/util.ts | 1 + 6 files changed, 84 insertions(+), 107 deletions(-) diff --git a/build/lib/copyAndWatch.js b/build/lib/copyAndWatch.js index 626a0abb..4c82938e 100644 --- a/build/lib/copyAndWatch.js +++ b/build/lib/copyAndWatch.js @@ -1,6 +1,7 @@ import chokidar from 'chokidar'; import fs from 'fs'; import path from 'path'; +import { globSync } from 'glob'; const debug = console.log; //() => {}; const removeLeadingSlash = (s) => s.replace(/^\//, ''); @@ -20,7 +21,7 @@ const removeLeadingSlash = (s) => s.replace(/^\//, ''); */ export function copyAndWatch(paths, { watch } = { watch: true }) { for (const { src, srcPrefix, dst } of paths) { - const watcher = chokidar.watch(src, { + const watcher = chokidar.watch(globSync(src), { ignored: /(^|[\/\\])\../, // ignore dot files persistent: watch, }); diff --git a/build/tools/serve.js b/build/tools/serve.js index 78cab7dc..960fc18d 100644 --- a/build/tools/serve.js +++ b/build/tools/serve.js @@ -3,17 +3,29 @@ import { mkdirSync } from 'fs'; mkdirSync('out', { recursive: true }); -spawn('npm', ['run', 'watch'], { +const spawns = []; + +function spawnAndCheck(cmd, args, options) { + const s = spawn(cmd, args, options); + spawns.push(s); + s.on('close', (code) => { + console.log(cmd, 'exited with code:', code); + spawns.forEach((s) => s.kill()); + process.exit(code); + }); +} + +spawnAndCheck('npm', ['run', 'watch'], { shell: true, stdio: 'inherit', }); -spawn('node', ['build/tools/copy.js', '1'], { +spawnAndCheck('node', ['build/tools/copy.js', '1'], { shell: true, stdio: 'inherit', }); -spawn('npm', ['run', 'server'], { +spawnAndCheck('npm', ['run', 'server'], { shell: true, stdio: 'inherit', }); diff --git a/package-lock.json b/package-lock.json index 32d0487e..7af7a4ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,12 +32,12 @@ "@types/stats.js": "^0.17.3", "@typescript-eslint/eslint-plugin": "^7.18.0", "@webgpu/types": "^0.1.49", - "chokidar": "^3.6.0", + "chokidar": "^4.0.1", "eslint": "^8.57.1", "eslint-config-prettier": "^8.10.0", "eslint-plugin-html": "^8.1.2", "eslint-plugin-prettier": "^4.2.1", - "glob": "^10.4.5", + "glob": "^11.0.0", "prettier": "^2.8.8", "rollup": "^4.24.0", "rollup-plugin-copy": "^3.5.0", @@ -399,16 +399,6 @@ "node": ">= 8" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@rollup/plugin-commonjs": { "version": "25.0.8", "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.8.tgz", @@ -1146,19 +1136,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1204,18 +1181,6 @@ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/body-parser": { "version": "1.20.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", @@ -1330,27 +1295,18 @@ } }, "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", + "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", "dev": true, "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 14.16.0" }, "funding": { "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" } }, "node_modules/codemirror": { @@ -2292,21 +2248,24 @@ } }, "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "path-scurry": "^2.0.0" }, "bin": { "glob": "dist/esm/bin.mjs" }, + "engines": { + "node": "20 || >=22" + }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -2323,6 +2282,21 @@ "node": ">= 6" } }, + "node_modules/glob/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", @@ -2546,18 +2520,6 @@ "node": ">= 0.10" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-core-module": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", @@ -2652,18 +2614,18 @@ "dev": true }, "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", + "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, + "engines": { + "node": "20 || >=22" + }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/js-yaml": { @@ -2749,10 +2711,13 @@ "dev": true }, "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.1.tgz", + "integrity": "sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==", + "dev": true, + "engines": { + "node": "20 || >=22" + } }, "node_modules/magic-string": { "version": "0.30.12", @@ -2899,15 +2864,6 @@ "node": ">= 6.13.0" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -3058,16 +3014,16 @@ "dev": true }, "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", "dev": true, "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -3218,15 +3174,16 @@ } }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, "engines": { - "node": ">=8.10.0" + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/regenerator-runtime": { diff --git a/package.json b/package.json index ce4c23a4..a5bcce2d 100644 --- a/package.json +++ b/package.json @@ -43,12 +43,12 @@ "@types/stats.js": "^0.17.3", "@typescript-eslint/eslint-plugin": "^7.18.0", "@webgpu/types": "^0.1.49", - "chokidar": "^3.6.0", + "chokidar": "^4.0.1", "eslint": "^8.57.1", "eslint-config-prettier": "^8.10.0", "eslint-plugin-html": "^8.1.2", "eslint-plugin-prettier": "^4.2.1", - "glob": "^10.4.5", + "glob": "^11.0.0", "prettier": "^2.8.8", "rollup": "^4.24.0", "rollup-plugin-copy": "^3.5.0", diff --git a/rollup.config.js b/rollup.config.js index d58c8181..4cf7590a 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -5,6 +5,12 @@ import typescript from '@rollup/plugin-typescript'; import commonjs from '@rollup/plugin-commonjs'; import { readDirSyncRecursive } from './build/lib/readdir.js'; +const nodeVersion = parseInt(process.version.substring(1)); +if (isNaN(nodeVersion) || nodeVersion < 20) { + console.error('need node >= v20'); + process.exit(1); +} + const outPath = 'out'; function wgslPlugin() { diff --git a/sample/util.ts b/sample/util.ts index b16a4aac..33031961 100644 --- a/sample/util.ts +++ b/sample/util.ts @@ -22,6 +22,7 @@ export function quitIfWebGPUNotAvailable( if (!device) { quitIfAdapterNotAvailable(adapter); fail('Unable to get a device for an unknown reason'); + return; } device.lost.then((reason) => { From 446bb4e4702d7a6d5fd69f6f4ddb6f890324e601 Mon Sep 17 00:00:00 2001 From: Gregg Tavares Date: Thu, 17 Oct 2024 09:55:46 +0900 Subject: [PATCH 2/2] address comments --- build/tools/serve.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/build/tools/serve.js b/build/tools/serve.js index 960fc18d..0e7d1a53 100644 --- a/build/tools/serve.js +++ b/build/tools/serve.js @@ -3,15 +3,18 @@ import { mkdirSync } from 'fs'; mkdirSync('out', { recursive: true }); -const spawns = []; +const spawns = new Set(); function spawnAndCheck(cmd, args, options) { const s = spawn(cmd, args, options); - spawns.push(s); + spawns.add(s); s.on('close', (code) => { - console.log(cmd, 'exited with code:', code); - spawns.forEach((s) => s.kill()); - process.exit(code); + spawns.delete(s); + if (code !== 0) { + console.error(cmd, 'exited with code:', code); + [...spawns].forEach((s) => s.kill()); + process.exit(code); + } }); }