UNPKG

ownfiles

Version:

A library to manage files in a Solid User's Pod

191 lines 7.34 kB
"use strict"; 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