wysiwyv 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +150 -0
- package/dist/core.d.ts +7 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +147 -0
- package/dist/hooks/and.d.ts +10 -0
- package/dist/hooks/and.d.ts.map +1 -0
- package/dist/hooks/and.js +29 -0
- package/dist/hooks/any.d.ts +8 -0
- package/dist/hooks/any.d.ts.map +1 -0
- package/dist/hooks/any.js +11 -0
- package/dist/hooks/array.d.ts +18 -0
- package/dist/hooks/array.d.ts.map +1 -0
- package/dist/hooks/array.js +56 -0
- package/dist/hooks/bool.d.ts +8 -0
- package/dist/hooks/bool.d.ts.map +1 -0
- package/dist/hooks/bool.js +16 -0
- package/dist/hooks/datetime.d.ts +11 -0
- package/dist/hooks/datetime.d.ts.map +1 -0
- package/dist/hooks/datetime.js +88 -0
- package/dist/hooks/email.d.ts +8 -0
- package/dist/hooks/email.d.ts.map +1 -0
- package/dist/hooks/email.js +26 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +28 -0
- package/dist/hooks/int.d.ts +13 -0
- package/dist/hooks/int.d.ts.map +1 -0
- package/dist/hooks/int.js +24 -0
- package/dist/hooks/number.d.ts +15 -0
- package/dist/hooks/number.d.ts.map +1 -0
- package/dist/hooks/number.js +30 -0
- package/dist/hooks/object.d.ts +14 -0
- package/dist/hooks/object.d.ts.map +1 -0
- package/dist/hooks/object.js +80 -0
- package/dist/hooks/or.d.ts +10 -0
- package/dist/hooks/or.d.ts.map +1 -0
- package/dist/hooks/or.js +26 -0
- package/dist/hooks/string.d.ts +8 -0
- package/dist/hooks/string.d.ts.map +1 -0
- package/dist/hooks/string.js +16 -0
- package/dist/hooks/uuid.d.ts +9 -0
- package/dist/hooks/uuid.d.ts.map +1 -0
- package/dist/hooks/uuid.js +78 -0
- package/dist/hooks/val.d.ts +10 -0
- package/dist/hooks/val.d.ts.map +1 -0
- package/dist/hooks/val.js +24 -0
- package/dist/type/engine.d.ts +14 -0
- package/dist/type/engine.d.ts.map +1 -0
- package/dist/type/engine.js +1 -0
- package/dist/type/plugin.d.ts +26 -0
- package/dist/type/plugin.d.ts.map +1 -0
- package/dist/type/plugin.js +1 -0
- package/dist/type/template.d.ts +6 -0
- package/dist/type/template.d.ts.map +1 -0
- package/dist/type/template.js +1 -0
- package/dist/util/HookAssessment.d.ts +13 -0
- package/dist/util/HookAssessment.d.ts.map +1 -0
- package/dist/util/HookAssessment.js +42 -0
- package/dist/util/HookError.d.ts +14 -0
- package/dist/util/HookError.d.ts.map +1 -0
- package/dist/util/HookError.js +13 -0
- package/dist/util/parseHook.d.ts +5 -0
- package/dist/util/parseHook.d.ts.map +1 -0
- package/dist/util/parseHook.js +21 -0
- package/dist/util/stringify.d.ts +2 -0
- package/dist/util/stringify.d.ts.map +1 -0
- package/dist/util/stringify.js +34 -0
- package/dist/util/types.d.ts +15 -0
- package/dist/util/types.d.ts.map +1 -0
- package/dist/util/types.js +24 -0
- package/dist/wysiwyv-core.d.ts +3 -0
- package/dist/wysiwyv-core.d.ts.map +1 -0
- package/dist/wysiwyv-core.js +11 -0
- package/dist/wysiwyv.d.ts +3 -0
- package/dist/wysiwyv.d.ts.map +1 -0
- package/dist/wysiwyv.js +7 -0
- package/dist/wysiwyv.min.js +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stringify.d.ts","sourceRoot":"","sources":["../../src/util/stringify.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,IAAI,GAAI,KAAK,OAAO,WAmBhC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { isNanValue, isNull, isOddObject, isString } from "./types";
|
|
2
|
+
function getDetailedType(val) {
|
|
3
|
+
// This returns strings like "[object Map]", "[object Date]", "[object RegExp]"
|
|
4
|
+
const rawType = Object.prototype.toString.call(val);
|
|
5
|
+
// Clean it up to just "Map", "Date", etc.
|
|
6
|
+
return rawType.slice(8, -1);
|
|
7
|
+
}
|
|
8
|
+
export const repr = (val) => {
|
|
9
|
+
if (isNull(val))
|
|
10
|
+
return "null";
|
|
11
|
+
if (isString(val))
|
|
12
|
+
return val;
|
|
13
|
+
if (isNanValue(val))
|
|
14
|
+
return "NaN";
|
|
15
|
+
if (val === Infinity)
|
|
16
|
+
return "Infinity";
|
|
17
|
+
if (val === -Infinity)
|
|
18
|
+
return "-Infinity";
|
|
19
|
+
if (val instanceof Date)
|
|
20
|
+
return val.toISOString();
|
|
21
|
+
if (val instanceof RegExp)
|
|
22
|
+
return val.toString();
|
|
23
|
+
if (val instanceof String)
|
|
24
|
+
return val.toString();
|
|
25
|
+
const label = isOddObject(val) ? getDetailedType(val) : "";
|
|
26
|
+
let str;
|
|
27
|
+
try {
|
|
28
|
+
str = JSON.stringify(val) ?? String(val);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
str = String(val);
|
|
32
|
+
}
|
|
33
|
+
return [label, str].filter((s) => s).join(" ");
|
|
34
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare const isString: (value: unknown) => value is string;
|
|
2
|
+
export declare const isNumber: (value: unknown) => value is number;
|
|
3
|
+
export declare const isBoolean: (value: unknown) => value is boolean;
|
|
4
|
+
export declare const isNull: (value: unknown) => value is null;
|
|
5
|
+
export declare const notNull: <T>(value: T | undefined | null) => value is NonNullable<T>;
|
|
6
|
+
export declare const isUndefined: (value: unknown) => value is undefined;
|
|
7
|
+
export declare const isDefined: <T>(value: T | undefined) => value is T;
|
|
8
|
+
export declare const isObject: (value: unknown) => value is object;
|
|
9
|
+
export declare const isPlainObject: (val: unknown) => val is Record<string, unknown>;
|
|
10
|
+
export declare const isOddObject: (val: unknown) => val is object;
|
|
11
|
+
export declare const isEmptyObject: (value: unknown) => value is Record<string, never>;
|
|
12
|
+
export declare const isArray: (value: unknown) => value is unknown[];
|
|
13
|
+
export declare const isNanValue: (value: unknown) => value is number;
|
|
14
|
+
export declare const isRegex: (value: unknown) => value is RegExp;
|
|
15
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/util/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MACxB,CAAC;AAE5B,eAAO,MAAM,QAAQ,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MACE,CAAC;AAEtD,eAAO,MAAM,SAAS,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,OACxB,CAAC;AAE7B,eAAO,MAAM,MAAM,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,IAAsB,CAAC;AAExE,eAAO,MAAM,OAAO,GAAI,CAAC,EACvB,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,KAC1B,KAAK,IAAI,WAAW,CAAC,CAAC,CAA0C,CAAC;AAEpE,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,SACjC,CAAC;AAEtB,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,OAAO,CAAC,GAAG,SAAS,KAAG,KAAK,IAAI,CACxC,CAAC;AAEtB,eAAO,MAAM,QAAQ,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MACmB,CAAC;AAEvE,eAAO,MAAM,aAAa,GAAI,KAAK,OAAO,KAAG,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAKzE,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,KAAK,OAAO,KAAG,GAAG,IAAI,MAKjD,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,CACxB,CAAC;AAErD,eAAO,MAAM,OAAO,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,OAAO,EACnC,CAAC;AAEvB,eAAO,MAAM,UAAU,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MACH,CAAC;AAEnD,eAAO,MAAM,OAAO,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MACzB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export const isString = (value) => typeof value === "string";
|
|
2
|
+
export const isNumber = (value) => typeof value === "number" && Number.isFinite(value);
|
|
3
|
+
export const isBoolean = (value) => typeof value === "boolean";
|
|
4
|
+
export const isNull = (value) => value === null;
|
|
5
|
+
export const notNull = (value) => value !== undefined && value !== null;
|
|
6
|
+
export const isUndefined = (value) => value === undefined;
|
|
7
|
+
export const isDefined = (value) => value !== undefined;
|
|
8
|
+
export const isObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
9
|
+
export const isPlainObject = (val) => {
|
|
10
|
+
if (!isObject(val))
|
|
11
|
+
return false;
|
|
12
|
+
const proto = Object.getPrototypeOf(val);
|
|
13
|
+
return proto === null || proto === Object.prototype;
|
|
14
|
+
};
|
|
15
|
+
export const isOddObject = (val) => {
|
|
16
|
+
if (!isObject(val))
|
|
17
|
+
return false;
|
|
18
|
+
const proto = Object.getPrototypeOf(val);
|
|
19
|
+
return proto !== null && proto !== Object.prototype;
|
|
20
|
+
};
|
|
21
|
+
export const isEmptyObject = (value) => isObject(value) && Object.keys(value).length === 0;
|
|
22
|
+
export const isArray = (value) => Array.isArray(value);
|
|
23
|
+
export const isNanValue = (value) => typeof value === "number" && Number.isNaN(value);
|
|
24
|
+
export const isRegex = (value) => value instanceof RegExp;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wysiwyv-core.d.ts","sourceRoot":"","sources":["../src/wysiwyv-core.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAIpD,eAAO,MAAM,WAAW,EAAE,cAWzB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { makeCore } from "./core";
|
|
2
|
+
export const makeWysiwyv = (config = {}) => {
|
|
3
|
+
const { plugins: configHooks = [], pluginSetups = {} } = config;
|
|
4
|
+
const hooks = [...configHooks];
|
|
5
|
+
const { evaluate } = makeCore(hooks, pluginSetups);
|
|
6
|
+
return {
|
|
7
|
+
validate: (expected, candidate) => {
|
|
8
|
+
return evaluate(expected, candidate, "");
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wysiwyv.d.ts","sourceRoot":"","sources":["../src/wysiwyv.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAKpD,eAAO,MAAM,WAAW,EAAE,cAKzB,CAAC"}
|
package/dist/wysiwyv.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { defaultHooks } from "./hooks";
|
|
2
|
+
import { makeWysiwyv as makeWysiwyvCore } from "./wysiwyv-core";
|
|
3
|
+
export const makeWysiwyv = (config = {}) => {
|
|
4
|
+
const { plugins: configHooks = [], pluginSetups = {} } = config;
|
|
5
|
+
const hooks = [...defaultHooks, ...configHooks];
|
|
6
|
+
return makeWysiwyvCore({ plugins: hooks, pluginSetups });
|
|
7
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var an=Object.freeze([]),no={get success(){return!0},get errors(){return an},fault(n){return l().fault(n)},include(n){return n}},l=(n=[])=>{let o=n.length===0?[]:[...n],r={get success(){return o.length===0},get errors(){return[...o]},fault(y){return o.push(y),r},include(y){if(!y.success)o.push(...y.errors);return r}};return r},oo=(n)=>l().fault(n),t={start:l,SUCCESS:no,fault:oo};var _=(n)=>typeof n==="string",p=(n)=>typeof n==="number"&&Number.isFinite(n),I=(n)=>typeof n==="boolean",Z=(n)=>n===null,a=(n)=>n!==void 0&&n!==null,nn=(n)=>n===void 0,b=(n)=>n!==void 0,V=(n)=>typeof n==="object"&&n!==null&&!Array.isArray(n),S=(n)=>{if(!V(n))return!1;let o=Object.getPrototypeOf(n);return o===null||o===Object.prototype},on=(n)=>{if(!V(n))return!1;let o=Object.getPrototypeOf(n);return o!==null&&o!==Object.prototype},rn=(n)=>V(n)&&Object.keys(n).length===0,M=(n)=>Array.isArray(n),tn=(n)=>typeof n==="number"&&Number.isNaN(n);function ro(n){return Object.prototype.toString.call(n).slice(8,-1)}var J=(n)=>{if(Z(n))return"null";if(_(n))return n;if(tn(n))return"NaN";if(n===1/0)return"Infinity";if(n===-1/0)return"-Infinity";if(n instanceof Date)return n.toISOString();if(n instanceof RegExp)return n.toString();if(n instanceof String)return n.toString();let o=on(n)?ro(n):"",r;try{r=JSON.stringify(n)??String(n)}catch{r=String(n)}return[o,r].filter((y)=>y).join(" ")};var N=(n,o,r)=>({message:n.replace("%s",J(o)),path:r}),yn=(n,o,r)=>N(`Unexpected element at '${n}': got '%s'`,o,r),Y=(n,o,r)=>N(`Missing element at '${n}': expected '${o}'`,void 0,r),X=(n,o,r)=>N(`Value: Expected '${n}', got '%s'`,o,r),mn=(n,o,r,y)=>N(`Expected value '${n}' for key '${r}', got '%s'`,o,y),W=(n,o,r)=>N(`Type: Expected '${n}', got value '%s'`,o,r),C=(n,o,r,y)=>N(`${n}: Expected '${o}', got '%s'`,r,y),U=(n,o)=>N(`Configuration Error: ${n}`,void 0,o),B=(n,o)=>N(`Aggregate Error: ${n}`,void 0,o);var fn="$and",to={handles:(n)=>[fn].includes(n),handlers:{[fn]:(n,o,{path:r,params:y,evaluate:i})=>{if(!Array.isArray(y))return t.fault(U("$and value should be an array of templates",r));if(y.length===0)return t.SUCCESS;let m=t.start();for(let R of y){let j=i(R,n,r);m.include(j)}if(m.success)return t.SUCCESS;return t.fault(B("$and",r)).include(m)}}},sn=to;var gn="$any",yo={handles:(n)=>[gn].includes(n),handlers:{[gn]:()=>{return t.SUCCESS}}},un=yo;var q="$array",Wn="$length",wn="$minlength",$n="$maxlength",bn="$each",mo={handles:(n)=>[q].includes(n),handlers:{[q]:(n,o,{path:r,params:y,evaluate:i})=>{if(!M(n))return t.fault(W("array",n,r));let m=t.start(),g=V(y)?y:{[bn]:y},{[Wn]:w,[wn]:R,[$n]:j,[bn]:L,...A}=g,D=b(w)||b(R)||b(j)||b(L);if(D&&Object.keys(A).length>0)m.fault(U(`Ignored unknown $array parameters: '${Object.keys(A)}'`,r));let Q=D?L:Object.keys(A).length>0?A:null;if(b(w)&&n.length!==w)m.fault(C(q+"."+Wn,w,n.length,r));if(b(R)&&p(R)&&n.length<R)m.fault(C(q+"."+wn,R,n.length,r));if(b(j)&&p(j)&&n.length>j)m.fault(C(q+"."+$n,j,n.length,r));if(a(Q))for(let[f,s]of n.entries()){let u=i(Q,s,`${r}[${f}]`);m.include(u)}return m}}},Rn=mo;var Pn="$bool",fo={handles:(n)=>[Pn].includes(n),handlers:{[Pn]:(n,o,{path:r})=>{if(!I(n))return t.fault(W("boolean",n,r));return t.SUCCESS}}},_n=fo;var pn="(?:\\d{4})",jn="(?:0[1-9]|1[0-2])",Vn="(?:0[1-9]|[12]\\d|3[01])",E="(?:[01]\\d|2[0-3])",O="(?:[0-5]\\d)",e="(?:[0-5]\\d)",Sn="(?:[,.]\\d+)",so="(?:\\.\\d+)",Hn=`(?:${pn}-${jn}-${Vn})`,io=`(?:${pn}${jn}${Vn})`,go=`(?:${E}:${O}(?::${e}(?:${Sn})?)?)`,uo=`(?:${E}${O}(?:${e}(?:${Sn})?)?)`,Wo=`(?:${E}:${O}(?::${e}(?:${so})?)?)`,wo=`(?:Z|[+-]${E}:?${O})`,$o=`(?:Z|[+-]${E}${O})`,bo=`(?:Z|[+-]${E}:${O}|-00:00)`,Ro=()=>{return new RegExp(`^${Hn}T${go}${wo}$`,"i")},Po=Ro(),_o=()=>{return new RegExp(`^${io}T${uo}${$o}$`,"i")},Uo=_o(),ko=()=>{return new RegExp(`^${Hn}[T ]${Wo}${bo}$`,"i")},Co=ko(),Un="$isodate",kn="$basicisodate",Cn="$strictisodate",xn=(n)=>{let o=new Date(n);return!Number.isNaN(o.getTime())},po=(n)=>{if(!_(n))return!1;if(!Po.test(n))return!1;return xn(n)},jo=(n)=>{if(!_(n))return!1;if(!Uo.test(n))return!1;return!0},Vo=(n)=>{if(!_(n))return!1;if(!Co.test(n))return!1;return xn(n)},So={handles:(n)=>[Un,kn,Cn].includes(n),handlers:{[Un]:(n,o,{path:r})=>{if(!po(n))return t.fault(W("ISO 8601 date",n,r));return t.SUCCESS},[kn]:(n,o,{path:r})=>{if(!jo(n))return t.fault(W("Basic ISO 8601 date",n,r));return t.SUCCESS},[Cn]:(n,o,{path:r})=>{if(!Vo(n))return t.fault(W("RFC 3339 date",n,r));return t.SUCCESS}}},Fn=So;var v=(n)=>`(?:${n})`,h="[a-zA-Z0-9_%+\\-]+",Nn=v(`\\.${h}`),Ho=v(`${h}${Nn}*`),xo=v(`${h}${Nn}+`),Fo=`${Ho}@${xo}`,Lo=new RegExp(`^${Fo}$`),Ln="$email",No={handles:(n)=>[Ln].includes(n),handlers:{[Ln]:(n,o,{path:r})=>{if(!_(n))return t.fault(W("string",n,r));if(!Lo.test(n))return t.fault(W("valid email address",n,r));return t.SUCCESS}}},An=No;var c="$int",Ao={handles:(n)=>[c].includes(n),handlers:{[c]:(n,o,{path:r,params:y})=>{if(!p(n)||!Number.isInteger(n))return t.fault(W("integer",n,r));let i=t.start(),{$min:m,$max:g}=V(y)?y:{};if(b(m)&&p(m)&&n<m)i.fault(C(c+".$min","≥"+m,n,r));if(b(g)&&p(g)&&n>g)i.fault(C(c+".$max","≤"+g,n,r));return i}}},Gn=Ao;var z="$number",Go={handles:(n)=>[z].includes(n),handlers:{[z]:(n,o,{path:r,params:y})=>{if(!p(n))return t.fault(W("number",n,r));let i=t.start(),{$min:m,$max:g,$gt:w,$lt:R}=V(y)?y:{};if(b(m)&&n<m)i.fault(C(z+".$min","≥"+m,n,r));if(b(g)&&n>g)i.fault(C(z+".$max","≤"+g,n,r));if(b(w)&&n<=w)i.fault(C(z+".$gt",">"+w,n,r));if(b(R)&&n>=R)i.fault(C(z+".$lt","<"+R,n,r));return i}}},En=Go;var On="$object",zn="$plainobject",Eo=(n,o,r,y)=>{let i=t.start();if(!S(n))i.fault(U("$object.$partial option should be an object",r));else for(let m in n){if(!(m in o)){i.fault(Y(m,n[m],`${r}.${m}`));continue}let g=n[m],w=o[m],R=y(g,w,`${r}.${m}`);i.include(R)}return i},Oo=(n,o,r,y)=>{let i=t.start();for(let m in o){let g=y(n,o[m],`${r}.${m}`);i.include(g)}return i},Mn=(n)=>(o,r,{path:y,params:i,evaluate:m})=>{if(n){if(!S(o))return t.fault(W("plainobject",o,y))}else if(!V(o))return t.fault(W("object",o,y));let g=t.start(),{$partial:w=void 0,$eachElement:R=void 0,...j}=V(i)?i:{};if(Object.keys(j).length>0)g.fault(U(`Unexpected $object parameters: ${Object.keys(j)}`,y));if(b(w)&&b(R))return g.fault(U("$object options can specify $partial or $eachElement but not both",y)),g;if(b(w))if(!S(o))g.fault(W("plainobject for $partial",o,y));else{let L=Eo(w,o,y,m);g.include(L)}if(b(R))if(!S(o))g.fault(W("plainobject for $eachElement",o,y));else{let L=Oo(R,o,y,m);g.include(L)}return g},zo={handles:(n)=>[On,zn].includes(n),handlers:{[On]:Mn(!1),[zn]:Mn(!0)}},Yn=zo;var qn="$or",Mo={handles:(n)=>[qn].includes(n),handlers:{[qn]:(n,o,{path:r,params:y,evaluate:i})=>{if(!Array.isArray(y))return t.fault(U("$or value should be an array of templates",r));if(y.length===0)return t.fault(U("$or must take one or more predicates",r));let m=t.start();for(let g of y){let w=i(g,n,r);if(w.success)return t.SUCCESS;m.include(w)}return t.fault(B("$or",r)).include(m)}}},Dn=Mo;var Qn="$string",Yo={handles:(n)=>[Qn].includes(n),handlers:{[Qn]:(n,o,{path:r})=>{if(!_(n))return t.fault(W("string",n,r));return t.SUCCESS}}},In=Yo;var K="[0-9a-f]",qo=`${K}{8}`,Do=`${K}{4}`,Zn=`${K}{3}`,Qo=`${K}{12}`,Io="[89ab]",Jn="0{8}-0{4}-0{4}-0{4}-0{12}",Xn="f{8}-f{4}-f{4}-f{4}-f{12}",H=(n)=>new RegExp(`^${n}$`,"i"),Zo=[0,1,2,3,4,5,6,7,8,"F",null],Jo=(n)=>Zo.includes(n),F=(n)=>`${qo}-${Do}-${n}${Zn}-${Io}${Zn}-${Qo}`,Xo=H(F(1)),Bo=H(F(2)),co=H(F(3)),Ko=H(F(4)),To=H(F(5)),lo=H(F(6)),eo=H(F(7)),vo=H(F(8)),ho=H(Jn),ao=H(Xn),nr=F("[1-8]"),or=H([nr,Jn,Xn].map((n)=>`(${n})`).join("|")),rr="$uuid",tr=(n,o)=>{switch(n){case 0:return ho.test(o);case 1:return Xo.test(o);case 2:return Bo.test(o);case 3:return co.test(o);case 4:return Ko.test(o);case 5:return To.test(o);case 6:return lo.test(o);case 7:return eo.test(o);case 8:return vo.test(o);case"F":return ao.test(o);default:return or.test(o)}},yr={handles:(n)=>[rr].includes(n),handlers:{$uuid:(n,o,{path:r,params:y})=>{let i=rn(y)?null:y;if(!Jo(i))return t.fault(U(`Unknown UUID version: '${i}'`,r));if(!_(n))return t.fault(W("string",n,r));if(!tr(i,n)){let m=p(i)||_(i)?` of version '${i}'`:"";return t.fault(W(`UUID${m}`,n,r))}return t.SUCCESS}}},Bn=yr;var cn="$val",mr={handles:(n)=>[cn].includes(n),handlers:{[cn]:(n,o,{path:r,params:y,setup:i,context:m})=>{if(m.matches===void 0)m.matches=i??{};if(!(y in m.matches))return m.matches[y]=n,t.SUCCESS;if(n!==m.matches[y])return t.fault(mn(m.matches[y],n,y,r));return t.SUCCESS}}},Kn=mr;var Tn=[sn,un,Rn,_n,Fn,An,Gn,En,Yn,Dn,In,Bn,Kn];var ln=(n)=>{if(_(n)){if(n.startsWith("$")&&!n.startsWith("$$"))return n}if(S(n)&&Object.keys(n).length===1){let o=Object.keys(n)[0];if(o.startsWith("$")&&!o.startsWith("$$"))return o}return null},en=(n,o)=>{if(S(n))return n[o];return null};var vn=(n,o)=>{let r=Object.freeze({...o}),y={},i={},m=new Map,g=(f,s,u)=>{let $=ln(f);if(!$)return w(f,s,u);let k=r[$]??{};if(y[$]===void 0)y[$]={};let G=y[$],x;if(m.has($))x=m.get($);else if(x=n.find((dn)=>dn.handles($))?.handlers[$],x)m.set($,x);if(!x)return w(f,s,u);let T=en(f,$);return x(s,f,{path:u,params:T,setup:k,context:G,shared:i,evaluate:g})},w=(f,s,u)=>{switch(!0){case _(f):return R(f,s,u);case p(f):return j(f,s,u);case I(f):return L(f,s,u);case Z(f):return A(s,u);case M(f):return D(f,s,u);case S(f):return Q(f,s,u);default:return t.fault(U(`Unsupported value type in expected object: '${J(f)}'`,u))}},R=(f,s,u)=>{if(typeof s!=="string")return t.fault(W("string",s,u));if(s!==f)return t.fault(X(f,s,u));return t.SUCCESS},j=(f,s,u)=>{if(typeof s!=="number")return t.fault(W("number",s,u));if(s!==f)return t.fault(X(f,s,u));return t.SUCCESS},L=(f,s,u)=>{if(typeof s!=="boolean")return t.fault(W("boolean",s,u));if(s!==f)return t.fault(X(f,s,u));return t.SUCCESS},A=(f,s)=>{if(f!==null)return t.fault(W("null",f,s));return t.SUCCESS},D=(f,s,u)=>{if(!M(s))return t.fault(W("array",s,u));let $=t.start();if(s.length!==f.length)$.fault(C("Array length",f.length,s.length,u));for(let k=0;k<f.length;k++){if(nn(s[k])){$.fault(Y(`index ${k}`,f[k],`${u}[${k}]`));continue}let G=g(f[k],s[k],`${u}[${k}]`);$.include(G)}return $},Q=(f,s,u)=>{if(!S(s))return t.fault(W("object",s,u));let $=t.start(),k=Object.keys(f),G=Object.keys(s),x=k.filter((P)=>!G.includes(P)),T=G.filter((P)=>!k.includes(P));x.forEach((P)=>{$.fault(Y(`${P}`,f[P],`${u}.${P}`))}),T.forEach((P)=>{$.fault(yn(P,s[P],`${u}.${P}`))});for(let P in f){if(x.includes(P))continue;let d=g(f[P],s[P],`${u}.${P}`);$.include(d)}return $};return{evaluate:g}};var hn=(n={})=>{let{plugins:o=[],pluginSetups:r={}}=n,y=[...o],{evaluate:i}=vn(y,r);return{validate:(m,g)=>{return i(m,g,"")}}};var Gt=(n={})=>{let{plugins:o=[],pluginSetups:r={}}=n,y=[...Tn,...o];return hn({plugins:y,pluginSetups:r})};export{Gt as makeWysiwyv};
|
package/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "wysiwyv",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"main": "./dist/wysiwyv.js",
|
|
5
|
+
"devDependencies": {
|
|
6
|
+
"@eslint/js": "^10.0.1",
|
|
7
|
+
"@types/bun": "latest",
|
|
8
|
+
"@types/jest": "^30.0.0",
|
|
9
|
+
"eslint": "^10.3.0",
|
|
10
|
+
"globals": "^17.6.0",
|
|
11
|
+
"jest": "^30.4.2",
|
|
12
|
+
"jiti": "^2.7.0",
|
|
13
|
+
"typescript-eslint": "^8.59.2"
|
|
14
|
+
},
|
|
15
|
+
"peerDependencies": {
|
|
16
|
+
"typescript": "^5"
|
|
17
|
+
},
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"types": "./dist/wysiwyv.d.ts",
|
|
21
|
+
"import": "./dist/wysiwyv.js"
|
|
22
|
+
},
|
|
23
|
+
"./core": {
|
|
24
|
+
"types": "./dist/wysiwyv-core.d.ts",
|
|
25
|
+
"import": "./dist/wysiwyv-core.js"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"dist",
|
|
30
|
+
"LICENSE",
|
|
31
|
+
"README.md"
|
|
32
|
+
],
|
|
33
|
+
"jsdelivr": "./dist/wysiwyv.min.js",
|
|
34
|
+
"scripts": {
|
|
35
|
+
"deps": "bun install",
|
|
36
|
+
"lint": "eslint .",
|
|
37
|
+
"lint:fix": "eslint . --fix",
|
|
38
|
+
"check": "bun x tsc --noEmit",
|
|
39
|
+
"test": "bun test --reporter=dot",
|
|
40
|
+
"clean": "rm -rf ./dist",
|
|
41
|
+
"build": "tsc -p tsconfig.build.json",
|
|
42
|
+
"build-example": "bun build ./example.ts --minify --outdir ./dist && gzip -kf dist/example.js",
|
|
43
|
+
"build-full": "bun build ./src/wysiwyv.ts --minify --outfile ./dist/wysiwyv.min.js",
|
|
44
|
+
"build-core": "bun build ./src/wysiwyv-core.ts --minify --outfile ./dist/wysiwyv-core.min.js",
|
|
45
|
+
"check-output": "ls -l dist | tail -n +2 | awk '{printf \"%-18s %5s B\\n\", $9, $5}'",
|
|
46
|
+
"all": "bun run --sequential deps clean lint check test build build-full check-output && bun publish --dry-run"
|
|
47
|
+
},
|
|
48
|
+
"sideEffects": false,
|
|
49
|
+
"type": "module",
|
|
50
|
+
"types": "./dist/wysiwyv.d.ts",
|
|
51
|
+
"unpkg": "./dist/wysiwyv.min.js"
|
|
52
|
+
}
|