ownfiles
Version:
A library to manage files in a Solid User's Pod
191 lines • 7.34 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.deepRead = void 0;
const solid_namespace_1 = __importDefault(require("solid-namespace"));
const mime_1 = __importDefault(require("mime"));
const rdf = __importStar(require("rdflib"));
const typeNamespaceUrl = 'http://www.w3.org/ns/iana/media-types/';
const types = rdf.Namespace(typeNamespaceUrl);
exports.deepRead = async function (folderUrl, options = {
auth: null,
verbose: false,
}) {
const deepRead = await this.read(folderUrl, {
verbose: true,
headOnly: true,
headers: { Accept: 'text/turtle' },
})
.catch((err) => {
var _a, _b;
if (((_a = err === null || err === void 0 ? void 0 : err.response) === null || _a === void 0 ? void 0 : _a.url) &&
err.response.status !== 404 &&
mime_1.default.getType(folderUrl)) {
return Promise.resolve(options.verbose
? [
{
name: err.response.url,
type: mime_1.default.getType(err.response.url),
},
]
: err.response.url);
}
if (((_b = err === null || err === void 0 ? void 0 : err.response) === null || _b === void 0 ? void 0 : _b.url) && err.response.status !== 404)
return Promise.resolve({ files: [], folders: [] });
})
.then((folder) => {
const file = folder;
folder = folder;
if ((file === null || file === void 0 ? void 0 : file.name) && file.type) {
return Promise.resolve(options.verbose
? [
{
url: file.name,
type: types(file.type + '#Resource').value,
},
]
: [file.name]);
}
else if ((folder === null || folder === void 0 ? void 0 : folder.files) && folder.folders) {
const folderList = folder.folders.map((folder) => this.deepRead(folder, options));
const fileList = folder.files.map((file) => new Promise(function (resolve) {
if (options.verbose) {
options.foundCallback &&
options.foundCallback(file.name);
resolve({
url: file.name,
type: types(file.type + '#Resource').value,
});
}
else {
options.foundCallback &&
options.foundCallback(file.name);
resolve(file.name);
}
}));
return Promise.all([
...folderList,
...fileList,
new Promise(function (resolve) {
if (options.verbose) {
options.foundCallback &&
options.foundCallback(folderUrl);
resolve([
{
url: folderUrl.endsWith('/')
? folderUrl
: folderUrl + '/',
type: 'folder',
},
]);
}
else {
options.foundCallback &&
options.foundCallback(folderUrl);
resolve([
folderUrl.endsWith('/')
? folderUrl
: folderUrl + '/',
]);
}
}),
]);
}
return Promise.resolve([]);
})
.then((results) => {
return flattenArray(results)
.sort((fileA, fileB) => sortByDepth(fileA, fileB, !!options.verbose))
.reverse();
});
if (options.verbose) {
const verboseDeepRead = deepRead.map((resource, _, deepRead) => {
const previousIndexResource = resource;
const unseenResource = resource;
if (previousIndexResource.types)
return resource;
if (unseenResource === null || unseenResource === void 0 ? void 0 : unseenResource.type) {
return unseenResource.type === 'folder'
? {
url: unseenResource.url,
types: [
solid_namespace_1.default().ldp('Container'),
...getContainedTypes(unseenResource, deepRead),
],
}
: {
url: unseenResource.url,
types: [unseenResource.type, solid_namespace_1.default().ldp('Resource')],
};
}
});
return verboseDeepRead;
}
return deepRead;
};
const getContainedTypes = (item, index) => {
return index
.reduce((allTypes, currentItem) => {
return currentItem.url.includes(item.url) &&
currentItem.type &&
currentItem.type !== null &&
currentItem.type !== 'folder'
? [...allTypes, currentItem.type]
: allTypes;
}, [])
.filter((currentType, index, allNodes) => allNodes.findIndex((type) => currentType === type) ===
index);
};
function flattenArray(array) {
let result = [];
for (let i = 0; i < array.length; i++) {
const element = array[i];
if (Array.isArray(element)) {
result = [...result, ...flattenArray(element)];
}
else {
result = [...result, element];
}
}
return result;
}
function sortByDepth(fileA, fileB, verbose) {
if (verbose && typeof fileA !== 'string' && typeof fileB !== 'string') {
fileA = fileA.url;
fileB = fileB.url;
}
let depthA = 0;
let depthB = 0;
if (typeof fileA === 'string' && typeof fileB === 'string') {
depthA = fileA.split('/').length;
depthB = fileB.split('/').length;
}
if (depthA === depthB) {
return fileA.length - fileB.length;
}
else {
return depthA - depthB;
}
}
//# sourceMappingURL=deepRead.js.map