@platform/cell.schema
Version:
URI and database schemas for the `cell.os`.
68 lines (67 loc) • 2.29 kB
JavaScript
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');
},
};