@cratis/screenplay-language 4.238.0 → 4.240.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.
Files changed (28) hide show
  1. package/dist/bundles/compiler/Files/PlayFolderMerge.js +1 -1
  2. package/dist/bundles/compiler/Files/PlayFolderMerge.js.map +1 -1
  3. package/dist/bundles/compiler/Parsing/CanvasPlacement.js +2 -0
  4. package/dist/bundles/compiler/Parsing/CanvasPlacement.js.map +1 -0
  5. package/dist/bundles/compiler/Parsing/EventSourceParser.js +1 -1
  6. package/dist/bundles/compiler/Parsing/EventSourceParser.js.map +1 -1
  7. package/dist/bundles/compiler/Parsing/ScreenplayParser.js +1 -1
  8. package/dist/bundles/compiler/Parsing/ScreenplayParser.js.map +1 -1
  9. package/dist/bundles/compiler/Parsing/SeedParser.js +1 -1
  10. package/dist/bundles/compiler/Parsing/SeedParser.js.map +1 -1
  11. package/dist/bundles/compiler/Syntax/ScreenplaySyntaxWalker.js +1 -1
  12. package/dist/bundles/compiler/Syntax/ScreenplaySyntaxWalker.js.map +1 -1
  13. package/dist/bundles/compiler/Syntax/Structure.js.map +1 -1
  14. package/dist/bundles/compiler/Syntax/SyntaxCollections.js +1 -1
  15. package/dist/bundles/compiler/Syntax/SyntaxCollections.js.map +1 -1
  16. package/dist/bundles/completion-items.js +1 -1
  17. package/dist/bundles/completion-items.js.map +1 -1
  18. package/dist/bundles/keyword-docs.js +1 -1
  19. package/dist/bundles/keyword-docs.js.map +1 -1
  20. package/dist/bundles/language.js +1 -1
  21. package/dist/bundles/language.js.map +1 -1
  22. package/dist/bundles/scope-items.js +1 -1
  23. package/dist/bundles/scope-items.js.map +1 -1
  24. package/dist/completion-items.d.ts.map +1 -1
  25. package/dist/keyword-docs.d.ts.map +1 -1
  26. package/dist/language.d.ts.map +1 -1
  27. package/dist/scope-items.d.ts.map +1 -1
  28. package/package.json +1 -1
@@ -1,2 +1,2 @@
1
- import"../../_virtual/_virtual/_rolldown/runtime.js";import{DiagnosticCodes as e}from"../Diagnostics/DiagnosticCodes.js";import{validateIdentity as t}from"../Parsing/IdentityValidator.js";import{validateApplicationHandlers as n}from"../Parsing/CommandHandlerValidator.js";import{mergeStructuralInteractions as r}from"../Parsing/StructuralInteractionSites.js";import{combineAuthorize as i}from"../Parsing/AuthorizeParser.js";import{LineReader as a}from"../Parsing/LineReader.js";import{InvalidSyntaxJson as o}from"../Syntax/InvalidSyntaxJson.js";import{invalidSourceOptions as s,isAuthoredDocument as c,legacySourceOptions as l,validatedSourceOptions as u}from"../Syntax/SourceOptions.js";import{ParserContext as d}from"../Parsing/ParserContext.js";import{toSyntaxJson as f}from"../Syntax/SyntaxJson.js";function mergeDocuments(i){let c=[],f=i.map(e=>e.value),p=/* @__PURE__ */ new Map,m=!1;for(let t of f)try{p.set(t,Object.hasOwn(t,`sourceOptions`)?u(t.sourceOptions):l)}catch(n){if(!(n instanceof o))throw n;m=!0,c.push(error(e.IncompatibleNumericSource,n.message,t.location))}let h=f.filter(e=>p.get(e)?.numericMode===`exact`||hasDeclarations(e)),g=p.get(h[0])??l;for(let t of h.slice(1))p.get(t)?.numericMode!==g.numericMode&&(m=!0,c.push(error(e.MixedNumericModes,`Declaration-bearing documents and marked import barrels must independently select the same numeric mode.`,t.location)));m&&(g=s);let _=/* @__PURE__ */ new Map,v=declaredInOneFile(f.flatMap(e=>e.concepts),`declaration of`,c,void 0,_),y=declaredInOneFile(f.flatMap(e=>e.types),`declaration of`,c,void 0,_),b=f.flatMap(e=>e.identity==null?[]:[e.identity]);for(let t of b.slice(1))c.push(error(e.RepeatedSingularDeclarationAcrossFiles,`The folder already declares an identity block in '${describe(b[0].location.path)}' - a folder compiles to one application, which can have at most one`,t.location));let x=f.filter(e=>e.commandReadMode!=null);for(let t of x.slice(1))c.push(error(e.InvalidCommandReadsDeclaration,`Declare 'command reads protected' once at the application root.`,t.location));let S=f.filter(e=>e.reactionProductionMode!=null);for(let t of S.slice(1))c.push(error(e.InvalidReactionBatchesDeclaration,`Declare 'reaction batches atomic' once at the application root.`,t.location));let C=f.map(e=>e.domain).filter(e=>e!==null);for(let t of C.slice(1))c.push(error(e.RepeatedSingularDeclarationAcrossFiles,`The folder already declares a domain in '${describe(C[0].location.path)}' - a folder compiles to one application, which can have at most one`,t.location));let w=mergeModules(f.flatMap(e=>e.modules),c),T=declaredInOneFile(f.flatMap(e=>e.personas),`persona`,c),E=f.flatMap(e=>e.policies??[]),D=declaredInOneFile(E,`policy`,c),O=E.filter(e=>!D.includes(e)).map(e=>e.location),k={kind:`ApplicationSyntax`,sourceOptions:g,...S.length===0?{}:{reactionProductionMode:S[0].reactionProductionMode},...x.length===0?{}:{commandReadMode:x[0].commandReadMode},...b.length===0?{}:{identity:b[0]},domain:C[0]??null,imports:firstOfEach(f.flatMap(e=>e.imports),e=>e.qualifiedName),concepts:v,types:y,examples:f.flatMap(e=>e.examples??[]),systems:f.flatMap(e=>e.systems??[]),purposes:declaredInOneFile(f.flatMap(e=>e.purposes??[]),`purpose`,c),eventSources:f.flatMap(e=>e.eventSources??[]),declaredTriggers:f.flatMap(e=>e.declaredTriggers??[]),modules:w,personas:T,policies:D,seeds:f.flatMap(e=>e.seeds??[]),fileImports:f.flatMap(e=>e.fileImports),...presentOnly(`exposures`,f.flatMap(e=>e.exposures??[])),...presentOnly(`instanceContributions`,f.flatMap(e=>e.instanceContributions??[])),location:f[0]?.location??{line:1,column:1}};r(k,f);let A=new d(new a([]));n(k,A),t(k,A),c.push(...A.diagnostics);let j=[...i.flatMap(e=>e.diagnostics).filter(t=>t.code!==e.DuplicateDeclaration||!O.some(e=>sameLocation(e,t.location))),...c];return{value:k,diagnostics:j,success:!j.some(e=>e.severity===`error`)}}function hasDeclarations(e){if(c(e)||e.identity!=null||e.domain!==null||e.concepts.length>0||e.types.length>0||e.personas.length>0||(e.policies?.length??0)>0||(e.purposes?.length??0)>0||(e.seeds?.length??0)>0||(e.systems?.length??0)>0||(e.eventSources?.length??0)>0||(e.examples?.length??0)>0)return!0;let feature=e=>!e.isPlacement||(e.examples?.length??0)>0||e.slices.length>0||e.features.some(feature);return e.modules.some(e=>!e.isPlacement||(e.examples?.length??0)>0||e.features.some(feature))}function mergeModules(e,t){return groupByName(e).map(placedLast).map(e=>{if(e.length===1)return r({...e[0],isPlacement:!1,features:e[0].features.map(unplaced)},e);let n=r({...e[0],isPlacement:!1,fileImports:e.flatMap(e=>e.fileImports),examples:e.flatMap(e=>e.examples??[]),purposes:firstOfEach(e.flatMap(e=>e.purposes??[]),e=>e.name),description:firstDescription(e,`module '${e[0].name}'`,t),documentation:firstDocumentation(e,`module '${e[0].name}'`,t),authorize:combineAuthorization(e.map(e=>e.authorize),`module '${e[0].name}'`,t),dependsOn:groupDependencies(e)},e,t);return r({...n,features:mergeFeatures(e.flatMap(e=>e.features),t)},[n])})}function mergeFeatures(e,t){return groupByName(e).map(placedLast).map(e=>{if(e.length===1)return unplaced(e[0]);let n=r({...e[0],isPlacement:!1,fileImports:e.flatMap(e=>e.fileImports),examples:e.flatMap(e=>e.examples??[]),purposes:firstOfEach(e.flatMap(e=>e.purposes??[]),e=>e.name),description:firstDescription(e,`feature '${e[0].name}'`,t),documentation:firstDocumentation(e,`feature '${e[0].name}'`,t),authorize:combineAuthorization(e.map(e=>e.authorize),`feature '${e[0].name}'`,t),dependsOn:groupDependencies(e)},e,t);return r({...n,features:mergeFeatures(e.flatMap(e=>e.features),t),slices:declaredInOneFile(e.flatMap(e=>e.slices),`slice`,t,`feature '${e[0].name}'`)},[n])})}function groupDependencies(e){return[...e].sort((e,t)=>(e.location.path??``)<(t.location.path??``)?-1:+((e.location.path??``)>(t.location.path??``))).flatMap(e=>e.dependsOn??[])}function placedLast(e){return[...e.filter(e=>!e.isPlacement),...e.filter(e=>e.isPlacement)]}function unplaced(e){return r({...e,isPlacement:!1,features:e.features.map(unplaced)},[e])}function combineAuthorization(t,n,r){let a=[];for(let i of t.filter(e=>e!==null)){let t=a.find(e=>e.location.path!==i.location.path&&JSON.stringify(f(e))===JSON.stringify(f(i)));t===void 0?a.push(i):r.push(warning(e.DuplicateAuthorizationAcrossFiles,`An identical authorization is already declared on the ${n} in '${describe(t.location.path)}' - this repeated gate is ignored`,i.location))}return a.reduce((e,t)=>i(e,t),null)}function firstOfEach(e,t){let n=/* @__PURE__ */ new Set;return e.filter(e=>!n.has(t(e))&&n.add(t(e))!==void 0)}function groupByName(e){let t=/* @__PURE__ */ new Map;for(let n of e)t.set(n.name,[...t.get(n.name)??[],n]);return[...t.values()]}function firstDocumentation(t,n,r){let i=t.filter(e=>e.documentation!=null);for(let t of i.slice(1).filter(e=>e.documentation!==i[0].documentation))r.push(warning(e.ConflictingDocumentationAcrossFiles,`The ${n} is already documented in '${describe(i[0].location.path)}' - keeping that documentation`,t.location));return i[0]?.documentation??null}function firstDescription(t,n,r){let i=t.filter(e=>e.description!==null);for(let t of i.slice(1).filter(e=>e.description!==i[0].description))r.push(warning(e.ConflictingDescriptionAcrossFiles,`The ${n} is already described in '${describe(i[0].location.path)}' - keeping that description`,t.location));return i[0]?.description??null}function declaredInOneFile(t,n,r,i,a=/* @__PURE__ */ new Map){let o=[];for(let s of t){let t=a.get(s.name);t!==void 0&&t.path!==s.location.path?r.push(error(e.RepeatedDeclarationAcrossFiles,`Duplicate ${n} '${s.name}'${i===void 0?``:` in ${i}`} - already declared in '${describe(t.path)}'`,s.location)):(t===void 0&&a.set(s.name,s.location),o.push(s))}return o}const describe=e=>e??`another file`,sameLocation=(e,t)=>e.path===t.path&&e.line===t.line&&e.column===t.column,error=(e,t,n)=>({severity:`error`,code:e,message:t,location:n}),warning=(e,t,n)=>({severity:`warning`,code:e,message:t,location:n});function presentOnly(e,t){return t.length===0?{}:{[e]:t}}export{mergeDocuments};
1
+ import"../../_virtual/_virtual/_rolldown/runtime.js";import{DiagnosticCodes as e}from"../Diagnostics/DiagnosticCodes.js";import{validateIdentity as t}from"../Parsing/IdentityValidator.js";import{validateApplicationHandlers as n}from"../Parsing/CommandHandlerValidator.js";import{mergeStructuralInteractions as r}from"../Parsing/StructuralInteractionSites.js";import{combineAuthorize as i}from"../Parsing/AuthorizeParser.js";import{LineReader as a}from"../Parsing/LineReader.js";import{InvalidSyntaxJson as o}from"../Syntax/InvalidSyntaxJson.js";import{invalidSourceOptions as s,isAuthoredDocument as c,legacySourceOptions as l,validatedSourceOptions as u}from"../Syntax/SourceOptions.js";import{ParserContext as d}from"../Parsing/ParserContext.js";import{toSyntaxJson as f}from"../Syntax/SyntaxJson.js";function mergeDocuments(i){let c=[],f=i.map(e=>e.value),p=/* @__PURE__ */ new Map,m=!1;for(let t of f)try{p.set(t,Object.hasOwn(t,`sourceOptions`)?u(t.sourceOptions):l)}catch(n){if(!(n instanceof o))throw n;m=!0,c.push(error(e.IncompatibleNumericSource,n.message,t.location))}let h=f.filter(e=>p.get(e)?.numericMode===`exact`||hasDeclarations(e)),g=p.get(h[0])??l;for(let t of h.slice(1))p.get(t)?.numericMode!==g.numericMode&&(m=!0,c.push(error(e.MixedNumericModes,`Declaration-bearing documents and marked import barrels must independently select the same numeric mode.`,t.location)));m&&(g=s);let _=/* @__PURE__ */ new Map,v=declaredInOneFile(f.flatMap(e=>e.concepts),`declaration of`,c,void 0,_),y=declaredInOneFile(f.flatMap(e=>e.types),`declaration of`,c,void 0,_),b=f.flatMap(e=>e.identity==null?[]:[e.identity]);for(let t of b.slice(1))c.push(error(e.RepeatedSingularDeclarationAcrossFiles,`The folder already declares an identity block in '${describe(b[0].location.path)}' - a folder compiles to one application, which can have at most one`,t.location));let x=f.filter(e=>e.commandReadMode!=null);for(let t of x.slice(1))c.push(error(e.InvalidCommandReadsDeclaration,`Declare 'command reads protected' once at the application root.`,t.location));let S=f.filter(e=>e.reactionProductionMode!=null);for(let t of S.slice(1))c.push(error(e.InvalidReactionBatchesDeclaration,`Declare 'reaction batches atomic' once at the application root.`,t.location));let C=f.map(e=>e.domain).filter(e=>e!==null);for(let t of C.slice(1))c.push(error(e.RepeatedSingularDeclarationAcrossFiles,`The folder already declares a domain in '${describe(C[0].location.path)}' - a folder compiles to one application, which can have at most one`,t.location));let w=mergeModules(f.flatMap(e=>e.modules),c),T=declaredInOneFile(f.flatMap(e=>e.personas),`persona`,c),E=f.flatMap(e=>e.policies??[]),D=declaredInOneFile(E,`policy`,c),O=E.filter(e=>!D.includes(e)).map(e=>e.location),k={kind:`ApplicationSyntax`,sourceOptions:g,...S.length===0?{}:{reactionProductionMode:S[0].reactionProductionMode},...x.length===0?{}:{commandReadMode:x[0].commandReadMode},...b.length===0?{}:{identity:b[0]},domain:C[0]??null,imports:firstOfEach(f.flatMap(e=>e.imports),e=>e.qualifiedName),concepts:v,types:y,examples:f.flatMap(e=>e.examples??[]),systems:f.flatMap(e=>e.systems??[]),purposes:declaredInOneFile(f.flatMap(e=>e.purposes??[]),`purpose`,c),eventSources:f.flatMap(e=>e.eventSources??[]),declaredTriggers:f.flatMap(e=>e.declaredTriggers??[]),modules:w,personas:T,policies:D,seeds:f.flatMap(e=>e.seeds??[]),fileImports:f.flatMap(e=>e.fileImports),...presentOnly(`stickyNotes`,f.flatMap(e=>e.stickyNotes??[])),...presentOnly(`exposures`,f.flatMap(e=>e.exposures??[])),...presentOnly(`instanceContributions`,f.flatMap(e=>e.instanceContributions??[])),location:f[0]?.location??{line:1,column:1}};r(k,f);let A=new d(new a([]));n(k,A),t(k,A),c.push(...A.diagnostics);let j=[...i.flatMap(e=>e.diagnostics).filter(t=>t.code!==e.DuplicateDeclaration||!O.some(e=>sameLocation(e,t.location))),...c];return{value:k,diagnostics:j,success:!j.some(e=>e.severity===`error`)}}function hasDeclarations(e){if(c(e)||e.identity!=null||e.domain!==null||e.concepts.length>0||e.types.length>0||e.personas.length>0||(e.policies?.length??0)>0||(e.purposes?.length??0)>0||(e.seeds?.length??0)>0||(e.systems?.length??0)>0||(e.eventSources?.length??0)>0||(e.examples?.length??0)>0||(e.stickyNotes?.length??0)>0)return!0;let feature=e=>!e.isPlacement||(e.examples?.length??0)>0||e.slices.length>0||e.features.some(feature);return e.modules.some(e=>!e.isPlacement||(e.examples?.length??0)>0||e.features.some(feature))}function mergeModules(e,t){return groupByName(e).map(placedLast).map(e=>{if(e.length===1)return r({...e[0],isPlacement:!1,features:e[0].features.map(unplaced)},e);let n=r({...e[0],isPlacement:!1,fileImports:e.flatMap(e=>e.fileImports),examples:e.flatMap(e=>e.examples??[]),purposes:firstOfEach(e.flatMap(e=>e.purposes??[]),e=>e.name),description:firstDescription(e,`module '${e[0].name}'`,t),documentation:firstDocumentation(e,`module '${e[0].name}'`,t),authorize:combineAuthorization(e.map(e=>e.authorize),`module '${e[0].name}'`,t),dependsOn:groupDependencies(e)},e,t);return r({...n,features:mergeFeatures(e.flatMap(e=>e.features),t)},[n])})}function mergeFeatures(e,t){return groupByName(e).map(placedLast).map(e=>{if(e.length===1)return unplaced(e[0]);let n=r({...e[0],isPlacement:!1,fileImports:e.flatMap(e=>e.fileImports),examples:e.flatMap(e=>e.examples??[]),purposes:firstOfEach(e.flatMap(e=>e.purposes??[]),e=>e.name),description:firstDescription(e,`feature '${e[0].name}'`,t),documentation:firstDocumentation(e,`feature '${e[0].name}'`,t),authorize:combineAuthorization(e.map(e=>e.authorize),`feature '${e[0].name}'`,t),dependsOn:groupDependencies(e)},e,t);return r({...n,features:mergeFeatures(e.flatMap(e=>e.features),t),slices:declaredInOneFile(e.flatMap(e=>e.slices),`slice`,t,`feature '${e[0].name}'`)},[n])})}function groupDependencies(e){return[...e].sort((e,t)=>(e.location.path??``)<(t.location.path??``)?-1:+((e.location.path??``)>(t.location.path??``))).flatMap(e=>e.dependsOn??[])}function placedLast(e){return[...e.filter(e=>!e.isPlacement),...e.filter(e=>e.isPlacement)]}function unplaced(e){return r({...e,isPlacement:!1,features:e.features.map(unplaced)},[e])}function combineAuthorization(t,n,r){let a=[];for(let i of t.filter(e=>e!==null)){let t=a.find(e=>e.location.path!==i.location.path&&JSON.stringify(f(e))===JSON.stringify(f(i)));t===void 0?a.push(i):r.push(warning(e.DuplicateAuthorizationAcrossFiles,`An identical authorization is already declared on the ${n} in '${describe(t.location.path)}' - this repeated gate is ignored`,i.location))}return a.reduce((e,t)=>i(e,t),null)}function firstOfEach(e,t){let n=/* @__PURE__ */ new Set;return e.filter(e=>!n.has(t(e))&&n.add(t(e))!==void 0)}function groupByName(e){let t=/* @__PURE__ */ new Map;for(let n of e)t.set(n.name,[...t.get(n.name)??[],n]);return[...t.values()]}function firstDocumentation(t,n,r){let i=t.filter(e=>e.documentation!=null);for(let t of i.slice(1).filter(e=>e.documentation!==i[0].documentation))r.push(warning(e.ConflictingDocumentationAcrossFiles,`The ${n} is already documented in '${describe(i[0].location.path)}' - keeping that documentation`,t.location));return i[0]?.documentation??null}function firstDescription(t,n,r){let i=t.filter(e=>e.description!==null);for(let t of i.slice(1).filter(e=>e.description!==i[0].description))r.push(warning(e.ConflictingDescriptionAcrossFiles,`The ${n} is already described in '${describe(i[0].location.path)}' - keeping that description`,t.location));return i[0]?.description??null}function declaredInOneFile(t,n,r,i,a=/* @__PURE__ */ new Map){let o=[];for(let s of t){let t=a.get(s.name);t!==void 0&&t.path!==s.location.path?r.push(error(e.RepeatedDeclarationAcrossFiles,`Duplicate ${n} '${s.name}'${i===void 0?``:` in ${i}`} - already declared in '${describe(t.path)}'`,s.location)):(t===void 0&&a.set(s.name,s.location),o.push(s))}return o}const describe=e=>e??`another file`,sameLocation=(e,t)=>e.path===t.path&&e.line===t.line&&e.column===t.column,error=(e,t,n)=>({severity:`error`,code:e,message:t,location:n}),warning=(e,t,n)=>({severity:`warning`,code:e,message:t,location:n});function presentOnly(e,t){return t.length===0?{}:{[e]:t}}export{mergeDocuments};
2
2
  //# sourceMappingURL=PlayFolderMerge.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlayFolderMerge.js","names":["diagnostics","applications","documents","document","options","invalid","application","validatedSourceOptions","legacySourceOptions","failure","InvalidSyntaxJson","DiagnosticCodes","asserted","sourceOptions","invalidSourceOptions","named","concepts","types","identities","extra","readModes","modes","domains","domain","modules","personas","declaredPolicies","policies","droppedPolicies","policy","value","item","mergeStructuralInteractions","identityContext","ParserContext","LineReader","validateApplicationHandlers","validateIdentity","all","diagnostic","location","isAuthoredDocument","node","module","parts","owner","part","reference","features","left","right","feature","kept","authorization","declarations","declaration","first","earlier","toSyntaxJson","combineAuthorize","combined","next","seen","items","key","groups","documented","disagreeing","described","claimed","keyword","within","path","values"],"sources":["../../../../../../Compiler/Files/PlayFolderMerge.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 { mergeStructuralInteractions } from '../Parsing/StructuralInteractionSites';\nimport { validateIdentity } from '../Parsing/IdentityValidator';\nimport { validateApplicationHandlers } from '../Parsing/CommandHandlerValidator';\nimport { ParserContext } from '../Parsing/ParserContext';\nimport { LineReader } from '../Parsing/LineReader';\nimport { Diagnostic } from '../Diagnostics/Diagnostic';\nimport { DiagnosticCodes } from '../Diagnostics/DiagnosticCodes';\nimport { SourceLocation } from '../Diagnostics/SourceLocation';\nimport { combineAuthorize } from '../Parsing/AuthorizeParser';\nimport { CompilationResult } from '../ScreenplayCompiler';\nimport { AuthorizeSyntax, PersonaSyntax } from '../Syntax/Authorization';\nimport { ConceptSyntax, TypeSyntax } from '../Syntax/Declarations';\nimport { ApplicationSyntax, FeatureSyntax, ModuleSyntax } from '../Syntax/Structure';\nimport { toSyntaxJson } from '../Syntax/SyntaxJson';\nimport { invalidSourceOptions, isAuthoredDocument, legacySourceOptions, SourceOptions, validatedSourceOptions } from '../Syntax/SourceOptions';\nimport { InvalidSyntaxJson } from '../Syntax/InvalidSyntaxJson';\n\n// \"The documents of a folder are one document\": modules and features with the same name combine, and a\n// name declared in two files is reported - the port of the C# PlayFolderMerge for what this compiler\n// models. The semantic validation the C# merge runs afterwards is not ported.\nexport function mergeDocuments(documents: readonly CompilationResult<ApplicationSyntax>[]): CompilationResult<ApplicationSyntax> {\n const diagnostics: Diagnostic[] = [];\n const applications = documents.map(document => document.value);\n const options = new Map<ApplicationSyntax, SourceOptions>();\n let invalid = false;\n for (const application of applications) {\n try {\n options.set(application, Object.hasOwn(application, 'sourceOptions') ? validatedSourceOptions(application.sourceOptions) : legacySourceOptions);\n } catch (failure) {\n if (!(failure instanceof InvalidSyntaxJson)) throw failure;\n invalid = true;\n diagnostics.push(error(DiagnosticCodes.IncompatibleNumericSource, failure.message, application.location));\n }\n }\n const asserted = applications.filter(application => options.get(application)?.numericMode === 'exact' || hasDeclarations(application));\n let sourceOptions = options.get(asserted[0]) ?? legacySourceOptions;\n for (const application of asserted.slice(1)) {\n if (options.get(application)?.numericMode !== sourceOptions.numericMode) {\n invalid = true;\n diagnostics.push(error(DiagnosticCodes.MixedNumericModes, 'Declaration-bearing documents and marked import barrels must independently select the same numeric mode.', application.location));\n }\n }\n if (invalid) sourceOptions = invalidSourceOptions;\n const named = new Map<string, SourceLocation>();\n const concepts = declaredInOneFile<ConceptSyntax>(applications.flatMap(application => application.concepts), 'declaration of', diagnostics, undefined, named);\n const types = declaredInOneFile<TypeSyntax>(applications.flatMap(application => application.types), 'declaration of', diagnostics, undefined, named);\n const identities = applications.flatMap(application => application.identity == null ? [] : [application.identity]);\n for (const extra of identities.slice(1)) diagnostics.push(error(DiagnosticCodes.RepeatedSingularDeclarationAcrossFiles,\n `The folder already declares an identity block in '${describe(identities[0].location.path)}' - a folder compiles to one application, which can have at most one`, extra.location));\n const readModes = applications.filter(application => application.commandReadMode != null);\n for (const extra of readModes.slice(1)) diagnostics.push(error(DiagnosticCodes.InvalidCommandReadsDeclaration,\n \"Declare 'command reads protected' once at the application root.\", extra.location));\n const modes = applications.filter(application => application.reactionProductionMode != null);\n for (const extra of modes.slice(1)) diagnostics.push(error(DiagnosticCodes.InvalidReactionBatchesDeclaration,\n \"Declare 'reaction batches atomic' once at the application root.\", extra.location));\n const domains = applications.map(application => application.domain).filter(domain => domain !== null);\n for (const extra of domains.slice(1)) {\n diagnostics.push(error(DiagnosticCodes.RepeatedSingularDeclarationAcrossFiles,\n `The folder already declares a domain in '${describe(domains[0].location.path)}' - a folder compiles to one application, which can have at most one`, extra.location));\n }\n // Modules merge before personas are claimed, so the diagnostics come in the order the C# merge reports them.\n const modules = mergeModules(applications.flatMap(application => application.modules), diagnostics);\n const personas = declaredInOneFile<PersonaSyntax>(applications.flatMap(application => application.personas), 'persona', diagnostics);\n const declaredPolicies = applications.flatMap(application => application.policies ?? []);\n const policies = declaredInOneFile(declaredPolicies, 'policy', diagnostics);\n // Like the C# merge, a policy dropped as repeated across files is not also reported as repeated within its file.\n const droppedPolicies = declaredPolicies.filter(policy => !policies.includes(policy)).map(policy => policy.location);\n const value: ApplicationSyntax = {\n kind: 'ApplicationSyntax',\n sourceOptions,\n ...(modes.length === 0 ? {} : { reactionProductionMode: modes[0].reactionProductionMode }),\n ...(readModes.length === 0 ? {} : { commandReadMode: readModes[0].commandReadMode }),\n ...(identities.length === 0 ? {} : { identity: identities[0] }),\n domain: domains[0] ?? null,\n imports: firstOfEach(applications.flatMap(application => application.imports), item => item.qualifiedName),\n concepts,\n types,\n examples: applications.flatMap(application => application.examples ?? []),\n systems: applications.flatMap(application => application.systems ?? []),\n purposes: declaredInOneFile(applications.flatMap(application => application.purposes ?? []), 'purpose', diagnostics),\n eventSources: applications.flatMap(application => application.eventSources ?? []),\n declaredTriggers: applications.flatMap(application => application.declaredTriggers ?? []),\n modules,\n personas,\n policies,\n seeds: applications.flatMap(application => application.seeds ?? []),\n fileImports: applications.flatMap(application => application.fileImports),\n ...presentOnly('exposures', applications.flatMap(application => application.exposures ?? [])),\n ...presentOnly('instanceContributions', applications.flatMap(application => application.instanceContributions ?? [])),\n location: applications[0]?.location ?? { line: 1, column: 1 },\n };\n mergeStructuralInteractions(value, applications);\n const identityContext = new ParserContext(new LineReader([]));\n validateApplicationHandlers(value, identityContext);\n validateIdentity(value, identityContext);\n diagnostics.push(...identityContext.diagnostics);\n const documentDiagnostics = documents.flatMap(document => document.diagnostics).filter(diagnostic =>\n diagnostic.code !== DiagnosticCodes.DuplicateDeclaration || !droppedPolicies.some(location => sameLocation(location, diagnostic.location)));\n const all = [...documentDiagnostics, ...diagnostics];\n return { value, diagnostics: all, success: !all.some(diagnostic => diagnostic.severity === 'error') };\n}\n\nfunction hasDeclarations(application: ApplicationSyntax): boolean {\n if (isAuthoredDocument(application)) return true;\n if (application.identity != null || application.domain !== null || application.concepts.length > 0 || application.types.length > 0 || application.personas.length > 0 || (application.policies?.length ?? 0) > 0 || (application.purposes?.length ?? 0) > 0 || (application.seeds?.length ?? 0) > 0 || (application.systems?.length ?? 0) > 0 || (application.eventSources?.length ?? 0) > 0 || (application.examples?.length ?? 0) > 0) return true;\n const feature = (node: FeatureSyntax): boolean => !node.isPlacement || (node.examples?.length ?? 0) > 0 || node.slices.length > 0 || node.features.some(feature);\n return application.modules.some(module => !module.isPlacement || (module.examples?.length ?? 0) > 0 || module.features.some(feature));\n}\n\nfunction mergeModules(modules: readonly ModuleSyntax[], diagnostics: Diagnostic[]): ModuleSyntax[] {\n return groupByName(modules).map(placedLast).map(parts => {\n if (parts.length === 1) return mergeStructuralInteractions({ ...parts[0], isPlacement: false, features: parts[0].features.map(unplaced) }, parts);\n const owner = mergeStructuralInteractions({\n ...parts[0],\n isPlacement: false,\n fileImports: parts.flatMap(part => part.fileImports),\n examples: parts.flatMap(part => part.examples ?? []),\n purposes: firstOfEach(parts.flatMap(part => part.purposes ?? []), reference => reference.name),\n description: firstDescription(parts, `module '${parts[0].name}'`, diagnostics),\n documentation: firstDocumentation(parts, `module '${parts[0].name}'`, diagnostics),\n authorize: combineAuthorization(parts.map(part => part.authorize), `module '${parts[0].name}'`, diagnostics),\n dependsOn: groupDependencies(parts),\n }, parts, diagnostics);\n return mergeStructuralInteractions({ ...owner, features: mergeFeatures(parts.flatMap(part => part.features), diagnostics) }, [owner]);\n });\n}\n\nfunction mergeFeatures(features: readonly FeatureSyntax[], diagnostics: Diagnostic[]): FeatureSyntax[] {\n return groupByName(features).map(placedLast).map(parts => {\n if (parts.length === 1) return unplaced(parts[0]);\n const owner = mergeStructuralInteractions({\n ...parts[0],\n isPlacement: false,\n fileImports: parts.flatMap(part => part.fileImports),\n examples: parts.flatMap(part => part.examples ?? []),\n purposes: firstOfEach(parts.flatMap(part => part.purposes ?? []), reference => reference.name),\n description: firstDescription(parts, `feature '${parts[0].name}'`, diagnostics),\n documentation: firstDocumentation(parts, `feature '${parts[0].name}'`, diagnostics),\n authorize: combineAuthorization(parts.map(part => part.authorize), `feature '${parts[0].name}'`, diagnostics),\n dependsOn: groupDependencies(parts),\n }, parts, diagnostics);\n return mergeStructuralInteractions({ ...owner,\n features: mergeFeatures(parts.flatMap(part => part.features), diagnostics),\n slices: declaredInOneFile(parts.flatMap(part => part.slices), 'slice', diagnostics, `feature '${parts[0].name}'`),\n }, [owner]);\n });\n}\n\n// Dependencies accumulate in path order, independently of which header owns the container.\nfunction groupDependencies(parts: readonly (ModuleSyntax | FeatureSyntax)[]) {\n return [...parts].sort((left, right) => (left.location.path ?? '') < (right.location.path ?? '') ? -1 : (left.location.path ?? '') > (right.location.path ?? '') ? 1 : 0).flatMap(part => part.dependsOn ?? []);\n}\n\n// Where a module or feature is written comes before files merely placed in it, so the merged one is located\n// at its declaration. Within each kind, path order is kept.\nfunction placedLast<T extends { readonly isPlacement: boolean }>(parts: readonly T[]): T[] {\n return [...parts.filter(part => !part.isPlacement), ...parts.filter(part => part.isPlacement)];\n}\n\n// Once merged, a feature is the feature - whether a file was placed in it no longer says anything.\nfunction unplaced(feature: FeatureSyntax): FeatureSyntax {\n return mergeStructuralInteractions({ ...feature, isPlacement: false, features: feature.features.map(unplaced) }, [feature]);\n}\n\n// Combines the gates files declare on one module or feature with 'and', never weakening an earlier one. The\n// same gate repeated in another file says nothing new and is reported and left out.\nfunction combineAuthorization(declarations: readonly (AuthorizeSyntax | null)[], owner: string, diagnostics: Diagnostic[]): AuthorizeSyntax | null {\n const kept: AuthorizeSyntax[] = [];\n for (const authorization of declarations.filter(declaration => declaration !== null)) {\n const first = kept.find(earlier => earlier.location.path !== authorization.location.path\n && JSON.stringify(toSyntaxJson(earlier)) === JSON.stringify(toSyntaxJson(authorization)));\n if (first !== undefined) {\n diagnostics.push(warning(DiagnosticCodes.DuplicateAuthorizationAcrossFiles,\n `An identical authorization is already declared on the ${owner} in '${describe(first.location.path)}' - this repeated gate is ignored`, authorization.location));\n continue;\n }\n kept.push(authorization);\n }\n return kept.reduce<AuthorizeSyntax | null>((combined, next) => combineAuthorize(combined, next), null);\n}\n\nfunction firstOfEach<T>(items: readonly T[], key: (item: T) => string): T[] {\n const seen = new Set<string>();\n return items.filter(item => !seen.has(key(item)) && seen.add(key(item)) !== undefined);\n}\n\n// Groups by name, keeping the order each name first appears in.\nfunction groupByName<T extends { readonly name: string }>(items: readonly T[]): T[][] {\n const groups = new Map<string, T[]>();\n for (const item of items) {\n groups.set(item.name, [...(groups.get(item.name) ?? []), item]);\n }\n return [...groups.values()];\n}\n\nfunction firstDocumentation(parts: readonly { documentation?: string | null; location: SourceLocation }[], owner: string, diagnostics: Diagnostic[]): string | null {\n const documented = parts.filter(part => part.documentation != null);\n for (const disagreeing of documented.slice(1).filter(part => part.documentation !== documented[0].documentation)) {\n diagnostics.push(warning(DiagnosticCodes.ConflictingDocumentationAcrossFiles,\n `The ${owner} is already documented in '${describe(documented[0].location.path)}' - keeping that documentation`, disagreeing.location));\n }\n return documented[0]?.documentation ?? null;\n}\n\nfunction firstDescription(parts: readonly { description: string | null; location: SourceLocation }[], owner: string, diagnostics: Diagnostic[]): string | null {\n const described = parts.filter(part => part.description !== null);\n for (const disagreeing of described.slice(1).filter(part => part.description !== described[0].description)) {\n diagnostics.push(warning(DiagnosticCodes.ConflictingDescriptionAcrossFiles,\n `The ${owner} is already described in '${describe(described[0].location.path)}' - keeping that description`, disagreeing.location));\n }\n return described[0]?.description ?? null;\n}\n\n// Keeps the first declaration of each name; one in another file with the same name is reported and dropped.\n// A repeat within one file is left for that file's own checks.\nfunction declaredInOneFile<T extends { readonly name: string; readonly location: SourceLocation }>(\n declarations: readonly T[], keyword: string, diagnostics: Diagnostic[], within?: string, claimed = new Map<string, SourceLocation>()): T[] {\n const kept: T[] = [];\n for (const declaration of declarations) {\n const first = claimed.get(declaration.name);\n if (first !== undefined && first.path !== declaration.location.path) {\n diagnostics.push(error(DiagnosticCodes.RepeatedDeclarationAcrossFiles,\n `Duplicate ${keyword} '${declaration.name}'${within === undefined ? '' : ` in ${within}`} - already declared in '${describe(first.path)}'`, declaration.location));\n continue;\n }\n if (first === undefined) {\n claimed.set(declaration.name, declaration.location);\n }\n kept.push(declaration);\n }\n return kept;\n}\n\nconst describe = (path: string | undefined): string => path ?? 'another file';\nconst sameLocation = (left: SourceLocation, right: SourceLocation): boolean => left.path === right.path && left.line === right.line && left.column === right.column;\nconst error = (code: string, message: string, location: SourceLocation): Diagnostic => ({ severity: 'error', code, message, location });\nconst warning = (code: string, message: string, location: SourceLocation): Diagnostic => ({ severity: 'warning', code, message, location });\n\n// Composition members are written only when a document declares them, matching the C# canonical JSON.\nfunction presentOnly<TKey extends string, TValue>(key: TKey, values: readonly TValue[]): Partial<Record<TKey, readonly TValue[]>> {\n return values.length === 0 ? {} : { [key]: values } as Partial<Record<TKey, readonly TValue[]>>;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"PlayFolderMerge.js","names":["diagnostics","applications","documents","document","options","invalid","application","validatedSourceOptions","legacySourceOptions","failure","InvalidSyntaxJson","DiagnosticCodes","asserted","sourceOptions","invalidSourceOptions","named","concepts","types","identities","extra","readModes","modes","domains","domain","modules","personas","declaredPolicies","policies","droppedPolicies","policy","value","item","mergeStructuralInteractions","identityContext","ParserContext","LineReader","validateApplicationHandlers","validateIdentity","all","diagnostic","location","isAuthoredDocument","node","module","parts","owner","part","reference","features","left","right","feature","kept","authorization","declarations","declaration","first","earlier","toSyntaxJson","combineAuthorize","combined","next","seen","items","key","groups","documented","disagreeing","described","claimed","keyword","within","path","values"],"sources":["../../../../../../Compiler/Files/PlayFolderMerge.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 { mergeStructuralInteractions } from '../Parsing/StructuralInteractionSites';\nimport { validateIdentity } from '../Parsing/IdentityValidator';\nimport { validateApplicationHandlers } from '../Parsing/CommandHandlerValidator';\nimport { ParserContext } from '../Parsing/ParserContext';\nimport { LineReader } from '../Parsing/LineReader';\nimport { Diagnostic } from '../Diagnostics/Diagnostic';\nimport { DiagnosticCodes } from '../Diagnostics/DiagnosticCodes';\nimport { SourceLocation } from '../Diagnostics/SourceLocation';\nimport { combineAuthorize } from '../Parsing/AuthorizeParser';\nimport { CompilationResult } from '../ScreenplayCompiler';\nimport { AuthorizeSyntax, PersonaSyntax } from '../Syntax/Authorization';\nimport { ConceptSyntax, TypeSyntax } from '../Syntax/Declarations';\nimport { ApplicationSyntax, FeatureSyntax, ModuleSyntax } from '../Syntax/Structure';\nimport { toSyntaxJson } from '../Syntax/SyntaxJson';\nimport { invalidSourceOptions, isAuthoredDocument, legacySourceOptions, SourceOptions, validatedSourceOptions } from '../Syntax/SourceOptions';\nimport { InvalidSyntaxJson } from '../Syntax/InvalidSyntaxJson';\n\n// \"The documents of a folder are one document\": modules and features with the same name combine, and a\n// name declared in two files is reported - the port of the C# PlayFolderMerge for what this compiler\n// models. The semantic validation the C# merge runs afterwards is not ported.\nexport function mergeDocuments(documents: readonly CompilationResult<ApplicationSyntax>[]): CompilationResult<ApplicationSyntax> {\n const diagnostics: Diagnostic[] = [];\n const applications = documents.map(document => document.value);\n const options = new Map<ApplicationSyntax, SourceOptions>();\n let invalid = false;\n for (const application of applications) {\n try {\n options.set(application, Object.hasOwn(application, 'sourceOptions') ? validatedSourceOptions(application.sourceOptions) : legacySourceOptions);\n } catch (failure) {\n if (!(failure instanceof InvalidSyntaxJson)) throw failure;\n invalid = true;\n diagnostics.push(error(DiagnosticCodes.IncompatibleNumericSource, failure.message, application.location));\n }\n }\n const asserted = applications.filter(application => options.get(application)?.numericMode === 'exact' || hasDeclarations(application));\n let sourceOptions = options.get(asserted[0]) ?? legacySourceOptions;\n for (const application of asserted.slice(1)) {\n if (options.get(application)?.numericMode !== sourceOptions.numericMode) {\n invalid = true;\n diagnostics.push(error(DiagnosticCodes.MixedNumericModes, 'Declaration-bearing documents and marked import barrels must independently select the same numeric mode.', application.location));\n }\n }\n if (invalid) sourceOptions = invalidSourceOptions;\n const named = new Map<string, SourceLocation>();\n const concepts = declaredInOneFile<ConceptSyntax>(applications.flatMap(application => application.concepts), 'declaration of', diagnostics, undefined, named);\n const types = declaredInOneFile<TypeSyntax>(applications.flatMap(application => application.types), 'declaration of', diagnostics, undefined, named);\n const identities = applications.flatMap(application => application.identity == null ? [] : [application.identity]);\n for (const extra of identities.slice(1)) diagnostics.push(error(DiagnosticCodes.RepeatedSingularDeclarationAcrossFiles,\n `The folder already declares an identity block in '${describe(identities[0].location.path)}' - a folder compiles to one application, which can have at most one`, extra.location));\n const readModes = applications.filter(application => application.commandReadMode != null);\n for (const extra of readModes.slice(1)) diagnostics.push(error(DiagnosticCodes.InvalidCommandReadsDeclaration,\n \"Declare 'command reads protected' once at the application root.\", extra.location));\n const modes = applications.filter(application => application.reactionProductionMode != null);\n for (const extra of modes.slice(1)) diagnostics.push(error(DiagnosticCodes.InvalidReactionBatchesDeclaration,\n \"Declare 'reaction batches atomic' once at the application root.\", extra.location));\n const domains = applications.map(application => application.domain).filter(domain => domain !== null);\n for (const extra of domains.slice(1)) {\n diagnostics.push(error(DiagnosticCodes.RepeatedSingularDeclarationAcrossFiles,\n `The folder already declares a domain in '${describe(domains[0].location.path)}' - a folder compiles to one application, which can have at most one`, extra.location));\n }\n // Modules merge before personas are claimed, so the diagnostics come in the order the C# merge reports them.\n const modules = mergeModules(applications.flatMap(application => application.modules), diagnostics);\n const personas = declaredInOneFile<PersonaSyntax>(applications.flatMap(application => application.personas), 'persona', diagnostics);\n const declaredPolicies = applications.flatMap(application => application.policies ?? []);\n const policies = declaredInOneFile(declaredPolicies, 'policy', diagnostics);\n // Like the C# merge, a policy dropped as repeated across files is not also reported as repeated within its file.\n const droppedPolicies = declaredPolicies.filter(policy => !policies.includes(policy)).map(policy => policy.location);\n const value: ApplicationSyntax = {\n kind: 'ApplicationSyntax',\n sourceOptions,\n ...(modes.length === 0 ? {} : { reactionProductionMode: modes[0].reactionProductionMode }),\n ...(readModes.length === 0 ? {} : { commandReadMode: readModes[0].commandReadMode }),\n ...(identities.length === 0 ? {} : { identity: identities[0] }),\n domain: domains[0] ?? null,\n imports: firstOfEach(applications.flatMap(application => application.imports), item => item.qualifiedName),\n concepts,\n types,\n examples: applications.flatMap(application => application.examples ?? []),\n systems: applications.flatMap(application => application.systems ?? []),\n purposes: declaredInOneFile(applications.flatMap(application => application.purposes ?? []), 'purpose', diagnostics),\n eventSources: applications.flatMap(application => application.eventSources ?? []),\n declaredTriggers: applications.flatMap(application => application.declaredTriggers ?? []),\n modules,\n personas,\n policies,\n seeds: applications.flatMap(application => application.seeds ?? []),\n fileImports: applications.flatMap(application => application.fileImports),\n ...presentOnly('stickyNotes', applications.flatMap(application => application.stickyNotes ?? [])),\n ...presentOnly('exposures', applications.flatMap(application => application.exposures ?? [])),\n ...presentOnly('instanceContributions', applications.flatMap(application => application.instanceContributions ?? [])),\n location: applications[0]?.location ?? { line: 1, column: 1 },\n };\n mergeStructuralInteractions(value, applications);\n const identityContext = new ParserContext(new LineReader([]));\n validateApplicationHandlers(value, identityContext);\n validateIdentity(value, identityContext);\n diagnostics.push(...identityContext.diagnostics);\n const documentDiagnostics = documents.flatMap(document => document.diagnostics).filter(diagnostic =>\n diagnostic.code !== DiagnosticCodes.DuplicateDeclaration || !droppedPolicies.some(location => sameLocation(location, diagnostic.location)));\n const all = [...documentDiagnostics, ...diagnostics];\n return { value, diagnostics: all, success: !all.some(diagnostic => diagnostic.severity === 'error') };\n}\n\nfunction hasDeclarations(application: ApplicationSyntax): boolean {\n if (isAuthoredDocument(application)) return true;\n if (application.identity != null || application.domain !== null || application.concepts.length > 0 || application.types.length > 0 || application.personas.length > 0 || (application.policies?.length ?? 0) > 0 || (application.purposes?.length ?? 0) > 0 || (application.seeds?.length ?? 0) > 0 || (application.systems?.length ?? 0) > 0 || (application.eventSources?.length ?? 0) > 0 || (application.examples?.length ?? 0) > 0 || (application.stickyNotes?.length ?? 0) > 0) return true;\n const feature = (node: FeatureSyntax): boolean => !node.isPlacement || (node.examples?.length ?? 0) > 0 || node.slices.length > 0 || node.features.some(feature);\n return application.modules.some(module => !module.isPlacement || (module.examples?.length ?? 0) > 0 || module.features.some(feature));\n}\n\nfunction mergeModules(modules: readonly ModuleSyntax[], diagnostics: Diagnostic[]): ModuleSyntax[] {\n return groupByName(modules).map(placedLast).map(parts => {\n if (parts.length === 1) return mergeStructuralInteractions({ ...parts[0], isPlacement: false, features: parts[0].features.map(unplaced) }, parts);\n const owner = mergeStructuralInteractions({\n ...parts[0],\n isPlacement: false,\n fileImports: parts.flatMap(part => part.fileImports),\n examples: parts.flatMap(part => part.examples ?? []),\n purposes: firstOfEach(parts.flatMap(part => part.purposes ?? []), reference => reference.name),\n description: firstDescription(parts, `module '${parts[0].name}'`, diagnostics),\n documentation: firstDocumentation(parts, `module '${parts[0].name}'`, diagnostics),\n authorize: combineAuthorization(parts.map(part => part.authorize), `module '${parts[0].name}'`, diagnostics),\n dependsOn: groupDependencies(parts),\n }, parts, diagnostics);\n return mergeStructuralInteractions({ ...owner, features: mergeFeatures(parts.flatMap(part => part.features), diagnostics) }, [owner]);\n });\n}\n\nfunction mergeFeatures(features: readonly FeatureSyntax[], diagnostics: Diagnostic[]): FeatureSyntax[] {\n return groupByName(features).map(placedLast).map(parts => {\n if (parts.length === 1) return unplaced(parts[0]);\n const owner = mergeStructuralInteractions({\n ...parts[0],\n isPlacement: false,\n fileImports: parts.flatMap(part => part.fileImports),\n examples: parts.flatMap(part => part.examples ?? []),\n purposes: firstOfEach(parts.flatMap(part => part.purposes ?? []), reference => reference.name),\n description: firstDescription(parts, `feature '${parts[0].name}'`, diagnostics),\n documentation: firstDocumentation(parts, `feature '${parts[0].name}'`, diagnostics),\n authorize: combineAuthorization(parts.map(part => part.authorize), `feature '${parts[0].name}'`, diagnostics),\n dependsOn: groupDependencies(parts),\n }, parts, diagnostics);\n return mergeStructuralInteractions({ ...owner,\n features: mergeFeatures(parts.flatMap(part => part.features), diagnostics),\n slices: declaredInOneFile(parts.flatMap(part => part.slices), 'slice', diagnostics, `feature '${parts[0].name}'`),\n }, [owner]);\n });\n}\n\n// Dependencies accumulate in path order, independently of which header owns the container.\nfunction groupDependencies(parts: readonly (ModuleSyntax | FeatureSyntax)[]) {\n return [...parts].sort((left, right) => (left.location.path ?? '') < (right.location.path ?? '') ? -1 : (left.location.path ?? '') > (right.location.path ?? '') ? 1 : 0).flatMap(part => part.dependsOn ?? []);\n}\n\n// Where a module or feature is written comes before files merely placed in it, so the merged one is located\n// at its declaration. Within each kind, path order is kept.\nfunction placedLast<T extends { readonly isPlacement: boolean }>(parts: readonly T[]): T[] {\n return [...parts.filter(part => !part.isPlacement), ...parts.filter(part => part.isPlacement)];\n}\n\n// Once merged, a feature is the feature - whether a file was placed in it no longer says anything.\nfunction unplaced(feature: FeatureSyntax): FeatureSyntax {\n return mergeStructuralInteractions({ ...feature, isPlacement: false, features: feature.features.map(unplaced) }, [feature]);\n}\n\n// Combines the gates files declare on one module or feature with 'and', never weakening an earlier one. The\n// same gate repeated in another file says nothing new and is reported and left out.\nfunction combineAuthorization(declarations: readonly (AuthorizeSyntax | null)[], owner: string, diagnostics: Diagnostic[]): AuthorizeSyntax | null {\n const kept: AuthorizeSyntax[] = [];\n for (const authorization of declarations.filter(declaration => declaration !== null)) {\n const first = kept.find(earlier => earlier.location.path !== authorization.location.path\n && JSON.stringify(toSyntaxJson(earlier)) === JSON.stringify(toSyntaxJson(authorization)));\n if (first !== undefined) {\n diagnostics.push(warning(DiagnosticCodes.DuplicateAuthorizationAcrossFiles,\n `An identical authorization is already declared on the ${owner} in '${describe(first.location.path)}' - this repeated gate is ignored`, authorization.location));\n continue;\n }\n kept.push(authorization);\n }\n return kept.reduce<AuthorizeSyntax | null>((combined, next) => combineAuthorize(combined, next), null);\n}\n\nfunction firstOfEach<T>(items: readonly T[], key: (item: T) => string): T[] {\n const seen = new Set<string>();\n return items.filter(item => !seen.has(key(item)) && seen.add(key(item)) !== undefined);\n}\n\n// Groups by name, keeping the order each name first appears in.\nfunction groupByName<T extends { readonly name: string }>(items: readonly T[]): T[][] {\n const groups = new Map<string, T[]>();\n for (const item of items) {\n groups.set(item.name, [...(groups.get(item.name) ?? []), item]);\n }\n return [...groups.values()];\n}\n\nfunction firstDocumentation(parts: readonly { documentation?: string | null; location: SourceLocation }[], owner: string, diagnostics: Diagnostic[]): string | null {\n const documented = parts.filter(part => part.documentation != null);\n for (const disagreeing of documented.slice(1).filter(part => part.documentation !== documented[0].documentation)) {\n diagnostics.push(warning(DiagnosticCodes.ConflictingDocumentationAcrossFiles,\n `The ${owner} is already documented in '${describe(documented[0].location.path)}' - keeping that documentation`, disagreeing.location));\n }\n return documented[0]?.documentation ?? null;\n}\n\nfunction firstDescription(parts: readonly { description: string | null; location: SourceLocation }[], owner: string, diagnostics: Diagnostic[]): string | null {\n const described = parts.filter(part => part.description !== null);\n for (const disagreeing of described.slice(1).filter(part => part.description !== described[0].description)) {\n diagnostics.push(warning(DiagnosticCodes.ConflictingDescriptionAcrossFiles,\n `The ${owner} is already described in '${describe(described[0].location.path)}' - keeping that description`, disagreeing.location));\n }\n return described[0]?.description ?? null;\n}\n\n// Keeps the first declaration of each name; one in another file with the same name is reported and dropped.\n// A repeat within one file is left for that file's own checks.\nfunction declaredInOneFile<T extends { readonly name: string; readonly location: SourceLocation }>(\n declarations: readonly T[], keyword: string, diagnostics: Diagnostic[], within?: string, claimed = new Map<string, SourceLocation>()): T[] {\n const kept: T[] = [];\n for (const declaration of declarations) {\n const first = claimed.get(declaration.name);\n if (first !== undefined && first.path !== declaration.location.path) {\n diagnostics.push(error(DiagnosticCodes.RepeatedDeclarationAcrossFiles,\n `Duplicate ${keyword} '${declaration.name}'${within === undefined ? '' : ` in ${within}`} - already declared in '${describe(first.path)}'`, declaration.location));\n continue;\n }\n if (first === undefined) {\n claimed.set(declaration.name, declaration.location);\n }\n kept.push(declaration);\n }\n return kept;\n}\n\nconst describe = (path: string | undefined): string => path ?? 'another file';\nconst sameLocation = (left: SourceLocation, right: SourceLocation): boolean => left.path === right.path && left.line === right.line && left.column === right.column;\nconst error = (code: string, message: string, location: SourceLocation): Diagnostic => ({ severity: 'error', code, message, location });\nconst warning = (code: string, message: string, location: SourceLocation): Diagnostic => ({ severity: 'warning', code, message, location });\n\n// Composition members are written only when a document declares them, matching the C# canonical JSON.\nfunction presentOnly<TKey extends string, TValue>(key: TKey, values: readonly TValue[]): Partial<Record<TKey, readonly TValue[]>> {\n return values.length === 0 ? {} : { [key]: values } as Partial<Record<TKey, readonly TValue[]>>;\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import"../../_virtual/_virtual/_rolldown/runtime.js";import{DiagnosticCodes as e}from"../Diagnostics/DiagnosticCodes.js";import{pattern as t}from"../Text/patterns.js";import{locationOf as n}from"./SourceLine.js";const r=t(`^(position|size)\\s+(-?\\d+)\\s+(-?\\d+)$`);function parseCanvasPair(t,i,a,o,s,c,l){let u=r.exec(i.content),d=u===null?NaN:Number.parseInt(u[2],10),f=u===null?NaN:Number.parseInt(u[3],10);return u!==null&&u[1]===a&&Number.isSafeInteger(d)&&Number.isSafeInteger(f)&&d>=-2147483648&&d<=2147483647&&f>=-2147483648&&f<=2147483647&&(l||d>=0&&f>=0)?c===null?[d,f]:(t.error(e.InvalidPersonaDeclaration,`The ${a} is already declared - at most one is allowed`,n(i)),null):(t.error(e.InvalidPersonaDeclaration,`Invalid ${a} '${i.content}' - expected '${a} <${o}> <${s}>' with whole numbers${l?``:` that are not negative`}`,n(i)),null)}export{parseCanvasPair};
2
+ //# sourceMappingURL=CanvasPlacement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CanvasPlacement.js","names":["canvasPairPattern","pattern","match","line","firstValue","secondValue","keyword","allowNegative","existing","context","DiagnosticCodes","locationOf","first","second"],"sources":["../../../../../../Compiler/Parsing/CanvasPlacement.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 { pattern } from '../Text/patterns';\nimport { ParserContext } from './ParserContext';\nimport { locationOf, SourceLine } from './SourceLine';\n\nconst canvasPairPattern = pattern('^(position|size)\\\\s+(-?\\\\d+)\\\\s+(-?\\\\d+)$');\n\n// 'position <x> <y>' or 'size <width> <height>' - two whole numbers in canvas units; a second line is a mistake.\nexport function parseCanvasPair(context: ParserContext, line: SourceLine, keyword: string, first: string, second: string, existing: readonly [number, number] | null, allowNegative: boolean): readonly [number, number] | null {\n const match = canvasPairPattern.exec(line.content);\n const firstValue = match === null ? Number.NaN : Number.parseInt(match[2], 10);\n const secondValue = match === null ? Number.NaN : Number.parseInt(match[3], 10);\n const valid = match !== null && match[1] === keyword && Number.isSafeInteger(firstValue) && Number.isSafeInteger(secondValue)\n && firstValue >= -2147483648 && firstValue <= 2147483647 && secondValue >= -2147483648 && secondValue <= 2147483647\n && (allowNegative || (firstValue >= 0 && secondValue >= 0));\n if (!valid) {\n context.error(DiagnosticCodes.InvalidPersonaDeclaration, `Invalid ${keyword} '${line.content}' - expected '${keyword} <${first}> <${second}>' with whole numbers${allowNegative ? '' : ' that are not negative'}`, locationOf(line));\n return null;\n }\n if (existing !== null) {\n context.error(DiagnosticCodes.InvalidPersonaDeclaration, `The ${keyword} is already declared - at most one is allowed`, locationOf(line));\n return null;\n }\n return [firstValue, secondValue];\n}\n"],"mappings":"oNAQA,MAAMA,EAAoBC,EAAQ,2CAA2C,EAG7E,SAAgB,gBAAgB,EAAwB,EAAkB,EAAiB,EAAe,EAAgB,EAA4C,EAA0D,CAC5N,IAAMC,EAAQF,EAAkB,KAAKG,EAAK,OAAO,EAC3CC,EAAaF,IAAU,KAAO,IAAa,OAAO,SAASA,EAAM,GAAI,EAAE,EACvEG,EAAcH,IAAU,KAAO,IAAa,OAAO,SAASA,EAAM,GAAI,EAAE,EAY9E,OAXcA,IAAU,MAAQA,EAAM,KAAOI,GAAW,OAAO,cAAcF,CAAU,GAAK,OAAO,cAAcC,CAAW,GACrHD,GAAc,aAAeA,GAAc,YAAcC,GAAe,aAAeA,GAAe,aACrGE,GAAkBH,GAAc,GAAKC,GAAe,GAKxDG,IAAa,KAIV,CAACJ,EAAYC,CAAW,GAH3BI,EAAQ,MAAMC,EAAgB,0BAA2B,OAAOJ,EAAQ,+CAAgDK,EAAWR,CAAI,CAAC,EACjI,OALPM,EAAQ,MAAMC,EAAgB,0BAA2B,WAAWJ,EAAQ,IAAIH,EAAK,QAAQ,gBAAgBG,EAAQ,IAAIM,EAAM,KAAKC,EAAO,uBAAuBN,EAAgB,GAAK,2BAA4BI,EAAWR,CAAI,CAAC,EAC5N,KAOf"}
@@ -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}from"./SourceLine.js";import{parseMappingSource as a}from"./ExpressionParser.js";import{firstWord as o}from"./LineText.js";import{parseTypeRef as s,reportLegacyOptionalSuffix as c}from"./PropertyLineParser.js";import{parseDescription as l}from"./DescriptionParser.js";import{sourceStreamPattern as u}from"../Text/SourceStreamNames.js";const d=r(`^id\\s+"(${t})"$`),f=u(`^(identifier|streamId)\\s+([\\w.]+(?:\\[\\])?(?:\\?|\\s+optional)?)$`),p=u(`^eventsource\\s+([A-Za-z_]\\w*)$`),m=u(`^stream\\s+([A-Za-z_]\\w*)$`);function parseEventSource(e,t){let n=p.exec(t.content)?.[1]??``;n===``&&invalid(e,t,`Expected 'eventsource <Name>'.`);let r=[],a=null,s=null,c=null;for(let i=e.peekChild(t.indent);i!==void 0;i=e.peekChild(t.indent))switch(e.reader.takeSignificant(),o(i.content)){case`stream`:r.push(parseEventStream(e,i));break;case`identifier`:a=parseType(e,i,`identifier`,a);break;case`description`:s=l(e,i,s,`Event source '${n}'`,!0);break;case`id`:c=parsePin(e,i,n,c);break;default:invalid(e,i,`An event source accepts description, id, identifier and stream declarations.`),e.skipBlock(i.indent)}return{kind:`EventSourceSyntax`,name:n,streams:r,identifier:a,description:s,id:c,location:i(t)}}function parseEventStream(e,t){let n=m.exec(t.content)?.[1]??``;n===``&&invalid(e,t,`Expected 'stream <Name>'.`);let r=null,a=[],s=!1,c={},u=null,d=null;for(let f=e.peekChild(t.indent);f!==void 0;f=e.peekChild(t.indent))switch(e.reader.takeSignificant(),o(f.content)){case`streamId`:s?(invalid(e,f,`Declare either one 'streamId <Type>' or one streamId part block.`),e.skipBlock(f.indent)):f.content===`streamId`?(s=!0,c.streamId=i(f),a=parseStreamIdParts(e,f)):(r=parseType(e,f,`streamId`,r),s=r!==null);break;case`description`:u=l(e,f,u,`Stream '${n}'`,!0);break;case`id`:d=parsePin(e,f,n,d);break;default:invalid(e,f,`A stream accepts description, id and streamId declarations.`),e.skipBlock(f.indent)}return{kind:`EventStreamSyntax`,name:n,streamId:r,streamIdParts:a,description:u,id:d,directiveLocations:c,location:i(t)}}function parseType(t,n,r,a){let o=f.exec(n.content);return o===null||a!==null?invalid(t,n,`Declare at most one '${r} <Type>'.`):(a=s(o[2],{...i(n),column:n.indent+1+n.content.indexOf(o[2],r.length)}),c(t,a,n)),rejectChildren(t,n,e.InvalidEventSourceDeclaration),a}function parsePin(t,r,a,o){let s=d.exec(r.content),c=s===null?null:n(s[1]);return c===null||c.trim()===``||o!==null?invalid(t,r,`Declare at most one nonempty rename-only 'id "<old-name>"'.`):(o=c,c===a&&t.information(e.RedundantSourceStreamId,`The rename pin repeats the current name; omit it for a new declaration.`,i(r))),rejectChildren(t,r,e.InvalidEventSourceDeclaration),o}function parseCommandStream(t,n,r,o){let[s,c]=r.type.name.split(`.`),l={kind:`CommandStreamSyntax`,eventSource:s,stream:c,streamId:null,streamIdParts:[],propertyCandidate:null,referenceLocation:r.type.location,referenceLength:r.type.name.length,location:i(n)};if(o)return t.error(e.AmbiguousCommandStream,`'${n.content}' has both a property type and a stream route interpretation; neither is selected.`,i(n)),{...l,propertyCandidate:r};let u=null,d=[],f=!1,p={};for(let r=t.peekChild(n.indent);r!==void 0;r=t.peekChild(n.indent)){if(t.reader.takeSignificant(),r.content===`streamId`){u!==null||f?(t.error(e.InvalidCommandStream,`Declare either one 'streamId = <source>' mapping or one streamId part block.`,i(r)),t.skipBlock(r.indent)):(f=!0,p.streamId=i(r),d=parseRouteParts(t,r,e.InvalidCommandStream));continue}let n=/^streamId\s*=\s*(.+)$/.exec(r.content);if(n===null||u!==null||f)t.error(e.InvalidCommandStream,`Declare either one 'streamId = <source>' mapping or one streamId part block.`,i(r)),t.skipBlock(r.indent);else{let o={...i(r),column:r.indent+1+r.content.indexOf(n[1],r.content.indexOf(`=`)+1)};u={kind:`PropertyMappingSyntax`,property:`streamId`,source:a(n[1],o,t),location:i(r)},rejectChildren(t,r,e.InvalidCommandStream)}}return{...l,streamId:u,streamIdParts:d,directiveLocations:p}}function parseStreamIdParts(t,n){let r=[],a=u(`^([A-Za-z_]\\w*)\\s+([\\w.]+(?:\\[\\])?(?:\\?|\\s+optional)?)$`);for(let o=t.peekChild(n.indent);o!==void 0;o=t.peekChild(n.indent)){t.reader.takeSignificant();let n=a.exec(o.content);if(n===null){invalid(t,o,`Expected '<part> <Type>' without modifiers in a streamId part block.`),t.skipBlock(o.indent);continue}let l=s(n[2],{...i(o),column:o.indent+1+o.content.indexOf(n[2],n[1].length)});c(t,l,o),r.push({kind:`EventStreamIdPartSyntax`,name:n[1],type:l,location:i(o)}),rejectChildren(t,o,e.InvalidEventSourceDeclaration)}return r.length===0&&invalid(t,n,`A streamId part block cannot be empty.`),r}function parseRouteParts(e,t,n){let r=[],o=u(`^([A-Za-z_]\\w*)\\s*=(?!=|>)\\s*(.+)$`);for(let s=e.peekChild(t.indent);s!==void 0;s=e.peekChild(t.indent)){e.reader.takeSignificant();let t=o.exec(s.content);if(t===null){e.error(n,`Expected '<part> = <source>' in a streamId part block.`,i(s)),e.skipBlock(s.indent);continue}let c={...i(s),column:s.indent+1+s.content.indexOf(t[2],s.content.indexOf(`=`)+1)};r.push({kind:`PropertyMappingSyntax`,property:t[1],source:a(t[2],c,e),location:i(s)}),rejectChildren(e,s,n)}return r.length===0&&e.error(n,`A streamId part block cannot be empty.`,i(t)),r}function rejectChildren(e,t,n){let r=e.peekChild(t.indent);r!==void 0&&(e.error(n,`This directive cannot have children.`,i(r)),e.skipBlock(t.indent))}function invalid(t,n,r){t.error(e.InvalidEventSourceDeclaration,r,i(n))}export{parseCommandStream,parseEventSource,parseRouteParts};
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}from"./SourceLine.js";import{parseMappingSource as a}from"./ExpressionParser.js";import{firstWord as o}from"./LineText.js";import{parseTypeRef as s,reportLegacyOptionalSuffix as c}from"./PropertyLineParser.js";import{parseDescription as l}from"./DescriptionParser.js";import{sourceStreamPattern as u}from"../Text/SourceStreamNames.js";import{parseCanvasPair as d}from"./CanvasPlacement.js";const f=r(`^id\\s+"(${t})"$`),p=u(`^(identifier|streamId)\\s+([\\w.]+(?:\\[\\])?(?:\\?|\\s+optional)?)$`),m=u(`^eventsource\\s+([A-Za-z_]\\w*)$`),h=u(`^stream\\s+([A-Za-z_]\\w*)$`);function parseEventSource(e,t){let n=m.exec(t.content)?.[1]??``;n===``&&invalid(e,t,`Expected 'eventsource <Name>'.`);let r=[],a=null,s=null,c=null,u=null;for(let i=e.peekChild(t.indent);i!==void 0;i=e.peekChild(t.indent))switch(e.reader.takeSignificant(),o(i.content)){case`position`:u=d(e,i,`position`,`x`,`y`,u,!0)??u;break;case`stream`:r.push(parseEventStream(e,i));break;case`identifier`:a=parseType(e,i,`identifier`,a);break;case`description`:s=l(e,i,s,`Event source '${n}'`,!0);break;case`id`:c=parsePin(e,i,n,c);break;default:invalid(e,i,`An event source accepts description, id, identifier, position and stream declarations.`),e.skipBlock(i.indent)}return{kind:`EventSourceSyntax`,name:n,streams:r,identifier:a,description:s,id:c,...u===null?{}:{x:u[0],y:u[1]},location:i(t)}}function parseEventStream(e,t){let n=h.exec(t.content)?.[1]??``;n===``&&invalid(e,t,`Expected 'stream <Name>'.`);let r=null,a=[],s=!1,c={},u=null,d=null;for(let f=e.peekChild(t.indent);f!==void 0;f=e.peekChild(t.indent))switch(e.reader.takeSignificant(),o(f.content)){case`streamId`:s?(invalid(e,f,`Declare either one 'streamId <Type>' or one streamId part block.`),e.skipBlock(f.indent)):f.content===`streamId`?(s=!0,c.streamId=i(f),a=parseStreamIdParts(e,f)):(r=parseType(e,f,`streamId`,r),s=r!==null);break;case`description`:u=l(e,f,u,`Stream '${n}'`,!0);break;case`id`:d=parsePin(e,f,n,d);break;default:invalid(e,f,`A stream accepts description, id and streamId declarations.`),e.skipBlock(f.indent)}return{kind:`EventStreamSyntax`,name:n,streamId:r,streamIdParts:a,description:u,id:d,directiveLocations:c,location:i(t)}}function parseType(t,n,r,a){let o=p.exec(n.content);return o===null||a!==null?invalid(t,n,`Declare at most one '${r} <Type>'.`):(a=s(o[2],{...i(n),column:n.indent+1+n.content.indexOf(o[2],r.length)}),c(t,a,n)),rejectChildren(t,n,e.InvalidEventSourceDeclaration),a}function parsePin(t,r,a,o){let s=f.exec(r.content),c=s===null?null:n(s[1]);return c===null||c.trim()===``||o!==null?invalid(t,r,`Declare at most one nonempty rename-only 'id "<old-name>"'.`):(o=c,c===a&&t.information(e.RedundantSourceStreamId,`The rename pin repeats the current name; omit it for a new declaration.`,i(r))),rejectChildren(t,r,e.InvalidEventSourceDeclaration),o}function parseCommandStream(t,n,r,o){let[s,c]=r.type.name.split(`.`),l={kind:`CommandStreamSyntax`,eventSource:s,stream:c,streamId:null,streamIdParts:[],propertyCandidate:null,referenceLocation:r.type.location,referenceLength:r.type.name.length,location:i(n)};if(o)return t.error(e.AmbiguousCommandStream,`'${n.content}' has both a property type and a stream route interpretation; neither is selected.`,i(n)),{...l,propertyCandidate:r};let u=null,d=[],f=!1,p={};for(let r=t.peekChild(n.indent);r!==void 0;r=t.peekChild(n.indent)){if(t.reader.takeSignificant(),r.content===`streamId`){u!==null||f?(t.error(e.InvalidCommandStream,`Declare either one 'streamId = <source>' mapping or one streamId part block.`,i(r)),t.skipBlock(r.indent)):(f=!0,p.streamId=i(r),d=parseRouteParts(t,r,e.InvalidCommandStream));continue}let n=/^streamId\s*=\s*(.+)$/.exec(r.content);if(n===null||u!==null||f)t.error(e.InvalidCommandStream,`Declare either one 'streamId = <source>' mapping or one streamId part block.`,i(r)),t.skipBlock(r.indent);else{let o={...i(r),column:r.indent+1+r.content.indexOf(n[1],r.content.indexOf(`=`)+1)};u={kind:`PropertyMappingSyntax`,property:`streamId`,source:a(n[1],o,t),location:i(r)},rejectChildren(t,r,e.InvalidCommandStream)}}return{...l,streamId:u,streamIdParts:d,directiveLocations:p}}function parseStreamIdParts(t,n){let r=[],a=u(`^([A-Za-z_]\\w*)\\s+([\\w.]+(?:\\[\\])?(?:\\?|\\s+optional)?)$`);for(let o=t.peekChild(n.indent);o!==void 0;o=t.peekChild(n.indent)){t.reader.takeSignificant();let n=a.exec(o.content);if(n===null){invalid(t,o,`Expected '<part> <Type>' without modifiers in a streamId part block.`),t.skipBlock(o.indent);continue}let l=s(n[2],{...i(o),column:o.indent+1+o.content.indexOf(n[2],n[1].length)});c(t,l,o),r.push({kind:`EventStreamIdPartSyntax`,name:n[1],type:l,location:i(o)}),rejectChildren(t,o,e.InvalidEventSourceDeclaration)}return r.length===0&&invalid(t,n,`A streamId part block cannot be empty.`),r}function parseRouteParts(e,t,n){let r=[],o=u(`^([A-Za-z_]\\w*)\\s*=(?!=|>)\\s*(.+)$`);for(let s=e.peekChild(t.indent);s!==void 0;s=e.peekChild(t.indent)){e.reader.takeSignificant();let t=o.exec(s.content);if(t===null){e.error(n,`Expected '<part> = <source>' in a streamId part block.`,i(s)),e.skipBlock(s.indent);continue}let c={...i(s),column:s.indent+1+s.content.indexOf(t[2],s.content.indexOf(`=`)+1)};r.push({kind:`PropertyMappingSyntax`,property:t[1],source:a(t[2],c,e),location:i(s)}),rejectChildren(e,s,n)}return r.length===0&&e.error(n,`A streamId part block cannot be empty.`,i(t)),r}function rejectChildren(e,t,n){let r=e.peekChild(t.indent);r!==void 0&&(e.error(n,`This directive cannot have children.`,i(r)),e.skipBlock(t.indent))}function invalid(t,n,r){t.error(e.InvalidEventSourceDeclaration,r,i(n))}export{parseCommandStream,parseEventSource,parseRouteParts};
2
2
  //# sourceMappingURL=EventSourceParser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EventSourceParser.js","names":["pinPattern","pattern","stringBodyPattern","typeDirective","sourceStreamPattern","sourceHeader","streamHeader","name","header","context","streams","identifier","description","id","child","firstWord","parseDescription","locationOf","streamId","streamIdParts","declared","directiveLocations","match","line","previous","keyword","parseTypeRef","reportLegacyOptionalSuffix","DiagnosticCodes","value","unescapeString","eventSource","stream","candidate","route","ambiguous","block","location","parseMappingSource","parts","declaration","type","mapping","code","message"],"sources":["../../../../../../Compiler/Parsing/EventSourceParser.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 { TypeRefSyntax, PropertySyntax } from '../Syntax/Declarations';\nimport { CommandStreamSyntax, EventSourceSyntax, EventStreamSyntax, EventStreamIdPartSyntax } from '../Syntax/EventSources';\nimport { PropertyMappingSyntax } from '../Syntax/Expressions';\nimport { stringBodyPattern, unescapeString } from '../Text/StringLiteral';\nimport { pattern } from '../Text/patterns';\nimport { sourceStreamPattern } from '../Text/SourceStreamNames';\nimport { parseDescription } from './DescriptionParser';\nimport { parseMappingSource } from './ExpressionParser';\nimport { firstWord } from './LineText';\nimport { ParserContext } from './ParserContext';\nimport { parseTypeRef, reportLegacyOptionalSuffix } from './PropertyLineParser';\nimport { locationOf, SourceLine } from './SourceLine';\n\nconst pinPattern = pattern(`^id\\\\s+\"(${stringBodyPattern})\"$`);\nconst typeDirective = sourceStreamPattern('^(identifier|streamId)\\\\s+([\\\\w.]+(?:\\\\[\\\\])?(?:\\\\?|\\\\s+optional)?)$');\nconst sourceHeader = sourceStreamPattern('^eventsource\\\\s+([A-Za-z_]\\\\w*)$');\nconst streamHeader = sourceStreamPattern('^stream\\\\s+([A-Za-z_]\\\\w*)$');\n\nexport function parseEventSource(context: ParserContext, header: SourceLine): EventSourceSyntax {\n const name = sourceHeader.exec(header.content)?.[1] ?? '';\n if (name === '') invalid(context, header, \"Expected 'eventsource <Name>'.\");\n const streams: EventStreamSyntax[] = [];\n let identifier: TypeRefSyntax | null = null;\n let description: string | null = null;\n let id: string | null = null;\n for (let child = context.peekChild(header.indent); child !== undefined; child = context.peekChild(header.indent)) {\n context.reader.takeSignificant();\n switch (firstWord(child.content)) {\n case 'stream': streams.push(parseEventStream(context, child)); break;\n case 'identifier': identifier = parseType(context, child, 'identifier', identifier); break;\n case 'description': description = parseDescription(context, child, description, `Event source '${name}'`, true); break;\n case 'id': id = parsePin(context, child, name, id); break;\n default: invalid(context, child, 'An event source accepts description, id, identifier and stream declarations.'); context.skipBlock(child.indent); break;\n }\n }\n return { kind: 'EventSourceSyntax', name, streams, identifier, description, id, location: locationOf(header) };\n}\n\nfunction parseEventStream(context: ParserContext, header: SourceLine): EventStreamSyntax {\n const name = streamHeader.exec(header.content)?.[1] ?? '';\n if (name === '') invalid(context, header, \"Expected 'stream <Name>'.\");\n let streamId: TypeRefSyntax | null = null;\n let streamIdParts: EventStreamIdPartSyntax[] = [];\n let declared = false;\n const directiveLocations: Record<string, ReturnType<typeof locationOf>> = {};\n let description: string | null = null;\n let id: string | null = null;\n for (let child = context.peekChild(header.indent); child !== undefined; child = context.peekChild(header.indent)) {\n context.reader.takeSignificant();\n switch (firstWord(child.content)) {\n case 'streamId':\n if (declared) {\n invalid(context, child, \"Declare either one 'streamId <Type>' or one streamId part block.\");\n context.skipBlock(child.indent);\n } else if (child.content === 'streamId') {\n declared = true;\n directiveLocations.streamId = locationOf(child);\n streamIdParts = parseStreamIdParts(context, child);\n } else {\n streamId = parseType(context, child, 'streamId', streamId);\n declared = streamId !== null;\n }\n break;\n case 'description': description = parseDescription(context, child, description, `Stream '${name}'`, true); break;\n case 'id': id = parsePin(context, child, name, id); break;\n default: invalid(context, child, 'A stream accepts description, id and streamId declarations.'); context.skipBlock(child.indent); break;\n }\n }\n return { kind: 'EventStreamSyntax', name, streamId, streamIdParts, description, id, directiveLocations, location: locationOf(header) };\n}\n\nfunction parseType(context: ParserContext, line: SourceLine, keyword: string, previous: TypeRefSyntax | null): TypeRefSyntax | null {\n const match = typeDirective.exec(line.content);\n if (match === null || previous !== null) invalid(context, line, `Declare at most one '${keyword} <Type>'.`);\n else {\n previous = parseTypeRef(match[2], { ...locationOf(line), column: line.indent + 1 + line.content.indexOf(match[2], keyword.length) });\n reportLegacyOptionalSuffix(context, previous, line);\n }\n rejectChildren(context, line, DiagnosticCodes.InvalidEventSourceDeclaration);\n return previous;\n}\n\nfunction parsePin(context: ParserContext, line: SourceLine, name: string, previous: string | null): string | null {\n const match = pinPattern.exec(line.content);\n const value = match === null ? null : unescapeString(match[1]);\n if (value === null || value.trim() === '' || previous !== null) invalid(context, line, 'Declare at most one nonempty rename-only \\'id \"<old-name>\"\\'.');\n else {\n previous = value;\n if (value === name) context.information(DiagnosticCodes.RedundantSourceStreamId, 'The rename pin repeats the current name; omit it for a new declaration.', locationOf(line));\n }\n rejectChildren(context, line, DiagnosticCodes.InvalidEventSourceDeclaration);\n return previous;\n}\n\nexport function parseCommandStream(context: ParserContext, header: SourceLine, candidate: PropertySyntax, ambiguous: boolean): CommandStreamSyntax {\n const [eventSource, stream] = candidate.type.name.split('.');\n const route: CommandStreamSyntax = { kind: 'CommandStreamSyntax', eventSource, stream, streamId: null, streamIdParts: [], propertyCandidate: null, referenceLocation: candidate.type.location, referenceLength: candidate.type.name.length, location: locationOf(header) };\n if (ambiguous) {\n context.error(DiagnosticCodes.AmbiguousCommandStream, `'${header.content}' has both a property type and a stream route interpretation; neither is selected.`, locationOf(header));\n // Ordinary properties are leaves; preserve deeper legacy command members in this case.\n return { ...route, propertyCandidate: candidate };\n }\n let streamId: PropertyMappingSyntax | null = null;\n let streamIdParts: PropertyMappingSyntax[] = [];\n let block = false;\n const directiveLocations: Record<string, ReturnType<typeof locationOf>> = {};\n for (let child = context.peekChild(header.indent); child !== undefined; child = context.peekChild(header.indent)) {\n context.reader.takeSignificant();\n if (child.content === 'streamId') {\n if (streamId !== null || block) {\n context.error(DiagnosticCodes.InvalidCommandStream, \"Declare either one 'streamId = <source>' mapping or one streamId part block.\", locationOf(child));\n context.skipBlock(child.indent);\n } else {\n block = true;\n directiveLocations.streamId = locationOf(child);\n streamIdParts = parseRouteParts(context, child, DiagnosticCodes.InvalidCommandStream);\n }\n continue;\n }\n const match = /^streamId\\s*=\\s*(.+)$/.exec(child.content);\n if (match === null || streamId !== null || block) {\n context.error(DiagnosticCodes.InvalidCommandStream, \"Declare either one 'streamId = <source>' mapping or one streamId part block.\", locationOf(child));\n context.skipBlock(child.indent);\n } else {\n const location = { ...locationOf(child), column: child.indent + 1 + child.content.indexOf(match[1], child.content.indexOf('=') + 1) };\n streamId = { kind: 'PropertyMappingSyntax', property: 'streamId', source: parseMappingSource(match[1], location, context), location: locationOf(child) };\n rejectChildren(context, child, DiagnosticCodes.InvalidCommandStream);\n }\n }\n return { ...route, streamId, streamIdParts, directiveLocations };\n}\n\nfunction parseStreamIdParts(context: ParserContext, header: SourceLine): EventStreamIdPartSyntax[] {\n const parts: EventStreamIdPartSyntax[] = [];\n const declaration = sourceStreamPattern('^([A-Za-z_]\\\\w*)\\\\s+([\\\\w.]+(?:\\\\[\\\\])?(?:\\\\?|\\\\s+optional)?)$');\n for (let child = context.peekChild(header.indent); child !== undefined; child = context.peekChild(header.indent)) {\n context.reader.takeSignificant();\n const match = declaration.exec(child.content);\n if (match === null) {\n invalid(context, child, \"Expected '<part> <Type>' without modifiers in a streamId part block.\");\n context.skipBlock(child.indent);\n continue;\n }\n const type = parseTypeRef(match[2], { ...locationOf(child), column: child.indent + 1 + child.content.indexOf(match[2], match[1].length) });\n reportLegacyOptionalSuffix(context, type, child);\n parts.push({ kind: 'EventStreamIdPartSyntax', name: match[1], type, location: locationOf(child) });\n rejectChildren(context, child, DiagnosticCodes.InvalidEventSourceDeclaration);\n }\n if (parts.length === 0) invalid(context, header, 'A streamId part block cannot be empty.');\n return parts;\n}\n\nexport function parseRouteParts(context: ParserContext, header: SourceLine, code: string): PropertyMappingSyntax[] {\n const parts: PropertyMappingSyntax[] = [];\n const mapping = sourceStreamPattern('^([A-Za-z_]\\\\w*)\\\\s*=(?!=|>)\\\\s*(.+)$');\n for (let child = context.peekChild(header.indent); child !== undefined; child = context.peekChild(header.indent)) {\n context.reader.takeSignificant();\n const match = mapping.exec(child.content);\n if (match === null) {\n context.error(code, \"Expected '<part> = <source>' in a streamId part block.\", locationOf(child));\n context.skipBlock(child.indent);\n continue;\n }\n const location = { ...locationOf(child), column: child.indent + 1 + child.content.indexOf(match[2], child.content.indexOf('=') + 1) };\n parts.push({ kind: 'PropertyMappingSyntax', property: match[1], source: parseMappingSource(match[2], location, context), location: locationOf(child) });\n rejectChildren(context, child, code);\n }\n if (parts.length === 0) context.error(code, 'A streamId part block cannot be empty.', locationOf(header));\n return parts;\n}\n\nfunction rejectChildren(context: ParserContext, line: SourceLine, code: string): void {\n const child = context.peekChild(line.indent);\n if (child !== undefined) {\n context.error(code, 'This directive cannot have children.', locationOf(child));\n context.skipBlock(line.indent);\n }\n}\n\nfunction invalid(context: ParserContext, line: SourceLine, message: string): void { context.error(DiagnosticCodes.InvalidEventSourceDeclaration, message, locationOf(line)); }\n"],"mappings":"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"}
1
+ {"version":3,"file":"EventSourceParser.js","names":["pinPattern","pattern","stringBodyPattern","typeDirective","sourceStreamPattern","sourceHeader","streamHeader","name","header","context","streams","identifier","description","id","position","child","firstWord","parseCanvasPair","parseDescription","locationOf","streamId","streamIdParts","declared","directiveLocations","match","line","previous","keyword","parseTypeRef","reportLegacyOptionalSuffix","DiagnosticCodes","value","unescapeString","eventSource","stream","candidate","route","ambiguous","block","location","parseMappingSource","parts","declaration","type","mapping","code","message"],"sources":["../../../../../../Compiler/Parsing/EventSourceParser.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 { TypeRefSyntax, PropertySyntax } from '../Syntax/Declarations';\nimport { CommandStreamSyntax, EventSourceSyntax, EventStreamSyntax, EventStreamIdPartSyntax } from '../Syntax/EventSources';\nimport { PropertyMappingSyntax } from '../Syntax/Expressions';\nimport { stringBodyPattern, unescapeString } from '../Text/StringLiteral';\nimport { pattern } from '../Text/patterns';\nimport { sourceStreamPattern } from '../Text/SourceStreamNames';\nimport { parseCanvasPair } from './CanvasPlacement';\nimport { parseDescription } from './DescriptionParser';\nimport { parseMappingSource } from './ExpressionParser';\nimport { firstWord } from './LineText';\nimport { ParserContext } from './ParserContext';\nimport { parseTypeRef, reportLegacyOptionalSuffix } from './PropertyLineParser';\nimport { locationOf, SourceLine } from './SourceLine';\n\nconst pinPattern = pattern(`^id\\\\s+\"(${stringBodyPattern})\"$`);\nconst typeDirective = sourceStreamPattern('^(identifier|streamId)\\\\s+([\\\\w.]+(?:\\\\[\\\\])?(?:\\\\?|\\\\s+optional)?)$');\nconst sourceHeader = sourceStreamPattern('^eventsource\\\\s+([A-Za-z_]\\\\w*)$');\nconst streamHeader = sourceStreamPattern('^stream\\\\s+([A-Za-z_]\\\\w*)$');\n\nexport function parseEventSource(context: ParserContext, header: SourceLine): EventSourceSyntax {\n const name = sourceHeader.exec(header.content)?.[1] ?? '';\n if (name === '') invalid(context, header, \"Expected 'eventsource <Name>'.\");\n const streams: EventStreamSyntax[] = [];\n let identifier: TypeRefSyntax | null = null;\n let description: string | null = null;\n let id: string | null = null;\n let position: readonly [number, number] | null = null;\n for (let child = context.peekChild(header.indent); child !== undefined; child = context.peekChild(header.indent)) {\n context.reader.takeSignificant();\n switch (firstWord(child.content)) {\n case 'position': position = parseCanvasPair(context, child, 'position', 'x', 'y', position, true) ?? position; break;\n case 'stream': streams.push(parseEventStream(context, child)); break;\n case 'identifier': identifier = parseType(context, child, 'identifier', identifier); break;\n case 'description': description = parseDescription(context, child, description, `Event source '${name}'`, true); break;\n case 'id': id = parsePin(context, child, name, id); break;\n default: invalid(context, child, 'An event source accepts description, id, identifier, position and stream declarations.'); context.skipBlock(child.indent); break;\n }\n }\n return { kind: 'EventSourceSyntax', name, streams, identifier, description, id, ...(position === null ? {} : { x: position[0], y: position[1] }), location: locationOf(header) };\n}\n\nfunction parseEventStream(context: ParserContext, header: SourceLine): EventStreamSyntax {\n const name = streamHeader.exec(header.content)?.[1] ?? '';\n if (name === '') invalid(context, header, \"Expected 'stream <Name>'.\");\n let streamId: TypeRefSyntax | null = null;\n let streamIdParts: EventStreamIdPartSyntax[] = [];\n let declared = false;\n const directiveLocations: Record<string, ReturnType<typeof locationOf>> = {};\n let description: string | null = null;\n let id: string | null = null;\n for (let child = context.peekChild(header.indent); child !== undefined; child = context.peekChild(header.indent)) {\n context.reader.takeSignificant();\n switch (firstWord(child.content)) {\n case 'streamId':\n if (declared) {\n invalid(context, child, \"Declare either one 'streamId <Type>' or one streamId part block.\");\n context.skipBlock(child.indent);\n } else if (child.content === 'streamId') {\n declared = true;\n directiveLocations.streamId = locationOf(child);\n streamIdParts = parseStreamIdParts(context, child);\n } else {\n streamId = parseType(context, child, 'streamId', streamId);\n declared = streamId !== null;\n }\n break;\n case 'description': description = parseDescription(context, child, description, `Stream '${name}'`, true); break;\n case 'id': id = parsePin(context, child, name, id); break;\n default: invalid(context, child, 'A stream accepts description, id and streamId declarations.'); context.skipBlock(child.indent); break;\n }\n }\n return { kind: 'EventStreamSyntax', name, streamId, streamIdParts, description, id, directiveLocations, location: locationOf(header) };\n}\n\nfunction parseType(context: ParserContext, line: SourceLine, keyword: string, previous: TypeRefSyntax | null): TypeRefSyntax | null {\n const match = typeDirective.exec(line.content);\n if (match === null || previous !== null) invalid(context, line, `Declare at most one '${keyword} <Type>'.`);\n else {\n previous = parseTypeRef(match[2], { ...locationOf(line), column: line.indent + 1 + line.content.indexOf(match[2], keyword.length) });\n reportLegacyOptionalSuffix(context, previous, line);\n }\n rejectChildren(context, line, DiagnosticCodes.InvalidEventSourceDeclaration);\n return previous;\n}\n\nfunction parsePin(context: ParserContext, line: SourceLine, name: string, previous: string | null): string | null {\n const match = pinPattern.exec(line.content);\n const value = match === null ? null : unescapeString(match[1]);\n if (value === null || value.trim() === '' || previous !== null) invalid(context, line, 'Declare at most one nonempty rename-only \\'id \"<old-name>\"\\'.');\n else {\n previous = value;\n if (value === name) context.information(DiagnosticCodes.RedundantSourceStreamId, 'The rename pin repeats the current name; omit it for a new declaration.', locationOf(line));\n }\n rejectChildren(context, line, DiagnosticCodes.InvalidEventSourceDeclaration);\n return previous;\n}\n\nexport function parseCommandStream(context: ParserContext, header: SourceLine, candidate: PropertySyntax, ambiguous: boolean): CommandStreamSyntax {\n const [eventSource, stream] = candidate.type.name.split('.');\n const route: CommandStreamSyntax = { kind: 'CommandStreamSyntax', eventSource, stream, streamId: null, streamIdParts: [], propertyCandidate: null, referenceLocation: candidate.type.location, referenceLength: candidate.type.name.length, location: locationOf(header) };\n if (ambiguous) {\n context.error(DiagnosticCodes.AmbiguousCommandStream, `'${header.content}' has both a property type and a stream route interpretation; neither is selected.`, locationOf(header));\n // Ordinary properties are leaves; preserve deeper legacy command members in this case.\n return { ...route, propertyCandidate: candidate };\n }\n let streamId: PropertyMappingSyntax | null = null;\n let streamIdParts: PropertyMappingSyntax[] = [];\n let block = false;\n const directiveLocations: Record<string, ReturnType<typeof locationOf>> = {};\n for (let child = context.peekChild(header.indent); child !== undefined; child = context.peekChild(header.indent)) {\n context.reader.takeSignificant();\n if (child.content === 'streamId') {\n if (streamId !== null || block) {\n context.error(DiagnosticCodes.InvalidCommandStream, \"Declare either one 'streamId = <source>' mapping or one streamId part block.\", locationOf(child));\n context.skipBlock(child.indent);\n } else {\n block = true;\n directiveLocations.streamId = locationOf(child);\n streamIdParts = parseRouteParts(context, child, DiagnosticCodes.InvalidCommandStream);\n }\n continue;\n }\n const match = /^streamId\\s*=\\s*(.+)$/.exec(child.content);\n if (match === null || streamId !== null || block) {\n context.error(DiagnosticCodes.InvalidCommandStream, \"Declare either one 'streamId = <source>' mapping or one streamId part block.\", locationOf(child));\n context.skipBlock(child.indent);\n } else {\n const location = { ...locationOf(child), column: child.indent + 1 + child.content.indexOf(match[1], child.content.indexOf('=') + 1) };\n streamId = { kind: 'PropertyMappingSyntax', property: 'streamId', source: parseMappingSource(match[1], location, context), location: locationOf(child) };\n rejectChildren(context, child, DiagnosticCodes.InvalidCommandStream);\n }\n }\n return { ...route, streamId, streamIdParts, directiveLocations };\n}\n\nfunction parseStreamIdParts(context: ParserContext, header: SourceLine): EventStreamIdPartSyntax[] {\n const parts: EventStreamIdPartSyntax[] = [];\n const declaration = sourceStreamPattern('^([A-Za-z_]\\\\w*)\\\\s+([\\\\w.]+(?:\\\\[\\\\])?(?:\\\\?|\\\\s+optional)?)$');\n for (let child = context.peekChild(header.indent); child !== undefined; child = context.peekChild(header.indent)) {\n context.reader.takeSignificant();\n const match = declaration.exec(child.content);\n if (match === null) {\n invalid(context, child, \"Expected '<part> <Type>' without modifiers in a streamId part block.\");\n context.skipBlock(child.indent);\n continue;\n }\n const type = parseTypeRef(match[2], { ...locationOf(child), column: child.indent + 1 + child.content.indexOf(match[2], match[1].length) });\n reportLegacyOptionalSuffix(context, type, child);\n parts.push({ kind: 'EventStreamIdPartSyntax', name: match[1], type, location: locationOf(child) });\n rejectChildren(context, child, DiagnosticCodes.InvalidEventSourceDeclaration);\n }\n if (parts.length === 0) invalid(context, header, 'A streamId part block cannot be empty.');\n return parts;\n}\n\nexport function parseRouteParts(context: ParserContext, header: SourceLine, code: string): PropertyMappingSyntax[] {\n const parts: PropertyMappingSyntax[] = [];\n const mapping = sourceStreamPattern('^([A-Za-z_]\\\\w*)\\\\s*=(?!=|>)\\\\s*(.+)$');\n for (let child = context.peekChild(header.indent); child !== undefined; child = context.peekChild(header.indent)) {\n context.reader.takeSignificant();\n const match = mapping.exec(child.content);\n if (match === null) {\n context.error(code, \"Expected '<part> = <source>' in a streamId part block.\", locationOf(child));\n context.skipBlock(child.indent);\n continue;\n }\n const location = { ...locationOf(child), column: child.indent + 1 + child.content.indexOf(match[2], child.content.indexOf('=') + 1) };\n parts.push({ kind: 'PropertyMappingSyntax', property: match[1], source: parseMappingSource(match[2], location, context), location: locationOf(child) });\n rejectChildren(context, child, code);\n }\n if (parts.length === 0) context.error(code, 'A streamId part block cannot be empty.', locationOf(header));\n return parts;\n}\n\nfunction rejectChildren(context: ParserContext, line: SourceLine, code: string): void {\n const child = context.peekChild(line.indent);\n if (child !== undefined) {\n context.error(code, 'This directive cannot have children.', locationOf(child));\n context.skipBlock(line.indent);\n }\n}\n\nfunction invalid(context: ParserContext, line: SourceLine, message: string): void { context.error(DiagnosticCodes.InvalidEventSourceDeclaration, message, locationOf(line)); }\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{parseEventSource as b}from"./EventSourceParser.js";import{isFileDirective as x}from"./FileReferences.js";import{parseSystem as S}from"./OperationParser.js";import{parseExample as C}from"./SpecificationExampleParser.js";import{isBlankPublicEventOrigin as w}from"../Syntax/PublicEventInvariants.js";import{parseType as ee}from"./DeclarationParsers.js";import{parseValidate as T}from"./CommandParser.js";import{parseTriggerDeclaration as te}from"./TriggerDataParser.js";import{FeatureBody as ne,featureBodyExpected as E}from"./FeatureBody.js";import{ModuleBody as D,moduleBodyExpected as O,modulePattern as k,parseModule as re}from"./ModuleBody.js";import{EnumerationMembers as A}from"./EnumerationMembers.js";import{parseGeneration as j}from"./GenerationParser.js";import{parseIdentity as M}from"./IdentityParser.js";import{parsePolicy as N}from"./PolicyParser.js";import{parseSeed as P}from"./SeedParser.js";import{parseExposure as F,parseInstance as I}from"./CompositionParser.js";import{parseUiProfile as L}from"./UiProfileLegacyLayout.js";const R=r(`^domain\\s+([A-Za-z_]\\w*(?:\\.[A-Za-z_]\\w*)*)$`),z=r(`^import\\s+([\\w.]+)(?:\\s+from\\s+"(?<origin>${t})")?$`),B=r(`^concept\\s+(\\w+)\\s*:\\s*(\\w+)((?:\\s+@?\\w+)*)$`),V=r(`^@?[a-z_]\\w*$`),H=r(`^persona\\s+([A-Za-z_]\\w*)$`),U=r(`^policy\\s+([A-Za-z_]\\w*)$`),W=/^[ ]*\t/,G=[`Uuid`,`String`,`Int`,`Decimal`,`Bool`,`Date`,`DateTime`],K=/* @__PURE__ */ new Set([`policy`,`authentication`,`seed`,`ui`,`theme`,`trigger`,`layout`,`behavior`,`sample`]),q=/* @__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 ne(a[a.length-1]):void 0,l=o??s,u=null,p=null,x=!1,T=null,E=!1,O=null,k=[],A=[],j=[],R=[],B=[],V=[],H=[],U=[],W=[],G=[],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))E||!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)):T=`Protected`,E=!0;else if(s===`reaction`)x||!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`,x=!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=z.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&&w(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(C(t,r)):l.tryParse(t,r);else if(s===`eventsource`)V.push(b(t,r));else if(s===`system`)B.push(S(t,r));else if(s===`concept`)j.push(parseConcept(t,r));else if(s===`type`)R.push(ee(t,r));else if(s===`module`&&!f(a))parseModuleInPlacedFile(t,r,a,o);else if(s===`module`)H.push(re(t,r));else if(s===`persona`)U.push(parsePersona(t,r));else if(s===`seed`)q.push(P(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=M(t,r,u);else if(s===`policy`){let n=N(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(F(t,r));else if(s===`instance`)Z.push(I(t,r));else if(s===`trigger`){let e=te(t,r),n=/^trigger\s+([A-Za-z_]\w*)$/.exec(r.content)?.[1];n!==void 0&&Y.push({name:n,data:e})}else K.has(s)?s===`behavior`||s===`layout`?v(t,r):s===`ui`?L(t,r):t.skipOpaqueBlock(r.indent):l?.tryParse(t,r)!==!0&&reportUnexpectedTopLevel(t,r,a)}o===void 0?s!==void 0&&H.unshift(place(a,s.build(t.start,!0),t.start)):H.unshift(o.build(t.start,!0));let $={kind:`ApplicationSyntax`,...T===null?{}:{commandReadMode:T},...p===null?{}:{reactionProductionMode:p},...u===null?{}:{identity:u},sourceOptions:t.sourceOptions,domain:O,imports:k,concepts:j,types:R,systems:B,eventSources:V,examples:J,modules:H,personas:U,policies:W,purposes:G,seeds:q,declaredTriggers:Y,fileImports:A,...X.length>0?{exposures:X}:{},...Z.length>0?{instanceContributions:Z}:{},location:t.start};return t.authoredDeclarations&&_($),$}function declaresConstruct(e,t,n){return e===`import`?z.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`||K.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=q.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, authentication, 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=R.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&&W.test(i.raw)&&t.warning(e.TabIndentation,`Screenplay is indentation based - use spaces, not tabs`,a(i))}function parseConcept(t,n){let r=B.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`&&!G.includes(u)&&t.error(e.UnknownPrimitiveType,`Unknown primitive type '${u}' - expected ${G.join(`, `)} or Enum`,i(n));let m=[],h=new A,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=T(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=j(t,r,u);_||(g=n),_=!0}else o(t,r,a,f)||(u===`Enum`&&V.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,n){let r=H.exec(n.content)?.[1]??``;r===``&&t.error(e.InvalidPersonaDeclaration,`Invalid persona declaration '${n.content}' - expected 'persona <Name>'`,i(n));let a=null,o=[];for(let s=t.peekChild(n.indent);s!==void 0;s=t.peekChild(n.indent)){t.reader.takeSignificant();let n=c(s.content);if(n===`description`)a=p(t,s,a,`Persona '${r}'`);else if(n===`policy`){let n=U.exec(s.content);n===null?t.error(e.InvalidPersonaPolicyReference,`Invalid policy reference '${s.content}' - expected 'policy <Name>'`,i(s)):o.push(n[1])}else t.error(e.UnknownPersonaDirective,`Unexpected '${n}' in persona body - expected description or policy`,i(s)),t.skipBlock(s.indent)}return{kind:`PersonaSyntax`,name:r,description:a,policies:o,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 x}from"./EventSourceParser.js";import{isFileDirective as S}from"./FileReferences.js";import{parseSystem as C}from"./OperationParser.js";import{parseExample as w}from"./SpecificationExampleParser.js";import{isBlankPublicEventOrigin as ee}from"../Syntax/PublicEventInvariants.js";import{parseType as te}from"./DeclarationParsers.js";import{parseValidate as T}from"./CommandParser.js";import{parseTriggerDeclaration as E}from"./TriggerDataParser.js";import{FeatureBody as D,featureBodyExpected as O}from"./FeatureBody.js";import{ModuleBody as k,moduleBodyExpected as A,modulePattern as j,parseModule as M}from"./ModuleBody.js";import{EnumerationMembers as N}from"./EnumerationMembers.js";import{parseGeneration as P}from"./GenerationParser.js";import{parseIdentity as F}from"./IdentityParser.js";import{parsePolicy as ne}from"./PolicyParser.js";import{parseSeed as re}from"./SeedParser.js";import{parseExposure as ie,parseInstance as I}from"./CompositionParser.js";import{parseUiProfile as L}from"./UiProfileLegacyLayout.js";const R=r(`^domain\\s+([A-Za-z_]\\w*(?:\\.[A-Za-z_]\\w*)*)$`),z=r(`^import\\s+([\\w.]+)(?:\\s+from\\s+"(?<origin>${t})")?$`),B=r(`^concept\\s+(\\w+)\\s*:\\s*(\\w+)((?:\\s+@?\\w+)*)$`),V=r(`^@?[a-z_]\\w*$`),H=r(`^persona\\s+([A-Za-z_]\\w*)$`),U=r(`^policy\\s+([A-Za-z_]\\w*)$`),W=r(`^goal\\s+"(${t})"$`),G=r(`^sticky\\s+note\\s+on\\s+(personas|eventsources|givencontexts|seeddata)$`),K=r(`^colour\\s+(yellow|pink|green|blue)$`),q=/^[ ]*\t/,J=[`Uuid`,`String`,`Int`,`Decimal`,`Bool`,`Date`,`DateTime`],Y=/* @__PURE__ */ new Set([`policy`,`authentication`,`seed`,`ui`,`theme`,`trigger`,`layout`,`behavior`,`sample`]),X=/* @__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 k(a[0]):void 0,s=a.length>1?new D(a[a.length-1]):void 0,l=o??s,u=null,p=null,b=!1,S=null,T=!1,O=null,A=[],j=[],N=[],P=[],R=[],B=[],V=[],H=[],U=[],W=[],G=[],K=[],q=[],J=[],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))T||!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)):S=`Protected`,T=!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,j):l.tryParse(t,r);else if(s===`import`){let a=z.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&&ee(o)&&t.error(e.InvalidImportDeclaration,`An import origin must be a nonblank quoted string`,i(r)),A.push({kind:`ImportSyntax`,qualifiedName:a[1],origin:o,visibility:o===null?`Private`:`Public`,location:i(r)})}}else if(s===`example`)l===void 0?q.push(w(t,r)):l.tryParse(t,r);else if(s===`eventsource`)B.push(x(t,r));else if(s===`system`)R.push(C(t,r));else if(s===`concept`)N.push(parseConcept(t,r));else if(s===`type`)P.push(te(t,r));else if(s===`module`&&!f(a))parseModuleInPlacedFile(t,r,a,o);else if(s===`module`)V.push(M(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(re(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=F(t,r,u);else if(s===`policy`){let n=ne(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(ie(t,r));else if(s===`instance`)Z.push(I(t,r));else if(s===`trigger`){let e=E(t,r),n=/^trigger\s+([A-Za-z_]\w*)$/.exec(r.content)?.[1];n!==void 0&&J.push({name:n,data:e})}else Y.has(s)?s===`behavior`||s===`layout`?v(t,r):s===`ui`?L(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`,...S===null?{}:{commandReadMode:S},...p===null?{}:{reactionProductionMode:p},...u===null?{}:{identity:u},sourceOptions:t.sourceOptions,domain:O,imports:A,concepts:N,types:P,systems:R,eventSources:B,examples:q,modules:V,personas:H,policies:W,purposes:G,seeds:K,declaredTriggers:J,fileImports:j,...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`?z.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`||Y.has(e)}function parseModuleInPlacedFile(t,n,r,a){let o=j.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=X.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, 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?A:O;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=R.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&&q.test(i.raw)&&t.warning(e.TabIndentation,`Screenplay is indentation based - use spaces, not tabs`,a(i))}function parseConcept(t,n){let r=B.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`&&!J.includes(u)&&t.error(e.UnknownPrimitiveType,`Unknown primitive type '${u}' - expected ${J.join(`, `)} or Enum`,i(n));let m=[],h=new N,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(S(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=T(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=P(t,r,u);_||(g=n),_=!0}else o(t,r,a,f)||(u===`Enum`&&V.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=H.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=W.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=U.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=G.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=K.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","importPattern","stringBodyPattern","conceptPattern","enumValuePattern","personaPattern","personaPolicyPattern","tabIndentPattern","primitiveTypes","opaqueTopLevel","bodyKeywords","documentPlacement","context","lines","moduleBody","placement","ModuleBody","featureBody","FeatureBody","placedBody","identity","reactionProductionMode","sawReactionBatches","commandReadMode","sawCommandReads","domain","imports","fileImports","concepts","types","systems","eventSources","modules","personas","policies","purposes","seeds","examples","declaredTriggers","exposures","instanceContributions","sawOtherConstruct","line","keyword","firstWord","isDocumentPlacement","DiagnosticCodes","locationOf","misplacedReactionIdentity","isFileImport","parseFileImport","match","origin","unescapeString","isBlankPublicEventOrigin","parseExample","parseEventSource","parseSystem","parseType","parseModule","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"],"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 } from '../Syntax/Authorization';\nimport { ConceptSyntax, DomainSyntax, ImportSyntax, TypeSyntax } from '../Syntax/Declarations';\nimport { SpecificationExampleSyntax } from '../Syntax/Specifications';\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 { 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 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 tabIndentPattern = /^[ ]*\\t/;\nconst primitiveTypes = ['Uuid', 'String', 'Int', 'Decimal', 'Bool', 'Date', 'DateTime'];\n\n// Top-level, module and feature constructs the C# compiler knows that this compiler does not model. They\n// are skipped whole, not reported.\nconst opaqueTopLevel = new Set(['policy', 'authentication', 'seed', 'ui', 'theme', 'trigger', 'layout', 'behavior', 'sample']);\n\n// What belongs in a module or feature body; at the top level of a whole document it gets a hint saying so.\nconst bodyKeywords = new Set(['slice', 'feature', 'description', 'documentation', 'authorize', 'screen', 'dialog', 'form', 'contribute', 'on', 'uses']);\n\n// Parses one document into its application syntax - the port of the C# ScreenplayParser. The placement says\n// where the document's top level belongs: the application, unless an import placed it in a module or feature.\nexport function parseApplication(context: ParserContext, lines: readonly SourceLine[], placement: PlayPlacement = documentPlacement): ApplicationSyntax {\n context.deferIdentityValidation = true;\n warnOnTabIndentation(context, lines);\n const moduleBody = placement.length === 1 ? new ModuleBody(placement[0]) : undefined;\n const featureBody = placement.length > 1 ? new FeatureBody(placement[placement.length - 1]) : undefined;\n const placedBody = moduleBody ?? featureBody;\n let identity: IdentitySyntax | null = null;\n let reactionProductionMode: ReactionProductionMode | null = null;\n let sawReactionBatches = false;\n let commandReadMode: CommandReadMode | null = null;\n let 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 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 === '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 === '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 }), ...(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 } : {}), ...(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' || 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, authentication, identity, module, seed, trigger, behavior, ui profile, theme, sample data or layout';\n context.error(DiagnosticCodes.UnknownTopLevelConstruct, `Unexpected '${word}' at the top level${hint}`, locationOf(line));\n }\n context.skipBlock(line.indent);\n}\n\n// Wraps the feature a file is placed in in the features and module around it, each marked as a placement.\nfunction place(placement: PlayPlacement, innermost: FeatureSyntax, start: SourceLocation): ModuleSyntax {\n let feature = innermost;\n for (let index = placement.length - 2; index >= 1; index--) {\n feature = {\n kind: 'FeatureSyntax', name: placement[index], description: null, authorize: null,\n features: [feature], slices: [], fileImports: [], isPlacement: true, location: start,\n };\n }\n return {\n kind: 'ModuleSyntax', name: placement[0], description: null, authorize: null,\n features: [feature], fileImports: [], isPlacement: true, location: start,\n };\n}\n\nfunction parseDomain(context: ParserContext, line: SourceLine, existing: DomainSyntax | null, sawOtherConstruct: boolean): DomainSyntax | null {\n const match = domainPattern.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidDomainDeclaration, `Invalid domain declaration '${line.content}' - expected 'domain <Qualified.Name>'`, locationOf(line));\n return existing;\n }\n if (existing !== null) {\n context.error(DiagnosticCodes.DuplicateDomain, 'The document already declares a domain - a document can have at most one', locationOf(line));\n return existing;\n }\n if (sawOtherConstruct) {\n context.error(DiagnosticCodes.DomainNotFirst, '\\'domain\\' must be declared before any other construct', locationOf(line));\n }\n return { kind: 'DomainSyntax', name: match[1], location: locationOf(line) };\n}\n\nfunction warnOnTabIndentation(context: ParserContext, lines: readonly SourceLine[]): void {\n let inFence = false;\n for (const line of lines) {\n if (line.raw.trimStart().startsWith('```')) {\n inFence = !inFence;\n continue;\n }\n if (!inFence && tabIndentPattern.test(line.raw)) {\n context.warning(DiagnosticCodes.TabIndentation, 'Screenplay is indentation based - use spaces, not tabs', startOf(line));\n }\n }\n}\n\nfunction parseConcept(context: ParserContext, line: SourceLine): ConceptSyntax {\n const match = conceptPattern.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidConceptDeclaration, `Invalid concept declaration '${line.content}' - expected 'concept <Name> : <Type>'`, locationOf(line));\n context.skipBlock(line.indent);\n return { kind: 'ConceptSyntax', name: firstWord(line.content), type: '', attributes: [], values: [], location: locationOf(line) };\n }\n const [, name, type, attributeText] = match;\n const attributes = parseComplianceMarkers(context, line, name, attributeText);\n if (type !== 'Enum' && !primitiveTypes.includes(type)) {\n context.error(DiagnosticCodes.UnknownPrimitiveType, `Unknown primitive type '${type}' - expected ${primitiveTypes.join(', ')} or Enum`, locationOf(line));\n }\n const values: string[] = [];\n const members = new EnumerationMembers();\n let generation: GenerationSyntax | null = null;\n let declaredGeneration = false;\n let description: string | null = null;\n const validations: ValidateSyntax[] = [];\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n const memberName = type === 'Enum' ? members.tryNumbered(context, child) : undefined;\n if (memberName !== undefined) {\n values.push(memberName);\n } else if (firstWord(child.content) === 'description' && (type !== 'Enum' || child.content !== 'description' || context.peekChild(child.indent)?.content.startsWith('```') === true)) {\n description = parseDescription(context, child, description, `Concept '${name}'`);\n } else if (isFileDirective(child)) {\n continue;\n } else if (firstWord(child.content) === 'validate') {\n if (type === 'Enum' && child.content === 'validate' && context.peekChild(child.indent) === undefined) {\n context.warning(DiagnosticCodes.ValidateReadAsEnumerationBlock,\n `'validate' in enumeration concept '${name}' declares an empty validate block, not a value named 'validate' - write '@validate' for the value`,\n locationOf(child));\n }\n const parsed = parseValidate(context, child, 'concept', name);\n if (parsed !== undefined) validations.push(parsed);\n } else if (firstWord(child.content) === 'generate' && !(type === 'Enum' && child.content === 'generate')) {\n if (declaredGeneration) context.error(DiagnosticCodes.DuplicateGeneration, `Concept '${name}' declares generation more than once.`, locationOf(child));\n const parsed = parseGeneration(context, child, type);\n if (!declaredGeneration) generation = parsed;\n declaredGeneration = true;\n } else if (parseComplianceDirective(context, child, name, attributes)) {\n // Compliance directives are modeled by their original concept marker.\n } else if (type === 'Enum' && enumValuePattern.test(child.content)) {\n values.push(unescapeIdentifier(child.content));\n } else if (type === 'Enum') {\n context.error(DiagnosticCodes.InvalidEnumerationValue, `Invalid enum value '${child.content}' - expected an identifier`, locationOf(child));\n } else {\n context.error(DiagnosticCodes.UnknownConceptDirective, `Unexpected '${child.content}' in concept body - expected validate, generate, 'file <path>' or '<attribute> reason \"<text>\"'`, locationOf(child));\n context.skipBlock(child.indent);\n }\n }\n const valueNumbers = members.finish(context, line, values.length);\n return { kind: 'ConceptSyntax', name, type, attributes, values, validations, description, ...(generation === null ? {} : { generation }), ...(valueNumbers === undefined ? {} : { valueNumbers }), location: locationOf(line) };\n}\n\n// 'persona <Name>' with an optional description and the policies it holds - the port of the C# ParsePersona.\nfunction parsePersona(context: ParserContext, line: SourceLine): PersonaSyntax {\n const name = personaPattern.exec(line.content)?.[1] ?? '';\n if (name === '') {\n context.error(DiagnosticCodes.InvalidPersonaDeclaration, `Invalid persona declaration '${line.content}' - expected 'persona <Name>'`, locationOf(line));\n }\n let description: string | null = null;\n const policies: string[] = [];\n 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 === '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 or policy`, locationOf(child));\n context.skipBlock(child.indent);\n }\n }\n return { kind: 'PersonaSyntax', name, description, policies, location: locationOf(line) };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ScreenplayParser.js","names":["domainPattern","pattern","importPattern","stringBodyPattern","conceptPattern","enumValuePattern","personaPattern","personaPolicyPattern","personaGoalPattern","stickyNotePattern","stickyNoteColourPattern","tabIndentPattern","primitiveTypes","opaqueTopLevel","bodyKeywords","documentPlacement","context","lines","moduleBody","placement","ModuleBody","featureBody","FeatureBody","placedBody","identity","reactionProductionMode","sawReactionBatches","commandReadMode","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","misplacedReactionIdentity","isFileImport","parseFileImport","match","origin","unescapeString","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 { 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 importPattern = pattern(`^import\\\\s+([\\\\w.]+)(?:\\\\s+from\\\\s+\"(?<origin>${stringBodyPattern})\")?$`);\nconst conceptPattern = pattern('^concept\\\\s+(\\\\w+)\\\\s*:\\\\s*(\\\\w+)((?:\\\\s+@?\\\\w+)*)$');\nconst enumValuePattern = pattern('^@?[a-z_]\\\\w*$');\nconst personaPattern = pattern('^persona\\\\s+([A-Za-z_]\\\\w*)$');\nconst personaPolicyPattern = pattern('^policy\\\\s+([A-Za-z_]\\\\w*)$');\nconst personaGoalPattern = pattern(`^goal\\\\s+\"(${stringBodyPattern})\"$`);\nconst stickyNotePattern = pattern('^sticky\\\\s+note\\\\s+on\\\\s+(personas|eventsources|givencontexts|seeddata)$');\nconst stickyNoteColourPattern = pattern('^colour\\\\s+(yellow|pink|green|blue)$');\nconst tabIndentPattern = /^[ ]*\\t/;\nconst primitiveTypes = ['Uuid', 'String', 'Int', 'Decimal', 'Bool', 'Date', 'DateTime'];\n\n// Top-level, module and feature constructs the C# compiler knows that this compiler does not model. They\n// are skipped whole, not reported.\nconst opaqueTopLevel = new Set(['policy', 'authentication', 'seed', 'ui', 'theme', 'trigger', 'layout', 'behavior', 'sample']);\n\n// What belongs in a module or feature body; at the top level of a whole document it gets a hint saying so.\nconst bodyKeywords = new Set(['slice', 'feature', 'description', 'documentation', 'authorize', 'screen', 'dialog', 'form', 'contribute', 'on', 'uses']);\n\n// Parses one document into its application syntax - the port of the C# ScreenplayParser. The placement says\n// where the document's top level belongs: the application, unless an import placed it in a module or feature.\nexport function parseApplication(context: ParserContext, lines: readonly SourceLine[], placement: PlayPlacement = documentPlacement): ApplicationSyntax {\n context.deferIdentityValidation = true;\n warnOnTabIndentation(context, lines);\n const moduleBody = placement.length === 1 ? new ModuleBody(placement[0]) : undefined;\n const featureBody = placement.length > 1 ? new FeatureBody(placement[placement.length - 1]) : undefined;\n const placedBody = moduleBody ?? featureBody;\n let identity: IdentitySyntax | null = null;\n let reactionProductionMode: ReactionProductionMode | null = null;\n let sawReactionBatches = false;\n let commandReadMode: CommandReadMode | null = null;\n let 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 === '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 }), ...(reactionProductionMode === null ? {} : { reactionProductionMode }), ...(identity === null ? {} : { identity }), sourceOptions: context.sourceOptions, domain, imports, concepts, types, systems, eventSources, examples, modules, personas, policies, purposes, seeds, declaredTriggers, fileImports, ...(exposures.length > 0 ? { exposures } : {}), ...(stickyNotes.length > 0 ? { stickyNotes } : {}), ...(instanceContributions.length > 0 ? { instanceContributions } : {}), location: context.start };\n if (context.authoredDeclarations) recordAuthoredDocument(root);\n return root;\n}\n\nfunction declaresConstruct(keyword: string, line: SourceLine, placement: PlayPlacement): boolean {\n if (keyword === 'import') {\n return importPattern.test(line.content);\n }\n if (keyword === 'module') {\n return isDocumentPlacement(placement);\n }\n if (keyword === 'identity') return line.content === 'identity';\n return keyword === 'purpose' || keyword === 'example' || keyword === 'exposure' || keyword === 'instance' || keyword === 'eventsource' || keyword === 'system' || keyword === 'concept' || keyword === 'type' || keyword === 'persona' || keyword === 'sticky' || opaqueTopLevel.has(keyword);\n}\n\nfunction parseModuleInPlacedFile(context: ParserContext, line: SourceLine, placement: PlayPlacement, moduleBody: ModuleBody | undefined): void {\n const name = modulePattern.exec(line.content)?.[1] ?? '';\n\n // Restating the module a file is placed in says nothing new, so its body simply joins the placement.\n if (moduleBody !== undefined && name === placement[0]) {\n context.authoredDeclarations = true;\n moduleBody.parseChildren(context, line);\n return;\n }\n context.error(DiagnosticCodes.ModuleInPlacedFile,\n `This file is imported into ${describePlacement(placement)}, so it cannot declare module '${name}' - import it at the top level of a document instead`, locationOf(line));\n context.skipBlock(line.indent);\n}\n\nfunction reportUnexpectedTopLevel(context: ParserContext, line: SourceLine, placement: PlayPlacement): void {\n const word = firstWord(line.content);\n if (!isDocumentPlacement(placement)) {\n const expected = placement.length === 1 ? moduleBodyExpected : featureBodyExpected;\n context.error(DiagnosticCodes.UnexpectedInPlacedFile,\n `Unexpected '${word}' in a file imported into ${describePlacement(placement)} - expected an application declaration or ${expected}`, locationOf(line));\n } else {\n const hint = bodyKeywords.has(word)\n ? ` - '${word}' belongs in a module or feature; wrap it in one, or import this file from inside one`\n : ' - expected domain, import, concept, type, policy, persona, sticky note, authentication, identity, module, seed, trigger, behavior, ui profile, theme, sample data or layout';\n context.error(DiagnosticCodes.UnknownTopLevelConstruct, `Unexpected '${word}' at the top level${hint}`, locationOf(line));\n }\n context.skipBlock(line.indent);\n}\n\n// Wraps the feature a file is placed in in the features and module around it, each marked as a placement.\nfunction place(placement: PlayPlacement, innermost: FeatureSyntax, start: SourceLocation): ModuleSyntax {\n let feature = innermost;\n for (let index = placement.length - 2; index >= 1; index--) {\n feature = {\n kind: 'FeatureSyntax', name: placement[index], description: null, authorize: null,\n features: [feature], slices: [], fileImports: [], isPlacement: true, location: start,\n };\n }\n return {\n kind: 'ModuleSyntax', name: placement[0], description: null, authorize: null,\n features: [feature], fileImports: [], isPlacement: true, location: start,\n };\n}\n\nfunction parseDomain(context: ParserContext, line: SourceLine, existing: DomainSyntax | null, sawOtherConstruct: boolean): DomainSyntax | null {\n const match = domainPattern.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidDomainDeclaration, `Invalid domain declaration '${line.content}' - expected 'domain <Qualified.Name>'`, locationOf(line));\n return existing;\n }\n if (existing !== null) {\n context.error(DiagnosticCodes.DuplicateDomain, 'The document already declares a domain - a document can have at most one', locationOf(line));\n return existing;\n }\n if (sawOtherConstruct) {\n context.error(DiagnosticCodes.DomainNotFirst, '\\'domain\\' must be declared before any other construct', locationOf(line));\n }\n return { kind: 'DomainSyntax', name: match[1], location: locationOf(line) };\n}\n\nfunction warnOnTabIndentation(context: ParserContext, lines: readonly SourceLine[]): void {\n let inFence = false;\n for (const line of lines) {\n if (line.raw.trimStart().startsWith('```')) {\n inFence = !inFence;\n continue;\n }\n if (!inFence && tabIndentPattern.test(line.raw)) {\n context.warning(DiagnosticCodes.TabIndentation, 'Screenplay is indentation based - use spaces, not tabs', startOf(line));\n }\n }\n}\n\nfunction parseConcept(context: ParserContext, line: SourceLine): ConceptSyntax {\n const match = conceptPattern.exec(line.content);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidConceptDeclaration, `Invalid concept declaration '${line.content}' - expected 'concept <Name> : <Type>'`, locationOf(line));\n context.skipBlock(line.indent);\n return { kind: 'ConceptSyntax', name: firstWord(line.content), type: '', attributes: [], values: [], location: locationOf(line) };\n }\n const [, name, type, attributeText] = match;\n const attributes = parseComplianceMarkers(context, line, name, attributeText);\n if (type !== 'Enum' && !primitiveTypes.includes(type)) {\n context.error(DiagnosticCodes.UnknownPrimitiveType, `Unknown primitive type '${type}' - expected ${primitiveTypes.join(', ')} or Enum`, locationOf(line));\n }\n const values: string[] = [];\n const members = new EnumerationMembers();\n let generation: GenerationSyntax | null = null;\n let declaredGeneration = false;\n let description: string | null = null;\n const validations: ValidateSyntax[] = [];\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n const memberName = type === 'Enum' ? members.tryNumbered(context, child) : undefined;\n if (memberName !== undefined) {\n values.push(memberName);\n } else if (firstWord(child.content) === 'description' && (type !== 'Enum' || child.content !== 'description' || context.peekChild(child.indent)?.content.startsWith('```') === true)) {\n description = parseDescription(context, child, description, `Concept '${name}'`);\n } else if (isFileDirective(child)) {\n continue;\n } else if (firstWord(child.content) === 'validate') {\n if (type === 'Enum' && child.content === 'validate' && context.peekChild(child.indent) === undefined) {\n context.warning(DiagnosticCodes.ValidateReadAsEnumerationBlock,\n `'validate' in enumeration concept '${name}' declares an empty validate block, not a value named 'validate' - write '@validate' for the value`,\n locationOf(child));\n }\n const parsed = parseValidate(context, child, 'concept', name);\n if (parsed !== undefined) validations.push(parsed);\n } else if (firstWord(child.content) === 'generate' && !(type === 'Enum' && child.content === 'generate')) {\n if (declaredGeneration) context.error(DiagnosticCodes.DuplicateGeneration, `Concept '${name}' declares generation more than once.`, locationOf(child));\n const parsed = parseGeneration(context, child, type);\n if (!declaredGeneration) generation = parsed;\n declaredGeneration = true;\n } else if (parseComplianceDirective(context, child, name, attributes)) {\n // Compliance directives are modeled by their original concept marker.\n } else if (type === 'Enum' && enumValuePattern.test(child.content)) {\n values.push(unescapeIdentifier(child.content));\n } else if (type === 'Enum') {\n context.error(DiagnosticCodes.InvalidEnumerationValue, `Invalid enum value '${child.content}' - expected an identifier`, locationOf(child));\n } else {\n context.error(DiagnosticCodes.UnknownConceptDirective, `Unexpected '${child.content}' in concept body - expected validate, generate, 'file <path>' or '<attribute> reason \"<text>\"'`, locationOf(child));\n context.skipBlock(child.indent);\n }\n }\n const valueNumbers = members.finish(context, line, values.length);\n return { kind: 'ConceptSyntax', name, type, attributes, values, validations, description, ...(generation === null ? {} : { generation }), ...(valueNumbers === undefined ? {} : { valueNumbers }), location: locationOf(line) };\n}\n\n// 'persona <Name>' with an optional description and the policies it holds - the port of the C# ParsePersona.\nfunction parsePersona(context: ParserContext, line: SourceLine): PersonaSyntax {\n const name = personaPattern.exec(line.content)?.[1] ?? '';\n if (name === '') {\n context.error(DiagnosticCodes.InvalidPersonaDeclaration, `Invalid persona declaration '${line.content}' - expected 'persona <Name>'`, locationOf(line));\n }\n let description: string | null = null;\n const policies: string[] = [];\n const goals: string[] = [];\n let position: readonly [number, number] | null = null;\n let size: readonly [number, number] | null = null;\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n const keyword = firstWord(child.content);\n if (keyword === 'description') {\n description = parseDescription(context, child, description, `Persona '${name}'`);\n } else if (keyword === 'goal') {\n const goal = personaGoalPattern.exec(child.content);\n if (goal === null) {\n context.error(DiagnosticCodes.InvalidPersonaDeclaration, `Invalid goal '${child.content}' - expected 'goal \"<text>\"'`, locationOf(child));\n } else {\n goals.push(unescapeString(goal[1]));\n }\n } else if (keyword === 'position') {\n position = parseCanvasPair(context, child, 'position', 'x', 'y', position, true) ?? position;\n } else if (keyword === 'size') {\n size = parseCanvasPair(context, child, 'size', 'width', 'height', size, false) ?? size;\n } else if (keyword === 'policy') {\n const policy = personaPolicyPattern.exec(child.content);\n if (policy === null) {\n context.error(DiagnosticCodes.InvalidPersonaPolicyReference, `Invalid policy reference '${child.content}' - expected 'policy <Name>'`, locationOf(child));\n } else {\n policies.push(policy[1]);\n }\n } else {\n context.error(DiagnosticCodes.UnknownPersonaDirective, `Unexpected '${keyword}' in persona body - expected description, goal, policy, position or size`, locationOf(child));\n context.skipBlock(child.indent);\n }\n }\n return {\n kind: 'PersonaSyntax', name, description, policies,\n ...(goals.length > 0 ? { goals } : {}),\n ...(position === null ? {} : { x: position[0], y: position[1] }),\n ...(size === null ? {} : { width: size[0], height: size[1] }),\n location: locationOf(line),\n };\n}\n\n// 'sticky note on <canvas>' with the text it carries, an optional colour and where it sits on that canvas - the port of the C# ParseStickyNote.\nfunction parseStickyNote(context: ParserContext, line: SourceLine): StickyNoteSyntax | null {\n const canvasMatch = stickyNotePattern.exec(line.content);\n if (canvasMatch === null) {\n context.error(DiagnosticCodes.InvalidPersonaDeclaration, `Invalid sticky note declaration '${line.content}' - expected 'sticky note on personas', 'sticky note on eventsources', 'sticky note on givencontexts' or 'sticky note on seeddata'`, locationOf(line));\n context.skipBlock(line.indent);\n return null;\n }\n let text: string | null = null;\n let colour: string | null = null;\n let position: readonly [number, number] | null = null;\n let size: readonly [number, number] | null = null;\n for (let child = context.peekChild(line.indent); child !== undefined; child = context.peekChild(line.indent)) {\n context.reader.takeSignificant();\n const keyword = firstWord(child.content);\n if (keyword === 'description') {\n text = parseDescription(context, child, text, 'A sticky note');\n } else if (keyword === 'colour') {\n const match = stickyNoteColourPattern.exec(child.content);\n if (match === null) {\n context.error(DiagnosticCodes.InvalidPersonaDeclaration, `Invalid colour '${child.content}' - expected 'colour yellow', 'colour pink', 'colour green' or 'colour blue'`, locationOf(child));\n } else {\n colour = match[1];\n }\n } else if (keyword === 'position') {\n position = parseCanvasPair(context, child, 'position', 'x', 'y', position, true) ?? position;\n } else if (keyword === 'size') {\n size = parseCanvasPair(context, child, 'size', 'width', 'height', size, false) ?? size;\n } else {\n context.error(DiagnosticCodes.UnknownPersonaDirective, `Unexpected '${keyword}' in sticky note body - expected description, colour, position or size`, locationOf(child));\n context.skipBlock(child.indent);\n }\n }\n if (text === null || position === null) {\n context.error(DiagnosticCodes.InvalidPersonaDeclaration, 'A sticky note needs a description (the text on it) and a position', locationOf(line));\n return null;\n }\n return { kind: 'StickyNoteSyntax', canvas: canvasMatch[1] as StickyNoteSyntax['canvas'], text, colour, x: position[0], y: position[1], width: size === null ? null : size[0], height: size === null ? null : size[1], location: locationOf(line) };\n}\n\n"],"mappings":"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"}