@cratis/screenplay-language 4.106.0 → 4.108.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,32 +1,32 @@
1
- import{F as ne,G as re,H as ie,I as q,J as oe,db as se,y as te}from"../../chunk-KWZDFRXS.js";import{a as C}from"../../chunk-AYDF3IFZ.js";var E="pdl",ce=["projection","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{C(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 i=this.getSchemaName(n)||`Event${r+1}`;t[i]=n}),this.eventSchemas=t;return}this.eventSchemas=e}provideCompletionItems(e,t){let n=this.buildContext(e,t),r=[],i=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,i):this.isAfterKeyword(n,"parent")?this.addParentCompletions(r,n):this.isAfterKeyword(n,"children")?this.addChildrenCompletions(r,n,i):this.isAfterKeyword(n,"join")?this.addJoinCompletions(r,n,i):this.isAfterKeyword(n,"with")?this.addEventTypeCompletions(r,n):this.isAfterNumericOperationKeyword(n)?this.addNumericPropertyCompletions(r,n,i):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,i),{suggestions:r}}buildContext(e,t){let n=e.getLineContent(t.lineNumber),r=n.substring(0,t.column-1),i=n.substring(t.column-1),l=e.getWordAtPosition(t)?.word||"",f=this.getIndentLevel(r);return{lineContent:n,textBeforeCursor:r,textAfterCursor:i,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 i=r[1]||"";this.readModels.forEach(s=>{if(!i||s.displayName.toLowerCase().startsWith(i.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 i=n.substring(11);this.readModels.forEach(s=>{if(!i||s.displayName.toLowerCase().startsWith(i.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(([i,s])=>{(s.type==="integer"||s.type==="number")&&(!t.currentWord||i.startsWith(t.currentWord))&&e.push({label:i,kind:9,insertText:i,documentation:`Numeric property: ${i}`,detail:this.getPropertyTypeDescription(s),range:this.getRangeForWord(t)})});let r=t.textBeforeCursor.match(/\b(add|subtract)\s+(\w*)$/);if(r){let i=r[2]||"";n?.properties&&Object.entries(n.properties).forEach(([s,l])=>{(l.type==="integer"||l.type==="number")&&(!i||s.startsWith(i))&&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,i])=>{(i.type==="array"||i.items)&&e.push({label:r,kind:9,insertText:`${r} id `,documentation:`Collection property: ${r}`,detail:this.getPropertyTypeDescription(i),range:this.getRangeForWord(t)})})}addJoinCompletions(e,t,n){let r=t.textBeforeCursor.trim();r==="join"||!r.includes(" ")?n?.properties&&Object.entries(n.properties).forEach(([i,s])=>{(s.type==="array"||s.items)&&e.push({label:i,kind:9,insertText:`${i} on `,documentation:`Join on collection: ${i}`,range:this.getRangeForWord(t)})}):r.match(/join\s+\w+\s+on\s+/)&&n?.properties&&Object.keys(n.properties).forEach(i=>{e.push({label:i,kind:9,insertText:i,documentation:`Property: ${i}`,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:"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(i=>{(!t.currentWord||i.label.startsWith(t.currentWord))&&e.push({label:i.label,kind:14,insertText:i.insertText,documentation:i.documentation,detail:i.detail,range:this.getRangeForWord(t)})}),n?.properties&&Object.entries(n.properties).forEach(([i,s])=>{(!t.currentWord||i.startsWith(t.currentWord))&&e.push({label:i,kind:9,insertText:`${i} = `,documentation:`Assign value to property: ${i}`,detail:this.getPropertyTypeDescription(s),range:this.getRangeForWord(t)})})}addAssignmentValueCompletions(e,t,n,r){let i=this.getCurrentEventType(n,r.lineNumber);if(i&&this.eventSchemas[i]){let s=this.eventSchemas[i];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[,i,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[i];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(),i=r.match(/^from\s+([\w-]+)/);if(i)return i[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{C(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 i=this.getSchemaName(n)||`Event${r+1}`;t[i]=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-GYLT45QG.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
- `),i=0,s="";for(let m=0;m<r.length;m++){let p=r[m].trim();if(p&&!p.startsWith("#")){i=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=i+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=i+1,N=v;t.push(this.createError(S,N,N+u.length,`Read model '${u}' not found`))}else if(p){let S=i+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,b=[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 o=M.pop();o!==void 0&&w<o&&(g.pop(),b.pop())}x=w;let S=b[b.length-1],N=R.match(/^from\s+([\w-]+)/);if(N){let o=N[1],a=v.indexOf(o)+1;Object.keys(this.eventSchemas).length>0&&!this.eventSchemas[o]&&t.push(this.createError(p,a,a+o.length,`Event type '${o}' not found`)),S.has(o)?t.push(this.createError(p,a,a+o.length,`Duplicate event type '${o}' - event types can only be used once at each level`)):S.set(o,{lineNumber:p,col:a})}let _=R.match(/^variant\s+([\w.]+)\s*$/);if(_){let[,o]=_,a=v.indexOf(o)+1,y=this.isDraftReadModel(o);!(this.resolveReadModelIdentifier(o)!==null)&&!y?t.push(this.createError(p,a,a+o.length,`Read model '${o}' not found`)):y&&t.push(this.createInfo(p,a,a+o.length,`Read model '${o}' is a draft (not yet saved)`));let F=y?this.draftReadModel.schema:this.resolveReadModelInfo(o)?.schema;g.push(F),M.push(w),b.push(new Map)}let z=R.match(/^enters\s+on\s+([\w-]+)/);if(z){let o=z[1],a=v.indexOf(o)+1;Object.keys(this.eventSchemas).length>0&&!this.eventSchemas[o]&&t.push(this.createError(p,a,a+o.length,`Event type '${o}' not found`)),S.has(o)?t.push(this.createError(p,a,a+o.length,`Duplicate event type '${o}' - event types can only be used once at each level`)):S.set(o,{lineNumber:p,col:a})}let U=R.match(/^events\s+([\w-]+)/);if(U){let o=U[1],a=v.indexOf(o)+1;Object.keys(this.eventSchemas).length>0&&!this.eventSchemas[o]&&t.push(this.createError(p,a,a+o.length,`Event type '${o}' not found`)),S.has(o)?t.push(this.createError(p,a,a+o.length,`Duplicate event type '${o}' - event types can only be used once at each level`)):S.set(o,{lineNumber:p,col:a})}let V=R.match(/^remove\s+(?:with|via\s+join\s+on)\s+([\w-]+)/);if(V){let o=V[1],a=v.indexOf(o)+1;Object.keys(this.eventSchemas).length>0&&!this.eventSchemas[o]&&t.push(this.createError(p,a,a+o.length,`Event type '${o}' not found`)),S.has(o)?t.push(this.createError(p,a,a+o.length,`Duplicate event type '${o}' - event types can only be used once at each level`)):S.set(o,{lineNumber:p,col:a})}let Z=R.match(/^(\w+)\s*=\s*(.+)$/);if(Z){let o=g[g.length-1];if(o?.properties){let[,a]=Z;if(!o.properties[a]){let y=v.indexOf(a)+1,h=this.getSchemaName(o)||"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 o=g[g.length-1];if(o?.properties){let[,a]=X;if(!o.properties[a]){let y=v.indexOf(a)+1,h=this.getSchemaName(o)||"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 o=g[g.length-1];if(o?.properties){let[,a]=Y;if(!o.properties[a]){let y=v.indexOf(a)+1,h=this.getSchemaName(o)||"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 o=g[g.length-1];if(o?.properties){let[,a]=G,y=o.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),b.push(new Map))}else{let h=v.indexOf(a)+1,F=this.getSchemaName(o)||"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[,o,a]=Q,y=c.properties[o];if(y){if(y.type!=="array"&&!y.items){let h=v.indexOf(o)+1;t.push(this.createWarning(p,h,h+o.length,`Property '${o}' is not a collection (array) type`))}}else{let h=v.indexOf(o)+1;t.push(this.createWarning(p,h,h+o.length,`Collection property '${o}' 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}'`))}b.push(new Map),M.push(w)}let ee=R.match(/^key\s+(\w+)\s*$/);if(ee&&c){let[,o]=ee,a=c.definitions&&c.definitions[o],y=c.properties&&c.properties[o];if(!a&&!y&&!this.isBuiltInExpression(o)){let h=v.indexOf(o)+1;t.push(this.createWarning(p,h,h+o.length,`Composite key type '${o}' 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{C(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 i=this.getSchemaName(n)||`Event${r+1}`;t[i]=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,i=e.getLineContent(t.lineNumber);if(this.getProjectionNameAtPosition(i,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(i,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),b=this.getSchemaProperties(M),m=`**Event Type:** \`${r}\`
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}\`
5
5
 
6
6
  `;return x&&(m+=`${x}
7
7
 
8
- `),b.length>0&&(m+=`**Properties:**
8
+ `),C.length>0&&(m+=`**Properties:**
9
9
 
10
- ${b.map(p=>`- \`${p.name}\`: ${p.type}`).join(`
11
- `)}`),{contents:[{value:m}],range:{startLineNumber:t.lineNumber,startColumn:n.startColumn,endLineNumber:t.lineNumber,endColumn:n.endColumn}}}if(this.isDraftReadModel(r)){let M=this.getSchemaDescription(this.draftReadModel.schema),x=this.getSchemaProperties(this.draftReadModel.schema),b=this.draftReadModel.identifier,p=`**Read Model (Draft):** \`${this.draftReadModel.displayName}\`
10
+ ${C.map(p=>`- \`${p.name}\`: ${p.type}`).join(`
11
+ `)}`),{contents:[{value:m}],range:{startLineNumber:t.lineNumber,startColumn:n.startColumn,endLineNumber:t.lineNumber,endColumn:n.endColumn}}}if(this.isDraftReadModel(r)){let M=this.getSchemaDescription(this.draftReadModel.schema),x=this.getSchemaProperties(this.draftReadModel.schema),C=this.draftReadModel.identifier,p=`**Read Model (Draft):** \`${this.draftReadModel.displayName}\`
12
12
 
13
- **Identifier:** \`${b}\`
13
+ **Identifier:** \`${C}\`
14
14
 
15
15
  `;return M&&(p+=`${M}
16
16
 
17
17
  `),x.length>0&&(p+=`**Properties:**
18
18
 
19
19
  ${x.map(v=>`- \`${v.name}\`: ${v.type}`).join(`
20
- `)}`),{contents:[{value:p}],range:{startLineNumber:t.lineNumber,startColumn:n.startColumn,endLineNumber:t.lineNumber,endColumn:n.endColumn}}}let u=this.resolveReadModelInfo(r);if(u){let M=this.getSchemaDescription(u.schema),x=this.getSchemaProperties(u.schema),b=`**Read Model:** \`${u.displayName}\`
20
+ `)}`),{contents:[{value:p}],range:{startLineNumber:t.lineNumber,startColumn:n.startColumn,endLineNumber:t.lineNumber,endColumn:n.endColumn}}}let u=this.resolveReadModelInfo(r);if(u){let M=this.getSchemaDescription(u.schema),x=this.getSchemaProperties(u.schema),C=`**Read Model:** \`${u.displayName}\`
21
21
 
22
22
  **Identifier:** \`${u.identifier}\`
23
23
 
24
- `;return M&&(b+=`${M}
24
+ `;return M&&(C+=`${M}
25
25
 
26
- `),x.length>0&&(b+=`**Properties:**
26
+ `),x.length>0&&(C+=`**Properties:**
27
27
 
28
28
  ${x.map(m=>`- \`${m.name}\`: ${m.type}`).join(`
29
- `)}`),{contents:[{value:b}],range:{startLineNumber:t.lineNumber,startColumn:n.startColumn,endLineNumber:t.lineNumber,endColumn:n.endColumn}}}let g=this.getPropertyInfo(e,t,r);return g?{contents:[{value:g}],range:{startLineNumber:t.lineNumber,startColumn:n.startColumn,endLineNumber:t.lineNumber,endColumn:n.endColumn}}:null}getKeywordInfo(e){return{projection:"**projection** - Defines a projection that transforms events into a read model",from:`**from** *<EventType>*
29
+ `)}`),{contents:[{value:C}],range:{startLineNumber:t.lineNumber,startColumn:n.startColumn,endLineNumber:t.lineNumber,endColumn:n.endColumn}}}let g=this.getPropertyInfo(e,t,r);return g?{contents:[{value:g}],range:{startLineNumber:t.lineNumber,startColumn:n.startColumn,endLineNumber:t.lineNumber,endColumn:n.endColumn}}:null}getKeywordInfo(e){return{description:"**description** - Report-only intent on the projection header, as quoted or fenced text. Not accepted on variants or nested blocks; adds no executable bytes.",projection:"**projection** - Defines a projection that transforms events into a read model",from:`**from** *<EventType>*
30
30
 
31
31
  Handles specific event types and maps their properties to the read model.`,all:"**all**\n\nSubscribes to **all event types in the system**, regardless of explicit `from` blocks. Mappings inside `all` run for every event that arrives system-wide.",every:"**every**\n\nHandles all events the projection **explicitly subscribes to** through `from` blocks, with automatic property mapping.",key:`**key** *<expression>*
32
32
 
@@ -62,14 +62,14 @@ Declares one of several mutually exclusive named read models sharing the project
62
62
 
63
63
  Declares the event that activates this variant - the only event allowed to create it. Every other event the variant subscribes to is update-only.`}[e]||null}getExpressionInfo(e){return{$eventSourceId:`**$eventSourceId**
64
64
 
65
- The identifier of the event source (aggregate/entity) that generated the event.`,$causedBy:"**$causedBy**\n\nThe identity that caused the event - `subject`, `name`, `userName` or `onBehalfOf`, itself an identity.\n\nChronicle cannot yet evaluate this short form (Cratis/Chronicle#4119); prefer **$eventContext.causedBy**.*property*.",$eventContext:q()}[e]||null}getEventContextInfo(e,t){for(let n of e.matchAll(/\$eventContext((?:\.\w+(?:\(\))?)*)/g)){let r=(n.index??0)+1;if(t===r)return q();r+=13;let i=n[1].split(".").slice(1);for(let s=0;s<i.length;s++){if(r+=1,t===r){let l=i.slice(0,s+1),f=ie(l);return f?oe(l.join("."),f):null}r+=i[s].length}}return null}getPropertyInfo(e,t,n){let i=e.getLineContent(1).trim().match(/^projection\s+[\w.]+\s*=>\s*([\w.]+)/);if(!i)return null;let s=i[1],l=this.isDraftReadModel(s)?this.draftReadModel:null,f=l?null:this.resolveReadModelInfo(s),c=l?.schema||f?.schema;if(c?.properties&&c.properties[n]){let g=c.properties[n],M=this.getPropertyTypeDescription(g),x=g.description,b=`**Property:** \`${n}\`
65
+ The identifier of the event source (aggregate/entity) that generated the event.`,$causedBy:"**$causedBy**\n\nThe identity that caused the event - `subject`, `name`, `userName` or `onBehalfOf`, itself an identity.\n\nChronicle cannot yet evaluate this short form (Cratis/Chronicle#4119); prefer **$eventContext.causedBy**.*property*.",$eventContext:q()}[e]||null}getEventContextInfo(e,t){for(let n of e.matchAll(/\$eventContext((?:\.\w+(?:\(\))?)*)/g)){let r=(n.index??0)+1;if(t===r)return q();r+=13;let o=n[1].split(".").slice(1);for(let s=0;s<o.length;s++){if(r+=1,t===r){let l=o.slice(0,s+1),f=oe(l);return f?ie(l.join("."),f):null}r+=o[s].length}}return null}getPropertyInfo(e,t,n){let o=e.getLineContent(1).trim().match(/^projection\s+[\w.]+\s*=>\s*([\w.]+)/);if(!o)return null;let s=o[1],l=this.isDraftReadModel(s)?this.draftReadModel:null,f=l?null:this.resolveReadModelInfo(s),c=l?.schema||f?.schema;if(c?.properties&&c.properties[n]){let g=c.properties[n],M=this.getPropertyTypeDescription(g),x=g.description,C=`**Property:** \`${n}\`
66
66
 
67
- **Type:** \`${M}\``;return x&&(b+=`
67
+ **Type:** \`${M}\``;return x&&(C+=`
68
68
 
69
- ${x}`),b}let u=this.getCurrentEventType(e,t.lineNumber);if(u&&this.eventSchemas[u]){let g=this.eventSchemas[u];if(g.properties&&g.properties[n]){let M=g.properties[n],x=this.getPropertyTypeDescription(M),b=M.description,m=`**Event Property:** \`${n}\`
69
+ ${x}`),C}let u=this.getCurrentEventType(e,t.lineNumber);if(u&&this.eventSchemas[u]){let g=this.eventSchemas[u];if(g.properties&&g.properties[n]){let M=g.properties[n],x=this.getPropertyTypeDescription(M),C=M.description,m=`**Event Property:** \`${n}\`
70
70
 
71
- **Type:** \`${x}\``;return b&&(m+=`
71
+ **Type:** \`${x}\``;return C&&(m+=`
72
72
 
73
- ${b}`),m}}return null}resolveReadModelInfo(e){return this.readModels.find(t=>t.identifier===e||t.displayName===e)||null}isDraftReadModel(e){return!!this.draftReadModel&&(this.draftReadModel.identifier===e||this.draftReadModel.displayName===e)}getCurrentEventType(e,t){for(let n=t;n>=1;n--){let i=e.getLineContent(n).trim().match(/^from\s+([\w-]+)/);if(i)return i[1]}return null}getProjectionNameAtPosition(e,t){if(!e.match(/^\s*projection\s+(\S+)\s*=>/))return!1;let r=e.indexOf("projection")+10,i=e.indexOf("=>");return t>r&&t<=i}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}getSchemaProperties(e){return e.properties?Object.entries(e.properties).map(([t,n])=>({name:t,type:this.getPropertyTypeDescription(n)})):[]}getPropertyTypeDescription(e){return e.type==="array"&&e.items?`${e.items.type||e.items.$ref?.split("/").pop()||"unknown"}[]`:e.type||e.$ref?.split("/").pop()||"unknown"}};var J=class{static{C(this,"CodeActionProvider")}readModels=[];draftReadModel=null;onCreateReadModel;onEditReadModel;setReadModels(e){this.readModels=e}setDraftReadModel(e){this.draftReadModel=e}setReadModelSchemas(e){this.readModels=e.map(t=>({identifier:t.title||t.name||"",displayName:t.title||t.name||"",schema:t}))}setCreateReadModelCallback(e){this.onCreateReadModel=e}setEditReadModelCallback(e){this.onEditReadModel=e}invokeCreateReadModel(e){this.onCreateReadModel?.(e)}invokeEditReadModel(e,t){this.onEditReadModel?.(e,t)}provideCodeActions(e,t,n){let r=[],i=n.markers.filter(l=>l.message.includes("Read model")&&l.message.includes("not found")),s=n.markers.filter(l=>l.message.includes("Read model")&&l.message.includes("is a draft"));for(let l of i){let f=l.message.match(/Read model ['"]([\w.]+)['"]/);if(f&&f[1]){let c=f[1];!this.readModels.some(g=>g.identifier===c||g.displayName===c)&&this.onCreateReadModel&&r.push({title:`Create read model '${c}'`,diagnostics:[l],kind:"quickfix",edit:void 0,isPreferred:!0,command:{id:"pdl.createReadModel",title:`Create ${c}`,arguments:[c]}})}}for(let l of s){let f=l.message.match(/Read model ['"]([\w.]+)['"]/);if(f&&f[1]){let c=f[1];this.draftReadModel&&this.isDraftReadModel(c)&&this.onEditReadModel&&r.push({title:`Edit read model '${c}'`,diagnostics:[l],kind:"quickfix",edit:void 0,isPreferred:!0,command:{id:"pdl.editReadModel",title:`Edit ${c}`,arguments:[c,this.draftReadModel.schema]}})}}return{actions:r,dispose:C(()=>{},"dispose")}}isDraftReadModel(e){return!!this.draftReadModel&&(this.draftReadModel.identifier===e||this.draftReadModel.displayName===e)}};var P,T,k,$,I=[],j=null,K=!1,L=null,O=null;function ke(d){return K||(K=!0,j=d,d.languages.register({id:"pdl"}),d.languages.setLanguageConfiguration("pdl",ae),d.languages.setMonarchTokensProvider("pdl",de),P=new A,T=new D,k=new W,$=new J,L&&($.setCreateReadModelCallback(L),L=null),O&&($.setEditReadModelCallback(O),O=null),I.push(d.languages.registerCompletionItemProvider("pdl",{provideCompletionItems:T.provideCompletionItems.bind(T),triggerCharacters:["."," ","=",`
74
- `,"$"]})),I.push(d.languages.registerHoverProvider("pdl",{provideHover:k.provideHover.bind(k)})),I.push(d.languages.registerCodeActionProvider("pdl",{provideCodeActions:$.provideCodeActions.bind($)},{providedCodeActionKinds:["quickfix"]})),I.push(d.editor.registerCommand("pdl.createReadModel",(e,t)=>{$?.invokeCreateReadModel(t)})),I.push(d.editor.registerCommand("pdl.editReadModel",(e,t,n)=>{$?.invokeEditReadModel(t,n)})),I.push(d.editor.onDidCreateModel(e=>{e.getLanguageId()==="pdl"&&(B(d,e),I.push(e.onDidChangeContent(()=>B(d,e))))})),d.editor.getModels().forEach(e=>{e.getLanguageId()==="pdl"&&B(d,e)})),{dispose:ue}}C(ke,"registerProjectionLanguage");function ue(){I.forEach(d=>d.dispose()),I=[],K=!1,j=null}C(ue,"dispose");function je(d){P?.setReadModelSchemas([d]),T?.setReadModelSchemas([d])}C(je,"setReadModelSchema");function De(d){P?.setReadModels(d),T?.setReadModels(d),k?.setReadModels(d),$?.setReadModels(d),H()}C(De,"setReadModelSchemas");function Ae(d){$?$.setCreateReadModelCallback(d):L=d}C(Ae,"setCreateReadModelCallback");function We(d){$?$.setEditReadModelCallback(d):O=d}C(We,"setEditReadModelCallback");function Je(d){$?.setDraftReadModel(d),P?.setDraftReadModel(d),k?.setDraftReadModel(d),H()}C(Je,"setDraftReadModel");function Le(d){let t=C(n=>{if(!n)return{};if(Array.isArray(n)){let r={};return n.forEach((i,s)=>{if(!i)return;let l=i.title||i.name||(typeof i.$id=="string"?i.$id.split("/").pop():void 0)||`Event${s+1}`;r[l]=i}),r}return n},"normalize")(d);P?.setEventSchemas(t),T?.setEventSchemas(t),k?.setEventSchemas(t),H()}C(Le,"setEventSchemas");function Oe(d){T?.setEventSequences(d)}C(Oe,"setEventSequences");function B(d,e){if(P&&!e.isDisposed()){let t=P.validate(e);d.editor.setModelMarkers(e,"pdl-validator",t)}}C(B,"validateModel");function H(){j&&j.editor.getModels().forEach(d=>{d.getLanguageId()==="pdl"&&B(j,d)})}C(H,"revalidateAllModels");export{E as languageId,ke as registerProjectionLanguage,Ae as setCreateReadModelCallback,Je as setDraftReadModel,We as setEditReadModelCallback,Le as setEventSchemas,Oe as setEventSequences,je as setReadModelSchema,De as setReadModelSchemas};
73
+ ${C}`),m}}return null}resolveReadModelInfo(e){return this.readModels.find(t=>t.identifier===e||t.displayName===e)||null}isDraftReadModel(e){return!!this.draftReadModel&&(this.draftReadModel.identifier===e||this.draftReadModel.displayName===e)}getCurrentEventType(e,t){for(let n=t;n>=1;n--){let o=e.getLineContent(n).trim().match(/^from\s+([\w-]+)/);if(o)return o[1]}return null}getProjectionNameAtPosition(e,t){if(!e.match(/^\s*projection\s+(\S+)\s*=>/))return!1;let r=e.indexOf("projection")+10,o=e.indexOf("=>");return t>r&&t<=o}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}getSchemaProperties(e){return e.properties?Object.entries(e.properties).map(([t,n])=>({name:t,type:this.getPropertyTypeDescription(n)})):[]}getPropertyTypeDescription(e){return e.type==="array"&&e.items?`${e.items.type||e.items.$ref?.split("/").pop()||"unknown"}[]`:e.type||e.$ref?.split("/").pop()||"unknown"}};var J=class{static{b(this,"CodeActionProvider")}readModels=[];draftReadModel=null;onCreateReadModel;onEditReadModel;setReadModels(e){this.readModels=e}setDraftReadModel(e){this.draftReadModel=e}setReadModelSchemas(e){this.readModels=e.map(t=>({identifier:t.title||t.name||"",displayName:t.title||t.name||"",schema:t}))}setCreateReadModelCallback(e){this.onCreateReadModel=e}setEditReadModelCallback(e){this.onEditReadModel=e}invokeCreateReadModel(e){this.onCreateReadModel?.(e)}invokeEditReadModel(e,t){this.onEditReadModel?.(e,t)}provideCodeActions(e,t,n){let r=[],o=n.markers.filter(l=>l.message.includes("Read model")&&l.message.includes("not found")),s=n.markers.filter(l=>l.message.includes("Read model")&&l.message.includes("is a draft"));for(let l of o){let f=l.message.match(/Read model ['"]([\w.]+)['"]/);if(f&&f[1]){let c=f[1];!this.readModels.some(g=>g.identifier===c||g.displayName===c)&&this.onCreateReadModel&&r.push({title:`Create read model '${c}'`,diagnostics:[l],kind:"quickfix",edit:void 0,isPreferred:!0,command:{id:"pdl.createReadModel",title:`Create ${c}`,arguments:[c]}})}}for(let l of s){let f=l.message.match(/Read model ['"]([\w.]+)['"]/);if(f&&f[1]){let c=f[1];this.draftReadModel&&this.isDraftReadModel(c)&&this.onEditReadModel&&r.push({title:`Edit read model '${c}'`,diagnostics:[l],kind:"quickfix",edit:void 0,isPreferred:!0,command:{id:"pdl.editReadModel",title:`Edit ${c}`,arguments:[c,this.draftReadModel.schema]}})}}return{actions:r,dispose:b(()=>{},"dispose")}}isDraftReadModel(e){return!!this.draftReadModel&&(this.draftReadModel.identifier===e||this.draftReadModel.displayName===e)}};var P,T,k,$,I=[],j=null,K=!1,L=null,O=null;function ke(d){return K||(K=!0,j=d,d.languages.register({id:"pdl"}),d.languages.setLanguageConfiguration("pdl",ae),d.languages.setMonarchTokensProvider("pdl",de),P=new A,T=new D,k=new W,$=new J,L&&($.setCreateReadModelCallback(L),L=null),O&&($.setEditReadModelCallback(O),O=null),I.push(d.languages.registerCompletionItemProvider("pdl",{provideCompletionItems:T.provideCompletionItems.bind(T),triggerCharacters:["."," ","=",`
74
+ `,"$"]})),I.push(d.languages.registerHoverProvider("pdl",{provideHover:k.provideHover.bind(k)})),I.push(d.languages.registerCodeActionProvider("pdl",{provideCodeActions:$.provideCodeActions.bind($)},{providedCodeActionKinds:["quickfix"]})),I.push(d.editor.registerCommand("pdl.createReadModel",(e,t)=>{$?.invokeCreateReadModel(t)})),I.push(d.editor.registerCommand("pdl.editReadModel",(e,t,n)=>{$?.invokeEditReadModel(t,n)})),I.push(d.editor.onDidCreateModel(e=>{e.getLanguageId()==="pdl"&&(B(d,e),I.push(e.onDidChangeContent(()=>B(d,e))))})),d.editor.getModels().forEach(e=>{e.getLanguageId()==="pdl"&&B(d,e)})),{dispose:ue}}b(ke,"registerProjectionLanguage");function ue(){I.forEach(d=>d.dispose()),I=[],K=!1,j=null}b(ue,"dispose");function je(d){P?.setReadModelSchemas([d]),T?.setReadModelSchemas([d])}b(je,"setReadModelSchema");function De(d){P?.setReadModels(d),T?.setReadModels(d),k?.setReadModels(d),$?.setReadModels(d),H()}b(De,"setReadModelSchemas");function Ae(d){$?$.setCreateReadModelCallback(d):L=d}b(Ae,"setCreateReadModelCallback");function We(d){$?$.setEditReadModelCallback(d):O=d}b(We,"setEditReadModelCallback");function Je(d){$?.setDraftReadModel(d),P?.setDraftReadModel(d),k?.setDraftReadModel(d),H()}b(Je,"setDraftReadModel");function Le(d){let t=b(n=>{if(!n)return{};if(Array.isArray(n)){let r={};return n.forEach((o,s)=>{if(!o)return;let l=o.title||o.name||(typeof o.$id=="string"?o.$id.split("/").pop():void 0)||`Event${s+1}`;r[l]=o}),r}return n},"normalize")(d);P?.setEventSchemas(t),T?.setEventSchemas(t),k?.setEventSchemas(t),H()}b(Le,"setEventSchemas");function Oe(d){T?.setEventSequences(d)}b(Oe,"setEventSequences");function B(d,e){if(P&&!e.isDisposed()){let t=P.validate(e);d.editor.setModelMarkers(e,"pdl-validator",t)}}b(B,"validateModel");function H(){j&&j.editor.getModels().forEach(d=>{d.getLanguageId()==="pdl"&&B(j,d)})}b(H,"revalidateAllModels");export{E as languageId,ke as registerProjectionLanguage,Ae as setCreateReadModelCallback,Je as setDraftReadModel,We as setEditReadModelCallback,Le as setEventSchemas,Oe as setEventSequences,je as setReadModelSchema,De as setReadModelSchemas};
75
75
  //# sourceMappingURL=index.js.map