@cratis/screenplay-language 4.259.0 → 5.1.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/Dependencies/SliceReferences.js +1 -1
- package/dist/bundles/compiler/Dependencies/SliceReferences.js.map +1 -1
- package/dist/bundles/compiler/Diagnostics/DiagnosticCodes.js +1 -1
- package/dist/bundles/compiler/Diagnostics/DiagnosticCodes.js.map +1 -1
- package/dist/bundles/compiler/Files/PlayFolderMerge.js +1 -1
- package/dist/bundles/compiler/Files/PlayFolderMerge.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/StateMachineParser.js +2 -0
- package/dist/bundles/compiler/Parsing/StateMachineParser.js.map +1 -0
- 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/Parsing/WorkflowParser.js +2 -0
- package/dist/bundles/compiler/Parsing/WorkflowParser.js.map +1 -0
- package/dist/bundles/compiler/Syntax/ScreenplaySyntaxWalker.js +1 -1
- package/dist/bundles/compiler/Syntax/ScreenplaySyntaxWalker.js.map +1 -1
- package/dist/bundles/compiler/Syntax/Structure.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 +22 -16
- 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/tokens.js +1 -1
- package/dist/bundles/tokens.js.map +1 -1
- package/dist/completion-items.d.ts +3 -0
- 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/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScreenParser.js","names":["operand","stringBodyPattern","header","pattern","data","action","label","guardedAction","navigate","route","outletPattern","contributionPattern","parameter","component","stableId","componentPropertyBinding","componentPropertyLiteral","exposes","presentation","confirmPattern","toolbarItem","toolbarButton","toolbarButtonPart","toolbarSlicePath","slot","title","column","rowClick","field","match","quotedGroup","unescapeString","firstWord","line","context","DiagnosticCodes","locationOf","directives","contributions","description","child","parsed","parseDescription","isFileDirective","directive","parent","collectInputUses","parseTypeRef","grammar","parseSubjectClause","content","result","guarded","parseGuardedAction","text","target","inputs","labelMatch","input","parsePlainActionInput","parameters","routeValue","outletValue","parameterMatch","parseFromClause","routeMatch","outletMatch","name","blueprint","version","startsBlueprintReference","reference","parseBlueprintReference","isValidTemplateVersionRange","slots","columns","click","columnMatch","clickMatch","labelled","fields","dataContext","componentStableId","icon","properties","exposedValues","presentationValues","outlets","bound","literal","parseMappingSource","values","items","buttons","button","item","toolbarButtonExpected","head","id","rest","buttonTitle","slice","emphasis","valid","position","part","key","quoted","localized","value","authorize","buttonConfirm","parseAuthorize","confirmMatch","itemLabel","itemConfirm","syntaxKind","language","code","parseFencedText"],"sources":["../../../../../../Compiler/Parsing/ScreenParser.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 {\n ComponentExposedValueSyntax, ComponentOutletSyntax, ComponentPropertySyntax, PresentationValueSyntax,\n ScreenActionSyntax, ScreenGuardedActionSyntax, ScreenCodeSyntax, ScreenColumnSyntax, ScreenComponentSyntax, ScreenDataSyntax, ScreenDirectiveSyntax, ScreenFieldSyntax,\n ScreenNavigateSyntax, ScreenNavigationParameterSyntax, ScreenSectionSyntax, ScreenSlotSyntax, ScreenSummarySyntax, ScreenSyntax, ScreenTableSyntax,\n ScreenTemplateReferenceSyntax, ScreenTitleSyntax, ScreenToolbarSyntax, ToolbarButtonSyntax, ToolbarEmphasis, ToolbarItemKind, ToolbarItemSyntax,\n} from '../Syntax/Screens';\nimport { AuthorizeSyntax } from '../Syntax/Authorization';\nimport { stringBodyPattern, unescapeString } from '../Text/StringLiteral';\nimport { pattern } from '../Text/patterns';\nimport { parseAuthorize } from './AuthorizeParser';\nimport { parsePlainActionInput, parseSubjectClause } from './ActionSubjectClause';\nimport { InteractionArgumentSyntax } from '../Syntax/Screens';\nimport { parseFencedText } from './CodeBlockParser';\nimport { parseMappingSource } from './ExpressionParser';\nimport { parseDescription } from './DescriptionParser';\nimport { isFileDirective } from './FileReferences';\nimport { parseGuardedAction } from './GuardedActionParser';\nimport { collectInputUses } from './InputUses';\nimport { firstWord } from './LineText';\nimport { ParserContext } from './ParserContext';\nimport { isValidTemplateVersionRange, parseBlueprintReference, startsBlueprintReference } from './TemplateReferenceText';\nimport { parseTypeRef } from './PropertyLineParser';\nimport { parseFromClause } from './UiBindingParser';\nimport { ScreenContributionSyntax } from '../Syntax/CompositionSyntax';\nimport { locationOf, SourceLine } from './SourceLine';\n\n// Parses 'screen' declarations the way the C# ScreenParser does - intent level directives, the template\n// whose slots they fill, and inline code. Interaction bodies remain opaque in the AST, but 'on' alternatives\n// are checked for structure, condition operands and shadowing; 'uses' attachments are recognized.\n\nconst operand = `(?:\"(${stringBodyPattern})\"|(\\\\$strings\\\\.\\\\w+(?:\\\\.\\\\w+)*))`;\nconst header = pattern('^screen\\\\s+([A-Za-z_]\\\\w*)$');\nconst data = pattern('^data\\\\s+([\\\\w.]+(?:\\\\[\\\\])?)\\\\s+via\\\\s+query\\\\s+(\\\\w+(?:\\\\.\\\\w+)*)(?:\\\\s+by\\\\s+(\\\\w+))?$');\nconst action = pattern('^action\\\\s+([A-Za-z_]\\\\w*(?:\\\\.\\\\w+)*)$');\nconst label = pattern(`^label\\\\s+${operand}$`);\nconst guardedAction = pattern(`^action\\\\s+${operand}$`);\nconst navigate = pattern('^navigate\\\\s+to\\\\s+(\\\\w+(?:\\\\.\\\\w+)*)(?:\\\\s+by\\\\s+(\\\\w+))?$');\nconst route = pattern(`^route\\\\s+${operand}$`);\nconst outletPattern = pattern('^outlet\\\\s+([A-Za-z_]\\\\w*)$');\nconst contributionPattern = pattern('^contribute\\\\s+to\\\\s+([A-Za-z_]\\\\w*)(?:\\\\s+order\\\\s+(-?\\\\d+))?$');\nconst parameter = pattern('^parameter\\\\s+([A-Za-z_]\\\\w*)\\\\s+from\\\\s+(.+)$');\nconst component = pattern('^component\\\\s+([A-Za-z_]\\\\w*(?:\\\\.[A-Za-z_]\\\\w*)*)\\\\s+([A-Za-z_]\\\\w*)$');\nconst stableId = pattern(`^id\\\\s+(?:\"(${stringBodyPattern})\"|(\\\\S+))$`);\nconst componentPropertyBinding = pattern('^property\\\\s+([\\\\w.]+)\\\\s+from\\\\s+(.+)$');\nconst componentPropertyLiteral = pattern('^property\\\\s+([\\\\w.]+)\\\\s*=\\\\s+(.+)$');\nconst exposes = pattern('^exposes\\\\s+([A-Za-z_]\\\\w*)\\\\s+from\\\\s+(.+)$');\nconst presentation = pattern(`^presentation\\\\s+([A-Za-z_]\\\\w*)\\\\s+${operand}$`);\nconst confirmPattern = pattern(`^confirm\\\\s+${operand}$`);\nconst toolbarItem = pattern('^item\\\\s+([A-Za-z_]\\\\w*)\\\\s+(action|navigate|dialog)(?:\\\\s+to)?\\\\s+([A-Za-z_]\\\\w*(?:\\\\.\\\\w+)*)$');\nconst toolbarButton = pattern(`^button\\\\s+(?:\"(${stringBodyPattern})\"|([A-Za-z_][\\\\w-]*))(?:\\\\s+(.*))?$`);\nconst toolbarButtonPart = new RegExp(pattern(`\\\\s*(title|slice|emphasis|icon)\\\\s+(?:\"(${stringBodyPattern})\"|(\\\\$strings\\\\.\\\\w+(?:\\\\.\\\\w+)*)|([A-Za-z_][\\\\w.-]*))(?=\\\\s|$)`).source, 'uy');\nconst toolbarSlicePath = pattern('^[A-Za-z_]\\\\w*(?:\\\\.[A-Za-z_]\\\\w*)*$');\nconst slot = pattern('^[a-z_]\\\\w*$');\nconst title = pattern(`^title\\\\s+${operand}$`);\nconst column = pattern(`^column\\\\s+([\\\\w.]+)(?:\\\\s+label\\\\s+${operand})?$`);\nconst rowClick = pattern('^on\\\\s+row-click\\\\s+(navigate\\\\s+to\\\\s+.+)$');\nconst field = pattern(`^field\\\\s+([\\\\w.]+)\\\\s+label\\\\s+${operand}$`);\n\nconst operandText = (match: RegExpExecArray, quotedGroup: number): string =>\n match[quotedGroup] !== undefined ? unescapeString(match[quotedGroup]) : match[quotedGroup + 1];\n\nconst isInteraction = (line: SourceLine): boolean => ['on', 'uses'].includes(firstWord(line.content));\n\nconst isCodeLine = (context: ParserContext, line: SourceLine): boolean => line.content.startsWith('```') || context.languages.has(line.content);\n\nexport function parseScreen(context: ParserContext, line: SourceLine): ScreenSyntax {\n const match = header.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidScreenDeclaration, `Invalid screen declaration '${line.content}' - expected 'screen <Name>'`, locationOf(line));\n }\n const directives: ScreenDirectiveSyntax[] = [];\n const contributions: ScreenContributionSyntax[] = [];\n let description: string | null = null;\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n if (firstWord(child.content) === 'contribute') {\n const parsed = parseScreenContribution(context, child);\n if (parsed !== undefined) contributions.push(parsed);\n } else if (firstWord(child.content) === 'description') {\n description = parseDescription(context, child, description, `Screen '${match?.[1] ?? ''}'`);\n } else if (!isFileDirective(child)) {\n pushDirective(context, child, directives);\n }\n }\n return { kind: 'ScreenSyntax', name: match?.[1] ?? '', directives, description, ...(contributions.length > 0 ? { contributions } : {}), location: locationOf(line) };\n}\n\nfunction parseScreenContribution(context: ParserContext, line: SourceLine): ScreenContributionSyntax | undefined {\n const match = contributionPattern.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.UnknownScreenDirective, `Invalid screen contribution '${line.content}' - expected 'contribute to <Point> [order <n>]'`, locationOf(line));\n context.skipBlock(line.indent);\n return undefined;\n }\n return { kind: 'ScreenContributionSyntax', contributionPoint: match[1], order: match[2] === undefined ? null : Number(match[2]), directives: parseDirectives(context, line), location: locationOf(line) };\n}\n\nfunction pushDirective(context: ParserContext, line: SourceLine, directives: ScreenDirectiveSyntax[]): void {\n const directive = parseDirective(context, line);\n if (directive !== undefined) {\n directives.push(directive);\n }\n}\n\nfunction parseDirectives(context: ParserContext, parent: SourceLine): ScreenDirectiveSyntax[] {\n const directives: ScreenDirectiveSyntax[] = [];\n for (let child = context.peekChild(parent.indent); child !== undefined; child = context.peekChild(parent.indent)) {\n context.reader.takeSignificant();\n pushDirective(context, child, directives);\n }\n return directives;\n}\n\nfunction parseDirective(context: ParserContext, line: SourceLine): ScreenDirectiveSyntax | undefined {\n validateNonActionSubjectClause(context, line);\n switch (firstWord(line.content)) {\n case 'data':\n return parseData(context, line);\n case 'action':\n return parseAction(context, line);\n case 'template':\n return parseTemplateReference(context, line);\n case 'section':\n return parseSection(context, line);\n case 'title':\n return parseTitle(context, line);\n case 'table':\n return parseTable(context, line);\n case 'summary':\n return parseSummary(context, line);\n case 'component':\n return parseComponent(context, line);\n case 'toolbar':\n return parseToolbar(context, line);\n case 'navigate':\n return parseNavigate(context, line.content, line);\n case 'on':\n collectInputUses(context, line);\n return { kind: 'ScreenBehaviorSyntax', location: locationOf(line) };\n case 'uses':\n collectInputUses(context, line);\n return { kind: 'ScreenUsesBehaviorSyntax', location: locationOf(line) };\n default:\n if (isCodeLine(context, line)) {\n return parseCode(context, line);\n }\n context.error(DiagnosticCodes.UnknownScreenDirective, `Unexpected '${line.content}' in screen body`, locationOf(line));\n context.skipBlock(line.indent);\n return undefined;\n }\n}\n\nfunction parseData(context: ParserContext, line: SourceLine): ScreenDataSyntax | undefined {\n const match = data.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidDataDirective, `Invalid data directive '${line.content}' - expected 'data <ReadModel> via query <Query> [by <param>]'`, locationOf(line));\n return undefined;\n }\n return { kind: 'ScreenDataSyntax', type: parseTypeRef(match[1], locationOf(line)), query: match[2], by: match[3] ?? null, location: locationOf(line) };\n}\n\nfunction validateNonActionSubjectClause(context: ParserContext, line: SourceLine): void {\n const grammar = new Map([['data', data], ['navigate', navigate], ['component', component], ['title', title]]).get(firstWord(line.content));\n // Expressions, code and open-ended template references belong to their own parsers.\n if (grammar !== undefined) parseSubjectClause(context, line, false, content => grammar.test(content));\n}\n\nfunction parseAction(context: ParserContext, line: SourceLine): ScreenActionSyntax | ScreenGuardedActionSyntax | undefined {\n const parsed = parseSubjectClause(context, line, true, content => action.test(content) || guardedAction.test(content));\n const result = parseActionHeader(context, line, parsed);\n if (result === undefined || parsed.subject === undefined) return result;\n return { ...result, subject: parsed.subject };\n}\n\nfunction parseActionHeader(context: ParserContext, line: SourceLine, parsed: ReturnType<typeof parseSubjectClause>): ScreenActionSyntax | ScreenGuardedActionSyntax | undefined {\n const guarded = guardedAction.exec(parsed.header);\n if (guarded !== null) return parseGuardedAction(context, line, operandText(guarded, 1), parseNavigate);\n const match = action.exec(parsed.header);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidActionDirective, `Invalid action directive '${line.content}' - expected 'action <Command>'`, locationOf(line));\n context.skipBlock(line.indent);\n return undefined;\n }\n let text: string | null = parsed.label ?? null;\n let target: ScreenNavigateSyntax | null = null;\n const inputs: InteractionArgumentSyntax[] = [];\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n const labelMatch = label.exec(child.content);\n if (labelMatch !== null) {\n text = operandText(labelMatch, 1);\n } else if (firstWord(child.content) === 'navigate') {\n target = parseNavigate(context, child.content, child) ?? null;\n } else if (firstWord(child.content) === 'with') {\n addPlainActionInput(context, child, inputs);\n } else {\n context.error(DiagnosticCodes.UnknownActionDirective, `Unexpected '${child.content}' in action - expected 'label \"...\"' or 'navigate to ...'`, locationOf(child));\n }\n }\n return { kind: 'ScreenActionSyntax', command: match[1], label: text, navigate: target, ...(inputs.length === 0 ? {} : { inputs }), location: locationOf(line) };\n}\n\nfunction addPlainActionInput(context: ParserContext, line: SourceLine, inputs: InteractionArgumentSyntax[]): void {\n const input = parsePlainActionInput(context, line, inputs);\n if (input !== undefined) inputs.push(input);\n}\n\nfunction parseNavigate(context: ParserContext, text: string, line: SourceLine): ScreenNavigateSyntax | undefined {\n const match = navigate.exec(text);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidNavigation, `Invalid navigation '${text}' - expected 'navigate to <Screen> [by <param>]'`, locationOf(line));\n return undefined;\n }\n const parameters: ScreenNavigationParameterSyntax[] = [];\n let routeValue: string | null = null;\n let outletValue: string | null = null;\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n const parameterMatch = parameter.exec(child.content);\n if (parameterMatch !== null) {\n parameters.push({ kind: 'ScreenNavigationParameterSyntax', name: parameterMatch[1], binding: parseFromClause(context, parameterMatch[2], locationOf(child)), location: locationOf(child) });\n continue;\n }\n const routeMatch = route.exec(child.content);\n if (routeMatch !== null) {\n routeValue = operandText(routeMatch, 1);\n continue;\n }\n const outletMatch = outletPattern.exec(child.content);\n if (outletMatch !== null) {\n outletValue = outletMatch[1];\n continue;\n }\n context.error(DiagnosticCodes.InvalidNavigation, `Unexpected '${child.content}' in navigation - expected 'route \"...\"', 'outlet <name>' or 'parameter <name> from <binding>'`, locationOf(child));\n }\n return { kind: 'ScreenNavigateSyntax', screen: match[1], by: match[2] ?? null, route: routeValue, ...(outletValue === null ? {} : { outlet: outletValue }), parameters, location: locationOf(line) };\n}\n\nfunction parseTemplateReference(context: ParserContext, line: SourceLine): ScreenTemplateReferenceSyntax {\n let name = line.content.substring('template'.length).trim();\n let blueprint: string | null = null;\n let version: string | null = null;\n if (startsBlueprintReference(name)) {\n const reference = parseBlueprintReference(name);\n if (reference === undefined) {\n context.error(DiagnosticCodes.UnknownLayoutDirective, `Invalid template reference '${line.content}' - expected 'template <Name>' or 'template blueprint <Blueprint> <Name> [version \"<range>\"]'`, locationOf(line));\n } else {\n ({ blueprint, name, version } = reference);\n if (version !== null && !isValidTemplateVersionRange(version)) {\n context.error(DiagnosticCodes.InvalidTemplateVersionRange, `The template version range '${version}' is not one Scene understands - use '*', an exact version or a ^, ~, >=, >, <= or < range such as \"^1.2\"`, locationOf(line));\n }\n }\n }\n const slots: ScreenSlotSyntax[] = [];\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n if (!slot.test(child.content)) {\n context.error(DiagnosticCodes.InvalidScreenLayoutSlot, `Expected a slot name in template '${name}', got '${child.content}'`, locationOf(child));\n context.skipBlock(child.indent);\n continue;\n }\n slots.push({ kind: 'ScreenSlotSyntax', name: child.content, directives: parseDirectives(context, child), location: locationOf(child) });\n }\n return { kind: 'ScreenTemplateReferenceSyntax', name, slots, ...(blueprint === null ? {} : { blueprint }), ...(version === null ? {} : { version }), location: locationOf(line) };\n}\n\nfunction parseSection(context: ParserContext, line: SourceLine): ScreenSectionSyntax {\n const name = line.content.substring('section'.length).trim();\n return { kind: 'ScreenSectionSyntax', name, directives: parseDirectives(context, line), location: locationOf(line) };\n}\n\nfunction parseTitle(context: ParserContext, line: SourceLine): ScreenTitleSyntax {\n const match = title.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidTitleDirective, `Invalid title directive '${line.content}' - expected 'title \"...\"'`, locationOf(line));\n return { kind: 'ScreenTitleSyntax', text: '', location: locationOf(line) };\n }\n return { kind: 'ScreenTitleSyntax', text: operandText(match, 1), location: locationOf(line) };\n}\n\nfunction parseTable(context: ParserContext, line: SourceLine): ScreenTableSyntax {\n const target = line.content.substring('table'.length).trim();\n const columns: ScreenColumnSyntax[] = [];\n let click: ScreenNavigateSyntax | null = null;\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n const columnMatch = column.exec(child.content);\n const clickMatch = rowClick.exec(child.content);\n if (columnMatch !== null) {\n const labelled = columnMatch[2] !== undefined || columnMatch[3] !== undefined;\n columns.push({ kind: 'ScreenColumnSyntax', property: columnMatch[1], label: labelled ? operandText(columnMatch, 2) : null, location: locationOf(child) });\n } else if (clickMatch !== null) {\n click = parseNavigate(context, clickMatch[1], child) ?? null;\n } else if (firstWord(child.content) === 'on') {\n collectInputUses(context, child);\n } else if (isInteraction(child)) {\n collectInputUses(context, child);\n } else {\n context.error(DiagnosticCodes.UnknownTableDirective, `Unexpected '${child.content}' in table - expected 'column ...', 'on row-click navigate to ...', 'on <trigger>' or 'uses <Behavior>'`, locationOf(child));\n }\n }\n return { kind: 'ScreenTableSyntax', target, columns, rowClick: click, location: locationOf(line) };\n}\n\nfunction parseSummary(context: ParserContext, line: SourceLine): ScreenSummarySyntax {\n const target = line.content.substring('summary'.length).trim();\n const fields: ScreenFieldSyntax[] = [];\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n const match = field.exec(child.content);\n if (match === null) {\n context.error(DiagnosticCodes.UnknownSummaryDirective, `Unexpected '${child.content}' in summary - expected 'field <property> label \"...\"'`, locationOf(child));\n continue;\n }\n fields.push({ kind: 'ScreenFieldSyntax', property: match[1], label: operandText(match, 2), location: locationOf(child) });\n }\n return { kind: 'ScreenSummarySyntax', target, fields, location: locationOf(line) };\n}\n\n\nfunction parseComponent(context: ParserContext, line: SourceLine): ScreenComponentSyntax | undefined {\n const match = component.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.UnknownScreenDirective, `Invalid component directive '${line.content}' - expected 'component <Package.Component> <name>'`, locationOf(line));\n context.skipBlock(line.indent);\n return undefined;\n }\n\n let dataContext = null;\n let componentStableId = null;\n let icon = null;\n const properties: ComponentPropertySyntax[] = [];\n const exposedValues: ComponentExposedValueSyntax[] = [];\n const presentationValues: PresentationValueSyntax[] = [];\n const outlets: ComponentOutletSyntax[] = [];\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n switch (firstWord(child.content)) {\n case 'context':\n dataContext = parseUiContext(context, child);\n break;\n case 'id':\n componentStableId = parseStableId(context, child);\n break;\n case 'property':\n parseComponentProperty(context, child, properties);\n break;\n case 'icon':\n icon = child.content.substring('icon'.length).trim();\n break;\n case 'presentation':\n parsePresentationValue(context, child, presentationValues);\n break;\n case 'exposes':\n parseExposedValue(context, child, exposedValues);\n break;\n case 'outlet':\n outlets.push({ kind: 'ComponentOutletSyntax', name: child.content.substring('outlet'.length).trim(), directives: parseDirectives(context, child), location: locationOf(child) });\n break;\n case 'on':\n collectInputUses(context, child);\n break;\n case 'uses':\n collectInputUses(context, child);\n break;\n default:\n context.error(DiagnosticCodes.UnknownScreenDirective, `Unexpected '${child.content}' in component - expected context, id, property, icon, presentation, exposes, outlet, on or uses`, locationOf(child));\n context.skipBlock(child.indent);\n break;\n }\n }\n\n return { kind: 'ScreenComponentSyntax', component: match[1], name: match[2], stableId: componentStableId, context: dataContext, properties, exposes: exposedValues, presentation: presentationValues, icon, outlets, location: locationOf(line) };\n}\n\nfunction parseUiContext(context: ParserContext, line: SourceLine) {\n return parseUiBindingValue(context, line.content.substring('context'.length).trim(), line);\n}\n\nfunction parseComponentProperty(context: ParserContext, line: SourceLine, properties: ComponentPropertySyntax[]): void {\n const bound = componentPropertyBinding.exec(line.content);\n if (bound !== null) {\n properties.push({ kind: 'ComponentPropertySyntax', property: bound[1], binding: parseFromClause(context, bound[2], locationOf(line)), value: null, location: locationOf(line) });\n return;\n }\n const literal = componentPropertyLiteral.exec(line.content);\n if (literal !== null) {\n properties.push({ kind: 'ComponentPropertySyntax', property: literal[1], binding: null, value: parseMappingSource(literal[2], locationOf(line), context), location: locationOf(line) });\n return;\n }\n context.error(DiagnosticCodes.UnknownScreenDirective, `Invalid component property '${line.content}' - expected 'property <path> from <binding>' or 'property <path> = <literal|object|array|null>'`, locationOf(line));\n}\n\nfunction parseStableId(context: ParserContext, line: SourceLine): string | null {\n const match = stableId.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.UnknownScreenDirective, `Invalid component id '${line.content}' - expected 'id \"stable-id\"'`, locationOf(line));\n return null;\n }\n return operandText(match, 1);\n}\n\nfunction parseExposedValue(context: ParserContext, line: SourceLine, values: ComponentExposedValueSyntax[]): void {\n const match = exposes.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.UnknownScreenDirective, `Invalid exposed value '${line.content}' - expected 'exposes <name> from <binding>'`, locationOf(line));\n return;\n }\n values.push({ kind: 'ComponentExposedValueSyntax', name: match[1], binding: parseFromClause(context, match[2], locationOf(line)), location: locationOf(line) });\n}\n\nfunction parsePresentationValue(context: ParserContext, line: SourceLine, values: PresentationValueSyntax[]): void {\n const match = presentation.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.UnknownScreenDirective, `Invalid presentation value '${line.content}' - expected 'presentation <key> \"value\"'`, locationOf(line));\n return;\n }\n values.push({ kind: 'PresentationValueSyntax', name: match[1], value: operandText(match, 2), location: locationOf(line) });\n}\n\nexport function parseToolbar(context: ParserContext, line: SourceLine): ScreenToolbarSyntax {\n const name = line.content.substring('toolbar'.length).trim();\n const items: ToolbarItemSyntax[] = [];\n const buttons: ToolbarButtonSyntax[] = [];\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n if (firstWord(child.content) === 'button') {\n const button = parseToolbarButton(context, child);\n if (button !== undefined) buttons.push(button);\n continue;\n }\n const item = parseToolbarItem(context, child);\n if (item !== undefined) items.push(item);\n }\n return { kind: 'ScreenToolbarSyntax', name, items, ...(buttons.length > 0 ? { buttons } : {}), location: locationOf(line) };\n}\n\nconst toolbarButtonExpected = 'button <id> title \"<text>\" [slice <Module>.<Feature>.<Slice>] [emphasis primary|secondary|quiet] [icon <name>]';\n\n// A button is one line; the C# compiler checks what it names (PLAY0761-PLAY0765), this one reads its grammar.\nfunction parseToolbarButton(context: ParserContext, line: SourceLine): ToolbarButtonSyntax | undefined {\n const head = toolbarButton.exec(line.content);\n if (head === null) {\n context.error(DiagnosticCodes.InvalidToolbarButton, `Invalid toolbar button '${line.content}' - expected ${toolbarButtonExpected}`, locationOf(line));\n context.skipBlock(line.indent);\n return undefined;\n }\n const id = head[1] !== undefined ? unescapeString(head[1]) : head[2];\n const rest = head[3] ?? '';\n let buttonTitle: string | undefined;\n let slice: string | undefined;\n let icon: string | undefined;\n let emphasis: ToolbarEmphasis | undefined;\n let valid = true;\n let position = 0;\n while (position < rest.length) {\n toolbarButtonPart.lastIndex = position;\n const part = toolbarButtonPart.exec(rest);\n if (part === null) {\n context.error(DiagnosticCodes.InvalidToolbarButton, `Invalid toolbar button '${line.content}' - unexpected '${rest.substring(position).trim()}'; expected ${toolbarButtonExpected}`, locationOf(line));\n valid = false;\n break;\n }\n position = part.index + part[0].length;\n const key = part[1];\n const quoted = part[2] !== undefined;\n const localized = part[3] !== undefined;\n const value = quoted ? unescapeString(part[2]) : localized ? part[3] : part[4];\n const repeated = key === 'title' ? buttonTitle !== undefined : key === 'slice' ? slice !== undefined : key === 'icon' ? icon !== undefined : emphasis !== undefined;\n if (repeated) {\n context.error(DiagnosticCodes.InvalidToolbarButton, `Toolbar button '${id}' states '${key}' more than once`, locationOf(line));\n continue;\n }\n if (key === 'title') {\n if (quoted || localized) buttonTitle = value;\n else {\n context.error(DiagnosticCodes.InvalidToolbarButton, `Invalid title '${value}' on toolbar button '${id}' - expected a quoted string or a $strings.<key> token`, locationOf(line));\n valid = false;\n }\n } else if (key === 'slice') {\n if (!quoted && !localized && toolbarSlicePath.test(value)) slice = value;\n else {\n context.error(DiagnosticCodes.InvalidToolbarButton, `Invalid slice '${value}' on toolbar button '${id}' - expected <Module>.<Feature>.<Slice>`, locationOf(line));\n valid = false;\n }\n } else if (key === 'emphasis') {\n if (!quoted && !localized && ['primary', 'secondary', 'quiet'].includes(value)) emphasis = value === 'primary' ? 'Primary' : value === 'secondary' ? 'Secondary' : 'Quiet';\n else {\n context.error(DiagnosticCodes.InvalidToolbarButton, `Invalid emphasis '${value}' on toolbar button '${id}' - expected primary, secondary or quiet`, locationOf(line));\n valid = false;\n }\n } else {\n icon = value;\n }\n }\n if (buttonTitle === undefined && valid) {\n context.error(DiagnosticCodes.InvalidToolbarButton, `Toolbar button '${id}' has no title - expected 'button ${id} title \"<text>\"'`, locationOf(line));\n }\n let authorize: AuthorizeSyntax | null = null;\n let buttonConfirm: string | undefined;\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n if (firstWord(child.content) === 'authorize' && authorize === null) {\n authorize = parseAuthorize(context, child);\n continue;\n }\n const confirmMatch = buttonConfirm === undefined ? confirmPattern.exec(child.content) : null;\n if (confirmMatch !== null) {\n buttonConfirm = operandText(confirmMatch, 1);\n continue;\n }\n context.error(DiagnosticCodes.InvalidToolbarButton, `Unexpected '${child.content}' under toolbar button '${id}' - a button takes one 'authorize' line, one 'confirm' line and nothing else`, locationOf(child));\n context.skipBlock(child.indent);\n }\n return {\n kind: 'ToolbarButtonSyntax', id, title: buttonTitle ?? '',\n ...(slice !== undefined ? { slice } : {}), ...(emphasis !== undefined ? { emphasis } : {}), ...(icon !== undefined ? { icon } : {}), ...(authorize !== null ? { authorize } : {}), ...(buttonConfirm !== undefined ? { confirm: buttonConfirm } : {}),\n location: locationOf(line),\n };\n}\n\nfunction parseToolbarItem(context: ParserContext, line: SourceLine): ToolbarItemSyntax | undefined {\n const parsed = parseSubjectClause(context, line, /^item\\s+\\S+\\s+action\\s/u.test(line.content), content => toolbarItem.test(content));\n const match = toolbarItem.exec(parsed.header);\n if (match === null) {\n context.error(DiagnosticCodes.UnknownScreenDirective, `Invalid toolbar item '${line.content}' - expected 'item <name> action <Command>', 'item <name> navigate to <Screen>', 'item <name> dialog <DialogTemplate>' or 'button <id> title \"<text>\" slice <Slice>'`, locationOf(line));\n context.skipBlock(line.indent);\n return undefined;\n }\n let itemLabel: string | null = parsed.label ?? null;\n let icon = null;\n let itemConfirm: string | undefined;\n const parameters: ScreenNavigationParameterSyntax[] = [];\n const presentationValues: PresentationValueSyntax[] = [];\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n const labelMatch = label.exec(child.content);\n if (labelMatch !== null) {\n itemLabel = operandText(labelMatch, 1);\n continue;\n }\n const confirmMatch = confirmPattern.exec(child.content);\n if (confirmMatch !== null) {\n itemConfirm = operandText(confirmMatch, 1);\n continue;\n }\n const parameterMatch = parameter.exec(child.content);\n if (parameterMatch !== null) {\n parameters.push({ kind: 'ScreenNavigationParameterSyntax', name: parameterMatch[1], binding: parseFromClause(context, parameterMatch[2], locationOf(child)), location: locationOf(child) });\n continue;\n }\n if (firstWord(child.content) === 'icon') {\n icon = child.content.substring('icon'.length).trim();\n continue;\n }\n parsePresentationValue(context, child, presentationValues);\n }\n const syntaxKind: ToolbarItemKind = match[2] === 'navigate' ? 'Navigate' : match[2] === 'dialog' ? 'Dialog' : 'Action';\n return { kind: 'ToolbarItemSyntax', name: match[1], syntaxKind, target: match[3], label: itemLabel, icon, ...(parsed.subject === undefined ? {} : { subject: parsed.subject }), ...(itemConfirm !== undefined ? { confirm: itemConfirm } : {}), parameters, presentation: presentationValues, location: locationOf(line) };\n}\n\nfunction parseUiBindingValue(context: ParserContext, text: string, line: SourceLine) {\n return parseFromClause(context, text, locationOf(line));\n}\n\nfunction parseCode(context: ParserContext, line: SourceLine): ScreenCodeSyntax | undefined {\n const language = line.content.startsWith('```') ? line.content.substring(3) : line.content;\n if (!context.languages.has(language)) {\n context.error(DiagnosticCodes.ExpectedCodeFence, `Expected a registered language on the opening fence, not '${line.content}'`, locationOf(line));\n return undefined;\n }\n if (!line.content.startsWith('```')) {\n context.warning(DiagnosticCodes.LegacyInlineCodeFence, `'${language}' on its own line is deprecated - use '\\`\\`\\`${language}' instead`, locationOf(line));\n }\n const code = parseFencedText(context, language, line);\n return code === null ? undefined : {\n kind: 'ScreenCodeSyntax',\n code: { kind: 'CodeBlockSyntax', language, code, location: locationOf(line) },\n location: locationOf(line),\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ScreenParser.js","names":["operand","stringBodyPattern","header","pattern","data","action","label","guardedAction","navigate","route","outletPattern","contributionPattern","parameter","component","stableId","componentPropertyBinding","componentPropertyLiteral","componentPropertyBlock","exposes","presentation","confirmPattern","toolbarItem","toolbarButton","toolbarButtonPart","toolbarSlicePath","slot","title","column","rowClick","field","match","quotedGroup","unescapeString","firstWord","line","context","DiagnosticCodes","locationOf","directives","contributions","description","child","parsed","parseDescription","isFileDirective","directive","parent","collectInputUses","parseTypeRef","grammar","parseSubjectClause","content","result","guarded","parseGuardedAction","text","target","inputs","labelMatch","input","parsePlainActionInput","parameters","routeValue","outletValue","parameterMatch","parseFromClauseOn","routeMatch","outletMatch","name","blueprint","version","startsBlueprintReference","reference","parseBlueprintReference","isValidTemplateVersionRange","slots","columns","click","columnMatch","clickMatch","labelled","fields","dataContext","componentStableId","icon","properties","exposedValues","presentationValues","outlets","bound","literal","parseMappingSource","structured","parseStructuredValue","values","items","buttons","button","item","toolbarButtonExpected","head","id","rest","buttonTitle","slice","emphasis","valid","position","part","key","quoted","localized","value","authorize","buttonConfirm","parseAuthorize","confirmMatch","itemLabel","itemConfirm","syntaxKind","parseFromClause","language","code","parseFencedText"],"sources":["../../../../../../Compiler/Parsing/ScreenParser.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 {\n ComponentExposedValueSyntax, ComponentOutletSyntax, ComponentPropertySyntax, PresentationValueSyntax,\n ScreenActionSyntax, ScreenGuardedActionSyntax, ScreenCodeSyntax, ScreenColumnSyntax, ScreenComponentSyntax, ScreenDataSyntax, ScreenDirectiveSyntax, ScreenFieldSyntax,\n ScreenNavigateSyntax, ScreenNavigationParameterSyntax, ScreenSectionSyntax, ScreenSlotSyntax, ScreenSummarySyntax, ScreenSyntax, ScreenTableSyntax,\n ScreenTemplateReferenceSyntax, ScreenTitleSyntax, ScreenToolbarSyntax, ToolbarButtonSyntax, ToolbarEmphasis, ToolbarItemKind, ToolbarItemSyntax,\n} from '../Syntax/Screens';\nimport { AuthorizeSyntax } from '../Syntax/Authorization';\nimport { stringBodyPattern, unescapeString } from '../Text/StringLiteral';\nimport { pattern } from '../Text/patterns';\nimport { parseAuthorize } from './AuthorizeParser';\nimport { parsePlainActionInput, parseSubjectClause } from './ActionSubjectClause';\nimport { InteractionArgumentSyntax } from '../Syntax/Screens';\nimport { parseFencedText } from './CodeBlockParser';\nimport { parseMappingSource } from './ExpressionParser';\nimport { parseDescription } from './DescriptionParser';\nimport { isFileDirective } from './FileReferences';\nimport { parseGuardedAction } from './GuardedActionParser';\nimport { collectInputUses } from './InputUses';\nimport { firstWord } from './LineText';\nimport { ParserContext } from './ParserContext';\nimport { isValidTemplateVersionRange, parseBlueprintReference, startsBlueprintReference } from './TemplateReferenceText';\nimport { parseTypeRef } from './PropertyLineParser';\nimport { parseFromClause, parseFromClauseOn } from './UiBindingParser';\nimport { ScreenContributionSyntax } from '../Syntax/CompositionSyntax';\nimport { locationOf, SourceLine } from './SourceLine';\nimport { parseStructuredValue, StructuredMarker } from './StructuredBlockParser';\n\n// Parses 'screen' declarations the way the C# ScreenParser does - intent level directives, the template\n// whose slots they fill, and inline code. Interaction bodies remain opaque in the AST, but 'on' alternatives\n// are checked for structure, condition operands and shadowing; 'uses' attachments are recognized.\n\nconst operand = `(?:\"(${stringBodyPattern})\"|(\\\\$strings\\\\.\\\\w+(?:\\\\.\\\\w+)*))`;\nconst header = pattern('^screen\\\\s+([A-Za-z_]\\\\w*)$');\nconst data = pattern('^data\\\\s+([\\\\w.]+(?:\\\\[\\\\])?)\\\\s+via\\\\s+query\\\\s+(\\\\w+(?:\\\\.\\\\w+)*)(?:\\\\s+by\\\\s+(\\\\w+))?$');\nconst action = pattern('^action\\\\s+([A-Za-z_]\\\\w*(?:\\\\.\\\\w+)*)$');\nconst label = pattern(`^label\\\\s+${operand}$`);\nconst guardedAction = pattern(`^action\\\\s+${operand}$`);\nconst navigate = pattern('^navigate\\\\s+to\\\\s+(\\\\w+(?:\\\\.\\\\w+)*)(?:\\\\s+by\\\\s+(\\\\w+))?$');\nconst route = pattern(`^route\\\\s+${operand}$`);\nconst outletPattern = pattern('^outlet\\\\s+([A-Za-z_]\\\\w*)$');\nconst contributionPattern = pattern('^contribute\\\\s+to\\\\s+([A-Za-z_]\\\\w*)(?:\\\\s+order\\\\s+(-?\\\\d+))?$');\nconst parameter = pattern('^parameter\\\\s+([A-Za-z_]\\\\w*)\\\\s+from\\\\s+(.+)$');\nconst component = pattern('^component\\\\s+([A-Za-z_]\\\\w*(?:\\\\.[A-Za-z_]\\\\w*)*)\\\\s+([A-Za-z_]\\\\w*)$');\nconst stableId = pattern(`^id\\\\s+(?:\"(${stringBodyPattern})\"|(\\\\S+))$`);\nconst componentPropertyBinding = pattern('^property\\\\s+([\\\\w.]+)\\\\s+from\\\\s+(.+)$');\nconst componentPropertyLiteral = pattern('^property\\\\s+([\\\\w.]+)\\\\s*=\\\\s+(.+)$');\nconst componentPropertyBlock = pattern('^property\\\\s+([\\\\w.]+)(?:\\\\s+(none|empty))?$');\nconst exposes = pattern('^exposes\\\\s+([A-Za-z_]\\\\w*)\\\\s+from\\\\s+(.+)$');\nconst presentation = pattern(`^presentation\\\\s+([A-Za-z_]\\\\w*)\\\\s+${operand}$`);\nconst confirmPattern = pattern(`^confirm\\\\s+${operand}$`);\nconst toolbarItem = pattern('^item\\\\s+([A-Za-z_]\\\\w*)\\\\s+(action|navigate|dialog)(?:\\\\s+to)?\\\\s+([A-Za-z_]\\\\w*(?:\\\\.\\\\w+)*)$');\nconst toolbarButton = pattern(`^button\\\\s+(?:\"(${stringBodyPattern})\"|([A-Za-z_][\\\\w-]*))(?:\\\\s+(.*))?$`);\nconst toolbarButtonPart = new RegExp(pattern(`\\\\s*(title|slice|emphasis|icon)\\\\s+(?:\"(${stringBodyPattern})\"|(\\\\$strings\\\\.\\\\w+(?:\\\\.\\\\w+)*)|([A-Za-z_][\\\\w.-]*))(?=\\\\s|$)`).source, 'uy');\nconst toolbarSlicePath = pattern('^[A-Za-z_]\\\\w*(?:\\\\.[A-Za-z_]\\\\w*)*$');\nconst slot = pattern('^[a-z_]\\\\w*$');\nconst title = pattern(`^title\\\\s+${operand}$`);\nconst column = pattern(`^column\\\\s+([\\\\w.]+)(?:\\\\s+label\\\\s+${operand})?$`);\nconst rowClick = pattern('^on\\\\s+row-click\\\\s+(navigate\\\\s+to\\\\s+.+)$');\nconst field = pattern(`^field\\\\s+([\\\\w.]+)\\\\s+label\\\\s+${operand}$`);\n\nconst operandText = (match: RegExpExecArray, quotedGroup: number): string =>\n match[quotedGroup] !== undefined ? unescapeString(match[quotedGroup]) : match[quotedGroup + 1];\n\nconst isInteraction = (line: SourceLine): boolean => ['on', 'uses'].includes(firstWord(line.content));\n\nconst isCodeLine = (context: ParserContext, line: SourceLine): boolean => line.content.startsWith('```') || context.languages.has(line.content);\n\nexport function parseScreen(context: ParserContext, line: SourceLine): ScreenSyntax {\n const match = header.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidScreenDeclaration, `Invalid screen declaration '${line.content}' - expected 'screen <Name>'`, locationOf(line));\n }\n const directives: ScreenDirectiveSyntax[] = [];\n const contributions: ScreenContributionSyntax[] = [];\n let description: string | null = null;\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n if (firstWord(child.content) === 'contribute') {\n const parsed = parseScreenContribution(context, child);\n if (parsed !== undefined) contributions.push(parsed);\n } else if (firstWord(child.content) === 'description') {\n description = parseDescription(context, child, description, `Screen '${match?.[1] ?? ''}'`);\n } else if (!isFileDirective(child)) {\n pushDirective(context, child, directives);\n }\n }\n return { kind: 'ScreenSyntax', name: match?.[1] ?? '', directives, description, ...(contributions.length > 0 ? { contributions } : {}), location: locationOf(line) };\n}\n\nfunction parseScreenContribution(context: ParserContext, line: SourceLine): ScreenContributionSyntax | undefined {\n const match = contributionPattern.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.UnknownScreenDirective, `Invalid screen contribution '${line.content}' - expected 'contribute to <Point> [order <n>]'`, locationOf(line));\n context.skipBlock(line.indent);\n return undefined;\n }\n return { kind: 'ScreenContributionSyntax', contributionPoint: match[1], order: match[2] === undefined ? null : Number(match[2]), directives: parseDirectives(context, line), location: locationOf(line) };\n}\n\nfunction pushDirective(context: ParserContext, line: SourceLine, directives: ScreenDirectiveSyntax[]): void {\n const directive = parseDirective(context, line);\n if (directive !== undefined) {\n directives.push(directive);\n }\n}\n\nfunction parseDirectives(context: ParserContext, parent: SourceLine): ScreenDirectiveSyntax[] {\n const directives: ScreenDirectiveSyntax[] = [];\n for (let child = context.peekChild(parent.indent); child !== undefined; child = context.peekChild(parent.indent)) {\n context.reader.takeSignificant();\n pushDirective(context, child, directives);\n }\n return directives;\n}\n\nfunction parseDirective(context: ParserContext, line: SourceLine): ScreenDirectiveSyntax | undefined {\n validateNonActionSubjectClause(context, line);\n switch (firstWord(line.content)) {\n case 'data':\n return parseData(context, line);\n case 'action':\n return parseAction(context, line);\n case 'template':\n return parseTemplateReference(context, line);\n case 'section':\n return parseSection(context, line);\n case 'title':\n return parseTitle(context, line);\n case 'table':\n return parseTable(context, line);\n case 'summary':\n return parseSummary(context, line);\n case 'component':\n return parseComponent(context, line);\n case 'toolbar':\n return parseToolbar(context, line);\n case 'navigate':\n return parseNavigate(context, line.content, line);\n case 'on':\n collectInputUses(context, line);\n return { kind: 'ScreenBehaviorSyntax', location: locationOf(line) };\n case 'uses':\n collectInputUses(context, line);\n return { kind: 'ScreenUsesBehaviorSyntax', location: locationOf(line) };\n default:\n if (isCodeLine(context, line)) {\n return parseCode(context, line);\n }\n context.error(DiagnosticCodes.UnknownScreenDirective, `Unexpected '${line.content}' in screen body`, locationOf(line));\n context.skipBlock(line.indent);\n return undefined;\n }\n}\n\nfunction parseData(context: ParserContext, line: SourceLine): ScreenDataSyntax | undefined {\n const match = data.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidDataDirective, `Invalid data directive '${line.content}' - expected 'data <ReadModel> via query <Query> [by <param>]'`, locationOf(line));\n return undefined;\n }\n return { kind: 'ScreenDataSyntax', type: parseTypeRef(match[1], locationOf(line)), query: match[2], by: match[3] ?? null, location: locationOf(line) };\n}\n\nfunction validateNonActionSubjectClause(context: ParserContext, line: SourceLine): void {\n const grammar = new Map([['data', data], ['navigate', navigate], ['component', component], ['title', title]]).get(firstWord(line.content));\n // Expressions, code and open-ended template references belong to their own parsers.\n if (grammar !== undefined) parseSubjectClause(context, line, false, content => grammar.test(content));\n}\n\nfunction parseAction(context: ParserContext, line: SourceLine): ScreenActionSyntax | ScreenGuardedActionSyntax | undefined {\n const parsed = parseSubjectClause(context, line, true, content => action.test(content) || guardedAction.test(content));\n const result = parseActionHeader(context, line, parsed);\n if (result === undefined || parsed.subject === undefined) return result;\n return { ...result, subject: parsed.subject };\n}\n\nfunction parseActionHeader(context: ParserContext, line: SourceLine, parsed: ReturnType<typeof parseSubjectClause>): ScreenActionSyntax | ScreenGuardedActionSyntax | undefined {\n const guarded = guardedAction.exec(parsed.header);\n if (guarded !== null) return parseGuardedAction(context, line, operandText(guarded, 1), parseNavigate);\n const match = action.exec(parsed.header);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidActionDirective, `Invalid action directive '${line.content}' - expected 'action <Command>'`, locationOf(line));\n context.skipBlock(line.indent);\n return undefined;\n }\n let text: string | null = parsed.label ?? null;\n let target: ScreenNavigateSyntax | null = null;\n const inputs: InteractionArgumentSyntax[] = [];\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n const labelMatch = label.exec(child.content);\n if (labelMatch !== null) {\n text = operandText(labelMatch, 1);\n } else if (firstWord(child.content) === 'navigate') {\n target = parseNavigate(context, child.content, child) ?? null;\n } else if (firstWord(child.content) === 'with') {\n addPlainActionInput(context, child, inputs);\n } else {\n context.error(DiagnosticCodes.UnknownActionDirective, `Unexpected '${child.content}' in action - expected 'label \"...\"' or 'navigate to ...'`, locationOf(child));\n }\n }\n return { kind: 'ScreenActionSyntax', command: match[1], label: text, navigate: target, ...(inputs.length === 0 ? {} : { inputs }), location: locationOf(line) };\n}\n\nfunction addPlainActionInput(context: ParserContext, line: SourceLine, inputs: InteractionArgumentSyntax[]): void {\n const input = parsePlainActionInput(context, line, inputs);\n if (input !== undefined) inputs.push(input);\n}\n\nfunction parseNavigate(context: ParserContext, text: string, line: SourceLine): ScreenNavigateSyntax | undefined {\n const match = navigate.exec(text);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidNavigation, `Invalid navigation '${text}' - expected 'navigate to <Screen> [by <param>]'`, locationOf(line));\n return undefined;\n }\n const parameters: ScreenNavigationParameterSyntax[] = [];\n let routeValue: string | null = null;\n let outletValue: string | null = null;\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n const parameterMatch = parameter.exec(child.content);\n if (parameterMatch !== null) {\n parameters.push({ kind: 'ScreenNavigationParameterSyntax', name: parameterMatch[1], binding: parseFromClauseOn(context, parameterMatch[2], child), location: locationOf(child) });\n continue;\n }\n const routeMatch = route.exec(child.content);\n if (routeMatch !== null) {\n routeValue = operandText(routeMatch, 1);\n continue;\n }\n const outletMatch = outletPattern.exec(child.content);\n if (outletMatch !== null) {\n outletValue = outletMatch[1];\n continue;\n }\n context.error(DiagnosticCodes.InvalidNavigation, `Unexpected '${child.content}' in navigation - expected 'route \"...\"', 'outlet <name>' or 'parameter <name> from <binding>'`, locationOf(child));\n }\n return { kind: 'ScreenNavigateSyntax', screen: match[1], by: match[2] ?? null, route: routeValue, ...(outletValue === null ? {} : { outlet: outletValue }), parameters, location: locationOf(line) };\n}\n\nfunction parseTemplateReference(context: ParserContext, line: SourceLine): ScreenTemplateReferenceSyntax {\n let name = line.content.substring('template'.length).trim();\n let blueprint: string | null = null;\n let version: string | null = null;\n if (startsBlueprintReference(name)) {\n const reference = parseBlueprintReference(name);\n if (reference === undefined) {\n context.error(DiagnosticCodes.UnknownLayoutDirective, `Invalid template reference '${line.content}' - expected 'template <Name>' or 'template blueprint <Blueprint> <Name> [version \"<range>\"]'`, locationOf(line));\n } else {\n ({ blueprint, name, version } = reference);\n if (version !== null && !isValidTemplateVersionRange(version)) {\n context.error(DiagnosticCodes.InvalidTemplateVersionRange, `The template version range '${version}' is not one Scene understands - use '*', an exact version or a ^, ~, >=, >, <= or < range such as \"^1.2\"`, locationOf(line));\n }\n }\n }\n const slots: ScreenSlotSyntax[] = [];\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n if (!slot.test(child.content)) {\n context.error(DiagnosticCodes.InvalidScreenLayoutSlot, `Expected a slot name in template '${name}', got '${child.content}'`, locationOf(child));\n context.skipBlock(child.indent);\n continue;\n }\n slots.push({ kind: 'ScreenSlotSyntax', name: child.content, directives: parseDirectives(context, child), location: locationOf(child) });\n }\n return { kind: 'ScreenTemplateReferenceSyntax', name, slots, ...(blueprint === null ? {} : { blueprint }), ...(version === null ? {} : { version }), location: locationOf(line) };\n}\n\nfunction parseSection(context: ParserContext, line: SourceLine): ScreenSectionSyntax {\n const name = line.content.substring('section'.length).trim();\n return { kind: 'ScreenSectionSyntax', name, directives: parseDirectives(context, line), location: locationOf(line) };\n}\n\nfunction parseTitle(context: ParserContext, line: SourceLine): ScreenTitleSyntax {\n const match = title.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidTitleDirective, `Invalid title directive '${line.content}' - expected 'title \"...\"'`, locationOf(line));\n return { kind: 'ScreenTitleSyntax', text: '', location: locationOf(line) };\n }\n return { kind: 'ScreenTitleSyntax', text: operandText(match, 1), location: locationOf(line) };\n}\n\nfunction parseTable(context: ParserContext, line: SourceLine): ScreenTableSyntax {\n const target = line.content.substring('table'.length).trim();\n const columns: ScreenColumnSyntax[] = [];\n let click: ScreenNavigateSyntax | null = null;\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n const columnMatch = column.exec(child.content);\n const clickMatch = rowClick.exec(child.content);\n if (columnMatch !== null) {\n const labelled = columnMatch[2] !== undefined || columnMatch[3] !== undefined;\n columns.push({ kind: 'ScreenColumnSyntax', property: columnMatch[1], label: labelled ? operandText(columnMatch, 2) : null, location: locationOf(child) });\n } else if (clickMatch !== null) {\n click = parseNavigate(context, clickMatch[1], child) ?? null;\n } else if (firstWord(child.content) === 'on') {\n collectInputUses(context, child);\n } else if (isInteraction(child)) {\n collectInputUses(context, child);\n } else {\n context.error(DiagnosticCodes.UnknownTableDirective, `Unexpected '${child.content}' in table - expected 'column ...', 'on row-click navigate to ...', 'on <trigger>' or 'uses <Behavior>'`, locationOf(child));\n }\n }\n return { kind: 'ScreenTableSyntax', target, columns, rowClick: click, location: locationOf(line) };\n}\n\nfunction parseSummary(context: ParserContext, line: SourceLine): ScreenSummarySyntax {\n const target = line.content.substring('summary'.length).trim();\n const fields: ScreenFieldSyntax[] = [];\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n const match = field.exec(child.content);\n if (match === null) {\n context.error(DiagnosticCodes.UnknownSummaryDirective, `Unexpected '${child.content}' in summary - expected 'field <property> label \"...\"'`, locationOf(child));\n continue;\n }\n fields.push({ kind: 'ScreenFieldSyntax', property: match[1], label: operandText(match, 2), location: locationOf(child) });\n }\n return { kind: 'ScreenSummarySyntax', target, fields, location: locationOf(line) };\n}\n\n\nfunction parseComponent(context: ParserContext, line: SourceLine): ScreenComponentSyntax | undefined {\n const match = component.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.UnknownScreenDirective, `Invalid component directive '${line.content}' - expected 'component <Package.Component> <name>'`, locationOf(line));\n context.skipBlock(line.indent);\n return undefined;\n }\n\n let dataContext = null;\n let componentStableId = null;\n let icon = null;\n const properties: ComponentPropertySyntax[] = [];\n const exposedValues: ComponentExposedValueSyntax[] = [];\n const presentationValues: PresentationValueSyntax[] = [];\n const outlets: ComponentOutletSyntax[] = [];\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n switch (firstWord(child.content)) {\n case 'context':\n dataContext = parseUiContext(context, child);\n break;\n case 'id':\n componentStableId = parseStableId(context, child);\n break;\n case 'property':\n parseComponentProperty(context, child, properties);\n break;\n case 'icon':\n icon = child.content.substring('icon'.length).trim();\n break;\n case 'presentation':\n parsePresentationValue(context, child, presentationValues);\n break;\n case 'exposes':\n parseExposedValue(context, child, exposedValues);\n break;\n case 'outlet':\n outlets.push({ kind: 'ComponentOutletSyntax', name: child.content.substring('outlet'.length).trim(), directives: parseDirectives(context, child), location: locationOf(child) });\n break;\n case 'on':\n collectInputUses(context, child);\n break;\n case 'uses':\n collectInputUses(context, child);\n break;\n default:\n context.error(DiagnosticCodes.UnknownScreenDirective, `Unexpected '${child.content}' in component - expected context, id, property, icon, presentation, exposes, outlet, on or uses`, locationOf(child));\n context.skipBlock(child.indent);\n break;\n }\n }\n\n return { kind: 'ScreenComponentSyntax', component: match[1], name: match[2], stableId: componentStableId, context: dataContext, properties, exposes: exposedValues, presentation: presentationValues, icon, outlets, location: locationOf(line) };\n}\n\nfunction parseUiContext(context: ParserContext, line: SourceLine) {\n return parseUiBindingValue(context, line.content.substring('context'.length).trim(), line);\n}\n\nfunction parseComponentProperty(context: ParserContext, line: SourceLine, properties: ComponentPropertySyntax[]): void {\n const bound = componentPropertyBinding.exec(line.content);\n if (bound !== null) {\n properties.push({ kind: 'ComponentPropertySyntax', property: bound[1], binding: parseFromClauseOn(context, bound[2], line), value: null, location: locationOf(line) });\n return;\n }\n const literal = componentPropertyLiteral.exec(line.content);\n if (literal !== null) {\n properties.push({ kind: 'ComponentPropertySyntax', property: literal[1], binding: null, value: parseMappingSource(literal[2], locationOf(line), context), location: locationOf(line) });\n return;\n }\n const structured = componentPropertyBlock.exec(line.content);\n if (structured !== null) {\n properties.push({ kind: 'ComponentPropertySyntax', property: structured[1], binding: null, value: parseStructuredValue(context, line, structured[2] as StructuredMarker), location: locationOf(line) });\n return;\n }\n context.error(DiagnosticCodes.UnknownScreenDirective, `Invalid component property '${line.content}' - expected 'property <path> from <binding>', 'property <path> = <literal>', or 'property <path>' with the object or list as an indented block`, locationOf(line));\n}\n\nfunction parseStableId(context: ParserContext, line: SourceLine): string | null {\n const match = stableId.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.UnknownScreenDirective, `Invalid component id '${line.content}' - expected 'id \"stable-id\"'`, locationOf(line));\n return null;\n }\n return operandText(match, 1);\n}\n\nfunction parseExposedValue(context: ParserContext, line: SourceLine, values: ComponentExposedValueSyntax[]): void {\n const match = exposes.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.UnknownScreenDirective, `Invalid exposed value '${line.content}' - expected 'exposes <name> from <binding>'`, locationOf(line));\n return;\n }\n values.push({ kind: 'ComponentExposedValueSyntax', name: match[1], binding: parseFromClauseOn(context, match[2], line), location: locationOf(line) });\n}\n\nfunction parsePresentationValue(context: ParserContext, line: SourceLine, values: PresentationValueSyntax[]): void {\n const match = presentation.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.UnknownScreenDirective, `Invalid presentation value '${line.content}' - expected 'presentation <key> \"value\"'`, locationOf(line));\n return;\n }\n values.push({ kind: 'PresentationValueSyntax', name: match[1], value: operandText(match, 2), location: locationOf(line) });\n}\n\nexport function parseToolbar(context: ParserContext, line: SourceLine): ScreenToolbarSyntax {\n const name = line.content.substring('toolbar'.length).trim();\n const items: ToolbarItemSyntax[] = [];\n const buttons: ToolbarButtonSyntax[] = [];\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n if (firstWord(child.content) === 'button') {\n const button = parseToolbarButton(context, child);\n if (button !== undefined) buttons.push(button);\n continue;\n }\n const item = parseToolbarItem(context, child);\n if (item !== undefined) items.push(item);\n }\n return { kind: 'ScreenToolbarSyntax', name, items, ...(buttons.length > 0 ? { buttons } : {}), location: locationOf(line) };\n}\n\nconst toolbarButtonExpected = 'button <id> title \"<text>\" [slice <Module>.<Feature>.<Slice>] [emphasis primary|secondary|quiet] [icon <name>]';\n\n// A button is one line; the C# compiler checks what it names (PLAY0761-PLAY0765), this one reads its grammar.\nfunction parseToolbarButton(context: ParserContext, line: SourceLine): ToolbarButtonSyntax | undefined {\n const head = toolbarButton.exec(line.content);\n if (head === null) {\n context.error(DiagnosticCodes.InvalidToolbarButton, `Invalid toolbar button '${line.content}' - expected ${toolbarButtonExpected}`, locationOf(line));\n context.skipBlock(line.indent);\n return undefined;\n }\n const id = head[1] !== undefined ? unescapeString(head[1]) : head[2];\n const rest = head[3] ?? '';\n let buttonTitle: string | undefined;\n let slice: string | undefined;\n let icon: string | undefined;\n let emphasis: ToolbarEmphasis | undefined;\n let valid = true;\n let position = 0;\n while (position < rest.length) {\n toolbarButtonPart.lastIndex = position;\n const part = toolbarButtonPart.exec(rest);\n if (part === null) {\n context.error(DiagnosticCodes.InvalidToolbarButton, `Invalid toolbar button '${line.content}' - unexpected '${rest.substring(position).trim()}'; expected ${toolbarButtonExpected}`, locationOf(line));\n valid = false;\n break;\n }\n position = part.index + part[0].length;\n const key = part[1];\n const quoted = part[2] !== undefined;\n const localized = part[3] !== undefined;\n const value = quoted ? unescapeString(part[2]) : localized ? part[3] : part[4];\n const repeated = key === 'title' ? buttonTitle !== undefined : key === 'slice' ? slice !== undefined : key === 'icon' ? icon !== undefined : emphasis !== undefined;\n if (repeated) {\n context.error(DiagnosticCodes.InvalidToolbarButton, `Toolbar button '${id}' states '${key}' more than once`, locationOf(line));\n continue;\n }\n if (key === 'title') {\n if (quoted || localized) buttonTitle = value;\n else {\n context.error(DiagnosticCodes.InvalidToolbarButton, `Invalid title '${value}' on toolbar button '${id}' - expected a quoted string or a $strings.<key> token`, locationOf(line));\n valid = false;\n }\n } else if (key === 'slice') {\n if (!quoted && !localized && toolbarSlicePath.test(value)) slice = value;\n else {\n context.error(DiagnosticCodes.InvalidToolbarButton, `Invalid slice '${value}' on toolbar button '${id}' - expected <Module>.<Feature>.<Slice>`, locationOf(line));\n valid = false;\n }\n } else if (key === 'emphasis') {\n if (!quoted && !localized && ['primary', 'secondary', 'quiet'].includes(value)) emphasis = value === 'primary' ? 'Primary' : value === 'secondary' ? 'Secondary' : 'Quiet';\n else {\n context.error(DiagnosticCodes.InvalidToolbarButton, `Invalid emphasis '${value}' on toolbar button '${id}' - expected primary, secondary or quiet`, locationOf(line));\n valid = false;\n }\n } else {\n icon = value;\n }\n }\n if (buttonTitle === undefined && valid) {\n context.error(DiagnosticCodes.InvalidToolbarButton, `Toolbar button '${id}' has no title - expected 'button ${id} title \"<text>\"'`, locationOf(line));\n }\n let authorize: AuthorizeSyntax | null = null;\n let buttonConfirm: string | undefined;\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n if (firstWord(child.content) === 'authorize' && authorize === null) {\n authorize = parseAuthorize(context, child);\n continue;\n }\n const confirmMatch = buttonConfirm === undefined ? confirmPattern.exec(child.content) : null;\n if (confirmMatch !== null) {\n buttonConfirm = operandText(confirmMatch, 1);\n continue;\n }\n context.error(DiagnosticCodes.InvalidToolbarButton, `Unexpected '${child.content}' under toolbar button '${id}' - a button takes one 'authorize' line, one 'confirm' line and nothing else`, locationOf(child));\n context.skipBlock(child.indent);\n }\n return {\n kind: 'ToolbarButtonSyntax', id, title: buttonTitle ?? '',\n ...(slice !== undefined ? { slice } : {}), ...(emphasis !== undefined ? { emphasis } : {}), ...(icon !== undefined ? { icon } : {}), ...(authorize !== null ? { authorize } : {}), ...(buttonConfirm !== undefined ? { confirm: buttonConfirm } : {}),\n location: locationOf(line),\n };\n}\n\nfunction parseToolbarItem(context: ParserContext, line: SourceLine): ToolbarItemSyntax | undefined {\n const parsed = parseSubjectClause(context, line, /^item\\s+\\S+\\s+action\\s/u.test(line.content), content => toolbarItem.test(content));\n const match = toolbarItem.exec(parsed.header);\n if (match === null) {\n context.error(DiagnosticCodes.UnknownScreenDirective, `Invalid toolbar item '${line.content}' - expected 'item <name> action <Command>', 'item <name> navigate to <Screen>', 'item <name> dialog <DialogTemplate>' or 'button <id> title \"<text>\" slice <Slice>'`, locationOf(line));\n context.skipBlock(line.indent);\n return undefined;\n }\n let itemLabel: string | null = parsed.label ?? null;\n let icon = null;\n let itemConfirm: string | undefined;\n const parameters: ScreenNavigationParameterSyntax[] = [];\n const presentationValues: PresentationValueSyntax[] = [];\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n const labelMatch = label.exec(child.content);\n if (labelMatch !== null) {\n itemLabel = operandText(labelMatch, 1);\n continue;\n }\n const confirmMatch = confirmPattern.exec(child.content);\n if (confirmMatch !== null) {\n itemConfirm = operandText(confirmMatch, 1);\n continue;\n }\n const parameterMatch = parameter.exec(child.content);\n if (parameterMatch !== null) {\n parameters.push({ kind: 'ScreenNavigationParameterSyntax', name: parameterMatch[1], binding: parseFromClauseOn(context, parameterMatch[2], child), location: locationOf(child) });\n continue;\n }\n if (firstWord(child.content) === 'icon') {\n icon = child.content.substring('icon'.length).trim();\n continue;\n }\n parsePresentationValue(context, child, presentationValues);\n }\n const syntaxKind: ToolbarItemKind = match[2] === 'navigate' ? 'Navigate' : match[2] === 'dialog' ? 'Dialog' : 'Action';\n return { kind: 'ToolbarItemSyntax', name: match[1], syntaxKind, target: match[3], label: itemLabel, icon, ...(parsed.subject === undefined ? {} : { subject: parsed.subject }), ...(itemConfirm !== undefined ? { confirm: itemConfirm } : {}), parameters, presentation: presentationValues, location: locationOf(line) };\n}\n\nfunction parseUiBindingValue(context: ParserContext, text: string, line: SourceLine) {\n return parseFromClause(context, text, locationOf(line));\n}\n\nfunction parseCode(context: ParserContext, line: SourceLine): ScreenCodeSyntax | undefined {\n const language = line.content.startsWith('```') ? line.content.substring(3) : line.content;\n if (!context.languages.has(language)) {\n context.error(DiagnosticCodes.ExpectedCodeFence, `Expected a registered language on the opening fence, not '${line.content}'`, locationOf(line));\n return undefined;\n }\n if (!line.content.startsWith('```')) {\n context.warning(DiagnosticCodes.LegacyInlineCodeFence, `'${language}' on its own line is deprecated - use '\\`\\`\\`${language}' instead`, locationOf(line));\n }\n const code = parseFencedText(context, language, line);\n return code === null ? undefined : {\n kind: 'ScreenCodeSyntax',\n code: { kind: 'CodeBlockSyntax', language, code, location: locationOf(line) },\n 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{pattern as r}from"../Text/patterns.js";import{locationOf as i,startOf as a}from"./SourceLine.js";import{parseComplianceDirective as o,parseComplianceMarkers as s}from"./ConceptComplianceParser.js";import{firstWord as c,unescapeIdentifier as l}from"./LineText.js";import{describePlacement as u,documentPlacement as d,isDocumentPlacement as f}from"../Files/PlayPlacement.js";import{parseDescription as p}from"./DescriptionParser.js";import{parsePurpose as m}from"./PurposeParser.js";import{isFileImport as h,parseFileImport as g}from"./FileImportParser.js";import{recordAuthoredDocument as _}from"../Syntax/SourceOptions.js";import{collectInputUses as v}from"./InputUses.js";import{misplacedReactionIdentity as y}from"./ReactionIdentityParser.js";import{parseCanvasPair as b}from"./CanvasPlacement.js";import{parseEventSource as ee}from"./EventSourceParser.js";import{isFileDirective as x}from"./FileReferences.js";import{isBlankPublicEventOrigin as S}from"../Syntax/PublicEventInvariants.js";import{parseType as te}from"./DeclarationParsers.js";import{parseSystem as ne}from"./OperationParser.js";import{parseExample as re}from"./SpecificationExampleParser.js";import{parseValidate as C}from"./CommandParser.js";import{parseTriggerDeclaration as w}from"./TriggerDataParser.js";import{FeatureBody as T,featureBodyExpected as E}from"./FeatureBody.js";import{ModuleBody as D,moduleBodyExpected as O,modulePattern as k,parseModule as A}from"./ModuleBody.js";import{EnumerationMembers as j}from"./EnumerationMembers.js";import{parseGeneration as M}from"./GenerationParser.js";import{parseIdentity as N}from"./IdentityParser.js";import{parsePolicy as ie}from"./PolicyParser.js";import{parseSeed as ae}from"./SeedParser.js";import{parseExposure as oe,parseInstance as se}from"./CompositionParser.js";import{parseUiProfile as P}from"./UiProfileLegacyLayout.js";const F=r(`^domain\\s+([A-Za-z_]\\w*(?:\\.[A-Za-z_]\\w*)*)$`),I=r(`^time\\s+zone\\s+(configurable\\s+default\\s+)?"(${t})"$`),L=r(`^import\\s+([\\w.]+)(?:\\s+from\\s+"(?<origin>${t})")?$`),R=r(`^concept\\s+(\\w+)\\s*:\\s*(\\w+)((?:\\s+@?\\w+)*)$`),z=r(`^@?[a-z_]\\w*$`),B=r(`^persona\\s+([A-Za-z_]\\w*)$`),V=r(`^policy\\s+([A-Za-z_]\\w*)$`),H=r(`^goal\\s+"(${t})"$`),U=r(`^sticky\\s+note\\s+on\\s+(personas|eventsources|givencontexts|seeddata)$`),W=r(`^colour\\s+(yellow|pink|green|blue)$`),G=/^[ ]*\t/,K=[`Uuid`,`String`,`Int`,`Decimal`,`Bool`,`Date`,`DateTime`],q=/* @__PURE__ */ new Set([`policy`,`authentication`,`onboarding`,`seed`,`ui`,`theme`,`trigger`,`layout`,`behavior`,`sample`]),J=/* @__PURE__ */ new Set([`slice`,`feature`,`description`,`documentation`,`authorize`,`screen`,`dialog`,`form`,`contribute`,`on`,`uses`]);function parseApplication(t,r,a=d){t.deferIdentityValidation=!0,warnOnTabIndentation(t,r);let o=a.length===1?new D(a[0]):void 0,s=a.length>1?new T(a[a.length-1]):void 0,l=o??s,u=null,p=null,b=!1,x=null,C=null,E=!1,O=!1,k=null,j=[],M=[],F=[],R=[],z=[],B=[],V=[],H=[],U=[],W=[],G=[],K=[],J=[],Y=[],X=[],Z=[],Q=!1;for(let r=t.reader.peekSignificant();r!==void 0;r=t.reader.peekSignificant()){t.reader.takeSignificant();let s=c(r.content);if(s===`command`&&/^command\s+reads(?:\s|$)/.test(r.content))O||!f(a)||!/^command\s+reads\s+protected$/.test(r.content)?t.error(e.InvalidCommandReadsDeclaration,`Declare 'command reads protected' once at the application root.`,i(r)):x=`Protected`,O=!0;else if(s===`time`&&/^time\s+zone(?:\s|$)/.test(r.content)){let o=I.exec(r.content);t.skipBlock(r.indent),E||!f(a)||o===null?t.error(e.InvalidTimeZoneDeclaration,`Declare 'time zone "<id>"' or 'time zone configurable default "<id>"' once at the application root.`,i(r)):C={kind:`TimeZoneSyntax`,id:n(o[2]),configurable:o[1]!==void 0,location:i(r)},E=!0}else if(s===`reaction`)b||!f(a)||!/^reaction\s+batches\s+atomic$/.test(r.content)?t.error(e.InvalidReactionBatchesDeclaration,`Declare 'reaction batches atomic' once at the application root.`,i(r)):p=`Atomic`,b=!0;else if(s===`runs`)y(t,r);else if(s===`domain`)t.authoredDeclarations=!0,k=parseDomain(t,r,k,Q);else if(Q||=declaresConstruct(s,r,a),t.authoredDeclarations||=s!==`import`&&declaresConstruct(s,r,a),s===`import`&&h(r.content))l===void 0?g(t,r,M):l.tryParse(t,r);else if(s===`import`){let a=L.exec(r.content);if(a===null)t.error(e.InvalidImportDeclaration,`Invalid import '${r.content}' - expected 'import <Qualified.Name> [from "<origin>"]'`,i(r));else{let o=a.groups?.origin===void 0?null:n(a.groups.origin);o!==null&&S(o)&&t.error(e.InvalidImportDeclaration,`An import origin must be a nonblank quoted string`,i(r)),j.push({kind:`ImportSyntax`,qualifiedName:a[1],origin:o,visibility:o===null?`Private`:`Public`,location:i(r)})}}else if(s===`example`)l===void 0?J.push(re(t,r)):l.tryParse(t,r);else if(s===`eventsource`)B.push(ee(t,r));else if(s===`system`)z.push(ne(t,r));else if(s===`concept`)F.push(parseConcept(t,r));else if(s===`type`)R.push(te(t,r));else if(s===`module`&&!f(a))parseModuleInPlacedFile(t,r,a,o);else if(s===`module`)V.push(A(t,r));else if(s===`persona`)H.push(parsePersona(t,r));else if(s===`sticky`){let e=parseStickyNote(t,r);e!==null&&U.push(e)}else if(s===`seed`)K.push(ae(t.valueContext,r));else if(s===`purpose`&&l!==void 0)l.tryParse(t,r);else if(s===`purpose`)G.push(m(t,r));else if(s===`identity`)u=N(t,r,u);else if(s===`policy`){let n=ie(t,r);W.some(e=>e.name===n.name)&&t.error(e.DuplicateDeclaration,`Duplicate declaration of policy '${n.name}' - policy names must be unique`,n.location),W.push(n)}else if(s===`exposure`)X.push(oe(t,r));else if(s===`instance`)Z.push(se(t,r));else if(s===`trigger`){let e=w(t,r),n=/^trigger\s+([A-Za-z_]\w*)$/.exec(r.content)?.[1];n!==void 0&&Y.push({name:n,data:e})}else q.has(s)?s===`behavior`||s===`layout`?v(t,r):s===`ui`?P(t,r):t.skipOpaqueBlock(r.indent):l?.tryParse(t,r)!==!0&&reportUnexpectedTopLevel(t,r,a)}o===void 0?s!==void 0&&V.unshift(place(a,s.build(t.start,!0),t.start)):V.unshift(o.build(t.start,!0));let $={kind:`ApplicationSyntax`,...x===null?{}:{commandReadMode:x},...C===null?{}:{timeZone:C},...p===null?{}:{reactionProductionMode:p},...u===null?{}:{identity:u},sourceOptions:t.sourceOptions,domain:k,imports:j,concepts:F,types:R,systems:z,eventSources:B,examples:J,modules:V,personas:H,policies:W,purposes:G,seeds:K,declaredTriggers:Y,fileImports:M,...X.length>0?{exposures:X}:{},...U.length>0?{stickyNotes:U}:{},...Z.length>0?{instanceContributions:Z}:{},location:t.start};return t.authoredDeclarations&&_($),$}function declaresConstruct(e,t,n){return e===`import`?L.test(t.content):e===`module`?f(n):e===`identity`?t.content===`identity`:e===`purpose`||e===`example`||e===`exposure`||e===`instance`||e===`eventsource`||e===`system`||e===`concept`||e===`type`||e===`persona`||e===`sticky`||q.has(e)}function parseModuleInPlacedFile(t,n,r,a){let o=k.exec(n.content)?.[1]??``;a!==void 0&&o===r[0]?(t.authoredDeclarations=!0,a.parseChildren(t,n)):(t.error(e.ModuleInPlacedFile,`This file is imported into ${u(r)}, so it cannot declare module '${o}' - import it at the top level of a document instead`,i(n)),t.skipBlock(n.indent))}function reportUnexpectedTopLevel(t,n,r){let a=c(n.content);if(f(r)){let r=J.has(a)?` - '${a}' belongs in a module or feature; wrap it in one, or import this file from inside one`:` - expected domain, import, concept, type, policy, persona, sticky note, authentication, onboarding, identity, module, seed, trigger, behavior, ui profile, theme, sample data or layout`;t.error(e.UnknownTopLevelConstruct,`Unexpected '${a}' at the top level${r}`,i(n))}else{let o=r.length===1?O:E;t.error(e.UnexpectedInPlacedFile,`Unexpected '${a}' in a file imported into ${u(r)} - expected an application declaration or ${o}`,i(n))}t.skipBlock(n.indent)}function place(e,t,n){let r=t;for(let t=e.length-2;t>=1;t--)r={kind:`FeatureSyntax`,name:e[t],description:null,authorize:null,features:[r],slices:[],fileImports:[],isPlacement:!0,location:n};return{kind:`ModuleSyntax`,name:e[0],description:null,authorize:null,features:[r],fileImports:[],isPlacement:!0,location:n}}function parseDomain(t,n,r,a){let o=F.exec(n.content);return o===null?(t.error(e.InvalidDomainDeclaration,`Invalid domain declaration '${n.content}' - expected 'domain <Qualified.Name>'`,i(n)),r):r===null?(a&&t.error(e.DomainNotFirst,`'domain' must be declared before any other construct`,i(n)),{kind:`DomainSyntax`,name:o[1],location:i(n)}):(t.error(e.DuplicateDomain,`The document already declares a domain - a document can have at most one`,i(n)),r)}function warnOnTabIndentation(t,n){let r=!1;for(let i of n)i.raw.trimStart().startsWith("```")?r=!r:!r&&G.test(i.raw)&&t.warning(e.TabIndentation,`Screenplay is indentation based - use spaces, not tabs`,a(i))}function parseConcept(t,n){let r=R.exec(n.content);if(r===null)return t.error(e.InvalidConceptDeclaration,`Invalid concept declaration '${n.content}' - expected 'concept <Name> : <Type>'`,i(n)),t.skipBlock(n.indent),{kind:`ConceptSyntax`,name:c(n.content),type:``,attributes:[],values:[],location:i(n)};let[,a,u,d]=r,f=s(t,n,a,d);u!==`Enum`&&!K.includes(u)&&t.error(e.UnknownPrimitiveType,`Unknown primitive type '${u}' - expected ${K.join(`, `)} or Enum`,i(n));let m=[],h=new j,g=null,_=!1,v=null,y=[];for(let r=t.peekChild(n.indent);r!==void 0;r=t.peekChild(n.indent)){t.reader.takeSignificant();let n=u===`Enum`?h.tryNumbered(t,r):void 0;if(n!==void 0)m.push(n);else if(c(r.content)===`description`&&(u!==`Enum`||r.content!==`description`||t.peekChild(r.indent)?.content.startsWith("```")===!0))v=p(t,r,v,`Concept '${a}'`);else if(x(r))continue;else if(c(r.content)===`validate`){u===`Enum`&&r.content===`validate`&&t.peekChild(r.indent)===void 0&&t.warning(e.ValidateReadAsEnumerationBlock,`'validate' in enumeration concept '${a}' declares an empty validate block, not a value named 'validate' - write '@validate' for the value`,i(r));let n=C(t,r,`concept`,a);n!==void 0&&y.push(n)}else if(c(r.content)===`generate`&&(u!==`Enum`||r.content!==`generate`)){_&&t.error(e.DuplicateGeneration,`Concept '${a}' declares generation more than once.`,i(r));let n=M(t,r,u);_||(g=n),_=!0}else o(t,r,a,f)||(u===`Enum`&&z.test(r.content)?m.push(l(r.content)):u===`Enum`?t.error(e.InvalidEnumerationValue,`Invalid enum value '${r.content}' - expected an identifier`,i(r)):(t.error(e.UnknownConceptDirective,`Unexpected '${r.content}' in concept body - expected validate, generate, 'file <path>' or '<attribute> reason "<text>"'`,i(r)),t.skipBlock(r.indent)))}let b=h.finish(t,n,m.length);return{kind:`ConceptSyntax`,name:a,type:u,attributes:f,values:m,validations:y,description:v,...g===null?{}:{generation:g},...b===void 0?{}:{valueNumbers:b},location:i(n)}}function parsePersona(t,r){let a=B.exec(r.content)?.[1]??``;a===``&&t.error(e.InvalidPersonaDeclaration,`Invalid persona declaration '${r.content}' - expected 'persona <Name>'`,i(r));let o=null,s=[],l=[],u=null,d=null;for(let f=t.peekChild(r.indent);f!==void 0;f=t.peekChild(r.indent)){t.reader.takeSignificant();let r=c(f.content);if(r===`description`)o=p(t,f,o,`Persona '${a}'`);else if(r===`goal`){let r=H.exec(f.content);r===null?t.error(e.InvalidPersonaDeclaration,`Invalid goal '${f.content}' - expected 'goal "<text>"'`,i(f)):l.push(n(r[1]))}else if(r===`position`)u=b(t,f,`position`,`x`,`y`,u,!0)??u;else if(r===`size`)d=b(t,f,`size`,`width`,`height`,d,!1)??d;else if(r===`policy`){let n=V.exec(f.content);n===null?t.error(e.InvalidPersonaPolicyReference,`Invalid policy reference '${f.content}' - expected 'policy <Name>'`,i(f)):s.push(n[1])}else t.error(e.UnknownPersonaDirective,`Unexpected '${r}' in persona body - expected description, goal, policy, position or size`,i(f)),t.skipBlock(f.indent)}return{kind:`PersonaSyntax`,name:a,description:o,policies:s,...l.length>0?{goals:l}:{},...u===null?{}:{x:u[0],y:u[1]},...d===null?{}:{width:d[0],height:d[1]},location:i(r)}}function parseStickyNote(t,n){let r=U.exec(n.content);if(r===null)return t.error(e.InvalidPersonaDeclaration,`Invalid sticky note declaration '${n.content}' - expected 'sticky note on personas', 'sticky note on eventsources', 'sticky note on givencontexts' or 'sticky note on seeddata'`,i(n)),t.skipBlock(n.indent),null;let a=null,o=null,s=null,l=null;for(let r=t.peekChild(n.indent);r!==void 0;r=t.peekChild(n.indent)){t.reader.takeSignificant();let n=c(r.content);if(n===`description`)a=p(t,r,a,`A sticky note`);else if(n===`colour`){let n=W.exec(r.content);n===null?t.error(e.InvalidPersonaDeclaration,`Invalid colour '${r.content}' - expected 'colour yellow', 'colour pink', 'colour green' or 'colour blue'`,i(r)):o=n[1]}else n===`position`?s=b(t,r,`position`,`x`,`y`,s,!0)??s:n===`size`?l=b(t,r,`size`,`width`,`height`,l,!1)??l:(t.error(e.UnknownPersonaDirective,`Unexpected '${n}' in sticky note body - expected description, colour, position or size`,i(r)),t.skipBlock(r.indent))}return a===null||s===null?(t.error(e.InvalidPersonaDeclaration,`A sticky note needs a description (the text on it) and a position`,i(n)),null):{kind:`StickyNoteSyntax`,canvas:r[1],text:a,colour:o,x:s[0],y:s[1],width:l===null?null:l[0],height:l===null?null:l[1],location:i(n)}}export{parseApplication};
|
|
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{pattern as r}from"../Text/patterns.js";import{locationOf as i,startOf as a}from"./SourceLine.js";import{parseComplianceDirective as o,parseComplianceMarkers as s}from"./ConceptComplianceParser.js";import{firstWord as c,unescapeIdentifier as l}from"./LineText.js";import{describePlacement as u,documentPlacement as d,isDocumentPlacement as f}from"../Files/PlayPlacement.js";import{parseDescription as p}from"./DescriptionParser.js";import{parsePurpose as m}from"./PurposeParser.js";import{isFileImport as h,parseFileImport as g}from"./FileImportParser.js";import{recordAuthoredDocument as _}from"../Syntax/SourceOptions.js";import{collectInputUses as v}from"./InputUses.js";import{misplacedReactionIdentity as y}from"./ReactionIdentityParser.js";import{parseCanvasPair as b}from"./CanvasPlacement.js";import{parseEventSource as ee}from"./EventSourceParser.js";import{isFileDirective as x}from"./FileReferences.js";import{isBlankPublicEventOrigin as S}from"../Syntax/PublicEventInvariants.js";import{parseType as C}from"./DeclarationParsers.js";import{parseSystem as te}from"./OperationParser.js";import{parseExample as ne}from"./SpecificationExampleParser.js";import{parseValidate as w}from"./CommandParser.js";import{parseTriggerDeclaration as re}from"./TriggerDataParser.js";import{FeatureBody as T,featureBodyExpected as E}from"./FeatureBody.js";import{ModuleBody as ie,moduleBodyExpected as D,modulePattern as O,parseModule as ae}from"./ModuleBody.js";import{EnumerationMembers as k}from"./EnumerationMembers.js";import{parseGeneration as A}from"./GenerationParser.js";import{parseIdentity as oe}from"./IdentityParser.js";import{parsePolicy as j}from"./PolicyParser.js";import{parseSeed as M}from"./SeedParser.js";import{parseStateMachine as se}from"./StateMachineParser.js";import{parseWorkflow as ce}from"./WorkflowParser.js";import{parseExposure as le,parseInstance as ue}from"./CompositionParser.js";import{parseUiProfile as N}from"./UiProfileLegacyLayout.js";const P=r(`^domain\\s+([A-Za-z_]\\w*(?:\\.[A-Za-z_]\\w*)*)$`),de=r(`^time\\s+zone\\s+(configurable\\s+default\\s+)?"(${t})"$`),F=r(`^import\\s+([\\w.]+)(?:\\s+from\\s+"(?<origin>${t})")?$`),I=r(`^concept\\s+(\\w+)\\s*:\\s*(\\w+)((?:\\s+@?\\w+)*)$`),L=r(`^@?[a-z_]\\w*$`),R=r(`^persona\\s+([A-Za-z_]\\w*)$`),z=r(`^policy\\s+([A-Za-z_]\\w*)$`),B=r(`^goal\\s+"(${t})"$`),V=r(`^sticky\\s+note\\s+on\\s+(personas|eventsources|givencontexts|seeddata)$`),H=r(`^colour\\s+(yellow|pink|green|blue)$`),U=/^[ ]*\t/,W=[`Uuid`,`String`,`Int`,`Decimal`,`Bool`,`Date`,`DateTime`],G=/* @__PURE__ */ new Set([`policy`,`authentication`,`onboarding`,`seed`,`ui`,`theme`,`trigger`,`layout`,`behavior`,`sample`]),K=/* @__PURE__ */ new Set([`slice`,`feature`,`description`,`documentation`,`authorize`,`screen`,`dialog`,`form`,`contribute`,`on`,`uses`]);function parseApplication(t,r,a=d){t.deferIdentityValidation=!0,warnOnTabIndentation(t,r);let o=a.length===1?new ie(a[0]):void 0,s=a.length>1?new T(a[a.length-1]):void 0,l=o??s,u=null,p=null,b=!1,x=null,w=null,E=!1,D=!1,O=null,k=[],A=[],P=[],I=[],L=[],R=[],z=[],B=[],V=[],H=[],U=[],W=[],K=[],q=[],J=[],Y=[],X=[],Z=[],Q=!1;for(let r=t.reader.peekSignificant();r!==void 0;r=t.reader.peekSignificant()){t.reader.takeSignificant();let s=c(r.content);if(s===`command`&&/^command\s+reads(?:\s|$)/.test(r.content))D||!f(a)||!/^command\s+reads\s+protected$/.test(r.content)?t.error(e.InvalidCommandReadsDeclaration,`Declare 'command reads protected' once at the application root.`,i(r)):x=`Protected`,D=!0;else if(s===`time`&&/^time\s+zone(?:\s|$)/.test(r.content)){let o=de.exec(r.content);t.skipBlock(r.indent),E||!f(a)||o===null?t.error(e.InvalidTimeZoneDeclaration,`Declare 'time zone "<id>"' or 'time zone configurable default "<id>"' once at the application root.`,i(r)):w={kind:`TimeZoneSyntax`,id:n(o[2]),configurable:o[1]!==void 0,location:i(r)},E=!0}else if(s===`reaction`)b||!f(a)||!/^reaction\s+batches\s+atomic$/.test(r.content)?t.error(e.InvalidReactionBatchesDeclaration,`Declare 'reaction batches atomic' once at the application root.`,i(r)):p=`Atomic`,b=!0;else if(s===`runs`)y(t,r);else if(s===`domain`)t.authoredDeclarations=!0,O=parseDomain(t,r,O,Q);else if(Q||=declaresConstruct(s,r,a),t.authoredDeclarations||=s!==`import`&&declaresConstruct(s,r,a),s===`import`&&h(r.content))l===void 0?g(t,r,A):l.tryParse(t,r);else if(s===`import`){let a=F.exec(r.content);if(a===null)t.error(e.InvalidImportDeclaration,`Invalid import '${r.content}' - expected 'import <Qualified.Name> [from "<origin>"]'`,i(r));else{let o=a.groups?.origin===void 0?null:n(a.groups.origin);o!==null&&S(o)&&t.error(e.InvalidImportDeclaration,`An import origin must be a nonblank quoted string`,i(r)),k.push({kind:`ImportSyntax`,qualifiedName:a[1],origin:o,visibility:o===null?`Private`:`Public`,location:i(r)})}}else if(s===`example`)l===void 0?J.push(ne(t,r)):l.tryParse(t,r);else if(s===`eventsource`)B.push(ee(t,r));else if(s===`system`)L.push(te(t,r));else if(s===`statemachine`)R.push(se(t,r));else if(s===`workflow`)z.push(ce(t,r));else if(s===`concept`)P.push(parseConcept(t,r));else if(s===`type`)I.push(C(t,r));else if(s===`module`&&!f(a))parseModuleInPlacedFile(t,r,a,o);else if(s===`module`)V.push(ae(t,r));else if(s===`persona`)H.push(parsePersona(t,r));else if(s===`sticky`){let e=parseStickyNote(t,r);e!==null&&U.push(e)}else if(s===`seed`)q.push(M(t.valueContext,r));else if(s===`purpose`&&l!==void 0)l.tryParse(t,r);else if(s===`purpose`)K.push(m(t,r));else if(s===`identity`)u=oe(t,r,u);else if(s===`policy`){let n=j(t,r);W.some(e=>e.name===n.name)&&t.error(e.DuplicateDeclaration,`Duplicate declaration of policy '${n.name}' - policy names must be unique`,n.location),W.push(n)}else if(s===`exposure`)X.push(le(t,r));else if(s===`instance`)Z.push(ue(t,r));else if(s===`trigger`){let e=re(t,r),n=/^trigger\s+([A-Za-z_]\w*)$/.exec(r.content)?.[1];n!==void 0&&Y.push({name:n,data:e})}else G.has(s)?s===`behavior`||s===`layout`?v(t,r):s===`ui`?N(t,r):t.skipOpaqueBlock(r.indent):l?.tryParse(t,r)!==!0&&reportUnexpectedTopLevel(t,r,a)}o===void 0?s!==void 0&&V.unshift(place(a,s.build(t.start,!0),t.start)):V.unshift(o.build(t.start,!0));let $={kind:`ApplicationSyntax`,...x===null?{}:{commandReadMode:x},...w===null?{}:{timeZone:w},...p===null?{}:{reactionProductionMode:p},...u===null?{}:{identity:u},sourceOptions:t.sourceOptions,domain:O,imports:k,concepts:P,types:I,systems:L,...R.length>0?{stateMachines:R}:{},...z.length>0?{workflows:z}:{},eventSources:B,examples:J,modules:V,personas:H,policies:W,purposes:K,seeds:q,declaredTriggers:Y,fileImports:A,...X.length>0?{exposures:X}:{},...U.length>0?{stickyNotes:U}:{},...Z.length>0?{instanceContributions:Z}:{},location:t.start};return t.authoredDeclarations&&_($),$}function declaresConstruct(e,t,n){return e===`import`?F.test(t.content):e===`module`?f(n):e===`identity`?t.content===`identity`:e===`purpose`||e===`example`||e===`exposure`||e===`instance`||e===`eventsource`||e===`system`||e===`statemachine`||e===`workflow`||e===`concept`||e===`type`||e===`persona`||e===`sticky`||G.has(e)}function parseModuleInPlacedFile(t,n,r,a){let o=O.exec(n.content)?.[1]??``;a!==void 0&&o===r[0]?(t.authoredDeclarations=!0,a.parseChildren(t,n)):(t.error(e.ModuleInPlacedFile,`This file is imported into ${u(r)}, so it cannot declare module '${o}' - import it at the top level of a document instead`,i(n)),t.skipBlock(n.indent))}function reportUnexpectedTopLevel(t,n,r){let a=c(n.content);if(f(r)){let r=K.has(a)?` - '${a}' belongs in a module or feature; wrap it in one, or import this file from inside one`:` - expected domain, import, concept, type, policy, persona, sticky note, authentication, onboarding, identity, module, seed, trigger, behavior, ui profile, theme, sample data or layout`;t.error(e.UnknownTopLevelConstruct,`Unexpected '${a}' at the top level${r}`,i(n))}else{let o=r.length===1?D:E;t.error(e.UnexpectedInPlacedFile,`Unexpected '${a}' in a file imported into ${u(r)} - expected an application declaration or ${o}`,i(n))}t.skipBlock(n.indent)}function place(e,t,n){let r=t;for(let t=e.length-2;t>=1;t--)r={kind:`FeatureSyntax`,name:e[t],description:null,authorize:null,features:[r],slices:[],fileImports:[],isPlacement:!0,location:n};return{kind:`ModuleSyntax`,name:e[0],description:null,authorize:null,features:[r],fileImports:[],isPlacement:!0,location:n}}function parseDomain(t,n,r,a){let o=P.exec(n.content);return o===null?(t.error(e.InvalidDomainDeclaration,`Invalid domain declaration '${n.content}' - expected 'domain <Qualified.Name>'`,i(n)),r):r===null?(a&&t.error(e.DomainNotFirst,`'domain' must be declared before any other construct`,i(n)),{kind:`DomainSyntax`,name:o[1],location:i(n)}):(t.error(e.DuplicateDomain,`The document already declares a domain - a document can have at most one`,i(n)),r)}function warnOnTabIndentation(t,n){let r=!1;for(let i of n)i.raw.trimStart().startsWith("```")?r=!r:!r&&U.test(i.raw)&&t.warning(e.TabIndentation,`Screenplay is indentation based - use spaces, not tabs`,a(i))}function parseConcept(t,n){let r=I.exec(n.content);if(r===null)return t.error(e.InvalidConceptDeclaration,`Invalid concept declaration '${n.content}' - expected 'concept <Name> : <Type>'`,i(n)),t.skipBlock(n.indent),{kind:`ConceptSyntax`,name:c(n.content),type:``,attributes:[],values:[],location:i(n)};let[,a,u,d]=r,f=s(t,n,a,d);u!==`Enum`&&!W.includes(u)&&t.error(e.UnknownPrimitiveType,`Unknown primitive type '${u}' - expected ${W.join(`, `)} or Enum`,i(n));let m=[],h=new k,g=null,_=!1,v=null,y=[];for(let r=t.peekChild(n.indent);r!==void 0;r=t.peekChild(n.indent)){t.reader.takeSignificant();let n=u===`Enum`?h.tryNumbered(t,r):void 0;if(n!==void 0)m.push(n);else if(c(r.content)===`description`&&(u!==`Enum`||r.content!==`description`||t.peekChild(r.indent)?.content.startsWith("```")===!0))v=p(t,r,v,`Concept '${a}'`);else if(x(r))continue;else if(c(r.content)===`validate`){u===`Enum`&&r.content===`validate`&&t.peekChild(r.indent)===void 0&&t.warning(e.ValidateReadAsEnumerationBlock,`'validate' in enumeration concept '${a}' declares an empty validate block, not a value named 'validate' - write '@validate' for the value`,i(r));let n=w(t,r,`concept`,a);n!==void 0&&y.push(n)}else if(c(r.content)===`generate`&&(u!==`Enum`||r.content!==`generate`)){_&&t.error(e.DuplicateGeneration,`Concept '${a}' declares generation more than once.`,i(r));let n=A(t,r,u);_||(g=n),_=!0}else o(t,r,a,f)||(u===`Enum`&&L.test(r.content)?m.push(l(r.content)):u===`Enum`?t.error(e.InvalidEnumerationValue,`Invalid enum value '${r.content}' - expected an identifier`,i(r)):(t.error(e.UnknownConceptDirective,`Unexpected '${r.content}' in concept body - expected validate, generate, 'file <path>' or '<attribute> reason "<text>"'`,i(r)),t.skipBlock(r.indent)))}let b=h.finish(t,n,m.length);return{kind:`ConceptSyntax`,name:a,type:u,attributes:f,values:m,validations:y,description:v,...g===null?{}:{generation:g},...b===void 0?{}:{valueNumbers:b},location:i(n)}}function parsePersona(t,r){let a=R.exec(r.content)?.[1]??``;a===``&&t.error(e.InvalidPersonaDeclaration,`Invalid persona declaration '${r.content}' - expected 'persona <Name>'`,i(r));let o=null,s=[],l=[],u=null,d=null;for(let f=t.peekChild(r.indent);f!==void 0;f=t.peekChild(r.indent)){t.reader.takeSignificant();let r=c(f.content);if(r===`description`)o=p(t,f,o,`Persona '${a}'`);else if(r===`goal`){let r=B.exec(f.content);r===null?t.error(e.InvalidPersonaDeclaration,`Invalid goal '${f.content}' - expected 'goal "<text>"'`,i(f)):l.push(n(r[1]))}else if(r===`position`)u=b(t,f,`position`,`x`,`y`,u,!0)??u;else if(r===`size`)d=b(t,f,`size`,`width`,`height`,d,!1)??d;else if(r===`policy`){let n=z.exec(f.content);n===null?t.error(e.InvalidPersonaPolicyReference,`Invalid policy reference '${f.content}' - expected 'policy <Name>'`,i(f)):s.push(n[1])}else t.error(e.UnknownPersonaDirective,`Unexpected '${r}' in persona body - expected description, goal, policy, position or size`,i(f)),t.skipBlock(f.indent)}return{kind:`PersonaSyntax`,name:a,description:o,policies:s,...l.length>0?{goals:l}:{},...u===null?{}:{x:u[0],y:u[1]},...d===null?{}:{width:d[0],height:d[1]},location:i(r)}}function parseStickyNote(t,n){let r=V.exec(n.content);if(r===null)return t.error(e.InvalidPersonaDeclaration,`Invalid sticky note declaration '${n.content}' - expected 'sticky note on personas', 'sticky note on eventsources', 'sticky note on givencontexts' or 'sticky note on seeddata'`,i(n)),t.skipBlock(n.indent),null;let a=null,o=null,s=null,l=null;for(let r=t.peekChild(n.indent);r!==void 0;r=t.peekChild(n.indent)){t.reader.takeSignificant();let n=c(r.content);if(n===`description`)a=p(t,r,a,`A sticky note`);else if(n===`colour`){let n=H.exec(r.content);n===null?t.error(e.InvalidPersonaDeclaration,`Invalid colour '${r.content}' - expected 'colour yellow', 'colour pink', 'colour green' or 'colour blue'`,i(r)):o=n[1]}else n===`position`?s=b(t,r,`position`,`x`,`y`,s,!0)??s:n===`size`?l=b(t,r,`size`,`width`,`height`,l,!1)??l:(t.error(e.UnknownPersonaDirective,`Unexpected '${n}' in sticky note body - expected description, colour, position or size`,i(r)),t.skipBlock(r.indent))}return a===null||s===null?(t.error(e.InvalidPersonaDeclaration,`A sticky note needs a description (the text on it) and a position`,i(n)),null):{kind:`StickyNoteSyntax`,canvas:r[1],text:a,colour:o,x:s[0],y:s[1],width:l===null?null:l[0],height:l===null?null:l[1],location:i(n)}}export{parseApplication};
|
|
2
2
|
//# sourceMappingURL=ScreenplayParser.js.map
|
|
@@ -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', '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
|
+
{"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","stateMachines","workflows","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","parseStateMachine","parseWorkflow","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 { parseStateMachine } from './StateMachineParser';\nimport { parseWorkflow } from './WorkflowParser';\nimport { StateMachineSyntax, WorkflowSyntax } from '../Syntax/Lifecycles';\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 stateMachines: StateMachineSyntax[] = [];\n const workflows: WorkflowSyntax[] = [];\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 === 'statemachine') {\n stateMachines.push(parseStateMachine(context, line));\n } else if (keyword === 'workflow') {\n workflows.push(parseWorkflow(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, ...(stateMachines.length > 0 ? { stateMachines } : {}), ...(workflows.length > 0 ? { workflows } : {}), 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 === 'statemachine' || keyword === 'workflow' || 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":"goEAyDA,MAAMA,EAAgBC,EAAQ,kDAAkD,EAC1EC,GAAkBD,EAAQ,oDAAoDE,EAAkB,IAAI,EACpGC,EAAgBH,EAAQ,iDAAiDE,EAAkB,MAAM,EACjGE,EAAiBJ,EAAQ,qDAAqD,EAC9EK,EAAmBL,EAAQ,gBAAgB,EAC3CM,EAAiBN,EAAQ,8BAA8B,EACvDO,EAAuBP,EAAQ,6BAA6B,EAC5DQ,EAAqBR,EAAQ,cAAcE,EAAkB,IAAI,EACjEO,EAAoBT,EAAQ,0EAA0E,EACtGU,EAA0BV,EAAQ,sCAAsC,EACxEW,EAAmB,UACnBC,EAAiB,CAAC,OAAQ,SAAU,MAAO,UAAW,OAAQ,OAAQ,UAAU,EAIhFC,kBAAiB,IAAI,IAAI,CAAC,SAAU,iBAAkB,aAAc,OAAQ,KAAM,QAAS,UAAW,SAAU,WAAY,QAAQ,CAAC,EAGrIC,kBAAe,IAAI,IAAI,CAAC,QAAS,UAAW,cAAe,gBAAiB,YAAa,SAAU,SAAU,OAAQ,aAAc,KAAM,MAAM,CAAC,EAItJ,SAAgB,iBAAiB,EAAwB,EAA8B,EAA2BC,EAAsC,CACpJ,EAAQ,wBAA0B,GAClC,qBAAqBC,EAASC,CAAK,EACnC,IAAMC,EAAaC,EAAU,SAAW,EAAI,IAAIC,GAAWD,EAAU,EAAE,EAAI,IAAA,GACrEE,EAAcF,EAAU,OAAS,EAAI,IAAIG,EAAYH,EAAUA,EAAU,OAAS,EAAE,EAAI,IAAA,GACxFI,EAAaL,GAAcG,EAC7BG,EAAkC,KAClCC,EAAwD,KACxDC,EAAqB,GACrBC,EAA0C,KAC1CC,EAAkC,KAClCC,EAAc,GACdC,EAAkB,GAClBC,EAA8B,KAC5BC,EAA0B,CAAC,EAC3BC,EAAkC,CAAC,EACnCC,EAA4B,CAAC,EAC7BC,EAAsB,CAAC,EACvBC,EAA0B,CAAC,EAC3BC,EAAsC,CAAC,EACvCC,EAA8B,CAAC,EAC/BC,EAAoC,CAAC,EACrCC,EAA0B,CAAC,EAC3BC,EAA4B,CAAC,EAC7BC,EAAkC,CAAC,EACnCC,EAA2B,CAAC,EAC5BC,EAA4B,CAAC,EAC7BC,EAAsB,CAAC,EACvBC,EAAyC,CAAC,EAC1CC,EAAiF,CAAC,EAClFC,EAA8B,CAAC,EAC/BC,EAAuD,CAAC,EAC1DC,EAAoB,GACxB,IAAK,IAAIC,EAAOnC,EAAQ,OAAO,gBAAgB,EAAGmC,IAAS,IAAA,GAAW,EAAOnC,EAAQ,OAAO,gBAAgB,EAAG,CAC3GA,EAAQ,OAAO,gBAAgB,EAC/B,IAAMoC,EAAUC,EAAUF,EAAK,OAAO,EACtC,GAAIC,IAAY,WAAa,2BAA2B,KAAKD,EAAK,OAAO,EACjErB,GAAmB,CAACwB,EAAoBnC,CAAS,GAAK,CAAC,gCAAgC,KAAKgC,EAAK,OAAO,EACxGnC,EAAQ,MAAMuC,EAAgB,+BAAgC,kEAAmEC,EAAWL,CAAI,CAAC,EAEjJ,EAAA,YAEJ,EAAkB,QAGtB,GAAIC,IAAY,QAAU,uBAAuB,KAAKD,EAAK,OAAO,EAAG,CACjE,IAAMM,EAAQxD,GAAgB,KAAKkD,EAAK,OAAO,EAC/CnC,EAAQ,UAAUmC,EAAK,MAAM,EACzBtB,GAAe,CAACyB,EAAoBnC,CAAS,GAAKsC,IAAU,KAC5DzC,EAAQ,MAAMuC,EAAgB,2BAA4B,sGAA2GC,EAAWL,CAAI,CAAC,EAErL,EAAW,CAAE,KAAM,iBAAkB,GAAIO,EAAeD,EAAM,EAAE,EAAG,aAAcA,EAAM,KAAO,IAAA,GAAW,SAAUD,EAAWL,CAAI,CAAE,EAExI,EAAc,EAElB,MACA,GAAIC,IAAY,WACR1B,GAAsB,CAAC4B,EAAoBnC,CAAS,GAAK,CAAC,gCAAgC,KAAKgC,EAAK,OAAO,EAC3GnC,EAAQ,MAAMuC,EAAgB,kCAAmC,kEAAmEC,EAAWL,CAAI,CAAC,EAEpJ,EAAA,SAEJ,EAAqB,QAGzB,GAAIC,IAAY,OACZO,EAA0B3C,EAASmC,CAAI,OAG3C,GAAIC,IAAY,SACZ,EAAQ,qBAAuB,GAC/B,EAAS,YAAYpC,EAASmC,EAAMpB,EAAQmB,CAAiB,OAOjE,GAFA,IAAsB,kBAAkBE,EAASD,EAAMhC,CAAS,EAChE,EAAQ,uBAAyBiC,IAAY,UAAY,kBAAkBA,EAASD,EAAMhC,CAAS,EAC/FiC,IAAY,UAAYQ,EAAaT,EAAK,OAAO,EAG7C5B,IAAe,IAAA,GAGfsC,EAAgB7C,EAASmC,EAAMlB,CAAW,EAF1CV,EAAW,SAASP,EAASmC,CAAI,OAIlC,GAAIC,IAAY,SAAU,CAC7B,IAAMK,EAAQtD,EAAc,KAAKgD,EAAK,OAAO,EAC7C,GAAIM,IAAU,KACVzC,EAAQ,MAAMuC,EAAgB,yBAA0B,mBAAmBJ,EAAK,QAAQ,0DAA2DK,EAAWL,CAAI,CAAC,MAChK,CACH,IAAMW,EAASL,EAAM,QAAQ,SAAW,IAAA,GAAY,KAAOC,EAAeD,EAAM,OAAO,MAAM,EACzFK,IAAW,MAAQC,EAAyBD,CAAM,GAClD9C,EAAQ,MAAMuC,EAAgB,yBAA0B,oDAAqDC,EAAWL,CAAI,CAAC,EAEjInB,EAAQ,KAAK,CAAE,KAAM,eAAgB,cAAeyB,EAAM,GAAI,SAAQ,WAAYK,IAAW,KAAA,UAAA,SAAyD,SAAUN,EAAWL,CAAI,CAAE,CAAC,CACtL,CACJ,MAAO,GAAIC,IAAY,UACf7B,IAAe,IAAA,GACduB,EAAS,KAAKkB,GAAahD,EAASmC,CAAI,CAAC,EADhB5B,EAAW,SAASP,EAASmC,CAAI,OAE5D,GAAIC,IAAY,cACnBb,EAAa,KAAK0B,GAAiBjD,EAASmC,CAAI,CAAC,OAC9C,GAAIC,IAAY,SACnBhB,EAAQ,KAAK8B,GAAYlD,EAASmC,CAAI,CAAC,OACpC,GAAIC,IAAY,eACnBf,EAAc,KAAK8B,GAAkBnD,EAASmC,CAAI,CAAC,OAChD,GAAIC,IAAY,WACnBd,EAAU,KAAK8B,GAAcpD,EAASmC,CAAI,CAAC,OACxC,GAAIC,IAAY,UACnBlB,EAAS,KAAK,aAAalB,EAASmC,CAAI,CAAC,OACtC,GAAIC,IAAY,OACnBjB,EAAM,KAAKkC,EAAUrD,EAASmC,CAAI,CAAC,OAChC,GAAIC,IAAY,UAAY,CAACE,EAAoBnC,CAAS,EAC7D,wBAAwBH,EAASmC,EAAMhC,EAAWD,CAAU,OACzD,GAAIkC,IAAY,SACnBZ,EAAQ,KAAK8B,GAAYtD,EAASmC,CAAI,CAAC,OACpC,GAAIC,IAAY,UACnBX,EAAS,KAAK,aAAazB,EAASmC,CAAI,CAAC,OACtC,GAAIC,IAAY,SAAU,CAC7B,IAAMmB,EAAa,gBAAgBvD,EAASmC,CAAI,EAC5CoB,IAAe,MAAM7B,EAAY,KAAK6B,CAAU,CACxD,MAAO,GAAInB,IAAY,OACnBP,EAAM,KAAK2B,EAAUxD,EAAQ,aAAcmC,CAAI,CAAC,OAC7C,GAAIC,IAAY,WAAa7B,IAAe,IAAA,GAC/CA,EAAW,SAASP,EAASmC,CAAI,OAC9B,GAAIC,IAAY,UACnBR,EAAS,KAAK6B,EAAazD,EAASmC,CAAI,CAAC,OACtC,GAAIC,IAAY,WACnB,EAAWsB,GAAc1D,EAASmC,EAAM3B,CAAQ,OAC7C,GAAI4B,IAAY,SAAU,CAC7B,IAAMuB,EAASC,EAAY5D,EAASmC,CAAI,EACpCR,EAAS,KAAK,GAAYkC,EAAS,OAASF,EAAO,IAAI,GACvD3D,EAAQ,MAAMuC,EAAgB,qBAAsB,oCAAoCoB,EAAO,KAAK,iCAAkCA,EAAO,QAAQ,EAEzJhC,EAAS,KAAKgC,CAAM,CACxB,MAAO,GAAIvB,IAAY,WACnBJ,EAAU,KAAK8B,GAAc9D,EAASmC,CAAI,CAAC,OACxC,GAAIC,IAAY,WACnBH,EAAsB,KAAK8B,GAAc/D,EAASmC,CAAI,CAAC,OACpD,GAAIC,IAAY,UAAW,CAC9B,IAAM4B,EAAOC,GAAwBjE,EAASmC,CAAI,EAC5C+B,EAAO,6BAA6B,KAAK/B,EAAK,OAAO,CAAC,GAAG,GAC3D+B,IAAS,IAAA,IAAWnC,EAAiB,KAAK,CAAE,OAAM,MAAK,CAAC,CAChE,MAAWlC,EAAe,IAAIuC,CAAO,EAC7BA,IAAY,YAAcA,IAAY,SAAU+B,EAAiBnE,EAASmC,CAAI,EACzEC,IAAY,KAAMgC,EAAepE,EAASmC,CAAI,EAClDnC,EAAQ,gBAAgBmC,EAAK,MAAM,EACjC5B,GAAY,SAASP,EAASmC,CAAI,IAAM,IAC/C,yBAAyBnC,EAASmC,EAAMhC,CAAS,CAEzD,CACID,IAAe,IAAA,GAERG,IAAgB,IAAA,IACvBmB,EAAQ,QAAQ,MAAMrB,EAAWE,EAAY,MAAML,EAAQ,MAAO,EAAI,EAAGA,EAAQ,KAAK,CAAC,EAFvFwB,EAAQ,QAAQtB,EAAW,MAAMF,EAAQ,MAAO,EAAI,CAAC,EAIzD,IAAMqE,EAA0B,CAAE,KAAM,oBAAqB,GAAI1D,IAAoB,KAAO,CAAC,EAAI,CAAE,iBAAgB,EAAI,GAAIC,IAAa,KAAO,CAAC,EAAI,CAAE,UAAS,EAAI,GAAIH,IAA2B,KAAO,CAAC,EAAI,CAAE,wBAAuB,EAAI,GAAID,IAAa,KAAO,CAAC,EAAI,CAAE,UAAS,EAAI,cAAeR,EAAQ,cAAe,SAAQ,UAAS,WAAU,QAAO,UAAS,GAAIqB,EAAc,OAAS,EAAI,CAAE,eAAc,EAAI,CAAC,EAAI,GAAIC,EAAU,OAAS,EAAI,CAAE,WAAU,EAAI,CAAC,EAAI,eAAc,WAAU,UAAS,WAAU,WAAU,WAAU,QAAO,mBAAkB,cAAa,GAAIU,EAAU,OAAS,EAAI,CAAE,WAAU,EAAI,CAAC,EAAI,GAAIN,EAAY,OAAS,EAAI,CAAE,aAAY,EAAI,CAAC,EAAI,GAAIO,EAAsB,OAAS,EAAI,CAAE,uBAAsB,EAAI,CAAC,EAAI,SAAUjC,EAAQ,KAAM,EAEzvB,OADIA,EAAQ,sBAAsBsE,EAAuBD,CAAI,EACtDA,CACX,CAEA,SAAS,kBAAkB,EAAiB,EAAkB,EAAmC,CAQ7F,OAPIjC,IAAY,SACLjD,EAAc,KAAKgD,EAAK,OAAO,EAEtCC,IAAY,SACLE,EAAoBnC,CAAS,EAEpCiC,IAAY,WAAmBD,EAAK,UAAY,WAC7CC,IAAY,WAAaA,IAAY,WAAaA,IAAY,YAAcA,IAAY,YAAcA,IAAY,eAAiBA,IAAY,UAAYA,IAAY,gBAAkBA,IAAY,YAAcA,IAAY,WAAaA,IAAY,QAAUA,IAAY,WAAaA,IAAY,UAAYvC,EAAe,IAAIuC,CAAO,CACxV,CAEA,SAAS,wBAAwB,EAAwB,EAAkB,EAA0B,EAA0C,CAC3I,IAAM8B,EAAOK,EAAc,KAAKpC,EAAK,OAAO,CAAC,GAAG,IAAM,GAGlDjC,IAAe,IAAA,IAAagE,IAAS/D,EAAU,IAC/C,EAAQ,qBAAuB,GAC/BD,EAAW,cAAcF,EAASmC,CAAI,IAG1CnC,EAAQ,MAAMuC,EAAgB,mBAC1B,8BAA8BiC,EAAkBrE,CAAS,EAAE,iCAAiC+D,EAAK,sDAAuD1B,EAAWL,CAAI,CAAC,EAC5KnC,EAAQ,UAAUmC,EAAK,MAAM,EACjC,CAEA,SAAS,yBAAyB,EAAwB,EAAkB,EAAgC,CACxG,IAAMsC,EAAOpC,EAAUF,EAAK,OAAO,EACnC,GAAKG,EAAoBnC,CAAS,EAI3B,CACH,IAAMuE,EAAO5E,EAAa,IAAI2E,CAAI,EAC5B,OAAOA,EAAK,uFACZ,2LACNzE,EAAQ,MAAMuC,EAAgB,yBAA0B,eAAekC,EAAK,oBAAoBC,IAAQlC,EAAWL,CAAI,CAAC,CAC5H,KATqC,CACjC,IAAMwC,EAAWxE,EAAU,SAAW,EAAIyE,EAAqBC,EAC/D7E,EAAQ,MAAMuC,EAAgB,uBAC1B,eAAekC,EAAK,4BAA4BD,EAAkBrE,CAAS,EAAE,4CAA4CwE,IAAYnC,EAAWL,CAAI,CAAC,CAC7J,CAMAnC,EAAQ,UAAUmC,EAAK,MAAM,CACjC,CAGA,SAAS,MAAM,EAA0B,EAA0B,EAAqC,CACpG,IAAI2C,EAAUC,EACd,IAAK,IAAIC,EAAQ7E,EAAU,OAAS,EAAG6E,GAAS,EAAG,IAC/C,EAAU,CACN,KAAM,gBAAiB,KAAM7E,EAAU6E,GAAQ,YAAa,KAAM,UAAW,KAC7E,SAAU,CAACF,CAAO,EAAG,OAAQ,CAAC,EAAG,YAAa,CAAC,EAAG,YAAa,GAAM,SAAUG,CACnF,EAEJ,MAAO,CACH,KAAM,eAAgB,KAAM9E,EAAU,GAAI,YAAa,KAAM,UAAW,KACxE,SAAU,CAAC2E,CAAO,EAAG,YAAa,CAAC,EAAG,YAAa,GAAM,SAAUG,CACvE,CACJ,CAEA,SAAS,YAAY,EAAwB,EAAkB,EAA+B,EAAiD,CAC3I,IAAMxC,EAAQ1D,EAAc,KAAKoD,EAAK,OAAO,EAY7C,OAXIM,IAAU,MACVzC,EAAQ,MAAMuC,EAAgB,yBAA0B,+BAA+BJ,EAAK,QAAQ,wCAAyCK,EAAWL,CAAI,CAAC,EACtJ+C,GAEPA,IAAa,MAIbhD,GACAlC,EAAQ,MAAMuC,EAAgB,eAAgB,uDAA0DC,EAAWL,CAAI,CAAC,EAErH,CAAE,KAAM,eAAgB,KAAMM,EAAM,GAAI,SAAUD,EAAWL,CAAI,CAAE,IANtEnC,EAAQ,MAAMuC,EAAgB,gBAAiB,2EAA4EC,EAAWL,CAAI,CAAC,EACpI+C,EAMf,CAEA,SAAS,qBAAqB,EAAwB,EAAoC,CACtF,IAAIC,EAAU,GACd,IAAK,IAAMhD,KAAQlC,EACXkC,EAAK,IAAI,UAAU,CAAC,CAAC,WAAW,KAAK,EACrC,EAAU,CAACgD,EAGX,CAACA,GAAWxF,EAAiB,KAAKwC,EAAK,GAAG,GAC1CnC,EAAQ,QAAQuC,EAAgB,eAAgB,yDAA0D6C,EAAQjD,CAAI,CAAC,CAGnI,CAEA,SAAS,aAAa,EAAwB,EAAiC,CAC3E,IAAMM,EAAQrD,EAAe,KAAK+C,EAAK,OAAO,EAC9C,GAAIM,IAAU,KAGV,OAFAzC,EAAQ,MAAMuC,EAAgB,0BAA2B,gCAAgCJ,EAAK,QAAQ,wCAAyCK,EAAWL,CAAI,CAAC,EAC/JnC,EAAQ,UAAUmC,EAAK,MAAM,EACtB,CAAE,KAAM,gBAAiB,KAAME,EAAUF,EAAK,OAAO,EAAG,KAAM,GAAI,WAAY,CAAC,EAAG,OAAQ,CAAC,EAAG,SAAUK,EAAWL,CAAI,CAAE,EAEpI,GAAM,EAAG+B,EAAMmB,EAAMC,GAAiB7C,EAChC8C,EAAaC,EAAuBxF,EAASmC,EAAM+B,EAAMoB,CAAa,EACxED,IAAS,QAAU,CAACzF,EAAe,SAASyF,CAAI,GAChDrF,EAAQ,MAAMuC,EAAgB,qBAAsB,2BAA2B8C,EAAK,eAAezF,EAAe,KAAK,IAAI,EAAE,UAAW4C,EAAWL,CAAI,CAAC,EAE5J,IAAMsD,EAAmB,CAAC,EACpBC,EAAU,IAAIC,EAChBC,EAAsC,KACtCC,EAAqB,GACrBC,EAA6B,KAC3BC,EAAgC,CAAC,EACvC,IAAK,IAAIC,EAAQhG,EAAQ,UAAUmC,EAAK,MAAM,EAAG6D,IAAU,IAAA,GAAW,EAAQhG,EAAQ,UAAUmC,EAAK,MAAM,EAAG,CAC1GnC,EAAQ,OAAO,gBAAgB,EAC/B,IAAMiG,EAAaZ,IAAS,OAASK,EAAQ,YAAY1F,EAASgG,CAAK,EAAI,IAAA,GAC3E,GAAIC,IAAe,IAAA,GACfR,EAAO,KAAKQ,CAAU,OACnB,GAAI5D,EAAU2D,EAAM,OAAO,IAAM,gBAAkBX,IAAS,QAAUW,EAAM,UAAY,eAAiBhG,EAAQ,UAAUgG,EAAM,MAAM,CAAC,EAAE,QAAQ,WAAW,KAAK,IAAM,IAC3K,EAAcE,EAAiBlG,EAASgG,EAAOF,EAAa,YAAY5B,EAAK,EAAE,OAC5E,GAAIiC,EAAgBH,CAAK,EAC5B,cACG,GAAI3D,EAAU2D,EAAM,OAAO,IAAM,WAAY,CAC5CX,IAAS,QAAUW,EAAM,UAAY,YAAchG,EAAQ,UAAUgG,EAAM,MAAM,IAAM,IAAA,IACvFhG,EAAQ,QAAQuC,EAAgB,+BAC5B,sCAAsC2B,EAAK,oGAC3C1B,EAAWwD,CAAK,CAAC,EAEzB,IAAMI,EAASC,EAAcrG,EAASgG,EAAO,UAAW9B,CAAI,EACxDkC,IAAW,IAAA,IAAWL,EAAY,KAAKK,CAAM,CACrD,MAAO,GAAI/D,EAAU2D,EAAM,OAAO,IAAM,aAAgBX,IAAS,QAAUW,EAAM,UAAY,YAAa,CAClGH,GAAoB7F,EAAQ,MAAMuC,EAAgB,oBAAqB,YAAY2B,EAAK,uCAAwC1B,EAAWwD,CAAK,CAAC,EACrJ,IAAMI,EAASE,EAAgBtG,EAASgG,EAAOX,CAAI,EAC9CQ,IAAoB,EAAaO,GACtC,EAAqB,EACzB,MAAWG,EAAyBvG,EAASgG,EAAO9B,EAAMqB,CAAU,IAEzDF,IAAS,QAAUhG,EAAiB,KAAK2G,EAAM,OAAO,EAC7DP,EAAO,KAAKe,EAAmBR,EAAM,OAAO,CAAC,EACtCX,IAAS,OAChBrF,EAAQ,MAAMuC,EAAgB,wBAAyB,uBAAuByD,EAAM,QAAQ,4BAA6BxD,EAAWwD,CAAK,CAAC,GAE1IhG,EAAQ,MAAMuC,EAAgB,wBAAyB,eAAeyD,EAAM,QAAQ,iGAAkGxD,EAAWwD,CAAK,CAAC,EACvMhG,EAAQ,UAAUgG,EAAM,MAAM,GAEtC,CACA,IAAMS,EAAef,EAAQ,OAAO1F,EAASmC,EAAMsD,EAAO,MAAM,EAChE,MAAO,CAAE,KAAM,gBAAiB,OAAM,OAAM,aAAY,SAAQ,cAAa,cAAa,GAAIG,IAAe,KAAO,CAAC,EAAI,CAAE,YAAW,EAAI,GAAIa,IAAiB,IAAA,GAAY,CAAC,EAAI,CAAE,cAAa,EAAI,SAAUjE,EAAWL,CAAI,CAAE,CAClO,CAGA,SAAS,aAAa,EAAwB,EAAiC,CAC3E,IAAM+B,EAAO5E,EAAe,KAAK6C,EAAK,OAAO,CAAC,GAAG,IAAM,GACnD+B,IAAS,IACTlE,EAAQ,MAAMuC,EAAgB,0BAA2B,gCAAgCJ,EAAK,QAAQ,+BAAgCK,EAAWL,CAAI,CAAC,EAE1J,IAAI2D,EAA6B,KAC3BnE,EAAqB,CAAC,EACtB+E,EAAkB,CAAC,EACrBC,EAA6C,KAC7CC,EAAyC,KAC7C,IAAK,IAAIZ,EAAQhG,EAAQ,UAAUmC,EAAK,MAAM,EAAG6D,IAAU,IAAA,GAAW,EAAQhG,EAAQ,UAAUmC,EAAK,MAAM,EAAG,CAC1GnC,EAAQ,OAAO,gBAAgB,EAC/B,IAAMoC,EAAUC,EAAU2D,EAAM,OAAO,EACvC,GAAI5D,IAAY,cACZ,EAAc8D,EAAiBlG,EAASgG,EAAOF,EAAa,YAAY5B,EAAK,EAAE,OAC5E,GAAI9B,IAAY,OAAQ,CAC3B,IAAMyE,EAAOrH,EAAmB,KAAKwG,EAAM,OAAO,EAC9Ca,IAAS,KACT7G,EAAQ,MAAMuC,EAAgB,0BAA2B,iBAAiByD,EAAM,QAAQ,8BAA+BxD,EAAWwD,CAAK,CAAC,EAExIU,EAAM,KAAKhE,EAAemE,EAAK,EAAE,CAAC,CAE1C,MAAO,GAAIzE,IAAY,WACnB,EAAW0E,EAAgB9G,EAASgG,EAAO,WAAY,IAAK,IAAKW,EAAU,EAAI,GAAKA,OACjF,GAAIvE,IAAY,OACnB,EAAO0E,EAAgB9G,EAASgG,EAAO,OAAQ,QAAS,SAAUY,EAAM,EAAK,GAAKA,OAC/E,GAAIxE,IAAY,SAAU,CAC7B,IAAMuB,EAASpE,EAAqB,KAAKyG,EAAM,OAAO,EAClDrC,IAAW,KACX3D,EAAQ,MAAMuC,EAAgB,8BAA+B,6BAA6ByD,EAAM,QAAQ,8BAA+BxD,EAAWwD,CAAK,CAAC,EAExJrE,EAAS,KAAKgC,EAAO,EAAE,CAE/B,MACI3D,EAAQ,MAAMuC,EAAgB,wBAAyB,eAAeH,EAAQ,0EAA2EI,EAAWwD,CAAK,CAAC,EAC1KhG,EAAQ,UAAUgG,EAAM,MAAM,CAEtC,CACA,MAAO,CACH,KAAM,gBAAiB,OAAM,cAAa,WAC1C,GAAIU,EAAM,OAAS,EAAI,CAAE,OAAM,EAAI,CAAC,EACpC,GAAIC,IAAa,KAAO,CAAC,EAAI,CAAE,EAAGA,EAAS,GAAI,EAAGA,EAAS,EAAG,EAC9D,GAAIC,IAAS,KAAO,CAAC,EAAI,CAAE,MAAOA,EAAK,GAAI,OAAQA,EAAK,EAAG,EAC3D,SAAUpE,EAAWL,CAAI,CAC7B,CACJ,CAGA,SAAS,gBAAgB,EAAwB,EAA2C,CACxF,IAAM4E,EAActH,EAAkB,KAAK0C,EAAK,OAAO,EACvD,GAAI4E,IAAgB,KAGhB,OAFA/G,EAAQ,MAAMuC,EAAgB,0BAA2B,oCAAoCJ,EAAK,QAAQ,oIAAqIK,EAAWL,CAAI,CAAC,EAC/PnC,EAAQ,UAAUmC,EAAK,MAAM,EACtB,KAEX,IAAI6E,EAAsB,KACtBC,EAAwB,KACxBN,EAA6C,KAC7CC,EAAyC,KAC7C,IAAK,IAAIZ,EAAQhG,EAAQ,UAAUmC,EAAK,MAAM,EAAG6D,IAAU,IAAA,GAAW,EAAQhG,EAAQ,UAAUmC,EAAK,MAAM,EAAG,CAC1GnC,EAAQ,OAAO,gBAAgB,EAC/B,IAAMoC,EAAUC,EAAU2D,EAAM,OAAO,EACvC,GAAI5D,IAAY,cACZ,EAAO8D,EAAiBlG,EAASgG,EAAOgB,EAAM,eAAe,OAC1D,GAAI5E,IAAY,SAAU,CAC7B,IAAMK,EAAQ/C,EAAwB,KAAKsG,EAAM,OAAO,EACpDvD,IAAU,KACVzC,EAAQ,MAAMuC,EAAgB,0BAA2B,mBAAmByD,EAAM,QAAQ,8EAA+ExD,EAAWwD,CAAK,CAAC,EAE1L,EAASvD,EAAM,EAEvB,MAAWL,IAAY,WACnB,EAAW0E,EAAgB9G,EAASgG,EAAO,WAAY,IAAK,IAAKW,EAAU,EAAI,GAAKA,EAC7EvE,IAAY,OACnB,EAAO0E,EAAgB9G,EAASgG,EAAO,OAAQ,QAAS,SAAUY,EAAM,EAAK,GAAKA,GAElF5G,EAAQ,MAAMuC,EAAgB,wBAAyB,eAAeH,EAAQ,wEAAyEI,EAAWwD,CAAK,CAAC,EACxKhG,EAAQ,UAAUgG,EAAM,MAAM,EAEtC,CAKA,OAJIgB,IAAS,MAAQL,IAAa,MAC9B3G,EAAQ,MAAMuC,EAAgB,0BAA2B,oEAAqEC,EAAWL,CAAI,CAAC,EACvI,MAEJ,CAAE,KAAM,mBAAoB,OAAQ4E,EAAY,GAAkC,OAAM,SAAQ,EAAGJ,EAAS,GAAI,EAAGA,EAAS,GAAI,MAAOC,IAAS,KAAO,KAAOA,EAAK,GAAI,OAAQA,IAAS,KAAO,KAAOA,EAAK,GAAI,SAAUpE,EAAWL,CAAI,CAAE,CACrP"}
|
|
@@ -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
|