From 384a660df2d92f085d2598df140c92b4c09b3530 Mon Sep 17 00:00:00 2001 From: David Koontz Date: Thu, 30 Jul 2026 23:08:21 -0700 Subject: [PATCH 1/2] Add integration test for FileSystem + test case and fix for Append bug --- integration-tests/file-system/.gitignore | 3 + integration-tests/file-system/Makefile | 17 + integration-tests/file-system/bin/.gitkeep | 0 integration-tests/file-system/gren.json | 17 + .../gren_lang_core__7_0_0.pkg.gz | Bin 0 -> 103277 bytes .../gren_packages/gren_lang_url__6_0_0.pkg.gz | Bin 0 -> 9218 bytes .../file-system/package-lock.json | 935 ++++++++++++++++++ integration-tests/file-system/package.json | 8 + integration-tests/file-system/src/Main.gren | 95 ++ .../file-system/test/requests.mjs | 22 + integration-tests/run-tests.sh | 5 + src/Gren/Kernel/FileSystem.js | 2 +- 12 files changed, 1103 insertions(+), 1 deletion(-) create mode 100644 integration-tests/file-system/.gitignore create mode 100644 integration-tests/file-system/Makefile create mode 100644 integration-tests/file-system/bin/.gitkeep create mode 100644 integration-tests/file-system/gren.json create mode 100644 integration-tests/file-system/gren_packages/gren_lang_core__7_0_0.pkg.gz create mode 100644 integration-tests/file-system/gren_packages/gren_lang_url__6_0_0.pkg.gz create mode 100644 integration-tests/file-system/package-lock.json create mode 100644 integration-tests/file-system/package.json create mode 100644 integration-tests/file-system/src/Main.gren create mode 100644 integration-tests/file-system/test/requests.mjs diff --git a/integration-tests/file-system/.gitignore b/integration-tests/file-system/.gitignore new file mode 100644 index 0000000..fe15217 --- /dev/null +++ b/integration-tests/file-system/.gitignore @@ -0,0 +1,3 @@ +app +.gren +node_modules/ diff --git a/integration-tests/file-system/Makefile b/integration-tests/file-system/Makefile new file mode 100644 index 0000000..f35ef35 --- /dev/null +++ b/integration-tests/file-system/Makefile @@ -0,0 +1,17 @@ +KERNEL_SOURCES := $(wildcard ../../src/Gren/Kernel/*.js) + +bin/app: Makefile gren.json src/Main.gren $(KERNEL_SOURCES) + gren make --optimize Main --output=bin/app + +.PHONY: test +test: bin/app node_modules + npm test + +node_modules: package.json package-lock.json + npm ci + +.PHONY: clean +clean: + rm -rf .gren + rm -rf node_modules + rm bin/app diff --git a/integration-tests/file-system/bin/.gitkeep b/integration-tests/file-system/bin/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/integration-tests/file-system/gren.json b/integration-tests/file-system/gren.json new file mode 100644 index 0000000..9bf7c12 --- /dev/null +++ b/integration-tests/file-system/gren.json @@ -0,0 +1,17 @@ +{ + "type": "application", + "platform": "node", + "source-directories": [ + "src" + ], + "gren-version": "0.6.5", + "dependencies": { + "direct": { + "gren-lang/core": "7.0.0", + "gren-lang/node": "local:../.." + }, + "indirect": { + "gren-lang/url": "6.0.0" + } + } +} diff --git a/integration-tests/file-system/gren_packages/gren_lang_core__7_0_0.pkg.gz b/integration-tests/file-system/gren_packages/gren_lang_core__7_0_0.pkg.gz new file mode 100644 index 0000000000000000000000000000000000000000..5ef93cbdd5609500ca1cf7378569496e7aa00d19 GIT binary patch literal 103277 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 literal 0 HcmV?d00001 diff --git a/integration-tests/file-system/gren_packages/gren_lang_url__6_0_0.pkg.gz b/integration-tests/file-system/gren_packages/gren_lang_url__6_0_0.pkg.gz new file mode 100644 index 0000000000000000000000000000000000000000..f6e28d88d9f969c16e3c6aca740cd9434e413af4 GIT binary patch literal 9218 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" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "license": "ISC" + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/diff": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", + "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", + "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "16.2.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.2.tgz", + "integrity": "sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/integration-tests/file-system/package.json b/integration-tests/file-system/package.json new file mode 100644 index 0000000..b482f21 --- /dev/null +++ b/integration-tests/file-system/package.json @@ -0,0 +1,8 @@ +{ + "scripts": { + "test": "mocha" + }, + "devDependencies": { + "mocha": "^10.2.0" + } +} diff --git a/integration-tests/file-system/src/Main.gren b/integration-tests/file-system/src/Main.gren new file mode 100644 index 0000000..0ac2be3 --- /dev/null +++ b/integration-tests/file-system/src/Main.gren @@ -0,0 +1,95 @@ +module Main exposing (main) + +import Bytes exposing (Bytes) +import FileSystem +import FileSystem.Path as Path +import Init +import Node +import Stream +import Stream.Log +import Task exposing (Task) + + +type alias Model = + { } + + +type Msg + = NoOp + + +main : Node.Program Model Msg +main = + Node.defineProgram + { init = init + , update = update + , subscriptions = \_ -> Sub.none + } + + +init : Node.Environment -> Init.Task { model : Model, command : Cmd Msg } +init env = + Init.await FileSystem.initialize <| \fsPerm -> + Node.startProgram <| + when Array.get 2 env.args is + Just "Append" -> + { model = {} + , command = + FileSystem.tmpDirectory fsPerm + |> Task.map targetFile + |> Task.andThen (append fsPerm) + |> Task.map (\_ -> Cmd.none) + |> Task.onError + (\err -> + Stream.Log.line env.stdout ("APPEND_FAIL: " ++ err) + |> Task.map (\_ -> Node.exitWithCode 1) + ) + |> Task.executeCmd + } + + _ -> + { model = {} + , command = + Stream.Log.line env.stdout "Invalid start argument" + |> Task.execute + } + + +update : Msg -> Model -> { model : Model, command : Cmd Msg } +update _msg model = + { model = model + , command = Cmd.none + } + + + +-- TESTS +-- +-- Each test is selected by a start argument (e.g. `node app Append`). The target +-- file is baked into the test, not passed in; the runner sets it up and verifies +-- it (see test/*.mjs). + + +{-| `writeFileStream Append` must open the file for appending and stay usable. + +`Append` maps to `pos = -1` in the JS kernel. Before the fix, that value +reached `fs.createWriteStream` as `start: -1`, which Node rejects with +`ERR_OUT_OF_RANGE`, so opening the stream threw synchronously and the Task +failed. The runner pre-seeds `targetFile` with content; after this app exits it +verifies the written bytes landed after it. +-} +append : FileSystem.Permission -> Path.Path -> Task String {} +append fsPerm target = + FileSystem.writeFileStream fsPerm FileSystem.Append target + |> Task.mapError FileSystem.errorToString + |> Task.andThen + (\writable -> + Stream.write (Bytes.fromString "second\n") writable + |> Task.andThen (\_ -> Stream.closeWritable writable) + |> Task.mapError Stream.errorToString + ) + + +targetFile : Path.Path -> Path.Path +targetFile dir = + Path.appendPosixString "gren-file-system-append.txt" dir diff --git a/integration-tests/file-system/test/requests.mjs b/integration-tests/file-system/test/requests.mjs new file mode 100644 index 0000000..a59df7b --- /dev/null +++ b/integration-tests/file-system/test/requests.mjs @@ -0,0 +1,22 @@ +import assert from "node:assert/strict"; +import { fork } from "node:child_process"; +import * as fs from "node:fs"; +import * as os from "node:os"; +import * as path from "node:path"; + +const app = path.resolve("bin/app"); +// Matches the path baked into the Gren app (FileSystem.tmpDirectory + filename). +const file = path.join(os.tmpdir(), "gren-file-system-append.txt"); + +describe("FileSystem", () => { + it("appends written bytes after existing content", (done) => { + fs.writeFileSync(file, "first\n"); + const child = fork(app, ["Append"], { silent: true }); + child.on("exit", (code) => { + assert.equal(code, 0); + assert.equal(fs.readFileSync(file, "utf8"), "first\nsecond\n"); + if (fs.existsSync(file)) fs.unlinkSync(file); + done(); + }); + }); +}); diff --git a/integration-tests/run-tests.sh b/integration-tests/run-tests.sh index c552428..6d30690 100755 --- a/integration-tests/run-tests.sh +++ b/integration-tests/run-tests.sh @@ -17,6 +17,11 @@ pushd signals make test || exit 1 popd +echo -e "Running file-system tests...\n\n" +pushd file-system +make test || exit 1 +popd + echo -e "Running child-process tests...\n\n" pushd child-process make test || exit 1 diff --git a/src/Gren/Kernel/FileSystem.js b/src/Gren/Kernel/FileSystem.js index 73598c9..8371bee 100644 --- a/src/Gren/Kernel/FileSystem.js +++ b/src/Gren/Kernel/FileSystem.js @@ -665,7 +665,7 @@ var _FileSystem_writeFileStream = F2(function (pos, path) { try { var fstream = fs.createWriteStream(__FilePath_toString(path), { flags: pos === 0 ? "w" : pos === -1 ? "a" : "r+", - start: pos === 0 ? undefined : pos, + start: pos <= 0 ? undefined : pos, }); callback(__Scheduler_succeed(stream.Writable.toWeb(fstream))); } catch (err) { From 966c111042f71e49dbadadb3c21e5b4acbe9af34 Mon Sep 17 00:00:00 2001 From: David Koontz Date: Fri, 31 Jul 2026 02:15:19 -0700 Subject: [PATCH 2/2] FileSystem test cases, fix writeFileStream with ReplaceFrom option bug --- integration-tests/file-system/src/Main.gren | 221 ++++++++++++++++-- .../file-system/test/requests.mjs | 189 ++++++++++++++- src/Gren/Kernel/FileSystem.js | 17 +- 3 files changed, 390 insertions(+), 37 deletions(-) diff --git a/integration-tests/file-system/src/Main.gren b/integration-tests/file-system/src/Main.gren index 0ac2be3..399cc86 100644 --- a/integration-tests/file-system/src/Main.gren +++ b/integration-tests/file-system/src/Main.gren @@ -29,24 +29,154 @@ main = init : Node.Environment -> Init.Task { model : Model, command : Cmd Msg } init env = + let + toCmd : Task String a -> Cmd Msg + toCmd task = + task + |> Task.map (\_ -> Cmd.none) + |> Task.onError + (\err -> + Stream.Log.line env.stdout ("FAIL: " ++ err) + |> Task.map (\_ -> Node.exitWithCode 1) + ) + |> Task.executeCmd + in Init.await FileSystem.initialize <| \fsPerm -> Node.startProgram <| when Array.get 2 env.args is + Just "WriteFile" -> + { model = {} + , command = + getTempFilePath fsPerm "gren-fs-write.txt" + |> Task.andThen + (\target -> + FileSystem.writeFile fsPerm (Bytes.fromString "write-content\n") target + |> Task.mapError FileSystem.errorToString + ) + |> toCmd + } + + Just "AppendToFile" -> + { model = {} + , command = + getTempFilePath fsPerm "gren-fs-appendto.txt" + |> Task.andThen + (\target -> + FileSystem.appendToFile fsPerm (Bytes.fromString "tail\n") target + |> Task.mapError FileSystem.errorToString + ) + |> toCmd + } + + Just "WriteFileStreamReplace" -> + { model = {} + , command = + getTempFilePath fsPerm "gren-fs-wfs-replace.txt" + |> Task.andThen (writeFileStreamTest fsPerm FileSystem.Replace "replace\n") + |> toCmd + } + + Just "WriteFileStreamReplaceFrom" -> + { model = {} + , command = + getTempFilePath fsPerm "gren-fs-wfs-replacefrom.txt" + |> Task.andThen (writeFileStreamTest fsPerm (FileSystem.ReplaceFrom 3) "XY") + |> toCmd + } + Just "Append" -> + { model = {} + , command = + getTempFilePath fsPerm "gren-file-system-append.txt" + |> Task.andThen (writeFileStreamTest fsPerm FileSystem.Append "second\n") + |> toCmd + } + + Just "TruncateFile" -> + { model = {} + , command = + getTempFilePath fsPerm "gren-fs-truncate.txt" + |> Task.andThen + (\target -> + FileSystem.truncateFile fsPerm 4 target + |> Task.mapError FileSystem.errorToString + ) + |> toCmd + } + + Just "TruncateFilePad" -> + { model = {} + , command = + getTempFilePath fsPerm "gren-fs-truncate-pad.txt" + |> Task.andThen + (\target -> + FileSystem.truncateFile fsPerm 4 target + |> Task.mapError FileSystem.errorToString + ) + |> toCmd + } + + Just "CopyFile" -> { model = {} , command = FileSystem.tmpDirectory fsPerm - |> Task.map targetFile - |> Task.andThen (append fsPerm) - |> Task.map (\_ -> Cmd.none) - |> Task.onError - (\err -> - Stream.Log.line env.stdout ("APPEND_FAIL: " ++ err) - |> Task.map (\_ -> Node.exitWithCode 1) + |> Task.mapError (\_ -> "Unable to resolve tmp directory") + |> Task.map + (\dir -> + { src = Path.appendPosixString "gren-fs-copy-src.txt" dir + , dest = Path.appendPosixString "gren-fs-copy-dst.txt" dir + } + ) + |> Task.andThen + (\{ src, dest } -> + FileSystem.copyFile fsPerm dest src + |> Task.mapError FileSystem.errorToString ) - |> Task.executeCmd + |> toCmd } + Just "Remove" -> + { model = {} + , command = + getTempFilePath fsPerm "gren-fs-remove.txt" + |> Task.andThen + (\target -> + FileSystem.remove fsPerm { recursive = False } target + |> Task.mapError FileSystem.errorToString + ) + |> toCmd + } + + Just "ReadFile" -> + { model = {} + , command = + getTempFilePath fsPerm "gren-fs-read.txt" + |> Task.andThen + (\target -> + FileSystem.readFile fsPerm target + |> Task.mapError FileSystem.errorToString + ) + |> Task.andThen + (\bytes -> + when Bytes.toString bytes is + Just s -> + writeStdout env s + + Nothing -> + Task.fail "Failed to decode bytes to string" + ) + |> toCmd + } + + Just "ReadFileStreamBeginning" -> + { model = {}, command = testReadFileStream env fsPerm FileSystem.Beginning |> toCmd } + + Just "ReadFileStreamFrom" -> + { model = {}, command = testReadFileStream env fsPerm (FileSystem.From 2) |> toCmd } + + Just "ReadFileStreamBetween" -> + { model = {}, command = testReadFileStream env fsPerm (FileSystem.Between { start = 1, end = 3 }) |> toCmd } + _ -> { model = {} , command = @@ -63,33 +193,74 @@ update _msg model = --- TESTS +-- TEST RUNNER -- --- Each test is selected by a start argument (e.g. `node app Append`). The target --- file is baked into the test, not passed in; the runner sets it up and verifies --- it (see test/*.mjs). +-- Each test is selected by a start argument (e.g. `node app WriteFile`). The +-- target file(s) live in the OS temp directory; their names are baked into the +-- test and mirrored by the runner (see test/requests.mjs), which sets up the +-- preconditions and verifies the outcome. +-- +-- Write-style tests succeed by reaching the end of their task (the program then +-- exits 0 once the event loop drains). Read-style tests report their result by +-- writing it to stdout, which the runner captures. Any failure is mapped to a +-- logged message and exit code 1. + + +getTempFilePath : FileSystem.Permission -> String -> Task String Path.Path +getTempFilePath fsPerm name = + FileSystem.tmpDirectory fsPerm + |> Task.map (Path.appendPosixString name) + |> Task.mapError (\_ -> "Unable to resolve tmp directory") -{-| `writeFileStream Append` must open the file for appending and stay usable. +writeStdout : Node.Environment -> String -> Task String {} +writeStdout env str = + Stream.writeStringAsBytes str env.stdout + |> Task.map (\_ -> {}) + |> Task.mapError Stream.errorToString -`Append` maps to `pos = -1` in the JS kernel. Before the fix, that value -reached `fs.createWriteStream` as `start: -1`, which Node rejects with -`ERR_OUT_OF_RANGE`, so opening the stream threw synchronously and the Task -failed. The runner pre-seeds `targetFile` with content; after this app exits it -verifies the written bytes landed after it. + +{-| Shared by the three `writeFileStream` modes: open the stream, write the +payload, then close it. -} -append : FileSystem.Permission -> Path.Path -> Task String {} -append fsPerm target = - FileSystem.writeFileStream fsPerm FileSystem.Append target +writeFileStreamTest : FileSystem.Permission -> FileSystem.WriteFileStreamMode -> String -> Path.Path -> Task String {} +writeFileStreamTest fsPerm mode payload target = + FileSystem.writeFileStream fsPerm mode target |> Task.mapError FileSystem.errorToString |> Task.andThen (\writable -> - Stream.write (Bytes.fromString "second\n") writable + Stream.write (Bytes.fromString payload) writable |> Task.andThen (\_ -> Stream.closeWritable writable) |> Task.mapError Stream.errorToString ) -targetFile : Path.Path -> Path.Path -targetFile dir = - Path.appendPosixString "gren-file-system-append.txt" dir +{-| Shared by the three `readFileStream` modes: open the stream, drain it to a +string, then report it on stdout. +-} +testReadFileStream : Node.Environment -> FileSystem.Permission -> FileSystem.ReadFileStreamMode -> Task String {} +testReadFileStream env fsPerm mode = + getTempFilePath fsPerm "gren-fs-readstream.txt" + |> Task.andThen + (\target -> + FileSystem.readFileStream fsPerm mode target + |> Task.mapError FileSystem.errorToString + ) + |> Task.andThen readAllToString + |> Task.andThen (writeStdout env) + + +readAllToString : Stream.Readable Bytes -> Task String String +readAllToString stream = + Stream.readUntilClosed + (\bytes acc -> + when Bytes.toString bytes is + Just s -> + Ok (acc ++ s) + + Nothing -> + Err "Failed to decode bytes to string" + ) + "" + stream + |> Task.mapError Stream.errorToString diff --git a/integration-tests/file-system/test/requests.mjs b/integration-tests/file-system/test/requests.mjs index a59df7b..9b76227 100644 --- a/integration-tests/file-system/test/requests.mjs +++ b/integration-tests/file-system/test/requests.mjs @@ -5,18 +5,185 @@ import * as os from "node:os"; import * as path from "node:path"; const app = path.resolve("bin/app"); -// Matches the path baked into the Gren app (FileSystem.tmpDirectory + filename). -const file = path.join(os.tmpdir(), "gren-file-system-append.txt"); +const tmp = os.tmpdir(); + +// File names baked into the Gren app (see src/Main.gren). Mirrored here so the +// runner can set up preconditions and verify outcomes. +const file = { + writeFile: path.join(tmp, "gren-fs-write.txt"), + appendToFile: path.join(tmp, "gren-fs-appendto.txt"), + wfsReplace: path.join(tmp, "gren-fs-wfs-replace.txt"), + wfsReplaceFrom: path.join(tmp, "gren-fs-wfs-replacefrom.txt"), + append: path.join(tmp, "gren-file-system-append.txt"), + truncate: path.join(tmp, "gren-fs-truncate.txt"), + truncatePad: path.join(tmp, "gren-fs-truncate-pad.txt"), + copySrc: path.join(tmp, "gren-fs-copy-src.txt"), + copyDst: path.join(tmp, "gren-fs-copy-dst.txt"), + remove: path.join(tmp, "gren-fs-remove.txt"), + readFile: path.join(tmp, "gren-fs-read.txt"), + readStream: path.join(tmp, "gren-fs-readstream.txt"), +}; + +// Fork the app with the given test argument, collecting all output. Resolves on +// "close" so every stdout/stderr byte is captured before we assert. +function run(arg) { + return new Promise((resolve) => { + const child = fork(app, [arg], { silent: true }); + let stdout = ""; + let stderr = ""; + child.stdout.on("data", (d) => (stdout += d.toString())); + child.stderr.on("data", (d) => (stderr += d.toString())); + child.on("close", (code) => resolve({ code, stdout, stderr })); + }); +} + +function cleanup(...files) { + for (const f of files) if (fs.existsSync(f)) fs.unlinkSync(f); +} describe("FileSystem", () => { - it("appends written bytes after existing content", (done) => { - fs.writeFileSync(file, "first\n"); - const child = fork(app, ["Append"], { silent: true }); - child.on("exit", (code) => { - assert.equal(code, 0); - assert.equal(fs.readFileSync(file, "utf8"), "first\nsecond\n"); - if (fs.existsSync(file)) fs.unlinkSync(file); - done(); - }); + it("writeFile writes bytes to a file", async () => { + const { code, stderr } = await run("WriteFile"); + try { + assert.equal(code, 0, `app exited ${code}\n${stderr}`); + assert.equal(fs.readFileSync(file.writeFile, "utf8"), "write-content\n"); + } finally { + cleanup(file.writeFile); + } + }); + + it("appendToFile adds bytes after existing content", async () => { + fs.writeFileSync(file.appendToFile, "head\n"); + const { code, stderr } = await run("AppendToFile"); + try { + assert.equal(code, 0, `app exited ${code}\n${stderr}`); + assert.equal(fs.readFileSync(file.appendToFile, "utf8"), "head\ntail\n"); + } finally { + cleanup(file.appendToFile); + } + }); + + it("writeFileStream Replace overwrites the whole file", async () => { + fs.writeFileSync(file.wfsReplace, "XXXXXXXXXX"); + const { code, stderr } = await run("WriteFileStreamReplace"); + try { + assert.equal(code, 0, `app exited ${code}\n${stderr}`); + assert.equal(fs.readFileSync(file.wfsReplace, "utf8"), "replace\n"); + } finally { + cleanup(file.wfsReplace); + } + }); + + it("writeFileStream ReplaceFrom keeps the prefix then writes", async () => { + fs.writeFileSync(file.wfsReplaceFrom, "abcdef"); + const { code, stderr } = await run("WriteFileStreamReplaceFrom"); + try { + assert.equal(code, 0, `app exited ${code}\n${stderr}`); + assert.equal(fs.readFileSync(file.wfsReplaceFrom, "utf8"), "abcXY"); + } finally { + cleanup(file.wfsReplaceFrom); + } + }); + + it("writeFileStream Append writes after existing content", async () => { + fs.writeFileSync(file.append, "first\n"); + const { code, stderr } = await run("Append"); + try { + assert.equal(code, 0, `app exited ${code}\n${stderr}`); + assert.equal(fs.readFileSync(file.append, "utf8"), "first\nsecond\n"); + } finally { + cleanup(file.append); + } + }); + + it("truncateFile shrinks the file to the given length", async () => { + fs.writeFileSync(file.truncate, "12345678"); + const { code, stderr } = await run("TruncateFile"); + try { + assert.equal(code, 0, `app exited ${code}\n${stderr}`); + assert.equal(fs.readFileSync(file.truncate, "utf8"), "1234"); + } finally { + cleanup(file.truncate); + } + }); + + it("truncateFile pads a short file with zeroes", async () => { + fs.writeFileSync(file.truncatePad, "ab"); + const { code, stderr } = await run("TruncateFilePad"); + try { + assert.equal(code, 0, `app exited ${code}\n${stderr}`); + assert.deepEqual( + fs.readFileSync(file.truncatePad), + Buffer.from([0x61, 0x62, 0x00, 0x00]), + ); + } finally { + cleanup(file.truncatePad); + } + }); + + it("copyFile copies bytes from src to dest", async () => { + fs.writeFileSync(file.copySrc, "copy-data\n"); + const { code, stderr } = await run("CopyFile"); + try { + assert.equal(code, 0, `app exited ${code}\n${stderr}`); + assert.equal(fs.readFileSync(file.copyDst, "utf8"), "copy-data\n"); + } finally { + cleanup(file.copySrc, file.copyDst); + } + }); + + it("remove deletes the file", async () => { + fs.writeFileSync(file.remove, "anything"); + const { code, stderr } = await run("Remove"); + try { + assert.equal(code, 0, `app exited ${code}\n${stderr}`); + assert.equal(fs.existsSync(file.remove), false); + } finally { + cleanup(file.remove); + } + }); + + it("readFile reads the entire file", async () => { + fs.writeFileSync(file.readFile, "read-content\n"); + const { code, stdout, stderr } = await run("ReadFile"); + try { + assert.equal(code, 0, `app exited ${code}\n${stderr}`); + assert.equal(stdout, "read-content\n"); + } finally { + cleanup(file.readFile); + } + }); + + it("readFileStream Beginning reads the whole file", async () => { + fs.writeFileSync(file.readStream, "abcdef"); + const { code, stdout, stderr } = await run("ReadFileStreamBeginning"); + try { + assert.equal(code, 0, `app exited ${code}\n${stderr}`); + assert.equal(stdout, "abcdef"); + } finally { + cleanup(file.readStream); + } + }); + + it("readFileStream From reads from an offset to the end", async () => { + fs.writeFileSync(file.readStream, "abcdef"); + const { code, stdout, stderr } = await run("ReadFileStreamFrom"); + try { + assert.equal(code, 0, `app exited ${code}\n${stderr}`); + assert.equal(stdout, "cdef"); + } finally { + cleanup(file.readStream); + } + }); + + it("readFileStream Between reads an inclusive range", async () => { + fs.writeFileSync(file.readStream, "abcdef"); + const { code, stdout, stderr } = await run("ReadFileStreamBetween"); + try { + assert.equal(code, 0, `app exited ${code}\n${stderr}`); + assert.equal(stdout, "bcd"); + } finally { + cleanup(file.readStream); + } }); }); diff --git a/src/Gren/Kernel/FileSystem.js b/src/Gren/Kernel/FileSystem.js index 8371bee..c41cad2 100644 --- a/src/Gren/Kernel/FileSystem.js +++ b/src/Gren/Kernel/FileSystem.js @@ -663,10 +663,25 @@ var _FileSystem_writeFile = F2(function (data, path) { var _FileSystem_writeFileStream = F2(function (pos, path) { return __Scheduler_binding(function (callback) { try { - var fstream = fs.createWriteStream(__FilePath_toString(path), { + var filePath = __FilePath_toString(path); + var fstream = fs.createWriteStream(filePath, { flags: pos === 0 ? "w" : pos === -1 ? "a" : "r+", start: pos <= 0 ? undefined : pos, }); + // pos > 0 means the ReplaceFrom option was used, so we keep the first + // `pos` bytes and replace everything after with the streamed data. + // `createWriteStream` with "r+" and `start` writes at the offset but + // does not truncate trailing bytes, so once the stream has drained we + // truncate the file to the prefix length plus what was written. + if (pos > 0) { + fstream.on("finish", function () { + fs.truncate( + filePath, + pos + fstream.bytesWritten, + (_) => {}, // the handler is ignored because there is currently no way to propogate an error through a custom Writable + ); + }); + } callback(__Scheduler_succeed(stream.Writable.toWeb(fstream))); } catch (err) { callback(__Scheduler_fail(_FileSystem_constructError(path, err)));