UNPKG

@platform/cell.schema

Version:

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

176 lines (175 loc) 6.51 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var common_1 = require("../common"); var Uri_1 = require("../Uri"); var Links = (function () { function Links(args) { this.prefix = args.prefix; } Links.prototype.isKey = function (input) { return Links.isKey(this.prefix, input); }; Links.isKey = function (prefix, input) { input = (input || '').toString().trim(); return input.startsWith(prefix); }; Links.prototype.total = function (links) { if (links === void 0) { links = {}; } return Links.total(this.prefix, links); }; Links.total = function (prefix, links) { if (links === void 0) { links = {}; } return Object.keys(links).reduce(function (acc, next) { return Links.isKey(prefix, next) ? acc + 1 : acc; }, 0); }; Links.prototype.toKey = function (input) { return Links.toKey(this.prefix, input); }; Links.toKey = function (prefix, input) { input = (input || '').trim(); if (!input) { throw new Error("Link key must have a value."); } prefix = (prefix || '').trim().replace(/:*$/, ''); return prefix + ":" + encode(input); }; Links.prototype.toList = function (links) { if (links === void 0) { links = {}; } return Links.toList(this.prefix, links); }; Links.toList = function (prefix, links) { if (links === void 0) { links = {}; } return Object.keys(links) .map(function (key) { return ({ key: key, value: links[key] }); }) .filter(function (_a) { var key = _a.key; return Links.isKey(prefix, key); }) .map(function (_a) { var key = _a.key, value = _a.value; return ({ key: key, value: value }); }); }; Links.prototype.parseKey = function (linkKey) { return Links.parseKey(this.prefix, linkKey); }; Links.parseKey = function (prefix, linkKey) { var key = (linkKey || '').trim(); var path = key.replace(new RegExp("^" + prefix + ":"), ''); path = shouldDecode(path) ? Links.decodeKey(path) : path; var lastSlash = path.lastIndexOf('/'); var lastPeriod = path.lastIndexOf('.'); var name = lastSlash < 0 ? path : path.substring(lastSlash + 1); var dir = lastSlash < 0 ? '' : path.substring(0, lastSlash); var ext = lastPeriod < 0 ? '' : path.substring(lastPeriod + 1); var res = { prefix: prefix, key: key, path: path, name: name, dir: dir, ext: ext }; return res; }; Links.prototype.parseValue = function (linkValue) { return Links.parseValue(linkValue); }; Links.parseValue = function (linkValue) { var parts = (linkValue || '') .trim() .split('?') .map(function (part) { return part.trim(); }); var uri = Uri_1.Uri.parse(parts[0] || '').parts; var query = common_1.queryString.toObject(parts[1]); var value = parts.join('?').replace(/\?$/, ''); var res = { value: value, uri: uri, query: query }; return res; }; Links.prototype.parse = function (linkKey, linkValue) { return Links.parseLink(this.prefix, linkKey, linkValue); }; Links.parseLink = function (prefix, linkKey, linkValue) { var key = Links.parseKey(prefix, linkKey); var value = Links.parseValue(linkValue); return tslib_1.__assign(tslib_1.__assign({}, key), value); }; Links.prototype.find = function (links) { if (links === void 0) { links = {}; } return Links.find(this.prefix, links); }; Links.find = function (prefix, links) { if (links === void 0) { links = {}; } return { byName: function (path) { path = (path || '').trim().replace(/^\/*/, ''); return Object.keys(links) .map(function (key) { return ({ key: key, value: links[key] }); }) .filter(function (_a) { var key = _a.key; return Links.isKey(prefix, key); }) .find(function (_a) { var key = _a.key; var parsed = Links.parseKey(prefix, key); return (path || '').includes('*') ? common_1.wildcard.isMatch(parsed.path, path) : parsed.path === path; }); }, }; }; Links.encodeKey = encode; Links.decodeKey = decode; Links.create = function (prefix) { return new Links({ prefix: prefix }); }; return Links; }()); exports.Links = Links; function encode(input) { var ILLEGAL = [':']; ILLEGAL.forEach(function (char) { if (input.includes(char)) { throw new Error("Link key cannot contain \"" + char + "\" character."); } }); input = trimSlashes(input); var escapeMultiPeriods = function (input) { var regex = new RegExp(/\.{2,}/g); var match = regex.exec(input); if (match && match[0]) { var left = input.substring(0, match.index); var middle = ':'.repeat(match[0].length); var right = input.substring(match.index + match[0].length); input = left + "[" + middle + "]" + right; return escapeMultiPeriods(input); } else { return input; } }; input = escapeMultiPeriods(input) .replace(/\//g, '::') .replace(/\./g, ':'); return input; } function decode(input) { var unescapeMultiPeriods = function (input) { var regex = new RegExp(/\[:{2,}\]/g); var match = regex.exec(input); if (match && match[0]) { var left = input.substring(0, match.index); var middle = '.'.repeat(match[0].length - 2); var right = input.substring(match.index + match[0].length); input = "" + left + middle + right; return unescapeMultiPeriods(input); } else { return input; } }; input = unescapeMultiPeriods(input) .replace(/::/g, '/') .replace(/:/g, '.'); return input; } function shouldDecode(input) { return input.includes(':'); } function trimSlashes(input) { return (input || '').replace(/^\/*/, '').replace(/\/*$/, ''); }