diff --git a/src/js/trove/filelib.js b/src/js/trove/filelib.js index 46fb7354f..08496e00f 100644 --- a/src/js/trove/filelib.js +++ b/src/js/trove/filelib.js @@ -1,5 +1,7 @@ ({ - requires: [], + requires: [ + { "import-type": "builtin", name: "string-dict" }, + ], provides: { values: { "open-input-file": "tany", @@ -13,11 +15,12 @@ "close-output-file": "tany", "close-input-file": "tany", "create-dir": "tany", + "create-dir-tree": "tany", "list-files": "tany" } }, nativeRequires: ["fs"], - theModule: function(RUNTIME, NAMESPACE, uri, fs) { + theModule: function(RUNTIME, NAMESPACE, uri, SD, fs) { function InputFile(name) { this.name = name; this.fd = fs.openSync(name, "r"); @@ -27,6 +30,17 @@ this.name = name; this.fd = fs.openSync(name, (append ? "a" : "w")); } + var checkISD = RUNTIME.getField(SD, "internal").checkISD; + var isISD = RUNTIME.getField(SD, "internal").isISD; + function makeDirs(baseDir, tree) { + if (!fs.existsSync(baseDir)) fs.mkdirSync(baseDir); + if (isISD(tree)) { + RUNTIME.ffi.toArray(RUNTIME.getField(tree, "keys-list").app()).forEach(function(sub) { + var kid = RUNTIME.getColonField(tree, "get-value").full_meth(tree, sub); + makeDirs(baseDir + "/" + sub, kid); + }); + } + } var vals = { "open-input-file": RUNTIME.makeFunction(function(filename) { @@ -169,6 +183,13 @@ fs.mkdirSync(directory); return true; }, "create-dir"), + "create-dir-tree": RUNTIME.makeFunction(function(baseDir, subtree) { + RUNTIME.ffi.checkArity(2, arguments, "create-dir-tree", false); + RUNTIME.checkString(baseDir); + checkISD(subtree); + makeDirs(baseDir, subtree); + return true; + }, "create-dir-tree"), "list-files": RUNTIME.makeFunction(function(directory) { RUNTIME.ffi.checkArity(1, arguments, "list-files", false); RUNTIME.checkString(directory); diff --git a/src/js/trove/string-dict.js b/src/js/trove/string-dict.js index 2797cd6a6..86d2f6afa 100644 --- a/src/js/trove/string-dict.js +++ b/src/js/trove/string-dict.js @@ -1414,7 +1414,9 @@ }; var internal = { checkISD: jsCheckISD, - checkMSD: jsCheckMSD + checkMSD: jsCheckMSD, + isISD: isImmutableStringDict, + isMSD: isMutableStringDict }; return runtime.makeModuleReturn(vals, types, internal); }