UNPKG

gnablib

Version:

A lean, zero dependency library to provide a useful base for your project.

2 lines 3.43 kB
/*! Copyright 2023 the gnablib contributors MPL-1.1 */ import{BnfAlt as n,BnfChar as e,BnfConcat as t,BnfString as s,BnfRepeat as o}from"../abnf/bnf.js";import{rules as w}from"../abnf/rules.js";import{WindowStr as a}from"./WindowStr.js";const r=n.Split("!$&'()*+,;=",void 0,"sub-delims"),p=n.Split(":/?#[]@",void 0,"gen-delims"),l=new e("/"),m=new e("?"),c=new e(":"),i=new e("@"),u=new e("#"),P=new s("::"),O=new s("//"),h=new e("-");new n(r,p).name="reserved";const I=new n(w.ALPHA,w.DIGIT,h,w.DOT,new e("_"),new e("~"));I.name="unreserved";const d=new t(new e("%"),w.HEXDIG,w.HEXDIG);d.name="pct-encoded";const D=new n(I,d,r,c,i);D.name="pchar",D.suppressComponents=!0;const A=o.ZeroPlus(new n(D,l,m),"fragment");A.suppressComponents=!0;const E=o.ZeroPlus(new n(D,l,m),"query");E.suppressComponents=!0;const Z=o.ZeroPlus(D,"segment"),f=o.OnePlus(D,"segment-nz"),v=o.OnePlus(new n(I,d,r,i),"segment-nz-nc"),g=new t(l,Z);g.suppressComponents=!0;const C=new t(f,o.ZeroPlus(g));C.name="path-rootless";const H=new t(v,o.ZeroPlus(g));H.name="path-noscheme";const S=new t(l,o.Optional(new t(f,o.ZeroPlus(g))));S.name="path-absolute";const T=o.ZeroPlus(g,"path-abempty");new n(T,S,H,C,w.EMPTY).name="path";const y=o.ZeroPlus(new n(I,d,r),"reg-name");y.suppressComponents=!0;const B=o.Between(1,4,w.HEXDIG,"h16"),b=new n(new t(B,c,B),w.IPv4_ADDRESS);b.name="ls32";const G=new t(B,c),x=new n(new t(o.Exactly(6,G),b),new t(P,o.Exactly(5,G),b),new t(o.Optional(B),P,o.Exactly(4,G),b),new t(o.Optional(new t(o.Between(0,1,G),B)),P,o.Exactly(3,G),b),new t(o.Optional(new t(o.Between(0,2,G),B)),P,o.Exactly(2,G),b),new t(o.Optional(new t(o.Between(0,3,G),B)),P,G,b),new t(o.Optional(new t(o.Between(0,4,G),B)),P,b),new t(o.Optional(new t(o.Between(0,5,G),B)),P,B),new t(o.Optional(new t(o.Between(0,6,G),B)),P));x.name="IPv6address";const L=new t(new e("v"),o.OnePlus(w.HEXDIG),w.DOT,o.OnePlus(new n(I,r,c)));L.name="IPvFuture";const M=new t(new e("["),new n(x,L),new e("]"));M.name="IP-literal";const N=o.ZeroPlus(w.DIGIT,"port"),z=new n(M,w.IPv4_ADDRESS,y);z.name="host";const U=o.ZeroPlus(new n(I,d,r,c));U.name="userinfo";const q=new t(o.Optional(new t(U,i)),z,o.Optional(new t(c,N)));q.name="authority";const X=new t(w.ALPHA,o.ZeroPlus(new n(w.ALPHA,w.DIGIT,new e("+"),h,w.DOT)));X.name="scheme",X.suppressComponents=!0;const j=new n(new t(O,q,T),S,H,w.EMPTY);j.name="relative-part";new t(j,o.Optional(new t(m,E)),o.Optional(new t(u,A))).name="relative-ref";const R=new n(new t(O,q,T),S,C,w.EMPTY);R.name="heir-part";new t(X,c,R,o.Optional(new t(m,E))).name="absolute-URI";const Y=new t(D,o.ZeroPlus(new n(D,l,m)));Y.name="q-component",Y.suppressComponents=!0;const _=new t(D,o.ZeroPlus(new n(D,l,m)));_.name="r-component",_.suppressComponents=!0;const W=new t(o.Optional(new t(new s("?+"),_)),o.Optional(new t(new s("?="),Y)));W.name="rq-components";const F=new t(D,o.ZeroPlus(new n(D,l)));F.name="NSS",F.suppressComponents=!0;const $=new n(w.ALPHANUM,h),k=new t(w.ALPHANUM,o.Between(0,30,$),w.ALPHANUM);k.name="NID";const J=new t(new s("urn"),c,k,c,F);J.name="assigned-name";const K=new t(J,o.Optional(W),o.Optional(new t(u,A)));export class Urn{constructor(n,e,t,s,o){this.nid=n,this.nss=e,this.rComponent=t,this.qComponent=s,this.fragment=o}get formal(){return this.nid.startsWith("uri-")}static parse(n){n=a.coerce(n);const e=K.atStartOf(n);console.log(e)}static validNid(n){return null!==n.match(/[a-z0-9][a-z0-9-]*[a-z0-9]/g)}}