kopia lustrzana https://github.com/c9/core
move vfs client mock to separate file
rodzic
bf0c62eca5
commit
69a7f555bf
|
@ -0,0 +1,324 @@
|
||||||
|
/*global localStorage*/
|
||||||
|
define(function(require, exports, module) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
main.consumes = ["Plugin"];
|
||||||
|
main.provides = ["vfs", "vfs.ping", "vfs.log", "vfs.endpoint"];
|
||||||
|
return main;
|
||||||
|
|
||||||
|
function main(options, imports, register) {
|
||||||
|
var Plugin = imports.Plugin;
|
||||||
|
var plugin = new Plugin("Ajax.org", main.consumes);
|
||||||
|
|
||||||
|
var id;
|
||||||
|
var vfsBaseUrl;
|
||||||
|
var serviceUrl;
|
||||||
|
|
||||||
|
var fsData = {};
|
||||||
|
|
||||||
|
var Stream = require("stream").Stream;
|
||||||
|
var noop = function() { console.error("not implemented"); };
|
||||||
|
var silent = function() {};
|
||||||
|
var connection = {};
|
||||||
|
|
||||||
|
function load() {
|
||||||
|
// initialize mock fsData
|
||||||
|
findNode("/README.md", true, [
|
||||||
|
"# Welcome to Cloud9 offline demo!",
|
||||||
|
"",
|
||||||
|
"This is a demo of Cloud9 ui, with a mock vfs server working with localStorage",
|
||||||
|
"Some features that need a real server have been disabled",
|
||||||
|
"So be sure to try the real thing at https://c9.io!"
|
||||||
|
].join("\n"));
|
||||||
|
findNode("~", true);
|
||||||
|
if (options.storage != false) {
|
||||||
|
// Try loading data from localStorage
|
||||||
|
try {
|
||||||
|
fsData = JSON.parse(localStorage.fsData);
|
||||||
|
} catch (e) {}
|
||||||
|
window.addEventListener("beforeunload", function(e) {
|
||||||
|
localStorage.fsData = JSON.stringify(fsData);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function unload() {
|
||||||
|
fsData = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
function findNode(path, create, val) {
|
||||||
|
if (!path) path = "/";
|
||||||
|
var parts = path.split("/");
|
||||||
|
if (!parts[parts.length - 1])
|
||||||
|
parts.pop();
|
||||||
|
var data = fsData;
|
||||||
|
var prev = null;
|
||||||
|
for (var i = 0; i < parts.length; i++) {
|
||||||
|
prev = data;
|
||||||
|
data = data["!" + parts[i]];
|
||||||
|
if (data == null) {
|
||||||
|
if (create && typeof prev != "string")
|
||||||
|
data = prev["!" + parts[i]] = {};
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (val)
|
||||||
|
data = prev["!" + parts[parts.length - 1]] = val;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ENOENT() {
|
||||||
|
var err = new Error("ENOENT");
|
||||||
|
err.code = "ENOENT";
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendStream(data, callback) {
|
||||||
|
var stream = new Stream();
|
||||||
|
stream.readable = true;
|
||||||
|
callback(null, { stream: stream });
|
||||||
|
if (Array.isArray(data)) {
|
||||||
|
data.forEach(function(x) {
|
||||||
|
stream.emit("data", x);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
stream.emit("data", data);
|
||||||
|
}
|
||||||
|
stream.emit("end");
|
||||||
|
}
|
||||||
|
|
||||||
|
plugin.on("load", load);
|
||||||
|
plugin.on("unload", unload);
|
||||||
|
|
||||||
|
plugin.freezePublicAPI({
|
||||||
|
on: function() {},
|
||||||
|
once: function() {},
|
||||||
|
connected: true,
|
||||||
|
|
||||||
|
get connection() { return connection; },
|
||||||
|
get connecting() { return false; },
|
||||||
|
get connected() { return true },
|
||||||
|
|
||||||
|
get previewUrl() { throw new Error("gone"); },
|
||||||
|
get serviceUrl() { return serviceUrl; },
|
||||||
|
get id() { return id; },
|
||||||
|
get baseUrl() { return vfsBaseUrl; },
|
||||||
|
get region() { return ""; },
|
||||||
|
|
||||||
|
rest: noop,
|
||||||
|
download: noop,
|
||||||
|
url: noop,
|
||||||
|
reconnect: noop,
|
||||||
|
|
||||||
|
vfsUrl: noop,
|
||||||
|
|
||||||
|
// File management
|
||||||
|
resolve: noop,
|
||||||
|
stat: function(path, options, callback) {
|
||||||
|
var data = findNode(path);
|
||||||
|
var name = path.split("/").pop();
|
||||||
|
setTimeout(function() {
|
||||||
|
if (data == null)
|
||||||
|
return callback(ENOENT());
|
||||||
|
var isFile = typeof data == "string";
|
||||||
|
var stat = {
|
||||||
|
name: name.substr(1),
|
||||||
|
size: isFile ? data.length : 1,
|
||||||
|
mtime: 0,
|
||||||
|
ctime: 0,
|
||||||
|
mime: isFile ? "" : "folder"
|
||||||
|
};
|
||||||
|
callback(null, stat);
|
||||||
|
}, 20);
|
||||||
|
},
|
||||||
|
readfile: function(path, options, callback) {
|
||||||
|
var data = findNode(path);
|
||||||
|
setTimeout(function() {
|
||||||
|
if (typeof data != "string")
|
||||||
|
return callback(ENOENT());
|
||||||
|
sendStream(data, callback);
|
||||||
|
}, 20);
|
||||||
|
},
|
||||||
|
readdir: function(path, options, callback) {
|
||||||
|
var data = findNode(path);
|
||||||
|
setTimeout(function() {
|
||||||
|
if (!data || typeof data == "string")
|
||||||
|
return callback(ENOENT());
|
||||||
|
var stats = Object.keys(data).map(function(n) {
|
||||||
|
var isFile = typeof data[n] == "string";
|
||||||
|
return {
|
||||||
|
name: n.substr(1),
|
||||||
|
size: isFile ? data[n].length : 1,
|
||||||
|
mtime: 0,
|
||||||
|
ctime: 0,
|
||||||
|
mime: isFile ? "" : "folder"
|
||||||
|
};
|
||||||
|
});
|
||||||
|
sendStream(stats, callback);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
mkfile: function(path, options, callback) {
|
||||||
|
var parts = path.split("/");
|
||||||
|
var name = "!" + parts.pop();
|
||||||
|
var parent = findNode(parts.join("/"), true);
|
||||||
|
var val = "";
|
||||||
|
options.stream.on("data", function(e) {
|
||||||
|
if (e) val += e;
|
||||||
|
});
|
||||||
|
options.stream.on("end", function(e) {
|
||||||
|
if (e) val += e;
|
||||||
|
setTimeout(function() {
|
||||||
|
if (!parent || typeof parent[name] == "object")
|
||||||
|
return callback(ENOENT());
|
||||||
|
parent[name] = val;
|
||||||
|
callback(null);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
mkdir: function(path, options, callback) {
|
||||||
|
var data = findNode(path, true);
|
||||||
|
setTimeout(function() {
|
||||||
|
if (!data)
|
||||||
|
return callback(ENOENT());
|
||||||
|
callback();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
mkdirP: function(path, options, callback) {
|
||||||
|
var data = findNode(path, true);
|
||||||
|
setTimeout(function() {
|
||||||
|
if (!data)
|
||||||
|
return callback(ENOENT());
|
||||||
|
callback();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
appendfile: noop,
|
||||||
|
rmfile: function(path, options, callback) {
|
||||||
|
var parts = path.split("/");
|
||||||
|
var name = "!" + parts.pop();
|
||||||
|
setTimeout(function() {
|
||||||
|
var parent = findNode(parts.join("/"));
|
||||||
|
if (!parent || !parent[name])
|
||||||
|
return callback(ENOENT());
|
||||||
|
if (typeof parent[name] != "string")
|
||||||
|
return callback(new Error("EISDIR"));
|
||||||
|
delete parent[name];
|
||||||
|
callback();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
rmdir: function(path, options, callback) {
|
||||||
|
var parts = path.split("/");
|
||||||
|
var name = "!" + parts.pop();
|
||||||
|
setTimeout(function() {
|
||||||
|
var parent = findNode(parts.join("/"));
|
||||||
|
if (!parent || !parent[name])
|
||||||
|
return callback(ENOENT());
|
||||||
|
if (typeof parent[name] == "string")
|
||||||
|
return callback(new Error("EISFILE"));
|
||||||
|
delete parent[name];
|
||||||
|
callback();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
rename: function(to, options, callback) {
|
||||||
|
setTimeout(function() {
|
||||||
|
var from = options.from;
|
||||||
|
var overwrite = options.overwrite;
|
||||||
|
|
||||||
|
var parts = to.split("/");
|
||||||
|
var toName = "!" + parts.pop();
|
||||||
|
var toParent = findNode(parts.join("/"));
|
||||||
|
|
||||||
|
parts = from.split("/");
|
||||||
|
var fromName = "!" + parts.pop();
|
||||||
|
var fromParent = findNode(parts.join("/"));
|
||||||
|
if (toParent[toName] != null && !overwrite)
|
||||||
|
return callback(ENOENT());
|
||||||
|
|
||||||
|
toParent[toName] = fromParent[fromName];
|
||||||
|
delete fromParent[fromName];
|
||||||
|
callback(null);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
copy: function(from, options, callback) {
|
||||||
|
setTimeout(function() {
|
||||||
|
var to = options.to;
|
||||||
|
var overwrite = options.overwrite;
|
||||||
|
|
||||||
|
var toParts = to.split("/");
|
||||||
|
var toName = "!" + toParts.pop();
|
||||||
|
var toParent = findNode(toParts.join("/"));
|
||||||
|
|
||||||
|
var parts = from.split("/");
|
||||||
|
var fromName = "!" + parts.pop();
|
||||||
|
var fromParent = findNode(parts.join("/"));
|
||||||
|
var counter = 0;
|
||||||
|
var name = toName;
|
||||||
|
while (toParent[toName] != null && !options.overwrite)
|
||||||
|
toName = name + "." + (++counter);
|
||||||
|
|
||||||
|
toParent[toName] = fromParent[fromName];
|
||||||
|
toParts.push(toName.substr(1));
|
||||||
|
callback(null, {to: toParts.join("/")});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
chmod: noop,
|
||||||
|
symlink: noop,
|
||||||
|
|
||||||
|
// Save and retrieve Metadata
|
||||||
|
metadata: function(path, value, sync, callback) {
|
||||||
|
var parts = ("/.c9/metadata" + path).split("/");
|
||||||
|
var name = "!" + parts.pop();
|
||||||
|
var parent = findNode(parts.join("/"), true);
|
||||||
|
if (sync) {
|
||||||
|
parent[name] = JSON.stringify(value);
|
||||||
|
return callback();
|
||||||
|
}
|
||||||
|
setTimeout(function() {
|
||||||
|
parent[name] = JSON.stringify(value);
|
||||||
|
callback();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
readFileWithMetadata: function(path, options, callback) {
|
||||||
|
var data = findNode(path);
|
||||||
|
var metadata = findNode("/.c9/metadata" + path);
|
||||||
|
setTimeout(function() {
|
||||||
|
if (typeof data != "string")
|
||||||
|
return callback(ENOENT());
|
||||||
|
// TODO metadata
|
||||||
|
callback(null, data, metadata);
|
||||||
|
});
|
||||||
|
return { abort: function() {} };
|
||||||
|
},
|
||||||
|
|
||||||
|
// Wrapper around fs.watch or fs.watchFile
|
||||||
|
watch: silent,
|
||||||
|
|
||||||
|
// Network connection
|
||||||
|
connect: noop,
|
||||||
|
|
||||||
|
// Process Management
|
||||||
|
spawn: silent,
|
||||||
|
pty: silent,
|
||||||
|
tmux: silent,
|
||||||
|
execFile: silent,
|
||||||
|
killtree: silent,
|
||||||
|
|
||||||
|
// Extending the API
|
||||||
|
use: silent,
|
||||||
|
extend: silent,
|
||||||
|
unextend: silent,
|
||||||
|
|
||||||
|
isIdle: function() { return true },
|
||||||
|
});
|
||||||
|
|
||||||
|
register(null, {
|
||||||
|
"vfs": plugin,
|
||||||
|
"vfs.ping": {},
|
||||||
|
"vfs.log": {
|
||||||
|
log: function() {}
|
||||||
|
},
|
||||||
|
"vfs.endpoint": {
|
||||||
|
clearCache: function() {}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
|
@ -47,303 +47,6 @@
|
||||||
<!--dev}-->
|
<!--dev}-->
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
var vfsPlugin = {
|
|
||||||
consumes: [],
|
|
||||||
provides: ["vfs", "vfs.ping", "vfs.log", "vfs.endpoint"],
|
|
||||||
setup: function(options, imports, register) {
|
|
||||||
var Stream = require("stream").Stream;
|
|
||||||
var noop = function() { debugger; };
|
|
||||||
var silent = function() {};
|
|
||||||
var connection = {};
|
|
||||||
// initialize mock fsData
|
|
||||||
var fsData = {};
|
|
||||||
findNode("/README.md", true, [
|
|
||||||
"# Welcome to Cloud9 offline demo!",
|
|
||||||
"",
|
|
||||||
"This is a demo of Cloud9 ui, with a mock vfs server working with localStorage",
|
|
||||||
"Some features that need a real server have been disabled",
|
|
||||||
"So be sure to try the real thing at https://c9.io!"
|
|
||||||
].join("\n"));
|
|
||||||
findNode("~", true);
|
|
||||||
// Try loading data from localStorage
|
|
||||||
try {
|
|
||||||
fsData = JSON.parse(localStorage.fsData);
|
|
||||||
} catch (e) {}
|
|
||||||
window.addEventListener("beforeunload", function(e) {
|
|
||||||
localStorage.fsData = JSON.stringify(fsData);
|
|
||||||
});
|
|
||||||
|
|
||||||
var vfsApi = {
|
|
||||||
on: function() {},
|
|
||||||
once: function() {},
|
|
||||||
connected: true,
|
|
||||||
|
|
||||||
get connection() { return connection; },
|
|
||||||
get connecting() { return false; },
|
|
||||||
get connected() { return true },
|
|
||||||
|
|
||||||
get previewUrl() { throw new Error("gone"); },
|
|
||||||
get serviceUrl() { return serviceUrl; },
|
|
||||||
get id() { return id; },
|
|
||||||
get baseUrl() { return vfsBaseUrl; },
|
|
||||||
get region() { return ""; },
|
|
||||||
|
|
||||||
rest: noop,
|
|
||||||
download: noop,
|
|
||||||
url: noop,
|
|
||||||
reconnect: noop,
|
|
||||||
|
|
||||||
vfsUrl: noop,
|
|
||||||
|
|
||||||
// File management
|
|
||||||
resolve: noop,
|
|
||||||
stat: function(path, options, cb) {
|
|
||||||
var data = findNode(path);
|
|
||||||
var name = path.split("/").pop();
|
|
||||||
setTimeout(function() {
|
|
||||||
if (data == null)
|
|
||||||
return cb(ENOENT());
|
|
||||||
var isFile = typeof data == "string";
|
|
||||||
var stat = {
|
|
||||||
name: name.substr(1),
|
|
||||||
size: isFile ? data.length : 1,
|
|
||||||
mtime: 0,
|
|
||||||
ctime: 0,
|
|
||||||
mime: isFile ? "" : "folder"
|
|
||||||
};
|
|
||||||
cb(null, stat);
|
|
||||||
}, 20);
|
|
||||||
},
|
|
||||||
readfile: function(path, options, cb) {
|
|
||||||
var data = findNode(path);
|
|
||||||
setTimeout(function() {
|
|
||||||
if (typeof data != "string")
|
|
||||||
return cb(ENOENT());
|
|
||||||
sendStream(data, cb);
|
|
||||||
}, 20);
|
|
||||||
},
|
|
||||||
readdir: function(path, options, cb) {
|
|
||||||
var data = findNode(path);
|
|
||||||
setTimeout(function() {
|
|
||||||
if (!data || typeof data == "string")
|
|
||||||
return cb(ENOENT());
|
|
||||||
var stats = Object.keys(data).map(function(n) {
|
|
||||||
var isFile = typeof data[n] == "string";
|
|
||||||
return {
|
|
||||||
name: n.substr(1),
|
|
||||||
size: isFile ? data[n].length : 1,
|
|
||||||
mtime: 0,
|
|
||||||
ctime: 0,
|
|
||||||
mime: isFile ? "" : "folder"
|
|
||||||
};
|
|
||||||
});
|
|
||||||
sendStream(stats, cb);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
mkfile: function(path, options, cb) {
|
|
||||||
var parts = path.split("/")
|
|
||||||
var name = "!" + parts.pop();
|
|
||||||
var parent = findNode(parts.join("/"), true);
|
|
||||||
var val = "";
|
|
||||||
options.stream.on("data", function(e) {
|
|
||||||
if (e) val += e;
|
|
||||||
});
|
|
||||||
options.stream.on("end", function(e) {
|
|
||||||
if (e) val += e;
|
|
||||||
setTimeout(function() {
|
|
||||||
if (!parent || typeof parent[name] == "object")
|
|
||||||
return cb(ENOENT());
|
|
||||||
parent[name] = val;
|
|
||||||
cb(null);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
},
|
|
||||||
mkdir: function(path, options, cb) {
|
|
||||||
var data = findNode(path, true);
|
|
||||||
setTimeout(function() {
|
|
||||||
if (!data)
|
|
||||||
return cb(ENOENT());
|
|
||||||
cb();
|
|
||||||
});
|
|
||||||
},
|
|
||||||
mkdirP: function(path, options, cb) {
|
|
||||||
var data = findNode(path, true);
|
|
||||||
setTimeout(function() {
|
|
||||||
if (!data)
|
|
||||||
return cb(ENOENT());
|
|
||||||
cb();
|
|
||||||
});
|
|
||||||
},
|
|
||||||
appendfile: noop,
|
|
||||||
rmfile: function(path, options, cb) {
|
|
||||||
var parts = path.split("/")
|
|
||||||
var name = "!" + parts.pop();
|
|
||||||
setTimeout(function() {
|
|
||||||
var parent = findNode(parts.join("/"));
|
|
||||||
if (!parent || !parent[name])
|
|
||||||
return cb(ENOENT());
|
|
||||||
if (typeof parent[name] != "string")
|
|
||||||
return cb(new Error("EISDIR"))
|
|
||||||
delete parent[name];
|
|
||||||
cb();
|
|
||||||
});
|
|
||||||
},
|
|
||||||
rmdir: function(path, options, cb) {
|
|
||||||
var parts = path.split("/")
|
|
||||||
var name = "!" + parts.pop();
|
|
||||||
setTimeout(function() {
|
|
||||||
var parent = findNode(parts.join("/"));
|
|
||||||
if (!parent || !parent[name])
|
|
||||||
return cb(ENOENT());
|
|
||||||
if (typeof parent[name] == "string")
|
|
||||||
return cb(new Error("EISFILE"))
|
|
||||||
delete parent[name];
|
|
||||||
cb();
|
|
||||||
});
|
|
||||||
},
|
|
||||||
rename: function(to, options, cb) {
|
|
||||||
setTimeout(function() {
|
|
||||||
var from = options.from;
|
|
||||||
var overwrite = options.overwrite;
|
|
||||||
|
|
||||||
var parts = to.split("/")
|
|
||||||
var toName = "!" + parts.pop();
|
|
||||||
var toParent = findNode(parts.join("/"));
|
|
||||||
|
|
||||||
parts = from.split("/")
|
|
||||||
var fromName = "!" + parts.pop();
|
|
||||||
var fromParent = findNode(parts.join("/"));
|
|
||||||
if (toParent[toName] != null && !overwrite)
|
|
||||||
return cb(ENOENT());
|
|
||||||
|
|
||||||
toParent[toName] = fromParent[fromName];
|
|
||||||
delete fromParent[fromName];
|
|
||||||
cb(null);
|
|
||||||
})
|
|
||||||
},
|
|
||||||
copy: function(from, options, cb) {
|
|
||||||
setTimeout(function() {
|
|
||||||
var to = options.to;
|
|
||||||
var overwrite = options.overwrite;
|
|
||||||
|
|
||||||
var toParts = to.split("/")
|
|
||||||
var toName = "!" + toParts.pop();
|
|
||||||
var toParent = findNode(toParts.join("/"));
|
|
||||||
|
|
||||||
var parts = from.split("/")
|
|
||||||
var fromName = "!" + parts.pop();
|
|
||||||
var fromParent = findNode(parts.join("/"));
|
|
||||||
var counter = 0;
|
|
||||||
var name = toName;
|
|
||||||
while (toParent[toName] != null && !options.overwrite)
|
|
||||||
toName = name + "." + (++counter);
|
|
||||||
|
|
||||||
toParent[toName] = fromParent[fromName];
|
|
||||||
toParts.push(toName.substr(1))
|
|
||||||
cb(null, {to: toParts.join("/")});
|
|
||||||
})
|
|
||||||
},
|
|
||||||
chmod: noop,
|
|
||||||
symlink: noop,
|
|
||||||
|
|
||||||
// Save and retrieve Metadata
|
|
||||||
metadata: function(path, value, sync, cb) {
|
|
||||||
var parts = ("/.c9/metadata" + path).split("/")
|
|
||||||
var name = "!" + parts.pop();
|
|
||||||
var parent = findNode(parts.join("/"), true);
|
|
||||||
if (sync) {
|
|
||||||
parent[name] = JSON.stringify(value);
|
|
||||||
return cb();
|
|
||||||
}
|
|
||||||
setTimeout(function() {
|
|
||||||
parent[name] = JSON.stringify(value);
|
|
||||||
cb();
|
|
||||||
});
|
|
||||||
},
|
|
||||||
readFileWithMetadata: function(path, options, cb) {
|
|
||||||
var data = findNode(path);
|
|
||||||
var metadata = findNode("/.c9/metadata" + path);
|
|
||||||
setTimeout(function() {
|
|
||||||
if (typeof data != "string")
|
|
||||||
return cb(ENOENT());
|
|
||||||
// TODO metadata
|
|
||||||
cb(null, data, metadata)
|
|
||||||
});
|
|
||||||
return { abort: function() {} };
|
|
||||||
},
|
|
||||||
|
|
||||||
// Wrapper around fs.watch or fs.watchFile
|
|
||||||
watch: silent,
|
|
||||||
|
|
||||||
// Network connection
|
|
||||||
connect: noop,
|
|
||||||
|
|
||||||
// Process Management
|
|
||||||
spawn: silent,
|
|
||||||
pty: silent,
|
|
||||||
tmux: silent,
|
|
||||||
execFile: silent,
|
|
||||||
killtree: silent,
|
|
||||||
|
|
||||||
// Extending the API
|
|
||||||
use: silent,
|
|
||||||
extend: silent,
|
|
||||||
unextend: silent,
|
|
||||||
|
|
||||||
isIdle: function() { return true },
|
|
||||||
}
|
|
||||||
|
|
||||||
function findNode(path, create, val) {
|
|
||||||
if (!path) path = "/";
|
|
||||||
var parts = path.split("/");
|
|
||||||
if (!parts[parts.length - 1])
|
|
||||||
parts.pop();
|
|
||||||
var data = fsData;
|
|
||||||
var prev = null;
|
|
||||||
for (var i = 0; i < parts.length; i++) {
|
|
||||||
prev = data;
|
|
||||||
data = data["!" + parts[i]];
|
|
||||||
if (data == null) {
|
|
||||||
if (create && typeof prev != "string")
|
|
||||||
data = prev["!" + parts[i]] = {};
|
|
||||||
else
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (val)
|
|
||||||
data = prev["!" + parts[parts.length - 1]] = val;
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
function ENOENT() {
|
|
||||||
var err = new Error("ENOENT");
|
|
||||||
err.code = "ENOENT";
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
function sendStream(data, cb) {
|
|
||||||
var stream = new Stream();
|
|
||||||
stream.readable = true;
|
|
||||||
cb(null, { stream: stream });
|
|
||||||
if (Array.isArray(data)) {
|
|
||||||
data.forEach(function(x) {
|
|
||||||
stream.emit("data", x);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
stream.emit("data", data);
|
|
||||||
}
|
|
||||||
stream.emit("end");
|
|
||||||
}
|
|
||||||
register(null, {
|
|
||||||
"vfs": vfsApi,
|
|
||||||
"vfs.ping": {},
|
|
||||||
"vfs.log": {
|
|
||||||
log: function() {}
|
|
||||||
},
|
|
||||||
"vfs.endpoint": {
|
|
||||||
clearCache: function() {}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
function offlineConfig(plugins) {
|
function offlineConfig(plugins) {
|
||||||
var excludes = [
|
var excludes = [
|
||||||
"plugins/c9.ide.immediate/evaluators/debugnode",
|
"plugins/c9.ide.immediate/evaluators/debugnode",
|
||||||
|
@ -390,7 +93,7 @@
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
plugins.push(vfsPlugin);
|
plugins.push("plugins/c9.vfs.client/vfs_client_mock");
|
||||||
plugins.push({
|
plugins.push({
|
||||||
provides: ["find", "installer"],
|
provides: ["find", "installer"],
|
||||||
consumes: [],
|
consumes: [],
|
||||||
|
|
Ładowanie…
Reference in New Issue