Skip to content
This repository was archived by the owner on Jul 30, 2024. It is now read-only.

💥[fs] Dir & Dirent is now Dir[T] & Dirent[T] (parameterized for path name) #354

Merged
merged 1 commit into from
Feb 19, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 34 additions & 29 deletions app/nodejs-v14/src/main/scala/io/scalajs/nodejs/fs/Fs.scala
Original file line number Diff line number Diff line change
Expand Up @@ -528,15 +528,17 @@ trait Fs extends js.Object with FSConstants {
def openSync(path: Path): FileDescriptor = js.native

@enableIf(io.scalajs.nodejs.internal.CompilerSwitches.gteNodeJs12)
def opendir(path: Path, options: OpendirOptions, callback: FsCallback1[Fs.Dir]): Unit = js.native
def opendir(path: Path, options: OpendirOptions, callback: FsCallback1[Fs.Dir[String] | Fs.Dir[Buffer]]): Unit =
js.native

@enableIf(io.scalajs.nodejs.internal.CompilerSwitches.gteNodeJs12)
def opendir(path: Path, callback: FsCallback1[Fs.Dir]): Unit = js.native
def opendir(path: Path, callback: FsCallback1[Fs.Dir[String]]): Unit = js.native

@enableIf(io.scalajs.nodejs.internal.CompilerSwitches.gteNodeJs12) def opendirSync(path: Path,
options: OpendirOptions
): Fs.Dir = js.native
@enableIf(io.scalajs.nodejs.internal.CompilerSwitches.gteNodeJs12) def opendirSync(path: Path): Fs.Dir = js.native
): Fs.Dir[String] | Fs.Dir[Buffer] = js.native
@enableIf(io.scalajs.nodejs.internal.CompilerSwitches.gteNodeJs12) def opendirSync(path: Path): Fs.Dir[String] =
js.native

/** Read data from the file specified by fd.
* @param fd is the file descriptor
Expand Down Expand Up @@ -600,7 +602,7 @@ trait Fs extends js.Object with FSConstants {
* of the names of the files in the directory excluding '.' and '..'.
* @example fs.readdir(path[, options], callback)
*/
def readdir(path: Path, options: String, callback: FsCallback1[js.Array[String]]): Unit = js.native
def readdir(path: Path, options: String, callback: FsCallback1[ReaddirArrays]): Unit = js.native
def readdir(path: Path, options: FileEncodingOptions, callback: FsCallback1[ReaddirArrays]): Unit = js.native
def readdir(path: Path, options: ReaddirOptions, callback: FsCallback1[ReaddirArrays2]): Unit = js.native
def readdir(path: Path, callback: FsCallback1[js.Array[String]]): Unit = js.native
Expand All @@ -613,9 +615,10 @@ trait Fs extends js.Object with FSConstants {
* to 'buffer', the filenames returned will be passed as Buffer objects.
* @return an array of filenames excluding '.' and '..'.
*/
def readdirSync(path: Path, options: String): js.Array[String] = js.native
def readdirSync(path: Path, options: ReaddirOptions): js.Array[String] = js.native
def readdirSync(path: Path): js.Array[String] = js.native
def readdirSync(path: Path, options: String): ReaddirArrays = js.native
def readdirSync(path: Path, options: FileEncodingOptions): ReaddirArrays = js.native
def readdirSync(path: Path, options: ReaddirOptions): ReaddirArrays2 = js.native
def readdirSync(path: Path): js.Array[String] = js.native

/** Asynchronously reads the entire contents of a file.
* @param file filename or file descriptor
Expand Down Expand Up @@ -1108,18 +1111,20 @@ object Fs extends Fs {
def open(path: Path): js.Promise[FileHandle] = js.native
@enableIf(io.scalajs.nodejs.internal.CompilerSwitches.gteNodeJs12) def opendir(path: Path,
options: OpendirOptions
): js.Promise[Dir] = js.native
@enableIf(io.scalajs.nodejs.internal.CompilerSwitches.gteNodeJs12) def opendir(path: Path): js.Promise[Dir] =
): js.Promise[Dir[String] | Dir[Buffer]] = js.native
@enableIf(io.scalajs.nodejs.internal.CompilerSwitches.gteNodeJs12) def opendir(
path: Path
): js.Promise[Dir[String]] =
js.native
def readdir(path: Path, options: ReaddirOptions): js.Promise[js.Array[String] | js.Array[Dirent]] = js.native
def readdir(path: Path, encoding: String): js.Promise[js.Array[String]] = js.native
def readdir(path: Path, options: FileEncodingOptions): js.Promise[js.Array[String]] = js.native
def readdir(path: Path): js.Promise[js.Array[String]] = js.native
def readlink(path: Path): js.Promise[String] = js.native
def readlink(path: Path, options: String): js.Promise[Output] = js.native
def readlink(path: Path, options: FileEncodingOptions): js.Promise[Output] = js.native
def rename(oldPath: Path, newPath: Path): js.Promise[Unit] = js.native
def rmdir(path: Path): js.Promise[Unit] = js.native
def readdir(path: Path, options: ReaddirOptions): js.Promise[ReaddirArrays2] = js.native
def readdir(path: Path, encoding: String): js.Promise[ReaddirArrays] = js.native
def readdir(path: Path, options: FileEncodingOptions): js.Promise[ReaddirArrays] = js.native
def readdir(path: Path): js.Promise[js.Array[String]] = js.native
def readlink(path: Path): js.Promise[String] = js.native
def readlink(path: Path, options: String): js.Promise[Output] = js.native
def readlink(path: Path, options: FileEncodingOptions): js.Promise[Output] = js.native
def rename(oldPath: Path, newPath: Path): js.Promise[Unit] = js.native
def rmdir(path: Path): js.Promise[Unit] = js.native
@enableIf(io.scalajs.nodejs.internal.CompilerSwitches.gteNodeJs12)
def rmdir(path: Path, options: RmdirOptions): js.Promise[Unit] = js.native
def stat(path: Path, options: StatOptions): js.Promise[StatsVariant] = js.native
Expand Down Expand Up @@ -1194,27 +1199,27 @@ object Fs extends Fs {
val promises: FsPromises = js.native

@js.native
class Dirent() extends js.Object {
class Dirent[TName]() extends js.Object {
def isBlockDevice(): Boolean = js.native
def isCharacterDevice(): Boolean = js.native
def isDirectory(): Boolean = js.native
def isFIFO(): Boolean = js.native
def isFile(): Boolean = js.native
def isSocket(): Boolean = js.native
def isSymbolicLink(): Boolean = js.native
val name: String | Buffer = js.native
val name: TName = js.native
}

@enableMembersIf(io.scalajs.nodejs.internal.CompilerSwitches.gteNodeJs12)
@js.native
trait Dir extends js.Object {
def close(): js.Promise[Unit] = js.native
def close(callback: js.Function1[js.Error, Any]): Unit = js.native
def closeSync(): Unit = js.native
def path: String = js.native
def read(): js.Promise[Dirent] = js.native
def read(callback: js.Function2[js.Error, Dirent, Any]): Unit = js.native
def readSync(): Dirent = js.native
trait Dir[T] extends js.Object {
def close(): js.Promise[Unit] = js.native
def close(callback: js.Function1[js.Error, Any]): Unit = js.native
def closeSync(): Unit = js.native
def path: String = js.native
def read(): js.Promise[Dirent[T]] = js.native
def read(callback: js.Function2[js.Error, Dirent[T], Any]): Unit = js.native
def readSync(): Dirent[T] = js.native

// TODO: Implement AsyncIterable[Dirent]
}
Expand Down
68 changes: 46 additions & 22 deletions app/nodejs-v14/src/main/scala/io/scalajs/nodejs/fs/package.scala
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ package object fs {
type FileWriteOptions = FileAppendOptions

type ReaddirArrays = js.Array[String] | js.Array[Buffer]
type ReaddirArrays2 = ReaddirArrays | js.Array[fs.Dirent]
type ReaddirArrays2 = ReaddirArrays | js.Array[fs.Dirent[String]] | js.Array[fs.Dirent[Buffer]]

type Dirent = Fs.Dirent
type Dirent[T] = Fs.Dirent[T]

type StatsVariant = Stats | BigIntStats

Expand Down Expand Up @@ -221,14 +221,14 @@ package object fs {

@enableIf(io.scalajs.nodejs.internal.CompilerSwitches.gteNodeJs12)
@inline
def opendirFuture(path: Path, options: OpendirOptions): Future[Fs.Dir] = {
promiseWithError1[FileIOError, Fs.Dir](instance.opendir(path, options, _))
def opendirFuture(path: Path, options: OpendirOptions): Future[Fs.Dir[String] | Fs.Dir[Buffer]] = {
promiseWithError1[FileIOError, Fs.Dir[String] | Fs.Dir[Buffer]](instance.opendir(path, options, _))
}

@enableIf(io.scalajs.nodejs.internal.CompilerSwitches.gteNodeJs12)
@inline
def opendirFuture(path: Path): Future[Fs.Dir] = {
promiseWithError1[FileIOError, Fs.Dir](instance.opendir(path, _))
def opendirFuture(path: Path): Future[Fs.Dir[String]] = {
promiseWithError1[FileIOError, Fs.Dir[String]](instance.opendir(path, _))
}

@inline
Expand All @@ -242,8 +242,8 @@ package object fs {
}

@inline
def readdirFuture(path: Path, encoding: String): Future[js.Array[String]] = {
promiseWithError1[FileIOError, js.Array[String]](instance.readdir(path, encoding, _))
def readdirFuture(path: Path, encoding: String): Future[ReaddirArrays] = {
promiseWithError1[FileIOError, ReaddirArrays](instance.readdir(path, encoding, _))
}

@inline
Expand All @@ -252,11 +252,8 @@ package object fs {
}

@inline
def readdirFuture(path: Path, options: FileEncodingOptions): Future[js.Array[String]] = {
val callback: FsCallback1[js.Array[String]] => Unit = { callback =>
instance.readdir(path, options, callback.asInstanceOf[FsCallback1[ReaddirArrays]])
}
promiseWithError1[FileIOError, js.Array[String]](callback)
def readdirFuture(path: Path, options: FileEncodingOptions): Future[ReaddirArrays] = {
promiseWithError1[FileIOError, ReaddirArrays](instance.readdir(path, options, _))
}

@inline
Expand All @@ -272,26 +269,53 @@ package object fs {
}

@inline
def readdirDirentFuture(path: Buffer): Future[js.Array[Dirent]] = {
val callback: FsCallback1[js.Array[Dirent]] => Unit = { callback =>
def readdirDirentFuture(path: Buffer): Future[js.Array[Dirent[String]]] = {
val callback: FsCallback1[js.Array[Dirent[String]]] => Unit = { callback =>
instance.readdir(
path,
ReaddirOptions(withFileTypes = true),
callback.asInstanceOf[FsCallback1[ReaddirArrays2]]
)
}
promiseWithError1[FileIOError, js.Array[Dirent]](callback)
promiseWithError1[FileIOError, js.Array[Dirent[String]]](callback)
}
@inline
def readdirDirentFuture(path: String): Future[js.Array[Dirent]] = {
val callback: FsCallback1[js.Array[Dirent]] => Unit = { callback =>
def readdirDirentFuture(path: String): Future[js.Array[Dirent[String]]] = {
val callback: FsCallback1[js.Array[Dirent[String]]] => Unit = { callback =>
instance.readdir(
path,
ReaddirOptions(withFileTypes = true),
callback.asInstanceOf[FsCallback1[ReaddirArrays2]]
)
}
promiseWithError1[FileIOError, js.Array[Dirent]](callback)
promiseWithError1[FileIOError, js.Array[Dirent[String]]](callback)
}

@inline
def readdirDirentFuture(path: Buffer,
encoding: String
): Future[js.Array[Dirent[String]] | js.Array[Dirent[Buffer]]] = {
val callback: FsCallback1[js.Array[Dirent[String]]] => Unit = { callback =>
instance.readdir(
path,
ReaddirOptions(withFileTypes = true, encoding = encoding),
callback.asInstanceOf[FsCallback1[ReaddirArrays2]]
)
}
promiseWithError1[FileIOError, js.Array[Dirent[String]]](callback)
}
@inline
def readdirDirentFuture(path: String,
encoding: String
): Future[js.Array[Dirent[String]] | js.Array[Dirent[Buffer]]] = {
val callback: FsCallback1[js.Array[Dirent[String]]] => Unit = { callback =>
instance.readdir(
path,
ReaddirOptions(withFileTypes = true, encoding = encoding),
callback.asInstanceOf[FsCallback1[ReaddirArrays2]]
)
}
promiseWithError1[FileIOError, js.Array[Dirent[String]]](callback)
}

@inline
Expand Down Expand Up @@ -531,11 +555,11 @@ package object fs {
*
* @param instance the given [[Fs.Dir]] instance
*/
implicit final class FsDirExtensions(private val instance: Fs.Dir) extends AnyVal {
implicit final class FsDirExtensions[T](private val instance: Fs.Dir[T]) extends AnyVal {
@enableIf(io.scalajs.nodejs.internal.CompilerSwitches.gteNodeJs12)
@inline
def readFuture(): Future[Option[Fs.Dirent]] = {
promiseWithError1[js.Error, Option[Fs.Dirent]](f => {
def readFuture(): Future[Option[Fs.Dirent[T]]] = {
promiseWithError1[js.Error, Option[Fs.Dirent[T]]](f => {
instance.read((err, dir) => {
f(err, Option(dir))
})
Expand Down