]> git.kaiwu.me - njs.git/commitdiff
FS: introduced fs.existsSync().
authorDmitry Volyntsev <xeioex@nginx.com>
Sat, 30 Sep 2023 04:41:34 +0000 (21:41 -0700)
committerDmitry Volyntsev <xeioex@nginx.com>
Sat, 30 Sep 2023 04:41:34 +0000 (21:41 -0700)
external/njs_fs_module.c
test/fs/methods.t.js

index b92e7b894b030b3a05447af2af947333f1fe827c..819feafb42f476651d147175b2cba467b39ac321 100644 (file)
@@ -146,6 +146,8 @@ typedef njs_int_t (*njs_file_tree_walk_cb_t)(const char *, const struct stat *,
 
 static njs_int_t njs_fs_access(njs_vm_t *vm, njs_value_t *args,
     njs_uint_t nargs, njs_index_t calltype, njs_value_t *retval);
+static njs_int_t njs_fs_exists_sync(njs_vm_t *vm, njs_value_t *args,
+    njs_uint_t nargs, njs_index_t calltype, njs_value_t *retval);
 static njs_int_t njs_fs_mkdir(njs_vm_t *vm, njs_value_t *args,
     njs_uint_t nargs, njs_index_t calltype, njs_value_t *retval);
 static njs_int_t njs_fs_open(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
@@ -581,6 +583,16 @@ static njs_external_t  njs_ext_fs[] = {
         }
     },
 
+    {
+        .flags = NJS_EXTERN_METHOD,
+        .name.string = njs_str("existsSync"),
+        .writable = 1,
+        .configurable = 1,
+        .u.method = {
+            .native = njs_fs_exists_sync,
+        }
+    },
+
     {
         .flags = NJS_EXTERN_METHOD,
         .name.string = njs_str("fstatSync"),
@@ -1469,6 +1481,24 @@ njs_fs_access(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
 }
 
 
+static njs_int_t
+njs_fs_exists_sync(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
+    njs_index_t calltype, njs_value_t *retval)
+{
+    const char  *path;
+    char        path_buf[NJS_MAX_PATH + 1];
+
+    path = njs_fs_path(vm, path_buf, njs_arg(args, nargs, 1), "path");
+    if (njs_slow_path(path == NULL)) {
+        return NJS_ERROR;
+    }
+
+    njs_value_boolean_set(retval, access(path, F_OK) == 0);
+
+    return NJS_OK;
+}
+
+
 static njs_int_t
 njs_fs_open(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t calltype, njs_value_t *retval)
index 9b836ad26e65e6d58e4c1061241c838046f95d00..cc840c6cc0a76dc212ff15a2902ccda1e307c19d 100644 (file)
@@ -359,6 +359,36 @@ let appendFileP_tsuite = {
     get tests() { return append_tests() },
 };
 
+async function exists_test(params) {
+    let res = await method("exists", params);
+
+    if (res !== params.expected) {
+        throw Error(`exists failed check`);
+    }
+
+    return 'SUCCESS';
+}
+
+let exists_tests = () => [
+    { args: ["test/fs/ascii"],
+      expected: true },
+    { args: ["test/fs"],
+      expected: true },
+    { args: ["test/fs_NONEXISTENT/ascii"],
+      expected: false },
+    { args: ["test/fs/ascii_NONEXISTENT"],
+      expected: false },
+];
+
+let existsSync_tsuite = {
+    name: "fs existsSync",
+    skip: () => (!has_fs() || !has_buffer()),
+    T: exists_test,
+    prepare_args: p,
+    opts: { type: "sync" },
+    get tests() { return exists_tests() },
+};
+
 async function realpath_test(params) {
     let data = await method("realpath", params);
 
@@ -1153,6 +1183,7 @@ run([
     appendFile_tsuite,
     appendFileSync_tsuite,
     appendFileP_tsuite,
+    existsSync_tsuite,
     realpath_tsuite,
     realpathSync_tsuite,
     realpathP_tsuite,