UNPKG

@data-client/rest

Version:

Quickly define typed REST resources and endpoints

55 lines 7.85 kB
import { compile, parse, pathToRegexp } from './pathToRegexp.js'; const urlBaseCache = Object.create(null); export function getUrlBase(path) { if (!(path in urlBaseCache)) { urlBaseCache[path] = compile(path); } return urlBaseCache[path]; } const urlTokensCache = Object.create(null); export function getUrlTokens(path) { if (!(path in urlTokensCache)) { urlTokensCache[path] = tokenMap(parse(path).tokens); } return urlTokensCache[path]; } const pathRegexCache = Object.create(null); export function getPathRegex(path) { if (!(path in pathRegexCache)) { pathRegexCache[path] = pathToRegexp(path).regexp; } return pathRegexCache[path]; } function tokenMap(tokens) { const tokenNames = new Set(); for (const token of tokens) { switch (token.type) { case 'param': case 'wildcard': tokenNames.add(token.name); break; case 'group': for (const name of tokenMap(token.tokens)) { tokenNames.add(name); } break; } } return tokenNames; } const proto = Object.prototype; const gpo = Object.getPrototypeOf; export function isPojo(obj) { if (obj === null || typeof obj !== 'object') { return false; } return gpo(obj) === proto; } export function shortenPath(path) { const lastTokenIndex = Math.max(path.lastIndexOf(':'), path.lastIndexOf('*')); if (lastTokenIndex === -1) throw new Error('Resource path requires at least one :parameter or *wildcard'); let shortUrlRoot = path.substring(0, lastTokenIndex); if (shortUrlRoot[shortUrlRoot.length - 1] === '/') shortUrlRoot = shortUrlRoot.substring(0, shortUrlRoot.length - 1); return shortUrlRoot; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21waWxlIiwicGFyc2UiLCJwYXRoVG9SZWdleHAiLCJ1cmxCYXNlQ2FjaGUiLCJPYmplY3QiLCJjcmVhdGUiLCJnZXRVcmxCYXNlIiwicGF0aCIsInVybFRva2Vuc0NhY2hlIiwiZ2V0VXJsVG9rZW5zIiwidG9rZW5NYXAiLCJ0b2tlbnMiLCJwYXRoUmVnZXhDYWNoZSIsImdldFBhdGhSZWdleCIsInJlZ2V4cCIsInRva2VuTmFtZXMiLCJTZXQiLCJ0b2tlbiIsInR5cGUiLCJhZGQiLCJuYW1lIiwicHJvdG8iLCJwcm90b3R5cGUiLCJncG8iLCJnZXRQcm90b3R5cGVPZiIsImlzUG9qbyIsIm9iaiIsInNob3J0ZW5QYXRoIiwibGFzdFRva2VuSW5kZXgiLCJNYXRoIiwibWF4IiwibGFzdEluZGV4T2YiLCJFcnJvciIsInNob3J0VXJsUm9vdCIsInN1YnN0cmluZyIsImxlbmd0aCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9SZXN0SGVscGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjb21waWxlLFxuICBQYXRoRnVuY3Rpb24sXG4gIHBhcnNlLFxuICBwYXRoVG9SZWdleHAsXG4gIFRva2VuLFxuICBQYXJhbURhdGEsXG59IGZyb20gJy4vcGF0aFRvUmVnZXhwLmpzJztcbmltcG9ydCB7IFNob3J0ZW5QYXRoIH0gZnJvbSAnLi9wYXRoVHlwZXMuanMnO1xuXG5jb25zdCB1cmxCYXNlQ2FjaGU6IFJlY29yZDxzdHJpbmcsIFBhdGhGdW5jdGlvbjxvYmplY3Q+PiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5leHBvcnQgZnVuY3Rpb24gZ2V0VXJsQmFzZShwYXRoOiBzdHJpbmcpOiBQYXRoRnVuY3Rpb248UGFyYW1EYXRhPiB7XG4gIGlmICghKHBhdGggaW4gdXJsQmFzZUNhY2hlKSkge1xuICAgIHVybEJhc2VDYWNoZVtwYXRoXSA9IGNvbXBpbGUocGF0aCk7XG4gIH1cbiAgcmV0dXJuIHVybEJhc2VDYWNoZVtwYXRoXTtcbn1cblxuY29uc3QgdXJsVG9rZW5zQ2FjaGU6IFJlY29yZDxzdHJpbmcsIFNldDxzdHJpbmc+PiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5leHBvcnQgZnVuY3Rpb24gZ2V0VXJsVG9rZW5zKHBhdGg6IHN0cmluZyk6IFNldDxzdHJpbmc+IHtcbiAgaWYgKCEocGF0aCBpbiB1cmxUb2tlbnNDYWNoZSkpIHtcbiAgICB1cmxUb2tlbnNDYWNoZVtwYXRoXSA9IHRva2VuTWFwKHBhcnNlKHBhdGgpLnRva2Vucyk7XG4gIH1cbiAgcmV0dXJuIHVybFRva2Vuc0NhY2hlW3BhdGhdO1xufVxuXG5jb25zdCBwYXRoUmVnZXhDYWNoZTogUmVjb3JkPHN0cmluZywgUmVnRXhwPiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5leHBvcnQgZnVuY3Rpb24gZ2V0UGF0aFJlZ2V4KHBhdGg6IHN0cmluZyk6IFJlZ0V4cCB7XG4gIGlmICghKHBhdGggaW4gcGF0aFJlZ2V4Q2FjaGUpKSB7XG4gICAgcGF0aFJlZ2V4Q2FjaGVbcGF0aF0gPSBwYXRoVG9SZWdleHAocGF0aCkucmVnZXhwO1xuICB9XG4gIHJldHVybiBwYXRoUmVnZXhDYWNoZVtwYXRoXTtcbn1cblxuZnVuY3Rpb24gdG9rZW5NYXAodG9rZW5zOiBUb2tlbltdKTogU2V0PHN0cmluZz4ge1xuICBjb25zdCB0b2tlbk5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgICBjYXNlICdwYXJhbSc6XG4gICAgICBjYXNlICd3aWxkY2FyZCc6XG4gICAgICAgIHRva2VuTmFtZXMuYWRkKHRva2VuLm5hbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2dyb3VwJzpcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIHRva2VuTWFwKHRva2VuLnRva2VucykpIHtcbiAgICAgICAgICB0b2tlbk5hbWVzLmFkZChuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRva2VuTmFtZXM7XG59XG5cbmNvbnN0IHByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcbmNvbnN0IGdwbyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUG9qbyhvYmo6IHVua25vd24pOiBvYmogaXMgUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGdwbyhvYmopID09PSBwcm90bztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3J0ZW5QYXRoPFMgZXh0ZW5kcyBzdHJpbmc+KHBhdGg6IFMpOiBTaG9ydGVuUGF0aDxTPiB7XG4gIGNvbnN0IGxhc3RUb2tlbkluZGV4ID0gTWF0aC5tYXgocGF0aC5sYXN0SW5kZXhPZignOicpLCBwYXRoLmxhc3RJbmRleE9mKCcqJykpO1xuICBpZiAobGFzdFRva2VuSW5kZXggPT09IC0xKVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdSZXNvdXJjZSBwYXRoIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSA6cGFyYW1ldGVyIG9yICp3aWxkY2FyZCcsXG4gICAgKTtcbiAgbGV0IHNob3J0VXJsUm9vdDogU2hvcnRlblBhdGg8Uz4gPSBwYXRoLnN1YnN0cmluZygwLCBsYXN0VG9rZW5JbmRleCkgYXMgYW55O1xuICBpZiAoc2hvcnRVcmxSb290W3Nob3J0VXJsUm9vdC5sZW5ndGggLSAxXSA9PT0gJy8nKVxuICAgIHNob3J0VXJsUm9vdCA9IHNob3J0VXJsUm9vdC5zdWJzdHJpbmcoXG4gICAgICAwLFxuICAgICAgc2hvcnRVcmxSb290Lmxlbmd0aCAtIDEsXG4gICAgKSBhcyBTaG9ydGVuUGF0aDxTPjtcbiAgcmV0dXJuIHNob3J0VXJsUm9vdDtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FDRUEsT0FBTyxFQUVQQyxLQUFLLEVBQ0xD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