26 14:02:34 +0000 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="--_NmP-215108abdd27613f-Part_1" X-DKIM: signer='opencollective.com' status='pass' reason='' DKIMCheck: Server passes DKIM test, 0 Spam score X-Spam-Score: 4.3 (++++) X-Spam-Report: Spam detection software, running on the system "witcher.mxrouting.net", has performed the tests listed below against this email. Information: https://mxroutedocs.com/directadmin/spamfilters/ --- Content analysis details: (4.3 points) --- pts rule name description ---- ---------------------- ----------------------------------------- 0.0 URIBL_BLOCKED ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [URIs: amazonaws.com] 3.0 BODY_CONTAINS_AMAZONAWS BODY: Body contains ".amazonaws.com" 1.5 HTML_MESSAGE BODY: HTML included in message -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature 0.0 RCVD_IN_DNSWL_BLOCKED RBL: ADMINISTRATOR NOTICE: The query to DNSWL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#DnsBlocklists-dnsbl-block for more information. [159.112.241.190 listed in list.dnswl.org] SpamTally: Final spam score: 43 ----_NmP-215108abdd27613f-Part_1 Content-Type: multipart/alternative; boundary="--_NmP-215108abdd27613f-Part_2" ----_NmP-215108abdd27613f-Part_2 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable [https://images.opencollective.com/proxy/images/?src=3Dhttps%3A%2F%2Fopenco= llective-production.s3.us-west-1.amazonaws.com%2Fbcf2cd90-fe5e-11e8-a43f-c3= 617d26bf4e.png&height=3D160] Dear Josephine Pfeiffer, Thank you for your continued support! Your latest monthly contribution of = $25.00 was received on February 2nd 2026. As the collective's fiscal = sponsor, Open Source Collective, a public recognized tax-exempt = organization under IRS Section 501(c)(6), acknowledges your donation. You can follow our future activities and how we will be spending the money = on our open collective page: https://opencollective.com/crystal-lang [https://opencollective.com/crystal-lang]. HELP US RAISE MORE MONEY! See our activities and transparent budget on https://opencollective.= com/crystal-lang/donate [https://opencollective.com/crystal-lang/donate], = and share the link to help us spread the word! =F0=9F=93=8E ATTACHMENTS * A PDF receipt of your contribution to Crystal Language To manage your recurring contributions, Sign in [https://opencollective.= com/dashboard/josielol/outgoing-contributions?status=3DACTIVE&status=3DERRO= R&type=3DRECURRING] and go to your profile page. If you need help, contact = support [support@opencollective.com]. Warmly, Lauren Gardner - Executive = Director Open Source Collective 440 N Barranca Ave #3939 Covina, CA 91723 EIN 82-2037583 [https://opencollective.com/static/images/email/logo-email-= footer@2x.png] https://opencollective.com We can do great things together Come chat with us on our public Discord [https://discord.opencollective.= com]. Made with =E2=9D=A4=EF=B8=8F from all over the world [https://documentation.opencollective.com/our-organization/our-team] ----_NmP-215108abdd27613f-Part_2 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable

Dear Josephine Pfeiffer,

Thank you for your cont= inued support! Your latest monthly contribution of $25.00 was received on = February 2nd 2026. As the collective's fiscal sponsor, Open Source Collective, a public = recognized tax-exempt organization under IRS Section 501(c)(6), acknowledge= s your donation.

You can follow our future a= ctivities and how we will be spending the money on our open collective page= : https://opencollective.com/crystal-lang.

Help us raise more money!

See our activities and tran= sparent budget on https://opencollective.com/crystal-lang/= donate, and share the link to help us spread the word!

=F0=9F=93=8E Attachments

  • A PDF receipt of your contribution to Crystal Language

To manage your recurring contributions, Sign in and go to your profile page.
If you need help, contact support.

Warmly,

Lauren Gardner - Executive Director
Open Source Collective
440 N Barranca Ave #3939
Covina, CA 91723
EIN 82-2037583

We can do great things together

Come chat with us on our public
Discord.

Made with =E2=9D=A4=EF=B8=8F from all over the world
3D"" ----_NmP-215108abdd27613f-Part_2-- ----_NmP-215108abdd27613f-Part_1 Content-Type: application/pdf; name=transaction_crystal-lang_2026-02-02_94e4ee8e-5ffd-4073-923d-d95b4248ea5a.pdf Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename*0=transaction_crystal-lang_2026-02-02_94e4ee8e-5ffd-; filename*1=4073-923d-d95b4248ea5a.pdf JVBERi0xLjMKJf////8KOSAwIG9iago8PAovUyAvVVJJCi9VUkkgKGh0dHBzOi8vb3BlbmNvbGxl Y3RpdmUuY29tL29wZW5zb3VyY2UpCj4+CmVuZG9iagoxMCAwIG9iago8PAovU3VidHlwZSAvTGlu awovQSA5IDAgUgovVHlwZSAvQW5ub3QKL1JlY3QgWzMyIDc4OS43MzY2MDUgNDY1LjUxMyA4MDku ODkwMDE1XQovQm9yZGVyIFswIDAgMF0KL0YgNAo+PgplbmRvYmoKMTEgMCBvYmoKPDwKL1R5cGUg L0V4dEdTdGF0ZQovY2EgMQo+PgplbmRvYmoKMTQgMCBvYmoKPDwKL1MgL1VSSQovVVJJIChodHRw czovL29wZW5jb2xsZWN0aXZlLmNvbS9vcGVuc291cmNlKQo+PgplbmRvYmoKMTUgMCBvYmoKPDwK L1N1YnR5cGUgL0xpbmsKL0EgMTQgMCBSCi9UeXBlIC9Bbm5vdAovUmVjdCBbMzIgNzM3LjQyOTc4 NiA0NjUuNTEzIDc0OS41MzIwNTldCi9Cb3JkZXIgWzAgMCAwXQovRiA0Cj4+CmVuZG9iagoxOCAw IG9iago8PAovUyAvVVJJCi9VUkkgKGh0dHBzOi8vb3Njb2xsZWN0aXZlLm9yZy8pCj4+CmVuZG9i agoxOSAwIG9iago8PAovU3VidHlwZSAvTGluawovQSAxOCAwIFIKL1R5cGUgL0Fubm90Ci9SZWN0 IFsxNDEuODQzMTQgMzIgMjIxLjg0MzE0IDExMl0KL0JvcmRlciBbMCAwIDBdCi9GIDQKPj4KZW5k b2JqCjggMCBvYmoKPDwKL1R5cGUgL1BhZ2UKL1BhcmVudCAxIDAgUgovTWVkaWFCb3ggWzAgMCA1 OTUuMjgwMDI5IDg0MS44OTAwMTVdCi9Db250ZW50cyA2IDAgUgovUmVzb3VyY2VzIDcgMCBSCi9V c2VyVW5pdCAxCi9Bbm5vdHMgWzEwIDAgUiAxNSAwIFIgMTkgMCBSXQo+PgplbmRvYmoKNyAwIG9i ago8PAovUHJvY1NldCBbL1BERiAvVGV4dCAvSW1hZ2VCIC9JbWFnZUMgL0ltYWdlSV0KL0V4dEdT dGF0ZSA8PAovR3MxIDExIDAgUgo+PgovRm9udCA8PAovRjIgMTIgMCBSCi9GMyAxMyAwIFIKL0Yz MiAxNiAwIFIKL0YxIDE3IDAgUgo+PgovWE9iamVjdCA8PAovSTEgMjAgMCBSCj4+Cj4+CmVuZG9i agoyMiAwIG9iagoocmVhY3QtcGRmKQplbmRvYmoKMjMgMCBvYmoKKHJlYWN0LXBkZikKZW5kb2Jq CjI0IDAgb2JqCihEOjIwMjYwMjAyMTQwMjM0WikKZW5kb2JqCjIxIDAgb2JqCjw8Ci9Qcm9kdWNl ciAyMiAwIFIKL0NyZWF0b3IgMjMgMCBSCi9DcmVhdGlvbkRhdGUgMjQgMCBSCj4+CmVuZG9iagox NyAwIG9iago8PAovVHlwZSAvRm9udAovQmFzZUZvbnQgL0hlbHZldGljYQovU3VidHlwZSAvVHlw ZTEKL0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcKPj4KZW5kb2JqCjI2IDAgb2JqCjw8Ci9UeXBl IC9Gb250RGVzY3JpcHRvcgovRm9udE5hbWUgL1NSQUxHSytJbnRlci1Cb2xkCi9GbGFncyA0Ci9G b250QkJveCBbLTc5My4zMjM4NjQgLTMxOS42MDIyNzMgMjU4My4wOTY1OTEgMTA5MC45MDkwOTFd Ci9JdGFsaWNBbmdsZSAwCi9Bc2NlbnQgOTY4Ljc1Ci9EZXNjZW50IC0yNDEuNDc3MjczCi9DYXBI ZWlnaHQgNzI3LjI3MjcyNwovWEhlaWdodCA1NDUuNDU0NTQ1Ci9TdGVtViAwCi9Gb250RmlsZTMg MjUgMCBSCj4+CmVuZG9iagoyNyAwIG9iago8PAovVHlwZSAvRm9udAovU3VidHlwZSAvQ0lERm9u dFR5cGUwCi9CYXNlRm9udCAvU1JBTEdLK0ludGVyLUJvbGQKL0NJRFN5c3RlbUluZm8gPDwKL1Jl Z2lzdHJ5IChBZG9iZSkKL09yZGVyaW5nIChJZGVudGl0eSkKL1N1cHBsZW1lbnQgMAo+PgovRm9u dERlc2NyaXB0b3IgMjYgMCBSCi9XIFswIFsyOTU2IDc4MS45NjAyMjcgNjMyLjQ1NzM4NiA1OTcu NjU2MjUgNjIxLjgwMzk3NyAyMzEuODg5MjA1IDY1NC44Mjk1NDUgNjEzLjYzNjM2NCA2MjEuODAz OTc3IDQwOC43MzU3OTUgNTg3LjM1Nzk1NSA3NTIuMTMwNjgyIDI3Mi4wMTcwNDUgMzg4LjQ5NDMx OCAyNzIuMDE3MDQ1IDU4NS45Mzc1IDY2MC44NjY0NzcgNjQ3LjcyNzI3MyA1ODAuMjU1NjgyIDU4 NS45Mzc1IDkxMS45MzE4MTggNjU2LjI1IDcyNy4yNzI3MjcgNTYxLjc4OTc3MyA3ODIuNjcwNDU1 IDY2OC4zMjM4NjQgNzI0LjQzMTgxOCA3MjkuNDAzNDA5IDU3My44NjM2MzYgNzM1LjA4NTIyNyA3 NDcuODY5MzE4IDU2Ny40NzE1OTEgNjU0LjgyOTU0NSA2MjkuOTcxNTkxIDY0NC41MzEyNSAyOTcu NTg1MjI3IDY4OC4yMTAyMjddXQo+PgplbmRvYmoKMTIgMCBvYmoKPDwKL1R5cGUgL0ZvbnQKL1N1 YnR5cGUgL1R5cGUwCi9CYXNlRm9udCAvU1JBTEdLK0ludGVyLUJvbGQKL0VuY29kaW5nIC9JZGVu dGl0eS1ICi9EZXNjZW5kYW50Rm9udHMgWzI3IDAgUl0KL1RvVW5pY29kZSAyOCAwIFIKPj4KZW5k b2JqCjMwIDAgb2JqCjw8Ci9UeXBlIC9Gb250RGVzY3JpcHRvcgovRm9udE5hbWUgL1VPTUtDRitJ bnRlci1SZWd1bGFyCi9GbGFncyA0Ci9Gb250QkJveCBbLTczOC42MzYzNjQgLTMxOS42MDIyNzMg MjU4My4wOTY1OTEgMTA5MC45MDkwOTFdCi9JdGFsaWNBbmdsZSAwCi9Bc2NlbnQgOTY4Ljc1Ci9E ZXNjZW50IC0yNDEuNDc3MjczCi9DYXBIZWlnaHQgNzI3LjI3MjcyNwovWEhlaWdodCA1NDUuNDU0 NTQ1Ci9TdGVtViAwCi9Gb250RmlsZTMgMjkgMCBSCj4+CmVuZG9iagozMSAwIG9iago8PAovVHlw ZSAvRm9udAovU3VidHlwZSAvQ0lERm9udFR5cGUwCi9CYXNlRm9udCAvVU9NS0NGK0ludGVyLVJl Z3VsYXIKL0NJRFN5c3RlbUluZm8gPDwKL1JlZ2lzdHJ5IChBZG9iZSkKL09yZGVyaW5nIChJZGVu dGl0eSkKL1N1cHBsZW1lbnQgMAo+PgovRm9udERlc2NyaXB0b3IgMzAgMCBSCi9XIFswIFsyODAw IDY0Mi4wNDU0NTUgNjI1IDI4MS4yNSA3NTIuODQwOTA5IDY1MC41NjgxODIgNTYzLjkyMDQ1NSAz NzIuMTU5MDkxIDU4NS4yMjcyNzMgNTU4LjIzODYzNiA2NzYuMTM2MzY0IDU1Ni44MTgxODIgNTgy LjM4NjM2NCA2MzAuNjgxODE4IDYzNi4zNjM2MzYgNjIzLjU3OTU0NSAyNzkuODI5NTQ1IDcyNy4y NzI3MjcgNTk2LjU5MDkwOSAyMzcuMjE1OTA5IDQ2NC40ODg2MzYgNTcxLjAyMjcyNyA2MDUuMTEz NjM2IDc0MS40NzcyNzMgMzYzLjYzNjM2NCA2MjAuNzM4NjM2IDYzNy43ODQwOTEgNTIyLjcyNzI3 MyAzNjAuNzk1NDU1IDg2OS4zMTgxODIgNTkwLjkwOTA5MSA2MDkuMzc1IDI3NS41NjgxODIgMzU2 LjUzNDA5MSAyMzcuMjE1OTA5IDI3NS41NjgxODIgNTgwLjk2NTkwOSA1NDIuNjEzNjM2IDYzNC45 NDMxODIgNjM5LjIwNDU0NSA0NTEuNzA0NTQ1IDYxNi40NzcyNzMgNDYwLjIyNzI3MyA2MDcuOTU0 NTQ1IDQ2MC4yMjcyNzMgNjIwLjczODYzNiA1NTcuNTI4NDA5IDg4OS4yMDQ1NDUgNTk4LjAxMTM2 NCA3MTguNzUgMjY0LjIwNDU0NSA2NDIuMDQ1NDU1IDYyMy41Nzk1NDUgNTYyLjUgNjA5LjM3NSAz NjIuMjE1OTA5IDU0NC4wMzQwOTEgMzYyLjIxNTkwOSA2MzcuNzg0MDkxIDgxMi41XV0KPj4KZW5k b2JqCjEzIDAgb2JqCjw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMAovQmFzZUZvbnQgL1VP TUtDRitJbnRlci1SZWd1bGFyCi9FbmNvZGluZyAvSWRlbnRpdHktSAovRGVzY2VuZGFudEZvbnRz IFszMSAwIFJdCi9Ub1VuaWNvZGUgMzIgMCBSCj4+CmVuZG9iagozNCAwIG9iago8PAovVHlwZSAv Rm9udERlc2NyaXB0b3IKL0ZvbnROYW1lIC9CUFNBSFgrSW50ZXItSXRhbGljCi9GbGFncyA2OAov Rm9udEJCb3ggWy03NDQuMzE4MTgyIC0zMTkuNjAyMjczIDI1OTguMDExMzY0IDEwOTAuOTA5MDkx XQovSXRhbGljQW5nbGUgLTkuMzk5OTk0Ci9Bc2NlbnQgOTY4Ljc1Ci9EZXNjZW50IC0yNDEuNDc3 MjczCi9DYXBIZWlnaHQgNzI3LjI3MjcyNwovWEhlaWdodCA1NDUuNDU0NTQ1Ci9TdGVtViAwCi9G b250RmlsZTMgMzMgMCBSCj4+CmVuZG9iagozNSAwIG9iago8PAovVHlwZSAvRm9udAovU3VidHlw ZSAvQ0lERm9udFR5cGUwCi9CYXNlRm9udCAvQlBTQUhYK0ludGVyLUl0YWxpYwovQ0lEU3lzdGVt SW5mbyA8PAovUmVnaXN0cnkgKEFkb2JlKQovT3JkZXJpbmcgKElkZW50aXR5KQovU3VwcGxlbWVu dCAwCj4+Ci9Gb250RGVzY3JpcHRvciAzNCAwIFIKL1cgWzAgWzI4MDAgNTk4LjAxMTM2NCAyNjQu MjA0NTQ1IDc1Mi44NDA5MDkgMjgxLjI1IDYxNi40NzcyNzMgNjA1LjExMzYzNiA0NjAuMjI3Mjcz IDYyNSA2MzYuMzYzNjM2IDU3MS4wMjI3MjcgNjA3Ljk1NDU0NSA2NDIuMDQ1NDU1IDU5MC45MDkw OTEgMjM3LjIxNTkwOSA1MjIuNzI3MjczIDYwOS4zNzUgNTYzLjkyMDQ1NSA1NTcuNTI4NDA5IDg2 OS4zMTgxODIgNTgzLjgwNjgxOCA1ODUuMjI3MjczIDM2My42MzYzNjQgNTk2LjU5MDkwOSA2MjIu MTU5MDkxIDU4MC45NjU5MDkgNTU4LjIzODYzNiA2MjAuNzM4NjM2IDIzNy4yMTU5MDkgMzczLjU3 OTU0NSAzNjAuNzk1NDU1IDc0MS40NzcyNzMgMjc1LjU2ODE4MiA2MzcuNzg0MDkxIDUzOS43NzI3 MjcgNTU2LjgxODE4MiAyNzkuODI5NTQ1IDM2Mi4yMTU5MDkgODEyLjUgMzYyLjIxNTkwOSA5MzYu MDc5NTQ1IDQ2MC4yMjcyNzMgNjA5LjM3NSAyNzUuNTY4MTgyIDM1Ni41MzQwOTEgNjA5LjM3NSA2 MzAuNjgxODE4XV0KPj4KZW5kb2JqCjE2IDAgb2JqCjw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9U eXBlMAovQmFzZUZvbnQgL0JQU0FIWCtJbnRlci1JdGFsaWMKL0VuY29kaW5nIC9JZGVudGl0eS1I Ci9EZXNjZW5kYW50Rm9udHMgWzM1IDAgUl0KL1RvVW5pY29kZSAzNiAwIFIKPj4KZW5kb2JqCjQg MCBvYmoKPDwKPj4KZW5kb2JqCjMgMCBvYmoKPDwKL1R5cGUgL0NhdGFsb2cKL1BhZ2VzIDEgMCBS Ci9OYW1lcyAyIDAgUgovVmlld2VyUHJlZmVyZW5jZXMgNSAwIFIKPj4KZW5kb2JqCjEgMCBvYmoK PDwKL1R5cGUgL1BhZ2VzCi9Db3VudCAxCi9LaWRzIFs4IDAgUl0KPj4KZW5kb2JqCjIgMCBvYmoK PDwKL0Rlc3RzIDw8CiAgL05hbWVzIFsKXQo+Pgo+PgplbmRvYmoKNSAwIG9iago8PAovRGlzcGxh eURvY1RpdGxlIHRydWUKPj4KZW5kb2JqCjI4IDAgb2JqCjw8Ci9MZW5ndGggMzg4Ci9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4nF2Sy2rDMBBF9/4KLdtFsSVbcQIhUNyNF31QNx9gS6PU 0MhGURb5+6I7agtdxHA8Mzdzkim7/qn3cxTlW1jMQFG42dtAl+UaDImJTrMvpBJ2NjETnuY8rkXZ 9U/D7RLp3Hu3iP2+EKJ8p9N8ieEm7h7tMtF9evcaLIXZn8TdsRvwZriu6xedyUdRFYeDsOSKsnse 15fxTKLE6ENvycc53h6O3fDX8XFbSSiw5JXMYumyjobC6E9U7Kuqqg5755w7FOTtv3Ld8tTkzOcY frrxBMgEjWNQCdpcqRNsNEMDIAadQOW2TQJdM7Roy2lbpOWAHUAxjGjLMxM2yGBQMQwWMw0DobJj cKhsABI+DUdL+GjeTcJnIxng03KAZB/LAB+dA+DT8JdK+LS8m4SPzmnw0bkNPjpHw0eztoRPu2WA T8M/ooRPk9Pg07C2go/iaAWfmndT8Kk5WsFHcZqCT13hAvJfnW4h3e3vnZlrCOQjjhu3la5q9vR7 /+uypil8vgFHh8+2CmVuZHN0cmVhbQplbmRvYmoKMzIgMCBvYmoKPDwKL0xlbmd0aCA0NzcKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnicXZRNb5wwEIbv/Aof00MEtvlIpNVKFblwSFt1 mx8A9rBByhrEsof99xXvO02rHkB6GM8wj82Qt91Ll6bN5D/WOZxkM+OU4irX+bYGMYOcp5RZZ+IU NiXcw6VfsrztXk736yaXLo2zORwyY/Kfcp6u23o3D1/jPMiX/dn3Nco6pbN5eGtPeHK6LcuHXCRt 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 xVwVHVPOAF2tQ3xYw4JgMVJ5sbL4KMYdxNxibC3EeqyaiOYEMxpicRucXgwlS8ADtB3s9lUKplZY uvWoRgrYjRwjtl03th3FbUZTd0DtrjWbzILueozRu5sx1qBmTqhVXR1qcmHtZAhAzWbdctYkyLFA SznQ4Xhsko5HJmEsJmL97/n//24416rH7GcwV5OTsCqIfi285fdqlunokDEGHx3qxaStwzEvdvGf 9pR2qheSyNgyBZeiF0+qeBJvBK+FgXukbJmC5RiL41XMRjvEgX9TZALegH5YhkeydDwxCf+Aufja eY4ufNcDfjjQosPuHXArVMN7vVNGSSd6oc2MVbEFozEjecLvVZ3aDIqB4J0mxdJI6emR4H8RQDbE Q5mF/ih6sHL6fzCBxHAWBoKYdC4P7r2gtAnN4IKMw3v1NQoO7G75n+r9P6TrkeQKZW5kc3RyZWFt CmVuZG9iagozNyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL0hlaWdo dCAyMDAKL1dpZHRoIDIwMAovQml0c1BlckNvbXBvbmVudCA4Ci9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Ci9Db2xvclNwYWNlIC9EZXZpY2VHcmF5Ci9EZWNvZGUgWzAgMV0KL0xlbmd0aCAzMDYwCj4+CnN0 cmVhbQp4nO2be3AUVRaH55yeSTIJTB4QHoJgQiDGbCTIwopGBMEtXvJwVyxegbDoqqUlqAViUQqL 4qqLIAoqsKsiFLAiKm9QUUADJIKwAgLJSoiGhEDCkNckM31vtnoCZPp29/S9YbesrbrfX1CVPnN+ 99XnnnPa4ZBIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpH8lwCAX9cB RFQ0EFvqCigKOFDB63ACHKC50TITAICIrTqk/KbXbZlpSYlRKKwlaKJ18m8HjZ74SJajhcOg2YCo Nl3TMlOc4iYQAOP7Tp7/3me79393OP+bzz9e9uyDN7sBkNuWprrj0Jnvf3GkqKKqYRG0ZDgBASNS Rz6z9KMd+/IWx4maQFQ8dy3cX1RRTyhRA4GAqlK1tvz0tpnpEcinBBBj7nztyLkaoqoqUcmSFugA xMjuj249VVYTICQQ2NhWEXzc03v+MT+lRCW08SrB/1HfzmlpUfZKACO7PXSwgdIrFgh5Q1gHYGTS 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 CmVuZHN0cmVhbQplbmRvYmoKeHJlZgowIDM4CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwNDY2 NiAwMDAwMCBuIAowMDAwMDA0NzIzIDAwMDAwIG4gCjAwMDAwMDQ1NzkgMDAwMDAgbiAKMDAwMDAw NDU1OCAwMDAwMCBuIAowMDAwMDA0NzcwIDAwMDAwIG4gCjAwMDAwMzE5NjkgMDAwMDAgbiAKMDAw MDAwMDc5MiAwMDAwMCBuIAowMDAwMDAwNjMxIDAwMDAwIG4gCjAwMDAwMDAwMTUgMDAwMDAgbiAK MDAwMDAwMDA4OSAwMDAwMCBuIAowMDAwMDAwMjEwIDAwMDAwIG4gCjAwMDAwMDIwODIgMDAwMDAg biAKMDAwMDAwMzMxMCAwMDAwMCBuIAowMDAwMDAwMjU1IDAwMDAwIG4gCjAwMDAwMDAzMzAgMDAw MDAgbiAKMDAwMDAwNDQxMSAwMDAwMCBuIAowMDAwMDAxMTM5IDAwMDAwIG4gCjAwMDAwMDA0NTIg MDAwMDAgbiAKMDAwMDAwMDUxNSAwMDAwMCBuIAowMDAwMDI1NDg0IDAwMDAwIG4gCjAwMDAwMDEw NjMgMDAwMDAgbiAKMDAwMDAwMDk3MSAwMDAwMCBuIAowMDAwMDAwOTk5IDAwMDAwIG4gCjAwMDAw MDEwMjcgMDAwMDAgbiAKMDAwMDAwNTgyNCAwMDAwMCBuIAowMDAwMDAxMjM3IDAwMDAwIG4gCjAw MDAwMDE0OTkgMDAwMDAgbiAKMDAwMDAwNDgxMyAwMDAwMCBuIAowMDAwMDEwMzI5IDAwMDAwIG4g CjAwMDAwMDIyMjcgMDAwMDAgbiAKMDAwMDAwMjQ5MiAwMDAwMCBuIAowMDAwMDA1Mjc0IDAwMDAw IG4gCjAwMDAwMTY3NzUgMDAwMDAgbiAKMDAwMDAwMzQ1OCAwMDAwMCBuIAowMDAwMDAzNzMxIDAw MDAwIG4gCjAwMDAwMTYyNzIgMDAwMDAgbiAKMDAwMDAyMjIzOCAwMDAwMCBuIAp0cmFpbGVyCjw8 Ci9TaXplIDM4Ci9Sb290IDMgMCBSCi9JbmZvIDIxIDAgUgovSUQgWzwzMTk3YjBlZjg3M2VkOTFk NjQ2ZDZhY2ZjOGFlZmYxYz4gPDMxOTdiMGVmODczZWQ5MWQ2NDZkNmFjZmM4YWVmZjFjPl0KPj4K c3RhcnR4cmVmCjM3NDEwCiUlRU9GCg== ----_NmP-215108abdd27613f-Part_1-- From - Mon Feb 02 14:15:42 2026 X-Mozilla-Status: 0001 X-Mozilla-Status2: 00000000 Return-Path: Received: from witcher.mxrouting.net by witcher.mxrouting.net with LMTP id MPP7JoyxgGk+ghQAYBR5ng (envelope-from ); Mon, 02 Feb 2026 14:15:40 +0000 Return-path: Envelope-to: pfeifferj@archlinux.ch Delivery-date: Mon, 02 Feb 2026 14:15:40 +0000 Received: from chaos01.kabelsalat.ch ([185.95.216.171]) by witcher.mxrouting.net with esmtps (TLS1.3) tls TLS_AES_256_GCM_SHA384 (Exim 4.98) (envelope-from ) id 1vmuiJ-00000006OR4-1g9s for pfeifferj@archlinux.ch; Mon, 02 Feb 2026 14:15:40 +0000 Received: from chaos01.kabelsalat.ch (localhost [127.0.0.1]) by chaos01.kabelsalat.ch (Postfix) with ESMTP id 1E8B22321A; Mon, 02 Feb 2026 15:15:36 +0100 (CET) Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=194.126.200.224; helo=mail-gateway-shared02.cyon.net; envelope-from=nussgipfel@brain4free.org; receiver=chaostreff.ch Received: from mail-gateway-shared02.cyon.net (mail-gateway-shared02.cyon.net [194.126.200.224]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange secp256r1 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by chaos01.kabelsalat.ch (Postfix) with ESMTPS id 777E022248; Mon, 02 Feb 2026 15:15:21 +0100 (CET) Received: from s075.cyon.net ([149.126.4.84]) by mail-gateway-shared02.cyon.net with esmtpsa (TLS1.2:ECDHE_SECP256R1__RSA_SHA512__AES_256_GCM:256) (Exim) (envelope-from ) id 1vmuhy-00FdxS-28; Mon, 02 Feb 2026 15:15:20 +0100 Received: from [10.20.10.51] (port=65020 helo=mail.cyon.ch) by s075.cyon.net with esmtpa (Exim 4.98.1) (envelope-from ) id 1vmuht-0000000Dqk5-1Zsp; Mon, 02 Feb 2026 15:15:13 +0100 Date: Mon, 2 Feb 2026 15:15:08 +0100 From: Christoph Zimmermann To: bitwascherei@chaostreff.ch, zuerich@chaostreff.ch, office@digitale-gesellschaft.ch Message-ID: <20260202151508.05754224@toughfrinz.lan> In-Reply-To: <20260117133705.5753ea93@toughfrinz.lan> References: <20260117133705.5753ea93@toughfrinz.lan> X-Mailer: Claws Mail 4.3.1 (GTK 3.24.51; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-AntiAbuse: T/** * The `node:fs` module enables interacting with the file system in a * way modeled on standard POSIX functions. * * To use the promise-based APIs: * * ```js * import * as fs from 'node:fs/promises'; * ``` * * To use the callback and sync APIs: * * ```js * import * as fs from 'node:fs'; * ``` * * All file system operations have synchronous, callback, and promise-based * forms, and are accessible using both CommonJS syntax and ES6 Modules (ESM). * @see [source](https://github.com/nodejs/node/blob/v22.x/lib/fs.js) */ declare module "fs" { import * as stream from "node:stream"; import { Abortable, EventEmitter } from "node:events"; import { URL } from "node:url"; import * as promises from "node:fs/promises"; export { promises }; /** * Valid types for path values in "fs". */ export type PathLike = string | Buffer | URL; export type PathOrFileDescriptor = PathLike | number; export type TimeLike = string | number | Date; export type NoParamCallback = (err: NodeJS.ErrnoException | null) => void; export type BufferEncodingOption = | "buffer" | { encoding: "buffer"; }; export interface ObjectEncodingOptions { encoding?: BufferEncoding | null | undefined; } export type EncodingOption = ObjectEncodingOptions | BufferEncoding | undefined | null; export type OpenMode = number | string; export type Mode = number | string; export interface StatsBase { isFile(): boolean; isDirectory(): boolean; isBlockDevice(): boolean; isCharacterDevice(): boolean; isSymbolicLink(): boolean; isFIFO(): boolean; isSocket(): boolean; dev: T; ino: T; mode: T; nlink: T; uid: T; gid: T; rdev: T; size: T; blksize: T; blocks: T; atimeMs: T; mtimeMs: T; ctimeMs: T; birthtimeMs: T; atime: Date; mtime: Date; ctime: Date; birthtime: Date; } export interface Stats extends StatsBase {} /** * A `fs.Stats` object provides information about a file. * * Objects returned from {@link stat}, {@link lstat}, {@link fstat}, and * their synchronous counterparts are of this type. * If `bigint` in the `options` passed to those methods is true, the numeric values * will be `bigint` instead of `number`, and the object will contain additional * nanosecond-precision properties suffixed with `Ns`. `Stat` objects are not to be created directly using the `new` keyword. * * ```console * Stats { * dev: 2114, * ino: 48064969, * mode: 33188, * nlink: 1, * uid: 85, * gid: 100, * rdev: 0, * size: 527, * blksize: 4096, * blocks: 8, * atimeMs: 1318289051000.1, * mtimeMs: 1318289051000.1, * ctimeMs: 1318289051000.1, * birthtimeMs: 1318289051000.1, * atime: Mon, 10 Oct 2011 23:24:11 GMT, * mtime: Mon, 10 Oct 2011 23:24:11 GMT, * ctime: Mon, 10 Oct 2011 23:24:11 GMT, * birthtime: Mon, 10 Oct 2011 23:24:11 GMT } * ``` * * `bigint` version: * * ```console * BigIntStats { * dev: 2114n, * ino: 48064969n, * mode: 33188n, * nlink: 1n, * uid: 85n, * gid: 100n, * rdev: 0n, * size: 527n, * blksize: 4096n, * blocks: 8n, * atimeMs: 1318289051000n, * mtimeMs: 1318289051000n, * ctimeMs: 1318289051000n, * birthtimeMs: 1318289051000n, * atimeNs: 1318289051000000000n, * mtimeNs: 1318289051000000000n, * ctimeNs: 1318289051000000000n, * birthtimeNs: 1318289051000000000n, * atime: Mon, 10 Oct 2011 23:24:11 GMT, * mtime: Mon, 10 Oct 2011 23:24:11 GMT, * ctime: Mon, 10 Oct 2011 23:24:11 GMT, * birthtime: Mon, 10 Oct 2011 23:24:11 GMT } * ``` * @since v0.1.21 */ export class Stats { private constructor(); } export interface StatsFsBase { /** Type of file system. */ type: T; /** Optimal transfer block size. */ bsize: T; /** Total data blocks in file system. */ blocks: T; /** Free blocks in file system. */ bfree: T; /** Available blocks for unprivileged users */ bavail: T; /** Total file nodes in file system. */ files: T; /** Free file nodes in file system. */ ffree: T; } export interface StatsFs extends StatsFsBase {} /** * Provides information about a mounted file system. * * Objects returned from {@link statfs} and its synchronous counterpart are of * this type. If `bigint` in the `options` passed to those methods is `true`, the * numeric values will be `bigint` instead of `number`. * * ```console * StatFs { * type: 1397114950, * bsize: 4096, * blocks: 121938943, * bfree: 61058895, * bavail: 61058895, * files: 999, * ffree: 1000000 * } * ``` * * `bigint` version: * * ```console * StatFs { * type: 1397114950n, * bsize: 4096n, * blocks: 121938943n, * bfree: 61058895n, * bavail: 61058895n, * files: 999n, * ffree: 1000000n * } * ``` * @since v19.6.0, v18.15.0 */ export class StatsFs {} export interface BigIntStatsFs extends StatsFsBase {} export interface StatFsOptions { bigint?: boolean | undefined; } /** * A representation of a directory entry, which can be a file or a subdirectory * within the directory, as returned by reading from an `fs.Dir`. The * directory entry is a combination of the file name and file type pairs. * * Additionally, when {@link readdir} or {@link readdirSync} is called with * the `withFileTypes` option set to `true`, the resulting array is filled with `fs.Dirent` objects, rather than strings or `Buffer` s. * @since v10.10.0 */ export class Dirent { /** * Returns `true` if the `fs.Dirent` object describes a regular file. * @since v10.10.0 */ isFile(): boolean; /** * Returns `true` if the `fs.Dirent` object describes a file system * directory. * @since v10.10.0 */ isDirectory(): boolean; /** * Returns `true` if the `fs.Dirent` object describes a block device. * @since v10.10.0 */ isBlockDevice(): boolean; /** * Returns `true` if the `fs.Dirent` object describes a character device. * @since v10.10.0 */ isCharacterDevice(): boolean; /** * Returns `true` if the `fs.Dirent` object describes a symbolic link. * @since v10.10.0 */ isSymbolicLink(): boolean; /** * Returns `true` if the `fs.Dirent` object describes a first-in-first-out * (FIFO) pipe. * @since v10.10.0 */ isFIFO(): boolean; /** * Returns `true` if the `fs.Dirent` object describes a socket. * @since v10.10.0 */ isSocket(): boolean; /** * The file name that this `fs.Dirent` object refers to. The type of this * value is determined by the `options.encoding` passed to {@link readdir} or {@link readdirSync}. * @since v10.10.0 */ name: string; /** * The base path that this `fs.Dirent` object refers to. * @since v20.12.0 */ parentPath: string; /** * Alias for `dirent.parentPath`. * @since v20.1.0 * @deprecated Since v20.12.0 */ path: string; } /** * A class representing a directory stream. * * Created by {@link opendir}, {@link opendirSync}, or `fsPromises.opendir()`. * * ```js * import { opendir } from 'node:fs/promises'; * * try { * const dir = await opendir('./'); * for await (const dirent of dir) * console.log(dirent.name); * } catch (err) { * console.error(err); * } * ``` * * When using the async iterator, the `fs.Dir` object will be automatically * closed after the iterator exits. * @since v12.12.0 */ export class Dir implements AsyncIterable { /** * The read-only path of this directory as was provided to {@link opendir},{@link opendirSync}, or `fsPromises.opendir()`. * @since v12.12.0 */ readonly path: string; /** * Asynchronously iterates over the directory via `readdir(3)` until all entries have been read. */ [Symbol.asyncIterator](): NodeJS.AsyncIterator; /** * Asynchronously close the directory's underlying resource handle. * Subsequent reads will result in errors. * * A promise is returned that will be fulfilled after the resource has been * closed. * @since v12.12.0 */ close(): Promise; close(cb: NoParamCallback): void; /** * Synchronously close the directory's underlying resource handle. * Subsequent reads will result in errors. * @since v12.12.0 */ closeSync(): void; /** * Asynchronously read the next directory entry via [`readdir(3)`](http://man7.org/linux/man-pages/man3/readdir.3.html) as an `fs.Dirent`. * * A promise is returned that will be fulfilled with an `fs.Dirent`, or `null` if there are no more directory entries to read. * * Directory entries returned by this function are in no particular order as * provided by the operating system's underlying directory mechanisms. * Entries added or removed while iterating over the directory might not be * included in the iteration results. * @since v12.12.0 * @return containing {fs.Dirent|null} */ read(): Promise; read(cb: (err: NodeJS.ErrnoException | null, dirEnt: Dirent | null) => void): void; /** * Synchronously read the next directory entry as an `fs.Dirent`. See the * POSIX [`readdir(3)`](http://man7.org/linux/man-pages/man3/readdir.3.html) documentation for more detail. * * If there are no more directory entries to read, `null` will be returned. * * Directory entries returned by this function are in no particular order as * provided by the operating system's underlying directory mechanisms. * Entries added or removed while iterating over the directory might not be * included in the iteration results. * @since v12.12.0 */ readSync(): Dirent | null; } /** * Class: fs.StatWatcher * @since v14.3.0, v12.20.0 * Extends `EventEmitter` * A successful call to {@link watchFile} method will return a new fs.StatWatcher object. */ export interface StatWatcher extends EventEmitter { /** * When called, requests that the Node.js event loop _not_ exit so long as the `fs.StatWatcher` is active. Calling `watcher.ref()` multiple times will have * no effect. * * By default, all `fs.StatWatcher` objects are "ref'ed", making it normally * unnecessary to call `watcher.ref()` unless `watcher.unref()` had been * called previously. * @since v14.3.0, v12.20.0 */ ref(): this; /** * When called, the active `fs.StatWatcher` object will not require the Node.js * event loop to remain active. If there is no other activity keeping the * event loop running, the process may exit before the `fs.StatWatcher` object's * callback is invoked. Calling `watcher.unref()` multiple times will have * no effect. * @since v14.3.0, v12.20.0 */ unref(): this; } export interface FSWatcher extends EventEmitter { /** * Stop watching for changes on the given `fs.FSWatcher`. Once stopped, the `fs.FSWatcher` object is no longer usable. * @since v0.5.8 */ close(): void; /** * When called, requests that the Node.js event loop _not_ exit so long as the `fs.FSWatcher` is active. Calling `watcher.ref()` multiple times will have * no effect. * * By default, all `fs.FSWatcher` objects are "ref'ed", making it normally * unnecessary to call `watcher.ref()` unless `watcher.unref()` had been * called previously. * @since v14.3.0, v12.20.0 */ ref(): this; /** * When called, the active `fs.FSWatcher` object will not require the Node.js * event loop to remain active. If there is no other activity keeping the * event loop running, the process may exit before the `fs.FSWatcher` object's * callback is invoked. Calling `watcher.unref()` multiple times will have * no effect. * @since v14.3.0, v12.20.0 */ unref(): this; /** * events.EventEmitter * 1. change * 2. close * 3. error */ addListener(event: string, listener: (...args: any[]) => void): this; addListener(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; addListener(event: "close", listener: () => void): this; addListener(event: "error", listener: (error: Error) => void): this; on(event: string, listener: (...args: any[]) => void): this; on(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; on(event: "close", listener: () => void): this; on(event: "error", listener: (error: Error) => void): this; once(event: string, listener: (...args: any[]) => void): this; once(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; once(event: "close", listener: () => void): this; once(event: "error", listener: (error: Error) => void): this; prependListener(event: string, listener: (...args: any[]) => void): this; prependListener(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; prependListener(event: "close", listener: () => void): this; prependListener(event: "error", listener: (error: Error) => void): this; prependOnceListener(event: string, listener: (...args: any[]) => void): this; prependOnceListener(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; prependOnceListener(event: "close", listener: () => void): this; prependOnceListener(event: "error", listener: (error: Error) => void): this; } /** * Instances of `fs.ReadStream` are created and returned using the {@link createReadStream} function. * @since v0.1.93 */ export class ReadStream extends stream.Readable { close(callback?: (err?: NodeJS.ErrnoException | null) => void): void; /** * The number of bytes that have been read so far. * @since v6.4.0 */ bytesRead: number; /** * The path to the file the stream is reading from as specified in the first * argument to `fs.createReadStream()`. If `path` is passed as a string, then`readStream.path` will be a string. If `path` is passed as a `Buffer`, then`readStream.path` will be a * `Buffer`. If `fd` is specified, then`readStream.path` will be `undefined`. * @since v0.1.93 */ path: string | Buffer; /** * This property is `true` if the underlying file has not been opened yet, * i.e. before the `'ready'` event is emitted. * @since v11.2.0, v10.16.0 */ pending: boolean; /** * events.EventEmitter * 1. open * 2. close * 3. ready */ addListener(event: K, listener: ReadStreamEvents[K]): this; on(event: K, listener: ReadStreamEvents[K]): this; once(event: K, listener: ReadStreamEvents[K]): this; prependListener(event: K, listener: ReadStreamEvents[K]): this; prependOnceListener(event: K, listener: ReadStreamEvents[K]): this; } /** * The Keys are events of the ReadStream and the values are the functions that are called when the event is emitted. */ type ReadStreamEvents = { close: () => void; data: (chunk: Buffer | string) => void; end: () => void; error: (err: Error) => void; open: (fd: number) => void; pause: () => void; readable: () => void; ready: () => void; resume: () => void; } & CustomEvents; /** * string & {} allows to allow any kind of strings for the event * but still allows to have auto completion for the normal events. */ type CustomEvents = { [Key in string & {} | symbol]: (...args: any[]) => void }; /** * The Keys are events of the WriteStream and the values are the functions that are called when the event is emitted. */ type WriteStreamEvents = { close: () => void; drain: () => void; error: (err: Error) => void; finish: () => void; open: (fd: number) => void; pipe: (src: stream.Readable) => void; ready: () => void; unpipe: (src: stream.Readable) => void; } & CustomEvents; /** * * Extends `stream.Writable` * * Instances of `fs.WriteStream` are created and returned using the {@link createWriteStream} function. * @since v0.1.93 */ export class WriteStream extends stream.Writable { /** * Closes `writeStream`. Optionally accepts a * callback that will be executed once the `writeStream`is closed. * @since v0.9.4 */ close(callback?: (err?: NodeJS.ErrnoException | null) => void): void; /** * The number of bytes written so far. Does not include data that is still queued * for writing. * @since v0.4.7 */ bytesWritten: number; /** * The path to the file the stream is writing to as specified in the first * argument to {@link createWriteStream}. If `path` is passed as a string, then`writeStream.path` will be a string. If `path` is passed as a `Buffer`, then`writeStream.path` will be a * `Buffer`. * @since v0.1.93 */ path: string | Buffer; /** * This property is `true` if the underlying file has not been opened yet, * i.e. before the `'ready'` event is emitted. * @since v11.2.0 */ pending: boolean; /** * events.EventEmitter * 1. open * 2. close * 3. ready */ addListener(event: K, listener: WriteStreamEvents[K]): this; on(event: K, listener: WriteStreamEvents[K]): this; once(event: K, listener: WriteStreamEvents[K]): this; prependListener(event: K, listener: WriteStreamEvents[K]): this; prependOnceListener(event: K, listener: WriteStreamEvents[K]): this; } /** * Asynchronously rename file at `oldPath` to the pathname provided * as `newPath`. In the case that `newPath` already exists, it will * be overwritten. If there is a directory at `newPath`, an error will * be raised instead. No arguments other than a possible exception are * given to the completion callback. * * See also: [`rename(2)`](http://man7.org/linux/man-pages/man2/rename.2.html). * * ```js * import { rename } from 'node:fs'; * * rename('oldFile.txt', 'newFile.txt', (err) => { * if (err) throw err; * console.log('Rename complete!'); * }); * ``` * @since v0.0.2 */ export function rename(oldPath: PathLike, newPath: PathLike, callback: NoParamCallback): void; export namespace rename { /** * Asynchronous rename(2) - Change the name or location of a file or directory. * @param oldPath A path to a file. If a URL is provided, it must use the `file:` protocol. * URL support is _experimental_. * @param newPath A path to a file. If a URL is provided, it must use the `file:` protocol. * URL support is _experimental_. */ function __promisify__(oldPath: PathLike, newPath: PathLike): Promise; } /** * Renames the file from `oldPath` to `newPath`. Returns `undefined`. * * See the POSIX [`rename(2)`](http://man7.org/linux/man-pages/man2/rename.2.html) documentation for more details. * @since v0.1.21 */ export function renameSync(oldPath: PathLike, newPath: PathLike): void; /** * Truncates the file. No arguments other than a possible exception are * given to the completion callback. A file descriptor can also be passed as the * first argument. In this case, `fs.ftruncate()` is called. * * ```js * import { truncate } from 'node:fs'; * // Assuming that 'path/file.txt' is a regular file. * truncate('path/file.txt', (err) => { * if (err) throw err; * console.log('path/file.txt was truncated'); * }); * ``` * * Passing a file descriptor is deprecated and may result in an error being thrown * in the future. * * See the POSIX [`truncate(2)`](http://man7.org/linux/man-pages/man2/truncate.2.html) documentation for more details. * @since v0.8.6 * @param [len=0] */ export function truncate(path: PathLike, len: number | undefined | null, callback: NoParamCallback): void; /** * Asynchronous truncate(2) - Truncate a file to a specified length. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. */ export function truncate(path: PathLike, callback: NoParamCallback): void; export namespace truncate { /** * Asynchronous truncate(2) - Truncate a file to a specified length. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param len If not specified, defaults to `0`. */ function __promisify__(path: PathLike, len?: number | null): Promise; } /** * Truncates the file. Returns `undefined`. A file descriptor can also be * passed as the first argument. In this case, `fs.ftruncateSync()` is called. * * Passing a file descriptor is deprecated and may result in an error being thrown * in the future. * @since v0.8.6 * @param [len=0] */ export function truncateSync(path: PathLike, len?: number | null): void; /** * Truncates the file descriptor. No arguments other than a possible exception are * given to the completion callback. * * See the POSIX [`ftruncate(2)`](http://man7.org/linux/man-pages/man2/ftruncate.2.html) documentation for more detail. * * If the file referred to by the file descriptor was larger than `len` bytes, only * the first `len` bytes will be retained in the file. * * For example, the following program retains only the first four bytes of the * file: * * ```js * import { open, close, ftruncate } from 'node:fs'; * * function closeFd(fd) { * close(fd, (err) => { * if (err) throw err; * }); * } * * open('temp.txt', 'r+', (err, fd) => { * if (err) throw err; * * try { * ftruncate(fd, 4, (err) => { * closeFd(fd); * if (err) throw err; * }); * } catch (err) { * closeFd(fd); * if (err) throw err; * } * }); * ``` * * If the file previously was shorter than `len` bytes, it is extended, and the * extended part is filled with null bytes (`'\0'`): * * If `len` is negative then `0` will be used. * @since v0.8.6 * @param [len=0] */ export function ftruncate(fd: number, len: number | undefined | null, callback: NoParamCallback): void; /** * Asynchronous ftruncate(2) - Truncate a file to a specified length. * @param fd A file descriptor. */ export function ftruncate(fd: number, callback: NoParamCallback): void; export namespace ftruncate { /** * Asynchronous ftruncate(2) - Truncate a file to a specified length. * @param fd A file descriptor. * @param len If not specified, defaults to `0`. */ function __promisify__(fd: number, len?: number | null): Promise; } /** * Truncates the file descriptor. Returns `undefined`. * * For detailed information, see the documentation of the asynchronous version of * this API: {@link ftruncate}. * @since v0.8.6 * @param [len=0] */ export function ftruncateSync(fd: number, len?: number | null): void; /** * Asynchronously changes owner and group of a file. No arguments other than a * possible exception are given to the completion callback. * * See the POSIX [`chown(2)`](http://man7.org/linux/man-pages/man2/chown.2.html) documentation for more detail. * @since v0.1.97 */ export function chown(path: PathLike, uid: number, gid: number, callback: NoParamCallback): void; export namespace chown { /** * Asynchronous chown(2) - Change ownership of a file. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. */ function __promisify__(path: PathLike, uid: number, gid: number): Promise; } /** * Synchronously changes owner and group of a file. Returns `undefined`. * This is the synchronous version of {@link chown}. * * See the POSIX [`chown(2)`](http://man7.org/linux/man-pages/man2/chown.2.html) documentation for more detail. * @since v0.1.97 */ export function chownSync(path: PathLike, uid: number, gid: number): void; /** * Sets the owner of the file. No arguments other than a possible exception are * given to the completion callback. * * See the POSIX [`fchown(2)`](http://man7.org/linux/man-pages/man2/fchown.2.html) documentation for more detail. * @since v0.4.7 */ export function fchown(fd: number, uid: number, gid: number, callback: NoParamCallback): void; export namespace fchown { /** * Asynchronous fchown(2) - Change ownership of a file. * @param fd A file descriptor. */ function __promisify__(fd: number, uid: number, gid: number): Promise; } /** * Sets the owner of the file. Returns `undefined`. * * See the POSIX [`fchown(2)`](http://man7.org/linux/man-pages/man2/fchown.2.html) documentation for more detail. * @since v0.4.7 * @param uid The file's new owner's user id. * @param gid The file's new group's group id. */ export function fchownSync(fd: number, uid: number, gid: number): void; /** * Set the owner of the symbolic link. No arguments other than a possible * exception are given to the completion callback. * * See the POSIX [`lchown(2)`](http://man7.org/linux/man-pages/man2/lchown.2.html) documentation for more detail. */ export function lchown(path: PathLike, uid: number, gid: number, callback: NoParamCallback): void; export namespace lchown { /** * Asynchronous lchown(2) - Change ownership of a file. Does not dereference symbolic links. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. */ function __promisify__(path: PathLike, uid: number, gid: number): Promise; } /** * Set the owner for the path. Returns `undefined`. * * See the POSIX [`lchown(2)`](http://man7.org/linux/man-pages/man2/lchown.2.html) documentation for more details. * @param uid The file's new owner's user id. * @param gid The file's new group's group id. */ export function lchownSync(path: PathLike, uid: number, gid: number): void; /** * Changes the access and modification times of a file in the same way as {@link utimes}, with the difference that if the path refers to a symbolic * link, then the link is not dereferenced: instead, the timestamps of the * symbolic link itself are changed. * * No arguments other than a possible exception are given to the completion * callback. * @since v14.5.0, v12.19.0 */ export function lutimes(path: PathLike, atime: TimeLike, mtime: TimeLike, callback: NoParamCallback): void; export namespace lutimes { /** * Changes the access and modification times of a file in the same way as `fsPromises.utimes()`, * with the difference that if the path refers to a symbolic link, then the link is not * dereferenced: instead, the timestamps of the symbolic link itself are changed. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param atime The last access time. If a string is provided, it will be coerced to number. * @param mtime The last modified time. If a string is provided, it will be coerced to number. */ function __promisify__(path: PathLike, atime: TimeLike, mtime: TimeLike): Promise; } /** * Change the file system timestamps of the symbolic link referenced by `path`. * Returns `undefined`, or throws an exception when parameters are incorrect or * the operation fails. This is the synchronous version of {@link lutimes}. * @since v14.5.0, v12.19.0 */ export function lutimesSync(path: PathLike, atime: TimeLike, mtime: TimeLike): void; /** * Asynchronously changes the permissions of a file. No arguments other than a * possible exception are given to the completion callback. * * See the POSIX [`chmod(2)`](http://man7.org/linux/man-pages/man2/chmod.2.html) documentation for more detail. * * ```js * import { chmod } from 'node:fs'; * * chmod('my_file.txt', 0o775, (err) => { * if (err) throw err; * console.log('The permissions for file "my_file.txt" have been changed!'); * }); * ``` * @since v0.1.30 */ export function chmod(path: PathLike, mode: Mode, callback: NoParamCallback): void; export namespace chmod { /** * Asynchronous chmod(2) - Change permissions of a file. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param mode A file mode. If a string is passed, it is parsed as an octal integer. */ function __promisify__(path: PathLike, mode: Mode): Promise; } /** * For detailed information, see the documentation of the asynchronous version of * this API: {@link chmod}. * * See the POSIX [`chmod(2)`](http://man7.org/linux/man-pages/man2/chmod.2.html) documentation for more detail. * @since v0.6.7 */ export function chmodSync(path: PathLike, mode: Mode): void; /** * Sets the permissions on the file. No arguments other than a possible exception * are given to the completion callback. * * See the POSIX [`fchmod(2)`](http://man7.org/linux/man-pages/man2/fchmod.2.html) documentation for more detail. * @since v0.4.7 */ export function fchmod(fd: number, mode: Mode, callback: NoParamCallback): void; export namespace fchmod { /** * Asynchronous fchmod(2) - Change permissions of a file. * @param fd A file descriptor. * @param mode A file mode. If a string is passed, it is parsed as an octal integer. */ function __promisify__(fd: number, mode: Mode): Promise; } /** * Sets the permissions on the file. Returns `undefined`. * * See the POSIX [`fchmod(2)`](http://man7.org/linux/man-pages/man2/fchmod.2.html) documentation for more detail. * @since v0.4.7 */ export function fchmodSync(fd: number, mode: Mode): void; /** * Changes the permissions on a symbolic link. No arguments other than a possible * exception are given to the completion callback. * * This method is only implemented on macOS. * * See the POSIX [`lchmod(2)`](https://www.freebsd.org/cgi/man.cgi?query=lchmod&sektion=2) documentation for more detail. * @deprecated Since v0.4.7 */ export function lchmod(path: PathLike, mode: Mode, callback: NoParamCallback): void; /** @deprecated */ export namespace lchmod { /** * Asynchronous lchmod(2) - Change permissions of a file. Does not dereference symbolic links. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param mode A file mode. If a string is passed, it is parsed as an octal integer. */ function __promisify__(path: PathLike, mode: Mode): Promise; } /** * Changes the permissions on a symbolic link. Returns `undefined`. * * This method is only implemented on macOS. * * See the POSIX [`lchmod(2)`](https://www.freebsd.org/cgi/man.cgi?query=lchmod&sektion=2) documentation for more detail. * @deprecated Since v0.4.7 */ export function lchmodSync(path: PathLike, mode: Mode): void; /** * Asynchronous [`stat(2)`](http://man7.org/linux/man-pages/man2/stat.2.html). The callback gets two arguments `(err, stats)` where`stats` is an `fs.Stats` object. * * In case of an error, the `err.code` will be one of `Common System Errors`. * * {@link stat} follows symbolic links. Use {@link lstat} to look at the * links themselves. * * Using `fs.stat()` to check for the existence of a file before calling`fs.open()`, `fs.readFile()`, or `fs.writeFile()` is not recommended. * Instead, user code should open/read/write the file directly and handle the * error raised if the file is not available. * * To check if a file exists without manipulating it afterwards, {@link access} is recommended. * * For example, given the following directory structure: * * ```text * - txtDir * -- file.txt * - app.js * ``` * * The next program will check for the stats of the given paths: * * ```js * import { stat } from 'node:fs'; * * const pathsToCheck = ['./txtDir', './txtDir/file.txt']; * * for (let i = 0; i < pathsToCheck.length; i++) { * stat(pathsToCheck[i], (err, stats) => { * console.log(stats.isDirectory()); * console.log(stats); * }); * } * ``` * * The resulting output will resemble: * * ```console * true * Stats { * dev: 16777220, * mode: 16877, * nlink: 3, * uid: 501, * gid: 20, * rdev: 0, * blksize: 4096, * ino: 14214262, * size: 96, * blocks: 0, * atimeMs: 1561174653071.963, * mtimeMs: 1561174614583.3518, * ctimeMs: 1561174626623.5366, * birthtimeMs: 1561174126937.2893, * atime: 2019-06-22T03:37:33.072Z, * mtime: 2019-06-22T03:36:54.583Z, * ctime: 2019-06-22T03:37:06.624Z, * birthtime: 2019-06-22T03:28:46.937Z * } * false * Stats { * dev: 16777220, * mode: 33188, * nlink: 1, * uid: 501, * gid: 20, * rdev: 0, * blksize: 4096, * ino: 14214074, * size: 8, * blocks: 8, * atimeMs: 1561174616618.8555, * mtimeMs: 1561174614584, * ctimeMs: 1561174614583.8145, * birthtimeMs: 1561174007710.7478, * atime: 2019-06-22T03:36:56.619Z, * mtime: 2019-06-22T03:36:54.584Z, * ctime: 2019-06-22T03:36:54.584Z, * birthtime: 2019-06-22T03:26:47.711Z * } * ``` * @since v0.0.2 */ export function stat(path: PathLike, callback: (err: NodeJS.ErrnoException | null, stats: Stats) => void): void; export function stat( path: PathLike, options: | (StatOptions & { bigint?: false | undefined; }) | undefined, callback: (err: NodeJS.ErrnoException | null, stats: Stats) => void, ): void; export function stat( path: PathLike, options: StatOptions & { bigint: true; }, callback: (err: NodeJS.ErrnoException | null, stats: BigIntStats) => void, ): void; export function stat( path: PathLike, options: StatOptions | undefined, callback: (err: NodeJS.ErrnoException | null, stats: Stats | BigIntStats) => void, ): void; export namespace stat { /** * Asynchronous stat(2) - Get file status. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. */ function __promisify__( path: PathLike, options?: StatOptions & { bigint?: false | undefined; }, ): Promise; function __promisify__( path: PathLike, options: StatOptions & { bigint: true; }, ): Promise; function __promisify__(path: PathLike, options?: StatOptions): Promise; } export interface StatSyncFn extends Function { (path: PathLike, options?: undefined): Stats; ( path: PathLike, options?: StatSyncOptions & { bigint?: false | undefined; throwIfNoEntry: false; }, ): Stats | undefined; ( path: PathLike, options: StatSyncOptions & { bigint: true; throwIfNoEntry: false; }, ): BigIntStats | undefined; ( path: PathLike, options?: StatSyncOptions & { bigint?: false | undefined; }, ): Stats; ( path: PathLike, options: StatSyncOptions & { bigint: true; }, ): BigIntStats; ( path: PathLike, options: StatSyncOptions & { bigint: boolean; throwIfNoEntry?: false | undefined; }, ): Stats | BigIntStats; (path: PathLike, options?: StatSyncOptions): Stats | BigIntStats | undefined; } /** * Synchronous stat(2) - Get file status. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. */ export const statSync: StatSyncFn; /** * Invokes the callback with the `fs.Stats` for the file descriptor. * * See the POSIX [`fstat(2)`](http://man7.org/linux/man-pages/man2/fstat.2.html) documentation for more detail. * @since v0.1.95 */ export function fstat(fd: number, callback: (err: NodeJS.ErrnoException | null, stats: Stats) => void): void; export function fstat( fd: number, options: | (StatOptions & { bigint?: false | undefined; }) | undefined, callback: (err: NodeJS.ErrnoException | null, stats: Stats) => void, ): void; export function fstat( fd: number, options: StatOptions & { bigint: true; }, callback: (err: NodeJS.ErrnoException | null, stats: BigIntStats) => void, ): void; export function fstat( fd: number, options: StatOptions | undefined, callback: (err: NodeJS.ErrnoException | null, stats: Stats | BigIntStats) => void, ): void; export namespace fstat { /** * Asynchronous fstat(2) - Get file status. * @param fd A file descriptor. */ function __promisify__( fd: number, options?: StatOptions & { bigint?: false | undefined; }, ): Promise; function __promisify__( fd: number, options: StatOptions & { bigint: true; }, ): Promise; function __promisify__(fd: number, options?: StatOptions): Promise; } /** * Retrieves the `fs.Stats` for the file descriptor. * * See the POSIX [`fstat(2)`](http://man7.org/linux/man-pages/man2/fstat.2.html) documentation for more detail. * @since v0.1.95 */ export function fstatSync( fd: number, options?: StatOptions & { bigint?: false | undefined; }, ): Stats; export function fstatSync( fd: number, options: StatOptions & { bigint: true; }, ): BigIntStats; export function fstatSync(fd: number, options?: StatOptions): Stats | BigIntStats; /** * Retrieves the `fs.Stats` for the symbolic link referred to by the path. * The callback gets two arguments `(err, stats)` where `stats` is a `fs.Stats` object. `lstat()` is identical to `stat()`, except that if `path` is a symbolic * link, then the link itself is stat-ed, not the file that it refers to. * * See the POSIX [`lstat(2)`](http://man7.org/linux/man-pages/man2/lstat.2.html) documentation for more details. * @since v0.1.30 */ export function lstat(path: PathLike, callback: (err: NodeJS.ErrnoException | null, stats: Stats) => void): void; export function lstat( path: PathLike, options: | (StatOptions & { bigint?: false | undefined; }) | undefined, callback: (err: NodeJS.ErrnoException | null, stats: Stats) => void, ): void; export function lstat( path: PathLike, options: StatOptions & { bigint: true; }, callback: (err: NodeJS.ErrnoException | null, stats: BigIntStats) => void, ): void; export function lstat( path: PathLike, options: StatOptions | undefined, callback: (err: NodeJS.ErrnoException | null, stats: Stats | BigIntStats) => void, ): void; export namespace lstat { /** * Asynchronous lstat(2) - Get file status. Does not dereference symbolic links. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. */ function __promisify__( path: PathLike, options?: StatOptions & { bigint?: false | undefined; }, ): Promise; function __promisify__( path: PathLike, options: StatOptions & { bigint: true; }, ): Promise; function __promisify__(path: PathLike, options?: StatOptions): Promise; } /** * Asynchronous [`statfs(2)`](http://man7.org/linux/man-pages/man2/statfs.2.html). Returns information about the mounted file system which * contains `path`. The callback gets two arguments `(err, stats)` where `stats`is an `fs.StatFs` object. * * In case of an error, the `err.code` will be one of `Common System Errors`. * @since v19.6.0, v18.15.0 * @param path A path to an existing file or directory on the file system to be queried. */ export function statfs(path: PathLike, callback: (err: NodeJS.ErrnoException | null, stats: StatsFs) => void): void; export function statfs( path: PathLike, options: | (StatFsOptions & { bigint?: false | undefined; }) | undefined, callback: (err: NodeJS.ErrnoException | null, stats: StatsFs) => void, ): void; export function statfs( path: PathLike, options: StatFsOptions & { bigint: true; }, callback: (err: NodeJS.ErrnoException | null, stats: BigIntStatsFs) => void, ): void; export function statfs( path: PathLike, options: StatFsOptions | undefined, callback: (err: NodeJS.ErrnoException | null, stats: StatsFs | BigIntStatsFs) => void, ): void; export namespace statfs { /** * Asynchronous statfs(2) - Returns information about the mounted file system which contains path. The callback gets two arguments (err, stats) where stats is an object. * @param path A path to an existing file or directory on the file system to be queried. */ function __promisify__( path: PathLike, options?: StatFsOptions & { bigint?: false | undefined; }, ): Promise; function __promisify__( path: PathLike, options: StatFsOptions & { bigint: true; }, ): Promise; function __promisify__(path: PathLike, options?: StatFsOptions): Promise; } /** * Synchronous [`statfs(2)`](http://man7.org/linux/man-pages/man2/statfs.2.html). Returns information about the mounted file system which * contains `path`. * * In case of an error, the `err.code` will be one of `Common System Errors`. * @since v19.6.0, v18.15.0 * @param path A path to an existing file or directory on the file system to be queried. */ export function statfsSync( path: PathLike, options?: StatFsOptions & { bigint?: false | undefined; }, ): StatsFs; export function statfsSync( path: PathLike, options: StatFsOptions & { bigint: true; }, ): BigIntStatsFs; export function statfsSync(path: PathLike, options?: StatFsOptions): StatsFs | BigIntStatsFs; /** * Synchronous lstat(2) - Get file status. Does not dereference symbolic links. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. */ export const lstatSync: StatSyncFn; /** * Creates a new link from the `existingPath` to the `newPath`. See the POSIX [`link(2)`](http://man7.org/linux/man-pages/man2/link.2.html) documentation for more detail. No arguments other than * a possible * exception are given to the completion callback. * @since v0.1.31 */ export function link(existingPath: PathLike, newPath: PathLike, callback: NoParamCallback): void; export namespace link { /** * Asynchronous link(2) - Create a new link (also known as a hard link) to an existing file. * @param existingPath A path to a file. If a URL is provided, it must use the `file:` protocol. * @param newPath A path to a file. If a URL is provided, it must use the `file:` protocol. */ function __promisify__(existingPath: PathLike, newPath: PathLike): Promise; } /** * Creates a new link from the `existingPath` to the `newPath`. See the POSIX [`link(2)`](http://man7.org/linux/man-pages/man2/link.2.html) documentation for more detail. Returns `undefined`. * @since v0.1.31 */ export function linkSync(existingPath: PathLike, newPath: PathLike): void; /** * Creates the link called `path` pointing to `target`. No arguments other than a * possible exception are given to the completion callback. * * See the POSIX [`symlink(2)`](http://man7.org/linux/man-pages/man2/symlink.2.html) documentation for more details. * * The `type` argument is only available on Windows and ignored on other platforms. * It can be set to `'dir'`, `'file'`, or `'junction'`. If the `type` argument is * not a string, Node.js will autodetect `target` type and use `'file'` or `'dir'`. * If the `target` does not exist, `'file'` will be used. Windows junction points * require the destination path to be absolute. When using `'junction'`, the`target` argument will automatically be normalized to absolute path. Junction * points on NTFS volumes can only point to directories. * * Relative targets are relative to the link's parent directory. * * ```js * import { symlink } from 'node:fs'; * * symlink('./mew', './mewtwo', callback); * ``` * * The above example creates a symbolic link `mewtwo` which points to `mew` in the * same directory: * * ```bash * $ tree . * . * ├── mew * └── mewtwo -> ./mew * ``` * @since v0.1.31 * @param [type='null'] */ export function symlink( target: PathLike, path: PathLike, type: symlink.Type | undefined | null, callback: NoParamCallback, ): void; /** * Asynchronous symlink(2) - Create a new symbolic link to an existing file. * @param target A path to an existing file. If a URL is provided, it must use the `file:` protocol. * @param path A path to the new symlink. If a URL is provided, it must use the `file:` protocol. */ export function symlink(target: PathLike, path: PathLike, callback: NoParamCallback): void; export namespace symlink { /** * Asynchronous symlink(2) - Create a new symbolic link to an existing file. * @param target A path to an existing file. If a URL is provided, it must use the `file:` protocol. * @param path A path to the new symlink. If a URL is provided, it must use the `file:` protocol. * @param type May be set to `'dir'`, `'file'`, or `'junction'` (default is `'file'`) and is only available on Windows (ignored on other platforms). * When using `'junction'`, the `target` argument will automatically be normalized to an absolute path. */ function __promisify__(target: PathLike, path: PathLike, type?: string | null): Promise; type Type = "dir" | "file" | "junction"; } /** * Returns `undefined`. * * For detailed information, see the documentation of the asynchronous version of * this API: {@link symlink}. * @since v0.1.31 * @param [type='null'] */ export function symlinkSync(target: PathLike, path: PathLike, type?: symlink.Type | null): void; /** * Reads the contents of the symbolic link referred to by `path`. The callback gets * two arguments `(err, linkString)`. * * See the POSIX [`readlink(2)`](http://man7.org/linux/man-pages/man2/readlink.2.html) documentation for more details. * * The optional `options` argument can be a string specifying an encoding, or an * object with an `encoding` property specifying the character encoding to use for * the link path passed to the callback. If the `encoding` is set to `'buffer'`, * the link path returned will be passed as a `Buffer` object. * @since v0.1.31 */ export function readlink( path: PathLike, options: EncodingOption, callback: (err: NodeJS.ErrnoException | null, linkString: string) => void, ): void; /** * Asynchronous readlink(2) - read value of a symbolic link. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ export function readlink( path: PathLike, options: BufferEncodingOption, callback: (err: NodeJS.ErrnoException | null, linkString: Buffer) => void, ): void; /** * Asynchronous readlink(2) - read value of a symbolic link. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ export function readlink( path: PathLike, options: EncodingOption, callback: (err: NodeJS.ErrnoException | null, linkString: string | Buffer) => void, ): void; /** * Asynchronous readlink(2) - read value of a symbolic link. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. */ export function readlink( path: PathLike, callback: (err: NodeJS.ErrnoException | null, linkString: string) => void, ): void; export namespace readlink { /** * Asynchronous readlink(2) - read value of a symbolic link. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ function __promisify__(path: PathLike, options?: EncodingOption): Promise; /** * Asynchronous readlink(2) - read value of a symbolic link. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ function __promisify__(path: PathLike, options: BufferEncodingOption): Promise; /** * Asynchronous readlink(2) - read value of a symbolic link. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ function __promisify__(path: PathLike, options?: EncodingOption): Promise; } /** * Returns the symbolic link's string value. * * See the POSIX [`readlink(2)`](http://man7.org/linux/man-pages/man2/readlink.2.html) documentation for more details. * * The optional `options` argument can be a string specifying an encoding, or an * object with an `encoding` property specifying the character encoding to use for * the link path returned. If the `encoding` is set to `'buffer'`, * the link path returned will be passed as a `Buffer` object. * @since v0.1.31 */ export function readlinkSync(path: PathLike, options?: EncodingOption): string; /** * Synchronous readlink(2) - read value of a symbolic link. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ export function readlinkSync(path: PathLike, options: BufferEncodingOption): Buffer; /** * Synchronous readlink(2) - read value of a symbolic link. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ export function readlinkSync(path: PathLike, options?: EncodingOption): string | Buffer; /** * Asynchronously computes the canonical pathname by resolving `.`, `..`, and * symbolic links. * * A canonical pathname is not necessarily unique. Hard links and bind mounts can * expose a file system entity through many pathnames. * * This function behaves like [`realpath(3)`](http://man7.org/linux/man-pages/man3/realpath.3.html), with some exceptions: * * 1. No case conversion is performed on case-insensitive file systems. * 2. The maximum number of symbolic links is platform-independent and generally * (much) higher than what the native [`realpath(3)`](http://man7.org/linux/man-pages/man3/realpath.3.html) implementation supports. * * The `callback` gets two arguments `(err, resolvedPath)`. May use `process.cwd` to resolve relative paths. * * Only paths that can be converted to UTF8 strings are supported. * * The optional `options` argument can be a string specifying an encoding, or an * object with an `encoding` property specifying the character encoding to use for * the path passed to the callback. If the `encoding` is set to `'buffer'`, * the path returned will be passed as a `Buffer` object. * * If `path` resolves to a socket or a pipe, the function will return a system * dependent name for that object. * @since v0.1.31 */ export function realpath( path: PathLike, options: EncodingOption, callback: (err: NodeJS.ErrnoException | null, resolvedPath: string) => void, ): void; /** * Asynchronous realpath(3) - return the canonicalized absolute pathname. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ export function realpath( path: PathLike, options: BufferEncodingOption, callback: (err: NodeJS.ErrnoException | null, resolvedPath: Buffer) => void, ): void; /** * Asynchronous realpath(3) - return the canonicalized absolute pathname. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ export function realpath( path: PathLike, options: EncodingOption, callback: (err: NodeJS.ErrnoException | null, resolvedPath: string | Buffer) => void, ): void; /** * Asynchronous realpath(3) - return the canonicalized absolute pathname. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. */ export function realpath( path: PathLike, callback: (err: NodeJS.ErrnoException | null, resolvedPath: string) => void, ): void; export namespace realpath { /** * Asynchronous realpath(3) - return the canonicalized absolute pathname. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ function __promisify__(path: PathLike, options?: EncodingOption): Promise; /** * Asynchronous realpath(3) - return the canonicalized absolute pathname. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ function __promisify__(path: PathLike, options: BufferEncodingOption): Promise; /** * Asynchronous realpath(3) - return the canonicalized absolute pathname. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ function __promisify__(path: PathLike, options?: EncodingOption): Promise; /** * Asynchronous [`realpath(3)`](http://man7.org/linux/man-pages/man3/realpath.3.html). * * The `callback` gets two arguments `(err, resolvedPath)`. * * Only paths that can be converted to UTF8 strings are supported. * * The optional `options` argument can be a string specifying an encoding, or an * object with an `encoding` property specifying the character encoding to use for * the path passed to the callback. If the `encoding` is set to `'buffer'`, * the path returned will be passed as a `Buffer` object. * * On Linux, when Node.js is linked against musl libc, the procfs file system must * be mounted on `/proc` in order for this function to work. Glibc does not have * this restriction. * @since v9.2.0 */ function native( path: PathLike, options: EncodingOption, callback: (err: NodeJS.ErrnoException | null, resolvedPath: string) => void, ): void; function native( path: PathLike, options: BufferEncodingOption, callback: (err: NodeJS.ErrnoException | null, resolvedPath: Buffer) => void, ): void; function native( path: PathLike, options: EncodingOption, callback: (err: NodeJS.ErrnoException | null, resolvedPath: string | Buffer) => void, ): void; function native( path: PathLike, callback: (err: NodeJS.ErrnoException | null, resolvedPath: string) => void, ): void; } /** * Returns the resolved pathname. * * For detailed information, see the documentation of the asynchronous version of * this API: {@link realpath}. * @since v0.1.31 */ export function realpathSync(path: PathLike, options?: EncodingOption): string; /** * Synchronous realpath(3) - return the canonicalized absolute pathname. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ export function realpathSync(path: PathLike, options: BufferEncodingOption): Buffer; /** * Synchronous realpath(3) - return the canonicalized absolute pathname. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ export function realpathSync(path: PathLike, options?: EncodingOption): string | Buffer; export namespace realpathSync { function native(path: PathLike, options?: EncodingOption): string; function native(path: PathLike, options: BufferEncodingOption): Buffer; function native(path: PathLike, options?: EncodingOption): string | Buffer; } /** * Asynchronously removes a file or symbolic link. No arguments other than a * possible exception are given to the completion callback. * * ```js * import { unlink } from 'node:fs'; * // Assuming that 'path/file.txt' is a regular file. * unlink('path/file.txt', (err) => { * if (err) throw err; * console.log('path/file.txt was deleted'); * }); * ``` * * `fs.unlink()` will not work on a directory, empty or otherwise. To remove a * directory, use {@link rmdir}. * * See the POSIX [`unlink(2)`](http://man7.org/linux/man-pages/man2/unlink.2.html) documentation for more details. * @since v0.0.2 */ export function unlink(path: PathLike, callback: NoParamCallback): void; export namespace unlink { /** * Asynchronous unlink(2) - delete a name and possibly the file it refers to. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. */ function __promisify__(path: PathLike): Promise; } /** * Synchronous [`unlink(2)`](http://man7.org/linux/man-pages/man2/unlink.2.html). Returns `undefined`. * @since v0.1.21 */ export function unlinkSync(path: PathLike): void; export interface RmDirOptions { /** * If an `EBUSY`, `EMFILE`, `ENFILE`, `ENOTEMPTY`, or * `EPERM` error is encountered, Node.js will retry the operation with a linear * backoff wait of `retryDelay` ms longer on each try. This option represents the * number of retries. This option is ignored if the `recursive` option is not * `true`. * @default 0 */ maxRetries?: number | undefined; /** * @deprecated since v14.14.0 In future versions of Node.js and will trigger a warning * `fs.rmdir(path, { recursive: true })` will throw if `path` does not exist or is a file. * Use `fs.rm(path, { recursive: true, force: true })` instead. * * If `true`, perform a recursive directory removal. In * recursive mode, operations are retried on failure. * @default false */ recursive?: boolean | undefined; /** * The amount of time in milliseconds to wait between retries. * This option is ignored if the `recursive` option is not `true`. * @default 100 */ retryDelay?: number | undefined; } /** * Asynchronous [`rmdir(2)`](http://man7.org/linux/man-pages/man2/rmdir.2.html). No arguments other than a possible exception are given * to the completion callback. * * Using `fs.rmdir()` on a file (not a directory) results in an `ENOENT` error on * Windows and an `ENOTDIR` error on POSIX. * * To get a behavior similar to the `rm -rf` Unix command, use {@link rm} with options `{ recursive: true, force: true }`. * @since v0.0.2 */ export function rmdir(path: PathLike, callback: NoParamCallback): void; export function rmdir(path: PathLike, options: RmDirOptions, callback: NoParamCallback): void; export namespace rmdir { /** * Asynchronous rmdir(2) - delete a directory. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. */ function __promisify__(path: PathLike, options?: RmDirOptions): Promise; } /** * Synchronous [`rmdir(2)`](http://man7.org/linux/man-pages/man2/rmdir.2.html). Returns `undefined`. * * Using `fs.rmdirSync()` on a file (not a directory) results in an `ENOENT` error * on Windows and an `ENOTDIR` error on POSIX. * * To get a behavior similar to the `rm -rf` Unix command, use {@link rmSync} with options `{ recursive: true, force: true }`. * @since v0.1.21 */ export function rmdirSync(path: PathLike, options?: RmDirOptions): void; export interface RmOptions { /** * When `true`, exceptions will be ignored if `path` does not exist. * @default false */ force?: boolean | undefined; /** * If an `EBUSY`, `EMFILE`, `ENFILE`, `ENOTEMPTY`, or * `EPERM` error is encountered, Node.js will retry the operation with a linear * backoff wait of `retryDelay` ms longer on each try. This option represents the * number of retries. This option is ignored if the `recursive` option is not * `true`. * @default 0 */ maxRetries?: number | undefined; /** * If `true`, perform a recursive directory removal. In * recursive mode, operations are retried on failure. * @default false */ recursive?: boolean | undefined; /** * The amount of time in milliseconds to wait between retries. * This option is ignored if the `recursive` option is not `true`. * @default 100 */ retryDelay?: number | undefined; } /** * Asynchronously removes files and directories (modeled on the standard POSIX `rm` utility). No arguments other than a possible exception are given to the * completion callback. * @since v14.14.0 */ export function rm(path: PathLike, callback: NoParamCallback): void; export function rm(path: PathLike, options: RmOptions, callback: NoParamCallback): void; export namespace rm { /** * Asynchronously removes files and directories (modeled on the standard POSIX `rm` utility). */ function __promisify__(path: PathLike, options?: RmOptions): Promise; } /** * Synchronously removes files and directories (modeled on the standard POSIX `rm` utility). Returns `undefined`. * @since v14.14.0 */ export function rmSync(path: PathLike, options?: RmOptions): void; export interface MakeDirectoryOptions { /** * Indicates whether parent folders should be created. * If a folder was created, the path to the first created folder will be returned. * @default false */ recursive?: boolean | undefined; /** * A file mode. If a string is passed, it is parsed as an octal integer. If not specified * @default 0o777 */ mode?: Mode | undefined; } /** * Asynchronously creates a directory. * * The callback is given a possible exception and, if `recursive` is `true`, the * first directory path created, `(err[, path])`.`path` can still be `undefined` when `recursive` is `true`, if no directory was * created (for instance, if it was previously created). * * The optional `options` argument can be an integer specifying `mode` (permission * and sticky bits), or an object with a `mode` property and a `recursive` property indicating whether parent directories should be created. Calling `fs.mkdir()` when `path` is a directory that * exists results in an error only * when `recursive` is false. If `recursive` is false and the directory exists, * an `EEXIST` error occurs. * * ```js * import { mkdir } from 'node:fs'; * * // Create ./tmp/a/apple, regardless of whether ./tmp and ./tmp/a exist. * mkdir('./tmp/a/apple', { recursive: true }, (err) => { * if (err) throw err; * }); * ``` * * On Windows, using `fs.mkdir()` on the root directory even with recursion will * result in an error: * * ```js * import { mkdir } from 'node:fs'; * * mkdir('/', { recursive: true }, (err) => { * // => [Error: EPERM: operation not permitted, mkdir 'C:\'] * }); * ``` * * See the POSIX [`mkdir(2)`](http://man7.org/linux/man-pages/man2/mkdir.2.html) documentation for more details. * @since v0.1.8 */ export function mkdir( path: PathLike, options: MakeDirectoryOptions & { recursive: true; }, callback: (err: NodeJS.ErrnoException | null, path?: string) => void, ): void; /** * Asynchronous mkdir(2) - create a directory. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options Either the file mode, or an object optionally specifying the file mode and whether parent folders * should be created. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. */ export function mkdir( path: PathLike, options: | Mode | (MakeDirectoryOptions & { recursive?: false | undefined; }) | null | undefined, callback: NoParamCallback, ): void; /** * Asynchronous mkdir(2) - create a directory. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options Either the file mode, or an object optionally specifying the file mode and whether parent folders * should be created. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. */ export function mkdir( path: PathLike, options: Mode | MakeDirectoryOptions | null | undefined, callback: (err: NodeJS.ErrnoException | null, path?: string) => void, ): void; /** * Asynchronous mkdir(2) - create a directory with a mode of `0o777`. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. */ export function mkdir(path: PathLike, callback: NoParamCallback): void; export namespace mkdir { /** * Asynchronous mkdir(2) - create a directory. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options Either the file mode, or an object optionally specifying the file mode and whether parent folders * should be created. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. */ function __promisify__( path: PathLike, options: MakeDirectoryOptions & { recursive: true; }, ): Promise; /** * Asynchronous mkdir(2) - create a directory. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options Either the file mode, or an object optionally specifying the file mode and whether parent folders * should be created. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. */ function __promisify__( path: PathLike, options?: | Mode | (MakeDirectoryOptions & { recursive?: false | undefined; }) | null, ): Promise; /** * Asynchronous mkdir(2) - create a directory. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options Either the file mode, or an object optionally specifying the file mode and whether parent folders * should be created. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. */ function __promisify__( path: PathLike, options?: Mode | MakeDirectoryOptions | null, ): Promise; } /** * Synchronously creates a directory. Returns `undefined`, or if `recursive` is `true`, the first directory path created. * This is the synchronous version of {@link mkdir}. * * See the POSIX [`mkdir(2)`](http://man7.org/linux/man-pages/man2/mkdir.2.html) documentation for more details. * @since v0.1.21 */ export function mkdirSync( path: PathLike, options: MakeDirectoryOptions & { recursive: true; }, ): string | undefined; /** * Synchronous mkdir(2) - create a directory. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options Either the file mode, or an object optionally specifying the file mode and whether parent folders * should be created. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. */ export function mkdirSync( path: PathLike, options?: | Mode | (MakeDirectoryOptions & { recursive?: false | undefined; }) | null, ): void; /** * Synchronous mkdir(2) - create a directory. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options Either the file mode, or an object optionally specifying the file mode and whether parent folders * should be created. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. */ export function mkdirSync(path: PathLike, options?: Mode | MakeDirectoryOptions | null): string | undefined; /** * Creates a unique temporary directory. * * Generates six random characters to be appended behind a required `prefix` to create a unique temporary directory. Due to platform * inconsistencies, avoid trailing `X` characters in `prefix`. Some platforms, * notably the BSDs, can return more than six random characters, and replace * trailing `X` characters in `prefix` with random characters. * * The created directory path is passed as a string to the callback's second * parameter. * * The optional `options` argument can be a string specifying an encoding, or an * object with an `encoding` property specifying the character encoding to use. * * ```js * import { mkdtemp } from 'node:fs'; * import { join } from 'node:path'; * import { tmpdir } from 'node:os'; * * mkdtemp(join(tmpdir(), 'foo-'), (err, directory) => { * if (err) throw err; * console.log(directory); * // Prints: /tmp/foo-itXde2 or C:\Users\...\AppData\Local\Temp\foo-itXde2 * }); * ``` * * The `fs.mkdtemp()` method will append the six randomly selected characters * directly to the `prefix` string. For instance, given a directory `/tmp`, if the * intention is to create a temporary directory _within_`/tmp`, the `prefix`must end with a trailing platform-specific path separator * (`import { sep } from 'node:path'`). * * ```js * import { tmpdir } from 'node:os'; * import { mkdtemp } from 'node:fs'; * * // The parent directory for the new temporary directory * const tmpDir = tmpdir(); * * // This method is *INCORRECT*: * mkdtemp(tmpDir, (err, directory) => { * if (err) throw err; * console.log(directory); * // Will print something similar to `/tmpabc123`. * // A new temporary directory is created at the file system root * // rather than *within* the /tmp directory. * }); * * // This method is *CORRECT*: * import { sep } from 'node:path'; * mkdtemp(`${tmpDir}${sep}`, (err, directory) => { * if (err) throw err; * console.log(directory); * // Will print something similar to `/tmp/abc123`. * // A new temporary directory is created within * // the /tmp directory. * }); * ``` * @since v5.10.0 */ export function mkdtemp( prefix: string, options: EncodingOption, callback: (err: NodeJS.ErrnoException | null, folder: string) => void, ): void; /** * Asynchronously creates a unique temporary directory. * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ export function mkdtemp( prefix: string, options: | "buffer" | { encoding: "buffer"; }, callback: (err: NodeJS.ErrnoException | null, folder: Buffer) => void, ): void; /** * Asynchronously creates a unique temporary directory. * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ export function mkdtemp( prefix: string, options: EncodingOption, callback: (err: NodeJS.ErrnoException | null, folder: string | Buffer) => void, ): void; /** * Asynchronously creates a unique temporary directory. * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. */ export function mkdtemp( prefix: string, callback: (err: NodeJS.ErrnoException | null, folder: string) => void, ): void; export namespace mkdtemp { /** * Asynchronously creates a unique temporary directory. * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ function __promisify__(prefix: string, options?: EncodingOption): Promise; /** * Asynchronously creates a unique temporary directory. * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ function __promisify__(prefix: string, options: BufferEncodingOption): Promise; /** * Asynchronously creates a unique temporary directory. * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ function __promisify__(prefix: string, options?: EncodingOption): Promise; } /** * Returns the created directory path. * * For detailed information, see the documentation of the asynchronous version of * this API: {@link mkdtemp}. * * The optional `options` argument can be a string specifying an encoding, or an * object with an `encoding` property specifying the character encoding to use. * @since v5.10.0 */ export function mkdtempSync(prefix: string, options?: EncodingOption): string; /** * Synchronously creates a unique temporary directory. * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ export function mkdtempSync(prefix: string, options: BufferEncodingOption): Buffer; /** * Synchronously creates a unique temporary directory. * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ export function mkdtempSync(prefix: string, options?: EncodingOption): string | Buffer; /** * Reads the contents of a directory. The callback gets two arguments `(err, files)` where `files` is an array of the names of the files in the directory excluding `'.'` and `'..'`. * * See the POSIX [`readdir(3)`](http://man7.org/linux/man-pages/man3/readdir.3.html) documentation for more details. * * The optional `options` argument can be a string specifying an encoding, or an * object with an `encoding` property specifying the character encoding to use for * the filenames passed to the callback. If the `encoding` is set to `'buffer'`, * the filenames returned will be passed as `Buffer` objects. * * If `options.withFileTypes` is set to `true`, the `files` array will contain `fs.Dirent` objects. * @since v0.1.8 */ export function readdir( path: PathLike, options: | { encoding: BufferEncoding | null; withFileTypes?: false | undefined; recursive?: boolean | undefined; } | BufferEncoding | undefined | null, callback: (err: NodeJS.ErrnoException | null, files: string[]) => void, ): void; /** * Asynchronous readdir(3) - read a directory. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ export function readdir( path: PathLike, options: | { encoding: "buffer"; withFileTypes?: false | undefined; recursive?: boolean | undefined; } | "buffer", callback: (err: NodeJS.ErrnoException | null, files: Buffer[]) => void, ): void; /** * Asynchronous readdir(3) - read a directory. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ export function readdir( path: PathLike, options: | (ObjectEncodingOptions & { withFileTypes?: false | undefined; recursive?: boolean | undefined; }) | BufferEncoding | undefined | null, callback: (err: NodeJS.ErrnoException | null, files: string[] | Buffer[]) => void, ): void; /** * Asynchronous readdir(3) - read a directory. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. */ export function readdir( path: PathLike, callback: (err: NodeJS.ErrnoException | null, files: string[]) => void, ): void; /** * Asynchronous readdir(3) - read a directory. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options If called with `withFileTypes: true` the result data will be an array of Dirent. */ export function readdir( path: PathLike, options: ObjectEncodingOptions & { withFileTypes: true; recursive?: boolean | undefined; }, callback: (err: NodeJS.ErrnoException | null, files: Dirent[]) => void, ): void; export namespace readdir { /** * Asynchronous readdir(3) - read a directory. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ function __promisify__( path: PathLike, options?: | { encoding: BufferEncoding | null; withFileTypes?: false | undefined; recursive?: boolean | undefined; } | BufferEncoding | null, ): Promise; /** * Asynchronous readdir(3) - read a directory. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ function __promisify__( path: PathLike, options: | "buffer" | { encoding: "buffer"; withFileTypes?: false | undefined; recursive?: boolean | undefined; }, ): Promise; /** * Asynchronous readdir(3) - read a directory. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ function __promisify__( path: PathLike, options?: | (ObjectEncodingOptions & { withFileTypes?: false | undefined; recursive?: boolean | undefined; }) | BufferEncoding | null, ): Promise; /** * Asynchronous readdir(3) - read a directory. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options If called with `withFileTypes: true` the result data will be an array of Dirent */ function __promisify__( path: PathLike, options: ObjectEncodingOptions & { withFileTypes: true; recursive?: boolean | undefined; }, ): Promise; } /** * Reads the contents of the directory. * * See the POSIX [`readdir(3)`](http://man7.org/linux/man-pages/man3/readdir.3.html) documentation for more details. * * The optional `options` argument can be a string specifying an encoding, or an * object with an `encoding` property specifying the character encoding to use for * the filenames returned. If the `encoding` is set to `'buffer'`, * the filenames returned will be passed as `Buffer` objects. * * If `options.withFileTypes` is set to `true`, the result will contain `fs.Dirent` objects. * @since v0.1.21 */ export function readdirSync( path: PathLike, options?: | { encoding: BufferEncoding | null; withFileTypes?: false | undefined; recursive?: boolean | undefined; } | BufferEncoding | null, ): string[]; /** * Synchronous readdir(3) - read a directory. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ export function readdirSync( path: PathLike, options: | { encoding: "buffer"; withFileTypes?: false | undefined; recursive?: boolean | undefined; } | "buffer", ): Buffer[]; /** * Synchronous readdir(3) - read a directory. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. */ export function readdirSync( path: PathLike, options?: | (ObjectEncodingOptions & { withFileTypes?: false | undefined; recursive?: boolean | undefined; }) | BufferEncoding | null, ): string[] | Buffer[]; /** * Synchronous readdir(3) - read a directory. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param options If called with `withFileTypes: true` the result data will be an array of Dirent. */ export function readdirSync( path: PathLike, options: ObjectEncodingOptions & { withFileTypes: true; recursive?: boolean | undefined; }, ): Dirent[]; /** * Closes the file descriptor. No arguments other than a possible exception are * given to the completion callback. * * Calling `fs.close()` on any file descriptor (`fd`) that is currently in use * through any other `fs` operation may lead to undefined behavior. * * See the POSIX [`close(2)`](http://man7.org/linux/man-pages/man2/close.2.html) documentation for more detail. * @since v0.0.2 */ export function close(fd: number, callback?: NoParamCallback): void; export namespace close { /** * Asynchronous close(2) - close a file descriptor. * @param fd A file descriptor. */ function __promisify__(fd: number): Promise; } /** * Closes the file descriptor. Returns `undefined`. * * Calling `fs.closeSync()` on any file descriptor (`fd`) that is currently in use * through any other `fs` operation may lead to undefined behavior. * * See the POSIX [`close(2)`](http://man7.org/linux/man-pages/man2/close.2.html) documentation for more detail. * @since v0.1.21 */ export function closeSync(fd: number): void; /** * Asynchronous file open. See the POSIX [`open(2)`](http://man7.org/linux/man-pages/man2/open.2.html) documentation for more details. * * `mode` sets the file mode (permission and sticky bits), but only if the file was * created. On Windows, only the write permission can be manipulated; see {@link chmod}. * * The callback gets two arguments `(err, fd)`. * * Some characters (`< > : " / \ | ? *`) are reserved under Windows as documented * by [Naming Files, Paths, and Namespaces](https://docs.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file). Under NTFS, if the filename contains * a colon, Node.js will open a file system stream, as described by [this MSDN page](https://docs.microsoft.com/en-us/windows/desktop/FileIO/using-streams). * * Functions based on `fs.open()` exhibit this behavior as well:`fs.writeFile()`, `fs.readFile()`, etc. * @since v0.0.2 * @param [flags='r'] See `support of file system `flags``. * @param [mode=0o666] */ export function open( path: PathLike, flags: OpenMode | undefined, mode: Mode | undefined | null, callback: (err: NodeJS.ErrnoException | null, fd: number) => void, ): void; /** * Asynchronous open(2) - open and possibly create a file. If the file is created, its mode will be `0o666`. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param [flags='r'] See `support of file system `flags``. */ export function open( path: PathLike, flags: OpenMode | undefined, callback: (err: NodeJS.ErrnoException | null, fd: number) => void, ): void; /** * Asynchronous open(2) - open and possibly create a file. If the file is created, its mode will be `0o666`. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. */ export function open(path: PathLike, callback: (err: NodeJS.ErrnoException | null, fd: number) => void): void; export namespace open { /** * Asynchronous open(2) - open and possibly create a file. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param mode A file mode. If a string is passed, it is parsed as an octal integer. If not supplied, defaults to `0o666`. */ function __promisify__(path: PathLike, flags: OpenMode, mode?: Mode | null): Promise; } /** * Returns an integer representing the file descriptor. * * For detailed information, see the documentation of the asynchronous version of * this API: {@link open}. * @since v0.1.21 * @param [flags='r'] * @param [mode=0o666] */ export function openSync(path: PathLike, flags: OpenMode, mode?: Mode | null): number; /** * Change the file system timestamps of the object referenced by `path`. * * The `atime` and `mtime` arguments follow these rules: * * * Values can be either numbers representing Unix epoch time in seconds, `Date`s, or a numeric string like `'123456789.0'`. * * If the value can not be converted to a number, or is `NaN`, `Infinity`, or `-Infinity`, an `Error` will be thrown. * @since v0.4.2 */ export function utimes(path: PathLike, atime: TimeLike, mtime: TimeLike, callback: NoParamCallback): void; export namespace utimes { /** * Asynchronously change file timestamps of the file referenced by the supplied path. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * @param atime The last access time. If a string is provided, it will be coerced to number. * @param mtime The last modified time. If a string is provided, it will be coerced to number. */ function __promisify__(path: PathLike, atime: TimeLike, mtime: TimeLike): Promise; } /** * Returns `undefined`. * * For detailed information, see the documentation of the asynchronous version of * this API: {@link utimes}. * @since v0.4.2 */ export function utimesSync(path: PathLike, atime: TimeLike, mtime: TimeLike): void; /** * Change the file system timestamps of the object referenced by the supplied file * descriptor. See {@link utimes}. * @since v0.4.2 */ export function futimes(fd: number, atime: TimeLike, mtime: TimeLike, callback: NoParamCallback): void; export namespace futimes { /** * Asynchronously change file timestamps of the file referenced by the supplied file descriptor. * @param fd A file descriptor. * @param atime The last access time. If a string is provided, it will be coerced to number. * @param mtime The last modified time. If a string is provided, it will be coerced to number. */ function __promisify__(fd: number, atime: TimeLike, mtime: TimeLike): Promise; } /** * Synchronous version of {@link futimes}. Returns `undefined`. * @since v0.4.2 */ export function futimesSync(fd: number, atime: TimeLike, mtime: TimeLike): void; /** * Request that all data for the open file descriptor is flushed to the storage * device. The specific implementation is operating system and device specific. * Refer to the POSIX [`fsync(2)`](http://man7.org/linux/man-pages/man2/fsync.2.html) documentation for more detail. No arguments other * than a possible exception are given to the completion callback. * @since v0.1.96 */ export function fsync(fd: number, callback: NoParamCallback): void; export namespace fsync { /** * Asynchronous fsync(2) - synchronize a file's in-core state with the underlying storage device. * @param fd A file descriptor. */ function __promisify__(fd: number): Promise; } /** * Request that all data for the open file descriptor is flushed to the storage * device. The specific implementation is operating system and device specific. * Refer to the POSIX [`fsync(2)`](http://man7.org/linux/man-pages/man2/fsync.2.html) documentation for more detail. Returns `undefined`. * @since v0.1.96 */ export function fsyncSync(fd: number): void; /** * Write `buffer` to the file specified by `fd`. * * `offset` determines the part of the buffer to be written, and `length` is * an integer specifying the number of bytes to write. * * `position` refers to the offset from the beginning of the file where this data * should be written. If `typeof position !== 'number'`, the data will be written * at the current position. See [`pwrite(2)`](http://man7.org/linux/man-pages/man2/pwrite.2.html). * * The callback will be given three arguments `(err, bytesWritten, buffer)` where `bytesWritten` specifies how many _bytes_ were written from `buffer`. * * If this method is invoked as its `util.promisify()` ed version, it returns * a promise for an `Object` with `bytesWritten` and `buffer` properties. * * It is unsafe to use `fs.write()` multiple times on the same file without waiting * for the callback. For this scenario, {@link createWriteStream} is * recommended. * * On Linux, positional writes don't work when the file is opened in append mode. * The kernel ignores the position argument and always appends the data to * the end of the file. * @since v0.0.2 * @param [offset=0] * @param [length=buffer.byteLength - offset] * @param [position='null'] */ export function write( fd: number, buffer: TBuffer, offset: number | undefined | null, length: number | undefined | null, position: number | undefined | null, callback: (err: NodeJS.ErrnoException | null, written: number, buffer: TBuffer) => void, ): void; /** * Asynchronously writes `buffer` to the file referenced by the supplied file descriptor. * @param fd A file descriptor. * @param offset The part of the buffer to be written. If not supplied, defaults to `0`. * @param length The number of bytes to write. If not supplied, defaults to `buffer.length - offset`. */ export function write( fd: number, buffer: TBuffer, offset: number | undefined | null, length: number | undefined | null, callback: (err: NodeJS.ErrnoException | null, written: number, buffer: TBuffer) => void, ): void; /** * Asynchronously writes `buffer` to the file referenced by the supplied file descriptor. * @param fd A file descriptor. * @param offset The part of the buffer to be written. If not supplied, defaults to `0`. */ export function write( fd: number, buffer: TBuffer, offset: number | undefined | null, callback: (err: NodeJS.ErrnoException | null, written: number, buffer: TBuffer) => void, ): void; /** * Asynchronously writes `buffer` to the file referenced by the supplied file descriptor. * @param fd A file descriptor. */ export function write( fd: number, buffer: TBuffer, callback: (err: NodeJS.ErrnoException | null, written: number, buffer: TBuffer) => void, ): void; /** * Asynchronously writes `string` to the file referenced by the supplied file descriptor. * @param fd A file descriptor. * @param string A string to write. * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. * @param encoding The expected string encoding. */ export function write( fd: number, string: string, position: number | undefined | null, encoding: BufferEncoding | undefined | null, callback: (err: NodeJS.ErrnoException | null, written: number, str: string) => void, ): void; /** * Asynchronously writes `string` to the file referenced by the supplied file descriptor. * @param fd A file descriptor. * @param string A string to write. * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. */ export function write( fd: number, string: string, position: number | undefined | null, callback: (err: NodeJS.ErrnoException | null, written: number, str: string) => void, ): void; /** * Asynchronously writes `string` to the file referenced by the supplied file descriptor. * @param fd A file descriptor. * @param string A string to write. */ export function write( fd: number, string: string, callback: (err: NodeJS.ErrnoException | null, written: number, str: string) => void, ): void; export namespace write { /** * Asynchronously writes `buffer` to the file referenced by the supplied file descriptor. * @param fd A file descriptor. * @param offset The part of the buffer to be written. If not supplied, defaults to `0`. * @param length The number of bytes to write. If not supplied, defaults to `buffer.length - offset`. * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. */ function __promisify__( fd: number, buffer?: TBuffer, offset?: number, length?: number, position?: number | null, ): Promise<{ bytesWritten: number; buffer: TBuffer; }>; /** * Asynchronously writes `string` to the file referenced by the supplied file descriptor. * @param fd A file descriptor. * @param string A string to write. * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. * @param encoding The expected string encoding. */ function __promisify__( fd: number, string: string, position?: number | null, encoding?: BufferEncoding | null, ): Promise<{ bytesWritten: number; buffer: string; }>; } /** * For detailed information, see the documentation of the asynchronous version of * this API: {@link write}. * @since v0.1.21 * @param [offset=0] * @param [length=buffer.byteLength - offset] * @param [position='null'] * @return The number of bytes written. */ export function writeSync( fd: number, buffer: NodeJS.ArrayBufferView, offset?: number | null, length?: number | null, position?: number | null, ): number; /** * Synchronously writes `string` to the file referenced by the supplied file descriptor, returning the number of bytes written. * @param fd A file descriptor. * @param string A string to write. * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. * @param encoding The expected string encoding. */ export function writeSync( fd: number, string: string, position?: number | null, encoding?: BufferEncoding | null, ): number; export type ReadPosition = number | bigint; export interface ReadSyncOptions { /** * @default 0 */ offset?: number | undefined; /** * @default `length of buffer` */ length?: number | undefined; /** * @default null */ position?: ReadPosition | null | undefined; } export interface ReadAsyncOptions extends ReadSyncOptions { buffer?: TBuffer; } /** * Read data from the file specified by `fd`. * * The callback is given the three arguments, `(err, bytesRead, buffer)`. * * If the file is not modified concurrently, the end-of-file is reached when the * number of bytes read is zero. * * If this method is invoked as its `util.promisify()` ed version, it returns * a promise for an `Object` with `bytesRead` and `buffer` properties. * @since v0.0.2 * @param buffer The buffer that the data will be written to. * @param offset The position in `buffer` to write the data to. * @param length The number of bytes to read. * @param position Specifies where to begin reading from in the file. If `position` is `null` or `-1 `, data will be read from the current file position, and the file position will be updated. If * `position` is an integer, the file position will be unchanged. */ export function read( fd: number, buffer: TBuffer, offset: number, length: number, position: ReadPosition | null, callback: (err: NodeJS.ErrnoException | null, bytesRead: number, buffer: TBuffer) => void, ): void; /** * Similar to the above `fs.read` function, this version takes an optional `options` object. * If not otherwise specified in an `options` object, * `buffer` defaults to `Buffer.alloc(16384)`, * `offset` defaults to `0`, * `length` defaults to `buffer.byteLength`, `- offset` as of Node 17.6.0 * `position` defaults to `null` * @since v12.17.0, 13.11.0 */ export function read( fd: number, options: ReadAsyncOptions, callback: (err: NodeJS.ErrnoException | null, bytesRead: number, buffer: TBuffer) => void, ): void; export function read( fd: number, callback: (err: NodeJS.ErrnoException | null, bytesRead: number, buffer: NodeJS.ArrayBufferView) => void, ): void; export namespace read { /** * @param fd A file descriptor. * @param buffer The buffer that the data will be written to. * @param offset The offset in the buffer at which to start writing. * @param length The number of bytes to read. * @param position The offset from the beginning of the file from which data should be read. If `null`, data will be read from the current position. */ function __promisify__( fd: number, buffer: TBuffer, offset: number, length: number, position: number | null, ): Promise<{ bytesRead: number; buffer: TBuffer; }>; function __promisify__( fd: number, options: ReadAsyncOptions, ): Promise<{ bytesRead: number; buffer: TBuffer; }>; function __promisify__(fd: number): Promise<{ bytesRead: number; buffer: NodeJS.ArrayBufferView; }>; } /** * Returns the number of `bytesRead`. * * For detailed information, see the documentation of the asynchronous version of * this API: {@link read}. * @since v0.1.21 * @param [position='null'] */ export function readSync( fd: number, buffer: NodeJS.ArrayBufferView, offset: number, length: number, position: ReadPosition | null, ): number; /** * Similar to the above `fs.readSync` function, this version takes an optional `options` object. * If no `options` object is specified, it will default with the above values. */ export function readSync(fd: number, buffer: NodeJS.ArrayBufferView, opts?: ReadSyncOptions): number; /** * Asynchronously reads the entire contents of a file. * * ```js * import { readFile } from 'node:fs'; * * readFile('/etc/passwd', (err, data) => { * if (err) throw err; * console.log(data); * }); * ``` * * The callback is passed two arguments `(err, data)`, where `data` is the * contents of the file. * * If no encoding is specified, then the raw buffer is returned. * * If `options` is a string, then it specifies the encoding: * * ```js * import { readFile } from 'node:fs'; * * readFile('/etc/passwd', 'utf8', callback); * ``` * * When the path is a directory, the behavior of `fs.readFile()` and {@link readFileSync} is platform-specific. On macOS, Linux, and Windows, an * error will be returned. On FreeBSD, a representation of the directory's contents * will be returned. * * ```js * import { readFile } from 'node:fs'; * * // macOS, Linux, and Windows * readFile('', (err, data) => { * // => [Error: EISDIR: illegal operation on a directory, read ] * }); * * // FreeBSD * readFile('', (err, data) => { * // => null, * }); * ``` * * It is possible to abort an ongoing request using an `AbortSignal`. If a * request is aborted the callback is called with an `AbortError`: * * ```js * import { readFile } from 'node:fs'; * * const controller = new AbortController(); * const signal = controller.signal; * readFile(fileInfo[0].name, { signal }, (err, buf) => { * // ... * }); * // When you want to abort the request * controller.abort(); * ``` * * The `fs.readFile()` function buffers the entire file. To minimize memory costs, * when possible prefer streaming via `fs.createReadStream()`. * * Aborting an ongoing request does not abort individual operating * system requests but rather the internal buffering `fs.readFile` performs. * @since v0.1.29 * @param path filename or file descriptor */ export function readFile( path: PathOrFileDescriptor, options: | ({ encoding?: null | undefined; flag?: string | undefined; } & Abortable) | undefined | null, callback: (err: NodeJS.ErrnoException | null, data: Buffer) => void, ): void; /** * Asynchronously reads the entire contents of a file. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * If a file descriptor is provided, the underlying file will _not_ be closed automatically. * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. * If a flag is not provided, it defaults to `'r'`. */ export function readFile( path: PathOrFileDescriptor, options: | ({ encoding: BufferEncoding; flag?: string | undefined; } & Abortable) | BufferEncoding, callback: (err: NodeJS.ErrnoException | null, data: string) => void, ): void; /** * Asynchronously reads the entire contents of a file. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * If a file descriptor is provided, the underlying file will _not_ be closed automatically. * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. * If a flag is not provided, it defaults to `'r'`. */ export function readFile( path: PathOrFileDescriptor, options: | (ObjectEncodingOptions & { flag?: string | undefined; } & Abortable) | BufferEncoding | undefined | null, callback: (err: NodeJS.ErrnoException | null, data: string | Buffer) => void, ): void; /** * Asynchronously reads the entire contents of a file. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * If a file descriptor is provided, the underlying file will _not_ be closed automatically. */ export function readFile( path: PathOrFileDescriptor, callback: (err: NodeJS.ErrnoException | null, data: Buffer) => void, ): void; export namespace readFile { /** * Asynchronously reads the entire contents of a file. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * If a file descriptor is provided, the underlying file will _not_ be closed automatically. * @param options An object that may contain an optional flag. * If a flag is not provided, it defaults to `'r'`. */ function __promisify__( path: PathOrFileDescriptor, options?: { encoding?: null | undefined; flag?: string | undefined; } | null, ): Promise; /** * Asynchronously reads the entire contents of a file. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * URL support is _experimental_. * If a file descriptor is provided, the underlying file will _not_ be closed automatically. * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. * If a flag is not provided, it defaults to `'r'`. */ function __promisify__( path: PathOrFileDescriptor, options: | { encoding: BufferEncoding; flag?: string | undefined; } | BufferEncoding, ): Promise; /** * Asynchronously reads the entire contents of a file. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * URL support is _experimental_. * If a file descriptor is provided, the underlying file will _not_ be closed automatically. * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. * If a flag is not provided, it defaults to `'r'`. */ function __promisify__( path: PathOrFileDescriptor, options?: | (ObjectEncodingOptions & { flag?: string | undefined; }) | BufferEncoding | null, ): Promise; } /** * Returns the contents of the `path`. * * For detailed information, see the documentation of the asynchronous version of * this API: {@link readFile}. * * If the `encoding` option is specified then this function returns a * string. Otherwise it returns a buffer. * * Similar to {@link readFile}, when the path is a directory, the behavior of `fs.readFileSync()` is platform-specific. * * ```js * import { readFileSync } from 'node:fs'; * * // macOS, Linux, and Windows * readFileSync(''); * // => [Error: EISDIR: illegal operation on a directory, read ] * * // FreeBSD * readFileSync(''); // => * ``` * @since v0.1.8 * @param path filename or file descriptor */ export function readFileSync( path: PathOrFileDescriptor, options?: { encoding?: null | undefined; flag?: string | undefined; } | null, ): Buffer; /** * Synchronously reads the entire contents of a file. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * If a file descriptor is provided, the underlying file will _not_ be closed automatically. * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. * If a flag is not provided, it defaults to `'r'`. */ export function readFileSync( path: PathOrFileDescriptor, options: | { encoding: BufferEncoding; flag?: string | undefined; } | BufferEncoding, ): string; /** * Synchronously reads the entire contents of a file. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * If a file descriptor is provided, the underlying file will _not_ be closed automatically. * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. * If a flag is not provided, it defaults to `'r'`. */ export function readFileSync( path: PathOrFileDescriptor, options?: | (ObjectEncodingOptions & { flag?: string | undefined; }) | BufferEncoding | null, ): string | Buffer; export type WriteFileOptions = | ( & ObjectEncodingOptions & Abortable & { mode?: Mode | undefined; flag?: string | undefined; flush?: boolean | undefined; } ) | BufferEncoding | null; /** * When `file` is a filename, asynchronously writes data to the file, replacing the * file if it already exists. `data` can be a string or a buffer. * * When `file` is a file descriptor, the behavior is similar to calling `fs.write()` directly (which is recommended). See the notes below on using * a file descriptor. * * The `encoding` option is ignored if `data` is a buffer. * * The `mode` option only affects the newly created file. See {@link open} for more details. * * ```js * import { writeFile } from 'node:fs'; * import { Buffer } from 'node:buffer'; * * const data = new Uint8Array(Buffer.from('Hello Node.js')); * writeFile('message.txt', data, (err) => { * if (err) throw err; * console.log('The file has been saved!'); * }); * ``` * * If `options` is a string, then it specifies the encoding: * * ```js * import { writeFile } from 'node:fs'; * * writeFile('message.txt', 'Hello Node.js', 'utf8', callback); * ``` * * It is unsafe to use `fs.writeFile()` multiple times on the same file without * waiting for the callback. For this scenario, {@link createWriteStream} is * recommended. * * Similarly to `fs.readFile` \- `fs.writeFile` is a convenience method that * performs multiple `write` calls internally to write the buffer passed to it. * For performance sensitive code consider using {@link createWriteStream}. * * It is possible to use an `AbortSignal` to cancel an `fs.writeFile()`. * Cancelation is "best effort", and some amount of data is likely still * to be written. * * ```js * import { writeFile } from 'node:fs'; * import { Buffer } from 'node:buffer'; * * const controller = new AbortController(); * const { signal } = controller; * const data = new Uint8Array(Buffer.from('Hello Node.js')); * writeFile('message.txt', data, { signal }, (err) => { * // When a request is aborted - the callback is called with an AbortError * }); * // When the request should be aborted * controller.abort(); * ``` * * Aborting an ongoing request does not abort individual operating * system requests but rather the internal buffering `fs.writeFile` performs. * @since v0.1.29 * @param file filename or file descriptor */ export function writeFile( file: PathOrFileDescriptor, data: string | NodeJS.ArrayBufferView, options: WriteFileOptions, callback: NoParamCallback, ): void; /** * Asynchronously writes data to a file, replacing the file if it already exists. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * If a file descriptor is provided, the underlying file will _not_ be closed automatically. * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. */ export function writeFile( path: PathOrFileDescriptor, data: string | NodeJS.ArrayBufferView, callback: NoParamCallback, ): void; export namespace writeFile { /** * Asynchronously writes data to a file, replacing the file if it already exists. * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. * URL support is _experimental_. * If a file descriptor is provided, the underlying file will _not_ be closed automatically. * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. * If `encoding` is not supplied, the default of `'utf8'` is used. * If `mode` is not supplied, the default of `0o666` is used. * If `mode` is a string, it is parsed as an octal integer. * If `flag` is not supplied, the default of `'w'` is used. */ function __promisify__( path: PathOrFileDescriptor, data: string | NodeJS.ArrayBufferView, options?: WriteFileOptions, ): Promise; } /** * Returns `undefined`. * * The `mode` option only affects the newly created file. See {@link open} for more details. * * For detailed information, see the documentation of the asynchronous version of * this API: {@link writeFile}. * @since v0.1.29 * @param file filename or file descriptor */ export function writeFileSync( file: PathOrFileDescriptor, data: string | NodeJS.ArrayBufferView, options?: WriteFileOptions, ): void; /** * Asynchronously append data to a file, creating the file if it does not yet * exist. `data` can be a string or a `Buffer`. * * The `mode` option only affects the newly created file. See {@link open} for more details. * * ```js * import { appendFile } from 'node:fs'; * * appendFile('message.txt', 'data to append', (err) => { * if (err) throw err; * console.log('The "data to append" was appended to file!'); * }); * ``` * * If `options` is a string, then it specifies the encoding: * * ```js * import { appendFile } from 'node:fs'; * * appendFile('message.txt', 'data to append', 'utf8', callback); * ``` * * The `path` may be specified as a numeric file descriptor that has been opened * for appending (using `fs.open()` or `fs.openSync()`). The file descriptor will * not be closed automatically. * * ```js * import { open, close, appendFile } from 'node:fs'; * * function closeFd(fd) { * close(fd, (err) => { * if (err) throw err; * }); * } * * open('message.txt', 'a', (err, fd) => { * if (err) throw err; * * try { * appendFile(fd, 'data to append', 'utf8', (err) => { * closeFd(fd); * if (err) throw err; * }); * } catch (err) { * closeFd(fd); * throw err; * } * }); * ``` * @since v0.6.7 * @param path filename or file descriptor */ export function appendFile( path: PathOrFileDescriptor, data: string | Uint8Array, options: WriteFileOptions, callback: NoParamCallback, ): void; /** * Asynchronously append data to a file, creating the file if it does not exist. * @param file A path to a file. If a URL is provided, it must use the `file:` protocol. * If a file descriptor is provided, the underlying file will _not_ be closed automatically. * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. */ export function appendFile(file: PathOrFileDescriptor, data: string | Uint8Array, callback: NoParamCallback): void; export namespace appendFile { /** * Asynchronously append data to a file, creating the file if it does not exist. * @param file A path to a file. If a URL is provided, it must use the `file:` protocol. * URL support is _experimental_. * If a file descriptor is provided, the underlying file will _not_ be closed automatically. * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. * If `encoding` is not supplied, the default of `'utf8'` is used. * If `mode` is not supplied, the default of `0o666` is used. * If `mode` is a string, it is parsed as an octal integer. * If `flag` is not supplied, the default of `'a'` is used. */ function __promisify__( file: PathOrFileDescriptor, data: string | Uint8Array, options?: WriteFileOptions, ): Promise; } /** * Synchronously append data to a file, creating the file if it does not yet * exist. `data` can be a string or a `Buffer`. * * The `mode` option only affects the newly created file. See {@link open} for more details. * * ```js * import { appendFileSync } from 'node:fs'; * * try { * appendFileSync('message.txt', 'data to append'); * console.log('The "data to append" was appended to file!'); * } catch (err) { * // Handle the error * } * ``` * * If `options` is a string, then it specifies the encoding: * * ```js * import { appendFileSync } from 'node:fs'; * * appendFileSync('message.txt', 'data to append', 'utf8'); * ``` * * The `path` may be specified as a numeric file descriptor that has been opened * for appending (using `fs.open()` or `fs.openSync()`). The file descriptor will * not be closed automatically. * * ```js * import { openSync, closeSync, appendFileSync } from 'node:fs'; * * let fd; * * try { * fd = openSync('message.txt', 'a'); * appendFileSync(fd, 'data to append', 'utf8'); * } catch (err) { * // Handle the error * } finally { * if (fd !== undefined) * closeSync(fd); * } * ``` * @since v0.6.7 * @param path filename or file descriptor */ export function appendFileSync( path: PathOrFileDescriptor, data: string | Uint8Array, options?: WriteFileOptions, ): void; /** * Watch for changes on `filename`. The callback `listener` will be called each * time the file is accessed. * * The `options` argument may be omitted. If provided, it should be an object. The `options` object may contain a boolean named `persistent` that indicates * whether the process should continue to run as long as files are being watched. * The `options` object may specify an `interval` property indicating how often the * target should be polled in milliseconds. * * The `listener` gets two arguments the current stat object and the previous * stat object: * * ```js * import { watchFile } from 'node:fs'; * * watchFile('message.text', (curr, prev) => { * console.log(`the current mtime is: ${curr.mtime}`); * console.log(`the previous mtime was: ${prev.mtime}`); * }); * ``` * * These stat objects are instances of `fs.Stat`. If the `bigint` option is `true`, * the numeric values in these objects are specified as `BigInt`s. * * To be notified when the file was modified, not just accessed, it is necessary * to compare `curr.mtimeMs` and `prev.mtimeMs`. * * When an `fs.watchFile` operation results in an `ENOENT` error, it * will invoke the listener once, with all the fields zeroed (or, for dates, the * Unix Epoch). If the file is created later on, the listener will be called * again, with the latest stat objects. This is a change in functionality since * v0.10. * * Using {@link watch} is more efficient than `fs.watchFile` and `fs.unwatchFile`. `fs.watch` should be used instead of `fs.watchFile` and `fs.unwatchFile` when possible. * * When a file being watched by `fs.watchFile()` disappears and reappears, * then the contents of `previous` in the second callback event (the file's * reappearance) will be the same as the contents of `previous` in the first * callback event (its disappearance). * * This happens when: * * * the file is deleted, followed by a restore * * the file is renamed and then renamed a second time back to its original name * @since v0.1.31 */ export interface WatchFileOptions { bigint?: boolean | undefined; persistent?: boolean | undefined; interval?: number | undefined; } /** * Watch for changes on `filename`. The callback `listener` will be called each * time the file is accessed. * * The `options` argument may be omitted. If provided, it should be an object. The `options` object may contain a boolean named `persistent` that indicates * whether the process should continue to run as long as files are being watched. * The `options` object may specify an `interval` property indicating how often the * target should be polled in milliseconds. * * The `listener` gets two arguments the current stat object and the previous * stat object: * * ```js * import { watchFile } from 'node:fs'; * * watchFile('message.text', (curr, prev) => { * console.log(`the current mtime is: ${curr.mtime}`); * console.log(`the previous mtime was: ${prev.mtime}`); * }); * ``` * * These stat objects are instances of `fs.Stat`. If the `bigint` option is `true`, * the numeric values in these objects are specified as `BigInt`s. * * To be notified when the file was modified, not just accessed, it is necessary * to compare `curr.mtimeMs` and `prev.mtimeMs`. * * When an `fs.watchFile` operation results in an `ENOENT` error, it * will invoke the listener once, with all the fields zeroed (or, for dates, the * Unix Epoch). If the file is created later on, the listener will be called * again, with the latest stat objects. This is a change in functionality since * v0.10. * * Using {@link watch} is more efficient than `fs.watchFile` and `fs.unwatchFile`. `fs.watch` should be used instead of `fs.watchFile` and `fs.unwatchFile` when possible. * * When a file being watched by `fs.watchFile()` disappears and reappears, * then the contents of `previous` in the second callback event (the file's * reappearance) will be the same as the contents of `previous` in the first * callback event (its disappearance). * * This happens when: * * * the file is deleted, followed by a restore * * the file is renamed and then renamed a second time back to its original name * @since v0.1.31 */ export function watchFile( filename: PathLike, options: | (WatchFileOptions & { bigint?: false | undefined; }) | undefined, listener: StatsListener, ): StatWatcher; export function watchFile( filename: PathLike, options: | (WatchFileOptions & { bigint: true; }) | undefined, listener: BigIntStatsListener, ): StatWatcher; /** * Watch for changes on `filename`. The callback `listener` will be called each time the file is accessed. * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. */ export function watchFile(filename: PathLike, listener: StatsListener): StatWatcher; /** * Stop watching for changes on `filename`. If `listener` is specified, only that * particular listener is removed. Otherwise, _all_ listeners are removed, * effectively stopping watching of `filename`. * * Calling `fs.unwatchFile()` with a filename that is not being watched is a * no-op, not an error. * * Using {@link watch} is more efficient than `fs.watchFile()` and `fs.unwatchFile()`. `fs.watch()` should be used instead of `fs.watchFile()` and `fs.unwatchFile()` when possible. * @since v0.1.31 * @param listener Optional, a listener previously attached using `fs.watchFile()` */ export function unwatchFile(filename: PathLike, listener?: StatsListener): void; export function unwatchFile(filename: PathLike, listener?: BigIntStatsListener): void; export interface WatchOptions extends Abortable { encoding?: BufferEncoding | "buffer" | undefined; persistent?: boolean | undefined; recursive?: boolean | undefined; } export type WatchEventType = "rename" | "change"; export type WatchListener = (event: WatchEventType, filename: T | null) => void; export type StatsListener = (curr: Stats, prev: Stats) => void; export type BigIntStatsListener = (curr: BigIntStats, prev: BigIntStats) => void; /** * Watch for changes on `filename`, where `filename` is either a file or a * directory. * * The second argument is optional. If `options` is provided as a string, it * specifies the `encoding`. Otherwise `options` should be passed as an object. * * The listener callback gets two arguments `(eventType, filename)`. `eventType`is either `'rename'` or `'change'`, and `filename` is the name of the file * which triggered the event. * * On most platforms, `'rename'` is emitted whenever a filename appears or * disappears in the directory. * * The listener callback is attached to the `'change'` event fired by `fs.FSWatcher`, but it is not the same thing as the `'change'` value of `eventType`. * * If a `signal` is passed, aborting the corresponding AbortController will close * the returned `fs.FSWatcher`. * @since v0.5.10 * @param listener */ export function watch( filename: PathLike, options: | (WatchOptions & { encoding: "buffer"; }) | "buffer", listener?: WatchListener, ): FSWatcher; /** * Watch for changes on `filename`, where `filename` is either a file or a directory, returning an `FSWatcher`. * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. * @param options Either the encoding for the filename provided to the listener, or an object optionally specifying encoding, persistent, and recursive options. * If `encoding` is not supplied, the default of `'utf8'` is used. * If `persistent` is not supplied, the default of `true` is used. * If `recursive` is not supplied, the default of `false` is used. */ export function watch( filename: PathLike, options?: WatchOptions | BufferEncoding | null, listener?: WatchListener, ): FSWatcher; /** * Watch for changes on `filename`, where `filename` is either a file or a directory, returning an `FSWatcher`. * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. * @param options Either the encoding for the filename provided to the listener, or an object optionally specifying encoding, persistent, and recursive options. * If `encoding` is not supplied, the default of `'utf8'` is used. * If `persistent` is not supplied, the default of `true` is used. * If `recursive` is not supplied, the default of `false` is used. */ export function watch( filename: PathLike, options: WatchOptions | string, listener?: WatchListener, ): FSWatcher; /** * Watch for changes on `filename`, where `filename` is either a file or a directory, returning an `FSWatcher`. * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. */ export function watch(filename: PathLike, listener?: WatchListener): FSWatcher; /** * Test whether or not the given path exists by checking with the file system. * Then call the `callback` argument with either true or false: * * ```js * import { exists } from 'node:fs'; * * exists('/etc/passwd', (e) => { * console.log(e ? 'it exists' : 'no passwd!'); * }); * ``` * * **The parameters for this callback are not consistent with other Node.js** * **callbacks.** Normally, the first parameter to a Node.js callback is an `err` parameter, optionally followed by other parameters. The `fs.exists()` callback * has only one boolean parameter. This is one reason `fs.access()` is recommended * instead of `fs.exists()`. * * Using `fs.exists()` to check for the existence of a file before calling `fs.open()`, `fs.readFile()`, or `fs.writeFile()` is not recommended. Doing * so introduces a race condition, since other processes may change the file's * state between the two calls. Instead, user code should open/read/write the * file directly and handle the error raised if the file does not exist. * * **write (NOT RECOMMENDED)** * * ```js * import { exists, open, close } from 'node:fs'; * * exists('myfile', (e) => { * if (e) { * console.error('myfile already exists'); * } else { * open('myfile', 'wx', (err, fd) => { * if (err) throw err; * * try { * writeMyData(fd); * } finally { * close(fd, (err) => { * if (err) throw err; * }); * } * }); * } * }); * ``` * * **write (RECOMMENDED)** * * ```js * import { open, close } from 'node:fs'; * open('myfile', 'wx', (err, fd) => { * if (err) { * if (err.code === 'EEXIST') { * console.error('myfile already exists'); * return; * } * * throw err; * } * * try { * writeMyData(fd); * } finally { * close(fd, (err) => { * if (err) throw err; * }); * } * }); * ``` * * **read (NOT RECOMMENDED)** * * ```js * import { open, close, exists } from 'node:fs'; * * exists('myfile', (e) => { * if (e) { * open('myfile', 'r', (err, fd) => { * if (err) throw err; * * try { * readMyData(fd); * } finally { * close(fd, (err) => { * if (err) throw err; * }); * } * }); * } else { * console.error('myfile does not exist'); * } * }); * ``` * * **read (RECOMMENDED)** * * ```js * import { open, close } from 'node:fs'; * * open('myfile', 'r', (err, fd) => { * if (err) { * if (err.code === 'ENOENT') { * console.error('myfile does not exist'); * return; * } * * throw err; * } * * try { * readMyData(fd); * } finally { * close(fd, (err) => { * if (err) throw err; * }); * } * }); * ``` * * The "not recommended" examples above check for existence and then use the * file; the "recommended" examples are better because they use the file directly * and handle the error, if any. * * In general, check for the existence of a file only if the file won't be * used directly, for example when its existence is a signal from another * process. * @since v0.0.2 * @deprecated Since v1.0.0 - Use {@link stat} or {@link access} instead. */ export function exists(path: PathLike, callback: (exists: boolean) => void): void; /** @deprecated */ export namespace exists { /** * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. * URL support is _experimental_. */ function __promisify__(path: PathLike): Promise; } /** * Returns `true` if the path exists, `false` otherwise. * * For detailed information, see the documentation of the asynchronous version of * this API: {@link exists}. * * `fs.exists()` is deprecated, but `fs.existsSync()` is not. The `callback` parameter to `fs.exists()` accepts parameters that are inconsistent with other * Node.js callbacks. `fs.existsSync()` does not use a callback. * * ```js * import { existsSync } from 'node:fs'; * * if (existsSync('/etc/passwd')) * console.log('The path exists.'); * ``` * @since v0.1.21 */ export function existsSync(path: PathLike): boolean; export namespace constants { // File Access Constants /** Constant for fs.access(). File is visible to the calling process. */ const F_OK: number; /** Constant for fs.access(). File can be read by the calling process. */ const R_OK: number; /** Constant for fs.access(). File can be written by the calling process. */ const W_OK: number; /** Constant for fs.access(). File can be executed by the calling process. */ const X_OK: number; // File Copy Constants /** Constant for fs.copyFile. Flag indicating the destination file should not be overwritten if it already exists. */ const COPYFILE_EXCL: number; /** * Constant for fs.copyFile. copy operation will attempt to create a copy-on-write reflink. * If the underlying platform does not support copy-on-write, then a fallback copy mechanism is used. */ const COPYFILE_FICLONE: number; /** * Constant for fs.copyFile. Copy operation will attempt to create a copy-on-write reflink. * If the underlying platform does not support copy-on-write, then the operation will fail with an error. */ const COPYFILE_FICLONE_FORCE: number; // File Open Constants /** Constant for fs.open(). Flag indicating to open a file for read-only access. */ const O_RDONLY: number; /** Constant for fs.open(). Flag indicating to open a file for write-only access. */ const O_WRONLY: number; /** Constant for fs.open(). Flag indicating to open a file for read-write access. */ const O_RDWR: number; /** Constant for fs.open(). Flag indicating to create the file if it does not already exist. */ const O_CREAT: number; /** Constant for fs.open(). Flag indicating that opening a file should fail if the O_CREAT flag is set and the file already exists. */ const O_EXCL: number; /** * Constant for fs.open(). Flag indicating that if path identifies a terminal device, * opening the path shall not cause that terminal to become the controlling terminal for the process * (if the process does not already have one). */ const O_NOCTTY: number; /** Constant for fs.open(). Flag indicating that if the file exists and is a regular file, and the file is opened successfully for write access, its length shall be truncated to zero. */ const O_TRUNC: number; /** Constant for fs.open(). Flag indicating that data will be appended to the end of the file. */ const O_APPEND: number; /** Constant for fs.open(). Flag indicating that the open should fail if the path is not a directory. */ const O_DIRECTORY: number; /** * constant for fs.open(). * Flag indicating reading accesses to the file system will no longer result in * an update to the atime information associated with the file. * This flag is available on Linux operating systems only. */ const O_NOATIME: number; /** Constant for fs.open(). Flag indicating that the open should fail if the path is a symbolic link. */ const O_NOFOLLOW: number; /** Constant for fs.open(). Flag indicating that the file is opened for synchronous I/O. */ const O_SYNC: number; /** Constant for fs.open(). Flag indicating that the file is opened for synchronous I/O with write operations waiting for data integrity. */ const O_DSYNC: number; /** Constant for fs.open(). Flag indicating to open the symbolic link itself rather than the resource it is pointing to. */ const O_SYMLINK: number; /** Constant for fs.open(). When set, an attempt will be made to minimize caching effects of file I/O. */ const O_DIRECT: number; /** Constant for fs.open(). Flag indicating to open the file in nonblocking mode when possible. */ const O_NONBLOCK: number; // File Type Constants /** Constant for fs.Stats mode property for determining a file's type. Bit mask used to extract the file type code. */ const S_IFMT: number; /** Constant for fs.Stats mode property for determining a file's type. File type constant for a regular file. */ const S_IFREG: number; /** Constant for fs.Stats mode property for determining a file's type. File type constant for a directory. */ const S_IFDIR: number; /** Constant for fs.Stats mode property for determining a file's type. File type constant for a character-oriented device file. */ const S_IFCHR: number; /** Constant for fs.Stats mode property for determining a file's type. File type constant for a block-oriented device file. */ const S_IFBLK: number; /** Constant for fs.Stats mode property for determining a file's type. File type constant for a FIFO/pipe. */ const S_IFIFO: number; /** Constant for fs.Stats mode property for determining a file's type. File type constant for a symbolic link. */ const S_IFLNK: number; /** Constant for fs.Stats mode property for determining a file's type. File type constant for a socket. */ const S_IFSOCK: number; // File Mode Constants /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable, writable and executable by owner. */ const S_IRWXU: number; /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable by owner. */ const S_IRUSR: number; /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating writable by owner. */ const S_IWUSR: number; /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating executable by owner. */ const S_IXUSR: number; /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable, writable and executable by group. */ const S_IRWXG: number; /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable by group. */ const S_IRGRP: number; /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating writable by group. */ const S_IWGRP: number; /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating executable by group. */ const S_IXGRP: number; /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable, writable and executable by others. */ const S_IRWXO: number; /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable by others. */ const S_IROTH: number; /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating writable by others. */ const S_IWOTH: number; /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating executable by others. */ const S_IXOTH: number; /** * When set, a memory file mapping is used to access the file. This flag * is available on Windows operating systems only. On other operating systems, * this flag is ignored. */ const UV_FS_O_FILEMAP: number; } /** * Tests a user's permissions for the file or directory specified by `path`. * The `mode` argument is an optional integer that specifies the accessibility * checks to be performed. `mode` should be either the value `fs.constants.F_OK` or a mask consisting of the bitwise OR of any of `fs.constants.R_OK`, `fs.constants.W_OK`, and `fs.constants.X_OK` * (e.g.`fs.constants.W_OK | fs.constants.R_OK`). Check `File access constants` for * possible values of `mode`. * * The final argument, `callback`, is a callback function that is invoked with * a possible error argument. If any of the accessibility checks fail, the error * argument will be an `Error` object. The following examples check if `package.json` exists, and if it is readable or writable. * * ```js * import { access, constants } from 'node:fs'; * * const file = 'package.json'; * * // Check if the file exists in the current directory. * access(file, constants.F_OK, (err) => { * console.log(`${file} ${err ? 'does not exist' : 'exists'}`); * }); * * // Check if the file is readable. * access(file, constants.R_OK, (err) => { * console.log(`${file} ${err ? 'is not readable' : 'is readable'}`); * }); * * // Check if the file is writable. * access(file, constants.W_OK, (err) => { * console.log(`${file} ${err ? 'is not writable' : 'is writable'}`); * }); * * // Check if the file is readable and writable. * access(file, constants.R_OK | constants.W_OK, (err) => { * console.log(`${file} ${err ? 'is not' : 'is'} readable and writable`); * }); * ``` * * Do not use `fs.access()` to check for the accessibility of a file before calling `fs.open()`, `fs.readFile()`, or `fs.writeFile()`. Doing * so introduces a race condition, since other processes may change the file's * state between the two calls. Instead, user code should open/read/write the * file directly and handle the error raised if the file is not accessible. * * **write (NOT RECOMMENDED)** * * ```js * import { access, open, close } from 'node:fs'; * * access('myfile', (err) => { * if (!err) { * console.error('myfile already exists'); * return; * } * * open('myfile', 'wx', (err, fd) => { * if (err) throw err; * * try { * writeMyData(fd); * } finally { * close(fd, (err) => { * if (err) throw err; * }); * } * }); * }); * ``` * * **write (RECOMMENDED)** * * ```js * import { open, close } from 'node:fs'; * * open('myfile', 'wx', (err, fd) => { * if (err) { * if (err.code === 'EEXIST') { * console.error('myfile already exists'); * return; * } * * throw err; * } * * try { * writeMyData(fd); * } finally { * close(fd, (err) => { * if (err) throw err; * }); * } * }); * ``` * * **read (NOT RECOMMENDED)** * * ```js * import { access, open, close } from 'node:fs'; * access('myfile', (err) => { * if (err) { * if (err.code === 'ENOENT') { * console.error('myfile does not exist'); * return; * } * * throw err; * } * * open('myfile', 'r', (err, fd) => { * if (err) throw err; * * try { * readMyData(fd); * } finally { * close(fd, (err) => { * if (err) throw err; * }); * } * }); * }); * ``` * * **read (RECOMMENDED)** * * ```js * import { open, close } from 'node:fs'; * * open('myfile', 'r', (err, fd) => { * if (err) { * if (err.code === 'ENOENT') { * console.error('myfile does not exist'); * return; * } * * throw err; * } * * try { * readMyData(fd); * } finally { * close(fd, (err) => { * if (err) throw err; * }); * } * }); * ``` * * The "not recommended" examples above check for accessibility and then use the * file; the "recommended" examples are better because they use the file directly * and handle the error, if any. * * In general, check for the accessibility of a file only if the file will not be * used directly, for example when its accessibility is a signal from another * process. * * On Windows, access-control policies (ACLs) on a directory may limit access to * a file or directory. The `fs.access()` function, however, does not check the * ACL and therefore may report that a path is accessible even if the ACL restricts * the user from reading or writing to it. * @since v0.11.15 * @param [mode=fs.constants.F_OK] */ export function access(path: PathLike, mode: number | undefined, callback: NoParamCallback): void; /** * Asynchronously tests a user's permissions for the file specified by path. * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. */ export function access(path: PathLike, callback: NoParamCallback): void; export namespace access { /** * Asynchronously tests a user's permissions for the file specified by path. * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. * URL support is _experimental_. */ function __promisify__(path: PathLike, mode?: number): Promise; } /** * Synchronously tests a user's permissions for the file or directory specified * by `path`. The `mode` argument is an optional integer that specifies the * accessibility checks to be performed. `mode` should be either the value `fs.constants.F_OK` or a mask consisting of the bitwise OR of any of `fs.constants.R_OK`, `fs.constants.W_OK`, and * `fs.constants.X_OK` (e.g.`fs.constants.W_OK | fs.constants.R_OK`). Check `File access constants` for * possible values of `mode`. * * If any of the accessibility checks fail, an `Error` will be thrown. Otherwise, * the method will return `undefined`. * * ```js * import { accessSync, constants } from 'node:fs'; * * try { * accessSync('etc/passwd', constants.R_OK | constants.W_OK); * console.log('can read/write'); * } catch (err) { * console.error('no access!'); * } * ``` * @since v0.11.15 * @param [mode=fs.constants.F_OK] */ export function accessSync(path: PathLike, mode?: number): void; interface StreamOptions { flags?: string | undefined; encoding?: BufferEncoding | undefined; fd?: number | promises.FileHandle | undefined; mode?: number | undefined; autoClose?: boolean | undefined; emitClose?: boolean | undefined; start?: number | undefined; signal?: AbortSignal | null | undefined; highWaterMark?: number | undefined; } interface FSImplementation { open?: (...args: any[]) => any; close?: (...args: any[]) => any; } interface CreateReadStreamFSImplementation extends FSImplementation { read: (...args: any[]) => any; } interface CreateWriteStreamFSImplementation extends FSImplementation { write: (...args: any[]) => any; writev?: (...args: any[]) => any; } interface ReadStreamOptions extends StreamOptions { fs?: CreateReadStreamFSImplementation | null | undefined; end?: number | undefined; } interface WriteStreamOptions extends StreamOptions { fs?: CreateWriteStreamFSImplementation | null | undefined; flush?: boolean | undefined; } /** * `options` can include `start` and `end` values to read a range of bytes from * the file instead of the entire file. Both `start` and `end` are inclusive and * start counting at 0, allowed values are in the * \[0, [`Number.MAX_SAFE_INTEGER`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)\] range. If `fd` is specified and `start` is * omitted or `undefined`, `fs.createReadStream()` reads sequentially from the * current file position. The `encoding` can be any one of those accepted by `Buffer`. * * If `fd` is specified, `ReadStream` will ignore the `path` argument and will use * the specified file descriptor. This means that no `'open'` event will be * emitted. `fd` should be blocking; non-blocking `fd`s should be passed to `net.Socket`. * * If `fd` points to a character device that only supports blocking reads * (such as keyboard or sound card), read operations do not finish until data is * available. This can prevent the process from exiting and the stream from * closing naturally. * * By default, the stream will emit a `'close'` event after it has been * destroyed. Set the `emitClose` option to `false` to change this behavior. * * By providing the `fs` option, it is possible to override the corresponding `fs` implementations for `open`, `read`, and `close`. When providing the `fs` option, * an override for `read` is required. If no `fd` is provided, an override for `open` is also required. If `autoClose` is `true`, an override for `close` is * also required. * * ```js * import { createReadStream } from 'node:fs'; * * // Create a stream from some character device. * const stream = createReadStream('/dev/input/event0'); * setTimeout(() => { * stream.close(); // This may not close the stream. * // Artificially marking end-of-stream, as if the underlying resource had * // indicated end-of-file by itself, allows the stream to close. * // This does not cancel pending read operations, and if there is such an * // operation, the process may still not be able to exit successfully * // until it finishes. * stream.push(null); * stream.read(0); * }, 100); * ``` * * If `autoClose` is false, then the file descriptor won't be closed, even if * there's an error. It is the application's responsibility to close it and make * sure there's no file descriptor leak. If `autoClose` is set to true (default * behavior), on `'error'` or `'end'` the file descriptor will be closed * automatically. * * `mode` sets the file mode (permission and sticky bits), but only if the * file was created. * * An example to read the last 10 bytes of a file which is 100 bytes long: * * ```js * import { createReadStream } from 'node:fs'; * * createReadStream('sample.txt', { start: 90, end: 99 }); * ``` * * If `options` is a string, then it specifies the encoding. * @since v0.1.31 */ export function createReadStream(path: PathLike, options?: BufferEncoding | ReadStreamOptions): ReadStream; /** * `options` may also include a `start` option to allow writing data at some * position past the beginning of the file, allowed values are in the * \[0, [`Number.MAX_SAFE_INTEGER`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)\] range. Modifying a file rather than * replacing it may require the `flags` option to be set to `r+` rather than the * default `w`. The `encoding` can be any one of those accepted by `Buffer`. * * If `autoClose` is set to true (default behavior) on `'error'` or `'finish'` the file descriptor will be closed automatically. If `autoClose` is false, * then the file descriptor won't be closed, even if there's an error. * It is the application's responsibility to close it and make sure there's no * file descriptor leak. * * By default, the stream will emit a `'close'` event after it has been * destroyed. Set the `emitClose` option to `false` to change this behavior. * * By providing the `fs` option it is possible to override the corresponding `fs` implementations for `open`, `write`, `writev`, and `close`. Overriding `write()` without `writev()` can reduce * performance as some optimizations (`_writev()`) * will be disabled. When providing the `fs` option, overrides for at least one of `write` and `writev` are required. If no `fd` option is supplied, an override * for `open` is also required. If `autoClose` is `true`, an override for `close` is also required. * * Like `fs.ReadStream`, if `fd` is specified, `fs.WriteStream` will ignore the `path` argument and will use the specified file descriptor. This means that no `'open'` event will be * emitted. `fd` should be blocking; non-blocking `fd`s * should be passed to `net.Socket`. * * If `options` is a string, then it specifies the encoding. * @since v0.1.31 */ export function createWriteStream(path: PathLike, options?: BufferEncoding | WriteStreamOptions): WriteStream; /** * Forces all currently queued I/O operations associated with the file to the * operating system's synchronized I/O completion state. Refer to the POSIX [`fdatasync(2)`](http://man7.org/linux/man-pages/man2/fdatasync.2.html) documentation for details. No arguments other * than a possible * exception are given to the completion callback. * @since v0.1.96 */ export function fdatasync(fd: number, callback: NoParamCallback): void; export namespace fdatasync { /** * Asynchronous fdatasync(2) - synchronize a file's in-core state with storage device. * @param fd A file descriptor. */ function __promisify__(fd: number): Promise; } /** * Forces all currently queued I/O operations associated with the file to the * operating system's synchronized I/O completion state. Refer to the POSIX [`fdatasync(2)`](http://man7.org/linux/man-pages/man2/fdatasync.2.html) documentation for details. Returns `undefined`. * @since v0.1.96 */ export function fdatasyncSync(fd: number): void; /** * Asynchronously copies `src` to `dest`. By default, `dest` is overwritten if it * already exists. No arguments other than a possible exception are given to the * callback function. Node.js makes no guarantees about the atomicity of the copy * operation. If an error occurs after the destination file has been opened for * writing, Node.js will attempt to remove the destination. * * `mode` is an optional integer that specifies the behavior * of the copy operation. It is possible to create a mask consisting of the bitwise * OR of two or more values (e.g.`fs.constants.COPYFILE_EXCL | fs.constants.COPYFILE_FICLONE`). * * * `fs.constants.COPYFILE_EXCL`: The copy operation will fail if `dest` already * exists. * * `fs.constants.COPYFILE_FICLONE`: The copy operation will attempt to create a * copy-on-write reflink. If the platform does not support copy-on-write, then a * fallback copy mechanism is used. * * `fs.constants.COPYFILE_FICLONE_FORCE`: The copy operation will attempt to * create a copy-on-write reflink. If the platform does not support * copy-on-write, then the operation will fail. * * ```js * import { copyFile, constants } from 'node:fs'; * * function callback(err) { * if (err) throw err; * console.log('source.txt was copied to destination.txt'); * } * * // destination.txt will be created or overwritten by default. * copyFile('source.txt', 'destination.txt', callback); * * // By using COPYFILE_EXCL, the operation will fail if destination.txt exists. * copyFile('source.txt', 'destination.txt', constants.COPYFILE_EXCL, callback); * ``` * @since v8.5.0 * @param src source filename to copy * @param dest destination filename of the copy operation * @param [mode=0] modifiers for copy operation. */ export function copyFile(src: PathLike, dest: PathLike, callback: NoParamCallback): void; export function copyFile(src: PathLike, dest: PathLike, mode: number, callback: NoParamCallback): void; export namespace copyFile { function __promisify__(src: PathLike, dst: PathLike, mode?: number): Promise; } /** * Synchronously copies `src` to `dest`. By default, `dest` is overwritten if it * already exists. Returns `undefined`. Node.js makes no guarantees about the * atomicity of the copy operation. If an error occurs after the destination file * has been opened for writing, Node.js will attempt to remove the destination. * * `mode` is an optional integer that specifies the behavior * of the copy operation. It is possible to create a mask consisting of the bitwise * OR of two or more values (e.g.`fs.constants.COPYFILE_EXCL | fs.constants.COPYFILE_FICLONE`). * * * `fs.constants.COPYFILE_EXCL`: The copy operation will fail if `dest` already * exists. * * `fs.constants.COPYFILE_FICLONE`: The copy operation will attempt to create a * copy-on-write reflink. If the platform does not support copy-on-write, then a * fallback copy mechanism is used. * * `fs.constants.COPYFILE_FICLONE_FORCE`: The copy operation will attempt to * create a copy-on-write reflink. If the platform does not support * copy-on-write, then the operation will fail. * * ```js * import { copyFileSync, constants } from 'node:fs'; * * // destination.txt will be created or overwritten by default. * copyFileSync('source.txt', 'destination.txt'); * console.log('source.txt was copied to destination.txt'); * * // By using COPYFILE_EXCL, the operation will fail if destination.txt exists. * copyFileSync('source.txt', 'destination.txt', constants.COPYFILE_EXCL); * ``` * @since v8.5.0 * @param src source filename to copy * @param dest destination filename of the copy operation * @param [mode=0] modifiers for copy operation. */ export function copyFileSync(src: PathLike, dest: PathLike, mode?: number): void; /** * Write an array of `ArrayBufferView`s to the file specified by `fd` using `writev()`. * * `position` is the offset from the beginning of the file where this data * should be written. If `typeof position !== 'number'`, the data will be written * at the current position. * * The callback will be given three arguments: `err`, `bytesWritten`, and `buffers`. `bytesWritten` is how many bytes were written from `buffers`. * * If this method is `util.promisify()` ed, it returns a promise for an `Object` with `bytesWritten` and `buffers` properties. * * It is unsafe to use `fs.writev()` multiple times on the same file without * waiting for the callback. For this scenario, use {@link createWriteStream}. * * On Linux, positional writes don't work when the file is opened in append mode. * The kernel ignores the position argument and always appends the data to * the end of the file. * @since v12.9.0 * @param [position='null'] */ export function writev( fd: number, buffers: readonly NodeJS.ArrayBufferView[], cb: (err: NodeJS.ErrnoException | null, bytesWritten: number, buffers: NodeJS.ArrayBufferView[]) => void, ): void; export function writev( fd: number, buffers: readonly NodeJS.ArrayBufferView[], position: number, cb: (err: NodeJS.ErrnoException | null, bytesWritten: number, buffers: NodeJS.ArrayBufferView[]) => void, ): void; export interface WriteVResult { bytesWritten: number; buffers: NodeJS.ArrayBufferView[]; } export namespace writev { function __promisify__( fd: number, buffers: readonly NodeJS.ArrayBufferView[], position?: number, ): Promise; } /** * For detailed information, see the documentation of the asynchronous version of * this API: {@link writev}. * @since v12.9.0 * @param [position='null'] * @return The number of bytes written. */ export function writevSync(fd: number, buffers: readonly NodeJS.ArrayBufferView[], position?: number): number; /** * Read from a file specified by `fd` and write to an array of `ArrayBufferView`s * using `readv()`. * * `position` is the offset from the beginning of the file from where data * should be read. If `typeof position !== 'number'`, the data will be read * from the current position. * * The callback will be given three arguments: `err`, `bytesRead`, and `buffers`. `bytesRead` is how many bytes were read from the file. * * If this method is invoked as its `util.promisify()` ed version, it returns * a promise for an `Object` with `bytesRead` and `buffers` properties. * @since v13.13.0, v12.17.0 * @param [position='null'] */ export function readv( fd: number, buffers: readonly NodeJS.ArrayBufferView[], cb: (err: NodeJS.ErrnoException | null, bytesRead: number, buffers: NodeJS.ArrayBufferView[]) => void, ): void; export function readv( fd: number, buffers: readonly NodeJS.ArrayBufferView[], position: number, cb: (err: NodeJS.ErrnoException | null, bytesRead: number, buffers: NodeJS.ArrayBufferView[]) => void, ): void; export interface ReadVResult { bytesRead: number; buffers: NodeJS.ArrayBufferView[]; } export namespace readv { function __promisify__( fd: number, buffers: readonly NodeJS.ArrayBufferView[], position?: number, ): Promise; } /** * For detailed information, see the documentation of the asynchronous version of * this API: {@link readv}. * @since v13.13.0, v12.17.0 * @param [position='null'] * @return The number of bytes read. */ export function readvSync(fd: number, buffers: readonly NodeJS.ArrayBufferView[], position?: number): number; export interface OpenAsBlobOptions { /** * An optional mime type for the blob. * * @default 'undefined' */ type?: string | undefined; } /** * Returns a `Blob` whose data is backed by the given file. * * The file must not be modified after the `Blob` is created. Any modifications * will cause reading the `Blob` data to fail with a `DOMException` error. * Synchronous stat operations on the file when the `Blob` is created, and before * each read in order to detect whether the file data has been modified on disk. * * ```js * import { openAsBlob } from 'node:fs'; * * const blob = await openAsBlob('the.file.txt'); * const ab = await blob.arrayBuffer(); * blob.stream(); * ``` * @since v19.8.0 * @experimental */ export function openAsBlob(path: PathLike, options?: OpenAsBlobOptions): Promise; export interface OpenDirOptions { /** * @default 'utf8' */ encoding?: BufferEncoding | undefined; /** * Number of directory entries that are buffered * internally when reading from the directory. Higher values lead to better * performance but higher memory usage. * @default 32 */ bufferSize?: number | undefined; /** * @default false */ recursive?: boolean; } /** * Synchronously open a directory. See [`opendir(3)`](http://man7.org/linux/man-pages/man3/opendir.3.html). * * Creates an `fs.Dir`, which contains all further functions for reading from * and cleaning up the directory. * * The `encoding` option sets the encoding for the `path` while opening the * directory and subsequent read operations. * @since v12.12.0 */ export function opendirSync(path: PathLike, options?: OpenDirOptions): Dir; /** * Asynchronously open a directory. See the POSIX [`opendir(3)`](http://man7.org/linux/man-pages/man3/opendir.3.html) documentation for * more details. * * Creates an `fs.Dir`, which contains all further functions for reading from * and cleaning up the directory. * * The `encoding` option sets the encoding for the `path` while opening the * directory and subsequent read operations. * @since v12.12.0 */ export function opendir(path: PathLike, cb: (err: NodeJS.ErrnoException | null, dir: Dir) => void): void; export function opendir( path: PathLike, options: OpenDirOptions, cb: (err: NodeJS.ErrnoException | null, dir: Dir) => void, ): void; export namespace opendir { function __promisify__(path: PathLike, options?: OpenDirOptions): Promise; } export interface BigIntStats extends StatsBase { atimeNs: bigint; mtimeNs: bigint; ctimeNs: bigint; birthtimeNs: bigint; } export interface BigIntOptions { bigint: true; } export interface StatOptions { bigint?: boolean | undefined; } export interface StatSyncOptions extends StatOptions { throwIfNoEntry?: boolean | undefined; } interface CopyOptionsBase { /** * Dereference symlinks * @default false */ dereference?: boolean; /** * When `force` is `false`, and the destination * exists, throw an error. * @default false */ errorOnExist?: boolean; /** * Overwrite existing file or directory. _The copy * operation will ignore errors if you set this to false and the destination * exists. Use the `errorOnExist` option to change this behavior. * @default true */ force?: boolean; /** * Modifiers for copy operation. See `mode` flag of {@link copyFileSync()} */ mode?: number; /** * When `true` timestamps from `src` will * be preserved. * @default false */ preserveTimestamps?: boolean; /** * Copy directories recursively. * @default false */ recursive?: boolean; /** * When true, path resolution for symlinks will be skipped * @default false */ verbatimSymlinks?: boolean; } export interface CopyOptions extends CopyOptionsBase { /** * Function to filter copied files/directories. Return * `true` to copy the item, `false` to ignore it. */ filter?(source: string, destination: string): boolean | Promise; } export interface CopySyncOptions extends CopyOptionsBase { /** * Function to filter copied files/directories. Return * `true` to copy the item, `false` to ignore it. */ filter?(source: string, destination: string): boolean; } /** * Asynchronously copies the entire directory structure from `src` to `dest`, * including subdirectories and files. * * When copying a directory to another directory, globs are not supported and * behavior is similar to `cp dir1/ dir2/`. * @since v16.7.0 * @experimental * @param src source path to copy. * @param dest destination path to copy to. */ export function cp( source: string | URL, destination: string | URL, callback: (err: NodeJS.ErrnoException | null) => void, ): void; export function cp( source: string | URL, destination: string | URL, opts: CopyOptions, callback: (err: NodeJS.ErrnoException | null) => void, ): void; /** * Synchronously copies the entire directory structure from `src` to `dest`, * including subdirectories and files. * * When copying a directory to another directory, globs are not supported and * behavior is similar to `cp dir1/ dir2/`. * @since v16.7.0 * @experimental * @param src source path to copy. * @param dest destination path to copy to. */ export function cpSync(source: string | URL, destination: string | URL, opts?: CopySyncOptions): void; interface GlobOptionsBase { /** * Current working directory. * @default process.cwd() */ cwd?: string | undefined; /** * `true` if the glob should return paths as `Dirent`s, `false` otherwise. * @default false * @since v22.2.0 */ withFileTypes?: boolean | undefined; /** * Function to filter out files/directories. Return true to exclude the item, false to include it. */ exclude?: ((fileName: any) => boolean) | undefined; } export interface GlobOptionsWithFileTypes extends GlobOptionsBase { exclude?: ((fileName: Dirent) => boolean) | undefined; withFileTypes: true; } export interface GlobOptionsWithoutFileTypes extends GlobOptionsBase { exclude?: ((fileName: string) => boolean) | undefined; withFileTypes?: false | undefined; } export interface GlobOptions extends GlobOptionsBase { exclude?: ((fileName: Dirent | string) => boolean) | undefined; } /** * Retrieves the files matching the specified pattern. */ export function glob( pattern: string | string[], callback: (err: NodeJS.ErrnoException | null, matches: string[]) => void, ): void; export function glob( pattern: string | string[], options: GlobOptionsWithFileTypes, callback: ( err: NodeJS.ErrnoException | null, matches: Dirent[], ) => void, ): void; export function glob( pattern: string | string[], options: GlobOptionsWithoutFileTypes, callback: ( err: NodeJS.ErrnoException | null, matches: string[], ) => void, ): void; export function glob( pattern: string | string[], options: GlobOptions, callback: ( err: NodeJS.ErrnoException | null, matches: Dirent[] | string[], ) => void, ): void; /** * Retrieves the files matching the specified pattern. */ export function globSync(pattern: string | string[]): string[]; export function globSync( pattern: string | string[], options: GlobOptionsWithFileTypes, ): Dirent[]; export function globSync( pattern: string | string[], options: GlobOptionsWithoutFileTypes, ): string[]; export function globSync( pattern: string | string[], options: GlobOptions, ): Dirent[] | string[]; } declare module "node:fs" { export * from "fs"; }