Skip to content

FileSystem.makeTempDirectory crashes the program when it fails, instead of failing the task #72

Description

@gilramir

Found against: gren 0.6.6, gren-lang/core 7.4.2, gren-lang/node 6.1.3, node 22
Reproduction: https://github.com/gilramir/gren-bug-reports/tree/main/2026-09-14-maketempdirectory-failure

FileSystem.makeTempDirectory is a Task FileSystem.Error Path, but when node
cannot make the directory the program dies with The "path" argument must be of type string. Received undefined and the program's Task.onError never runs.
Expected: the task fails with an Error whose code is ENOENT (or EPERM, etc). Any failure
reaches it: a missing parent directory, a prefix naming a directory the user
cannot write, or a full temporary directory.

Reproduction

gren.json dependencies: gren-lang/core 7.4.2, gren-lang/node 6.1.3. Save as src/Main.gren. Build and run with gren make Main --output=app && node app:

module Main exposing (main)

import FileSystem
import FileSystem.Path as Path
import Init
import Node
import Stream
import Task


main : Node.SimpleProgram a
main =
    Node.defineSimpleProgram <| \env ->
        Init.await FileSystem.initialize <| \fs ->
            Node.endSimpleProgram
                (FileSystem.makeTempDirectory fs "no-such-directory/x"
                    |> Task.map (\path -> "made " ++ Path.toPosixString path)
                    |> Task.onError (\e -> Task.succeed ("failed: " ++ FileSystem.errorCode e))
                    |> Task.andThen (\line -> Stream.writeLineAsBytes line env.stdout)
                    |> Task.onError (\_ -> Task.succeed env.stdout)
                )

Output:

$ node app
node:internal/errors:540
      throw error;
      ^

TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received undefined
    at Object.normalize (node:path:1309:5)
    at _FilePath_parse (/path/to/app:2889:40)
    at _FilePath_fromString (/path/to/app:2885:10)
    at /path/to/app:3664:40
    at FSReqCallback.oncomplete (node:fs:186:23) {
  code: 'ERR_INVALID_ARG_TYPE'
}

Node.js v22.23.2

Cause

Gren/Kernel/FileSystem.js:

fs.mkdtemp(path.join(os.tmpdir(), prefix), function (err, dir) {
  if (err) {
    callback(
      __Scheduler_fail(
        _FileSystem_constructError(__FilePath_fromString(dir), err),
      ),
    );

On failure dir is undefined, and __FilePath_fromString(undefined) calls
path.normalize(undefined), which throws inside node's callback, where nothing
catches it.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions