From dc44f5475cc80cdb843509f42e46ebb64fda917f Mon Sep 17 00:00:00 2001 From: Ivan Tanev Date: Thu, 10 Oct 2024 14:53:07 +0300 Subject: [PATCH] Replace fs-extra with node:fs/promises --- .changeset/lucky-nails-notice.md | 5 +++ build/yarn.lock | 2 +- package.json | 3 +- packages/cli/package.json | 2 +- packages/cli/src/__tests__/dev.ts | 8 ++--- packages/cli/src/__tests__/fix.ts | 2 +- packages/cli/src/build/__tests__/build.ts | 32 +++++++++---------- packages/cli/src/build/index.ts | 6 ++-- packages/cli/src/build/utils.ts | 14 +++++--- packages/cli/src/dev.ts | 17 +++++----- packages/cli/src/glob-thing.ts | 2 +- packages/cli/src/item.ts | 2 +- packages/cli/src/package.ts | 11 ++++--- packages/cli/src/project.ts | 4 +-- packages/cli/src/rollup-plugins/flow.ts | 2 +- .../typescript-declarations/common.ts | 2 +- .../typescript-declarations/index.ts | 2 +- packages/cli/src/utils.ts | 13 ++++++++ packages/cli/src/validate-included-files.ts | 12 ++++--- packages/cli/test-utils/index.ts | 31 ++++++++++++++---- yarn.lock | 24 +++++++------- 21 files changed, 121 insertions(+), 75 deletions(-) create mode 100644 .changeset/lucky-nails-notice.md diff --git a/.changeset/lucky-nails-notice.md b/.changeset/lucky-nails-notice.md new file mode 100644 index 00000000..e666bd9f --- /dev/null +++ b/.changeset/lucky-nails-notice.md @@ -0,0 +1,5 @@ +--- +"@preconstruct/cli": minor +--- + +Replace fs-extra with native node:fs/promises diff --git a/build/yarn.lock b/build/yarn.lock index 4d7ff4f0..5f0cde36 100644 --- a/build/yarn.lock +++ b/build/yarn.lock @@ -159,7 +159,7 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.21.2", "@babel/parser@^7.24.7": +"@babel/parser@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85" integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== diff --git a/package.json b/package.json index 74d73b9f..efc31e62 100644 --- a/package.json +++ b/package.json @@ -32,10 +32,9 @@ "@changesets/cli": "^2.27.1", "@manypkg/cli": "^0.17.0", "@types/babel__code-frame": "^7.0.1", - "@types/fs-extra": "^9.0.6", "@types/jest": "^29.2.2", "@types/ms": "^0.7.31", - "@types/node": "^18.11.9", + "@types/node": "^18.19.55", "@types/normalize-path": "^3.0.0", "@types/npm-packlist": "^1.1.1", "@types/parse-glob": "^3.0.29", diff --git a/packages/cli/package.json b/packages/cli/package.json index 395b2ca6..19badeca 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -55,7 +55,6 @@ "estree-walker": "^2.0.1", "fast-deep-equal": "^2.0.1", "fast-glob": "^3.2.4", - "fs-extra": "^9.0.1", "is-reference": "^1.2.1", "jest-worker": "^26.3.0", "magic-string": "^0.30.0", @@ -81,6 +80,7 @@ }, "devDependencies": { "@types/estree": "*", + "@types/node": "^18.19.55", "escape-string-regexp": "^4.0.0", "spawndamnit": "^2.0.0", "strip-ansi": "^6.0.0" diff --git a/packages/cli/src/__tests__/dev.ts b/packages/cli/src/__tests__/dev.ts index a97684e9..81097805 100644 --- a/packages/cli/src/__tests__/dev.ts +++ b/packages/cli/src/__tests__/dev.ts @@ -1,7 +1,6 @@ import spawn from "spawndamnit"; import path from "path"; -import * as fs from "fs-extra"; -import * as realFs from "fs"; +import fs from "node:fs/promises"; import { getFiles, js, @@ -10,6 +9,7 @@ import { testdir, ts, typescriptFixture, + fsEnsureSymlink, } from "../../test-utils"; import dev from "../dev"; import normalizePath from "normalize-path"; @@ -292,7 +292,7 @@ test("typescript", async () => { }); test("exports field with worker condition", async () => { - let tmpPath = realFs.realpathSync.native( + let tmpPath = await fs.realpath( await testdir({ "package.json": JSON.stringify({ name: "@something/blah", @@ -471,7 +471,7 @@ test("with default", async () => { }, }), }); - await fs.ensureSymlink( + await fsEnsureSymlink( path.join(dir, "packages/pkg-a"), path.join(dir, "node_modules/pkg-a") ); diff --git a/packages/cli/src/__tests__/fix.ts b/packages/cli/src/__tests__/fix.ts index ce8d4a3e..8336cf87 100644 --- a/packages/cli/src/__tests__/fix.ts +++ b/packages/cli/src/__tests__/fix.ts @@ -13,7 +13,7 @@ import { ts, } from "../../test-utils"; import { promptInput as _promptInput } from "../prompt"; -import fs from "fs-extra"; +import fs from "node:fs/promises"; const f = fixturez(__dirname); diff --git a/packages/cli/src/build/__tests__/build.ts b/packages/cli/src/build/__tests__/build.ts index e19473ef..bd3ba7e7 100644 --- a/packages/cli/src/build/__tests__/build.ts +++ b/packages/cli/src/build/__tests__/build.ts @@ -1,7 +1,6 @@ import build from "../"; import fixturez from "fixturez"; import path from "path"; -import fs from "fs-extra"; import { initBasic, getPkg, @@ -15,6 +14,7 @@ import { getFiles, ts, stripHashes, + fsEnsureSymlink, } from "../../../test-utils"; import { doPromptInput as _doPromptInput } from "../../prompt"; import { confirms as _confirms } from "../../messages"; @@ -820,7 +820,7 @@ test("typescript with nodenext module resolution", async () => { `, ...tsSetupFiles, }); - await fs.ensureSymlink( + await fsEnsureSymlink( path.join(dir, "packages/pkg-a"), path.join(dir, "node_modules/pkg-a") ); @@ -1028,7 +1028,7 @@ test("correct default export using mjs and dmts proxies", async () => { `, ...tsSetupFiles, }); - await fs.ensureSymlink( + await fsEnsureSymlink( path.join(dir, "packages/pkg-a"), path.join(dir, "node_modules/pkg-a") ); @@ -1195,11 +1195,11 @@ test("importing a package via dynamic import from another package provides the r `, ...tsSetupFiles, }); - await fs.ensureSymlink( + await fsEnsureSymlink( path.join(dir, "packages/pkg-a"), path.join(dir, "node_modules/pkg-a") ); - await fs.ensureSymlink( + await fsEnsureSymlink( path.join(dir, "packages/pkg-b"), path.join(dir, "node_modules/pkg-b") ); @@ -1325,11 +1325,11 @@ test("importing another package via dynamic import and exporting the namespace p `, ...tsSetupFiles, }); - await fs.ensureSymlink( + await fsEnsureSymlink( path.join(dir, "packages/pkg-a"), path.join(dir, "node_modules/pkg-a") ); - await fs.ensureSymlink( + await fsEnsureSymlink( path.join(dir, "packages/pkg-b"), path.join(dir, "node_modules/pkg-b") ); @@ -1408,11 +1408,11 @@ test("importing another package via dynamic import and exporting something that `, ...tsSetupFiles, }); - await fs.ensureSymlink( + await fsEnsureSymlink( path.join(dir, "packages/pkg-a"), path.join(dir, "node_modules/pkg-a") ); - await fs.ensureSymlink( + await fsEnsureSymlink( path.join(dir, "packages/pkg-b"), path.join(dir, "node_modules/pkg-b") ); @@ -1516,7 +1516,7 @@ test("no __esModule when reexporting namespace with mjs proxy", async () => { }, }), }); - await fs.ensureSymlink( + await fsEnsureSymlink( path.join(dir, "packages/pkg-a"), path.join(dir, "node_modules/pkg-a") ); @@ -1652,7 +1652,7 @@ test("export * from external", async () => { `, ...tsSetupFiles, }); - await fs.ensureSymlink( + await fsEnsureSymlink( path.join(dir, "packages/pkg-a"), path.join(dir, "node_modules/pkg-a") ); @@ -1780,7 +1780,7 @@ test("type only export imported in .mts", async () => { `, ...tsSetupFiles, }); - await fs.ensureSymlink( + await fsEnsureSymlink( path.join(dir, "packages/pkg-a"), path.join(dir, "node_modules/pkg-a") ); @@ -2060,7 +2060,7 @@ test("correct default export using mjs and dmts proxies with moduleResolution: b }, }), }); - await fs.ensureSymlink( + await fsEnsureSymlink( path.join(dir, "packages/pkg-a"), path.join(dir, "node_modules/pkg-a") ); @@ -2203,7 +2203,7 @@ test("module with no runtime exports but with init-time side-effects with import require("pkg-a"); `, }); - await fs.ensureSymlink( + await fsEnsureSymlink( path.join(dir, "packages/pkg-a"), path.join(dir, "node_modules/pkg-a") ); @@ -2440,7 +2440,7 @@ test("using type from a package with .d.ts at entrypoint in another package", as `, ...tsSetupFiles, }); - await fs.ensureSymlink( + await fsEnsureSymlink( path.join(dir, "packages/pkg-a"), path.join(dir, "node_modules/pkg-a") ); @@ -2525,7 +2525,7 @@ test("using type from a package with .d.ts at entrypoint in another package with `, ...tsSetupFiles, }); - await fs.ensureSymlink( + await fsEnsureSymlink( path.join(dir, "packages/pkg-a"), path.join(dir, "node_modules/pkg-a") ); diff --git a/packages/cli/src/build/index.ts b/packages/cli/src/build/index.ts index 35b10d2c..18cb02cd 100644 --- a/packages/cli/src/build/index.ts +++ b/packages/cli/src/build/index.ts @@ -3,7 +3,6 @@ import { Project } from "../project"; import path from "path"; import { rollup, OutputAsset, OutputChunk, OutputOptions } from "rollup"; import * as logger from "../logger"; -import * as fs from "fs-extra"; import { FatalError, UnexpectedBuildError, @@ -14,6 +13,7 @@ import { getRollupConfigs } from "./config"; import { createWorker, destroyWorker } from "../worker-client"; import { validateProject } from "../validate"; import { cleanProjectBeforeBuild } from "./utils"; +import { fsOutputFile } from "../utils"; // https://github.com/rollup/rollup/blob/28ffcf4c4a2ab4323091f63944b2a609b7bcd701/src/utils/sourceMappingURL.ts // this looks ridiculous, but it prevents sourcemap tooling from mistaking @@ -42,7 +42,7 @@ function writeOutputFile( url = outputFile.map.toUrl(); } else { url = `${path.basename(outputFile.fileName)}.map`; - writeSourceMapPromise = fs.outputFile( + writeSourceMapPromise = fsOutputFile( `${fileName}.map`, outputFile.map.toString() ); @@ -53,7 +53,7 @@ function writeOutputFile( } } - return Promise.all([fs.outputFile(fileName, source), writeSourceMapPromise]); + return Promise.all([fsOutputFile(fileName, source), writeSourceMapPromise]); } async function buildPackage(pkg: Package) { diff --git a/packages/cli/src/build/utils.ts b/packages/cli/src/build/utils.ts index 6b4e493b..1279b657 100644 --- a/packages/cli/src/build/utils.ts +++ b/packages/cli/src/build/utils.ts @@ -5,7 +5,7 @@ import { hasDtsFile, writeDevTSFiles, } from "../dev"; -import * as fs from "fs-extra"; +import fs from "node:fs/promises"; import path from "path"; export function getDevPath(cjsPath: string) { @@ -20,11 +20,17 @@ export async function cleanProjectBeforeBuild(project: Project) { await Promise.all( project.packages.map(async (pkg) => { await Promise.all([ - fs.remove(path.join(pkg.directory, "dist")), + fs.rm(path.join(pkg.directory, "dist"), { + recursive: true, + force: true, + }), ...pkg.entrypoints .filter((entrypoint) => entrypoint.name !== pkg.name) - .map((entrypoint) => { - return fs.remove(path.join(entrypoint.directory, "dist")); + .map(async (entrypoint) => { + await fs.rm(path.join(entrypoint.directory, "dist"), { + recursive: true, + force: true, + }); }), ]); const isTypeModule = pkg.isTypeModule(); diff --git a/packages/cli/src/dev.ts b/packages/cli/src/dev.ts index 8d2e168d..fd06fca2 100644 --- a/packages/cli/src/dev.ts +++ b/packages/cli/src/dev.ts @@ -17,8 +17,9 @@ import { getDistFilenameForConditions, getBaseDistName, getDistFilenameForConditionsWithTypeModule, + fsOutputFile, } from "./utils"; -import * as fs from "fs-extra"; +import fs from "node:fs/promises"; import path from "path"; import normalizePath from "normalize-path"; import { Entrypoint } from "./entrypoint"; @@ -109,7 +110,7 @@ export async function writeDevTSFiles( const pathToImport = replaceTsExtensionWithJs(relativePathWithExtension); let promises: Promise[] = [ - fs.outputFile( + fsOutputFile( dtsReexportFilename, dtsTemplate( baseDtsFilename, @@ -131,7 +132,7 @@ export async function writeDevTSFiles( const baseDmtsFilename = path.basename(dmtsReexportFilename); promises.push( - fs.outputFile( + fsOutputFile( dmtsReexportFilename, dmtsTemplate( baseDmtsFilename, @@ -143,7 +144,7 @@ export async function writeDevTSFiles( ); if (hasDefaultExport) { promises.push( - fs.outputFile( + fsOutputFile( getDtsDefaultForMtsFilepath(dmtsReexportFilename), dtsDefaultForDmtsTemplate(pathToImport) ) @@ -189,8 +190,8 @@ export default async function dev(projectDir: string) { project.packages.map(async (pkg) => { const exportsFieldConfig = pkg.exportsFieldConfig(); let distDirectory = path.join(pkg.directory, "dist"); - await fs.remove(distDirectory); - await fs.ensureDir(distDirectory); + await fs.rm(distDirectory, { recursive: true, force: true }); + await fs.mkdir(distDirectory, { recursive: true }); return Promise.all( pkg.entrypoints.map(async (entrypoint) => { @@ -406,9 +407,9 @@ async function cleanEntrypoint(entrypoint: Entrypoint) { if (entrypoint.package.name === entrypoint.name) return; let distDirectory = path.join(entrypoint.directory, "dist"); - await fs.remove(distDirectory); + await fs.rm(distDirectory, { recursive: true, force: true }); if (!entrypoint.package.project.experimentalFlags.distInRoot) { - await fs.ensureDir(distDirectory); + await fs.mkdir(distDirectory, { recursive: true }); } } diff --git a/packages/cli/src/glob-thing.ts b/packages/cli/src/glob-thing.ts index 39e3c4f9..818dc1cb 100644 --- a/packages/cli/src/glob-thing.ts +++ b/packages/cli/src/glob-thing.ts @@ -1,5 +1,5 @@ import parseGlob from "parse-glob"; -import * as fs from "fs-extra"; +import fs from "node:fs/promises"; import path from "path"; import normalizePath from "normalize-path"; diff --git a/packages/cli/src/item.ts b/packages/cli/src/item.ts index cfa647b1..3f08bffc 100644 --- a/packages/cli/src/item.ts +++ b/packages/cli/src/item.ts @@ -1,4 +1,4 @@ -import * as fs from "fs-extra"; +import fs from "node:fs/promises"; import nodePath from "path"; import detectIndent from "detect-indent"; import parseJson from "parse-json"; diff --git a/packages/cli/src/package.ts b/packages/cli/src/package.ts index e40511e3..75f646d5 100644 --- a/packages/cli/src/package.ts +++ b/packages/cli/src/package.ts @@ -1,7 +1,6 @@ // based on https://github.com/jamiebuilds/std-pkg but reading fewer things, adding setters and reading the file import fastGlob from "fast-glob"; -import * as fs from "fs-extra"; -import fsPromises from "fs/promises"; +import fs from "node:fs/promises"; import nodePath from "path"; import { Item } from "./item"; import { BatchError, FatalError } from "./errors"; @@ -19,6 +18,7 @@ import { DistFilenameStrategy, MinimalEntrypoint, parseImportConditionDefaultExportOption, + fsOutputFile, } from "./utils"; import normalizePath from "normalize-path"; import { parseImportsField } from "./imports"; @@ -92,14 +92,15 @@ function createEntrypoints( ); } } - await fs.remove(filename); + await fs.rm(filename, { recursive: true, force: true }); const contents = await fs.readdir(nodePath.dirname(filename)); if ( contents.length === 0 || (contents.length === 1 && contents[0] === "dist") ) { - await fsPromises.rm(nodePath.dirname(filename), { + await fs.rm(nodePath.dirname(filename), { recursive: true, + force: true, }); } } @@ -134,7 +135,7 @@ function createEntrypoints( nodePath.dirname(filename), pkg.indent ); - await fs.outputFile(filename, contents); + await fsOutputFile(filename, contents); } return new Entrypoint(filename, contents, pkg, sourceFile); }) diff --git a/packages/cli/src/project.ts b/packages/cli/src/project.ts index b4ed5526..da788fee 100644 --- a/packages/cli/src/project.ts +++ b/packages/cli/src/project.ts @@ -1,7 +1,7 @@ import nodePath from "path"; import { promptInput } from "./prompt"; import fastGlob from "fast-glob"; -import * as fs from "fs-extra"; +import fs from "node:fs/promises"; import { Item } from "./item"; import { Package } from "./package"; import { validateIncludedFiles } from "./validate-included-files"; @@ -80,7 +80,7 @@ export class Project extends Item<{ _directory: string, isFix: boolean = false ): Promise { - const directory = await (fs.realpath as any).native(_directory); + const directory = await fs.realpath(_directory); let filePath = nodePath.join(directory, "package.json"); let contents = await fs.readFile(filePath, "utf-8"); let project = new Project(filePath, contents, new Map()); diff --git a/packages/cli/src/rollup-plugins/flow.ts b/packages/cli/src/rollup-plugins/flow.ts index d14a42bd..a4ea93c2 100644 --- a/packages/cli/src/rollup-plugins/flow.ts +++ b/packages/cli/src/rollup-plugins/flow.ts @@ -2,7 +2,7 @@ import path from "path"; import { Plugin } from "rollup"; import { flowTemplate } from "../utils"; -import * as fs from "fs-extra"; +import fs from "node:fs/promises"; import normalizePath from "normalize-path"; export default function flow(): Plugin { diff --git a/packages/cli/src/rollup-plugins/typescript-declarations/common.ts b/packages/cli/src/rollup-plugins/typescript-declarations/common.ts index 4c472b6f..d0b848d0 100644 --- a/packages/cli/src/rollup-plugins/typescript-declarations/common.ts +++ b/packages/cli/src/rollup-plugins/typescript-declarations/common.ts @@ -1,7 +1,7 @@ import { EOL } from "os"; import resolveFrom from "resolve-from"; import { FatalError } from "../../errors"; -import * as fs from "fs-extra"; +import fs from "node:fs/promises"; import path from "path"; import normalizePath from "normalize-path"; import { getModuleSpecifier } from "./get-module-specifier"; diff --git a/packages/cli/src/rollup-plugins/typescript-declarations/index.ts b/packages/cli/src/rollup-plugins/typescript-declarations/index.ts index 3f2b311b..0d083cf5 100644 --- a/packages/cli/src/rollup-plugins/typescript-declarations/index.ts +++ b/packages/cli/src/rollup-plugins/typescript-declarations/index.ts @@ -1,7 +1,7 @@ import path from "path"; import { FatalError } from "../../errors"; import { Plugin } from "rollup"; -import fs from "fs-extra"; +import fs from "node:fs/promises"; import { Package } from "../../package"; import { dmtsTemplate, diff --git a/packages/cli/src/utils.ts b/packages/cli/src/utils.ts index 06e71d35..a9ccd8dd 100644 --- a/packages/cli/src/utils.ts +++ b/packages/cli/src/utils.ts @@ -8,6 +8,7 @@ import { import * as nodePath from "path"; import { FatalError } from "./errors"; import { createExportsField } from "./imports"; +import fs from "node:fs/promises"; let fields = [ "version", @@ -519,3 +520,15 @@ export function parseImportConditionDefaultExportOption( name ); } + +export async function fsOutputFile( + file: string, + data: + | string + | NodeJS.ArrayBufferView + | Iterable + | AsyncIterable +): Promise { + await fs.mkdir(nodePath.dirname(file), { recursive: true }); + await fs.writeFile(file, data); +} diff --git a/packages/cli/src/validate-included-files.ts b/packages/cli/src/validate-included-files.ts index 7d97b3f9..d53e6ac0 100644 --- a/packages/cli/src/validate-included-files.ts +++ b/packages/cli/src/validate-included-files.ts @@ -1,9 +1,10 @@ import path from "path"; import chalk from "chalk"; -import * as fs from "fs-extra"; +import fs from "node:fs/promises"; import packlist from "npm-packlist"; import { Package } from "./package"; import { FatalError } from "./errors"; +import { fsOutputFile } from "./utils"; export async function validateIncludedFiles(pkg: Package) { try { @@ -24,11 +25,11 @@ export async function validateIncludedFiles(pkg: Package) { "dist", "preconstruct-test-file" ); - return fs.outputFile(filename, "test content"); + return fsOutputFile(filename, "test content"); }) .concat( hasNoEntrypointAtRootOfPackage - ? fs.outputFile(rootDistDirectoryTestFilepath, "test content") + ? fsOutputFile(rootDistDirectoryTestFilepath, "test content") : [] ) ); @@ -85,8 +86,9 @@ export async function validateIncludedFiles(pkg: Package) { } finally { await Promise.all( pkg.entrypoints.map((entrypoint) => - fs.remove( - path.join(entrypoint.directory, "dist", "preconstruct-test-file") + fs.rm( + path.join(entrypoint.directory, "dist", "preconstruct-test-file"), + { recursive: true, force: true } ) ) ); diff --git a/packages/cli/test-utils/index.ts b/packages/cli/test-utils/index.ts index ba628358..4b590337 100644 --- a/packages/cli/test-utils/index.ts +++ b/packages/cli/test-utils/index.ts @@ -1,6 +1,5 @@ import path from "path"; -import realFs from "fs"; -import * as fs from "fs-extra"; +import fs from "node:fs/promises"; import fastGlob from "fast-glob"; import fixturez from "fixturez"; import spawn from "spawndamnit"; @@ -33,6 +32,7 @@ afterEach(() => { import init from "../src/init"; import { confirms } from "../src/messages"; import normalizePath from "normalize-path"; +import { fsOutputFile } from "../src/utils"; let mockedConfirms = confirms as jest.Mocked; @@ -106,7 +106,7 @@ export let createPackageCheckTestCreator = ( things.map(async (entrypointPath) => { let content = entrypoints[entrypointPath]; let filepath = path.join(tmpPath, entrypointPath, "package.json"); - await fs.ensureFile(filepath); + await fs.mkdir(path.dirname(filepath), { recursive: true }); await fs.writeFile(filepath, JSON.stringify(content, null, 2)); }) ); @@ -346,16 +346,16 @@ async function getSymlinkType(targetPath: string): Promise<"dir" | "file"> { } export async function testdir(dir: Fixture) { - const temp = realFs.realpathSync.native(f.temp()); + const temp = await fs.realpath(f.temp()); await Promise.all( Object.keys(dir).map(async (filename) => { const output = dir[filename]; const fullPath = path.join(temp, filename); if (typeof output === "string") { - await fs.outputFile(fullPath, output); + await fsOutputFile(fullPath, output); } else { const dir = path.dirname(fullPath); - await fs.ensureDir(dir); + await fs.mkdir(dir, { recursive: true }); const targetPath = path.resolve(temp, output.path); const symlinkType = await getSymlinkType(targetPath); await fs.symlink(targetPath, fullPath, symlinkType); @@ -480,3 +480,22 @@ export const basicPkgJson = (options?: { dependencies: options?.dependencies, }); }; + +/** + * Naive implementation of fs-extra.ensureSymlink. + * Should be good enough for tests. + */ +export async function fsEnsureSymlink( + srcPath: string, + distPath: string, + type?: string +) { + let stats; + try { + stats = await fs.lstat(distPath); + } catch {} + if (!stats || !stats.isSymbolicLink()) { + await fs.mkdir(path.dirname(distPath), { recursive: true }); + await fs.symlink(srcPath, distPath, type); + } +} diff --git a/yarn.lock b/yarn.lock index 7aec5ee7..f8010a40 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3642,13 +3642,6 @@ "@types/qs" "*" "@types/serve-static" "*" -"@types/fs-extra@^9.0.6": - version "9.0.6" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.6.tgz#488e56b77299899a608b8269719c1d133027a6ab" - integrity sha512-ecNRHw4clCkowNOBJH1e77nvbPxHYnWIXMv1IAoG/9+MYGkgoyr3Ppxr7XYFNL41V422EDhyV4/4SSK8L2mlig== - dependencies: - "@types/node" "*" - "@types/glob@^7.1.1": version "7.1.1" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" @@ -3778,10 +3771,12 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== -"@types/node@^18.11.9": - version "18.11.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4" - integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== +"@types/node@^18.19.55": + version "18.19.55" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.55.tgz#29c3f8e1485a92ec96636957ddec55aabc6e856e" + integrity sha512-zzw5Vw52205Zr/nmErSEkN5FLqXPuKX/k5d1D7RKHATGqU7y6YfX9QxZraUzUrFGqH6XzOzG196BC35ltJC4Cw== + dependencies: + undici-types "~5.26.4" "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -7155,7 +7150,7 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.0.0, fs-extra@^9.0.1: +fs-extra@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== @@ -12883,6 +12878,11 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + unherit@^1.0.4: version "1.1.3" resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22"