@cratis/screenplay-language 4.258.0 → 5.0.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/dist/bundles/compiler/Authoring/QuickFixes.js +6 -2
- package/dist/bundles/compiler/Authoring/QuickFixes.js.map +1 -1
- package/dist/bundles/compiler/Authoring/StructuredValueQuickFix.js +3 -0
- package/dist/bundles/compiler/Authoring/StructuredValueQuickFix.js.map +1 -0
- package/dist/bundles/compiler/Diagnostics/DiagnosticCodes.js +1 -1
- package/dist/bundles/compiler/Diagnostics/DiagnosticCodes.js.map +1 -1
- package/dist/bundles/compiler/Parsing/CaptureParser.js +1 -1
- package/dist/bundles/compiler/Parsing/CaptureParser.js.map +1 -1
- package/dist/bundles/compiler/Parsing/CompositionParser.js +1 -1
- package/dist/bundles/compiler/Parsing/CompositionParser.js.map +1 -1
- package/dist/bundles/compiler/Parsing/ExpressionParser.js +1 -1
- package/dist/bundles/compiler/Parsing/ExpressionParser.js.map +1 -1
- package/dist/bundles/compiler/Parsing/OperationParser.js +1 -1
- package/dist/bundles/compiler/Parsing/OperationParser.js.map +1 -1
- package/dist/bundles/compiler/Parsing/ProducesParser.js +1 -1
- package/dist/bundles/compiler/Parsing/ProducesParser.js.map +1 -1
- package/dist/bundles/compiler/Parsing/ProjectionParser.js +1 -1
- package/dist/bundles/compiler/Parsing/ProjectionParser.js.map +1 -1
- package/dist/bundles/compiler/Parsing/ReactionParser.js +1 -1
- package/dist/bundles/compiler/Parsing/ReactionParser.js.map +1 -1
- package/dist/bundles/compiler/Parsing/ScreenParser.js +1 -1
- package/dist/bundles/compiler/Parsing/ScreenParser.js.map +1 -1
- package/dist/bundles/compiler/Parsing/ScreenplayParser.js +1 -1
- package/dist/bundles/compiler/Parsing/ScreenplayParser.js.map +1 -1
- package/dist/bundles/compiler/Parsing/SeedParser.js +1 -1
- package/dist/bundles/compiler/Parsing/SeedParser.js.map +1 -1
- package/dist/bundles/compiler/Parsing/SpecificationCaseParser.js +1 -1
- package/dist/bundles/compiler/Parsing/SpecificationCaseParser.js.map +1 -1
- package/dist/bundles/compiler/Parsing/SpecificationExampleParser.js +1 -1
- package/dist/bundles/compiler/Parsing/SpecificationExampleParser.js.map +1 -1
- package/dist/bundles/compiler/Parsing/SpecificationParser.js +1 -1
- package/dist/bundles/compiler/Parsing/SpecificationParser.js.map +1 -1
- package/dist/bundles/compiler/Parsing/SpecificationResponseParser.js +1 -1
- package/dist/bundles/compiler/Parsing/SpecificationResponseParser.js.map +1 -1
- package/dist/bundles/compiler/Parsing/StructuredBlockParser.js +2 -0
- package/dist/bundles/compiler/Parsing/StructuredBlockParser.js.map +1 -0
- package/dist/bundles/compiler/Parsing/UiBindingParser.js +1 -1
- package/dist/bundles/compiler/Parsing/UiBindingParser.js.map +1 -1
- package/dist/bundles/compiler/Syntax/SyntaxCollections.js +1 -1
- package/dist/bundles/compiler/Syntax/SyntaxCollections.js.map +1 -1
- package/dist/bundles/completion-items.js +6 -1
- package/dist/bundles/completion-items.js.map +1 -1
- package/dist/bundles/completion-planner.js +2 -2
- package/dist/bundles/completion-planner.js.map +1 -1
- package/dist/bundles/example-analysis.js +1 -1
- package/dist/bundles/example-analysis.js.map +1 -1
- package/dist/bundles/keyword-docs.js +1 -1
- package/dist/bundles/keyword-docs.js.map +1 -1
- package/dist/bundles/language.js +1 -1
- package/dist/bundles/language.js.map +1 -1
- package/dist/bundles/scope-items.js +9 -3
- package/dist/bundles/scope-items.js.map +1 -1
- package/dist/completion-items.d.ts.map +1 -1
- package/dist/completion-planner.d.ts.map +1 -1
- package/dist/keyword-docs.d.ts.map +1 -1
- package/dist/language.d.ts.map +1 -1
- package/dist/scope-items.d.ts +4 -0
- package/dist/scope-items.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScreenplayParser.js","names":["domainPattern","pattern","timeZonePattern","stringBodyPattern","importPattern","conceptPattern","enumValuePattern","personaPattern","personaPolicyPattern","personaGoalPattern","stickyNotePattern","stickyNoteColourPattern","tabIndentPattern","primitiveTypes","opaqueTopLevel","bodyKeywords","documentPlacement","context","lines","moduleBody","placement","ModuleBody","featureBody","FeatureBody","placedBody","identity","reactionProductionMode","sawReactionBatches","commandReadMode","timeZone","sawTimeZone","sawCommandReads","domain","imports","fileImports","concepts","types","systems","eventSources","modules","personas","stickyNotes","policies","purposes","seeds","examples","declaredTriggers","exposures","instanceContributions","sawOtherConstruct","line","keyword","firstWord","isDocumentPlacement","DiagnosticCodes","locationOf","match","unescapeString","misplacedReactionIdentity","isFileImport","parseFileImport","origin","isBlankPublicEventOrigin","parseExample","parseEventSource","parseSystem","parseType","parseModule","stickyNote","parseSeed","parsePurpose","parseIdentity","policy","parsePolicy","previous","parseExposure","parseInstance","data","parseTriggerDeclaration","name","collectInputUses","parseUiProfile","root","recordAuthoredDocument","modulePattern","describePlacement","word","hint","expected","moduleBodyExpected","featureBodyExpected","feature","innermost","index","start","existing","inFence","startOf","type","attributeText","attributes","parseComplianceMarkers","values","members","EnumerationMembers","generation","declaredGeneration","description","validations","child","memberName","parseDescription","isFileDirective","parsed","parseValidate","parseGeneration","parseComplianceDirective","unescapeIdentifier","valueNumbers","goals","position","size","goal","parseCanvasPair","canvasMatch","text","colour"],"sources":["../../../../../../Compiler/Parsing/ScreenplayParser.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 { CommandReadMode } from '../Syntax/CommandReadMode';\nimport { ReactionProductionMode } from '../Syntax/ReactionProductionMode';\nimport { EnumerationMembers } from './EnumerationMembers';\nimport { GenerationSyntax } from '../Syntax/GenerationSyntax';\nimport { parseGeneration } from './GenerationParser';\nimport { IdentitySyntax } from '../Syntax/IdentitySyntax';\nimport { parseIdentity } from './IdentityParser';\nimport { misplacedReactionIdentity } from './ReactionIdentityParser';\nimport { DiagnosticCodes } from '../Diagnostics/DiagnosticCodes';\nimport { recordAuthoredDocument } from '../Syntax/SourceOptions';\nimport { SourceLocation } from '../Diagnostics/SourceLocation';\nimport { describePlacement, documentPlacement, isDocumentPlacement, PlayPlacement } from '../Files/PlayPlacement';\nimport { PersonaSyntax, StickyNoteSyntax } from '../Syntax/Authorization';\nimport { ConceptSyntax, DomainSyntax, ImportSyntax, TypeSyntax } from '../Syntax/Declarations';\nimport { SpecificationExampleSyntax } from '../Syntax/Specifications';\nimport { TimeZoneSyntax } from '../Syntax/Calendar';\nimport { ApplicationSyntax, FeatureSyntax, FileImportSyntax, ModuleSyntax } from '../Syntax/Structure';\nimport { parseTriggerDeclaration } from './TriggerDataParser';\nimport { pattern } from '../Text/patterns';\nimport { parseComplianceDirective, parseComplianceMarkers } from './ConceptComplianceParser';\nimport { parseType } from './DeclarationParsers';\nimport { ValidateSyntax } from '../Syntax/Commands';\nimport { parseValidate } from './CommandParser';\nimport { parseDescription } from './DescriptionParser';\nimport { FeatureBody, featureBodyExpected } from './FeatureBody';\nimport { isFileImport, parseFileImport } from './FileImportParser';\nimport { isFileDirective } from './FileReferences';\nimport { collectInputUses } from './InputUses';\nimport { firstWord, unescapeIdentifier } from './LineText';\nimport { ModuleBody, moduleBodyExpected, modulePattern, parseModule } from './ModuleBody';\nimport { ParserContext } from './ParserContext';\nimport { PolicySyntax } from '../Syntax/Policies';\nimport { parsePolicy } from './PolicyParser';\nimport { PurposeSyntax } from '../Syntax/Purposes';\nimport { parsePurpose } from './PurposeParser';\nimport { SeedSyntax } from '../Syntax/Seeds';\nimport { parseSeed } from './SeedParser';\nimport { parseSystem } from './OperationParser';\nimport { EventVisibility } from '../Syntax/EventVisibility';\nimport { isBlankPublicEventOrigin } from '../Syntax/PublicEventInvariants';\nimport { stringBodyPattern, unescapeString } from '../Text/StringLiteral';\nimport { SystemSyntax } from '../Syntax/Operations';\nimport { EventSourceSyntax } from '../Syntax/EventSources';\nimport { parseCanvasPair } from './CanvasPlacement';\nimport { parseEventSource } from './EventSourceParser';\nimport { parseExposure, parseInstance } from './CompositionParser';\nimport { ExposureSyntax, InstanceContributionsSyntax } from '../Syntax/CompositionSyntax';\nimport { parseExample } from './SpecificationExampleParser';\nimport { parseUiProfile } from './UiProfileLegacyLayout';\nimport { locationOf, SourceLine, startOf } from './SourceLine';\n\nconst domainPattern = pattern('^domain\\\\s+([A-Za-z_]\\\\w*(?:\\\\.[A-Za-z_]\\\\w*)*)$');\nconst timeZonePattern = pattern(`^time\\\\s+zone\\\\s+(configurable\\\\s+default\\\\s+)?\"(${stringBodyPattern})\"$`);\nconst importPattern = pattern(`^import\\\\s+([\\\\w.]+)(?:\\\\s+from\\\\s+\"(?<origin>${stringBodyPattern})\")?$`);\nconst conceptPattern = pattern('^concept\\\\s+(\\\\w+)\\\\s*:\\\\s*(\\\\w+)((?:\\\\s+@?\\\\w+)*)$');\nconst enumValuePattern = pattern('^@?[a-z_]\\\\w*$');\nconst personaPattern = pattern('^persona\\\\s+([A-Za-z_]\\\\w*)$');\nconst personaPolicyPattern = pattern('^policy\\\\s+([A-Za-z_]\\\\w*)$');\nconst personaGoalPattern = pattern(`^goal\\\\s+\"(${stringBodyPattern})\"$`);\nconst stickyNotePattern = pattern('^sticky\\\\s+note\\\\s+on\\\\s+(personas|eventsources|givencontexts|seeddata)$');\nconst stickyNoteColourPattern = pattern('^colour\\\\s+(yellow|pink|green|blue)$');\nconst tabIndentPattern = /^[ ]*\\t/;\nconst primitiveTypes = ['Uuid', 'String', 'Int', 'Decimal', 'Bool', 'Date', 'DateTime'];\n\n// Top-level, module and feature constructs the C# compiler knows that this compiler does not model. They\n// are skipped whole, not reported.\nconst opaqueTopLevel = new Set(['policy', 'authentication', 'seed', 'ui', 'theme', 'trigger', 'layout', 'behavior', 'sample']);\n\n// What belongs in a module or feature body; at the top level of a whole document it gets a hint saying so.\nconst bodyKeywords = new Set(['slice', 'feature', 'description', 'documentation', 'authorize', 'screen', 'dialog', 'form', 'contribute', 'on', 'uses']);\n\n// Parses one document into its application syntax - the port of the C# ScreenplayParser. The placement says\n// where the document's top level belongs: the application, unless an import placed it in a module or feature.\nexport function parseApplication(context: ParserContext, lines: readonly SourceLine[], placement: PlayPlacement = documentPlacement): ApplicationSyntax {\n context.deferIdentityValidation = true;\n warnOnTabIndentation(context, lines);\n const moduleBody = placement.length === 1 ? new ModuleBody(placement[0]) : undefined;\n const featureBody = placement.length > 1 ? new FeatureBody(placement[placement.length - 1]) : undefined;\n const placedBody = moduleBody ?? featureBody;\n let identity: IdentitySyntax | null = null;\n let reactionProductionMode: ReactionProductionMode | null = null;\n let sawReactionBatches = false;\n let commandReadMode: CommandReadMode | null = null;\n let timeZone: TimeZoneSyntax | null = null;\n let sawTimeZone = false;\n let sawCommandReads = false;\n let domain: DomainSyntax | null = null;\n const imports: ImportSyntax[] = [];\n const fileImports: FileImportSyntax[] = [];\n const concepts: ConceptSyntax[] = [];\n const types: TypeSyntax[] = [];\n const systems: SystemSyntax[] = [];\n const eventSources: EventSourceSyntax[] = [];\n const modules: ModuleSyntax[] = [];\n const personas: PersonaSyntax[] = [];\n const stickyNotes: StickyNoteSyntax[] = [];\n const policies: PolicySyntax[] = [];\n const purposes: PurposeSyntax[] = [];\n const seeds: SeedSyntax[] = [];\n const examples: SpecificationExampleSyntax[] = [];\n const declaredTriggers: NonNullable<ApplicationSyntax['declaredTriggers']>[number][] = [];\n const exposures: ExposureSyntax[] = [];\n const instanceContributions: InstanceContributionsSyntax[] = [];\n let sawOtherConstruct = false;\n for (let line = context.reader.peekSignificant(); line !== undefined; line = context.reader.peekSignificant()) {\n context.reader.takeSignificant();\n const keyword = firstWord(line.content);\n if (keyword === 'command' && /^command\\s+reads(?:\\s|$)/.test(line.content)) {\n if (sawCommandReads || !isDocumentPlacement(placement) || !/^command\\s+reads\\s+protected$/.test(line.content)) {\n context.error(DiagnosticCodes.InvalidCommandReadsDeclaration, \"Declare 'command reads protected' once at the application root.\", locationOf(line));\n } else {\n commandReadMode = CommandReadMode.Protected;\n }\n sawCommandReads = true;\n continue;\n }\n if (keyword === 'time' && /^time\\s+zone(?:\\s|$)/.test(line.content)) {\n const match = timeZonePattern.exec(line.content);\n context.skipBlock(line.indent);\n if (sawTimeZone || !isDocumentPlacement(placement) || match === null) {\n context.error(DiagnosticCodes.InvalidTimeZoneDeclaration, \"Declare 'time zone \\\"<id>\\\"' or 'time zone configurable default \\\"<id>\\\"' once at the application root.\", locationOf(line));\n } else {\n timeZone = { kind: 'TimeZoneSyntax', id: unescapeString(match[2]), configurable: match[1] !== undefined, location: locationOf(line) };\n }\n sawTimeZone = true;\n continue;\n }\n if (keyword === 'reaction') {\n if (sawReactionBatches || !isDocumentPlacement(placement) || !/^reaction\\s+batches\\s+atomic$/.test(line.content)) {\n context.error(DiagnosticCodes.InvalidReactionBatchesDeclaration, \"Declare 'reaction batches atomic' once at the application root.\", locationOf(line));\n } else {\n reactionProductionMode = ReactionProductionMode.Atomic;\n }\n sawReactionBatches = true;\n continue;\n }\n if (keyword === 'runs') {\n misplacedReactionIdentity(context, line);\n continue;\n }\n if (keyword === 'domain') {\n context.authoredDeclarations = true;\n domain = parseDomain(context, line, domain, sawOtherConstruct);\n continue;\n }\n // The C# parser asks whether anything was declared before the domain, so an import it rejected,\n // a file import and an unknown construct do not count.\n sawOtherConstruct ||= declaresConstruct(keyword, line, placement);\n context.authoredDeclarations ||= keyword !== 'import' && declaresConstruct(keyword, line, placement);\n if (keyword === 'import' && isFileImport(line.content)) {\n // A top level import belongs to whatever the document's top level is - the application, or the\n // module or feature the document was itself imported into.\n if (placedBody !== undefined) {\n placedBody.tryParse(context, line);\n } else {\n parseFileImport(context, line, fileImports);\n }\n } else if (keyword === 'import') {\n const match = importPattern.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidImportDeclaration, `Invalid import '${line.content}' - expected 'import <Qualified.Name> [from \"<origin>\"]'`, locationOf(line));\n } else {\n const origin = match.groups?.origin === undefined ? null : unescapeString(match.groups.origin);\n if (origin !== null && isBlankPublicEventOrigin(origin)) {\n context.error(DiagnosticCodes.InvalidImportDeclaration, 'An import origin must be a nonblank quoted string', locationOf(line));\n }\n imports.push({ kind: 'ImportSyntax', qualifiedName: match[1], origin, visibility: origin === null ? EventVisibility.Private : EventVisibility.Public, location: locationOf(line) });\n }\n } else if (keyword === 'example') {\n if (placedBody !== undefined) placedBody.tryParse(context, line);\n else examples.push(parseExample(context, line));\n } else if (keyword === 'eventsource') {\n eventSources.push(parseEventSource(context, line));\n } else if (keyword === 'system') {\n systems.push(parseSystem(context, line));\n } else if (keyword === 'concept') {\n concepts.push(parseConcept(context, line));\n } else if (keyword === 'type') {\n types.push(parseType(context, line));\n } else if (keyword === 'module' && !isDocumentPlacement(placement)) {\n parseModuleInPlacedFile(context, line, placement, moduleBody);\n } else if (keyword === 'module') {\n modules.push(parseModule(context, line));\n } else if (keyword === 'persona') {\n personas.push(parsePersona(context, line));\n } else if (keyword === 'sticky') {\n const stickyNote = parseStickyNote(context, line);\n if (stickyNote !== null) stickyNotes.push(stickyNote);\n } else if (keyword === 'seed') {\n seeds.push(parseSeed(context.valueContext, line));\n } else if (keyword === 'purpose' && placedBody !== undefined) {\n placedBody.tryParse(context, line);\n } else if (keyword === 'purpose') {\n purposes.push(parsePurpose(context, line));\n } else if (keyword === 'identity') {\n identity = parseIdentity(context, line, identity);\n } else if (keyword === 'policy') {\n const policy = parsePolicy(context, line);\n if (policies.some(previous => previous.name === policy.name)) {\n context.error(DiagnosticCodes.DuplicateDeclaration, `Duplicate declaration of policy '${policy.name}' - policy names must be unique`, policy.location);\n }\n policies.push(policy);\n } else if (keyword === 'exposure') {\n exposures.push(parseExposure(context, line));\n } else if (keyword === 'instance') {\n instanceContributions.push(parseInstance(context, line));\n } else if (keyword === 'trigger') {\n const data = parseTriggerDeclaration(context, line);\n const name = /^trigger\\s+([A-Za-z_]\\w*)$/.exec(line.content)?.[1];\n if (name !== undefined) declaredTriggers.push({ name, data });\n } else if (opaqueTopLevel.has(keyword)) {\n if (keyword === 'behavior' || keyword === 'layout') collectInputUses(context, line);\n else if (keyword === 'ui') parseUiProfile(context, line);\n else context.skipOpaqueBlock(line.indent);\n } else if (placedBody?.tryParse(context, line) !== true) {\n reportUnexpectedTopLevel(context, line, placement);\n }\n }\n if (moduleBody !== undefined) {\n modules.unshift(moduleBody.build(context.start, true));\n } else if (featureBody !== undefined) {\n modules.unshift(place(placement, featureBody.build(context.start, true), context.start));\n }\n const root: ApplicationSyntax = { kind: 'ApplicationSyntax', ...(commandReadMode === null ? {} : { commandReadMode }), ...(timeZone === null ? {} : { timeZone }), ...(reactionProductionMode === null ? {} : { reactionProductionMode }), ...(identity === null ? {} : { identity }), sourceOptions: context.sourceOptions, domain, imports, concepts, types, systems, eventSources, examples, modules, personas, policies, purposes, seeds, declaredTriggers, fileImports, ...(exposures.length > 0 ? { exposures } : {}), ...(stickyNotes.length > 0 ? { stickyNotes } : {}), ...(instanceContributions.length > 0 ? { instanceContributions } : {}), location: context.start };\n if (context.authoredDeclarations) recordAuthoredDocument(root);\n return root;\n}\n\nfunction declaresConstruct(keyword: string, line: SourceLine, placement: PlayPlacement): boolean {\n if (keyword === 'import') {\n return importPattern.test(line.content);\n }\n if (keyword === 'module') {\n return isDocumentPlacement(placement);\n }\n if (keyword === 'identity') return line.content === 'identity';\n return keyword === 'purpose' || keyword === 'example' || keyword === 'exposure' || keyword === 'instance' || keyword === 'eventsource' || keyword === 'system' || keyword === 'concept' || keyword === 'type' || keyword === 'persona' || keyword === 'sticky' || opaqueTopLevel.has(keyword);\n}\n\nfunction parseModuleInPlacedFile(context: ParserContext, line: SourceLine, placement: PlayPlacement, moduleBody: ModuleBody | undefined): void {\n const name = modulePattern.exec(line.content)?.[1] ?? '';\n\n // Restating the module a file is placed in says nothing new, so its body simply joins the placement.\n if (moduleBody !== undefined && name === placement[0]) {\n context.authoredDeclarations = true;\n moduleBody.parseChildren(context, line);\n return;\n }\n context.error(DiagnosticCodes.ModuleInPlacedFile,\n `This file is imported into ${describePlacement(placement)}, so it cannot declare module '${name}' - import it at the top level of a document instead`, locationOf(line));\n context.skipBlock(line.indent);\n}\n\nfunction reportUnexpectedTopLevel(context: ParserContext, line: SourceLine, placement: PlayPlacement): void {\n const word = firstWord(line.content);\n if (!isDocumentPlacement(placement)) {\n const expected = placement.length === 1 ? moduleBodyExpected : featureBodyExpected;\n context.error(DiagnosticCodes.UnexpectedInPlacedFile,\n `Unexpected '${word}' in a file imported into ${describePlacement(placement)} - expected an application declaration or ${expected}`, locationOf(line));\n } else {\n const hint = bodyKeywords.has(word)\n ? ` - '${word}' belongs in a module or feature; wrap it in one, or import this file from inside one`\n : ' - expected domain, import, concept, type, policy, persona, sticky note, authentication, identity, module, seed, trigger, behavior, ui profile, theme, sample data or layout';\n context.error(DiagnosticCodes.UnknownTopLevelConstruct, `Unexpected '${word}' at the top level${hint}`, locationOf(line));\n }\n context.skipBlock(line.indent);\n}\n\n// Wraps the feature a file is placed in in the features and module around it, each marked as a placement.\nfunction place(placement: PlayPlacement, innermost: FeatureSyntax, start: SourceLocation): ModuleSyntax {\n let feature = innermost;\n for (let index = placement.length - 2; index >= 1; index--) {\n feature = {\n kind: 'FeatureSyntax', name: placement[index], description: null, authorize: null,\n features: [feature], slices: [], fileImports: [], isPlacement: true, location: start,\n };\n }\n return {\n kind: 'ModuleSyntax', name: placement[0], description: null, authorize: null,\n features: [feature], fileImports: [], isPlacement: true, location: start,\n };\n}\n\nfunction parseDomain(context: ParserContext, line: SourceLine, existing: DomainSyntax | null, sawOtherConstruct: boolean): DomainSyntax | null {\n const match = domainPattern.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidDomainDeclaration, `Invalid domain declaration '${line.content}' - expected 'domain <Qualified.Name>'`, locationOf(line));\n return existing;\n }\n if (existing !== null) {\n context.error(DiagnosticCodes.DuplicateDomain, 'The document already declares a domain - a document can have at most one', locationOf(line));\n return existing;\n }\n if (sawOtherConstruct) {\n context.error(DiagnosticCodes.DomainNotFirst, '\\'domain\\' must be declared before any other construct', locationOf(line));\n }\n return { kind: 'DomainSyntax', name: match[1], location: locationOf(line) };\n}\n\nfunction warnOnTabIndentation(context: ParserContext, lines: readonly SourceLine[]): void {\n let inFence = false;\n for (const line of lines) {\n if (line.raw.trimStart().startsWith('```')) {\n inFence = !inFence;\n continue;\n }\n if (!inFence && tabIndentPattern.test(line.raw)) {\n context.warning(DiagnosticCodes.TabIndentation, 'Screenplay is indentation based - use spaces, not tabs', startOf(line));\n }\n }\n}\n\nfunction parseConcept(context: ParserContext, line: SourceLine): ConceptSyntax {\n const match = conceptPattern.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidConceptDeclaration, `Invalid concept declaration '${line.content}' - expected 'concept <Name> : <Type>'`, locationOf(line));\n context.skipBlock(line.indent);\n return { kind: 'ConceptSyntax', name: firstWord(line.content), type: '', attributes: [], values: [], location: locationOf(line) };\n }\n const [, name, type, attributeText] = match;\n const attributes = parseComplianceMarkers(context, line, name, attributeText);\n if (type !== 'Enum' && !primitiveTypes.includes(type)) {\n context.error(DiagnosticCodes.UnknownPrimitiveType, `Unknown primitive type '${type}' - expected ${primitiveTypes.join(', ')} or Enum`, locationOf(line));\n }\n const values: string[] = [];\n const members = new EnumerationMembers();\n let generation: GenerationSyntax | null = null;\n let declaredGeneration = false;\n let description: string | null = null;\n const validations: ValidateSyntax[] = [];\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n const memberName = type === 'Enum' ? members.tryNumbered(context, child) : undefined;\n if (memberName !== undefined) {\n values.push(memberName);\n } else if (firstWord(child.content) === 'description' && (type !== 'Enum' || child.content !== 'description' || context.peekChild(child.indent)?.content.startsWith('```') === true)) {\n description = parseDescription(context, child, description, `Concept '${name}'`);\n } else if (isFileDirective(child)) {\n continue;\n } else if (firstWord(child.content) === 'validate') {\n if (type === 'Enum' && child.content === 'validate' && context.peekChild(child.indent) === undefined) {\n context.warning(DiagnosticCodes.ValidateReadAsEnumerationBlock,\n `'validate' in enumeration concept '${name}' declares an empty validate block, not a value named 'validate' - write '@validate' for the value`,\n locationOf(child));\n }\n const parsed = parseValidate(context, child, 'concept', name);\n if (parsed !== undefined) validations.push(parsed);\n } else if (firstWord(child.content) === 'generate' && !(type === 'Enum' && child.content === 'generate')) {\n if (declaredGeneration) context.error(DiagnosticCodes.DuplicateGeneration, `Concept '${name}' declares generation more than once.`, locationOf(child));\n const parsed = parseGeneration(context, child, type);\n if (!declaredGeneration) generation = parsed;\n declaredGeneration = true;\n } else if (parseComplianceDirective(context, child, name, attributes)) {\n // Compliance directives are modeled by their original concept marker.\n } else if (type === 'Enum' && enumValuePattern.test(child.content)) {\n values.push(unescapeIdentifier(child.content));\n } else if (type === 'Enum') {\n context.error(DiagnosticCodes.InvalidEnumerationValue, `Invalid enum value '${child.content}' - expected an identifier`, locationOf(child));\n } else {\n context.error(DiagnosticCodes.UnknownConceptDirective, `Unexpected '${child.content}' in concept body - expected validate, generate, 'file <path>' or '<attribute> reason \"<text>\"'`, locationOf(child));\n context.skipBlock(child.indent);\n }\n }\n const valueNumbers = members.finish(context, line, values.length);\n return { kind: 'ConceptSyntax', name, type, attributes, values, validations, description, ...(generation === null ? {} : { generation }), ...(valueNumbers === undefined ? {} : { valueNumbers }), location: locationOf(line) };\n}\n\n// 'persona <Name>' with an optional description and the policies it holds - the port of the C# ParsePersona.\nfunction parsePersona(context: ParserContext, line: SourceLine): PersonaSyntax {\n const name = personaPattern.exec(line.content)?.[1] ?? '';\n if (name === '') {\n context.error(DiagnosticCodes.InvalidPersonaDeclaration, `Invalid persona declaration '${line.content}' - expected 'persona <Name>'`, locationOf(line));\n }\n let description: string | null = null;\n const policies: string[] = [];\n const goals: string[] = [];\n let position: readonly [number, number] | null = null;\n let size: readonly [number, number] | null = null;\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n const keyword = firstWord(child.content);\n if (keyword === 'description') {\n description = parseDescription(context, child, description, `Persona '${name}'`);\n } else if (keyword === 'goal') {\n const goal = personaGoalPattern.exec(child.content);\n if (goal === null) {\n context.error(DiagnosticCodes.InvalidPersonaDeclaration, `Invalid goal '${child.content}' - expected 'goal \"<text>\"'`, locationOf(child));\n } else {\n goals.push(unescapeString(goal[1]));\n }\n } else if (keyword === 'position') {\n position = parseCanvasPair(context, child, 'position', 'x', 'y', position, true) ?? position;\n } else if (keyword === 'size') {\n size = parseCanvasPair(context, child, 'size', 'width', 'height', size, false) ?? size;\n } else if (keyword === 'policy') {\n const policy = personaPolicyPattern.exec(child.content);\n if (policy === null) {\n context.error(DiagnosticCodes.InvalidPersonaPolicyReference, `Invalid policy reference '${child.content}' - expected 'policy <Name>'`, locationOf(child));\n } else {\n policies.push(policy[1]);\n }\n } else {\n context.error(DiagnosticCodes.UnknownPersonaDirective, `Unexpected '${keyword}' in persona body - expected description, goal, policy, position or size`, locationOf(child));\n context.skipBlock(child.indent);\n }\n }\n return {\n kind: 'PersonaSyntax', name, description, policies,\n ...(goals.length > 0 ? { goals } : {}),\n ...(position === null ? {} : { x: position[0], y: position[1] }),\n ...(size === null ? {} : { width: size[0], height: size[1] }),\n location: locationOf(line),\n };\n}\n\n// 'sticky note on <canvas>' with the text it carries, an optional colour and where it sits on that canvas - the port of the C# ParseStickyNote.\nfunction parseStickyNote(context: ParserContext, line: SourceLine): StickyNoteSyntax | null {\n const canvasMatch = stickyNotePattern.exec(line.content);\n if (canvasMatch === null) {\n context.error(DiagnosticCodes.InvalidPersonaDeclaration, `Invalid sticky note declaration '${line.content}' - expected 'sticky note on personas', 'sticky note on eventsources', 'sticky note on givencontexts' or 'sticky note on seeddata'`, locationOf(line));\n context.skipBlock(line.indent);\n return null;\n }\n let text: string | null = null;\n let colour: string | null = null;\n let position: readonly [number, number] | null = null;\n let size: readonly [number, number] | null = null;\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n const keyword = firstWord(child.content);\n if (keyword === 'description') {\n text = parseDescription(context, child, text, 'A sticky note');\n } else if (keyword === 'colour') {\n const match = stickyNoteColourPattern.exec(child.content);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidPersonaDeclaration, `Invalid colour '${child.content}' - expected 'colour yellow', 'colour pink', 'colour green' or 'colour blue'`, locationOf(child));\n } else {\n colour = match[1];\n }\n } else if (keyword === 'position') {\n position = parseCanvasPair(context, child, 'position', 'x', 'y', position, true) ?? position;\n } else if (keyword === 'size') {\n size = parseCanvasPair(context, child, 'size', 'width', 'height', size, false) ?? size;\n } else {\n context.error(DiagnosticCodes.UnknownPersonaDirective, `Unexpected '${keyword}' in sticky note body - expected description, colour, position or size`, locationOf(child));\n context.skipBlock(child.indent);\n }\n }\n if (text === null || position === null) {\n context.error(DiagnosticCodes.InvalidPersonaDeclaration, 'A sticky note needs a description (the text on it) and a position', locationOf(line));\n return null;\n }\n return { kind: 'StickyNoteSyntax', canvas: canvasMatch[1] as StickyNoteSyntax['canvas'], text, colour, x: position[0], y: position[1], width: size === null ? null : size[0], height: size === null ? null : size[1], location: locationOf(line) };\n}\n\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ScreenplayParser.js","names":["domainPattern","pattern","timeZonePattern","stringBodyPattern","importPattern","conceptPattern","enumValuePattern","personaPattern","personaPolicyPattern","personaGoalPattern","stickyNotePattern","stickyNoteColourPattern","tabIndentPattern","primitiveTypes","opaqueTopLevel","bodyKeywords","documentPlacement","context","lines","moduleBody","placement","ModuleBody","featureBody","FeatureBody","placedBody","identity","reactionProductionMode","sawReactionBatches","commandReadMode","timeZone","sawTimeZone","sawCommandReads","domain","imports","fileImports","concepts","types","systems","eventSources","modules","personas","stickyNotes","policies","purposes","seeds","examples","declaredTriggers","exposures","instanceContributions","sawOtherConstruct","line","keyword","firstWord","isDocumentPlacement","DiagnosticCodes","locationOf","match","unescapeString","misplacedReactionIdentity","isFileImport","parseFileImport","origin","isBlankPublicEventOrigin","parseExample","parseEventSource","parseSystem","parseType","parseModule","stickyNote","parseSeed","parsePurpose","parseIdentity","policy","parsePolicy","previous","parseExposure","parseInstance","data","parseTriggerDeclaration","name","collectInputUses","parseUiProfile","root","recordAuthoredDocument","modulePattern","describePlacement","word","hint","expected","moduleBodyExpected","featureBodyExpected","feature","innermost","index","start","existing","inFence","startOf","type","attributeText","attributes","parseComplianceMarkers","values","members","EnumerationMembers","generation","declaredGeneration","description","validations","child","memberName","parseDescription","isFileDirective","parsed","parseValidate","parseGeneration","parseComplianceDirective","unescapeIdentifier","valueNumbers","goals","position","size","goal","parseCanvasPair","canvasMatch","text","colour"],"sources":["../../../../../../Compiler/Parsing/ScreenplayParser.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 { CommandReadMode } from '../Syntax/CommandReadMode';\nimport { ReactionProductionMode } from '../Syntax/ReactionProductionMode';\nimport { EnumerationMembers } from './EnumerationMembers';\nimport { GenerationSyntax } from '../Syntax/GenerationSyntax';\nimport { parseGeneration } from './GenerationParser';\nimport { IdentitySyntax } from '../Syntax/IdentitySyntax';\nimport { parseIdentity } from './IdentityParser';\nimport { misplacedReactionIdentity } from './ReactionIdentityParser';\nimport { DiagnosticCodes } from '../Diagnostics/DiagnosticCodes';\nimport { recordAuthoredDocument } from '../Syntax/SourceOptions';\nimport { SourceLocation } from '../Diagnostics/SourceLocation';\nimport { describePlacement, documentPlacement, isDocumentPlacement, PlayPlacement } from '../Files/PlayPlacement';\nimport { PersonaSyntax, StickyNoteSyntax } from '../Syntax/Authorization';\nimport { ConceptSyntax, DomainSyntax, ImportSyntax, TypeSyntax } from '../Syntax/Declarations';\nimport { SpecificationExampleSyntax } from '../Syntax/Specifications';\nimport { TimeZoneSyntax } from '../Syntax/Calendar';\nimport { ApplicationSyntax, FeatureSyntax, FileImportSyntax, ModuleSyntax } from '../Syntax/Structure';\nimport { parseTriggerDeclaration } from './TriggerDataParser';\nimport { pattern } from '../Text/patterns';\nimport { parseComplianceDirective, parseComplianceMarkers } from './ConceptComplianceParser';\nimport { parseType } from './DeclarationParsers';\nimport { ValidateSyntax } from '../Syntax/Commands';\nimport { parseValidate } from './CommandParser';\nimport { parseDescription } from './DescriptionParser';\nimport { FeatureBody, featureBodyExpected } from './FeatureBody';\nimport { isFileImport, parseFileImport } from './FileImportParser';\nimport { isFileDirective } from './FileReferences';\nimport { collectInputUses } from './InputUses';\nimport { firstWord, unescapeIdentifier } from './LineText';\nimport { ModuleBody, moduleBodyExpected, modulePattern, parseModule } from './ModuleBody';\nimport { ParserContext } from './ParserContext';\nimport { PolicySyntax } from '../Syntax/Policies';\nimport { parsePolicy } from './PolicyParser';\nimport { PurposeSyntax } from '../Syntax/Purposes';\nimport { parsePurpose } from './PurposeParser';\nimport { SeedSyntax } from '../Syntax/Seeds';\nimport { parseSeed } from './SeedParser';\nimport { parseSystem } from './OperationParser';\nimport { EventVisibility } from '../Syntax/EventVisibility';\nimport { isBlankPublicEventOrigin } from '../Syntax/PublicEventInvariants';\nimport { stringBodyPattern, unescapeString } from '../Text/StringLiteral';\nimport { SystemSyntax } from '../Syntax/Operations';\nimport { EventSourceSyntax } from '../Syntax/EventSources';\nimport { parseCanvasPair } from './CanvasPlacement';\nimport { parseEventSource } from './EventSourceParser';\nimport { parseExposure, parseInstance } from './CompositionParser';\nimport { ExposureSyntax, InstanceContributionsSyntax } from '../Syntax/CompositionSyntax';\nimport { parseExample } from './SpecificationExampleParser';\nimport { parseUiProfile } from './UiProfileLegacyLayout';\nimport { locationOf, SourceLine, startOf } from './SourceLine';\n\nconst domainPattern = pattern('^domain\\\\s+([A-Za-z_]\\\\w*(?:\\\\.[A-Za-z_]\\\\w*)*)$');\nconst timeZonePattern = pattern(`^time\\\\s+zone\\\\s+(configurable\\\\s+default\\\\s+)?\"(${stringBodyPattern})\"$`);\nconst importPattern = pattern(`^import\\\\s+([\\\\w.]+)(?:\\\\s+from\\\\s+\"(?<origin>${stringBodyPattern})\")?$`);\nconst conceptPattern = pattern('^concept\\\\s+(\\\\w+)\\\\s*:\\\\s*(\\\\w+)((?:\\\\s+@?\\\\w+)*)$');\nconst enumValuePattern = pattern('^@?[a-z_]\\\\w*$');\nconst personaPattern = pattern('^persona\\\\s+([A-Za-z_]\\\\w*)$');\nconst personaPolicyPattern = pattern('^policy\\\\s+([A-Za-z_]\\\\w*)$');\nconst personaGoalPattern = pattern(`^goal\\\\s+\"(${stringBodyPattern})\"$`);\nconst stickyNotePattern = pattern('^sticky\\\\s+note\\\\s+on\\\\s+(personas|eventsources|givencontexts|seeddata)$');\nconst stickyNoteColourPattern = pattern('^colour\\\\s+(yellow|pink|green|blue)$');\nconst tabIndentPattern = /^[ ]*\\t/;\nconst primitiveTypes = ['Uuid', 'String', 'Int', 'Decimal', 'Bool', 'Date', 'DateTime'];\n\n// Top-level, module and feature constructs the C# compiler knows that this compiler does not model. They\n// are skipped whole, not reported.\nconst opaqueTopLevel = new Set(['policy', 'authentication', 'onboarding', 'seed', 'ui', 'theme', 'trigger', 'layout', 'behavior', 'sample']);\n\n// What belongs in a module or feature body; at the top level of a whole document it gets a hint saying so.\nconst bodyKeywords = new Set(['slice', 'feature', 'description', 'documentation', 'authorize', 'screen', 'dialog', 'form', 'contribute', 'on', 'uses']);\n\n// Parses one document into its application syntax - the port of the C# ScreenplayParser. The placement says\n// where the document's top level belongs: the application, unless an import placed it in a module or feature.\nexport function parseApplication(context: ParserContext, lines: readonly SourceLine[], placement: PlayPlacement = documentPlacement): ApplicationSyntax {\n context.deferIdentityValidation = true;\n warnOnTabIndentation(context, lines);\n const moduleBody = placement.length === 1 ? new ModuleBody(placement[0]) : undefined;\n const featureBody = placement.length > 1 ? new FeatureBody(placement[placement.length - 1]) : undefined;\n const placedBody = moduleBody ?? featureBody;\n let identity: IdentitySyntax | null = null;\n let reactionProductionMode: ReactionProductionMode | null = null;\n let sawReactionBatches = false;\n let commandReadMode: CommandReadMode | null = null;\n let timeZone: TimeZoneSyntax | null = null;\n let sawTimeZone = false;\n let sawCommandReads = false;\n let domain: DomainSyntax | null = null;\n const imports: ImportSyntax[] = [];\n const fileImports: FileImportSyntax[] = [];\n const concepts: ConceptSyntax[] = [];\n const types: TypeSyntax[] = [];\n const systems: SystemSyntax[] = [];\n const eventSources: EventSourceSyntax[] = [];\n const modules: ModuleSyntax[] = [];\n const personas: PersonaSyntax[] = [];\n const stickyNotes: StickyNoteSyntax[] = [];\n const policies: PolicySyntax[] = [];\n const purposes: PurposeSyntax[] = [];\n const seeds: SeedSyntax[] = [];\n const examples: SpecificationExampleSyntax[] = [];\n const declaredTriggers: NonNullable<ApplicationSyntax['declaredTriggers']>[number][] = [];\n const exposures: ExposureSyntax[] = [];\n const instanceContributions: InstanceContributionsSyntax[] = [];\n let sawOtherConstruct = false;\n for (let line = context.reader.peekSignificant(); line !== undefined; line = context.reader.peekSignificant()) {\n context.reader.takeSignificant();\n const keyword = firstWord(line.content);\n if (keyword === 'command' && /^command\\s+reads(?:\\s|$)/.test(line.content)) {\n if (sawCommandReads || !isDocumentPlacement(placement) || !/^command\\s+reads\\s+protected$/.test(line.content)) {\n context.error(DiagnosticCodes.InvalidCommandReadsDeclaration, \"Declare 'command reads protected' once at the application root.\", locationOf(line));\n } else {\n commandReadMode = CommandReadMode.Protected;\n }\n sawCommandReads = true;\n continue;\n }\n if (keyword === 'time' && /^time\\s+zone(?:\\s|$)/.test(line.content)) {\n const match = timeZonePattern.exec(line.content);\n context.skipBlock(line.indent);\n if (sawTimeZone || !isDocumentPlacement(placement) || match === null) {\n context.error(DiagnosticCodes.InvalidTimeZoneDeclaration, \"Declare 'time zone \\\"<id>\\\"' or 'time zone configurable default \\\"<id>\\\"' once at the application root.\", locationOf(line));\n } else {\n timeZone = { kind: 'TimeZoneSyntax', id: unescapeString(match[2]), configurable: match[1] !== undefined, location: locationOf(line) };\n }\n sawTimeZone = true;\n continue;\n }\n if (keyword === 'reaction') {\n if (sawReactionBatches || !isDocumentPlacement(placement) || !/^reaction\\s+batches\\s+atomic$/.test(line.content)) {\n context.error(DiagnosticCodes.InvalidReactionBatchesDeclaration, \"Declare 'reaction batches atomic' once at the application root.\", locationOf(line));\n } else {\n reactionProductionMode = ReactionProductionMode.Atomic;\n }\n sawReactionBatches = true;\n continue;\n }\n if (keyword === 'runs') {\n misplacedReactionIdentity(context, line);\n continue;\n }\n if (keyword === 'domain') {\n context.authoredDeclarations = true;\n domain = parseDomain(context, line, domain, sawOtherConstruct);\n continue;\n }\n // The C# parser asks whether anything was declared before the domain, so an import it rejected,\n // a file import and an unknown construct do not count.\n sawOtherConstruct ||= declaresConstruct(keyword, line, placement);\n context.authoredDeclarations ||= keyword !== 'import' && declaresConstruct(keyword, line, placement);\n if (keyword === 'import' && isFileImport(line.content)) {\n // A top level import belongs to whatever the document's top level is - the application, or the\n // module or feature the document was itself imported into.\n if (placedBody !== undefined) {\n placedBody.tryParse(context, line);\n } else {\n parseFileImport(context, line, fileImports);\n }\n } else if (keyword === 'import') {\n const match = importPattern.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidImportDeclaration, `Invalid import '${line.content}' - expected 'import <Qualified.Name> [from \"<origin>\"]'`, locationOf(line));\n } else {\n const origin = match.groups?.origin === undefined ? null : unescapeString(match.groups.origin);\n if (origin !== null && isBlankPublicEventOrigin(origin)) {\n context.error(DiagnosticCodes.InvalidImportDeclaration, 'An import origin must be a nonblank quoted string', locationOf(line));\n }\n imports.push({ kind: 'ImportSyntax', qualifiedName: match[1], origin, visibility: origin === null ? EventVisibility.Private : EventVisibility.Public, location: locationOf(line) });\n }\n } else if (keyword === 'example') {\n if (placedBody !== undefined) placedBody.tryParse(context, line);\n else examples.push(parseExample(context, line));\n } else if (keyword === 'eventsource') {\n eventSources.push(parseEventSource(context, line));\n } else if (keyword === 'system') {\n systems.push(parseSystem(context, line));\n } else if (keyword === 'concept') {\n concepts.push(parseConcept(context, line));\n } else if (keyword === 'type') {\n types.push(parseType(context, line));\n } else if (keyword === 'module' && !isDocumentPlacement(placement)) {\n parseModuleInPlacedFile(context, line, placement, moduleBody);\n } else if (keyword === 'module') {\n modules.push(parseModule(context, line));\n } else if (keyword === 'persona') {\n personas.push(parsePersona(context, line));\n } else if (keyword === 'sticky') {\n const stickyNote = parseStickyNote(context, line);\n if (stickyNote !== null) stickyNotes.push(stickyNote);\n } else if (keyword === 'seed') {\n seeds.push(parseSeed(context.valueContext, line));\n } else if (keyword === 'purpose' && placedBody !== undefined) {\n placedBody.tryParse(context, line);\n } else if (keyword === 'purpose') {\n purposes.push(parsePurpose(context, line));\n } else if (keyword === 'identity') {\n identity = parseIdentity(context, line, identity);\n } else if (keyword === 'policy') {\n const policy = parsePolicy(context, line);\n if (policies.some(previous => previous.name === policy.name)) {\n context.error(DiagnosticCodes.DuplicateDeclaration, `Duplicate declaration of policy '${policy.name}' - policy names must be unique`, policy.location);\n }\n policies.push(policy);\n } else if (keyword === 'exposure') {\n exposures.push(parseExposure(context, line));\n } else if (keyword === 'instance') {\n instanceContributions.push(parseInstance(context, line));\n } else if (keyword === 'trigger') {\n const data = parseTriggerDeclaration(context, line);\n const name = /^trigger\\s+([A-Za-z_]\\w*)$/.exec(line.content)?.[1];\n if (name !== undefined) declaredTriggers.push({ name, data });\n } else if (opaqueTopLevel.has(keyword)) {\n if (keyword === 'behavior' || keyword === 'layout') collectInputUses(context, line);\n else if (keyword === 'ui') parseUiProfile(context, line);\n else context.skipOpaqueBlock(line.indent);\n } else if (placedBody?.tryParse(context, line) !== true) {\n reportUnexpectedTopLevel(context, line, placement);\n }\n }\n if (moduleBody !== undefined) {\n modules.unshift(moduleBody.build(context.start, true));\n } else if (featureBody !== undefined) {\n modules.unshift(place(placement, featureBody.build(context.start, true), context.start));\n }\n const root: ApplicationSyntax = { kind: 'ApplicationSyntax', ...(commandReadMode === null ? {} : { commandReadMode }), ...(timeZone === null ? {} : { timeZone }), ...(reactionProductionMode === null ? {} : { reactionProductionMode }), ...(identity === null ? {} : { identity }), sourceOptions: context.sourceOptions, domain, imports, concepts, types, systems, eventSources, examples, modules, personas, policies, purposes, seeds, declaredTriggers, fileImports, ...(exposures.length > 0 ? { exposures } : {}), ...(stickyNotes.length > 0 ? { stickyNotes } : {}), ...(instanceContributions.length > 0 ? { instanceContributions } : {}), location: context.start };\n if (context.authoredDeclarations) recordAuthoredDocument(root);\n return root;\n}\n\nfunction declaresConstruct(keyword: string, line: SourceLine, placement: PlayPlacement): boolean {\n if (keyword === 'import') {\n return importPattern.test(line.content);\n }\n if (keyword === 'module') {\n return isDocumentPlacement(placement);\n }\n if (keyword === 'identity') return line.content === 'identity';\n return keyword === 'purpose' || keyword === 'example' || keyword === 'exposure' || keyword === 'instance' || keyword === 'eventsource' || keyword === 'system' || keyword === 'concept' || keyword === 'type' || keyword === 'persona' || keyword === 'sticky' || opaqueTopLevel.has(keyword);\n}\n\nfunction parseModuleInPlacedFile(context: ParserContext, line: SourceLine, placement: PlayPlacement, moduleBody: ModuleBody | undefined): void {\n const name = modulePattern.exec(line.content)?.[1] ?? '';\n\n // Restating the module a file is placed in says nothing new, so its body simply joins the placement.\n if (moduleBody !== undefined && name === placement[0]) {\n context.authoredDeclarations = true;\n moduleBody.parseChildren(context, line);\n return;\n }\n context.error(DiagnosticCodes.ModuleInPlacedFile,\n `This file is imported into ${describePlacement(placement)}, so it cannot declare module '${name}' - import it at the top level of a document instead`, locationOf(line));\n context.skipBlock(line.indent);\n}\n\nfunction reportUnexpectedTopLevel(context: ParserContext, line: SourceLine, placement: PlayPlacement): void {\n const word = firstWord(line.content);\n if (!isDocumentPlacement(placement)) {\n const expected = placement.length === 1 ? moduleBodyExpected : featureBodyExpected;\n context.error(DiagnosticCodes.UnexpectedInPlacedFile,\n `Unexpected '${word}' in a file imported into ${describePlacement(placement)} - expected an application declaration or ${expected}`, locationOf(line));\n } else {\n const hint = bodyKeywords.has(word)\n ? ` - '${word}' belongs in a module or feature; wrap it in one, or import this file from inside one`\n : ' - expected domain, import, concept, type, policy, persona, sticky note, authentication, onboarding, identity, module, seed, trigger, behavior, ui profile, theme, sample data or layout';\n context.error(DiagnosticCodes.UnknownTopLevelConstruct, `Unexpected '${word}' at the top level${hint}`, locationOf(line));\n }\n context.skipBlock(line.indent);\n}\n\n// Wraps the feature a file is placed in in the features and module around it, each marked as a placement.\nfunction place(placement: PlayPlacement, innermost: FeatureSyntax, start: SourceLocation): ModuleSyntax {\n let feature = innermost;\n for (let index = placement.length - 2; index >= 1; index--) {\n feature = {\n kind: 'FeatureSyntax', name: placement[index], description: null, authorize: null,\n features: [feature], slices: [], fileImports: [], isPlacement: true, location: start,\n };\n }\n return {\n kind: 'ModuleSyntax', name: placement[0], description: null, authorize: null,\n features: [feature], fileImports: [], isPlacement: true, location: start,\n };\n}\n\nfunction parseDomain(context: ParserContext, line: SourceLine, existing: DomainSyntax | null, sawOtherConstruct: boolean): DomainSyntax | null {\n const match = domainPattern.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidDomainDeclaration, `Invalid domain declaration '${line.content}' - expected 'domain <Qualified.Name>'`, locationOf(line));\n return existing;\n }\n if (existing !== null) {\n context.error(DiagnosticCodes.DuplicateDomain, 'The document already declares a domain - a document can have at most one', locationOf(line));\n return existing;\n }\n if (sawOtherConstruct) {\n context.error(DiagnosticCodes.DomainNotFirst, '\\'domain\\' must be declared before any other construct', locationOf(line));\n }\n return { kind: 'DomainSyntax', name: match[1], location: locationOf(line) };\n}\n\nfunction warnOnTabIndentation(context: ParserContext, lines: readonly SourceLine[]): void {\n let inFence = false;\n for (const line of lines) {\n if (line.raw.trimStart().startsWith('```')) {\n inFence = !inFence;\n continue;\n }\n if (!inFence && tabIndentPattern.test(line.raw)) {\n context.warning(DiagnosticCodes.TabIndentation, 'Screenplay is indentation based - use spaces, not tabs', startOf(line));\n }\n }\n}\n\nfunction parseConcept(context: ParserContext, line: SourceLine): ConceptSyntax {\n const match = conceptPattern.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidConceptDeclaration, `Invalid concept declaration '${line.content}' - expected 'concept <Name> : <Type>'`, locationOf(line));\n context.skipBlock(line.indent);\n return { kind: 'ConceptSyntax', name: firstWord(line.content), type: '', attributes: [], values: [], location: locationOf(line) };\n }\n const [, name, type, attributeText] = match;\n const attributes = parseComplianceMarkers(context, line, name, attributeText);\n if (type !== 'Enum' && !primitiveTypes.includes(type)) {\n context.error(DiagnosticCodes.UnknownPrimitiveType, `Unknown primitive type '${type}' - expected ${primitiveTypes.join(', ')} or Enum`, locationOf(line));\n }\n const values: string[] = [];\n const members = new EnumerationMembers();\n let generation: GenerationSyntax | null = null;\n let declaredGeneration = false;\n let description: string | null = null;\n const validations: ValidateSyntax[] = [];\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n const memberName = type === 'Enum' ? members.tryNumbered(context, child) : undefined;\n if (memberName !== undefined) {\n values.push(memberName);\n } else if (firstWord(child.content) === 'description' && (type !== 'Enum' || child.content !== 'description' || context.peekChild(child.indent)?.content.startsWith('```') === true)) {\n description = parseDescription(context, child, description, `Concept '${name}'`);\n } else if (isFileDirective(child)) {\n continue;\n } else if (firstWord(child.content) === 'validate') {\n if (type === 'Enum' && child.content === 'validate' && context.peekChild(child.indent) === undefined) {\n context.warning(DiagnosticCodes.ValidateReadAsEnumerationBlock,\n `'validate' in enumeration concept '${name}' declares an empty validate block, not a value named 'validate' - write '@validate' for the value`,\n locationOf(child));\n }\n const parsed = parseValidate(context, child, 'concept', name);\n if (parsed !== undefined) validations.push(parsed);\n } else if (firstWord(child.content) === 'generate' && !(type === 'Enum' && child.content === 'generate')) {\n if (declaredGeneration) context.error(DiagnosticCodes.DuplicateGeneration, `Concept '${name}' declares generation more than once.`, locationOf(child));\n const parsed = parseGeneration(context, child, type);\n if (!declaredGeneration) generation = parsed;\n declaredGeneration = true;\n } else if (parseComplianceDirective(context, child, name, attributes)) {\n // Compliance directives are modeled by their original concept marker.\n } else if (type === 'Enum' && enumValuePattern.test(child.content)) {\n values.push(unescapeIdentifier(child.content));\n } else if (type === 'Enum') {\n context.error(DiagnosticCodes.InvalidEnumerationValue, `Invalid enum value '${child.content}' - expected an identifier`, locationOf(child));\n } else {\n context.error(DiagnosticCodes.UnknownConceptDirective, `Unexpected '${child.content}' in concept body - expected validate, generate, 'file <path>' or '<attribute> reason \"<text>\"'`, locationOf(child));\n context.skipBlock(child.indent);\n }\n }\n const valueNumbers = members.finish(context, line, values.length);\n return { kind: 'ConceptSyntax', name, type, attributes, values, validations, description, ...(generation === null ? {} : { generation }), ...(valueNumbers === undefined ? {} : { valueNumbers }), location: locationOf(line) };\n}\n\n// 'persona <Name>' with an optional description and the policies it holds - the port of the C# ParsePersona.\nfunction parsePersona(context: ParserContext, line: SourceLine): PersonaSyntax {\n const name = personaPattern.exec(line.content)?.[1] ?? '';\n if (name === '') {\n context.error(DiagnosticCodes.InvalidPersonaDeclaration, `Invalid persona declaration '${line.content}' - expected 'persona <Name>'`, locationOf(line));\n }\n let description: string | null = null;\n const policies: string[] = [];\n const goals: string[] = [];\n let position: readonly [number, number] | null = null;\n let size: readonly [number, number] | null = null;\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n const keyword = firstWord(child.content);\n if (keyword === 'description') {\n description = parseDescription(context, child, description, `Persona '${name}'`);\n } else if (keyword === 'goal') {\n const goal = personaGoalPattern.exec(child.content);\n if (goal === null) {\n context.error(DiagnosticCodes.InvalidPersonaDeclaration, `Invalid goal '${child.content}' - expected 'goal \"<text>\"'`, locationOf(child));\n } else {\n goals.push(unescapeString(goal[1]));\n }\n } else if (keyword === 'position') {\n position = parseCanvasPair(context, child, 'position', 'x', 'y', position, true) ?? position;\n } else if (keyword === 'size') {\n size = parseCanvasPair(context, child, 'size', 'width', 'height', size, false) ?? size;\n } else if (keyword === 'policy') {\n const policy = personaPolicyPattern.exec(child.content);\n if (policy === null) {\n context.error(DiagnosticCodes.InvalidPersonaPolicyReference, `Invalid policy reference '${child.content}' - expected 'policy <Name>'`, locationOf(child));\n } else {\n policies.push(policy[1]);\n }\n } else {\n context.error(DiagnosticCodes.UnknownPersonaDirective, `Unexpected '${keyword}' in persona body - expected description, goal, policy, position or size`, locationOf(child));\n context.skipBlock(child.indent);\n }\n }\n return {\n kind: 'PersonaSyntax', name, description, policies,\n ...(goals.length > 0 ? { goals } : {}),\n ...(position === null ? {} : { x: position[0], y: position[1] }),\n ...(size === null ? {} : { width: size[0], height: size[1] }),\n location: locationOf(line),\n };\n}\n\n// 'sticky note on <canvas>' with the text it carries, an optional colour and where it sits on that canvas - the port of the C# ParseStickyNote.\nfunction parseStickyNote(context: ParserContext, line: SourceLine): StickyNoteSyntax | null {\n const canvasMatch = stickyNotePattern.exec(line.content);\n if (canvasMatch === null) {\n context.error(DiagnosticCodes.InvalidPersonaDeclaration, `Invalid sticky note declaration '${line.content}' - expected 'sticky note on personas', 'sticky note on eventsources', 'sticky note on givencontexts' or 'sticky note on seeddata'`, locationOf(line));\n context.skipBlock(line.indent);\n return null;\n }\n let text: string | null = null;\n let colour: string | null = null;\n let position: readonly [number, number] | null = null;\n let size: readonly [number, number] | null = null;\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n const keyword = firstWord(child.content);\n if (keyword === 'description') {\n text = parseDescription(context, child, text, 'A sticky note');\n } else if (keyword === 'colour') {\n const match = stickyNoteColourPattern.exec(child.content);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidPersonaDeclaration, `Invalid colour '${child.content}' - expected 'colour yellow', 'colour pink', 'colour green' or 'colour blue'`, locationOf(child));\n } else {\n colour = match[1];\n }\n } else if (keyword === 'position') {\n position = parseCanvasPair(context, child, 'position', 'x', 'y', position, true) ?? position;\n } else if (keyword === 'size') {\n size = parseCanvasPair(context, child, 'size', 'width', 'height', size, false) ?? size;\n } else {\n context.error(DiagnosticCodes.UnknownPersonaDirective, `Unexpected '${keyword}' in sticky note body - expected description, colour, position or size`, locationOf(child));\n context.skipBlock(child.indent);\n }\n }\n if (text === null || position === null) {\n context.error(DiagnosticCodes.InvalidPersonaDeclaration, 'A sticky note needs a description (the text on it) and a position', locationOf(line));\n return null;\n }\n return { kind: 'StickyNoteSyntax', canvas: canvasMatch[1] as StickyNoteSyntax['canvas'], text, colour, x: position[0], y: position[1], width: size === null ? null : size[0], height: size === null ? null : size[1], location: locationOf(line) };\n}\n\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"../../_virtual/_virtual/_rolldown/runtime.js";import{DiagnosticCodes as e}from"../Diagnostics/DiagnosticCodes.js";import{stringBodyPattern as t,unescapeString as n}from"../Text/StringLiteral.js";import{nativePattern as r}from"../Text/patterns.js";import{locationOf as i}from"./SourceLine.js";import{parseModeledMappingSource as a}from"./ExpressionParser.js";import{firstWord as o}from"./LineText.js";import{
|
|
1
|
+
import"../../_virtual/_virtual/_rolldown/runtime.js";import{DiagnosticCodes as e}from"../Diagnostics/DiagnosticCodes.js";import{stringBodyPattern as t,unescapeString as n}from"../Text/StringLiteral.js";import{nativePattern as r}from"../Text/patterns.js";import{locationOf as i}from"./SourceLine.js";import{parseModeledMappingSource as a}from"./ExpressionParser.js";import{firstWord as o}from"./LineText.js";import{tryParseStructuredMapping as s}from"./StructuredBlockParser.js";import{parseCanvasPair as c}from"./CanvasPlacement.js";const l=RegExp(`^seed(?:\\s+"(${t})")?$`,`u`),u=RegExp(`^for\\s+"(${t})"$`,`u`),d=r(`^[A-Z]\\w*$`),f=r(`^([\\w.]+)\\s*=(?!=|>)\\s*(.+)$`);function parseSeed(t,r){let p=[];t=t.valueContext;let m=l.exec(r.content);if(m===null)return t.error(e.InvalidSeedDeclaration,`Invalid seed declaration '${r.content}' - expected 'seed' or 'seed "<name>"'`,i(r)),t.skipOpaqueBlock(r.indent),{kind:`SeedSyntax`,groups:p,location:i(r)};let h=null;for(let l=t.peekChild(r.indent);l!==void 0;l=t.peekChild(r.indent)){if(t.reader.takeSignificant(),o(l.content)===`position`){h=c(t,l,`position`,`x`,`y`,h,!0)??h;continue}let r=u.exec(l.content);if(r===null){t.error(e.InvalidSeedGroup,`Invalid seed group '${l.content}' - expected 'for "<event source id>"'`,i(l)),t.skipOpaqueBlock(l.indent);continue}let m=[];for(let n=t.peekChild(l.indent);n!==void 0;n=t.peekChild(l.indent)){if(t.reader.takeSignificant(),!d.test(n.content)){t.error(e.InvalidSeedEvent,`Invalid seed event '${n.content}' - expected an event type name`,i(n)),t.skipOpaqueBlock(n.indent);continue}let r=[];for(let o=t.peekChild(n.indent);o!==void 0;o=t.peekChild(n.indent)){t.reader.takeSignificant();let n=f.exec(o.content),c=n===null?s(t,o):void 0;n===null?c===void 0?t.error(e.InvalidSeedPropertyAssignment,`Invalid property assignment '${o.content}' - expected '<property> = <value>'`,i(o)):r.push(c):r.push({kind:`PropertyMappingSyntax`,property:n[1],source:a(n[2],i(o),t),location:i(o)})}m.push({kind:`SeedEventSyntax`,event:n.content,properties:r,location:i(n)})}p.push({kind:`SeedGroupSyntax`,eventSourceId:n(r[1]),events:m,location:i(l)})}return{kind:`SeedSyntax`,groups:p,...m[1]===void 0?{}:{name:n(m[1])},...h===null?{}:{x:h[0],y:h[1]},location:i(r)}}export{parseSeed};
|
|
2
2
|
//# sourceMappingURL=SeedParser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SeedParser.js","names":["pattern","parseMappingSource","headerPattern","stringBodyPattern","forPattern","eventPattern","nativePattern","mappingPattern","groups","context","headerMatch","header","DiagnosticCodes","locationOf","position","group","firstWord","parseCanvasPair","match","events","event","properties","property","mapped","parseModeledMappingSource","unescapeString"],"sources":["../../../../../../Compiler/Parsing/SeedParser.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 { DiagnosticCodes } from '../Diagnostics/DiagnosticCodes';\nimport { PropertyMappingSyntax } from '../Syntax/Expressions';\nimport { SeedEventSyntax, SeedGroupSyntax, SeedSyntax } from '../Syntax/Seeds';\nimport { stringBodyPattern, unescapeString } from '../Text/StringLiteral';\nimport { nativePattern as pattern } from '../Text/patterns';\nimport { parseCanvasPair } from './CanvasPlacement';\nimport { parseModeledMappingSource as parseMappingSource } from './ExpressionParser';\nimport { firstWord } from './LineText';\nimport { ParserContext } from './ParserContext';\nimport { locationOf, SourceLine } from './SourceLine';\n\nconst headerPattern = new RegExp(`^seed(?:\\\\s+\"(${stringBodyPattern})\")?$`, 'u');\nconst forPattern = new RegExp(`^for\\\\s+\"(${stringBodyPattern})\"$`, 'u');\nconst eventPattern = pattern('^[A-Z]\\\\w*$');\nconst mappingPattern = pattern('^([\\\\w.]+)\\\\s*=(?!=|>)\\\\s*(.+)$');\n\nexport function parseSeed(context: ParserContext, header: SourceLine): SeedSyntax {\n const groups: SeedGroupSyntax[] = [];\n context = context.valueContext;\n const headerMatch = headerPattern.exec(header.content);\n if (headerMatch === null) {\n context.error(DiagnosticCodes.InvalidSeedDeclaration, `Invalid seed declaration '${header.content}' - expected 'seed' or 'seed \"<name>\"'`, locationOf(header));\n context.skipOpaqueBlock(header.indent);\n return { kind: 'SeedSyntax', groups, location: locationOf(header) };\n }\n let position: readonly [number, number] | null = null;\n for (let group = context.peekChild(header.indent); group !== undefined; group = context.peekChild(header.indent)) {\n context.reader.takeSignificant();\n if (firstWord(group.content) === 'position') {\n position = parseCanvasPair(context, group, 'position', 'x', 'y', position, true) ?? position;\n continue;\n }\n const match = forPattern.exec(group.content);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidSeedGroup, `Invalid seed group '${group.content}' - expected 'for \"<event source id>\"'`, locationOf(group));\n context.skipOpaqueBlock(group.indent);\n continue;\n }\n const events: SeedEventSyntax[] = [];\n for (let event = context.peekChild(group.indent); event !== undefined; event = context.peekChild(group.indent)) {\n context.reader.takeSignificant();\n if (!eventPattern.test(event.content)) {\n context.error(DiagnosticCodes.InvalidSeedEvent, `Invalid seed event '${event.content}' - expected an event type name`, locationOf(event));\n context.skipOpaqueBlock(event.indent);\n continue;\n }\n const properties: PropertyMappingSyntax[] = [];\n for (let property = context.peekChild(event.indent); property !== undefined; property = context.peekChild(event.indent)) {\n context.reader.takeSignificant();\n const mapped = mappingPattern.exec(property.content);\n if (mapped !== null) properties.push({ kind: 'PropertyMappingSyntax', property: mapped[1], source: parseMappingSource(mapped[2], locationOf(property), context), location: locationOf(property) });\n else context.error(DiagnosticCodes.InvalidSeedPropertyAssignment, `Invalid property assignment '${property.content}' - expected '<property> = <value>'`, locationOf(property));\n }\n events.push({ kind: 'SeedEventSyntax', event: event.content, properties, location: locationOf(event) });\n }\n groups.push({ kind: 'SeedGroupSyntax', eventSourceId: unescapeString(match[1]), events, location: locationOf(group) });\n }\n return { kind: 'SeedSyntax', groups, ...(headerMatch[1] === undefined ? {} : { name: unescapeString(headerMatch[1]) }), ...(position === null ? {} : { x: position[0], y: position[1] }), location: locationOf(header) };\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"SeedParser.js","names":["pattern","parseMappingSource","headerPattern","stringBodyPattern","forPattern","eventPattern","nativePattern","mappingPattern","groups","context","headerMatch","header","DiagnosticCodes","locationOf","position","group","firstWord","parseCanvasPair","match","events","event","properties","property","mapped","structured","tryParseStructuredMapping","parseModeledMappingSource","unescapeString"],"sources":["../../../../../../Compiler/Parsing/SeedParser.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 { DiagnosticCodes } from '../Diagnostics/DiagnosticCodes';\nimport { PropertyMappingSyntax } from '../Syntax/Expressions';\nimport { SeedEventSyntax, SeedGroupSyntax, SeedSyntax } from '../Syntax/Seeds';\nimport { stringBodyPattern, unescapeString } from '../Text/StringLiteral';\nimport { nativePattern as pattern } from '../Text/patterns';\nimport { parseCanvasPair } from './CanvasPlacement';\nimport { parseModeledMappingSource as parseMappingSource } from './ExpressionParser';\nimport { firstWord } from './LineText';\nimport { ParserContext } from './ParserContext';\nimport { locationOf, SourceLine } from './SourceLine';\nimport { tryParseStructuredMapping } from './StructuredBlockParser';\n\nconst headerPattern = new RegExp(`^seed(?:\\\\s+\"(${stringBodyPattern})\")?$`, 'u');\nconst forPattern = new RegExp(`^for\\\\s+\"(${stringBodyPattern})\"$`, 'u');\nconst eventPattern = pattern('^[A-Z]\\\\w*$');\nconst mappingPattern = pattern('^([\\\\w.]+)\\\\s*=(?!=|>)\\\\s*(.+)$');\n\nexport function parseSeed(context: ParserContext, header: SourceLine): SeedSyntax {\n const groups: SeedGroupSyntax[] = [];\n context = context.valueContext;\n const headerMatch = headerPattern.exec(header.content);\n if (headerMatch === null) {\n context.error(DiagnosticCodes.InvalidSeedDeclaration, `Invalid seed declaration '${header.content}' - expected 'seed' or 'seed \"<name>\"'`, locationOf(header));\n context.skipOpaqueBlock(header.indent);\n return { kind: 'SeedSyntax', groups, location: locationOf(header) };\n }\n let position: readonly [number, number] | null = null;\n for (let group = context.peekChild(header.indent); group !== undefined; group = context.peekChild(header.indent)) {\n context.reader.takeSignificant();\n if (firstWord(group.content) === 'position') {\n position = parseCanvasPair(context, group, 'position', 'x', 'y', position, true) ?? position;\n continue;\n }\n const match = forPattern.exec(group.content);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidSeedGroup, `Invalid seed group '${group.content}' - expected 'for \"<event source id>\"'`, locationOf(group));\n context.skipOpaqueBlock(group.indent);\n continue;\n }\n const events: SeedEventSyntax[] = [];\n for (let event = context.peekChild(group.indent); event !== undefined; event = context.peekChild(group.indent)) {\n context.reader.takeSignificant();\n if (!eventPattern.test(event.content)) {\n context.error(DiagnosticCodes.InvalidSeedEvent, `Invalid seed event '${event.content}' - expected an event type name`, locationOf(event));\n context.skipOpaqueBlock(event.indent);\n continue;\n }\n const properties: PropertyMappingSyntax[] = [];\n for (let property = context.peekChild(event.indent); property !== undefined; property = context.peekChild(event.indent)) {\n context.reader.takeSignificant();\n const mapped = mappingPattern.exec(property.content);\n const structured = mapped === null ? tryParseStructuredMapping(context, property) : undefined;\n if (mapped !== null) properties.push({ kind: 'PropertyMappingSyntax', property: mapped[1], source: parseMappingSource(mapped[2], locationOf(property), context), location: locationOf(property) });\n else if (structured !== undefined) properties.push(structured);\n else context.error(DiagnosticCodes.InvalidSeedPropertyAssignment, `Invalid property assignment '${property.content}' - expected '<property> = <value>'`, locationOf(property));\n }\n events.push({ kind: 'SeedEventSyntax', event: event.content, properties, location: locationOf(event) });\n }\n groups.push({ kind: 'SeedGroupSyntax', eventSourceId: unescapeString(match[1]), events, location: locationOf(group) });\n }\n return { kind: 'SeedSyntax', groups, ...(headerMatch[1] === undefined ? {} : { name: unescapeString(headerMatch[1]) }), ...(position === null ? {} : { x: position[0], y: position[1] }), location: locationOf(header) };\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"../../_virtual/_virtual/_rolldown/runtime.js";import{DiagnosticCodes as e}from"../Diagnostics/DiagnosticCodes.js";import{pattern as t}from"../Text/patterns.js";import{locationOf as n}from"./SourceLine.js";import{parseMappingSource as r}from"./ExpressionParser.js";import{diagnosticText as i}from"../Diagnostics/DiagnosticArgument.js";import{parseProperty as a}from"./PropertyLineParser.js";import{
|
|
1
|
+
import"../../_virtual/_virtual/_rolldown/runtime.js";import{DiagnosticCodes as e}from"../Diagnostics/DiagnosticCodes.js";import{pattern as t}from"../Text/patterns.js";import{locationOf as n}from"./SourceLine.js";import{parseMappingSource as r}from"./ExpressionParser.js";import{diagnosticText as i}from"../Diagnostics/DiagnosticArgument.js";import{parseProperty as a}from"./PropertyLineParser.js";import{tryParseStructuredMapping as o}from"./StructuredBlockParser.js";import{parseConcrete as s}from"./SpecificationResponseParser.js";const c=t(`^case\\s+([A-Za-z_]\\w*)(?:\\s+(?<property>[\\w.]+)\\s*=(?!=|>)\\s*(?<value>.+))?$`),l=t(`^([\\w.]+)\\s*=(?!=|>)\\s*(.+)$`),u=t(`^case\\.([a-z_]\\w*)$`);function containsCaseReference(e){return/\bcase\.[a-z_]\w*/.test(e.replace(/"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'/g,``))}function parseSpecificationValue(t,n,i,a=!1){if(!t.startsWith(`case.`))return containsCaseReference(t)&&i.error(e.InvalidSpecificationCaseReference,`A case reference fills a whole value position; it cannot occur inside a structured value or expression.`,n),r(t,n,i,a);let o=u.exec(t);return o===null&&i.error(e.InvalidSpecificationCaseReference,`A case reference fills a whole value position: 'case.<parameter>'.`,n),{kind:`CaseValueExpressionSyntax`,parameter:o?.[1]??t.substring(5),location:n}}function parseParameter(t,r){let i=r.content.indexOf(` `)+1,o=i>0?a(t,{...r,content:r.content.substring(i),indent:r.indent+i}):void 0;if(o===void 0||o.isGenerated||o.isIdentifier)return t.error(e.InvalidSpecificationParameter,`Expected 'parameter <name> <Type>', with optional collection and optional modifiers.`,n(r)),t.skipOpaqueBlock(r.indent),null;let s=t.peekChild(r.indent);return s!==void 0&&(t.error(e.InvalidSpecificationParameter,`A parameter has no body or default.`,n(s)),t.skipOpaqueBlock(r.indent)),{kind:`SpecificationParameterSyntax`,name:o.name,type:o.type,location:n(r)}}function parseCase(t,r){let a=c.exec(r.content);if(a===null)return t.error(e.InvalidSpecificationCase,`Expected 'case <Name>' with at most one inline parameter assignment.`,n(r)),t.skipOpaqueBlock(r.indent),null;let u=[],d=r.content.indexOf(a.groups?.property??``,r.content.indexOf(a[1],4)+a[1].length),add=(a,o,c)=>{let l=n(c),f={...l,column:l.column+c.content.indexOf(o,c.content.indexOf(`=`)+1)};if(o.startsWith(`case.`)){t.error(e.InvalidSpecificationCaseValue,`A case assigns concrete values, not case references.`,f,i(`text`,o));return}let p=s(t,o,f,e.InvalidSpecificationCaseValue);p!==null&&u.push({kind:`PropertyMappingSyntax`,property:a,source:p,location:c===r?{...l,column:l.column+d}:l})};a.groups?.property!==void 0&&add(a.groups.property,a.groups.value,r);for(let s=t.peekChild(r.indent);s!==void 0;s=t.peekChild(r.indent)){t.reader.takeSignificant();let r=l.exec(s.content),c=r===null?o(t,s):void 0;if(c!==void 0){u.push(c);continue}if(r===null){t.error(e.InvalidSpecificationCaseAssignment,`Expected '<parameter> = <concrete value>' in a case.`,n(s)),t.skipOpaqueBlock(s.indent);continue}add(r[1],r[2],s);let d=t.peekChild(s.indent);d!==void 0&&(t.error(e.InvalidSpecificationCaseValue,`A case value must fit on one line.`,n(d),{...i(`case`,a[1]),...i(`parameter`,r[1]),...i(`text`,d.content)}),t.skipOpaqueBlock(s.indent))}return{kind:`SpecificationCaseSyntax`,name:a[1],values:u,location:n(r)}}function caseReferences(e){return Array.isArray(e)?e.flatMap(caseReferences):typeof e!=`object`||!e?[]:`kind`in e&&e.kind===`CaseValueExpressionSyntax`?[e]:Object.values(e).flatMap(caseReferences)}function validateTable(t,n){let r=t.parameters??[],i=t.cases??[];r.length===0!=(i.length===0)&&n.error(e.IncompleteSpecificationTable,`A specification table requires parameters and at least one case.`,t.location),r.forEach((t,i)=>{r.slice(0,i).some(e=>e.name===t.name)&&n.error(e.DuplicateSpecificationParameter,`Parameter '${t.name}' is declared more than once.`,t.location)}),i.forEach((t,a)=>{i.slice(0,a).some(e=>e.name===t.name)&&n.error(e.DuplicateSpecificationCase,`Case '${t.name}' is declared more than once.`,t.location);for(let i of t.values.filter(e=>!r.some(t=>t.name===e.property)))n.error(e.InvalidSpecificationCaseAssignment,`Case '${t.name}' assigns undeclared parameter '${i.property}'.`,i.location);for(let i of r.filter(e=>t.values.filter(t=>t.property===e.name).length!==1))n.error(e.InvalidSpecificationCaseAssignment,`Case '${t.name}' must assign parameter '${i.name}' exactly once.`,t.location)});let a=caseReferences(t);for(let t of a)(i.length===0||!r.some(e=>e.name===t.parameter))&&n.error(e.InvalidSpecificationCaseReference,`Case reference '${t.parameter}' requires a declared parameter in a specification table.`,t.location);for(let t of r.filter(e=>!a.some(t=>t.parameter===e.name)))n.warning(e.UnusedSpecificationParameter,`Parameter '${t.name}' is never referenced.`,t.location);for(let r of caseReferences(t.whenRedelivered))n.error(e.InvalidSpecificationCaseReference,`Case references are not permitted in redelivery locators.`,r.location)}function substituteCase(e,t,n=/* @__PURE__ */ new WeakMap){if(typeof e==`object`&&e&&n.has(e))return n.get(e);if(Array.isArray(e)){let r=e.map(e=>substituteCase(e,t,n));return n.set(e,r),r}if(typeof e!=`object`||!e||!(`kind`in e))return e;if(e.kind===`CaseValueExpressionSyntax`){let n=e.parameter;return t.values.find(e=>e.property===n)?.source??e}let r=Object.fromEntries(Object.entries(e).map(([e,r])=>[e,substituteCase(r,t,n)]));if(e.kind===`SpecificationErrorSyntax`&&`caseValue`in e&&e.caseValue!==void 0){let e=r.caseValue;r.name=e.kind===`LiteralExpressionSyntax`?e.value:null,delete r.caseValue}return n.set(e,r),r}export{caseReferences,containsCaseReference,parseCase,parseParameter,parseSpecificationValue,substituteCase,validateTable};
|
|
2
2
|
//# sourceMappingURL=SpecificationCaseParser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SpecificationCaseParser.js","names":["caseHeader","pattern","assignment","reference","text","context","DiagnosticCodes","location","parseMappingSource","nativeIdentifiers","match","offset","line","property","parseProperty","locationOf","child","values","inlinePropertyColumn","owner","valueLocation","diagnosticText","source","parseConcrete","value","nested","parameters","specification","cases","index","prior","parameter","row","references","copies","result","item","key"],"sources":["../../../../../../Compiler/Parsing/SpecificationCaseParser.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 { diagnosticText } from '../Diagnostics/DiagnosticArgument';\nimport { DiagnosticCodes } from '../Diagnostics/DiagnosticCodes';\nimport { SourceLocation } from '../Diagnostics/SourceLocation';\nimport { CaseValueExpressionSyntax, ExpressionSyntax, PropertyMappingSyntax } from '../Syntax/Expressions';\nimport { SpecificationCaseSyntax, SpecificationParameterSyntax, SpecificationSyntax } from '../Syntax/Specifications';\nimport { pattern } from '../Text/patterns';\nimport { parseMappingSource } from './ExpressionParser';\nimport { ParserContext } from './ParserContext';\nimport { parseProperty } from './PropertyLineParser';\nimport { locationOf, SourceLine } from './SourceLine';\nimport { parseConcrete } from './SpecificationResponseParser';\n\n// No 'd' (hasIndices) flag: another extension in the shared VS Code extension host can patch RegExp and fail on it.\nconst caseHeader = pattern('^case\\\\s+([A-Za-z_]\\\\w*)(?:\\\\s+(?<property>[\\\\w.]+)\\\\s*=(?!=|>)\\\\s*(?<value>.+))?$');\nconst assignment = pattern('^([\\\\w.]+)\\\\s*=(?!=|>)\\\\s*(.+)$');\nconst reference = pattern('^case\\\\.([a-z_]\\\\w*)$');\n\nexport function containsCaseReference(text: string): boolean {\n return /\\bcase\\.[a-z_]\\w*/.test(text.replace(/\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*'/g, ''));\n}\n\nexport function parseSpecificationValue(text: string, location: SourceLocation, context: ParserContext, nativeIdentifiers = false): ExpressionSyntax {\n if (!text.startsWith('case.')) {\n if (containsCaseReference(text)) context.error(DiagnosticCodes.InvalidSpecificationCaseReference, 'A case reference fills a whole value position; it cannot occur inside a structured value or expression.', location);\n return parseMappingSource(text, location, context, nativeIdentifiers);\n }\n const match = reference.exec(text);\n if (match === null) context.error(DiagnosticCodes.InvalidSpecificationCaseReference, \"A case reference fills a whole value position: 'case.<parameter>'.\", location);\n return { kind: 'CaseValueExpressionSyntax', parameter: match?.[1] ?? text.substring(5), location };\n}\n\nexport function parseParameter(context: ParserContext, line: SourceLine): SpecificationParameterSyntax | null {\n const offset = line.content.indexOf(' ') + 1;\n const property = offset > 0 ? parseProperty(context, { ...line, content: line.content.substring(offset), indent: line.indent + offset }) : undefined;\n if (property === undefined || property.isGenerated || property.isIdentifier) {\n context.error(DiagnosticCodes.InvalidSpecificationParameter, \"Expected 'parameter <name> <Type>', with optional collection and optional modifiers.\", locationOf(line));\n context.skipOpaqueBlock(line.indent);\n return null;\n }\n const child = context.peekChild(line.indent);\n if (child !== undefined) {\n context.error(DiagnosticCodes.InvalidSpecificationParameter, 'A parameter has no body or default.', locationOf(child));\n context.skipOpaqueBlock(line.indent);\n }\n return { kind: 'SpecificationParameterSyntax', name: property.name, type: property.type, location: locationOf(line) };\n}\n\nexport function parseCase(context: ParserContext, line: SourceLine): SpecificationCaseSyntax | null {\n const match = caseHeader.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidSpecificationCase, \"Expected 'case <Name>' with at most one inline parameter assignment.\", locationOf(line));\n context.skipOpaqueBlock(line.indent);\n return null;\n }\n const values: PropertyMappingSyntax[] = [];\n const inlinePropertyColumn = line.content.indexOf(match.groups?.property ?? '', line.content.indexOf(match[1], 'case'.length) + match[1].length);\n const add = (property: string, text: string, owner: SourceLine) => {\n const location = locationOf(owner);\n const valueLocation = { ...location, column: location.column + owner.content.indexOf(text, owner.content.indexOf('=') + 1) };\n if (text.startsWith('case.')) {\n context.error(DiagnosticCodes.InvalidSpecificationCaseValue, 'A case assigns concrete values, not case references.', valueLocation, diagnosticText('text', text));\n return;\n }\n const source = parseConcrete(context, text, valueLocation, DiagnosticCodes.InvalidSpecificationCaseValue);\n if (source !== null) values.push({ kind: 'PropertyMappingSyntax', property, source, location: owner === line ? { ...location, column: location.column + inlinePropertyColumn } : location });\n };\n if (match.groups?.property !== undefined) add(match.groups.property, match.groups.value, line);\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n const value = assignment.exec(child.content);\n if (value === null) {\n context.error(DiagnosticCodes.InvalidSpecificationCaseAssignment, \"Expected '<parameter> = <concrete value>' in a case.\", locationOf(child));\n context.skipOpaqueBlock(child.indent);\n continue;\n }\n add(value[1], value[2], child);\n const nested = context.peekChild(child.indent);\n if (nested !== undefined) {\n context.error(DiagnosticCodes.InvalidSpecificationCaseValue, 'A case value must fit on one line.', locationOf(nested), { ...diagnosticText('case', match[1]), ...diagnosticText('parameter', value[1]), ...diagnosticText('text', nested.content) });\n context.skipOpaqueBlock(child.indent);\n }\n }\n return { kind: 'SpecificationCaseSyntax', name: match[1], values, location: locationOf(line) };\n}\n\nexport function caseReferences(value: unknown): CaseValueExpressionSyntax[] {\n if (Array.isArray(value)) return value.flatMap(caseReferences);\n if (value === null || typeof value !== 'object') return [];\n if ('kind' in value && value.kind === 'CaseValueExpressionSyntax') return [value as CaseValueExpressionSyntax];\n return Object.values(value).flatMap(caseReferences);\n}\n\nexport function validateTable(specification: SpecificationSyntax, context: ParserContext): void {\n const parameters = specification.parameters ?? [];\n const cases = specification.cases ?? [];\n if ((parameters.length === 0) !== (cases.length === 0)) context.error(DiagnosticCodes.IncompleteSpecificationTable, 'A specification table requires parameters and at least one case.', specification.location);\n parameters.forEach((parameter, index) => {\n if (parameters.slice(0, index).some(prior => prior.name === parameter.name)) context.error(DiagnosticCodes.DuplicateSpecificationParameter, `Parameter '${parameter.name}' is declared more than once.`, parameter.location);\n });\n cases.forEach((row, index) => {\n if (cases.slice(0, index).some(prior => prior.name === row.name)) context.error(DiagnosticCodes.DuplicateSpecificationCase, `Case '${row.name}' is declared more than once.`, row.location);\n for (const value of row.values.filter(value => !parameters.some(parameter => parameter.name === value.property))) context.error(DiagnosticCodes.InvalidSpecificationCaseAssignment, `Case '${row.name}' assigns undeclared parameter '${value.property}'.`, value.location);\n for (const parameter of parameters.filter(parameter => row.values.filter(value => value.property === parameter.name).length !== 1)) context.error(DiagnosticCodes.InvalidSpecificationCaseAssignment, `Case '${row.name}' must assign parameter '${parameter.name}' exactly once.`, row.location);\n });\n const references = caseReferences(specification);\n for (const value of references) {\n if (cases.length === 0 || !parameters.some(parameter => parameter.name === value.parameter)) context.error(DiagnosticCodes.InvalidSpecificationCaseReference, `Case reference '${value.parameter}' requires a declared parameter in a specification table.`, value.location);\n }\n for (const parameter of parameters.filter(parameter => !references.some(value => value.parameter === parameter.name))) context.warning(DiagnosticCodes.UnusedSpecificationParameter, `Parameter '${parameter.name}' is never referenced.`, parameter.location);\n for (const value of caseReferences(specification.whenRedelivered)) context.error(DiagnosticCodes.InvalidSpecificationCaseReference, 'Case references are not permitted in redelivery locators.', value.location);\n}\n\nexport function substituteCase<T>(value: T, row: SpecificationCaseSyntax, copies = new WeakMap<object, unknown>()): T {\n if (value !== null && typeof value === 'object' && copies.has(value)) return copies.get(value) as T;\n if (Array.isArray(value)) {\n const result = value.map(item => substituteCase(item, row, copies));\n copies.set(value, result);\n return result as T;\n }\n if (value === null || typeof value !== 'object' || !('kind' in value)) return value;\n if (value.kind === 'CaseValueExpressionSyntax') {\n const parameter = (value as unknown as CaseValueExpressionSyntax).parameter;\n return (row.values.find(value => value.property === parameter)?.source ?? value) as T;\n }\n const result = Object.fromEntries(Object.entries(value).map(([key, item]) => [key, substituteCase(item, row, copies)]));\n if (value.kind === 'SpecificationErrorSyntax' && 'caseValue' in value && value.caseValue !== undefined) {\n const source = result.caseValue as ExpressionSyntax;\n result.name = source.kind === 'LiteralExpressionSyntax' ? source.value : null;\n delete result.caseValue;\n }\n copies.set(value, result);\n return result as T;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SpecificationCaseParser.js","names":["caseHeader","pattern","assignment","reference","text","context","DiagnosticCodes","location","parseMappingSource","nativeIdentifiers","match","offset","line","property","parseProperty","locationOf","child","values","inlinePropertyColumn","owner","valueLocation","diagnosticText","source","parseConcrete","value","structured","tryParseStructuredMapping","nested","parameters","specification","cases","index","prior","parameter","row","references","copies","result","item","key"],"sources":["../../../../../../Compiler/Parsing/SpecificationCaseParser.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 { diagnosticText } from '../Diagnostics/DiagnosticArgument';\nimport { DiagnosticCodes } from '../Diagnostics/DiagnosticCodes';\nimport { SourceLocation } from '../Diagnostics/SourceLocation';\nimport { CaseValueExpressionSyntax, ExpressionSyntax, PropertyMappingSyntax } from '../Syntax/Expressions';\nimport { SpecificationCaseSyntax, SpecificationParameterSyntax, SpecificationSyntax } from '../Syntax/Specifications';\nimport { pattern } from '../Text/patterns';\nimport { parseMappingSource } from './ExpressionParser';\nimport { ParserContext } from './ParserContext';\nimport { parseProperty } from './PropertyLineParser';\nimport { locationOf, SourceLine } from './SourceLine';\nimport { parseConcrete } from './SpecificationResponseParser';\nimport { tryParseStructuredMapping } from './StructuredBlockParser';\n\n// No 'd' (hasIndices) flag: another extension in the shared VS Code extension host can patch RegExp and fail on it.\nconst caseHeader = pattern('^case\\\\s+([A-Za-z_]\\\\w*)(?:\\\\s+(?<property>[\\\\w.]+)\\\\s*=(?!=|>)\\\\s*(?<value>.+))?$');\nconst assignment = pattern('^([\\\\w.]+)\\\\s*=(?!=|>)\\\\s*(.+)$');\nconst reference = pattern('^case\\\\.([a-z_]\\\\w*)$');\n\nexport function containsCaseReference(text: string): boolean {\n return /\\bcase\\.[a-z_]\\w*/.test(text.replace(/\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*'/g, ''));\n}\n\nexport function parseSpecificationValue(text: string, location: SourceLocation, context: ParserContext, nativeIdentifiers = false): ExpressionSyntax {\n if (!text.startsWith('case.')) {\n if (containsCaseReference(text)) context.error(DiagnosticCodes.InvalidSpecificationCaseReference, 'A case reference fills a whole value position; it cannot occur inside a structured value or expression.', location);\n return parseMappingSource(text, location, context, nativeIdentifiers);\n }\n const match = reference.exec(text);\n if (match === null) context.error(DiagnosticCodes.InvalidSpecificationCaseReference, \"A case reference fills a whole value position: 'case.<parameter>'.\", location);\n return { kind: 'CaseValueExpressionSyntax', parameter: match?.[1] ?? text.substring(5), location };\n}\n\nexport function parseParameter(context: ParserContext, line: SourceLine): SpecificationParameterSyntax | null {\n const offset = line.content.indexOf(' ') + 1;\n const property = offset > 0 ? parseProperty(context, { ...line, content: line.content.substring(offset), indent: line.indent + offset }) : undefined;\n if (property === undefined || property.isGenerated || property.isIdentifier) {\n context.error(DiagnosticCodes.InvalidSpecificationParameter, \"Expected 'parameter <name> <Type>', with optional collection and optional modifiers.\", locationOf(line));\n context.skipOpaqueBlock(line.indent);\n return null;\n }\n const child = context.peekChild(line.indent);\n if (child !== undefined) {\n context.error(DiagnosticCodes.InvalidSpecificationParameter, 'A parameter has no body or default.', locationOf(child));\n context.skipOpaqueBlock(line.indent);\n }\n return { kind: 'SpecificationParameterSyntax', name: property.name, type: property.type, location: locationOf(line) };\n}\n\nexport function parseCase(context: ParserContext, line: SourceLine): SpecificationCaseSyntax | null {\n const match = caseHeader.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidSpecificationCase, \"Expected 'case <Name>' with at most one inline parameter assignment.\", locationOf(line));\n context.skipOpaqueBlock(line.indent);\n return null;\n }\n const values: PropertyMappingSyntax[] = [];\n const inlinePropertyColumn = line.content.indexOf(match.groups?.property ?? '', line.content.indexOf(match[1], 'case'.length) + match[1].length);\n const add = (property: string, text: string, owner: SourceLine) => {\n const location = locationOf(owner);\n const valueLocation = { ...location, column: location.column + owner.content.indexOf(text, owner.content.indexOf('=') + 1) };\n if (text.startsWith('case.')) {\n context.error(DiagnosticCodes.InvalidSpecificationCaseValue, 'A case assigns concrete values, not case references.', valueLocation, diagnosticText('text', text));\n return;\n }\n const source = parseConcrete(context, text, valueLocation, DiagnosticCodes.InvalidSpecificationCaseValue);\n if (source !== null) values.push({ kind: 'PropertyMappingSyntax', property, source, location: owner === line ? { ...location, column: location.column + inlinePropertyColumn } : location });\n };\n if (match.groups?.property !== undefined) add(match.groups.property, match.groups.value, line);\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n const value = assignment.exec(child.content);\n const structured = value === null ? tryParseStructuredMapping(context, child) : undefined;\n if (structured !== undefined) {\n values.push(structured);\n continue;\n }\n if (value === null) {\n context.error(DiagnosticCodes.InvalidSpecificationCaseAssignment, \"Expected '<parameter> = <concrete value>' in a case.\", locationOf(child));\n context.skipOpaqueBlock(child.indent);\n continue;\n }\n add(value[1], value[2], child);\n const nested = context.peekChild(child.indent);\n if (nested !== undefined) {\n context.error(DiagnosticCodes.InvalidSpecificationCaseValue, 'A case value must fit on one line.', locationOf(nested), { ...diagnosticText('case', match[1]), ...diagnosticText('parameter', value[1]), ...diagnosticText('text', nested.content) });\n context.skipOpaqueBlock(child.indent);\n }\n }\n return { kind: 'SpecificationCaseSyntax', name: match[1], values, location: locationOf(line) };\n}\n\nexport function caseReferences(value: unknown): CaseValueExpressionSyntax[] {\n if (Array.isArray(value)) return value.flatMap(caseReferences);\n if (value === null || typeof value !== 'object') return [];\n if ('kind' in value && value.kind === 'CaseValueExpressionSyntax') return [value as CaseValueExpressionSyntax];\n return Object.values(value).flatMap(caseReferences);\n}\n\nexport function validateTable(specification: SpecificationSyntax, context: ParserContext): void {\n const parameters = specification.parameters ?? [];\n const cases = specification.cases ?? [];\n if ((parameters.length === 0) !== (cases.length === 0)) context.error(DiagnosticCodes.IncompleteSpecificationTable, 'A specification table requires parameters and at least one case.', specification.location);\n parameters.forEach((parameter, index) => {\n if (parameters.slice(0, index).some(prior => prior.name === parameter.name)) context.error(DiagnosticCodes.DuplicateSpecificationParameter, `Parameter '${parameter.name}' is declared more than once.`, parameter.location);\n });\n cases.forEach((row, index) => {\n if (cases.slice(0, index).some(prior => prior.name === row.name)) context.error(DiagnosticCodes.DuplicateSpecificationCase, `Case '${row.name}' is declared more than once.`, row.location);\n for (const value of row.values.filter(value => !parameters.some(parameter => parameter.name === value.property))) context.error(DiagnosticCodes.InvalidSpecificationCaseAssignment, `Case '${row.name}' assigns undeclared parameter '${value.property}'.`, value.location);\n for (const parameter of parameters.filter(parameter => row.values.filter(value => value.property === parameter.name).length !== 1)) context.error(DiagnosticCodes.InvalidSpecificationCaseAssignment, `Case '${row.name}' must assign parameter '${parameter.name}' exactly once.`, row.location);\n });\n const references = caseReferences(specification);\n for (const value of references) {\n if (cases.length === 0 || !parameters.some(parameter => parameter.name === value.parameter)) context.error(DiagnosticCodes.InvalidSpecificationCaseReference, `Case reference '${value.parameter}' requires a declared parameter in a specification table.`, value.location);\n }\n for (const parameter of parameters.filter(parameter => !references.some(value => value.parameter === parameter.name))) context.warning(DiagnosticCodes.UnusedSpecificationParameter, `Parameter '${parameter.name}' is never referenced.`, parameter.location);\n for (const value of caseReferences(specification.whenRedelivered)) context.error(DiagnosticCodes.InvalidSpecificationCaseReference, 'Case references are not permitted in redelivery locators.', value.location);\n}\n\nexport function substituteCase<T>(value: T, row: SpecificationCaseSyntax, copies = new WeakMap<object, unknown>()): T {\n if (value !== null && typeof value === 'object' && copies.has(value)) return copies.get(value) as T;\n if (Array.isArray(value)) {\n const result = value.map(item => substituteCase(item, row, copies));\n copies.set(value, result);\n return result as T;\n }\n if (value === null || typeof value !== 'object' || !('kind' in value)) return value;\n if (value.kind === 'CaseValueExpressionSyntax') {\n const parameter = (value as unknown as CaseValueExpressionSyntax).parameter;\n return (row.values.find(value => value.property === parameter)?.source ?? value) as T;\n }\n const result = Object.fromEntries(Object.entries(value).map(([key, item]) => [key, substituteCase(item, row, copies)]));\n if (value.kind === 'SpecificationErrorSyntax' && 'caseValue' in value && value.caseValue !== undefined) {\n const source = result.caseValue as ExpressionSyntax;\n result.name = source.kind === 'LiteralExpressionSyntax' ? source.value : null;\n delete result.caseValue;\n }\n copies.set(value, result);\n return result as T;\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"../../_virtual/_virtual/_rolldown/runtime.js";import{DiagnosticCodes as e}from"../Diagnostics/DiagnosticCodes.js";import{dotNetWhitespace as t,nativePattern as n}from"../Text/patterns.js";import{locationOf as r}from"./SourceLine.js";import{diagnosticText as i}from"../Diagnostics/DiagnosticArgument.js";import{firstWord as a}from"./LineText.js";import{generatedFixturePattern as
|
|
1
|
+
import"../../_virtual/_virtual/_rolldown/runtime.js";import{DiagnosticCodes as e}from"../Diagnostics/DiagnosticCodes.js";import{dotNetWhitespace as t,nativePattern as n}from"../Text/patterns.js";import{locationOf as r}from"./SourceLine.js";import{diagnosticText as i}from"../Diagnostics/DiagnosticArgument.js";import{firstWord as a}from"./LineText.js";import{tryParseStructuredMapping as o}from"./StructuredBlockParser.js";import{generatedFixturePattern as s,generatedFixturePrefix as c,parseConcrete as l,parseConcreteMapping as u}from"./SpecificationResponseParser.js";import{caseReferences as d,parseSpecificationValue as f}from"./SpecificationCaseParser.js";import{parseDescription as p}from"./DescriptionParser.js";import{parseSpecificationStream as m,rejectSpecificationRouteChildren as h,specificationStream as g}from"./SpecificationParser.js";const _=n(`^example\\s+([A-Z]\\w*)\\s*:\\s*([A-Z]\\w*(?:\\.\\w+)*)$`.replaceAll(`\\s`,t)),v=n(`^([\\w.]+)\\s*=(?!=|>)\\s*(.+)$`.replaceAll(`\\s`,t));function parseExample(t,n){let a=_.exec(n.content);if(a===null)return t.error(e.InvalidSpecificationExample,`Invalid example declaration '${n.content}' - expected 'example <Name> : <EventOrCommandOrReadModel>'`,r(n),i(`text`,n.content)),t.skipOpaqueBlock(n.indent),{kind:`SpecificationExampleSyntax`,name:``,type:``,values:[],generatedValues:[],for:null,description:null,location:r(n)};let o=parseFixtureBody(t,n,void 0,!0,a[1]);for(let n of d(o))t.error(e.InvalidSpecificationCaseReference,`Case references are not permitted in example bodies.`,n.location);return{kind:`SpecificationExampleSyntax`,name:a[1],type:a[2],...o,location:r(n)}}function addInlineValue(t,n,i,a){if(i?.groups?.property===void 0)return;let o=i.groups.property,s=i.groups.value,c=n.content.length-s.length,u=r(n),d=l(t,s,{...u,column:u.column+c},e.InvalidSpecificationValue);d!==null&&a.push({kind:`PropertyMappingSyntax`,property:o,source:d,location:{...u,column:u.column+n.content.lastIndexOf(o,n.content.indexOf(`=`))}})}function addFixtureValue(t,n,r,a=[]){[...n,...a].some(e=>e.property===r.property)?t.error(e.DuplicateSpecificationAssignment,`Property '${r.property}' is assigned more than once in this fixture - assign it only once, inline or indented`,r.location,i(`property`,r.property)):n.push(r)}function parseFixtureBody(t,n,l,d=!1,_){let y=[],b=[],x=null,S=null,C,w;addInlineValue(t,n,l,y);for(let l=t.peekChild(n.indent);l!==void 0;l=t.peekChild(n.indent)){t.reader.takeSignificant();let n;if(_!==void 0&&a(l.content)===`description`){S=p(t,l,S,`Example '${_}'`);continue}if(d&&c.test(l.content)){let n=u(t,l,s,e.InvalidGeneratedFixture);n!==null&&(_===void 0?b.push(n):addFixtureValue(t,b,n,y));continue}let T=v.exec(l.content);if(_!==void 0&&T===null&&(a(l.content)===`stream`||l.content.startsWith(`no stream`))){let n=g.exec(l.content);C!==void 0||w!==void 0?(t.error(e.InvalidSpecificationStream,`An event occurrence declares at most one stream or no stream directive.`,r(l)),t.skipOpaqueBlock(l.indent)):l.content===`no stream`?(w={kind:`SpecificationNoStreamSyntax`,location:r(l)},h(t,l)):n===null?(t.error(e.InvalidSpecificationStream,`Expected 'stream Source.Stream', or 'no stream' on an event example.`,r(l)),t.skipOpaqueBlock(l.indent)):C=m(t,l,n)}else if(T!==null)addFixtureValue(t,y,{kind:`PropertyMappingSyntax`,property:T[1],source:f(T[2],r(l),t),location:r(l)},b);else if(a(l.content)===`for`){let n=l.content.substring(3).trim();n.length===0?t.error(e.InvalidSpecificationEventSource,`Invalid event-source assertion 'for' - expected 'for <value>'`,r(l)):x===null?x=f(n,r(l),t):t.error(e.DuplicateSpecificationEventSource,`A specification step can declare its event-source assertion only once`,r(l))}else(n=o(t,l))===void 0?t.error(e.InvalidSpecificationValue,`Invalid property mapping '${l.content}' - expected '<property> = <value>'`,r(l),i(`text`,l.content)):addFixtureValue(t,y,n,b)}return{values:y,for:x,generatedValues:b,description:S,...C===void 0?{}:{stream:C},...w===void 0?{}:{noStream:w}}}export{addFixtureValue,addInlineValue,parseExample,parseFixtureBody};
|
|
2
2
|
//# sourceMappingURL=SpecificationExampleParser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SpecificationExampleParser.js","names":["parseMappingSource","header","nativePattern","dotNetWhitespace","mapping","match","line","context","DiagnosticCodes","locationOf","diagnosticText","body","reference","caseReferences","property","text","offset","location","source","parseConcrete","values","other","existing","value","generatedValues","eventSource","description","stream","noStream","parent","inline","child","example","firstWord","parseDescription","allowGenerated","generatedFixturePrefix","fixture","parseConcreteMapping","generatedFixturePattern","route","specificationStream","rejectSpecificationRouteChildren","parseSpecificationStream","parseSpecificationValue"],"sources":["../../../../../../Compiler/Parsing/SpecificationExampleParser.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 { diagnosticText } from '../Diagnostics/DiagnosticArgument';\nimport { DiagnosticCodes } from '../Diagnostics/DiagnosticCodes';\nimport { ExpressionSyntax, PropertyMappingSyntax } from '../Syntax/Expressions';\nimport { SpecificationNoStreamSyntax, SpecificationStreamSyntax, SpecificationExampleSyntax } from '../Syntax/Specifications';\nimport { dotNetWhitespace, nativePattern } from '../Text/patterns';\nimport { parseSpecificationStream, rejectSpecificationRouteChildren, specificationStream } from './SpecificationParser';\nimport { parseDescription } from './DescriptionParser';\nimport { caseReferences, parseSpecificationValue as parseMappingSource } from './SpecificationCaseParser';\nimport { firstWord } from './LineText';\nimport { ParserContext } from './ParserContext';\nimport { locationOf, SourceLine } from './SourceLine';\nimport { generatedFixturePattern, generatedFixturePrefix, parseConcrete, parseConcreteMapping } from './SpecificationResponseParser';\n\nconst header = nativePattern('^example\\\\s+([A-Z]\\\\w*)\\\\s*:\\\\s*([A-Z]\\\\w*(?:\\\\.\\\\w+)*)$'.replaceAll('\\\\s', dotNetWhitespace));\nconst mapping = nativePattern('^([\\\\w.]+)\\\\s*=(?!=|>)\\\\s*(.+)$'.replaceAll('\\\\s', dotNetWhitespace));\n\nexport function parseExample(context: ParserContext, line: SourceLine): SpecificationExampleSyntax {\n const match = header.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidSpecificationExample, `Invalid example declaration '${line.content}' - expected 'example <Name> : <EventOrCommandOrReadModel>'`, locationOf(line), diagnosticText('text', line.content));\n context.skipOpaqueBlock(line.indent);\n return { kind: 'SpecificationExampleSyntax', name: '', type: '', values: [], generatedValues: [], for: null, description: null, location: locationOf(line) };\n }\n const body = parseFixtureBody(context, line, undefined, true, match[1]);\n for (const reference of caseReferences(body)) context.error(DiagnosticCodes.InvalidSpecificationCaseReference, 'Case references are not permitted in example bodies.', reference.location);\n return { kind: 'SpecificationExampleSyntax', name: match[1], type: match[2], ...body, location: locationOf(line) };\n}\n\nexport function addInlineValue(context: ParserContext, line: SourceLine, match: RegExpExecArray | undefined, values: PropertyMappingSyntax[]): void {\n if (match?.groups?.property === undefined) return;\n const property = match.groups.property;\n const text = match.groups.value;\n const offset = line.content.length - text.length;\n const location = locationOf(line);\n const source = parseConcrete(context, text, { ...location, column: location.column + offset }, DiagnosticCodes.InvalidSpecificationValue);\n if (source !== null) values.push({ kind: 'PropertyMappingSyntax', property, source, location: { ...location, column: location.column + line.content.lastIndexOf(property, line.content.indexOf('=')) } });\n}\n\nexport function addFixtureValue(context: ParserContext, values: PropertyMappingSyntax[], value: PropertyMappingSyntax, other: readonly PropertyMappingSyntax[] = []): void {\n if ([...values, ...other].some(existing => existing.property === value.property)) {\n context.error(DiagnosticCodes.DuplicateSpecificationAssignment, `Property '${value.property}' is assigned more than once in this fixture - assign it only once, inline or indented`, value.location, diagnosticText('property', value.property));\n return;\n }\n values.push(value);\n}\n\nexport function parseFixtureBody(context: ParserContext, parent: SourceLine, inline?: RegExpExecArray, allowGenerated = false, example?: string): {\n values: PropertyMappingSyntax[]; for: ExpressionSyntax | null; generatedValues: PropertyMappingSyntax[]; description: string | null;\n stream?: SpecificationStreamSyntax; noStream?: SpecificationNoStreamSyntax;\n} {\n const values: PropertyMappingSyntax[] = [];\n const generatedValues: PropertyMappingSyntax[] = [];\n let eventSource: ExpressionSyntax | null = null;\n let description: string | null = null;\n let stream: SpecificationStreamSyntax | undefined;\n let noStream: SpecificationNoStreamSyntax | undefined;\n addInlineValue(context, parent, inline, values);\n for (let child = context.peekChild(parent.indent); child !== undefined; child = context.peekChild(parent.indent)) {\n context.reader.takeSignificant();\n if (example !== undefined && firstWord(child.content) === 'description') {\n description = parseDescription(context, child, description, `Example '${example}'`);\n continue;\n }\n if (allowGenerated && generatedFixturePrefix.test(child.content)) {\n const fixture = parseConcreteMapping(context, child, generatedFixturePattern, DiagnosticCodes.InvalidGeneratedFixture);\n if (fixture !== null) {\n // Preserve validator-owned PLAY0490 for existing generated step fixtures.\n if (example === undefined) generatedValues.push(fixture);\n else addFixtureValue(context, generatedValues, fixture, values);\n }\n continue;\n }\n const match = mapping.exec(child.content);\n if (example !== undefined && match === null && (firstWord(child.content) === 'stream' || child.content.startsWith('no stream'))) {\n const route = specificationStream.exec(child.content);\n if (stream !== undefined || noStream !== undefined) {\n context.error(DiagnosticCodes.InvalidSpecificationStream, 'An event occurrence declares at most one stream or no stream directive.', locationOf(child));\n context.skipOpaqueBlock(child.indent);\n } else if (child.content === 'no stream') {\n noStream = { kind: 'SpecificationNoStreamSyntax', location: locationOf(child) };\n rejectSpecificationRouteChildren(context, child);\n } else if (route !== null) {\n stream = parseSpecificationStream(context, child, route);\n } else {\n context.error(DiagnosticCodes.InvalidSpecificationStream, \"Expected 'stream Source.Stream', or 'no stream' on an event example.\", locationOf(child));\n context.skipOpaqueBlock(child.indent);\n }\n continue;\n }\n if (match !== null) {\n addFixtureValue(context, values, { kind: 'PropertyMappingSyntax', property: match[1], source: parseMappingSource(match[2], locationOf(child), context), location: locationOf(child) }, generatedValues);\n } else if (firstWord(child.content) === 'for') {\n const source = child.content.substring('for'.length).trim();\n if (source.length === 0) context.error(DiagnosticCodes.InvalidSpecificationEventSource, \"Invalid event-source assertion 'for' - expected 'for <value>'\", locationOf(child));\n else if (eventSource !== null) context.error(DiagnosticCodes.DuplicateSpecificationEventSource, 'A specification step can declare its event-source assertion only once', locationOf(child));\n else eventSource = parseMappingSource(source, locationOf(child), context);\n } else {\n context.error(DiagnosticCodes.InvalidSpecificationValue, `Invalid property mapping '${child.content}' - expected '<property> = <value>'`, locationOf(child), diagnosticText('text', child.content));\n }\n }\n return { values, for: eventSource, generatedValues, description, ...(stream === undefined ? {} : { stream }), ...(noStream === undefined ? {} : { noStream }) };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SpecificationExampleParser.js","names":["parseMappingSource","header","nativePattern","dotNetWhitespace","mapping","match","line","context","DiagnosticCodes","locationOf","diagnosticText","body","reference","caseReferences","property","text","offset","location","source","parseConcrete","values","other","existing","value","generatedValues","eventSource","description","stream","noStream","parent","inline","child","structured","example","firstWord","parseDescription","allowGenerated","generatedFixturePrefix","fixture","parseConcreteMapping","generatedFixturePattern","route","specificationStream","rejectSpecificationRouteChildren","parseSpecificationStream","parseSpecificationValue","tryParseStructuredMapping"],"sources":["../../../../../../Compiler/Parsing/SpecificationExampleParser.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 { diagnosticText } from '../Diagnostics/DiagnosticArgument';\nimport { DiagnosticCodes } from '../Diagnostics/DiagnosticCodes';\nimport { ExpressionSyntax, PropertyMappingSyntax } from '../Syntax/Expressions';\nimport { SpecificationNoStreamSyntax, SpecificationStreamSyntax, SpecificationExampleSyntax } from '../Syntax/Specifications';\nimport { dotNetWhitespace, nativePattern } from '../Text/patterns';\nimport { parseSpecificationStream, rejectSpecificationRouteChildren, specificationStream } from './SpecificationParser';\nimport { parseDescription } from './DescriptionParser';\nimport { caseReferences, parseSpecificationValue as parseMappingSource } from './SpecificationCaseParser';\nimport { firstWord } from './LineText';\nimport { ParserContext } from './ParserContext';\nimport { locationOf, SourceLine } from './SourceLine';\nimport { generatedFixturePattern, generatedFixturePrefix, parseConcrete, parseConcreteMapping } from './SpecificationResponseParser';\nimport { tryParseStructuredMapping } from './StructuredBlockParser';\n\nconst header = nativePattern('^example\\\\s+([A-Z]\\\\w*)\\\\s*:\\\\s*([A-Z]\\\\w*(?:\\\\.\\\\w+)*)$'.replaceAll('\\\\s', dotNetWhitespace));\nconst mapping = nativePattern('^([\\\\w.]+)\\\\s*=(?!=|>)\\\\s*(.+)$'.replaceAll('\\\\s', dotNetWhitespace));\n\nexport function parseExample(context: ParserContext, line: SourceLine): SpecificationExampleSyntax {\n const match = header.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidSpecificationExample, `Invalid example declaration '${line.content}' - expected 'example <Name> : <EventOrCommandOrReadModel>'`, locationOf(line), diagnosticText('text', line.content));\n context.skipOpaqueBlock(line.indent);\n return { kind: 'SpecificationExampleSyntax', name: '', type: '', values: [], generatedValues: [], for: null, description: null, location: locationOf(line) };\n }\n const body = parseFixtureBody(context, line, undefined, true, match[1]);\n for (const reference of caseReferences(body)) context.error(DiagnosticCodes.InvalidSpecificationCaseReference, 'Case references are not permitted in example bodies.', reference.location);\n return { kind: 'SpecificationExampleSyntax', name: match[1], type: match[2], ...body, location: locationOf(line) };\n}\n\nexport function addInlineValue(context: ParserContext, line: SourceLine, match: RegExpExecArray | undefined, values: PropertyMappingSyntax[]): void {\n if (match?.groups?.property === undefined) return;\n const property = match.groups.property;\n const text = match.groups.value;\n const offset = line.content.length - text.length;\n const location = locationOf(line);\n const source = parseConcrete(context, text, { ...location, column: location.column + offset }, DiagnosticCodes.InvalidSpecificationValue);\n if (source !== null) values.push({ kind: 'PropertyMappingSyntax', property, source, location: { ...location, column: location.column + line.content.lastIndexOf(property, line.content.indexOf('=')) } });\n}\n\nexport function addFixtureValue(context: ParserContext, values: PropertyMappingSyntax[], value: PropertyMappingSyntax, other: readonly PropertyMappingSyntax[] = []): void {\n if ([...values, ...other].some(existing => existing.property === value.property)) {\n context.error(DiagnosticCodes.DuplicateSpecificationAssignment, `Property '${value.property}' is assigned more than once in this fixture - assign it only once, inline or indented`, value.location, diagnosticText('property', value.property));\n return;\n }\n values.push(value);\n}\n\nexport function parseFixtureBody(context: ParserContext, parent: SourceLine, inline?: RegExpExecArray, allowGenerated = false, example?: string): {\n values: PropertyMappingSyntax[]; for: ExpressionSyntax | null; generatedValues: PropertyMappingSyntax[]; description: string | null;\n stream?: SpecificationStreamSyntax; noStream?: SpecificationNoStreamSyntax;\n} {\n const values: PropertyMappingSyntax[] = [];\n const generatedValues: PropertyMappingSyntax[] = [];\n let eventSource: ExpressionSyntax | null = null;\n let description: string | null = null;\n let stream: SpecificationStreamSyntax | undefined;\n let noStream: SpecificationNoStreamSyntax | undefined;\n addInlineValue(context, parent, inline, values);\n for (let child = context.peekChild(parent.indent); child !== undefined; child = context.peekChild(parent.indent)) {\n context.reader.takeSignificant();\n let structured: PropertyMappingSyntax | undefined;\n if (example !== undefined && firstWord(child.content) === 'description') {\n description = parseDescription(context, child, description, `Example '${example}'`);\n continue;\n }\n if (allowGenerated && generatedFixturePrefix.test(child.content)) {\n const fixture = parseConcreteMapping(context, child, generatedFixturePattern, DiagnosticCodes.InvalidGeneratedFixture);\n if (fixture !== null) {\n // Preserve validator-owned PLAY0490 for existing generated step fixtures.\n if (example === undefined) generatedValues.push(fixture);\n else addFixtureValue(context, generatedValues, fixture, values);\n }\n continue;\n }\n const match = mapping.exec(child.content);\n if (example !== undefined && match === null && (firstWord(child.content) === 'stream' || child.content.startsWith('no stream'))) {\n const route = specificationStream.exec(child.content);\n if (stream !== undefined || noStream !== undefined) {\n context.error(DiagnosticCodes.InvalidSpecificationStream, 'An event occurrence declares at most one stream or no stream directive.', locationOf(child));\n context.skipOpaqueBlock(child.indent);\n } else if (child.content === 'no stream') {\n noStream = { kind: 'SpecificationNoStreamSyntax', location: locationOf(child) };\n rejectSpecificationRouteChildren(context, child);\n } else if (route !== null) {\n stream = parseSpecificationStream(context, child, route);\n } else {\n context.error(DiagnosticCodes.InvalidSpecificationStream, \"Expected 'stream Source.Stream', or 'no stream' on an event example.\", locationOf(child));\n context.skipOpaqueBlock(child.indent);\n }\n continue;\n }\n if (match !== null) {\n addFixtureValue(context, values, { kind: 'PropertyMappingSyntax', property: match[1], source: parseMappingSource(match[2], locationOf(child), context), location: locationOf(child) }, generatedValues);\n } else if (firstWord(child.content) === 'for') {\n const source = child.content.substring('for'.length).trim();\n if (source.length === 0) context.error(DiagnosticCodes.InvalidSpecificationEventSource, \"Invalid event-source assertion 'for' - expected 'for <value>'\", locationOf(child));\n else if (eventSource !== null) context.error(DiagnosticCodes.DuplicateSpecificationEventSource, 'A specification step can declare its event-source assertion only once', locationOf(child));\n else eventSource = parseMappingSource(source, locationOf(child), context);\n } else if ((structured = tryParseStructuredMapping(context, child)) !== undefined) {\n addFixtureValue(context, values, structured, generatedValues);\n } else {\n context.error(DiagnosticCodes.InvalidSpecificationValue, `Invalid property mapping '${child.content}' - expected '<property> = <value>'`, locationOf(child), diagnosticText('text', child.content));\n }\n }\n return { values, for: eventSource, generatedValues, description, ...(stream === undefined ? {} : { stream }), ...(noStream === undefined ? {} : { noStream }) };\n}\n"],"mappings":"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"}
|