@codesandbox/sandpack-client
Version:
<img style="width:100%" src="https://user-images.githubusercontent.com/4838076/143581035-ebee5ba2-9cb1-4fe8-a05b-2f44bd69bb4b.gif" alt="Component toolkit for live running code editing experiences" />
403 lines • 12.8 kB
JavaScript
"use strict";
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.EmscriptenFile = void 0;
var file_system_1 = require("../core/file_system");
var node_fs_stats_1 = require("../core/node_fs_stats");
var file_1 = require("../core/file");
var util_1 = require("../core/util");
var api_error_1 = require("../core/api_error");
/**
* @hidden
*/
function convertError(e, path) {
if (path === void 0) { path = ''; }
var errno = e.errno;
var parent = e.node;
var paths = [];
while (parent) {
paths.unshift(parent.name);
if (parent === parent.parent) {
break;
}
parent = parent.parent;
}
return new api_error_1.ApiError(errno, api_error_1.ErrorStrings[errno], paths.length > 0 ? '/' + paths.join('/') : path);
}
var EmscriptenFile = /** @class */ (function (_super) {
__extends(EmscriptenFile, _super);
function EmscriptenFile(_fs, _FS, _path, _stream) {
var _this = _super.call(this) || this;
_this._fs = _fs;
_this._FS = _FS;
_this._path = _path;
_this._stream = _stream;
return _this;
}
EmscriptenFile.prototype.getPos = function () {
return undefined;
};
EmscriptenFile.prototype.close = function (cb) {
var err = null;
try {
this.closeSync();
}
catch (e) {
err = e;
}
finally {
cb(err);
}
};
EmscriptenFile.prototype.closeSync = function () {
try {
this._FS.close(this._stream);
}
catch (e) {
throw convertError(e, this._path);
}
};
EmscriptenFile.prototype.stat = function (cb) {
try {
cb(null, this.statSync());
}
catch (e) {
cb(e);
}
};
EmscriptenFile.prototype.statSync = function () {
try {
return this._fs.statSync(this._path, false);
}
catch (e) {
throw convertError(e, this._path);
}
};
EmscriptenFile.prototype.truncate = function (len, cb) {
var err = null;
try {
this.truncateSync(len);
}
catch (e) {
err = e;
}
finally {
cb(err);
}
};
EmscriptenFile.prototype.truncateSync = function (len) {
try {
this._FS.ftruncate(this._stream.fd, len);
}
catch (e) {
throw convertError(e, this._path);
}
};
EmscriptenFile.prototype.write = function (buffer, offset, length, position, cb) {
try {
cb(null, this.writeSync(buffer, offset, length, position), buffer);
}
catch (e) {
cb(e);
}
};
EmscriptenFile.prototype.writeSync = function (buffer, offset, length, position) {
try {
var u8 = (0, util_1.buffer2Uint8array)(buffer);
// Emscripten is particular about what position is set to.
var emPosition = position === null ? undefined : position;
return this._FS.write(this._stream, u8, offset, length, emPosition);
}
catch (e) {
throw convertError(e, this._path);
}
};
EmscriptenFile.prototype.read = function (buffer, offset, length, position, cb) {
try {
cb(null, this.readSync(buffer, offset, length, position), buffer);
}
catch (e) {
cb(e);
}
};
EmscriptenFile.prototype.readSync = function (buffer, offset, length, position) {
try {
var u8 = (0, util_1.buffer2Uint8array)(buffer);
// Emscripten is particular about what position is set to.
var emPosition = position === null ? undefined : position;
return this._FS.read(this._stream, u8, offset, length, emPosition);
}
catch (e) {
throw convertError(e, this._path);
}
};
EmscriptenFile.prototype.sync = function (cb) {
// NOP.
cb();
};
EmscriptenFile.prototype.syncSync = function () {
// NOP.
};
EmscriptenFile.prototype.chown = function (uid, gid, cb) {
var err = null;
try {
this.chownSync(uid, gid);
}
catch (e) {
err = e;
}
finally {
cb(err);
}
};
EmscriptenFile.prototype.chownSync = function (uid, gid) {
try {
this._FS.fchown(this._stream.fd, uid, gid);
}
catch (e) {
throw convertError(e, this._path);
}
};
EmscriptenFile.prototype.chmod = function (mode, cb) {
var err = null;
try {
this.chmodSync(mode);
}
catch (e) {
err = e;
}
finally {
cb(err);
}
};
EmscriptenFile.prototype.chmodSync = function (mode) {
try {
this._FS.fchmod(this._stream.fd, mode);
}
catch (e) {
throw convertError(e, this._path);
}
};
EmscriptenFile.prototype.utimes = function (atime, mtime, cb) {
var err = null;
try {
this.utimesSync(atime, mtime);
}
catch (e) {
err = e;
}
finally {
cb(err);
}
};
EmscriptenFile.prototype.utimesSync = function (atime, mtime) {
this._fs.utimesSync(this._path, atime, mtime);
};
return EmscriptenFile;
}(file_1.BaseFile));
exports.EmscriptenFile = EmscriptenFile;
/**
* Mounts an Emscripten file system into the BrowserFS file system.
*/
var EmscriptenFileSystem = /** @class */ (function (_super) {
__extends(EmscriptenFileSystem, _super);
function EmscriptenFileSystem(_FS) {
var _this = _super.call(this) || this;
_this._FS = _FS;
return _this;
}
/**
* Create an EmscriptenFileSystem instance with the given options.
*/
EmscriptenFileSystem.Create = function (opts, cb) {
cb(null, new EmscriptenFileSystem(opts.FS));
};
EmscriptenFileSystem.isAvailable = function () { return true; };
EmscriptenFileSystem.prototype.getName = function () { return this._FS.DB_NAME(); };
EmscriptenFileSystem.prototype.isReadOnly = function () { return false; };
EmscriptenFileSystem.prototype.supportsLinks = function () { return true; };
EmscriptenFileSystem.prototype.supportsProps = function () { return true; };
EmscriptenFileSystem.prototype.supportsSynch = function () { return true; };
EmscriptenFileSystem.prototype.renameSync = function (oldPath, newPath) {
try {
this._FS.rename(oldPath, newPath);
}
catch (e) {
if (e.errno === api_error_1.ErrorCode.ENOENT) {
throw convertError(e, this.existsSync(oldPath) ? newPath : oldPath);
}
else {
throw convertError(e);
}
}
};
EmscriptenFileSystem.prototype.statSync = function (p, isLstat) {
try {
var stats = isLstat ? this._FS.lstat(p) : this._FS.stat(p);
var itemType = this.modeToFileType(stats.mode);
return new node_fs_stats_1.default(itemType, stats.size, stats.mode, stats.atime.getTime(), stats.mtime.getTime(), stats.ctime.getTime());
}
catch (e) {
throw convertError(e, p);
}
};
EmscriptenFileSystem.prototype.openSync = function (p, flag, mode) {
try {
var stream = this._FS.open(p, flag.getFlagString(), mode);
if (this._FS.isDir(stream.node.mode)) {
this._FS.close(stream);
throw api_error_1.ApiError.EISDIR(p);
}
return new EmscriptenFile(this, this._FS, p, stream);
}
catch (e) {
throw convertError(e, p);
}
};
EmscriptenFileSystem.prototype.unlinkSync = function (p) {
try {
this._FS.unlink(p);
}
catch (e) {
throw convertError(e, p);
}
};
EmscriptenFileSystem.prototype.rmdirSync = function (p) {
try {
this._FS.rmdir(p);
}
catch (e) {
throw convertError(e, p);
}
};
EmscriptenFileSystem.prototype.mkdirSync = function (p, mode) {
try {
this._FS.mkdir(p, mode);
}
catch (e) {
throw convertError(e, p);
}
};
EmscriptenFileSystem.prototype.readdirSync = function (p) {
try {
// Emscripten returns items for '.' and '..'. Node does not.
return this._FS.readdir(p).filter(function (p) { return p !== '.' && p !== '..'; });
}
catch (e) {
throw convertError(e, p);
}
};
EmscriptenFileSystem.prototype.truncateSync = function (p, len) {
try {
this._FS.truncate(p, len);
}
catch (e) {
throw convertError(e, p);
}
};
EmscriptenFileSystem.prototype.readFileSync = function (p, encoding, flag) {
try {
var data = this._FS.readFile(p, { flags: flag.getFlagString() });
var buff = (0, util_1.uint8Array2Buffer)(data);
if (encoding) {
return buff.toString(encoding);
}
else {
return buff;
}
}
catch (e) {
throw convertError(e, p);
}
};
EmscriptenFileSystem.prototype.writeFileSync = function (p, data, encoding, flag, mode) {
try {
if (encoding) {
data = Buffer.from(data, encoding);
}
var u8 = (0, util_1.buffer2Uint8array)(data);
this._FS.writeFile(p, u8, { flags: flag.getFlagString(), encoding: 'binary' });
this._FS.chmod(p, mode);
}
catch (e) {
throw convertError(e, p);
}
};
EmscriptenFileSystem.prototype.chmodSync = function (p, isLchmod, mode) {
try {
isLchmod ? this._FS.lchmod(p, mode) : this._FS.chmod(p, mode);
}
catch (e) {
throw convertError(e, p);
}
};
EmscriptenFileSystem.prototype.chownSync = function (p, isLchown, uid, gid) {
try {
isLchown ? this._FS.lchown(p, uid, gid) : this._FS.chown(p, uid, gid);
}
catch (e) {
throw convertError(e, p);
}
};
EmscriptenFileSystem.prototype.symlinkSync = function (srcpath, dstpath, type) {
try {
this._FS.symlink(srcpath, dstpath);
}
catch (e) {
throw convertError(e);
}
};
EmscriptenFileSystem.prototype.readlinkSync = function (p) {
try {
return this._FS.readlink(p);
}
catch (e) {
throw convertError(e, p);
}
};
EmscriptenFileSystem.prototype.utimesSync = function (p, atime, mtime) {
try {
this._FS.utime(p, atime.getTime(), mtime.getTime());
}
catch (e) {
throw convertError(e, p);
}
};
EmscriptenFileSystem.prototype.modeToFileType = function (mode) {
if (this._FS.isDir(mode)) {
return node_fs_stats_1.FileType.DIRECTORY;
}
else if (this._FS.isFile(mode)) {
return node_fs_stats_1.FileType.FILE;
}
else if (this._FS.isLink(mode)) {
return node_fs_stats_1.FileType.SYMLINK;
}
else {
throw api_error_1.ApiError.EPERM("Invalid mode: ".concat(mode));
}
};
EmscriptenFileSystem.Name = "EmscriptenFileSystem";
EmscriptenFileSystem.Options = {
FS: {
type: "object",
description: "The Emscripten file system to use (the `FS` variable)"
}
};
return EmscriptenFileSystem;
}(file_system_1.SynchronousFileSystem));
exports.default = EmscriptenFileSystem;