diff --git a/gulpfile.ts b/gulpfile.ts index a7b57e0ba8..7556d7c7ad 100644 --- a/gulpfile.ts +++ b/gulpfile.ts @@ -1,13 +1,13 @@ import { Gulpclass, Task, SequenceTask, MergedTask } from "gulpclass"; -import fs from "fs"; +import fs from "fs/promises"; import gulp from "gulp"; -import del from "del"; import shell from "gulp-shell"; import replace from "gulp-replace"; import rename from "gulp-rename"; import sourcemaps from "gulp-sourcemaps"; import ts from "gulp-typescript"; +import { rimraf } from "rimraf"; @Gulpclass() export class Gulpfile { @@ -21,7 +21,7 @@ export class Gulpfile { */ @Task() async clean() { - return del(["./build/**"]); + return rimraf(["./build/**"]); } /** @@ -86,7 +86,7 @@ export class Gulpfile { @Task() async browserClearPackageDirectory() { - return del([ + return rimraf([ "./build/browser/**" ]); } @@ -174,7 +174,7 @@ export class Gulpfile { `export {\n ${cjsKeys.join(",\n ")}\n};\n` + 'export default TypeORM;\n'; - fs.writeFileSync(`${buildDir}/index.mjs`, indexMjsContent, "utf8"); + await fs.writeFile(`${buildDir}/index.mjs`, indexMjsContent, "utf8"); } /** @@ -193,7 +193,7 @@ export class Gulpfile { */ @Task() async packageClearPackageDirectory() { - return del([ + return rimraf([ "build/package/src/**" ]); } diff --git a/package-lock.json b/package-lock.json index ce09e69e5f..2787825436 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,6 @@ "debug": "^4.3.4", "dotenv": "^16.0.3", "glob": "^10.4.5", - "mkdirp": "^2.1.3", "sha.js": "^2.4.11", "tslib": "^2.5.0", "uuid": "^9.0.0", @@ -32,13 +31,11 @@ "devDependencies": { "@eslint/js": "^9.17.0", "@tsconfig/node16": "^16.1.1", - "@types/app-root-path": "^1.2.4", "@types/chai": "^4.3.4", "@types/chai-as-promised": "^7.1.5", "@types/debug": "^4.1.7", "@types/gulp-rename": "^2.0.6", "@types/gulp-sourcemaps": "^0.0.38", - "@types/mkdirp": "^1.0.2", "@types/mocha": "^10.0.1", "@types/node": "^18.13.0", "@types/sha.js": "^2.4.0", @@ -52,7 +49,6 @@ "class-transformer": "^0.5.1", "conventional-changelog-angular": "^5.0.13", "conventional-changelog-cli": "^2.2.2", - "del": "6.1.1", "eslint": "^9.17.0", "globals": "^15.14.0", "gulp": "^4.0.2", @@ -75,7 +71,7 @@ "prettier": "^2.8.8", "redis": "^4.6.4", "remap-istanbul": "^0.13.0", - "rimraf": "^4.1.2", + "rimraf": "^5.0.10", "sinon": "^15.0.1", "sinon-chai": "^3.7.0", "source-map-support": "^0.5.21", @@ -1325,12 +1321,6 @@ "integrity": "sha512-+pio93ejHN4nINX4pXqfnR/fPLRtJBaT4ORaa5RH0Oc1zoYmo2B2koG+M328CQhHKn1Wj6FcOxCDFXAot9NhvA==", "dev": true }, - "node_modules/@types/app-root-path": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@types/app-root-path/-/app-root-path-1.2.8.tgz", - "integrity": "sha512-l12miuN6JXAi3yuADZNhRKbyN7IIyaUP9hFVZ/BbHhWYpBkHLbOaX2WkQoXGJyAgMcP9iZ0S9+tz/FN40VrwWQ==", - "dev": true - }, "node_modules/@types/chai": { "version": "4.3.11", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.11.tgz", @@ -1577,15 +1567,6 @@ "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", "dev": true }, - "node_modules/@types/mkdirp": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-1.0.2.tgz", - "integrity": "sha512-o0K1tSO0Dx5X6xlU5F1D6625FawhC3dU3iqr25lluNv/+/QIVH8RLNEiVokgIZo+mz+87w/3Mkg/VvQS+J51fQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/mocha": { "version": "10.0.6", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.6.tgz", @@ -2017,6 +1998,7 @@ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, + "optional": true, "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -2492,15 +2474,6 @@ "node": ">=0.10.0" } }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", @@ -3231,6 +3204,7 @@ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, + "optional": true, "engines": { "node": ">=6" } @@ -4090,63 +4064,6 @@ "node": ">=0.10.0" } }, - "node_modules/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "dev": true, - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/del/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -4198,18 +4115,6 @@ "node": ">=0.3.1" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -5977,26 +5882,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/glogg": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", @@ -7505,24 +7390,6 @@ "node": ">=8" } }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -9303,20 +9170,6 @@ "node": ">=0.10.0" } }, - "node_modules/mkdirp": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", - "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -10590,6 +10443,7 @@ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, + "optional": true, "dependencies": { "aggregate-error": "^3.0.0" }, @@ -10799,15 +10653,6 @@ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", @@ -12000,65 +11845,21 @@ "dev": true }, "node_modules/rimraf": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", - "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", "dev": true, + "license": "ISC", "dependencies": { - "glob": "^9.2.0" + "glob": "^10.3.7" }, "bin": { - "rimraf": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=14" + "rimraf": "dist/esm/bin.mjs" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rimraf/node_modules/glob": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", - "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^8.0.2", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -12372,15 +12173,6 @@ "sinon": ">=4.0.0" } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", diff --git a/package.json b/package.json index 52afd4adcb..1a1640bd00 100644 --- a/package.json +++ b/package.json @@ -95,13 +95,11 @@ "devDependencies": { "@eslint/js": "^9.17.0", "@tsconfig/node16": "^16.1.1", - "@types/app-root-path": "^1.2.4", "@types/chai": "^4.3.4", "@types/chai-as-promised": "^7.1.5", "@types/debug": "^4.1.7", "@types/gulp-rename": "^2.0.6", "@types/gulp-sourcemaps": "^0.0.38", - "@types/mkdirp": "^1.0.2", "@types/mocha": "^10.0.1", "@types/node": "^18.13.0", "@types/sha.js": "^2.4.0", @@ -115,7 +113,6 @@ "class-transformer": "^0.5.1", "conventional-changelog-angular": "^5.0.13", "conventional-changelog-cli": "^2.2.2", - "del": "6.1.1", "eslint": "^9.17.0", "globals": "^15.14.0", "gulp": "^4.0.2", @@ -138,7 +135,7 @@ "prettier": "^2.8.8", "redis": "^4.6.4", "remap-istanbul": "^0.13.0", - "rimraf": "^4.1.2", + "rimraf": "^5.0.10", "sinon": "^15.0.1", "sinon-chai": "^3.7.0", "source-map-support": "^0.5.21", @@ -232,7 +229,6 @@ "debug": "^4.3.4", "dotenv": "^16.0.3", "glob": "^10.4.5", - "mkdirp": "^2.1.3", "sha.js": "^2.4.11", "tslib": "^2.5.0", "uuid": "^9.0.0", diff --git a/src/commands/CommandUtils.ts b/src/commands/CommandUtils.ts index ff440cfc9b..f6d7af4fd9 100644 --- a/src/commands/CommandUtils.ts +++ b/src/commands/CommandUtils.ts @@ -1,6 +1,5 @@ -import * as fs from "fs" -import * as path from "path" -import mkdirp from "mkdirp" +import fs from "fs/promises" +import path from "path" import { TypeORMError } from "../error" import { DataSource } from "../data-source" import { InstanceChecker } from "../util/InstanceChecker" @@ -15,7 +14,7 @@ export class CommandUtils { ): Promise { let dataSourceFileExports try { - ;[dataSourceFileExports] = await importOrRequireFile( + [dataSourceFileExports] = await importOrRequireFile( dataSourceFilePath, ) } catch (err) { @@ -66,8 +65,8 @@ export class CommandUtils { /** * Creates directories recursively. */ - static createDirectories(directory: string) { - return mkdirp(directory) + static async createDirectories(directory: string): Promise { + await fs.mkdir(directory, { recursive: true }) } /** @@ -79,26 +78,28 @@ export class CommandUtils { override: boolean = true, ): Promise { await CommandUtils.createDirectories(path.dirname(filePath)) - return new Promise((ok, fail) => { - if (override === false && fs.existsSync(filePath)) return ok() - - fs.writeFile(filePath, content, (err) => (err ? fail(err) : ok())) - }) + if (override === false && (await CommandUtils.fileExists(filePath))) { + return + } + await fs.writeFile(filePath, content) } /** * Reads everything from a given file and returns its content as a string. */ static async readFile(filePath: string): Promise { - return new Promise((ok, fail) => { - fs.readFile(filePath, (err, data) => - err ? fail(err) : ok(data.toString()), - ) - }) + const file = await fs.readFile(filePath) + + return file.toString() } static async fileExists(filePath: string) { - return fs.existsSync(filePath) + try { + await fs.access(filePath, fs.constants.F_OK) + return true + } catch { + return false + } } /** diff --git a/src/driver/better-sqlite3/BetterSqlite3Driver.ts b/src/driver/better-sqlite3/BetterSqlite3Driver.ts index a5e9f04d12..f95547fe1f 100644 --- a/src/driver/better-sqlite3/BetterSqlite3Driver.ts +++ b/src/driver/better-sqlite3/BetterSqlite3Driver.ts @@ -1,4 +1,4 @@ -import mkdirp from "mkdirp" +import fs from "fs/promises" import path from "path" import { DriverPackageNotInstalledError } from "../../error" import { PlatformTools } from "../../platform/PlatformTools" @@ -187,7 +187,7 @@ export class BetterSqlite3Driver extends AbstractSqliteDriver { * Auto creates database directory if it does not exist. */ protected async createDatabaseDirectory(dbPath: string): Promise { - await mkdirp(dbPath) + await fs.mkdir(dbPath, { recursive: true }) } /** diff --git a/src/driver/sqlite/SqliteDriver.ts b/src/driver/sqlite/SqliteDriver.ts index 767ba058e0..b59ebc59be 100644 --- a/src/driver/sqlite/SqliteDriver.ts +++ b/src/driver/sqlite/SqliteDriver.ts @@ -1,4 +1,4 @@ -import mkdirp from "mkdirp" +import fs from "fs/promises" import path from "path" import { DriverPackageNotInstalledError } from "../../error/DriverPackageNotInstalledError" import { SqliteQueryRunner } from "./SqliteQueryRunner" @@ -203,7 +203,7 @@ export class SqliteDriver extends AbstractSqliteDriver { * Auto creates database directory if it does not exist. */ protected async createDatabaseDirectory(fullPath: string): Promise { - await mkdirp(path.dirname(fullPath)) + await fs.mkdir(path.dirname(fullPath), { recursive: true }) } /** diff --git a/src/platform/PlatformTools.ts b/src/platform/PlatformTools.ts index 72116e3ced..6a383f7aa1 100644 --- a/src/platform/PlatformTools.ts +++ b/src/platform/PlatformTools.ts @@ -1,5 +1,5 @@ -import * as path from "path" -import * as fs from "fs" +import path from "path" +import fs from "fs" import dotenv from "dotenv" import chalk from "chalk" import { highlight, Theme } from "cli-highlight" @@ -182,12 +182,7 @@ export class PlatformTools { } static async writeFile(path: string, data: any): Promise { - return new Promise((ok, fail) => { - fs.writeFile(path, data, (err) => { - if (err) fail(err) - ok() - }) - }) + return fs.promises.writeFile(path, data) } /** diff --git a/src/util/ImportUtils.ts b/src/util/ImportUtils.ts index 60d4db5b25..b5e1d00219 100644 --- a/src/util/ImportUtils.ts +++ b/src/util/ImportUtils.ts @@ -1,4 +1,4 @@ -import fs from "fs" +import fs from "fs/promises" import path from "path" import { pathToFileURL } from "url" @@ -39,45 +39,31 @@ export async function importOrRequireFile( return tryToRequire() } -function getNearestPackageJson(filePath: string): Promise { - return new Promise((accept) => { - let currentPath = filePath +async function getNearestPackageJson(filePath: string): Promise { + let currentPath = filePath - function searchPackageJson() { - const nextPath = path.dirname(currentPath) + while (currentPath !== path.dirname(currentPath)) { + currentPath = path.dirname(currentPath) + const potentialPackageJson = path.join(currentPath, "package.json") - if (currentPath === nextPath) - // the top of the file tree is reached - accept(null) - else { - currentPath = nextPath - const potentialPackageJson = path.join( - currentPath, - "package.json", - ) + try { + const stats = await fs.stat(potentialPackageJson) + if (!stats.isFile()) { + continue + } - fs.stat(potentialPackageJson, (err, stats) => { - if (err != null) searchPackageJson() - else if (stats.isFile()) { - fs.readFile( - potentialPackageJson, - "utf8", - (err, data) => { - if (err != null) accept(null) - else { - try { - accept(JSON.parse(data)) - } catch (err) { - accept(null) - } - } - }, - ) - } else searchPackageJson() - }) + try { + return JSON.parse( + await fs.readFile(potentialPackageJson, "utf8"), + ) + } catch { + return null } + } catch { + continue } + } - searchPackageJson() - }) + // the top of the file tree is reached + return null } diff --git a/test/functional/connection-options-reader/connection-options-reader.ts b/test/functional/connection-options-reader/connection-options-reader.ts index 0642ebe793..e2798aeef9 100644 --- a/test/functional/connection-options-reader/connection-options-reader.ts +++ b/test/functional/connection-options-reader/connection-options-reader.ts @@ -1,4 +1,4 @@ -import { promises as fs } from "fs" +import fs from "fs/promises" import { expect } from "chai" import { DataSourceOptions } from "../../../src/data-source/DataSourceOptions" import { ConnectionOptionsReader } from "../../../src/connection/ConnectionOptionsReader" diff --git a/test/functional/multi-database/multi-database-basic-functionality/multi-database-basic-functionality.ts b/test/functional/multi-database/multi-database-basic-functionality/multi-database-basic-functionality.ts index e76e86040c..e789ffbc27 100644 --- a/test/functional/multi-database/multi-database-basic-functionality/multi-database-basic-functionality.ts +++ b/test/functional/multi-database/multi-database-basic-functionality/multi-database-basic-functionality.ts @@ -11,9 +11,9 @@ import { Category } from "./entity/Category" import { Post } from "./entity/Post" import { User } from "./entity/User" import { filepathToName } from "../../../../src/util/PathUtils" -import rimraf from "rimraf" +import { rimraf } from "rimraf" import path from "path" -import fs from "fs" +import fs from "fs/promises" import appRoot from "app-root-path" const VALID_NAME_REGEX = /^(?!sqlite_).{1,63}$/ @@ -104,9 +104,13 @@ describe("multi-database > basic-functionality", () => { )!.groups!["filename"], ) - expect(fs.existsSync(expectedMainPath)).to.be.true - expect(fs.existsSync(attachAnswerPath)).to.be.true - expect(fs.existsSync(attachCategoryPath)).to.be.true + await expect(fs.access(expectedMainPath, fs.constants.F_OK)) + .to.not.be.rejected + await expect(fs.access(attachAnswerPath, fs.constants.F_OK)) + .to.not.be.rejected + await expect( + fs.access(attachCategoryPath, fs.constants.F_OK), + ).to.not.be.rejected }), )) diff --git a/test/functional/repository/find-options/repository-find-options.ts b/test/functional/repository/find-options/repository-find-options.ts index ed485d83ff..1e9b4a4a60 100644 --- a/test/functional/repository/find-options/repository-find-options.ts +++ b/test/functional/repository/find-options/repository-find-options.ts @@ -1,5 +1,7 @@ import "reflect-metadata" +import fs from "fs/promises" import { expect } from "chai" +import sinon from "sinon" import { closeTestingConnections, createTestingConnections, @@ -11,11 +13,7 @@ import { User } from "./entity/User" import { Category } from "./entity/Category" import { Post } from "./entity/Post" import { Photo } from "./entity/Photo" -import sinon from "sinon" import { FileLogger } from "../../../../src" -import { promisify } from "util" -import fs from "fs" -import { readFile, unlink } from "fs" describe("repository > find options", () => { let connections: DataSource[] @@ -256,9 +254,9 @@ describe("repository > find options > comment", () => { beforeEach(() => reloadTestingDatabases(connections)) after(async () => { await closeTestingConnections(connections) - if (fs.existsSync(logPath)) { - await promisify(unlink)(logPath) - } + try { + await fs.unlink(logPath) + } catch {} }) it("repository should insert comment", () => @@ -268,7 +266,7 @@ describe("repository > find options > comment", () => { .getRepository(User) .find({ comment: "This is a query comment." }) - const logs = await promisify(readFile)(logPath) + const logs = await fs.readFile(logPath) const lines = logs.toString().split("\n") const lastLine = lines[lines.length - 2] // last line is blank after newline // remove timestamp and prefix diff --git a/test/functional/sqljs/load.ts b/test/functional/sqljs/load.ts index 477c1049c9..3f4df6a100 100644 --- a/test/functional/sqljs/load.ts +++ b/test/functional/sqljs/load.ts @@ -1,5 +1,5 @@ import "reflect-metadata" -import * as fs from "fs" +import fs from "fs/promises" import { expect } from "chai" import { closeTestingConnections, @@ -41,7 +41,7 @@ describe("sqljs driver > load", () => { const exportedDatabase = dataSource.sqljsManager.exportDatabase() expect(exportedDatabase).not.to.be.undefined - const originalFileContent = fs.readFileSync( + const originalFileContent = await fs.readFile( "test/functional/sqljs/sqlite/test.sqlite", ) expect(exportedDatabase.length).to.equal( diff --git a/test/functional/sqljs/save.ts b/test/functional/sqljs/save.ts index 34b12590f2..a09e532c00 100644 --- a/test/functional/sqljs/save.ts +++ b/test/functional/sqljs/save.ts @@ -1,6 +1,6 @@ import "reflect-metadata" -import * as fs from "fs" -import * as path from "path" +import fs from "fs/promises" +import path from "path" import { expect } from "chai" import { closeTestingConnections, @@ -28,18 +28,19 @@ describe("sqljs driver > save", () => { it("should save to file", () => Promise.all( connections.map(async (dataSource) => { - if (fs.existsSync(pathToSqlite)) { - fs.unlinkSync(pathToSqlite) - } + try { + await fs.unlink(pathToSqlite) + } catch {} - let post = new Post() + const post = new Post() post.title = "The second title" const repository = dataSource.getRepository(Post) await repository.save(post) await dataSource.sqljsManager.saveDatabase(pathToSqlite) - expect(fs.existsSync(pathToSqlite)).to.be.true + await expect(fs.access(pathToSqlite, fs.constants.F_OK)).not.to + .be.rejected }), )) diff --git a/test/functional/util/ImportUtils.ts b/test/functional/util/ImportUtils.ts index cf8d729da2..1fdfb2555c 100644 --- a/test/functional/util/ImportUtils.ts +++ b/test/functional/util/ImportUtils.ts @@ -1,14 +1,9 @@ import { expect } from "chai" -import fs from "fs" +import fs from "fs/promises" import path from "path" import { importOrRequireFile } from "../../../src/util/ImportUtils" describe("ImportUtils.importOrRequireFile", () => { - const rmdirSync = (dir: string) => { - if (fs.rmSync != null) fs.rmSync(dir, { recursive: true }) - else fs.rmdirSync(dir, { recursive: true }) - } - it("should import .js file as ESM", async () => { const testDir = path.join(__dirname, "testJsEsm") const srcDir = path.join(testDir, "src") @@ -23,16 +18,18 @@ describe("ImportUtils.importOrRequireFile", () => { export const number = 6; ` - if (fs.existsSync(testDir)) rmdirSync(testDir) + try { + await fs.rmdir(testDir, { recursive: true }) + } catch {} - fs.mkdirSync(srcDir, { recursive: true }) + await fs.mkdir(srcDir, { recursive: true }) - fs.writeFileSync( + await fs.writeFile( packageJsonPath, JSON.stringify(packageJsonContent), "utf8", ) - fs.writeFileSync(jsFilePath, jsFileContent, "utf8") + await fs.writeFile(jsFilePath, jsFileContent, "utf8") const [exports, moduleType] = await importOrRequireFile(jsFilePath) @@ -41,7 +38,7 @@ describe("ImportUtils.importOrRequireFile", () => { expect(exports.default).to.be.a("function") expect(exports.number).to.be.eq(6) - rmdirSync(testDir) + await fs.rmdir(testDir, { recursive: true }) }) it("should import .js file as CommonJS", async () => { @@ -60,16 +57,18 @@ describe("ImportUtils.importOrRequireFile", () => { }; ` - if (fs.existsSync(testDir)) rmdirSync(testDir) + try { + await fs.rmdir(testDir, { recursive: true }) + } catch {} - fs.mkdirSync(srcDir, { recursive: true }) + await fs.mkdir(srcDir, { recursive: true }) - fs.writeFileSync( + await fs.writeFile( packageJsonPath, JSON.stringify(packageJsonContent), "utf8", ) - fs.writeFileSync(jsFilePath, jsFileContent, "utf8") + await fs.writeFile(jsFilePath, jsFileContent, "utf8") const [exports, moduleType] = await importOrRequireFile(jsFilePath) @@ -78,7 +77,7 @@ describe("ImportUtils.importOrRequireFile", () => { expect(exports.test).to.be.a("function") expect(exports.number).to.be.eq(6) - rmdirSync(testDir) + await fs.rmdir(testDir, { recursive: true }) }) it("should import .mjs file as ESM", async () => { @@ -92,11 +91,13 @@ describe("ImportUtils.importOrRequireFile", () => { export const number = 6; ` - if (fs.existsSync(testDir)) rmdirSync(testDir) + try { + await fs.rmdir(testDir, { recursive: true }) + } catch {} - fs.mkdirSync(srcDir, { recursive: true }) + await fs.mkdir(srcDir, { recursive: true }) - fs.writeFileSync(jsFilePath, jsFileContent, "utf8") + await fs.writeFile(jsFilePath, jsFileContent, "utf8") const [exports, moduleType] = await importOrRequireFile(jsFilePath) @@ -105,7 +106,7 @@ describe("ImportUtils.importOrRequireFile", () => { expect(exports.default).to.be.a("function") expect(exports.number).to.be.eq(6) - rmdirSync(testDir) + await fs.rmdir(testDir, { recursive: true }) }) it("should import .cjs file as CommonJS", async () => { @@ -121,11 +122,13 @@ describe("ImportUtils.importOrRequireFile", () => { }; ` - if (fs.existsSync(testDir)) rmdirSync(testDir) + try { + await fs.rmdir(testDir, { recursive: true }) + } catch {} - fs.mkdirSync(srcDir, { recursive: true }) + await fs.mkdir(srcDir, { recursive: true }) - fs.writeFileSync(jsFilePath, jsFileContent, "utf8") + await fs.writeFile(jsFilePath, jsFileContent, "utf8") const [exports, moduleType] = await importOrRequireFile(jsFilePath) @@ -134,7 +137,7 @@ describe("ImportUtils.importOrRequireFile", () => { expect(exports.test).to.be.a("function") expect(exports.number).to.be.eq(6) - rmdirSync(testDir) + await fs.rmdir(testDir, { recursive: true }) }) it("should import .json file as CommonJS", async () => { @@ -143,11 +146,17 @@ describe("ImportUtils.importOrRequireFile", () => { const jsonFilePath = path.join(testDir, "file.json") const jsonFileContent = { test: 6 } - if (fs.existsSync(testDir)) rmdirSync(testDir) + try { + await fs.rmdir(testDir, { recursive: true }) + } catch {} - fs.mkdirSync(testDir, { recursive: true }) + await fs.mkdir(testDir, { recursive: true }) - fs.writeFileSync(jsonFilePath, JSON.stringify(jsonFileContent), "utf8") + await fs.writeFile( + jsonFilePath, + JSON.stringify(jsonFileContent), + "utf8", + ) const [exports, moduleType] = await importOrRequireFile(jsonFilePath) @@ -155,6 +164,6 @@ describe("ImportUtils.importOrRequireFile", () => { expect(moduleType).to.be.eq("commonjs") expect(exports.test).to.be.eq(6) - rmdirSync(testDir) + await fs.rmdir(testDir, { recursive: true }) }) }) diff --git a/test/github-issues/6284/issue-6284.ts b/test/github-issues/6284/issue-6284.ts index 7bffb2d7ae..0a6e14fa3a 100644 --- a/test/github-issues/6284/issue-6284.ts +++ b/test/github-issues/6284/issue-6284.ts @@ -1,38 +1,46 @@ import { expect } from "chai" -import { writeFileSync, unlinkSync } from "fs" +import { writeFile, unlink } from "fs/promises" import { ConnectionOptionsReader } from "../../../src/connection/ConnectionOptionsReader" import { importClassesFromDirectories } from "../../../src/util/DirectoryExportedClassesLoader" import { LoggerFactory } from "../../../src/logger/LoggerFactory" +import { DataSourceOptions } from "../../../src/data-source/DataSourceOptions" describe("github issues > #6284 cli support for cjs extension", () => { it("will load a cjs file", async () => { const cjsConfigPath = [__dirname, "ormconfig.cjs"].join("/") const databaseType = "postgres" const config = `module.exports = {"type": "${databaseType}"};` + let results: DataSourceOptions[] - writeFileSync(cjsConfigPath, config) - const reader = new ConnectionOptionsReader({ root: __dirname }) + await writeFile(cjsConfigPath, config) + try { + const reader = new ConnectionOptionsReader({ root: __dirname }) + results = await reader.all() + } finally { + await unlink(cjsConfigPath) + } - const results = await reader.all() expect(results).to.be.an("Array") expect(results[0]).to.be.an("Object") expect(results[0].type).to.equal(databaseType) - - unlinkSync(cjsConfigPath) }) it("loads cjs files via DirectoryExportedClassesloader", async () => { const klassPath = [__dirname, "klass.cjs"].join("/") const klass = `module.exports.Widget = class Widget {};` - writeFileSync(klassPath, klass) + let classes: Function[] + + await writeFile(klassPath, klass) + try { + classes = await importClassesFromDirectories( + new LoggerFactory().create(), + [`${__dirname}/*.cjs`], + ) + } finally { + await unlink(klassPath) + } - const classes = await importClassesFromDirectories( - new LoggerFactory().create(), - [`${__dirname}/*.cjs`], - ) expect(classes).to.be.an("Array") expect(classes.length).to.eq(1) - - unlinkSync(klassPath) }) }) diff --git a/test/github-issues/799/issue-799.ts b/test/github-issues/799/issue-799.ts index ae2872b049..838f3c6791 100644 --- a/test/github-issues/799/issue-799.ts +++ b/test/github-issues/799/issue-799.ts @@ -1,9 +1,8 @@ -import "reflect-metadata" -import * as assert from "assert" -import rimraf from "rimraf" +import { expect } from "chai" import { dirname } from "path" import { DataSource } from "../../../src/data-source/DataSource" import { getTypeOrmConfig } from "../../utils/test-utils" +import { rimraf } from "rimraf" describe("github issues > #799 sqlite: 'database' path should be created", () => { let dataSource: DataSource @@ -33,7 +32,7 @@ describe("github issues > #799 sqlite: 'database' path should be created", () => }) await dataSource.initialize() - assert.strictEqual(dataSource.isInitialized, true) + expect(dataSource.isInitialized).to.equal(true) }) it("should create the whole path to database file for better-sqlite3", async function () { @@ -50,6 +49,6 @@ describe("github issues > #799 sqlite: 'database' path should be created", () => }) await dataSource.initialize() - assert.strictEqual(dataSource.isInitialized, true) + expect(dataSource.isInitialized).to.equal(true) }) }) diff --git a/test/github-issues/8975/issue-8975.ts b/test/github-issues/8975/issue-8975.ts index 07ddc41264..4b6b5d4e81 100644 --- a/test/github-issues/8975/issue-8975.ts +++ b/test/github-issues/8975/issue-8975.ts @@ -1,8 +1,7 @@ import { expect } from "chai" import { exec } from "child_process" -import { readFileSync, writeFileSync } from "fs" +import { readFile, writeFile, chmod, unlink, rmdir } from "fs/promises" import { dirname } from "path" -import rimraf from "rimraf" describe("cli init command", () => { const cliPath = `${dirname(dirname(dirname(__dirname)))}/src/cli.js` @@ -21,39 +20,33 @@ describe("cli init command", () => { const builtSrcDirectory = "build/compiled/src" before(async () => { - const chmodPromise = new Promise((resolve) => { - exec(`chmod 755 ${cliPath}`, (error, stdout, stderr) => { - expect(error).to.not.exist - expect(stderr).to.be.empty + const chmodCli = async () => { + await expect(chmod(cliPath, 0o755)).to.not.be.rejected + } - resolve() - }) - }) - - const copyPromise = new Promise(async (resolve) => { + const copyPackageJson = async () => { // load package.json from the root of the project const packageJson = JSON.parse( - readFileSync("./package.json", "utf8"), + await readFile("./package.json", "utf8"), ) packageJson.version = `0.0.0` // install no version but packageJson.installFrom = `file:../${builtSrcDirectory}` // use the built src directory // write the modified package.json to the build directory - writeFileSync( + await writeFile( `./${builtSrcDirectory}/package.json`, JSON.stringify(packageJson, null, 4), ) - resolve() - }) + } - await Promise.all([chmodPromise, copyPromise]) + await Promise.all([chmodCli(), copyPackageJson()]) }) after(async () => { - await rimraf(`./${builtSrcDirectory}/package.json`) + await unlink(`./${builtSrcDirectory}/package.json`) }) afterEach(async () => { - await rimraf(`./${testProjectName}`) + await rmdir(`./${testProjectName}`, { recursive: true }) }) for (const databaseOption of databaseOptions) {