UNPKG

@platform/cell.schema

Version:

URI and database schemas for the `cell.os`.

68 lines (67 loc) 2.29 kB
import { queryString } from '../common'; import { Uri } from '../Uri'; import { Links } from '../Links'; const prefix = 'fs'; const fs = Links.create(prefix); export class FileLinks { static total(links = {}) { return fs.total(links); } static toKey(filename) { return fs.toKey(filename); } static parseKey(linkKey) { return fs.parseKey(linkKey); } static parseValue(linkValue) { if (!FileLinks.is.fileValue(linkValue)) { throw new Error(`Cannot parse '${linkValue}' as it is not a file URI.`); } const res = fs.parseValue(linkValue); const toString = (options = {}) => { const { status, hash } = res.query; const query = queryString .build({ allowNil: false }) .add('status', options.status === null ? null : options.status || status) .add('hash', options.hash === null ? null : options.hash || hash) .toString(); return `${res.uri.toString()}${query}`; }; return Object.assign(Object.assign({}, res), { toString }); } static parse(linkKey, linkValue) { const key = FileLinks.parseKey(linkKey); const value = FileLinks.parseValue(linkValue); const toString = value.toString; return Object.assign(Object.assign(Object.assign({}, key), value), { toString }); } static toList(links = {}) { return fs.toList(links).map(({ key, value }) => FileLinks.parse(key, value)); } static find(links = {}) { return { byName(path) { const match = fs.find(links).byName(path); return match ? FileLinks.parse(match.key, match.value) : undefined; }, }; } } FileLinks.prefix = prefix; FileLinks.is = { fileKey(input) { return fs.isKey(input); }, fileValue(input) { input = (input || '').toString().trim(); return Uri.is.file(input); }, fileUploading(value) { if (!FileLinks.is.fileValue(value)) { return false; } value = (value || '').toString().trim(); const query = (value.split('?')[1] || '').toLowerCase(); return query.includes('status=uploading'); }, };