All Node.js-side code in the repo, including scripts, utilities, library modules, Playwright helpers and build tooling, is written as ESM .mjs. CLI-invoked scripts go in a scripts folder, shared modules in lib, and package-specific folders are allowed. Scripts run with node from package.json or as a cmd entry in handsontable/scripts/tasks.json.
The core package uses a dispatcher. Every command is declared in tasks.json with fields such as cmd, deps, mode, cwd, passthrough and note, with a thin shim in package.json that calls scripts/run.mjs, and pipelines group tasks with before and after steps run sequentially. Wrapper packages and the performance and visual test packages take scripts directly in their own package.json. Built-ins are imported with the node: prefix, top-level await is preferred, and native modules replace third-party packages, for example fs/promises instead of fs-extra and rm with recursive and force instead of rimraf.