@cratis/screenplay-language 4.118.0 → 4.120.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.
@@ -1,4 +1,4 @@
1
- import{$ as Ot,$a as co,A as G,Aa as Ne,B as re,Ba as on,C as Oe,Ca as rn,D as wt,Da as an,E as Me,Ea as sn,F as Yn,Fa as cn,G as Kn,Ga as ln,H as Qn,Ha as ze,I as Jn,Ia as un,Ja as N,Ka as L,L as $t,La as Xn,M as xt,Ma as eo,N as kt,Na as to,O as St,Oa as no,P as Ct,Pa as H,Q as Tt,Qa as $e,R as At,Ra as V,S as Dt,Sa as oo,T as Pt,Ta as _,U as It,Ua as _e,V as Lt,Va as ro,W as Rt,Wa as Fe,X as Et,Xa as io,Y as qt,Ya as ao,Z as ye,Za as Be,_ as be,_a as so,a as B,aa as ie,ab as lo,b as ht,ba as ve,bb as uo,c as he,ca as we,cb as mo,d as Re,da as Mt,db as He,e as le,ea as jt,f as Un,fa as Nt,g as Wn,ga as zt,h as Ee,ha as _t,i as ee,ia as ae,j as Gn,ja as Ft,k as Vn,ka as Bt,l as gt,la as Ht,m as W,ma as Ut,n as qe,na as Wt,o as D,oa as Gt,p as ge,pa as Vt,q as te,qa as Zt,r as ne,ra as Yt,s as yt,sa as Kt,t as bt,ta as Qt,u as vt,ua as je,v as T,va as Jt,w as $,wa as Xt,x as Zn,xa as en,y as I,ya as tn,z as M,za as nn}from"./chunk-T4MD6O7Y.js";import{a as d}from"./chunk-AYDF3IFZ.js";var pn=new Set(["operation","system","eventsource","purpose"]),Ue={csharp:"csharp",typescript:"typescript",react:"typescript",html:"html",sql:"sql"};function mn(t){return`subLanguage_${t}`}d(mn,"subLanguageState");function po(t){let n=[...he.filter(e=>!pn.has(e)),...t.map(e=>e.keyword)];return[new RegExp(`^\\s*(?:${n.join("|")})\\b`),{token:"@rematch",next:"@pop"}]}d(po,"subLanguageExitRule");var fo=[[/\/\/.*$/,"comment"],[/\$(?:context|eventContext|eventSourceId|causedBy|refusal)(?:\.\w+)*/,"variable.predefined"],[/\$(?:env|secrets|strings)\.[\w.]+/,"variable.predefined"],[/\$\.[\w.]*/,"variable.predefined"],[/"(?:[^"\\]|\\.)*"/,"string"],[/"(?:[^"\\]|\\.)*$/,"string.invalid"],[/\d+(?:ms|s|m|h|d)\b/,"number"],[/-?\d+\.\d+/,"number.float"],[/-?\d+/,"number"],[/=>|==|!=|>=|<=|[><=:?]/,"operator"],[/[[\](),.]/,"delimiter"],[/\s+/,"white"]];function dn(t){let n={root:[[new RegExp(`^(\\s*)(example)(\\s+)([A-Z][${W}]*)(\\s*)(:)(\\s*)([A-Z][${W}.]*)(?=\\s*(?://.*)?$)`),["white","keyword","white","type.identifier","white","operator","white","type.identifier"]],[/^(\s*)(direction)(\s+)(inbound|outbound)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white","keyword"]],[new RegExp(`^()(purpose)(\\s+)([A-Za-z_][${W}]*)(?=\\s*(?://.*)?$)`),["white","keyword","white",{token:"type.identifier",next:"@purposeBody.$1"}]],[/^(\s*)(parameter)(\s+)([a-z_]\w*)(\s+)([\w.]+(?:\[\])?(?:\s+optional)?)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white","identifier","white","type.identifier"]],[/^(\s*)(case)(\s+)([A-Za-z_]\w*)(?=\s*(?:[a-z_]\w*\s*=|\/\/|$))/,["white","keyword","white","type.identifier"]],[/\b(case)(\.)([a-z_]\w*)\b/,["keyword","delimiter","identifier"]],[/^(\s*)(concept)(\s+)([^\s:]+)(\s*:\s*)(\w+)((?:\s+(?:@?pii|personal|@?sensitive|secret))*)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white","type.identifier","operator",{token:"type.identifier",next:"@conceptBody.$1"},"keyword"]],[/^(numbers)([ \t]+)(exact)(?=[ \t]*(?:(?:\/\/|#).*)?$)/,["keyword","white","keyword"]],[/^(eventsource)(\s+)([A-Za-z_]\w*)(?=\s*(?:\/\/.*)?$)/,["keyword","white","type.identifier"]],[/^(system)(\s+)([A-Z]\w*)(?=\s*(?:\/\/.*)?$)/,["keyword","white","type.identifier"]],[/^(\s*)(produces\s+operation)(\s+)([A-Z]\w*)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white",{token:"type.identifier",next:"@operationBody.$1"}]],[/^(\s*)(given\s+operation)(\s+)([\w.]+)(\s+)(fails)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white","type.identifier","white","keyword"]],[/^(\s*)(then\s+(?:operation|compensated))(\s+)([\w.]+)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white","type.identifier"]],[new RegExp(`^(\\s*)(command)(\\s+)([A-Za-z_][${W}]*)(?=\\s*(?://.*)?$)`),["white","keyword","white",{token:"type.identifier",next:"@commandBody.$1"}]],[/^(\s*)(handler)(?=\s*(?:\/\/.*)?$)/,["white",{token:"keyword",next:"@handlerBody.$1"}]],[/^(\s*@?[a-z_]\w*\s+)([\w.]+(?:\[\])?(?:\?|\s+optional)?)(\s+)(generated)(\s+identifier|)(?=\s*(?:\/\/.*)?$)/,["identifier","type.identifier","white","keyword","keyword"]],[/^(\s*)(generated)(\s+)([a-z_]\w*)(\s*=(?!=|>))/,["white","keyword","white","identifier","operator"]],[/^(\s*)(then)(\s+)(returns)\b/,["white","keyword","white","keyword"]],[/^(\s*)(returns)(?=\s*(?:\/\/.*)?$|\s+@\w+\s*(?:\/\/.*)?$)/,["white","keyword"]],[/^(\s*(?:by|filter)\s+[a-z_]\w*\s+)([\w.]+(?:\[\])?)(\s+)(optional)\b(?=\s*(?:from\b|\/\/|$))/,["identifier","type.identifier","white","keyword"]],[/^(?!\s*(?:by|filter)\s+)(\s*@?[a-z_]\w*\s+)([\w.]+(?:\[\])?)(\s+)(optional)\b(?=\s*(?:identifier\b|from\b|=(?!=|>)|\/\/|$))/,["identifier","type.identifier","white","keyword"]],[/^(\s*query\s+[A-Za-z_]\w*\s*=>\s*(?!observable\s+optional\s*(?:\/\/.*)?$)(?:observable\s+)?)([\w.]+(?:\[\])?)(\s+)(optional)\b(?=\s*(?:\/\/.*)?$)/,["keyword","type.identifier","white","keyword"]],[new RegExp(`^(\\s*)(given)(\\s+)(caller)(\\s+)(as)(\\s+)([A-Za-z_][${W}]*)(?=\\s*(?://.*)?$)`),["white","keyword","white","keyword","white","keyword","white","type.identifier"]],[/^(\s*)(given|when)(\s+)(clock|capture|trigger|query)\b/,["white","keyword","white","keyword"]],[/^(\s*)(then)(\s+)(result|no\s+(?:result|events))\b/,["white","keyword","white","keyword"]],[/^(\s*)(then)(\s+)(events)(\s+)(in any order)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white","keyword","white","keyword"]],[/^(\s*)(when)(\s+)(redelivered)(\s+)([\w.]+)(\s+)(to)(\s+)([\w.]+)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white","keyword","white","type.identifier","white","keyword","white","type.identifier"]],[/^(\s*)(otherwise)(\s+)(hidden)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white","keyword"]],[/^(\s*)(otherwise)(\s+)(execute)(\s+)([\w.]+)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white","keyword","white","type.identifier"]],[/^(\s*)(when)(\s+)(?=.+\s+execute\s+[\w.]+\s*(?:\/\/.*)?$)/,["white","keyword",{token:"white",next:"@guardedActionCondition"}]],[/^(\s*)(behavior)(\s+)([A-Za-z_]\w*)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white",{token:"type.identifier",next:"@behaviorBody.$1"}]],[/^(\s*)(on)(\s+)(refused)(\s+)(by)(\s+)(validation|constraint|authorization)\b/,["white","keyword","white","keyword","white","keyword","white","keyword"]],[/^(\s*)(on)(\s+)(refused)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white","keyword"]],[/^(\s*)(on)(\s+)([\w-]+)\b/,["white","keyword","white",{token:"keyword",next:"@interactionBody.$1"}]],[/^(\s*)(acknowledge)(?=\s*(?:\/\/.*)?$)/,["white","keyword"]],[/^(\s*)(import)(\s+)("[^"\\]*")/,["white","keyword","white","string.link"]],[/^(\s*)((?:(?:produces|public)\s+)?event)(\s+)([A-Za-z_]\w*)(\s+)(generation)(\s+)(\d+)(?=\s*(?:from\s+"(?:[^"\\]|\\.)*"\s*)?(?:\/\/.*)?$)/,["white","keyword","white","type.identifier","white","keyword","white",{token:"number",next:"@eventBody.$1"}]],[/^(\s*)((?:(?:produces|public)\s+)?event)(\s+)([A-Za-z_]\w*)(?=\s*(?:from\s+"(?:[^"\\]|\\.)*"\s*)?(?:\/\/.*)?$)/,["white","keyword","white",{token:"type.identifier",next:"@eventBody.$1"}]],...le.map(e=>[new RegExp(`^\\s*\\x60\\x60\\x60${e}\\s*$`),{token:"string.quote",next:`@codeBlock.${Ue[e]}`,nextEmbedded:Ue[e]}]),...le.map(e=>[new RegExp(`\\b${e}\\b(?=\\s*$)`),{token:"keyword.tag",next:`@codeBlockPending.${Ue[e]}`}]),...t.map(e=>[new RegExp(`\\b${e.keyword}\\b`),{token:"keyword",next:`@${mn(e.keyword)}`}]),[/^(\s*)(documentation)(?=\s+[\w.]+(?:\[\])?(?:\?|\s+optional)?\s*(?:identifier\b|generated\b|=(?!=|>)|\/\/|$))/,["white","identifier"]],[/\b(?:description|documentation)\b(?=\s*(?:\/\/.*)?$)/,{token:"keyword",next:"@descriptionBlockPending"}],[/\brow-click\b/,"keyword"],[/^\s*@[a-z_]\w*/,"identifier"],[/@\w+/,"annotation"],[/[A-Z]\w*/,{cases:{"@sliceTypes":"keyword.type","@primitiveTypes":"type","@default":"type.identifier"}}],[/[a-z_]\w*/,{cases:{"@keywords":"keyword","@default":"identifier"}}],{include:"@common"}],guardedActionCondition:[[/(execute)(\s+)([\w.]+)(?=\s*(?:\/\/.*)?$)/,["keyword","white",{token:"type.identifier",next:"@pop"}]],{include:"@root"}],behaviorBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:"@rematch",next:"@pop"}],{include:"@root"}],interactionBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:"@rematch",next:"@pop"}],[/^(\s*)(otherwise)(?=\s*(?:\/\/.*)?$)/,["white","keyword"]],[/^(\s*)(when)(\s+)(?=item\.|\()/,["white","keyword","white"]],[/^(\s*)(execute)(\s+)([\w.]+)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white","type.identifier"]],{include:"@root"}],purposeBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:"@rematch",next:"@pop"}],[/^(\s*)(basis|interest|condition|authorization|subjects|retention|recipient|transfer|erasure)(\s+)/,["white","keyword","white"]],[/\b(safeguard|exception)\b/,"keyword"],{include:"@root"}],conceptBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:"@rematch",next:"@pop"}],[/^(\s*)(@?pii|personal|@?sensitive|secret)(\s+)(reason|scope|special|criminal)\b/,["white","keyword","white","keyword"]],{include:"@root"}],commandBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:"@rematch",next:"@pop"}],[/^(\s*)(validate)(?=\s*(?:\/\/.*)?$)/,["white",{token:"keyword",next:"@commandValidation.$1"}]],{include:"@root"}],commandValidation:[[/^(?!$S2[ \t]+|\s*$)/,{token:"@rematch",next:"@pop"}],[new RegExp(`^(\\s*)([${W}.]+)(\\s+)(rule)(\\s+)([A-Za-z_][${W}]*)(?=\\s*(?:severity\\s+\\w+|message\\s+.*|//.*|$))`),["white","identifier","white","keyword","white",{token:"type.identifier",next:"@namedRuleBody.$1"}]],{include:"@root"}],namedRuleBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:"@rematch",next:"@pop"}],[/^(\s*)(implementation)(?=\s*(?:\/\/.*)?$)/,["white",{token:"keyword",next:"@implementationBody.$1"}]],{include:"@root"}],operationBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:"@rematch",next:"@pop"}],[/^(\s*)(execute|compensate)(?=\s*(?:\/\/.*)?$)/,["white",{token:"keyword",next:"@operationPhase.$1"}]],[/^(\s*)(uses)(\s+)([A-Z]\w*)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white","type.identifier"]],[/^(\s*)(@?[a-z_]\w*)(\s+)([\w.]+(?:\[\])?(?:\?|\s+optional)?)(?=\s*(?:=(?!=|>)|\/\/|$))/,["white","identifier","white","type.identifier"]],{include:"@root"}],operationPhase:[[/^(?!$S2[ \t]+|\s*$)/,{token:"@rematch",next:"@pop"}],[/^(\s*)(implementation)(?=\s*(?:\/\/.*)?$)/,["white",{token:"keyword",next:"@implementationBody.$1"}]],{include:"@root"}],handlerBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:"@rematch",next:"@pop"}],[/^(\s*)(implementation)(?=\s*(?:\/\/.*)?$)/,["white",{token:"keyword",next:"@implementationBody.$1"}]],{include:"@root"}],implementationBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:"@rematch",next:"@pop"}],[/^(\s*)(hint)(?=\s+")/,["white","keyword"]],{include:"@root"}],eventBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:"@rematch",next:"@pop"}],[/^(\s*)(id)(?=\s+")/,["white","keyword"]],[/^(\s*)(documentation)(?=\s*(?:\/\/.*)?$)/,["white",{token:"keyword",next:"@descriptionBlockPending"}]],{include:"@root"}],common:fo,codeBlockPending:[[/^\s*```\s*$/,{token:"string.quote",switchTo:"@codeBlock.$S2",nextEmbedded:"$S2"}],[/^\s*[^\s`].*$/,{token:"@rematch",next:"@pop"}],[/\s+/,"white"]],codeBlock:[[/^\s*```\s*$/,{token:"string.quote",next:"@pop",nextEmbedded:"@pop"}],[/[^`]+/,""],[/`/,""]],descriptionBlockPending:[[/\/\/.*$/,"comment"],[/^\s*```(?:text|markdown)?\s*$/,{token:"string.quote",switchTo:"@descriptionBlock"}],[/^\s*[^\s`].*$/,{token:"@rematch",next:"@pop"}],[/\s+/,"white"]],descriptionBlock:[[/^\s*```\s*$/,{token:"string.quote",next:"@pop"}],[/.+/,"string"]]};for(let e of t)n[mn(e.keyword)]=[po(t),...e.tokens,{include:"@common"},[/[A-Z]\w*/,"type.identifier"],[/[a-z_]\w*/,"identifier"]];return{defaultToken:"",tokenPostfix:".play",ignoreCase:!1,keywords:[...he.filter(e=>!pn.has(e)),...Re,...le],sliceTypes:Ee,primitiveTypes:ee,tokenizer:n}}d(dn,"createTokensProvider");function ue(t,n,e,o){let i=I(t);if(i[n]||T(e).length<e.length)return null;let a=e.trim()===""?e.length:$(t[n]),p=M(t,i,n,a),r=G(t,i,n,a),s=d(u=>{let m=o.commands.filter(l=>l.name===u);return m.length===1?m[0]:void 0},"namedCommand"),c=d((u,m=u.name)=>({label:u.name,insertText:m,documentation:`${D(H(u))}${u.isGenerated?" \u2014 generated, not request/form input":""}. ${N}`}),"entry");if(p.includes("command")){let u=V(t).commands.filter(m=>m.line<n).at(-1);if(!u)return null;if(p[0]==="command"){if(/^\s*returns\s+@?\w*$/.test(e))return!/returns\s+@/.test(e)&&u.properties.some(l=>l.name==="returns"&&l.line===n)?null:u.properties.map(l=>c(l,`${/returns\s+@/.test(e)?"":"@"}${l.name}`));let m=e.match(/^\s*@?[a-z_]\w*\s+([\w.]+)\s+(\w*)$/);if(m&&["generated","identifier"].some(l=>l.startsWith(m[2]))&&o.concepts.find(f=>f.name===m[1])?.primitive==="Uuid")return[..."optional".startsWith(m[2])?be:[],{label:"generated",insertText:"generated",documentation:`Required scalar Uuid concept with no validation rules; not a request/form input. ${N}`},{label:"generated identifier",insertText:"generated identifier",documentation:`Specification fixture uses an indented for value. ${N}`},{label:"identifier",insertText:"identifier",documentation:"Names the event source identifier."}];if(/^\s*@?[a-z_]\w*\s+[\w.]+\s+generated\s+\w*$/.test(e))return[{label:"identifier",insertText:"identifier",documentation:N}]}if(p[0]==="returns")return/=\s*@?\w*$/.test(e)?u.properties.map(m=>c(m)):/^\s*@?[a-z_]\w*\s+[\w.]*$/.test(e)?[...o.concepts.map(m=>m.name),...o.types.map(m=>m.name),...ee].map(m=>({label:m,insertText:m,documentation:`Explicit response type must exactly match the source. ${N}`})):u.properties.map(m=>c(m,`${m.name} = ${m.name}`))}if(p[0]==="form"&&r&&(/^\s*field\s+\w*$/.test(e)||e.trim()==="")){let u=s(r.match(/\bfor\s+([\w.]+)$/)?.[1]);if(u)return u.properties.filter(m=>!m.isGenerated).map(m=>c(m,e.trim()===""?`field ${m.name}`:m.name))}if(p.includes("specification")){if(p[0]==="when"&&r){let u=r.match(/^when\s+([\w.]+)$/)?.[1],m=s(u);if(!m)return null;if(/^\s*generated\s+\w*$/.test(e))return m.properties.filter(l=>l.isGenerated&&!l.isIdentifier).map(l=>c(l,`${l.name} = "\${1:uuid}"`));if(e.trim()==="")return[...m.properties.filter(l=>!l.isGenerated).map(l=>c(l,`${l.name} = \${1:value}`)),...m.properties.filter(l=>l.isGenerated&&!l.isIdentifier).map(l=>({...c(l,`generated ${l.name} = "\${1:uuid}"`),label:`generated ${l.name}`})),...m.properties.some(l=>l.isGenerated&&l.isIdentifier)?[{label:"for",insertText:'for "${1:uuid}"',documentation:`Generated identifier fixture, not request input. ${N}`}]:[]]}if(p[0]==="then"&&/^then\s+returns$/.test(r??"")){let u=[...L(t).specifications.values()].filter(l=>l.location.line-1<n).at(-1),m=s(u?.when?.commandType);if(m?.response?.kind==="RecordCommandResponseSyntax"){let l=new Map(m.properties.map(f=>[f.name,f]));return m.response.fields.map(f=>{let g=l.get(f.source.property),b=f.type??(g?H(g):void 0);return{label:f.name,insertText:`${f.name} = \${1:value}`,documentation:`${b?D(b):"Unresolved type"}. ${N}`}})}}}return null}d(ue,"responseCompletions");function fn(t,n){let e=re(t,I(t),n,$(t[n]));if(!(!e.some(o=>o.startsWith("specification "))||e.some(o=>/^(?:case|given caller|when redelivered)\b/.test(o))))return[...L(t).specifications].filter(([o])=>o<=n).sort(([o],[i])=>i-o)[0]?.[1]}d(fn,"enclosing");function hn(t,n,e){if(!/(?:=\s*|for\s+|then\s+error\s+)case\.[\w]*$/.test(e)||/when\s+redelivered|given\s+caller/.test(e)||/^\s*case\b/.test(e))return null;let o=fn(t,n);return(o?.cases?.length??0)===0?null:o.parameters?.map(i=>({label:`case.${i.name}`,insertText:`case.${i.name}`,documentation:`Case value of ${i.type.name}${i.type.isCollection?"[]":""}${i.type.isOptional?" optional":""}.`}))??[]}d(hn,"caseCompletions");function gn(t,n,e,o){let a=[...t[n].matchAll(/\bcase\.([a-z_]\w*)\b/g)].find(c=>c.index<o&&c.index+c[0].length>=e);if(a===void 0)return null;let p=fn(t,n),r=p?.parameters?.find(c=>c.name===a[1]);if(r===void 0)return null;let s=p.cases?.map(c=>{let u=c.values.find(l=>l.property===r.name)?.source,m=u!==null&&typeof u=="object"&&"value"in u?u.value:u;return`- ${c.name}: \`${JSON.stringify(m)}\``}).join(`
1
+ import{$ as Ot,$a as co,A as G,Aa as Ne,B as re,Ba as on,C as Oe,Ca as rn,D as wt,Da as an,E as Me,Ea as sn,F as Yn,Fa as cn,G as Kn,Ga as ln,H as Qn,Ha as ze,I as Jn,Ia as un,Ja as N,Ka as L,L as $t,La as Xn,M as xt,Ma as eo,N as kt,Na as to,O as St,Oa as no,P as Ct,Pa as H,Q as Tt,Qa as $e,R as At,Ra as V,S as Dt,Sa as oo,T as Pt,Ta as _,U as It,Ua as _e,V as Lt,Va as ro,W as Rt,Wa as Fe,X as Et,Xa as io,Y as qt,Ya as ao,Z as ye,Za as Be,_ as be,_a as so,a as B,aa as ie,ab as lo,b as ht,ba as ve,bb as uo,c as he,ca as we,cb as mo,d as Re,da as Mt,db as He,e as le,ea as jt,f as Un,fa as Nt,g as Wn,ga as zt,h as Ee,ha as _t,i as ee,ia as ae,j as Gn,ja as Ft,k as Vn,ka as Bt,l as gt,la as Ht,m as W,ma as Ut,n as qe,na as Wt,o as D,oa as Gt,p as ge,pa as Vt,q as te,qa as Zt,r as ne,ra as Yt,s as yt,sa as Kt,t as bt,ta as Qt,u as vt,ua as je,v as T,va as Jt,w as $,wa as Xt,x as Zn,xa as en,y as I,ya as tn,z as M,za as nn}from"./chunk-HI5WTI3G.js";import{a as d}from"./chunk-AYDF3IFZ.js";var pn=new Set(["operation","system","eventsource","purpose"]),Ue={csharp:"csharp",typescript:"typescript",react:"typescript",html:"html",sql:"sql"};function mn(t){return`subLanguage_${t}`}d(mn,"subLanguageState");function po(t){let n=[...he.filter(e=>!pn.has(e)),...t.map(e=>e.keyword)];return[new RegExp(`^\\s*(?:${n.join("|")})\\b`),{token:"@rematch",next:"@pop"}]}d(po,"subLanguageExitRule");var fo=[[/\/\/.*$/,"comment"],[/\$(?:context|eventContext|eventSourceId|causedBy|refusal)(?:\.\w+)*/,"variable.predefined"],[/\$(?:env|secrets|strings)\.[\w.]+/,"variable.predefined"],[/\$\.[\w.]*/,"variable.predefined"],[/"(?:[^"\\]|\\.)*"/,"string"],[/"(?:[^"\\]|\\.)*$/,"string.invalid"],[/\d+(?:ms|s|m|h|d)\b/,"number"],[/-?\d+\.\d+/,"number.float"],[/-?\d+/,"number"],[/=>|==|!=|>=|<=|[><=:?]/,"operator"],[/[[\](),.]/,"delimiter"],[/\s+/,"white"]];function dn(t){let n={root:[[new RegExp(`^(\\s*)(example)(\\s+)([A-Z][${W}]*)(\\s*)(:)(\\s*)([A-Z][${W}.]*)(?=\\s*(?://.*)?$)`),["white","keyword","white","type.identifier","white","operator","white","type.identifier"]],[/^(\s*)(direction)(\s+)(inbound|outbound)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white","keyword"]],[new RegExp(`^()(purpose)(\\s+)([A-Za-z_][${W}]*)(?=\\s*(?://.*)?$)`),["white","keyword","white",{token:"type.identifier",next:"@purposeBody.$1"}]],[/^(\s*)(parameter)(\s+)([a-z_]\w*)(\s+)([\w.]+(?:\[\])?(?:\s+optional)?)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white","identifier","white","type.identifier"]],[/^(\s*)(case)(\s+)([A-Za-z_]\w*)(?=\s*(?:[a-z_]\w*\s*=|\/\/|$))/,["white","keyword","white","type.identifier"]],[/\b(case)(\.)([a-z_]\w*)\b/,["keyword","delimiter","identifier"]],[/^(\s*)(concept)(\s+)([^\s:]+)(\s*:\s*)(\w+)((?:\s+(?:@?pii|personal|@?sensitive|secret))*)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white","type.identifier","operator",{token:"type.identifier",next:"@conceptBody.$1"},"keyword"]],[/^(numbers)([ \t]+)(exact)(?=[ \t]*(?:(?:\/\/|#).*)?$)/,["keyword","white","keyword"]],[/^(eventsource)(\s+)([A-Za-z_]\w*)(?=\s*(?:\/\/.*)?$)/,["keyword","white","type.identifier"]],[/^(system)(\s+)([A-Z]\w*)(?=\s*(?:\/\/.*)?$)/,["keyword","white","type.identifier"]],[/^(\s*)(produces\s+operation)(\s+)([A-Z]\w*)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white",{token:"type.identifier",next:"@operationBody.$1"}]],[/^(\s*)(given\s+operation)(\s+)([\w.]+)(\s+)(fails)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white","type.identifier","white","keyword"]],[/^(\s*)(then\s+(?:operation|compensated))(\s+)([\w.]+)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white","type.identifier"]],[new RegExp(`^(\\s*)(command)(\\s+)([A-Za-z_][${W}]*)(?=\\s*(?://.*)?$)`),["white","keyword","white",{token:"type.identifier",next:"@commandBody.$1"}]],[/^(\s*)(handler)(?=\s*(?:\/\/.*)?$)/,["white",{token:"keyword",next:"@handlerBody.$1"}]],[/^(\s*@?[a-z_]\w*\s+)([\w.]+(?:\[\])?(?:\?|\s+optional)?)(\s+)(generated)(\s+identifier|)(?=\s*(?:\/\/.*)?$)/,["identifier","type.identifier","white","keyword","keyword"]],[/^(\s*)(generated)(\s+)([a-z_]\w*)(\s*=(?!=|>))/,["white","keyword","white","identifier","operator"]],[/^(\s*)(then)(\s+)(returns)\b/,["white","keyword","white","keyword"]],[/^(\s*)(returns)(?=\s*(?:\/\/.*)?$|\s+@\w+\s*(?:\/\/.*)?$)/,["white","keyword"]],[/^(\s*(?:by|filter)\s+[a-z_]\w*\s+)([\w.]+(?:\[\])?)(\s+)(optional)\b(?=\s*(?:from\b|\/\/|$))/,["identifier","type.identifier","white","keyword"]],[/^(?!\s*(?:by|filter)\s+)(\s*@?[a-z_]\w*\s+)([\w.]+(?:\[\])?)(\s+)(optional)\b(?=\s*(?:identifier\b|from\b|=(?!=|>)|\/\/|$))/,["identifier","type.identifier","white","keyword"]],[/^(\s*query\s+[A-Za-z_]\w*\s*=>\s*(?!observable\s+optional\s*(?:\/\/.*)?$)(?:observable\s+)?)([\w.]+(?:\[\])?)(\s+)(optional)\b(?=\s*(?:\/\/.*)?$)/,["keyword","type.identifier","white","keyword"]],[new RegExp(`^(\\s*)(given)(\\s+)(caller)(\\s+)(as)(\\s+)([A-Za-z_][${W}]*)(?=\\s*(?://.*)?$)`),["white","keyword","white","keyword","white","keyword","white","type.identifier"]],[/^(\s*)(given|when)(\s+)(clock|capture|trigger|query)\b/,["white","keyword","white","keyword"]],[/^(\s*)(then)(\s+)(result|no\s+(?:result|events))\b/,["white","keyword","white","keyword"]],[/^(\s*)(then)(\s+)(events)(\s+)(in any order)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white","keyword","white","keyword"]],[/^(\s*)(when)(\s+)(redelivered)(\s+)([\w.]+)(\s+)(to)(\s+)([\w.]+)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white","keyword","white","type.identifier","white","keyword","white","type.identifier"]],[/^(\s*)(otherwise)(\s+)(hidden)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white","keyword"]],[/^(\s*)(otherwise)(\s+)(execute)(\s+)([\w.]+)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white","keyword","white","type.identifier"]],[/^(\s*)(when)(\s+)(?=.+\s+execute\s+[\w.]+\s*(?:\/\/.*)?$)/,["white","keyword",{token:"white",next:"@guardedActionCondition"}]],[/^(\s*)(behavior)(\s+)([A-Za-z_]\w*)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white",{token:"type.identifier",next:"@behaviorBody.$1"}]],[/^(\s*)(on)(\s+)(refused)(\s+)(by)(\s+)(validation|constraint|authorization)\b/,["white","keyword","white","keyword","white","keyword","white","keyword"]],[/^(\s*)(on)(\s+)(refused)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white","keyword"]],[/^(\s*)(on)(\s+)([\w-]+)\b/,["white","keyword","white",{token:"keyword",next:"@interactionBody.$1"}]],[/^(\s*)(acknowledge)(?=\s*(?:\/\/.*)?$)/,["white","keyword"]],[/^(\s*)(import)(\s+)("[^"\\]*")/,["white","keyword","white","string.link"]],[/^(\s*)((?:(?:produces|public)\s+)?event)(\s+)([A-Za-z_]\w*)(\s+)(generation)(\s+)(\d+)(?=\s*(?:from\s+"(?:[^"\\]|\\.)*"\s*)?(?:\/\/.*)?$)/,["white","keyword","white","type.identifier","white","keyword","white",{token:"number",next:"@eventBody.$1"}]],[/^(\s*)((?:(?:produces|public)\s+)?event)(\s+)([A-Za-z_]\w*)(?=\s*(?:from\s+"(?:[^"\\]|\\.)*"\s*)?(?:\/\/.*)?$)/,["white","keyword","white",{token:"type.identifier",next:"@eventBody.$1"}]],...le.map(e=>[new RegExp(`^\\s*\\x60\\x60\\x60${e}\\s*$`),{token:"string.quote",next:`@codeBlock.${Ue[e]}`,nextEmbedded:Ue[e]}]),...le.map(e=>[new RegExp(`\\b${e}\\b(?=\\s*$)`),{token:"keyword.tag",next:`@codeBlockPending.${Ue[e]}`}]),...t.map(e=>[new RegExp(`\\b${e.keyword}\\b`),{token:"keyword",next:`@${mn(e.keyword)}`}]),[/^(\s*)(documentation)(?=\s+[\w.]+(?:\[\])?(?:\?|\s+optional)?\s*(?:identifier\b|generated\b|=(?!=|>)|\/\/|$))/,["white","identifier"]],[/\b(?:description|documentation)\b(?=\s*(?:\/\/.*)?$)/,{token:"keyword",next:"@descriptionBlockPending"}],[/\brow-click\b/,"keyword"],[/^\s*@[a-z_]\w*/,"identifier"],[/@\w+/,"annotation"],[/[A-Z]\w*/,{cases:{"@sliceTypes":"keyword.type","@primitiveTypes":"type","@default":"type.identifier"}}],[/[a-z_]\w*/,{cases:{"@keywords":"keyword","@default":"identifier"}}],{include:"@common"}],guardedActionCondition:[[/(execute)(\s+)([\w.]+)(?=\s*(?:\/\/.*)?$)/,["keyword","white",{token:"type.identifier",next:"@pop"}]],{include:"@root"}],behaviorBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:"@rematch",next:"@pop"}],{include:"@root"}],interactionBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:"@rematch",next:"@pop"}],[/^(\s*)(otherwise)(?=\s*(?:\/\/.*)?$)/,["white","keyword"]],[/^(\s*)(when)(\s+)(?=item\.|\()/,["white","keyword","white"]],[/^(\s*)(execute)(\s+)([\w.]+)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white","type.identifier"]],{include:"@root"}],purposeBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:"@rematch",next:"@pop"}],[/^(\s*)(basis|interest|condition|authorization|subjects|retention|recipient|transfer|erasure)(\s+)/,["white","keyword","white"]],[/\b(safeguard|exception)\b/,"keyword"],{include:"@root"}],conceptBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:"@rematch",next:"@pop"}],[/^(\s*)(@?pii|personal|@?sensitive|secret)(\s+)(reason|scope|special|criminal)\b/,["white","keyword","white","keyword"]],{include:"@root"}],commandBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:"@rematch",next:"@pop"}],[/^(\s*)(validate)(?=\s*(?:\/\/.*)?$)/,["white",{token:"keyword",next:"@commandValidation.$1"}]],{include:"@root"}],commandValidation:[[/^(?!$S2[ \t]+|\s*$)/,{token:"@rematch",next:"@pop"}],[new RegExp(`^(\\s*)([${W}.]+)(\\s+)(rule)(\\s+)([A-Za-z_][${W}]*)(?=\\s*(?:severity\\s+\\w+|message\\s+.*|//.*|$))`),["white","identifier","white","keyword","white",{token:"type.identifier",next:"@namedRuleBody.$1"}]],{include:"@root"}],namedRuleBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:"@rematch",next:"@pop"}],[/^(\s*)(implementation)(?=\s*(?:\/\/.*)?$)/,["white",{token:"keyword",next:"@implementationBody.$1"}]],{include:"@root"}],operationBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:"@rematch",next:"@pop"}],[/^(\s*)(execute|compensate)(?=\s*(?:\/\/.*)?$)/,["white",{token:"keyword",next:"@operationPhase.$1"}]],[/^(\s*)(uses)(\s+)([A-Z]\w*)(?=\s*(?:\/\/.*)?$)/,["white","keyword","white","type.identifier"]],[/^(\s*)(@?[a-z_]\w*)(\s+)([\w.]+(?:\[\])?(?:\?|\s+optional)?)(?=\s*(?:=(?!=|>)|\/\/|$))/,["white","identifier","white","type.identifier"]],{include:"@root"}],operationPhase:[[/^(?!$S2[ \t]+|\s*$)/,{token:"@rematch",next:"@pop"}],[/^(\s*)(implementation)(?=\s*(?:\/\/.*)?$)/,["white",{token:"keyword",next:"@implementationBody.$1"}]],{include:"@root"}],handlerBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:"@rematch",next:"@pop"}],[/^(\s*)(implementation)(?=\s*(?:\/\/.*)?$)/,["white",{token:"keyword",next:"@implementationBody.$1"}]],{include:"@root"}],implementationBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:"@rematch",next:"@pop"}],[/^(\s*)(hint)(?=\s+")/,["white","keyword"]],{include:"@root"}],eventBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:"@rematch",next:"@pop"}],[/^(\s*)(id)(?=\s+")/,["white","keyword"]],[/^(\s*)(documentation)(?=\s*(?:\/\/.*)?$)/,["white",{token:"keyword",next:"@descriptionBlockPending"}]],{include:"@root"}],common:fo,codeBlockPending:[[/^\s*```\s*$/,{token:"string.quote",switchTo:"@codeBlock.$S2",nextEmbedded:"$S2"}],[/^\s*[^\s`].*$/,{token:"@rematch",next:"@pop"}],[/\s+/,"white"]],codeBlock:[[/^\s*```\s*$/,{token:"string.quote",next:"@pop",nextEmbedded:"@pop"}],[/[^`]+/,""],[/`/,""]],descriptionBlockPending:[[/\/\/.*$/,"comment"],[/^\s*```(?:text|markdown)?\s*$/,{token:"string.quote",switchTo:"@descriptionBlock"}],[/^\s*[^\s`].*$/,{token:"@rematch",next:"@pop"}],[/\s+/,"white"]],descriptionBlock:[[/^\s*```\s*$/,{token:"string.quote",next:"@pop"}],[/.+/,"string"]]};for(let e of t)n[mn(e.keyword)]=[po(t),...e.tokens,{include:"@common"},[/[A-Z]\w*/,"type.identifier"],[/[a-z_]\w*/,"identifier"]];return{defaultToken:"",tokenPostfix:".play",ignoreCase:!1,keywords:[...he.filter(e=>!pn.has(e)),...Re,...le],sliceTypes:Ee,primitiveTypes:ee,tokenizer:n}}d(dn,"createTokensProvider");function ue(t,n,e,o){let i=I(t);if(i[n]||T(e).length<e.length)return null;let a=e.trim()===""?e.length:$(t[n]),p=M(t,i,n,a),r=G(t,i,n,a),s=d(u=>{let m=o.commands.filter(l=>l.name===u);return m.length===1?m[0]:void 0},"namedCommand"),c=d((u,m=u.name)=>({label:u.name,insertText:m,documentation:`${D(H(u))}${u.isGenerated?" \u2014 generated, not request/form input":""}. ${N}`}),"entry");if(p.includes("command")){let u=V(t).commands.filter(m=>m.line<n).at(-1);if(!u)return null;if(p[0]==="command"){if(/^\s*returns\s+@?\w*$/.test(e))return!/returns\s+@/.test(e)&&u.properties.some(l=>l.name==="returns"&&l.line===n)?null:u.properties.map(l=>c(l,`${/returns\s+@/.test(e)?"":"@"}${l.name}`));let m=e.match(/^\s*@?[a-z_]\w*\s+([\w.]+)\s+(\w*)$/);if(m&&["generated","identifier"].some(l=>l.startsWith(m[2]))&&o.concepts.find(f=>f.name===m[1])?.primitive==="Uuid")return[..."optional".startsWith(m[2])?be:[],{label:"generated",insertText:"generated",documentation:`Required scalar Uuid concept with no validation rules; not a request/form input. ${N}`},{label:"generated identifier",insertText:"generated identifier",documentation:`Specification fixture uses an indented for value. ${N}`},{label:"identifier",insertText:"identifier",documentation:"Names the event source identifier."}];if(/^\s*@?[a-z_]\w*\s+[\w.]+\s+generated\s+\w*$/.test(e))return[{label:"identifier",insertText:"identifier",documentation:N}]}if(p[0]==="returns")return/=\s*@?\w*$/.test(e)?u.properties.map(m=>c(m)):/^\s*@?[a-z_]\w*\s+[\w.]*$/.test(e)?[...o.concepts.map(m=>m.name),...o.types.map(m=>m.name),...ee].map(m=>({label:m,insertText:m,documentation:`Explicit response type must exactly match the source. ${N}`})):u.properties.map(m=>c(m,`${m.name} = ${m.name}`))}if(p[0]==="form"&&r&&(/^\s*field\s+\w*$/.test(e)||e.trim()==="")){let u=s(r.match(/\bfor\s+([\w.]+)$/)?.[1]);if(u)return u.properties.filter(m=>!m.isGenerated).map(m=>c(m,e.trim()===""?`field ${m.name}`:m.name))}if(p.includes("specification")){if(p[0]==="when"&&r){let u=r.match(/^when\s+([\w.]+)$/)?.[1],m=s(u);if(!m)return null;if(/^\s*generated\s+\w*$/.test(e))return m.properties.filter(l=>l.isGenerated&&!l.isIdentifier).map(l=>c(l,`${l.name} = "\${1:uuid}"`));if(e.trim()==="")return[...m.properties.filter(l=>!l.isGenerated).map(l=>c(l,`${l.name} = \${1:value}`)),...m.properties.filter(l=>l.isGenerated&&!l.isIdentifier).map(l=>({...c(l,`generated ${l.name} = "\${1:uuid}"`),label:`generated ${l.name}`})),...m.properties.some(l=>l.isGenerated&&l.isIdentifier)?[{label:"for",insertText:'for "${1:uuid}"',documentation:`Generated identifier fixture, not request input. ${N}`}]:[]]}if(p[0]==="then"&&/^then\s+returns$/.test(r??"")){let u=[...L(t).specifications.values()].filter(l=>l.location.line-1<n).at(-1),m=s(u?.when?.commandType);if(m?.response?.kind==="RecordCommandResponseSyntax"){let l=new Map(m.properties.map(f=>[f.name,f]));return m.response.fields.map(f=>{let g=l.get(f.source.property),b=f.type??(g?H(g):void 0);return{label:f.name,insertText:`${f.name} = \${1:value}`,documentation:`${b?D(b):"Unresolved type"}. ${N}`}})}}}return null}d(ue,"responseCompletions");function fn(t,n){let e=re(t,I(t),n,$(t[n]));if(!(!e.some(o=>o.startsWith("specification "))||e.some(o=>/^(?:case|given caller|when redelivered)\b/.test(o))))return[...L(t).specifications].filter(([o])=>o<=n).sort(([o],[i])=>i-o)[0]?.[1]}d(fn,"enclosing");function hn(t,n,e){if(!/(?:=\s*|for\s+|then\s+error\s+)case\.[\w]*$/.test(e)||/when\s+redelivered|given\s+caller/.test(e)||/^\s*case\b/.test(e))return null;let o=fn(t,n);return(o?.cases?.length??0)===0?null:o.parameters?.map(i=>({label:`case.${i.name}`,insertText:`case.${i.name}`,documentation:`Case value of ${i.type.name}${i.type.isCollection?"[]":""}${i.type.isOptional?" optional":""}.`}))??[]}d(hn,"caseCompletions");function gn(t,n,e,o){let a=[...t[n].matchAll(/\bcase\.([a-z_]\w*)\b/g)].find(c=>c.index<o&&c.index+c[0].length>=e);if(a===void 0)return null;let p=fn(t,n),r=p?.parameters?.find(c=>c.name===a[1]);if(r===void 0)return null;let s=p.cases?.map(c=>{let u=c.values.find(l=>l.property===r.name)?.source,m=u!==null&&typeof u=="object"&&"value"in u?u.value:u;return`- ${c.name}: \`${JSON.stringify(m)}\``}).join(`
2
2
  `);return`**case.${r.name}** \u2014 ${r.type.name}
3
3
 
4
4
  Case origin in **${p.name}**; substitutes after example overrides.
@@ -1,4 +1,4 @@
1
- import{G as ne,H as re,I as oe,J as q,K as ie,eb as se,y as te}from"../../chunk-T4MD6O7Y.js";import{a as b}from"../../chunk-AYDF3IFZ.js";var E="pdl",ce=["projection","description","sequence","all","every","on","from","key","parent","join","automap","no","children","nested","identified","by","add","subtract","remove","via","with","default","increment","decrement","count","set","unset","clear","events","id","exclude","variant","enters"],pe=["$eventSourceId","$causedBy","$eventContext"],me=["=","+=","-=","=>","."],ae={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}],indentationRules:{increaseIndentPattern:/^.*(:|\bon\b|\ball\b|\bevery\b|\bchildren\b|\bnested\b|\bparent\b|\bvariant\b)\s*$/,decreaseIndentPattern:/^.*\}.*$/},folding:{offSide:!0,markers:{start:/^\s*(projection|all|every|on|children|nested|parent|variant)/,end:/^\s*$/}},wordPattern:/@?[a-zA-Z_$][\w$-]*/},de={defaultToken:"",tokenPostfix:".pdl",keywords:ce,builtins:pe,operators:me,symbols:/[=><!~?:&|+\-*/^%]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[{include:"@whitespace"},[/`/,{token:"string.template",next:"@templateString"}],[/@[a-zA-Z_$][\w$]*/,"identifier.escape"],[/[A-Z][a-zA-Z_$][\w$]*/,{cases:{"@keywords":"invalid","@default":"identifier"}}],[/[a-z_$][\w$]*/,{cases:{"@keywords":"keyword","@builtins":"variable.predefined","@default":"identifier"}}],[/[{}()[\]]/,"@brackets"],[/=>/,"operator.arrow"],[/@symbols/,{cases:{"@operators":"operator","@default":""}}],[/\d*\.\d+([eE][-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F]+/,"number.hex"],[/\d+/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,{token:"string.quote",next:"@string"}]],whitespace:[[/[ \t\r\n]+/,""],[/#.*$/,"comment"]],templateString:[[/\$\{/,{token:"delimiter.bracket",next:"@templateExpression"}],[/[^\\`$]+/,"string.template"],[/@escapes/,"string.template.escape"],[/\\./,"string.template.escape.invalid"],[/`/,{token:"string.template",next:"@pop"}]],templateExpression:[[/\}/,{token:"delimiter.bracket",next:"@pop"}],{include:"@root"}],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",next:"@pop"}]]}};var le=/\$eventContext\.((?:\w+\.)*)(\w*)$/,D=class{static{b(this,"CompletionProvider")}readModels=[];eventSchemas={};eventSequences=[];setReadModels(e){this.readModels=e||[]}setEventSequences(e){this.eventSequences=e||[]}setReadModelSchemas(e){this.readModels=e.map(t=>({identifier:this.getSchemaName(t)||"",displayName:this.getSchemaName(t)||"",schema:t}))}setEventSchemas(e){if(!e){this.eventSchemas={};return}if(Array.isArray(e)){let t={};e.forEach((n,r)=>{if(!n)return;let o=this.getSchemaName(n)||`Event${r+1}`;t[o]=n}),this.eventSchemas=t;return}this.eventSchemas=e}provideCompletionItems(e,t){let n=this.buildContext(e,t),r=[],o=this.getActiveReadModelSchema(e);return n.lineNumber===1?this.addProjectionLineCompletions(r,n):this.isAfterKeyword(n,"sequence")?this.addEventSequenceCompletions(r,n):this.isAfterKeyword(n,"from")||this.isAfterKeyword(n,"every")?this.addEventTypeCompletions(r,n):/\benters\s+on\s+\w*$/.test(n.textBeforeCursor)?this.addEventTypeCompletions(r,n):/\benters\s+\w*$/.test(n.textBeforeCursor)?r.push({label:"on",kind:14,insertText:"on ",documentation:"Declares the event that activates this variant.",detail:"enters on <EventType>",range:this.getRangeForWord(n)}):this.isAfterKeyword(n,"variant")?this.addVariantNameCompletions(r,n):this.isAfterKeyword(n,"key")?this.addKeyCompletions(r,n,o):this.isAfterKeyword(n,"parent")?this.addParentCompletions(r,n):this.isAfterKeyword(n,"children")?this.addChildrenCompletions(r,n,o):this.isAfterKeyword(n,"join")?this.addJoinCompletions(r,n,o):this.isAfterKeyword(n,"with")?this.addEventTypeCompletions(r,n):this.isAfterNumericOperationKeyword(n)?this.addNumericPropertyCompletions(r,n,o):this.isAfterAddOrSubtractBy(n)?this.addAssignmentValueCompletions(r,n,e,t):this.isInAssignment(n)?this.addAssignmentValueCompletions(r,n,e,t):this.isPropertyDotAccess(n)?this.addPropertyMemberCompletions(r,n):(this.isStartOfLine(n)||this.isAfterIndent(n))&&this.addStatementCompletions(r,n,o),{suggestions:r}}buildContext(e,t){let n=e.getLineContent(t.lineNumber),r=n.substring(0,t.column-1),o=n.substring(t.column-1),l=e.getWordAtPosition(t)?.word||"",f=this.getIndentLevel(r);return{lineContent:n,textBeforeCursor:r,textAfterCursor:o,currentWord:l,indentLevel:f,lineNumber:t.lineNumber}}getIndentLevel(e){let t=e.match(/^(\s*)/);return t?Math.floor(t[1].length/2):0}isStartOfLine(e){return e.textBeforeCursor.trim()===""}isAfterIndent(e){return/^\s+$/.test(e.textBeforeCursor)}isAfterKeyword(e,t){return new RegExp(`\\b${t}\\s+\\w*$`).test(e.textBeforeCursor)}isAfterNumericOperationKeyword(e){let t=/\b(count|increment|decrement)\s+\w*$/,n=/\b(add|subtract)\s+\w*$/;return t.test(e.textBeforeCursor)?!0:n.test(e.textBeforeCursor)?!this.isAfterAddOrSubtractBy(e):!1}isAfterAddOrSubtractBy(e){return/\b(add|subtract)\s+\w+\s+by\s+\w*$/.test(e.textBeforeCursor)}isInAssignment(e){return/\w+\s*=\s*\w*$/.test(e.textBeforeCursor)}isPropertyDotAccess(e){return/(\w+|\$\w+)\.(\w*)$/.test(e.textBeforeCursor)||le.test(e.textBeforeCursor)}addProjectionLineCompletions(e,t){let n=t.textBeforeCursor.trim();(n===""||"projection".startsWith(n))&&e.push({label:"projection",kind:14,insertText:"projection ",documentation:"Define a projection that transforms events into a read model",detail:"projection <ProjectionName>",range:this.getRangeForWord(t)});let r=n.match(/^projection\s+[\w.]+\s*=>\s*([\w.]*)$/);if(r){let o=r[1]||"";this.readModels.forEach(s=>{if(!o||s.displayName.toLowerCase().startsWith(o.toLowerCase())){let l=`${s.displayName} (${s.identifier})`;e.push({label:l,kind:6,insertText:s.displayName,filterText:`${s.displayName} ${s.identifier}`,documentation:`Read model: ${s.displayName} (${s.identifier})`,detail:s.identifier,range:this.getRangeForWord(t)})}});return}if(n.startsWith("projection ")&&!n.includes("=>")){let o=n.substring(11);this.readModels.forEach(s=>{if(!o||s.displayName.toLowerCase().startsWith(o.toLowerCase())){let l=`${s.displayName} (${s.identifier})`;e.push({label:l,kind:6,insertText:`${s.displayName} => ${s.displayName}`,filterText:`${s.displayName} ${s.identifier}`,documentation:`Read model: ${s.displayName} (${s.identifier})`,detail:s.identifier,range:this.getRangeForWord(t)})}})}}addEventTypeCompletions(e,t){Object.keys(this.eventSchemas).forEach(n=>{if(!t.currentWord||n.startsWith(t.currentWord)){let r=this.eventSchemas[n];e.push({label:n,kind:6,insertText:n,documentation:this.getSchemaDescription(r)||`Event type: ${n}`,detail:"Event Type",range:this.getRangeForWord(t)})}})}addEventSequenceCompletions(e,t){this.eventSequences.forEach(n=>{(!t.currentWord||n.startsWith(t.currentWord))&&e.push({label:n,kind:13,insertText:n,documentation:`Event sequence: ${n}`,detail:"Event Sequence",range:this.getRangeForWord(t)})})}addKeyCompletions(e,t,n){n?.definitions&&Object.keys(n.definitions).forEach(r=>{n.definitions[r].type==="object"&&e.push({label:r,kind:6,insertText:r,documentation:`Composite key type: ${r}`,detail:"Composite Key Type",range:this.getRangeForWord(t)})}),this.addExpressionCompletions(e,t)}addParentCompletions(e,t){this.addExpressionCompletions(e,t)}addNumericPropertyCompletions(e,t,n){n?.properties&&Object.entries(n.properties).forEach(([o,s])=>{(s.type==="integer"||s.type==="number")&&(!t.currentWord||o.startsWith(t.currentWord))&&e.push({label:o,kind:9,insertText:o,documentation:`Numeric property: ${o}`,detail:this.getPropertyTypeDescription(s),range:this.getRangeForWord(t)})});let r=t.textBeforeCursor.match(/\b(add|subtract)\s+(\w*)$/);if(r){let o=r[2]||"";n?.properties&&Object.entries(n.properties).forEach(([s,l])=>{(l.type==="integer"||l.type==="number")&&(!o||s.startsWith(o))&&e.push({label:s,kind:9,insertText:`${s} by `,documentation:`Numeric property: ${s}`,detail:this.getPropertyTypeDescription(l),range:this.getRangeForWord(t)})})}}addChildrenCompletions(e,t,n){n?.properties&&Object.entries(n.properties).forEach(([r,o])=>{(o.type==="array"||o.items)&&e.push({label:r,kind:9,insertText:`${r} id `,documentation:`Collection property: ${r}`,detail:this.getPropertyTypeDescription(o),range:this.getRangeForWord(t)})})}addJoinCompletions(e,t,n){let r=t.textBeforeCursor.trim();r==="join"||!r.includes(" ")?n?.properties&&Object.entries(n.properties).forEach(([o,s])=>{(s.type==="array"||s.items)&&e.push({label:o,kind:9,insertText:`${o} on `,documentation:`Join on collection: ${o}`,range:this.getRangeForWord(t)})}):r.match(/join\s+\w+\s+on\s+/)&&n?.properties&&Object.keys(n.properties).forEach(o=>{e.push({label:o,kind:9,insertText:o,documentation:`Property: ${o}`,range:this.getRangeForWord(t)})})}addVariantNameCompletions(e,t){this.readModels.forEach(n=>{(!t.currentWord||n.displayName.toLowerCase().startsWith(t.currentWord.toLowerCase()))&&e.push({label:n.displayName,kind:6,insertText:n.displayName,documentation:`Read model: ${n.displayName} (${n.identifier})`,detail:n.identifier,range:this.getRangeForWord(t)})})}addStatementCompletions(e,t,n){[{label:"description",insertText:'description ""',documentation:"Report-only description on the projection header only",detail:'description "<text>"'},{label:"sequence",insertText:"sequence ",documentation:"Specify which event sequence to use for this projection",detail:"sequence <event-sequence-id>"},{label:"variant",insertText:"variant ",documentation:"Declare one of several mutually exclusive named read models sharing this projection's identity",detail:"variant <Name>"},{label:"enters on",insertText:"enters on ",documentation:"Declare the event that activates a variant",detail:"enters on <EventType>"},{label:"from",insertText:"from ",documentation:"Handle specific event types",detail:"from <EventType>"},{label:"all",insertText:"all",documentation:"Subscribe to all event types in the system \u2014 mappings run for every event system-wide, regardless of explicit from blocks",detail:"all"},{label:"every",insertText:"every",documentation:"Handle all events for automatic mapping (only events explicitly subscribed to via from blocks)",detail:"every"},{label:"key",insertText:"key ",documentation:"Define the projection key",detail:"key <expression>"},{label:"parent",insertText:"parent ",documentation:"Define parent relationship",detail:"parent <expression>"},{label:"join",insertText:"join ",documentation:"Join with child collection",detail:"join <collection> on <property>"},{label:"children",insertText:"children ",documentation:"Define child collection operations",detail:"children <collection> identified by <expression>"},{label:"remove with",insertText:"remove with ",documentation:"Remove items based on event",detail:"remove with <EventType>"},{label:"remove via",insertText:"remove via join on ",documentation:"Remove items via join",detail:"remove via join on <EventType>"},{label:"no automap",insertText:"no automap",documentation:"Disable automatic property mapping",detail:"no automap"},{label:"clear",insertText:"clear ",documentation:"Remove the value a property holds",detail:"clear <property>"},{label:"increment",insertText:"increment ",documentation:"Increment a numeric property",detail:"increment <property>"},{label:"decrement",insertText:"decrement ",documentation:"Decrement a numeric property",detail:"decrement <property>"},{label:"count",insertText:"count ",documentation:"Count occurrences",detail:"count <property>"},{label:"add",insertText:"add ",documentation:"Add value to property",detail:"add <property> by <expression>"},{label:"subtract",insertText:"subtract ",documentation:"Subtract value from property",detail:"subtract <property> by <expression>"},{label:"exclude children",insertText:"exclude children",documentation:"Exclude child collections from automap",detail:"exclude children"}].forEach(o=>{(!t.currentWord||o.label.startsWith(t.currentWord))&&e.push({label:o.label,kind:14,insertText:o.insertText,documentation:o.documentation,detail:o.detail,range:this.getRangeForWord(t)})}),n?.properties&&Object.entries(n.properties).forEach(([o,s])=>{(!t.currentWord||o.startsWith(t.currentWord))&&e.push({label:o,kind:9,insertText:`${o} = `,documentation:`Assign value to property: ${o}`,detail:this.getPropertyTypeDescription(s),range:this.getRangeForWord(t)})})}addAssignmentValueCompletions(e,t,n,r){let o=this.getCurrentEventType(n,r.lineNumber);if(o&&this.eventSchemas[o]){let s=this.eventSchemas[o];s.properties&&Object.entries(s.properties).forEach(([l,f])=>{e.push({label:l,kind:9,insertText:l,documentation:`Event property: ${l}`,detail:this.getPropertyTypeDescription(f),range:this.getRangeForWord(t)})})}this.addExpressionCompletions(e,t)}addExpressionCompletions(e,t){[{label:"$eventSourceId",insertText:"$eventSourceId",documentation:"The identifier of the event source (aggregate/entity)",detail:"Event Source Expression"},{label:"$causedBy",insertText:"$causedBy",documentation:"The identity that caused the event. Chronicle cannot yet evaluate this short form (Cratis/Chronicle#4119) - prefer $eventContext.causedBy.<property>.",detail:"Identity Expression"},{label:"$eventContext",insertText:"$eventContext.",documentation:`Metadata about the event: ${ne.map(r=>r.name).join(", ")}`,detail:"Event Context Expression"}].forEach(r=>{(!t.currentWord||r.label.startsWith(t.currentWord)||r.label.startsWith("$"+t.currentWord))&&e.push({label:r.label,kind:14,insertText:r.insertText,documentation:r.documentation,detail:r.detail,range:this.getRangeForWord(t)})})}addPropertyMemberCompletions(e,t){let n=t.textBeforeCursor.match(le);if(n){let c=n[1].split(".").filter(u=>u.length>0);this.addEventContextMemberCompletions(e,t,c,n[2]);return}let r=t.textBeforeCursor.match(/(\w+|\$\w+)\.(\w*)$/);if(!r)return;let[,o,s]=r,l=t.textBeforeCursor.match(/\$causedBy\.((?:\w+\.)*)(\w*)$/);if(l){let c=l[1].split(".").filter(u=>u.length>0);this.addEventContextMemberCompletions(e,t,["causedBy",...c],l[2]);return}let f=this.eventSchemas[o];f?.properties&&Object.entries(f.properties).forEach(([c,u])=>{(!s||c.startsWith(s))&&e.push({label:c,kind:9,insertText:c,documentation:`Event property: ${c}`,detail:this.getPropertyTypeDescription(u),range:this.getRangeForWord(t)})})}addEventContextMemberCompletions(e,t,n,r){(re(n)??[]).filter(s=>!r||s.name.startsWith(r)).forEach(s=>{e.push({label:s.name,kind:s.kind==="function"?1:9,insertText:s.name,documentation:s.description,detail:s.type,range:this.getRangeForWord(t)})})}getCurrentEventType(e,t){for(let n=t;n>=1;n--){let r=e.getLineContent(n).trim(),o=r.match(/^from\s+([\w-]+)/);if(o)return o[1];if(r.match(/^every$/))return null}return null}getActiveReadModelSchema(e){let n=e.getLineContent(1).trim().match(/^projection\s+[\w.]+\s*=>\s*([\w.]+)/);if(!n)return;let r=n[1];return this.resolveReadModelInfo(r)?.schema}resolveReadModelInfo(e){return this.readModels.find(t=>t.identifier===e||t.displayName===e)||null}getSchemaName(e){if(e.name)return e.name;if(e.title)return e.title;if(typeof e.$id=="string"){let t=e.$id.split("/");return t[t.length-1]||e.$id}}getSchemaDescription(e){return e.description||void 0}getPropertyTypeDescription(e){return e.type==="array"&&e.items?`${e.items.type||e.items.$id?.split("/").pop()||"unknown"}[]`:e.type||e.$ref?.split("/").pop()||"unknown"}getRangeForWord(e){let t=e.textBeforeCursor.length-e.currentWord.length+1,n=t+e.currentWord.length;return{startLineNumber:e.lineNumber,startColumn:Math.max(1,t),endLineNumber:e.lineNumber,endColumn:Math.max(1,n)}}};var A=class{static{b(this,"Validator")}readModels=[];eventSchemas={};draftReadModel=null;setReadModels(e){this.readModels=e||[]}setDraftReadModel(e){this.draftReadModel=e}setReadModelSchemas(e){this.readModels=e.map(t=>({identifier:this.getSchemaName(t)||"",displayName:this.getSchemaName(t)||"",schema:t}))}setEventSchemas(e){if(!e){this.eventSchemas={};return}if(Array.isArray(e)){let t={};e.forEach((n,r)=>{if(!n)return;let o=this.getSchemaName(n)||`Event${r+1}`;t[o]=n}),this.eventSchemas=t;return}this.eventSchemas=e}validate(e){let t=[],n=e.getValue();if(!n.trim())return t;let r=n.replace(/\r\n/g,`
1
+ import{G as ne,H as re,I as oe,J as q,K as ie,eb as se,y as te}from"../../chunk-HI5WTI3G.js";import{a as b}from"../../chunk-AYDF3IFZ.js";var E="pdl",ce=["projection","description","sequence","all","every","on","from","key","parent","join","automap","no","children","nested","identified","by","add","subtract","remove","via","with","default","increment","decrement","count","set","unset","clear","events","id","exclude","variant","enters"],pe=["$eventSourceId","$causedBy","$eventContext"],me=["=","+=","-=","=>","."],ae={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}],indentationRules:{increaseIndentPattern:/^.*(:|\bon\b|\ball\b|\bevery\b|\bchildren\b|\bnested\b|\bparent\b|\bvariant\b)\s*$/,decreaseIndentPattern:/^.*\}.*$/},folding:{offSide:!0,markers:{start:/^\s*(projection|all|every|on|children|nested|parent|variant)/,end:/^\s*$/}},wordPattern:/@?[a-zA-Z_$][\w$-]*/},de={defaultToken:"",tokenPostfix:".pdl",keywords:ce,builtins:pe,operators:me,symbols:/[=><!~?:&|+\-*/^%]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[{include:"@whitespace"},[/`/,{token:"string.template",next:"@templateString"}],[/@[a-zA-Z_$][\w$]*/,"identifier.escape"],[/[A-Z][a-zA-Z_$][\w$]*/,{cases:{"@keywords":"invalid","@default":"identifier"}}],[/[a-z_$][\w$]*/,{cases:{"@keywords":"keyword","@builtins":"variable.predefined","@default":"identifier"}}],[/[{}()[\]]/,"@brackets"],[/=>/,"operator.arrow"],[/@symbols/,{cases:{"@operators":"operator","@default":""}}],[/\d*\.\d+([eE][-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F]+/,"number.hex"],[/\d+/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,{token:"string.quote",next:"@string"}]],whitespace:[[/[ \t\r\n]+/,""],[/#.*$/,"comment"]],templateString:[[/\$\{/,{token:"delimiter.bracket",next:"@templateExpression"}],[/[^\\`$]+/,"string.template"],[/@escapes/,"string.template.escape"],[/\\./,"string.template.escape.invalid"],[/`/,{token:"string.template",next:"@pop"}]],templateExpression:[[/\}/,{token:"delimiter.bracket",next:"@pop"}],{include:"@root"}],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",next:"@pop"}]]}};var le=/\$eventContext\.((?:\w+\.)*)(\w*)$/,D=class{static{b(this,"CompletionProvider")}readModels=[];eventSchemas={};eventSequences=[];setReadModels(e){this.readModels=e||[]}setEventSequences(e){this.eventSequences=e||[]}setReadModelSchemas(e){this.readModels=e.map(t=>({identifier:this.getSchemaName(t)||"",displayName:this.getSchemaName(t)||"",schema:t}))}setEventSchemas(e){if(!e){this.eventSchemas={};return}if(Array.isArray(e)){let t={};e.forEach((n,r)=>{if(!n)return;let o=this.getSchemaName(n)||`Event${r+1}`;t[o]=n}),this.eventSchemas=t;return}this.eventSchemas=e}provideCompletionItems(e,t){let n=this.buildContext(e,t),r=[],o=this.getActiveReadModelSchema(e);return n.lineNumber===1?this.addProjectionLineCompletions(r,n):this.isAfterKeyword(n,"sequence")?this.addEventSequenceCompletions(r,n):this.isAfterKeyword(n,"from")||this.isAfterKeyword(n,"every")?this.addEventTypeCompletions(r,n):/\benters\s+on\s+\w*$/.test(n.textBeforeCursor)?this.addEventTypeCompletions(r,n):/\benters\s+\w*$/.test(n.textBeforeCursor)?r.push({label:"on",kind:14,insertText:"on ",documentation:"Declares the event that activates this variant.",detail:"enters on <EventType>",range:this.getRangeForWord(n)}):this.isAfterKeyword(n,"variant")?this.addVariantNameCompletions(r,n):this.isAfterKeyword(n,"key")?this.addKeyCompletions(r,n,o):this.isAfterKeyword(n,"parent")?this.addParentCompletions(r,n):this.isAfterKeyword(n,"children")?this.addChildrenCompletions(r,n,o):this.isAfterKeyword(n,"join")?this.addJoinCompletions(r,n,o):this.isAfterKeyword(n,"with")?this.addEventTypeCompletions(r,n):this.isAfterNumericOperationKeyword(n)?this.addNumericPropertyCompletions(r,n,o):this.isAfterAddOrSubtractBy(n)?this.addAssignmentValueCompletions(r,n,e,t):this.isInAssignment(n)?this.addAssignmentValueCompletions(r,n,e,t):this.isPropertyDotAccess(n)?this.addPropertyMemberCompletions(r,n):(this.isStartOfLine(n)||this.isAfterIndent(n))&&this.addStatementCompletions(r,n,o),{suggestions:r}}buildContext(e,t){let n=e.getLineContent(t.lineNumber),r=n.substring(0,t.column-1),o=n.substring(t.column-1),l=e.getWordAtPosition(t)?.word||"",f=this.getIndentLevel(r);return{lineContent:n,textBeforeCursor:r,textAfterCursor:o,currentWord:l,indentLevel:f,lineNumber:t.lineNumber}}getIndentLevel(e){let t=e.match(/^(\s*)/);return t?Math.floor(t[1].length/2):0}isStartOfLine(e){return e.textBeforeCursor.trim()===""}isAfterIndent(e){return/^\s+$/.test(e.textBeforeCursor)}isAfterKeyword(e,t){return new RegExp(`\\b${t}\\s+\\w*$`).test(e.textBeforeCursor)}isAfterNumericOperationKeyword(e){let t=/\b(count|increment|decrement)\s+\w*$/,n=/\b(add|subtract)\s+\w*$/;return t.test(e.textBeforeCursor)?!0:n.test(e.textBeforeCursor)?!this.isAfterAddOrSubtractBy(e):!1}isAfterAddOrSubtractBy(e){return/\b(add|subtract)\s+\w+\s+by\s+\w*$/.test(e.textBeforeCursor)}isInAssignment(e){return/\w+\s*=\s*\w*$/.test(e.textBeforeCursor)}isPropertyDotAccess(e){return/(\w+|\$\w+)\.(\w*)$/.test(e.textBeforeCursor)||le.test(e.textBeforeCursor)}addProjectionLineCompletions(e,t){let n=t.textBeforeCursor.trim();(n===""||"projection".startsWith(n))&&e.push({label:"projection",kind:14,insertText:"projection ",documentation:"Define a projection that transforms events into a read model",detail:"projection <ProjectionName>",range:this.getRangeForWord(t)});let r=n.match(/^projection\s+[\w.]+\s*=>\s*([\w.]*)$/);if(r){let o=r[1]||"";this.readModels.forEach(s=>{if(!o||s.displayName.toLowerCase().startsWith(o.toLowerCase())){let l=`${s.displayName} (${s.identifier})`;e.push({label:l,kind:6,insertText:s.displayName,filterText:`${s.displayName} ${s.identifier}`,documentation:`Read model: ${s.displayName} (${s.identifier})`,detail:s.identifier,range:this.getRangeForWord(t)})}});return}if(n.startsWith("projection ")&&!n.includes("=>")){let o=n.substring(11);this.readModels.forEach(s=>{if(!o||s.displayName.toLowerCase().startsWith(o.toLowerCase())){let l=`${s.displayName} (${s.identifier})`;e.push({label:l,kind:6,insertText:`${s.displayName} => ${s.displayName}`,filterText:`${s.displayName} ${s.identifier}`,documentation:`Read model: ${s.displayName} (${s.identifier})`,detail:s.identifier,range:this.getRangeForWord(t)})}})}}addEventTypeCompletions(e,t){Object.keys(this.eventSchemas).forEach(n=>{if(!t.currentWord||n.startsWith(t.currentWord)){let r=this.eventSchemas[n];e.push({label:n,kind:6,insertText:n,documentation:this.getSchemaDescription(r)||`Event type: ${n}`,detail:"Event Type",range:this.getRangeForWord(t)})}})}addEventSequenceCompletions(e,t){this.eventSequences.forEach(n=>{(!t.currentWord||n.startsWith(t.currentWord))&&e.push({label:n,kind:13,insertText:n,documentation:`Event sequence: ${n}`,detail:"Event Sequence",range:this.getRangeForWord(t)})})}addKeyCompletions(e,t,n){n?.definitions&&Object.keys(n.definitions).forEach(r=>{n.definitions[r].type==="object"&&e.push({label:r,kind:6,insertText:r,documentation:`Composite key type: ${r}`,detail:"Composite Key Type",range:this.getRangeForWord(t)})}),this.addExpressionCompletions(e,t)}addParentCompletions(e,t){this.addExpressionCompletions(e,t)}addNumericPropertyCompletions(e,t,n){n?.properties&&Object.entries(n.properties).forEach(([o,s])=>{(s.type==="integer"||s.type==="number")&&(!t.currentWord||o.startsWith(t.currentWord))&&e.push({label:o,kind:9,insertText:o,documentation:`Numeric property: ${o}`,detail:this.getPropertyTypeDescription(s),range:this.getRangeForWord(t)})});let r=t.textBeforeCursor.match(/\b(add|subtract)\s+(\w*)$/);if(r){let o=r[2]||"";n?.properties&&Object.entries(n.properties).forEach(([s,l])=>{(l.type==="integer"||l.type==="number")&&(!o||s.startsWith(o))&&e.push({label:s,kind:9,insertText:`${s} by `,documentation:`Numeric property: ${s}`,detail:this.getPropertyTypeDescription(l),range:this.getRangeForWord(t)})})}}addChildrenCompletions(e,t,n){n?.properties&&Object.entries(n.properties).forEach(([r,o])=>{(o.type==="array"||o.items)&&e.push({label:r,kind:9,insertText:`${r} id `,documentation:`Collection property: ${r}`,detail:this.getPropertyTypeDescription(o),range:this.getRangeForWord(t)})})}addJoinCompletions(e,t,n){let r=t.textBeforeCursor.trim();r==="join"||!r.includes(" ")?n?.properties&&Object.entries(n.properties).forEach(([o,s])=>{(s.type==="array"||s.items)&&e.push({label:o,kind:9,insertText:`${o} on `,documentation:`Join on collection: ${o}`,range:this.getRangeForWord(t)})}):r.match(/join\s+\w+\s+on\s+/)&&n?.properties&&Object.keys(n.properties).forEach(o=>{e.push({label:o,kind:9,insertText:o,documentation:`Property: ${o}`,range:this.getRangeForWord(t)})})}addVariantNameCompletions(e,t){this.readModels.forEach(n=>{(!t.currentWord||n.displayName.toLowerCase().startsWith(t.currentWord.toLowerCase()))&&e.push({label:n.displayName,kind:6,insertText:n.displayName,documentation:`Read model: ${n.displayName} (${n.identifier})`,detail:n.identifier,range:this.getRangeForWord(t)})})}addStatementCompletions(e,t,n){[{label:"description",insertText:'description ""',documentation:"Report-only description on the projection header only",detail:'description "<text>"'},{label:"sequence",insertText:"sequence ",documentation:"Specify which event sequence to use for this projection",detail:"sequence <event-sequence-id>"},{label:"variant",insertText:"variant ",documentation:"Declare one of several mutually exclusive named read models sharing this projection's identity",detail:"variant <Name>"},{label:"enters on",insertText:"enters on ",documentation:"Declare the event that activates a variant",detail:"enters on <EventType>"},{label:"from",insertText:"from ",documentation:"Handle specific event types",detail:"from <EventType>"},{label:"all",insertText:"all",documentation:"Subscribe to all event types in the system \u2014 mappings run for every event system-wide, regardless of explicit from blocks",detail:"all"},{label:"every",insertText:"every",documentation:"Handle all events for automatic mapping (only events explicitly subscribed to via from blocks)",detail:"every"},{label:"key",insertText:"key ",documentation:"Define the projection key",detail:"key <expression>"},{label:"parent",insertText:"parent ",documentation:"Define parent relationship",detail:"parent <expression>"},{label:"join",insertText:"join ",documentation:"Join with child collection",detail:"join <collection> on <property>"},{label:"children",insertText:"children ",documentation:"Define child collection operations",detail:"children <collection> identified by <expression>"},{label:"remove with",insertText:"remove with ",documentation:"Remove items based on event",detail:"remove with <EventType>"},{label:"remove via",insertText:"remove via join on ",documentation:"Remove items via join",detail:"remove via join on <EventType>"},{label:"no automap",insertText:"no automap",documentation:"Disable automatic property mapping",detail:"no automap"},{label:"clear",insertText:"clear ",documentation:"Remove the value a property holds",detail:"clear <property>"},{label:"increment",insertText:"increment ",documentation:"Increment a numeric property",detail:"increment <property>"},{label:"decrement",insertText:"decrement ",documentation:"Decrement a numeric property",detail:"decrement <property>"},{label:"count",insertText:"count ",documentation:"Count occurrences",detail:"count <property>"},{label:"add",insertText:"add ",documentation:"Add value to property",detail:"add <property> by <expression>"},{label:"subtract",insertText:"subtract ",documentation:"Subtract value from property",detail:"subtract <property> by <expression>"},{label:"exclude children",insertText:"exclude children",documentation:"Exclude child collections from automap",detail:"exclude children"}].forEach(o=>{(!t.currentWord||o.label.startsWith(t.currentWord))&&e.push({label:o.label,kind:14,insertText:o.insertText,documentation:o.documentation,detail:o.detail,range:this.getRangeForWord(t)})}),n?.properties&&Object.entries(n.properties).forEach(([o,s])=>{(!t.currentWord||o.startsWith(t.currentWord))&&e.push({label:o,kind:9,insertText:`${o} = `,documentation:`Assign value to property: ${o}`,detail:this.getPropertyTypeDescription(s),range:this.getRangeForWord(t)})})}addAssignmentValueCompletions(e,t,n,r){let o=this.getCurrentEventType(n,r.lineNumber);if(o&&this.eventSchemas[o]){let s=this.eventSchemas[o];s.properties&&Object.entries(s.properties).forEach(([l,f])=>{e.push({label:l,kind:9,insertText:l,documentation:`Event property: ${l}`,detail:this.getPropertyTypeDescription(f),range:this.getRangeForWord(t)})})}this.addExpressionCompletions(e,t)}addExpressionCompletions(e,t){[{label:"$eventSourceId",insertText:"$eventSourceId",documentation:"The identifier of the event source (aggregate/entity)",detail:"Event Source Expression"},{label:"$causedBy",insertText:"$causedBy",documentation:"The identity that caused the event. Chronicle cannot yet evaluate this short form (Cratis/Chronicle#4119) - prefer $eventContext.causedBy.<property>.",detail:"Identity Expression"},{label:"$eventContext",insertText:"$eventContext.",documentation:`Metadata about the event: ${ne.map(r=>r.name).join(", ")}`,detail:"Event Context Expression"}].forEach(r=>{(!t.currentWord||r.label.startsWith(t.currentWord)||r.label.startsWith("$"+t.currentWord))&&e.push({label:r.label,kind:14,insertText:r.insertText,documentation:r.documentation,detail:r.detail,range:this.getRangeForWord(t)})})}addPropertyMemberCompletions(e,t){let n=t.textBeforeCursor.match(le);if(n){let c=n[1].split(".").filter(u=>u.length>0);this.addEventContextMemberCompletions(e,t,c,n[2]);return}let r=t.textBeforeCursor.match(/(\w+|\$\w+)\.(\w*)$/);if(!r)return;let[,o,s]=r,l=t.textBeforeCursor.match(/\$causedBy\.((?:\w+\.)*)(\w*)$/);if(l){let c=l[1].split(".").filter(u=>u.length>0);this.addEventContextMemberCompletions(e,t,["causedBy",...c],l[2]);return}let f=this.eventSchemas[o];f?.properties&&Object.entries(f.properties).forEach(([c,u])=>{(!s||c.startsWith(s))&&e.push({label:c,kind:9,insertText:c,documentation:`Event property: ${c}`,detail:this.getPropertyTypeDescription(u),range:this.getRangeForWord(t)})})}addEventContextMemberCompletions(e,t,n,r){(re(n)??[]).filter(s=>!r||s.name.startsWith(r)).forEach(s=>{e.push({label:s.name,kind:s.kind==="function"?1:9,insertText:s.name,documentation:s.description,detail:s.type,range:this.getRangeForWord(t)})})}getCurrentEventType(e,t){for(let n=t;n>=1;n--){let r=e.getLineContent(n).trim(),o=r.match(/^from\s+([\w-]+)/);if(o)return o[1];if(r.match(/^every$/))return null}return null}getActiveReadModelSchema(e){let n=e.getLineContent(1).trim().match(/^projection\s+[\w.]+\s*=>\s*([\w.]+)/);if(!n)return;let r=n[1];return this.resolveReadModelInfo(r)?.schema}resolveReadModelInfo(e){return this.readModels.find(t=>t.identifier===e||t.displayName===e)||null}getSchemaName(e){if(e.name)return e.name;if(e.title)return e.title;if(typeof e.$id=="string"){let t=e.$id.split("/");return t[t.length-1]||e.$id}}getSchemaDescription(e){return e.description||void 0}getPropertyTypeDescription(e){return e.type==="array"&&e.items?`${e.items.type||e.items.$id?.split("/").pop()||"unknown"}[]`:e.type||e.$ref?.split("/").pop()||"unknown"}getRangeForWord(e){let t=e.textBeforeCursor.length-e.currentWord.length+1,n=t+e.currentWord.length;return{startLineNumber:e.lineNumber,startColumn:Math.max(1,t),endLineNumber:e.lineNumber,endColumn:Math.max(1,n)}}};var A=class{static{b(this,"Validator")}readModels=[];eventSchemas={};draftReadModel=null;setReadModels(e){this.readModels=e||[]}setDraftReadModel(e){this.draftReadModel=e}setReadModelSchemas(e){this.readModels=e.map(t=>({identifier:this.getSchemaName(t)||"",displayName:this.getSchemaName(t)||"",schema:t}))}setEventSchemas(e){if(!e){this.eventSchemas={};return}if(Array.isArray(e)){let t={};e.forEach((n,r)=>{if(!n)return;let o=this.getSchemaName(n)||`Event${r+1}`;t[o]=n}),this.eventSchemas=t;return}this.eventSchemas=e}validate(e){let t=[],n=e.getValue();if(!n.trim())return t;let r=n.replace(/\r\n/g,`
2
2
  `).replace(/\r/g,`
3
3
  `).split(`
4
4
  `),o=0,s="";for(let m=0;m<r.length;m++){let p=r[m].trim();if(p&&!p.startsWith("#")){o=m,s=p;break}}if(!s)return t;let l=s.match(/^projection\s+([\w.]+)\s*=>\s*([\w.]+)\s*$/),f=!l&&s.match(/^projection\s+([\w.]+)\s*$/);if(!l&&!f){let m=o+1;return t.push(this.createError(m,1,s.length+1,'Projection definition must start with "projection <ProjectionName>" or "projection <ProjectionName> => <ReadModelIdentifier>"')),t}let c,u=null;if(l){u=l[2];let m=this.resolveReadModelIdentifier(u)!==null,p=this.isDraftReadModel(u),v=this.getReadModelStartColumn(s,u);if(!m&&!p){let S=o+1,N=v;t.push(this.createError(S,N,N+u.length,`Read model '${u}' not found`))}else if(p){let S=o+1,N=v;t.push(this.createInfo(S,N,N+u.length,`Read model '${u}' is a draft (not yet saved)`))}let R=this.isDraftReadModel(u),w=R?null:this.resolveReadModelInfo(u);c=R?this.draftReadModel.schema:w?.schema}let g=[c],M=[0],x=0,C=[new Map];for(let m=1;m<r.length;m++){let p=m+1,v=r[m],R=v.trim();if(!R||R.startsWith("#"))continue;let w=v.search(/\S/);for(;w<x&&M.length>1;){let i=M.pop();i!==void 0&&w<i&&(g.pop(),C.pop())}x=w;let S=C[C.length-1],N=R.match(/^from\s+([\w-]+)/);if(N){let i=N[1],a=v.indexOf(i)+1;Object.keys(this.eventSchemas).length>0&&!this.eventSchemas[i]&&t.push(this.createError(p,a,a+i.length,`Event type '${i}' not found`)),S.has(i)?t.push(this.createError(p,a,a+i.length,`Duplicate event type '${i}' - event types can only be used once at each level`)):S.set(i,{lineNumber:p,col:a})}let _=R.match(/^variant\s+([\w.]+)\s*$/);if(_){let[,i]=_,a=v.indexOf(i)+1,y=this.isDraftReadModel(i);!(this.resolveReadModelIdentifier(i)!==null)&&!y?t.push(this.createError(p,a,a+i.length,`Read model '${i}' not found`)):y&&t.push(this.createInfo(p,a,a+i.length,`Read model '${i}' is a draft (not yet saved)`));let F=y?this.draftReadModel.schema:this.resolveReadModelInfo(i)?.schema;g.push(F),M.push(w),C.push(new Map)}let z=R.match(/^enters\s+on\s+([\w-]+)/);if(z){let i=z[1],a=v.indexOf(i)+1;Object.keys(this.eventSchemas).length>0&&!this.eventSchemas[i]&&t.push(this.createError(p,a,a+i.length,`Event type '${i}' not found`)),S.has(i)?t.push(this.createError(p,a,a+i.length,`Duplicate event type '${i}' - event types can only be used once at each level`)):S.set(i,{lineNumber:p,col:a})}let U=R.match(/^events\s+([\w-]+)/);if(U){let i=U[1],a=v.indexOf(i)+1;Object.keys(this.eventSchemas).length>0&&!this.eventSchemas[i]&&t.push(this.createError(p,a,a+i.length,`Event type '${i}' not found`)),S.has(i)?t.push(this.createError(p,a,a+i.length,`Duplicate event type '${i}' - event types can only be used once at each level`)):S.set(i,{lineNumber:p,col:a})}let V=R.match(/^remove\s+(?:with|via\s+join\s+on)\s+([\w-]+)/);if(V){let i=V[1],a=v.indexOf(i)+1;Object.keys(this.eventSchemas).length>0&&!this.eventSchemas[i]&&t.push(this.createError(p,a,a+i.length,`Event type '${i}' not found`)),S.has(i)?t.push(this.createError(p,a,a+i.length,`Duplicate event type '${i}' - event types can only be used once at each level`)):S.set(i,{lineNumber:p,col:a})}let Z=R.match(/^(\w+)\s*=\s*(.+)$/);if(Z){let i=g[g.length-1];if(i?.properties){let[,a]=Z;if(!i.properties[a]){let y=v.indexOf(a)+1,h=this.getSchemaName(i)||"current schema";t.push(this.createWarning(p,y,y+a.length,`Property '${a}' not found in ${h}`))}}}let X=R.match(/^(?:increment|decrement|count)\s+(\w+)$/);if(X){let i=g[g.length-1];if(i?.properties){let[,a]=X;if(!i.properties[a]){let y=v.indexOf(a)+1,h=this.getSchemaName(i)||"current schema";t.push(this.createWarning(p,y,y+a.length,`Property '${a}' not found in ${h}`))}}}let Y=R.match(/^(?:add|subtract)\s+(\w+)\s+by\s+/);if(Y){let i=g[g.length-1];if(i?.properties){let[,a]=Y;if(!i.properties[a]){let y=v.indexOf(a)+1,h=this.getSchemaName(i)||"current schema";t.push(this.createWarning(p,y,y+a.length,`Property '${a}' not found in ${h}`))}}}let G=R.match(/^children\s+(\w+)\s+identified\s+by\s+/);if(G){let i=g[g.length-1];if(i?.properties){let[,a]=G,y=i.properties[a];if(y)if(y.type!=="array"&&!y.items){let h=v.indexOf(a)+1;t.push(this.createWarning(p,h,h+a.length,`Property '${a}' is not a collection (array) type`))}else{let h=y.items;h&&(g.push(h),M.push(w),C.push(new Map))}else{let h=v.indexOf(a)+1,F=this.getSchemaName(i)||"current schema";t.push(this.createWarning(p,h,h+a.length,`Collection property '${a}' not found in ${F}`))}}}let Q=R.match(/^join\s+(\w+)\s+on\s+(\w+)/);if(Q&&c?.properties){let[,i,a]=Q,y=c.properties[i];if(y){if(y.type!=="array"&&!y.items){let h=v.indexOf(i)+1;t.push(this.createWarning(p,h,h+i.length,`Property '${i}' is not a collection (array) type`))}}else{let h=v.indexOf(i)+1;t.push(this.createWarning(p,h,h+i.length,`Collection property '${i}' not found in read model '${u}'`))}if(!c.properties[a]){let h=v.indexOf(a,v.indexOf("on"))+1;t.push(this.createWarning(p,h,h+a.length,`Property '${a}' not found in read model '${u}'`))}C.push(new Map),M.push(w)}let ee=R.match(/^key\s+(\w+)\s*$/);if(ee&&c){let[,i]=ee,a=c.definitions&&c.definitions[i],y=c.properties&&c.properties[i];if(!a&&!y&&!this.isBuiltInExpression(i)){let h=v.indexOf(i)+1;t.push(this.createWarning(p,h,h+i.length,`Composite key type '${i}' not found in read model schema`))}}}for(let m of se(r,te(r)))t.push({severity:m.severity==="error"?8:4,startLineNumber:m.line+1,endLineNumber:m.line+1,startColumn:m.startColumn,endColumn:m.endColumn,message:m.message,code:m.code});return t}resolveReadModelInfo(e){return this.readModels.find(t=>t.identifier===e||t.displayName===e)||null}getReadModelStartColumn(e,t){let n=e.match(/^\s*projection\s+[\w.]+\s*=>\s*/);if(!n){let r=e.lastIndexOf(t);return(r>=0?r:0)+1}return n[0].length+1}resolveReadModelIdentifier(e){return this.isDraftReadModel(e)?this.draftReadModel.identifier:this.resolveReadModelInfo(e)?.identifier??null}isDraftReadModel(e){return!!this.draftReadModel&&(this.draftReadModel.identifier===e||this.draftReadModel.displayName===e)}isBuiltInExpression(e){return e.startsWith("$")||["true","false","null"].includes(e)}createError(e,t,n,r){return{severity:8,startLineNumber:e,startColumn:t,endLineNumber:e,endColumn:n,message:r}}createWarning(e,t,n,r){return{severity:4,startLineNumber:e,startColumn:t,endLineNumber:e,endColumn:n,message:r}}createInfo(e,t,n,r){return{severity:2,startLineNumber:e,startColumn:t,endLineNumber:e,endColumn:n,message:r}}getSchemaName(e){if(e.name)return e.name;if(e.title)return e.title;if(typeof e.$id=="string"){let t=e.$id.split("/");return t[t.length-1]||e.$id}}};var W=class{static{b(this,"HoverProvider")}readModels=[];eventSchemas={};draftReadModel=null;setReadModels(e){this.readModels=e||[]}setReadModelSchemas(e){this.readModels=e.map(t=>({identifier:this.getSchemaName(t)||"",displayName:this.getSchemaName(t)||"",schema:t}))}setEventSchemas(e){if(!e){this.eventSchemas={};return}if(Array.isArray(e)){let t={};e.forEach((n,r)=>{if(!n)return;let o=this.getSchemaName(n)||`Event${r+1}`;t[o]=n}),this.eventSchemas=t;return}this.eventSchemas=e}setDraftReadModel(e){this.draftReadModel=e}provideHover(e,t){let n=e.getWordAtPosition(t);if(!n)return null;let r=n.word,o=e.getLineContent(t.lineNumber);if(this.getProjectionNameAtPosition(o,t.column))return{contents:[{value:"The name of the projection"}],range:{startLineNumber:t.lineNumber,startColumn:n.startColumn,endLineNumber:t.lineNumber,endColumn:n.endColumn}};let l=this.getEventContextInfo(o,n.startColumn);if(l)return{contents:[{value:l}],range:{startLineNumber:t.lineNumber,startColumn:n.startColumn,endLineNumber:t.lineNumber,endColumn:n.endColumn}};let f=this.getKeywordInfo(r);if(f)return{contents:[{value:f}],range:{startLineNumber:t.lineNumber,startColumn:n.startColumn,endLineNumber:t.lineNumber,endColumn:n.endColumn}};let c=this.getExpressionInfo(r);if(c)return{contents:[{value:c}],range:{startLineNumber:t.lineNumber,startColumn:n.startColumn,endLineNumber:t.lineNumber,endColumn:n.endColumn}};if(this.eventSchemas[r]){let M=this.eventSchemas[r],x=this.getSchemaDescription(M),C=this.getSchemaProperties(M),m=`**Event Type:** \`${r}\`
@@ -1 +1 @@
1
- {"version":3,"file":"language.d.ts","sourceRoot":"","sources":["../language.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,MAAM,MAAM,GAAG,cAAc,eAAe,CAAC,CAAC;AAEpD,eAAO,MAAM,UAAU,eAAe,CAAC;AAEvC,eAAO,MAAM,sBAAsB,EAAE,SAAS,CAAC,uBAK9C,CAAC;AAMF,eAAO,MAAM,iBAAiB,UAuC7B,CAAC;AAGF,eAAO,MAAM,oBAAoB,UAAe,CAAC;AAEjD,eAAO,MAAM,cAAc,UAgI1B,CAAC;AAEF,eAAO,MAAM,aAAa,UAAmD,CAAC;AAG9E,eAAO,MAAM,YAAY,UAQxB,CAAC;AAEF,eAAO,MAAM,kBAAkB,UAAkC,CAAC;AAIlE,eAAO,MAAM,kBAAkB,UAAmE,CAAC;AAEnG,eAAO,MAAM,UAAU,UAA0D,CAAC;AAElF,eAAO,MAAM,cAAc,UAAmE,CAAC;AAE/F,eAAO,MAAM,iBAAiB,UAAgC,CAAC;AAI/D,eAAO,MAAM,kBAAkB,QAAgW,CAAC;AAEhY,eAAO,MAAM,qBAAqB,EAAE,SAAS,CAAC,qBAgC7C,CAAC"}
1
+ {"version":3,"file":"language.d.ts","sourceRoot":"","sources":["../language.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,MAAM,MAAM,GAAG,cAAc,eAAe,CAAC,CAAC;AAEpD,eAAO,MAAM,UAAU,eAAe,CAAC;AAEvC,eAAO,MAAM,sBAAsB,EAAE,SAAS,CAAC,uBAK9C,CAAC;AAMF,eAAO,MAAM,iBAAiB,UAyC7B,CAAC;AAGF,eAAO,MAAM,oBAAoB,UAAe,CAAC;AAEjD,eAAO,MAAM,cAAc,UAqI1B,CAAC;AAEF,eAAO,MAAM,aAAa,UAAmD,CAAC;AAG9E,eAAO,MAAM,YAAY,UAQxB,CAAC;AAEF,eAAO,MAAM,kBAAkB,UAAkC,CAAC;AAIlE,eAAO,MAAM,kBAAkB,UAAmE,CAAC;AAEnG,eAAO,MAAM,UAAU,UAA0D,CAAC;AAElF,eAAO,MAAM,cAAc,UAAmE,CAAC;AAE/F,eAAO,MAAM,iBAAiB,UAAgC,CAAC;AAI/D,eAAO,MAAM,kBAAkB,QAAgW,CAAC;AAEhY,eAAO,MAAM,qBAAqB,EAAE,SAAS,CAAC,qBAgC7C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cratis/screenplay-language",
3
- "version": "4.118.0",
3
+ "version": "4.120.0",
4
4
  "description": "Monaco language service for the Cratis Screenplay DSL — syntax highlighting, IntelliSense, hover and diagnostics for .play files",
5
5
  "keywords": [
6
6
  "cratis",