@cratis/screenplay-language 4.120.0 → 4.122.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{a as p}from"../../chunk-AYDF3IFZ.js";var u="cdl",I=["capture","source","key","map","append","when","nested","children","identified","by","api","webhook","message","events","route","poll","path","topic","from","to","or","and","added","removed","translate","split"],T=["$context","$previous","$env"],k=["=","=>","."],w={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:/^.*(\bcapture\b\s+\S+|\bsource\b(?:\s+\w+)?|\bmap\b|\bappend\b\s+\S+|\bnested\b\s+\S+|\bchildren\b\s+\S+.*|\btranslate\b|\bsplit\b.*)\s*$/,decreaseIndentPattern:/^.*\}.*$/},folding:{offSide:!0,markers:{start:/^\s*(capture|source|map|append|nested|children|translate|split)/,end:/^\s*$/}},wordPattern:/[$]?[a-zA-Z_][\w$-]*/},y={defaultToken:"",tokenPostfix:".cdl",keywords:I,builtins:T,operators:k,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*(?:\.[a-zA-Z_]\w*)*)?/,"variable"],[/\$previous(?:\.[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*)?/,"variable.predefined"],[/\$context(?:\.(?:occurred|eventSourceId))?/,"variable.predefined"],[/\$env(?:\.[A-Z_][A-Z0-9_]*)?/,"variable.predefined"],[/@[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"}]]}};import{languages as l}from"monaco-editor";var A=["id","status","firstName","lastName","fullName","address.street","address.city","lineItems","lineItems.quantity","lineNumber","quantity"],g=class{static{p(this,"CompletionProvider")}triggerCharacters=["."," ","=","$"];provideCompletionItems(t,n){let e=this.buildContext(t,n),o=[];return e.lineNumber===1?this.addCaptureLineCompletions(o,e):this.isAfterKeyword(e,"capture")?this.addCaptureNameCompletions(o,e):this.isAfterKeyword(e,"source")?this.addSourceTypeCompletions(o,e):this.isAfterAppendKeyword(e)?this.addAppendNameCompletions(o,e):this.isAfterWhenKeyword(e)?this.addWhenCompletions(o,e):this.isAfterWhenFrom(e)?this.addFromValueCompletions(o,e):this.isAfterWhenTo(e)?this.addToValueCompletions(o,e):this.isAfterContextPrefix(e,"$.")?this.addPathCompletions(o,e,"$."):this.isAfterContextPrefix(e,"$previous.")?this.addPathCompletions(o,e,"$previous."):this.isAfterContextPrefix(e,"$context.")?this.addContextCompletions(o,e):this.isAfterContextPrefix(e,"$env.")?this.addEnvironmentCompletions(o,e):this.isAfterAssignment(e)?this.addAssignmentValueCompletions(o,e):(this.isStartOfLine(e)||this.isAfterIndent(e))&&e.indentLevel===1?this.addTopLevelStatementCompletions(o,e):(this.isStartOfLine(e)||this.isAfterIndent(e))&&e.indentLevel>=2&&this.addSourceBlockCompletions(o,e,this.getCurrentSourceType(t,n.lineNumber)),{suggestions:o}}buildContext(t,n){let o=t.getLineContent(n.lineNumber).substring(0,n.column-1),r=t.getWordUntilPosition(n);return{textBeforeCursor:o,currentWord:r.word||"",indentLevel:this.getIndentLevel(o),lineNumber:n.lineNumber,wordStartColumn:r.startColumn,wordEndColumn:r.endColumn}}getIndentLevel(t){let n=t.match(/^(\s*)/);return n?Math.floor(n[1].length/2):0}isStartOfLine(t){return t.textBeforeCursor.trim()===""}isAfterIndent(t){return/^\s+$/.test(t.textBeforeCursor)}isAfterKeyword(t,n){return new RegExp(`\\b${n}\\s+\\w*$`).test(t.textBeforeCursor)}isAfterAppendKeyword(t){return/\bappend\s+[\w.]*$/.test(t.textBeforeCursor)}isAfterWhenKeyword(t){return/\bwhen\s+[\w.]*$/.test(t.textBeforeCursor)}isAfterWhenFrom(t){return/\bwhen\s+[\w.]+\s+from\s+[^\s]*$/.test(t.textBeforeCursor)}isAfterWhenTo(t){return/\bwhen\s+[\w.]+\s+from\s+\S+\s+to\s+[^\s]*$/.test(t.textBeforeCursor)}isAfterAssignment(t){return/=\s*([$\w.]*)$/.test(t.textBeforeCursor)}isAfterContextPrefix(t,n){return t.textBeforeCursor.endsWith(n)}addCaptureLineCompletions(t,n){let e=n.textBeforeCursor.trim();(e===""||"capture".startsWith(e))&&t.push({label:"capture",kind:l.CompletionItemKind.Keyword,insertText:"capture ",documentation:"Define a capture declaration",detail:"capture <Name>",range:this.getRangeForWord(n)}),e.startsWith("capture ")&&this.addCaptureNameCompletions(t,n)}addCaptureNameCompletions(t,n){t.push({label:"CaptureDefinition",kind:l.CompletionItemKind.Class,insertText:"CaptureDefinition",documentation:"A descriptive name for this capture declaration",detail:"Capture name",range:this.getRangeForWord(n)})}addSourceTypeCompletions(t,n){[{label:"api",detail:"source api",documentation:"Capture data by polling an HTTP API"},{label:"webhook",detail:"source webhook",documentation:"Capture data from incoming webhook requests"},{label:"message",detail:"source message",documentation:"Capture data from a message topic"},{label:"events",detail:"source events",documentation:"Capture another application's public events (inbound translation); each 'from <Event>' names one consumed event"}].forEach(e=>{t.push({label:e.label,kind:l.CompletionItemKind.Keyword,insertText:e.label,documentation:e.documentation,detail:e.detail,range:this.getRangeForWord(n)})})}addSourceBlockCompletions(t,n,e){(e?{api:[{label:"api",detail:"api <ServiceName>",documentation:"References a configured External Service by name for the base URL and authentication"},{label:"route",detail:"route <path>",documentation:"Optional path appended to the External Service base URL; if omitted, the base URL is used as-is"},{label:"poll",detail:"poll <interval>",documentation:"The polling interval, for example 5m"}],webhook:[{label:"path",detail:"path <route>",documentation:"The inbound path this webhook listens on"}],events:[{label:"from",detail:"from <Event>",documentation:"Names a public event of another application to consume; repeat for more events"}],message:[{label:"topic",detail:"topic <name>",documentation:"The topic or subject to subscribe to"}]}[e]??[]:[]).forEach(r=>{t.push({label:r.label,kind:l.CompletionItemKind.Keyword,insertText:`${r.label} `,documentation:r.documentation,detail:r.detail,range:this.getRangeForWord(n)})})}addTopLevelStatementCompletions(t,n){[{label:"key",insertText:"key ",detail:"key <property>",documentation:"Identify the captured entity"},{label:"map",insertText:"map",detail:"map",documentation:"Map captured fields into a normalized shape"},{label:"append",insertText:"append ",detail:"append <EventName>",documentation:"Append an event when a condition matches"},{label:"nested",insertText:"nested ",detail:"nested <property>",documentation:"Create a nested mapping scope"},{label:"children",insertText:"children ",detail:"children <collection> identified by <property>",documentation:"Handle child collections independently"}].forEach(e=>{t.push({label:e.label,kind:l.CompletionItemKind.Keyword,insertText:e.insertText,documentation:e.documentation,detail:e.detail,range:this.getRangeForWord(n)})})}addAppendNameCompletions(t,n){t.push({label:"ItemChanged",kind:l.CompletionItemKind.Class,insertText:"ItemChanged",documentation:"A generic event name for the appended event",detail:"Event name",range:this.getRangeForWord(n)})}addWhenCompletions(t,n){[{label:"added",insertText:"added",detail:"when added",documentation:"Append when a child item was added"},{label:"removed",insertText:"removed",detail:"when removed",documentation:"Append when a child item was removed"},{label:"status",insertText:"status",detail:"when <property>",documentation:"Append when a property changed"},{label:"status transition",insertText:"status from inactive to active",detail:"when <property> from <value> to <value>",documentation:"Append when a property changed between two values"},{label:"quantity",insertText:"quantity",detail:"when <property>",documentation:"Append when a property changed"},{label:"lineNumber",insertText:"lineNumber",detail:"when <property>",documentation:"Append when a specific property changed"}].forEach(e=>{t.push({label:e.label,kind:l.CompletionItemKind.Keyword,insertText:e.insertText,documentation:e.documentation,detail:e.detail,range:this.getRangeForWord(n)})})}addFromValueCompletions(t,n){[{label:"*",insertText:"*",detail:"Wildcard",documentation:"Match any previous value"},{label:"inactive",insertText:"inactive",detail:"Common value",documentation:"A common previous state value"},{label:"active",insertText:"active",detail:"Common value",documentation:"A common previous state value"},{label:"true",insertText:"true",detail:"Boolean value",documentation:"Boolean true"},{label:"false",insertText:"false",detail:"Boolean value",documentation:"Boolean false"}].forEach(e=>{t.push({label:e.label,kind:l.CompletionItemKind.Value,insertText:e.insertText,documentation:e.documentation,detail:e.detail,range:this.getRangeForWord(n)})})}addToValueCompletions(t,n){["active","inactive","pending","true","false"].forEach(e=>{t.push({label:e,kind:l.CompletionItemKind.Value,insertText:e,documentation:`Common target value: ${e}`,detail:"Target value",range:this.getRangeForWord(n)})})}addAssignmentValueCompletions(t,n){[{label:"$.",insertText:"$.",detail:"Current captured value",documentation:"Reference the current captured payload"},{label:"$previous.",insertText:"$previous.",detail:"Previous captured value",documentation:"Reference the previous state of the payload"},{label:"$context.occurred",insertText:"$context.occurred",detail:"Occurred timestamp",documentation:"When the capture source produced the current data"},{label:"$context.eventSourceId",insertText:"$context.eventSourceId",detail:"Event source identifier",documentation:"The resolved event source identifier for the append operation"},{label:"$env.",insertText:"$env.",detail:"Environment variable",documentation:"Read an environment variable"}].forEach(e=>{t.push({label:e.label,kind:l.CompletionItemKind.Variable,insertText:e.insertText,documentation:e.documentation,detail:e.detail,range:this.getRangeForWord(n)})})}addPathCompletions(t,n,e){A.forEach(o=>{t.push({label:o,kind:l.CompletionItemKind.Property,insertText:`${e}${o}`,documentation:`Common property path: ${e}${o}`,detail:e==="$."?"Current value path":"Previous value path",range:this.getRangeForWord(n)})})}addContextCompletions(t,n){[{label:"occurred",insertText:"$context.occurred",detail:"When the event occurred",documentation:"Timestamp for when the append event happened"},{label:"eventSourceId",insertText:"$context.eventSourceId",detail:"Event source identifier",documentation:"The event source identifier used for the appended event"}].forEach(e=>{t.push({label:e.label,kind:l.CompletionItemKind.Property,insertText:e.insertText,documentation:e.documentation,detail:e.detail,range:this.getRangeForWord(n)})})}addEnvironmentCompletions(t,n){t.push({label:"API_TOKEN",kind:l.CompletionItemKind.Variable,insertText:"$env.API_TOKEN",documentation:"Placeholder environment variable reference",detail:"Environment variable",range:this.getRangeForWord(n)})}getCurrentSourceType(t,n){for(let e=n;e>=1;e--){let r=t.getLineContent(e).trim().match(/^source\s+(api|webhook|message|events)\b/);if(r)return r[1]}return null}getRangeForWord(t){return{startLineNumber:t.lineNumber,endLineNumber:t.lineNumber,startColumn:t.wordStartColumn,endColumn:t.wordEndColumn}}};var v=class{static{p(this,"HoverProvider")}provideHover(t,n){let e=this.getTokenAtPosition(t,n);if(!e)return null;let o=this.getKeywordInfo(e.word);if(o)return{contents:[{value:o}],range:e.range};let r=this.getExpressionInfo(e.word);return r?{contents:[{value:r}],range:e.range}:null}getTokenAtPosition(t,n){let o=[...t.getLineContent(n.lineNumber).matchAll(/\$context|\$previous|\$env|[a-zA-Z_][\w-]*/g)],r=n.column-1;for(let i of o){let h=i.index??0,b=h+i[0].length;if(r>=h&&r<=b)return{word:i[0],range:{startLineNumber:n.lineNumber,endLineNumber:n.lineNumber,startColumn:h+1,endColumn:b+1}}}return null}getKeywordInfo(t){return{capture:`**capture** *<Name>*
1
+ import{a as p}from"../../chunk-AYDF3IFZ.js";var u="cdl",I=["capture","source","key","map","append","when","nested","children","identified","by","api","webhook","message","events","route","poll","path","topic","from","to","or","and","added","removed","translate","split"],T=["$context","$identity","$previous","$env"],$=["=","=>","."],w={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:/^.*(\bcapture\b\s+\S+|\bsource\b(?:\s+\w+)?|\bmap\b|\bappend\b\s+\S+|\bnested\b\s+\S+|\bchildren\b\s+\S+.*|\btranslate\b|\bsplit\b.*)\s*$/,decreaseIndentPattern:/^.*\}.*$/},folding:{offSide:!0,markers:{start:/^\s*(capture|source|map|append|nested|children|translate|split)/,end:/^\s*$/}},wordPattern:/[$]?[a-zA-Z_][\w$-]*/},y={defaultToken:"",tokenPostfix:".cdl",keywords:I,builtins:T,operators:$,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*(?:\.[a-zA-Z_]\w*)*)?/,"variable"],[/\$previous(?:\.[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*)?/,"variable.predefined"],[/\$context(?:\.(?:occurred|eventSourceId))?/,"variable.predefined"],[/\$identity(?:\.\w+)*/,"variable.predefined"],[/\$env(?:\.[A-Z_][A-Z0-9_]*)?/,"variable.predefined"],[/@[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"}]]}};import{languages as l}from"monaco-editor";var k=["id","status","firstName","lastName","fullName","address.street","address.city","lineItems","lineItems.quantity","lineNumber","quantity"],g=class{static{p(this,"CompletionProvider")}triggerCharacters=["."," ","=","$"];provideCompletionItems(t,n){let e=this.buildContext(t,n),o=[];return e.lineNumber===1?this.addCaptureLineCompletions(o,e):this.isAfterKeyword(e,"capture")?this.addCaptureNameCompletions(o,e):this.isAfterKeyword(e,"source")?this.addSourceTypeCompletions(o,e):this.isAfterAppendKeyword(e)?this.addAppendNameCompletions(o,e):this.isAfterWhenKeyword(e)?this.addWhenCompletions(o,e):this.isAfterWhenFrom(e)?this.addFromValueCompletions(o,e):this.isAfterWhenTo(e)?this.addToValueCompletions(o,e):this.isAfterContextPrefix(e,"$.")?this.addPathCompletions(o,e,"$."):this.isAfterContextPrefix(e,"$previous.")?this.addPathCompletions(o,e,"$previous."):this.isAfterContextPrefix(e,"$context.")?this.addContextCompletions(o,e):this.isAfterContextPrefix(e,"$env.")?this.addEnvironmentCompletions(o,e):this.isAfterAssignment(e)?this.addAssignmentValueCompletions(o,e):(this.isStartOfLine(e)||this.isAfterIndent(e))&&e.indentLevel===1?this.addTopLevelStatementCompletions(o,e):(this.isStartOfLine(e)||this.isAfterIndent(e))&&e.indentLevel>=2&&this.addSourceBlockCompletions(o,e,this.getCurrentSourceType(t,n.lineNumber)),{suggestions:o}}buildContext(t,n){let o=t.getLineContent(n.lineNumber).substring(0,n.column-1),r=t.getWordUntilPosition(n);return{textBeforeCursor:o,currentWord:r.word||"",indentLevel:this.getIndentLevel(o),lineNumber:n.lineNumber,wordStartColumn:r.startColumn,wordEndColumn:r.endColumn}}getIndentLevel(t){let n=t.match(/^(\s*)/);return n?Math.floor(n[1].length/2):0}isStartOfLine(t){return t.textBeforeCursor.trim()===""}isAfterIndent(t){return/^\s+$/.test(t.textBeforeCursor)}isAfterKeyword(t,n){return new RegExp(`\\b${n}\\s+\\w*$`).test(t.textBeforeCursor)}isAfterAppendKeyword(t){return/\bappend\s+[\w.]*$/.test(t.textBeforeCursor)}isAfterWhenKeyword(t){return/\bwhen\s+[\w.]*$/.test(t.textBeforeCursor)}isAfterWhenFrom(t){return/\bwhen\s+[\w.]+\s+from\s+[^\s]*$/.test(t.textBeforeCursor)}isAfterWhenTo(t){return/\bwhen\s+[\w.]+\s+from\s+\S+\s+to\s+[^\s]*$/.test(t.textBeforeCursor)}isAfterAssignment(t){return/=\s*([$\w.]*)$/.test(t.textBeforeCursor)}isAfterContextPrefix(t,n){return t.textBeforeCursor.endsWith(n)}addCaptureLineCompletions(t,n){let e=n.textBeforeCursor.trim();(e===""||"capture".startsWith(e))&&t.push({label:"capture",kind:l.CompletionItemKind.Keyword,insertText:"capture ",documentation:"Define a capture declaration",detail:"capture <Name>",range:this.getRangeForWord(n)}),e.startsWith("capture ")&&this.addCaptureNameCompletions(t,n)}addCaptureNameCompletions(t,n){t.push({label:"CaptureDefinition",kind:l.CompletionItemKind.Class,insertText:"CaptureDefinition",documentation:"A descriptive name for this capture declaration",detail:"Capture name",range:this.getRangeForWord(n)})}addSourceTypeCompletions(t,n){[{label:"api",detail:"source api",documentation:"Capture data by polling an HTTP API"},{label:"webhook",detail:"source webhook",documentation:"Capture data from incoming webhook requests"},{label:"message",detail:"source message",documentation:"Capture data from a message topic"},{label:"events",detail:"source events",documentation:"Capture another application's public events (inbound translation); each 'from <Event>' names one consumed event"}].forEach(e=>{t.push({label:e.label,kind:l.CompletionItemKind.Keyword,insertText:e.label,documentation:e.documentation,detail:e.detail,range:this.getRangeForWord(n)})})}addSourceBlockCompletions(t,n,e){(e?{api:[{label:"api",detail:"api <ServiceName>",documentation:"References a configured External Service by name for the base URL and authentication"},{label:"route",detail:"route <path>",documentation:"Optional path appended to the External Service base URL; if omitted, the base URL is used as-is"},{label:"poll",detail:"poll <interval>",documentation:"The polling interval, for example 5m"}],webhook:[{label:"path",detail:"path <route>",documentation:"The inbound path this webhook listens on"}],events:[{label:"from",detail:"from <Event>",documentation:"Names a public event of another application to consume; repeat for more events"}],message:[{label:"topic",detail:"topic <name>",documentation:"The topic or subject to subscribe to"}]}[e]??[]:[]).forEach(r=>{t.push({label:r.label,kind:l.CompletionItemKind.Keyword,insertText:`${r.label} `,documentation:r.documentation,detail:r.detail,range:this.getRangeForWord(n)})})}addTopLevelStatementCompletions(t,n){[{label:"key",insertText:"key ",detail:"key <property>",documentation:"Identify the captured entity"},{label:"map",insertText:"map",detail:"map",documentation:"Map captured fields into a normalized shape"},{label:"append",insertText:"append ",detail:"append <EventName>",documentation:"Append an event when a condition matches"},{label:"nested",insertText:"nested ",detail:"nested <property>",documentation:"Create a nested mapping scope"},{label:"children",insertText:"children ",detail:"children <collection> identified by <property>",documentation:"Handle child collections independently"}].forEach(e=>{t.push({label:e.label,kind:l.CompletionItemKind.Keyword,insertText:e.insertText,documentation:e.documentation,detail:e.detail,range:this.getRangeForWord(n)})})}addAppendNameCompletions(t,n){t.push({label:"ItemChanged",kind:l.CompletionItemKind.Class,insertText:"ItemChanged",documentation:"A generic event name for the appended event",detail:"Event name",range:this.getRangeForWord(n)})}addWhenCompletions(t,n){[{label:"added",insertText:"added",detail:"when added",documentation:"Append when a child item was added"},{label:"removed",insertText:"removed",detail:"when removed",documentation:"Append when a child item was removed"},{label:"status",insertText:"status",detail:"when <property>",documentation:"Append when a property changed"},{label:"status transition",insertText:"status from inactive to active",detail:"when <property> from <value> to <value>",documentation:"Append when a property changed between two values"},{label:"quantity",insertText:"quantity",detail:"when <property>",documentation:"Append when a property changed"},{label:"lineNumber",insertText:"lineNumber",detail:"when <property>",documentation:"Append when a specific property changed"}].forEach(e=>{t.push({label:e.label,kind:l.CompletionItemKind.Keyword,insertText:e.insertText,documentation:e.documentation,detail:e.detail,range:this.getRangeForWord(n)})})}addFromValueCompletions(t,n){[{label:"*",insertText:"*",detail:"Wildcard",documentation:"Match any previous value"},{label:"inactive",insertText:"inactive",detail:"Common value",documentation:"A common previous state value"},{label:"active",insertText:"active",detail:"Common value",documentation:"A common previous state value"},{label:"true",insertText:"true",detail:"Boolean value",documentation:"Boolean true"},{label:"false",insertText:"false",detail:"Boolean value",documentation:"Boolean false"}].forEach(e=>{t.push({label:e.label,kind:l.CompletionItemKind.Value,insertText:e.insertText,documentation:e.documentation,detail:e.detail,range:this.getRangeForWord(n)})})}addToValueCompletions(t,n){["active","inactive","pending","true","false"].forEach(e=>{t.push({label:e,kind:l.CompletionItemKind.Value,insertText:e,documentation:`Common target value: ${e}`,detail:"Target value",range:this.getRangeForWord(n)})})}addAssignmentValueCompletions(t,n){[{label:"$.",insertText:"$.",detail:"Current captured value",documentation:"Reference the current captured payload"},{label:"$previous.",insertText:"$previous.",detail:"Previous captured value",documentation:"Reference the previous state of the payload"},{label:"$context.occurred",insertText:"$context.occurred",detail:"Occurred timestamp",documentation:"When the capture source produced the current data"},{label:"$context.eventSourceId",insertText:"$context.eventSourceId",detail:"Event source identifier",documentation:"The resolved event source identifier for the append operation"},{label:"$env.",insertText:"$env.",detail:"Environment variable",documentation:"Read an environment variable"}].forEach(e=>{t.push({label:e.label,kind:l.CompletionItemKind.Variable,insertText:e.insertText,documentation:e.documentation,detail:e.detail,range:this.getRangeForWord(n)})})}addPathCompletions(t,n,e){k.forEach(o=>{t.push({label:o,kind:l.CompletionItemKind.Property,insertText:`${e}${o}`,documentation:`Common property path: ${e}${o}`,detail:e==="$."?"Current value path":"Previous value path",range:this.getRangeForWord(n)})})}addContextCompletions(t,n){[{label:"occurred",insertText:"$context.occurred",detail:"When the event occurred",documentation:"Timestamp for when the append event happened"},{label:"eventSourceId",insertText:"$context.eventSourceId",detail:"Event source identifier",documentation:"The event source identifier used for the appended event"}].forEach(e=>{t.push({label:e.label,kind:l.CompletionItemKind.Property,insertText:e.insertText,documentation:e.documentation,detail:e.detail,range:this.getRangeForWord(n)})})}addEnvironmentCompletions(t,n){t.push({label:"API_TOKEN",kind:l.CompletionItemKind.Variable,insertText:"$env.API_TOKEN",documentation:"Placeholder environment variable reference",detail:"Environment variable",range:this.getRangeForWord(n)})}getCurrentSourceType(t,n){for(let e=n;e>=1;e--){let r=t.getLineContent(e).trim().match(/^source\s+(api|webhook|message|events)\b/);if(r)return r[1]}return null}getRangeForWord(t){return{startLineNumber:t.lineNumber,endLineNumber:t.lineNumber,startColumn:t.wordStartColumn,endColumn:t.wordEndColumn}}};var v=class{static{p(this,"HoverProvider")}provideHover(t,n){let e=this.getTokenAtPosition(t,n);if(!e)return null;let o=this.getKeywordInfo(e.word);if(o)return{contents:[{value:o}],range:e.range};let r=this.getExpressionInfo(e.word);return r?{contents:[{value:r}],range:e.range}:null}getTokenAtPosition(t,n){let o=[...t.getLineContent(n.lineNumber).matchAll(/\$context|\$identity|\$previous|\$env|[a-zA-Z_][\w-]*/g)],r=n.column-1;for(let i of o){let h=i.index??0,b=h+i[0].length;if(r>=h&&r<=b)return{word:i[0],range:{startLineNumber:n.lineNumber,endLineNumber:n.lineNumber,startColumn:h+1,endColumn:b+1}}}return null}getKeywordInfo(t){return{capture:`**capture** *<Name>*
2
2
 
3
3
  Declares a capture and gives it a unique name.`,source:`**source** *<type>*
4
4
 
@@ -36,5 +36,5 @@ Capture execution context.
36
36
 
37
37
  **Properties:**
38
38
  - \`occurred\` - When the current event should be considered to have occurred
39
- - \`eventSourceId\` - The resolved event source identifier`,$previous:"**$previous**\n\nThe previous state for the captured item. Use dot notation such as `$previous.status`.",$env:"**$env**\n\nEnvironment variables. Use dot notation such as `$env.API_TOKEN`."}[t]||null}};var f=class{static{p(this,"Validator")}validate(t){let n=[],e=-1,o="";for(let a=0;a<t.length;a++){let d=t[a].trim();if(d&&!d.startsWith("#")){e=a,o=d;break}}if(!o)return n;if(!o.match(/^capture\s+([\w.]+)\s*$/))return n.push(this.error(e,1,o.length+1,'Capture definition must start with "capture <Name>"')),n;let i=t.map((a,d)=>({line:a,trimmed:a.trim(),lineNumber:d,indent:a.search(/\S/)})).filter(a=>a.trimmed&&!a.trimmed.startsWith("#"));i.some(a=>a.trimmed.startsWith("source "))||n.push(this.error(e,1,o.length+1,'Capture definition must include a "source" block')),i.some(a=>a.trimmed.startsWith("key "))||n.push(this.error(e,1,o.length+1,'Capture definition must include a "key" declaration'));for(let a=0;a<i.length;a++){let d=i[a];if(!d.trimmed.startsWith("append "))continue;let x=!1;for(let m=a+1;m<i.length;m++){let c=i[m];if(c.indent<=d.indent)break;if(c.trimmed.startsWith("when ")){x=!0;break}}if(!x){let m=d.trimmed.substring(7).trim()||"unnamed append block",c=d.line.indexOf(m)+1;n.push(this.error(d.lineNumber,c>0?c:1,c>0?c+m.length:d.line.length+1,`Append block '${m}' must include a "when" clause`))}}return n}error(t,n,e,o){return{severity:"error",line:t,startColumn:n,endColumn:e,message:o}}};var $="cdl-validator",C=new Map;function P(s,t,n){return t.validate(n.getLinesContent()).map(e=>({severity:e.severity==="error"?s.MarkerSeverity.Error:s.MarkerSeverity.Warning,message:e.message,startLineNumber:e.line+1,startColumn:e.startColumn,endLineNumber:e.line+1,endColumn:e.endColumn}))}p(P,"toMarkers");function _(s){let t=C.get(s);if(t)return{dispose:t};s.languages.register({id:"cdl"}),s.languages.setLanguageConfiguration("cdl",w),s.languages.setMonarchTokensProvider("cdl",y);let n=new f,e=[];e.push(s.languages.registerCompletionItemProvider("cdl",new g)),e.push(s.languages.registerHoverProvider("cdl",new v));let o=p(i=>{i.isDisposed()||i.getLanguageId()!=="cdl"||s.editor.setModelMarkers(i,$,P(s,n,i))},"validateModel");e.push(s.editor.onDidCreateModel(i=>{i.getLanguageId()==="cdl"&&(o(i),e.push(i.onDidChangeContent(()=>o(i))))})),s.editor.getModels().forEach(i=>o(i));let r=p(()=>{e.forEach(i=>i.dispose()),e.length=0,C.delete(s)},"dispose");return C.set(s,r),{dispose:r}}p(_,"registerCaptureLanguage");export{u as languageId,_ as registerCaptureLanguage};
39
+ - \`eventSourceId\` - The resolved event source identifier`,$identity:"**$identity**\n\nThe caller, equivalent to `$context.identity`. Properties: `id`, `name`, `userName`, `isAuthenticated`, `roles`, `claims`. Caller mappings are not portable capture inputs (PLAY0268).",$previous:"**$previous**\n\nThe previous state for the captured item. Use dot notation such as `$previous.status`.",$env:"**$env**\n\nEnvironment variables. Use dot notation such as `$env.API_TOKEN`."}[t]||null}};var f=class{static{p(this,"Validator")}validate(t){let n=[],e=-1,o="";for(let a=0;a<t.length;a++){let d=t[a].trim();if(d&&!d.startsWith("#")){e=a,o=d;break}}if(!o)return n;if(!o.match(/^capture\s+([\w.]+)\s*$/))return n.push(this.error(e,1,o.length+1,'Capture definition must start with "capture <Name>"')),n;let i=t.map((a,d)=>({line:a,trimmed:a.trim(),lineNumber:d,indent:a.search(/\S/)})).filter(a=>a.trimmed&&!a.trimmed.startsWith("#"));i.some(a=>a.trimmed.startsWith("source "))||n.push(this.error(e,1,o.length+1,'Capture definition must include a "source" block')),i.some(a=>a.trimmed.startsWith("key "))||n.push(this.error(e,1,o.length+1,'Capture definition must include a "key" declaration'));for(let a=0;a<i.length;a++){let d=i[a];if(!d.trimmed.startsWith("append "))continue;let x=!1;for(let m=a+1;m<i.length;m++){let c=i[m];if(c.indent<=d.indent)break;if(c.trimmed.startsWith("when ")){x=!0;break}}if(!x){let m=d.trimmed.substring(7).trim()||"unnamed append block",c=d.line.indexOf(m)+1;n.push(this.error(d.lineNumber,c>0?c:1,c>0?c+m.length:d.line.length+1,`Append block '${m}' must include a "when" clause`))}}return n}error(t,n,e,o){return{severity:"error",line:t,startColumn:n,endColumn:e,message:o}}};var A="cdl-validator",C=new Map;function P(s,t,n){return t.validate(n.getLinesContent()).map(e=>({severity:e.severity==="error"?s.MarkerSeverity.Error:s.MarkerSeverity.Warning,message:e.message,startLineNumber:e.line+1,startColumn:e.startColumn,endLineNumber:e.line+1,endColumn:e.endColumn}))}p(P,"toMarkers");function _(s){let t=C.get(s);if(t)return{dispose:t};s.languages.register({id:"cdl"}),s.languages.setLanguageConfiguration("cdl",w),s.languages.setMonarchTokensProvider("cdl",y);let n=new f,e=[];e.push(s.languages.registerCompletionItemProvider("cdl",new g)),e.push(s.languages.registerHoverProvider("cdl",new v));let o=p(i=>{i.isDisposed()||i.getLanguageId()!=="cdl"||s.editor.setModelMarkers(i,A,P(s,n,i))},"validateModel");e.push(s.editor.onDidCreateModel(i=>{i.getLanguageId()==="cdl"&&(o(i),e.push(i.onDidChangeContent(()=>o(i))))})),s.editor.getModels().forEach(i=>o(i));let r=p(()=>{e.forEach(i=>i.dispose()),e.length=0,C.delete(s)},"dispose");return C.set(s,r),{dispose:r}}p(_,"registerCaptureLanguage");export{u as languageId,_ as registerCaptureLanguage};
40
40
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../sub-languages/capture/language.ts", "../../../../sub-languages/capture/CompletionProvider.ts", "../../../../sub-languages/capture/HoverProvider.ts", "../../../../sub-languages/capture/Validator.ts", "../../../../sub-languages/capture/index.ts"],
4
- "sourcesContent": ["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { languages } from 'monaco-editor';\n\nexport type Monaco = typeof import('monaco-editor');\n\n// Capture Declaration Language (CDL) \u2014 Chronicle's DSL for declaring change-data-capture\n// rules, registered here as its own standalone top-level Monaco language. This is distinct\n// from the lightweight CDL sub-language embedded inside a `.play` document's `capture`\n// blocks (../cdl.ts) \u2014 this module owns its own language id, tokenizer, and providers.\nexport const languageId = 'cdl';\n\n// `route`/`poll` are API source properties; `path` is the webhook inbound path; `topic`\n// is the message source subject. There is no `auth`/`bearer`/`url` \u2014 an API source\n// references a named External Service (`api <ServiceName>`) for base URL and auth, and\n// a webhook source's authentication is configured on the source builder, not in CDL text.\nconst KEYWORDS = [\n 'capture',\n 'source',\n 'key',\n 'map',\n 'append',\n 'when',\n 'nested',\n 'children',\n 'identified',\n 'by',\n 'api',\n 'webhook',\n 'message',\n 'events',\n 'route',\n 'poll',\n 'path',\n 'topic',\n 'from',\n 'to',\n 'or',\n 'and',\n 'added',\n 'removed',\n 'translate',\n 'split',\n] as const;\n\nconst BUILTINS = [\n '$context',\n '$previous',\n '$env',\n] as const;\n\nconst OPERATORS = ['=', '=>', '.'];\n\nexport const languageConfiguration: languages.LanguageConfiguration = {\n comments: {\n lineComment: '#',\n },\n brackets: [\n ['{', '}'],\n ['[', ']'],\n ['(', ')'],\n ],\n autoClosingPairs: [\n { open: '{', close: '}' },\n { open: '[', close: ']' },\n { open: '(', close: ')' },\n { open: '\"', close: '\"' },\n { open: \"'\", close: \"'\" },\n { open: '`', close: '`' },\n ],\n surroundingPairs: [\n { open: '{', close: '}' },\n { open: '[', close: ']' },\n { open: '(', close: ')' },\n { open: '\"', close: '\"' },\n { open: \"'\", close: \"'\" },\n { open: '`', close: '`' },\n ],\n indentationRules: {\n increaseIndentPattern: /^.*(\\bcapture\\b\\s+\\S+|\\bsource\\b(?:\\s+\\w+)?|\\bmap\\b|\\bappend\\b\\s+\\S+|\\bnested\\b\\s+\\S+|\\bchildren\\b\\s+\\S+.*|\\btranslate\\b|\\bsplit\\b.*)\\s*$/,\n decreaseIndentPattern: /^.*\\}.*$/,\n },\n folding: {\n offSide: true,\n markers: {\n start: /^\\s*(capture|source|map|append|nested|children|translate|split)/,\n end: /^\\s*$/,\n },\n },\n wordPattern: /[$]?[a-zA-Z_][\\w$-]*/,\n};\n\nexport const monarchLanguage: languages.IMonarchLanguage = {\n defaultToken: '',\n tokenPostfix: '.cdl',\n\n keywords: KEYWORDS,\n builtins: BUILTINS,\n operators: OPERATORS,\n\n symbols: /[=><!~?:&|+\\-*/^%]+/,\n escapes: /\\\\(?:[abfnrtv\\\\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,\n\n tokenizer: {\n root: [\n { include: '@whitespace' },\n [/`/, { token: 'string.template', next: '@templateString' }],\n [/\\$\\.(?:[a-zA-Z_]\\w*(?:\\.[a-zA-Z_]\\w*)*)?/, 'variable'],\n [/\\$previous(?:\\.[a-zA-Z_]\\w*(?:\\.[a-zA-Z_]\\w*)*)?/, 'variable.predefined'],\n [/\\$context(?:\\.(?:occurred|eventSourceId))?/, 'variable.predefined'],\n [/\\$env(?:\\.[A-Z_][A-Z0-9_]*)?/, 'variable.predefined'],\n [/@[a-zA-Z_$][\\w$]*/, 'identifier.escape'],\n [\n /[A-Z][a-zA-Z_$][\\w$]*/,\n {\n cases: {\n '@keywords': 'invalid',\n '@default': 'identifier',\n },\n },\n ],\n [\n /[a-z_$][\\w$]*/,\n {\n cases: {\n '@keywords': 'keyword',\n '@builtins': 'variable.predefined',\n '@default': 'identifier',\n },\n },\n ],\n [/[{}()[\\]]/, '@brackets'],\n [/=>/, 'operator.arrow'],\n [\n /@symbols/,\n {\n cases: {\n '@operators': 'operator',\n '@default': '',\n },\n },\n ],\n [/\\d*\\.\\d+([eE][-+]?\\d+)?/, 'number.float'],\n [/0[xX][0-9a-fA-F]+/, 'number.hex'],\n [/\\d+/, 'number'],\n [/[;,.]/, 'delimiter'],\n [/\"([^\"\\\\]|\\\\.)*$/, 'string.invalid'],\n [/\"/, { token: 'string.quote', next: '@string' }],\n ],\n\n whitespace: [\n [/[ \\t\\r\\n]+/, ''],\n [/#.*$/, 'comment'],\n ],\n\n templateString: [\n [/\\$\\{/, { token: 'delimiter.bracket', next: '@templateExpression' }],\n [/[^\\\\`$]+/, 'string.template'],\n [/@escapes/, 'string.template.escape'],\n [/\\\\./, 'string.template.escape.invalid'],\n [/`/, { token: 'string.template', next: '@pop' }],\n ],\n\n templateExpression: [\n [/\\}/, { token: 'delimiter.bracket', next: '@pop' }],\n { include: '@root' },\n ],\n\n string: [\n [/[^\\\\\"]+/, 'string'],\n [/@escapes/, 'string.escape'],\n [/\\\\./, 'string.escape.invalid'],\n [/\"/, { token: 'string.quote', next: '@pop' }],\n ],\n },\n};\n", "// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { languages, type editor, type Position, type IRange } from 'monaco-editor';\n\ninterface CompletionContext {\n textBeforeCursor: string;\n currentWord: string;\n indentLevel: number;\n lineNumber: number;\n wordStartColumn: number;\n wordEndColumn: number;\n}\n\nconst commonPropertyPaths = [\n 'id',\n 'status',\n 'firstName',\n 'lastName',\n 'fullName',\n 'address.street',\n 'address.city',\n 'lineItems',\n 'lineItems.quantity',\n 'lineNumber',\n 'quantity',\n];\n\nexport class CompletionProvider implements languages.CompletionItemProvider {\n triggerCharacters = ['.', ' ', '=', '$'];\n\n provideCompletionItems(\n model: editor.ITextModel,\n position: Position,\n ): languages.ProviderResult<languages.CompletionList> {\n const context = this.buildContext(model, position);\n const suggestions: languages.CompletionItem[] = [];\n\n if (context.lineNumber === 1) {\n this.addCaptureLineCompletions(suggestions, context);\n } else if (this.isAfterKeyword(context, 'capture')) {\n this.addCaptureNameCompletions(suggestions, context);\n } else if (this.isAfterKeyword(context, 'source')) {\n this.addSourceTypeCompletions(suggestions, context);\n } else if (this.isAfterAppendKeyword(context)) {\n this.addAppendNameCompletions(suggestions, context);\n } else if (this.isAfterWhenKeyword(context)) {\n this.addWhenCompletions(suggestions, context);\n } else if (this.isAfterWhenFrom(context)) {\n this.addFromValueCompletions(suggestions, context);\n } else if (this.isAfterWhenTo(context)) {\n this.addToValueCompletions(suggestions, context);\n } else if (this.isAfterContextPrefix(context, '$.')) {\n this.addPathCompletions(suggestions, context, '$.');\n } else if (this.isAfterContextPrefix(context, '$previous.')) {\n this.addPathCompletions(suggestions, context, '$previous.');\n } else if (this.isAfterContextPrefix(context, '$context.')) {\n this.addContextCompletions(suggestions, context);\n } else if (this.isAfterContextPrefix(context, '$env.')) {\n this.addEnvironmentCompletions(suggestions, context);\n } else if (this.isAfterAssignment(context)) {\n this.addAssignmentValueCompletions(suggestions, context);\n } else if ((this.isStartOfLine(context) || this.isAfterIndent(context)) && context.indentLevel === 1) {\n this.addTopLevelStatementCompletions(suggestions, context);\n } else if ((this.isStartOfLine(context) || this.isAfterIndent(context)) && context.indentLevel >= 2) {\n this.addSourceBlockCompletions(suggestions, context, this.getCurrentSourceType(model, position.lineNumber));\n }\n\n return { suggestions };\n }\n\n private buildContext(model: editor.ITextModel, position: Position): CompletionContext {\n const lineContent = model.getLineContent(position.lineNumber);\n const textBeforeCursor = lineContent.substring(0, position.column - 1);\n const word = model.getWordUntilPosition(position);\n\n return {\n textBeforeCursor,\n currentWord: word.word || '',\n indentLevel: this.getIndentLevel(textBeforeCursor),\n lineNumber: position.lineNumber,\n wordStartColumn: word.startColumn,\n wordEndColumn: word.endColumn,\n };\n }\n\n private getIndentLevel(text: string): number {\n const match = text.match(/^(\\s*)/);\n return match ? Math.floor(match[1].length / 2) : 0;\n }\n\n private isStartOfLine(context: CompletionContext): boolean {\n return context.textBeforeCursor.trim() === '';\n }\n\n private isAfterIndent(context: CompletionContext): boolean {\n return /^\\s+$/.test(context.textBeforeCursor);\n }\n\n private isAfterKeyword(context: CompletionContext, keyword: string): boolean {\n const pattern = new RegExp(`\\\\b${keyword}\\\\s+\\\\w*$`);\n return pattern.test(context.textBeforeCursor);\n }\n\n private isAfterAppendKeyword(context: CompletionContext): boolean {\n return /\\bappend\\s+[\\w.]*$/.test(context.textBeforeCursor);\n }\n\n private isAfterWhenKeyword(context: CompletionContext): boolean {\n return /\\bwhen\\s+[\\w.]*$/.test(context.textBeforeCursor);\n }\n\n private isAfterWhenFrom(context: CompletionContext): boolean {\n return /\\bwhen\\s+[\\w.]+\\s+from\\s+[^\\s]*$/.test(context.textBeforeCursor);\n }\n\n private isAfterWhenTo(context: CompletionContext): boolean {\n return /\\bwhen\\s+[\\w.]+\\s+from\\s+\\S+\\s+to\\s+[^\\s]*$/.test(context.textBeforeCursor);\n }\n\n private isAfterAssignment(context: CompletionContext): boolean {\n return /=\\s*([$\\w.]*)$/.test(context.textBeforeCursor);\n }\n\n private isAfterContextPrefix(context: CompletionContext, prefix: string): boolean {\n return context.textBeforeCursor.endsWith(prefix);\n }\n\n private addCaptureLineCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n const trimmed = context.textBeforeCursor.trim();\n if (trimmed === '' || 'capture'.startsWith(trimmed)) {\n suggestions.push({\n label: 'capture',\n kind: languages.CompletionItemKind.Keyword,\n insertText: 'capture ',\n documentation: 'Define a capture declaration',\n detail: 'capture <Name>',\n range: this.getRangeForWord(context),\n });\n }\n\n if (trimmed.startsWith('capture ')) {\n this.addCaptureNameCompletions(suggestions, context);\n }\n }\n\n private addCaptureNameCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n suggestions.push({\n label: 'CaptureDefinition',\n kind: languages.CompletionItemKind.Class,\n insertText: 'CaptureDefinition',\n documentation: 'A descriptive name for this capture declaration',\n detail: 'Capture name',\n range: this.getRangeForWord(context),\n });\n }\n\n private addSourceTypeCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n [\n { label: 'api', detail: 'source api', documentation: 'Capture data by polling an HTTP API' },\n { label: 'webhook', detail: 'source webhook', documentation: 'Capture data from incoming webhook requests' },\n { label: 'message', detail: 'source message', documentation: 'Capture data from a message topic' },\n { label: 'events', detail: 'source events', documentation: \"Capture another application's public events (inbound translation); each 'from <Event>' names one consumed event\" },\n ].forEach((source) => {\n suggestions.push({\n label: source.label,\n kind: languages.CompletionItemKind.Keyword,\n insertText: source.label,\n documentation: source.documentation,\n detail: source.detail,\n range: this.getRangeForWord(context),\n });\n });\n }\n\n // Per source type \u2014 no `auth`/`bearer`/`url`: an API source references a named\n // External Service (`api <ServiceName>`) for base URL and auth; a webhook source's\n // authentication is configured on the source builder, not in CDL text.\n private addSourceBlockCompletions(suggestions: languages.CompletionItem[], context: CompletionContext, sourceType: string | null): void {\n const options: Record<string, Array<{ label: string; detail: string; documentation: string }>> = {\n api: [\n { label: 'api', detail: 'api <ServiceName>', documentation: 'References a configured External Service by name for the base URL and authentication' },\n { label: 'route', detail: 'route <path>', documentation: 'Optional path appended to the External Service base URL; if omitted, the base URL is used as-is' },\n { label: 'poll', detail: 'poll <interval>', documentation: 'The polling interval, for example 5m' },\n ],\n webhook: [\n { label: 'path', detail: 'path <route>', documentation: 'The inbound path this webhook listens on' },\n ],\n events: [\n { label: 'from', detail: 'from <Event>', documentation: \"Names a public event of another application to consume; repeat for more events\" },\n ],\n message: [\n { label: 'topic', detail: 'topic <name>', documentation: 'The topic or subject to subscribe to' },\n ],\n };\n\n (sourceType ? options[sourceType] ?? [] : []).forEach((option) => {\n suggestions.push({\n label: option.label,\n kind: languages.CompletionItemKind.Keyword,\n insertText: `${option.label} `,\n documentation: option.documentation,\n detail: option.detail,\n range: this.getRangeForWord(context),\n });\n });\n }\n\n private addTopLevelStatementCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n [\n { label: 'key', insertText: 'key ', detail: 'key <property>', documentation: 'Identify the captured entity' },\n { label: 'map', insertText: 'map', detail: 'map', documentation: 'Map captured fields into a normalized shape' },\n { label: 'append', insertText: 'append ', detail: 'append <EventName>', documentation: 'Append an event when a condition matches' },\n { label: 'nested', insertText: 'nested ', detail: 'nested <property>', documentation: 'Create a nested mapping scope' },\n { label: 'children', insertText: 'children ', detail: 'children <collection> identified by <property>', documentation: 'Handle child collections independently' },\n ].forEach((statement) => {\n suggestions.push({\n label: statement.label,\n kind: languages.CompletionItemKind.Keyword,\n insertText: statement.insertText,\n documentation: statement.documentation,\n detail: statement.detail,\n range: this.getRangeForWord(context),\n });\n });\n }\n\n private addAppendNameCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n suggestions.push({\n label: 'ItemChanged',\n kind: languages.CompletionItemKind.Class,\n insertText: 'ItemChanged',\n documentation: 'A generic event name for the appended event',\n detail: 'Event name',\n range: this.getRangeForWord(context),\n });\n }\n\n private addWhenCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n [\n { label: 'added', insertText: 'added', detail: 'when added', documentation: 'Append when a child item was added' },\n { label: 'removed', insertText: 'removed', detail: 'when removed', documentation: 'Append when a child item was removed' },\n { label: 'status', insertText: 'status', detail: 'when <property>', documentation: 'Append when a property changed' },\n { label: 'status transition', insertText: 'status from inactive to active', detail: 'when <property> from <value> to <value>', documentation: 'Append when a property changed between two values' },\n { label: 'quantity', insertText: 'quantity', detail: 'when <property>', documentation: 'Append when a property changed' },\n { label: 'lineNumber', insertText: 'lineNumber', detail: 'when <property>', documentation: 'Append when a specific property changed' },\n ].forEach((option) => {\n suggestions.push({\n label: option.label,\n kind: languages.CompletionItemKind.Keyword,\n insertText: option.insertText,\n documentation: option.documentation,\n detail: option.detail,\n range: this.getRangeForWord(context),\n });\n });\n }\n\n private addFromValueCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n [\n { label: '*', insertText: '*', detail: 'Wildcard', documentation: 'Match any previous value' },\n { label: 'inactive', insertText: 'inactive', detail: 'Common value', documentation: 'A common previous state value' },\n { label: 'active', insertText: 'active', detail: 'Common value', documentation: 'A common previous state value' },\n { label: 'true', insertText: 'true', detail: 'Boolean value', documentation: 'Boolean true' },\n { label: 'false', insertText: 'false', detail: 'Boolean value', documentation: 'Boolean false' },\n ].forEach((option) => {\n suggestions.push({\n label: option.label,\n kind: languages.CompletionItemKind.Value,\n insertText: option.insertText,\n documentation: option.documentation,\n detail: option.detail,\n range: this.getRangeForWord(context),\n });\n });\n }\n\n private addToValueCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n ['active', 'inactive', 'pending', 'true', 'false'].forEach((value) => {\n suggestions.push({\n label: value,\n kind: languages.CompletionItemKind.Value,\n insertText: value,\n documentation: `Common target value: ${value}`,\n detail: 'Target value',\n range: this.getRangeForWord(context),\n });\n });\n }\n\n private addAssignmentValueCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n [\n { label: '$.', insertText: '$.', detail: 'Current captured value', documentation: 'Reference the current captured payload' },\n { label: '$previous.', insertText: '$previous.', detail: 'Previous captured value', documentation: 'Reference the previous state of the payload' },\n { label: '$context.occurred', insertText: '$context.occurred', detail: 'Occurred timestamp', documentation: 'When the capture source produced the current data' },\n { label: '$context.eventSourceId', insertText: '$context.eventSourceId', detail: 'Event source identifier', documentation: 'The resolved event source identifier for the append operation' },\n { label: '$env.', insertText: '$env.', detail: 'Environment variable', documentation: 'Read an environment variable' },\n ].forEach((option) => {\n suggestions.push({\n label: option.label,\n kind: languages.CompletionItemKind.Variable,\n insertText: option.insertText,\n documentation: option.documentation,\n detail: option.detail,\n range: this.getRangeForWord(context),\n });\n });\n }\n\n private addPathCompletions(suggestions: languages.CompletionItem[], context: CompletionContext, prefix: string): void {\n commonPropertyPaths.forEach((path) => {\n suggestions.push({\n label: path,\n kind: languages.CompletionItemKind.Property,\n insertText: `${prefix}${path}`,\n documentation: `Common property path: ${prefix}${path}`,\n detail: prefix === '$.' ? 'Current value path' : 'Previous value path',\n range: this.getRangeForWord(context),\n });\n });\n }\n\n private addContextCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n [\n { label: 'occurred', insertText: '$context.occurred', detail: 'When the event occurred', documentation: 'Timestamp for when the append event happened' },\n { label: 'eventSourceId', insertText: '$context.eventSourceId', detail: 'Event source identifier', documentation: 'The event source identifier used for the appended event' },\n ].forEach((option) => {\n suggestions.push({\n label: option.label,\n kind: languages.CompletionItemKind.Property,\n insertText: option.insertText,\n documentation: option.documentation,\n detail: option.detail,\n range: this.getRangeForWord(context),\n });\n });\n }\n\n private addEnvironmentCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n suggestions.push({\n label: 'API_TOKEN',\n kind: languages.CompletionItemKind.Variable,\n insertText: '$env.API_TOKEN',\n documentation: 'Placeholder environment variable reference',\n detail: 'Environment variable',\n range: this.getRangeForWord(context),\n });\n }\n\n private getCurrentSourceType(model: editor.ITextModel, lineNumber: number): string | null {\n for (let index = lineNumber; index >= 1; index--) {\n const line = model.getLineContent(index).trim();\n const match = line.match(/^source\\s+(api|webhook|message|events)\\b/);\n if (match) {\n return match[1];\n }\n }\n return null;\n }\n\n private getRangeForWord(context: CompletionContext): IRange {\n return {\n startLineNumber: context.lineNumber,\n endLineNumber: context.lineNumber,\n startColumn: context.wordStartColumn,\n endColumn: context.wordEndColumn,\n };\n }\n}\n", "// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { editor, languages, Position, IRange } from 'monaco-editor';\n\nexport class HoverProvider implements languages.HoverProvider {\n provideHover(model: editor.ITextModel, position: Position): languages.ProviderResult<languages.Hover> {\n const token = this.getTokenAtPosition(model, position);\n if (!token) {\n return null;\n }\n\n const keywordInfo = this.getKeywordInfo(token.word);\n if (keywordInfo) {\n return {\n contents: [{ value: keywordInfo }],\n range: token.range,\n };\n }\n\n const expressionInfo = this.getExpressionInfo(token.word);\n if (expressionInfo) {\n return {\n contents: [{ value: expressionInfo }],\n range: token.range,\n };\n }\n\n return null;\n }\n\n private getTokenAtPosition(model: editor.ITextModel, position: Position): { word: string; range: IRange } | null {\n const lineContent = model.getLineContent(position.lineNumber);\n const tokens = [...lineContent.matchAll(/\\$context|\\$previous|\\$env|[a-zA-Z_][\\w-]*/g)];\n const column = position.column - 1;\n\n for (const token of tokens) {\n const startIndex = token.index ?? 0;\n const endIndex = startIndex + token[0].length;\n if (column >= startIndex && column <= endIndex) {\n return {\n word: token[0],\n range: {\n startLineNumber: position.lineNumber,\n endLineNumber: position.lineNumber,\n startColumn: startIndex + 1,\n endColumn: endIndex + 1,\n },\n };\n }\n }\n\n return null;\n }\n\n // No `auth`/`bearer`/`url` \u2014 removed with the grammar. `api`, `route`, `path`, and\n // `topic` reflect the current source-property meanings (see grammar.md).\n private getKeywordInfo(word: string): string | null {\n const keywords: Record<string, string> = {\n capture: '**capture** *<Name>*\\n\\nDeclares a capture and gives it a unique name.',\n source: '**source** *<type>*\\n\\nDefines where the capture reads input from.',\n key: '**key** *<property>*\\n\\nSelects the property used to identify each captured item.',\n map: '**map**\\n\\nMaps source fields into a normalized shape for later append blocks.',\n append: '**append** *<EventName>*\\n\\nDeclares an event to append when the `when` clause matches.',\n when: '**when** *<condition>*\\n\\nSpecifies when an append block should fire.',\n nested: '**nested** *<property>*\\n\\nCreates a nested mapping scope for an object property.',\n children: '**children** *<collection>* **identified by** *<property>*\\n\\nCreates a scope for child collection items.',\n identified: '**identified**\\n\\nUsed with `children` to declare how child items are identified.',\n by: '**by**\\n\\nUsed in `children ... identified by`, `split ... by`, and similar clauses.',\n api: '**api**\\n\\nAs a source type (`source api`): polls an HTTP API for changes.\\n\\nAs a source property (`api <ServiceName>`): references a configured External Service by name for the base URL and authentication.',\n webhook: '**webhook**\\n\\nA source type for receiving webhook payloads.',\n message: '**message**\\n\\nA source type for consuming messages from a topic.',\n events: \"**events**\\n\\nA source type for consuming the public events of another application: `source events` with one `from <Event>` line per event. Inbound Translate slices only; admitted by executable semantic model (ESM) v9. The reference runner reports a typed Unsupported outcome for `when capture` over it.\",\n route: '**route** *<path>*\\n\\nOptional path appended to an API source\\'s External Service base URL. If omitted, the base URL is used as-is.',\n poll: '**poll** *<interval>*\\n\\nSets the polling interval for an API source.',\n path: '**path** *<route>*\\n\\nThe inbound path a webhook source listens on.',\n topic: '**topic** *<name>*\\n\\nConfigures the topic for a message source.',\n from: '**from** *<value>*\\n\\nUsed in a `when` clause to match the previous value, and under `source events` to name a consumed public event (`from <Event>`).',\n to: '**to** *<value>*\\n\\nUsed in a `when` clause to match the new value.',\n or: '**or**\\n\\nCombines multiple `when` conditions.',\n and: '**and**\\n\\nCombines multiple `when` conditions that must all match.',\n added: '**added**\\n\\nMatches when a child item was added.',\n removed: '**removed**\\n\\nMatches when a child item was removed.',\n translate: '**translate**\\n\\nMaps source values to new values inside a `map` block.',\n split: '**split** *<value>* **by** *<separator>*\\n\\nSplits a string into multiple mapped fields.',\n };\n\n return keywords[word] || null;\n }\n\n private getExpressionInfo(word: string): string | null {\n const expressions: Record<string, string> = {\n '$context': '**$context**\\n\\nCapture execution context.\\n\\n**Properties:**\\n- `occurred` - When the current event should be considered to have occurred\\n- `eventSourceId` - The resolved event source identifier',\n '$previous': '**$previous**\\n\\nThe previous state for the captured item. Use dot notation such as `$previous.status`.',\n '$env': '**$env**\\n\\nEnvironment variables. Use dot notation such as `$env.API_TOKEN`.',\n };\n\n return expressions[word] || null;\n }\n}\n", "// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { ValidationIssue } from '../../validation';\n\ninterface MeaningfulLine {\n line: string;\n trimmed: string;\n lineNumber: number;\n indent: number;\n}\n\n// Structural rules only, unaffected by the source-property grammar changes \u2014 the\n// grammar's own syntax (see grammar.md) is what the tokenizer enforces; these are\n// the compiler's semantic constraints on top of it. Takes plain lines rather than\n// a Monaco model so it stays usable outside an editor, matching ../../validation.ts.\nexport class Validator {\n validate(lines: string[]): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n let firstNonEmptyLineIndex = -1;\n let firstLine = '';\n for (let index = 0; index < lines.length; index++) {\n const trimmed = lines[index].trim();\n if (trimmed && !trimmed.startsWith('#')) {\n firstNonEmptyLineIndex = index;\n firstLine = trimmed;\n break;\n }\n }\n\n if (!firstLine) {\n return issues;\n }\n\n const captureMatch = firstLine.match(/^capture\\s+([\\w.]+)\\s*$/);\n if (!captureMatch) {\n issues.push(this.error(firstNonEmptyLineIndex, 1, firstLine.length + 1, 'Capture definition must start with \"capture <Name>\"'));\n return issues;\n }\n\n const meaningfulLines: MeaningfulLine[] = lines\n .map((line, index) => ({\n line,\n trimmed: line.trim(),\n lineNumber: index,\n indent: line.search(/\\S/),\n }))\n .filter((entry) => entry.trimmed && !entry.trimmed.startsWith('#'));\n\n const hasSource = meaningfulLines.some((entry) => entry.trimmed.startsWith('source '));\n if (!hasSource) {\n issues.push(this.error(firstNonEmptyLineIndex, 1, firstLine.length + 1, 'Capture definition must include a \"source\" block'));\n }\n\n const hasKey = meaningfulLines.some((entry) => entry.trimmed.startsWith('key '));\n if (!hasKey) {\n issues.push(this.error(firstNonEmptyLineIndex, 1, firstLine.length + 1, 'Capture definition must include a \"key\" declaration'));\n }\n\n for (let index = 0; index < meaningfulLines.length; index++) {\n const current = meaningfulLines[index];\n if (!current.trimmed.startsWith('append ')) {\n continue;\n }\n\n let hasWhenClause = false;\n for (let next = index + 1; next < meaningfulLines.length; next++) {\n const candidate = meaningfulLines[next];\n if (candidate.indent <= current.indent) {\n break;\n }\n if (candidate.trimmed.startsWith('when ')) {\n hasWhenClause = true;\n break;\n }\n }\n\n if (!hasWhenClause) {\n const eventName = current.trimmed.substring('append '.length).trim() || 'unnamed append block';\n const startColumn = current.line.indexOf(eventName) + 1;\n issues.push(this.error(\n current.lineNumber,\n startColumn > 0 ? startColumn : 1,\n startColumn > 0 ? startColumn + eventName.length : current.line.length + 1,\n `Append block '${eventName}' must include a \"when\" clause`,\n ));\n }\n }\n\n return issues;\n }\n\n private error(line: number, startColumn: number, endColumn: number, message: string): ValidationIssue {\n return { severity: 'error', line, startColumn, endColumn, message };\n }\n}\n", "// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { IDisposable, editor } from 'monaco-editor';\nimport { Monaco, languageConfiguration, languageId, monarchLanguage } from './language';\nimport { CompletionProvider } from './CompletionProvider';\nimport { HoverProvider } from './HoverProvider';\nimport { Validator } from './Validator';\n\nconst markerOwner = 'cdl-validator';\n\n// Keyed by Monaco instance rather than a single boolean \u2014 mirrors the composite\n// language's own registration guard (../../index.ts) and lets a second register()\n// call for the same instance hand back the existing disposer instead of doubling\n// up the completion/hover providers.\nconst disposersByMonaco = new Map<Monaco, () => void>();\n\nfunction toMarkers(monaco: Monaco, validator: Validator, model: editor.ITextModel): editor.IMarkerData[] {\n return validator.validate(model.getLinesContent()).map((issue) => ({\n severity: issue.severity === 'error' ? monaco.MarkerSeverity.Error : monaco.MarkerSeverity.Warning,\n message: issue.message,\n startLineNumber: issue.line + 1,\n startColumn: issue.startColumn,\n endLineNumber: issue.line + 1,\n endColumn: issue.endColumn,\n }));\n}\n\nexport function registerCaptureLanguage(monaco: Monaco): { dispose(): void } {\n const existing = disposersByMonaco.get(monaco);\n if (existing) {\n return { dispose: existing };\n }\n\n monaco.languages.register({ id: languageId });\n monaco.languages.setLanguageConfiguration(languageId, languageConfiguration);\n monaco.languages.setMonarchTokensProvider(languageId, monarchLanguage);\n\n const validator = new Validator();\n const disposables: IDisposable[] = [];\n\n disposables.push(monaco.languages.registerCompletionItemProvider(languageId, new CompletionProvider()));\n disposables.push(monaco.languages.registerHoverProvider(languageId, new HoverProvider()));\n\n const validateModel = (model: editor.ITextModel): void => {\n if (model.isDisposed() || model.getLanguageId() !== languageId) {\n return;\n }\n monaco.editor.setModelMarkers(model, markerOwner, toMarkers(monaco, validator, model));\n };\n\n disposables.push(monaco.editor.onDidCreateModel((model) => {\n if (model.getLanguageId() !== languageId) {\n return;\n }\n validateModel(model);\n disposables.push(model.onDidChangeContent(() => validateModel(model)));\n }));\n\n monaco.editor.getModels().forEach((model) => validateModel(model));\n\n const dispose = (): void => {\n disposables.forEach((disposable) => disposable.dispose());\n disposables.length = 0;\n disposersByMonaco.delete(monaco);\n };\n\n disposersByMonaco.set(monaco, dispose);\n return { dispose };\n}\n\nexport { languageId } from './language';\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { languages } from 'monaco-editor';\n\nexport type Monaco = typeof import('monaco-editor');\n\n// Capture Declaration Language (CDL) \u2014 Chronicle's DSL for declaring change-data-capture\n// rules, registered here as its own standalone top-level Monaco language. This is distinct\n// from the lightweight CDL sub-language embedded inside a `.play` document's `capture`\n// blocks (../cdl.ts) \u2014 this module owns its own language id, tokenizer, and providers.\nexport const languageId = 'cdl';\n\n// `route`/`poll` are API source properties; `path` is the webhook inbound path; `topic`\n// is the message source subject. There is no `auth`/`bearer`/`url` \u2014 an API source\n// references a named External Service (`api <ServiceName>`) for base URL and auth, and\n// a webhook source's authentication is configured on the source builder, not in CDL text.\nconst KEYWORDS = [\n 'capture',\n 'source',\n 'key',\n 'map',\n 'append',\n 'when',\n 'nested',\n 'children',\n 'identified',\n 'by',\n 'api',\n 'webhook',\n 'message',\n 'events',\n 'route',\n 'poll',\n 'path',\n 'topic',\n 'from',\n 'to',\n 'or',\n 'and',\n 'added',\n 'removed',\n 'translate',\n 'split',\n] as const;\n\nconst BUILTINS = [\n '$context',\n '$identity',\n '$previous',\n '$env',\n] as const;\n\nconst OPERATORS = ['=', '=>', '.'];\n\nexport const languageConfiguration: languages.LanguageConfiguration = {\n comments: {\n lineComment: '#',\n },\n brackets: [\n ['{', '}'],\n ['[', ']'],\n ['(', ')'],\n ],\n autoClosingPairs: [\n { open: '{', close: '}' },\n { open: '[', close: ']' },\n { open: '(', close: ')' },\n { open: '\"', close: '\"' },\n { open: \"'\", close: \"'\" },\n { open: '`', close: '`' },\n ],\n surroundingPairs: [\n { open: '{', close: '}' },\n { open: '[', close: ']' },\n { open: '(', close: ')' },\n { open: '\"', close: '\"' },\n { open: \"'\", close: \"'\" },\n { open: '`', close: '`' },\n ],\n indentationRules: {\n increaseIndentPattern: /^.*(\\bcapture\\b\\s+\\S+|\\bsource\\b(?:\\s+\\w+)?|\\bmap\\b|\\bappend\\b\\s+\\S+|\\bnested\\b\\s+\\S+|\\bchildren\\b\\s+\\S+.*|\\btranslate\\b|\\bsplit\\b.*)\\s*$/,\n decreaseIndentPattern: /^.*\\}.*$/,\n },\n folding: {\n offSide: true,\n markers: {\n start: /^\\s*(capture|source|map|append|nested|children|translate|split)/,\n end: /^\\s*$/,\n },\n },\n wordPattern: /[$]?[a-zA-Z_][\\w$-]*/,\n};\n\nexport const monarchLanguage: languages.IMonarchLanguage = {\n defaultToken: '',\n tokenPostfix: '.cdl',\n\n keywords: KEYWORDS,\n builtins: BUILTINS,\n operators: OPERATORS,\n\n symbols: /[=><!~?:&|+\\-*/^%]+/,\n escapes: /\\\\(?:[abfnrtv\\\\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,\n\n tokenizer: {\n root: [\n { include: '@whitespace' },\n [/`/, { token: 'string.template', next: '@templateString' }],\n [/\\$\\.(?:[a-zA-Z_]\\w*(?:\\.[a-zA-Z_]\\w*)*)?/, 'variable'],\n [/\\$previous(?:\\.[a-zA-Z_]\\w*(?:\\.[a-zA-Z_]\\w*)*)?/, 'variable.predefined'],\n [/\\$context(?:\\.(?:occurred|eventSourceId))?/, 'variable.predefined'],\n [/\\$identity(?:\\.\\w+)*/, 'variable.predefined'],\n [/\\$env(?:\\.[A-Z_][A-Z0-9_]*)?/, 'variable.predefined'],\n [/@[a-zA-Z_$][\\w$]*/, 'identifier.escape'],\n [\n /[A-Z][a-zA-Z_$][\\w$]*/,\n {\n cases: {\n '@keywords': 'invalid',\n '@default': 'identifier',\n },\n },\n ],\n [\n /[a-z_$][\\w$]*/,\n {\n cases: {\n '@keywords': 'keyword',\n '@builtins': 'variable.predefined',\n '@default': 'identifier',\n },\n },\n ],\n [/[{}()[\\]]/, '@brackets'],\n [/=>/, 'operator.arrow'],\n [\n /@symbols/,\n {\n cases: {\n '@operators': 'operator',\n '@default': '',\n },\n },\n ],\n [/\\d*\\.\\d+([eE][-+]?\\d+)?/, 'number.float'],\n [/0[xX][0-9a-fA-F]+/, 'number.hex'],\n [/\\d+/, 'number'],\n [/[;,.]/, 'delimiter'],\n [/\"([^\"\\\\]|\\\\.)*$/, 'string.invalid'],\n [/\"/, { token: 'string.quote', next: '@string' }],\n ],\n\n whitespace: [\n [/[ \\t\\r\\n]+/, ''],\n [/#.*$/, 'comment'],\n ],\n\n templateString: [\n [/\\$\\{/, { token: 'delimiter.bracket', next: '@templateExpression' }],\n [/[^\\\\`$]+/, 'string.template'],\n [/@escapes/, 'string.template.escape'],\n [/\\\\./, 'string.template.escape.invalid'],\n [/`/, { token: 'string.template', next: '@pop' }],\n ],\n\n templateExpression: [\n [/\\}/, { token: 'delimiter.bracket', next: '@pop' }],\n { include: '@root' },\n ],\n\n string: [\n [/[^\\\\\"]+/, 'string'],\n [/@escapes/, 'string.escape'],\n [/\\\\./, 'string.escape.invalid'],\n [/\"/, { token: 'string.quote', next: '@pop' }],\n ],\n },\n};\n", "// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { languages, type editor, type Position, type IRange } from 'monaco-editor';\n\ninterface CompletionContext {\n textBeforeCursor: string;\n currentWord: string;\n indentLevel: number;\n lineNumber: number;\n wordStartColumn: number;\n wordEndColumn: number;\n}\n\nconst commonPropertyPaths = [\n 'id',\n 'status',\n 'firstName',\n 'lastName',\n 'fullName',\n 'address.street',\n 'address.city',\n 'lineItems',\n 'lineItems.quantity',\n 'lineNumber',\n 'quantity',\n];\n\nexport class CompletionProvider implements languages.CompletionItemProvider {\n triggerCharacters = ['.', ' ', '=', '$'];\n\n provideCompletionItems(\n model: editor.ITextModel,\n position: Position,\n ): languages.ProviderResult<languages.CompletionList> {\n const context = this.buildContext(model, position);\n const suggestions: languages.CompletionItem[] = [];\n\n if (context.lineNumber === 1) {\n this.addCaptureLineCompletions(suggestions, context);\n } else if (this.isAfterKeyword(context, 'capture')) {\n this.addCaptureNameCompletions(suggestions, context);\n } else if (this.isAfterKeyword(context, 'source')) {\n this.addSourceTypeCompletions(suggestions, context);\n } else if (this.isAfterAppendKeyword(context)) {\n this.addAppendNameCompletions(suggestions, context);\n } else if (this.isAfterWhenKeyword(context)) {\n this.addWhenCompletions(suggestions, context);\n } else if (this.isAfterWhenFrom(context)) {\n this.addFromValueCompletions(suggestions, context);\n } else if (this.isAfterWhenTo(context)) {\n this.addToValueCompletions(suggestions, context);\n } else if (this.isAfterContextPrefix(context, '$.')) {\n this.addPathCompletions(suggestions, context, '$.');\n } else if (this.isAfterContextPrefix(context, '$previous.')) {\n this.addPathCompletions(suggestions, context, '$previous.');\n } else if (this.isAfterContextPrefix(context, '$context.')) {\n this.addContextCompletions(suggestions, context);\n } else if (this.isAfterContextPrefix(context, '$env.')) {\n this.addEnvironmentCompletions(suggestions, context);\n } else if (this.isAfterAssignment(context)) {\n this.addAssignmentValueCompletions(suggestions, context);\n } else if ((this.isStartOfLine(context) || this.isAfterIndent(context)) && context.indentLevel === 1) {\n this.addTopLevelStatementCompletions(suggestions, context);\n } else if ((this.isStartOfLine(context) || this.isAfterIndent(context)) && context.indentLevel >= 2) {\n this.addSourceBlockCompletions(suggestions, context, this.getCurrentSourceType(model, position.lineNumber));\n }\n\n return { suggestions };\n }\n\n private buildContext(model: editor.ITextModel, position: Position): CompletionContext {\n const lineContent = model.getLineContent(position.lineNumber);\n const textBeforeCursor = lineContent.substring(0, position.column - 1);\n const word = model.getWordUntilPosition(position);\n\n return {\n textBeforeCursor,\n currentWord: word.word || '',\n indentLevel: this.getIndentLevel(textBeforeCursor),\n lineNumber: position.lineNumber,\n wordStartColumn: word.startColumn,\n wordEndColumn: word.endColumn,\n };\n }\n\n private getIndentLevel(text: string): number {\n const match = text.match(/^(\\s*)/);\n return match ? Math.floor(match[1].length / 2) : 0;\n }\n\n private isStartOfLine(context: CompletionContext): boolean {\n return context.textBeforeCursor.trim() === '';\n }\n\n private isAfterIndent(context: CompletionContext): boolean {\n return /^\\s+$/.test(context.textBeforeCursor);\n }\n\n private isAfterKeyword(context: CompletionContext, keyword: string): boolean {\n const pattern = new RegExp(`\\\\b${keyword}\\\\s+\\\\w*$`);\n return pattern.test(context.textBeforeCursor);\n }\n\n private isAfterAppendKeyword(context: CompletionContext): boolean {\n return /\\bappend\\s+[\\w.]*$/.test(context.textBeforeCursor);\n }\n\n private isAfterWhenKeyword(context: CompletionContext): boolean {\n return /\\bwhen\\s+[\\w.]*$/.test(context.textBeforeCursor);\n }\n\n private isAfterWhenFrom(context: CompletionContext): boolean {\n return /\\bwhen\\s+[\\w.]+\\s+from\\s+[^\\s]*$/.test(context.textBeforeCursor);\n }\n\n private isAfterWhenTo(context: CompletionContext): boolean {\n return /\\bwhen\\s+[\\w.]+\\s+from\\s+\\S+\\s+to\\s+[^\\s]*$/.test(context.textBeforeCursor);\n }\n\n private isAfterAssignment(context: CompletionContext): boolean {\n return /=\\s*([$\\w.]*)$/.test(context.textBeforeCursor);\n }\n\n private isAfterContextPrefix(context: CompletionContext, prefix: string): boolean {\n return context.textBeforeCursor.endsWith(prefix);\n }\n\n private addCaptureLineCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n const trimmed = context.textBeforeCursor.trim();\n if (trimmed === '' || 'capture'.startsWith(trimmed)) {\n suggestions.push({\n label: 'capture',\n kind: languages.CompletionItemKind.Keyword,\n insertText: 'capture ',\n documentation: 'Define a capture declaration',\n detail: 'capture <Name>',\n range: this.getRangeForWord(context),\n });\n }\n\n if (trimmed.startsWith('capture ')) {\n this.addCaptureNameCompletions(suggestions, context);\n }\n }\n\n private addCaptureNameCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n suggestions.push({\n label: 'CaptureDefinition',\n kind: languages.CompletionItemKind.Class,\n insertText: 'CaptureDefinition',\n documentation: 'A descriptive name for this capture declaration',\n detail: 'Capture name',\n range: this.getRangeForWord(context),\n });\n }\n\n private addSourceTypeCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n [\n { label: 'api', detail: 'source api', documentation: 'Capture data by polling an HTTP API' },\n { label: 'webhook', detail: 'source webhook', documentation: 'Capture data from incoming webhook requests' },\n { label: 'message', detail: 'source message', documentation: 'Capture data from a message topic' },\n { label: 'events', detail: 'source events', documentation: \"Capture another application's public events (inbound translation); each 'from <Event>' names one consumed event\" },\n ].forEach((source) => {\n suggestions.push({\n label: source.label,\n kind: languages.CompletionItemKind.Keyword,\n insertText: source.label,\n documentation: source.documentation,\n detail: source.detail,\n range: this.getRangeForWord(context),\n });\n });\n }\n\n // Per source type \u2014 no `auth`/`bearer`/`url`: an API source references a named\n // External Service (`api <ServiceName>`) for base URL and auth; a webhook source's\n // authentication is configured on the source builder, not in CDL text.\n private addSourceBlockCompletions(suggestions: languages.CompletionItem[], context: CompletionContext, sourceType: string | null): void {\n const options: Record<string, Array<{ label: string; detail: string; documentation: string }>> = {\n api: [\n { label: 'api', detail: 'api <ServiceName>', documentation: 'References a configured External Service by name for the base URL and authentication' },\n { label: 'route', detail: 'route <path>', documentation: 'Optional path appended to the External Service base URL; if omitted, the base URL is used as-is' },\n { label: 'poll', detail: 'poll <interval>', documentation: 'The polling interval, for example 5m' },\n ],\n webhook: [\n { label: 'path', detail: 'path <route>', documentation: 'The inbound path this webhook listens on' },\n ],\n events: [\n { label: 'from', detail: 'from <Event>', documentation: \"Names a public event of another application to consume; repeat for more events\" },\n ],\n message: [\n { label: 'topic', detail: 'topic <name>', documentation: 'The topic or subject to subscribe to' },\n ],\n };\n\n (sourceType ? options[sourceType] ?? [] : []).forEach((option) => {\n suggestions.push({\n label: option.label,\n kind: languages.CompletionItemKind.Keyword,\n insertText: `${option.label} `,\n documentation: option.documentation,\n detail: option.detail,\n range: this.getRangeForWord(context),\n });\n });\n }\n\n private addTopLevelStatementCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n [\n { label: 'key', insertText: 'key ', detail: 'key <property>', documentation: 'Identify the captured entity' },\n { label: 'map', insertText: 'map', detail: 'map', documentation: 'Map captured fields into a normalized shape' },\n { label: 'append', insertText: 'append ', detail: 'append <EventName>', documentation: 'Append an event when a condition matches' },\n { label: 'nested', insertText: 'nested ', detail: 'nested <property>', documentation: 'Create a nested mapping scope' },\n { label: 'children', insertText: 'children ', detail: 'children <collection> identified by <property>', documentation: 'Handle child collections independently' },\n ].forEach((statement) => {\n suggestions.push({\n label: statement.label,\n kind: languages.CompletionItemKind.Keyword,\n insertText: statement.insertText,\n documentation: statement.documentation,\n detail: statement.detail,\n range: this.getRangeForWord(context),\n });\n });\n }\n\n private addAppendNameCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n suggestions.push({\n label: 'ItemChanged',\n kind: languages.CompletionItemKind.Class,\n insertText: 'ItemChanged',\n documentation: 'A generic event name for the appended event',\n detail: 'Event name',\n range: this.getRangeForWord(context),\n });\n }\n\n private addWhenCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n [\n { label: 'added', insertText: 'added', detail: 'when added', documentation: 'Append when a child item was added' },\n { label: 'removed', insertText: 'removed', detail: 'when removed', documentation: 'Append when a child item was removed' },\n { label: 'status', insertText: 'status', detail: 'when <property>', documentation: 'Append when a property changed' },\n { label: 'status transition', insertText: 'status from inactive to active', detail: 'when <property> from <value> to <value>', documentation: 'Append when a property changed between two values' },\n { label: 'quantity', insertText: 'quantity', detail: 'when <property>', documentation: 'Append when a property changed' },\n { label: 'lineNumber', insertText: 'lineNumber', detail: 'when <property>', documentation: 'Append when a specific property changed' },\n ].forEach((option) => {\n suggestions.push({\n label: option.label,\n kind: languages.CompletionItemKind.Keyword,\n insertText: option.insertText,\n documentation: option.documentation,\n detail: option.detail,\n range: this.getRangeForWord(context),\n });\n });\n }\n\n private addFromValueCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n [\n { label: '*', insertText: '*', detail: 'Wildcard', documentation: 'Match any previous value' },\n { label: 'inactive', insertText: 'inactive', detail: 'Common value', documentation: 'A common previous state value' },\n { label: 'active', insertText: 'active', detail: 'Common value', documentation: 'A common previous state value' },\n { label: 'true', insertText: 'true', detail: 'Boolean value', documentation: 'Boolean true' },\n { label: 'false', insertText: 'false', detail: 'Boolean value', documentation: 'Boolean false' },\n ].forEach((option) => {\n suggestions.push({\n label: option.label,\n kind: languages.CompletionItemKind.Value,\n insertText: option.insertText,\n documentation: option.documentation,\n detail: option.detail,\n range: this.getRangeForWord(context),\n });\n });\n }\n\n private addToValueCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n ['active', 'inactive', 'pending', 'true', 'false'].forEach((value) => {\n suggestions.push({\n label: value,\n kind: languages.CompletionItemKind.Value,\n insertText: value,\n documentation: `Common target value: ${value}`,\n detail: 'Target value',\n range: this.getRangeForWord(context),\n });\n });\n }\n\n private addAssignmentValueCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n [\n { label: '$.', insertText: '$.', detail: 'Current captured value', documentation: 'Reference the current captured payload' },\n { label: '$previous.', insertText: '$previous.', detail: 'Previous captured value', documentation: 'Reference the previous state of the payload' },\n { label: '$context.occurred', insertText: '$context.occurred', detail: 'Occurred timestamp', documentation: 'When the capture source produced the current data' },\n { label: '$context.eventSourceId', insertText: '$context.eventSourceId', detail: 'Event source identifier', documentation: 'The resolved event source identifier for the append operation' },\n { label: '$env.', insertText: '$env.', detail: 'Environment variable', documentation: 'Read an environment variable' },\n ].forEach((option) => {\n suggestions.push({\n label: option.label,\n kind: languages.CompletionItemKind.Variable,\n insertText: option.insertText,\n documentation: option.documentation,\n detail: option.detail,\n range: this.getRangeForWord(context),\n });\n });\n }\n\n private addPathCompletions(suggestions: languages.CompletionItem[], context: CompletionContext, prefix: string): void {\n commonPropertyPaths.forEach((path) => {\n suggestions.push({\n label: path,\n kind: languages.CompletionItemKind.Property,\n insertText: `${prefix}${path}`,\n documentation: `Common property path: ${prefix}${path}`,\n detail: prefix === '$.' ? 'Current value path' : 'Previous value path',\n range: this.getRangeForWord(context),\n });\n });\n }\n\n private addContextCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n [\n { label: 'occurred', insertText: '$context.occurred', detail: 'When the event occurred', documentation: 'Timestamp for when the append event happened' },\n { label: 'eventSourceId', insertText: '$context.eventSourceId', detail: 'Event source identifier', documentation: 'The event source identifier used for the appended event' },\n ].forEach((option) => {\n suggestions.push({\n label: option.label,\n kind: languages.CompletionItemKind.Property,\n insertText: option.insertText,\n documentation: option.documentation,\n detail: option.detail,\n range: this.getRangeForWord(context),\n });\n });\n }\n\n private addEnvironmentCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n suggestions.push({\n label: 'API_TOKEN',\n kind: languages.CompletionItemKind.Variable,\n insertText: '$env.API_TOKEN',\n documentation: 'Placeholder environment variable reference',\n detail: 'Environment variable',\n range: this.getRangeForWord(context),\n });\n }\n\n private getCurrentSourceType(model: editor.ITextModel, lineNumber: number): string | null {\n for (let index = lineNumber; index >= 1; index--) {\n const line = model.getLineContent(index).trim();\n const match = line.match(/^source\\s+(api|webhook|message|events)\\b/);\n if (match) {\n return match[1];\n }\n }\n return null;\n }\n\n private getRangeForWord(context: CompletionContext): IRange {\n return {\n startLineNumber: context.lineNumber,\n endLineNumber: context.lineNumber,\n startColumn: context.wordStartColumn,\n endColumn: context.wordEndColumn,\n };\n }\n}\n", "// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { editor, languages, Position, IRange } from 'monaco-editor';\n\nexport class HoverProvider implements languages.HoverProvider {\n provideHover(model: editor.ITextModel, position: Position): languages.ProviderResult<languages.Hover> {\n const token = this.getTokenAtPosition(model, position);\n if (!token) {\n return null;\n }\n\n const keywordInfo = this.getKeywordInfo(token.word);\n if (keywordInfo) {\n return {\n contents: [{ value: keywordInfo }],\n range: token.range,\n };\n }\n\n const expressionInfo = this.getExpressionInfo(token.word);\n if (expressionInfo) {\n return {\n contents: [{ value: expressionInfo }],\n range: token.range,\n };\n }\n\n return null;\n }\n\n private getTokenAtPosition(model: editor.ITextModel, position: Position): { word: string; range: IRange } | null {\n const lineContent = model.getLineContent(position.lineNumber);\n const tokens = [...lineContent.matchAll(/\\$context|\\$identity|\\$previous|\\$env|[a-zA-Z_][\\w-]*/g)];\n const column = position.column - 1;\n\n for (const token of tokens) {\n const startIndex = token.index ?? 0;\n const endIndex = startIndex + token[0].length;\n if (column >= startIndex && column <= endIndex) {\n return {\n word: token[0],\n range: {\n startLineNumber: position.lineNumber,\n endLineNumber: position.lineNumber,\n startColumn: startIndex + 1,\n endColumn: endIndex + 1,\n },\n };\n }\n }\n\n return null;\n }\n\n // No `auth`/`bearer`/`url` \u2014 removed with the grammar. `api`, `route`, `path`, and\n // `topic` reflect the current source-property meanings (see grammar.md).\n private getKeywordInfo(word: string): string | null {\n const keywords: Record<string, string> = {\n capture: '**capture** *<Name>*\\n\\nDeclares a capture and gives it a unique name.',\n source: '**source** *<type>*\\n\\nDefines where the capture reads input from.',\n key: '**key** *<property>*\\n\\nSelects the property used to identify each captured item.',\n map: '**map**\\n\\nMaps source fields into a normalized shape for later append blocks.',\n append: '**append** *<EventName>*\\n\\nDeclares an event to append when the `when` clause matches.',\n when: '**when** *<condition>*\\n\\nSpecifies when an append block should fire.',\n nested: '**nested** *<property>*\\n\\nCreates a nested mapping scope for an object property.',\n children: '**children** *<collection>* **identified by** *<property>*\\n\\nCreates a scope for child collection items.',\n identified: '**identified**\\n\\nUsed with `children` to declare how child items are identified.',\n by: '**by**\\n\\nUsed in `children ... identified by`, `split ... by`, and similar clauses.',\n api: '**api**\\n\\nAs a source type (`source api`): polls an HTTP API for changes.\\n\\nAs a source property (`api <ServiceName>`): references a configured External Service by name for the base URL and authentication.',\n webhook: '**webhook**\\n\\nA source type for receiving webhook payloads.',\n message: '**message**\\n\\nA source type for consuming messages from a topic.',\n events: \"**events**\\n\\nA source type for consuming the public events of another application: `source events` with one `from <Event>` line per event. Inbound Translate slices only; admitted by executable semantic model (ESM) v9. The reference runner reports a typed Unsupported outcome for `when capture` over it.\",\n route: '**route** *<path>*\\n\\nOptional path appended to an API source\\'s External Service base URL. If omitted, the base URL is used as-is.',\n poll: '**poll** *<interval>*\\n\\nSets the polling interval for an API source.',\n path: '**path** *<route>*\\n\\nThe inbound path a webhook source listens on.',\n topic: '**topic** *<name>*\\n\\nConfigures the topic for a message source.',\n from: '**from** *<value>*\\n\\nUsed in a `when` clause to match the previous value, and under `source events` to name a consumed public event (`from <Event>`).',\n to: '**to** *<value>*\\n\\nUsed in a `when` clause to match the new value.',\n or: '**or**\\n\\nCombines multiple `when` conditions.',\n and: '**and**\\n\\nCombines multiple `when` conditions that must all match.',\n added: '**added**\\n\\nMatches when a child item was added.',\n removed: '**removed**\\n\\nMatches when a child item was removed.',\n translate: '**translate**\\n\\nMaps source values to new values inside a `map` block.',\n split: '**split** *<value>* **by** *<separator>*\\n\\nSplits a string into multiple mapped fields.',\n };\n\n return keywords[word] || null;\n }\n\n private getExpressionInfo(word: string): string | null {\n const expressions: Record<string, string> = {\n '$context': '**$context**\\n\\nCapture execution context.\\n\\n**Properties:**\\n- `occurred` - When the current event should be considered to have occurred\\n- `eventSourceId` - The resolved event source identifier',\n '$identity': '**$identity**\\n\\nThe caller, equivalent to `$context.identity`. Properties: `id`, `name`, `userName`, `isAuthenticated`, `roles`, `claims`. Caller mappings are not portable capture inputs (PLAY0268).',\n '$previous': '**$previous**\\n\\nThe previous state for the captured item. Use dot notation such as `$previous.status`.',\n '$env': '**$env**\\n\\nEnvironment variables. Use dot notation such as `$env.API_TOKEN`.',\n };\n\n return expressions[word] || null;\n }\n}\n", "// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { ValidationIssue } from '../../validation';\n\ninterface MeaningfulLine {\n line: string;\n trimmed: string;\n lineNumber: number;\n indent: number;\n}\n\n// Structural rules only, unaffected by the source-property grammar changes \u2014 the\n// grammar's own syntax (see grammar.md) is what the tokenizer enforces; these are\n// the compiler's semantic constraints on top of it. Takes plain lines rather than\n// a Monaco model so it stays usable outside an editor, matching ../../validation.ts.\nexport class Validator {\n validate(lines: string[]): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n let firstNonEmptyLineIndex = -1;\n let firstLine = '';\n for (let index = 0; index < lines.length; index++) {\n const trimmed = lines[index].trim();\n if (trimmed && !trimmed.startsWith('#')) {\n firstNonEmptyLineIndex = index;\n firstLine = trimmed;\n break;\n }\n }\n\n if (!firstLine) {\n return issues;\n }\n\n const captureMatch = firstLine.match(/^capture\\s+([\\w.]+)\\s*$/);\n if (!captureMatch) {\n issues.push(this.error(firstNonEmptyLineIndex, 1, firstLine.length + 1, 'Capture definition must start with \"capture <Name>\"'));\n return issues;\n }\n\n const meaningfulLines: MeaningfulLine[] = lines\n .map((line, index) => ({\n line,\n trimmed: line.trim(),\n lineNumber: index,\n indent: line.search(/\\S/),\n }))\n .filter((entry) => entry.trimmed && !entry.trimmed.startsWith('#'));\n\n const hasSource = meaningfulLines.some((entry) => entry.trimmed.startsWith('source '));\n if (!hasSource) {\n issues.push(this.error(firstNonEmptyLineIndex, 1, firstLine.length + 1, 'Capture definition must include a \"source\" block'));\n }\n\n const hasKey = meaningfulLines.some((entry) => entry.trimmed.startsWith('key '));\n if (!hasKey) {\n issues.push(this.error(firstNonEmptyLineIndex, 1, firstLine.length + 1, 'Capture definition must include a \"key\" declaration'));\n }\n\n for (let index = 0; index < meaningfulLines.length; index++) {\n const current = meaningfulLines[index];\n if (!current.trimmed.startsWith('append ')) {\n continue;\n }\n\n let hasWhenClause = false;\n for (let next = index + 1; next < meaningfulLines.length; next++) {\n const candidate = meaningfulLines[next];\n if (candidate.indent <= current.indent) {\n break;\n }\n if (candidate.trimmed.startsWith('when ')) {\n hasWhenClause = true;\n break;\n }\n }\n\n if (!hasWhenClause) {\n const eventName = current.trimmed.substring('append '.length).trim() || 'unnamed append block';\n const startColumn = current.line.indexOf(eventName) + 1;\n issues.push(this.error(\n current.lineNumber,\n startColumn > 0 ? startColumn : 1,\n startColumn > 0 ? startColumn + eventName.length : current.line.length + 1,\n `Append block '${eventName}' must include a \"when\" clause`,\n ));\n }\n }\n\n return issues;\n }\n\n private error(line: number, startColumn: number, endColumn: number, message: string): ValidationIssue {\n return { severity: 'error', line, startColumn, endColumn, message };\n }\n}\n", "// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { IDisposable, editor } from 'monaco-editor';\nimport { Monaco, languageConfiguration, languageId, monarchLanguage } from './language';\nimport { CompletionProvider } from './CompletionProvider';\nimport { HoverProvider } from './HoverProvider';\nimport { Validator } from './Validator';\n\nconst markerOwner = 'cdl-validator';\n\n// Keyed by Monaco instance rather than a single boolean \u2014 mirrors the composite\n// language's own registration guard (../../index.ts) and lets a second register()\n// call for the same instance hand back the existing disposer instead of doubling\n// up the completion/hover providers.\nconst disposersByMonaco = new Map<Monaco, () => void>();\n\nfunction toMarkers(monaco: Monaco, validator: Validator, model: editor.ITextModel): editor.IMarkerData[] {\n return validator.validate(model.getLinesContent()).map((issue) => ({\n severity: issue.severity === 'error' ? monaco.MarkerSeverity.Error : monaco.MarkerSeverity.Warning,\n message: issue.message,\n startLineNumber: issue.line + 1,\n startColumn: issue.startColumn,\n endLineNumber: issue.line + 1,\n endColumn: issue.endColumn,\n }));\n}\n\nexport function registerCaptureLanguage(monaco: Monaco): { dispose(): void } {\n const existing = disposersByMonaco.get(monaco);\n if (existing) {\n return { dispose: existing };\n }\n\n monaco.languages.register({ id: languageId });\n monaco.languages.setLanguageConfiguration(languageId, languageConfiguration);\n monaco.languages.setMonarchTokensProvider(languageId, monarchLanguage);\n\n const validator = new Validator();\n const disposables: IDisposable[] = [];\n\n disposables.push(monaco.languages.registerCompletionItemProvider(languageId, new CompletionProvider()));\n disposables.push(monaco.languages.registerHoverProvider(languageId, new HoverProvider()));\n\n const validateModel = (model: editor.ITextModel): void => {\n if (model.isDisposed() || model.getLanguageId() !== languageId) {\n return;\n }\n monaco.editor.setModelMarkers(model, markerOwner, toMarkers(monaco, validator, model));\n };\n\n disposables.push(monaco.editor.onDidCreateModel((model) => {\n if (model.getLanguageId() !== languageId) {\n return;\n }\n validateModel(model);\n disposables.push(model.onDidChangeContent(() => validateModel(model)));\n }));\n\n monaco.editor.getModels().forEach((model) => validateModel(model));\n\n const dispose = (): void => {\n disposables.forEach((disposable) => disposable.dispose());\n disposables.length = 0;\n disposersByMonaco.delete(monaco);\n };\n\n disposersByMonaco.set(monaco, dispose);\n return { dispose };\n}\n\nexport { languageId } from './language';\n"],
5
+ "mappings": "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",
6
6
  "names": ["languageId", "KEYWORDS", "BUILTINS", "OPERATORS", "languageConfiguration", "monarchLanguage", "languages", "commonPropertyPaths", "CompletionProvider", "__name", "model", "position", "context", "suggestions", "textBeforeCursor", "word", "text", "match", "keyword", "prefix", "trimmed", "languages", "source", "sourceType", "option", "statement", "value", "path", "lineNumber", "index", "HoverProvider", "__name", "model", "position", "token", "keywordInfo", "expressionInfo", "tokens", "column", "startIndex", "endIndex", "word", "Validator", "__name", "lines", "issues", "firstNonEmptyLineIndex", "firstLine", "index", "trimmed", "meaningfulLines", "line", "entry", "current", "hasWhenClause", "next", "candidate", "eventName", "startColumn", "endColumn", "message", "markerOwner", "disposersByMonaco", "toMarkers", "monaco", "validator", "model", "issue", "__name", "registerCaptureLanguage", "existing", "languageConfiguration", "monarchLanguage", "Validator", "disposables", "CompletionProvider", "HoverProvider", "validateModel", "dispose", "disposable"]
7
7
  }
@@ -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-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,`
1
+ import{G as ne,H as re,I as oe,J as q,K as ie,gb as se,y as te}from"../../chunk-4CLLEMBX.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,3 +1,4 @@
1
+ import type { DocumentSymbols } from './symbols';
1
2
  export declare const optionalTypeItems: CompletionEntry[];
2
3
  export interface CompletionEntry {
3
4
  label: string;
@@ -7,6 +8,8 @@ export interface CompletionEntry {
7
8
  detail?: string;
8
9
  }
9
10
  export { exampleDeclarationItems } from './example-declaration-items';
11
+ export declare const identityItems: CompletionEntry[];
12
+ export declare function contextVariableEntries(symbols: DocumentSymbols): CompletionEntry[];
10
13
  export declare const topLevelItems: CompletionEntry[];
11
14
  export declare const operationItems: CompletionEntry[];
12
15
  export declare const operationImplementationItems: CompletionEntry[];
@@ -1 +1 @@
1
- {"version":3,"file":"completion-items.d.ts","sourceRoot":"","sources":["../completion-items.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,iBAAiB,EAAE,eAAe,EAE9C,CAAC;AAEF,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,eAAO,MAAM,aAAa,EAAE,eAAe,EAuB1C,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,eAAe,EAM3C,CAAC;AAEF,eAAO,MAAM,4BAA4B,EAAE,eAAe,EAIzD,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,eAAe,EAIhD,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,eAAe,EASzC,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,eAAe,EAItC,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,eAAe,EAsBvC,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,eAAe,EAkBzC,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,eAAe,EAMvC,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,eAAe,EAI7C,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,eAAe,EAE1C,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,eAAe,EAIhD,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,eAAe,EAIzC,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,eAAe,EAOvC,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,eAAe,EAI3C,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,eAAe,EAK5C,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,eAAe,EAO1C,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,eAAe,EAOjD,CAAC;AAIF,eAAO,MAAM,eAAe,EAAE,eAAe,EAK5C,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,eAAe,EAGzC,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,eAAe,EAIzC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,eAAe,EA4B/C,CAAC;AAGF,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,GAAG,MAAM,EAAE,eAAe,EAAE,CA6BvF,CAAC;AAEF,eAAO,MAAM,4BAA4B,EAAE,eAAe,EAIzD,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,eAAe,EAG7C,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,eAAe,EAGtC,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,eAAe,EAQxC,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,eAAe,EAU1C,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,eAAe,EAcxC,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,eAAe,EAGxC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,eAAe,EAK/C,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,eAAe,EAOnD,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,eAAe,EAInD,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,eAAe,EAEhD,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,eAAe,EAGvC,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,eAAe,EAqBjD,CAAC;AAEF,OAAO,EAAE,gBAAgB,IAAI,WAAW,EAAE,iBAAiB,IAAI,YAAY,EAAE,MAAM,eAAe,CAAC;AAUnG,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,eAAe,EAAE,CAG9E"}
1
+ {"version":3,"file":"completion-items.d.ts","sourceRoot":"","sources":["../completion-items.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAQjD,eAAO,MAAM,iBAAiB,EAAE,eAAe,EAE9C,CAAC;AAEF,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,eAAO,MAAM,aAAa,EAAE,eAAe,EAM1C,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,eAAe,GAAG,eAAe,EAAE,CAGlF;AAED,eAAO,MAAM,aAAa,EAAE,eAAe,EAwB1C,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,eAAe,EAM3C,CAAC;AAEF,eAAO,MAAM,4BAA4B,EAAE,eAAe,EAIzD,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,eAAe,EAIhD,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,eAAe,EASzC,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,eAAe,EAItC,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,eAAe,EAsBvC,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,eAAe,EAkBzC,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,eAAe,EAMvC,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,eAAe,EAI7C,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,eAAe,EAE1C,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,eAAe,EAIhD,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,eAAe,EAIzC,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,eAAe,EAOvC,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,eAAe,EAI3C,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,eAAe,EAK5C,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,eAAe,EAO1C,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,eAAe,EAOjD,CAAC;AAIF,eAAO,MAAM,eAAe,EAAE,eAAe,EAK5C,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,eAAe,EAGzC,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,eAAe,EAIzC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,eAAe,EA4B/C,CAAC;AAGF,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,GAAG,MAAM,EAAE,eAAe,EAAE,CA6BvF,CAAC;AAEF,eAAO,MAAM,4BAA4B,EAAE,eAAe,EAIzD,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,eAAe,EAG7C,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,eAAe,EAGtC,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,eAAe,EAQxC,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,eAAe,EAU1C,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,eAAe,EAcxC,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,eAAe,EAGxC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,eAAe,EAK/C,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,eAAe,EAOnD,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,eAAe,EAInD,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,eAAe,EAEhD,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,eAAe,EAGvC,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,eAAe,EA0BjD,CAAC;AAEF,OAAO,EAAE,gBAAgB,IAAI,WAAW,EAAE,iBAAiB,IAAI,YAAY,EAAE,MAAM,eAAe,CAAC;AAUnG,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,eAAe,EAAE,CAG9E"}
@@ -1 +1 @@
1
- {"version":3,"file":"completion-planner.d.ts","sourceRoot":"","sources":["../completion-planner.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,eAAe,EAAgB,MAAM,WAAW,CAAC;AAK1D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAUrD,MAAM,MAAM,cAAc,GACpB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,eAAe,EAAE,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,iBAAiB,CAAA;CAAE,GAC3B;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAKxB,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B;AAkBD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,GAAE,eAA+C,GAAG,eAAe,EAAE,CAsG/H;AAID,wBAAgB,eAAe,CAC3B,KAAK,EAAE,MAAM,EAAE,EACf,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,eAAqC,GAC/C,cAAc,CA2JhB"}
1
+ {"version":3,"file":"completion-planner.d.ts","sourceRoot":"","sources":["../completion-planner.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,eAAe,EAAgB,MAAM,WAAW,CAAC;AAK1D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAUrD,MAAM,MAAM,cAAc,GACpB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,eAAe,EAAE,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,iBAAiB,CAAA;CAAE,GAC3B;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAKxB,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B;AAkBD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,GAAE,eAA+C,GAAG,eAAe,EAAE,CAwG/H;AAID,wBAAgB,eAAe,CAC3B,KAAK,EAAE,MAAM,EAAE,EACf,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,eAAqC,GAC/C,cAAc,CA2JhB"}
@@ -1,4 +1,19 @@
1
1
  export declare const diagnosticCodes: {
2
+ readonly repeatedSingularDeclarationAcrossFiles: "PLAY0172";
3
+ readonly invalidIdentityDeclaration: "PLAY0633";
4
+ readonly duplicateIdentity: "PLAY0634";
5
+ readonly invalidIdentityDetail: "PLAY0635";
6
+ readonly unknownIdentitySource: "PLAY0636";
7
+ readonly identityDetailWithoutSource: "PLAY0637";
8
+ readonly identitySourceWithBody: "PLAY0638";
9
+ readonly duplicateIdentityDetail: "PLAY0639";
10
+ readonly builtInIdentityDetail: "PLAY0640";
11
+ readonly unknownIdentityQuery: "PLAY0641";
12
+ readonly invalidIdentityQuery: "PLAY0642";
13
+ readonly identityQueryWithoutKey: "PLAY0643";
14
+ readonly invalidIdentityQueryKey: "PLAY0644";
15
+ readonly identityQueryAuthorizationDependency: "PLAY0645";
16
+ readonly identityQueryTypeMismatch: "PLAY0646";
2
17
  readonly commandProducesPublicEvent: "PLAY0607";
3
18
  readonly publicEventRequiresOutboundTranslation: "PLAY0608";
4
19
  readonly outboundPublicEventCount: "PLAY0609";
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostic-codes.d.ts","sourceRoot":"","sources":["../diagnostic-codes.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyKlB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,CAAC"}
1
+ {"version":3,"file":"diagnostic-codes.d.ts","sourceRoot":"","sources":["../diagnostic-codes.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwLlB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"hover-content.d.ts","sourceRoot":"","sources":["../hover-content.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAY5C,wBAAgB,YAAY,CACxB,KAAK,EAAE,MAAM,EAAE,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,eAAe,GAC9B,MAAM,GAAG,IAAI,CAiMf"}
1
+ {"version":3,"file":"hover-content.d.ts","sourceRoot":"","sources":["../hover-content.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,eAAe,EAAoB,MAAM,WAAW,CAAC;AAY9D,wBAAgB,YAAY,CACxB,KAAK,EAAE,MAAM,EAAE,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,eAAe,GAC9B,MAAM,GAAG,IAAI,CAsMf"}
package/dist/index.d.ts CHANGED
@@ -24,7 +24,7 @@ export type { CommandSymbol, ConceptSymbol, DocumentSymbols, EventSymbol, Import
24
24
  export { attributeDocs, contextVariableDocs, keywordDocs, specificationKeywordDocs } from './keyword-docs';
25
25
  export { eventContextMemberAt, eventContextMembers, eventContextMembersAfter, eventContextPaths, namesEventContextMember } from './event-context';
26
26
  export type { EventContextMember, EventContextPath } from './event-context';
27
- export { contextVariableItems, producesItems, specificationStepItems } from './completion-items';
27
+ export { contextVariableEntries, contextVariableItems, producesItems, specificationStepItems } from './completion-items';
28
28
  export type { CompletionEntry } from './completion-items';
29
29
  export { completionEntriesFor, planCompletions } from './completion-planner';
30
30
  export type { CompletionPlan } from './completion-planner';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,MAAM,EAIT,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAA4B,MAAM,eAAe,CAAC;AA+B5E,wBAAgB,yBAAyB,IAAI,IAAI,CAGhD;AAGD,MAAM,MAAM,sBAAsB,GAAG,iBAAiB,CAAC;AAEvD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B,GAAG,IAAI,CAsDnF;AAED,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EACH,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,UAAU,EACV,cAAc,EACd,UAAU,GACb,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC/F,YAAY,EACR,iBAAiB,EACjB,WAAW,EACX,qBAAqB,EACrB,qBAAqB,GACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACnG,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EACH,oBAAoB,EACpB,eAAe,EACf,cAAc,EACd,2BAA2B,GAC9B,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC9F,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAClJ,YAAY,EACR,aAAa,EACb,aAAa,EACb,eAAe,EACf,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,cAAc,EACd,UAAU,EACV,WAAW,EACX,UAAU,GACb,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC3G,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAClJ,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjG,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC7E,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AACrM,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,YAAY,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,YAAY,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,cAAc,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC3K,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,cAAc,EAAE,cAAc,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC1J,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACrF,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC3F,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/E,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}