41 lines
773 B
JavaScript
41 lines
773 B
JavaScript
import querystring from "node:querystring";
|
|
|
|
import jid from "@xmpp/jid";
|
|
import { IRI } from "iri";
|
|
|
|
function findQueryType(params) {
|
|
return Object.getOwnPropertyNames(params).find((k) => {
|
|
return k[0] === "?" && params[k] === "";
|
|
});
|
|
}
|
|
|
|
export function parse(str) {
|
|
const iri = new IRI(str);
|
|
|
|
const uri = {};
|
|
|
|
const path = iri.path();
|
|
uri.path = jid(path.startsWith("/") ? path.slice(1) : path);
|
|
|
|
const authority = iri.authority();
|
|
if (authority) {
|
|
uri.authority = jid(authority);
|
|
}
|
|
|
|
const query = iri.query();
|
|
const params = querystring.parse(query, ";");
|
|
const type = findQueryType(params);
|
|
if (type) {
|
|
delete params[type];
|
|
}
|
|
|
|
if (query) {
|
|
uri.query = {
|
|
type: type.slice(1),
|
|
params,
|
|
};
|
|
}
|
|
|
|
return uri;
|
|
}
|