fp-ts-routing
Version:
A type-safe routing library for TypeScript
82 lines • 2.56 kB
JavaScript
;
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Route = void 0;
/**
* @since 0.6.0
*/
var Record_1 = require("fp-ts/lib/Record");
/**
* @category routes
* @since 0.4.0
*/
var Route = exports.Route = /** @class */ (function () {
function Route(parts, query) {
this.parts = parts;
this.query = query;
}
/**
* @since 0.4.0
*/
Route.isEmpty = function (r) {
return r.parts.length === 0 && (0, Record_1.isEmpty)(r.query);
};
/**
* @since 0.4.0
*/
Route.parse = function (s, decode) {
var _a;
if (decode === void 0) { decode = true; }
var pathname = (_a = new URL(s, 'http://localhost'), _a.pathname), searchParams = _a.searchParams; // `base` is needed when `path` is relative
var segments = pathname.split('/').filter(Boolean);
var parts = decode ? segments.map(decodeURIComponent) : segments;
return new Route(parts, toQuery(searchParams));
};
/**
* @since 0.4.0
*/
Route.prototype.toString = function (encode) {
if (encode === void 0) { encode = true; }
var qs = fromQuery(this.query).toString();
var parts = encode ? this.parts.map(encodeURIComponent) : this.parts;
return "/".concat(parts.join('/')).concat(qs ? '?' + qs : '');
};
/**
* @since 0.4.0
*/
Route.empty = new Route([], {});
return Route;
}());
var fromQuery = function (query) {
var qs = new URLSearchParams();
Object.entries(query).forEach(function (_a) {
var k = _a[0], v = _a[1];
if (typeof v === 'undefined') {
return;
}
return Array.isArray(v) ? v.forEach(function (x) { return qs.append(k, x); }) : qs.set(k, v);
});
return qs;
};
var toQuery = function (params) {
var q = {};
params.forEach(function (v, k) {
var current = q[k];
if (current) {
q[k] = Array.isArray(current) ? __spreadArray(__spreadArray([], current, true), [v], false) : [current, v];
}
else {
q[k] = v;
}
});
return q;
};
//# sourceMappingURL=route.js.map