From 6f1acf7f9f3c9f1c4ef36aa3f767b555af2a7f5b Mon Sep 17 00:00:00 2001 From: dmail Date: Mon, 30 Dec 2024 12:04:55 +0100 Subject: [PATCH] publish latest --- dist/jsenv_core.js | 37 +- package.json | 2 +- packages/independent/https-local/package.json | 4 +- packages/independent/md-up/package.json | 4 +- packages/independent/snapshot/package.json | 4 +- .../workflow/file-size-impact/package.json | 6 +- .../github-pull-request-impact/package.json | 4 +- .../github-release-package/package.json | 6 +- .../workflow/lighthouse-impact/package.json | 6 +- .../workflow/monorepo/package.json | 6 +- .../workflow/package-publish/package.json | 4 +- .../workflow/performance-impact/package.json | 6 +- packages/related/cli/package.json | 2 +- .../cli/template-node-package/package.json | 2 +- .../cli/template-web-components/package.json | 2 +- .../cli/template-web-preact/package.json | 2 +- .../cli/template-web-react/package.json | 4 +- .../related/cli/template-web/package.json | 2 +- packages/related/plugin-commonjs/package.json | 4 +- packages/related/plugin-explorer/package.json | 4 +- packages/related/plugin-react/package.json | 4 +- packages/related/test/dist/jsenv_test.js | 573 ++++++++++-------- packages/related/test/package.json | 4 +- src/helpers/lookup_package_directory.js | 38 +- .../0_at_start/package.json | 1 + .../1_fix_404/package.json | 1 + .../2_update/package.json | 1 + .../3_back_to_404/package.json | 1 + .../snapshots/0_at_start.png | Bin 28456 -> 30710 bytes .../snapshots/3_back_to_404.png | Bin 29088 -> 31300 bytes 30 files changed, 385 insertions(+), 349 deletions(-) create mode 100644 tests/dev_server/autoreload_html_enoent/0_at_start/package.json create mode 100644 tests/dev_server/autoreload_html_enoent/1_fix_404/package.json create mode 100644 tests/dev_server/autoreload_html_enoent/2_update/package.json create mode 100644 tests/dev_server/autoreload_html_enoent/3_back_to_404/package.json diff --git a/dist/jsenv_core.js b/dist/jsenv_core.js index 09bf330925..97149719d5 100644 --- a/dist/jsenv_core.js +++ b/dist/jsenv_core.js @@ -11482,39 +11482,10 @@ const jsenvPluginTranspilation = ({ }; const lookupPackageDirectory = (currentUrl) => { - if (currentUrl === "file:///") { - return null; - } - const packageJsonFileUrl = `${currentUrl}package.json`; - if (existsSync(new URL(packageJsonFileUrl))) { - return currentUrl; - } - return lookupPackageDirectory(getParentUrl$1(currentUrl)); -}; - -const getParentUrl$1 = (url) => { - if (url.startsWith("file://")) { - // With node.js new URL('../', 'file:///C:/').href - // returns "file:///C:/" instead of "file:///" - const resource = url.slice("file://".length); - const slashLastIndex = resource.lastIndexOf("/"); - if (slashLastIndex === -1) { - return url; - } - const lastCharIndex = resource.length - 1; - if (slashLastIndex === lastCharIndex) { - const slashBeforeLastIndex = resource.lastIndexOf( - "/", - slashLastIndex - 1, - ); - if (slashBeforeLastIndex === -1) { - return url; - } - return `file://${resource.slice(0, slashBeforeLastIndex + 1)}`; - } - return `file://${resource.slice(0, slashLastIndex + 1)}`; - } - return new URL(url.endsWith("/") ? "../" : "./", url).href; + return findAncestorDirectoryUrl(currentUrl, (ancestorDirectoryUrl) => { + const potentialPackageJsonFileUrl = `${ancestorDirectoryUrl}package.json`; + return existsSync(new URL(potentialPackageJsonFileUrl)); + }); }; const watchSourceFiles = ( diff --git a/package.json b/package.json index 84c5da519b..ad5c638c3f 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ "@financial-times/polyfill-useragent-normaliser": "1.10.2", "@jsenv/abort": "4.3.0", "@jsenv/ast": "6.4.1", - "@jsenv/filesystem": "4.11.0", + "@jsenv/filesystem": "4.12.0", "@jsenv/humanize": "1.2.8", "@jsenv/importmap": "1.2.1", "@jsenv/integrity": "0.0.2", diff --git a/packages/independent/https-local/package.json b/packages/independent/https-local/package.json index 0fbee8ee30..77ab861bf6 100644 --- a/packages/independent/https-local/package.json +++ b/packages/independent/https-local/package.json @@ -1,6 +1,6 @@ { "name": "@jsenv/https-local", - "version": "3.2.14", + "version": "3.2.15", "description": "A programmatic way to generate locally trusted certificates", "license": "MIT", "repository": { @@ -40,7 +40,7 @@ "hosts:ensure-localhost-mappings": "node ./scripts/hosts/ensure_localhost_mappings.mjs" }, "dependencies": { - "@jsenv/filesystem": "4.11.0", + "@jsenv/filesystem": "4.12.0", "@jsenv/humanize": "1.2.8", "@jsenv/urls": "2.5.4", "command-exists": "1.2.9", diff --git a/packages/independent/md-up/package.json b/packages/independent/md-up/package.json index b482aa9d46..13816ebaba 100644 --- a/packages/independent/md-up/package.json +++ b/packages/independent/md-up/package.json @@ -1,6 +1,6 @@ { "name": "@jsenv/md-up", - "version": "0.0.13", + "version": "0.0.14", "license": "MIT", "private": true, "repository": { @@ -24,7 +24,7 @@ "dependencies": { "anchor-markdown-header": "0.7.0", "marked": "15.0.3", - "@jsenv/filesystem": "4.11.0", + "@jsenv/filesystem": "4.12.0", "@jsenv/urls": "2.5.4", "@jsenv/ast": "6.4.1" } diff --git a/packages/independent/snapshot/package.json b/packages/independent/snapshot/package.json index dd525b6b3d..534b071ff0 100644 --- a/packages/independent/snapshot/package.json +++ b/packages/independent/snapshot/package.json @@ -1,6 +1,6 @@ { "name": "@jsenv/snapshot", - "version": "2.11.24", + "version": "2.11.25", "description": "Snapshot testing", "license": "MIT", "author": { @@ -34,7 +34,7 @@ "@jsenv/ast": "6.4.1", "@jsenv/exception": "1.1.3", "@jsenv/humanize": "1.2.8", - "@jsenv/filesystem": "4.11.0", + "@jsenv/filesystem": "4.12.0", "@jsenv/terminal-recorder": "1.4.23", "@jsenv/urls": "2.5.4", "@jsenv/utils": "2.1.2", diff --git a/packages/independent/workflow/file-size-impact/package.json b/packages/independent/workflow/file-size-impact/package.json index 5c7acf2036..b1d9da44e4 100644 --- a/packages/independent/workflow/file-size-impact/package.json +++ b/packages/independent/workflow/file-size-impact/package.json @@ -1,6 +1,6 @@ { "name": "@jsenv/file-size-impact", - "version": "14.3.12", + "version": "14.3.13", "description": "Add files size impact into pull requests", "license": "MIT", "repository": { @@ -34,8 +34,8 @@ }, "dependencies": { "@jsenv/dynamic-import-worker": "1.2.1", - "@jsenv/filesystem": "4.11.0", - "@jsenv/github-pull-request-impact": "1.8.12", + "@jsenv/filesystem": "4.12.0", + "@jsenv/github-pull-request-impact": "1.8.13", "@jsenv/urls": "2.5.4", "@jsenv/humanize": "1.2.8" } diff --git a/packages/independent/workflow/github-pull-request-impact/package.json b/packages/independent/workflow/github-pull-request-impact/package.json index 0f9d41ecdf..81b8384d90 100644 --- a/packages/independent/workflow/github-pull-request-impact/package.json +++ b/packages/independent/workflow/github-pull-request-impact/package.json @@ -1,6 +1,6 @@ { "name": "@jsenv/github-pull-request-impact", - "version": "1.8.12", + "version": "1.8.13", "description": "Report pull request impact on something", "license": "MIT", "repository": { @@ -26,7 +26,7 @@ "/src/" ], "dependencies": { - "@jsenv/filesystem": "4.11.0", + "@jsenv/filesystem": "4.12.0", "@jsenv/humanize": "1.2.8" } } diff --git a/packages/independent/workflow/github-release-package/package.json b/packages/independent/workflow/github-release-package/package.json index dc44160dbe..2751dec969 100644 --- a/packages/independent/workflow/github-release-package/package.json +++ b/packages/independent/workflow/github-release-package/package.json @@ -1,6 +1,6 @@ { "name": "@jsenv/github-release-package", - "version": "1.6.12", + "version": "1.6.13", "description": "Create github release when package version changes.", "license": "MIT", "repository": { @@ -25,8 +25,8 @@ "/src/" ], "dependencies": { - "@jsenv/filesystem": "4.11.0", + "@jsenv/filesystem": "4.12.0", "@jsenv/humanize": "1.2.8", - "@jsenv/github-pull-request-impact": "1.8.12" + "@jsenv/github-pull-request-impact": "1.8.13" } } diff --git a/packages/independent/workflow/lighthouse-impact/package.json b/packages/independent/workflow/lighthouse-impact/package.json index 23f22c4e0c..0a3dff1cf4 100644 --- a/packages/independent/workflow/lighthouse-impact/package.json +++ b/packages/independent/workflow/lighthouse-impact/package.json @@ -1,6 +1,6 @@ { "name": "@jsenv/lighthouse-impact", - "version": "4.2.13", + "version": "4.2.14", "description": "Package description", "license": "MIT", "repository": { @@ -31,8 +31,8 @@ "dependencies": { "@jsenv/abort": "4.3.0", "@jsenv/dynamic-import-worker": "1.2.1", - "@jsenv/filesystem": "4.11.0", - "@jsenv/github-pull-request-impact": "1.8.12", + "@jsenv/filesystem": "4.12.0", + "@jsenv/github-pull-request-impact": "1.8.13", "@jsenv/humanize": "1.2.8", "lighthouse": "12.2.2" } diff --git a/packages/independent/workflow/monorepo/package.json b/packages/independent/workflow/monorepo/package.json index 995a16ef7f..914ad32911 100644 --- a/packages/independent/workflow/monorepo/package.json +++ b/packages/independent/workflow/monorepo/package.json @@ -1,6 +1,6 @@ { "name": "@jsenv/monorepo", - "version": "0.2.3", + "version": "0.2.4", "description": "Helpers to manage packages in a monorepo", "license": "MIT", "repository": { @@ -27,8 +27,8 @@ ], "dependencies": { "@jsenv/urls": "2.5.4", - "@jsenv/filesystem": "4.11.0", - "@jsenv/package-publish": "1.11.12", + "@jsenv/filesystem": "4.12.0", + "@jsenv/package-publish": "1.11.13", "@jsenv/humanize": "1.2.8", "semver": "7.6.3" } diff --git a/packages/independent/workflow/package-publish/package.json b/packages/independent/workflow/package-publish/package.json index cc6b6e258a..f165cb8a51 100644 --- a/packages/independent/workflow/package-publish/package.json +++ b/packages/independent/workflow/package-publish/package.json @@ -1,6 +1,6 @@ { "name": "@jsenv/package-publish", - "version": "1.11.12", + "version": "1.11.13", "description": "Publish package to one or many registry.", "license": "MIT", "repository": { @@ -26,7 +26,7 @@ "/src/" ], "dependencies": { - "@jsenv/filesystem": "4.11.0", + "@jsenv/filesystem": "4.12.0", "@jsenv/humanize": "1.2.8", "semver": "7.6.3" } diff --git a/packages/independent/workflow/performance-impact/package.json b/packages/independent/workflow/performance-impact/package.json index 7d5f532c5e..0cbe9be033 100644 --- a/packages/independent/workflow/performance-impact/package.json +++ b/packages/independent/workflow/performance-impact/package.json @@ -1,6 +1,6 @@ { "name": "@jsenv/performance-impact", - "version": "4.4.12", + "version": "4.4.13", "description": "Report pull request impacts on performance metrics", "license": "MIT", "repository": { @@ -30,8 +30,8 @@ }, "dependencies": { "@jsenv/dynamic-import-worker": "1.2.1", - "@jsenv/filesystem": "4.11.0", - "@jsenv/github-pull-request-impact": "1.8.12", + "@jsenv/filesystem": "4.12.0", + "@jsenv/github-pull-request-impact": "1.8.13", "@jsenv/humanize": "1.2.8" } } diff --git a/packages/related/cli/package.json b/packages/related/cli/package.json index 6ce6950a8b..269b192989 100644 --- a/packages/related/cli/package.json +++ b/packages/related/cli/package.json @@ -1,6 +1,6 @@ { "name": "@jsenv/cli", - "version": "0.2.26", + "version": "0.2.27", "description": "Command Line Interface for jsenv", "license": "MIT", "repository": { diff --git a/packages/related/cli/template-node-package/package.json b/packages/related/cli/template-node-package/package.json index d445e01139..c17e12ea79 100644 --- a/packages/related/cli/template-node-package/package.json +++ b/packages/related/cli/template-node-package/package.json @@ -14,7 +14,7 @@ "@jsenv/assert": "4.4.2", "@jsenv/core": "39.8.0", "@jsenv/eslint-config-relax": "1.3.6", - "@jsenv/test": "3.5.31", + "@jsenv/test": "3.5.32", "eslint": "9.16.0", "prettier": "3.4.2" } diff --git a/packages/related/cli/template-web-components/package.json b/packages/related/cli/template-web-components/package.json index f0691bf1ca..da18b08a7b 100644 --- a/packages/related/cli/template-web-components/package.json +++ b/packages/related/cli/template-web-components/package.json @@ -22,7 +22,7 @@ "@jsenv/plugin-bundling": "2.7.20", "@jsenv/plugin-minification": "1.5.12", "@jsenv/eslint-config-relax": "1.3.6", - "@jsenv/test": "3.5.31", + "@jsenv/test": "3.5.32", "eslint": "9.16.0", "open": "10.1.0", "@playwright/browser-chromium": "1.49.1", diff --git a/packages/related/cli/template-web-preact/package.json b/packages/related/cli/template-web-preact/package.json index 2c61b6807b..6be86bb563 100644 --- a/packages/related/cli/template-web-preact/package.json +++ b/packages/related/cli/template-web-preact/package.json @@ -26,7 +26,7 @@ "@jsenv/plugin-bundling": "2.7.20", "@jsenv/plugin-minification": "1.5.12", "@jsenv/eslint-config-relax": "1.3.6", - "@jsenv/test": "3.5.31", + "@jsenv/test": "3.5.32", "eslint": "9.16.0", "open": "10.1.0", "@playwright/browser-chromium": "1.49.1", diff --git a/packages/related/cli/template-web-react/package.json b/packages/related/cli/template-web-react/package.json index eb5ed2b493..e8234b4f6f 100644 --- a/packages/related/cli/template-web-react/package.json +++ b/packages/related/cli/template-web-react/package.json @@ -23,11 +23,11 @@ "@babel/plugin-transform-react-jsx": "7.25.9", "@jsenv/assert": "4.4.2", "@jsenv/core": "39.8.0", - "@jsenv/plugin-react": "1.5.51", + "@jsenv/plugin-react": "1.5.52", "@jsenv/plugin-bundling": "2.7.20", "@jsenv/plugin-minification": "1.5.12", "@jsenv/eslint-config-relax": "1.3.6", - "@jsenv/test": "3.5.31", + "@jsenv/test": "3.5.32", "eslint": "9.16.0", "open": "10.1.0", "@playwright/browser-chromium": "1.49.1", diff --git a/packages/related/cli/template-web/package.json b/packages/related/cli/template-web/package.json index 663b5db86a..e67d2616a2 100644 --- a/packages/related/cli/template-web/package.json +++ b/packages/related/cli/template-web/package.json @@ -20,7 +20,7 @@ "@jsenv/eslint-config-relax": "1.3.6", "@jsenv/plugin-bundling": "2.7.20", "@jsenv/plugin-minification": "1.5.12", - "@jsenv/test": "3.5.31", + "@jsenv/test": "3.5.32", "eslint": "9.16.0", "open": "10.1.0", "@playwright/browser-chromium": "1.49.1", diff --git a/packages/related/plugin-commonjs/package.json b/packages/related/plugin-commonjs/package.json index 540751914d..90bbe63ac4 100644 --- a/packages/related/plugin-commonjs/package.json +++ b/packages/related/plugin-commonjs/package.json @@ -1,6 +1,6 @@ { "name": "@jsenv/plugin-commonjs", - "version": "2.9.4", + "version": "2.9.5", "license": "MIT", "repository": { "type": "git", @@ -21,7 +21,7 @@ "/src/" ], "dependencies": { - "@jsenv/filesystem": "4.11.0", + "@jsenv/filesystem": "4.12.0", "@jsenv/humanize": "1.2.8", "@jsenv/url-meta": "8.5.2", "@jsenv/urls": "2.5.4", diff --git a/packages/related/plugin-explorer/package.json b/packages/related/plugin-explorer/package.json index fefe0db6b5..6ef5571f60 100644 --- a/packages/related/plugin-explorer/package.json +++ b/packages/related/plugin-explorer/package.json @@ -1,6 +1,6 @@ { "name": "@jsenv/plugin-explorer", - "version": "1.0.53", + "version": "1.0.54", "license": "MIT", "repository": { "type": "git", @@ -26,7 +26,7 @@ "/src/" ], "dependencies": { - "@jsenv/filesystem": "4.11.0" + "@jsenv/filesystem": "4.12.0" }, "scripts": { "build": "node ./scripts/build.mjs", diff --git a/packages/related/plugin-react/package.json b/packages/related/plugin-react/package.json index 7dcf0f9b69..02bab81a7b 100644 --- a/packages/related/plugin-react/package.json +++ b/packages/related/plugin-react/package.json @@ -1,6 +1,6 @@ { "name": "@jsenv/plugin-react", - "version": "1.5.51", + "version": "1.5.52", "license": "MIT", "repository": { "type": "git", @@ -24,7 +24,7 @@ "@babel/plugin-transform-react-jsx": "7.25.9", "@babel/plugin-transform-react-jsx-development": "7.25.9", "@jsenv/ast": "6.4.1", - "@jsenv/plugin-commonjs": "2.9.4", + "@jsenv/plugin-commonjs": "2.9.5", "@jsenv/sourcemap": "1.2.28", "@jsenv/url-meta": "8.5.2", "react-refresh": "0.16.0" diff --git a/packages/related/test/dist/jsenv_test.js b/packages/related/test/dist/jsenv_test.js index 6e8054602b..b5f1ea8a26 100644 --- a/packages/related/test/dist/jsenv_test.js +++ b/packages/related/test/dist/jsenv_test.js @@ -4,7 +4,7 @@ import tty from "node:tty"; import stringWidth from "string-width"; import { pathToFileURL, fileURLToPath } from "node:url"; import { URL_META, filterV8Coverage } from "./js/v8_coverage.js"; -import { readdir, chmod, stat, lstat, chmodSync, statSync, lstatSync, promises, readFile as readFile$1, readFileSync, writeFileSync as writeFileSync$1, mkdirSync, unlink, openSync, closeSync, rmdir, unlinkSync, readdirSync, rmdirSync, existsSync } from "node:fs"; +import { readdir, chmod, stat, lstat, chmodSync, statSync, lstatSync, promises, readFile as readFile$1, unlinkSync, openSync, closeSync, readdirSync, rmdirSync, mkdirSync, readFileSync, writeFileSync as writeFileSync$1, unlink, rmdir, existsSync } from "node:fs"; import { dirname } from "node:path"; import crypto from "node:crypto"; import { readGitHubWorkflowEnv, startGithubCheckRun } from "@jsenv/github-check-run"; @@ -2120,6 +2120,42 @@ const extractDriveLetter = (resource) => { return null; }; +const getParentDirectoryUrl = (url) => { + if (url.startsWith("file://")) { + // With node.js new URL('../', 'file:///C:/').href + // returns "file:///C:/" instead of "file:///" + const resource = url.slice("file://".length); + const slashLastIndex = resource.lastIndexOf("/"); + if (slashLastIndex === -1) { + return url; + } + const lastCharIndex = resource.length - 1; + if (slashLastIndex === lastCharIndex) { + const slashBeforeLastIndex = resource.lastIndexOf( + "/", + slashLastIndex - 1, + ); + if (slashBeforeLastIndex === -1) { + return url; + } + return `file://${resource.slice(0, slashBeforeLastIndex + 1)}`; + } + return `file://${resource.slice(0, slashLastIndex + 1)}`; + } + return new URL(url.endsWith("/") ? "../" : "./", url).href; +}; + +const findAncestorDirectoryUrl = (url, callback) => { + url = String(url); + while (url !== "file:///") { + if (callback(url)) { + return url; + } + url = getParentDirectoryUrl(url); + } + return null; +}; + const readDirectory = async (url, { emfileMaxWait = 1000 } = {}) => { const directoryUrl = assertAndNormalizeDirectoryUrl(url); const directoryUrlObject = new URL(directoryUrl); @@ -2542,7 +2578,284 @@ const readFile = async (value, { as = "buffer" } = {}) => { ); }; -const writeFileSync = (destination, content = "") => { +const removeEntrySync = ( + source, + { + allowUseless = false, + recursive = false, + maxRetries = 3, + retryDelay = 100, + onlyContent = false, + } = {}, +) => { + const sourceUrl = assertAndNormalizeFileUrl(source); + const sourceStats = readEntryStatSync(sourceUrl, { + nullIfNotFound: true, + followLink: false, + }); + if (!sourceStats) { + if (allowUseless) { + return; + } + throw new Error(`nothing to remove at ${urlToFileSystemPath(sourceUrl)}`); + } + + // https://nodejs.org/dist/latest-v13.x/docs/api/fs.html#fs_class_fs_stats + // FIFO and socket are ignored, not sure what they are exactly and what to do with them + // other libraries ignore them, let's do the same. + if ( + sourceStats.isFile() || + sourceStats.isSymbolicLink() || + sourceStats.isCharacterDevice() || + sourceStats.isBlockDevice() + ) { + removeNonDirectory$1( + sourceUrl.endsWith("/") ? sourceUrl.slice(0, -1) : sourceUrl); + } else if (sourceStats.isDirectory()) { + const directoryUrl = ensurePathnameTrailingSlash(sourceUrl); + removeDirectorySync$1(directoryUrl, { + recursive, + maxRetries, + retryDelay, + onlyContent, + }); + } +}; + +const removeNonDirectory$1 = (sourceUrl) => { + const sourcePath = urlToFileSystemPath(sourceUrl); + const attempt = () => { + unlinkSyncNaive(sourcePath); + }; + attempt(); +}; + +const unlinkSyncNaive = (sourcePath, { handleTemporaryError = null } = {}) => { + try { + unlinkSync(sourcePath); + } catch (error) { + if (error.code === "ENOENT") { + return; + } + if ( + handleTemporaryError && + (error.code === "EBUSY" || + error.code === "EMFILE" || + error.code === "ENFILE" || + error.code === "ENOENT") + ) { + handleTemporaryError(error); + return; + } + throw error; + } +}; + +const removeDirectorySync$1 = ( + rootDirectoryUrl, + { maxRetries, retryDelay, recursive, onlyContent }, +) => { + const visit = (sourceUrl) => { + const sourceStats = readEntryStatSync(sourceUrl, { + nullIfNotFound: true, + followLink: false, + }); + + // file/directory not found + if (sourceStats === null) { + return; + } + + if ( + sourceStats.isFile() || + sourceStats.isCharacterDevice() || + sourceStats.isBlockDevice() + ) { + visitFile(sourceUrl); + } else if (sourceStats.isSymbolicLink()) { + visitSymbolicLink(sourceUrl); + } else if (sourceStats.isDirectory()) { + visitDirectory(`${sourceUrl}/`); + } + }; + + const visitDirectory = (directoryUrl) => { + const directoryPath = urlToFileSystemPath(directoryUrl); + const optionsFromRecursive = recursive + ? { + handleNotEmptyError: () => { + removeDirectoryContent(directoryUrl); + visitDirectory(directoryUrl); + }, + } + : {}; + removeDirectorySyncNaive(directoryPath, { + ...optionsFromRecursive, + // Workaround for https://github.com/joyent/node/issues/4337 + ...(process.platform === "win32" + ? { + handlePermissionError: (error) => { + console.error( + `trying to fix windows EPERM after readir on ${directoryPath}`, + ); + + let openOrCloseError; + try { + const fd = openSync(directoryPath); + closeSync(fd); + } catch (e) { + openOrCloseError = e; + } + + if (openOrCloseError) { + if (openOrCloseError.code === "ENOENT") { + return; + } + console.error( + `error while trying to fix windows EPERM after readir on ${directoryPath}: ${openOrCloseError.stack}`, + ); + throw error; + } + removeDirectorySyncNaive(directoryPath, { + ...optionsFromRecursive, + }); + }, + } + : {}), + }); + }; + + const removeDirectoryContent = (directoryUrl) => { + const entryNames = readdirSync(new URL(directoryUrl)); + for (const entryName of entryNames) { + const url = resolveUrl(entryName, directoryUrl); + visit(url); + } + }; + + const visitFile = (fileUrl) => { + removeNonDirectory$1(fileUrl); + }; + + const visitSymbolicLink = (symbolicLinkUrl) => { + removeNonDirectory$1(symbolicLinkUrl); + }; + + if (onlyContent) { + removeDirectoryContent(rootDirectoryUrl); + } else { + visitDirectory(rootDirectoryUrl); + } +}; + +const removeDirectorySyncNaive = ( + directoryPath, + { handleNotEmptyError = null, handlePermissionError = null } = {}, +) => { + try { + rmdirSync(directoryPath); + } catch (error) { + if (handlePermissionError && error.code === "EPERM") { + handlePermissionError(error); + return; + } + if (error.code === "ENOENT") { + return; + } + if ( + handleNotEmptyError && + // linux os + (error.code === "ENOTEMPTY" || + // SunOS + error.code === "EEXIST") + ) { + handleNotEmptyError(error); + return; + } + throw error; + } +}; + +const removeDirectorySync = (url, options = {}) => { + return removeEntrySync(url, { + ...options, + recursive: true, + }); +}; + +const writeDirectorySync = ( + destination, + { recursive = true, allowUseless = false, force } = {}, +) => { + const destinationUrl = assertAndNormalizeDirectoryUrl(destination); + const destinationPath = urlToFileSystemPath(destinationUrl); + + let destinationStats; + try { + destinationStats = readEntryStatSync(destinationUrl, { + nullIfNotFound: true, + followLink: false, + }); + } catch (e) { + if (e.code === "ENOTDIR") { + let previousNonDirUrl = destinationUrl; + // we must try all parent directories as long as it fails with ENOTDIR + findAncestorDirectoryUrl(destinationUrl, (ancestorUrl) => { + try { + statSync(new URL(ancestorUrl)); + return true; + } catch (e) { + if (e.code === "ENOTDIR") { + previousNonDirUrl = ancestorUrl; + return false; + } + throw e; + } + }); + if (force) { + unlinkSync( + new URL( + previousNonDirUrl + // remove trailing slash + .slice(0, -1), + ), + ); + } else { + throw new Error( + `cannot write directory at ${destinationPath} because there is a file at ${urlToFileSystemPath( + previousNonDirUrl, + )}`, + ); + } + } else { + throw e; + } + } + + if (destinationStats) { + if (destinationStats.isDirectory()) { + if (allowUseless) { + return; + } + throw new Error(`directory already exists at ${destinationPath}`); + } + const destinationType = statsToType(destinationStats); + throw new Error( + `cannot write directory at ${destinationPath} because there is a ${destinationType}`, + ); + } + + try { + mkdirSync(destinationPath, { recursive }); + } catch (error) { + if (allowUseless && error.code === "EEXIST") { + return; + } + throw error; + } +}; + +const writeFileSync = (destination, content = "", { force } = {}) => { const destinationUrl = assertAndNormalizeFileUrl(destination); const destinationUrlObject = new URL(destinationUrl); if (content && content instanceof URL) { @@ -2551,8 +2864,18 @@ const writeFileSync = (destination, content = "") => { try { writeFileSync$1(destinationUrlObject, content); } catch (error) { - if (error.code === "ENOENT") { - mkdirSync(new URL("./", destinationUrlObject), { + if (error.code === "EISDIR") { + // happens when directory existed but got deleted and now it's a file + if (force) { + removeDirectorySync(destinationUrlObject); + writeFileSync$1(destinationUrlObject, content); + } else { + throw error; + } + } + if (error.code === "ENOENT" || error.code === "ENOTDIR") { + writeDirectorySync(new URL("./", destinationUrlObject), { + force, recursive: true, }); writeFileSync$1(destinationUrlObject, content); @@ -2600,7 +2923,7 @@ const removeEntry = async ( sourceStats.isCharacterDevice() || sourceStats.isBlockDevice() ) { - await removeNonDirectory$1( + await removeNonDirectory( sourceUrl.endsWith("/") ? sourceUrl.slice(0, -1) : sourceUrl, { maxRetries, @@ -2621,7 +2944,7 @@ const removeEntry = async ( } }; -const removeNonDirectory$1 = (sourceUrl, { maxRetries, retryDelay }) => { +const removeNonDirectory = (sourceUrl, { maxRetries, retryDelay }) => { const sourcePath = urlToFileSystemPath(sourceUrl); let retryCount = 0; @@ -2760,11 +3083,11 @@ const removeDirectory = async ( }; const visitFile = async (fileUrl) => { - await removeNonDirectory$1(fileUrl, { maxRetries, retryDelay }); + await removeNonDirectory(fileUrl, { maxRetries, retryDelay }); }; const visitSymbolicLink = async (symbolicLinkUrl) => { - await removeNonDirectory$1(symbolicLinkUrl, { maxRetries, retryDelay }); + await removeNonDirectory(symbolicLinkUrl, { maxRetries, retryDelay }); }; try { @@ -2809,240 +3132,6 @@ const removeDirectoryNaive = ( process.platform === "win32"; -const writeDirectorySync = ( - destination, - { recursive = true, allowUseless = false } = {}, -) => { - const destinationUrl = assertAndNormalizeDirectoryUrl(destination); - const destinationPath = urlToFileSystemPath(destinationUrl); - - const destinationStats = readEntryStatSync(destinationUrl, { - nullIfNotFound: true, - followLink: false, - }); - - if (destinationStats) { - if (destinationStats.isDirectory()) { - if (allowUseless) { - return; - } - throw new Error(`directory already exists at ${destinationPath}`); - } - - const destinationType = statsToType(destinationStats); - throw new Error( - `cannot write directory at ${destinationPath} because there is a ${destinationType}`, - ); - } - - try { - mkdirSync(destinationPath, { recursive }); - } catch (error) { - if (allowUseless && error.code === "EEXIST") { - return; - } - throw error; - } -}; - -const removeEntrySync = ( - source, - { - allowUseless = false, - recursive = false, - maxRetries = 3, - retryDelay = 100, - onlyContent = false, - } = {}, -) => { - const sourceUrl = assertAndNormalizeFileUrl(source); - const sourceStats = readEntryStatSync(sourceUrl, { - nullIfNotFound: true, - followLink: false, - }); - if (!sourceStats) { - if (allowUseless) { - return; - } - throw new Error(`nothing to remove at ${urlToFileSystemPath(sourceUrl)}`); - } - - // https://nodejs.org/dist/latest-v13.x/docs/api/fs.html#fs_class_fs_stats - // FIFO and socket are ignored, not sure what they are exactly and what to do with them - // other libraries ignore them, let's do the same. - if ( - sourceStats.isFile() || - sourceStats.isSymbolicLink() || - sourceStats.isCharacterDevice() || - sourceStats.isBlockDevice() - ) { - removeNonDirectory( - sourceUrl.endsWith("/") ? sourceUrl.slice(0, -1) : sourceUrl); - } else if (sourceStats.isDirectory()) { - const directoryUrl = ensurePathnameTrailingSlash(sourceUrl); - removeDirectorySync(directoryUrl, { - recursive, - maxRetries, - retryDelay, - onlyContent, - }); - } -}; - -const removeNonDirectory = (sourceUrl) => { - const sourcePath = urlToFileSystemPath(sourceUrl); - const attempt = () => { - unlinkSyncNaive(sourcePath); - }; - attempt(); -}; - -const unlinkSyncNaive = (sourcePath, { handleTemporaryError = null } = {}) => { - try { - unlinkSync(sourcePath); - } catch (error) { - if (error.code === "ENOENT") { - return; - } - if ( - handleTemporaryError && - (error.code === "EBUSY" || - error.code === "EMFILE" || - error.code === "ENFILE" || - error.code === "ENOENT") - ) { - handleTemporaryError(error); - return; - } - throw error; - } -}; - -const removeDirectorySync = ( - rootDirectoryUrl, - { maxRetries, retryDelay, recursive, onlyContent }, -) => { - const visit = (sourceUrl) => { - const sourceStats = readEntryStatSync(sourceUrl, { - nullIfNotFound: true, - followLink: false, - }); - - // file/directory not found - if (sourceStats === null) { - return; - } - - if ( - sourceStats.isFile() || - sourceStats.isCharacterDevice() || - sourceStats.isBlockDevice() - ) { - visitFile(sourceUrl); - } else if (sourceStats.isSymbolicLink()) { - visitSymbolicLink(sourceUrl); - } else if (sourceStats.isDirectory()) { - visitDirectory(`${sourceUrl}/`); - } - }; - - const visitDirectory = (directoryUrl) => { - const directoryPath = urlToFileSystemPath(directoryUrl); - const optionsFromRecursive = recursive - ? { - handleNotEmptyError: () => { - removeDirectoryContent(directoryUrl); - visitDirectory(directoryUrl); - }, - } - : {}; - removeDirectorySyncNaive(directoryPath, { - ...optionsFromRecursive, - // Workaround for https://github.com/joyent/node/issues/4337 - ...(process.platform === "win32" - ? { - handlePermissionError: (error) => { - console.error( - `trying to fix windows EPERM after readir on ${directoryPath}`, - ); - - let openOrCloseError; - try { - const fd = openSync(directoryPath); - closeSync(fd); - } catch (e) { - openOrCloseError = e; - } - - if (openOrCloseError) { - if (openOrCloseError.code === "ENOENT") { - return; - } - console.error( - `error while trying to fix windows EPERM after readir on ${directoryPath}: ${openOrCloseError.stack}`, - ); - throw error; - } - removeDirectorySyncNaive(directoryPath, { - ...optionsFromRecursive, - }); - }, - } - : {}), - }); - }; - - const removeDirectoryContent = (directoryUrl) => { - const entryNames = readdirSync(new URL(directoryUrl)); - for (const entryName of entryNames) { - const url = resolveUrl(entryName, directoryUrl); - visit(url); - } - }; - - const visitFile = (fileUrl) => { - removeNonDirectory(fileUrl); - }; - - const visitSymbolicLink = (symbolicLinkUrl) => { - removeNonDirectory(symbolicLinkUrl); - }; - - if (onlyContent) { - removeDirectoryContent(rootDirectoryUrl); - } else { - visitDirectory(rootDirectoryUrl); - } -}; - -const removeDirectorySyncNaive = ( - directoryPath, - { handleNotEmptyError = null, handlePermissionError = null } = {}, -) => { - try { - rmdirSync(directoryPath); - } catch (error) { - if (handlePermissionError && error.code === "EPERM") { - handlePermissionError(error); - return; - } - if (error.code === "ENOENT") { - return; - } - if ( - handleNotEmptyError && - // linux os - (error.code === "ENOTEMPTY" || - // SunOS - error.code === "EEXIST") - ) { - handleNotEmptyError(error); - return; - } - throw error; - } -}; - process.platform === "win32"; const ensureEmptyDirectorySync = (source) => { diff --git a/packages/related/test/package.json b/packages/related/test/package.json index 4151410d03..e17d05c5be 100644 --- a/packages/related/test/package.json +++ b/packages/related/test/package.json @@ -1,6 +1,6 @@ { "name": "@jsenv/test", - "version": "3.5.31", + "version": "3.5.32", "license": "MIT", "repository": { "type": "git", @@ -39,7 +39,7 @@ "@jsenv/abort": "4.3.0", "@jsenv/ast": "6.4.1", "@jsenv/exception": "1.1.3", - "@jsenv/filesystem": "4.11.0", + "@jsenv/filesystem": "4.12.0", "@jsenv/github-check-run": "0.2.5", "@jsenv/node-esm-resolution": "1.0.6", "@jsenv/humanize": "1.2.8", diff --git a/src/helpers/lookup_package_directory.js b/src/helpers/lookup_package_directory.js index fb748bba74..e5668e6910 100644 --- a/src/helpers/lookup_package_directory.js +++ b/src/helpers/lookup_package_directory.js @@ -1,37 +1,9 @@ +import { findAncestorDirectoryUrl } from "@jsenv/filesystem"; import { existsSync } from "node:fs"; export const lookupPackageDirectory = (currentUrl) => { - if (currentUrl === "file:///") { - return null; - } - const packageJsonFileUrl = `${currentUrl}package.json`; - if (existsSync(new URL(packageJsonFileUrl))) { - return currentUrl; - } - return lookupPackageDirectory(getParentUrl(currentUrl)); -}; - -const getParentUrl = (url) => { - if (url.startsWith("file://")) { - // With node.js new URL('../', 'file:///C:/').href - // returns "file:///C:/" instead of "file:///" - const resource = url.slice("file://".length); - const slashLastIndex = resource.lastIndexOf("/"); - if (slashLastIndex === -1) { - return url; - } - const lastCharIndex = resource.length - 1; - if (slashLastIndex === lastCharIndex) { - const slashBeforeLastIndex = resource.lastIndexOf( - "/", - slashLastIndex - 1, - ); - if (slashBeforeLastIndex === -1) { - return url; - } - return `file://${resource.slice(0, slashBeforeLastIndex + 1)}`; - } - return `file://${resource.slice(0, slashLastIndex + 1)}`; - } - return new URL(url.endsWith("/") ? "../" : "./", url).href; + return findAncestorDirectoryUrl(currentUrl, (ancestorDirectoryUrl) => { + const potentialPackageJsonFileUrl = `${ancestorDirectoryUrl}package.json`; + return existsSync(new URL(potentialPackageJsonFileUrl)); + }); }; diff --git a/tests/dev_server/autoreload_html_enoent/0_at_start/package.json b/tests/dev_server/autoreload_html_enoent/0_at_start/package.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/tests/dev_server/autoreload_html_enoent/0_at_start/package.json @@ -0,0 +1 @@ +{} diff --git a/tests/dev_server/autoreload_html_enoent/1_fix_404/package.json b/tests/dev_server/autoreload_html_enoent/1_fix_404/package.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/tests/dev_server/autoreload_html_enoent/1_fix_404/package.json @@ -0,0 +1 @@ +{} diff --git a/tests/dev_server/autoreload_html_enoent/2_update/package.json b/tests/dev_server/autoreload_html_enoent/2_update/package.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/tests/dev_server/autoreload_html_enoent/2_update/package.json @@ -0,0 +1 @@ +{} diff --git a/tests/dev_server/autoreload_html_enoent/3_back_to_404/package.json b/tests/dev_server/autoreload_html_enoent/3_back_to_404/package.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/tests/dev_server/autoreload_html_enoent/3_back_to_404/package.json @@ -0,0 +1 @@ +{} diff --git a/tests/dev_server/autoreload_html_enoent/snapshots/0_at_start.png b/tests/dev_server/autoreload_html_enoent/snapshots/0_at_start.png index 99af90e3a31e34a973544e029f6e8f005e90d8b5..eeb63ca03d8f5dd5f4c0ea118112debaa90173ff 100644 GIT binary patch delta 12372 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 P;3X%eBv~$Q{PuqUKEM4_ delta 10100 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 diff --git a/tests/dev_server/autoreload_html_enoent/snapshots/3_back_to_404.png b/tests/dev_server/autoreload_html_enoent/snapshots/3_back_to_404.png index f7e0537c16d4eab13144c1232bec855076cd9217..87cc1a4a6c1565745e1d6544f70ab5225af87809 100644 GIT binary patch literal 31300 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

?xYd5DYWN;Ck39e+j` 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 literal 29088 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