@cratis/screenplay-language 5.2.0 → 5.3.1

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 (408) 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 +2 -0
  67. package/dist/bundles/compiler/Parsing/ApplicationContextParser.js.map +1 -0
  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 +1 -1
  288. package/dist/bundles/compiler/Syntax/ScreenplaySyntaxWalker.js.map +1 -1
  289. package/dist/bundles/compiler/Syntax/SourceOptions.js.map +1 -1
  290. package/dist/bundles/compiler/Syntax/SpecificationCaseOrigin.js.map +1 -1
  291. package/dist/bundles/compiler/Syntax/StreamIdFormatter.js.map +1 -1
  292. package/dist/bundles/compiler/Syntax/StrictSyntaxJson.js +1 -1
  293. package/dist/bundles/compiler/Syntax/Structure.js.map +1 -1
  294. package/dist/bundles/compiler/Syntax/SyntaxCollections.js +1 -1
  295. package/dist/bundles/compiler/Syntax/SyntaxCollections.js.map +1 -1
  296. package/dist/bundles/compiler/Syntax/SyntaxInvariants.js +1 -1
  297. package/dist/bundles/compiler/Syntax/SyntaxInvariants.js.map +1 -1
  298. package/dist/bundles/compiler/Syntax/SyntaxJson.js +1 -1
  299. package/dist/bundles/compiler/Syntax/SyntaxJson.js.map +1 -1
  300. package/dist/bundles/compiler/Syntax/SyntaxMemberContracts.js.map +1 -1
  301. package/dist/bundles/compiler/Syntax/index.js +1 -1
  302. package/dist/bundles/compiler/Text/ImplementationHintText.js.map +1 -1
  303. package/dist/bundles/compiler/Text/ReservedWords.js.map +1 -1
  304. package/dist/bundles/compiler/Text/SourceStreamNames.js.map +1 -1
  305. package/dist/bundles/compiler/Text/StringLiteral.js.map +1 -1
  306. package/dist/bundles/compiler/Text/ordinalIgnoreCaseKey.js.map +1 -1
  307. package/dist/bundles/compiler/Text/patterns.js.map +1 -1
  308. package/dist/bundles/compiler/index.js +1 -1
  309. package/dist/bundles/completion-items.js +18 -17
  310. package/dist/bundles/completion-items.js.map +1 -1
  311. package/dist/bundles/completion-planner.js +2 -2
  312. package/dist/bundles/completion-planner.js.map +1 -1
  313. package/dist/bundles/completions.js +1 -1
  314. package/dist/bundles/completions.js.map +1 -1
  315. package/dist/bundles/continuation-responses.js +1 -1
  316. package/dist/bundles/continuation-responses.js.map +1 -1
  317. package/dist/bundles/declarations.js.map +1 -1
  318. package/dist/bundles/dependency-completions.js.map +1 -1
  319. package/dist/bundles/dependency-target-analysis.js.map +1 -1
  320. package/dist/bundles/diagnostic-codes.js +1 -1
  321. package/dist/bundles/diagnostic-codes.js.map +1 -1
  322. package/dist/bundles/diagnostics.js +1 -1
  323. package/dist/bundles/diagnostics.js.map +1 -1
  324. package/dist/bundles/document-context.js.map +1 -1
  325. package/dist/bundles/documentation-item.js.map +1 -1
  326. package/dist/bundles/event-analysis-source.js.map +1 -1
  327. package/dist/bundles/event-context-catalog.js.map +1 -1
  328. package/dist/bundles/event-context.js.map +1 -1
  329. package/dist/bundles/event-source-authoring.js +11 -11
  330. package/dist/bundles/event-source-authoring.js.map +1 -1
  331. package/dist/bundles/example-analysis.js +2 -2
  332. package/dist/bundles/example-analysis.js.map +1 -1
  333. package/dist/bundles/example-authoring.js +2 -2
  334. package/dist/bundles/example-authoring.js.map +1 -1
  335. package/dist/bundles/example-declaration-items.js.map +1 -1
  336. package/dist/bundles/example-values.js.map +1 -1
  337. package/dist/bundles/file-imports.js.map +1 -1
  338. package/dist/bundles/file-references.js.map +1 -1
  339. package/dist/bundles/generation-completions.js.map +1 -1
  340. package/dist/bundles/hover-content.js +5 -5
  341. package/dist/bundles/hover-content.js.map +1 -1
  342. package/dist/bundles/hover.js.map +1 -1
  343. package/dist/bundles/index.js +1 -1
  344. package/dist/bundles/index.js.map +1 -1
  345. package/dist/bundles/inlay-hints.js.map +1 -1
  346. package/dist/bundles/inline-completions.js +1 -1
  347. package/dist/bundles/inline-completions.js.map +1 -1
  348. package/dist/bundles/inline-event-validation.js +1 -1
  349. package/dist/bundles/inline-event-validation.js.map +1 -1
  350. package/dist/bundles/keyword-docs.js +1 -1
  351. package/dist/bundles/keyword-docs.js.map +1 -1
  352. package/dist/bundles/language.js +1 -1
  353. package/dist/bundles/language.js.map +1 -1
  354. package/dist/bundles/named-rule-context.js.map +1 -1
  355. package/dist/bundles/operation-authoring.js +6 -6
  356. package/dist/bundles/operation-authoring.js.map +1 -1
  357. package/dist/bundles/persona-analysis.js +1 -1
  358. package/dist/bundles/persona-analysis.js.map +1 -1
  359. package/dist/bundles/production-destinations.js +1 -1
  360. package/dist/bundles/production-destinations.js.map +1 -1
  361. package/dist/bundles/purpose-items.js.map +1 -1
  362. package/dist/bundles/reaction-authoring.js +3 -3
  363. package/dist/bundles/reaction-authoring.js.map +1 -1
  364. package/dist/bundles/read-model-key-completions.js +1 -1
  365. package/dist/bundles/read-model-key-completions.js.map +1 -1
  366. package/dist/bundles/refusal-context.js.map +1 -1
  367. package/dist/bundles/response-analysis.js +1 -1
  368. package/dist/bundles/response-analysis.js.map +1 -1
  369. package/dist/bundles/response-completions.js +1 -1
  370. package/dist/bundles/response-completions.js.map +1 -1
  371. package/dist/bundles/response-tokens.js +2 -2
  372. package/dist/bundles/response-tokens.js.map +1 -1
  373. package/dist/bundles/scope-items.js +3 -3
  374. package/dist/bundles/scope-items.js.map +1 -1
  375. package/dist/bundles/structure-completions.js.map +1 -1
  376. package/dist/bundles/sub-language-registry.js.map +1 -1
  377. package/dist/bundles/sub-languages/capture/CompletionProvider.js.map +1 -1
  378. package/dist/bundles/sub-languages/capture/HoverProvider.js.map +1 -1
  379. package/dist/bundles/sub-languages/capture/Validator.js.map +1 -1
  380. package/dist/bundles/sub-languages/capture/index.js.map +1 -1
  381. package/dist/bundles/sub-languages/capture/language.js.map +1 -1
  382. package/dist/bundles/sub-languages/cdl.js.map +1 -1
  383. package/dist/bundles/sub-languages/pdl.js.map +1 -1
  384. package/dist/bundles/sub-languages/projection/CodeActionProvider.js.map +1 -1
  385. package/dist/bundles/sub-languages/projection/CompletionProvider.js +1 -1
  386. package/dist/bundles/sub-languages/projection/CompletionProvider.js.map +1 -1
  387. package/dist/bundles/sub-languages/projection/HoverProvider.js.map +1 -1
  388. package/dist/bundles/sub-languages/projection/Validator.js.map +1 -1
  389. package/dist/bundles/sub-languages/projection/index.js.map +1 -1
  390. package/dist/bundles/sub-languages/projection/language.js.map +1 -1
  391. package/dist/bundles/symbols.js +2 -2
  392. package/dist/bundles/symbols.js.map +1 -1
  393. package/dist/bundles/themes/screenplay-dark.js.map +1 -1
  394. package/dist/bundles/themes/screenplay-light.js.map +1 -1
  395. package/dist/bundles/tokens.js +1 -1
  396. package/dist/bundles/tokens.js.map +1 -1
  397. package/dist/bundles/validation.js +2 -2
  398. package/dist/bundles/validation.js.map +1 -1
  399. package/dist/completion-items.d.ts +1 -0
  400. package/dist/completion-items.d.ts.map +1 -1
  401. package/dist/completion-planner.d.ts.map +1 -1
  402. package/dist/diagnostic-codes.d.ts +6 -0
  403. package/dist/diagnostic-codes.d.ts.map +1 -1
  404. package/dist/keyword-docs.d.ts.map +1 -1
  405. package/dist/language.d.ts.map +1 -1
  406. package/dist/scope-items.d.ts.map +1 -1
  407. package/dist/tokens.d.ts.map +1 -1
  408. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"Validator.js","names":["readModels","draft","schemas","schema","map","s","name","i","markers","content","model","lines","firstNonEmptyLineIndex","firstLine","trimmed","projectionWithReadModelMatch","projectionAdHocMatch","lineNumber","activeSchema","readModelName","readModelExists","isDraftReadModel","readModelStartColumn","col","isDraft","activeReadModel","contextStack","indentStack","lastIndent","eventContextStack","line","currentIndent","poppedIndent","currentEventContext","fromMatch","eventType","variantMatch","variantName","variantSchema","entersOnMatch","eventsMatch","removeWithMatch","assignmentMatch","currentSchema","propertyName","schemaName","numericOpMatch","addSubMatch","childrenMatch","prop","childSchema","joinMatch","collectionName","joinProperty","collectionProp","keyMatch","keyName","isInDefinitions","isProperty","issue","validateEventContextPaths","fenceMap","rm","readModelToken","prefixMatch","fallbackIndex","text","startCol","endCol","parts"],"sources":["../../../../sub-languages/projection/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 type { editor } from 'monaco-editor';\nimport type { JsonSchema, ReadModelInfo, DraftReadModelInfo } from './index';\nimport { fenceMap } from '../../document-context';\nimport { validateEventContextPaths } from '../../validation';\n\nexport class Validator {\n private readModels: ReadModelInfo[] = [];\n private eventSchemas: Record<string, JsonSchema> = {};\n private draftReadModel: DraftReadModelInfo | null = null;\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: 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 validate(model: editor.ITextModel): editor.IMarkerData[] {\n const markers: editor.IMarkerData[] = [];\n const content = model.getValue();\n\n // Skip validation if content is empty or only whitespace\n // This prevents spurious errors when the model is first created before content is loaded\n if (!content.trim()) {\n return markers;\n }\n\n // Normalize line endings and split\n const lines = content.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n').split('\\n');\n\n // Find the first non-empty, non-comment line\n let firstNonEmptyLineIndex = 0;\n let firstLine = '';\n for (let i = 0; i < lines.length; i++) {\n const trimmed = lines[i].trim();\n if (trimmed && !trimmed.startsWith('#')) {\n firstNonEmptyLineIndex = i;\n firstLine = trimmed;\n break;\n }\n }\n\n if (!firstLine) {\n // This should not happen since we already checked for empty content above,\n // but if it does (content is all comments), just return without error\n return markers;\n }\n\n // Validate first meaningful line - projection declaration\n // Supports both \"projection Name => ReadModel\" and ad hoc \"projection Name\"\n const projectionWithReadModelMatch = firstLine.match(/^projection\\s+([\\w.]+)\\s*=>\\s*([\\w.]+)\\s*$/);\n const projectionAdHocMatch = !projectionWithReadModelMatch && firstLine.match(/^projection\\s+([\\w.]+)\\s*$/);\n\n if (!projectionWithReadModelMatch && !projectionAdHocMatch) {\n const lineNumber = firstNonEmptyLineIndex + 1;\n markers.push(this.createError(lineNumber, 1, firstLine.length + 1, 'Projection definition must start with \"projection <ProjectionName>\" or \"projection <ProjectionName> => <ReadModelIdentifier>\"'));\n return markers;\n }\n\n let activeSchema: JsonSchema | undefined;\n let readModelName: string | null = null;\n\n if (projectionWithReadModelMatch) {\n readModelName = projectionWithReadModelMatch[2];\n\n // Validate read model exists in schemas or is a draft\n const readModelExists = this.resolveReadModelIdentifier(readModelName) !== null;\n const isDraftReadModel = this.isDraftReadModel(readModelName);\n const readModelStartColumn = this.getReadModelStartColumn(firstLine, readModelName);\n\n if (!readModelExists && !isDraftReadModel) {\n const lineNumber = firstNonEmptyLineIndex + 1;\n const col = readModelStartColumn;\n markers.push(this.createError(lineNumber, col, col + readModelName.length, `Read model '${readModelName}' not found`));\n } else if (isDraftReadModel) {\n // Show info marker for draft read models - they exist but haven't been saved yet\n const lineNumber = firstNonEmptyLineIndex + 1;\n const col = readModelStartColumn;\n markers.push(this.createInfo(lineNumber, col, col + readModelName.length, `Read model '${readModelName}' is a draft (not yet saved)`));\n }\n\n // Get the active read model schema for property validation (check draft first)\n const isDraft = this.isDraftReadModel(readModelName);\n const activeReadModel = isDraft ? null : this.resolveReadModelInfo(readModelName);\n activeSchema = isDraft ? this.draftReadModel!.schema : activeReadModel?.schema;\n }\n // For ad hoc projections (no read model), activeSchema stays undefined — property validation is skipped\n\n // Validate subsequent lines\n const contextStack: JsonSchema[] = [activeSchema!];\n const indentStack: number[] = [0]; // Track indentation levels for context\n let lastIndent = 0;\n\n // Track event types at each context level to detect duplicates\n // Each entry in the stack represents events seen at that context level\n type EventInfo = { lineNumber: number; col: number };\n const eventContextStack: Map<string, EventInfo>[] = [new Map()];\n\n for (let i = 1; i < lines.length; i++) {\n const lineNumber = i + 1;\n const line = lines[i];\n const trimmed = line.trim();\n\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n // Calculate current indentation\n const currentIndent = line.search(/\\S/);\n\n // Pop context when dedenting (exiting a children block)\n while (currentIndent < lastIndent && indentStack.length > 1) {\n const poppedIndent = indentStack.pop();\n if (poppedIndent !== undefined && currentIndent < poppedIndent) {\n contextStack.pop();\n eventContextStack.pop();\n }\n }\n lastIndent = currentIndent;\n\n // Get the current event context (events seen at this level)\n const currentEventContext = eventContextStack[eventContextStack.length - 1];\n\n // Validate event types in from/every blocks\n const fromMatch = trimmed.match(/^from\\s+([\\w-]+)/);\n if (fromMatch) {\n const eventType = fromMatch[1];\n const col = line.indexOf(eventType) + 1;\n\n if (Object.keys(this.eventSchemas).length > 0 && !this.eventSchemas[eventType]) {\n markers.push(this.createError(lineNumber, col, col + eventType.length, `Event type '${eventType}' not found`));\n }\n\n // Check for duplicate events at this level\n if (currentEventContext.has(eventType)) {\n markers.push(this.createError(lineNumber, col, col + eventType.length, `Duplicate event type '${eventType}' - event types can only be used once at each level`));\n } else {\n currentEventContext.set(eventType, { lineNumber, col });\n }\n }\n\n // Validate variant declarations - each names its own read model, which becomes the active\n // schema for property validation inside the block (mirrors the projection-header handling above).\n const variantMatch = trimmed.match(/^variant\\s+([\\w.]+)\\s*$/);\n if (variantMatch) {\n const [, variantName] = variantMatch;\n const col = line.indexOf(variantName) + 1;\n const isDraft = this.isDraftReadModel(variantName);\n const readModelExists = this.resolveReadModelIdentifier(variantName) !== null;\n\n if (!readModelExists && !isDraft) {\n markers.push(this.createError(lineNumber, col, col + variantName.length, `Read model '${variantName}' not found`));\n } else if (isDraft) {\n markers.push(this.createInfo(lineNumber, col, col + variantName.length, `Read model '${variantName}' is a draft (not yet saved)`));\n }\n\n const variantSchema = isDraft ? this.draftReadModel!.schema : this.resolveReadModelInfo(variantName)?.schema;\n contextStack.push(variantSchema!);\n indentStack.push(currentIndent);\n eventContextStack.push(new Map());\n }\n\n // Validate 'enters on' - the event that activates a variant. Read exactly like a 'from' block for\n // event-existence and duplicate-at-this-level purposes.\n const entersOnMatch = trimmed.match(/^enters\\s+on\\s+([\\w-]+)/);\n if (entersOnMatch) {\n const eventType = entersOnMatch[1];\n const col = line.indexOf(eventType) + 1;\n\n if (Object.keys(this.eventSchemas).length > 0 && !this.eventSchemas[eventType]) {\n markers.push(this.createError(lineNumber, col, col + eventType.length, `Event type '${eventType}' not found`));\n }\n\n if (currentEventContext.has(eventType)) {\n markers.push(this.createError(lineNumber, col, col + eventType.length, `Duplicate event type '${eventType}' - event types can only be used once at each level`));\n } else {\n currentEventContext.set(eventType, { lineNumber, col });\n }\n }\n\n // Validate event types in join/remove blocks\n const eventsMatch = trimmed.match(/^events\\s+([\\w-]+)/);\n if (eventsMatch) {\n const eventType = eventsMatch[1];\n const col = line.indexOf(eventType) + 1;\n\n if (Object.keys(this.eventSchemas).length > 0 && !this.eventSchemas[eventType]) {\n markers.push(this.createError(lineNumber, col, col + eventType.length, `Event type '${eventType}' not found`));\n }\n\n // Check for duplicate events at this level (within join blocks)\n if (currentEventContext.has(eventType)) {\n markers.push(this.createError(lineNumber, col, col + eventType.length, `Duplicate event type '${eventType}' - event types can only be used once at each level`));\n } else {\n currentEventContext.set(eventType, { lineNumber, col });\n }\n }\n\n const removeWithMatch = trimmed.match(/^remove\\s+(?:with|via\\s+join\\s+on)\\s+([\\w-]+)/);\n if (removeWithMatch) {\n const eventType = removeWithMatch[1];\n const col = line.indexOf(eventType) + 1;\n\n if (Object.keys(this.eventSchemas).length > 0 && !this.eventSchemas[eventType]) {\n markers.push(this.createError(lineNumber, col, col + eventType.length, `Event type '${eventType}' not found`));\n }\n\n // Check for duplicate events at this level\n if (currentEventContext.has(eventType)) {\n markers.push(this.createError(lineNumber, col, col + eventType.length, `Duplicate event type '${eventType}' - event types can only be used once at each level`));\n } else {\n currentEventContext.set(eventType, { lineNumber, col });\n }\n }\n\n // Validate property assignments\n const assignmentMatch = trimmed.match(/^(\\w+)\\s*=\\s*(.+)$/);\n if (assignmentMatch) {\n const currentSchema = contextStack[contextStack.length - 1];\n if (currentSchema?.properties) {\n const [, propertyName] = assignmentMatch;\n if (!currentSchema.properties[propertyName]) {\n const col = line.indexOf(propertyName) + 1;\n const schemaName = this.getSchemaName(currentSchema) || 'current schema';\n markers.push(this.createWarning(lineNumber, col, col + propertyName.length, `Property '${propertyName}' not found in ${schemaName}`));\n }\n }\n }\n\n // Validate increment/decrement/count targets\n const numericOpMatch = trimmed.match(/^(?:increment|decrement|count)\\s+(\\w+)$/);\n if (numericOpMatch) {\n const currentSchema = contextStack[contextStack.length - 1];\n if (currentSchema?.properties) {\n const [, propertyName] = numericOpMatch;\n if (!currentSchema.properties[propertyName]) {\n const col = line.indexOf(propertyName) + 1;\n const schemaName = this.getSchemaName(currentSchema) || 'current schema';\n markers.push(this.createWarning(lineNumber, col, col + propertyName.length, `Property '${propertyName}' not found in ${schemaName}`));\n }\n }\n }\n\n // Validate add/subtract targets\n const addSubMatch = trimmed.match(/^(?:add|subtract)\\s+(\\w+)\\s+by\\s+/);\n if (addSubMatch) {\n const currentSchema = contextStack[contextStack.length - 1];\n if (currentSchema?.properties) {\n const [, propertyName] = addSubMatch;\n if (!currentSchema.properties[propertyName]) {\n const col = line.indexOf(propertyName) + 1;\n const schemaName = this.getSchemaName(currentSchema) || 'current schema';\n markers.push(this.createWarning(lineNumber, col, col + propertyName.length, `Property '${propertyName}' not found in ${schemaName}`));\n }\n }\n }\n\n // Validate children references\n const childrenMatch = trimmed.match(/^children\\s+(\\w+)\\s+identified\\s+by\\s+/);\n if (childrenMatch) {\n const currentSchema = contextStack[contextStack.length - 1];\n if (currentSchema?.properties) {\n const [, propertyName] = childrenMatch;\n const prop = currentSchema.properties[propertyName];\n if (!prop) {\n const col = line.indexOf(propertyName) + 1;\n const schemaName = this.getSchemaName(currentSchema) || 'current schema';\n markers.push(this.createWarning(lineNumber, col, col + propertyName.length, `Collection property '${propertyName}' not found in ${schemaName}`));\n } else if (prop.type !== 'array' && !prop.items) {\n const col = line.indexOf(propertyName) + 1;\n markers.push(this.createWarning(lineNumber, col, col + propertyName.length, `Property '${propertyName}' is not a collection (array) type`));\n } else {\n // Push child schema onto context stack for validating nested properties\n const childSchema = prop.items;\n if (childSchema) {\n contextStack.push(childSchema);\n indentStack.push(currentIndent);\n // Push a new event context for the children block\n eventContextStack.push(new Map());\n }\n }\n }\n }\n\n // Validate join references\n const joinMatch = trimmed.match(/^join\\s+(\\w+)\\s+on\\s+(\\w+)/);\n if (joinMatch && activeSchema?.properties) {\n const [, collectionName, joinProperty] = joinMatch;\n const collectionProp = activeSchema.properties[collectionName];\n if (!collectionProp) {\n const col = line.indexOf(collectionName) + 1;\n markers.push(this.createWarning(lineNumber, col, col + collectionName.length, `Collection property '${collectionName}' not found in read model '${readModelName}'`));\n } else if (collectionProp.type !== 'array' && !collectionProp.items) {\n const col = line.indexOf(collectionName) + 1;\n markers.push(this.createWarning(lineNumber, col, col + collectionName.length, `Property '${collectionName}' is not a collection (array) type`));\n }\n\n if (!activeSchema.properties[joinProperty]) {\n const col = line.indexOf(joinProperty, line.indexOf('on')) + 1;\n markers.push(this.createWarning(lineNumber, col, col + joinProperty.length, `Property '${joinProperty}' not found in read model '${readModelName}'`));\n }\n\n // Push a new event context for the join block\n eventContextStack.push(new Map());\n indentStack.push(currentIndent);\n }\n\n // Validate key references for composite keys\n const keyMatch = trimmed.match(/^key\\s+(\\w+)\\s*$/);\n if (keyMatch && activeSchema) {\n const [, keyName] = keyMatch;\n // Check if it's a composite key type (should exist in definitions or as a property)\n const isInDefinitions = activeSchema.definitions && activeSchema.definitions[keyName];\n const isProperty = activeSchema.properties && activeSchema.properties[keyName];\n\n if (!isInDefinitions && !isProperty && !this.isBuiltInExpression(keyName)) {\n const col = line.indexOf(keyName) + 1;\n markers.push(this.createWarning(lineNumber, col, col + keyName.length, `Composite key type '${keyName}' not found in read model schema`));\n }\n }\n }\n\n // Share the host's event-context path checks and catalog resolution, including dynamic dictionary keys.\n for (const issue of validateEventContextPaths(lines, fenceMap(lines))) {\n markers.push({\n severity: issue.severity === 'error' ? 8 : 4,\n startLineNumber: issue.line + 1,\n endLineNumber: issue.line + 1,\n startColumn: issue.startColumn,\n endColumn: issue.endColumn,\n message: issue.message,\n code: issue.code,\n });\n }\n\n return markers;\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 getReadModelStartColumn(firstLine: string, readModelName: string): number {\n const prefixMatch = firstLine.match(/^\\s*projection\\s+[\\w.]+\\s*=>\\s*/);\n if (!prefixMatch) {\n const fallbackIndex = firstLine.lastIndexOf(readModelName);\n return (fallbackIndex >= 0 ? fallbackIndex : 0) + 1;\n }\n return prefixMatch[0].length + 1;\n }\n\n private resolveReadModelIdentifier(readModelToken: string): string | null {\n if (this.isDraftReadModel(readModelToken)) {\n return this.draftReadModel!.identifier;\n }\n const readModel = this.resolveReadModelInfo(readModelToken);\n return readModel?.identifier ?? null;\n }\n\n private isDraftReadModel(readModelToken: string): boolean {\n return !!this.draftReadModel && (this.draftReadModel.identifier === readModelToken || this.draftReadModel.displayName === readModelToken);\n }\n\n private isBuiltInExpression(text: string): boolean {\n return text.startsWith('$') || ['true', 'false', 'null'].includes(text);\n }\n\n private createError(line: number, startCol: number, endCol: number, message: string): editor.IMarkerData {\n return {\n severity: 8, // Error\n startLineNumber: line,\n startColumn: startCol,\n endLineNumber: line,\n endColumn: endCol,\n message,\n };\n }\n\n private createWarning(line: number, startCol: number, endCol: number, message: string): editor.IMarkerData {\n return {\n severity: 4, // Warning\n startLineNumber: line,\n startColumn: startCol,\n endLineNumber: line,\n endColumn: endCol,\n message,\n };\n }\n\n private createInfo(line: number, startCol: number, endCol: number, message: string): editor.IMarkerData {\n return {\n severity: 2, // Info (hint) - shows as blue/green squiggly\n startLineNumber: line,\n startColumn: startCol,\n endLineNumber: line,\n endColumn: endCol,\n message,\n };\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"],"mappings":"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"}
1
+ {"version":3,"file":"Validator.js","names":["readModels","draft","schemas","schema","map","s","name","i","markers","content","model","lines","firstNonEmptyLineIndex","firstLine","trimmed","projectionWithReadModelMatch","projectionAdHocMatch","lineNumber","activeSchema","readModelName","readModelExists","isDraftReadModel","readModelStartColumn","col","isDraft","activeReadModel","contextStack","indentStack","lastIndent","eventContextStack","line","currentIndent","poppedIndent","currentEventContext","fromMatch","eventType","variantMatch","variantName","variantSchema","entersOnMatch","eventsMatch","removeWithMatch","assignmentMatch","currentSchema","propertyName","schemaName","numericOpMatch","addSubMatch","childrenMatch","prop","childSchema","joinMatch","collectionName","joinProperty","collectionProp","keyMatch","keyName","isInDefinitions","isProperty","issue","validateEventContextPaths","fenceMap","rm","readModelToken","prefixMatch","fallbackIndex","text","startCol","endCol","parts"],"sources":["../../../../sub-languages/projection/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 type { editor } from 'monaco-editor';\nimport type { JsonSchema, ReadModelInfo, DraftReadModelInfo } from './index';\nimport { fenceMap } from '../../document-context';\nimport { validateEventContextPaths } from '../../validation';\n\nexport class Validator {\n private readModels: ReadModelInfo[] = [];\n private eventSchemas: Record<string, JsonSchema> = {};\n private draftReadModel: DraftReadModelInfo | null = null;\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: 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 validate(model: editor.ITextModel): editor.IMarkerData[] {\n const markers: editor.IMarkerData[] = [];\n const content = model.getValue();\n\n // Skip validation if content is empty or only whitespace\n // This prevents spurious errors when the model is first created before content is loaded\n if (!content.trim()) {\n return markers;\n }\n\n // Normalize line endings and split\n const lines = content.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n').split('\\n');\n\n // Find the first non-empty, non-comment line\n let firstNonEmptyLineIndex = 0;\n let firstLine = '';\n for (let i = 0; i < lines.length; i++) {\n const trimmed = lines[i].trim();\n if (trimmed && !trimmed.startsWith('#')) {\n firstNonEmptyLineIndex = i;\n firstLine = trimmed;\n break;\n }\n }\n\n if (!firstLine) {\n // This should not happen since we already checked for empty content above,\n // but if it does (content is all comments), just return without error\n return markers;\n }\n\n // Validate first meaningful line - projection declaration\n // Supports both \"projection Name => ReadModel\" and ad hoc \"projection Name\"\n const projectionWithReadModelMatch = firstLine.match(/^projection\\s+([\\w.]+)\\s*=>\\s*([\\w.]+)\\s*$/);\n const projectionAdHocMatch = !projectionWithReadModelMatch && firstLine.match(/^projection\\s+([\\w.]+)\\s*$/);\n\n if (!projectionWithReadModelMatch && !projectionAdHocMatch) {\n const lineNumber = firstNonEmptyLineIndex + 1;\n markers.push(this.createError(lineNumber, 1, firstLine.length + 1, 'Projection definition must start with \"projection <ProjectionName>\" or \"projection <ProjectionName> => <ReadModelIdentifier>\"'));\n return markers;\n }\n\n let activeSchema: JsonSchema | undefined;\n let readModelName: string | null = null;\n\n if (projectionWithReadModelMatch) {\n readModelName = projectionWithReadModelMatch[2];\n\n // Validate read model exists in schemas or is a draft\n const readModelExists = this.resolveReadModelIdentifier(readModelName) !== null;\n const isDraftReadModel = this.isDraftReadModel(readModelName);\n const readModelStartColumn = this.getReadModelStartColumn(firstLine, readModelName);\n\n if (!readModelExists && !isDraftReadModel) {\n const lineNumber = firstNonEmptyLineIndex + 1;\n const col = readModelStartColumn;\n markers.push(this.createError(lineNumber, col, col + readModelName.length, `Read model '${readModelName}' not found`));\n } else if (isDraftReadModel) {\n // Show info marker for draft read models - they exist but haven't been saved yet\n const lineNumber = firstNonEmptyLineIndex + 1;\n const col = readModelStartColumn;\n markers.push(this.createInfo(lineNumber, col, col + readModelName.length, `Read model '${readModelName}' is a draft (not yet saved)`));\n }\n\n // Get the active read model schema for property validation (check draft first)\n const isDraft = this.isDraftReadModel(readModelName);\n const activeReadModel = isDraft ? null : this.resolveReadModelInfo(readModelName);\n activeSchema = isDraft ? this.draftReadModel!.schema : activeReadModel?.schema;\n }\n // For ad hoc projections (no read model), activeSchema stays undefined — property validation is skipped\n\n // Validate subsequent lines\n const contextStack: JsonSchema[] = [activeSchema!];\n const indentStack: number[] = [0]; // Track indentation levels for context\n let lastIndent = 0;\n\n // Track event types at each context level to detect duplicates\n // Each entry in the stack represents events seen at that context level\n type EventInfo = { lineNumber: number; col: number };\n const eventContextStack: Map<string, EventInfo>[] = [new Map()];\n\n for (let i = 1; i < lines.length; i++) {\n const lineNumber = i + 1;\n const line = lines[i];\n const trimmed = line.trim();\n\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n // Calculate current indentation\n const currentIndent = line.search(/\\S/);\n\n // Pop context when dedenting (exiting a children block)\n while (currentIndent < lastIndent && indentStack.length > 1) {\n const poppedIndent = indentStack.pop();\n if (poppedIndent !== undefined && currentIndent < poppedIndent) {\n contextStack.pop();\n eventContextStack.pop();\n }\n }\n lastIndent = currentIndent;\n\n // Get the current event context (events seen at this level)\n const currentEventContext = eventContextStack[eventContextStack.length - 1];\n\n // Validate event types in from/every blocks\n const fromMatch = trimmed.match(/^from\\s+([\\w-]+)/);\n if (fromMatch) {\n const eventType = fromMatch[1];\n const col = line.indexOf(eventType) + 1;\n\n if (Object.keys(this.eventSchemas).length > 0 && !this.eventSchemas[eventType]) {\n markers.push(this.createError(lineNumber, col, col + eventType.length, `Event type '${eventType}' not found`));\n }\n\n // Check for duplicate events at this level\n if (currentEventContext.has(eventType)) {\n markers.push(this.createError(lineNumber, col, col + eventType.length, `Duplicate event type '${eventType}' - event types can only be used once at each level`));\n } else {\n currentEventContext.set(eventType, { lineNumber, col });\n }\n }\n\n // Validate variant declarations - each names its own read model, which becomes the active\n // schema for property validation inside the block (mirrors the projection-header handling above).\n const variantMatch = trimmed.match(/^variant\\s+([\\w.]+)\\s*$/);\n if (variantMatch) {\n const [, variantName] = variantMatch;\n const col = line.indexOf(variantName) + 1;\n const isDraft = this.isDraftReadModel(variantName);\n const readModelExists = this.resolveReadModelIdentifier(variantName) !== null;\n\n if (!readModelExists && !isDraft) {\n markers.push(this.createError(lineNumber, col, col + variantName.length, `Read model '${variantName}' not found`));\n } else if (isDraft) {\n markers.push(this.createInfo(lineNumber, col, col + variantName.length, `Read model '${variantName}' is a draft (not yet saved)`));\n }\n\n const variantSchema = isDraft ? this.draftReadModel!.schema : this.resolveReadModelInfo(variantName)?.schema;\n contextStack.push(variantSchema!);\n indentStack.push(currentIndent);\n eventContextStack.push(new Map());\n }\n\n // Validate 'enters on' - the event that activates a variant. Read exactly like a 'from' block for\n // event-existence and duplicate-at-this-level purposes.\n const entersOnMatch = trimmed.match(/^enters\\s+on\\s+([\\w-]+)/);\n if (entersOnMatch) {\n const eventType = entersOnMatch[1];\n const col = line.indexOf(eventType) + 1;\n\n if (Object.keys(this.eventSchemas).length > 0 && !this.eventSchemas[eventType]) {\n markers.push(this.createError(lineNumber, col, col + eventType.length, `Event type '${eventType}' not found`));\n }\n\n if (currentEventContext.has(eventType)) {\n markers.push(this.createError(lineNumber, col, col + eventType.length, `Duplicate event type '${eventType}' - event types can only be used once at each level`));\n } else {\n currentEventContext.set(eventType, { lineNumber, col });\n }\n }\n\n // Validate event types in join/remove blocks\n const eventsMatch = trimmed.match(/^events\\s+([\\w-]+)/);\n if (eventsMatch) {\n const eventType = eventsMatch[1];\n const col = line.indexOf(eventType) + 1;\n\n if (Object.keys(this.eventSchemas).length > 0 && !this.eventSchemas[eventType]) {\n markers.push(this.createError(lineNumber, col, col + eventType.length, `Event type '${eventType}' not found`));\n }\n\n // Check for duplicate events at this level (within join blocks)\n if (currentEventContext.has(eventType)) {\n markers.push(this.createError(lineNumber, col, col + eventType.length, `Duplicate event type '${eventType}' - event types can only be used once at each level`));\n } else {\n currentEventContext.set(eventType, { lineNumber, col });\n }\n }\n\n const removeWithMatch = trimmed.match(/^remove\\s+(?:with|via\\s+join\\s+on)\\s+([\\w-]+)/);\n if (removeWithMatch) {\n const eventType = removeWithMatch[1];\n const col = line.indexOf(eventType) + 1;\n\n if (Object.keys(this.eventSchemas).length > 0 && !this.eventSchemas[eventType]) {\n markers.push(this.createError(lineNumber, col, col + eventType.length, `Event type '${eventType}' not found`));\n }\n\n // Check for duplicate events at this level\n if (currentEventContext.has(eventType)) {\n markers.push(this.createError(lineNumber, col, col + eventType.length, `Duplicate event type '${eventType}' - event types can only be used once at each level`));\n } else {\n currentEventContext.set(eventType, { lineNumber, col });\n }\n }\n\n // Validate property assignments\n const assignmentMatch = trimmed.match(/^(\\w+)\\s*=\\s*(.+)$/);\n if (assignmentMatch) {\n const currentSchema = contextStack[contextStack.length - 1];\n if (currentSchema?.properties) {\n const [, propertyName] = assignmentMatch;\n if (!currentSchema.properties[propertyName]) {\n const col = line.indexOf(propertyName) + 1;\n const schemaName = this.getSchemaName(currentSchema) || 'current schema';\n markers.push(this.createWarning(lineNumber, col, col + propertyName.length, `Property '${propertyName}' not found in ${schemaName}`));\n }\n }\n }\n\n // Validate increment/decrement/count targets\n const numericOpMatch = trimmed.match(/^(?:increment|decrement|count)\\s+(\\w+)$/);\n if (numericOpMatch) {\n const currentSchema = contextStack[contextStack.length - 1];\n if (currentSchema?.properties) {\n const [, propertyName] = numericOpMatch;\n if (!currentSchema.properties[propertyName]) {\n const col = line.indexOf(propertyName) + 1;\n const schemaName = this.getSchemaName(currentSchema) || 'current schema';\n markers.push(this.createWarning(lineNumber, col, col + propertyName.length, `Property '${propertyName}' not found in ${schemaName}`));\n }\n }\n }\n\n // Validate add/subtract targets\n const addSubMatch = trimmed.match(/^(?:add|subtract)\\s+(\\w+)\\s+by\\s+/);\n if (addSubMatch) {\n const currentSchema = contextStack[contextStack.length - 1];\n if (currentSchema?.properties) {\n const [, propertyName] = addSubMatch;\n if (!currentSchema.properties[propertyName]) {\n const col = line.indexOf(propertyName) + 1;\n const schemaName = this.getSchemaName(currentSchema) || 'current schema';\n markers.push(this.createWarning(lineNumber, col, col + propertyName.length, `Property '${propertyName}' not found in ${schemaName}`));\n }\n }\n }\n\n // Validate children references\n const childrenMatch = trimmed.match(/^children\\s+(\\w+)\\s+identified\\s+by\\s+/);\n if (childrenMatch) {\n const currentSchema = contextStack[contextStack.length - 1];\n if (currentSchema?.properties) {\n const [, propertyName] = childrenMatch;\n const prop = currentSchema.properties[propertyName];\n if (!prop) {\n const col = line.indexOf(propertyName) + 1;\n const schemaName = this.getSchemaName(currentSchema) || 'current schema';\n markers.push(this.createWarning(lineNumber, col, col + propertyName.length, `Collection property '${propertyName}' not found in ${schemaName}`));\n } else if (prop.type !== 'array' && !prop.items) {\n const col = line.indexOf(propertyName) + 1;\n markers.push(this.createWarning(lineNumber, col, col + propertyName.length, `Property '${propertyName}' is not a collection (array) type`));\n } else {\n // Push child schema onto context stack for validating nested properties\n const childSchema = prop.items;\n if (childSchema) {\n contextStack.push(childSchema);\n indentStack.push(currentIndent);\n // Push a new event context for the children block\n eventContextStack.push(new Map());\n }\n }\n }\n }\n\n // Validate join references\n const joinMatch = trimmed.match(/^join\\s+(\\w+)\\s+on\\s+(\\w+)/);\n if (joinMatch && activeSchema?.properties) {\n const [, collectionName, joinProperty] = joinMatch;\n const collectionProp = activeSchema.properties[collectionName];\n if (!collectionProp) {\n const col = line.indexOf(collectionName) + 1;\n markers.push(this.createWarning(lineNumber, col, col + collectionName.length, `Collection property '${collectionName}' not found in read model '${readModelName}'`));\n } else if (collectionProp.type !== 'array' && !collectionProp.items) {\n const col = line.indexOf(collectionName) + 1;\n markers.push(this.createWarning(lineNumber, col, col + collectionName.length, `Property '${collectionName}' is not a collection (array) type`));\n }\n\n if (!activeSchema.properties[joinProperty]) {\n const col = line.indexOf(joinProperty, line.indexOf('on')) + 1;\n markers.push(this.createWarning(lineNumber, col, col + joinProperty.length, `Property '${joinProperty}' not found in read model '${readModelName}'`));\n }\n\n // Push a new event context for the join block\n eventContextStack.push(new Map());\n indentStack.push(currentIndent);\n }\n\n // Validate key references for composite keys\n const keyMatch = trimmed.match(/^key\\s+(\\w+)\\s*$/);\n if (keyMatch && activeSchema) {\n const [, keyName] = keyMatch;\n // Check if it's a composite key type (should exist in definitions or as a property)\n const isInDefinitions = activeSchema.definitions && activeSchema.definitions[keyName];\n const isProperty = activeSchema.properties && activeSchema.properties[keyName];\n\n if (!isInDefinitions && !isProperty && !this.isBuiltInExpression(keyName)) {\n const col = line.indexOf(keyName) + 1;\n markers.push(this.createWarning(lineNumber, col, col + keyName.length, `Composite key type '${keyName}' not found in read model schema`));\n }\n }\n }\n\n // Share the host's event-context path checks and catalog resolution, including dynamic dictionary keys.\n for (const issue of validateEventContextPaths(lines, fenceMap(lines))) {\n markers.push({\n severity: issue.severity === 'error' ? 8 : 4,\n startLineNumber: issue.line + 1,\n endLineNumber: issue.line + 1,\n startColumn: issue.startColumn,\n endColumn: issue.endColumn,\n message: issue.message,\n code: issue.code,\n });\n }\n\n return markers;\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 getReadModelStartColumn(firstLine: string, readModelName: string): number {\n const prefixMatch = firstLine.match(/^\\s*projection\\s+[\\w.]+\\s*=>\\s*/);\n if (!prefixMatch) {\n const fallbackIndex = firstLine.lastIndexOf(readModelName);\n return (fallbackIndex >= 0 ? fallbackIndex : 0) + 1;\n }\n return prefixMatch[0].length + 1;\n }\n\n private resolveReadModelIdentifier(readModelToken: string): string | null {\n if (this.isDraftReadModel(readModelToken)) {\n return this.draftReadModel!.identifier;\n }\n const readModel = this.resolveReadModelInfo(readModelToken);\n return readModel?.identifier ?? null;\n }\n\n private isDraftReadModel(readModelToken: string): boolean {\n return !!this.draftReadModel && (this.draftReadModel.identifier === readModelToken || this.draftReadModel.displayName === readModelToken);\n }\n\n private isBuiltInExpression(text: string): boolean {\n return text.startsWith('$') || ['true', 'false', 'null'].includes(text);\n }\n\n private createError(line: number, startCol: number, endCol: number, message: string): editor.IMarkerData {\n return {\n severity: 8, // Error\n startLineNumber: line,\n startColumn: startCol,\n endLineNumber: line,\n endColumn: endCol,\n message,\n };\n }\n\n private createWarning(line: number, startCol: number, endCol: number, message: string): editor.IMarkerData {\n return {\n severity: 4, // Warning\n startLineNumber: line,\n startColumn: startCol,\n endLineNumber: line,\n endColumn: endCol,\n message,\n };\n }\n\n private createInfo(line: number, startCol: number, endCol: number, message: string): editor.IMarkerData {\n return {\n severity: 2, // Info (hint) - shows as blue/green squiggly\n startLineNumber: line,\n startColumn: startCol,\n endLineNumber: line,\n endColumn: endCol,\n message,\n };\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"],"mappings":"A,0KAQA,IAAa,UAAb,KAAuB,CACnB,WAAsC,CAAC,EACvC,aAAmD,CAAC,EACpD,eAAoD,KAEpD,cAAc,EAAmC,CAC7C,KAAK,WAAaA,GAAc,CAAC,CACrC,CAEA,kBAAkB,EAAwC,CACtD,KAAK,eAAiBC,CAC1B,CAGA,oBAAoB,EAA6B,CAC7C,KAAK,WAAaC,EAAQ,IAAI,IAAW,CACrC,WAAY,KAAK,cAAcC,CAAM,GAAK,GAC1C,YAAa,KAAK,cAAcA,CAAM,GAAK,GAC3C,QACJ,EAAE,CACN,CAEA,gBAAgB,EAA0D,CACtE,GAAI,CAACD,EACD,KAAK,aAAe,CAAC,OAIzB,GAAI,MAAM,QAAQA,CAAO,EAAG,CACxB,IAAME,EAAkC,CAAC,EACzCF,EAAQ,SAAS,EAAG,IAAM,CACtB,GAAI,CAACG,EAAG,OACR,IAAMC,EAAO,KAAK,cAAcD,CAAC,GAAK,QAAQE,EAAI,IAClD,EAAID,GAAQD,CAChB,CAAC,EACD,KAAK,aAAeD,CAExB,KAEA,MAAK,aAAeF,CACxB,CAEA,SAAS,EAAgD,CACrD,IAAMM,EAAgC,CAAC,EACjCC,EAAUC,EAAM,SAAS,EAI/B,GAAI,CAACD,EAAQ,KAAK,EACd,OAAOD,EAIX,IAAMG,EAAQF,EAAQ,QAAQ,QAAS;CAAI,CAAC,CAAC,QAAQ,MAAO;CAAI,CAAC,CAAC,MAAM;CAAI,EAGxEG,EAAyB,EACzBC,EAAY,GAChB,IAAK,IAAIN,EAAI,EAAGA,EAAII,EAAM,OAAQ,IAAK,CACnC,IAAMG,EAAUH,EAAMJ,EAAE,CAAC,KAAK,EAC9B,GAAIO,GAAW,CAACA,EAAQ,WAAW,GAAG,EAAG,CACrC,EAAyBP,EACzB,EAAYO,EACZ,KACJ,CACJ,CAEA,GAAI,CAACD,EAGD,OAAOL,EAKX,IAAMO,EAA+BF,EAAU,MAAM,4CAA4C,EAC3FG,EAAuB,CAACD,GAAgCF,EAAU,MAAM,4BAA4B,EAE1G,GAAI,CAACE,GAAgC,CAACC,EAAsB,CACxD,IAAMC,EAAaL,EAAyB,EAE5C,OADAJ,EAAQ,KAAK,KAAK,YAAYS,EAAY,EAAGJ,EAAU,OAAS,EAAG,+HAA+H,CAAC,EAC5LL,CACX,CAEA,IAAIU,EACAC,EAA+B,KAEnC,GAAIJ,EAA8B,CAC9B,EAAgBA,EAA6B,GAG7C,IAAMK,EAAkB,KAAK,2BAA2BD,CAAa,IAAM,KACrEE,EAAmB,KAAK,iBAAiBF,CAAa,EACtDG,EAAuB,KAAK,wBAAwBT,EAAWM,CAAa,EAElF,GAAI,CAACC,GAAmB,CAACC,EAAkB,CACvC,IAAMJ,EAAaL,EAAyB,EACtCW,EAAMD,EACZd,EAAQ,KAAK,KAAK,YAAYS,EAAYM,EAAKA,EAAMJ,EAAc,OAAQ,eAAeA,EAAc,YAAY,CAAC,CACzH,MAAO,GAAIE,EAAkB,CAEzB,IAAMJ,EAAaL,EAAyB,EACtCW,EAAMD,EACZd,EAAQ,KAAK,KAAK,WAAWS,EAAYM,EAAKA,EAAMJ,EAAc,OAAQ,eAAeA,EAAc,6BAA6B,CAAC,CACzI,CAGA,IAAMK,EAAU,KAAK,iBAAiBL,CAAa,EAC7CM,EAAkBD,EAAU,KAAO,KAAK,qBAAqBL,CAAa,EAChF,EAAeK,EAAU,KAAK,eAAgB,OAASC,GAAiB,MAC5E,CAIA,IAAMC,EAA6B,CAACR,CAAa,EAC3CS,EAAwB,CAAC,CAAC,EAC5BC,EAAa,EAKXC,EAA8C,iBAAC,IAAI,GAAK,EAE9D,IAAK,IAAItB,EAAI,EAAGA,EAAII,EAAM,OAAQ,IAAK,CACnC,IAAMM,EAAaV,EAAI,EACjBuB,EAAOnB,EAAMJ,GACbO,EAAUgB,EAAK,KAAK,EAE1B,GAAI,CAAChB,GAAWA,EAAQ,WAAW,GAAG,EAAG,SAGzC,IAAMiB,EAAgBD,EAAK,OAAO,IAAI,EAGtC,KAAOC,EAAgBH,GAAcD,EAAY,OAAS,GAAG,CACzD,IAAMK,EAAeL,EAAY,IAAI,EACjCK,IAAiB,IAAA,IAAaD,EAAgBC,IAC9CN,EAAa,IAAI,EACjBG,EAAkB,IAAI,EAE9B,CACA,EAAaE,EAGb,IAAME,EAAsBJ,EAAkBA,EAAkB,OAAS,GAGnEK,EAAYpB,EAAQ,MAAM,kBAAkB,EAClD,GAAIoB,EAAW,CACX,IAAMC,EAAYD,EAAU,GACtBX,EAAMO,EAAK,QAAQK,CAAS,EAAI,EAElC,OAAO,KAAK,KAAK,YAAY,CAAC,CAAC,OAAS,GAAK,CAAC,KAAK,aAAaA,IAChE3B,EAAQ,KAAK,KAAK,YAAYS,EAAYM,EAAKA,EAAMY,EAAU,OAAQ,eAAeA,EAAU,YAAY,CAAC,EAI7GF,EAAoB,IAAIE,CAAS,EACjC3B,EAAQ,KAAK,KAAK,YAAYS,EAAYM,EAAKA,EAAMY,EAAU,OAAQ,yBAAyBA,EAAU,oDAAoD,CAAC,EAE/JF,EAAoB,IAAIE,EAAW,CAAE,aAAY,KAAI,CAAC,CAE9D,CAIA,IAAMC,EAAetB,EAAQ,MAAM,yBAAyB,EAC5D,GAAIsB,EAAc,CACd,GAAM,EAAGC,GAAeD,EAClBb,EAAMO,EAAK,QAAQO,CAAW,EAAI,EAClCb,EAAU,KAAK,iBAAiBa,CAAW,EACzB,KAAK,2BAA2BA,CAAW,IAAM,MAEjD,CAACb,EACrBhB,EAAQ,KAAK,KAAK,YAAYS,EAAYM,EAAKA,EAAMc,EAAY,OAAQ,eAAeA,EAAY,YAAY,CAAC,EAC1Gb,GACPhB,EAAQ,KAAK,KAAK,WAAWS,EAAYM,EAAKA,EAAMc,EAAY,OAAQ,eAAeA,EAAY,6BAA6B,CAAC,EAGrI,IAAMC,EAAgBd,EAAU,KAAK,eAAgB,OAAS,KAAK,qBAAqBa,CAAW,CAAC,EAAE,OACtGX,EAAa,KAAKY,CAAc,EAChCX,EAAY,KAAKI,CAAa,EAC9BF,EAAkB,qBAAK,IAAI,GAAK,CACpC,CAIA,IAAMU,EAAgBzB,EAAQ,MAAM,yBAAyB,EAC7D,GAAIyB,EAAe,CACf,IAAMJ,EAAYI,EAAc,GAC1BhB,EAAMO,EAAK,QAAQK,CAAS,EAAI,EAElC,OAAO,KAAK,KAAK,YAAY,CAAC,CAAC,OAAS,GAAK,CAAC,KAAK,aAAaA,IAChE3B,EAAQ,KAAK,KAAK,YAAYS,EAAYM,EAAKA,EAAMY,EAAU,OAAQ,eAAeA,EAAU,YAAY,CAAC,EAG7GF,EAAoB,IAAIE,CAAS,EACjC3B,EAAQ,KAAK,KAAK,YAAYS,EAAYM,EAAKA,EAAMY,EAAU,OAAQ,yBAAyBA,EAAU,oDAAoD,CAAC,EAE/JF,EAAoB,IAAIE,EAAW,CAAE,aAAY,KAAI,CAAC,CAE9D,CAGA,IAAMK,EAAc1B,EAAQ,MAAM,oBAAoB,EACtD,GAAI0B,EAAa,CACb,IAAML,EAAYK,EAAY,GACxBjB,EAAMO,EAAK,QAAQK,CAAS,EAAI,EAElC,OAAO,KAAK,KAAK,YAAY,CAAC,CAAC,OAAS,GAAK,CAAC,KAAK,aAAaA,IAChE3B,EAAQ,KAAK,KAAK,YAAYS,EAAYM,EAAKA,EAAMY,EAAU,OAAQ,eAAeA,EAAU,YAAY,CAAC,EAI7GF,EAAoB,IAAIE,CAAS,EACjC3B,EAAQ,KAAK,KAAK,YAAYS,EAAYM,EAAKA,EAAMY,EAAU,OAAQ,yBAAyBA,EAAU,oDAAoD,CAAC,EAE/JF,EAAoB,IAAIE,EAAW,CAAE,aAAY,KAAI,CAAC,CAE9D,CAEA,IAAMM,EAAkB3B,EAAQ,MAAM,+CAA+C,EACrF,GAAI2B,EAAiB,CACjB,IAAMN,EAAYM,EAAgB,GAC5BlB,EAAMO,EAAK,QAAQK,CAAS,EAAI,EAElC,OAAO,KAAK,KAAK,YAAY,CAAC,CAAC,OAAS,GAAK,CAAC,KAAK,aAAaA,IAChE3B,EAAQ,KAAK,KAAK,YAAYS,EAAYM,EAAKA,EAAMY,EAAU,OAAQ,eAAeA,EAAU,YAAY,CAAC,EAI7GF,EAAoB,IAAIE,CAAS,EACjC3B,EAAQ,KAAK,KAAK,YAAYS,EAAYM,EAAKA,EAAMY,EAAU,OAAQ,yBAAyBA,EAAU,oDAAoD,CAAC,EAE/JF,EAAoB,IAAIE,EAAW,CAAE,aAAY,KAAI,CAAC,CAE9D,CAGA,IAAMO,EAAkB5B,EAAQ,MAAM,oBAAoB,EAC1D,GAAI4B,EAAiB,CACjB,IAAMC,EAAgBjB,EAAaA,EAAa,OAAS,GACzD,GAAIiB,GAAe,WAAY,CAC3B,GAAM,EAAGC,GAAgBF,EACzB,GAAI,CAACC,EAAc,WAAWC,GAAe,CACzC,IAAMrB,EAAMO,EAAK,QAAQc,CAAY,EAAI,EACnCC,EAAa,KAAK,cAAcF,CAAa,GAAK,iBACxDnC,EAAQ,KAAK,KAAK,cAAcS,EAAYM,EAAKA,EAAMqB,EAAa,OAAQ,aAAaA,EAAa,iBAAiBC,GAAY,CAAC,CACxI,CACJ,CACJ,CAGA,IAAMC,EAAiBhC,EAAQ,MAAM,yCAAyC,EAC9E,GAAIgC,EAAgB,CAChB,IAAMH,EAAgBjB,EAAaA,EAAa,OAAS,GACzD,GAAIiB,GAAe,WAAY,CAC3B,GAAM,EAAGC,GAAgBE,EACzB,GAAI,CAACH,EAAc,WAAWC,GAAe,CACzC,IAAMrB,EAAMO,EAAK,QAAQc,CAAY,EAAI,EACnCC,EAAa,KAAK,cAAcF,CAAa,GAAK,iBACxDnC,EAAQ,KAAK,KAAK,cAAcS,EAAYM,EAAKA,EAAMqB,EAAa,OAAQ,aAAaA,EAAa,iBAAiBC,GAAY,CAAC,CACxI,CACJ,CACJ,CAGA,IAAME,EAAcjC,EAAQ,MAAM,mCAAmC,EACrE,GAAIiC,EAAa,CACb,IAAMJ,EAAgBjB,EAAaA,EAAa,OAAS,GACzD,GAAIiB,GAAe,WAAY,CAC3B,GAAM,EAAGC,GAAgBG,EACzB,GAAI,CAACJ,EAAc,WAAWC,GAAe,CACzC,IAAMrB,EAAMO,EAAK,QAAQc,CAAY,EAAI,EACnCC,EAAa,KAAK,cAAcF,CAAa,GAAK,iBACxDnC,EAAQ,KAAK,KAAK,cAAcS,EAAYM,EAAKA,EAAMqB,EAAa,OAAQ,aAAaA,EAAa,iBAAiBC,GAAY,CAAC,CACxI,CACJ,CACJ,CAGA,IAAMG,EAAgBlC,EAAQ,MAAM,wCAAwC,EAC5E,GAAIkC,EAAe,CACf,IAAML,EAAgBjB,EAAaA,EAAa,OAAS,GACzD,GAAIiB,GAAe,WAAY,CAC3B,GAAM,EAAGC,GAAgBI,EACnBC,EAAON,EAAc,WAAWC,GACtC,GAAI,CAACK,EAAM,CACP,IAAM1B,EAAMO,EAAK,QAAQc,CAAY,EAAI,EACnCC,EAAa,KAAK,cAAcF,CAAa,GAAK,iBACxDnC,EAAQ,KAAK,KAAK,cAAcS,EAAYM,EAAKA,EAAMqB,EAAa,OAAQ,wBAAwBA,EAAa,iBAAiBC,GAAY,CAAC,CACnJ,MAAO,GAAII,EAAK,OAAS,SAAW,CAACA,EAAK,MAAO,CAC7C,IAAM1B,EAAMO,EAAK,QAAQc,CAAY,EAAI,EACzCpC,EAAQ,KAAK,KAAK,cAAcS,EAAYM,EAAKA,EAAMqB,EAAa,OAAQ,aAAaA,EAAa,mCAAmC,CAAC,CAC9I,KAAO,CAEH,IAAMM,EAAcD,EAAK,MACrBC,IACAxB,EAAa,KAAKwB,CAAW,EAC7BvB,EAAY,KAAKI,CAAa,EAE9BF,EAAkB,qBAAK,IAAI,GAAK,EAExC,CACJ,CACJ,CAGA,IAAMsB,EAAYrC,EAAQ,MAAM,4BAA4B,EAC5D,GAAIqC,GAAajC,GAAc,WAAY,CACvC,GAAM,EAAGkC,EAAgBC,GAAgBF,EACnCG,EAAiBpC,EAAa,WAAWkC,GAC/C,GAAI,CAACE,EAAgB,CACjB,IAAM/B,EAAMO,EAAK,QAAQsB,CAAc,EAAI,EAC3C5C,EAAQ,KAAK,KAAK,cAAcS,EAAYM,EAAKA,EAAM6B,EAAe,OAAQ,wBAAwBA,EAAe,6BAA6BjC,EAAc,EAAE,CAAC,CACvK,MAAO,GAAImC,EAAe,OAAS,SAAW,CAACA,EAAe,MAAO,CACjE,IAAM/B,EAAMO,EAAK,QAAQsB,CAAc,EAAI,EAC3C5C,EAAQ,KAAK,KAAK,cAAcS,EAAYM,EAAKA,EAAM6B,EAAe,OAAQ,aAAaA,EAAe,mCAAmC,CAAC,CAClJ,CAEA,GAAI,CAAClC,EAAa,WAAWmC,GAAe,CACxC,IAAM9B,EAAMO,EAAK,QAAQuB,EAAcvB,EAAK,QAAQ,IAAI,CAAC,EAAI,EAC7DtB,EAAQ,KAAK,KAAK,cAAcS,EAAYM,EAAKA,EAAM8B,EAAa,OAAQ,aAAaA,EAAa,6BAA6BlC,EAAc,EAAE,CAAC,CACxJ,CAGAU,EAAkB,qBAAK,IAAI,GAAK,EAChCF,EAAY,KAAKI,CAAa,CAClC,CAGA,IAAMwB,EAAWzC,EAAQ,MAAM,kBAAkB,EACjD,GAAIyC,GAAYrC,EAAc,CAC1B,GAAM,EAAGsC,GAAWD,EAEdE,EAAkBvC,EAAa,aAAeA,EAAa,YAAYsC,GACvEE,EAAaxC,EAAa,YAAcA,EAAa,WAAWsC,GAEtE,GAAI,CAACC,GAAmB,CAACC,GAAc,CAAC,KAAK,oBAAoBF,CAAO,EAAG,CACvE,IAAMjC,EAAMO,EAAK,QAAQ0B,CAAO,EAAI,EACpChD,EAAQ,KAAK,KAAK,cAAcS,EAAYM,EAAKA,EAAMiC,EAAQ,OAAQ,uBAAuBA,EAAQ,iCAAiC,CAAC,CAC5I,CACJ,CACJ,CAGA,IAAK,IAAMG,KAASC,EAA0BjD,EAAOkD,EAASlD,CAAK,CAAC,EAChEH,EAAQ,KAAK,CACT,SAAUmD,EAAM,WAAa,QAAU,EAAI,EAC3C,gBAAiBA,EAAM,KAAO,EAC9B,cAAeA,EAAM,KAAO,EAC5B,YAAaA,EAAM,YACnB,UAAWA,EAAM,UACjB,QAASA,EAAM,QACf,KAAMA,EAAM,IAChB,CAAC,EAGL,OAAOnD,CACX,CAEA,qBAA6B,EAA8C,CACvE,OAAO,KAAK,WAAW,KAAK,GAAMsD,EAAG,aAAeC,GAAkBD,EAAG,cAAgBC,CAAc,GAAK,IAChH,CAEA,wBAAgC,EAAmB,EAA+B,CAC9E,IAAMC,EAAcnD,EAAU,MAAM,iCAAiC,EACrE,GAAI,CAACmD,EAAa,CACd,IAAMC,EAAgBpD,EAAU,YAAYM,CAAa,EACzD,OAAQ8C,GAAiB,EAAIA,EAAgB,GAAK,CACtD,CACA,OAAOD,EAAY,EAAE,CAAC,OAAS,CACnC,CAEA,2BAAmC,EAAuC,CAKtE,OAJI,KAAK,iBAAiBD,CAAc,EAC7B,KAAK,eAAgB,WAEd,KAAK,qBAAqBA,CAC7B,CAAC,EAAE,YAAc,IACpC,CAEA,iBAAyB,EAAiC,CACtD,MAAO,CAAC,CAAC,KAAK,iBAAmB,KAAK,eAAe,aAAeA,GAAkB,KAAK,eAAe,cAAgBA,EAC9H,CAEA,oBAA4B,EAAuB,CAC/C,OAAOG,EAAK,WAAW,GAAG,GAAK,CAAC,OAAQ,QAAS,MAAM,CAAC,CAAC,SAASA,CAAI,CAC1E,CAEA,YAAoB,EAAc,EAAkB,EAAgB,EAAqC,CACrG,MAAO,CACH,SAAU,EACV,gBAAiBpC,EACjB,YAAaqC,EACb,cAAerC,EACf,UAAWsC,EACX,SACJ,CACJ,CAEA,cAAsB,EAAc,EAAkB,EAAgB,EAAqC,CACvG,MAAO,CACH,SAAU,EACV,gBAAiBtC,EACjB,YAAaqC,EACb,cAAerC,EACf,UAAWsC,EACX,SACJ,CACJ,CAEA,WAAmB,EAAc,EAAkB,EAAgB,EAAqC,CACpG,MAAO,CACH,SAAU,EACV,gBAAiBtC,EACjB,YAAaqC,EACb,cAAerC,EACf,UAAWsC,EACX,SACJ,CACJ,CAEA,cAAsB,EAAwC,CAC1D,GAAIjE,EAAO,KAAM,OAAOA,EAAO,KAC/B,GAAIA,EAAO,MAAO,OAAOA,EAAO,MAChC,GAAI,OAAOA,EAAO,KAAQ,SAAU,CAChC,IAAMkE,EAAQlE,EAAO,IAAI,MAAM,GAAG,EAClC,OAAOkE,EAAMA,EAAM,OAAS,IAAMlE,EAAO,GAC7C,CAEJ,CACJ,E"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["validator","completionProvider","hoverProvider","codeActionProvider","disposables","monacoInstance","isRegistered","pendingCreateReadModelCallback","pendingEditReadModelCallback","monaco","configuration","monarchLanguage","Validator","CompletionProvider","HoverProvider","CodeActionProvider","readModelName","currentSchema","model","disposable","schema","readModels","callback","draft","input","out","s","name","i","normalized","eventSchemas","sequences","markers","languageId"],"sources":["../../../../sub-languages/projection/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 * as Monaco from 'monaco-editor';\nimport { configuration, languageId, monarchLanguage } from './language';\nimport { CompletionProvider } from './CompletionProvider';\nimport { Validator } from './Validator';\nimport { HoverProvider } from './HoverProvider';\nimport { CodeActionProvider } from './CodeActionProvider';\n\nexport interface JsonSchema {\n title?: string;\n name?: string;\n $id?: string;\n $ref?: string;\n type?: string;\n format?: string;\n description?: string;\n properties?: Record<string, JsonSchemaProperty>;\n items?: JsonSchema;\n required?: string[];\n definitions?: Record<string, JsonSchema>;\n}\n\nexport interface JsonSchemaProperty {\n id?: string;\n name?: string;\n type?: string;\n format?: string;\n description?: string;\n items?: JsonSchema;\n properties?: Record<string, JsonSchemaProperty>;\n required?: boolean;\n $ref?: string;\n}\n\nexport interface ReadModelInfo {\n identifier: string;\n displayName: string;\n schema: JsonSchema;\n}\n\n// Kept as its own type (rather than duplicated inline in the validator and code action\n// provider, as the Chronicle original had it) since both consume the exact same shape.\nexport interface DraftReadModelInfo {\n identifier: string;\n displayName: string;\n containerName: string;\n schema: JsonSchema;\n}\n\nlet validator: Validator | undefined;\nlet completionProvider: CompletionProvider | undefined;\nlet hoverProvider: HoverProvider | undefined;\nlet codeActionProvider: CodeActionProvider | undefined;\nlet disposables: Monaco.IDisposable[] = [];\nlet monacoInstance: typeof Monaco | null = null;\nlet isRegistered = false;\nlet pendingCreateReadModelCallback: ((readModelName: string) => void) | null = null;\nlet pendingEditReadModelCallback: ((readModelName: string, currentSchema: JsonSchema) => void) | null = null;\n\nexport function registerProjectionLanguage(monaco: typeof Monaco): { dispose(): void } {\n if (!isRegistered) {\n isRegistered = true;\n monacoInstance = monaco;\n\n monaco.languages.register({ id: languageId });\n monaco.languages.setLanguageConfiguration(languageId, configuration);\n monaco.languages.setMonarchTokensProvider(languageId, monarchLanguage);\n\n validator = new Validator();\n completionProvider = new CompletionProvider();\n hoverProvider = new HoverProvider();\n codeActionProvider = new CodeActionProvider();\n\n // Apply pending callbacks if they were set before initialization\n if (pendingCreateReadModelCallback) {\n codeActionProvider.setCreateReadModelCallback(pendingCreateReadModelCallback);\n pendingCreateReadModelCallback = null;\n }\n if (pendingEditReadModelCallback) {\n codeActionProvider.setEditReadModelCallback(pendingEditReadModelCallback);\n pendingEditReadModelCallback = null;\n }\n\n // Register completion provider with helpful trigger characters\n disposables.push(monaco.languages.registerCompletionItemProvider(languageId, {\n provideCompletionItems: completionProvider.provideCompletionItems.bind(completionProvider),\n triggerCharacters: ['.', ' ', '=', '\\n', '$'],\n }));\n\n // Register hover provider\n disposables.push(monaco.languages.registerHoverProvider(languageId, {\n provideHover: hoverProvider.provideHover.bind(hoverProvider),\n }));\n\n // Register code action provider\n disposables.push(monaco.languages.registerCodeActionProvider(languageId, {\n provideCodeActions: codeActionProvider.provideCodeActions.bind(codeActionProvider),\n }, {\n providedCodeActionKinds: ['quickfix']\n }));\n\n // Register command for creating read models\n disposables.push(monaco.editor.registerCommand('pdl.createReadModel', (_accessor: unknown, readModelName: string) => {\n codeActionProvider?.invokeCreateReadModel(readModelName);\n }));\n\n // Register command for editing read models\n disposables.push(monaco.editor.registerCommand('pdl.editReadModel', (_accessor: unknown, readModelName: string, currentSchema: JsonSchema) => {\n codeActionProvider?.invokeEditReadModel(readModelName, currentSchema);\n }));\n\n // Register validation on model change\n disposables.push(monaco.editor.onDidCreateModel((model: Monaco.editor.ITextModel) => {\n if (model.getLanguageId() === languageId) {\n validateModel(monaco, model);\n disposables.push(model.onDidChangeContent(() => validateModel(monaco, model)));\n }\n }));\n\n // Validate existing models\n monaco.editor.getModels().forEach((model: Monaco.editor.ITextModel) => {\n if (model.getLanguageId() === languageId) {\n validateModel(monaco, model);\n }\n });\n }\n\n return { dispose };\n}\n\nfunction dispose(): void {\n disposables.forEach((disposable) => disposable.dispose());\n disposables = [];\n isRegistered = false;\n monacoInstance = null;\n}\n\nexport function setReadModelSchema(schema: JsonSchema): void {\n // Backwards compatible single-schema setter\n validator?.setReadModelSchemas([schema]);\n completionProvider?.setReadModelSchemas([schema]);\n}\n\nexport function setReadModelSchemas(readModels: ReadModelInfo[]): void {\n validator?.setReadModels(readModels);\n completionProvider?.setReadModels(readModels);\n hoverProvider?.setReadModels(readModels);\n codeActionProvider?.setReadModels(readModels);\n revalidateAllModels();\n}\n\nexport function setCreateReadModelCallback(callback: (readModelName: string) => void): void {\n if (codeActionProvider) {\n codeActionProvider.setCreateReadModelCallback(callback);\n } else {\n // Store callback for later when the provider is initialized\n pendingCreateReadModelCallback = callback;\n }\n}\n\nexport function setEditReadModelCallback(callback: (readModelName: string, currentSchema: JsonSchema) => void): void {\n if (codeActionProvider) {\n codeActionProvider.setEditReadModelCallback(callback);\n } else {\n // Store callback for later when the provider is initialized\n pendingEditReadModelCallback = callback;\n }\n}\n\nexport function setDraftReadModel(draft: DraftReadModelInfo | null): void {\n codeActionProvider?.setDraftReadModel(draft);\n validator?.setDraftReadModel(draft);\n hoverProvider?.setDraftReadModel(draft);\n revalidateAllModels();\n}\n\nexport function setEventSchemas(eventSchemas: JsonSchema[] | Record<string, JsonSchema>): void {\n // Normalize either an array of schemas or a keyed record into a record keyed by derived schema name\n const normalize = (input: JsonSchema[] | Record<string, JsonSchema>): Record<string, JsonSchema> => {\n if (!input) return {};\n if (Array.isArray(input)) {\n const out: Record<string, JsonSchema> = {};\n input.forEach((s, i) => {\n if (!s) return;\n const name = s.title || s.name || (typeof s.$id === 'string' ? s.$id.split('/').pop() : undefined) || `Event${i + 1}`;\n out[name] = s;\n });\n return out;\n }\n return input;\n };\n\n const normalized = normalize(eventSchemas);\n validator?.setEventSchemas(normalized);\n completionProvider?.setEventSchemas(normalized);\n hoverProvider?.setEventSchemas(normalized);\n revalidateAllModels();\n}\n\nexport function setEventSequences(sequences: string[]): void {\n completionProvider?.setEventSequences(sequences);\n}\n\nfunction validateModel(monaco: typeof Monaco, model: Monaco.editor.ITextModel): void {\n if (validator && !model.isDisposed()) {\n const markers = validator.validate(model);\n monaco.editor.setModelMarkers(model, 'pdl-validator', markers);\n }\n}\n\nfunction revalidateAllModels(): void {\n if (monacoInstance) {\n monacoInstance.editor.getModels().forEach((model: Monaco.editor.ITextModel) => {\n if (model.getLanguageId() === languageId) {\n validateModel(monacoInstance!, model);\n }\n });\n }\n}\n\nexport { languageId };\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["validator","completionProvider","hoverProvider","codeActionProvider","disposables","monacoInstance","isRegistered","pendingCreateReadModelCallback","pendingEditReadModelCallback","monaco","configuration","monarchLanguage","Validator","CompletionProvider","HoverProvider","CodeActionProvider","readModelName","currentSchema","model","disposable","schema","readModels","callback","draft","input","out","s","name","i","normalized","eventSchemas","sequences","markers","languageId"],"sources":["../../../../sub-languages/projection/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 * as Monaco from 'monaco-editor';\nimport { configuration, languageId, monarchLanguage } from './language';\nimport { CompletionProvider } from './CompletionProvider';\nimport { Validator } from './Validator';\nimport { HoverProvider } from './HoverProvider';\nimport { CodeActionProvider } from './CodeActionProvider';\n\nexport interface JsonSchema {\n title?: string;\n name?: string;\n $id?: string;\n $ref?: string;\n type?: string;\n format?: string;\n description?: string;\n properties?: Record<string, JsonSchemaProperty>;\n items?: JsonSchema;\n required?: string[];\n definitions?: Record<string, JsonSchema>;\n}\n\nexport interface JsonSchemaProperty {\n id?: string;\n name?: string;\n type?: string;\n format?: string;\n description?: string;\n items?: JsonSchema;\n properties?: Record<string, JsonSchemaProperty>;\n required?: boolean;\n $ref?: string;\n}\n\nexport interface ReadModelInfo {\n identifier: string;\n displayName: string;\n schema: JsonSchema;\n}\n\n// Kept as its own type (rather than duplicated inline in the validator and code action\n// provider, as the Chronicle original had it) since both consume the exact same shape.\nexport interface DraftReadModelInfo {\n identifier: string;\n displayName: string;\n containerName: string;\n schema: JsonSchema;\n}\n\nlet validator: Validator | undefined;\nlet completionProvider: CompletionProvider | undefined;\nlet hoverProvider: HoverProvider | undefined;\nlet codeActionProvider: CodeActionProvider | undefined;\nlet disposables: Monaco.IDisposable[] = [];\nlet monacoInstance: typeof Monaco | null = null;\nlet isRegistered = false;\nlet pendingCreateReadModelCallback: ((readModelName: string) => void) | null = null;\nlet pendingEditReadModelCallback: ((readModelName: string, currentSchema: JsonSchema) => void) | null = null;\n\nexport function registerProjectionLanguage(monaco: typeof Monaco): { dispose(): void } {\n if (!isRegistered) {\n isRegistered = true;\n monacoInstance = monaco;\n\n monaco.languages.register({ id: languageId });\n monaco.languages.setLanguageConfiguration(languageId, configuration);\n monaco.languages.setMonarchTokensProvider(languageId, monarchLanguage);\n\n validator = new Validator();\n completionProvider = new CompletionProvider();\n hoverProvider = new HoverProvider();\n codeActionProvider = new CodeActionProvider();\n\n // Apply pending callbacks if they were set before initialization\n if (pendingCreateReadModelCallback) {\n codeActionProvider.setCreateReadModelCallback(pendingCreateReadModelCallback);\n pendingCreateReadModelCallback = null;\n }\n if (pendingEditReadModelCallback) {\n codeActionProvider.setEditReadModelCallback(pendingEditReadModelCallback);\n pendingEditReadModelCallback = null;\n }\n\n // Register completion provider with helpful trigger characters\n disposables.push(monaco.languages.registerCompletionItemProvider(languageId, {\n provideCompletionItems: completionProvider.provideCompletionItems.bind(completionProvider),\n triggerCharacters: ['.', ' ', '=', '\\n', '$'],\n }));\n\n // Register hover provider\n disposables.push(monaco.languages.registerHoverProvider(languageId, {\n provideHover: hoverProvider.provideHover.bind(hoverProvider),\n }));\n\n // Register code action provider\n disposables.push(monaco.languages.registerCodeActionProvider(languageId, {\n provideCodeActions: codeActionProvider.provideCodeActions.bind(codeActionProvider),\n }, {\n providedCodeActionKinds: ['quickfix']\n }));\n\n // Register command for creating read models\n disposables.push(monaco.editor.registerCommand('pdl.createReadModel', (_accessor: unknown, readModelName: string) => {\n codeActionProvider?.invokeCreateReadModel(readModelName);\n }));\n\n // Register command for editing read models\n disposables.push(monaco.editor.registerCommand('pdl.editReadModel', (_accessor: unknown, readModelName: string, currentSchema: JsonSchema) => {\n codeActionProvider?.invokeEditReadModel(readModelName, currentSchema);\n }));\n\n // Register validation on model change\n disposables.push(monaco.editor.onDidCreateModel((model: Monaco.editor.ITextModel) => {\n if (model.getLanguageId() === languageId) {\n validateModel(monaco, model);\n disposables.push(model.onDidChangeContent(() => validateModel(monaco, model)));\n }\n }));\n\n // Validate existing models\n monaco.editor.getModels().forEach((model: Monaco.editor.ITextModel) => {\n if (model.getLanguageId() === languageId) {\n validateModel(monaco, model);\n }\n });\n }\n\n return { dispose };\n}\n\nfunction dispose(): void {\n disposables.forEach((disposable) => disposable.dispose());\n disposables = [];\n isRegistered = false;\n monacoInstance = null;\n}\n\nexport function setReadModelSchema(schema: JsonSchema): void {\n // Backwards compatible single-schema setter\n validator?.setReadModelSchemas([schema]);\n completionProvider?.setReadModelSchemas([schema]);\n}\n\nexport function setReadModelSchemas(readModels: ReadModelInfo[]): void {\n validator?.setReadModels(readModels);\n completionProvider?.setReadModels(readModels);\n hoverProvider?.setReadModels(readModels);\n codeActionProvider?.setReadModels(readModels);\n revalidateAllModels();\n}\n\nexport function setCreateReadModelCallback(callback: (readModelName: string) => void): void {\n if (codeActionProvider) {\n codeActionProvider.setCreateReadModelCallback(callback);\n } else {\n // Store callback for later when the provider is initialized\n pendingCreateReadModelCallback = callback;\n }\n}\n\nexport function setEditReadModelCallback(callback: (readModelName: string, currentSchema: JsonSchema) => void): void {\n if (codeActionProvider) {\n codeActionProvider.setEditReadModelCallback(callback);\n } else {\n // Store callback for later when the provider is initialized\n pendingEditReadModelCallback = callback;\n }\n}\n\nexport function setDraftReadModel(draft: DraftReadModelInfo | null): void {\n codeActionProvider?.setDraftReadModel(draft);\n validator?.setDraftReadModel(draft);\n hoverProvider?.setDraftReadModel(draft);\n revalidateAllModels();\n}\n\nexport function setEventSchemas(eventSchemas: JsonSchema[] | Record<string, JsonSchema>): void {\n // Normalize either an array of schemas or a keyed record into a record keyed by derived schema name\n const normalize = (input: JsonSchema[] | Record<string, JsonSchema>): Record<string, JsonSchema> => {\n if (!input) return {};\n if (Array.isArray(input)) {\n const out: Record<string, JsonSchema> = {};\n input.forEach((s, i) => {\n if (!s) return;\n const name = s.title || s.name || (typeof s.$id === 'string' ? s.$id.split('/').pop() : undefined) || `Event${i + 1}`;\n out[name] = s;\n });\n return out;\n }\n return input;\n };\n\n const normalized = normalize(eventSchemas);\n validator?.setEventSchemas(normalized);\n completionProvider?.setEventSchemas(normalized);\n hoverProvider?.setEventSchemas(normalized);\n revalidateAllModels();\n}\n\nexport function setEventSequences(sequences: string[]): void {\n completionProvider?.setEventSequences(sequences);\n}\n\nfunction validateModel(monaco: typeof Monaco, model: Monaco.editor.ITextModel): void {\n if (validator && !model.isDisposed()) {\n const markers = validator.validate(model);\n monaco.editor.setModelMarkers(model, 'pdl-validator', markers);\n }\n}\n\nfunction revalidateAllModels(): void {\n if (monacoInstance) {\n monacoInstance.editor.getModels().forEach((model: Monaco.editor.ITextModel) => {\n if (model.getLanguageId() === languageId) {\n validateModel(monacoInstance!, model);\n }\n });\n }\n}\n\nexport { languageId };\n"],"mappings":"A,gWAmDA,IAAIA,EACAC,EACAC,EACAC,EACAC,EAAoC,CAAC,EACrCC,EAAuC,KACvCC,EAAe,GACfC,EAA2E,KAC3EC,EAAoG,KAExG,SAAgB,2BAA2B,EAA4C,CAoEnF,OAnEKF,IACD,EAAe,GACf,EAAiBG,EAEjBA,EAAO,UAAU,SAAS,CAAE,GAAA,KAAe,CAAC,EAC5CA,EAAO,UAAU,yBAAA,MAAqCC,CAAa,EACnED,EAAO,UAAU,yBAAA,MAAqCE,CAAe,EAErE,EAAY,IAAIC,EAChB,EAAqB,IAAIC,EACzB,EAAgB,IAAIC,EACpB,EAAqB,IAAIC,EAGzB,AAEIR,KADAJ,EAAmB,2BAA2BI,CAA8B,EAC3C,MAErC,AAEIC,KADAL,EAAmB,yBAAyBK,CAA4B,EACzC,MAInCJ,EAAY,KAAKK,EAAO,UAAU,+BAAA,MAA2C,CACzE,uBAAwBR,EAAmB,uBAAuB,KAAKA,CAAkB,EACzF,kBAAmB,CAAC,IAAK,IAAK,IAAK;EAAM,GAAG,CAChD,CAAC,CAAC,EAGFG,EAAY,KAAKK,EAAO,UAAU,sBAAA,MAAkC,CAChE,aAAcP,EAAc,aAAa,KAAKA,CAAa,CAC/D,CAAC,CAAC,EAGFE,EAAY,KAAKK,EAAO,UAAU,2BAAA,MAAuC,CACrE,mBAAoBN,EAAmB,mBAAmB,KAAKA,CAAkB,CACrF,EAAG,CACC,wBAAyB,CAAC,UAAU,CACxC,CAAC,CAAC,EAGFC,EAAY,KAAKK,EAAO,OAAO,gBAAgB,uBAAwB,EAAoB,IAA0B,CACjHN,GAAoB,sBAAsBa,CAAa,CAC3D,CAAC,CAAC,EAGFZ,EAAY,KAAKK,EAAO,OAAO,gBAAgB,qBAAsB,EAAoB,EAAuB,IAA8B,CAC1IN,GAAoB,oBAAoBa,EAAeC,CAAa,CACxE,CAAC,CAAC,EAGFb,EAAY,KAAKK,EAAO,OAAO,iBAAkB,GAAoC,CAC7ES,EAAM,cAAc,IAAA,QACpB,cAAcT,EAAQS,CAAK,EAC3Bd,EAAY,KAAKc,EAAM,uBAAyB,cAAcT,EAAQS,CAAK,CAAC,CAAC,EAErF,CAAC,CAAC,EAGFT,EAAO,OAAO,UAAU,CAAC,CAAC,QAAS,GAAoC,CAC/DS,EAAM,cAAc,IAAA,OACpB,cAAcT,EAAQS,CAAK,CAEnC,CAAC,GAGE,CAAE,OAAQ,CACrB,CAEA,SAAS,SAAgB,CACrBd,EAAY,QAAS,GAAee,EAAW,QAAQ,CAAC,EACxD,EAAc,CAAC,EACf,EAAe,GACf,EAAiB,IACrB,CAEA,SAAgB,mBAAmB,EAA0B,CAEzDnB,GAAW,oBAAoB,CAACoB,CAAM,CAAC,EACvCnB,GAAoB,oBAAoB,CAACmB,CAAM,CAAC,CACpD,CAEA,SAAgB,oBAAoB,EAAmC,CACnEpB,GAAW,cAAcqB,CAAU,EACnCpB,GAAoB,cAAcoB,CAAU,EAC5CnB,GAAe,cAAcmB,CAAU,EACvClB,GAAoB,cAAckB,CAAU,EAC5C,oBAAoB,CACxB,CAEA,SAAgB,2BAA2B,EAAiD,CACpFlB,EACAA,EAAmB,2BAA2BmB,CAAQ,EAGtD,EAAiCA,CAEzC,CAEA,SAAgB,yBAAyB,EAA4E,CAC7GnB,EACAA,EAAmB,yBAAyBmB,CAAQ,EAGpD,EAA+BA,CAEvC,CAEA,SAAgB,kBAAkB,EAAwC,CACtEnB,GAAoB,kBAAkBoB,CAAK,EAC3CvB,GAAW,kBAAkBuB,CAAK,EAClCrB,GAAe,kBAAkBqB,CAAK,EACtC,oBAAoB,CACxB,CAEA,SAAgB,gBAAgB,EAA+D,CAE3F,IAAM,UAAa,GAAiF,CAChG,GAAI,CAACC,EAAO,MAAO,CAAC,EACpB,GAAI,MAAM,QAAQA,CAAK,EAAG,CACtB,IAAMC,EAAkC,CAAC,EAMzC,OALAD,EAAM,SAAS,EAAG,IAAM,CACpB,GAAI,CAACE,EAAG,OACR,IAAMC,EAAOD,EAAE,OAASA,EAAE,OAAS,OAAOA,EAAE,KAAQ,SAAWA,EAAE,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,EAAI,IAAA,KAAc,QAAQE,EAAI,IAClH,EAAID,GAAQD,CAChB,CAAC,EACMD,CACX,CACA,OAAOD,CACX,EAEMK,EAAa,UAAUC,CAAY,EACzC9B,GAAW,gBAAgB6B,CAAU,EACrC5B,GAAoB,gBAAgB4B,CAAU,EAC9C3B,GAAe,gBAAgB2B,CAAU,EACzC,oBAAoB,CACxB,CAEA,SAAgB,kBAAkB,EAA2B,CACzD5B,GAAoB,kBAAkB8B,CAAS,CACnD,CAEA,SAAS,cAAc,EAAuB,EAAuC,CACjF,GAAI/B,GAAa,CAACkB,EAAM,WAAW,EAAG,CAClC,IAAMc,EAAUhC,EAAU,SAASkB,CAAK,EACxCT,EAAO,OAAO,gBAAgBS,EAAO,gBAAiBc,CAAO,CACjE,CACJ,CAEA,SAAS,qBAA4B,CAC7B3B,GACAA,EAAe,OAAO,UAAU,CAAC,CAAC,QAAS,GAAoC,CACvEa,EAAM,cAAc,IAAA,OACpB,cAAcb,EAAiBa,CAAK,CAE5C,CAAC,CAET,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"language.js","names":["languageId","KEYWORDS","BUILTINS","OPERATORS","configuration","monarchLanguage"],"sources":["../../../../sub-languages/projection/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 const languageId = 'pdl';\n\n// Keywords for the Projection Declaration Language\nconst KEYWORDS = [\n 'projection',\n 'description',\n 'sequence',\n 'all',\n 'every',\n 'on',\n 'from',\n 'key',\n 'parent',\n 'join',\n 'automap',\n 'no',\n 'children',\n 'nested',\n 'identified',\n 'by',\n 'add',\n 'subtract',\n 'remove',\n 'via',\n 'with',\n 'default',\n 'increment',\n 'decrement',\n 'count',\n 'set',\n 'unset',\n 'clear',\n 'events',\n 'id',\n 'exclude',\n 'variant',\n 'enters',\n] as const;\n\n// Built-in expressions and functions\nconst BUILTINS = [\n '$eventSourceId',\n '$causedBy',\n '$eventContext',\n] as const;\n\n// Operators\nconst OPERATORS = ['=', '+=', '-=', '=>', '.'];\n\nexport const configuration: 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: /^.*(:|\\bon\\b|\\ball\\b|\\bevery\\b|\\bchildren\\b|\\bnested\\b|\\bparent\\b|\\bvariant\\b)\\s*$/,\n decreaseIndentPattern: /^.*\\}.*$/,\n },\n folding: {\n offSide: true,\n markers: {\n start: /^\\s*(projection|all|every|on|children|nested|parent|variant)/,\n end: /^\\s*$/,\n },\n },\n wordPattern: /@?[a-zA-Z_$][\\w$-]*/,\n};\n\nexport const monarchLanguage: languages.IMonarchLanguage = {\n defaultToken: '',\n tokenPostfix: '.pdl',\n\n keywords: KEYWORDS,\n builtins: BUILTINS,\n operators: OPERATORS,\n\n // Symbols\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 // Whitespace\n { include: '@whitespace' },\n\n // Template strings with ${...} interpolation\n [/`/, { token: 'string.template', next: '@templateString' }],\n\n // Escaped identifiers (@ prefix allows using keywords as identifiers)\n [/@[a-zA-Z_$][\\w$]*/, 'identifier.escape'],\n\n // Check for uppercase keywords (error case - keywords must be lowercase)\n [\n /[A-Z][a-zA-Z_$][\\w$]*/,\n {\n cases: {\n '@keywords': 'invalid',\n '@default': 'identifier',\n },\n },\n ],\n\n // Identifiers and keywords (lowercase only for keywords)\n [\n /[a-z_$][\\w$]*/,\n {\n cases: {\n '@keywords': 'keyword',\n '@builtins': 'variable.predefined',\n '@default': 'identifier',\n },\n },\n ],\n\n // Delimiters and operators\n [/[{}()[\\]]/, '@brackets'],\n [/=>/, 'operator.arrow'],\n [\n /@symbols/,\n {\n cases: {\n '@operators': 'operator',\n '@default': '',\n },\n },\n ],\n\n // Numbers\n [/\\d*\\.\\d+([eE][-+]?\\d+)?/, 'number.float'],\n [/0[xX][0-9a-fA-F]+/, 'number.hex'],\n [/\\d+/, 'number'],\n\n // Delimiter: after number because of .\\d floats\n [/[;,.]/, 'delimiter'],\n\n // Strings\n [/\"([^\"\\\\]|\\\\.)*$/, 'string.invalid'],\n [/\"/, { token: 'string.quote', next: '@string' }],\n ],\n\n whitespace: [\n [/[ \\t\\r\\n]+/, ''],\n [/#.*$/, 'comment'],\n ],\n\n // Template string state\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 // Template expression inside ${}\n templateExpression: [\n [/\\}/, { token: 'delimiter.bracket', next: '@pop' }],\n { include: '@root' },\n ],\n\n // Regular string state\n string: [\n [/[^\\\\\"]+/, 'string'],\n [/@escapes/, 'string.escape'],\n [/\\\\./, 'string.escape.invalid'],\n [/\"/, { token: 'string.quote', next: '@pop' }],\n ],\n },\n};\n"],"mappings":"AAKA,MAAaA,EAAa,MAGpBC,EAAW,sPAkCjB,EAGMC,EAAW,CACb,iBACA,YACA,eACJ,EAGMC,EAAY,CAAC,IAAK,KAAM,KAAM,KAAM,GAAG,EAEhCC,EAAiD,CAC1D,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,qFACvB,sBAAuB,UAC3B,EACA,QAAS,CACL,QAAS,GACT,QAAS,CACL,MAAO,+DACP,IAAK,OACT,CACJ,EACA,YAAa,qBACjB,EAEaC,EAA8C,CACvD,aAAc,GACd,aAAc,OAEd,SAAUJ,EACV,SAAUC,EACV,UAAWC,EAGX,QAAS,sBACT,QAAS,wEAET,UAAW,CACP,KAAM,CAEF,CAAE,QAAS,aAAc,EAGzB,CAAC,IAAK,CAAE,MAAO,kBAAmB,KAAM,iBAAkB,CAAC,EAG3D,CAAC,oBAAqB,mBAAmB,EAGzC,CACI,wBACA,CACI,MAAO,CACH,YAAa,UACb,WAAY,YAChB,CACJ,CACJ,EAGA,CACI,gBACA,CACI,MAAO,CACH,YAAa,UACb,YAAa,sBACb,WAAY,YAChB,CACJ,CACJ,EAGA,CAAC,YAAa,WAAW,EACzB,CAAC,KAAM,gBAAgB,EACvB,CACI,WACA,CACI,MAAO,CACH,aAAc,WACd,WAAY,EAChB,CACJ,CACJ,EAGA,CAAC,0BAA2B,cAAc,EAC1C,CAAC,oBAAqB,YAAY,EAClC,CAAC,MAAO,QAAQ,EAGhB,CAAC,QAAS,WAAW,EAGrB,CAAC,kBAAmB,gBAAgB,EACpC,CAAC,IAAK,CAAE,MAAO,eAAgB,KAAM,SAAU,CAAC,CACpD,EAEA,WAAY,CACR,CAAC,aAAc,EAAE,EACjB,CAAC,OAAQ,SAAS,CACtB,EAGA,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,EAGA,mBAAoB,CAChB,CAAC,KAAM,CAAE,MAAO,oBAAqB,KAAM,MAAO,CAAC,EACnD,CAAE,QAAS,OAAQ,CACvB,EAGA,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","configuration","monarchLanguage"],"sources":["../../../../sub-languages/projection/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 const languageId = 'pdl';\n\n// Keywords for the Projection Declaration Language\nconst KEYWORDS = [\n 'projection',\n 'description',\n 'sequence',\n 'all',\n 'every',\n 'on',\n 'from',\n 'key',\n 'parent',\n 'join',\n 'automap',\n 'no',\n 'children',\n 'nested',\n 'identified',\n 'by',\n 'add',\n 'subtract',\n 'remove',\n 'via',\n 'with',\n 'default',\n 'increment',\n 'decrement',\n 'count',\n 'set',\n 'unset',\n 'clear',\n 'events',\n 'id',\n 'exclude',\n 'variant',\n 'enters',\n] as const;\n\n// Built-in expressions and functions\nconst BUILTINS = [\n '$eventSourceId',\n '$causedBy',\n '$eventContext',\n] as const;\n\n// Operators\nconst OPERATORS = ['=', '+=', '-=', '=>', '.'];\n\nexport const configuration: 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: /^.*(:|\\bon\\b|\\ball\\b|\\bevery\\b|\\bchildren\\b|\\bnested\\b|\\bparent\\b|\\bvariant\\b)\\s*$/,\n decreaseIndentPattern: /^.*\\}.*$/,\n },\n folding: {\n offSide: true,\n markers: {\n start: /^\\s*(projection|all|every|on|children|nested|parent|variant)/,\n end: /^\\s*$/,\n },\n },\n wordPattern: /@?[a-zA-Z_$][\\w$-]*/,\n};\n\nexport const monarchLanguage: languages.IMonarchLanguage = {\n defaultToken: '',\n tokenPostfix: '.pdl',\n\n keywords: KEYWORDS,\n builtins: BUILTINS,\n operators: OPERATORS,\n\n // Symbols\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 // Whitespace\n { include: '@whitespace' },\n\n // Template strings with ${...} interpolation\n [/`/, { token: 'string.template', next: '@templateString' }],\n\n // Escaped identifiers (@ prefix allows using keywords as identifiers)\n [/@[a-zA-Z_$][\\w$]*/, 'identifier.escape'],\n\n // Check for uppercase keywords (error case - keywords must be lowercase)\n [\n /[A-Z][a-zA-Z_$][\\w$]*/,\n {\n cases: {\n '@keywords': 'invalid',\n '@default': 'identifier',\n },\n },\n ],\n\n // Identifiers and keywords (lowercase only for keywords)\n [\n /[a-z_$][\\w$]*/,\n {\n cases: {\n '@keywords': 'keyword',\n '@builtins': 'variable.predefined',\n '@default': 'identifier',\n },\n },\n ],\n\n // Delimiters and operators\n [/[{}()[\\]]/, '@brackets'],\n [/=>/, 'operator.arrow'],\n [\n /@symbols/,\n {\n cases: {\n '@operators': 'operator',\n '@default': '',\n },\n },\n ],\n\n // Numbers\n [/\\d*\\.\\d+([eE][-+]?\\d+)?/, 'number.float'],\n [/0[xX][0-9a-fA-F]+/, 'number.hex'],\n [/\\d+/, 'number'],\n\n // Delimiter: after number because of .\\d floats\n [/[;,.]/, 'delimiter'],\n\n // Strings\n [/\"([^\"\\\\]|\\\\.)*$/, 'string.invalid'],\n [/\"/, { token: 'string.quote', next: '@string' }],\n ],\n\n whitespace: [\n [/[ \\t\\r\\n]+/, ''],\n [/#.*$/, 'comment'],\n ],\n\n // Template string state\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 // Template expression inside ${}\n templateExpression: [\n [/\\}/, { token: 'delimiter.bracket', next: '@pop' }],\n { include: '@root' },\n ],\n\n // Regular string state\n string: [\n [/[^\\\\\"]+/, 'string'],\n [/@escapes/, 'string.escape'],\n [/\\\\./, 'string.escape.invalid'],\n [/\"/, { token: 'string.quote', next: '@pop' }],\n ],\n },\n};\n"],"mappings":"AAKA,MAAaA,EAAa,MAGpBC,EAAW,sPAkCjB,EAGMC,EAAW,CACb,iBACA,YACA,eACJ,EAGMC,EAAY,CAAC,IAAK,KAAM,KAAM,KAAM,GAAG,EAEhCC,EAAiD,CAC1D,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,qFACvB,sBAAuB,UAC3B,EACA,QAAS,CACL,QAAS,GACT,QAAS,CACL,MAAO,+DACP,IAAK,OACT,CACJ,EACA,YAAa,qBACjB,EAEaC,EAA8C,CACvD,aAAc,GACd,aAAc,OAEd,SAAUJ,EACV,SAAUC,EACV,UAAWC,EAGX,QAAS,sBACT,QAAS,wEAET,UAAW,CACP,KAAM,CAEF,CAAE,QAAS,aAAc,EAGzB,CAAC,IAAK,CAAE,MAAO,kBAAmB,KAAM,iBAAkB,CAAC,EAG3D,CAAC,oBAAqB,mBAAmB,EAGzC,CACI,wBACA,CACI,MAAO,CACH,YAAa,UACb,WAAY,YAChB,CACJ,CACJ,EAGA,CACI,gBACA,CACI,MAAO,CACH,YAAa,UACb,YAAa,sBACb,WAAY,YAChB,CACJ,CACJ,EAGA,CAAC,YAAa,WAAW,EACzB,CAAC,KAAM,gBAAgB,EACvB,CACI,WACA,CACI,MAAO,CACH,aAAc,WACd,WAAY,EAChB,CACJ,CACJ,EAGA,CAAC,0BAA2B,cAAc,EAC1C,CAAC,oBAAqB,YAAY,EAClC,CAAC,MAAO,QAAQ,EAGhB,CAAC,QAAS,WAAW,EAGrB,CAAC,kBAAmB,gBAAgB,EACpC,CAAC,IAAK,CAAE,MAAO,eAAgB,KAAM,SAAU,CAAC,CACpD,EAEA,WAAY,CACR,CAAC,aAAc,EAAE,EACjB,CAAC,OAAQ,SAAS,CACtB,EAGA,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,EAGA,mBAAoB,CAChB,CAAC,KAAM,CAAE,MAAO,oBAAqB,KAAM,MAAO,CAAC,EACnD,CAAE,QAAS,OAAQ,CACvB,EAGA,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,3 +1,3 @@
1
- import"./_virtual/_virtual/_rolldown/runtime.js";import{clauseKeywords as e}from"./language.js";import{bmpWordCharacters as t}from"./bmp-word-characters.js";import{typeReferenceSymbol as n}from"./TypeReferenceSymbol.js";import{unescapeString as r}from"./compiler/Text/StringLiteral.js";import{eventBodyReservedWords as i}from"./compiler/Text/ReservedWords.js";import"./compiler/index.js";import{fenceMap as a,indentOf as o}from"./document-context.js";import{eventAnalysisSource as s}from"./event-analysis-source.js";import{responseAnalysis as c}from"./response-analysis.js";import{fileReferenceOn as l}from"./file-references.js";const u=/^concept\s+(\w+)\s*:\s*(\w+)((?:\s+@?\w+)*)\s*$/,d=RegExp(`^@?([a-z_][${t}]*)(?:\\s*=\\s*(-?(?:0|[1-9][0-9]*)))?(?:\\s*//.*)?$`),f=/^\s*(@?[a-z_]\w*)\s+([\w.]+(?:\[\])?(?:\?|\s+optional)?)(\s+generated)?(\s+identifier)?(\s+subject)?\s*$/,p=/^([a-z_]\w*)\s+reason\s+"((?:[^"\\]|\\.)*)"\s*$/,m=/^\s*reads\s+([A-Z]\w*)(?:\s+as\s+([a-z_]\w*))?(?:\s+by\s+([a-z_]\w*))?\s*$/,h=[`authorize`,`produces`,`reads`],g=/^(?:(?:or|and)\s+)?[A-Za-z_(][\p{L}\p{Mn}\p{Nd}\p{Pc}\s()]*$/u,_=i,v=[`tag`,`for`,`generation`,`origin`,`namespace`,`sequence`,`correlation`,`causation`,`causedBy`,`occurred`],y=/^\s*(?:by|filter)\s+([a-z_]\w*)\s+([\w.]+(?:\[\])?(?:\?|\s+optional)?)(?:\s+from\s+.+)?\s*$/;function propertyTypeReference(e){return e.typeReference??n(e.type)}function sourceTypeAt(e,t){let n=e.slice(t-1).match(/^[\p{L}\p{Mn}\p{Nd}\p{Pc}.]+(?:\[\])?(?:\?|\s+optional\b)?/u)?.[0]??``;return{text:n,startColumn:t,endColumn:t+n.length}}function propertiesIn(e,t,r){return t.map(t=>({index:t,match:e[t].match(f)})).filter(e=>e.match!==null).filter(({match:e})=>e[1].startsWith(`@`)||e[1]===`as`||!r.includes(e[1])).map(({index:t,match:r})=>({name:r[1].replace(/^@/,``),type:r[2],typeReference:n(r[2]),sourceType:sourceTypeAt(e[t],e[t].match(/^\s*\S+\s+/)[0].length+1),isIdentifier:r[4]!==void 0,...r[3]===void 0?{}:{isGenerated:!0},...r[5]===void 0?{}:{isSubject:!0},line:t}))}function collectBody(e,t,n,r){let i=[];for(let a=n+1;a<e.length;a++){if(t[a])continue;let n=e[a];if(n.trim().length!==0){if(o(n)<=r)break;i.push(a)}}return i}function directBody(e,t,n,r){let i=collectBody(e,t,n,r).filter(n=>!t[n]&&!/^\s*(?:\/\/|#)/.test(e[n]));if(!/^\s*command\b/.test(e[n]))return i;let a,s=!1;return i.filter(t=>{let n=o(e[t]),r=e[t].trim();return a!==void 0&&n>a&&(!s||g.test(r))?!1:(a=r!==`validate csharp`&&propertiesIn(e,[t],h).length>0||/^description(?:\s|$)/.test(r)?void 0:n,s=/^authorize(?:\s|$)/.test(r),!0)})}const b=/* @__PURE__ */ new Map;function scanDocument(t){let i=t.join(`
2
- `),f=b.get(i);if(f)return f;let h=c(t),g={...h.identityDetails?.length?{identityDetails:h.identityDetails}:{},authoringSources:[i],eventSources:h.eventSources.declarations,imports:[],concepts:[],types:[],policies:[],events:[],commands:[],queries:[],screens:[],triggers:[]};t=s(t);let x=a(t),S=t,C=x,w=t.map(e=>e.replace(/\s*=(?!=|>).*/,``));for(let i=0;i<t.length;i++){if(x[i])continue;let a=t[i],s=a.trim(),c=o(a),f=S[i].trim().match(/^import\s+([\w.]+)(?:\s+from\s+"(?:[^"\\]|\\.)*")?\s*$/);if(f&&c===0){let e=f[1],t=e.split(`.`).pop()??e;g.imports.push({qualifiedName:e,shortName:t,line:i});continue}let b=s.match(u);if(b){let e=collectBody(t,x,i,c),n=e.map(e=>t[e].trim()),r=Math.min(...e.filter(e=>!x[e]&&t[e].trim()!==``).map(e=>o(t[e]))),a=e.find(e=>!x[e]&&o(t[e])===r&&/^\s*generate\s+\w+/.test(t[e])),s=a===void 0?void 0:t[a].match(/^\s*generate\s+(\w+)/)?.[1],l={};for(let e of n){let t=e.match(p);t&&l[t[1]]===void 0&&(l[t[1]]=t[2])}let u=b[2]===`Enum`?n.filter(e=>e!==`validate`).map(e=>d.exec(e)).filter(e=>e!==null):[],f=u.map(e=>e[1]),m=u.length>0&&u.every(e=>e[2]!==void 0)?u.map(e=>Number(e[2])):void 0;g.concepts.push({name:b[1],primitive:b[2],attributes:b[3].trim().split(/\s+/).filter(Boolean),attributeReasons:l,enumValues:f,...m===void 0?{}:{enumNumbers:m},...s===void 0?{}:{generationStrategy:s},line:i});continue}let T=s.match(/^type\s+(\w+)\s*$/);if(T){g.types.push({name:T[1],properties:propertiesIn(t,collectBody(t,x,i,c),e),line:i});continue}let E=s.match(/^policy\s+(\w+)\s*$/);if(E){let e=collectBody(t,x,i,c).filter(e=>!x[e]).map(e=>t[e].trim());g.policies.push({name:E[1],requires:e,line:i});continue}let D=S[i].trim().match(/^(?:(?:produces|(?<public>public))\s+)?event\s+(?<name>\w+)(?:\s+generation\s+(?<generation>\d+))?(?:\s+from\s+(?<origin>"(?:[^"\\]|\\.)*"))?\s*$/);if(D){let e=s.startsWith(`produces `),t=directBody(S,C,i,c),n=e?t:t.filter(e=>l(S[e],e)===void 0);g.events.push({name:D.groups.name,...D.groups.generation?{generation:Number(D.groups.generation)}:{},...D.groups.public||D.groups.origin?{visibility:`Public`}:{},...D.groups.origin?{origin:r(D.groups.origin.slice(1,-1))}:{},inline:e,properties:propertiesIn(e?w:S,n,e?v:_),line:i});continue}let O=h.commands.get(i);if(O){let e=directBody(t,x,i,c),n=e.filter(e=>/^\s*produces\b/.test(t[e])&&!h.operationProductionLines?.has(e));g.commands.push({name:O.name,properties:O.properties.map(e=>({name:e.name,type:`${e.type.name}${e.type.isCollection?`[]`:``}${e.type.isOptional?` optional`:``}`,typeReference:{name:e.type.name,isCollection:e.type.isCollection,isOptional:e.type.isOptional},sourceType:sourceTypeAt(t[e.type.location.line-1],e.type.location.column),isIdentifier:e.isIdentifier||/\sidentifier\s*$/.test(t[e.location.line-1]),...e.isGenerated?{isGenerated:!0}:{},line:e.location.line-1})),response:O.response,productionHeaders:n,produces:n.flatMap(e=>{let t=S[e].trim(),n=/^produces\s+event\b/.test(t),r=/^produces\s+when\b/.test(t),i=r?directBody(S,C,e,o(S[e]))[0]:e;if(i===void 0)return[];let a=r?S[i].trim():t.match(n?/^produces\s+event\s+([A-Za-z_]\w*)(?:\s+generation\s+\d+)?\s*$/:/^produces\s+([A-Z]\w*)\s*$/)?.[1];if(a===void 0||!/^[A-Za-z_]\w*$/.test(a))return[];let s=directBody(S,C,i,o(S[i])),c=s.map(e=>S[e].trim().match(/^for(?:\s+(.*))?$/)).filter(e=>e!==null);return[{name:a,inline:n,conditional:r,line:e,target:c.length===0?void 0:c.length===1?c[0][1]??``:``,mappings:s.flatMap(e=>{let t=S[e].trim().match(n?/^(@?[a-z_]\w*)\s+[\w.]+(?:\[\])?(?:\?|\s+optional)?\s*=(?!=|>)\s*(.+)$/:/^(@?[\w.]+)\s*=(?!=|>)\s*(.+)$/);return t===null?[]:[{name:t[1].replace(/^@/,``),source:t[2],line:e}]})}]}),reads:e.filter(e=>!x[e]).map(e=>({line:e,match:t[e].match(m)})).filter(e=>e.match!==null).map(({line:e,match:t})=>({view:t[1],...t[2]?{alias:t[2]}:{},...t[3]?{by:t[3]}:{},line:e})),line:i});continue}let k=s.match(/^query\s+(\w+)\s*=>\s*(?:observable\s+)?([\w.]+(?:\[\])?(?:\?|\s+optional)?)\s*$/);if(k){let e=collectBody(t,x,i,c).map(e=>({index:e,match:t[e].match(y)})).filter(e=>e.match!==null).map(({index:e,match:r})=>({name:r[1],type:r[2],typeReference:n(r[2]),sourceType:sourceTypeAt(t[e],t[e].match(/^\s*(?:by|filter)\s+\S+\s+/)[0].length+1),isIdentifier:!1,line:e}));g.queries.push({name:k[1],returnType:k[2],returnTypeReference:n(k[2]),parameters:e,line:i});continue}let A=s.match(/^screen\s+(\w+)\s*$/);if(A){g.screens.push({name:A[1],line:i});continue}let j=s.match(/^trigger\s+(\w+)\s*$/);j&&c===0&&g.triggers.push({name:j[1],line:i})}return b.size>=16&&b.delete(b.keys().next().value),b.set(i,g),g}function mergeSymbols(...e){return{...e.some(e=>e.identityDetails?.length)?{identityDetails:e.flatMap(e=>e.identityDetails??[])}:{},authoringSources:e.flatMap(e=>e.authoringSources??[]),...e.some(e=>e.authoringDocuments)?{authoringDocuments:e.flatMap(e=>e.authoringDocuments??[])}:{},eventSources:e.flatMap(e=>e.eventSources??[]),imports:e.flatMap(e=>e.imports),concepts:e.flatMap(e=>e.concepts),types:e.flatMap(e=>e.types),policies:e.flatMap(e=>e.policies),events:e.flatMap(e=>e.events),commands:e.flatMap(e=>e.commands),queries:e.flatMap(e=>e.queries),screens:e.flatMap(e=>e.screens),triggers:e.flatMap(e=>e.triggers)}}function symbolsForBuffer(e,t){let n=t?.authoringPath??`current.play`,r=t?.authoringDocuments?.find(e=>e.path===n);return{...mergeSymbols(scanDocument(e),t??mergeSymbols()),authoringDocuments:t?.authoringDocuments,authoringPath:n,authoringPlacement:t?.authoringPlacement??r?.placement,authoringPlacementResolved:t?.authoringPlacementResolved??r?.isPlacementResolved}}function knownEventNames(e){return[...e.events.map(e=>e.name),...e.imports.map(e=>e.shortName)]}const x=[`Startup`,`Shutdown`];function knownTriggerNames(e){return[...knownEventNames(e),...e.triggers.map(e=>e.name),...x]}function knownTypeNames(e,t){return[...t,...e.concepts.map(e=>e.name),...e.types.map(e=>e.name),...e.imports.map(e=>e.shortName)]}export{x as builtInTriggerNames,directBody,knownEventNames,knownTriggerNames,knownTypeNames,mergeSymbols,propertyTypeReference,scanDocument,symbolsForBuffer};
1
+ import"./_virtual/_virtual/_rolldown/runtime.js";import"./compiler/index.js";import{fenceMap as e,indentOf as t}from"./document-context.js";import{eventAnalysisSource as n}from"./event-analysis-source.js";import{unescapeString as r}from"./compiler/Text/StringLiteral.js";import{eventBodyReservedWords as i}from"./compiler/Text/ReservedWords.js";import{responseAnalysis as a}from"./response-analysis.js";import{fileReferenceOn as o}from"./file-references.js";import{clauseKeywords as s}from"./language.js";import{bmpWordCharacters as c}from"./bmp-word-characters.js";import{typeReferenceSymbol as l}from"./TypeReferenceSymbol.js";const u=/^concept\s+(\w+)\s*:\s*(\w+)((?:\s+@?\w+)*)\s*$/,d=RegExp(`^@?([a-z_][${c}]*)(?:\\s*=\\s*(-?(?:0|[1-9][0-9]*)))?(?:\\s*//.*)?$`),f=/^\s*(@?[a-z_]\w*)\s+([\w.]+(?:\[\])?(?:\?|\s+optional)?)(\s+generated)?(\s+identifier)?(\s+subject)?\s*$/,p=/^([a-z_]\w*)\s+reason\s+"((?:[^"\\]|\\.)*)"\s*$/,m=/^\s*reads\s+([A-Z]\w*)(?:\s+as\s+([a-z_]\w*))?(?:\s+by\s+([a-z_]\w*))?\s*$/,h=[`authorize`,`produces`,`reads`],g=/^(?:(?:or|and)\s+)?[A-Za-z_(][\p{L}\p{Mn}\p{Nd}\p{Pc}\s()]*$/u,_=i,v=[`tag`,`for`,`generation`,`origin`,`namespace`,`sequence`,`correlation`,`causation`,`causedBy`,`occurred`],y=/^\s*(?:by|filter)\s+([a-z_]\w*)\s+([\w.]+(?:\[\])?(?:\?|\s+optional)?)(?:\s+from\s+.+)?\s*$/;function propertyTypeReference(e){return e.typeReference??l(e.type)}function sourceTypeAt(e,t){let n=e.slice(t-1).match(/^[\p{L}\p{Mn}\p{Nd}\p{Pc}.]+(?:\[\])?(?:\?|\s+optional\b)?/u)?.[0]??``;return{text:n,startColumn:t,endColumn:t+n.length}}function propertiesIn(e,t,n){return t.map(t=>({index:t,match:e[t].match(f)})).filter(e=>e.match!==null).filter(({match:e})=>e[1].startsWith(`@`)||e[1]===`as`||!n.includes(e[1])).map(({index:t,match:n})=>({name:n[1].replace(/^@/,``),type:n[2],typeReference:l(n[2]),sourceType:sourceTypeAt(e[t],e[t].match(/^\s*\S+\s+/)[0].length+1),isIdentifier:n[4]!==void 0,...n[3]===void 0?{}:{isGenerated:!0},...n[5]===void 0?{}:{isSubject:!0},line:t}))}function collectBody(e,n,r,i){let a=[];for(let o=r+1;o<e.length;o++){if(n[o])continue;let r=e[o];if(r.trim().length!==0){if(t(r)<=i)break;a.push(o)}}return a}function directBody(e,n,r,i){let a=collectBody(e,n,r,i).filter(t=>!n[t]&&!/^\s*(?:\/\/|#)/.test(e[t]));if(!/^\s*command\b/.test(e[r]))return a;let o,s=!1;return a.filter(n=>{let r=t(e[n]),i=e[n].trim();return o!==void 0&&r>o&&(!s||g.test(i))?!1:(o=i!==`validate csharp`&&propertiesIn(e,[n],h).length>0||/^description(?:\s|$)/.test(i)?void 0:r,s=/^authorize(?:\s|$)/.test(i),!0)})}const b=/* @__PURE__ */ new Map;function scanDocument(i){let c=i.join(`
2
+ `),f=b.get(c);if(f)return f;let h=a(i),g={...h.identityDetails?.length?{identityDetails:h.identityDetails}:{},authoringSources:[c],eventSources:h.eventSources.declarations,imports:[],concepts:[],types:[],policies:[],events:[],commands:[],queries:[],screens:[],triggers:[]};i=n(i);let x=e(i),S=i,C=x,w=i.map(e=>e.replace(/\s*=(?!=|>).*/,``));for(let e=0;e<i.length;e++){if(x[e])continue;let n=i[e],a=n.trim(),c=t(n),f=S[e].trim().match(/^import\s+([\w.]+)(?:\s+from\s+"(?:[^"\\]|\\.)*")?\s*$/);if(f&&c===0){let t=f[1],n=t.split(`.`).pop()??t;g.imports.push({qualifiedName:t,shortName:n,line:e});continue}let b=a.match(u);if(b){let n=collectBody(i,x,e,c),r=n.map(e=>i[e].trim()),a=Math.min(...n.filter(e=>!x[e]&&i[e].trim()!==``).map(e=>t(i[e]))),o=n.find(e=>!x[e]&&t(i[e])===a&&/^\s*generate\s+\w+/.test(i[e])),s=o===void 0?void 0:i[o].match(/^\s*generate\s+(\w+)/)?.[1],l={};for(let e of r){let t=e.match(p);t&&l[t[1]]===void 0&&(l[t[1]]=t[2])}let u=b[2]===`Enum`?r.filter(e=>e!==`validate`).map(e=>d.exec(e)).filter(e=>e!==null):[],f=u.map(e=>e[1]),m=u.length>0&&u.every(e=>e[2]!==void 0)?u.map(e=>Number(e[2])):void 0;g.concepts.push({name:b[1],primitive:b[2],attributes:b[3].trim().split(/\s+/).filter(Boolean),attributeReasons:l,enumValues:f,...m===void 0?{}:{enumNumbers:m},...s===void 0?{}:{generationStrategy:s},line:e});continue}let T=a.match(/^type\s+(\w+)\s*$/);if(T){g.types.push({name:T[1],properties:propertiesIn(i,collectBody(i,x,e,c),s),line:e});continue}let E=a.match(/^policy\s+(\w+)\s*$/);if(E){let t=collectBody(i,x,e,c).filter(e=>!x[e]).map(e=>i[e].trim());g.policies.push({name:E[1],requires:t,line:e});continue}let D=S[e].trim().match(/^(?:(?:produces|(?<public>public))\s+)?event\s+(?<name>\w+)(?:\s+generation\s+(?<generation>\d+))?(?:\s+from\s+(?<origin>"(?:[^"\\]|\\.)*"))?\s*$/);if(D){let t=a.startsWith(`produces `),n=directBody(S,C,e,c),i=t?n:n.filter(e=>o(S[e],e)===void 0);g.events.push({name:D.groups.name,...D.groups.generation?{generation:Number(D.groups.generation)}:{},...D.groups.public||D.groups.origin?{visibility:`Public`}:{},...D.groups.origin?{origin:r(D.groups.origin.slice(1,-1))}:{},inline:t,properties:propertiesIn(t?w:S,i,t?v:_),line:e});continue}let O=h.commands.get(e);if(O){let n=directBody(i,x,e,c),r=n.filter(e=>/^\s*produces\b/.test(i[e])&&!h.operationProductionLines?.has(e));g.commands.push({name:O.name,properties:O.properties.map(e=>({name:e.name,type:`${e.type.name}${e.type.isCollection?`[]`:``}${e.type.isOptional?` optional`:``}`,typeReference:{name:e.type.name,isCollection:e.type.isCollection,isOptional:e.type.isOptional},sourceType:sourceTypeAt(i[e.type.location.line-1],e.type.location.column),isIdentifier:e.isIdentifier||/\sidentifier\s*$/.test(i[e.location.line-1]),...e.isGenerated?{isGenerated:!0}:{},line:e.location.line-1})),response:O.response,productionHeaders:r,produces:r.flatMap(e=>{let n=S[e].trim(),r=/^produces\s+event\b/.test(n),i=/^produces\s+when\b/.test(n),a=i?directBody(S,C,e,t(S[e]))[0]:e;if(a===void 0)return[];let o=i?S[a].trim():n.match(r?/^produces\s+event\s+([A-Za-z_]\w*)(?:\s+generation\s+\d+)?\s*$/:/^produces\s+([A-Z]\w*)\s*$/)?.[1];if(o===void 0||!/^[A-Za-z_]\w*$/.test(o))return[];let s=directBody(S,C,a,t(S[a])),c=s.map(e=>S[e].trim().match(/^for(?:\s+(.*))?$/)).filter(e=>e!==null);return[{name:o,inline:r,conditional:i,line:e,target:c.length===0?void 0:c.length===1?c[0][1]??``:``,mappings:s.flatMap(e=>{let t=S[e].trim().match(r?/^(@?[a-z_]\w*)\s+[\w.]+(?:\[\])?(?:\?|\s+optional)?\s*=(?!=|>)\s*(.+)$/:/^(@?[\w.]+)\s*=(?!=|>)\s*(.+)$/);return t===null?[]:[{name:t[1].replace(/^@/,``),source:t[2],line:e}]})}]}),reads:n.filter(e=>!x[e]).map(e=>({line:e,match:i[e].match(m)})).filter(e=>e.match!==null).map(({line:e,match:t})=>({view:t[1],...t[2]?{alias:t[2]}:{},...t[3]?{by:t[3]}:{},line:e})),line:e});continue}let k=a.match(/^query\s+(\w+)\s*=>\s*(?:observable\s+)?([\w.]+(?:\[\])?(?:\?|\s+optional)?)\s*$/);if(k){let t=collectBody(i,x,e,c).map(e=>({index:e,match:i[e].match(y)})).filter(e=>e.match!==null).map(({index:e,match:t})=>({name:t[1],type:t[2],typeReference:l(t[2]),sourceType:sourceTypeAt(i[e],i[e].match(/^\s*(?:by|filter)\s+\S+\s+/)[0].length+1),isIdentifier:!1,line:e}));g.queries.push({name:k[1],returnType:k[2],returnTypeReference:l(k[2]),parameters:t,line:e});continue}let A=a.match(/^screen\s+(\w+)\s*$/);if(A){g.screens.push({name:A[1],line:e});continue}let j=a.match(/^trigger\s+(\w+)\s*$/);j&&c===0&&g.triggers.push({name:j[1],line:e})}return b.size>=16&&b.delete(b.keys().next().value),b.set(c,g),g}function mergeSymbols(...e){return{...e.some(e=>e.identityDetails?.length)?{identityDetails:e.flatMap(e=>e.identityDetails??[])}:{},authoringSources:e.flatMap(e=>e.authoringSources??[]),...e.some(e=>e.authoringDocuments)?{authoringDocuments:e.flatMap(e=>e.authoringDocuments??[])}:{},eventSources:e.flatMap(e=>e.eventSources??[]),imports:e.flatMap(e=>e.imports),concepts:e.flatMap(e=>e.concepts),types:e.flatMap(e=>e.types),policies:e.flatMap(e=>e.policies),events:e.flatMap(e=>e.events),commands:e.flatMap(e=>e.commands),queries:e.flatMap(e=>e.queries),screens:e.flatMap(e=>e.screens),triggers:e.flatMap(e=>e.triggers)}}function symbolsForBuffer(e,t){let n=t?.authoringPath??`current.play`,r=t?.authoringDocuments?.find(e=>e.path===n);return{...mergeSymbols(scanDocument(e),t??mergeSymbols()),authoringDocuments:t?.authoringDocuments,authoringPath:n,authoringPlacement:t?.authoringPlacement??r?.placement,authoringPlacementResolved:t?.authoringPlacementResolved??r?.isPlacementResolved}}function knownEventNames(e){return[...e.events.map(e=>e.name),...e.imports.map(e=>e.shortName)]}const x=[`Startup`,`Shutdown`];function knownTriggerNames(e){return[...knownEventNames(e),...e.triggers.map(e=>e.name),...x]}function knownTypeNames(e,t){return[...t,...e.concepts.map(e=>e.name),...e.types.map(e=>e.name),...e.imports.map(e=>e.shortName)]}export{x as builtInTriggerNames,directBody,knownEventNames,knownTriggerNames,knownTypeNames,mergeSymbols,propertyTypeReference,scanDocument,symbolsForBuffer};
3
3
  //# sourceMappingURL=symbols.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"symbols.js","names":["conceptPattern","enumerationMemberPattern","bmpWordCharacters","propertyPattern","attributeReasonPattern","readPattern","commandReserved","authorizationContinuation","eventReserved","eventBodyReservedWords","inlineEventReserved","queryParameterPattern","property","typeReferenceSymbol","text","line","startColumn","body","lines","index","entry","match","reserved","start","fences","indentOf","indent","blockIndent","authorization","childIndent","symbolRevisions","source","cached","analysis","responseAnalysis","symbols","eventAnalysisSource","fenceMap","eventLines","eventFences","eventPropertyLines","trimmed","importMatch","qualifiedName","shortName","conceptMatch","bodyLines","i","directIndent","generationLine","generationStrategy","attributeReasons","reason","members","enumValues","member","enumNumbers","typeMatch","clauseKeywords","policyMatch","requires","eventMatch","inline","propertyBody","fileReferenceOn","unescapeString","command","productionHeaders","header","conditional","eventLine","name","children","targets","queryMatch","parameters","screenMatch","triggerMatch","documents","document","path","application","current","event","imported","builtInTriggerNames","trigger","primitives","concept","type"],"sources":["../../symbols.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 { EventVisibility, eventBodyReservedWords, unescapeString } from '@cratis/screenplay-compiler';\nimport { fenceMap, indentOf } from './document-context';\nimport { eventAnalysisSource } from './event-analysis-source';\nimport { CommandResponseSymbol, responseAnalysis } from './response-analysis';\nimport { fileReferenceOn } from './file-references';\nimport { clauseKeywords } from './language';\nimport { bmpWordCharacters } from './bmp-word-characters';\nimport { AuthoringDocument } from './AuthoringDocument';\nimport { AuthoredEventSource } from './AuthoredEventSource';\nimport { ProductionSymbol } from './ProductionSymbol';\nimport { TypeReferenceSymbol, typeReferenceSymbol } from './TypeReferenceSymbol';\n\nexport interface PropertySymbol {\n name: string;\n type: string;\n typeReference?: TypeReferenceSymbol;\n // Exact spelling and UTF-16 columns in the authoring source, independent of normalization.\n sourceType?: { text: string; startColumn: number; endColumn: number };\n isIdentifier: boolean;\n isGenerated?: boolean;\n isSubject?: boolean;\n line: number;\n}\n\nexport interface ConceptSymbol {\n name: string;\n primitive: string;\n attributes: string[];\n attributeReasons: Record<string, string>;\n enumValues: string[];\n enumNumbers?: number[];\n generationStrategy?: string;\n line: number;\n}\n\nexport interface TypeSymbol {\n name: string;\n properties: PropertySymbol[];\n line: number;\n}\n\nexport interface PolicySymbol {\n name: string;\n requires: string[];\n line: number;\n}\n\nexport interface EventSymbol {\n // Public editor declarations stay structural; the compiler is privately bundled.\n visibility?: 'Private' | 'Public';\n origin?: string;\n name: string;\n generation?: number;\n inline?: boolean;\n properties: PropertySymbol[];\n line: number;\n}\n\nexport interface CommandSymbol extends NamedSymbol {\n properties: PropertySymbol[];\n reads?: ReadSymbol[];\n produces?: ProductionSymbol[];\n productionHeaders?: number[];\n response?: CommandResponseSymbol | null;\n}\n\nexport interface ReadSymbol {\n view: string;\n alias?: string;\n by?: string;\n line: number;\n}\n\nexport interface NamedSymbol {\n name: string;\n line: number;\n}\n\nexport interface QuerySymbol extends NamedSymbol {\n returnType: string;\n returnTypeReference?: TypeReferenceSymbol;\n parameters: PropertySymbol[];\n}\n\nexport interface ImportSymbol {\n qualifiedName: string;\n shortName: string;\n line: number;\n}\n\nexport interface DocumentSymbols {\n identityDetails?: readonly { readonly name: string; readonly type: string; readonly line: number }[];\n authoringSources?: readonly string[];\n authoringPath?: string;\n authoringPlacement?: readonly string[];\n authoringPlacementResolved?: boolean;\n authoringDocuments?: readonly AuthoringDocument[];\n eventSources?: readonly AuthoredEventSource[];\n imports: ImportSymbol[];\n concepts: ConceptSymbol[];\n types: TypeSymbol[];\n policies: PolicySymbol[];\n events: EventSymbol[];\n commands: CommandSymbol[];\n queries: QuerySymbol[];\n screens: NamedSymbol[];\n triggers: NamedSymbol[];\n}\n\nconst conceptPattern = /^concept\\s+(\\w+)\\s*:\\s*(\\w+)((?:\\s+@?\\w+)*)\\s*$/;\nconst enumerationMemberPattern = new RegExp(`^@?([a-z_][${bmpWordCharacters}]*)(?:\\\\s*=\\\\s*(-?(?:0|[1-9][0-9]*)))?(?:\\\\s*//.*)?$`);\nconst propertyPattern = /^\\s*(@?[a-z_]\\w*)\\s+([\\w.]+(?:\\[\\])?(?:\\?|\\s+optional)?)(\\s+generated)?(\\s+identifier)?(\\s+subject)?\\s*$/;\nconst attributeReasonPattern = /^([a-z_]\\w*)\\s+reason\\s+\"((?:[^\"\\\\]|\\\\.)*)\"\\s*$/;\nconst readPattern = /^\\s*reads\\s+([A-Z]\\w*)(?:\\s+as\\s+([a-z_]\\w*))?(?:\\s+by\\s+([a-z_]\\w*))?\\s*$/;\nconst commandReserved = ['authorize', 'produces', 'reads'];\n// AuthorizeParser's continuation pattern, including the compiler's Unicode word characters.\nconst authorizationContinuation = /^(?:(?:or|and)\\s+)?[A-Za-z_(][\\p{L}\\p{Mn}\\p{Nd}\\p{Pc}\\s()]*$/u;\n// Use the compiler's contextual inventory, not the global completion vocabulary.\nconst eventReserved = eventBodyReservedWords;\nconst inlineEventReserved = ['tag', 'for', 'generation', 'origin', 'namespace', 'sequence', 'correlation', 'causation', 'causedBy', 'occurred'];\nconst queryParameterPattern =\n /^\\s*(?:by|filter)\\s+([a-z_]\\w*)\\s+([\\w.]+(?:\\[\\])?(?:\\?|\\s+optional)?)(?:\\s+from\\s+.+)?\\s*$/;\n\n// Property-shaped clauses depend on their owner. Commands reserve only authorize,\n// produces and reads; bare directives such as description and handler can be properties.\n// The @ escape always denotes a property, and 'as' keeps its established property meaning.\nexport function propertyTypeReference(property: PropertySymbol): TypeReferenceSymbol {\n return property.typeReference ?? typeReferenceSymbol(property.type);\n}\n\nfunction sourceTypeAt(line: string, startColumn: number): NonNullable<PropertySymbol['sourceType']> {\n const text = line.slice(startColumn - 1).match(/^[\\p{L}\\p{Mn}\\p{Nd}\\p{Pc}.]+(?:\\[\\])?(?:\\?|\\s+optional\\b)?/u)?.[0] ?? '';\n return { text, startColumn, endColumn: startColumn + text.length };\n}\n\nfunction propertiesIn(lines: string[], body: number[], reserved: readonly string[]): PropertySymbol[] {\n return body\n .map((index) => ({ index, match: lines[index].match(propertyPattern) }))\n .filter((entry): entry is { index: number; match: RegExpMatchArray } => entry.match !== null)\n .filter(({ match }) => match[1].startsWith('@') || match[1] === 'as' || !reserved.includes(match[1]))\n .map(({ index, match }) => ({\n name: match[1].replace(/^@/, ''),\n type: match[2],\n typeReference: typeReferenceSymbol(match[2]),\n sourceType: sourceTypeAt(lines[index], lines[index].match(/^\\s*\\S+\\s+/)![0].length + 1),\n isIdentifier: match[4] !== undefined,\n ...(match[3] !== undefined ? { isGenerated: true } : {}),\n ...(match[5] !== undefined ? { isSubject: true } : {}),\n line: index,\n }));\n}\n\nfunction collectBody(lines: string[], fences: boolean[], start: number, indent: number): number[] {\n const body: number[] = [];\n for (let index = start + 1; index < lines.length; index++) {\n if (fences[index]) {\n continue;\n }\n const line = lines[index];\n if (line.trim().length === 0) continue;\n if (indentOf(line) <= indent) break;\n body.push(index);\n }\n return body;\n}\n\n// Event/production parsers accept every greater indent, not just the smallest child indent.\n// Command block directives own their nested lines; properties do not. Fenced prose is never syntax.\nexport function directBody(lines: string[], fences: boolean[], start: number, indent: number): number[] {\n const body = collectBody(lines, fences, start, indent).filter(index => !fences[index] && !/^\\s*(?:\\/\\/|#)/.test(lines[index]));\n if (!/^\\s*command\\b/.test(lines[start])) return body;\n let blockIndent: number | undefined;\n let authorization = false;\n return body.filter(index => {\n const childIndent = indentOf(lines[index]);\n const text = lines[index].trim();\n // AuthorizeParser owns only consecutive deeper lines with requirement shape.\n // Unlike opaque blocks, a nonmatching line returns control to CommandParser.\n if (blockIndent !== undefined && childIndent > blockIndent &&\n (!authorization || authorizationContinuation.test(text))) return false;\n const property = text !== 'validate csharp' && propertiesIn(lines, [index], commandReserved).length > 0;\n // Description consumes only a quoted value or a fence (already excluded above).\n const leaf = property || /^description(?:\\s|$)/.test(text);\n blockIndent = leaf ? undefined : childIndent;\n authorization = /^authorize(?:\\s|$)/.test(text);\n return true;\n });\n}\n\nconst symbolRevisions = new Map<string, DocumentSymbols>();\n\nexport function scanDocument(lines: string[]): DocumentSymbols {\n const source = lines.join('\\n');\n const cached = symbolRevisions.get(source);\n if (cached) return cached;\n const analysis = responseAnalysis(lines);\n const symbols: DocumentSymbols = {\n ...(analysis.identityDetails?.length ? { identityDetails: analysis.identityDetails } : {}),\n authoringSources: [source],\n eventSources: analysis.eventSources.declarations,\n imports: [],\n concepts: [],\n types: [],\n policies: [],\n events: [],\n commands: [],\n queries: [],\n screens: [],\n triggers: [],\n };\n // One normalization pass for every declaration, including comments on fence openers.\n lines = eventAnalysisSource(lines);\n const fences = fenceMap(lines);\n const eventLines = lines;\n const eventFences = fences;\n // Typed inline mappings share property syntax once their source expression is removed.\n // Do this once, never once per inline event.\n const eventPropertyLines = lines.map(line => line.replace(/\\s*=(?!=|>).*/, ''));\n\n for (let index = 0; index < lines.length; index++) {\n if (fences[index]) continue;\n const line = lines[index];\n const trimmed = line.trim();\n const indent = indentOf(line);\n\n const importMatch = eventLines[index].trim().match(/^import\\s+([\\w.]+)(?:\\s+from\\s+\"(?:[^\"\\\\]|\\\\.)*\")?\\s*$/);\n if (importMatch && indent === 0) {\n const qualifiedName = importMatch[1];\n const shortName = qualifiedName.split('.').pop() ?? qualifiedName;\n symbols.imports.push({ qualifiedName, shortName, line: index });\n continue;\n }\n\n const conceptMatch = trimmed.match(conceptPattern);\n if (conceptMatch) {\n const bodyLines = collectBody(lines, fences, index, indent);\n const body = bodyLines.map((i) => lines[i].trim());\n const directIndent = Math.min(...bodyLines.filter(i => !fences[i] && lines[i].trim() !== '').map(i => indentOf(lines[i])));\n const generationLine = bodyLines.find(i => !fences[i] && indentOf(lines[i]) === directIndent && /^\\s*generate\\s+\\w+/.test(lines[i]));\n const generationStrategy = generationLine === undefined ? undefined : lines[generationLine].match(/^\\s*generate\\s+(\\w+)/)?.[1];\n const attributeReasons: Record<string, string> = {};\n for (const line of body) {\n const reason = line.match(attributeReasonPattern);\n if (reason && attributeReasons[reason[1]] === undefined) {\n attributeReasons[reason[1]] = reason[2];\n }\n }\n const members = conceptMatch[2] === 'Enum'\n ? body.filter(line => line !== 'validate').map(line => enumerationMemberPattern.exec(line)).filter(match => match !== null)\n : [];\n const enumValues = members.map(member => member[1]);\n const enumNumbers = members.length > 0 && members.every(member => member[2] !== undefined) ? members.map(member => Number(member[2])) : undefined;\n symbols.concepts.push({\n name: conceptMatch[1],\n primitive: conceptMatch[2],\n attributes: conceptMatch[3].trim().split(/\\s+/).filter(Boolean),\n attributeReasons,\n enumValues,\n ...(enumNumbers === undefined ? {} : { enumNumbers }),\n ...(generationStrategy === undefined ? {} : { generationStrategy }),\n line: index,\n });\n continue;\n }\n\n const typeMatch = trimmed.match(/^type\\s+(\\w+)\\s*$/);\n if (typeMatch) {\n symbols.types.push({\n name: typeMatch[1],\n properties: propertiesIn(lines, collectBody(lines, fences, index, indent), clauseKeywords),\n line: index,\n });\n continue;\n }\n\n const policyMatch = trimmed.match(/^policy\\s+(\\w+)\\s*$/);\n if (policyMatch) {\n const requires = collectBody(lines, fences, index, indent)\n .filter((i) => !fences[i])\n .map((i) => lines[i].trim());\n symbols.policies.push({ name: policyMatch[1], requires, line: index });\n continue;\n }\n\n const eventMatch = eventLines[index].trim().match(/^(?:(?:produces|(?<public>public))\\s+)?event\\s+(?<name>\\w+)(?:\\s+generation\\s+(?<generation>\\d+))?(?:\\s+from\\s+(?<origin>\"(?:[^\"\\\\]|\\\\.)*\"))?\\s*$/);\n if (eventMatch) {\n const inline = trimmed.startsWith('produces ');\n const body = directBody(eventLines, eventFences, index, indent);\n // Standalone events distinguish file metadata from properties by path shape.\n const propertyBody = inline ? body : body.filter(line => fileReferenceOn(eventLines[line], line) === undefined);\n symbols.events.push({\n name: eventMatch.groups!.name,\n ...(eventMatch.groups!.generation ? { generation: Number(eventMatch.groups!.generation) } : {}),\n ...(eventMatch.groups!.public || eventMatch.groups!.origin ? { visibility: EventVisibility.Public } : {}),\n ...(eventMatch.groups!.origin ? { origin: unescapeString(eventMatch.groups!.origin.slice(1, -1)) } : {}),\n inline,\n properties: propertiesIn(inline ? eventPropertyLines : eventLines,\n propertyBody, inline ? inlineEventReserved : eventReserved),\n line: index,\n });\n continue;\n }\n\n const command = analysis.commands.get(index);\n if (command) {\n // A command property is a leaf, not an indentation owner. Share the parser-shaped\n // body with properties, productions, advice and destination hints.\n const body = directBody(lines, fences, index, indent);\n const productionHeaders = body.filter(line => /^\\s*produces\\b/.test(lines[line]) && !analysis.operationProductionLines?.has(line));\n symbols.commands.push({\n name: command.name,\n properties: command.properties.map(property => ({\n name: property.name,\n type: `${property.type.name}${property.type.isCollection ? '[]' : ''}${property.type.isOptional ? ' optional' : ''}`,\n typeReference: { name: property.type.name, isCollection: property.type.isCollection, isOptional: property.type.isOptional },\n sourceType: sourceTypeAt(lines[property.type.location.line - 1], property.type.location.column),\n isIdentifier: property.isIdentifier || /\\sidentifier\\s*$/.test(lines[property.location.line - 1]),\n ...(property.isGenerated ? { isGenerated: true } : {}),\n line: property.location.line - 1,\n })),\n response: command.response,\n productionHeaders,\n produces: productionHeaders.flatMap(line => {\n const header = eventLines[line].trim();\n const inline = /^produces\\s+event\\b/.test(header);\n const conditional = /^produces\\s+when\\b/.test(header);\n const eventLine = conditional ? directBody(eventLines, eventFences, line, indentOf(eventLines[line]))[0] : line;\n if (eventLine === undefined) return [];\n const name = conditional ? eventLines[eventLine].trim() : header.match(inline ? /^produces\\s+event\\s+([A-Za-z_]\\w*)(?:\\s+generation\\s+\\d+)?\\s*$/ : /^produces\\s+([A-Z]\\w*)\\s*$/)?.[1];\n if (name === undefined || !/^[A-Za-z_]\\w*$/.test(name)) return [];\n const children = directBody(eventLines, eventFences, eventLine, indentOf(eventLines[eventLine]));\n const targets = children.map(index => eventLines[index].trim().match(/^for(?:\\s+(.*))?$/)).filter(match => match !== null);\n // Empty or repeated targets are uncertain, not implicit destinations.\n const target = targets.length === 0 ? undefined : targets.length === 1 ? targets[0][1] ?? '' : '';\n const mappings = children.flatMap(index => {\n const match = eventLines[index].trim().match(inline ? /^(@?[a-z_]\\w*)\\s+[\\w.]+(?:\\[\\])?(?:\\?|\\s+optional)?\\s*=(?!=|>)\\s*(.+)$/ : /^(@?[\\w.]+)\\s*=(?!=|>)\\s*(.+)$/);\n return match === null ? [] : [{ name: match[1].replace(/^@/, ''), source: match[2], line: index }];\n });\n return [{ name, inline, conditional, line, target, mappings }];\n }),\n reads: body.filter((line) => !fences[line])\n .map((line) => ({ line, match: lines[line].match(readPattern) }))\n .filter((entry): entry is { line: number; match: RegExpMatchArray } => entry.match !== null)\n .map(({ line, match }) => ({\n view: match[1],\n ...(match[2] ? { alias: match[2] } : {}),\n ...(match[3] ? { by: match[3] } : {}),\n line,\n })),\n line: index,\n });\n continue;\n }\n\n // The return type shape is the compiler's, dots and all - QueryParser's\n // ^query\\s+([A-Za-z_]\\w*)\\s*=>\\s*(observable\\s+)?([\\w.]+(?:\\[\\])?\\??)$. A narrower one here\n // silently drops the query from the symbol table, and with it every check and completion that\n // reads from it.\n const queryMatch = trimmed.match(/^query\\s+(\\w+)\\s*=>\\s*(?:observable\\s+)?([\\w.]+(?:\\[\\])?(?:\\?|\\s+optional)?)\\s*$/);\n if (queryMatch) {\n // The return type names a read model, which no construct declares — only the\n // 'by' and 'filter' parameters resolve against the document's own types.\n const parameters = collectBody(lines, fences, index, indent)\n .map((i) => ({ index: i, match: lines[i].match(queryParameterPattern) }))\n .filter(\n (entry): entry is { index: number; match: RegExpMatchArray } =>\n entry.match !== null,\n )\n .map(({ index: line, match }) => ({\n name: match[1],\n type: match[2],\n typeReference: typeReferenceSymbol(match[2]),\n sourceType: sourceTypeAt(lines[line], lines[line].match(/^\\s*(?:by|filter)\\s+\\S+\\s+/)![0].length + 1),\n isIdentifier: false,\n line,\n }));\n symbols.queries.push({\n name: queryMatch[1],\n returnType: queryMatch[2],\n returnTypeReference: typeReferenceSymbol(queryMatch[2]),\n parameters,\n line: index,\n });\n continue;\n }\n\n const screenMatch = trimmed.match(/^screen\\s+(\\w+)\\s*$/);\n if (screenMatch) {\n symbols.screens.push({ name: screenMatch[1], line: index });\n continue;\n }\n\n const triggerMatch = trimmed.match(/^trigger\\s+(\\w+)\\s*$/);\n if (triggerMatch && indent === 0) {\n symbols.triggers.push({ name: triggerMatch[1], line: index });\n }\n }\n\n if (symbolRevisions.size >= 16) symbolRevisions.delete(symbolRevisions.keys().next().value!);\n symbolRevisions.set(source, symbols);\n return symbols;\n}\n\n// The symbols of several documents as one - what an application spread over files declares. Lines refer to\n// the document each symbol came from, so the result names things; it does not locate them.\nexport function mergeSymbols(...documents: DocumentSymbols[]): DocumentSymbols {\n return {\n ...(documents.some(document => document.identityDetails?.length) ? { identityDetails: documents.flatMap(document => document.identityDetails ?? []) } : {}),\n authoringSources: documents.flatMap(document => document.authoringSources ?? []),\n ...(documents.some(document => document.authoringDocuments) ? { authoringDocuments: documents.flatMap(document => document.authoringDocuments ?? []) } : {}),\n eventSources: documents.flatMap(document => document.eventSources ?? []),\n imports: documents.flatMap((document) => document.imports),\n concepts: documents.flatMap((document) => document.concepts),\n types: documents.flatMap((document) => document.types),\n policies: documents.flatMap((document) => document.policies),\n events: documents.flatMap((document) => document.events),\n commands: documents.flatMap((document) => document.commands),\n queries: documents.flatMap((document) => document.queries),\n screens: documents.flatMap((document) => document.screens),\n triggers: documents.flatMap((document) => document.triggers),\n };\n}\n\n// Name scans are not physical input documents. Keep the host's authoritative paths separate,\n// and let responseAnalysis replace the current document with this buffer exactly once.\nexport function symbolsForBuffer(lines: string[], application?: DocumentSymbols): DocumentSymbols {\n const path = application?.authoringPath ?? 'current.play';\n const current = application?.authoringDocuments?.find(document => document.path === path);\n return { ...mergeSymbols(scanDocument(lines), application ?? mergeSymbols()),\n authoringDocuments: application?.authoringDocuments,\n authoringPath: path,\n authoringPlacement: application?.authoringPlacement ?? current?.placement,\n authoringPlacementResolved: application?.authoringPlacementResolved ?? current?.isPlacementResolved,\n };\n}\n\nexport function knownEventNames(symbols: DocumentSymbols): string[] {\n return [\n ...symbols.events.map((event) => event.name),\n ...symbols.imports.map((imported) => imported.shortName),\n ];\n}\n\n// The built-in host signals, which have no declaration to scan for because every application has them.\nexport const builtInTriggerNames = ['Startup', 'Shutdown'];\n\n// What a reaction's `when` may name: an event, a declared trigger, or a host signal. The compiler resolves\n// the three in that order, and the editor offers them the same way rather than guessing which was meant.\nexport function knownTriggerNames(symbols: DocumentSymbols): string[] {\n return [\n ...knownEventNames(symbols),\n ...symbols.triggers.map((trigger) => trigger.name),\n ...builtInTriggerNames,\n ];\n}\n\n// Everything a property type reference can resolve to — the primitives, the declared\n// concepts and types, and the short names of the imports.\nexport function knownTypeNames(symbols: DocumentSymbols, primitives: readonly string[]): string[] {\n return [\n ...primitives,\n ...symbols.concepts.map((concept) => concept.name),\n ...symbols.types.map((type) => type.name),\n ...symbols.imports.map((imported) => imported.shortName),\n ];\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"symbols.js","names":["conceptPattern","enumerationMemberPattern","bmpWordCharacters","propertyPattern","attributeReasonPattern","readPattern","commandReserved","authorizationContinuation","eventReserved","eventBodyReservedWords","inlineEventReserved","queryParameterPattern","property","typeReferenceSymbol","text","line","startColumn","body","lines","index","entry","match","reserved","start","fences","indentOf","indent","blockIndent","authorization","childIndent","symbolRevisions","source","cached","analysis","responseAnalysis","symbols","eventAnalysisSource","fenceMap","eventLines","eventFences","eventPropertyLines","trimmed","importMatch","qualifiedName","shortName","conceptMatch","bodyLines","i","directIndent","generationLine","generationStrategy","attributeReasons","reason","members","enumValues","member","enumNumbers","typeMatch","clauseKeywords","policyMatch","requires","eventMatch","inline","propertyBody","fileReferenceOn","unescapeString","command","productionHeaders","header","conditional","eventLine","name","children","targets","queryMatch","parameters","screenMatch","triggerMatch","documents","document","path","application","current","event","imported","builtInTriggerNames","trigger","primitives","concept","type"],"sources":["../../symbols.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 { EventVisibility, eventBodyReservedWords, unescapeString } from '@cratis/screenplay-compiler';\nimport { fenceMap, indentOf } from './document-context';\nimport { eventAnalysisSource } from './event-analysis-source';\nimport { CommandResponseSymbol, responseAnalysis } from './response-analysis';\nimport { fileReferenceOn } from './file-references';\nimport { clauseKeywords } from './language';\nimport { bmpWordCharacters } from './bmp-word-characters';\nimport { AuthoringDocument } from './AuthoringDocument';\nimport { AuthoredEventSource } from './AuthoredEventSource';\nimport { ProductionSymbol } from './ProductionSymbol';\nimport { TypeReferenceSymbol, typeReferenceSymbol } from './TypeReferenceSymbol';\n\nexport interface PropertySymbol {\n name: string;\n type: string;\n typeReference?: TypeReferenceSymbol;\n // Exact spelling and UTF-16 columns in the authoring source, independent of normalization.\n sourceType?: { text: string; startColumn: number; endColumn: number };\n isIdentifier: boolean;\n isGenerated?: boolean;\n isSubject?: boolean;\n line: number;\n}\n\nexport interface ConceptSymbol {\n name: string;\n primitive: string;\n attributes: string[];\n attributeReasons: Record<string, string>;\n enumValues: string[];\n enumNumbers?: number[];\n generationStrategy?: string;\n line: number;\n}\n\nexport interface TypeSymbol {\n name: string;\n properties: PropertySymbol[];\n line: number;\n}\n\nexport interface PolicySymbol {\n name: string;\n requires: string[];\n line: number;\n}\n\nexport interface EventSymbol {\n // Public editor declarations stay structural; the compiler is privately bundled.\n visibility?: 'Private' | 'Public';\n origin?: string;\n name: string;\n generation?: number;\n inline?: boolean;\n properties: PropertySymbol[];\n line: number;\n}\n\nexport interface CommandSymbol extends NamedSymbol {\n properties: PropertySymbol[];\n reads?: ReadSymbol[];\n produces?: ProductionSymbol[];\n productionHeaders?: number[];\n response?: CommandResponseSymbol | null;\n}\n\nexport interface ReadSymbol {\n view: string;\n alias?: string;\n by?: string;\n line: number;\n}\n\nexport interface NamedSymbol {\n name: string;\n line: number;\n}\n\nexport interface QuerySymbol extends NamedSymbol {\n returnType: string;\n returnTypeReference?: TypeReferenceSymbol;\n parameters: PropertySymbol[];\n}\n\nexport interface ImportSymbol {\n qualifiedName: string;\n shortName: string;\n line: number;\n}\n\nexport interface DocumentSymbols {\n identityDetails?: readonly { readonly name: string; readonly type: string; readonly line: number }[];\n authoringSources?: readonly string[];\n authoringPath?: string;\n authoringPlacement?: readonly string[];\n authoringPlacementResolved?: boolean;\n authoringDocuments?: readonly AuthoringDocument[];\n eventSources?: readonly AuthoredEventSource[];\n imports: ImportSymbol[];\n concepts: ConceptSymbol[];\n types: TypeSymbol[];\n policies: PolicySymbol[];\n events: EventSymbol[];\n commands: CommandSymbol[];\n queries: QuerySymbol[];\n screens: NamedSymbol[];\n triggers: NamedSymbol[];\n}\n\nconst conceptPattern = /^concept\\s+(\\w+)\\s*:\\s*(\\w+)((?:\\s+@?\\w+)*)\\s*$/;\nconst enumerationMemberPattern = new RegExp(`^@?([a-z_][${bmpWordCharacters}]*)(?:\\\\s*=\\\\s*(-?(?:0|[1-9][0-9]*)))?(?:\\\\s*//.*)?$`);\nconst propertyPattern = /^\\s*(@?[a-z_]\\w*)\\s+([\\w.]+(?:\\[\\])?(?:\\?|\\s+optional)?)(\\s+generated)?(\\s+identifier)?(\\s+subject)?\\s*$/;\nconst attributeReasonPattern = /^([a-z_]\\w*)\\s+reason\\s+\"((?:[^\"\\\\]|\\\\.)*)\"\\s*$/;\nconst readPattern = /^\\s*reads\\s+([A-Z]\\w*)(?:\\s+as\\s+([a-z_]\\w*))?(?:\\s+by\\s+([a-z_]\\w*))?\\s*$/;\nconst commandReserved = ['authorize', 'produces', 'reads'];\n// AuthorizeParser's continuation pattern, including the compiler's Unicode word characters.\nconst authorizationContinuation = /^(?:(?:or|and)\\s+)?[A-Za-z_(][\\p{L}\\p{Mn}\\p{Nd}\\p{Pc}\\s()]*$/u;\n// Use the compiler's contextual inventory, not the global completion vocabulary.\nconst eventReserved = eventBodyReservedWords;\nconst inlineEventReserved = ['tag', 'for', 'generation', 'origin', 'namespace', 'sequence', 'correlation', 'causation', 'causedBy', 'occurred'];\nconst queryParameterPattern =\n /^\\s*(?:by|filter)\\s+([a-z_]\\w*)\\s+([\\w.]+(?:\\[\\])?(?:\\?|\\s+optional)?)(?:\\s+from\\s+.+)?\\s*$/;\n\n// Property-shaped clauses depend on their owner. Commands reserve only authorize,\n// produces and reads; bare directives such as description and handler can be properties.\n// The @ escape always denotes a property, and 'as' keeps its established property meaning.\nexport function propertyTypeReference(property: PropertySymbol): TypeReferenceSymbol {\n return property.typeReference ?? typeReferenceSymbol(property.type);\n}\n\nfunction sourceTypeAt(line: string, startColumn: number): NonNullable<PropertySymbol['sourceType']> {\n const text = line.slice(startColumn - 1).match(/^[\\p{L}\\p{Mn}\\p{Nd}\\p{Pc}.]+(?:\\[\\])?(?:\\?|\\s+optional\\b)?/u)?.[0] ?? '';\n return { text, startColumn, endColumn: startColumn + text.length };\n}\n\nfunction propertiesIn(lines: string[], body: number[], reserved: readonly string[]): PropertySymbol[] {\n return body\n .map((index) => ({ index, match: lines[index].match(propertyPattern) }))\n .filter((entry): entry is { index: number; match: RegExpMatchArray } => entry.match !== null)\n .filter(({ match }) => match[1].startsWith('@') || match[1] === 'as' || !reserved.includes(match[1]))\n .map(({ index, match }) => ({\n name: match[1].replace(/^@/, ''),\n type: match[2],\n typeReference: typeReferenceSymbol(match[2]),\n sourceType: sourceTypeAt(lines[index], lines[index].match(/^\\s*\\S+\\s+/)![0].length + 1),\n isIdentifier: match[4] !== undefined,\n ...(match[3] !== undefined ? { isGenerated: true } : {}),\n ...(match[5] !== undefined ? { isSubject: true } : {}),\n line: index,\n }));\n}\n\nfunction collectBody(lines: string[], fences: boolean[], start: number, indent: number): number[] {\n const body: number[] = [];\n for (let index = start + 1; index < lines.length; index++) {\n if (fences[index]) {\n continue;\n }\n const line = lines[index];\n if (line.trim().length === 0) continue;\n if (indentOf(line) <= indent) break;\n body.push(index);\n }\n return body;\n}\n\n// Event/production parsers accept every greater indent, not just the smallest child indent.\n// Command block directives own their nested lines; properties do not. Fenced prose is never syntax.\nexport function directBody(lines: string[], fences: boolean[], start: number, indent: number): number[] {\n const body = collectBody(lines, fences, start, indent).filter(index => !fences[index] && !/^\\s*(?:\\/\\/|#)/.test(lines[index]));\n if (!/^\\s*command\\b/.test(lines[start])) return body;\n let blockIndent: number | undefined;\n let authorization = false;\n return body.filter(index => {\n const childIndent = indentOf(lines[index]);\n const text = lines[index].trim();\n // AuthorizeParser owns only consecutive deeper lines with requirement shape.\n // Unlike opaque blocks, a nonmatching line returns control to CommandParser.\n if (blockIndent !== undefined && childIndent > blockIndent &&\n (!authorization || authorizationContinuation.test(text))) return false;\n const property = text !== 'validate csharp' && propertiesIn(lines, [index], commandReserved).length > 0;\n // Description consumes only a quoted value or a fence (already excluded above).\n const leaf = property || /^description(?:\\s|$)/.test(text);\n blockIndent = leaf ? undefined : childIndent;\n authorization = /^authorize(?:\\s|$)/.test(text);\n return true;\n });\n}\n\nconst symbolRevisions = new Map<string, DocumentSymbols>();\n\nexport function scanDocument(lines: string[]): DocumentSymbols {\n const source = lines.join('\\n');\n const cached = symbolRevisions.get(source);\n if (cached) return cached;\n const analysis = responseAnalysis(lines);\n const symbols: DocumentSymbols = {\n ...(analysis.identityDetails?.length ? { identityDetails: analysis.identityDetails } : {}),\n authoringSources: [source],\n eventSources: analysis.eventSources.declarations,\n imports: [],\n concepts: [],\n types: [],\n policies: [],\n events: [],\n commands: [],\n queries: [],\n screens: [],\n triggers: [],\n };\n // One normalization pass for every declaration, including comments on fence openers.\n lines = eventAnalysisSource(lines);\n const fences = fenceMap(lines);\n const eventLines = lines;\n const eventFences = fences;\n // Typed inline mappings share property syntax once their source expression is removed.\n // Do this once, never once per inline event.\n const eventPropertyLines = lines.map(line => line.replace(/\\s*=(?!=|>).*/, ''));\n\n for (let index = 0; index < lines.length; index++) {\n if (fences[index]) continue;\n const line = lines[index];\n const trimmed = line.trim();\n const indent = indentOf(line);\n\n const importMatch = eventLines[index].trim().match(/^import\\s+([\\w.]+)(?:\\s+from\\s+\"(?:[^\"\\\\]|\\\\.)*\")?\\s*$/);\n if (importMatch && indent === 0) {\n const qualifiedName = importMatch[1];\n const shortName = qualifiedName.split('.').pop() ?? qualifiedName;\n symbols.imports.push({ qualifiedName, shortName, line: index });\n continue;\n }\n\n const conceptMatch = trimmed.match(conceptPattern);\n if (conceptMatch) {\n const bodyLines = collectBody(lines, fences, index, indent);\n const body = bodyLines.map((i) => lines[i].trim());\n const directIndent = Math.min(...bodyLines.filter(i => !fences[i] && lines[i].trim() !== '').map(i => indentOf(lines[i])));\n const generationLine = bodyLines.find(i => !fences[i] && indentOf(lines[i]) === directIndent && /^\\s*generate\\s+\\w+/.test(lines[i]));\n const generationStrategy = generationLine === undefined ? undefined : lines[generationLine].match(/^\\s*generate\\s+(\\w+)/)?.[1];\n const attributeReasons: Record<string, string> = {};\n for (const line of body) {\n const reason = line.match(attributeReasonPattern);\n if (reason && attributeReasons[reason[1]] === undefined) {\n attributeReasons[reason[1]] = reason[2];\n }\n }\n const members = conceptMatch[2] === 'Enum'\n ? body.filter(line => line !== 'validate').map(line => enumerationMemberPattern.exec(line)).filter(match => match !== null)\n : [];\n const enumValues = members.map(member => member[1]);\n const enumNumbers = members.length > 0 && members.every(member => member[2] !== undefined) ? members.map(member => Number(member[2])) : undefined;\n symbols.concepts.push({\n name: conceptMatch[1],\n primitive: conceptMatch[2],\n attributes: conceptMatch[3].trim().split(/\\s+/).filter(Boolean),\n attributeReasons,\n enumValues,\n ...(enumNumbers === undefined ? {} : { enumNumbers }),\n ...(generationStrategy === undefined ? {} : { generationStrategy }),\n line: index,\n });\n continue;\n }\n\n const typeMatch = trimmed.match(/^type\\s+(\\w+)\\s*$/);\n if (typeMatch) {\n symbols.types.push({\n name: typeMatch[1],\n properties: propertiesIn(lines, collectBody(lines, fences, index, indent), clauseKeywords),\n line: index,\n });\n continue;\n }\n\n const policyMatch = trimmed.match(/^policy\\s+(\\w+)\\s*$/);\n if (policyMatch) {\n const requires = collectBody(lines, fences, index, indent)\n .filter((i) => !fences[i])\n .map((i) => lines[i].trim());\n symbols.policies.push({ name: policyMatch[1], requires, line: index });\n continue;\n }\n\n const eventMatch = eventLines[index].trim().match(/^(?:(?:produces|(?<public>public))\\s+)?event\\s+(?<name>\\w+)(?:\\s+generation\\s+(?<generation>\\d+))?(?:\\s+from\\s+(?<origin>\"(?:[^\"\\\\]|\\\\.)*\"))?\\s*$/);\n if (eventMatch) {\n const inline = trimmed.startsWith('produces ');\n const body = directBody(eventLines, eventFences, index, indent);\n // Standalone events distinguish file metadata from properties by path shape.\n const propertyBody = inline ? body : body.filter(line => fileReferenceOn(eventLines[line], line) === undefined);\n symbols.events.push({\n name: eventMatch.groups!.name,\n ...(eventMatch.groups!.generation ? { generation: Number(eventMatch.groups!.generation) } : {}),\n ...(eventMatch.groups!.public || eventMatch.groups!.origin ? { visibility: EventVisibility.Public } : {}),\n ...(eventMatch.groups!.origin ? { origin: unescapeString(eventMatch.groups!.origin.slice(1, -1)) } : {}),\n inline,\n properties: propertiesIn(inline ? eventPropertyLines : eventLines,\n propertyBody, inline ? inlineEventReserved : eventReserved),\n line: index,\n });\n continue;\n }\n\n const command = analysis.commands.get(index);\n if (command) {\n // A command property is a leaf, not an indentation owner. Share the parser-shaped\n // body with properties, productions, advice and destination hints.\n const body = directBody(lines, fences, index, indent);\n const productionHeaders = body.filter(line => /^\\s*produces\\b/.test(lines[line]) && !analysis.operationProductionLines?.has(line));\n symbols.commands.push({\n name: command.name,\n properties: command.properties.map(property => ({\n name: property.name,\n type: `${property.type.name}${property.type.isCollection ? '[]' : ''}${property.type.isOptional ? ' optional' : ''}`,\n typeReference: { name: property.type.name, isCollection: property.type.isCollection, isOptional: property.type.isOptional },\n sourceType: sourceTypeAt(lines[property.type.location.line - 1], property.type.location.column),\n isIdentifier: property.isIdentifier || /\\sidentifier\\s*$/.test(lines[property.location.line - 1]),\n ...(property.isGenerated ? { isGenerated: true } : {}),\n line: property.location.line - 1,\n })),\n response: command.response,\n productionHeaders,\n produces: productionHeaders.flatMap(line => {\n const header = eventLines[line].trim();\n const inline = /^produces\\s+event\\b/.test(header);\n const conditional = /^produces\\s+when\\b/.test(header);\n const eventLine = conditional ? directBody(eventLines, eventFences, line, indentOf(eventLines[line]))[0] : line;\n if (eventLine === undefined) return [];\n const name = conditional ? eventLines[eventLine].trim() : header.match(inline ? /^produces\\s+event\\s+([A-Za-z_]\\w*)(?:\\s+generation\\s+\\d+)?\\s*$/ : /^produces\\s+([A-Z]\\w*)\\s*$/)?.[1];\n if (name === undefined || !/^[A-Za-z_]\\w*$/.test(name)) return [];\n const children = directBody(eventLines, eventFences, eventLine, indentOf(eventLines[eventLine]));\n const targets = children.map(index => eventLines[index].trim().match(/^for(?:\\s+(.*))?$/)).filter(match => match !== null);\n // Empty or repeated targets are uncertain, not implicit destinations.\n const target = targets.length === 0 ? undefined : targets.length === 1 ? targets[0][1] ?? '' : '';\n const mappings = children.flatMap(index => {\n const match = eventLines[index].trim().match(inline ? /^(@?[a-z_]\\w*)\\s+[\\w.]+(?:\\[\\])?(?:\\?|\\s+optional)?\\s*=(?!=|>)\\s*(.+)$/ : /^(@?[\\w.]+)\\s*=(?!=|>)\\s*(.+)$/);\n return match === null ? [] : [{ name: match[1].replace(/^@/, ''), source: match[2], line: index }];\n });\n return [{ name, inline, conditional, line, target, mappings }];\n }),\n reads: body.filter((line) => !fences[line])\n .map((line) => ({ line, match: lines[line].match(readPattern) }))\n .filter((entry): entry is { line: number; match: RegExpMatchArray } => entry.match !== null)\n .map(({ line, match }) => ({\n view: match[1],\n ...(match[2] ? { alias: match[2] } : {}),\n ...(match[3] ? { by: match[3] } : {}),\n line,\n })),\n line: index,\n });\n continue;\n }\n\n // The return type shape is the compiler's, dots and all - QueryParser's\n // ^query\\s+([A-Za-z_]\\w*)\\s*=>\\s*(observable\\s+)?([\\w.]+(?:\\[\\])?\\??)$. A narrower one here\n // silently drops the query from the symbol table, and with it every check and completion that\n // reads from it.\n const queryMatch = trimmed.match(/^query\\s+(\\w+)\\s*=>\\s*(?:observable\\s+)?([\\w.]+(?:\\[\\])?(?:\\?|\\s+optional)?)\\s*$/);\n if (queryMatch) {\n // The return type names a read model, which no construct declares — only the\n // 'by' and 'filter' parameters resolve against the document's own types.\n const parameters = collectBody(lines, fences, index, indent)\n .map((i) => ({ index: i, match: lines[i].match(queryParameterPattern) }))\n .filter(\n (entry): entry is { index: number; match: RegExpMatchArray } =>\n entry.match !== null,\n )\n .map(({ index: line, match }) => ({\n name: match[1],\n type: match[2],\n typeReference: typeReferenceSymbol(match[2]),\n sourceType: sourceTypeAt(lines[line], lines[line].match(/^\\s*(?:by|filter)\\s+\\S+\\s+/)![0].length + 1),\n isIdentifier: false,\n line,\n }));\n symbols.queries.push({\n name: queryMatch[1],\n returnType: queryMatch[2],\n returnTypeReference: typeReferenceSymbol(queryMatch[2]),\n parameters,\n line: index,\n });\n continue;\n }\n\n const screenMatch = trimmed.match(/^screen\\s+(\\w+)\\s*$/);\n if (screenMatch) {\n symbols.screens.push({ name: screenMatch[1], line: index });\n continue;\n }\n\n const triggerMatch = trimmed.match(/^trigger\\s+(\\w+)\\s*$/);\n if (triggerMatch && indent === 0) {\n symbols.triggers.push({ name: triggerMatch[1], line: index });\n }\n }\n\n if (symbolRevisions.size >= 16) symbolRevisions.delete(symbolRevisions.keys().next().value!);\n symbolRevisions.set(source, symbols);\n return symbols;\n}\n\n// The symbols of several documents as one - what an application spread over files declares. Lines refer to\n// the document each symbol came from, so the result names things; it does not locate them.\nexport function mergeSymbols(...documents: DocumentSymbols[]): DocumentSymbols {\n return {\n ...(documents.some(document => document.identityDetails?.length) ? { identityDetails: documents.flatMap(document => document.identityDetails ?? []) } : {}),\n authoringSources: documents.flatMap(document => document.authoringSources ?? []),\n ...(documents.some(document => document.authoringDocuments) ? { authoringDocuments: documents.flatMap(document => document.authoringDocuments ?? []) } : {}),\n eventSources: documents.flatMap(document => document.eventSources ?? []),\n imports: documents.flatMap((document) => document.imports),\n concepts: documents.flatMap((document) => document.concepts),\n types: documents.flatMap((document) => document.types),\n policies: documents.flatMap((document) => document.policies),\n events: documents.flatMap((document) => document.events),\n commands: documents.flatMap((document) => document.commands),\n queries: documents.flatMap((document) => document.queries),\n screens: documents.flatMap((document) => document.screens),\n triggers: documents.flatMap((document) => document.triggers),\n };\n}\n\n// Name scans are not physical input documents. Keep the host's authoritative paths separate,\n// and let responseAnalysis replace the current document with this buffer exactly once.\nexport function symbolsForBuffer(lines: string[], application?: DocumentSymbols): DocumentSymbols {\n const path = application?.authoringPath ?? 'current.play';\n const current = application?.authoringDocuments?.find(document => document.path === path);\n return { ...mergeSymbols(scanDocument(lines), application ?? mergeSymbols()),\n authoringDocuments: application?.authoringDocuments,\n authoringPath: path,\n authoringPlacement: application?.authoringPlacement ?? current?.placement,\n authoringPlacementResolved: application?.authoringPlacementResolved ?? current?.isPlacementResolved,\n };\n}\n\nexport function knownEventNames(symbols: DocumentSymbols): string[] {\n return [\n ...symbols.events.map((event) => event.name),\n ...symbols.imports.map((imported) => imported.shortName),\n ];\n}\n\n// The built-in host signals, which have no declaration to scan for because every application has them.\nexport const builtInTriggerNames = ['Startup', 'Shutdown'];\n\n// What a reaction's `when` may name: an event, a declared trigger, or a host signal. The compiler resolves\n// the three in that order, and the editor offers them the same way rather than guessing which was meant.\nexport function knownTriggerNames(symbols: DocumentSymbols): string[] {\n return [\n ...knownEventNames(symbols),\n ...symbols.triggers.map((trigger) => trigger.name),\n ...builtInTriggerNames,\n ];\n}\n\n// Everything a property type reference can resolve to — the primitives, the declared\n// concepts and types, and the short names of the imports.\nexport function knownTypeNames(symbols: DocumentSymbols, primitives: readonly string[]): string[] {\n return [\n ...primitives,\n ...symbols.concepts.map((concept) => concept.name),\n ...symbols.types.map((type) => type.name),\n ...symbols.imports.map((imported) => imported.shortName),\n ];\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"screenplay-dark.js","names":["screenplayDarkThemeName","screenplayDark"],"sources":["../../../themes/screenplay-dark.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 } from 'monaco-editor';\n\nexport const screenplayDarkThemeName = 'screenplay-dark';\n\nexport const screenplayDark: editor.IStandaloneThemeData = {\n base: 'vs-dark',\n inherit: true,\n rules: [\n { token: 'keyword.play', foreground: 'C586C0' },\n { token: 'keyword.tag.play', foreground: '569CD6', fontStyle: 'italic' },\n { token: 'keyword.type.play', foreground: '4FC1FF', fontStyle: 'bold' },\n { token: 'type.play', foreground: '4EC9B0' },\n { token: 'type.identifier.play', foreground: '4EC9B0' },\n { token: 'identifier.play', foreground: '9CDCFE' },\n { token: 'annotation.play', foreground: 'DCDCAA' },\n { token: 'variable.predefined.play', foreground: 'D7BA7D' },\n { token: 'string.play', foreground: 'CE9178' },\n { token: 'string.link.play', foreground: 'CE9178', fontStyle: 'underline' },\n { token: 'string.invalid.play', foreground: 'F44747' },\n { token: 'string.quote.play', foreground: '6A9955' },\n { token: 'number.play', foreground: 'B5CEA8' },\n { token: 'number.float.play', foreground: 'B5CEA8' },\n { token: 'comment.play', foreground: '6A9955', fontStyle: 'italic' },\n { token: 'operator.play', foreground: 'D4D4D4' },\n { token: 'delimiter.play', foreground: 'CCCCCC' },\n ],\n colors: {\n 'editor.background': '#1E1E1E',\n },\n};\n"],"mappings":"AAKA,MAAaA,EAA0B,kBAE1BC,EAA8C,CACvD,KAAM,UACN,QAAS,GACT,MAAO,CACH,CAAE,MAAO,eAAgB,WAAY,QAAS,EAC9C,CAAE,MAAO,mBAAoB,WAAY,SAAU,UAAW,QAAS,EACvE,CAAE,MAAO,oBAAqB,WAAY,SAAU,UAAW,MAAO,EACtE,CAAE,MAAO,YAAa,WAAY,QAAS,EAC3C,CAAE,MAAO,uBAAwB,WAAY,QAAS,EACtD,CAAE,MAAO,kBAAmB,WAAY,QAAS,EACjD,CAAE,MAAO,kBAAmB,WAAY,QAAS,EACjD,CAAE,MAAO,2BAA4B,WAAY,QAAS,EAC1D,CAAE,MAAO,cAAe,WAAY,QAAS,EAC7C,CAAE,MAAO,mBAAoB,WAAY,SAAU,UAAW,WAAY,EAC1E,CAAE,MAAO,sBAAuB,WAAY,QAAS,EACrD,CAAE,MAAO,oBAAqB,WAAY,QAAS,EACnD,CAAE,MAAO,cAAe,WAAY,QAAS,EAC7C,CAAE,MAAO,oBAAqB,WAAY,QAAS,EACnD,CAAE,MAAO,eAAgB,WAAY,SAAU,UAAW,QAAS,EACnE,CAAE,MAAO,gBAAiB,WAAY,QAAS,EAC/C,CAAE,MAAO,iBAAkB,WAAY,QAAS,CACpD,EACA,OAAQ,CACJ,oBAAqB,SACzB,CACJ"}
1
+ {"version":3,"file":"screenplay-dark.js","names":["screenplayDarkThemeName","screenplayDark"],"sources":["../../../themes/screenplay-dark.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 } from 'monaco-editor';\n\nexport const screenplayDarkThemeName = 'screenplay-dark';\n\nexport const screenplayDark: editor.IStandaloneThemeData = {\n base: 'vs-dark',\n inherit: true,\n rules: [\n { token: 'keyword.play', foreground: 'C586C0' },\n { token: 'keyword.tag.play', foreground: '569CD6', fontStyle: 'italic' },\n { token: 'keyword.type.play', foreground: '4FC1FF', fontStyle: 'bold' },\n { token: 'type.play', foreground: '4EC9B0' },\n { token: 'type.identifier.play', foreground: '4EC9B0' },\n { token: 'identifier.play', foreground: '9CDCFE' },\n { token: 'annotation.play', foreground: 'DCDCAA' },\n { token: 'variable.predefined.play', foreground: 'D7BA7D' },\n { token: 'string.play', foreground: 'CE9178' },\n { token: 'string.link.play', foreground: 'CE9178', fontStyle: 'underline' },\n { token: 'string.invalid.play', foreground: 'F44747' },\n { token: 'string.quote.play', foreground: '6A9955' },\n { token: 'number.play', foreground: 'B5CEA8' },\n { token: 'number.float.play', foreground: 'B5CEA8' },\n { token: 'comment.play', foreground: '6A9955', fontStyle: 'italic' },\n { token: 'operator.play', foreground: 'D4D4D4' },\n { token: 'delimiter.play', foreground: 'CCCCCC' },\n ],\n colors: {\n 'editor.background': '#1E1E1E',\n },\n};\n"],"mappings":"AAKA,MAAaA,EAA0B,kBAE1BC,EAA8C,CACvD,KAAM,UACN,QAAS,GACT,MAAO,CACH,CAAE,MAAO,eAAgB,WAAY,QAAS,EAC9C,CAAE,MAAO,mBAAoB,WAAY,SAAU,UAAW,QAAS,EACvE,CAAE,MAAO,oBAAqB,WAAY,SAAU,UAAW,MAAO,EACtE,CAAE,MAAO,YAAa,WAAY,QAAS,EAC3C,CAAE,MAAO,uBAAwB,WAAY,QAAS,EACtD,CAAE,MAAO,kBAAmB,WAAY,QAAS,EACjD,CAAE,MAAO,kBAAmB,WAAY,QAAS,EACjD,CAAE,MAAO,2BAA4B,WAAY,QAAS,EAC1D,CAAE,MAAO,cAAe,WAAY,QAAS,EAC7C,CAAE,MAAO,mBAAoB,WAAY,SAAU,UAAW,WAAY,EAC1E,CAAE,MAAO,sBAAuB,WAAY,QAAS,EACrD,CAAE,MAAO,oBAAqB,WAAY,QAAS,EACnD,CAAE,MAAO,cAAe,WAAY,QAAS,EAC7C,CAAE,MAAO,oBAAqB,WAAY,QAAS,EACnD,CAAE,MAAO,eAAgB,WAAY,SAAU,UAAW,QAAS,EACnE,CAAE,MAAO,gBAAiB,WAAY,QAAS,EAC/C,CAAE,MAAO,iBAAkB,WAAY,QAAS,CACpD,EACA,OAAQ,CACJ,oBAAqB,SACzB,CACJ,E"}
@@ -1 +1 @@
1
- {"version":3,"file":"screenplay-light.js","names":["screenplayLightThemeName","screenplayLight"],"sources":["../../../themes/screenplay-light.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 } from 'monaco-editor';\n\nexport const screenplayLightThemeName = 'screenplay-light';\n\nexport const screenplayLight: editor.IStandaloneThemeData = {\n base: 'vs',\n inherit: true,\n rules: [\n { token: 'keyword.play', foreground: 'AF00DB' },\n { token: 'keyword.tag.play', foreground: '0000FF', fontStyle: 'italic' },\n { token: 'keyword.type.play', foreground: '0070C1', fontStyle: 'bold' },\n { token: 'type.play', foreground: '267F99' },\n { token: 'type.identifier.play', foreground: '267F99' },\n { token: 'identifier.play', foreground: '001080' },\n { token: 'annotation.play', foreground: '795E26' },\n { token: 'variable.predefined.play', foreground: 'B45309' },\n { token: 'string.play', foreground: 'A31515' },\n { token: 'string.link.play', foreground: 'A31515', fontStyle: 'underline' },\n { token: 'string.invalid.play', foreground: 'CD3131' },\n { token: 'string.quote.play', foreground: '008000' },\n { token: 'number.play', foreground: '098658' },\n { token: 'number.float.play', foreground: '098658' },\n { token: 'comment.play', foreground: '008000', fontStyle: 'italic' },\n { token: 'operator.play', foreground: '000000' },\n { token: 'delimiter.play', foreground: '000000' },\n ],\n colors: {\n 'editor.background': '#FFFFFF',\n },\n};\n"],"mappings":"AAKA,MAAaA,EAA2B,mBAE3BC,EAA+C,CACxD,KAAM,KACN,QAAS,GACT,MAAO,CACH,CAAE,MAAO,eAAgB,WAAY,QAAS,EAC9C,CAAE,MAAO,mBAAoB,WAAY,SAAU,UAAW,QAAS,EACvE,CAAE,MAAO,oBAAqB,WAAY,SAAU,UAAW,MAAO,EACtE,CAAE,MAAO,YAAa,WAAY,QAAS,EAC3C,CAAE,MAAO,uBAAwB,WAAY,QAAS,EACtD,CAAE,MAAO,kBAAmB,WAAY,QAAS,EACjD,CAAE,MAAO,kBAAmB,WAAY,QAAS,EACjD,CAAE,MAAO,2BAA4B,WAAY,QAAS,EAC1D,CAAE,MAAO,cAAe,WAAY,QAAS,EAC7C,CAAE,MAAO,mBAAoB,WAAY,SAAU,UAAW,WAAY,EAC1E,CAAE,MAAO,sBAAuB,WAAY,QAAS,EACrD,CAAE,MAAO,oBAAqB,WAAY,QAAS,EACnD,CAAE,MAAO,cAAe,WAAY,QAAS,EAC7C,CAAE,MAAO,oBAAqB,WAAY,QAAS,EACnD,CAAE,MAAO,eAAgB,WAAY,SAAU,UAAW,QAAS,EACnE,CAAE,MAAO,gBAAiB,WAAY,QAAS,EAC/C,CAAE,MAAO,iBAAkB,WAAY,QAAS,CACpD,EACA,OAAQ,CACJ,oBAAqB,SACzB,CACJ"}
1
+ {"version":3,"file":"screenplay-light.js","names":["screenplayLightThemeName","screenplayLight"],"sources":["../../../themes/screenplay-light.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 } from 'monaco-editor';\n\nexport const screenplayLightThemeName = 'screenplay-light';\n\nexport const screenplayLight: editor.IStandaloneThemeData = {\n base: 'vs',\n inherit: true,\n rules: [\n { token: 'keyword.play', foreground: 'AF00DB' },\n { token: 'keyword.tag.play', foreground: '0000FF', fontStyle: 'italic' },\n { token: 'keyword.type.play', foreground: '0070C1', fontStyle: 'bold' },\n { token: 'type.play', foreground: '267F99' },\n { token: 'type.identifier.play', foreground: '267F99' },\n { token: 'identifier.play', foreground: '001080' },\n { token: 'annotation.play', foreground: '795E26' },\n { token: 'variable.predefined.play', foreground: 'B45309' },\n { token: 'string.play', foreground: 'A31515' },\n { token: 'string.link.play', foreground: 'A31515', fontStyle: 'underline' },\n { token: 'string.invalid.play', foreground: 'CD3131' },\n { token: 'string.quote.play', foreground: '008000' },\n { token: 'number.play', foreground: '098658' },\n { token: 'number.float.play', foreground: '098658' },\n { token: 'comment.play', foreground: '008000', fontStyle: 'italic' },\n { token: 'operator.play', foreground: '000000' },\n { token: 'delimiter.play', foreground: '000000' },\n ],\n colors: {\n 'editor.background': '#FFFFFF',\n },\n};\n"],"mappings":"AAKA,MAAaA,EAA2B,mBAE3BC,EAA+C,CACxD,KAAM,KACN,QAAS,GACT,MAAO,CACH,CAAE,MAAO,eAAgB,WAAY,QAAS,EAC9C,CAAE,MAAO,mBAAoB,WAAY,SAAU,UAAW,QAAS,EACvE,CAAE,MAAO,oBAAqB,WAAY,SAAU,UAAW,MAAO,EACtE,CAAE,MAAO,YAAa,WAAY,QAAS,EAC3C,CAAE,MAAO,uBAAwB,WAAY,QAAS,EACtD,CAAE,MAAO,kBAAmB,WAAY,QAAS,EACjD,CAAE,MAAO,kBAAmB,WAAY,QAAS,EACjD,CAAE,MAAO,2BAA4B,WAAY,QAAS,EAC1D,CAAE,MAAO,cAAe,WAAY,QAAS,EAC7C,CAAE,MAAO,mBAAoB,WAAY,SAAU,UAAW,WAAY,EAC1E,CAAE,MAAO,sBAAuB,WAAY,QAAS,EACrD,CAAE,MAAO,oBAAqB,WAAY,QAAS,EACnD,CAAE,MAAO,cAAe,WAAY,QAAS,EAC7C,CAAE,MAAO,oBAAqB,WAAY,QAAS,EACnD,CAAE,MAAO,eAAgB,WAAY,SAAU,UAAW,QAAS,EACnE,CAAE,MAAO,gBAAiB,WAAY,QAAS,EAC/C,CAAE,MAAO,iBAAkB,WAAY,QAAS,CACpD,EACA,OAAQ,CACJ,oBAAqB,SACzB,CACJ,E"}