Skip to content

Commit

Permalink
feat(sdk): add fs module
Browse files Browse the repository at this point in the history
  • Loading branch information
jianzs committed Oct 5, 2023
1 parent 713f29a commit b0f5d5f
Show file tree
Hide file tree
Showing 28 changed files with 1,453 additions and 5 deletions.
30 changes: 30 additions & 0 deletions examples/tests/sdk_tests/fs/basic.main.w
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
bring fs;

let filename = "hello.txt";
let data = "Hello, Wing!";

fs.writeFile(filename, data);
assert(fs.exists(filename) == true);

let content = fs.readFile(filename);
assert(content == data);

fs.remove(filename);
assert(fs.exists(filename) == false);

let nilContent = fs.tryReadFile(filename);
assert(nilContent == nil);

test "inflight file basic operations" {
fs.writeFile(filename, data);
assert(fs.exists(filename) == true);

let content = fs.readFile(filename);
assert(content == data);

fs.remove(filename);
assert(fs.exists(filename) == false);

let nilContent = fs.tryReadFile(filename);
assert(nilContent == nil);
}
45 changes: 45 additions & 0 deletions examples/tests/sdk_tests/fs/directory.main.w
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
bring fs;
bring regex;

let dirname = "wingdir";
let filename = "temp.txt";

fs.mkdir(dirname);
assert(fs.exists(dirname) == true);

try {
fs.mkdir(dirname);
} catch e {
assert(regex.match("^EEXIST: file already exists", e) == true);
}

fs.writeFile(fs.join(dirname, filename), "");
let files = fs.readdir(dirname);
assert(files.length == 1);

fs.remove(dirname, { recursive: true });
assert(fs.exists(dirname) == false);

let nilFiles = fs.tryReaddir(dirname);
assert(nilFiles == nil);

test "inflight create normal directory" {
fs.mkdir(dirname);
assert(fs.exists(dirname) == true);

try {
fs.mkdir(dirname);
} catch e {
assert(regex.match("^EEXIST: file already exists", e) == true);
}

fs.writeFile(fs.join(dirname, filename), "");
let files = fs.readdir(dirname);
assert(files.length == 1);

fs.remove(dirname, { recursive: true });
assert(fs.exists(dirname) == false);

let nilFiles = fs.tryReaddir(dirname);
assert(nilFiles == nil);
}
46 changes: 46 additions & 0 deletions examples/tests/sdk_tests/fs/json.main.w
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
bring fs;
bring regex;

let filename = "test-json.json";
let data = Json {
"foo": "bar",
"arr": [1, 2, 3, "test", { "foo": "bar" }]
};

try {
fs.writeFile(filename, "invalid content");
fs.readJson(filename);
} catch e {
assert(regex.match("^Unexpected token", e) == true);
}

fs.writeJson(filename, data);
assert(fs.exists(filename) == true);

let obj = fs.readJson(filename);
assert(Json.stringify(obj) == Json.stringify(data));

fs.remove(filename);
assert(fs.exists(filename) == false);

assert(fs.tryReadJson(filename) == nil);

test "inflight json operations" {
try {
fs.writeFile(filename, "invalid content");
fs.readJson(filename);
} catch e {
assert(regex.match("^Unexpected token", e) == true);
}

fs.writeJson(filename, data);
assert(fs.exists(filename) == true);

let obj = fs.readJson(filename);
assert(Json.stringify(obj) == Json.stringify(data));

fs.remove(filename);
assert(fs.exists(filename) == false);

assert(fs.tryReadJson(filename) == nil);
}
36 changes: 36 additions & 0 deletions examples/tests/sdk_tests/fs/path.main.w
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
bring fs;

let from = "/a/b/c/d";
let to = "/a/b/e/f";

let var result = fs.join(from, to);
assert(result == "/a/b/c/d/a/b/e/f");

result = fs.relative(from ,to);
assert(result == "../../e/f");

result = fs.dirname(from);
assert(result == "/a/b/c");

result = fs.basename(from);
assert(result == "d");

result = fs.resolve(from, to);
assert(result == "/a/b/e/f");

test "inflight path conversion" {
let var result = fs.join(from, to);
assert(result == "/a/b/c/d/a/b/e/f");

result = fs.relative(from ,to);
assert(result == "../../e/f");

result = fs.dirname(from);
assert(result == "/a/b/c");

result = fs.basename(from);
assert(result == "d");

result = fs.resolve(from, to);
assert(result == "/a/b/e/f");
}
15 changes: 15 additions & 0 deletions examples/tests/sdk_tests/fs/temp_dir.main.w
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
bring fs;

let tmpdir = fs.mkdtemp();
assert(fs.exists(tmpdir) == true);

fs.remove(tmpdir, { recursive: true });
assert(fs.exists(tmpdir) == false);

test "inflight create temporary directory" {
let tmpdir = fs.mkdtemp();
assert(fs.exists(tmpdir) == true);

fs.remove(tmpdir, { recursive: true });
assert(fs.exists(tmpdir) == false);
}
31 changes: 31 additions & 0 deletions examples/tests/sdk_tests/fs/yaml.main.w
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
bring fs;

let filename = "test-yaml.yaml";
let data = Json {
"foo": "bar",
"arr": [1, 2, 3, "test", { "foo": "bar" }]
};

fs.writeYaml(filename, data, data);
assert(fs.exists(filename) == true);

let objs = fs.readYaml(filename);
assert(objs.length == 2);
assert(Json.stringify(objs.at(0)) == Json.stringify(data));
assert(Json.stringify(objs.at(1)) == Json.stringify(data));

fs.remove(filename);
assert(fs.exists(filename) == false);

test "inflight yaml operations" {
fs.writeYaml(filename, data, data);
assert(fs.exists(filename) == true);

let objs = fs.readYaml(filename);
assert(objs.length == 2);
assert(Json.stringify(objs.at(0)) == Json.stringify(data));
assert(Json.stringify(objs.at(1)) == Json.stringify(data));

fs.remove(filename);
assert(fs.exists(filename) == false);
}
4 changes: 3 additions & 1 deletion libs/wingc/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,17 +77,19 @@ const WINGSDK_MATH_MODULE: &'static str = "math";
const WINGSDK_AWS_MODULE: &'static str = "aws";
const WINGSDK_EX_MODULE: &'static str = "ex";
const WINGSDK_REGEX_MODULE: &'static str = "regex";
const WINGSDK_FS_MODULE: &'static str = "fs";

pub const UTIL_CLASS_NAME: &'static str = "Util";

const WINGSDK_BRINGABLE_MODULES: [&'static str; 7] = [
const WINGSDK_BRINGABLE_MODULES: [&'static str; 8] = [
WINGSDK_CLOUD_MODULE,
WINGSDK_UTIL_MODULE,
WINGSDK_HTTP_MODULE,
WINGSDK_MATH_MODULE,
WINGSDK_AWS_MODULE,
WINGSDK_EX_MODULE,
WINGSDK_REGEX_MODULE,
WINGSDK_FS_MODULE,
];

const WINGSDK_DURATION: &'static str = "std.Duration";
Expand Down
10 changes: 10 additions & 0 deletions libs/wingsdk/.projen/deps.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion libs/wingsdk/.projen/tasks.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions libs/wingsdk/.projenrc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,8 @@ const project = new cdk.JsiiProject({
// shared client dependencies
"ioredis",
"jsonschema",
// fs module dependency
"js-yaml@^4.1.0",
],
devDeps: [
`@cdktf/provider-aws@^15.0.0`, // only for testing Wing plugins
Expand All @@ -101,6 +103,7 @@ const project = new cdk.JsiiProject({
"vitest",
"@types/uuid",
"@vitest/coverage-v8",
"@types/js-yaml@^4.0.6",
"nanoid", // for ESM import test in target-sim/function.test.ts
...JSII_DEPS,
],
Expand Down
3 changes: 3 additions & 0 deletions libs/wingsdk/package.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit b0f5d5f

Please sign in to comment.