@curly-message/parser 1.0.0-next.0 → 1.0.0-next.2
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/README.md +17 -4
- package/dist/index.d.ts +4 -3
- package/dist/index.js +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -72,6 +72,15 @@ host's own numeric conversion makes of them: `{{v:number}}` over `{ v: '' }`
|
|
|
72
72
|
takes the fallback chain rather than formatting a zero, and `{{v:date}}` over
|
|
73
73
|
the same value takes it rather than formatting the epoch.
|
|
74
74
|
|
|
75
|
+
## Installation
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
npm install @curly-message/parser@next
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
The package is a prerelease, published under the `next` dist-tag until a
|
|
82
|
+
stable version reaches `latest`.
|
|
83
|
+
|
|
75
84
|
## Usage
|
|
76
85
|
|
|
77
86
|
```js
|
|
@@ -119,8 +128,9 @@ did, so `{ eq: 'text' }` costs a caller the name it wrote and nothing further.
|
|
|
119
128
|
The types say as much, but a JavaScript caller reaches the table regardless.
|
|
120
129
|
|
|
121
130
|
`onReport` is where diagnostics go. The parser writes to no channel of its own,
|
|
122
|
-
so unset it reports nowhere; resolution still fails soft, it
|
|
123
|
-
silently.
|
|
131
|
+
so unset, or set to `null`, it reports nowhere; resolution still fails soft, it
|
|
132
|
+
just does so silently. `null` is for a host that states the silence rather than
|
|
133
|
+
omits it. It is called with a `Report` describing what the parser could not do
|
|
124
134
|
— `code`, the `origin` that code declares, an English `message` carrying
|
|
125
135
|
nothing from the payload, the `limit` reached where the report is about one,
|
|
126
136
|
the message's `key` where one was passed, and `text`, the source of the
|
|
@@ -387,7 +397,7 @@ wants as an ordinary string value, with every backslash doubled.
|
|
|
387
397
|
|
|
388
398
|
## Status
|
|
389
399
|
|
|
390
|
-
**
|
|
400
|
+
**Prerelease under the `next` dist-tag, and the public surface is unstable.**
|
|
391
401
|
|
|
392
402
|
Nothing here references a host framework: `resolve` takes the format's own
|
|
393
403
|
inputs, and an adapter that presents this parser to a host library belongs in
|
|
@@ -400,7 +410,10 @@ message resolves to rather than merely what it can do — without Intl, `number`
|
|
|
400
410
|
`date`, `ago` and `currency` are modifier names nobody registered.
|
|
401
411
|
|
|
402
412
|
The specification is normative — where this implementation and the
|
|
403
|
-
specification disagree, this implementation is wrong.
|
|
413
|
+
specification disagree, this implementation is wrong. The specification's
|
|
414
|
+
conformance set (`@curly-message/conformance`) holds it to that: the adapter of
|
|
415
|
+
section 14.3 lives in `tests/conformance/adapter.ts`, and `npm test` runs
|
|
416
|
+
every case the set ships against it, at every level.
|
|
404
417
|
|
|
405
418
|
## Development
|
|
406
419
|
|
package/dist/index.d.ts
CHANGED
|
@@ -229,10 +229,11 @@ declare namespace Parser {
|
|
|
229
229
|
*/
|
|
230
230
|
modifierDefaults?: Modifier.Props<Given<Props>>;
|
|
231
231
|
/**
|
|
232
|
-
* Where diagnostics go. Unset
|
|
233
|
-
* still fails soft, it just does so silently.
|
|
232
|
+
* Where diagnostics go. Unset or `null`, the parser reports nowhere —
|
|
233
|
+
* resolution still fails soft, it just does so silently. `null` is for a
|
|
234
|
+
* host that states the silence rather than omits it.
|
|
234
235
|
*/
|
|
235
|
-
onReport?: OnReport;
|
|
236
|
+
onReport?: OnReport | null;
|
|
236
237
|
};
|
|
237
238
|
type PayloadDefault = {
|
|
238
239
|
[key in 'default']?: any;
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
var Ae=Object.defineProperty;var Oe=(e,n)=>{for(var t in n)Ae(e,t,{get:n[t],enumerable:!0})};var U={};Oe(U,{ago:()=>Ve,currency:()=>$e,date:()=>Se,eq:()=>te,gt:()=>he,gte:()=>De,lt:()=>ge,lte:()=>Ne,ne:()=>ke,number:()=>Le});var le=[`
|
|
2
|
-
`,"\r","\u2028","\u2029"],N=[{key:"second",multiplier:1e3},{key:"minute",multiplier:60},{key:"hour",multiplier:60},{key:"day",multiplier:24},{key:"week",multiplier:7},{key:"month",multiplier:4.333333333333333},{key:"year",multiplier:12}],Z=e=>`\\u${e.charCodeAt(0).toString(16).padStart(4,"0")}`,G=e=>!/[^\t\n\v\f\r\u0020\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]/.test(e),d=(e,n,t)=>{try{return n!==void 0&&e&&Object.prototype.propertyIsEnumerable.call(e,n)?e[n]:void 0}catch{t?.();return}},k=(e,n)=>{if(!e)return[];try{return Object.keys(e)}catch{return n?.(),[]}},M=(e,n,t)=>{let o=Object.create(null);return k(e,t).forEach(r=>{o[r]=d(e,r,t)}),k(n,t).forEach(r=>{let i=d(n,r,t);i!==void 0&&(o[r]=i)}),o},ee=(e,n)=>{let t=Object.create(null);return k(e,n).forEach(o=>{let r=d(e,o,n);typeof r=="function"&&(t[o]=r)}),t},l=class extends Error{constructor(t){super(t);this.code=t}code},pe=e=>{try{return e instanceof l?e.code:void 0}catch{return}},P=e=>{if(typeof e=="string"&&G(e))return;let n=+e;return Number.isFinite(n)?n:void 0},me=e=>{let n=P(e);if(n!==void 0)return n;let t=Date.parse(e);return Number.isNaN(t)?void 0:t};var W=(e,n)=>e?e.value:n.defaultValue,te=e=>{let{value:n,options:t=[]}=e,o=`${n}`.toLowerCase();return W(t.find(({key:r})=>`${r}`.toLowerCase()===o),e)},ke=e=>{let{value:n,options:t=[]}=e,o=`${n}`.toLowerCase();return W(t.find(({key:r})=>`${r}`.toLowerCase()!==o),e)},ye=(e,n)=>e.filter(({key:t})=>!Number.isNaN(+t)).sort((t,o)=>n(+t.key,+o.key)),ge=e=>{let{value:n,options:t=[]}=e,o=+n;return W(ye(t,(r,i)=>r-i).find(({key:r})=>o<+r),e)},he=e=>{let{value:n,options:t=[]}=e,o=+n;return W(ye(t,(r,i)=>i-r).find(({key:r})=>o>+r),e)},Ne=e=>te({value:e.value,props:e.props,options:e.options,get defaultValue(){return ge(e)}}),De=e=>te({value:e.value,props:e.props,options:e.options,get defaultValue(){return he(e)}}),D=e=>{if(e===void 0)throw new l("failed-modifier");return e},Le=e=>{let{value:n,props:t,locale:o=""}=e;if(!o)throw new l("missing-locale");let r=D(P(n)),i=Number(d(t,"minimumFractionDigits"))||0,s=K(d(t,"maximumFractionDigits"),Math.max(i,2));return new Intl.NumberFormat(o,M(t,{maximumFractionDigits:s})).format(r)},Se=e=>{let{value:n,props:t,locale:o=""}=e;if(!o)throw new l("missing-locale");let r=D(me(n));return new Intl.DateTimeFormat(o,M(t,void 0)).format(r)},K=(e,n)=>e===void 0?n:e,ne=(e="",n="")=>new RegExp(`^${e}s?$`).test(n),je=e=>e==="auto"||N.some(({key:n})=>ne(n,e)),Ce=e=>N.indexOf(N.find(({key:n})=>ne(n,e))),_e=e=>Math.sign(e)*Math.round(Math.abs(e)),Fe=(e,n)=>N.reduce(([t,o],{key:r,multiplier:i},s)=>{if(ne(o,n))return[t,o];if(!o||s===Ce(o)+1){let a=_e(t/i);if(!o||Math.abs(a)>=1||n!=="auto")return[a,r]}return[t,o]},[e,""]),Ve=e=>{let{value:n,locale:t="",props:o}=e;if(!t)throw new l("missing-locale");let r=D(P(n)),i=K(d(o,"numeric"),"auto"),s=K(d(o,"format"),"auto");if(!je(s))throw new l("failed-modifier");let a=Fe(r,s);return new Intl.RelativeTimeFormat(t,M(o,{numeric:i})).format(...a)},$e=e=>{let{value:n,locale:t="",props:o}=e;if(!t)throw new l("missing-locale");let r=D(P(n)),i=D(P(r*K(d(o,"ratio"),1)));return new Intl.NumberFormat(t,M(o,{style:"currency"})).format(i)};var Re=`[${le.map(Z).join("")}]`,be=new RegExp(Re),ve=new RegExp(Re,"g"),ze=(e,n)=>{for(let t=n+2;t<e.length;t+=1){let o=e[t];if(o==="\\"){if(be.test(e.charAt(t+1)))return;t+=1;continue}if(be.test(o)||o==="{"&&e.charAt(t+1)==="{")return;if(o==="}"&&e.charAt(t+1)==="}")return t+2}},re=(e,n)=>{for(let t=n;t<e.length;t+=1){if(e[t]==="\\"){t+=1;continue}if(e[t]!=="{"||e.charAt(t+1)!=="{")continue;let o=ze(e,t);if(o!==void 0)return[t,o]}},Ge=e=>typeof e=="string"&&!!re(e,0),Ke=/[:;{}\\]/,q=e=>typeof e=="string"?e.replace(/\\([\s\S])/g,(n,t)=>Ke.test(t)||G(t)?t:n):e,L=e=>{let n=-1,t=0;for(let o=0;o<e.length;o+=1){let r=e[o]==="\\"&&o+1<e.length;!r&&G(e[o])||(n<0&&(n=o),o+=r?1:0,t=o+1)}return n<0?"":e.slice(n,t)},oe=(e,n)=>{let t=[],o=0;for(let r=0;r<e.length;r+=1)e[r]==="\\"?r+=1:e[r]===n&&(t.push(e.slice(o,r)),o=r+1);return[...t,e.slice(o)]},Ee=e=>{if(!e||typeof e!="object")return!1;try{let n=Object.getPrototypeOf(e);return n===Object.prototype||n===null}catch{return!1}},We=e=>{let n=I;try{let t=JSON.stringify(e,(o,r)=>{if(n-=1,n<0)throw new RangeError("The value visits more nodes than a resolvable output can hold.");return r});return typeof t=="string"?t:void 0}catch{return}},Me=e=>{try{if(!Ee(e)&&!Array.isArray(e))return String(e)}catch{return}return We(e)},B=(e,n)=>e===void 0?void 0:e!==null&&(typeof e=="object"||typeof e=="function"||typeof e=="bigint")?(n.has(e)||n.set(e,Me(e)),n.get(e)):Me(e),ie=(e,n,t)=>{let o=B(e,t);return e!==void 0&&o===void 0&&n(),o},Ue=["value","default","props"],qe=(e,n,t)=>{if(!Ee(e))return!1;if(!n.has(e)){let r=!1,i=k(e,()=>{r=!0});n.set(e,r?void 0:!!i.length&&i.every(s=>Ue.includes(s)))}let o=n.get(e);return o===void 0&&t?.(),!!o},we=e=>!!e&&(typeof e=="object"||typeof e=="function"),Xe=(e,n,t)=>e.reduce((o,r)=>{let i=we(r)?d(r,n,t):void 0;return we(i)?M(o,i,t):o},Object.create(null)),Be=["eq","ne","lt","gt","lte","gte"],He=(e,n)=>Be.includes(e)&&n[e]===U[e],Je=({value:e,props:n,payload:t,parserOptions:o,modifiers:r,modifierDefaults:i,onReport:s,locale:a,key:c,conversions:w,wrappers:R})=>{let f=Object.keys(r),E=m=>{let[A,...S]=oe(m.slice(2,-2),";"),[j,...C]=oe(A,":"),de=L(j),_=de?q(de):void 0,y=()=>h("unserializable-value",m,c,s),H=d(t,_,y),F=_!=="default"&&qe(H,R,y)?H:void 0,Te=F?d(F,"value",y):H,V=[],J;S.forEach(g=>{let[b,...ce]=oe(g,":"),z=q(L(b)),fe=ce.length?L(ce.join(":")):L(b);z&&(J===void 0&&z==="default"&&(J=fe),z!=="default"&&V.push({key:z,value:fe}))});let Y=g=>ie(g,y,w),$=Y(Te),ue,Pe=_==="default"?()=>$:()=>Y(d(t,"default",y)),O=()=>(ue??=[()=>Y(d(F,"default",y)),Pe].reduce((g,b)=>g??b(),void 0)??J??"",ue),v=q(L(C.join(":"))),Q=!!v;if(Q&&!f.includes(v))return h("unknown-modifier",m,c,s),O();if(_!==void 0&&!V.length&&He(v,r)&&h("missing-options",m,c,s),$===void 0)return O();if(!Q&&!V.length)return $;let ae=Q?v:"eq",Ie=r[ae];try{let g=Xe([i,n,d(F,"props",y)],ae,y);return ie(Ie({value:$,options:V,props:g,get defaultValue(){return O()},locale:a,parserOptions:o}),y,w)??O()}catch(g){let b=pe(g)??"failed-modifier";return h(b,m,c,s),b==="missing-locale"?"":O()}},u=`${e}`,x=[],T=0,p=0;for(let m=re(u,p);m;m=re(u,p)){let[A,S]=m;if(A+T>I)return;let j=u.slice(A,S),C=E(j);if(x.push(u.slice(p,A),C),T+=C.length-j.length,p=S,p+T>I)return}return u.length+T>I?void 0:[...x,u.slice(p)].join("")},se=10,xe=ee(U),I=1e5,X=120,Ye=e=>e.slice(0,(e.codePointAt(X-1)??0)>65535?X-1:X),Qe=e=>JSON.stringify(e.length>X?`${Ye(e)}...`:e).slice(1,-1).replace(ve,Z),Ze={"unknown-modifier":"A placeholder named a modifier this parser does not know.","failed-modifier":"A modifier could not produce a result, so the placeholder took its fallback chain.","missing-options":"A comparison was given no options to select from, so the placeholder took its fallback chain.","unserializable-value":"A value could not become text, so resolution read it as missing.","missing-locale":"A formatting modifier was given no locale, so the placeholder resolved to the empty string.","pass-limit":`Interpolation stopped after ${se} passes. A payload value probably references its own placeholder.`,"output-limit":`Interpolation stopped before exceeding ${I} characters. A payload value probably multiplies its own placeholder.`},et={"unknown-modifier":void 0,"failed-modifier":void 0,"missing-options":void 0,"unserializable-value":void 0,"missing-locale":void 0,"pass-limit":se,"output-limit":I},tt={"unknown-modifier":"message","failed-modifier":"payload","missing-options":"message","unserializable-value":"payload","missing-locale":"payload","pass-limit":"limit","output-limit":"limit"},h=(e,n,t,o)=>{if(o)try{o({code:e,origin:tt[e],message:Ze[e],key:t,limit:et[e],text:Qe(n)})}catch{}},nt=({value:e,props:n,payload:t,parserOptions:o,modifiers:r,modifierDefaults:i,onReport:s,locale:a,key:c,conversions:w,wrappers:R})=>{let f=e;for(let E=0;Ge(f);E+=1){if(E===se){h("pass-limit",f,c,s);break}let u=Je({value:f,payload:t,props:n,parserOptions:o,modifiers:r,modifierDefaults:i,onReport:s,locale:a,key:c,conversions:w,wrappers:R});if(u===void 0){h("output-limit",f,c,s);break}f=u}return B(q(f),w)??""},dt=e=>({resolve:(n,t)=>{let o=d(e,"onReport"),r=typeof n=="string"?n:"",i=d(t,"key",()=>h("unserializable-value",r,void 0,o)),s=()=>h("unserializable-value",r,i,o),a=d(t,"payload",s),c=d(t,"props",s),w=d(t,"locale",s),R=d(e,"customModifiers",s),f=d(e,"modifierDefaults",s),E=R===void 0?xe:M(xe,ee(R,s)),u=()=>h("unserializable-value","",i,o),x=new Map,T=new Map,p=B(n,x)??ie(d(a,"default",u),u,x);return p===void 0?B(i,x)??"":nt({value:p,payload:a,props:c,parserOptions:e,modifiers:E,modifierDefaults:f,onReport:o,locale:w,key:i,conversions:x,wrappers:T})}});export{dt as createParser};
|
|
2
|
+
`,"\r","\u2028","\u2029"],N=[{key:"second",multiplier:1e3},{key:"minute",multiplier:60},{key:"hour",multiplier:60},{key:"day",multiplier:24},{key:"week",multiplier:7},{key:"month",multiplier:4.333333333333333},{key:"year",multiplier:12}],Z=e=>`\\u${e.charCodeAt(0).toString(16).padStart(4,"0")}`,G=e=>!/[^\t\n\v\f\r\u0020\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]/.test(e),d=(e,n,t)=>{try{return n!==void 0&&e&&Object.prototype.propertyIsEnumerable.call(e,n)?e[n]:void 0}catch{t?.();return}},k=(e,n)=>{if(!e)return[];try{return Object.keys(e)}catch{return n?.(),[]}},M=(e,n,t)=>{let o=Object.create(null);return k(e,t).forEach(r=>{o[r]=d(e,r,t)}),k(n,t).forEach(r=>{let i=d(n,r,t);i!==void 0&&(o[r]=i)}),o},ee=(e,n)=>{let t=Object.create(null);return k(e,n).forEach(o=>{let r=d(e,o,n);typeof r=="function"&&(t[o]=r)}),t},l=class extends Error{constructor(t){super(t);this.code=t}code},pe=e=>{try{return e instanceof l?e.code:void 0}catch{return}},P=e=>{if(typeof e=="string"&&G(e))return;let n=+e;return Number.isFinite(n)?n:void 0},me=e=>{let n=P(e);if(n!==void 0)return n;let t=Date.parse(e);return Number.isNaN(t)?void 0:t};var W=(e,n)=>e?e.value:n.defaultValue,te=e=>{let{value:n,options:t=[]}=e,o=`${n}`.toLowerCase();return W(t.find(({key:r})=>`${r}`.toLowerCase()===o),e)},ke=e=>{let{value:n,options:t=[]}=e,o=`${n}`.toLowerCase();return W(t.find(({key:r})=>`${r}`.toLowerCase()!==o),e)},ye=(e,n)=>e.filter(({key:t})=>!Number.isNaN(+t)).sort((t,o)=>n(+t.key,+o.key)),ge=e=>{let{value:n,options:t=[]}=e,o=+n;return W(ye(t,(r,i)=>r-i).find(({key:r})=>o<+r),e)},he=e=>{let{value:n,options:t=[]}=e,o=+n;return W(ye(t,(r,i)=>i-r).find(({key:r})=>o>+r),e)},Ne=e=>te({value:e.value,props:e.props,options:e.options,get defaultValue(){return ge(e)}}),De=e=>te({value:e.value,props:e.props,options:e.options,get defaultValue(){return he(e)}}),D=e=>{if(e===void 0)throw new l("failed-modifier");return e},Le=e=>{let{value:n,props:t,locale:o=""}=e;if(!o)throw new l("missing-locale");let r=D(P(n)),i=Number(d(t,"minimumFractionDigits"))||0,s=K(d(t,"maximumFractionDigits"),Math.max(i,2));return new Intl.NumberFormat(o,M(t,{maximumFractionDigits:s})).format(r)},Se=e=>{let{value:n,props:t,locale:o=""}=e;if(!o)throw new l("missing-locale");let r=D(me(n));return new Intl.DateTimeFormat(o,M(t,void 0)).format(r)},K=(e,n)=>e===void 0?n:e,ne=(e="",n="")=>new RegExp(`^${e}s?$`).test(n),je=e=>e==="auto"||N.some(({key:n})=>ne(n,e)),Ce=e=>N.indexOf(N.find(({key:n})=>ne(n,e))),_e=e=>Math.sign(e)*Math.round(Math.abs(e)),Fe=(e,n)=>N.reduce(([t,o],{key:r,multiplier:i},s)=>{if(ne(o,n))return[t,o];if(!o||s===Ce(o)+1){let a=_e(t/i);if(!o||Math.abs(a)>=1||n!=="auto")return[a,r]}return[t,o]},[e,""]),Ve=e=>{let{value:n,locale:t="",props:o}=e;if(!t)throw new l("missing-locale");let r=D(P(n)),i=K(d(o,"numeric"),"auto"),s=K(d(o,"format"),"auto");if(!je(s))throw new l("failed-modifier");let a=Fe(r,s);return new Intl.RelativeTimeFormat(t,M(o,{numeric:i})).format(...a)},$e=e=>{let{value:n,locale:t="",props:o}=e;if(!t)throw new l("missing-locale");let r=D(P(n)),i=D(P(r*K(d(o,"ratio"),1)));return new Intl.NumberFormat(t,M(o,{style:"currency"})).format(i)};var Re=`[${le.map(Z).join("")}]`,be=new RegExp(Re),ve=new RegExp(Re,"g"),ze=(e,n)=>{for(let t=n+2;t<e.length;t+=1){let o=e[t];if(o==="\\"){if(be.test(e.charAt(t+1)))return;t+=1;continue}if(be.test(o)||o==="{"&&e.charAt(t+1)==="{")return;if(o==="}"&&e.charAt(t+1)==="}")return t+2}},re=(e,n)=>{for(let t=n;t<e.length;t+=1){if(e[t]==="\\"){t+=1;continue}if(e[t]!=="{"||e.charAt(t+1)!=="{")continue;let o=ze(e,t);if(o!==void 0)return[t,o]}},Ge=e=>typeof e=="string"&&!!re(e,0),Ke=/[:;{}\\]/,q=e=>typeof e=="string"?e.replace(/\\([\s\S])/g,(n,t)=>Ke.test(t)||G(t)?t:n):e,L=e=>{let n=-1,t=0;for(let o=0;o<e.length;o+=1){let r=e[o]==="\\"&&o+1<e.length;!r&&G(e[o])||(n<0&&(n=o),o+=r?1:0,t=o+1)}return n<0?"":e.slice(n,t)},oe=(e,n)=>{let t=[],o=0;for(let r=0;r<e.length;r+=1)e[r]==="\\"?r+=1:e[r]===n&&(t.push(e.slice(o,r)),o=r+1);return[...t,e.slice(o)]},Ee=e=>{if(!e||typeof e!="object")return!1;try{let n=Object.getPrototypeOf(e);return n===Object.prototype||n===null}catch{return!1}},We=e=>{let n=I;try{let t=JSON.stringify(e,(o,r)=>{if(n-=1,n<0)throw new RangeError("The value visits more nodes than a resolvable output can hold.");return r});return typeof t=="string"?t:void 0}catch{return}},Me=e=>{try{if(!Ee(e)&&!Array.isArray(e))return String(e)}catch{return}return We(e)},B=(e,n)=>e===void 0?void 0:e!==null&&(typeof e=="object"||typeof e=="function"||typeof e=="bigint")?(n.has(e)||n.set(e,Me(e)),n.get(e)):Me(e),ie=(e,n,t)=>{let o=B(e,t);return e!==void 0&&o===void 0&&n(),o},Ue=["value","default","props"],qe=(e,n,t)=>{if(!Ee(e))return!1;if(!n.has(e)){let r=!1,i=k(e,()=>{r=!0});n.set(e,r?void 0:!!i.length&&i.every(s=>Ue.includes(s)))}let o=n.get(e);return o===void 0&&t?.(),!!o},we=e=>!!e&&(typeof e=="object"||typeof e=="function"),Xe=(e,n,t)=>e.reduce((o,r)=>{let i=we(r)?d(r,n,t):void 0;return we(i)?M(o,i,t):o},Object.create(null)),Be=["eq","ne","lt","gt","lte","gte"],He=(e,n)=>Be.includes(e)&&n[e]===U[e],Je=({value:e,props:n,payload:t,parserOptions:o,modifiers:r,modifierDefaults:i,onReport:s,locale:a,key:c,conversions:w,wrappers:R})=>{let f=Object.keys(r),E=m=>{let[A,...S]=oe(m.slice(2,-2),";"),[j,...C]=oe(A,":"),de=L(j),_=de?q(de):void 0,y=()=>h("unserializable-value",m,c,s),H=d(t,_,y),F=_!=="default"&&qe(H,R,y)?H:void 0,Te=F?d(F,"value",y):H,V=[],J;S.forEach(g=>{let[b,...ce]=oe(g,":"),z=q(L(b)),fe=ce.length?L(ce.join(":")):L(b);z&&(J===void 0&&z==="default"&&(J=fe),z!=="default"&&V.push({key:z,value:fe}))});let Y=g=>ie(g,y,w),$=Y(Te),ue,Pe=_==="default"?()=>$:()=>Y(d(t,"default",y)),O=()=>(ue??=[()=>Y(d(F,"default",y)),Pe].reduce((g,b)=>g??b(),void 0)??J??"",ue),v=q(L(C.join(":"))),Q=!!v;if(Q&&!f.includes(v))return h("unknown-modifier",m,c,s),O();if(_!==void 0&&!V.length&&He(v,r)&&h("missing-options",m,c,s),$===void 0)return O();if(!Q&&!V.length)return $;let ae=Q?v:"eq",Ie=r[ae];try{let g=Xe([i,n,d(F,"props",y)],ae,y);return ie(Ie({value:$,options:V,props:g,get defaultValue(){return O()},locale:a,parserOptions:o}),y,w)??O()}catch(g){let b=pe(g)??"failed-modifier";return h(b,m,c,s),b==="missing-locale"?"":O()}},u=`${e}`,x=[],T=0,p=0;for(let m=re(u,p);m;m=re(u,p)){let[A,S]=m;if(A+T>I)return;let j=u.slice(A,S),C=E(j);if(x.push(u.slice(p,A),C),T+=C.length-j.length,p=S,p+T>I)return}return u.length+T>I?void 0:[...x,u.slice(p)].join("")},se=10,xe=ee(U),I=1e5,X=120,Ye=e=>e.slice(0,(e.codePointAt(X-1)??0)>65535?X-1:X),Qe=e=>JSON.stringify(e.length>X?`${Ye(e)}...`:e).slice(1,-1).replace(ve,Z),Ze={"unknown-modifier":"A placeholder named a modifier this parser does not know.","failed-modifier":"A modifier could not produce a result, so the placeholder took its fallback chain.","missing-options":"A comparison was given no options to select from, so the placeholder took its fallback chain.","unserializable-value":"A value could not become text, so resolution read it as missing.","missing-locale":"A formatting modifier was given no locale, so the placeholder resolved to the empty string.","pass-limit":`Interpolation stopped after ${se} passes. A payload value probably references its own placeholder.`,"output-limit":`Interpolation stopped before exceeding ${I} characters. A payload value probably multiplies its own placeholder.`},et={"unknown-modifier":void 0,"failed-modifier":void 0,"missing-options":void 0,"unserializable-value":void 0,"missing-locale":void 0,"pass-limit":se,"output-limit":I},tt={"unknown-modifier":"message","failed-modifier":"payload","missing-options":"message","unserializable-value":"payload","missing-locale":"payload","pass-limit":"limit","output-limit":"limit"},h=(e,n,t,o)=>{if(o)try{o({code:e,origin:tt[e],message:Ze[e],key:t,limit:et[e],text:Qe(n)})}catch{}},nt=({value:e,props:n,payload:t,parserOptions:o,modifiers:r,modifierDefaults:i,onReport:s,locale:a,key:c,conversions:w,wrappers:R})=>{let f=e;for(let E=0;Ge(f);E+=1){if(E===se){h("pass-limit",f,c,s);break}let u=Je({value:f,payload:t,props:n,parserOptions:o,modifiers:r,modifierDefaults:i,onReport:s,locale:a,key:c,conversions:w,wrappers:R});if(u===void 0){h("output-limit",f,c,s);break}f=u}return B(q(f),w)??""},dt=e=>({resolve:(n,t)=>{let o=d(e,"onReport")??void 0,r=typeof n=="string"?n:"",i=d(t,"key",()=>h("unserializable-value",r,void 0,o)),s=()=>h("unserializable-value",r,i,o),a=d(t,"payload",s),c=d(t,"props",s),w=d(t,"locale",s),R=d(e,"customModifiers",s),f=d(e,"modifierDefaults",s),E=R===void 0?xe:M(xe,ee(R,s)),u=()=>h("unserializable-value","",i,o),x=new Map,T=new Map,p=B(n,x)??ie(d(a,"default",u),u,x);return p===void 0?B(i,x)??"":nt({value:p,payload:a,props:c,parserOptions:e,modifiers:E,modifierDefaults:f,onReport:o,locale:w,key:i,conversions:x,wrappers:T})}});export{dt as createParser};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@curly-message/parser",
|
|
3
|
-
"version": "1.0.0-next.
|
|
3
|
+
"version": "1.0.0-next.2",
|
|
4
4
|
"description": "JavaScript implementation of the Curly Message Format.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -48,6 +48,7 @@
|
|
|
48
48
|
},
|
|
49
49
|
"homepage": "https://github.com/curly-message/parsers/tree/main/js#readme",
|
|
50
50
|
"devDependencies": {
|
|
51
|
+
"@curly-message/conformance": "^1.0.0-next.1",
|
|
51
52
|
"@eslint/js": "^10.0.1",
|
|
52
53
|
"@stylistic/eslint-plugin": "^5.10.0",
|
|
53
54
|
"eslint": "^10.8.1",
|