@cratis/screenplay-language 4.124.0 → 4.125.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -0
- package/dist/bundles/TypeReferenceSymbol.js +2 -0
- package/dist/bundles/TypeReferenceSymbol.js.map +1 -0
- package/dist/bundles/_virtual/_virtual/_rolldown/runtime.js +1 -0
- package/dist/bundles/bmp-word-characters.js +2 -0
- package/dist/bundles/bmp-word-characters.js.map +1 -0
- package/dist/bundles/case-authoring.js +3 -0
- package/dist/bundles/case-authoring.js.map +1 -0
- package/dist/bundles/code-actions.js +2 -0
- package/dist/bundles/code-actions.js.map +1 -0
- package/dist/bundles/compiler/Authoring/QuickFixes.js +5 -0
- package/dist/bundles/compiler/Authoring/QuickFixes.js.map +1 -0
- package/dist/bundles/compiler/Dependencies/DeclaredDependencies.js +2 -0
- package/dist/bundles/compiler/Dependencies/DeclaredDependencies.js.map +1 -0
- package/dist/bundles/compiler/Dependencies/DeclaredDependencyTargets.js +2 -0
- package/dist/bundles/compiler/Dependencies/DeclaredDependencyTargets.js.map +1 -0
- package/dist/bundles/compiler/Dependencies/DependencyGraph.js +2 -0
- package/dist/bundles/compiler/Dependencies/DependencyGraph.js.map +1 -0
- package/dist/bundles/compiler/Dependencies/DependencyKind.js +2 -0
- package/dist/bundles/compiler/Dependencies/DependencyKind.js.map +1 -0
- package/dist/bundles/compiler/Dependencies/InvalidDependencyQuery.js +2 -0
- package/dist/bundles/compiler/Dependencies/InvalidDependencyQuery.js.map +1 -0
- package/dist/bundles/compiler/Dependencies/SliceReferences.js +2 -0
- package/dist/bundles/compiler/Dependencies/SliceReferences.js.map +1 -0
- package/dist/bundles/compiler/Dependencies/StronglyConnectedGroups.js +2 -0
- package/dist/bundles/compiler/Dependencies/StronglyConnectedGroups.js.map +1 -0
- package/dist/bundles/compiler/Dependencies/index.js +1 -0
- package/dist/bundles/compiler/Diagnostics/DiagnosticCodes.js +2 -0
- package/dist/bundles/compiler/Diagnostics/DiagnosticCodes.js.map +1 -0
- package/dist/bundles/compiler/Diagnostics/ProductionDestinationDiagnostics.js +2 -0
- package/dist/bundles/compiler/Diagnostics/ProductionDestinationDiagnostics.js.map +1 -0
- package/dist/bundles/compiler/Diagnostics/SourceLocation.js +2 -0
- package/dist/bundles/compiler/Diagnostics/SourceLocation.js.map +1 -0
- package/dist/bundles/compiler/Files/AuthoredOrder.js +2 -0
- package/dist/bundles/compiler/Files/AuthoredOrder.js.map +1 -0
- package/dist/bundles/compiler/Files/OrderingRoot.js +1 -0
- package/dist/bundles/compiler/Files/PlayApplicationAssembly.js +2 -0
- package/dist/bundles/compiler/Files/PlayApplicationAssembly.js.map +1 -0
- package/dist/bundles/compiler/Files/PlayFolderMerge.js +2 -0
- package/dist/bundles/compiler/Files/PlayFolderMerge.js.map +1 -0
- package/dist/bundles/compiler/Files/PlayImports.js +1 -0
- package/dist/bundles/compiler/Files/PlayPlacement.js +2 -0
- package/dist/bundles/compiler/Files/PlayPlacement.js.map +1 -0
- package/dist/bundles/compiler/Files/TimelineOrder.js +2 -0
- package/dist/bundles/compiler/Files/TimelineOrder.js.map +1 -0
- package/dist/bundles/compiler/Parsing/AuthorizeParser.js +2 -0
- package/dist/bundles/compiler/Parsing/AuthorizeParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/CaptureParser.js +2 -0
- package/dist/bundles/compiler/Parsing/CaptureParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/CodeBlockParser.js +3 -0
- package/dist/bundles/compiler/Parsing/CodeBlockParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/CommandDestinationTypes.js +2 -0
- package/dist/bundles/compiler/Parsing/CommandDestinationTypes.js.map +1 -0
- package/dist/bundles/compiler/Parsing/CommandParser.js +2 -0
- package/dist/bundles/compiler/Parsing/CommandParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/CommandReadSources.js +2 -0
- package/dist/bundles/compiler/Parsing/CommandReadSources.js.map +1 -0
- package/dist/bundles/compiler/Parsing/CommandResponseParser.js +2 -0
- package/dist/bundles/compiler/Parsing/CommandResponseParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/CommandStreamCandidates.js +2 -0
- package/dist/bundles/compiler/Parsing/CommandStreamCandidates.js.map +1 -0
- package/dist/bundles/compiler/Parsing/CompositeStreamIdValidator.js +2 -0
- package/dist/bundles/compiler/Parsing/CompositeStreamIdValidator.js.map +1 -0
- package/dist/bundles/compiler/Parsing/CompositionParser.js +2 -0
- package/dist/bundles/compiler/Parsing/CompositionParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/ConceptComplianceParser.js +2 -0
- package/dist/bundles/compiler/Parsing/ConceptComplianceParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/ConditionParser.js +2 -0
- package/dist/bundles/compiler/Parsing/ConditionParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/ConstraintParser.js +2 -0
- package/dist/bundles/compiler/Parsing/ConstraintParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/ConstraintPropertyValidator.js +2 -0
- package/dist/bundles/compiler/Parsing/ConstraintPropertyValidator.js.map +1 -0
- package/dist/bundles/compiler/Parsing/DeclarationParsers.js +2 -0
- package/dist/bundles/compiler/Parsing/DeclarationParsers.js.map +1 -0
- package/dist/bundles/compiler/Parsing/DependencySourceParser.js +2 -0
- package/dist/bundles/compiler/Parsing/DependencySourceParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/DependsOnParser.js +2 -0
- package/dist/bundles/compiler/Parsing/DependsOnParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/DescriptionParser.js +2 -0
- package/dist/bundles/compiler/Parsing/DescriptionParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/DocumentationParser.js +2 -0
- package/dist/bundles/compiler/Parsing/DocumentationParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/EventMetadataParser.js +2 -0
- package/dist/bundles/compiler/Parsing/EventMetadataParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/EventSourceParser.js +2 -0
- package/dist/bundles/compiler/Parsing/EventSourceParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/EventSourceValidator.js +2 -0
- package/dist/bundles/compiler/Parsing/EventSourceValidator.js.map +1 -0
- package/dist/bundles/compiler/Parsing/EventSubjectValidator.js +2 -0
- package/dist/bundles/compiler/Parsing/EventSubjectValidator.js.map +1 -0
- package/dist/bundles/compiler/Parsing/ExpressionParser.js +2 -0
- package/dist/bundles/compiler/Parsing/ExpressionParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/FeatureBody.js +2 -0
- package/dist/bundles/compiler/Parsing/FeatureBody.js.map +1 -0
- package/dist/bundles/compiler/Parsing/FileImportParser.js +2 -0
- package/dist/bundles/compiler/Parsing/FileImportParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/FileReferences.js +2 -0
- package/dist/bundles/compiler/Parsing/FileReferences.js.map +1 -0
- package/dist/bundles/compiler/Parsing/GuardedActionParser.js +2 -0
- package/dist/bundles/compiler/Parsing/GuardedActionParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/GuardedActionShadowing.js +2 -0
- package/dist/bundles/compiler/Parsing/GuardedActionShadowing.js.map +1 -0
- package/dist/bundles/compiler/Parsing/GuardedActionValidator.js +2 -0
- package/dist/bundles/compiler/Parsing/GuardedActionValidator.js.map +1 -0
- package/dist/bundles/compiler/Parsing/IdentifierComplianceValidator.js +2 -0
- package/dist/bundles/compiler/Parsing/IdentifierComplianceValidator.js.map +1 -0
- package/dist/bundles/compiler/Parsing/IdentityParser.js +2 -0
- package/dist/bundles/compiler/Parsing/IdentityParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/IdentityValidator.js +2 -0
- package/dist/bundles/compiler/Parsing/IdentityValidator.js.map +1 -0
- package/dist/bundles/compiler/Parsing/ImplementationParser.js +3 -0
- package/dist/bundles/compiler/Parsing/ImplementationParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/ImportDiscovery.js +1 -0
- package/dist/bundles/compiler/Parsing/InlineEventValidator.js +2 -0
- package/dist/bundles/compiler/Parsing/InlineEventValidator.js.map +1 -0
- package/dist/bundles/compiler/Parsing/InputUses.js +2 -0
- package/dist/bundles/compiler/Parsing/InputUses.js.map +1 -0
- package/dist/bundles/compiler/Parsing/InteractionAlternatives.js +2 -0
- package/dist/bundles/compiler/Parsing/InteractionAlternatives.js.map +1 -0
- package/dist/bundles/compiler/Parsing/LineReader.js +2 -0
- package/dist/bundles/compiler/Parsing/LineReader.js.map +1 -0
- package/dist/bundles/compiler/Parsing/LineText.js +2 -0
- package/dist/bundles/compiler/Parsing/LineText.js.map +1 -0
- package/dist/bundles/compiler/Parsing/ModuleBody.js +2 -0
- package/dist/bundles/compiler/Parsing/ModuleBody.js.map +1 -0
- package/dist/bundles/compiler/Parsing/OperationParser.js +2 -0
- package/dist/bundles/compiler/Parsing/OperationParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/OperationValidator.js +2 -0
- package/dist/bundles/compiler/Parsing/OperationValidator.js.map +1 -0
- package/dist/bundles/compiler/Parsing/ParserContext.js +2 -0
- package/dist/bundles/compiler/Parsing/ParserContext.js.map +1 -0
- package/dist/bundles/compiler/Parsing/PersonaCallerValidator.js +2 -0
- package/dist/bundles/compiler/Parsing/PersonaCallerValidator.js.map +1 -0
- package/dist/bundles/compiler/Parsing/PolicyParser.js +2 -0
- package/dist/bundles/compiler/Parsing/PolicyParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/ProducesParser.js +2 -0
- package/dist/bundles/compiler/Parsing/ProducesParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/ProjectionExpressionParser.js +2 -0
- package/dist/bundles/compiler/Parsing/ProjectionExpressionParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/ProjectionParser.js +2 -0
- package/dist/bundles/compiler/Parsing/ProjectionParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/ProjectionTargetValidator.js +2 -0
- package/dist/bundles/compiler/Parsing/ProjectionTargetValidator.js.map +1 -0
- package/dist/bundles/compiler/Parsing/PropertyLineParser.js +2 -0
- package/dist/bundles/compiler/Parsing/PropertyLineParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/PublicEventMetadataValidator.js +2 -0
- package/dist/bundles/compiler/Parsing/PublicEventMetadataValidator.js.map +1 -0
- package/dist/bundles/compiler/Parsing/PublicEventUsageCollector.js +2 -0
- package/dist/bundles/compiler/Parsing/PublicEventUsageCollector.js.map +1 -0
- package/dist/bundles/compiler/Parsing/PublicEventUsageValidator.js +2 -0
- package/dist/bundles/compiler/Parsing/PublicEventUsageValidator.js.map +1 -0
- package/dist/bundles/compiler/Parsing/PurposeParser.js +2 -0
- package/dist/bundles/compiler/Parsing/PurposeParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/PurposeValidator.js +2 -0
- package/dist/bundles/compiler/Parsing/PurposeValidator.js.map +1 -0
- package/dist/bundles/compiler/Parsing/QueryParser.js +2 -0
- package/dist/bundles/compiler/Parsing/QueryParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/ReactionIdentityParser.js +2 -0
- package/dist/bundles/compiler/Parsing/ReactionIdentityParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/ReactionParser.js +2 -0
- package/dist/bundles/compiler/Parsing/ReactionParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/ReactionRefusalValidator.js +2 -0
- package/dist/bundles/compiler/Parsing/ReactionRefusalValidator.js.map +1 -0
- package/dist/bundles/compiler/Parsing/RedeliveryValues.js +2 -0
- package/dist/bundles/compiler/Parsing/RedeliveryValues.js.map +1 -0
- package/dist/bundles/compiler/Parsing/RefusalDeclarations.js +2 -0
- package/dist/bundles/compiler/Parsing/RefusalDeclarations.js.map +1 -0
- package/dist/bundles/compiler/Parsing/RefusalValueWalker.js +2 -0
- package/dist/bundles/compiler/Parsing/RefusalValueWalker.js.map +1 -0
- package/dist/bundles/compiler/Parsing/ResponseDateValues.js +2 -0
- package/dist/bundles/compiler/Parsing/ResponseDateValues.js.map +1 -0
- package/dist/bundles/compiler/Parsing/ResponseValidator.js +2 -0
- package/dist/bundles/compiler/Parsing/ResponseValidator.js.map +1 -0
- package/dist/bundles/compiler/Parsing/ScreenParser.js +2 -0
- package/dist/bundles/compiler/Parsing/ScreenParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/ScreenplayParser.js +2 -0
- package/dist/bundles/compiler/Parsing/ScreenplayParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/SeedParser.js +2 -0
- package/dist/bundles/compiler/Parsing/SeedParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/SliceParser.js +2 -0
- package/dist/bundles/compiler/Parsing/SliceParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/SourceLine.js +2 -0
- package/dist/bundles/compiler/Parsing/SourceLine.js.map +1 -0
- package/dist/bundles/compiler/Parsing/SourceLineSplitter.js +3 -0
- package/dist/bundles/compiler/Parsing/SourceLineSplitter.js.map +1 -0
- package/dist/bundles/compiler/Parsing/SourceOptionsParser.js +2 -0
- package/dist/bundles/compiler/Parsing/SourceOptionsParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/SpecificationCaseParser.js +2 -0
- package/dist/bundles/compiler/Parsing/SpecificationCaseParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/SpecificationCaseValidator.js +2 -0
- package/dist/bundles/compiler/Parsing/SpecificationCaseValidator.js.map +1 -0
- package/dist/bundles/compiler/Parsing/SpecificationCommandExamples.js +2 -0
- package/dist/bundles/compiler/Parsing/SpecificationCommandExamples.js.map +1 -0
- package/dist/bundles/compiler/Parsing/SpecificationExampleParser.js +2 -0
- package/dist/bundles/compiler/Parsing/SpecificationExampleParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/SpecificationParser.js +2 -0
- package/dist/bundles/compiler/Parsing/SpecificationParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/SpecificationRedeliveryValidator.js +2 -0
- package/dist/bundles/compiler/Parsing/SpecificationRedeliveryValidator.js.map +1 -0
- package/dist/bundles/compiler/Parsing/SpecificationResponseParser.js +2 -0
- package/dist/bundles/compiler/Parsing/SpecificationResponseParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/SpecificationRouteComparison.js +2 -0
- package/dist/bundles/compiler/Parsing/SpecificationRouteComparison.js.map +1 -0
- package/dist/bundles/compiler/Parsing/SpecificationStreamValidator.js +2 -0
- package/dist/bundles/compiler/Parsing/SpecificationStreamValidator.js.map +1 -0
- package/dist/bundles/compiler/Parsing/StructuredValueParser.js +3 -0
- package/dist/bundles/compiler/Parsing/StructuredValueParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/TriggerDataParser.js +2 -0
- package/dist/bundles/compiler/Parsing/TriggerDataParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/UiBindingParser.js +2 -0
- package/dist/bundles/compiler/Parsing/UiBindingParser.js.map +1 -0
- package/dist/bundles/compiler/ScreenplayCompiler.js +2 -0
- package/dist/bundles/compiler/ScreenplayCompiler.js.map +1 -0
- package/dist/bundles/compiler/Syntax/AuthoringProductionResolver.js +2 -0
- package/dist/bundles/compiler/Syntax/AuthoringProductionResolver.js.map +1 -0
- package/dist/bundles/compiler/Syntax/CaptureEventsSource.js +2 -0
- package/dist/bundles/compiler/Syntax/CaptureEventsSource.js.map +1 -0
- package/dist/bundles/compiler/Syntax/DependencySources.js +2 -0
- package/dist/bundles/compiler/Syntax/DependencySources.js.map +1 -0
- package/dist/bundles/compiler/Syntax/EventDeclarations.js +2 -0
- package/dist/bundles/compiler/Syntax/EventDeclarations.js.map +1 -0
- package/dist/bundles/compiler/Syntax/EventSourceCatalog.js +2 -0
- package/dist/bundles/compiler/Syntax/EventSourceCatalog.js.map +1 -0
- package/dist/bundles/compiler/Syntax/EventSourceReadConfidence.js +2 -0
- package/dist/bundles/compiler/Syntax/EventSourceReadConfidence.js.map +1 -0
- package/dist/bundles/compiler/Syntax/ExactMathFacts.js +2 -0
- package/dist/bundles/compiler/Syntax/ExactMathFacts.js.map +1 -0
- package/dist/bundles/compiler/Syntax/ExactNumber.js +2 -0
- package/dist/bundles/compiler/Syntax/ExactNumber.js.map +1 -0
- package/dist/bundles/compiler/Syntax/InvalidSyntaxJson.js +2 -0
- package/dist/bundles/compiler/Syntax/InvalidSyntaxJson.js.map +1 -0
- package/dist/bundles/compiler/Syntax/LegacyWireProjection.js +2 -0
- package/dist/bundles/compiler/Syntax/LegacyWireProjection.js.map +1 -0
- package/dist/bundles/compiler/Syntax/Operations.js +2 -0
- package/dist/bundles/compiler/Syntax/Operations.js.map +1 -0
- package/dist/bundles/compiler/Syntax/PersonaCallers.js +2 -0
- package/dist/bundles/compiler/Syntax/PersonaCallers.js.map +1 -0
- package/dist/bundles/compiler/Syntax/ProductionDestinations.js +2 -0
- package/dist/bundles/compiler/Syntax/ProductionDestinations.js.map +1 -0
- package/dist/bundles/compiler/Syntax/PublicEventInvariants.js +2 -0
- package/dist/bundles/compiler/Syntax/PublicEventInvariants.js.map +1 -0
- package/dist/bundles/compiler/Syntax/ScreenplaySyntaxWalker.js +2 -0
- package/dist/bundles/compiler/Syntax/ScreenplaySyntaxWalker.js.map +1 -0
- package/dist/bundles/compiler/Syntax/SourceOptions.js +2 -0
- package/dist/bundles/compiler/Syntax/SourceOptions.js.map +1 -0
- package/dist/bundles/compiler/Syntax/SpecificationCaseOrigin.js +2 -0
- package/dist/bundles/compiler/Syntax/SpecificationCaseOrigin.js.map +1 -0
- package/dist/bundles/compiler/Syntax/StreamIdFormatter.js +2 -0
- package/dist/bundles/compiler/Syntax/StreamIdFormatter.js.map +1 -0
- package/dist/bundles/compiler/Syntax/StrictSyntaxJson.js +1 -0
- package/dist/bundles/compiler/Syntax/Structure.js +2 -0
- package/dist/bundles/compiler/Syntax/Structure.js.map +1 -0
- package/dist/bundles/compiler/Syntax/SyntaxCollections.js +2 -0
- package/dist/bundles/compiler/Syntax/SyntaxCollections.js.map +1 -0
- package/dist/bundles/compiler/Syntax/SyntaxInvariants.js +2 -0
- package/dist/bundles/compiler/Syntax/SyntaxInvariants.js.map +1 -0
- package/dist/bundles/compiler/Syntax/SyntaxJson.js +2 -0
- package/dist/bundles/compiler/Syntax/SyntaxJson.js.map +1 -0
- package/dist/bundles/compiler/Syntax/SyntaxMemberContracts.js +2 -0
- package/dist/bundles/compiler/Syntax/SyntaxMemberContracts.js.map +1 -0
- package/dist/bundles/compiler/Syntax/index.js +1 -0
- package/dist/bundles/compiler/Text/ImplementationHintText.js +2 -0
- package/dist/bundles/compiler/Text/ImplementationHintText.js.map +1 -0
- package/dist/bundles/compiler/Text/ReservedWords.js +2 -0
- package/dist/bundles/compiler/Text/ReservedWords.js.map +1 -0
- package/dist/bundles/compiler/Text/SourceStreamNames.js +2 -0
- package/dist/bundles/compiler/Text/SourceStreamNames.js.map +1 -0
- package/dist/bundles/compiler/Text/StringLiteral.js +3 -0
- package/dist/bundles/compiler/Text/StringLiteral.js.map +1 -0
- package/dist/bundles/compiler/Text/ordinalIgnoreCaseKey.js +2 -0
- package/dist/bundles/compiler/Text/ordinalIgnoreCaseKey.js.map +1 -0
- package/dist/bundles/compiler/Text/patterns.js +2 -0
- package/dist/bundles/compiler/Text/patterns.js.map +1 -0
- package/dist/bundles/compiler/index.js +1 -0
- package/dist/bundles/completion-items.js +21 -0
- package/dist/bundles/completion-items.js.map +1 -0
- package/dist/bundles/completion-planner.js +5 -0
- package/dist/bundles/completion-planner.js.map +1 -0
- package/dist/bundles/completions.js +2 -0
- package/dist/bundles/completions.js.map +1 -0
- package/dist/bundles/dependency-completions.js +3 -0
- package/dist/bundles/dependency-completions.js.map +1 -0
- package/dist/bundles/dependency-target-analysis.js +2 -0
- package/dist/bundles/dependency-target-analysis.js.map +1 -0
- package/dist/bundles/diagnostic-codes.js +2 -0
- package/dist/bundles/diagnostic-codes.js.map +1 -0
- package/dist/bundles/diagnostics.js +2 -0
- package/dist/bundles/diagnostics.js.map +1 -0
- package/dist/bundles/document-context.js +2 -0
- package/dist/bundles/document-context.js.map +1 -0
- package/dist/bundles/documentation-item.js +2 -0
- package/dist/bundles/documentation-item.js.map +1 -0
- package/dist/bundles/event-analysis-source.js +2 -0
- package/dist/bundles/event-analysis-source.js.map +1 -0
- package/dist/bundles/event-context-catalog.js +2 -0
- package/dist/bundles/event-context-catalog.js.map +1 -0
- package/dist/bundles/event-context.js +4 -0
- package/dist/bundles/event-context.js.map +1 -0
- package/dist/bundles/event-source-authoring.js +13 -0
- package/dist/bundles/event-source-authoring.js.map +1 -0
- package/dist/bundles/example-analysis.js +3 -0
- package/dist/bundles/example-analysis.js.map +1 -0
- package/dist/bundles/example-authoring.js +3 -0
- package/dist/bundles/example-authoring.js.map +1 -0
- package/dist/bundles/example-declaration-items.js +2 -0
- package/dist/bundles/example-declaration-items.js.map +1 -0
- package/dist/bundles/example-values.js +2 -0
- package/dist/bundles/example-values.js.map +1 -0
- package/dist/bundles/file-imports.js +2 -0
- package/dist/bundles/file-imports.js.map +1 -0
- package/dist/bundles/file-references.js +2 -0
- package/dist/bundles/file-references.js.map +1 -0
- package/dist/bundles/hover-content.js +6 -0
- package/dist/bundles/hover-content.js.map +1 -0
- package/dist/bundles/hover.js +2 -0
- package/dist/bundles/hover.js.map +1 -0
- package/dist/bundles/index.js +2 -104
- package/dist/bundles/index.js.map +1 -7
- package/dist/bundles/inlay-hints.js +2 -0
- package/dist/bundles/inlay-hints.js.map +1 -0
- package/dist/bundles/inline-completions.js +2 -0
- package/dist/bundles/inline-completions.js.map +1 -0
- package/dist/bundles/inline-event-validation.js +2 -0
- package/dist/bundles/inline-event-validation.js.map +1 -0
- package/dist/bundles/keyword-docs.js +2 -0
- package/dist/bundles/keyword-docs.js.map +1 -0
- package/dist/bundles/language.js +2 -0
- package/dist/bundles/language.js.map +1 -0
- package/dist/bundles/named-rule-context.js +2 -0
- package/dist/bundles/named-rule-context.js.map +1 -0
- package/dist/bundles/operation-authoring.js +7 -0
- package/dist/bundles/operation-authoring.js.map +1 -0
- package/dist/bundles/persona-analysis.js +2 -0
- package/dist/bundles/persona-analysis.js.map +1 -0
- package/dist/bundles/production-destinations.js +2 -0
- package/dist/bundles/production-destinations.js.map +1 -0
- package/dist/bundles/purpose-items.js +2 -0
- package/dist/bundles/purpose-items.js.map +1 -0
- package/dist/bundles/reaction-authoring.js +5 -0
- package/dist/bundles/reaction-authoring.js.map +1 -0
- package/dist/bundles/refusal-context.js +2 -0
- package/dist/bundles/refusal-context.js.map +1 -0
- package/dist/bundles/response-analysis.js +7 -0
- package/dist/bundles/response-analysis.js.map +1 -0
- package/dist/bundles/response-completions.js +2 -0
- package/dist/bundles/response-completions.js.map +1 -0
- package/dist/bundles/response-tokens.js +3 -0
- package/dist/bundles/response-tokens.js.map +1 -0
- package/dist/bundles/scope-items.js +18 -0
- package/dist/bundles/scope-items.js.map +1 -0
- package/dist/bundles/structure-completions.js +7 -0
- package/dist/bundles/structure-completions.js.map +1 -0
- package/dist/bundles/sub-language-registry.js +2 -0
- package/dist/bundles/sub-language-registry.js.map +1 -0
- package/dist/bundles/sub-languages/capture/CompletionProvider.js +2 -0
- package/dist/bundles/sub-languages/capture/CompletionProvider.js.map +1 -0
- package/dist/bundles/sub-languages/capture/HoverProvider.js +60 -0
- package/dist/bundles/sub-languages/capture/HoverProvider.js.map +1 -0
- package/dist/bundles/sub-languages/capture/Validator.js +2 -0
- package/dist/bundles/sub-languages/capture/Validator.js.map +1 -0
- package/dist/bundles/sub-languages/capture/index.js +2 -40
- package/dist/bundles/sub-languages/capture/index.js.map +1 -7
- package/dist/bundles/sub-languages/capture/language.js +2 -0
- package/dist/bundles/sub-languages/capture/language.js.map +1 -0
- package/dist/bundles/sub-languages/cdl.js +2 -0
- package/dist/bundles/sub-languages/cdl.js.map +1 -0
- package/dist/bundles/sub-languages/pdl.js +2 -0
- package/dist/bundles/sub-languages/pdl.js.map +1 -0
- package/dist/bundles/sub-languages/projection/CodeActionProvider.js +2 -0
- package/dist/bundles/sub-languages/projection/CodeActionProvider.js.map +1 -0
- package/dist/bundles/sub-languages/projection/CompletionProvider.js +2 -0
- package/dist/bundles/sub-languages/projection/CompletionProvider.js.map +1 -0
- package/dist/bundles/sub-languages/projection/HoverProvider.js +43 -0
- package/dist/bundles/sub-languages/projection/HoverProvider.js.map +1 -0
- package/dist/bundles/sub-languages/projection/Validator.js +5 -0
- package/dist/bundles/sub-languages/projection/Validator.js.map +1 -0
- package/dist/bundles/sub-languages/projection/index.js +3 -75
- package/dist/bundles/sub-languages/projection/index.js.map +1 -7
- package/dist/bundles/sub-languages/projection/language.js +2 -0
- package/dist/bundles/sub-languages/projection/language.js.map +1 -0
- package/dist/bundles/symbols.js +3 -0
- package/dist/bundles/symbols.js.map +1 -0
- package/dist/bundles/themes/screenplay-dark.js +2 -0
- package/dist/bundles/themes/screenplay-dark.js.map +1 -0
- package/dist/bundles/themes/screenplay-light.js +2 -0
- package/dist/bundles/themes/screenplay-light.js.map +1 -0
- package/dist/bundles/tokens.js +2 -0
- package/dist/bundles/tokens.js.map +1 -0
- package/dist/bundles/validation.js +3 -0
- package/dist/bundles/validation.js.map +1 -0
- package/package.json +4 -3
- package/dist/bundles/chunk-7GSRLVHB.js +0 -42
- package/dist/bundles/chunk-7GSRLVHB.js.map +0 -7
- package/dist/bundles/chunk-AYDF3IFZ.js +0 -2
- package/dist/bundles/chunk-AYDF3IFZ.js.map +0 -7
|
@@ -1,7 +1 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../sub-languages/projection/language.ts", "../../../../sub-languages/projection/CompletionProvider.ts", "../../../../sub-languages/projection/Validator.ts", "../../../../sub-languages/projection/HoverProvider.ts", "../../../../sub-languages/projection/CodeActionProvider.ts", "../../../../sub-languages/projection/index.ts"],
|
|
4
|
-
"sourcesContent": ["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { languages } from 'monaco-editor';\n\nexport 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", "// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { editor, languages, IRange, Position } from 'monaco-editor';\nimport type { JsonSchema, JsonSchemaProperty, ReadModelInfo } from './index';\nimport { eventContextMembers, eventContextMembersAfter } from '../../event-context';\n\ninterface CompletionContext {\n lineContent: string;\n textBeforeCursor: string;\n textAfterCursor: string;\n currentWord: string;\n indentLevel: number;\n lineNumber: number;\n}\n\n// The path typed so far after $eventContext. - on its own or as the dynamic key of a mapping target - and the\n// partial segment under the cursor.\nconst EVENT_CONTEXT_PATH = /\\$eventContext\\.((?:\\w+\\.)*)(\\w*)$/;\n\nexport class CompletionProvider implements languages.CompletionItemProvider {\n private readModels: ReadModelInfo[] = [];\n private eventSchemas: Record<string, JsonSchema> = {};\n private eventSequences: string[] = [];\n\n setReadModels(readModels: ReadModelInfo[]): void {\n this.readModels = readModels || [];\n }\n\n setEventSequences(sequences: string[]): void {\n this.eventSequences = sequences || [];\n }\n\n // Keep for backwards compatibility\n setReadModelSchemas(schemas: JsonSchema[]): void {\n this.readModels = schemas.map(schema => ({\n identifier: this.getSchemaName(schema) || '',\n displayName: this.getSchemaName(schema) || '',\n schema\n }));\n }\n\n setEventSchemas(schemas: Record<string, JsonSchema> | JsonSchema[]): void {\n if (!schemas) {\n this.eventSchemas = {};\n return;\n }\n\n if (Array.isArray(schemas)) {\n const map: Record<string, JsonSchema> = {};\n schemas.forEach((s, i) => {\n if (!s) return;\n const name = this.getSchemaName(s) || `Event${i + 1}`;\n map[name] = s;\n });\n this.eventSchemas = map;\n return;\n }\n\n this.eventSchemas = schemas;\n }\n\n provideCompletionItems(\n model: editor.ITextModel,\n position: Position\n ): languages.ProviderResult<languages.CompletionList> {\n const context = this.buildContext(model, position);\n const suggestions: languages.CompletionItem[] = [];\n\n // Get the active read model schema from the projection declaration\n const activeSchema = this.getActiveReadModelSchema(model);\n\n // Determine what kind of completions to provide based on context\n if (context.lineNumber === 1) {\n this.addProjectionLineCompletions(suggestions, context);\n } else if (this.isAfterKeyword(context, 'sequence')) {\n this.addEventSequenceCompletions(suggestions, context);\n } else if (this.isAfterKeyword(context, 'from') || this.isAfterKeyword(context, 'every')) {\n this.addEventTypeCompletions(suggestions, context);\n } else if (/\\benters\\s+on\\s+\\w*$/.test(context.textBeforeCursor)) {\n this.addEventTypeCompletions(suggestions, context);\n } else if (/\\benters\\s+\\w*$/.test(context.textBeforeCursor)) {\n suggestions.push({\n label: 'on',\n kind: 14, // Keyword\n insertText: 'on ',\n documentation: 'Declares the event that activates this variant.',\n detail: 'enters on <EventType>',\n range: this.getRangeForWord(context),\n });\n } else if (this.isAfterKeyword(context, 'variant')) {\n this.addVariantNameCompletions(suggestions, context);\n } else if (this.isAfterKeyword(context, 'key')) {\n this.addKeyCompletions(suggestions, context, activeSchema);\n } else if (this.isAfterKeyword(context, 'parent')) {\n this.addParentCompletions(suggestions, context);\n } else if (this.isAfterKeyword(context, 'children')) {\n this.addChildrenCompletions(suggestions, context, activeSchema);\n } else if (this.isAfterKeyword(context, 'join')) {\n this.addJoinCompletions(suggestions, context, activeSchema);\n } else if (this.isAfterKeyword(context, 'with')) {\n this.addEventTypeCompletions(suggestions, context);\n } else if (this.isAfterNumericOperationKeyword(context)) {\n this.addNumericPropertyCompletions(suggestions, context, activeSchema);\n } else if (this.isAfterAddOrSubtractBy(context)) {\n this.addAssignmentValueCompletions(suggestions, context, model, position);\n } else if (this.isInAssignment(context)) {\n this.addAssignmentValueCompletions(suggestions, context, model, position);\n } else if (this.isPropertyDotAccess(context)) {\n this.addPropertyMemberCompletions(suggestions, context);\n } else if (this.isStartOfLine(context) || this.isAfterIndent(context)) {\n this.addStatementCompletions(suggestions, context, activeSchema);\n }\n\n return { suggestions };\n }\n\n private buildContext(model: editor.ITextModel, position: Position): CompletionContext {\n const lineContent = model.getLineContent(position.lineNumber);\n const textBeforeCursor = lineContent.substring(0, position.column - 1);\n const textAfterCursor = lineContent.substring(position.column - 1);\n const word = model.getWordAtPosition(position);\n const currentWord = word?.word || '';\n const indentLevel = this.getIndentLevel(textBeforeCursor);\n\n return {\n lineContent,\n textBeforeCursor,\n textAfterCursor,\n currentWord,\n indentLevel,\n lineNumber: position.lineNumber,\n };\n }\n\n private getIndentLevel(text: string): number {\n const match = text.match(/^(\\s*)/);\n return match ? Math.floor(match[1].length / 2) : 0;\n }\n\n private isStartOfLine(context: CompletionContext): boolean {\n return context.textBeforeCursor.trim() === '';\n }\n\n private isAfterIndent(context: CompletionContext): boolean {\n return /^\\s+$/.test(context.textBeforeCursor);\n }\n\n private isAfterKeyword(context: CompletionContext, keyword: string): boolean {\n const pattern = new RegExp(`\\\\b${keyword}\\\\s+\\\\w*$`);\n return pattern.test(context.textBeforeCursor);\n }\n\n private isAfterNumericOperationKeyword(context: CompletionContext): boolean {\n // Match: count, increment, decrement, add, subtract followed by optional word (but not \"by\")\n // For add/subtract, we only match if \"by\" hasn't been typed yet\n const countIncrDecrPattern = /\\b(count|increment|decrement)\\s+\\w*$/;\n const addSubtractPattern = /\\b(add|subtract)\\s+\\w*$/;\n\n // Check for count/increment/decrement first\n if (countIncrDecrPattern.test(context.textBeforeCursor)) {\n return true;\n }\n\n // For add/subtract, only match if \"by\" hasn't been typed yet\n if (addSubtractPattern.test(context.textBeforeCursor)) {\n // Make sure we're not after \"by\"\n return !this.isAfterAddOrSubtractBy(context);\n }\n\n return false;\n }\n\n private isAfterAddOrSubtractBy(context: CompletionContext): boolean {\n // Match: \"add <property> by \" or \"subtract <property> by \" followed by optional word\n const pattern = /\\b(add|subtract)\\s+\\w+\\s+by\\s+\\w*$/;\n return pattern.test(context.textBeforeCursor);\n }\n\n private isInAssignment(context: CompletionContext): boolean {\n return /\\w+\\s*=\\s*\\w*$/.test(context.textBeforeCursor);\n }\n\n private isPropertyDotAccess(context: CompletionContext): boolean {\n // A member of an event property or a $-expression, or any depth of an event-context path - written as an\n // expression or as the dynamic key of a mapping target (propertyName.$eventContext.<path>).\n return /(\\w+|\\$\\w+)\\.(\\w*)$/.test(context.textBeforeCursor) ||\n EVENT_CONTEXT_PATH.test(context.textBeforeCursor);\n }\n\n private addProjectionLineCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n const trimmed = context.textBeforeCursor.trim();\n\n // Suggest \"projection\" keyword\n if (trimmed === '' || 'projection'.startsWith(trimmed)) {\n suggestions.push({\n label: 'projection',\n kind: 14, // Keyword\n insertText: 'projection ',\n documentation: 'Define a projection that transforms events into a read model',\n detail: 'projection <ProjectionName>',\n range: this.getRangeForWord(context),\n });\n }\n\n // Check if cursor is after \"=>\" to suggest read model names\n const arrowMatch = trimmed.match(/^projection\\s+[\\w.]+\\s*=>\\s*([\\w.]*)$/);\n if (arrowMatch) {\n const partialReadModel = arrowMatch[1] || '';\n this.readModels.forEach((readModel) => {\n if (!partialReadModel || readModel.displayName.toLowerCase().startsWith(partialReadModel.toLowerCase())) {\n const label = `${readModel.displayName} (${readModel.identifier})`;\n suggestions.push({\n label,\n kind: 6, // Class\n insertText: readModel.displayName,\n filterText: `${readModel.displayName} ${readModel.identifier}`,\n documentation: `Read model: ${readModel.displayName} (${readModel.identifier})`,\n detail: readModel.identifier,\n range: this.getRangeForWord(context),\n });\n }\n });\n return;\n }\n\n // After \"projection \", suggest read model names (for quick completion of both projection name and read model)\n if (trimmed.startsWith('projection ') && !trimmed.includes('=>')) {\n const afterProjection = trimmed.substring('projection '.length);\n this.readModels.forEach((readModel) => {\n if (!afterProjection || readModel.displayName.toLowerCase().startsWith(afterProjection.toLowerCase())) {\n const label = `${readModel.displayName} (${readModel.identifier})`;\n suggestions.push({\n label,\n kind: 6, // Class\n insertText: `${readModel.displayName} => ${readModel.displayName}`,\n filterText: `${readModel.displayName} ${readModel.identifier}`,\n documentation: `Read model: ${readModel.displayName} (${readModel.identifier})`,\n detail: readModel.identifier,\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n }\n\n private addEventTypeCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n Object.keys(this.eventSchemas).forEach((eventName) => {\n if (!context.currentWord || eventName.startsWith(context.currentWord)) {\n const schema = this.eventSchemas[eventName];\n suggestions.push({\n label: eventName,\n kind: 6, // Class\n insertText: eventName,\n documentation: this.getSchemaDescription(schema) || `Event type: ${eventName}`,\n detail: 'Event Type',\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n\n private addEventSequenceCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n this.eventSequences.forEach((sequenceId) => {\n if (!context.currentWord || sequenceId.startsWith(context.currentWord)) {\n suggestions.push({\n label: sequenceId,\n kind: 13, // Value\n insertText: sequenceId,\n documentation: `Event sequence: ${sequenceId}`,\n detail: 'Event Sequence',\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n\n private addKeyCompletions(suggestions: languages.CompletionItem[], context: CompletionContext, activeSchema?: JsonSchema): void {\n // Check if this might be a composite key (type reference)\n if (activeSchema?.definitions) {\n Object.keys(activeSchema.definitions).forEach((typeName) => {\n const typeDef = activeSchema.definitions![typeName];\n if (typeDef.type === 'object') {\n suggestions.push({\n label: typeName,\n kind: 6, // Class\n insertText: typeName,\n documentation: `Composite key type: ${typeName}`,\n detail: 'Composite Key Type',\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n\n // Suggest built-in expressions for simple keys\n this.addExpressionCompletions(suggestions, context);\n }\n\n private addParentCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n this.addExpressionCompletions(suggestions, context);\n }\n\n private addNumericPropertyCompletions(suggestions: languages.CompletionItem[], context: CompletionContext, activeSchema?: JsonSchema): void {\n // After \"count \", \"increment \", or \"decrement \", suggest numeric properties from read model\n if (activeSchema?.properties) {\n Object.entries(activeSchema.properties).forEach(([propName, propSchema]) => {\n // Suggest numeric properties (integer or number types)\n const isNumeric = propSchema.type === 'integer' || propSchema.type === 'number';\n if (isNumeric) {\n if (!context.currentWord || propName.startsWith(context.currentWord)) {\n suggestions.push({\n label: propName,\n kind: 9, // Property\n insertText: propName,\n documentation: `Numeric property: ${propName}`,\n detail: this.getPropertyTypeDescription(propSchema),\n range: this.getRangeForWord(context),\n });\n }\n }\n });\n }\n\n // Also check if \"add\" or \"subtract\" is being typed - need to handle \"add <prop> by\" pattern\n const addSubtractMatch = context.textBeforeCursor.match(/\\b(add|subtract)\\s+(\\w*)$/);\n if (addSubtractMatch) {\n const partialProp = addSubtractMatch[2] || '';\n if (activeSchema?.properties) {\n Object.entries(activeSchema.properties).forEach(([propName, propSchema]) => {\n const isNumeric = propSchema.type === 'integer' || propSchema.type === 'number';\n if (isNumeric && (!partialProp || propName.startsWith(partialProp))) {\n suggestions.push({\n label: propName,\n kind: 9, // Property\n insertText: `${propName} by `,\n documentation: `Numeric property: ${propName}`,\n detail: this.getPropertyTypeDescription(propSchema),\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n }\n }\n\n private addChildrenCompletions(suggestions: languages.CompletionItem[], context: CompletionContext, activeSchema?: JsonSchema): void {\n // After \"children \", suggest collection properties from read model\n if (activeSchema?.properties) {\n Object.entries(activeSchema.properties).forEach(([propName, propSchema]) => {\n // Collections are typically arrays\n if (propSchema.type === 'array' || propSchema.items) {\n suggestions.push({\n label: propName,\n kind: 9, // Property\n insertText: `${propName} id `,\n documentation: `Collection property: ${propName}`,\n detail: this.getPropertyTypeDescription(propSchema),\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n }\n\n private addJoinCompletions(suggestions: languages.CompletionItem[], context: CompletionContext, activeSchema?: JsonSchema): void {\n const trimmed = context.textBeforeCursor.trim();\n\n if (trimmed === 'join' || !trimmed.includes(' ')) {\n // Suggest collection properties\n if (activeSchema?.properties) {\n Object.entries(activeSchema.properties).forEach(([propName, propSchema]) => {\n if (propSchema.type === 'array' || propSchema.items) {\n suggestions.push({\n label: propName,\n kind: 9,\n insertText: `${propName} on `,\n documentation: `Join on collection: ${propName}`,\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n } else if (trimmed.match(/join\\s+\\w+\\s+on\\s+/)) {\n // After \"on\", suggest properties to join on\n if (activeSchema?.properties) {\n Object.keys(activeSchema.properties).forEach((propName) => {\n suggestions.push({\n label: propName,\n kind: 9,\n insertText: propName,\n documentation: `Property: ${propName}`,\n range: this.getRangeForWord(context),\n });\n });\n }\n }\n }\n\n private addVariantNameCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n // After \"variant \", suggest read model names - a variant names the read model it produces.\n this.readModels.forEach((readModel) => {\n if (!context.currentWord || readModel.displayName.toLowerCase().startsWith(context.currentWord.toLowerCase())) {\n suggestions.push({\n label: readModel.displayName,\n kind: 6, // Class\n insertText: readModel.displayName,\n documentation: `Read model: ${readModel.displayName} (${readModel.identifier})`,\n detail: readModel.identifier,\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n\n private addStatementCompletions(suggestions: languages.CompletionItem[], context: CompletionContext, activeSchema?: JsonSchema): void {\n // Add all statement keywords\n const keywords = [\n { label: 'description', insertText: 'description \"\"', documentation: 'Report-only description on the projection header only', detail: 'description \"<text>\"' },\n { label: 'sequence', insertText: 'sequence ', documentation: 'Specify which event sequence to use for this projection', detail: 'sequence <event-sequence-id>' },\n { label: 'variant', insertText: 'variant ', documentation: 'Declare one of several mutually exclusive named read models sharing this projection\\'s identity', detail: 'variant <Name>' },\n { label: 'enters on', insertText: 'enters on ', documentation: 'Declare the event that activates a variant', detail: 'enters on <EventType>' },\n { label: 'from', insertText: 'from ', documentation: 'Handle specific event types', detail: 'from <EventType>' },\n { label: 'all', insertText: 'all', documentation: 'Subscribe to all event types in the system \u2014 mappings run for every event system-wide, regardless of explicit from blocks', detail: 'all' },\n { label: 'every', insertText: 'every', documentation: 'Handle all events for automatic mapping (only events explicitly subscribed to via from blocks)', detail: 'every' },\n { label: 'key', insertText: 'key ', documentation: 'Define the projection key', detail: 'key <expression>' },\n { label: 'parent', insertText: 'parent ', documentation: 'Define parent relationship', detail: 'parent <expression>' },\n { label: 'join', insertText: 'join ', documentation: 'Join with child collection', detail: 'join <collection> on <property>' },\n { label: 'children', insertText: 'children ', documentation: 'Define child collection operations', detail: 'children <collection> identified by <expression>' },\n { label: 'remove with', insertText: 'remove with ', documentation: 'Remove items based on event', detail: 'remove with <EventType>' },\n { label: 'remove via', insertText: 'remove via join on ', documentation: 'Remove items via join', detail: 'remove via join on <EventType>' },\n { label: 'no automap', insertText: 'no automap', documentation: 'Disable automatic property mapping', detail: 'no automap' },\n { label: 'clear', insertText: 'clear ', documentation: 'Remove the value a property holds', detail: 'clear <property>' },\n { label: 'increment', insertText: 'increment ', documentation: 'Increment a numeric property', detail: 'increment <property>' },\n { label: 'decrement', insertText: 'decrement ', documentation: 'Decrement a numeric property', detail: 'decrement <property>' },\n { label: 'count', insertText: 'count ', documentation: 'Count occurrences', detail: 'count <property>' },\n { label: 'add', insertText: 'add ', documentation: 'Add value to property', detail: 'add <property> by <expression>' },\n { label: 'subtract', insertText: 'subtract ', documentation: 'Subtract value from property', detail: 'subtract <property> by <expression>' },\n { label: 'exclude children', insertText: 'exclude children', documentation: 'Exclude child collections from automap', detail: 'exclude children' },\n ];\n\n keywords.forEach((kw) => {\n if (!context.currentWord || kw.label.startsWith(context.currentWord)) {\n suggestions.push({\n label: kw.label,\n kind: 14, // Keyword\n insertText: kw.insertText,\n documentation: kw.documentation,\n detail: kw.detail,\n range: this.getRangeForWord(context),\n });\n }\n });\n\n // Add property assignments\n if (activeSchema?.properties) {\n Object.entries(activeSchema.properties).forEach(([propName, propSchema]) => {\n if (!context.currentWord || propName.startsWith(context.currentWord)) {\n suggestions.push({\n label: propName,\n kind: 9, // Property\n insertText: `${propName} = `,\n documentation: `Assign value to property: ${propName}`,\n detail: this.getPropertyTypeDescription(propSchema),\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n }\n\n private addAssignmentValueCompletions(\n suggestions: languages.CompletionItem[],\n context: CompletionContext,\n model: editor.ITextModel,\n position: Position\n ): void {\n // Get the event type from the current block\n const eventType = this.getCurrentEventType(model, position.lineNumber);\n\n // Suggest event properties if we know the event type\n if (eventType && this.eventSchemas[eventType]) {\n const eventSchema = this.eventSchemas[eventType];\n if (eventSchema.properties) {\n Object.entries(eventSchema.properties).forEach(([propName, propSchema]) => {\n suggestions.push({\n label: propName,\n kind: 9,\n insertText: propName,\n documentation: `Event property: ${propName}`,\n detail: this.getPropertyTypeDescription(propSchema),\n range: this.getRangeForWord(context),\n });\n });\n }\n }\n\n // Add expression completions\n this.addExpressionCompletions(suggestions, context);\n }\n\n private addExpressionCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n const expressions = [\n {\n label: '$eventSourceId',\n insertText: '$eventSourceId',\n documentation: 'The identifier of the event source (aggregate/entity)',\n detail: 'Event Source Expression'\n },\n {\n label: '$causedBy',\n insertText: '$causedBy',\n documentation: 'The identity that caused the event. Chronicle cannot yet evaluate this short form (Cratis/Chronicle#4119) - prefer $eventContext.causedBy.<property>.',\n detail: 'Identity Expression'\n },\n {\n label: '$eventContext',\n insertText: '$eventContext.',\n documentation: `Metadata about the event: ${eventContextMembers.map((member) => member.name).join(', ')}`,\n detail: 'Event Context Expression'\n },\n ];\n\n expressions.forEach((expr) => {\n if (!context.currentWord || expr.label.startsWith(context.currentWord) || expr.label.startsWith('$' + context.currentWord)) {\n suggestions.push({\n label: expr.label,\n kind: 14, // Keyword/builtin\n insertText: expr.insertText,\n documentation: expr.documentation,\n detail: expr.detail,\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n\n private addPropertyMemberCompletions(suggestions: languages.CompletionItem[], context: CompletionContext): void {\n // Any depth of an event-context path, as an expression or as a dynamic key (propertyName.$eventContext.<path>)\n const eventContextMatch = context.textBeforeCursor.match(EVENT_CONTEXT_PATH);\n if (eventContextMatch) {\n const segments = eventContextMatch[1].split('.').filter((segment) => segment.length > 0);\n this.addEventContextMemberCompletions(suggestions, context, segments, eventContextMatch[2]);\n return;\n }\n\n const match = context.textBeforeCursor.match(/(\\w+|\\$\\w+)\\.(\\w*)$/);\n if (!match) return;\n\n const [, objectName, partialProp] = match;\n\n // $causedBy is the short form of $eventContext.causedBy, at any depth\n const causedByMatch = context.textBeforeCursor.match(/\\$causedBy\\.((?:\\w+\\.)*)(\\w*)$/);\n if (causedByMatch) {\n const segments = causedByMatch[1].split('.').filter((segment) => segment.length > 0);\n this.addEventContextMemberCompletions(suggestions, context, ['causedBy', ...segments], causedByMatch[2]);\n return;\n }\n\n // Handle event type properties\n const eventSchema = this.eventSchemas[objectName];\n if (eventSchema?.properties) {\n Object.entries(eventSchema.properties).forEach(([propName, propSchema]) => {\n if (!partialProp || propName.startsWith(partialProp)) {\n suggestions.push({\n label: propName,\n kind: 9,\n insertText: propName,\n documentation: `Event property: ${propName}`,\n detail: this.getPropertyTypeDescription(propSchema),\n range: this.getRangeForWord(context),\n });\n }\n });\n }\n }\n\n private addEventContextMemberCompletions(\n suggestions: languages.CompletionItem[],\n context: CompletionContext,\n segments: readonly string[],\n partial: string\n ): void {\n const members = eventContextMembersAfter(segments) ?? [];\n members\n .filter((member) => !partial || member.name.startsWith(partial))\n .forEach((member) => {\n suggestions.push({\n label: member.name,\n kind: member.kind === 'function' ? 1 : 9,\n insertText: member.name,\n documentation: member.description,\n detail: member.type,\n range: this.getRangeForWord(context),\n });\n });\n }\n\n private getCurrentEventType(model: editor.ITextModel, lineNumber: number): string | null {\n // Search backwards to find the event type declaration\n for (let i = lineNumber; i >= 1; i--) {\n const line = model.getLineContent(i).trim();\n const fromMatch = line.match(/^from\\s+([\\w-]+)/);\n if (fromMatch) {\n return fromMatch[1];\n }\n const everyMatch = line.match(/^every$/);\n if (everyMatch) {\n return null; // every block doesn't have a specific event type\n }\n }\n return null;\n }\n\n private getActiveReadModelSchema(model: editor.ITextModel): JsonSchema | undefined {\n const firstLine = model.getLineContent(1).trim();\n const match = firstLine.match(/^projection\\s+[\\w.]+\\s*=>\\s*([\\w.]+)/);\n if (!match) return undefined;\n\n const readModelName = match[1];\n const readModel = this.resolveReadModelInfo(readModelName);\n return readModel?.schema;\n }\n\n private resolveReadModelInfo(readModelToken: string): ReadModelInfo | null {\n return this.readModels.find(rm => rm.identifier === readModelToken || rm.displayName === readModelToken) || null;\n }\n\n private getSchemaName(schema: JsonSchema): string | undefined {\n if (schema.name) return schema.name;\n if (schema.title) return schema.title;\n if (typeof schema.$id === 'string') {\n const parts = schema.$id.split('/');\n return parts[parts.length - 1] || schema.$id;\n }\n return undefined;\n }\n\n private getSchemaDescription(schema: JsonSchema): string | undefined {\n return schema.description || undefined;\n }\n\n private getPropertyTypeDescription(propSchema: JsonSchemaProperty): string {\n if (propSchema.type === 'array' && propSchema.items) {\n const itemType = propSchema.items.type || propSchema.items.$id?.split('/').pop() || 'unknown';\n return `${itemType}[]`;\n }\n return propSchema.type || propSchema.$ref?.split('/').pop() || 'unknown';\n }\n\n private getRangeForWord(context: CompletionContext): IRange {\n const startColumn = context.textBeforeCursor.length - context.currentWord.length + 1;\n const endColumn = startColumn + context.currentWord.length;\n return {\n startLineNumber: context.lineNumber,\n startColumn: Math.max(1, startColumn),\n endLineNumber: context.lineNumber,\n endColumn: Math.max(1, endColumn),\n };\n }\n}\n", "// 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 \u2014 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", "// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { editor, languages, Position } from 'monaco-editor';\nimport type { JsonSchema, JsonSchemaProperty, ReadModelInfo, DraftReadModelInfo } from './index';\nimport { describeEventContext, describeEventContextMember, eventContextMemberAt } from '../../event-context';\n\nexport class HoverProvider implements languages.HoverProvider {\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 // 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 setDraftReadModel(draft: DraftReadModelInfo | null): void {\n this.draftReadModel = draft;\n }\n\n provideHover(model: editor.ITextModel, position: Position): languages.ProviderResult<languages.Hover> {\n const word = model.getWordAtPosition(position);\n if (!word) return null;\n\n const wordText = word.word;\n\n // Check if we're on the projection name (before '=>')\n const lineContent = model.getLineContent(position.lineNumber);\n const projectionNameMatch = this.getProjectionNameAtPosition(lineContent, position.column);\n if (projectionNameMatch) {\n return {\n contents: [{ value: 'The name of the projection' }],\n range: {\n startLineNumber: position.lineNumber,\n startColumn: word.startColumn,\n endLineNumber: position.lineNumber,\n endColumn: word.endColumn,\n },\n };\n }\n\n // A segment of an $eventContext path - before keywords, since a member such as 'id' is also a keyword\n const eventContextInfo = this.getEventContextInfo(lineContent, word.startColumn);\n if (eventContextInfo) {\n return {\n contents: [{ value: eventContextInfo }],\n range: {\n startLineNumber: position.lineNumber,\n startColumn: word.startColumn,\n endLineNumber: position.lineNumber,\n endColumn: word.endColumn,\n },\n };\n }\n\n // Check if it's a keyword\n const keywordInfo = this.getKeywordInfo(wordText);\n if (keywordInfo) {\n return {\n contents: [{ value: keywordInfo }],\n range: {\n startLineNumber: position.lineNumber,\n startColumn: word.startColumn,\n endLineNumber: position.lineNumber,\n endColumn: word.endColumn,\n },\n };\n }\n\n // Check if it's a built-in expression\n const expressionInfo = this.getExpressionInfo(wordText);\n if (expressionInfo) {\n return {\n contents: [{ value: expressionInfo }],\n range: {\n startLineNumber: position.lineNumber,\n startColumn: word.startColumn,\n endLineNumber: position.lineNumber,\n endColumn: word.endColumn,\n },\n };\n }\n\n // Check if it's an event type\n if (this.eventSchemas[wordText]) {\n const schema = this.eventSchemas[wordText];\n const description = this.getSchemaDescription(schema);\n const properties = this.getSchemaProperties(schema);\n\n let content = `**Event Type:** \\`${wordText}\\`\\n\\n`;\n if (description) {\n content += `${description}\\n\\n`;\n }\n if (properties.length > 0) {\n content += `**Properties:**\\n\\n${properties.map(p => `- \\`${p.name}\\`: ${p.type}`).join('\\n')}`;\n }\n\n return {\n contents: [{ value: content }],\n range: {\n startLineNumber: position.lineNumber,\n startColumn: word.startColumn,\n endLineNumber: position.lineNumber,\n endColumn: word.endColumn,\n },\n };\n }\n\n // Check if it's a draft read model\n if (this.isDraftReadModel(wordText)) {\n const description = this.getSchemaDescription(this.draftReadModel!.schema);\n const properties = this.getSchemaProperties(this.draftReadModel!.schema);\n const identifier = this.draftReadModel!.identifier;\n const displayName = this.draftReadModel!.displayName;\n\n let content = `**Read Model (Draft):** \\`${displayName}\\`\\n\\n**Identifier:** \\`${identifier}\\`\\n\\n`;\n if (description) {\n content += `${description}\\n\\n`;\n }\n if (properties.length > 0) {\n content += `**Properties:**\\n\\n${properties.map(p => `- \\`${p.name}\\`: ${p.type}`).join('\\n')}`;\n }\n\n return {\n contents: [{ value: content }],\n range: {\n startLineNumber: position.lineNumber,\n startColumn: word.startColumn,\n endLineNumber: position.lineNumber,\n endColumn: word.endColumn,\n },\n };\n }\n\n // Check if it's a read model\n const readModel = this.resolveReadModelInfo(wordText);\n if (readModel) {\n const description = this.getSchemaDescription(readModel.schema);\n const properties = this.getSchemaProperties(readModel.schema);\n\n let content = `**Read Model:** \\`${readModel.displayName}\\`\\n\\n**Identifier:** \\`${readModel.identifier}\\`\\n\\n`;\n if (description) {\n content += `${description}\\n\\n`;\n }\n if (properties.length > 0) {\n content += `**Properties:**\\n\\n${properties.map(p => `- \\`${p.name}\\`: ${p.type}`).join('\\n')}`;\n }\n\n return {\n contents: [{ value: content }],\n range: {\n startLineNumber: position.lineNumber,\n startColumn: word.startColumn,\n endLineNumber: position.lineNumber,\n endColumn: word.endColumn,\n },\n };\n }\n\n // Check if it's a property in the current context\n const propertyInfo = this.getPropertyInfo(model, position, wordText);\n if (propertyInfo) {\n return {\n contents: [{ value: propertyInfo }],\n range: {\n startLineNumber: position.lineNumber,\n startColumn: word.startColumn,\n endLineNumber: position.lineNumber,\n endColumn: word.endColumn,\n },\n };\n }\n\n return null;\n }\n\n private getKeywordInfo(word: string): string | null {\n const keywords: Record<string, string> = {\n 'description': '**description** - Report-only intent on the projection header, as quoted or fenced text. Not accepted on variants or nested blocks; adds no executable bytes.',\n 'projection': '**projection** - Defines a projection that transforms events into a read model',\n 'from': '**from** *<EventType>*\\n\\nHandles specific event types and maps their properties to the read model.',\n 'all': '**all**\\n\\nSubscribes to **all event types in the system**, regardless of explicit `from` blocks. Mappings inside `all` run for every event that arrives system-wide.',\n 'every': '**every**\\n\\nHandles all events the projection **explicitly subscribes to** through `from` blocks, with automatic property mapping.',\n 'key': '**key** *<expression>*\\n\\nDefines the projection key or composite key type.',\n 'parent': '**parent** *<expression>*\\n\\nDefines a parent relationship for hierarchical projections.',\n 'join': '**join** *<collection>* **on** *<property>*\\n\\nJoins with a child collection based on a property.',\n 'children': '**children** *<collection>* **id** *<expression>*\\n\\nDefines operations on child collections.',\n 'remove': '**remove with** *<EventType>* or **remove via join on** *<EventType>*\\n\\nRemoves items from the read model based on events.',\n 'clear': '**clear** *<property>*\\n\\nRemoves the value a property holds. **clear with** *<EventType>* nulls a whole nested object instead.',\n 'automap': '**automap** or **no automap**\\n\\nControls automatic property mapping from events to the read model.',\n 'increment': '**increment** *<property>*\\n\\nIncrements a numeric property by 1.',\n 'decrement': '**decrement** *<property>*\\n\\nDecrements a numeric property by 1.',\n 'count': '**count** *<property>*\\n\\nCounts occurrences and stores in a property.',\n 'add': '**add** *<property>* **by** *<expression>*\\n\\nAdds a value to a property.',\n 'subtract': '**subtract** *<property>* **by** *<expression>*\\n\\nSubtracts a value from a property.',\n 'exclude': '**exclude children**\\n\\nExcludes child collections from automatic mapping.',\n 'events': '**events** *<EventType>*, ...\\n\\nSpecifies which event types to include in a join.',\n 'via': 'Used with **remove via join on** to remove items via a join relationship.',\n 'with': 'Used with **remove with** to specify which event type triggers removal.',\n 'on': 'Used with **join** to specify the join property.',\n 'by': 'Used with **add** or **subtract** to specify the value.',\n 'id': 'Used with **children** to specify the child identifier expression.',\n 'no': 'Used with **no automap** to disable automatic property mapping.',\n 'variant': '**variant** *<Name>*\\n\\nDeclares one of several mutually exclusive named read models sharing the projection\\'s identity. Entering one variant removes the entity from every other variant of the same projection.',\n 'enters': '**enters on** *<EventType>*\\n\\nDeclares the event that activates this variant - the only event allowed to create it. Every other event the variant subscribes to is update-only.',\n };\n\n return keywords[word] || null;\n }\n\n private getExpressionInfo(word: string): string | null {\n const expressions: Record<string, string> = {\n '$eventSourceId': '**$eventSourceId**\\n\\nThe identifier of the event source (aggregate/entity) that generated the event.',\n '$causedBy': '**$causedBy**\\n\\nThe identity that caused the event - `subject`, `name`, `userName` or `onBehalfOf`, itself an identity.\\n\\nChronicle cannot yet evaluate this short form (Cratis/Chronicle#4119); prefer **$eventContext.causedBy**.*property*.',\n '$eventContext': describeEventContext(),\n };\n\n return expressions[word] || null;\n }\n\n // Describes the $eventContext path segment starting at the given column, if the word there is one.\n private getEventContextInfo(lineContent: string, startColumn: number): string | null {\n for (const match of lineContent.matchAll(/\\$eventContext((?:\\.\\w+(?:\\(\\))?)*)/g)) {\n let column = (match.index ?? 0) + 1;\n if (startColumn === column) return describeEventContext();\n\n column += '$eventContext'.length;\n const segments = match[1].split('.').slice(1);\n for (let index = 0; index < segments.length; index++) {\n column += 1;\n if (startColumn === column) {\n const path = segments.slice(0, index + 1);\n const member = eventContextMemberAt(path);\n return member ? describeEventContextMember(path.join('.'), member) : null;\n }\n\n column += segments[index].length;\n }\n }\n\n return null;\n }\n\n private getPropertyInfo(model: editor.ITextModel, position: Position, propertyName: string): string | null {\n // Try to find the active read model\n const firstLine = model.getLineContent(1).trim();\n const match = firstLine.match(/^projection\\s+[\\w.]+\\s*=>\\s*([\\w.]+)/);\n if (!match) return null;\n\n const readModelName = match[1];\n const draftMatch = this.isDraftReadModel(readModelName) ? this.draftReadModel : null;\n const resolvedReadModel = draftMatch ? null : this.resolveReadModelInfo(readModelName);\n const activeSchema = draftMatch?.schema || resolvedReadModel?.schema;\n\n if (activeSchema?.properties && activeSchema.properties[propertyName]) {\n const prop = activeSchema.properties[propertyName];\n const type = this.getPropertyTypeDescription(prop);\n const description = prop.description;\n\n let content = `**Property:** \\`${propertyName}\\`\\n\\n**Type:** \\`${type}\\``;\n if (description) {\n content += `\\n\\n${description}`;\n }\n return content;\n }\n\n // Check if it's an event property\n const eventType = this.getCurrentEventType(model, position.lineNumber);\n if (eventType && this.eventSchemas[eventType]) {\n const eventSchema = this.eventSchemas[eventType];\n if (eventSchema.properties && eventSchema.properties[propertyName]) {\n const prop = eventSchema.properties[propertyName];\n const type = this.getPropertyTypeDescription(prop);\n const description = prop.description;\n\n let content = `**Event Property:** \\`${propertyName}\\`\\n\\n**Type:** \\`${type}\\``;\n if (description) {\n content += `\\n\\n${description}`;\n }\n return content;\n }\n }\n\n return null;\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 isDraftReadModel(readModelToken: string): boolean {\n return !!this.draftReadModel && (this.draftReadModel.identifier === readModelToken || this.draftReadModel.displayName === readModelToken);\n }\n\n private getCurrentEventType(model: editor.ITextModel, lineNumber: number): string | null {\n for (let i = lineNumber; i >= 1; i--) {\n const line = model.getLineContent(i).trim();\n const fromMatch = line.match(/^from\\s+([\\w-]+)/);\n if (fromMatch) {\n return fromMatch[1];\n }\n }\n return null;\n }\n\n private getProjectionNameAtPosition(lineContent: string, column: number): boolean {\n // Check if we're on line 1 (projection declaration line)\n const projectionMatch = lineContent.match(/^\\s*projection\\s+(\\S+)\\s*=>/);\n if (!projectionMatch) return false;\n\n const projectionKeywordEnd = lineContent.indexOf('projection') + 'projection'.length;\n const arrowStart = lineContent.indexOf('=>');\n\n // Check if cursor is between 'projection' keyword and '=>'\n // and is on the projection name itself\n return column > projectionKeywordEnd && column <= arrowStart;\n }\n\n private getSchemaName(schema: JsonSchema): string | undefined {\n if (schema.name) return schema.name;\n if (schema.title) return schema.title;\n if (typeof schema.$id === 'string') {\n const parts = schema.$id.split('/');\n return parts[parts.length - 1] || schema.$id;\n }\n return undefined;\n }\n\n private getSchemaDescription(schema: JsonSchema): string | undefined {\n return schema.description || undefined;\n }\n\n private getSchemaProperties(schema: JsonSchema): Array<{ name: string; type: string }> {\n if (!schema.properties) return [];\n\n return Object.entries(schema.properties).map(([name, prop]) => ({\n name,\n type: this.getPropertyTypeDescription(prop),\n }));\n }\n\n private getPropertyTypeDescription(propSchema: JsonSchemaProperty): string {\n if (propSchema.type === 'array' && propSchema.items) {\n const itemType = propSchema.items.type || propSchema.items.$ref?.split('/').pop() || 'unknown';\n return `${itemType}[]`;\n }\n return propSchema.type || propSchema.$ref?.split('/').pop() || 'unknown';\n }\n}\n", "// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type * as Monaco from 'monaco-editor';\nimport type { JsonSchema, ReadModelInfo, DraftReadModelInfo } from './index';\n\nexport class CodeActionProvider {\n private readModels: ReadModelInfo[] = [];\n private draftReadModel: DraftReadModelInfo | null = null;\n private onCreateReadModel?: (readModelName: string) => void;\n private onEditReadModel?: (readModelName: string, currentSchema: JsonSchema) => void;\n\n setReadModels(readModels: ReadModelInfo[]): void {\n this.readModels = readModels;\n }\n\n setDraftReadModel(draft: DraftReadModelInfo | null): void {\n this.draftReadModel = draft;\n }\n\n // Keep for backwards compatibility\n setReadModelSchemas(schemas: JsonSchema[]): void {\n this.readModels = schemas.map(schema => ({\n identifier: schema.title || schema.name || '',\n displayName: schema.title || schema.name || '',\n schema\n }));\n }\n\n setCreateReadModelCallback(callback: (readModelName: string) => void): void {\n this.onCreateReadModel = callback;\n }\n\n setEditReadModelCallback(callback: (readModelName: string, currentSchema: JsonSchema) => void): void {\n this.onEditReadModel = callback;\n }\n\n invokeCreateReadModel(readModelName: string): void {\n this.onCreateReadModel?.(readModelName);\n }\n\n invokeEditReadModel(readModelName: string, currentSchema: JsonSchema): void {\n this.onEditReadModel?.(readModelName, currentSchema);\n }\n\n provideCodeActions(\n _model: Monaco.editor.ITextModel,\n _range: Monaco.Range,\n context: Monaco.languages.CodeActionContext\n ): Monaco.languages.ProviderResult<Monaco.languages.CodeActionList> {\n const actions: Monaco.languages.CodeAction[] = [];\n\n // Check for diagnostics about undefined read models (errors)\n const notFoundDiagnostics = context.markers.filter(\n (marker: Monaco.editor.IMarkerData) => marker.message.includes(\"Read model\") && marker.message.includes(\"not found\")\n );\n\n // Check for diagnostics about draft read models (info markers)\n const draftDiagnostics = context.markers.filter(\n (marker: Monaco.editor.IMarkerData) => marker.message.includes(\"Read model\") && marker.message.includes(\"is a draft\")\n );\n\n // Handle \"not found\" errors - offer to create\n for (const diagnostic of notFoundDiagnostics) {\n const match = diagnostic.message.match(/Read model ['\"]([\\w.]+)['\"]/);\n if (match && match[1]) {\n const readModelName = match[1];\n\n // Check if this read model already exists as a persisted read model\n const existsAsPersisted = this.readModels.some(\n rm => rm.identifier === readModelName || rm.displayName === readModelName\n );\n\n if (!existsAsPersisted && this.onCreateReadModel) {\n actions.push({\n title: `Create read model '${readModelName}'`,\n diagnostics: [diagnostic],\n kind: 'quickfix',\n edit: undefined,\n isPreferred: true,\n command: {\n id: 'pdl.createReadModel',\n title: `Create ${readModelName}`,\n arguments: [readModelName]\n }\n });\n }\n }\n }\n\n // Handle draft read model info markers - offer to edit\n for (const diagnostic of draftDiagnostics) {\n const match = diagnostic.message.match(/Read model ['\"]([\\w.]+)['\"]/);\n if (match && match[1]) {\n const readModelName = match[1];\n\n if (this.draftReadModel && this.isDraftReadModel(readModelName) && this.onEditReadModel) {\n actions.push({\n title: `Edit read model '${readModelName}'`,\n diagnostics: [diagnostic],\n kind: 'quickfix',\n edit: undefined,\n isPreferred: true,\n command: {\n id: 'pdl.editReadModel',\n title: `Edit ${readModelName}`,\n arguments: [readModelName, this.draftReadModel.schema]\n }\n });\n }\n }\n }\n\n return {\n actions,\n dispose: () => { /* No cleanup needed */ }\n };\n }\n\n private isDraftReadModel(readModelToken: string): boolean {\n return !!this.draftReadModel && (this.draftReadModel.identifier === readModelToken || this.draftReadModel.displayName === readModelToken);\n }\n}\n", "// 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"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["languageId", "KEYWORDS", "BUILTINS", "OPERATORS", "configuration", "monarchLanguage", "EVENT_CONTEXT_PATH", "CompletionProvider", "__name", "readModels", "sequences", "schemas", "schema", "map", "s", "i", "name", "model", "position", "context", "suggestions", "activeSchema", "lineContent", "textBeforeCursor", "textAfterCursor", "currentWord", "indentLevel", "text", "match", "keyword", "countIncrDecrPattern", "addSubtractPattern", "trimmed", "arrowMatch", "partialReadModel", "readModel", "label", "afterProjection", "eventName", "sequenceId", "typeName", "propName", "propSchema", "addSubtractMatch", "partialProp", "kw", "eventType", "eventSchema", "eventContextMembers", "member", "expr", "eventContextMatch", "segments", "segment", "objectName", "causedByMatch", "partial", "eventContextMembersAfter", "lineNumber", "line", "fromMatch", "readModelName", "readModelToken", "rm", "parts", "startColumn", "endColumn", "Validator", "__name", "readModels", "draft", "schemas", "schema", "map", "s", "i", "name", "model", "markers", "content", "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", "readModelToken", "rm", "prefixMatch", "fallbackIndex", "text", "startCol", "endCol", "message", "parts", "HoverProvider", "__name", "readModels", "schemas", "schema", "map", "s", "i", "name", "draft", "model", "position", "word", "wordText", "lineContent", "eventContextInfo", "keywordInfo", "expressionInfo", "description", "properties", "content", "identifier", "p", "readModel", "propertyInfo", "describeEventContext", "startColumn", "match", "column", "segments", "index", "path", "member", "eventContextMemberAt", "describeEventContextMember", "propertyName", "readModelName", "draftMatch", "resolvedReadModel", "activeSchema", "prop", "type", "eventType", "eventSchema", "readModelToken", "rm", "lineNumber", "fromMatch", "projectionKeywordEnd", "arrowStart", "parts", "propSchema", "CodeActionProvider", "__name", "readModels", "draft", "schemas", "schema", "callback", "readModelName", "currentSchema", "_model", "_range", "context", "actions", "notFoundDiagnostics", "marker", "draftDiagnostics", "diagnostic", "match", "rm", "readModelToken", "validator", "completionProvider", "hoverProvider", "codeActionProvider", "disposables", "monacoInstance", "isRegistered", "pendingCreateReadModelCallback", "pendingEditReadModelCallback", "registerProjectionLanguage", "monaco", "configuration", "monarchLanguage", "Validator", "CompletionProvider", "HoverProvider", "CodeActionProvider", "_accessor", "readModelName", "currentSchema", "model", "validateModel", "dispose", "__name", "disposable", "setReadModelSchema", "schema", "setReadModelSchemas", "readModels", "revalidateAllModels", "setCreateReadModelCallback", "callback", "setEditReadModelCallback", "setDraftReadModel", "draft", "setEventSchemas", "eventSchemas", "normalized", "input", "out", "s", "i", "name", "setEventSequences", "sequences", "markers"]
|
|
7
|
-
}
|
|
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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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=`pdl`,t=/* @__PURE__ */ `projection.description.sequence.all.every.on.from.key.parent.join.automap.no.children.nested.identified.by.add.subtract.remove.via.with.default.increment.decrement.count.set.unset.clear.events.id.exclude.variant.enters`.split(`.`),n=[`$eventSourceId`,`$causedBy`,`$eventContext`],r=[`=`,`+=`,`-=`,`=>`,`.`],i={comments:{lineComment:`#`},brackets:[[`{`,`}`],[`[`,`]`],[`(`,`)`]],autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`},{open:"`",close:"`"}],surroundingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`},{open:"`",close:"`"}],indentationRules:{increaseIndentPattern:/^.*(:|\bon\b|\ball\b|\bevery\b|\bchildren\b|\bnested\b|\bparent\b|\bvariant\b)\s*$/,decreaseIndentPattern:/^.*\}.*$/},folding:{offSide:!0,markers:{start:/^\s*(projection|all|every|on|children|nested|parent|variant)/,end:/^\s*$/}},wordPattern:/@?[a-zA-Z_$][\w$-]*/},a={defaultToken:``,tokenPostfix:`.pdl`,keywords:t,builtins:n,operators:r,symbols:/[=><!~?:&|+\-*/^%]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[{include:`@whitespace`},[/`/,{token:`string.template`,next:`@templateString`}],[/@[a-zA-Z_$][\w$]*/,`identifier.escape`],[/[A-Z][a-zA-Z_$][\w$]*/,{cases:{"@keywords":`invalid`,"@default":`identifier`}}],[/[a-z_$][\w$]*/,{cases:{"@keywords":`keyword`,"@builtins":`variable.predefined`,"@default":`identifier`}}],[/[{}()[\]]/,`@brackets`],[/=>/,`operator.arrow`],[/@symbols/,{cases:{"@operators":`operator`,"@default":``}}],[/\d*\.\d+([eE][-+]?\d+)?/,`number.float`],[/0[xX][0-9a-fA-F]+/,`number.hex`],[/\d+/,`number`],[/[;,.]/,`delimiter`],[/"([^"\\]|\\.)*$/,`string.invalid`],[/"/,{token:`string.quote`,next:`@string`}]],whitespace:[[/[ \t\r\n]+/,``],[/#.*$/,`comment`]],templateString:[[/\$\{/,{token:`delimiter.bracket`,next:`@templateExpression`}],[/[^\\`$]+/,`string.template`],[/@escapes/,`string.template.escape`],[/\\./,`string.template.escape.invalid`],[/`/,{token:`string.template`,next:`@pop`}]],templateExpression:[[/\}/,{token:`delimiter.bracket`,next:`@pop`}],{include:`@root`}],string:[[/[^\\"]+/,`string`],[/@escapes/,`string.escape`],[/\\./,`string.escape.invalid`],[/"/,{token:`string.quote`,next:`@pop`}]]}};export{i as configuration,e as languageId,a as monarchLanguage};
|
|
2
|
+
//# sourceMappingURL=language.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import"./_virtual/_virtual/_rolldown/runtime.js";import{clauseKeywords as e}from"./language.js";import{typeReferenceSymbol as t}from"./TypeReferenceSymbol.js";import{unescapeString as n}from"./compiler/Text/StringLiteral.js";import{eventBodyReservedWords as r}from"./compiler/Text/ReservedWords.js";import"./compiler/index.js";import{fenceMap as i,indentOf as a}from"./document-context.js";import{eventAnalysisSource as o}from"./event-analysis-source.js";import{responseAnalysis as s}from"./response-analysis.js";import{fileReferenceOn as c}from"./file-references.js";const l=/^concept\s+(\w+)\s*:\s*(\w+)((?:\s+@\w+)*)\s*$/,u=/^\s*(@?[a-z_]\w*)\s+([\w.]+(?:\[\])?(?:\?|\s+optional)?)(\s+generated)?(\s+identifier)?(\s+subject)?\s*$/,d=/^([a-z_]\w*)\s+reason\s+"((?:[^"\\]|\\.)*)"\s*$/,f=/^\s*reads\s+([A-Z]\w*)(?:\s+as\s+([a-z_]\w*))?(?:\s+by\s+([a-z_]\w*))?\s*$/,p=[`authorize`,`produces`,`reads`],m=/^(?:(?:or|and)\s+)?[A-Za-z_(][\p{L}\p{Mn}\p{Nd}\p{Pc}\s()]*$/u,h=r,g=[`tag`,`for`,`generation`,`origin`,`namespace`,`sequence`,`correlation`,`causation`,`causedBy`,`occurred`],_=/^\s*(?:by|filter)\s+([a-z_]\w*)\s+([\w.]+(?:\[\])?(?:\?|\s+optional)?)(?:\s+from\s+.+)?\s*$/;function propertyTypeReference(e){return e.typeReference??t(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,n,r){return n.map(t=>({index:t,match:e[t].match(u)})).filter(e=>e.match!==null).filter(({match:e})=>e[1].startsWith(`@`)||e[1]===`as`||!r.includes(e[1])).map(({index:n,match:r})=>({name:r[1].replace(/^@/,``),type:r[2],typeReference:t(r[2]),sourceType:sourceTypeAt(e[n],e[n].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:n}))}function collectBody(e,t,n,r){let i=[];for(let o=n+1;o<e.length;o++){if(t[o])continue;let n=e[o];if(n.trim().length!==0){if(a(n)<=r)break;i.push(o)}}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 o,s=!1;return i.filter(t=>{let n=a(e[t]),r=e[t].trim();return o!==void 0&&n>o&&(!s||m.test(r))?!1:(o=r!==`validate csharp`&&propertiesIn(e,[t],p).length>0||/^description(?:\s|$)/.test(r)?void 0:n,s=/^authorize(?:\s|$)/.test(r),!0)})}const v=/* @__PURE__ */ new Map;function scanDocument(r){let u=r.join(`
|
|
2
|
+
`),p=v.get(u);if(p)return p;let m=s(r),y={...m.identityDetails?.length?{identityDetails:m.identityDetails}:{},authoringSources:[u],eventSources:m.eventSources.declarations,imports:[],concepts:[],types:[],policies:[],events:[],commands:[],queries:[],screens:[],triggers:[]};r=o(r);let b=i(r),x=r,S=b,C=r.map(e=>e.replace(/\s*=(?!=|>).*/,``));for(let i=0;i<r.length;i++){if(b[i])continue;let o=r[i],s=o.trim(),u=a(o),p=x[i].trim().match(/^import\s+([\w.]+)(?:\s+from\s+"(?:[^"\\]|\\.)*")?\s*$/);if(p&&u===0){let e=p[1],t=e.split(`.`).pop()??e;y.imports.push({qualifiedName:e,shortName:t,line:i});continue}let v=s.match(l);if(v){let e=collectBody(r,b,i,u).map(e=>r[e].trim()),t={};for(let n of e){let e=n.match(d);e&&t[e[1]]===void 0&&(t[e[1]]=e[2])}let n=v[2]===`Enum`?e.filter(e=>!d.test(e)):[];y.concepts.push({name:v[1],primitive:v[2],attributes:v[3].trim().split(/\s+/).filter(Boolean),attributeReasons:t,enumValues:n,line:i});continue}let w=s.match(/^type\s+(\w+)\s*$/);if(w){y.types.push({name:w[1],properties:propertiesIn(r,collectBody(r,b,i,u),e),line:i});continue}let T=s.match(/^policy\s+(\w+)\s*$/);if(T){let e=collectBody(r,b,i,u).filter(e=>!b[e]).map(e=>r[e].trim());y.policies.push({name:T[1],requires:e,line:i});continue}let E=x[i].trim().match(/^(?:(?:produces|(?<public>public))\s+)?event\s+(?<name>\w+)(?:\s+generation\s+(?<generation>\d+))?(?:\s+from\s+(?<origin>"(?:[^"\\]|\\.)*"))?\s*$/);if(E){let e=s.startsWith(`produces `),t=directBody(x,S,i,u),r=e?t:t.filter(e=>c(x[e],e)===void 0);y.events.push({name:E.groups.name,...E.groups.generation?{generation:Number(E.groups.generation)}:{},...E.groups.public||E.groups.origin?{visibility:`Public`}:{},...E.groups.origin?{origin:n(E.groups.origin.slice(1,-1))}:{},inline:e,properties:propertiesIn(e?C:x,r,e?g:h),line:i});continue}let D=m.commands.get(i);if(D){let e=directBody(r,b,i,u),t=e.filter(e=>/^\s*produces\b/.test(r[e])&&!m.operationProductionLines?.has(e));y.commands.push({name:D.name,properties:D.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(r[e.type.location.line-1],e.type.location.column),isIdentifier:e.isIdentifier||/\sidentifier\s*$/.test(r[e.location.line-1]),...e.isGenerated?{isGenerated:!0}:{},line:e.location.line-1})),response:D.response,productionHeaders:t,produces:t.flatMap(e=>{let t=x[e].trim(),n=/^produces\s+event\b/.test(t),r=/^produces\s+when\b/.test(t),i=r?directBody(x,S,e,a(x[e]))[0]:e;if(i===void 0)return[];let o=r?x[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(o===void 0||!/^[A-Za-z_]\w*$/.test(o))return[];let s=directBody(x,S,i,a(x[i])),c=s.map(e=>x[e].trim().match(/^for(?:\s+(.*))?$/)).filter(e=>e!==null);return[{name:o,inline:n,conditional:r,line:e,target:c.length===0?void 0:c.length===1?c[0][1]??``:``,mappings:s.flatMap(e=>{let t=x[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=>!b[e]).map(e=>({line:e,match:r[e].match(f)})).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 O=s.match(/^query\s+(\w+)\s*=>\s*(?:observable\s+)?([\w.]+(?:\[\])?(?:\?|\s+optional)?)\s*$/);if(O){let e=collectBody(r,b,i,u).map(e=>({index:e,match:r[e].match(_)})).filter(e=>e.match!==null).map(({index:e,match:n})=>({name:n[1],type:n[2],typeReference:t(n[2]),sourceType:sourceTypeAt(r[e],r[e].match(/^\s*(?:by|filter)\s+\S+\s+/)[0].length+1),isIdentifier:!1,line:e}));y.queries.push({name:O[1],returnType:O[2],returnTypeReference:t(O[2]),parameters:e,line:i});continue}let k=s.match(/^screen\s+(\w+)\s*$/);if(k){y.screens.push({name:k[1],line:i});continue}let A=s.match(/^trigger\s+(\w+)\s*$/);A&&u===0&&y.triggers.push({name:A[1],line:i})}return v.size>=16&&v.delete(v.keys().next().value),v.set(u,y),y}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 y=[`Startup`,`Shutdown`];function knownTriggerNames(e){return[...knownEventNames(e),...e.triggers.map(e=>e.name),...y]}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{y as builtInTriggerNames,directBody,knownEventNames,knownTriggerNames,knownTypeNames,mergeSymbols,propertyTypeReference,scanDocument,symbolsForBuffer};
|
|
3
|
+
//# sourceMappingURL=symbols.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbols.js","names":["conceptPattern","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","i","attributeReasons","reason","enumValues","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 { 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 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 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 body = collectBody(lines, fences, index, indent).map((i) => lines[i].trim());\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 enumValues =\n conceptMatch[2] === 'Enum'\n ? body.filter((line) => !attributeReasonPattern.test(line))\n : [];\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 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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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=`screenplay-dark`,t={base:`vs-dark`,inherit:!0,rules:[{token:`keyword.play`,foreground:`C586C0`},{token:`keyword.tag.play`,foreground:`569CD6`,fontStyle:`italic`},{token:`keyword.type.play`,foreground:`4FC1FF`,fontStyle:`bold`},{token:`type.play`,foreground:`4EC9B0`},{token:`type.identifier.play`,foreground:`4EC9B0`},{token:`identifier.play`,foreground:`9CDCFE`},{token:`annotation.play`,foreground:`DCDCAA`},{token:`variable.predefined.play`,foreground:`D7BA7D`},{token:`string.play`,foreground:`CE9178`},{token:`string.link.play`,foreground:`CE9178`,fontStyle:`underline`},{token:`string.invalid.play`,foreground:`F44747`},{token:`string.quote.play`,foreground:`6A9955`},{token:`number.play`,foreground:`B5CEA8`},{token:`number.float.play`,foreground:`B5CEA8`},{token:`comment.play`,foreground:`6A9955`,fontStyle:`italic`},{token:`operator.play`,foreground:`D4D4D4`},{token:`delimiter.play`,foreground:`CCCCCC`}],colors:{"editor.background":`#1E1E1E`}};export{t as screenplayDark,e as screenplayDarkThemeName};
|
|
2
|
+
//# sourceMappingURL=screenplay-dark.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=`screenplay-light`,t={base:`vs`,inherit:!0,rules:[{token:`keyword.play`,foreground:`AF00DB`},{token:`keyword.tag.play`,foreground:`0000FF`,fontStyle:`italic`},{token:`keyword.type.play`,foreground:`0070C1`,fontStyle:`bold`},{token:`type.play`,foreground:`267F99`},{token:`type.identifier.play`,foreground:`267F99`},{token:`identifier.play`,foreground:`001080`},{token:`annotation.play`,foreground:`795E26`},{token:`variable.predefined.play`,foreground:`B45309`},{token:`string.play`,foreground:`A31515`},{token:`string.link.play`,foreground:`A31515`,fontStyle:`underline`},{token:`string.invalid.play`,foreground:`CD3131`},{token:`string.quote.play`,foreground:`008000`},{token:`number.play`,foreground:`098658`},{token:`number.float.play`,foreground:`098658`},{token:`comment.play`,foreground:`008000`,fontStyle:`italic`},{token:`operator.play`,foreground:`000000`},{token:`delimiter.play`,foreground:`000000`}],colors:{"editor.background":`#FFFFFF`}};export{t as screenplayLight,e as screenplayLightThemeName};
|
|
2
|
+
//# sourceMappingURL=screenplay-light.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import"./_virtual/_virtual/_rolldown/runtime.js";import{clauseKeywords as e,codeBlockTags as t,constructKeywords as n,primitiveTypes as r,sliceTypes as i}from"./language.js";import{bmpWordCharacters as a}from"./bmp-word-characters.js";const o=/* @__PURE__ */ new Set([`operation`,`system`,`eventsource`,`purpose`,`runs`]),s={csharp:`csharp`,typescript:`typescript`,react:`typescript`,html:`html`,sql:`sql`};function subLanguageState(e){return`subLanguage_${e}`}function subLanguageExitRule(e){let t=[...n.filter(e=>!o.has(e)),...e.map(e=>e.keyword)];return[RegExp(`^\\s*(?:${t.join(`|`)})\\b`),{token:`@rematch`,next:`@pop`}]}const c=[[/\/\/.*$/,`comment`],[/\$(?:context|identity|eventContext|eventSourceId|causedBy|refusal)(?:\.\w+)*/,`variable.predefined`],[/\$(?:env|secrets|strings)\.[\w.]+/,`variable.predefined`],[/\$\.[\w.]*/,`variable.predefined`],[/"(?:[^"\\]|\\.)*"/,`string`],[/"(?:[^"\\]|\\.)*$/,`string.invalid`],[/\d+(?:ms|s|m|h|d)\b/,`number`],[/-?\d+\.\d+/,`number.float`],[/-?\d+/,`number`],[/=>|==|!=|>=|<=|[><=:?]/,`operator`],[/[[\](),.]/,`delimiter`],[/\s+/,`white`]];function createTokensProvider(l){let u={root:[[RegExp(`^(\\s*)(example)(\\s+)([A-Z][${a}]*)(\\s*)(:)(\\s*)([A-Z][${a}.]*)(?=\\s*(?://.*)?$)`),[`white`,`keyword`,`white`,`type.identifier`,`white`,`operator`,`white`,`type.identifier`]],[/^(\s*)(direction)(\s+)(inbound|outbound)(?=\s*(?:\/\/.*)?$)/,[`white`,`keyword`,`white`,`keyword`]],[RegExp(`^()(purpose)(\\s+)([A-Za-z_][${a}]*)(?=\\s*(?://.*)?$)`),[`white`,`keyword`,`white`,{token:`type.identifier`,next:`@purposeBody.$1`}]],[/^(\s*)(parameter)(\s+)([a-z_]\w*)(\s+)([\w.]+(?:\[\])?(?:\s+optional)?)(?=\s*(?:\/\/.*)?$)/,[`white`,`keyword`,`white`,`identifier`,`white`,`type.identifier`]],[/^(\s*)(case)(\s+)([A-Za-z_]\w*)(?=\s*(?:[a-z_]\w*\s*=|\/\/|$))/,[`white`,`keyword`,`white`,`type.identifier`]],[/\b(case)(\.)([a-z_]\w*)\b/,[`keyword`,`delimiter`,`identifier`]],[/^(\s*)(concept)(\s+)([^\s:]+)(\s*:\s*)(\w+)((?:\s+(?:@?pii|personal|@?sensitive|secret))*)(?=\s*(?:\/\/.*)?$)/,[`white`,`keyword`,`white`,`type.identifier`,`operator`,{token:`type.identifier`,next:`@conceptBody.$1`},`keyword`]],[/^(numbers)([ \t]+)(exact)(?=[ \t]*(?:(?:\/\/|#).*)?$)/,[`keyword`,`white`,`keyword`]],[/^(eventsource)(\s+)([A-Za-z_]\w*)(?=\s*(?:\/\/.*)?$)/,[`keyword`,`white`,`type.identifier`]],[/^(system)(\s+)([A-Z]\w*)(?=\s*(?:\/\/.*)?$)/,[`keyword`,`white`,`type.identifier`]],[/^(\s*)(runs)(\s+)(as)(\s+)(system)\b/,[`white`,`keyword`,`white`,`keyword`,`white`,`keyword`]],[/^(\s*)(produces\s+operation)(\s+)([A-Z]\w*)(?=\s*(?:\/\/.*)?$)/,[`white`,`keyword`,`white`,{token:`type.identifier`,next:`@operationBody.$1`}]],[/^(\s*)(given\s+operation)(\s+)([\w.]+)(\s+)(fails)(?=\s*(?:\/\/.*)?$)/,[`white`,`keyword`,`white`,`type.identifier`,`white`,`keyword`]],[/^(\s*)(then\s+(?:operation|compensated))(\s+)([\w.]+)(?=\s*(?:\/\/.*)?$)/,[`white`,`keyword`,`white`,`type.identifier`]],[RegExp(`^(\\s*)(command)(\\s+)([A-Za-z_][${a}]*)(?=\\s*(?://.*)?$)`),[`white`,`keyword`,`white`,{token:`type.identifier`,next:`@commandBody.$1`}]],[/^(\s*)(handler)(?=\s*(?:\/\/.*)?$)/,[`white`,{token:`keyword`,next:`@handlerBody.$1`}]],[/^(\s*@?[a-z_]\w*\s+)([\w.]+(?:\[\])?(?:\?|\s+optional)?)(\s+)(generated)(\s+identifier|)(?=\s*(?:\/\/.*)?$)/,[`identifier`,`type.identifier`,`white`,`keyword`,`keyword`]],[/^(\s*)(generated)(\s+)([a-z_]\w*)(\s*=(?!=|>))/,[`white`,`keyword`,`white`,`identifier`,`operator`]],[/^(\s*)(then)(\s+)(returns)\b/,[`white`,`keyword`,`white`,`keyword`]],[/^(\s*)(returns)(?=\s*(?:\/\/.*)?$|\s+@\w+\s*(?:\/\/.*)?$)/,[`white`,`keyword`]],[/^(\s*(?:by|filter)\s+[a-z_]\w*\s+)([\w.]+(?:\[\])?)(\s+)(optional)\b(?=\s*(?:from\b|\/\/|$))/,[`identifier`,`type.identifier`,`white`,`keyword`]],[/^(?!\s*(?:by|filter)\s+)(\s*@?[a-z_]\w*\s+)([\w.]+(?:\[\])?)(\s+)(optional)\b(?=\s*(?:identifier\b|from\b|=(?!=|>)|\/\/|$))/,[`identifier`,`type.identifier`,`white`,`keyword`]],[/^(\s*query\s+[A-Za-z_]\w*\s*=>\s*(?!observable\s+optional\s*(?:\/\/.*)?$)(?:observable\s+)?)([\w.]+(?:\[\])?)(\s+)(optional)\b(?=\s*(?:\/\/.*)?$)/,[`keyword`,`type.identifier`,`white`,`keyword`]],[RegExp(`^(\\s*)(given)(\\s+)(caller)(\\s+)(as)(\\s+)([A-Za-z_][${a}]*)(?=\\s*(?://.*)?$)`),[`white`,`keyword`,`white`,`keyword`,`white`,`keyword`,`white`,`type.identifier`]],[/^(\s*)(given|when)(\s+)(clock|capture|trigger|query)\b/,[`white`,`keyword`,`white`,`keyword`]],[/^(\s*)(then)(\s+)(result|no\s+(?:result|events))\b/,[`white`,`keyword`,`white`,`keyword`]],[/^(\s*)(then)(\s+)(events)(\s+)(in any order)(?=\s*(?:\/\/.*)?$)/,[`white`,`keyword`,`white`,`keyword`,`white`,`keyword`]],[/^(\s*)(when)(\s+)(redelivered)(\s+)([\w.]+)(\s+)(to)(\s+)([\w.]+)(?=\s*(?:\/\/.*)?$)/,[`white`,`keyword`,`white`,`keyword`,`white`,`type.identifier`,`white`,`keyword`,`white`,`type.identifier`]],[/^(\s*)(otherwise)(\s+)(hidden)(?=\s*(?:\/\/.*)?$)/,[`white`,`keyword`,`white`,`keyword`]],[/^(\s*)(otherwise)(\s+)(execute)(\s+)([\w.]+)(?=\s*(?:\/\/.*)?$)/,[`white`,`keyword`,`white`,`keyword`,`white`,`type.identifier`]],[/^(\s*)(when)(\s+)(?=.+\s+execute\s+[\w.]+\s*(?:\/\/.*)?$)/,[`white`,`keyword`,{token:`white`,next:`@guardedActionCondition`}]],[/^(\s*)(behavior)(\s+)([A-Za-z_]\w*)(?=\s*(?:\/\/.*)?$)/,[`white`,`keyword`,`white`,{token:`type.identifier`,next:`@behaviorBody.$1`}]],[/^(\s*)(on)(\s+)(refused)(\s+)(by)(\s+)(validation|constraint|authorization)\b/,[`white`,`keyword`,`white`,`keyword`,`white`,`keyword`,`white`,`keyword`]],[/^(\s*)(on)(\s+)(refused)(?=\s*(?:\/\/.*)?$)/,[`white`,`keyword`,`white`,`keyword`]],[/^(\s*)(on)(\s+)([\w-]+)\b/,[`white`,`keyword`,`white`,{token:`keyword`,next:`@interactionBody.$1`}]],[/^(\s*)(acknowledge)(?=\s*(?:\/\/.*)?$)/,[`white`,`keyword`]],[/^(\s*)(import)(\s+)("[^"\\]*")/,[`white`,`keyword`,`white`,`string.link`]],[/^(\s*)((?:(?:produces|public)\s+)?event)(\s+)([A-Za-z_]\w*)(\s+)(generation)(\s+)(\d+)(?=\s*(?:from\s+"(?:[^"\\]|\\.)*"\s*)?(?:\/\/.*)?$)/,[`white`,`keyword`,`white`,`type.identifier`,`white`,`keyword`,`white`,{token:`number`,next:`@eventBody.$1`}]],[/^(\s*)((?:(?:produces|public)\s+)?event)(\s+)([A-Za-z_]\w*)(?=\s*(?:from\s+"(?:[^"\\]|\\.)*"\s*)?(?:\/\/.*)?$)/,[`white`,`keyword`,`white`,{token:`type.identifier`,next:`@eventBody.$1`}]],...t.map(e=>[RegExp(`^\\s*\\x60\\x60\\x60${e}\\s*$`),{token:`string.quote`,next:`@codeBlock.${s[e]}`,nextEmbedded:s[e]}]),...t.map(e=>[RegExp(`\\b${e}\\b(?=\\s*$)`),{token:`keyword.tag`,next:`@codeBlockPending.${s[e]}`}]),...l.map(e=>[RegExp(`\\b${e.keyword}\\b`),{token:`keyword`,next:`@${subLanguageState(e.keyword)}`}]),[/^(\s*)(documentation)(?=\s+[\w.]+(?:\[\])?(?:\?|\s+optional)?\s*(?:identifier\b|generated\b|=(?!=|>)|\/\/|$))/,[`white`,`identifier`]],[/\b(?:description|documentation)\b(?=\s*(?:\/\/.*)?$)/,{token:`keyword`,next:`@descriptionBlockPending`}],[/\brow-click\b/,`keyword`],[/^\s*@[a-z_]\w*/,`identifier`],[/@\w+/,`annotation`],[/[A-Z]\w*/,{cases:{"@sliceTypes":`keyword.type`,"@primitiveTypes":`type`,"@default":`type.identifier`}}],[/[a-z_]\w*/,{cases:{"@keywords":`keyword`,"@default":`identifier`}}],{include:`@common`}],guardedActionCondition:[[/(execute)(\s+)([\w.]+)(?=\s*(?:\/\/.*)?$)/,[`keyword`,`white`,{token:`type.identifier`,next:`@pop`}]],{include:`@root`}],behaviorBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:`@rematch`,next:`@pop`}],{include:`@root`}],interactionBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:`@rematch`,next:`@pop`}],[/^(\s*)(otherwise)(?=\s*(?:\/\/.*)?$)/,[`white`,`keyword`]],[/^(\s*)(when)(\s+)(?=item\.|\()/,[`white`,`keyword`,`white`]],[/^(\s*)(execute)(\s+)([\w.]+)(?=\s*(?:\/\/.*)?$)/,[`white`,`keyword`,`white`,`type.identifier`]],{include:`@root`}],purposeBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:`@rematch`,next:`@pop`}],[/^(\s*)(basis|interest|condition|authorization|subjects|retention|recipient|transfer|erasure)(\s+)/,[`white`,`keyword`,`white`]],[/\b(safeguard|exception)\b/,`keyword`],{include:`@root`}],conceptBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:`@rematch`,next:`@pop`}],[/^(\s*)(@?pii|personal|@?sensitive|secret)(\s+)(reason|scope|special|criminal)\b/,[`white`,`keyword`,`white`,`keyword`]],{include:`@root`}],commandBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:`@rematch`,next:`@pop`}],[/^(\s*)(validate)(?=\s*(?:\/\/.*)?$)/,[`white`,{token:`keyword`,next:`@commandValidation.$1`}]],{include:`@root`}],commandValidation:[[/^(?!$S2[ \t]+|\s*$)/,{token:`@rematch`,next:`@pop`}],[RegExp(`^(\\s*)([${a}.]+)(\\s+)(rule)(\\s+)([A-Za-z_][${a}]*)(?=\\s*(?:severity\\s+\\w+|message\\s+.*|//.*|$))`),[`white`,`identifier`,`white`,`keyword`,`white`,{token:`type.identifier`,next:`@namedRuleBody.$1`}]],{include:`@root`}],namedRuleBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:`@rematch`,next:`@pop`}],[/^(\s*)(implementation)(?=\s*(?:\/\/.*)?$)/,[`white`,{token:`keyword`,next:`@implementationBody.$1`}]],{include:`@root`}],operationBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:`@rematch`,next:`@pop`}],[/^(\s*)(execute|compensate)(?=\s*(?:\/\/.*)?$)/,[`white`,{token:`keyword`,next:`@operationPhase.$1`}]],[/^(\s*)(uses)(\s+)([A-Z]\w*)(?=\s*(?:\/\/.*)?$)/,[`white`,`keyword`,`white`,`type.identifier`]],[/^(\s*)(@?[a-z_]\w*)(\s+)([\w.]+(?:\[\])?(?:\?|\s+optional)?)(?=\s*(?:=(?!=|>)|\/\/|$))/,[`white`,`identifier`,`white`,`type.identifier`]],{include:`@root`}],operationPhase:[[/^(?!$S2[ \t]+|\s*$)/,{token:`@rematch`,next:`@pop`}],[/^(\s*)(implementation)(?=\s*(?:\/\/.*)?$)/,[`white`,{token:`keyword`,next:`@implementationBody.$1`}]],{include:`@root`}],handlerBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:`@rematch`,next:`@pop`}],[/^(\s*)(implementation)(?=\s*(?:\/\/.*)?$)/,[`white`,{token:`keyword`,next:`@implementationBody.$1`}]],{include:`@root`}],implementationBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:`@rematch`,next:`@pop`}],[/^(\s*)(hint)(?=\s+")/,[`white`,`keyword`]],{include:`@root`}],eventBody:[[/^(?!$S2[ \t]+|\s*$)/,{token:`@rematch`,next:`@pop`}],[/^(\s*)(id)(?=\s+")/,[`white`,`keyword`]],[/^(\s*)(documentation)(?=\s*(?:\/\/.*)?$)/,[`white`,{token:`keyword`,next:`@descriptionBlockPending`}]],{include:`@root`}],common:c,codeBlockPending:[[/^\s*```\s*$/,{token:`string.quote`,switchTo:`@codeBlock.$S2`,nextEmbedded:`$S2`}],[/^\s*[^\s`].*$/,{token:`@rematch`,next:`@pop`}],[/\s+/,`white`]],codeBlock:[[/^\s*```\s*$/,{token:`string.quote`,next:`@pop`,nextEmbedded:`@pop`}],[/[^`]+/,``],[/`/,``]],descriptionBlockPending:[[/\/\/.*$/,`comment`],[/^\s*```(?:text|markdown)?\s*$/,{token:`string.quote`,switchTo:`@descriptionBlock`}],[/^\s*[^\s`].*$/,{token:`@rematch`,next:`@pop`}],[/\s+/,`white`]],descriptionBlock:[[/^\s*```\s*$/,{token:`string.quote`,next:`@pop`}],[/.+/,`string`]]};for(let e of l)u[subLanguageState(e.keyword)]=[subLanguageExitRule(l),...e.tokens,{include:`@common`},[/[A-Z]\w*/,`type.identifier`],[/[a-z_]\w*/,`identifier`]];return{defaultToken:``,tokenPostfix:`.play`,ignoreCase:!1,keywords:[...n.filter(e=>!o.has(e)),...e,...t],sliceTypes:i,primitiveTypes:r,tokenizer:u}}export{c as commonTokenRules,createTokensProvider};
|
|
2
|
+
//# sourceMappingURL=tokens.js.map
|