MIRROR: javascript for ๐Ÿœ's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

update FS module

+173 -13
+2 -2
examples/spec/fs.js
··· 1 1 import { test, summary } from './helpers.js'; 2 - import fs from 'fs'; 3 - import path from 'path'; 2 + import fs from 'ant:fs'; 3 + import path from 'ant:path'; 4 4 5 5 console.log('FS Tests\n'); 6 6
+1 -1
include/ant.h
··· 10 10 11 11 enum { 12 12 JS_UNDEF, JS_NULL, JS_TRUE, JS_FALSE, 13 - JS_STR, JS_NUM, JS_ERR, JS_PRIV, JS_PROMISE 13 + JS_STR, JS_NUM, JS_ERR, JS_PRIV, JS_PROMISE, JS_OBJ 14 14 }; 15 15 16 16 struct js *js_create(void *buf, size_t len);
+1 -1
meson.build
··· 74 74 build_date = run_command('date', '+%Y-%m-%d', check: true).stdout().strip() 75 75 76 76 version_conf = configuration_data() 77 - version_conf.set('ANT_VERSION', '0.1.0.26') 77 + version_conf.set('ANT_VERSION', '0.1.0.27') 78 78 version_conf.set('ANT_GIT_HASH', git_hash) 79 79 version_conf.set('ANT_BUILD_DATE', build_date) 80 80
+1
src/ant.c
··· 14248 14248 case T_NUM: return JS_NUM; 14249 14249 case T_ERR: return JS_ERR; 14250 14250 case T_PROMISE: return JS_PROMISE; 14251 + case T_OBJ: return JS_OBJ; 14251 14252 default: return JS_PRIV; 14252 14253 } 14253 14254 }
+3 -3
src/modules/fetch.c
··· 227 227 char *body = NULL; 228 228 size_t body_len = 0; 229 229 230 - if (js_type(options_val) != JS_UNDEF && js_type(options_val) != JS_NULL) { 230 + if (js_type(options_val) == JS_OBJ) { 231 231 jsval_t method_val = js_get(js, options_val, "method"); 232 232 if (js_type(method_val) == JS_STR) { 233 233 char *method_str = js_getstr(js, method_val, NULL); ··· 260 260 snprintf(user_agent, sizeof(user_agent), "ant/%s", ANT_VERSION); 261 261 tlsuv_http_req_header(req->http_req, "User-Agent", user_agent); 262 262 263 - if (js_type(options_val) != JS_UNDEF && js_type(options_val) != JS_NULL) { 263 + if (js_type(options_val) == JS_OBJ) { 264 264 jsval_t headers_val = js_get(js, options_val, "headers"); 265 - if (js_type(headers_val) != JS_UNDEF && js_type(headers_val) != JS_NULL) { 265 + if (js_type(headers_val) == JS_OBJ) { 266 266 js_prop_iter_t iter = js_prop_iter_begin(js, headers_val); 267 267 const char *key; 268 268 size_t key_len;
+165 -6
src/modules/fs.c
··· 140 140 size_t file_size = stat_req.statbuf.st_size; 141 141 uv_fs_req_cleanup(&stat_req); 142 142 143 - // For text reads (FS_OP_READ), allocate extra byte for null terminator 144 - // For binary reads (FS_OP_READ_BYTES), allocate exact size 145 143 size_t alloc_size = (req->op_type == FS_OP_READ) ? file_size + 1 : file_size; 146 144 req->data = malloc(alloc_size); 147 145 if (!req->data) { ··· 534 532 return js_mkundef(); 535 533 } 536 534 535 + static jsval_t builtin_fs_copyFileSync(struct js *js, jsval_t *args, int nargs) { 536 + if (nargs < 2) return js_mkerr(js, "copyFileSync() requires src and dest arguments"); 537 + 538 + if (js_type(args[0]) != JS_STR) return js_mkerr(js, "copyFileSync() src must be a string"); 539 + if (js_type(args[1]) != JS_STR) return js_mkerr(js, "copyFileSync() dest must be a string"); 540 + 541 + size_t src_len, dest_len; 542 + char *src = js_getstr(js, args[0], &src_len); 543 + char *dest = js_getstr(js, args[1], &dest_len); 544 + 545 + if (!src || !dest) return js_mkerr(js, "Failed to get arguments"); 546 + 547 + char *src_cstr = strndup(src, src_len); 548 + char *dest_cstr = strndup(dest, dest_len); 549 + if (!src_cstr || !dest_cstr) { 550 + free(src_cstr); 551 + free(dest_cstr); 552 + return js_mkerr(js, "Out of memory"); 553 + } 554 + 555 + FILE *in = fopen(src_cstr, "rb"); 556 + if (!in) { 557 + char err_msg[256]; 558 + snprintf(err_msg, sizeof(err_msg), "Failed to open source file: %s", strerror(errno)); 559 + free(src_cstr); 560 + free(dest_cstr); 561 + return js_mkerr(js, err_msg); 562 + } 563 + 564 + FILE *out = fopen(dest_cstr, "wb"); 565 + if (!out) { 566 + char err_msg[256]; 567 + snprintf(err_msg, sizeof(err_msg), "Failed to open dest file: %s", strerror(errno)); 568 + fclose(in); 569 + free(src_cstr); 570 + free(dest_cstr); 571 + return js_mkerr(js, err_msg); 572 + } 573 + 574 + char buf[8192]; 575 + size_t n; 576 + while ((n = fread(buf, 1, sizeof(buf), in)) > 0) { 577 + if (fwrite(buf, 1, n, out) != n) { 578 + fclose(in); 579 + fclose(out); 580 + free(src_cstr); 581 + free(dest_cstr); 582 + return js_mkerr(js, "Failed to write to dest file"); 583 + } 584 + } 585 + 586 + fclose(in); 587 + fclose(out); 588 + free(src_cstr); 589 + free(dest_cstr); 590 + 591 + return js_mkundef(); 592 + } 593 + 594 + static jsval_t builtin_fs_renameSync(struct js *js, jsval_t *args, int nargs) { 595 + if (nargs < 2) return js_mkerr(js, "renameSync() requires oldPath and newPath arguments"); 596 + 597 + if (js_type(args[0]) != JS_STR) return js_mkerr(js, "renameSync() oldPath must be a string"); 598 + if (js_type(args[1]) != JS_STR) return js_mkerr(js, "renameSync() newPath must be a string"); 599 + 600 + size_t old_len, new_len; 601 + char *old_path = js_getstr(js, args[0], &old_len); 602 + char *new_path = js_getstr(js, args[1], &new_len); 603 + 604 + if (!old_path || !new_path) return js_mkerr(js, "Failed to get arguments"); 605 + 606 + char *old_cstr = strndup(old_path, old_len); 607 + char *new_cstr = strndup(new_path, new_len); 608 + if (!old_cstr || !new_cstr) { 609 + free(old_cstr); 610 + free(new_cstr); 611 + return js_mkerr(js, "Out of memory"); 612 + } 613 + 614 + int result = rename(old_cstr, new_cstr); 615 + free(old_cstr); 616 + free(new_cstr); 617 + 618 + if (result != 0) { 619 + char err_msg[256]; 620 + snprintf(err_msg, sizeof(err_msg), "Failed to rename: %s", strerror(errno)); 621 + return js_mkerr(js, err_msg); 622 + } 623 + 624 + return js_mkundef(); 625 + } 626 + 627 + static jsval_t builtin_fs_appendFileSync(struct js *js, jsval_t *args, int nargs) { 628 + if (nargs < 2) return js_mkerr(js, "appendFileSync() requires path and data arguments"); 629 + 630 + if (js_type(args[0]) != JS_STR) return js_mkerr(js, "appendFileSync() path must be a string"); 631 + if (js_type(args[1]) != JS_STR) return js_mkerr(js, "appendFileSync() data must be a string"); 632 + 633 + size_t path_len, data_len; 634 + char *path = js_getstr(js, args[0], &path_len); 635 + char *data = js_getstr(js, args[1], &data_len); 636 + 637 + if (!path || !data) return js_mkerr(js, "Failed to get arguments"); 638 + 639 + char *path_cstr = strndup(path, path_len); 640 + if (!path_cstr) return js_mkerr(js, "Out of memory"); 641 + 642 + FILE *file = fopen(path_cstr, "ab"); 643 + if (!file) { 644 + char err_msg[256]; 645 + snprintf(err_msg, sizeof(err_msg), "Failed to open file: %s", strerror(errno)); 646 + free(path_cstr); 647 + return js_mkerr(js, err_msg); 648 + } 649 + 650 + size_t bytes_written = fwrite(data, 1, data_len, file); 651 + fclose(file); 652 + free(path_cstr); 653 + 654 + if (bytes_written != data_len) { 655 + return js_mkerr(js, "Failed to write entire file"); 656 + } 657 + 658 + return js_mkundef(); 659 + } 660 + 537 661 static jsval_t builtin_fs_writeFile(struct js *js, jsval_t *args, int nargs) { 538 662 if (nargs < 2) return js_mkerr(js, "writeFile() requires path and data arguments"); 539 663 ··· 649 773 if (!path) return js_mkerr(js, "Failed to get path string"); 650 774 651 775 int mode = 0755; 652 - if (nargs >= 2 && js_type(args[1]) == JS_NUM) { 653 - mode = (int)js_getnum(args[1]); 776 + int recursive = 0; 777 + 778 + if (nargs < 2) goto do_mkdir; 779 + 780 + switch (js_type(args[1])) { 781 + case JS_NUM: 782 + mode = (int)js_getnum(args[1]); 783 + break; 784 + case JS_OBJ: { 785 + jsval_t opt = args[1]; 786 + recursive = js_type(js_get(js, opt, "recursive")) == JS_TRUE; 787 + jsval_t mode_val = js_get(js, opt, "mode"); 788 + if (js_type(mode_val) == JS_NUM) mode = (int)js_getnum(mode_val); 789 + break; 790 + } 654 791 } 792 + 793 + do_mkdir: 655 794 656 795 char *path_cstr = strndup(path, path_len); 657 796 if (!path_cstr) return js_mkerr(js, "Out of memory"); ··· 664 803 free(path_cstr); 665 804 666 805 if (result != 0) { 806 + if (recursive && errno == EEXIST) { 807 + return js_mkundef(); 808 + } 667 809 char err_msg[256]; 668 810 snprintf(err_msg, sizeof(err_msg), "Failed to create directory: %s", strerror(errno)); 669 811 return js_mkerr(js, err_msg); ··· 773 915 return req->promise; 774 916 } 775 917 918 + static jsval_t stat_isFile(struct js *js, jsval_t *args, int nargs) { 919 + jsval_t this = js_getthis(js); 920 + jsval_t val = js_get(js, this, "_isFile"); 921 + return js_type(val) == JS_TRUE ? js_mktrue() : js_mkfalse(); 922 + } 923 + 924 + static jsval_t stat_isDirectory(struct js *js, jsval_t *args, int nargs) { 925 + jsval_t this = js_getthis(js); 926 + jsval_t val = js_get(js, this, "_isDirectory"); 927 + return js_type(val) == JS_TRUE ? js_mktrue() : js_mkfalse(); 928 + } 929 + 776 930 static jsval_t builtin_fs_statSync(struct js *js, jsval_t *args, int nargs) { 777 931 if (nargs < 1) return js_mkerr(js, "statSync() requires a path argument"); 778 932 ··· 798 952 jsval_t stat_obj = js_mkobj(js); 799 953 js_set(js, stat_obj, "size", js_mknum((double)st.st_size)); 800 954 js_set(js, stat_obj, "mode", js_mknum((double)st.st_mode)); 801 - js_set(js, stat_obj, "isFile", S_ISREG(st.st_mode) ? js_mktrue() : js_mkfalse()); 802 - js_set(js, stat_obj, "isDirectory", S_ISDIR(st.st_mode) ? js_mktrue() : js_mkfalse()); 955 + js_set(js, stat_obj, "_isFile", S_ISREG(st.st_mode) ? js_mktrue() : js_mkfalse()); 956 + js_set(js, stat_obj, "_isDirectory", S_ISDIR(st.st_mode) ? js_mktrue() : js_mkfalse()); 957 + js_set(js, stat_obj, "isFile", js_mkfun(stat_isFile)); 958 + js_set(js, stat_obj, "isDirectory", js_mkfun(stat_isDirectory)); 803 959 804 960 return stat_obj; 805 961 } ··· 969 1125 js_set(js, lib, "open", js_mkfun(builtin_fs_readBytesSync)); 970 1126 js_set(js, lib, "writeFile", js_mkfun(builtin_fs_writeFile)); 971 1127 js_set(js, lib, "writeFileSync", js_mkfun(builtin_fs_writeFileSync)); 1128 + js_set(js, lib, "appendFileSync", js_mkfun(builtin_fs_appendFileSync)); 1129 + js_set(js, lib, "copyFileSync", js_mkfun(builtin_fs_copyFileSync)); 1130 + js_set(js, lib, "renameSync", js_mkfun(builtin_fs_renameSync)); 972 1131 js_set(js, lib, "unlink", js_mkfun(builtin_fs_unlink)); 973 1132 js_set(js, lib, "unlinkSync", js_mkfun(builtin_fs_unlinkSync)); 974 1133 js_set(js, lib, "mkdir", js_mkfun(builtin_fs_mkdir));