225 lines
9.8 KiB
JavaScript
225 lines
9.8 KiB
JavaScript
|
"use strict";
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
exports.NodeFileSystemDirectoryHandle = void 0;
|
||
|
const tslib_1 = require("tslib");
|
||
|
const NodeFileSystemHandle_1 = require("./NodeFileSystemHandle");
|
||
|
const util_1 = require("./util");
|
||
|
const NodeFileSystemFileHandle_1 = require("./NodeFileSystemFileHandle");
|
||
|
/**
|
||
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/FileSystemDirectoryHandle
|
||
|
*/
|
||
|
class NodeFileSystemDirectoryHandle extends NodeFileSystemHandle_1.NodeFileSystemHandle {
|
||
|
constructor(fs, path, ctx = {}) {
|
||
|
super('directory', (0, util_1.basename)(path, ctx.separator || '/'));
|
||
|
this.fs = fs;
|
||
|
this.ctx = (0, util_1.ctx)(ctx);
|
||
|
this.__path = path[path.length - 1] === this.ctx.separator ? path : path + this.ctx.separator;
|
||
|
}
|
||
|
/**
|
||
|
* Returns a new array iterator containing the keys for each item in
|
||
|
* {@link NodeFileSystemDirectoryHandle} object.
|
||
|
*
|
||
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/FileSystemDirectoryHandle/keys
|
||
|
*/
|
||
|
keys() {
|
||
|
return tslib_1.__asyncGenerator(this, arguments, function* keys_1() {
|
||
|
const list = yield tslib_1.__await(this.fs.promises.readdir(this.__path));
|
||
|
for (const name of list)
|
||
|
yield yield tslib_1.__await('' + name);
|
||
|
});
|
||
|
}
|
||
|
/**
|
||
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/FileSystemDirectoryHandle/entries
|
||
|
*/
|
||
|
entries() {
|
||
|
return tslib_1.__asyncGenerator(this, arguments, function* entries_1() {
|
||
|
const { __path: path, fs, ctx } = this;
|
||
|
const list = yield tslib_1.__await(fs.promises.readdir(path, { withFileTypes: true }));
|
||
|
for (const d of list) {
|
||
|
const dirent = d;
|
||
|
const name = dirent.name + '';
|
||
|
const newPath = path + name;
|
||
|
if (dirent.isDirectory())
|
||
|
yield yield tslib_1.__await([name, new NodeFileSystemDirectoryHandle(fs, newPath, ctx)]);
|
||
|
else if (dirent.isFile())
|
||
|
yield yield tslib_1.__await([name, new NodeFileSystemFileHandle_1.NodeFileSystemFileHandle(fs, newPath, ctx)]);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
/**
|
||
|
* Returns a new array iterator containing the values for each index in the
|
||
|
* {@link FileSystemDirectoryHandle} object.
|
||
|
*
|
||
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/FileSystemDirectoryHandle/values
|
||
|
*/
|
||
|
values() {
|
||
|
return tslib_1.__asyncGenerator(this, arguments, function* values_1() {
|
||
|
var _a, e_1, _b, _c;
|
||
|
try {
|
||
|
for (var _d = true, _e = tslib_1.__asyncValues(this.entries()), _f; _f = yield tslib_1.__await(_e.next()), _a = _f.done, !_a; _d = true) {
|
||
|
_c = _f.value;
|
||
|
_d = false;
|
||
|
const [, value] = _c;
|
||
|
yield yield tslib_1.__await(value);
|
||
|
}
|
||
|
}
|
||
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
||
|
finally {
|
||
|
try {
|
||
|
if (!_d && !_a && (_b = _e.return)) yield tslib_1.__await(_b.call(_e));
|
||
|
}
|
||
|
finally { if (e_1) throw e_1.error; }
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
/**
|
||
|
* Returns a {@link NodeFileSystemDirectoryHandle} for a subdirectory with the specified
|
||
|
* name within the directory handle on which the method is called.
|
||
|
*
|
||
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/FileSystemDirectoryHandle/getDirectoryHandle
|
||
|
* @param name A string representing the {@link NodeFileSystemHandle} name of
|
||
|
* the subdirectory you wish to retrieve.
|
||
|
* @param options An optional object containing options for the retrieved
|
||
|
* subdirectory.
|
||
|
*/
|
||
|
async getDirectoryHandle(name, options) {
|
||
|
(0, util_1.assertName)(name, 'getDirectoryHandle', 'FileSystemDirectoryHandle');
|
||
|
const filename = this.__path + name;
|
||
|
try {
|
||
|
const stats = await this.fs.promises.stat(filename);
|
||
|
if (!stats.isDirectory())
|
||
|
throw (0, util_1.newTypeMismatchError)();
|
||
|
return new NodeFileSystemDirectoryHandle(this.fs, filename, this.ctx);
|
||
|
}
|
||
|
catch (error) {
|
||
|
if (error instanceof DOMException)
|
||
|
throw error;
|
||
|
if (error && typeof error === 'object') {
|
||
|
switch (error.code) {
|
||
|
case 'ENOENT': {
|
||
|
if (options === null || options === void 0 ? void 0 : options.create) {
|
||
|
(0, util_1.assertCanWrite)(this.ctx.mode);
|
||
|
await this.fs.promises.mkdir(filename);
|
||
|
return new NodeFileSystemDirectoryHandle(this.fs, filename, this.ctx);
|
||
|
}
|
||
|
throw (0, util_1.newNotFoundError)();
|
||
|
}
|
||
|
case 'EPERM':
|
||
|
case 'EACCES':
|
||
|
throw (0, util_1.newNotAllowedError)();
|
||
|
}
|
||
|
}
|
||
|
throw error;
|
||
|
}
|
||
|
}
|
||
|
/**
|
||
|
* Returns a {@link FileSystemFileHandle} for a file with the specified name,
|
||
|
* within the directory the method is called.
|
||
|
*
|
||
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/FileSystemDirectoryHandle/getFileHandle
|
||
|
* @param name A string representing the {@link NodeFileSystemHandle} name of
|
||
|
* the file you wish to retrieve.
|
||
|
* @param options An optional object containing options for the retrieved file.
|
||
|
*/
|
||
|
async getFileHandle(name, options) {
|
||
|
(0, util_1.assertName)(name, 'getFileHandle', 'FileSystemDirectoryHandle');
|
||
|
const filename = this.__path + name;
|
||
|
try {
|
||
|
const stats = await this.fs.promises.stat(filename);
|
||
|
if (!stats.isFile())
|
||
|
throw (0, util_1.newTypeMismatchError)();
|
||
|
return new NodeFileSystemFileHandle_1.NodeFileSystemFileHandle(this.fs, filename, this.ctx);
|
||
|
}
|
||
|
catch (error) {
|
||
|
if (error instanceof DOMException)
|
||
|
throw error;
|
||
|
if (error && typeof error === 'object') {
|
||
|
switch (error.code) {
|
||
|
case 'ENOENT': {
|
||
|
if (options === null || options === void 0 ? void 0 : options.create) {
|
||
|
(0, util_1.assertCanWrite)(this.ctx.mode);
|
||
|
await this.fs.promises.writeFile(filename, '');
|
||
|
return new NodeFileSystemFileHandle_1.NodeFileSystemFileHandle(this.fs, filename, this.ctx);
|
||
|
}
|
||
|
throw (0, util_1.newNotFoundError)();
|
||
|
}
|
||
|
case 'EPERM':
|
||
|
case 'EACCES':
|
||
|
throw (0, util_1.newNotAllowedError)();
|
||
|
}
|
||
|
}
|
||
|
throw error;
|
||
|
}
|
||
|
}
|
||
|
/**
|
||
|
* Attempts to remove an entry if the directory handle contains a file or
|
||
|
* directory called the name specified.
|
||
|
*
|
||
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/FileSystemDirectoryHandle/removeEntry
|
||
|
* @param name A string representing the {@link FileSystemHandle} name of the
|
||
|
* entry you wish to remove.
|
||
|
* @param options An optional object containing options.
|
||
|
*/
|
||
|
async removeEntry(name, { recursive = false } = {}) {
|
||
|
(0, util_1.assertCanWrite)(this.ctx.mode);
|
||
|
(0, util_1.assertName)(name, 'removeEntry', 'FileSystemDirectoryHandle');
|
||
|
const filename = this.__path + name;
|
||
|
const promises = this.fs.promises;
|
||
|
try {
|
||
|
const stats = await promises.stat(filename);
|
||
|
if (stats.isFile()) {
|
||
|
await promises.unlink(filename);
|
||
|
}
|
||
|
else if (stats.isDirectory()) {
|
||
|
await promises.rmdir(filename, { recursive });
|
||
|
}
|
||
|
else
|
||
|
throw (0, util_1.newTypeMismatchError)();
|
||
|
}
|
||
|
catch (error) {
|
||
|
if (error instanceof DOMException)
|
||
|
throw error;
|
||
|
if (error && typeof error === 'object') {
|
||
|
switch (error.code) {
|
||
|
case 'ENOENT': {
|
||
|
throw (0, util_1.newNotFoundError)();
|
||
|
}
|
||
|
case 'EPERM':
|
||
|
case 'EACCES':
|
||
|
throw (0, util_1.newNotAllowedError)();
|
||
|
case 'ENOTEMPTY':
|
||
|
throw new DOMException('The object can not be modified in this way.', 'InvalidModificationError');
|
||
|
}
|
||
|
}
|
||
|
throw error;
|
||
|
}
|
||
|
}
|
||
|
/**
|
||
|
* The `resolve()` method of the {@link FileSystemDirectoryHandle} interface
|
||
|
* returns an {@link Array} of directory names from the parent handle to the specified
|
||
|
* child entry, with the name of the child entry as the last array item.
|
||
|
*
|
||
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/FileSystemDirectoryHandle/resolve
|
||
|
* @param possibleDescendant The {@link NodeFileSystemFileHandle} from which
|
||
|
* to return the relative path.
|
||
|
*/
|
||
|
async resolve(possibleDescendant) {
|
||
|
if (possibleDescendant instanceof NodeFileSystemDirectoryHandle ||
|
||
|
possibleDescendant instanceof NodeFileSystemFileHandle_1.NodeFileSystemFileHandle) {
|
||
|
const path = this.__path;
|
||
|
const childPath = possibleDescendant.__path;
|
||
|
if (!childPath.startsWith(path))
|
||
|
return null;
|
||
|
let relative = childPath.slice(path.length);
|
||
|
if (relative === '')
|
||
|
return [];
|
||
|
const separator = this.ctx.separator;
|
||
|
if (relative[0] === separator)
|
||
|
relative = relative.slice(1);
|
||
|
return relative.split(separator);
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
exports.NodeFileSystemDirectoryHandle = NodeFileSystemDirectoryHandle;
|
||
|
//# sourceMappingURL=NodeFileSystemDirectoryHandle.js.map
|