@cratis/screenplay-language 5.3.0 → 5.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (395) hide show
  1. package/dist/bundles/TypeReferenceSymbol.js.map +1 -1
  2. package/dist/bundles/action-subject-authoring.js.map +1 -1
  3. package/dist/bundles/bmp-word-characters.js.map +1 -1
  4. package/dist/bundles/case-authoring.js +1 -1
  5. package/dist/bundles/case-authoring.js.map +1 -1
  6. package/dist/bundles/code-actions.js.map +1 -1
  7. package/dist/bundles/command-read-completions.js.map +1 -1
  8. package/dist/bundles/compiler/Authoring/ActionSubjectQuickFixes.js +3 -3
  9. package/dist/bundles/compiler/Authoring/ActionSubjectQuickFixes.js.map +1 -1
  10. package/dist/bundles/compiler/Authoring/QuickFixes.js +4 -4
  11. package/dist/bundles/compiler/Authoring/QuickFixes.js.map +1 -1
  12. package/dist/bundles/compiler/Authoring/StructuredValueQuickFix.js +1 -1
  13. package/dist/bundles/compiler/Authoring/StructuredValueQuickFix.js.map +1 -1
  14. package/dist/bundles/compiler/Authoring/TimelineQuickFixContext.js +4 -4
  15. package/dist/bundles/compiler/Authoring/TimelineQuickFixContext.js.map +1 -1
  16. package/dist/bundles/compiler/Authoring/TimelineQuickFixImports.js +2 -2
  17. package/dist/bundles/compiler/Authoring/TimelineQuickFixImports.js.map +1 -1
  18. package/dist/bundles/compiler/Authoring/TimelineQuickFixes.js +1 -1
  19. package/dist/bundles/compiler/Authoring/TimelineQuickFixes.js.map +1 -1
  20. package/dist/bundles/compiler/Dependencies/DeclaredDependencies.js.map +1 -1
  21. package/dist/bundles/compiler/Dependencies/DeclaredDependencyTargets.js.map +1 -1
  22. package/dist/bundles/compiler/Dependencies/DependencyGraph.js +1 -1
  23. package/dist/bundles/compiler/Dependencies/DependencyGraph.js.map +1 -1
  24. package/dist/bundles/compiler/Dependencies/DependencyKind.js.map +1 -1
  25. package/dist/bundles/compiler/Dependencies/InvalidDependencyQuery.js.map +1 -1
  26. package/dist/bundles/compiler/Dependencies/SliceReferences.js.map +1 -1
  27. package/dist/bundles/compiler/Dependencies/StronglyConnectedGroups.js.map +1 -1
  28. package/dist/bundles/compiler/Diagnostics/DiagnosticArgument.js.map +1 -1
  29. package/dist/bundles/compiler/Diagnostics/DiagnosticCodes.js +1 -1
  30. package/dist/bundles/compiler/Diagnostics/DiagnosticCodes.js.map +1 -1
  31. package/dist/bundles/compiler/Diagnostics/ProductionDestinationDiagnostics.js +1 -1
  32. package/dist/bundles/compiler/Diagnostics/ProductionDestinationDiagnostics.js.map +1 -1
  33. package/dist/bundles/compiler/Diagnostics/SourceLocation.js.map +1 -1
  34. package/dist/bundles/compiler/Files/AuthoredOrder.js +1 -1
  35. package/dist/bundles/compiler/Files/AuthoredOrder.js.map +1 -1
  36. package/dist/bundles/compiler/Files/OrderingRoot.js +1 -1
  37. package/dist/bundles/compiler/Files/OrderingRoot.js.map +1 -1
  38. package/dist/bundles/compiler/Files/PlayApplicationAssembly.js +1 -1
  39. package/dist/bundles/compiler/Files/PlayApplicationAssembly.js.map +1 -1
  40. package/dist/bundles/compiler/Files/PlayDocumentSource.js.map +1 -1
  41. package/dist/bundles/compiler/Files/PlayFolderMerge.js +1 -1
  42. package/dist/bundles/compiler/Files/PlayFolderMerge.js.map +1 -1
  43. package/dist/bundles/compiler/Files/PlayGlob.js +2 -1
  44. package/dist/bundles/compiler/Files/PlayGlob.js.map +1 -1
  45. package/dist/bundles/compiler/Files/PlayImports.js +1 -1
  46. package/dist/bundles/compiler/Files/PlayImports.js.map +1 -1
  47. package/dist/bundles/compiler/Files/PlayPlacement.js.map +1 -1
  48. package/dist/bundles/compiler/Files/TimelineOrder.js +1 -1
  49. package/dist/bundles/compiler/Files/TimelineOrder.js.map +1 -1
  50. package/dist/bundles/compiler/Generation/FiniteGenerationRules.js +1 -1
  51. package/dist/bundles/compiler/Generation/GenerationAssessmentCache.js.map +1 -1
  52. package/dist/bundles/compiler/Generation/GenerationChecksum.js.map +1 -1
  53. package/dist/bundles/compiler/Generation/GenerationPattern.js +1 -1
  54. package/dist/bundles/compiler/Generation/GenerationPattern.js.map +1 -1
  55. package/dist/bundles/compiler/Generation/GenerationPatternAssessment.js.map +1 -1
  56. package/dist/bundles/compiler/Generation/GenerationPatternParser.js.map +1 -1
  57. package/dist/bundles/compiler/Generation/GenerationPatternToken.js.map +1 -1
  58. package/dist/bundles/compiler/Generation/GenerationRuleProof.js +1 -1
  59. package/dist/bundles/compiler/Generation/InvalidGenerationPattern.js.map +1 -1
  60. package/dist/bundles/compiler/Generation/RegexCharacters.js.map +1 -1
  61. package/dist/bundles/compiler/Generation/RegexExpression.js.map +1 -1
  62. package/dist/bundles/compiler/Generation/RuleConsistency.js +1 -1
  63. package/dist/bundles/compiler/Parsing/ActionSubjectClause.js.map +1 -1
  64. package/dist/bundles/compiler/Parsing/ActionSubjectInputs.js.map +1 -1
  65. package/dist/bundles/compiler/Parsing/ActionSubjectResolution.js.map +1 -1
  66. package/dist/bundles/compiler/Parsing/ApplicationContextParser.js +1 -1
  67. package/dist/bundles/compiler/Parsing/ApplicationContextParser.js.map +1 -1
  68. package/dist/bundles/compiler/Parsing/AuthorizeParser.js +1 -1
  69. package/dist/bundles/compiler/Parsing/AuthorizeParser.js.map +1 -1
  70. package/dist/bundles/compiler/Parsing/CanvasPlacement.js.map +1 -1
  71. package/dist/bundles/compiler/Parsing/CaptureEventFixturesValidator.js.map +1 -1
  72. package/dist/bundles/compiler/Parsing/CaptureParser.js +1 -1
  73. package/dist/bundles/compiler/Parsing/CaptureParser.js.map +1 -1
  74. package/dist/bundles/compiler/Parsing/ClockOperandParser.js.map +1 -1
  75. package/dist/bundles/compiler/Parsing/CodeBlockParser.js.map +1 -1
  76. package/dist/bundles/compiler/Parsing/CommandDestinationTypes.js.map +1 -1
  77. package/dist/bundles/compiler/Parsing/CommandHandlerValidator.js.map +1 -1
  78. package/dist/bundles/compiler/Parsing/CommandParser.js +1 -1
  79. package/dist/bundles/compiler/Parsing/CommandParser.js.map +1 -1
  80. package/dist/bundles/compiler/Parsing/CommandReadSources.js.map +1 -1
  81. package/dist/bundles/compiler/Parsing/CommandResponseParser.js +1 -1
  82. package/dist/bundles/compiler/Parsing/CommandResponseParser.js.map +1 -1
  83. package/dist/bundles/compiler/Parsing/CommandStreamCandidates.js.map +1 -1
  84. package/dist/bundles/compiler/Parsing/CompositeStreamIdValidator.js.map +1 -1
  85. package/dist/bundles/compiler/Parsing/CompositionParser.js +1 -1
  86. package/dist/bundles/compiler/Parsing/CompositionParser.js.map +1 -1
  87. package/dist/bundles/compiler/Parsing/ConceptComplianceParser.js +1 -1
  88. package/dist/bundles/compiler/Parsing/ConceptComplianceParser.js.map +1 -1
  89. package/dist/bundles/compiler/Parsing/ConditionDepthBudget.js +2 -0
  90. package/dist/bundles/compiler/Parsing/ConditionDepthBudget.js.map +1 -0
  91. package/dist/bundles/compiler/Parsing/ConditionParser.js +1 -1
  92. package/dist/bundles/compiler/Parsing/ConditionParser.js.map +1 -1
  93. package/dist/bundles/compiler/Parsing/ConstraintParser.js +1 -1
  94. package/dist/bundles/compiler/Parsing/ConstraintParser.js.map +1 -1
  95. package/dist/bundles/compiler/Parsing/ConstraintPropertyValidator.js +1 -1
  96. package/dist/bundles/compiler/Parsing/ConstraintPropertyValidator.js.map +1 -1
  97. package/dist/bundles/compiler/Parsing/ContinuationValues.js.map +1 -1
  98. package/dist/bundles/compiler/Parsing/DeclarationParsers.js +1 -1
  99. package/dist/bundles/compiler/Parsing/DeclarationParsers.js.map +1 -1
  100. package/dist/bundles/compiler/Parsing/DependencySourceParser.js +1 -1
  101. package/dist/bundles/compiler/Parsing/DependencySourceParser.js.map +1 -1
  102. package/dist/bundles/compiler/Parsing/DependsOnParser.js.map +1 -1
  103. package/dist/bundles/compiler/Parsing/DescriptionParser.js +1 -1
  104. package/dist/bundles/compiler/Parsing/DescriptionParser.js.map +1 -1
  105. package/dist/bundles/compiler/Parsing/DocumentationParser.js +1 -1
  106. package/dist/bundles/compiler/Parsing/DocumentationParser.js.map +1 -1
  107. package/dist/bundles/compiler/Parsing/EnumerationMembers.js +1 -1
  108. package/dist/bundles/compiler/Parsing/EnumerationMembers.js.map +1 -1
  109. package/dist/bundles/compiler/Parsing/EventMetadataParser.js +1 -1
  110. package/dist/bundles/compiler/Parsing/EventMetadataParser.js.map +1 -1
  111. package/dist/bundles/compiler/Parsing/EventSourceParser.js +1 -1
  112. package/dist/bundles/compiler/Parsing/EventSourceParser.js.map +1 -1
  113. package/dist/bundles/compiler/Parsing/EventSourceValidator.js +1 -1
  114. package/dist/bundles/compiler/Parsing/EventSourceValidator.js.map +1 -1
  115. package/dist/bundles/compiler/Parsing/EventSubjectValidator.js +1 -1
  116. package/dist/bundles/compiler/Parsing/EventSubjectValidator.js.map +1 -1
  117. package/dist/bundles/compiler/Parsing/ExpressionParser.js +1 -1
  118. package/dist/bundles/compiler/Parsing/ExpressionParser.js.map +1 -1
  119. package/dist/bundles/compiler/Parsing/FeatureBody.js +1 -1
  120. package/dist/bundles/compiler/Parsing/FeatureBody.js.map +1 -1
  121. package/dist/bundles/compiler/Parsing/FileImportParser.js.map +1 -1
  122. package/dist/bundles/compiler/Parsing/FileReferences.js.map +1 -1
  123. package/dist/bundles/compiler/Parsing/FoldedEventSources.js.map +1 -1
  124. package/dist/bundles/compiler/Parsing/GenerationBodyParser.js +1 -1
  125. package/dist/bundles/compiler/Parsing/GenerationBodyParser.js.map +1 -1
  126. package/dist/bundles/compiler/Parsing/GenerationParser.js +1 -1
  127. package/dist/bundles/compiler/Parsing/GenerationParser.js.map +1 -1
  128. package/dist/bundles/compiler/Parsing/GuardedActionInputs.js.map +1 -1
  129. package/dist/bundles/compiler/Parsing/GuardedActionParser.js +1 -1
  130. package/dist/bundles/compiler/Parsing/GuardedActionParser.js.map +1 -1
  131. package/dist/bundles/compiler/Parsing/GuardedActionShadowing.js.map +1 -1
  132. package/dist/bundles/compiler/Parsing/GuardedActionValidator.js +1 -1
  133. package/dist/bundles/compiler/Parsing/GuardedActionValidator.js.map +1 -1
  134. package/dist/bundles/compiler/Parsing/GuardedInteractions.js +1 -1
  135. package/dist/bundles/compiler/Parsing/GuardedInteractions.js.map +1 -1
  136. package/dist/bundles/compiler/Parsing/IdentifierComplianceValidator.js +1 -1
  137. package/dist/bundles/compiler/Parsing/IdentifierComplianceValidator.js.map +1 -1
  138. package/dist/bundles/compiler/Parsing/IdentityParser.js +1 -1
  139. package/dist/bundles/compiler/Parsing/IdentityParser.js.map +1 -1
  140. package/dist/bundles/compiler/Parsing/IdentityValidator.js.map +1 -1
  141. package/dist/bundles/compiler/Parsing/ImplementationParser.js +2 -2
  142. package/dist/bundles/compiler/Parsing/ImplementationParser.js.map +1 -1
  143. package/dist/bundles/compiler/Parsing/ImportDiscovery.js +1 -1
  144. package/dist/bundles/compiler/Parsing/ImportDiscovery.js.map +1 -1
  145. package/dist/bundles/compiler/Parsing/InlineEventValidator.js.map +1 -1
  146. package/dist/bundles/compiler/Parsing/InputUses.js +1 -1
  147. package/dist/bundles/compiler/Parsing/InputUses.js.map +1 -1
  148. package/dist/bundles/compiler/Parsing/InteractionAlternatives.js +1 -1
  149. package/dist/bundles/compiler/Parsing/InteractionAlternatives.js.map +1 -1
  150. package/dist/bundles/compiler/Parsing/InteractionExecutions.js +1 -1
  151. package/dist/bundles/compiler/Parsing/InteractionExecutions.js.map +1 -1
  152. package/dist/bundles/compiler/Parsing/LegacyTextRulePatterns.js.map +1 -1
  153. package/dist/bundles/compiler/Parsing/LineReader.js.map +1 -1
  154. package/dist/bundles/compiler/Parsing/LineText.js.map +1 -1
  155. package/dist/bundles/compiler/Parsing/MatchAmbiguity.js +1 -1
  156. package/dist/bundles/compiler/Parsing/MatchAmbiguity.js.map +1 -1
  157. package/dist/bundles/compiler/Parsing/MatchAmbiguityCharacters.js.map +1 -1
  158. package/dist/bundles/compiler/Parsing/MatchAmbiguityGraph.js.map +1 -1
  159. package/dist/bundles/compiler/Parsing/MatchAmbiguityParser.js.map +1 -1
  160. package/dist/bundles/compiler/Parsing/MatchOperandValidation.js +1 -1
  161. package/dist/bundles/compiler/Parsing/MatchOperandValidation.js.map +1 -1
  162. package/dist/bundles/compiler/Parsing/ModuleBody.js +1 -1
  163. package/dist/bundles/compiler/Parsing/ModuleBody.js.map +1 -1
  164. package/dist/bundles/compiler/Parsing/ObserverFilterParser.js +1 -1
  165. package/dist/bundles/compiler/Parsing/ObserverFilterParser.js.map +1 -1
  166. package/dist/bundles/compiler/Parsing/ObserverFilterValidator.js.map +1 -1
  167. package/dist/bundles/compiler/Parsing/OperationParser.js +1 -1
  168. package/dist/bundles/compiler/Parsing/OperationParser.js.map +1 -1
  169. package/dist/bundles/compiler/Parsing/OperationValidator.js +1 -1
  170. package/dist/bundles/compiler/Parsing/OperationValidator.js.map +1 -1
  171. package/dist/bundles/compiler/Parsing/ParserContext.js.map +1 -1
  172. package/dist/bundles/compiler/Parsing/PersonaCallerValidator.js.map +1 -1
  173. package/dist/bundles/compiler/Parsing/PolicyParser.js +1 -1
  174. package/dist/bundles/compiler/Parsing/PolicyParser.js.map +1 -1
  175. package/dist/bundles/compiler/Parsing/PortableMatchGroupName.js.map +1 -1
  176. package/dist/bundles/compiler/Parsing/PortableMatchPattern.js.map +1 -1
  177. package/dist/bundles/compiler/Parsing/PortableMatchSuggestions.js.map +1 -1
  178. package/dist/bundles/compiler/Parsing/PossibleEventsParser.js +1 -1
  179. package/dist/bundles/compiler/Parsing/PossibleEventsParser.js.map +1 -1
  180. package/dist/bundles/compiler/Parsing/ProducesParser.js +1 -1
  181. package/dist/bundles/compiler/Parsing/ProducesParser.js.map +1 -1
  182. package/dist/bundles/compiler/Parsing/ProjectionEventScopeValidator.js.map +1 -1
  183. package/dist/bundles/compiler/Parsing/ProjectionExpressionParser.js +1 -1
  184. package/dist/bundles/compiler/Parsing/ProjectionExpressionParser.js.map +1 -1
  185. package/dist/bundles/compiler/Parsing/ProjectionParser.js +1 -1
  186. package/dist/bundles/compiler/Parsing/ProjectionParser.js.map +1 -1
  187. package/dist/bundles/compiler/Parsing/ProjectionTargetValidator.js +1 -1
  188. package/dist/bundles/compiler/Parsing/ProjectionTargetValidator.js.map +1 -1
  189. package/dist/bundles/compiler/Parsing/PropertyLineParser.js +1 -1
  190. package/dist/bundles/compiler/Parsing/PropertyLineParser.js.map +1 -1
  191. package/dist/bundles/compiler/Parsing/PublicEventMetadataValidator.js +1 -1
  192. package/dist/bundles/compiler/Parsing/PublicEventMetadataValidator.js.map +1 -1
  193. package/dist/bundles/compiler/Parsing/PublicEventUsageCollector.js +1 -1
  194. package/dist/bundles/compiler/Parsing/PublicEventUsageCollector.js.map +1 -1
  195. package/dist/bundles/compiler/Parsing/PublicEventUsageValidator.js +1 -1
  196. package/dist/bundles/compiler/Parsing/PublicEventUsageValidator.js.map +1 -1
  197. package/dist/bundles/compiler/Parsing/PurposeParser.js +1 -1
  198. package/dist/bundles/compiler/Parsing/PurposeParser.js.map +1 -1
  199. package/dist/bundles/compiler/Parsing/PurposeValidator.js.map +1 -1
  200. package/dist/bundles/compiler/Parsing/QueryParser.js +1 -1
  201. package/dist/bundles/compiler/Parsing/QueryParser.js.map +1 -1
  202. package/dist/bundles/compiler/Parsing/ReactionIdentityParser.js +1 -1
  203. package/dist/bundles/compiler/Parsing/ReactionIdentityParser.js.map +1 -1
  204. package/dist/bundles/compiler/Parsing/ReactionParser.js +1 -1
  205. package/dist/bundles/compiler/Parsing/ReactionParser.js.map +1 -1
  206. package/dist/bundles/compiler/Parsing/ReactionRefusalValidator.js +1 -1
  207. package/dist/bundles/compiler/Parsing/ReactionRefusalValidator.js.map +1 -1
  208. package/dist/bundles/compiler/Parsing/ReadModelKeyValidator.js.map +1 -1
  209. package/dist/bundles/compiler/Parsing/ReadModelMemberTypeValidator.js.map +1 -1
  210. package/dist/bundles/compiler/Parsing/ReadsParser.js +1 -1
  211. package/dist/bundles/compiler/Parsing/ReadsParser.js.map +1 -1
  212. package/dist/bundles/compiler/Parsing/RedeliveryValues.js.map +1 -1
  213. package/dist/bundles/compiler/Parsing/RefusalDeclarations.js +1 -1
  214. package/dist/bundles/compiler/Parsing/RefusalDeclarations.js.map +1 -1
  215. package/dist/bundles/compiler/Parsing/RefusalValueWalker.js.map +1 -1
  216. package/dist/bundles/compiler/Parsing/ResponseCommandResolver.js.map +1 -1
  217. package/dist/bundles/compiler/Parsing/ResponseDateValues.js.map +1 -1
  218. package/dist/bundles/compiler/Parsing/ResponseValidator.js +1 -1
  219. package/dist/bundles/compiler/Parsing/ResponseValidator.js.map +1 -1
  220. package/dist/bundles/compiler/Parsing/ScreenParser.js +1 -1
  221. package/dist/bundles/compiler/Parsing/ScreenParser.js.map +1 -1
  222. package/dist/bundles/compiler/Parsing/ScreenplayParser.js +1 -1
  223. package/dist/bundles/compiler/Parsing/ScreenplayParser.js.map +1 -1
  224. package/dist/bundles/compiler/Parsing/SeedParser.js +1 -1
  225. package/dist/bundles/compiler/Parsing/SeedParser.js.map +1 -1
  226. package/dist/bundles/compiler/Parsing/SliceParser.js +1 -1
  227. package/dist/bundles/compiler/Parsing/SliceParser.js.map +1 -1
  228. package/dist/bundles/compiler/Parsing/SourceLine.js.map +1 -1
  229. package/dist/bundles/compiler/Parsing/SourceLineSplitter.js.map +1 -1
  230. package/dist/bundles/compiler/Parsing/SourceOptionsParser.js +1 -1
  231. package/dist/bundles/compiler/Parsing/SourceOptionsParser.js.map +1 -1
  232. package/dist/bundles/compiler/Parsing/SpecificationCaseParser.js +1 -1
  233. package/dist/bundles/compiler/Parsing/SpecificationCaseParser.js.map +1 -1
  234. package/dist/bundles/compiler/Parsing/SpecificationCaseValidator.js +1 -1
  235. package/dist/bundles/compiler/Parsing/SpecificationCaseValidator.js.map +1 -1
  236. package/dist/bundles/compiler/Parsing/SpecificationCommandExamples.js +1 -1
  237. package/dist/bundles/compiler/Parsing/SpecificationCommandExamples.js.map +1 -1
  238. package/dist/bundles/compiler/Parsing/SpecificationExampleParser.js +1 -1
  239. package/dist/bundles/compiler/Parsing/SpecificationExampleParser.js.map +1 -1
  240. package/dist/bundles/compiler/Parsing/SpecificationParser.js +1 -1
  241. package/dist/bundles/compiler/Parsing/SpecificationParser.js.map +1 -1
  242. package/dist/bundles/compiler/Parsing/SpecificationRedeliveryValidator.js +1 -1
  243. package/dist/bundles/compiler/Parsing/SpecificationRedeliveryValidator.js.map +1 -1
  244. package/dist/bundles/compiler/Parsing/SpecificationResponseParser.js +1 -1
  245. package/dist/bundles/compiler/Parsing/SpecificationResponseParser.js.map +1 -1
  246. package/dist/bundles/compiler/Parsing/SpecificationRouteComparison.js +1 -1
  247. package/dist/bundles/compiler/Parsing/SpecificationRouteComparison.js.map +1 -1
  248. package/dist/bundles/compiler/Parsing/SpecificationStreamValidator.js +1 -1
  249. package/dist/bundles/compiler/Parsing/SpecificationStreamValidator.js.map +1 -1
  250. package/dist/bundles/compiler/Parsing/StateMachineParser.js +1 -1
  251. package/dist/bundles/compiler/Parsing/StateMachineParser.js.map +1 -1
  252. package/dist/bundles/compiler/Parsing/StructuralInteractionSites.js.map +1 -1
  253. package/dist/bundles/compiler/Parsing/StructuredBlockParser.js +1 -1
  254. package/dist/bundles/compiler/Parsing/StructuredBlockParser.js.map +1 -1
  255. package/dist/bundles/compiler/Parsing/StructuredValueParser.js.map +1 -1
  256. package/dist/bundles/compiler/Parsing/TemplateReferenceText.js +1 -1
  257. package/dist/bundles/compiler/Parsing/TemplateReferenceText.js.map +1 -1
  258. package/dist/bundles/compiler/Parsing/TriggerDataParser.js +1 -1
  259. package/dist/bundles/compiler/Parsing/TriggerDataParser.js.map +1 -1
  260. package/dist/bundles/compiler/Parsing/UiBindingParser.js +1 -1
  261. package/dist/bundles/compiler/Parsing/UiBindingParser.js.map +1 -1
  262. package/dist/bundles/compiler/Parsing/UiProfileLegacyLayout.js +1 -1
  263. package/dist/bundles/compiler/Parsing/UiProfileLegacyLayout.js.map +1 -1
  264. package/dist/bundles/compiler/Parsing/WorkflowParser.js +1 -1
  265. package/dist/bundles/compiler/Parsing/WorkflowParser.js.map +1 -1
  266. package/dist/bundles/compiler/Parsing/checkPortableMatchPattern.js.map +1 -1
  267. package/dist/bundles/compiler/Parsing/hasExponentialMatchAmbiguity.js.map +1 -1
  268. package/dist/bundles/compiler/Parsing/trimMatchAmbiguityGraph.js.map +1 -1
  269. package/dist/bundles/compiler/ScreenActionSubjects.js.map +1 -1
  270. package/dist/bundles/compiler/ScreenplayCompiler.js +1 -1
  271. package/dist/bundles/compiler/ScreenplayCompiler.js.map +1 -1
  272. package/dist/bundles/compiler/Syntax/ActionSubjectInvariants.js.map +1 -1
  273. package/dist/bundles/compiler/Syntax/AuthoringProductionResolver.js.map +1 -1
  274. package/dist/bundles/compiler/Syntax/CaptureEventsSource.js.map +1 -1
  275. package/dist/bundles/compiler/Syntax/DependencySources.js.map +1 -1
  276. package/dist/bundles/compiler/Syntax/EventDeclarations.js.map +1 -1
  277. package/dist/bundles/compiler/Syntax/EventSourceCatalog.js.map +1 -1
  278. package/dist/bundles/compiler/Syntax/EventSourceReadConfidence.js.map +1 -1
  279. package/dist/bundles/compiler/Syntax/ExactMathFacts.js.map +1 -1
  280. package/dist/bundles/compiler/Syntax/ExactNumber.js.map +1 -1
  281. package/dist/bundles/compiler/Syntax/InvalidSyntaxJson.js.map +1 -1
  282. package/dist/bundles/compiler/Syntax/LegacyWireProjection.js.map +1 -1
  283. package/dist/bundles/compiler/Syntax/Operations.js.map +1 -1
  284. package/dist/bundles/compiler/Syntax/PersonaCallers.js.map +1 -1
  285. package/dist/bundles/compiler/Syntax/ProductionDestinations.js.map +1 -1
  286. package/dist/bundles/compiler/Syntax/PublicEventInvariants.js.map +1 -1
  287. package/dist/bundles/compiler/Syntax/ScreenplaySyntaxWalker.js.map +1 -1
  288. package/dist/bundles/compiler/Syntax/SourceOptions.js.map +1 -1
  289. package/dist/bundles/compiler/Syntax/SpecificationCaseOrigin.js.map +1 -1
  290. package/dist/bundles/compiler/Syntax/StreamIdFormatter.js.map +1 -1
  291. package/dist/bundles/compiler/Syntax/StrictSyntaxJson.js +1 -1
  292. package/dist/bundles/compiler/Syntax/Structure.js.map +1 -1
  293. package/dist/bundles/compiler/Syntax/SyntaxCollections.js.map +1 -1
  294. package/dist/bundles/compiler/Syntax/SyntaxInvariants.js +1 -1
  295. package/dist/bundles/compiler/Syntax/SyntaxInvariants.js.map +1 -1
  296. package/dist/bundles/compiler/Syntax/SyntaxJson.js +1 -1
  297. package/dist/bundles/compiler/Syntax/SyntaxJson.js.map +1 -1
  298. package/dist/bundles/compiler/Syntax/SyntaxMemberContracts.js.map +1 -1
  299. package/dist/bundles/compiler/Syntax/index.js +1 -1
  300. package/dist/bundles/compiler/Text/ImplementationHintText.js.map +1 -1
  301. package/dist/bundles/compiler/Text/ReservedWords.js.map +1 -1
  302. package/dist/bundles/compiler/Text/SourceStreamNames.js.map +1 -1
  303. package/dist/bundles/compiler/Text/StringLiteral.js.map +1 -1
  304. package/dist/bundles/compiler/Text/ordinalIgnoreCaseKey.js.map +1 -1
  305. package/dist/bundles/compiler/Text/patterns.js.map +1 -1
  306. package/dist/bundles/compiler/index.js +1 -1
  307. package/dist/bundles/completion-items.js +4 -4
  308. package/dist/bundles/completion-items.js.map +1 -1
  309. package/dist/bundles/completion-planner.js +2 -2
  310. package/dist/bundles/completion-planner.js.map +1 -1
  311. package/dist/bundles/completions.js +1 -1
  312. package/dist/bundles/completions.js.map +1 -1
  313. package/dist/bundles/continuation-responses.js +1 -1
  314. package/dist/bundles/continuation-responses.js.map +1 -1
  315. package/dist/bundles/declarations.js.map +1 -1
  316. package/dist/bundles/dependency-completions.js.map +1 -1
  317. package/dist/bundles/dependency-target-analysis.js.map +1 -1
  318. package/dist/bundles/diagnostic-codes.js +1 -1
  319. package/dist/bundles/diagnostic-codes.js.map +1 -1
  320. package/dist/bundles/diagnostics.js +1 -1
  321. package/dist/bundles/diagnostics.js.map +1 -1
  322. package/dist/bundles/document-context.js.map +1 -1
  323. package/dist/bundles/documentation-item.js.map +1 -1
  324. package/dist/bundles/event-analysis-source.js.map +1 -1
  325. package/dist/bundles/event-context-catalog.js.map +1 -1
  326. package/dist/bundles/event-context.js.map +1 -1
  327. package/dist/bundles/event-source-authoring.js +11 -11
  328. package/dist/bundles/event-source-authoring.js.map +1 -1
  329. package/dist/bundles/example-analysis.js +2 -2
  330. package/dist/bundles/example-analysis.js.map +1 -1
  331. package/dist/bundles/example-authoring.js +2 -2
  332. package/dist/bundles/example-authoring.js.map +1 -1
  333. package/dist/bundles/example-declaration-items.js.map +1 -1
  334. package/dist/bundles/example-values.js.map +1 -1
  335. package/dist/bundles/file-imports.js.map +1 -1
  336. package/dist/bundles/file-references.js.map +1 -1
  337. package/dist/bundles/generation-completions.js.map +1 -1
  338. package/dist/bundles/hover-content.js +5 -5
  339. package/dist/bundles/hover-content.js.map +1 -1
  340. package/dist/bundles/hover.js.map +1 -1
  341. package/dist/bundles/index.js +1 -1
  342. package/dist/bundles/index.js.map +1 -1
  343. package/dist/bundles/inlay-hints.js.map +1 -1
  344. package/dist/bundles/inline-completions.js +1 -1
  345. package/dist/bundles/inline-completions.js.map +1 -1
  346. package/dist/bundles/inline-event-validation.js +1 -1
  347. package/dist/bundles/inline-event-validation.js.map +1 -1
  348. package/dist/bundles/keyword-docs.js.map +1 -1
  349. package/dist/bundles/language.js.map +1 -1
  350. package/dist/bundles/named-rule-context.js.map +1 -1
  351. package/dist/bundles/operation-authoring.js +6 -6
  352. package/dist/bundles/operation-authoring.js.map +1 -1
  353. package/dist/bundles/persona-analysis.js +1 -1
  354. package/dist/bundles/persona-analysis.js.map +1 -1
  355. package/dist/bundles/production-destinations.js +1 -1
  356. package/dist/bundles/production-destinations.js.map +1 -1
  357. package/dist/bundles/purpose-items.js.map +1 -1
  358. package/dist/bundles/reaction-authoring.js +3 -3
  359. package/dist/bundles/reaction-authoring.js.map +1 -1
  360. package/dist/bundles/read-model-key-completions.js +1 -1
  361. package/dist/bundles/read-model-key-completions.js.map +1 -1
  362. package/dist/bundles/refusal-context.js.map +1 -1
  363. package/dist/bundles/response-analysis.js.map +1 -1
  364. package/dist/bundles/response-completions.js +1 -1
  365. package/dist/bundles/response-completions.js.map +1 -1
  366. package/dist/bundles/response-tokens.js +2 -2
  367. package/dist/bundles/response-tokens.js.map +1 -1
  368. package/dist/bundles/scope-items.js +3 -3
  369. package/dist/bundles/scope-items.js.map +1 -1
  370. package/dist/bundles/structure-completions.js.map +1 -1
  371. package/dist/bundles/sub-language-registry.js.map +1 -1
  372. package/dist/bundles/sub-languages/capture/CompletionProvider.js.map +1 -1
  373. package/dist/bundles/sub-languages/capture/HoverProvider.js.map +1 -1
  374. package/dist/bundles/sub-languages/capture/Validator.js.map +1 -1
  375. package/dist/bundles/sub-languages/capture/index.js.map +1 -1
  376. package/dist/bundles/sub-languages/capture/language.js.map +1 -1
  377. package/dist/bundles/sub-languages/cdl.js.map +1 -1
  378. package/dist/bundles/sub-languages/pdl.js.map +1 -1
  379. package/dist/bundles/sub-languages/projection/CodeActionProvider.js.map +1 -1
  380. package/dist/bundles/sub-languages/projection/CompletionProvider.js +1 -1
  381. package/dist/bundles/sub-languages/projection/CompletionProvider.js.map +1 -1
  382. package/dist/bundles/sub-languages/projection/HoverProvider.js.map +1 -1
  383. package/dist/bundles/sub-languages/projection/Validator.js.map +1 -1
  384. package/dist/bundles/sub-languages/projection/index.js.map +1 -1
  385. package/dist/bundles/sub-languages/projection/language.js.map +1 -1
  386. package/dist/bundles/symbols.js +2 -2
  387. package/dist/bundles/symbols.js.map +1 -1
  388. package/dist/bundles/themes/screenplay-dark.js.map +1 -1
  389. package/dist/bundles/themes/screenplay-light.js.map +1 -1
  390. package/dist/bundles/tokens.js.map +1 -1
  391. package/dist/bundles/validation.js +2 -2
  392. package/dist/bundles/validation.js.map +1 -1
  393. package/dist/diagnostic-codes.d.ts +1 -0
  394. package/dist/diagnostic-codes.d.ts.map +1 -1
  395. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"HoverProvider.js","names":["token","model","position","keywordInfo","expressionInfo","tokens","column","startIndex","endIndex","word","\"$context\"","\"$identity\"","\"$previous\"","\"$env\""],"sources":["../../../../sub-languages/capture/HoverProvider.ts"],"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 { 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` — 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"],"mappings":"qDAKA,IAAa,cAAb,KAA8D,CAC1D,aAAa,EAA0B,EAA+D,CAClG,IAAMA,EAAQ,KAAK,mBAAmBC,EAAOC,CAAQ,EACrD,GAAI,CAACF,EACD,OAAO,KAGX,IAAMG,EAAc,KAAK,eAAeH,EAAM,IAAI,EAClD,GAAIG,EACA,MAAO,CACH,SAAU,CAAC,CAAE,MAAOA,CAAY,CAAC,EACjC,MAAOH,EAAM,KACjB,EAGJ,IAAMI,EAAiB,KAAK,kBAAkBJ,EAAM,IAAI,EAQxD,OAPII,EACO,CACH,SAAU,CAAC,CAAE,MAAOA,CAAe,CAAC,EACpC,MAAOJ,EAAM,KACjB,EAGG,IACX,CAEA,mBAA2B,EAA0B,EAA4D,CAE7G,IAAMK,EAAS,CAAC,GADIJ,EAAM,eAAeC,EAAS,UACrB,CAAC,CAAC,SAAS,wDAAwD,CAAC,EAC3FI,EAASJ,EAAS,OAAS,EAEjC,IAAK,IAAMF,KAASK,EAAQ,CACxB,IAAME,EAAaP,EAAM,OAAS,EAC5BQ,EAAWD,EAAaP,EAAM,EAAE,CAAC,OACvC,GAAIM,GAAUC,GAAcD,GAAUE,EAClC,MAAO,CACH,KAAMR,EAAM,GACZ,MAAO,CACH,gBAAiBE,EAAS,WAC1B,cAAeA,EAAS,WACxB,YAAaK,EAAa,EAC1B,UAAWC,EAAW,CAC1B,CACJ,CAER,CAEA,OAAO,IACX,CAIA,eAAuB,EAA6B,CA8BhD,MAAO,CA5BH,QAAS;;gDACT,OAAQ;;6CACR,IAAK;;2DACL,IAAK;;qEACL,OAAQ;;+DACR,KAAM;;6CACN,OAAQ;;wDACR,SAAU;;6CACV,WAAY;;mEACZ,GAAI,uFACJ,IAAK;;;;qIACL,QAAS;;+CACT,QAAS;;oDACT,OAAQ,kTACR,MAAO;;8GACP,KAAM;;8CACN,KAAM;;+CACN,MAAO;;4CACP,KAAM,yJACN,GAAI;;mDACJ,GAAI;;wCACJ,IAAK;;4DACL,MAAO;;sCACP,QAAS;;wCACT,UAAW;;0DACX,MAAO;;6CAGG,EAAEC,IAAS,IAC7B,CAEA,kBAA0B,EAA6B,CAQnD,MAAO,CANHC,SAAY;;;;;;4DACZC,UAAa,0MACbC,UAAa;;0FACbC,KAAQ;;oEAGK,EAAEJ,IAAS,IAChC,CACJ"}
1
+ {"version":3,"file":"HoverProvider.js","names":["token","model","position","keywordInfo","expressionInfo","tokens","column","startIndex","endIndex","word","\"$context\"","\"$identity\"","\"$previous\"","\"$env\""],"sources":["../../../../sub-languages/capture/HoverProvider.ts"],"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 { 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` — 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"],"mappings":"A,qDAKA,IAAa,cAAb,KAA8D,CAC1D,aAAa,EAA0B,EAA+D,CAClG,IAAMA,EAAQ,KAAK,mBAAmBC,EAAOC,CAAQ,EACrD,GAAI,CAACF,EACD,OAAO,KAGX,IAAMG,EAAc,KAAK,eAAeH,EAAM,IAAI,EAClD,GAAIG,EACA,MAAO,CACH,SAAU,CAAC,CAAE,MAAOA,CAAY,CAAC,EACjC,MAAOH,EAAM,KACjB,EAGJ,IAAMI,EAAiB,KAAK,kBAAkBJ,EAAM,IAAI,EAQxD,OAPII,EACO,CACH,SAAU,CAAC,CAAE,MAAOA,CAAe,CAAC,EACpC,MAAOJ,EAAM,KACjB,EAGG,IACX,CAEA,mBAA2B,EAA0B,EAA4D,CAE7G,IAAMK,EAAS,CAAC,GADIJ,EAAM,eAAeC,EAAS,UACrB,CAAC,CAAC,SAAS,wDAAwD,CAAC,EAC3FI,EAASJ,EAAS,OAAS,EAEjC,IAAK,IAAMF,KAASK,EAAQ,CACxB,IAAME,EAAaP,EAAM,OAAS,EAC5BQ,EAAWD,EAAaP,EAAM,EAAE,CAAC,OACvC,GAAIM,GAAUC,GAAcD,GAAUE,EAClC,MAAO,CACH,KAAMR,EAAM,GACZ,MAAO,CACH,gBAAiBE,EAAS,WAC1B,cAAeA,EAAS,WACxB,YAAaK,EAAa,EAC1B,UAAWC,EAAW,CAC1B,CACJ,CAER,CAEA,OAAO,IACX,CAIA,eAAuB,EAA6B,CA8BhD,MAAO,CA5BH,QAAS;;gDACT,OAAQ;;6CACR,IAAK;;2DACL,IAAK;;qEACL,OAAQ;;+DACR,KAAM;;6CACN,OAAQ;;wDACR,SAAU;;6CACV,WAAY;;mEACZ,GAAI,uFACJ,IAAK;;;;qIACL,QAAS;;+CACT,QAAS;;oDACT,OAAQ,kTACR,MAAO;;8GACP,KAAM;;8CACN,KAAM;;+CACN,MAAO;;4CACP,KAAM,yJACN,GAAI;;mDACJ,GAAI;;wCACJ,IAAK;;4DACL,MAAO;;sCACP,QAAS;;wCACT,UAAW;;0DACX,MAAO;;6CAGG,EAAEC,IAAS,IAC7B,CAEA,kBAA0B,EAA6B,CAQnD,MAAO,CANHC,SAAY;;;;;;4DACZC,UAAa,0MACbC,UAAa;;0FACbC,KAAQ;;oEAGK,EAAEJ,IAAS,IAChC,CACJ,E"}
@@ -1 +1 @@
1
- {"version":3,"file":"Validator.js","names":["issues","firstNonEmptyLineIndex","firstLine","index","lines","trimmed","meaningfulLines","line","entry","current","hasWhenClause","next","candidate","eventName","startColumn"],"sources":["../../../../sub-languages/capture/Validator.ts"],"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 { 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 — 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"],"mappings":"qDAgBA,IAAa,UAAb,KAAuB,CACnB,SAAS,EAAoC,CACzC,IAAMA,EAA4B,CAAC,EAE/BC,EAAyB,GACzBC,EAAY,GAChB,IAAK,IAAIC,EAAQ,EAAGA,EAAQC,EAAM,OAAQ,IAAS,CAC/C,IAAMC,EAAUD,EAAMD,EAAM,CAAC,KAAK,EAClC,GAAIE,GAAW,CAACA,EAAQ,WAAW,GAAG,EAAG,CACrC,EAAyBF,EACzB,EAAYE,EACZ,KACJ,CACJ,CAEA,GAAI,CAACH,EACD,OAAOF,EAIX,GAAI,CADiBE,EAAU,MAAM,yBACrB,EAEZ,OADAF,EAAO,KAAK,KAAK,MAAMC,EAAwB,EAAGC,EAAU,OAAS,EAAG,qDAAqD,CAAC,EACvHF,EAGX,IAAMM,EAAoCF,EACrC,KAAK,EAAM,KAAW,CACnB,OACA,QAASG,EAAK,KAAK,EACnB,WAAYJ,EACZ,OAAQI,EAAK,OAAO,IAAI,CAC5B,EAAE,CAAC,CACF,OAAQ,GAAUC,EAAM,SAAW,CAACA,EAAM,QAAQ,WAAW,GAAG,CAAC,EAEpDF,EAAgB,KAAM,GAAUE,EAAM,QAAQ,WAAW,SAAS,CACvE,GACTR,EAAO,KAAK,KAAK,MAAMC,EAAwB,EAAGC,EAAU,OAAS,EAAG,kDAAkD,CAAC,EAGhHI,EAAgB,KAAM,GAAUE,EAAM,QAAQ,WAAW,MAAM,CACpE,GACNR,EAAO,KAAK,KAAK,MAAMC,EAAwB,EAAGC,EAAU,OAAS,EAAG,qDAAqD,CAAC,EAGlI,IAAK,IAAIC,EAAQ,EAAGA,EAAQG,EAAgB,OAAQ,IAAS,CACzD,IAAMG,EAAUH,EAAgBH,GAChC,GAAI,CAACM,EAAQ,QAAQ,WAAW,SAAS,EACrC,SAGJ,IAAIC,EAAgB,GACpB,IAAK,IAAIC,EAAOR,EAAQ,EAAGQ,EAAOL,EAAgB,OAAQ,IAAQ,CAC9D,IAAMM,EAAYN,EAAgBK,GAClC,GAAIC,EAAU,QAAUH,EAAQ,OAC5B,MAEJ,GAAIG,EAAU,QAAQ,WAAW,OAAO,EAAG,CACvC,EAAgB,GAChB,KACJ,CACJ,CAEA,GAAI,CAACF,EAAe,CAChB,IAAMG,EAAYJ,EAAQ,QAAQ,UAAU,CAAgB,CAAC,CAAC,KAAK,GAAK,uBAClEK,EAAcL,EAAQ,KAAK,QAAQI,CAAS,EAAI,EACtDb,EAAO,KAAK,KAAK,MACbS,EAAQ,WACRK,EAAc,EAAIA,EAAc,EAChCA,EAAc,EAAIA,EAAcD,EAAU,OAASJ,EAAQ,KAAK,OAAS,EACzE,iBAAiBI,EAAU,+BAC/B,CAAC,CACL,CACJ,CAEA,OAAOb,CACX,CAEA,MAAc,EAAc,EAAqB,EAAmB,EAAkC,CAClG,MAAO,CAAE,SAAU,QAAS,OAAM,cAAa,YAAW,SAAQ,CACtE,CACJ"}
1
+ {"version":3,"file":"Validator.js","names":["issues","firstNonEmptyLineIndex","firstLine","index","lines","trimmed","meaningfulLines","line","entry","current","hasWhenClause","next","candidate","eventName","startColumn"],"sources":["../../../../sub-languages/capture/Validator.ts"],"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 { 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 — 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"],"mappings":"A,qDAgBA,IAAa,UAAb,KAAuB,CACnB,SAAS,EAAoC,CACzC,IAAMA,EAA4B,CAAC,EAE/BC,EAAyB,GACzBC,EAAY,GAChB,IAAK,IAAIC,EAAQ,EAAGA,EAAQC,EAAM,OAAQ,IAAS,CAC/C,IAAMC,EAAUD,EAAMD,EAAM,CAAC,KAAK,EAClC,GAAIE,GAAW,CAACA,EAAQ,WAAW,GAAG,EAAG,CACrC,EAAyBF,EACzB,EAAYE,EACZ,KACJ,CACJ,CAEA,GAAI,CAACH,EACD,OAAOF,EAIX,GAAI,CADiBE,EAAU,MAAM,yBACrB,EAEZ,OADAF,EAAO,KAAK,KAAK,MAAMC,EAAwB,EAAGC,EAAU,OAAS,EAAG,qDAAqD,CAAC,EACvHF,EAGX,IAAMM,EAAoCF,EACrC,KAAK,EAAM,KAAW,CACnB,OACA,QAASG,EAAK,KAAK,EACnB,WAAYJ,EACZ,OAAQI,EAAK,OAAO,IAAI,CAC5B,EAAE,CAAC,CACF,OAAQ,GAAUC,EAAM,SAAW,CAACA,EAAM,QAAQ,WAAW,GAAG,CAAC,EAEpDF,EAAgB,KAAM,GAAUE,EAAM,QAAQ,WAAW,SAAS,CACvE,GACTR,EAAO,KAAK,KAAK,MAAMC,EAAwB,EAAGC,EAAU,OAAS,EAAG,kDAAkD,CAAC,EAGhHI,EAAgB,KAAM,GAAUE,EAAM,QAAQ,WAAW,MAAM,CACpE,GACNR,EAAO,KAAK,KAAK,MAAMC,EAAwB,EAAGC,EAAU,OAAS,EAAG,qDAAqD,CAAC,EAGlI,IAAK,IAAIC,EAAQ,EAAGA,EAAQG,EAAgB,OAAQ,IAAS,CACzD,IAAMG,EAAUH,EAAgBH,GAChC,GAAI,CAACM,EAAQ,QAAQ,WAAW,SAAS,EACrC,SAGJ,IAAIC,EAAgB,GACpB,IAAK,IAAIC,EAAOR,EAAQ,EAAGQ,EAAOL,EAAgB,OAAQ,IAAQ,CAC9D,IAAMM,EAAYN,EAAgBK,GAClC,GAAIC,EAAU,QAAUH,EAAQ,OAC5B,MAEJ,GAAIG,EAAU,QAAQ,WAAW,OAAO,EAAG,CACvC,EAAgB,GAChB,KACJ,CACJ,CAEA,GAAI,CAACF,EAAe,CAChB,IAAMG,EAAYJ,EAAQ,QAAQ,UAAU,CAAgB,CAAC,CAAC,KAAK,GAAK,uBAClEK,EAAcL,EAAQ,KAAK,QAAQI,CAAS,EAAI,EACtDb,EAAO,KAAK,KAAK,MACbS,EAAQ,WACRK,EAAc,EAAIA,EAAc,EAChCA,EAAc,EAAIA,EAAcD,EAAU,OAASJ,EAAQ,KAAK,OAAS,EACzE,iBAAiBI,EAAU,+BAC/B,CAAC,CACL,CACJ,CAEA,OAAOb,CACX,CAEA,MAAc,EAAc,EAAqB,EAAmB,EAAkC,CAClG,MAAO,CAAE,SAAU,QAAS,OAAM,cAAa,YAAW,SAAQ,CACtE,CACJ,E"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["disposersByMonaco","validator","model","issue","monaco","existing","languageConfiguration","monarchLanguage","Validator","disposables","CompletionProvider","HoverProvider","disposable","languageId"],"sources":["../../../../sub-languages/capture/index.ts"],"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 { 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 — 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"],"mappings":"2SASA,MAMMA,kBAAoB,IAAI,IAE9B,SAAS,UAAU,EAAgB,EAAsB,EAAgD,CACrG,OAAOC,EAAU,SAASC,EAAM,gBAAgB,CAAC,CAAC,CAAC,IAAK,IAAW,CAC/D,SAAUC,EAAM,WAAa,QAAUC,EAAO,eAAe,MAAQA,EAAO,eAAe,QAC3F,QAASD,EAAM,QACf,gBAAiBA,EAAM,KAAO,EAC9B,YAAaA,EAAM,YACnB,cAAeA,EAAM,KAAO,EAC5B,UAAWA,EAAM,SACrB,EAAE,CACN,CAEA,SAAgB,wBAAwB,EAAqC,CACzE,IAAME,EAAWL,EAAkB,IAAII,CAAM,EAC7C,GAAIC,EACA,MAAO,CAAE,QAASA,CAAS,EAG/BD,EAAO,UAAU,SAAS,CAAE,GAAA,KAAe,CAAC,EAC5CA,EAAO,UAAU,yBAAA,MAAqCE,CAAqB,EAC3EF,EAAO,UAAU,yBAAA,MAAqCG,CAAe,EAErE,IAAMN,EAAY,IAAIO,EAChBC,EAA6B,CAAC,EAEpCA,EAAY,KAAKL,EAAO,UAAU,+BAAA,MAA2C,IAAIM,CAAoB,CAAC,EACtGD,EAAY,KAAKL,EAAO,UAAU,sBAAA,MAAkC,IAAIO,CAAe,CAAC,EAExF,IAAM,cAAiB,GAAmC,CAClDT,EAAM,WAAW,GAAKA,EAAM,cAAc,IAAA,OAG9CE,EAAO,OAAO,gBAAgBF,EAAO,gBAAa,UAAUE,EAAQH,EAAWC,CAAK,CAAC,CACzF,EAEAO,EAAY,KAAKL,EAAO,OAAO,iBAAkB,GAAU,CACnDF,EAAM,cAAc,IAAA,QAGxB,cAAcA,CAAK,EACnBO,EAAY,KAAKP,EAAM,uBAAyB,cAAcA,CAAK,CAAC,CAAC,EACzE,CAAC,CAAC,EAEFE,EAAO,OAAO,UAAU,CAAC,CAAC,QAAS,GAAU,cAAcF,CAAK,CAAC,EAEjE,IAAM,YAAsB,CACxBO,EAAY,QAAS,GAAeG,EAAW,QAAQ,CAAC,EACxD,EAAY,OAAS,EACrBZ,EAAkB,OAAOI,CAAM,CACnC,EAGA,OADAJ,EAAkB,IAAII,EAAQ,OAAO,EAC9B,CAAE,OAAQ,CACrB"}
1
+ {"version":3,"file":"index.js","names":["disposersByMonaco","validator","model","issue","monaco","existing","languageConfiguration","monarchLanguage","Validator","disposables","CompletionProvider","HoverProvider","disposable","languageId"],"sources":["../../../../sub-languages/capture/index.ts"],"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 { 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 — 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"],"mappings":"A,2SASA,MAMMA,kBAAoB,IAAI,IAE9B,SAAS,UAAU,EAAgB,EAAsB,EAAgD,CACrG,OAAOC,EAAU,SAASC,EAAM,gBAAgB,CAAC,CAAC,CAAC,IAAK,IAAW,CAC/D,SAAUC,EAAM,WAAa,QAAUC,EAAO,eAAe,MAAQA,EAAO,eAAe,QAC3F,QAASD,EAAM,QACf,gBAAiBA,EAAM,KAAO,EAC9B,YAAaA,EAAM,YACnB,cAAeA,EAAM,KAAO,EAC5B,UAAWA,EAAM,SACrB,EAAE,CACN,CAEA,SAAgB,wBAAwB,EAAqC,CACzE,IAAME,EAAWL,EAAkB,IAAII,CAAM,EAC7C,GAAIC,EACA,MAAO,CAAE,QAASA,CAAS,EAG/BD,EAAO,UAAU,SAAS,CAAE,GAAA,KAAe,CAAC,EAC5CA,EAAO,UAAU,yBAAA,MAAqCE,CAAqB,EAC3EF,EAAO,UAAU,yBAAA,MAAqCG,CAAe,EAErE,IAAMN,EAAY,IAAIO,EAChBC,EAA6B,CAAC,EAEpCA,EAAY,KAAKL,EAAO,UAAU,+BAAA,MAA2C,IAAIM,CAAoB,CAAC,EACtGD,EAAY,KAAKL,EAAO,UAAU,sBAAA,MAAkC,IAAIO,CAAe,CAAC,EAExF,IAAM,cAAiB,GAAmC,CAClDT,EAAM,WAAW,GAAKA,EAAM,cAAc,IAAA,OAG9CE,EAAO,OAAO,gBAAgBF,EAAO,gBAAa,UAAUE,EAAQH,EAAWC,CAAK,CAAC,CACzF,EAEAO,EAAY,KAAKL,EAAO,OAAO,iBAAkB,GAAU,CACnDF,EAAM,cAAc,IAAA,QAGxB,cAAcA,CAAK,EACnBO,EAAY,KAAKP,EAAM,uBAAyB,cAAcA,CAAK,CAAC,CAAC,EACzE,CAAC,CAAC,EAEFE,EAAO,OAAO,UAAU,CAAC,CAAC,QAAS,GAAU,cAAcF,CAAK,CAAC,EAEjE,IAAM,YAAsB,CACxBO,EAAY,QAAS,GAAeG,EAAW,QAAQ,CAAC,EACxD,EAAY,OAAS,EACrBZ,EAAkB,OAAOI,CAAM,CACnC,EAGA,OADAJ,EAAkB,IAAII,EAAQ,OAAO,EAC9B,CAAE,OAAQ,CACrB,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"language.js","names":["languageId","KEYWORDS","BUILTINS","OPERATORS","languageConfiguration","monarchLanguage"],"sources":["../../../../sub-languages/capture/language.ts"],"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) — 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) — 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` — 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"],"mappings":"AAWA,MAAaA,EAAa,MAMpBC,EAAW,0LA2BjB,EAEMC,EAAW,CACb,WACA,YACA,YACA,MACJ,EAEMC,EAAY,CAAC,IAAK,KAAM,GAAG,EAEpBC,EAAyD,CAClE,SAAU,CACN,YAAa,GACjB,EACA,SAAU,CACN,CAAC,IAAK,GAAG,EACT,CAAC,IAAK,GAAG,EACT,CAAC,IAAK,GAAG,CACb,EACA,iBAAkB,CACd,CAAE,KAAM,IAAK,MAAO,GAAI,EACxB,CAAE,KAAM,IAAK,MAAO,GAAI,EACxB,CAAE,KAAM,IAAK,MAAO,GAAI,EACxB,CAAE,KAAM,IAAK,MAAO,GAAI,EACxB,CAAE,KAAM,IAAK,MAAO,GAAI,EACxB,CAAE,KAAM,IAAK,MAAO,GAAI,CAC5B,EACA,iBAAkB,CACd,CAAE,KAAM,IAAK,MAAO,GAAI,EACxB,CAAE,KAAM,IAAK,MAAO,GAAI,EACxB,CAAE,KAAM,IAAK,MAAO,GAAI,EACxB,CAAE,KAAM,IAAK,MAAO,GAAI,EACxB,CAAE,KAAM,IAAK,MAAO,GAAI,EACxB,CAAE,KAAM,IAAK,MAAO,GAAI,CAC5B,EACA,iBAAkB,CACd,sBAAuB,4IACvB,sBAAuB,UAC3B,EACA,QAAS,CACL,QAAS,GACT,QAAS,CACL,MAAO,kEACP,IAAK,OACT,CACJ,EACA,YAAa,sBACjB,EAEaC,EAA8C,CACvD,aAAc,GACd,aAAc,OAEd,SAAUJ,EACV,SAAUC,EACV,UAAWC,EAEX,QAAS,sBACT,QAAS,wEAET,UAAW,CACP,KAAM,CACF,CAAE,QAAS,aAAc,EACzB,CAAC,IAAK,CAAE,MAAO,kBAAmB,KAAM,iBAAkB,CAAC,EAC3D,CAAC,2CAA4C,UAAU,EACvD,CAAC,mDAAoD,qBAAqB,EAC1E,CAAC,6CAA8C,qBAAqB,EACpE,CAAC,uBAAwB,qBAAqB,EAC9C,CAAC,+BAAgC,qBAAqB,EACtD,CAAC,oBAAqB,mBAAmB,EACzC,CACI,wBACA,CACI,MAAO,CACH,YAAa,UACb,WAAY,YAChB,CACJ,CACJ,EACA,CACI,gBACA,CACI,MAAO,CACH,YAAa,UACb,YAAa,sBACb,WAAY,YAChB,CACJ,CACJ,EACA,CAAC,YAAa,WAAW,EACzB,CAAC,KAAM,gBAAgB,EACvB,CACI,WACA,CACI,MAAO,CACH,aAAc,WACd,WAAY,EAChB,CACJ,CACJ,EACA,CAAC,0BAA2B,cAAc,EAC1C,CAAC,oBAAqB,YAAY,EAClC,CAAC,MAAO,QAAQ,EAChB,CAAC,QAAS,WAAW,EACrB,CAAC,kBAAmB,gBAAgB,EACpC,CAAC,IAAK,CAAE,MAAO,eAAgB,KAAM,SAAU,CAAC,CACpD,EAEA,WAAY,CACR,CAAC,aAAc,EAAE,EACjB,CAAC,OAAQ,SAAS,CACtB,EAEA,eAAgB,CACZ,CAAC,OAAQ,CAAE,MAAO,oBAAqB,KAAM,qBAAsB,CAAC,EACpE,CAAC,WAAY,iBAAiB,EAC9B,CAAC,WAAY,wBAAwB,EACrC,CAAC,MAAO,gCAAgC,EACxC,CAAC,IAAK,CAAE,MAAO,kBAAmB,KAAM,MAAO,CAAC,CACpD,EAEA,mBAAoB,CAChB,CAAC,KAAM,CAAE,MAAO,oBAAqB,KAAM,MAAO,CAAC,EACnD,CAAE,QAAS,OAAQ,CACvB,EAEA,OAAQ,CACJ,CAAC,UAAW,QAAQ,EACpB,CAAC,WAAY,eAAe,EAC5B,CAAC,MAAO,uBAAuB,EAC/B,CAAC,IAAK,CAAE,MAAO,eAAgB,KAAM,MAAO,CAAC,CACjD,CACJ,CACJ"}
1
+ {"version":3,"file":"language.js","names":["languageId","KEYWORDS","BUILTINS","OPERATORS","languageConfiguration","monarchLanguage"],"sources":["../../../../sub-languages/capture/language.ts"],"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) — 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) — 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` — 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"],"mappings":"AAWA,MAAaA,EAAa,MAMpBC,EAAW,0LA2BjB,EAEMC,EAAW,CACb,WACA,YACA,YACA,MACJ,EAEMC,EAAY,CAAC,IAAK,KAAM,GAAG,EAEpBC,EAAyD,CAClE,SAAU,CACN,YAAa,GACjB,EACA,SAAU,CACN,CAAC,IAAK,GAAG,EACT,CAAC,IAAK,GAAG,EACT,CAAC,IAAK,GAAG,CACb,EACA,iBAAkB,CACd,CAAE,KAAM,IAAK,MAAO,GAAI,EACxB,CAAE,KAAM,IAAK,MAAO,GAAI,EACxB,CAAE,KAAM,IAAK,MAAO,GAAI,EACxB,CAAE,KAAM,IAAK,MAAO,GAAI,EACxB,CAAE,KAAM,IAAK,MAAO,GAAI,EACxB,CAAE,KAAM,IAAK,MAAO,GAAI,CAC5B,EACA,iBAAkB,CACd,CAAE,KAAM,IAAK,MAAO,GAAI,EACxB,CAAE,KAAM,IAAK,MAAO,GAAI,EACxB,CAAE,KAAM,IAAK,MAAO,GAAI,EACxB,CAAE,KAAM,IAAK,MAAO,GAAI,EACxB,CAAE,KAAM,IAAK,MAAO,GAAI,EACxB,CAAE,KAAM,IAAK,MAAO,GAAI,CAC5B,EACA,iBAAkB,CACd,sBAAuB,4IACvB,sBAAuB,UAC3B,EACA,QAAS,CACL,QAAS,GACT,QAAS,CACL,MAAO,kEACP,IAAK,OACT,CACJ,EACA,YAAa,sBACjB,EAEaC,EAA8C,CACvD,aAAc,GACd,aAAc,OAEd,SAAUJ,EACV,SAAUC,EACV,UAAWC,EAEX,QAAS,sBACT,QAAS,wEAET,UAAW,CACP,KAAM,CACF,CAAE,QAAS,aAAc,EACzB,CAAC,IAAK,CAAE,MAAO,kBAAmB,KAAM,iBAAkB,CAAC,EAC3D,CAAC,2CAA4C,UAAU,EACvD,CAAC,mDAAoD,qBAAqB,EAC1E,CAAC,6CAA8C,qBAAqB,EACpE,CAAC,uBAAwB,qBAAqB,EAC9C,CAAC,+BAAgC,qBAAqB,EACtD,CAAC,oBAAqB,mBAAmB,EACzC,CACI,wBACA,CACI,MAAO,CACH,YAAa,UACb,WAAY,YAChB,CACJ,CACJ,EACA,CACI,gBACA,CACI,MAAO,CACH,YAAa,UACb,YAAa,sBACb,WAAY,YAChB,CACJ,CACJ,EACA,CAAC,YAAa,WAAW,EACzB,CAAC,KAAM,gBAAgB,EACvB,CACI,WACA,CACI,MAAO,CACH,aAAc,WACd,WAAY,EAChB,CACJ,CACJ,EACA,CAAC,0BAA2B,cAAc,EAC1C,CAAC,oBAAqB,YAAY,EAClC,CAAC,MAAO,QAAQ,EAChB,CAAC,QAAS,WAAW,EACrB,CAAC,kBAAmB,gBAAgB,EACpC,CAAC,IAAK,CAAE,MAAO,eAAgB,KAAM,SAAU,CAAC,CACpD,EAEA,WAAY,CACR,CAAC,aAAc,EAAE,EACjB,CAAC,OAAQ,SAAS,CACtB,EAEA,eAAgB,CACZ,CAAC,OAAQ,CAAE,MAAO,oBAAqB,KAAM,qBAAsB,CAAC,EACpE,CAAC,WAAY,iBAAiB,EAC9B,CAAC,WAAY,wBAAwB,EACrC,CAAC,MAAO,gCAAgC,EACxC,CAAC,IAAK,CAAE,MAAO,kBAAmB,KAAM,MAAO,CAAC,CACpD,EAEA,mBAAoB,CAChB,CAAC,KAAM,CAAE,MAAO,oBAAqB,KAAM,MAAO,CAAC,EACnD,CAAE,QAAS,OAAQ,CACvB,EAEA,OAAQ,CACJ,CAAC,UAAW,QAAQ,EACpB,CAAC,WAAY,eAAe,EAC5B,CAAC,MAAO,uBAAuB,EAC/B,CAAC,IAAK,CAAE,MAAO,eAAgB,KAAM,MAAO,CAAC,CACjD,CACJ,CACJ,E"}
@@ -1 +1 @@
1
- {"version":3,"file":"cdl.js","names":["cdl"],"sources":["../../../sub-languages/cdl.ts"],"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 { SubLanguageDefinition } from '../sub-language-registry';\n\n// Change Data Capture Language (CDL) — embedded inside `capture` blocks. This is the\n// lightweight definition mixed into the composite `.play` tokenizer; the full standalone\n// CDL language (its own tokenizer, context-aware completions, hover, and validation) lives\n// in `./capture` and is what `@cratis/screenplay-language/capture` exposes to consumers.\nexport const cdl: SubLanguageDefinition = {\n tokens: [\n [\n /\\b(?:source|api|route|poll|path|topic|key|map|translate|split|append|tag|when|children|nested|identified|by|from|to|and|or|added|removed|is|event)\\b/,\n 'keyword',\n ],\n ],\n completions: [\n {\n label: 'source',\n insertText: 'source ${1:api}',\n documentation: 'Declares where the captured data comes from.',\n },\n {\n label: 'key',\n insertText: 'key ${1:property}',\n documentation: 'Declares which source property identifies an instance.',\n },\n {\n label: 'map',\n insertText: 'map\\n ${1:property} = ${2:source}',\n documentation: 'Maps and translates source values before events are appended.',\n },\n {\n label: 'append',\n insertText: 'append ${1:EventType}\\n when ${2:property}',\n documentation: 'Appends an event when the source data changes.',\n },\n {\n label: 'translate',\n insertText: 'translate\\n \"${1:source}\" => ${2:target}',\n documentation: 'Translates source values into Screenplay values.',\n },\n {\n label: 'children',\n insertText: 'children ${1:collection} identified by ${2:key}',\n documentation: 'Captures changes in a child collection of the source data.',\n },\n {\n label: 'when added',\n insertText: 'when added',\n documentation: 'Appends the event when a new item appears in the source.',\n },\n {\n label: 'when removed',\n insertText: 'when removed',\n documentation: 'Appends the event when an item disappears from the source.',\n },\n ],\n hovers: {\n source: 'CDL — declares where the captured data comes from.',\n api: 'CDL — as a source type, polls an HTTP API; as a source property (`api <ServiceName>`), references a named External Service for the base URL and authentication.',\n route: 'CDL — optional path appended to an API source\\'s External Service base URL.',\n poll: 'CDL — the polling interval for an API source, e.g. 5m.',\n path: 'CDL — the inbound path a webhook source listens on.',\n topic: 'CDL — the topic a message source subscribes to.',\n key: 'CDL — declares which source property identifies an instance. On a `source events` capture, `key <property> is event source` promises each captured event is sourced by that key.',\n is: 'CDL — in `key <property> is event source`, marks the key as the event source of every captured event.',\n map: 'CDL — maps and translates source values before events are appended.',\n translate: 'CDL — translates source values into Screenplay values.',\n append: 'CDL — appends an event when the source data changes.',\n when: 'CDL — the change condition: a property change, added, or removed.',\n added: 'CDL — matches items that appear in the source.',\n removed: 'CDL — matches items that disappear from the source.',\n children: 'CDL — captures changes in a child collection of the source data.',\n identified: 'CDL — introduces the identifying key of a child collection.',\n },\n};\n"],"mappings":"AASA,MAAaA,EAA6B,CACtC,OAAQ,CACJ,CACI,uJACA,SACJ,CACJ,EACA,YAAa,CACT,CACI,MAAO,SACP,WAAY,kBACZ,cAAe,8CACnB,EACA,CACI,MAAO,MACP,WAAY,oBACZ,cAAe,wDACnB,EACA,CACI,MAAO,MACP,WAAY,uCACZ,cAAe,+DACnB,EACA,CACI,MAAO,SACP,WAAY,gDACZ,cAAe,gDACnB,EACA,CACI,MAAO,YACP,WAAY,8CACZ,cAAe,kDACnB,EACA,CACI,MAAO,WACP,WAAY,kDACZ,cAAe,4DACnB,EACA,CACI,MAAO,aACP,WAAY,aACZ,cAAe,0DACnB,EACA,CACI,MAAO,eACP,WAAY,eACZ,cAAe,4DACnB,CACJ,EACA,OAAQ,CACJ,OAAQ,qDACR,IAAK,kKACL,MAAO,6EACP,KAAM,yDACN,KAAM,sDACN,MAAO,kDACP,IAAK,mLACL,GAAI,wGACJ,IAAK,sEACL,UAAW,yDACX,OAAQ,uDACR,KAAM,oEACN,MAAO,iDACP,QAAS,sDACT,SAAU,mEACV,WAAY,6DAChB,CACJ"}
1
+ {"version":3,"file":"cdl.js","names":["cdl"],"sources":["../../../sub-languages/cdl.ts"],"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 { SubLanguageDefinition } from '../sub-language-registry';\n\n// Change Data Capture Language (CDL) — embedded inside `capture` blocks. This is the\n// lightweight definition mixed into the composite `.play` tokenizer; the full standalone\n// CDL language (its own tokenizer, context-aware completions, hover, and validation) lives\n// in `./capture` and is what `@cratis/screenplay-language/capture` exposes to consumers.\nexport const cdl: SubLanguageDefinition = {\n tokens: [\n [\n /\\b(?:source|api|route|poll|path|topic|key|map|translate|split|append|tag|when|children|nested|identified|by|from|to|and|or|added|removed|is|event)\\b/,\n 'keyword',\n ],\n ],\n completions: [\n {\n label: 'source',\n insertText: 'source ${1:api}',\n documentation: 'Declares where the captured data comes from.',\n },\n {\n label: 'key',\n insertText: 'key ${1:property}',\n documentation: 'Declares which source property identifies an instance.',\n },\n {\n label: 'map',\n insertText: 'map\\n ${1:property} = ${2:source}',\n documentation: 'Maps and translates source values before events are appended.',\n },\n {\n label: 'append',\n insertText: 'append ${1:EventType}\\n when ${2:property}',\n documentation: 'Appends an event when the source data changes.',\n },\n {\n label: 'translate',\n insertText: 'translate\\n \"${1:source}\" => ${2:target}',\n documentation: 'Translates source values into Screenplay values.',\n },\n {\n label: 'children',\n insertText: 'children ${1:collection} identified by ${2:key}',\n documentation: 'Captures changes in a child collection of the source data.',\n },\n {\n label: 'when added',\n insertText: 'when added',\n documentation: 'Appends the event when a new item appears in the source.',\n },\n {\n label: 'when removed',\n insertText: 'when removed',\n documentation: 'Appends the event when an item disappears from the source.',\n },\n ],\n hovers: {\n source: 'CDL — declares where the captured data comes from.',\n api: 'CDL — as a source type, polls an HTTP API; as a source property (`api <ServiceName>`), references a named External Service for the base URL and authentication.',\n route: 'CDL — optional path appended to an API source\\'s External Service base URL.',\n poll: 'CDL — the polling interval for an API source, e.g. 5m.',\n path: 'CDL — the inbound path a webhook source listens on.',\n topic: 'CDL — the topic a message source subscribes to.',\n key: 'CDL — declares which source property identifies an instance. On a `source events` capture, `key <property> is event source` promises each captured event is sourced by that key.',\n is: 'CDL — in `key <property> is event source`, marks the key as the event source of every captured event.',\n map: 'CDL — maps and translates source values before events are appended.',\n translate: 'CDL — translates source values into Screenplay values.',\n append: 'CDL — appends an event when the source data changes.',\n when: 'CDL — the change condition: a property change, added, or removed.',\n added: 'CDL — matches items that appear in the source.',\n removed: 'CDL — matches items that disappear from the source.',\n children: 'CDL — captures changes in a child collection of the source data.',\n identified: 'CDL — introduces the identifying key of a child collection.',\n },\n};\n"],"mappings":"AASA,MAAaA,EAA6B,CACtC,OAAQ,CACJ,CACI,uJACA,SACJ,CACJ,EACA,YAAa,CACT,CACI,MAAO,SACP,WAAY,kBACZ,cAAe,8CACnB,EACA,CACI,MAAO,MACP,WAAY,oBACZ,cAAe,wDACnB,EACA,CACI,MAAO,MACP,WAAY,uCACZ,cAAe,+DACnB,EACA,CACI,MAAO,SACP,WAAY,gDACZ,cAAe,gDACnB,EACA,CACI,MAAO,YACP,WAAY,8CACZ,cAAe,kDACnB,EACA,CACI,MAAO,WACP,WAAY,kDACZ,cAAe,4DACnB,EACA,CACI,MAAO,aACP,WAAY,aACZ,cAAe,0DACnB,EACA,CACI,MAAO,eACP,WAAY,eACZ,cAAe,4DACnB,CACJ,EACA,OAAQ,CACJ,OAAQ,qDACR,IAAK,kKACL,MAAO,6EACP,KAAM,yDACN,KAAM,sDACN,MAAO,kDACP,IAAK,mLACL,GAAI,wGACJ,IAAK,sEACL,UAAW,yDACX,OAAQ,uDACR,KAAM,oEACN,MAAO,iDACP,QAAS,sDACT,SAAU,mEACV,WAAY,6DAChB,CACJ,E"}
@@ -1 +1 @@
1
- {"version":3,"file":"pdl.js","names":["pdl"],"sources":["../../../sub-languages/pdl.ts"],"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 { SubLanguageDefinition } from '../sub-language-registry';\n\n// Projection Declaration Language (PDL) — embedded inside `projection` blocks.\n// See https://www.cratis.io/chronicle/projections/projection-declaration-language/grammar/\nexport const pdl: SubLanguageDefinition = {\n tokens: [\n [\n /\\b(?:description|from|every|all|nested|join|children|identified|by|key|parent|with|remove|via|clear|on|sequence|automap|no|exclude|literal|set|increment|decrement|add|subtract|count)\\b/,\n 'keyword',\n ],\n ],\n completions: [\n { label: 'description', insertText: 'description \"${1:builder intent}\"', documentation: 'Report-only description on a projection header, not on its nested blocks or variants.' },\n {\n label: 'key',\n insertText: 'key ${1:property}',\n documentation: 'Declares which property identifies the read model instance.',\n },\n {\n label: 'key parts',\n insertText: 'key\\n ${1:part} = ${2:source}\\n ${3:part} = ${4:source}',\n documentation: 'Names every flat read-model key part in a from or remove with block. Part order does not affect identity.',\n },\n {\n label: 'from',\n insertText: 'from ${1:EventType}',\n documentation: 'Maps properties from an event onto the read model.',\n },\n {\n label: 'join',\n insertText: 'join ${1:property} on ${2:key}',\n documentation: 'Joins related state onto the read model by a key property.',\n },\n {\n label: 'children',\n insertText: 'children ${1:collection} identified by ${2:key}',\n documentation: 'Projects events into a child collection on the read model.',\n },\n {\n label: 'remove with',\n insertText: 'remove with ${1:EventType}',\n documentation: 'Removes the read model instance when the event occurs. A child key block names composite read-model key parts.',\n },\n {\n label: 'parent',\n insertText: 'parent ${1:property}',\n documentation: 'Declares the property that identifies the parent of a child.',\n },\n {\n label: 'clear',\n insertText: 'clear ${1:property}',\n documentation: 'Removes the value a property holds when the event occurs.',\n },\n {\n label: 'increment',\n insertText: 'increment ${1:property}',\n documentation: 'Increments a numeric property when the event occurs.',\n },\n {\n label: 'decrement',\n insertText: 'decrement ${1:property}',\n documentation: 'Decrements a numeric property when the event occurs.',\n },\n ],\n hovers: {\n description: 'Report-only projection-header description, as quoted or fenced text; adds no executable bytes.',\n from: 'PDL — maps properties from an event onto the read model.',\n every: 'PDL — applies property mappings for every event type in the projection.',\n join: 'PDL — joins related state onto the read model by a key property.',\n children: 'PDL — projects events into a child collection on the read model.',\n identified: 'PDL — introduces the identifying key of a child collection.',\n key: 'PDL — identifies the read-model instance. An untyped child block maps every flat key part by name in from and remove with; a typed block constructs a composite value.',\n parent: 'PDL — declares the property that identifies the parent of a child.',\n remove: 'PDL — removes the read model instance when an event occurs.',\n clear: 'PDL — clear <property> removes the value a property holds; clear with <EventType> nulls a nested object.',\n increment: 'PDL — increments a numeric property when the event occurs.',\n decrement: 'PDL — decrements a numeric property when the event occurs.',\n },\n};\n"],"mappings":"AAOA,MAAaA,EAA6B,CACtC,OAAQ,CACJ,CACI,2LACA,SACJ,CACJ,EACA,YAAa,CACT,CAAE,MAAO,cAAe,WAAY,oCAAqC,cAAe,uFAAwF,EAChL,CACI,MAAO,MACP,WAAY,oBACZ,cAAe,6DACnB,EACA,CACI,MAAO,YACP,WAAY,4DACZ,cAAe,2GACnB,EACA,CACI,MAAO,OACP,WAAY,sBACZ,cAAe,oDACnB,EACA,CACI,MAAO,OACP,WAAY,iCACZ,cAAe,4DACnB,EACA,CACI,MAAO,WACP,WAAY,kDACZ,cAAe,4DACnB,EACA,CACI,MAAO,cACP,WAAY,6BACZ,cAAe,gHACnB,EACA,CACI,MAAO,SACP,WAAY,uBACZ,cAAe,8DACnB,EACA,CACI,MAAO,QACP,WAAY,sBACZ,cAAe,2DACnB,EACA,CACI,MAAO,YACP,WAAY,0BACZ,cAAe,sDACnB,EACA,CACI,MAAO,YACP,WAAY,0BACZ,cAAe,sDACnB,CACJ,EACA,OAAQ,CACJ,YAAa,iGACb,KAAM,2DACN,MAAO,0EACP,KAAM,mEACN,SAAU,mEACV,WAAY,8DACZ,IAAK,yKACL,OAAQ,qEACR,OAAQ,8DACR,MAAO,2GACP,UAAW,6DACX,UAAW,4DACf,CACJ"}
1
+ {"version":3,"file":"pdl.js","names":["pdl"],"sources":["../../../sub-languages/pdl.ts"],"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 { SubLanguageDefinition } from '../sub-language-registry';\n\n// Projection Declaration Language (PDL) — embedded inside `projection` blocks.\n// See https://www.cratis.io/chronicle/projections/projection-declaration-language/grammar/\nexport const pdl: SubLanguageDefinition = {\n tokens: [\n [\n /\\b(?:description|from|every|all|nested|join|children|identified|by|key|parent|with|remove|via|clear|on|sequence|automap|no|exclude|literal|set|increment|decrement|add|subtract|count)\\b/,\n 'keyword',\n ],\n ],\n completions: [\n { label: 'description', insertText: 'description \"${1:builder intent}\"', documentation: 'Report-only description on a projection header, not on its nested blocks or variants.' },\n {\n label: 'key',\n insertText: 'key ${1:property}',\n documentation: 'Declares which property identifies the read model instance.',\n },\n {\n label: 'key parts',\n insertText: 'key\\n ${1:part} = ${2:source}\\n ${3:part} = ${4:source}',\n documentation: 'Names every flat read-model key part in a from or remove with block. Part order does not affect identity.',\n },\n {\n label: 'from',\n insertText: 'from ${1:EventType}',\n documentation: 'Maps properties from an event onto the read model.',\n },\n {\n label: 'join',\n insertText: 'join ${1:property} on ${2:key}',\n documentation: 'Joins related state onto the read model by a key property.',\n },\n {\n label: 'children',\n insertText: 'children ${1:collection} identified by ${2:key}',\n documentation: 'Projects events into a child collection on the read model.',\n },\n {\n label: 'remove with',\n insertText: 'remove with ${1:EventType}',\n documentation: 'Removes the read model instance when the event occurs. A child key block names composite read-model key parts.',\n },\n {\n label: 'parent',\n insertText: 'parent ${1:property}',\n documentation: 'Declares the property that identifies the parent of a child.',\n },\n {\n label: 'clear',\n insertText: 'clear ${1:property}',\n documentation: 'Removes the value a property holds when the event occurs.',\n },\n {\n label: 'increment',\n insertText: 'increment ${1:property}',\n documentation: 'Increments a numeric property when the event occurs.',\n },\n {\n label: 'decrement',\n insertText: 'decrement ${1:property}',\n documentation: 'Decrements a numeric property when the event occurs.',\n },\n ],\n hovers: {\n description: 'Report-only projection-header description, as quoted or fenced text; adds no executable bytes.',\n from: 'PDL — maps properties from an event onto the read model.',\n every: 'PDL — applies property mappings for every event type in the projection.',\n join: 'PDL — joins related state onto the read model by a key property.',\n children: 'PDL — projects events into a child collection on the read model.',\n identified: 'PDL — introduces the identifying key of a child collection.',\n key: 'PDL — identifies the read-model instance. An untyped child block maps every flat key part by name in from and remove with; a typed block constructs a composite value.',\n parent: 'PDL — declares the property that identifies the parent of a child.',\n remove: 'PDL — removes the read model instance when an event occurs.',\n clear: 'PDL — clear <property> removes the value a property holds; clear with <EventType> nulls a nested object.',\n increment: 'PDL — increments a numeric property when the event occurs.',\n decrement: 'PDL — decrements a numeric property when the event occurs.',\n },\n};\n"],"mappings":"AAOA,MAAaA,EAA6B,CACtC,OAAQ,CACJ,CACI,2LACA,SACJ,CACJ,EACA,YAAa,CACT,CAAE,MAAO,cAAe,WAAY,oCAAqC,cAAe,uFAAwF,EAChL,CACI,MAAO,MACP,WAAY,oBACZ,cAAe,6DACnB,EACA,CACI,MAAO,YACP,WAAY,4DACZ,cAAe,2GACnB,EACA,CACI,MAAO,OACP,WAAY,sBACZ,cAAe,oDACnB,EACA,CACI,MAAO,OACP,WAAY,iCACZ,cAAe,4DACnB,EACA,CACI,MAAO,WACP,WAAY,kDACZ,cAAe,4DACnB,EACA,CACI,MAAO,cACP,WAAY,6BACZ,cAAe,gHACnB,EACA,CACI,MAAO,SACP,WAAY,uBACZ,cAAe,8DACnB,EACA,CACI,MAAO,QACP,WAAY,sBACZ,cAAe,2DACnB,EACA,CACI,MAAO,YACP,WAAY,0BACZ,cAAe,sDACnB,EACA,CACI,MAAO,YACP,WAAY,0BACZ,cAAe,sDACnB,CACJ,EACA,OAAQ,CACJ,YAAa,iGACb,KAAM,2DACN,MAAO,0EACP,KAAM,mEACN,SAAU,mEACV,WAAY,8DACZ,IAAK,yKACL,OAAQ,qEACR,OAAQ,8DACR,MAAO,2GACP,UAAW,6DACX,UAAW,4DACf,CACJ,E"}
@@ -1 +1 @@
1
- {"version":3,"file":"CodeActionProvider.js","names":["readModels","draft","schemas","schema","callback","readModelName","currentSchema","actions","notFoundDiagnostics","context","marker","draftDiagnostics","diagnostic","match","rm","readModelToken"],"sources":["../../../../sub-languages/projection/CodeActionProvider.ts"],"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 * as Monaco from 'monaco-editor';\nimport type { JsonSchema, ReadModelInfo, DraftReadModelInfo } from './index';\n\nexport class CodeActionProvider {\n private readModels: ReadModelInfo[] = [];\n private draftReadModel: DraftReadModelInfo | null = null;\n private onCreateReadModel?: (readModelName: string) => void;\n private onEditReadModel?: (readModelName: string, currentSchema: JsonSchema) => void;\n\n setReadModels(readModels: ReadModelInfo[]): void {\n this.readModels = readModels;\n }\n\n setDraftReadModel(draft: DraftReadModelInfo | null): void {\n this.draftReadModel = draft;\n }\n\n // Keep for backwards compatibility\n setReadModelSchemas(schemas: JsonSchema[]): void {\n this.readModels = schemas.map(schema => ({\n identifier: schema.title || schema.name || '',\n displayName: schema.title || schema.name || '',\n schema\n }));\n }\n\n setCreateReadModelCallback(callback: (readModelName: string) => void): void {\n this.onCreateReadModel = callback;\n }\n\n setEditReadModelCallback(callback: (readModelName: string, currentSchema: JsonSchema) => void): void {\n this.onEditReadModel = callback;\n }\n\n invokeCreateReadModel(readModelName: string): void {\n this.onCreateReadModel?.(readModelName);\n }\n\n invokeEditReadModel(readModelName: string, currentSchema: JsonSchema): void {\n this.onEditReadModel?.(readModelName, currentSchema);\n }\n\n provideCodeActions(\n _model: Monaco.editor.ITextModel,\n _range: Monaco.Range,\n context: Monaco.languages.CodeActionContext\n ): Monaco.languages.ProviderResult<Monaco.languages.CodeActionList> {\n const actions: Monaco.languages.CodeAction[] = [];\n\n // Check for diagnostics about undefined read models (errors)\n const notFoundDiagnostics = context.markers.filter(\n (marker: Monaco.editor.IMarkerData) => marker.message.includes(\"Read model\") && marker.message.includes(\"not found\")\n );\n\n // Check for diagnostics about draft read models (info markers)\n const draftDiagnostics = context.markers.filter(\n (marker: Monaco.editor.IMarkerData) => marker.message.includes(\"Read model\") && marker.message.includes(\"is a draft\")\n );\n\n // Handle \"not found\" errors - offer to create\n for (const diagnostic of notFoundDiagnostics) {\n const match = diagnostic.message.match(/Read model ['\"]([\\w.]+)['\"]/);\n if (match && match[1]) {\n const readModelName = match[1];\n\n // Check if this read model already exists as a persisted read model\n const existsAsPersisted = this.readModels.some(\n rm => rm.identifier === readModelName || rm.displayName === readModelName\n );\n\n if (!existsAsPersisted && this.onCreateReadModel) {\n actions.push({\n title: `Create read model '${readModelName}'`,\n diagnostics: [diagnostic],\n kind: 'quickfix',\n edit: undefined,\n isPreferred: true,\n command: {\n id: 'pdl.createReadModel',\n title: `Create ${readModelName}`,\n arguments: [readModelName]\n }\n });\n }\n }\n }\n\n // Handle draft read model info markers - offer to edit\n for (const diagnostic of draftDiagnostics) {\n const match = diagnostic.message.match(/Read model ['\"]([\\w.]+)['\"]/);\n if (match && match[1]) {\n const readModelName = match[1];\n\n if (this.draftReadModel && this.isDraftReadModel(readModelName) && this.onEditReadModel) {\n actions.push({\n title: `Edit read model '${readModelName}'`,\n diagnostics: [diagnostic],\n kind: 'quickfix',\n edit: undefined,\n isPreferred: true,\n command: {\n id: 'pdl.editReadModel',\n title: `Edit ${readModelName}`,\n arguments: [readModelName, this.draftReadModel.schema]\n }\n });\n }\n }\n }\n\n return {\n actions,\n dispose: () => { /* No cleanup needed */ }\n };\n }\n\n private isDraftReadModel(readModelToken: string): boolean {\n return !!this.draftReadModel && (this.draftReadModel.identifier === readModelToken || this.draftReadModel.displayName === readModelToken);\n }\n}\n"],"mappings":"qDAMA,IAAa,mBAAb,KAAgC,CAC5B,WAAsC,CAAC,EACvC,eAAoD,KACpD,kBACA,gBAEA,cAAc,EAAmC,CAC7C,KAAK,WAAaA,CACtB,CAEA,kBAAkB,EAAwC,CACtD,KAAK,eAAiBC,CAC1B,CAGA,oBAAoB,EAA6B,CAC7C,KAAK,WAAaC,EAAQ,IAAI,IAAW,CACrC,WAAYC,EAAO,OAASA,EAAO,MAAQ,GAC3C,YAAaA,EAAO,OAASA,EAAO,MAAQ,GAC5C,QACJ,EAAE,CACN,CAEA,2BAA2B,EAAiD,CACxE,KAAK,kBAAoBC,CAC7B,CAEA,yBAAyB,EAA4E,CACjG,KAAK,gBAAkBA,CAC3B,CAEA,sBAAsB,EAA6B,CAC/C,KAAK,oBAAoBC,CAAa,CAC1C,CAEA,oBAAoB,EAAuB,EAAiC,CACxE,KAAK,kBAAkBA,EAAeC,CAAa,CACvD,CAEA,mBACI,EACA,EACA,EACgE,CAChE,IAAMC,EAAyC,CAAC,EAG1CC,EAAsBC,EAAQ,QAAQ,OACvC,GAAsCC,EAAO,QAAQ,SAAS,YAAY,GAAKA,EAAO,QAAQ,SAAS,WAAW,CACvH,EAGMC,EAAmBF,EAAQ,QAAQ,OACpC,GAAsCC,EAAO,QAAQ,SAAS,YAAY,GAAKA,EAAO,QAAQ,SAAS,YAAY,CACxH,EAGA,IAAK,IAAME,KAAcJ,EAAqB,CAC1C,IAAMK,EAAQD,EAAW,QAAQ,MAAM,6BAA6B,EACpE,GAAIC,GAASA,EAAM,GAAI,CACnB,IAAMR,EAAgBQ,EAAM,GAOxB,CAJsB,KAAK,WAAW,KACtC,GAAMC,EAAG,aAAeT,GAAiBS,EAAG,cAAgBT,CAG3C,GAAK,KAAK,mBAC3BE,EAAQ,KAAK,CACT,MAAO,sBAAsBF,EAAc,GAC3C,YAAa,CAACO,CAAU,EACxB,KAAM,WACN,KAAM,IAAA,GACN,YAAa,GACb,QAAS,CACL,GAAI,sBACJ,MAAO,UAAUP,IACjB,UAAW,CAACA,CAAa,CAC7B,CACJ,CAAC,CAET,CACJ,CAGA,IAAK,IAAMO,KAAcD,EAAkB,CACvC,IAAME,EAAQD,EAAW,QAAQ,MAAM,6BAA6B,EACpE,GAAIC,GAASA,EAAM,GAAI,CACnB,IAAMR,EAAgBQ,EAAM,GAExB,KAAK,gBAAkB,KAAK,iBAAiBR,CAAa,GAAK,KAAK,iBACpEE,EAAQ,KAAK,CACT,MAAO,oBAAoBF,EAAc,GACzC,YAAa,CAACO,CAAU,EACxB,KAAM,WACN,KAAM,IAAA,GACN,YAAa,GACb,QAAS,CACL,GAAI,oBACJ,MAAO,QAAQP,IACf,UAAW,CAACA,EAAe,KAAK,eAAe,MAAM,CACzD,CACJ,CAAC,CAET,CACJ,CAEA,MAAO,CACH,UACA,YAAe,CAA0B,CAC7C,CACJ,CAEA,iBAAyB,EAAiC,CACtD,MAAO,CAAC,CAAC,KAAK,iBAAmB,KAAK,eAAe,aAAeU,GAAkB,KAAK,eAAe,cAAgBA,EAC9H,CACJ"}
1
+ {"version":3,"file":"CodeActionProvider.js","names":["readModels","draft","schemas","schema","callback","readModelName","currentSchema","actions","notFoundDiagnostics","context","marker","draftDiagnostics","diagnostic","match","rm","readModelToken"],"sources":["../../../../sub-languages/projection/CodeActionProvider.ts"],"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 * as Monaco from 'monaco-editor';\nimport type { JsonSchema, ReadModelInfo, DraftReadModelInfo } from './index';\n\nexport class CodeActionProvider {\n private readModels: ReadModelInfo[] = [];\n private draftReadModel: DraftReadModelInfo | null = null;\n private onCreateReadModel?: (readModelName: string) => void;\n private onEditReadModel?: (readModelName: string, currentSchema: JsonSchema) => void;\n\n setReadModels(readModels: ReadModelInfo[]): void {\n this.readModels = readModels;\n }\n\n setDraftReadModel(draft: DraftReadModelInfo | null): void {\n this.draftReadModel = draft;\n }\n\n // Keep for backwards compatibility\n setReadModelSchemas(schemas: JsonSchema[]): void {\n this.readModels = schemas.map(schema => ({\n identifier: schema.title || schema.name || '',\n displayName: schema.title || schema.name || '',\n schema\n }));\n }\n\n setCreateReadModelCallback(callback: (readModelName: string) => void): void {\n this.onCreateReadModel = callback;\n }\n\n setEditReadModelCallback(callback: (readModelName: string, currentSchema: JsonSchema) => void): void {\n this.onEditReadModel = callback;\n }\n\n invokeCreateReadModel(readModelName: string): void {\n this.onCreateReadModel?.(readModelName);\n }\n\n invokeEditReadModel(readModelName: string, currentSchema: JsonSchema): void {\n this.onEditReadModel?.(readModelName, currentSchema);\n }\n\n provideCodeActions(\n _model: Monaco.editor.ITextModel,\n _range: Monaco.Range,\n context: Monaco.languages.CodeActionContext\n ): Monaco.languages.ProviderResult<Monaco.languages.CodeActionList> {\n const actions: Monaco.languages.CodeAction[] = [];\n\n // Check for diagnostics about undefined read models (errors)\n const notFoundDiagnostics = context.markers.filter(\n (marker: Monaco.editor.IMarkerData) => marker.message.includes(\"Read model\") && marker.message.includes(\"not found\")\n );\n\n // Check for diagnostics about draft read models (info markers)\n const draftDiagnostics = context.markers.filter(\n (marker: Monaco.editor.IMarkerData) => marker.message.includes(\"Read model\") && marker.message.includes(\"is a draft\")\n );\n\n // Handle \"not found\" errors - offer to create\n for (const diagnostic of notFoundDiagnostics) {\n const match = diagnostic.message.match(/Read model ['\"]([\\w.]+)['\"]/);\n if (match && match[1]) {\n const readModelName = match[1];\n\n // Check if this read model already exists as a persisted read model\n const existsAsPersisted = this.readModels.some(\n rm => rm.identifier === readModelName || rm.displayName === readModelName\n );\n\n if (!existsAsPersisted && this.onCreateReadModel) {\n actions.push({\n title: `Create read model '${readModelName}'`,\n diagnostics: [diagnostic],\n kind: 'quickfix',\n edit: undefined,\n isPreferred: true,\n command: {\n id: 'pdl.createReadModel',\n title: `Create ${readModelName}`,\n arguments: [readModelName]\n }\n });\n }\n }\n }\n\n // Handle draft read model info markers - offer to edit\n for (const diagnostic of draftDiagnostics) {\n const match = diagnostic.message.match(/Read model ['\"]([\\w.]+)['\"]/);\n if (match && match[1]) {\n const readModelName = match[1];\n\n if (this.draftReadModel && this.isDraftReadModel(readModelName) && this.onEditReadModel) {\n actions.push({\n title: `Edit read model '${readModelName}'`,\n diagnostics: [diagnostic],\n kind: 'quickfix',\n edit: undefined,\n isPreferred: true,\n command: {\n id: 'pdl.editReadModel',\n title: `Edit ${readModelName}`,\n arguments: [readModelName, this.draftReadModel.schema]\n }\n });\n }\n }\n }\n\n return {\n actions,\n dispose: () => { /* No cleanup needed */ }\n };\n }\n\n private isDraftReadModel(readModelToken: string): boolean {\n return !!this.draftReadModel && (this.draftReadModel.identifier === readModelToken || this.draftReadModel.displayName === readModelToken);\n }\n}\n"],"mappings":"A,qDAMA,IAAa,mBAAb,KAAgC,CAC5B,WAAsC,CAAC,EACvC,eAAoD,KACpD,kBACA,gBAEA,cAAc,EAAmC,CAC7C,KAAK,WAAaA,CACtB,CAEA,kBAAkB,EAAwC,CACtD,KAAK,eAAiBC,CAC1B,CAGA,oBAAoB,EAA6B,CAC7C,KAAK,WAAaC,EAAQ,IAAI,IAAW,CACrC,WAAYC,EAAO,OAASA,EAAO,MAAQ,GAC3C,YAAaA,EAAO,OAASA,EAAO,MAAQ,GAC5C,QACJ,EAAE,CACN,CAEA,2BAA2B,EAAiD,CACxE,KAAK,kBAAoBC,CAC7B,CAEA,yBAAyB,EAA4E,CACjG,KAAK,gBAAkBA,CAC3B,CAEA,sBAAsB,EAA6B,CAC/C,KAAK,oBAAoBC,CAAa,CAC1C,CAEA,oBAAoB,EAAuB,EAAiC,CACxE,KAAK,kBAAkBA,EAAeC,CAAa,CACvD,CAEA,mBACI,EACA,EACA,EACgE,CAChE,IAAMC,EAAyC,CAAC,EAG1CC,EAAsBC,EAAQ,QAAQ,OACvC,GAAsCC,EAAO,QAAQ,SAAS,YAAY,GAAKA,EAAO,QAAQ,SAAS,WAAW,CACvH,EAGMC,EAAmBF,EAAQ,QAAQ,OACpC,GAAsCC,EAAO,QAAQ,SAAS,YAAY,GAAKA,EAAO,QAAQ,SAAS,YAAY,CACxH,EAGA,IAAK,IAAME,KAAcJ,EAAqB,CAC1C,IAAMK,EAAQD,EAAW,QAAQ,MAAM,6BAA6B,EACpE,GAAIC,GAASA,EAAM,GAAI,CACnB,IAAMR,EAAgBQ,EAAM,GAOxB,CAJsB,KAAK,WAAW,KACtC,GAAMC,EAAG,aAAeT,GAAiBS,EAAG,cAAgBT,CAG3C,GAAK,KAAK,mBAC3BE,EAAQ,KAAK,CACT,MAAO,sBAAsBF,EAAc,GAC3C,YAAa,CAACO,CAAU,EACxB,KAAM,WACN,KAAM,IAAA,GACN,YAAa,GACb,QAAS,CACL,GAAI,sBACJ,MAAO,UAAUP,IACjB,UAAW,CAACA,CAAa,CAC7B,CACJ,CAAC,CAET,CACJ,CAGA,IAAK,IAAMO,KAAcD,EAAkB,CACvC,IAAME,EAAQD,EAAW,QAAQ,MAAM,6BAA6B,EACpE,GAAIC,GAASA,EAAM,GAAI,CACnB,IAAMR,EAAgBQ,EAAM,GAExB,KAAK,gBAAkB,KAAK,iBAAiBR,CAAa,GAAK,KAAK,iBACpEE,EAAQ,KAAK,CACT,MAAO,oBAAoBF,EAAc,GACzC,YAAa,CAACO,CAAU,EACxB,KAAM,WACN,KAAM,IAAA,GACN,YAAa,GACb,QAAS,CACL,GAAI,oBACJ,MAAO,QAAQP,IACf,UAAW,CAACA,EAAe,KAAK,eAAe,MAAM,CACzD,CACJ,CAAC,CAET,CACJ,CAEA,MAAO,CACH,UACA,YAAe,CAA0B,CAC7C,CACJ,CAEA,iBAAyB,EAAiC,CACtD,MAAO,CAAC,CAAC,KAAK,iBAAmB,KAAK,eAAe,aAAeU,GAAkB,KAAK,eAAe,cAAgBA,EAC9H,CACJ,E"}
@@ -1,2 +1,2 @@
1
- import"../../_virtual/_virtual/_rolldown/runtime.js";import{eventContextMembers as e,eventContextMembersAfter as t}from"../../event-context.js";const n=/\$eventContext\.((?:\w+\.)*)(\w*)$/;var CompletionProvider=class{readModels=[];eventSchemas={};eventSequences=[];setReadModels(e){this.readModels=e||[]}setEventSequences(e){this.eventSequences=e||[]}setReadModelSchemas(e){this.readModels=e.map(e=>({identifier:this.getSchemaName(e)||``,displayName:this.getSchemaName(e)||``,schema:e}))}setEventSchemas(e){if(!e)this.eventSchemas={};else if(Array.isArray(e)){let t={};e.forEach((e,n)=>{if(!e)return;let r=this.getSchemaName(e)||`Event${n+1}`;t[r]=e}),this.eventSchemas=t}else this.eventSchemas=e}provideCompletionItems(e,t){let n=this.buildContext(e,t),r=[],i=this.getActiveReadModelSchema(e);return n.lineNumber===1?this.addProjectionLineCompletions(r,n):this.isAfterKeyword(n,`sequence`)?this.addEventSequenceCompletions(r,n):this.isAfterKeyword(n,`from`)||this.isAfterKeyword(n,`every`)||/\benters\s+on\s+\w*$/.test(n.textBeforeCursor)?this.addEventTypeCompletions(r,n):/\benters\s+\w*$/.test(n.textBeforeCursor)?r.push({label:`on`,kind:14,insertText:`on `,documentation:`Declares the event that activates this variant.`,detail:`enters on <EventType>`,range:this.getRangeForWord(n)}):this.isAfterKeyword(n,`variant`)?this.addVariantNameCompletions(r,n):this.isAfterKeyword(n,`key`)?this.addKeyCompletions(r,n,i):this.isAfterKeyword(n,`parent`)?this.addParentCompletions(r,n):this.isAfterKeyword(n,`children`)?this.addChildrenCompletions(r,n,i):this.isAfterKeyword(n,`join`)?this.addJoinCompletions(r,n,i):this.isAfterKeyword(n,`with`)?this.addEventTypeCompletions(r,n):this.isAfterNumericOperationKeyword(n)?this.addNumericPropertyCompletions(r,n,i):this.isAfterAddOrSubtractBy(n)||this.isInAssignment(n)?this.addAssignmentValueCompletions(r,n,e,t):this.isPropertyDotAccess(n)?this.addPropertyMemberCompletions(r,n):(this.isStartOfLine(n)||this.isAfterIndent(n))&&this.addStatementCompletions(r,n,i),{suggestions:r}}buildContext(e,t){let n=e.getLineContent(t.lineNumber),r=n.substring(0,t.column-1);return{lineContent:n,textBeforeCursor:r,textAfterCursor:n.substring(t.column-1),currentWord:e.getWordAtPosition(t)?.word||``,indentLevel:this.getIndentLevel(r),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 RegExp(`\\b${t}\\s+\\w*$`).test(e.textBeforeCursor)}isAfterNumericOperationKeyword(e){return/\b(count|increment|decrement)\s+\w*$/.test(e.textBeforeCursor)?!0:/\b(add|subtract)\s+\w*$/.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)||n.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 n=r[1]||``;this.readModels.forEach(r=>{if(!n||r.displayName.toLowerCase().startsWith(n.toLowerCase())){let n=`${r.displayName} (${r.identifier})`;e.push({label:n,kind:6,insertText:r.displayName,filterText:`${r.displayName} ${r.identifier}`,documentation:`Read model: ${r.displayName} (${r.identifier})`,detail:r.identifier,range:this.getRangeForWord(t)})}})}else if(n.startsWith(`projection `)&&!n.includes(`=>`)){let r=n.substring(11);this.readModels.forEach(n=>{if(!r||n.displayName.toLowerCase().startsWith(r.toLowerCase())){let r=`${n.displayName} (${n.identifier})`;e.push({label:r,kind:6,insertText:`${n.displayName} => ${n.displayName}`,filterText:`${n.displayName} ${n.identifier}`,documentation:`Read model: ${n.displayName} (${n.identifier})`,detail:n.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(([n,r])=>{(r.type===`integer`||r.type===`number`)&&(!t.currentWord||n.startsWith(t.currentWord))&&e.push({label:n,kind:9,insertText:n,documentation:`Numeric property: ${n}`,detail:this.getPropertyTypeDescription(r),range:this.getRangeForWord(t)})});let r=t.textBeforeCursor.match(/\b(add|subtract)\s+(\w*)$/);if(r){let i=r[2]||``;n?.properties&&Object.entries(n.properties).forEach(([n,r])=>{(r.type===`integer`||r.type===`number`)&&(!i||n.startsWith(i))&&e.push({label:n,kind:9,insertText:`${n} by `,documentation:`Numeric property: ${n}`,detail:this.getPropertyTypeDescription(r),range:this.getRangeForWord(t)})})}}addChildrenCompletions(e,t,n){n?.properties&&Object.entries(n.properties).forEach(([n,r])=>{(r.type===`array`||r.items)&&e.push({label:n,kind:9,insertText:`${n} id `,documentation:`Collection property: ${n}`,detail:this.getPropertyTypeDescription(r),range:this.getRangeForWord(t)})})}addJoinCompletions(e,t,n){let r=t.textBeforeCursor.trim();r===`join`||!r.includes(` `)?n?.properties&&Object.entries(n.properties).forEach(([n,r])=>{(r.type===`array`||r.items)&&e.push({label:n,kind:9,insertText:`${n} on `,documentation:`Join on collection: ${n}`,range:this.getRangeForWord(t)})}):r.match(/join\s+\w+\s+on\s+/)&&n?.properties&&Object.keys(n.properties).forEach(n=>{e.push({label:n,kind:9,insertText:n,documentation:`Property: ${n}`,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 — 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(n=>{(!t.currentWord||n.label.startsWith(t.currentWord))&&e.push({label:n.label,kind:14,insertText:n.insertText,documentation:n.documentation,detail:n.detail,range:this.getRangeForWord(t)})}),n?.properties&&Object.entries(n.properties).forEach(([n,r])=>{(!t.currentWord||n.startsWith(t.currentWord))&&e.push({label:n,kind:9,insertText:`${n} = `,documentation:`Assign value to property: ${n}`,detail:this.getPropertyTypeDescription(r),range:this.getRangeForWord(t)})})}addAssignmentValueCompletions(e,t,n,r){let i=this.getCurrentEventType(n,r.lineNumber);if(i&&this.eventSchemas[i]){let n=this.eventSchemas[i];n.properties&&Object.entries(n.properties).forEach(([n,r])=>{e.push({label:n,kind:9,insertText:n,documentation:`Event property: ${n}`,detail:this.getPropertyTypeDescription(r),range:this.getRangeForWord(t)})})}this.addExpressionCompletions(e,t)}addExpressionCompletions(t,n){[{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: ${e.map(e=>e.name).join(`, `)}`,detail:`Event Context Expression`}].forEach(e=>{(!n.currentWord||e.label.startsWith(n.currentWord)||e.label.startsWith(`$`+n.currentWord))&&t.push({label:e.label,kind:14,insertText:e.insertText,documentation:e.documentation,detail:e.detail,range:this.getRangeForWord(n)})})}addPropertyMemberCompletions(e,t){let r=t.textBeforeCursor.match(n);if(r){let n=r[1].split(`.`).filter(e=>e.length>0);this.addEventContextMemberCompletions(e,t,n,r[2]);return}let i=t.textBeforeCursor.match(/(\w+|\$\w+)\.(\w*)$/);if(!i)return;let[,a,o]=i,s=t.textBeforeCursor.match(/\$causedBy\.((?:\w+\.)*)(\w*)$/);if(s){let n=s[1].split(`.`).filter(e=>e.length>0);this.addEventContextMemberCompletions(e,t,[`causedBy`,...n],s[2]);return}let c=this.eventSchemas[a];c?.properties&&Object.entries(c.properties).forEach(([n,r])=>{(!o||n.startsWith(o))&&e.push({label:n,kind:9,insertText:n,documentation:`Event property: ${n}`,detail:this.getPropertyTypeDescription(r),range:this.getRangeForWord(t)})})}addEventContextMemberCompletions(e,n,r,i){(t(r)??[]).filter(e=>!i||e.name.startsWith(i)).forEach(t=>{e.push({label:t.name,kind:t.kind===`function`?1:9,insertText:t.name,documentation:t.description,detail:t.type,range:this.getRangeForWord(n)})})}getCurrentEventType(e,t){for(let n=t;n>=1;n--){let t=e.getLineContent(n).trim(),r=t.match(/^from\s+([\w-]+)/);if(r)return r[1];if(t.match(/^every$/))return null}return null}getActiveReadModelSchema(e){let t=e.getLineContent(1).trim().match(/^projection\s+[\w.]+\s*=>\s*([\w.]+)/);if(!t)return;let n=t[1];return this.resolveReadModelInfo(n)?.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)}}};export{CompletionProvider};
1
+ import"../../_virtual/_virtual/_rolldown/runtime.js";import{eventContextMembers as e,eventContextMembersAfter as t}from"../../event-context.js";const n=/\$eventContext\.((?:\w+\.)*)(\w*)$/;var CompletionProvider=class{readModels=[];eventSchemas={};eventSequences=[];setReadModels(e){this.readModels=e||[]}setEventSequences(e){this.eventSequences=e||[]}setReadModelSchemas(e){this.readModels=e.map(e=>({identifier:this.getSchemaName(e)||``,displayName:this.getSchemaName(e)||``,schema:e}))}setEventSchemas(e){if(!e)this.eventSchemas={};else if(Array.isArray(e)){let t={};e.forEach((e,n)=>{if(!e)return;let r=this.getSchemaName(e)||`Event${n+1}`;t[r]=e}),this.eventSchemas=t}else this.eventSchemas=e}provideCompletionItems(e,t){let n=this.buildContext(e,t),r=[],i=this.getActiveReadModelSchema(e);return n.lineNumber===1?this.addProjectionLineCompletions(r,n):this.isAfterKeyword(n,`sequence`)?this.addEventSequenceCompletions(r,n):this.isAfterKeyword(n,`from`)||this.isAfterKeyword(n,`every`)||/\benters\s+on\s+\w*$/.test(n.textBeforeCursor)?this.addEventTypeCompletions(r,n):/\benters\s+\w*$/.test(n.textBeforeCursor)?r.push({label:`on`,kind:14,insertText:`on `,documentation:`Declares the event that activates this variant.`,detail:`enters on <EventType>`,range:this.getRangeForWord(n)}):this.isAfterKeyword(n,`variant`)?this.addVariantNameCompletions(r,n):this.isAfterKeyword(n,`key`)?this.addKeyCompletions(r,n,i):this.isAfterKeyword(n,`parent`)?this.addParentCompletions(r,n):this.isAfterKeyword(n,`children`)?this.addChildrenCompletions(r,n,i):this.isAfterKeyword(n,`join`)?this.addJoinCompletions(r,n,i):this.isAfterKeyword(n,`with`)?this.addEventTypeCompletions(r,n):this.isAfterNumericOperationKeyword(n)?this.addNumericPropertyCompletions(r,n,i):this.isAfterAddOrSubtractBy(n)||this.isInAssignment(n)?this.addAssignmentValueCompletions(r,n,e,t):this.isPropertyDotAccess(n)?this.addPropertyMemberCompletions(r,n):(this.isStartOfLine(n)||this.isAfterIndent(n))&&this.addStatementCompletions(r,n,i),{suggestions:r}}buildContext(e,t){let n=e.getLineContent(t.lineNumber),r=n.substring(0,t.column-1);return{lineContent:n,textBeforeCursor:r,textAfterCursor:n.substring(t.column-1),currentWord:e.getWordAtPosition(t)?.word||``,indentLevel:this.getIndentLevel(r),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 RegExp(`\\b${t}\\s+\\w*$`).test(e.textBeforeCursor)}isAfterNumericOperationKeyword(e){return/\b(count|increment|decrement)\s+\w*$/.test(e.textBeforeCursor)?!0:/\b(add|subtract)\s+\w*$/.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)||n.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 n=r[1]||``;this.readModels.forEach(r=>{if(!n||r.displayName.toLowerCase().startsWith(n.toLowerCase())){let n=`${r.displayName} (${r.identifier})`;e.push({label:n,kind:6,insertText:r.displayName,filterText:`${r.displayName} ${r.identifier}`,documentation:`Read model: ${r.displayName} (${r.identifier})`,detail:r.identifier,range:this.getRangeForWord(t)})}})}else if(n.startsWith(`projection `)&&!n.includes(`=>`)){let r=n.substring(11);this.readModels.forEach(n=>{if(!r||n.displayName.toLowerCase().startsWith(r.toLowerCase())){let r=`${n.displayName} (${n.identifier})`;e.push({label:r,kind:6,insertText:`${n.displayName} => ${n.displayName}`,filterText:`${n.displayName} ${n.identifier}`,documentation:`Read model: ${n.displayName} (${n.identifier})`,detail:n.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(([n,r])=>{r.type!==`integer`&&r.type!==`number`||t.currentWord&&!n.startsWith(t.currentWord)||e.push({label:n,kind:9,insertText:n,documentation:`Numeric property: ${n}`,detail:this.getPropertyTypeDescription(r),range:this.getRangeForWord(t)})});let r=t.textBeforeCursor.match(/\b(add|subtract)\s+(\w*)$/);if(r){let i=r[2]||``;n?.properties&&Object.entries(n.properties).forEach(([n,r])=>{r.type!==`integer`&&r.type!==`number`||i&&!n.startsWith(i)||e.push({label:n,kind:9,insertText:`${n} by `,documentation:`Numeric property: ${n}`,detail:this.getPropertyTypeDescription(r),range:this.getRangeForWord(t)})})}}addChildrenCompletions(e,t,n){n?.properties&&Object.entries(n.properties).forEach(([n,r])=>{(r.type===`array`||r.items)&&e.push({label:n,kind:9,insertText:`${n} id `,documentation:`Collection property: ${n}`,detail:this.getPropertyTypeDescription(r),range:this.getRangeForWord(t)})})}addJoinCompletions(e,t,n){let r=t.textBeforeCursor.trim();r===`join`||!r.includes(` `)?n?.properties&&Object.entries(n.properties).forEach(([n,r])=>{(r.type===`array`||r.items)&&e.push({label:n,kind:9,insertText:`${n} on `,documentation:`Join on collection: ${n}`,range:this.getRangeForWord(t)})}):r.match(/join\s+\w+\s+on\s+/)&&n?.properties&&Object.keys(n.properties).forEach(n=>{e.push({label:n,kind:9,insertText:n,documentation:`Property: ${n}`,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 — 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(n=>{(!t.currentWord||n.label.startsWith(t.currentWord))&&e.push({label:n.label,kind:14,insertText:n.insertText,documentation:n.documentation,detail:n.detail,range:this.getRangeForWord(t)})}),n?.properties&&Object.entries(n.properties).forEach(([n,r])=>{(!t.currentWord||n.startsWith(t.currentWord))&&e.push({label:n,kind:9,insertText:`${n} = `,documentation:`Assign value to property: ${n}`,detail:this.getPropertyTypeDescription(r),range:this.getRangeForWord(t)})})}addAssignmentValueCompletions(e,t,n,r){let i=this.getCurrentEventType(n,r.lineNumber);if(i&&this.eventSchemas[i]){let n=this.eventSchemas[i];n.properties&&Object.entries(n.properties).forEach(([n,r])=>{e.push({label:n,kind:9,insertText:n,documentation:`Event property: ${n}`,detail:this.getPropertyTypeDescription(r),range:this.getRangeForWord(t)})})}this.addExpressionCompletions(e,t)}addExpressionCompletions(t,n){[{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: ${e.map(e=>e.name).join(`, `)}`,detail:`Event Context Expression`}].forEach(e=>{(!n.currentWord||e.label.startsWith(n.currentWord)||e.label.startsWith(`$`+n.currentWord))&&t.push({label:e.label,kind:14,insertText:e.insertText,documentation:e.documentation,detail:e.detail,range:this.getRangeForWord(n)})})}addPropertyMemberCompletions(e,t){let r=t.textBeforeCursor.match(n);if(r){let n=r[1].split(`.`).filter(e=>e.length>0);this.addEventContextMemberCompletions(e,t,n,r[2]);return}let i=t.textBeforeCursor.match(/(\w+|\$\w+)\.(\w*)$/);if(!i)return;let[,a,o]=i,s=t.textBeforeCursor.match(/\$causedBy\.((?:\w+\.)*)(\w*)$/);if(s){let n=s[1].split(`.`).filter(e=>e.length>0);this.addEventContextMemberCompletions(e,t,[`causedBy`,...n],s[2]);return}let c=this.eventSchemas[a];c?.properties&&Object.entries(c.properties).forEach(([n,r])=>{(!o||n.startsWith(o))&&e.push({label:n,kind:9,insertText:n,documentation:`Event property: ${n}`,detail:this.getPropertyTypeDescription(r),range:this.getRangeForWord(t)})})}addEventContextMemberCompletions(e,n,r,i){(t(r)??[]).filter(e=>!i||e.name.startsWith(i)).forEach(t=>{e.push({label:t.name,kind:t.kind===`function`?1:9,insertText:t.name,documentation:t.description,detail:t.type,range:this.getRangeForWord(n)})})}getCurrentEventType(e,t){for(let n=t;n>=1;n--){let t=e.getLineContent(n).trim(),r=t.match(/^from\s+([\w-]+)/);if(r)return r[1];if(t.match(/^every$/))return null}return null}getActiveReadModelSchema(e){let t=e.getLineContent(1).trim().match(/^projection\s+[\w.]+\s*=>\s*([\w.]+)/);if(!t)return;let n=t[1];return this.resolveReadModelInfo(n)?.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)}}};export{CompletionProvider};
2
2
  //# sourceMappingURL=CompletionProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CompletionProvider.js","names":["EVENT_CONTEXT_PATH","readModels","sequences","schemas","schema","map","s","name","i","context","model","position","suggestions","activeSchema","lineContent","textBeforeCursor","match","text","keyword","trimmed","arrowMatch","partialReadModel","readModel","label","afterProjection","eventName","sequenceId","typeName","propName","propSchema","addSubtractMatch","partialProp","kw","eventType","eventSchema","eventContextMembers","member","expr","eventContextMatch","segments","segment","objectName","causedByMatch","eventContextMembersAfter","partial","lineNumber","line","fromMatch","readModelName","rm","readModelToken","parts","startColumn","endColumn"],"sources":["../../../../sub-languages/projection/CompletionProvider.ts"],"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 { editor, languages, IRange, Position } from 'monaco-editor';\nimport type { JsonSchema, JsonSchemaProperty, ReadModelInfo } from './index';\nimport { eventContextMembers, eventContextMembersAfter } from '../../event-context';\n\ninterface CompletionContext {\n lineContent: string;\n textBeforeCursor: string;\n textAfterCursor: string;\n currentWord: string;\n indentLevel: number;\n lineNumber: number;\n}\n\n// The path typed so far after $eventContext. - on its own or as the dynamic key of a mapping target - and the\n// partial segment under the cursor.\nconst EVENT_CONTEXT_PATH = /\\$eventContext\\.((?:\\w+\\.)*)(\\w*)$/;\n\nexport class CompletionProvider implements languages.CompletionItemProvider {\n private readModels: ReadModelInfo[] = [];\n private eventSchemas: Record<string, JsonSchema> = {};\n private eventSequences: string[] = [];\n\n setReadModels(readModels: ReadModelInfo[]): void {\n this.readModels = readModels || [];\n }\n\n setEventSequences(sequences: string[]): void {\n this.eventSequences = sequences || [];\n }\n\n // Keep for backwards compatibility\n setReadModelSchemas(schemas: JsonSchema[]): void {\n this.readModels = schemas.map(schema => ({\n identifier: this.getSchemaName(schema) || '',\n displayName: this.getSchemaName(schema) || '',\n schema\n }));\n }\n\n setEventSchemas(schemas: Record<string, JsonSchema> | JsonSchema[]): void {\n if (!schemas) {\n this.eventSchemas = {};\n return;\n }\n\n if (Array.isArray(schemas)) {\n const map: Record<string, JsonSchema> = {};\n schemas.forEach((s, i) => {\n if (!s) return;\n const name = this.getSchemaName(s) || `Event${i + 1}`;\n map[name] = s;\n });\n this.eventSchemas = map;\n return;\n }\n\n this.eventSchemas = schemas;\n }\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 // Get the active read model schema from the projection declaration\n const activeSchema = this.getActiveReadModelSchema(model);\n\n // Determine what kind of completions to provide based on context\n if (context.lineNumber === 1) {\n this.addProjectionLineCompletions(suggestions, context);\n } else if (this.isAfterKeyword(context, 'sequence')) {\n this.addEventSequenceCompletions(suggestions, context);\n } else if (this.isAfterKeyword(context, 'from') || this.isAfterKeyword(context, 'every')) {\n this.addEventTypeCompletions(suggestions, context);\n } else if (/\\benters\\s+on\\s+\\w*$/.test(context.textBeforeCursor)) {\n this.addEventTypeCompletions(suggestions, context);\n } else if (/\\benters\\s+\\w*$/.test(context.textBeforeCursor)) {\n suggestions.push({\n label: 'on',\n kind: 14, // Keyword\n insertText: 'on ',\n documentation: 'Declares the event that activates this variant.',\n detail: 'enters on <EventType>',\n range: this.getRangeForWord(context),\n });\n } else if (this.isAfterKeyword(context, 'variant')) {\n this.addVariantNameCompletions(suggestions, context);\n } else if (this.isAfterKeyword(context, 'key')) {\n this.addKeyCompletions(suggestions, context, activeSchema);\n } else if (this.isAfterKeyword(context, 'parent')) {\n this.addParentCompletions(suggestions, context);\n } else if (this.isAfterKeyword(context, 'children')) {\n this.addChildrenCompletions(suggestions, context, activeSchema);\n } else if (this.isAfterKeyword(context, 'join')) {\n this.addJoinCompletions(suggestions, context, activeSchema);\n } else if (this.isAfterKeyword(context, 'with')) {\n this.addEventTypeCompletions(suggestions, context);\n } else if (this.isAfterNumericOperationKeyword(context)) {\n this.addNumericPropertyCompletions(suggestions, context, activeSchema);\n } else if (this.isAfterAddOrSubtractBy(context)) {\n this.addAssignmentValueCompletions(suggestions, context, model, position);\n } else if (this.isInAssignment(context)) {\n this.addAssignmentValueCompletions(suggestions, context, model, position);\n } else if (this.isPropertyDotAccess(context)) {\n this.addPropertyMemberCompletions(suggestions, context);\n } else if (this.isStartOfLine(context) || this.isAfterIndent(context)) {\n this.addStatementCompletions(suggestions, context, activeSchema);\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 textAfterCursor = lineContent.substring(position.column - 1);\n const word = model.getWordAtPosition(position);\n const currentWord = word?.word || '';\n const indentLevel = this.getIndentLevel(textBeforeCursor);\n\n return {\n lineContent,\n textBeforeCursor,\n textAfterCursor,\n currentWord,\n indentLevel,\n lineNumber: position.lineNumber,\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 isAfterNumericOperationKeyword(context: CompletionContext): boolean {\n // Match: count, increment, decrement, add, subtract followed by optional word (but not \"by\")\n // For add/subtract, we only match if \"by\" hasn't been typed yet\n const countIncrDecrPattern = /\\b(count|increment|decrement)\\s+\\w*$/;\n const addSubtractPattern = /\\b(add|subtract)\\s+\\w*$/;\n\n // Check for count/increment/decrement first\n if (countIncrDecrPattern.test(context.textBeforeCursor)) {\n return true;\n }\n\n // For add/subtract, only match if \"by\" hasn't been typed yet\n if (addSubtractPattern.test(context.textBeforeCursor)) {\n // Make sure we're not after \"by\"\n return !this.isAfterAddOrSubtractBy(context);\n }\n\n return false;\n }\n\n private isAfterAddOrSubtractBy(context: CompletionContext): boolean {\n // Match: \"add <property> by \" or \"subtract <property> by \" followed by optional word\n const pattern = /\\b(add|subtract)\\s+\\w+\\s+by\\s+\\w*$/;\n return pattern.test(context.textBeforeCursor);\n }\n\n private isInAssignment(context: CompletionContext): boolean {\n return /\\w+\\s*=\\s*\\w*$/.test(context.textBeforeCursor);\n }\n\n private isPropertyDotAccess(context: CompletionContext): boolean {\n // A member of an event property or a $-expression, or any depth of an event-context path - written as an\n // expression or as the dynamic key of a mapping target (propertyName.$eventContext.<path>).\n return /(\\w+|\\$\\w+)\\.(\\w*)$/.test(context.textBeforeCursor) ||\n EVENT_CONTEXT_PATH.test(context.textBeforeCursor);\n }\n\n private addProjectionLineCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n const trimmed = context.textBeforeCursor.trim();\n\n // Suggest \"projection\" keyword\n if (trimmed === '' || 'projection'.startsWith(trimmed)) {\n suggestions.push({\n label: 'projection',\n kind: 14, // Keyword\n insertText: 'projection ',\n documentation: 'Define a projection that transforms events into a read model',\n detail: 'projection <ProjectionName>',\n range: this.getRangeForWord(context),\n });\n }\n\n // Check if cursor is after \"=>\" to suggest read model names\n const arrowMatch = trimmed.match(/^projection\\s+[\\w.]+\\s*=>\\s*([\\w.]*)$/);\n if (arrowMatch) {\n const partialReadModel = arrowMatch[1] || '';\n this.readModels.forEach((readModel) => {\n if (!partialReadModel || readModel.displayName.toLowerCase().startsWith(partialReadModel.toLowerCase())) {\n const label = `${readModel.displayName} (${readModel.identifier})`;\n suggestions.push({\n label,\n kind: 6, // Class\n insertText: readModel.displayName,\n filterText: `${readModel.displayName} ${readModel.identifier}`,\n documentation: `Read model: ${readModel.displayName} (${readModel.identifier})`,\n detail: readModel.identifier,\n range: this.getRangeForWord(context),\n });\n }\n });\n return;\n }\n\n // After \"projection \", suggest read model names (for quick completion of both projection name and read model)\n if (trimmed.startsWith('projection ') && !trimmed.includes('=>')) {\n const afterProjection = trimmed.substring('projection '.length);\n this.readModels.forEach((readModel) => {\n if (!afterProjection || readModel.displayName.toLowerCase().startsWith(afterProjection.toLowerCase())) {\n const label = `${readModel.displayName} (${readModel.identifier})`;\n suggestions.push({\n label,\n kind: 6, // Class\n insertText: `${readModel.displayName} => ${readModel.displayName}`,\n filterText: `${readModel.displayName} ${readModel.identifier}`,\n documentation: `Read model: ${readModel.displayName} (${readModel.identifier})`,\n detail: readModel.identifier,\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n }\n\n private addEventTypeCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n Object.keys(this.eventSchemas).forEach((eventName) => {\n if (!context.currentWord || eventName.startsWith(context.currentWord)) {\n const schema = this.eventSchemas[eventName];\n suggestions.push({\n label: eventName,\n kind: 6, // Class\n insertText: eventName,\n documentation: this.getSchemaDescription(schema) || `Event type: ${eventName}`,\n detail: 'Event Type',\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n\n private addEventSequenceCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n this.eventSequences.forEach((sequenceId) => {\n if (!context.currentWord || sequenceId.startsWith(context.currentWord)) {\n suggestions.push({\n label: sequenceId,\n kind: 13, // Value\n insertText: sequenceId,\n documentation: `Event sequence: ${sequenceId}`,\n detail: 'Event Sequence',\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n\n private addKeyCompletions(suggestions: languages.CompletionItem[], context: CompletionContext, activeSchema?: JsonSchema): void {\n // Check if this might be a composite key (type reference)\n if (activeSchema?.definitions) {\n Object.keys(activeSchema.definitions).forEach((typeName) => {\n const typeDef = activeSchema.definitions![typeName];\n if (typeDef.type === 'object') {\n suggestions.push({\n label: typeName,\n kind: 6, // Class\n insertText: typeName,\n documentation: `Composite key type: ${typeName}`,\n detail: 'Composite Key Type',\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n\n // Suggest built-in expressions for simple keys\n this.addExpressionCompletions(suggestions, context);\n }\n\n private addParentCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n this.addExpressionCompletions(suggestions, context);\n }\n\n private addNumericPropertyCompletions(suggestions: languages.CompletionItem[], context: CompletionContext, activeSchema?: JsonSchema): void {\n // After \"count \", \"increment \", or \"decrement \", suggest numeric properties from read model\n if (activeSchema?.properties) {\n Object.entries(activeSchema.properties).forEach(([propName, propSchema]) => {\n // Suggest numeric properties (integer or number types)\n const isNumeric = propSchema.type === 'integer' || propSchema.type === 'number';\n if (isNumeric) {\n if (!context.currentWord || propName.startsWith(context.currentWord)) {\n suggestions.push({\n label: propName,\n kind: 9, // Property\n insertText: propName,\n documentation: `Numeric property: ${propName}`,\n detail: this.getPropertyTypeDescription(propSchema),\n range: this.getRangeForWord(context),\n });\n }\n }\n });\n }\n\n // Also check if \"add\" or \"subtract\" is being typed - need to handle \"add <prop> by\" pattern\n const addSubtractMatch = context.textBeforeCursor.match(/\\b(add|subtract)\\s+(\\w*)$/);\n if (addSubtractMatch) {\n const partialProp = addSubtractMatch[2] || '';\n if (activeSchema?.properties) {\n Object.entries(activeSchema.properties).forEach(([propName, propSchema]) => {\n const isNumeric = propSchema.type === 'integer' || propSchema.type === 'number';\n if (isNumeric && (!partialProp || propName.startsWith(partialProp))) {\n suggestions.push({\n label: propName,\n kind: 9, // Property\n insertText: `${propName} by `,\n documentation: `Numeric property: ${propName}`,\n detail: this.getPropertyTypeDescription(propSchema),\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n }\n }\n\n private addChildrenCompletions(suggestions: languages.CompletionItem[], context: CompletionContext, activeSchema?: JsonSchema): void {\n // After \"children \", suggest collection properties from read model\n if (activeSchema?.properties) {\n Object.entries(activeSchema.properties).forEach(([propName, propSchema]) => {\n // Collections are typically arrays\n if (propSchema.type === 'array' || propSchema.items) {\n suggestions.push({\n label: propName,\n kind: 9, // Property\n insertText: `${propName} id `,\n documentation: `Collection property: ${propName}`,\n detail: this.getPropertyTypeDescription(propSchema),\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n }\n\n private addJoinCompletions(suggestions: languages.CompletionItem[], context: CompletionContext, activeSchema?: JsonSchema): void {\n const trimmed = context.textBeforeCursor.trim();\n\n if (trimmed === 'join' || !trimmed.includes(' ')) {\n // Suggest collection properties\n if (activeSchema?.properties) {\n Object.entries(activeSchema.properties).forEach(([propName, propSchema]) => {\n if (propSchema.type === 'array' || propSchema.items) {\n suggestions.push({\n label: propName,\n kind: 9,\n insertText: `${propName} on `,\n documentation: `Join on collection: ${propName}`,\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n } else if (trimmed.match(/join\\s+\\w+\\s+on\\s+/)) {\n // After \"on\", suggest properties to join on\n if (activeSchema?.properties) {\n Object.keys(activeSchema.properties).forEach((propName) => {\n suggestions.push({\n label: propName,\n kind: 9,\n insertText: propName,\n documentation: `Property: ${propName}`,\n range: this.getRangeForWord(context),\n });\n });\n }\n }\n }\n\n private addVariantNameCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n // After \"variant \", suggest read model names - a variant names the read model it produces.\n this.readModels.forEach((readModel) => {\n if (!context.currentWord || readModel.displayName.toLowerCase().startsWith(context.currentWord.toLowerCase())) {\n suggestions.push({\n label: readModel.displayName,\n kind: 6, // Class\n insertText: readModel.displayName,\n documentation: `Read model: ${readModel.displayName} (${readModel.identifier})`,\n detail: readModel.identifier,\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n\n private addStatementCompletions(suggestions: languages.CompletionItem[], context: CompletionContext, activeSchema?: JsonSchema): void {\n // Add all statement keywords\n const keywords = [\n { label: 'description', insertText: 'description \"\"', documentation: 'Report-only description on the projection header only', detail: 'description \"<text>\"' },\n { label: 'sequence', insertText: 'sequence ', documentation: 'Specify which event sequence to use for this projection', detail: 'sequence <event-sequence-id>' },\n { label: 'variant', insertText: 'variant ', documentation: 'Declare one of several mutually exclusive named read models sharing this projection\\'s identity', detail: 'variant <Name>' },\n { label: 'enters on', insertText: 'enters on ', documentation: 'Declare the event that activates a variant', detail: 'enters on <EventType>' },\n { label: 'from', insertText: 'from ', documentation: 'Handle specific event types', detail: 'from <EventType>' },\n { label: 'all', insertText: 'all', documentation: 'Subscribe to all event types in the system — mappings run for every event system-wide, regardless of explicit from blocks', detail: 'all' },\n { label: 'every', insertText: 'every', documentation: 'Handle all events for automatic mapping (only events explicitly subscribed to via from blocks)', detail: 'every' },\n { label: 'key', insertText: 'key ', documentation: 'Define the projection key', detail: 'key <expression>' },\n { label: 'parent', insertText: 'parent ', documentation: 'Define parent relationship', detail: 'parent <expression>' },\n { label: 'join', insertText: 'join ', documentation: 'Join with child collection', detail: 'join <collection> on <property>' },\n { label: 'children', insertText: 'children ', documentation: 'Define child collection operations', detail: 'children <collection> identified by <expression>' },\n { label: 'remove with', insertText: 'remove with ', documentation: 'Remove items based on event', detail: 'remove with <EventType>' },\n { label: 'remove via', insertText: 'remove via join on ', documentation: 'Remove items via join', detail: 'remove via join on <EventType>' },\n { label: 'no automap', insertText: 'no automap', documentation: 'Disable automatic property mapping', detail: 'no automap' },\n { label: 'clear', insertText: 'clear ', documentation: 'Remove the value a property holds', detail: 'clear <property>' },\n { label: 'increment', insertText: 'increment ', documentation: 'Increment a numeric property', detail: 'increment <property>' },\n { label: 'decrement', insertText: 'decrement ', documentation: 'Decrement a numeric property', detail: 'decrement <property>' },\n { label: 'count', insertText: 'count ', documentation: 'Count occurrences', detail: 'count <property>' },\n { label: 'add', insertText: 'add ', documentation: 'Add value to property', detail: 'add <property> by <expression>' },\n { label: 'subtract', insertText: 'subtract ', documentation: 'Subtract value from property', detail: 'subtract <property> by <expression>' },\n { label: 'exclude children', insertText: 'exclude children', documentation: 'Exclude child collections from automap', detail: 'exclude children' },\n ];\n\n keywords.forEach((kw) => {\n if (!context.currentWord || kw.label.startsWith(context.currentWord)) {\n suggestions.push({\n label: kw.label,\n kind: 14, // Keyword\n insertText: kw.insertText,\n documentation: kw.documentation,\n detail: kw.detail,\n range: this.getRangeForWord(context),\n });\n }\n });\n\n // Add property assignments\n if (activeSchema?.properties) {\n Object.entries(activeSchema.properties).forEach(([propName, propSchema]) => {\n if (!context.currentWord || propName.startsWith(context.currentWord)) {\n suggestions.push({\n label: propName,\n kind: 9, // Property\n insertText: `${propName} = `,\n documentation: `Assign value to property: ${propName}`,\n detail: this.getPropertyTypeDescription(propSchema),\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n }\n\n private addAssignmentValueCompletions(\n suggestions: languages.CompletionItem[],\n context: CompletionContext,\n model: editor.ITextModel,\n position: Position\n ): void {\n // Get the event type from the current block\n const eventType = this.getCurrentEventType(model, position.lineNumber);\n\n // Suggest event properties if we know the event type\n if (eventType && this.eventSchemas[eventType]) {\n const eventSchema = this.eventSchemas[eventType];\n if (eventSchema.properties) {\n Object.entries(eventSchema.properties).forEach(([propName, propSchema]) => {\n suggestions.push({\n label: propName,\n kind: 9,\n insertText: propName,\n documentation: `Event property: ${propName}`,\n detail: this.getPropertyTypeDescription(propSchema),\n range: this.getRangeForWord(context),\n });\n });\n }\n }\n\n // Add expression completions\n this.addExpressionCompletions(suggestions, context);\n }\n\n private addExpressionCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n const expressions = [\n {\n label: '$eventSourceId',\n insertText: '$eventSourceId',\n documentation: 'The identifier of the event source (aggregate/entity)',\n detail: 'Event Source Expression'\n },\n {\n label: '$causedBy',\n insertText: '$causedBy',\n documentation: 'The identity that caused the event. Chronicle cannot yet evaluate this short form (Cratis/Chronicle#4119) - prefer $eventContext.causedBy.<property>.',\n detail: 'Identity Expression'\n },\n {\n label: '$eventContext',\n insertText: '$eventContext.',\n documentation: `Metadata about the event: ${eventContextMembers.map((member) => member.name).join(', ')}`,\n detail: 'Event Context Expression'\n },\n ];\n\n expressions.forEach((expr) => {\n if (!context.currentWord || expr.label.startsWith(context.currentWord) || expr.label.startsWith('$' + context.currentWord)) {\n suggestions.push({\n label: expr.label,\n kind: 14, // Keyword/builtin\n insertText: expr.insertText,\n documentation: expr.documentation,\n detail: expr.detail,\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n\n private addPropertyMemberCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n // Any depth of an event-context path, as an expression or as a dynamic key (propertyName.$eventContext.<path>)\n const eventContextMatch = context.textBeforeCursor.match(EVENT_CONTEXT_PATH);\n if (eventContextMatch) {\n const segments = eventContextMatch[1].split('.').filter((segment) => segment.length > 0);\n this.addEventContextMemberCompletions(suggestions, context, segments, eventContextMatch[2]);\n return;\n }\n\n const match = context.textBeforeCursor.match(/(\\w+|\\$\\w+)\\.(\\w*)$/);\n if (!match) return;\n\n const [, objectName, partialProp] = match;\n\n // $causedBy is the short form of $eventContext.causedBy, at any depth\n const causedByMatch = context.textBeforeCursor.match(/\\$causedBy\\.((?:\\w+\\.)*)(\\w*)$/);\n if (causedByMatch) {\n const segments = causedByMatch[1].split('.').filter((segment) => segment.length > 0);\n this.addEventContextMemberCompletions(suggestions, context, ['causedBy', ...segments], causedByMatch[2]);\n return;\n }\n\n // Handle event type properties\n const eventSchema = this.eventSchemas[objectName];\n if (eventSchema?.properties) {\n Object.entries(eventSchema.properties).forEach(([propName, propSchema]) => {\n if (!partialProp || propName.startsWith(partialProp)) {\n suggestions.push({\n label: propName,\n kind: 9,\n insertText: propName,\n documentation: `Event property: ${propName}`,\n detail: this.getPropertyTypeDescription(propSchema),\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n }\n\n private addEventContextMemberCompletions(\n suggestions: languages.CompletionItem[],\n context: CompletionContext,\n segments: readonly string[],\n partial: string\n ): void {\n const members = eventContextMembersAfter(segments) ?? [];\n members\n .filter((member) => !partial || member.name.startsWith(partial))\n .forEach((member) => {\n suggestions.push({\n label: member.name,\n kind: member.kind === 'function' ? 1 : 9,\n insertText: member.name,\n documentation: member.description,\n detail: member.type,\n range: this.getRangeForWord(context),\n });\n });\n }\n\n private getCurrentEventType(model: editor.ITextModel, lineNumber: number): string | null {\n // Search backwards to find the event type declaration\n for (let i = lineNumber; i >= 1; i--) {\n const line = model.getLineContent(i).trim();\n const fromMatch = line.match(/^from\\s+([\\w-]+)/);\n if (fromMatch) {\n return fromMatch[1];\n }\n const everyMatch = line.match(/^every$/);\n if (everyMatch) {\n return null; // every block doesn't have a specific event type\n }\n }\n return null;\n }\n\n private getActiveReadModelSchema(model: editor.ITextModel): JsonSchema | undefined {\n const firstLine = model.getLineContent(1).trim();\n const match = firstLine.match(/^projection\\s+[\\w.]+\\s*=>\\s*([\\w.]+)/);\n if (!match) return undefined;\n\n const readModelName = match[1];\n const readModel = this.resolveReadModelInfo(readModelName);\n return readModel?.schema;\n }\n\n private resolveReadModelInfo(readModelToken: string): ReadModelInfo | null {\n return this.readModels.find(rm => rm.identifier === readModelToken || rm.displayName === readModelToken) || null;\n }\n\n private getSchemaName(schema: JsonSchema): string | undefined {\n if (schema.name) return schema.name;\n if (schema.title) return schema.title;\n if (typeof schema.$id === 'string') {\n const parts = schema.$id.split('/');\n return parts[parts.length - 1] || schema.$id;\n }\n return undefined;\n }\n\n private getSchemaDescription(schema: JsonSchema): string | undefined {\n return schema.description || undefined;\n }\n\n private getPropertyTypeDescription(propSchema: JsonSchemaProperty): string {\n if (propSchema.type === 'array' && propSchema.items) {\n const itemType = propSchema.items.type || propSchema.items.$id?.split('/').pop() || 'unknown';\n return `${itemType}[]`;\n }\n return propSchema.type || propSchema.$ref?.split('/').pop() || 'unknown';\n }\n\n private getRangeForWord(context: CompletionContext): IRange {\n const startColumn = context.textBeforeCursor.length - context.currentWord.length + 1;\n const endColumn = startColumn + context.currentWord.length;\n return {\n startLineNumber: context.lineNumber,\n startColumn: Math.max(1, startColumn),\n endLineNumber: context.lineNumber,\n endColumn: Math.max(1, endColumn),\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CompletionProvider.js","names":["EVENT_CONTEXT_PATH","readModels","sequences","schemas","schema","map","s","name","i","context","model","position","suggestions","activeSchema","lineContent","textBeforeCursor","match","text","keyword","trimmed","arrowMatch","partialReadModel","readModel","label","afterProjection","eventName","sequenceId","typeName","propName","propSchema","addSubtractMatch","partialProp","kw","eventType","eventSchema","eventContextMembers","member","expr","eventContextMatch","segments","segment","objectName","causedByMatch","eventContextMembersAfter","partial","lineNumber","line","fromMatch","readModelName","rm","readModelToken","parts","startColumn","endColumn"],"sources":["../../../../sub-languages/projection/CompletionProvider.ts"],"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 { editor, languages, IRange, Position } from 'monaco-editor';\nimport type { JsonSchema, JsonSchemaProperty, ReadModelInfo } from './index';\nimport { eventContextMembers, eventContextMembersAfter } from '../../event-context';\n\ninterface CompletionContext {\n lineContent: string;\n textBeforeCursor: string;\n textAfterCursor: string;\n currentWord: string;\n indentLevel: number;\n lineNumber: number;\n}\n\n// The path typed so far after $eventContext. - on its own or as the dynamic key of a mapping target - and the\n// partial segment under the cursor.\nconst EVENT_CONTEXT_PATH = /\\$eventContext\\.((?:\\w+\\.)*)(\\w*)$/;\n\nexport class CompletionProvider implements languages.CompletionItemProvider {\n private readModels: ReadModelInfo[] = [];\n private eventSchemas: Record<string, JsonSchema> = {};\n private eventSequences: string[] = [];\n\n setReadModels(readModels: ReadModelInfo[]): void {\n this.readModels = readModels || [];\n }\n\n setEventSequences(sequences: string[]): void {\n this.eventSequences = sequences || [];\n }\n\n // Keep for backwards compatibility\n setReadModelSchemas(schemas: JsonSchema[]): void {\n this.readModels = schemas.map(schema => ({\n identifier: this.getSchemaName(schema) || '',\n displayName: this.getSchemaName(schema) || '',\n schema\n }));\n }\n\n setEventSchemas(schemas: Record<string, JsonSchema> | JsonSchema[]): void {\n if (!schemas) {\n this.eventSchemas = {};\n return;\n }\n\n if (Array.isArray(schemas)) {\n const map: Record<string, JsonSchema> = {};\n schemas.forEach((s, i) => {\n if (!s) return;\n const name = this.getSchemaName(s) || `Event${i + 1}`;\n map[name] = s;\n });\n this.eventSchemas = map;\n return;\n }\n\n this.eventSchemas = schemas;\n }\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 // Get the active read model schema from the projection declaration\n const activeSchema = this.getActiveReadModelSchema(model);\n\n // Determine what kind of completions to provide based on context\n if (context.lineNumber === 1) {\n this.addProjectionLineCompletions(suggestions, context);\n } else if (this.isAfterKeyword(context, 'sequence')) {\n this.addEventSequenceCompletions(suggestions, context);\n } else if (this.isAfterKeyword(context, 'from') || this.isAfterKeyword(context, 'every')) {\n this.addEventTypeCompletions(suggestions, context);\n } else if (/\\benters\\s+on\\s+\\w*$/.test(context.textBeforeCursor)) {\n this.addEventTypeCompletions(suggestions, context);\n } else if (/\\benters\\s+\\w*$/.test(context.textBeforeCursor)) {\n suggestions.push({\n label: 'on',\n kind: 14, // Keyword\n insertText: 'on ',\n documentation: 'Declares the event that activates this variant.',\n detail: 'enters on <EventType>',\n range: this.getRangeForWord(context),\n });\n } else if (this.isAfterKeyword(context, 'variant')) {\n this.addVariantNameCompletions(suggestions, context);\n } else if (this.isAfterKeyword(context, 'key')) {\n this.addKeyCompletions(suggestions, context, activeSchema);\n } else if (this.isAfterKeyword(context, 'parent')) {\n this.addParentCompletions(suggestions, context);\n } else if (this.isAfterKeyword(context, 'children')) {\n this.addChildrenCompletions(suggestions, context, activeSchema);\n } else if (this.isAfterKeyword(context, 'join')) {\n this.addJoinCompletions(suggestions, context, activeSchema);\n } else if (this.isAfterKeyword(context, 'with')) {\n this.addEventTypeCompletions(suggestions, context);\n } else if (this.isAfterNumericOperationKeyword(context)) {\n this.addNumericPropertyCompletions(suggestions, context, activeSchema);\n } else if (this.isAfterAddOrSubtractBy(context)) {\n this.addAssignmentValueCompletions(suggestions, context, model, position);\n } else if (this.isInAssignment(context)) {\n this.addAssignmentValueCompletions(suggestions, context, model, position);\n } else if (this.isPropertyDotAccess(context)) {\n this.addPropertyMemberCompletions(suggestions, context);\n } else if (this.isStartOfLine(context) || this.isAfterIndent(context)) {\n this.addStatementCompletions(suggestions, context, activeSchema);\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 textAfterCursor = lineContent.substring(position.column - 1);\n const word = model.getWordAtPosition(position);\n const currentWord = word?.word || '';\n const indentLevel = this.getIndentLevel(textBeforeCursor);\n\n return {\n lineContent,\n textBeforeCursor,\n textAfterCursor,\n currentWord,\n indentLevel,\n lineNumber: position.lineNumber,\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 isAfterNumericOperationKeyword(context: CompletionContext): boolean {\n // Match: count, increment, decrement, add, subtract followed by optional word (but not \"by\")\n // For add/subtract, we only match if \"by\" hasn't been typed yet\n const countIncrDecrPattern = /\\b(count|increment|decrement)\\s+\\w*$/;\n const addSubtractPattern = /\\b(add|subtract)\\s+\\w*$/;\n\n // Check for count/increment/decrement first\n if (countIncrDecrPattern.test(context.textBeforeCursor)) {\n return true;\n }\n\n // For add/subtract, only match if \"by\" hasn't been typed yet\n if (addSubtractPattern.test(context.textBeforeCursor)) {\n // Make sure we're not after \"by\"\n return !this.isAfterAddOrSubtractBy(context);\n }\n\n return false;\n }\n\n private isAfterAddOrSubtractBy(context: CompletionContext): boolean {\n // Match: \"add <property> by \" or \"subtract <property> by \" followed by optional word\n const pattern = /\\b(add|subtract)\\s+\\w+\\s+by\\s+\\w*$/;\n return pattern.test(context.textBeforeCursor);\n }\n\n private isInAssignment(context: CompletionContext): boolean {\n return /\\w+\\s*=\\s*\\w*$/.test(context.textBeforeCursor);\n }\n\n private isPropertyDotAccess(context: CompletionContext): boolean {\n // A member of an event property or a $-expression, or any depth of an event-context path - written as an\n // expression or as the dynamic key of a mapping target (propertyName.$eventContext.<path>).\n return /(\\w+|\\$\\w+)\\.(\\w*)$/.test(context.textBeforeCursor) ||\n EVENT_CONTEXT_PATH.test(context.textBeforeCursor);\n }\n\n private addProjectionLineCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n const trimmed = context.textBeforeCursor.trim();\n\n // Suggest \"projection\" keyword\n if (trimmed === '' || 'projection'.startsWith(trimmed)) {\n suggestions.push({\n label: 'projection',\n kind: 14, // Keyword\n insertText: 'projection ',\n documentation: 'Define a projection that transforms events into a read model',\n detail: 'projection <ProjectionName>',\n range: this.getRangeForWord(context),\n });\n }\n\n // Check if cursor is after \"=>\" to suggest read model names\n const arrowMatch = trimmed.match(/^projection\\s+[\\w.]+\\s*=>\\s*([\\w.]*)$/);\n if (arrowMatch) {\n const partialReadModel = arrowMatch[1] || '';\n this.readModels.forEach((readModel) => {\n if (!partialReadModel || readModel.displayName.toLowerCase().startsWith(partialReadModel.toLowerCase())) {\n const label = `${readModel.displayName} (${readModel.identifier})`;\n suggestions.push({\n label,\n kind: 6, // Class\n insertText: readModel.displayName,\n filterText: `${readModel.displayName} ${readModel.identifier}`,\n documentation: `Read model: ${readModel.displayName} (${readModel.identifier})`,\n detail: readModel.identifier,\n range: this.getRangeForWord(context),\n });\n }\n });\n return;\n }\n\n // After \"projection \", suggest read model names (for quick completion of both projection name and read model)\n if (trimmed.startsWith('projection ') && !trimmed.includes('=>')) {\n const afterProjection = trimmed.substring('projection '.length);\n this.readModels.forEach((readModel) => {\n if (!afterProjection || readModel.displayName.toLowerCase().startsWith(afterProjection.toLowerCase())) {\n const label = `${readModel.displayName} (${readModel.identifier})`;\n suggestions.push({\n label,\n kind: 6, // Class\n insertText: `${readModel.displayName} => ${readModel.displayName}`,\n filterText: `${readModel.displayName} ${readModel.identifier}`,\n documentation: `Read model: ${readModel.displayName} (${readModel.identifier})`,\n detail: readModel.identifier,\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n }\n\n private addEventTypeCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n Object.keys(this.eventSchemas).forEach((eventName) => {\n if (!context.currentWord || eventName.startsWith(context.currentWord)) {\n const schema = this.eventSchemas[eventName];\n suggestions.push({\n label: eventName,\n kind: 6, // Class\n insertText: eventName,\n documentation: this.getSchemaDescription(schema) || `Event type: ${eventName}`,\n detail: 'Event Type',\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n\n private addEventSequenceCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n this.eventSequences.forEach((sequenceId) => {\n if (!context.currentWord || sequenceId.startsWith(context.currentWord)) {\n suggestions.push({\n label: sequenceId,\n kind: 13, // Value\n insertText: sequenceId,\n documentation: `Event sequence: ${sequenceId}`,\n detail: 'Event Sequence',\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n\n private addKeyCompletions(suggestions: languages.CompletionItem[], context: CompletionContext, activeSchema?: JsonSchema): void {\n // Check if this might be a composite key (type reference)\n if (activeSchema?.definitions) {\n Object.keys(activeSchema.definitions).forEach((typeName) => {\n const typeDef = activeSchema.definitions![typeName];\n if (typeDef.type === 'object') {\n suggestions.push({\n label: typeName,\n kind: 6, // Class\n insertText: typeName,\n documentation: `Composite key type: ${typeName}`,\n detail: 'Composite Key Type',\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n\n // Suggest built-in expressions for simple keys\n this.addExpressionCompletions(suggestions, context);\n }\n\n private addParentCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n this.addExpressionCompletions(suggestions, context);\n }\n\n private addNumericPropertyCompletions(suggestions: languages.CompletionItem[], context: CompletionContext, activeSchema?: JsonSchema): void {\n // After \"count \", \"increment \", or \"decrement \", suggest numeric properties from read model\n if (activeSchema?.properties) {\n Object.entries(activeSchema.properties).forEach(([propName, propSchema]) => {\n // Suggest numeric properties (integer or number types)\n const isNumeric = propSchema.type === 'integer' || propSchema.type === 'number';\n if (isNumeric) {\n if (!context.currentWord || propName.startsWith(context.currentWord)) {\n suggestions.push({\n label: propName,\n kind: 9, // Property\n insertText: propName,\n documentation: `Numeric property: ${propName}`,\n detail: this.getPropertyTypeDescription(propSchema),\n range: this.getRangeForWord(context),\n });\n }\n }\n });\n }\n\n // Also check if \"add\" or \"subtract\" is being typed - need to handle \"add <prop> by\" pattern\n const addSubtractMatch = context.textBeforeCursor.match(/\\b(add|subtract)\\s+(\\w*)$/);\n if (addSubtractMatch) {\n const partialProp = addSubtractMatch[2] || '';\n if (activeSchema?.properties) {\n Object.entries(activeSchema.properties).forEach(([propName, propSchema]) => {\n const isNumeric = propSchema.type === 'integer' || propSchema.type === 'number';\n if (isNumeric && (!partialProp || propName.startsWith(partialProp))) {\n suggestions.push({\n label: propName,\n kind: 9, // Property\n insertText: `${propName} by `,\n documentation: `Numeric property: ${propName}`,\n detail: this.getPropertyTypeDescription(propSchema),\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n }\n }\n\n private addChildrenCompletions(suggestions: languages.CompletionItem[], context: CompletionContext, activeSchema?: JsonSchema): void {\n // After \"children \", suggest collection properties from read model\n if (activeSchema?.properties) {\n Object.entries(activeSchema.properties).forEach(([propName, propSchema]) => {\n // Collections are typically arrays\n if (propSchema.type === 'array' || propSchema.items) {\n suggestions.push({\n label: propName,\n kind: 9, // Property\n insertText: `${propName} id `,\n documentation: `Collection property: ${propName}`,\n detail: this.getPropertyTypeDescription(propSchema),\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n }\n\n private addJoinCompletions(suggestions: languages.CompletionItem[], context: CompletionContext, activeSchema?: JsonSchema): void {\n const trimmed = context.textBeforeCursor.trim();\n\n if (trimmed === 'join' || !trimmed.includes(' ')) {\n // Suggest collection properties\n if (activeSchema?.properties) {\n Object.entries(activeSchema.properties).forEach(([propName, propSchema]) => {\n if (propSchema.type === 'array' || propSchema.items) {\n suggestions.push({\n label: propName,\n kind: 9,\n insertText: `${propName} on `,\n documentation: `Join on collection: ${propName}`,\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n } else if (trimmed.match(/join\\s+\\w+\\s+on\\s+/)) {\n // After \"on\", suggest properties to join on\n if (activeSchema?.properties) {\n Object.keys(activeSchema.properties).forEach((propName) => {\n suggestions.push({\n label: propName,\n kind: 9,\n insertText: propName,\n documentation: `Property: ${propName}`,\n range: this.getRangeForWord(context),\n });\n });\n }\n }\n }\n\n private addVariantNameCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n // After \"variant \", suggest read model names - a variant names the read model it produces.\n this.readModels.forEach((readModel) => {\n if (!context.currentWord || readModel.displayName.toLowerCase().startsWith(context.currentWord.toLowerCase())) {\n suggestions.push({\n label: readModel.displayName,\n kind: 6, // Class\n insertText: readModel.displayName,\n documentation: `Read model: ${readModel.displayName} (${readModel.identifier})`,\n detail: readModel.identifier,\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n\n private addStatementCompletions(suggestions: languages.CompletionItem[], context: CompletionContext, activeSchema?: JsonSchema): void {\n // Add all statement keywords\n const keywords = [\n { label: 'description', insertText: 'description \"\"', documentation: 'Report-only description on the projection header only', detail: 'description \"<text>\"' },\n { label: 'sequence', insertText: 'sequence ', documentation: 'Specify which event sequence to use for this projection', detail: 'sequence <event-sequence-id>' },\n { label: 'variant', insertText: 'variant ', documentation: 'Declare one of several mutually exclusive named read models sharing this projection\\'s identity', detail: 'variant <Name>' },\n { label: 'enters on', insertText: 'enters on ', documentation: 'Declare the event that activates a variant', detail: 'enters on <EventType>' },\n { label: 'from', insertText: 'from ', documentation: 'Handle specific event types', detail: 'from <EventType>' },\n { label: 'all', insertText: 'all', documentation: 'Subscribe to all event types in the system — mappings run for every event system-wide, regardless of explicit from blocks', detail: 'all' },\n { label: 'every', insertText: 'every', documentation: 'Handle all events for automatic mapping (only events explicitly subscribed to via from blocks)', detail: 'every' },\n { label: 'key', insertText: 'key ', documentation: 'Define the projection key', detail: 'key <expression>' },\n { label: 'parent', insertText: 'parent ', documentation: 'Define parent relationship', detail: 'parent <expression>' },\n { label: 'join', insertText: 'join ', documentation: 'Join with child collection', detail: 'join <collection> on <property>' },\n { label: 'children', insertText: 'children ', documentation: 'Define child collection operations', detail: 'children <collection> identified by <expression>' },\n { label: 'remove with', insertText: 'remove with ', documentation: 'Remove items based on event', detail: 'remove with <EventType>' },\n { label: 'remove via', insertText: 'remove via join on ', documentation: 'Remove items via join', detail: 'remove via join on <EventType>' },\n { label: 'no automap', insertText: 'no automap', documentation: 'Disable automatic property mapping', detail: 'no automap' },\n { label: 'clear', insertText: 'clear ', documentation: 'Remove the value a property holds', detail: 'clear <property>' },\n { label: 'increment', insertText: 'increment ', documentation: 'Increment a numeric property', detail: 'increment <property>' },\n { label: 'decrement', insertText: 'decrement ', documentation: 'Decrement a numeric property', detail: 'decrement <property>' },\n { label: 'count', insertText: 'count ', documentation: 'Count occurrences', detail: 'count <property>' },\n { label: 'add', insertText: 'add ', documentation: 'Add value to property', detail: 'add <property> by <expression>' },\n { label: 'subtract', insertText: 'subtract ', documentation: 'Subtract value from property', detail: 'subtract <property> by <expression>' },\n { label: 'exclude children', insertText: 'exclude children', documentation: 'Exclude child collections from automap', detail: 'exclude children' },\n ];\n\n keywords.forEach((kw) => {\n if (!context.currentWord || kw.label.startsWith(context.currentWord)) {\n suggestions.push({\n label: kw.label,\n kind: 14, // Keyword\n insertText: kw.insertText,\n documentation: kw.documentation,\n detail: kw.detail,\n range: this.getRangeForWord(context),\n });\n }\n });\n\n // Add property assignments\n if (activeSchema?.properties) {\n Object.entries(activeSchema.properties).forEach(([propName, propSchema]) => {\n if (!context.currentWord || propName.startsWith(context.currentWord)) {\n suggestions.push({\n label: propName,\n kind: 9, // Property\n insertText: `${propName} = `,\n documentation: `Assign value to property: ${propName}`,\n detail: this.getPropertyTypeDescription(propSchema),\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n }\n\n private addAssignmentValueCompletions(\n suggestions: languages.CompletionItem[],\n context: CompletionContext,\n model: editor.ITextModel,\n position: Position\n ): void {\n // Get the event type from the current block\n const eventType = this.getCurrentEventType(model, position.lineNumber);\n\n // Suggest event properties if we know the event type\n if (eventType && this.eventSchemas[eventType]) {\n const eventSchema = this.eventSchemas[eventType];\n if (eventSchema.properties) {\n Object.entries(eventSchema.properties).forEach(([propName, propSchema]) => {\n suggestions.push({\n label: propName,\n kind: 9,\n insertText: propName,\n documentation: `Event property: ${propName}`,\n detail: this.getPropertyTypeDescription(propSchema),\n range: this.getRangeForWord(context),\n });\n });\n }\n }\n\n // Add expression completions\n this.addExpressionCompletions(suggestions, context);\n }\n\n private addExpressionCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n const expressions = [\n {\n label: '$eventSourceId',\n insertText: '$eventSourceId',\n documentation: 'The identifier of the event source (aggregate/entity)',\n detail: 'Event Source Expression'\n },\n {\n label: '$causedBy',\n insertText: '$causedBy',\n documentation: 'The identity that caused the event. Chronicle cannot yet evaluate this short form (Cratis/Chronicle#4119) - prefer $eventContext.causedBy.<property>.',\n detail: 'Identity Expression'\n },\n {\n label: '$eventContext',\n insertText: '$eventContext.',\n documentation: `Metadata about the event: ${eventContextMembers.map((member) => member.name).join(', ')}`,\n detail: 'Event Context Expression'\n },\n ];\n\n expressions.forEach((expr) => {\n if (!context.currentWord || expr.label.startsWith(context.currentWord) || expr.label.startsWith('$' + context.currentWord)) {\n suggestions.push({\n label: expr.label,\n kind: 14, // Keyword/builtin\n insertText: expr.insertText,\n documentation: expr.documentation,\n detail: expr.detail,\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n\n private addPropertyMemberCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n // Any depth of an event-context path, as an expression or as a dynamic key (propertyName.$eventContext.<path>)\n const eventContextMatch = context.textBeforeCursor.match(EVENT_CONTEXT_PATH);\n if (eventContextMatch) {\n const segments = eventContextMatch[1].split('.').filter((segment) => segment.length > 0);\n this.addEventContextMemberCompletions(suggestions, context, segments, eventContextMatch[2]);\n return;\n }\n\n const match = context.textBeforeCursor.match(/(\\w+|\\$\\w+)\\.(\\w*)$/);\n if (!match) return;\n\n const [, objectName, partialProp] = match;\n\n // $causedBy is the short form of $eventContext.causedBy, at any depth\n const causedByMatch = context.textBeforeCursor.match(/\\$causedBy\\.((?:\\w+\\.)*)(\\w*)$/);\n if (causedByMatch) {\n const segments = causedByMatch[1].split('.').filter((segment) => segment.length > 0);\n this.addEventContextMemberCompletions(suggestions, context, ['causedBy', ...segments], causedByMatch[2]);\n return;\n }\n\n // Handle event type properties\n const eventSchema = this.eventSchemas[objectName];\n if (eventSchema?.properties) {\n Object.entries(eventSchema.properties).forEach(([propName, propSchema]) => {\n if (!partialProp || propName.startsWith(partialProp)) {\n suggestions.push({\n label: propName,\n kind: 9,\n insertText: propName,\n documentation: `Event property: ${propName}`,\n detail: this.getPropertyTypeDescription(propSchema),\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n }\n\n private addEventContextMemberCompletions(\n suggestions: languages.CompletionItem[],\n context: CompletionContext,\n segments: readonly string[],\n partial: string\n ): void {\n const members = eventContextMembersAfter(segments) ?? [];\n members\n .filter((member) => !partial || member.name.startsWith(partial))\n .forEach((member) => {\n suggestions.push({\n label: member.name,\n kind: member.kind === 'function' ? 1 : 9,\n insertText: member.name,\n documentation: member.description,\n detail: member.type,\n range: this.getRangeForWord(context),\n });\n });\n }\n\n private getCurrentEventType(model: editor.ITextModel, lineNumber: number): string | null {\n // Search backwards to find the event type declaration\n for (let i = lineNumber; i >= 1; i--) {\n const line = model.getLineContent(i).trim();\n const fromMatch = line.match(/^from\\s+([\\w-]+)/);\n if (fromMatch) {\n return fromMatch[1];\n }\n const everyMatch = line.match(/^every$/);\n if (everyMatch) {\n return null; // every block doesn't have a specific event type\n }\n }\n return null;\n }\n\n private getActiveReadModelSchema(model: editor.ITextModel): JsonSchema | undefined {\n const firstLine = model.getLineContent(1).trim();\n const match = firstLine.match(/^projection\\s+[\\w.]+\\s*=>\\s*([\\w.]+)/);\n if (!match) return undefined;\n\n const readModelName = match[1];\n const readModel = this.resolveReadModelInfo(readModelName);\n return readModel?.schema;\n }\n\n private resolveReadModelInfo(readModelToken: string): ReadModelInfo | null {\n return this.readModels.find(rm => rm.identifier === readModelToken || rm.displayName === readModelToken) || null;\n }\n\n private getSchemaName(schema: JsonSchema): string | undefined {\n if (schema.name) return schema.name;\n if (schema.title) return schema.title;\n if (typeof schema.$id === 'string') {\n const parts = schema.$id.split('/');\n return parts[parts.length - 1] || schema.$id;\n }\n return undefined;\n }\n\n private getSchemaDescription(schema: JsonSchema): string | undefined {\n return schema.description || undefined;\n }\n\n private getPropertyTypeDescription(propSchema: JsonSchemaProperty): string {\n if (propSchema.type === 'array' && propSchema.items) {\n const itemType = propSchema.items.type || propSchema.items.$id?.split('/').pop() || 'unknown';\n return `${itemType}[]`;\n }\n return propSchema.type || propSchema.$ref?.split('/').pop() || 'unknown';\n }\n\n private getRangeForWord(context: CompletionContext): IRange {\n const startColumn = context.textBeforeCursor.length - context.currentWord.length + 1;\n const endColumn = startColumn + context.currentWord.length;\n return {\n startLineNumber: context.lineNumber,\n startColumn: Math.max(1, startColumn),\n endLineNumber: context.lineNumber,\n endColumn: Math.max(1, endColumn),\n };\n }\n}\n"],"mappings":"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"}