Skip to content

feat: add fs/append-file #1967

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 24 commits into from
May 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
62619dc
added append-file utility in stdlib/fs
Mar 20, 2024
eb22d52
chore: update copyright years
stdlib-bot Mar 20, 2024
2adca00
Attempts to solve the following issues in the PR
Mar 21, 2024
7cffcf1
Merge branch 'added-fs/appendFile' of https://github.com/HRIDYANSHU05…
Mar 21, 2024
72d1a58
attempt to solve the linting issues cming in the previous PRa
Mar 21, 2024
5392ab4
Made changes to adhere to the repo lint rules and solve othr errors h…
Mar 22, 2024
d24494e
Solves some more ESlint and JSdoc issues
Mar 24, 2024
36e8441
Solved linting and JSDoc issues
Mar 24, 2024
9b90c66
Imporoved some more CI check errors
Mar 25, 2024
939e4c4
Attempted to solve the errors coming during CI
Mar 25, 2024
1d520b7
Corrected JSdoc issues
Mar 25, 2024
dabd7c8
Solved some more JSdoc errors
Mar 25, 2024
50f7950
some more CI checks solved
Mar 25, 2024
6535535
Solved require statement of file is missing a file extension.
Mar 25, 2024
5eb9ef6
Solves -> Block-scoped variables in strict mode are not supported unt…
Mar 25, 2024
194ba06
Code Review Requested changes have implemented
Apr 5, 2024
8ae0cc7
some more index.d.ts style fixes
Apr 5, 2024
3946190
fixed some CI issues
Apr 12, 2024
f3af3ab
fixed some CI issues
Apr 12, 2024
53c9546
Update lib/node_modules/@stdlib/fs/append-file/test/fixtures/stdin_er…
Planeshifter May 18, 2024
de3efac
Update lib/node_modules/@stdlib/fs/append-file/README.md
Planeshifter May 18, 2024
df40c67
Update lib/node_modules/@stdlib/fs/append-file/package.json
Planeshifter May 18, 2024
3e0f924
Update lib/node_modules/@stdlib/fs/append-file/test/fixtures/write_er…
Planeshifter May 18, 2024
a7ec466
Update lib/node_modules/@stdlib/fs/append-file/README.md
Planeshifter May 18, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
239 changes: 239 additions & 0 deletions lib/node_modules/@stdlib/fs/append-file/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,239 @@
<!--

@license Apache-2.0

Copyright (c) 2024 The Stdlib Authors.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

-->

# Append File

> Append data to a file.

<section class="usage">

## Usage

```javascript
var appendFile = require( '@stdlib/fs/append-file' );
```

#### appendFile( file, data\[, options], clbk )

Asynchronously appends `data` to a `file`.

```javascript
var join = require( 'path' ).join;

var fpath = join( __dirname, 'examples', 'fixtures', 'file.txt' );

appendFile( fpath, 'beep boop\n', onAppend );

function onAppend( error ) {
if ( error ) {
console.log( error instanceof Error );
// => false
}
}
```

The `data` argument may be either a `string` or a [`Buffer`][@stdlib/buffer/ctor].

```javascript
var join = require( 'path' ).join;
var string2buffer = require( '@stdlib/buffer/from-string' );

var fpath = join( __dirname, 'examples', 'fixtures', 'file.txt' );

appendFile( fpath, string2buffer( 'beep boop\n' ), onAppend );

function onAppend( error ) {
if ( error ) {
console.log( error instanceof Error );
// => false
}
}
```

The function accepts the same `options` and has the same defaults as [`fs.appendFile()`][node-fs].

#### appendFile.sync( file, data\[, options] )

Synchronously appends `data` to a `file`.

```javascript
var join = require( 'path' ).join;

var fpath = join( __dirname, 'examples', 'fixtures', 'file.txt' );

var err = appendFile.sync( fpath, 'beep boop\n' );
if ( err instanceof Error ) {
throw err;
}
```

The function accepts the same `options` and has the same defaults as [`fs.appendFileSync()`][node-fs].

</section>

<!-- /.usage -->

<section class="notes">

## Notes

- The difference between this `appendFile.sync` and [`fs.appendFileSync()`][node-fs] is that [`fs.appendFileSync()`][node-fs] will throw if an `error` is encountered (e.g., if given a non-existent directory path) and this API will return an `error`. Hence, the following anti-pattern

<!-- eslint-disable node/no-sync -->

```javascript
var fs = require( 'fs' );

// Check for directory path existence to prevent an error being thrown...
if ( fs.existsSync( '/path/to' ) ) {
fs.appendFileSync( '/path/to/file.txt', 'beep boop\n' );
}
```

can be replaced by an approach which addresses existence via `error` handling.

<!-- eslint-disable node/no-sync -->

```javascript
var appendFile = require( '@stdlib/fs/append-file' );

// Explicitly handle the error...
var err = appendFile.sync( '/path/to/file.txt', 'boop beep\n' );
if ( err instanceof Error ) {
// You choose what to do...
throw err;
}
```

</section>

<!-- /.notes -->

<section class="examples">

## Examples

<!-- eslint no-undef: "error" -->

```javascript
var join = require( 'path' ).join;
var appendFile = require( '@stdlib/fs/append-file' );

var fpath = join( __dirname, 'examples', 'fixtures', 'file.txt' );

// Synchronously append data to a file:

var error = appendFile.sync( fpath, 'beep boop\n', 'utf8' );
// Function successfully executes and returns null

console.log( error instanceof Error );
// => false

// Asynchronously append data to a file:

appendFile( fpath, 'beep boop\n', onAppend );

function onAppend( error ) {
if ( error ) {
console.error( 'Error: %s', error.message );
}
console.log( 'Success!!!' );
}
```

</section>

<!-- /.examples -->

* * *

<section class="cli">

## CLI

<section class="usage">

### Usage

```text
Usage: append-file [options] <filepath>

Options:

-h, --help Print this message.
-V, --version Print the package version.
--enc, --encoding encoding Encoding. Default: 'utf8'.
--flag flag Flag. Default: 'a'.
--mode mode Mode. Default: 0o666.
```

</section>

<!-- /.usage -->

<section class="notes">

### Notes

- Relative output file paths are resolved relative to the current working directory.
- Errors are written to `stderr`.
- File contents should be provided over `stdin` as part of a [standard stream][standard-stream] pipeline.

</section>

<!-- /.notes -->

<section class="examples">

### Examples

```bash
$ printf 'beep boop\n' | append-file ./examples/fixtures/file.txt
```

</section>

<!-- /.examples -->

</section>

<!-- /.cli -->

<!-- Section for related `stdlib` packages. Do not manually edit this section, as it is automatically populated. -->

<section class="related">

</section>

<!-- /.related -->

<!-- Section for all links. Make sure to keep an empty line after the `section` element and another before the `/section` close. -->

<section class="links">

[node-fs]: https://nodejs.org/api/fs.html

[@stdlib/buffer/ctor]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/buffer/ctor

[standard-stream]: https://en.wikipedia.org/wiki/Pipeline_%28Unix%29

</section>

<!-- /.links -->
83 changes: 83 additions & 0 deletions lib/node_modules/@stdlib/fs/append-file/benchmark/benchmark.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
/**
* @license Apache-2.0
*
* Copyright (c) 2024 The Stdlib Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

'use strict';

// MODULES //

var join = require( 'path' ).join;
var bench = require( '@stdlib/bench' );
var unlink = require( '@stdlib/fs/unlink' ).sync;
var pkg = require( './../package.json' ).name;
var appendFile = require( './../lib' );


// FIXTURES //

var TMP = join( __dirname, 'fixtures', 'temp.txt' );
var DATA = 'boop beep\n';


// MAIN //

bench( pkg, function benchmark( b ) {
var i;

i = 0;
b.tic();

return next();

function next() {
i += 1;
if ( i <= b.iterations ) {
return appendFile( TMP, DATA, done );
}
b.toc();
unlink( TMP );
b.pass( 'benchmark finished' );
b.end();
}

function done( error ) {
if ( error ) {
b.fail( error.message );
}
next();
}
});

bench( pkg+':sync', function benchmark( b ) {
var out;
var i;

b.tic();
for (i = 0; i < b.iterations; i++) {
out = appendFile.sync( TMP, DATA );
if ( out instanceof Error ) {
b.fail( out.message );
}
}
b.toc();
unlink( TMP );
if ( out instanceof Error ) {
b.fail( out.message );
}
b.pass( 'benchmark finished' );
b.end();
});
Empty file.
Loading
Loading