@cratis/screenplay-language 4.213.4 → 4.214.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles/compiler/Diagnostics/DiagnosticCodes.js +1 -1
- package/dist/bundles/compiler/Diagnostics/DiagnosticCodes.js.map +1 -1
- package/dist/bundles/compiler/Files/PlayFolderMerge.js +1 -1
- package/dist/bundles/compiler/Files/PlayFolderMerge.js.map +1 -1
- package/dist/bundles/compiler/Parsing/EventSourceValidator.js +1 -1
- package/dist/bundles/compiler/Parsing/EventSourceValidator.js.map +1 -1
- package/dist/bundles/compiler/Parsing/ScreenplayParser.js +1 -1
- package/dist/bundles/compiler/Parsing/ScreenplayParser.js.map +1 -1
- package/dist/bundles/compiler/Parsing/SpecificationStreamValidator.js +1 -1
- package/dist/bundles/compiler/Parsing/SpecificationStreamValidator.js.map +1 -1
- package/dist/bundles/diagnostic-codes.js +1 -1
- package/dist/bundles/diagnostic-codes.js.map +1 -1
- package/dist/bundles/validation.js +1 -1
- package/dist/bundles/validation.js.map +1 -1
- package/dist/diagnostic-codes.d.ts +0 -1
- package/dist/diagnostic-codes.d.ts.map +1 -1
- package/dist/validation.d.ts.map +1 -1
- 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{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{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 ee}from"../Syntax/PublicEventInvariants.js";import{parseType as w}from"./DeclarationParsers.js";import{parseValidate as T}from"./CommandParser.js";import{parseTriggerDeclaration as te}from"./TriggerDataParser.js";import{FeatureBody as E,featureBodyExpected as D}from"./FeatureBody.js";import{ModuleBody as ne,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 ne(a[0]):void 0,s=a.length>1?new E(a[a.length-1]):void 0,l=o??s,u=null,p=null,x=!1,T=null,D=!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))D||!f(a)||!/^command\s+reads\s+protected$/.test(r.content)?t.error(e.InvalidCommandReadsDeclaration,`Declare 'command reads protected' once at the application root.`,i(r)):T=`Protected`,D=!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&&ee(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(w(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`)W.push(N(t,r));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:D;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};
|
|
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","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","parsePolicy","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","policy"],"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 // Legacy policies were opaque: enrich their structure without adding diagnostics.\n policies.push(parsePolicy(context, line));\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,2 +1,2 @@
|
|
|
1
|
-
import"../../_virtual/_virtual/_rolldown/runtime.js";import{DiagnosticCodes as e}from"../Diagnostics/DiagnosticCodes.js";import{AuthoringProductionResolver as t}from"../Syntax/AuthoringProductionResolver.js";import{diagnosticText as n}from"../Diagnostics/DiagnosticArgument.js";import{EventSourceCatalog as r}from"../Syntax/EventSourceCatalog.js";import{expandEffectiveSpecificationExamples as i,specificationExamples as a}from"./SpecificationCommandExamples.js";import{compatibleValue as o,uniqueByName as s}from"./ResponseValidator.js";import{commandDestinationType as c}from"./CommandDestinationTypes.js";import{LineReader as l}from"./LineReader.js";import{ParserContext as u}from"./ParserContext.js";import{streamIdFailureMessage as d}from"../Syntax/StreamIdFormatter.js";import{validateStreamIdParts as f}from"./CompositeStreamIdValidator.js";import{formatSpecificationStreamId as p}from"./SpecificationRouteComparison.js";import{formatStreamIdLiteral as m}from"./EventSourceValidator.js";function validateSpecificationStreams(n,r){let i=new t(n).slices.flatMap(({slice:e})=>e.specifications.flatMap(e=>e.cases??[]));if(i.length===0)return validateRoutes(n,r);let a=new u(new l([]));validateRoutes(n,a);let o=/* @__PURE__ */ new Set,s=/* @__PURE__ */ new Set;for(let t of a.diagnostics){let n=JSON.stringify([t.code,t.location.path,t.location.line,t.location.column,t.message]);if(s.has(n))continue;s.add(n);let a=t.code===e.InvalidSpecificationStreamRoute?i.find(e=>e.values.some(e=>e.source.location.line===t.location.line&&e.source.location.column===t.location.column&&e.source.location.path===t.location.path)):void 0;if(a===void 0)r.error(t.code,t.message,t.location,t.arguments);else{let e=JSON.stringify(t.location);o.has(e)||r.error(t.code,`Case '${a.name}': ${t.message}`,t.location,t.arguments),o.add(e)}}}function validateRoutes(l,u){let h=a(l).resolvedExamples,g=i(l);l=g.application;let _=new t(l),v=/* @__PURE__ */ new Set,y=h.flatMap(t=>{if(t.kind!==`event`)return(t.kind===`command`||t.kind===`readmodel`)&&(t.example.stream!=null||t.example.noStream!=null)&&u.error(e.InvalidSpecificationExampleBody,`only event examples carry routes; a command's route comes from its declaration, and read models have none`,(t.example.stream??t.example.noStream).location,n(`example`,t.example.name)),[];let r={kind:`SpecificationEventSyntax`,eventType:t.name,values:t.example.values,for:t.example.for,stream:t.example.stream,noStream:t.example.noStream,location:t.example.location};return v.add(r),[{scope:t.scope,specification:{when:null,given:[],whenAppended:null,thenEvents:[r],whenRedelivered:null}}]}),b=new r(l),x=s(l.concepts),S=s(l.types),C=new Map([...S].map(([e,t])=>[e,s(t.properties)])),compatible=(e,t)=>o(e,t,x,C),w=/* @__PURE__ */ new Set([`String`,`Uuid`,`Int`,`Decimal`,`Bool`,`Date`,`DateTime`,...x.keys(),...S.keys()]),nominallyCompatible=(e,t)=>w.has(e.name)&&w.has(t.name)?e.name===t.name&&e.isCollection===t.isCollection&&(!e.isOptional||t.isOptional):null,formatStreamId=(e,t)=>p(e,t,l),eventOf=(e,t)=>{let n=_.resolve(e,t).declaration;return n?.node.kind===`EventSyntax`?n.node:null},T=[];for(let{slice:e}of _.slices){for(let t of e.commands)for(let n of t.produces){if(!_.isEventProduction(n,e))continue;let r=eventOf(n.event,e);if(r===null)continue;let i=c(t,n,l,{resolver:_,slice:e});T.push({event:r,command:t,type:i,route:n.stream??t.stream})}for(let t of e.reactions.flatMap(e=>e.triggers).flatMap(e=>
|
|
1
|
+
import"../../_virtual/_virtual/_rolldown/runtime.js";import{DiagnosticCodes as e}from"../Diagnostics/DiagnosticCodes.js";import{AuthoringProductionResolver as t}from"../Syntax/AuthoringProductionResolver.js";import{diagnosticText as n}from"../Diagnostics/DiagnosticArgument.js";import{EventSourceCatalog as r}from"../Syntax/EventSourceCatalog.js";import{expandEffectiveSpecificationExamples as i,specificationExamples as a}from"./SpecificationCommandExamples.js";import{compatibleValue as o,uniqueByName as s}from"./ResponseValidator.js";import{commandDestinationType as c}from"./CommandDestinationTypes.js";import{LineReader as l}from"./LineReader.js";import{ParserContext as u}from"./ParserContext.js";import{streamIdFailureMessage as d}from"../Syntax/StreamIdFormatter.js";import{validateStreamIdParts as f}from"./CompositeStreamIdValidator.js";import{formatSpecificationStreamId as p}from"./SpecificationRouteComparison.js";import{formatStreamIdLiteral as m}from"./EventSourceValidator.js";function validateSpecificationStreams(n,r){let i=new t(n).slices.flatMap(({slice:e})=>e.specifications.flatMap(e=>e.cases??[]));if(i.length===0)return validateRoutes(n,r);let a=new u(new l([]));validateRoutes(n,a);let o=/* @__PURE__ */ new Set,s=/* @__PURE__ */ new Set;for(let t of a.diagnostics){let n=JSON.stringify([t.code,t.location.path,t.location.line,t.location.column,t.message]);if(s.has(n))continue;s.add(n);let a=t.code===e.InvalidSpecificationStreamRoute?i.find(e=>e.values.some(e=>e.source.location.line===t.location.line&&e.source.location.column===t.location.column&&e.source.location.path===t.location.path)):void 0;if(a===void 0)r.error(t.code,t.message,t.location,t.arguments);else{let e=JSON.stringify(t.location);o.has(e)||r.error(t.code,`Case '${a.name}': ${t.message}`,t.location,t.arguments),o.add(e)}}}function validateRoutes(l,u){let h=a(l).resolvedExamples,g=i(l);l=g.application;let _=new t(l),v=/* @__PURE__ */ new Set,y=h.flatMap(t=>{if(t.kind!==`event`)return(t.kind===`command`||t.kind===`readmodel`)&&(t.example.stream!=null||t.example.noStream!=null)&&u.error(e.InvalidSpecificationExampleBody,`only event examples carry routes; a command's route comes from its declaration, and read models have none`,(t.example.stream??t.example.noStream).location,n(`example`,t.example.name)),[];let r={kind:`SpecificationEventSyntax`,eventType:t.name,values:t.example.values,for:t.example.for,stream:t.example.stream,noStream:t.example.noStream,location:t.example.location};return v.add(r),[{scope:t.scope,specification:{when:null,given:[],whenAppended:null,thenEvents:[r],whenRedelivered:null}}]}),b=new r(l),x=s(l.concepts),S=s(l.types),C=new Map([...S].map(([e,t])=>[e,s(t.properties)])),compatible=(e,t)=>o(e,t,x,C),w=/* @__PURE__ */ new Set([`String`,`Uuid`,`Int`,`Decimal`,`Bool`,`Date`,`DateTime`,...x.keys(),...S.keys()]),nominallyCompatible=(e,t)=>w.has(e.name)&&w.has(t.name)?e.name===t.name&&e.isCollection===t.isCollection&&(!e.isOptional||t.isOptional):null,formatStreamId=(e,t)=>p(e,t,l),eventOf=(e,t)=>{let n=_.resolve(e,t).declaration;return n?.node.kind===`EventSyntax`?n.node:null},T=[];for(let{slice:e}of _.slices){for(let t of e.commands)for(let n of t.produces){if(!_.isEventProduction(n,e))continue;let r=eventOf(n.event,e);if(r===null)continue;let i=c(t,n,l,{resolver:_,slice:e});T.push({event:r,command:t,type:i,route:n.stream??t.stream})}for(let t of e.reactions.flatMap(e=>e.triggers).flatMap(e=>e.produces)){let n=eventOf(t.event,e);n!==null&&T.push({event:n,command:null,type:null})}for(let t of e.captures)for(let n of[...t.appends,...t.children.flatMap(e=>e.appends),...t.nested.flatMap(e=>e.appends)]){let t=eventOf(n.event,e);t!==null&&T.push({event:t,command:null,type:null})}}let E=[...y.flatMap(e=>_.slices.filter(t=>t.scope.join(`.`)===e.scope.join(`.`)).map(({slice:t,scope:n})=>({slice:t,scope:n,specification:e.specification}))),..._.slices.flatMap(({slice:e,scope:t})=>e.specifications.map(n=>({slice:e,scope:t,specification:n})))];for(let{slice:t,scope:n,specification:r}of E){let i=_.slices.flatMap(e=>e.slice.commands.map(t=>({command:t,scope:e.scope}))),a=r.when?.commandType.split(`.`)??[],o=a.slice(0,-1),s=i.filter(e=>e.command.name===a.at(-1)&&o.every((t,n)=>e.scope[e.scope.length-o.length+n]===t)),c=o.length>0&&s.length===1?s[0].command:null;for(let e=n.length;o.length===0&&e>=0&&c===null;e--){let t=s.filter(t=>n.slice(0,e).every((e,n)=>t.scope[n]===e));if(t.length>0){c=t.length===1?t[0].command:null;break}}let p=[...r.given.map(e=>({node:e,required:!0,expected:!1})),...r.whenAppended===null?[]:[{node:r.whenAppended,required:!0,expected:!1}],...r.thenEvents.map(e=>({node:e,required:!1,expected:!v.has(e)})),...r.whenRedelivered==null?[]:[{node:{...r.whenRedelivered,kind:`SpecificationEventSyntax`},required:!1,expected:!1}]];for(let{node:n,required:r,expected:i}of p){let a=g.specifications.flatMap(e=>e.steps).find(e=>e.effective===n),o=a?.route?.origin!==`example`,s=o||n.for!==a?.example?.for,contextualError=(e,t,n)=>{u.error(e,a?.example==null?t:`${t} Example '${a.example.name}' is used here.`,a?.example==null?n:a.authored.location)};if(n.stream==null&&n.noStream==null)continue;r&&n.noStream!=null&&contextualError(e.InvalidSpecificationStream,`Expected 'stream Source.Stream', or 'no stream' on a then event.`,n.noStream.location);let p=null,h=eventOf(n.eventType,t),_=T.filter(e=>e.event===h);if(n.stream!=null){let t=n.stream,i=b.resolve(t.eventSource,t.stream);if(i.kind!==`unique`){let n={ambiguous:`Ambiguous`,notFound:`NotFound`,wrongKind:`WrongKind`}[i.kind];o&&u.error(e.InvalidSpecificationStreamRoute,`Stream '${t.eventSource}.${t.stream}' is ${n}; routing requires one physical source and stream.`,t.location);continue}let c=i.sources[0],h=i.streams[0],validateLiteral=(t,n)=>{let r=t.source,i=m(r,n,l);i?.failure==null?(r.kind!==`LiteralExpressionSyntax`||r.value===null||n!==null&&!compatible(r,n))&&u.error(e.InvalidSpecificationStreamRoute,`A specification stream id needs a nonempty concrete scalar literal compatible with the stream's declared type.`,r.location):u.error(e.InvalidSpecificationStreamRoute,d(i.failure),r.location)};if(o&&(h.streamIdParts.length>0?f(h,t.streamIdParts,t.streamId!==null,t.location,e.InvalidSpecificationStreamRoute,u,validateLiteral):t.streamIdParts.length>0?u.error(e.InvalidSpecificationStreamRoute,`A streamId part block requires a composite stream.`,t.location):(h.streamId===null!=(t.streamId===null)&&u.error(e.InvalidSpecificationStreamRoute,h.streamId===null?`An unkeyed stream cannot take a streamId mapping.`:`This keyed stream requires a streamId mapping.`,t.location),t.streamId!==null&&validateLiteral(t.streamId,h.streamId))),p=c.identifier,p===null){let n=_.map(e=>e.type),r=new Set(n.filter(e=>e!==null).map(e=>`${e.name}:${e.isOptional}:${e.isCollection}`));n.length===0||n.some(e=>e===null)||r.size!==1?o&&u.error(e.InvalidSpecificationStreamEventSource,`Declare an identifier on source '${c.name}'; the event's producers do not supply one unambiguous destination type.`,t.location):p=n[0]}let g=!1;if(a?.example?.stream!=null&&n.for!==null&&n.for===a.example.for){let e=b.resolve(a.example.stream.eventSource,a.example.stream.stream);if(e.kind===`unique`){let t=_.map(e=>e.type),r=new Set(t.filter(e=>e!==null).map(e=>`${e.name}:${e.isOptional}:${e.isCollection}`)),i=e.sources[0].identifier??(t.length>0&&!t.some(e=>e===null)&&r.size===1?t[0]:null);i!==null&&(g=n.for.kind!==`LiteralExpressionSyntax`||n.for.value===null||i.isCollection||i.isOptional||!compatible(n.for,i))}}r&&n.for===null?contextualError(e.InvalidSpecificationStreamEventSource,`A routed given or when append event requires 'for <literal>'.`,t.location):s&&!g&&n.for!==null&&(n.for.kind!==`LiteralExpressionSyntax`||n.for.value===null||p!==null&&(p.isCollection||p.isOptional||!compatible(n.for,p)))&&contextualError(e.InvalidSpecificationStreamEventSource,`A routed event's for value must be a concrete literal compatible with the source's identifier type.`,n.for.location)}if(!i||c===null||_.length===0||_.some(e=>e.command!==c))continue;let v=_.every(e=>{let t=e.route?.propertyCandidate===null?e.route:null,r=n.noStream==null?t==null||t.eventSource!==n.stream.eventSource||t.stream!==n.stream.stream:t!=null;if(!r&&n.stream!=null&&t!=null){let e=b.resolve(n.stream.eventSource,n.stream.stream),i=e.kind===`unique`?e.streams[0]:null;if(i!==null&&i.streamIdParts.length>0){if(t.streamId===null&&n.stream.streamId===null&&t.streamIdParts.length>0&&n.stream.streamIdParts.length>0)for(let e of i.streamIdParts){let i=t.streamIdParts.filter(t=>t.property===e.name),a=n.stream.streamIdParts.filter(t=>t.property===e.name);if(i.length!==1||a.length!==1)continue;let o=formatStreamId(i[0].source,e.type),s=formatStreamId(a[0].source,e.type);o!==null&&s!==null&&o!==s&&(r=!0)}}else if(i?.streamId!=null&&t.streamIdParts.length===0&&n.stream.streamIdParts.length===0){let e=formatStreamId(t.streamId?.source,i.streamId),a=formatStreamId(n.stream.streamId?.source,i.streamId);e!==null&&a!==null&&e!==a&&(r=!0)}}return r});n.for?.kind===`LiteralExpressionSyntax`&&_.every(e=>e.type!==null&&(p===null?!compatible(n.for,e.type):nominallyCompatible(e.type,p)===!1))&&(v=!0),v&&contextualError(e.SpecificationStreamContradictsCommand,`The expected event route contradicts its only producer, the command under test.`,(n.stream??n.noStream).location)}}}export{validateSpecificationStreams};
|
|
2
2
|
//# sourceMappingURL=SpecificationStreamValidator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SpecificationStreamValidator.js","names":["rows","AuthoringProductionResolver","application","slice","specification","context","sink","ParserContext","LineReader","reported","distinct","diagnostic","key","row","DiagnosticCodes","value","examples","specificationExamples","expansion","expandEffectiveSpecificationExamples","resolver","declarationSteps","exampleSpecifications","entry","diagnosticText","node","catalog","EventSourceCatalog","concepts","uniqueByName","composites","properties","name","type","compatibleValue","known","source","target","formatSpecificationStreamId","expression","declared","reference","producers","command","produced","event","commandDestinationType","reaction","trigger","invocation","branch","capture","appended","child","nested","validationSpecifications","owner","commands","parts","qualifiers","candidates","index","segment","depth","scope","visible","occurrences","step","pair","validateRoute","validateFor","code","message","location","required","identifier","eventProducers","producer","route","resolution","state","stream","mapping","formatted","formatStreamIdLiteral","streamIdFailureMessage","validateStreamIdParts","types","inheritedIdentityIsInvalid","prior","priorIdentifier","expected","contradicts","commandRoute","differs","part","actual","actualId","expectedId"],"sources":["../../../../../../Compiler/Parsing/SpecificationStreamValidator.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { diagnosticText } from '../Diagnostics/DiagnosticArgument';\nimport { DiagnosticCodes } from '../Diagnostics/DiagnosticCodes';\nimport { AuthoringProductionResolver } from '../Syntax/AuthoringProductionResolver';\nimport { CommandSyntax } from '../Syntax/Commands';\nimport { EventSyntax, TypeRefSyntax } from '../Syntax/Declarations';\nimport { EventSourceCatalog } from '../Syntax/EventSourceCatalog';\nimport { CommandStreamSyntax, EventSourceResolutionKind } from '../Syntax/EventSources';\nimport { formatSpecificationStreamId } from './SpecificationRouteComparison';\nimport { streamIdFailureMessage } from '../Syntax/StreamIdFormatter';\nimport { ExpressionSyntax } from '../Syntax/Expressions';\nimport { commandDestinationType } from './CommandDestinationTypes';\nimport { formatStreamIdLiteral } from './EventSourceValidator';\nimport { ApplicationSyntax } from '../Syntax/Structure';\nimport { PropertyMappingSyntax } from '../Syntax/Expressions';\nimport { validateStreamIdParts } from './CompositeStreamIdValidator';\nimport { ParserContext } from './ParserContext';\nimport { LineReader } from './LineReader';\nimport { compatibleValue, uniqueByName } from './ResponseValidator';\nimport { expandEffectiveSpecificationExamples, specificationExamples } from './SpecificationCommandExamples';\nimport { SpecificationEventSyntax } from '../Syntax/Specifications';\n\ninterface Producer { event: EventSyntax; command: CommandSyntax | null; type: TypeRefSyntax | null; route?: CommandStreamSyntax | null }\n\nexport function validateSpecificationStreams(application: ApplicationSyntax, context: ParserContext): void {\n const rows = new AuthoringProductionResolver(application).slices.flatMap(({ slice }) => slice.specifications.flatMap(specification => specification.cases ?? []));\n if (rows.length === 0) return validateRoutes(application, context);\n const sink = new ParserContext(new LineReader([]));\n validateRoutes(application, sink);\n const reported = new Set<string>();\n const distinct = new Set<string>();\n for (const diagnostic of sink.diagnostics) {\n const key = JSON.stringify([diagnostic.code, diagnostic.location.path, diagnostic.location.line, diagnostic.location.column, diagnostic.message]);\n if (distinct.has(key)) continue;\n distinct.add(key);\n const row = diagnostic.code === DiagnosticCodes.InvalidSpecificationStreamRoute ? rows.find(row => row.values.some(value => value.source.location.line === diagnostic.location.line && value.source.location.column === diagnostic.location.column && value.source.location.path === diagnostic.location.path)) : undefined;\n if (row === undefined) context.error(diagnostic.code, diagnostic.message, diagnostic.location, diagnostic.arguments);\n else {\n const key = JSON.stringify(diagnostic.location);\n if (!reported.has(key)) context.error(diagnostic.code, `Case '${row.name}': ${diagnostic.message}`, diagnostic.location, diagnostic.arguments);\n reported.add(key);\n }\n }\n}\n\nfunction validateRoutes(application: ApplicationSyntax, context: ParserContext): void {\n const examples = specificationExamples(application).resolvedExamples;\n const expansion = expandEffectiveSpecificationExamples(application);\n application = expansion.application;\n const resolver = new AuthoringProductionResolver(application);\n const declarationSteps = new Set<SpecificationEventSyntax>();\n const exampleSpecifications = examples.flatMap(entry => {\n if (entry.kind !== 'event') {\n if ((entry.kind === 'command' || entry.kind === 'readmodel') && (entry.example.stream != null || entry.example.noStream != null))\n context.error(DiagnosticCodes.InvalidSpecificationExampleBody, \"only event examples carry routes; a command's route comes from its declaration, and read models have none\", (entry.example.stream ?? entry.example.noStream)!.location, diagnosticText('example', entry.example.name));\n return [];\n }\n const node: SpecificationEventSyntax = { kind: 'SpecificationEventSyntax', eventType: entry.name, values: entry.example.values, for: entry.example.for, stream: entry.example.stream, noStream: entry.example.noStream, location: entry.example.location };\n declarationSteps.add(node);\n return [{ scope: entry.scope, specification: { when: null, given: [], whenAppended: null, thenEvents: [node], whenRedelivered: null } }];\n });\n const catalog = new EventSourceCatalog(application);\n const concepts = uniqueByName(application.concepts);\n const composites = uniqueByName(application.types);\n const properties = new Map([...composites].map(([name, type]) => [name, uniqueByName(type.properties)]));\n const compatible = (value: Parameters<typeof compatibleValue>[0], type: TypeRefSyntax): boolean => compatibleValue(value, type, concepts, properties);\n const known = new Set(['String', 'Uuid', 'Int', 'Decimal', 'Bool', 'Date', 'DateTime', ...concepts.keys(), ...composites.keys()]);\n const nominallyCompatible = (source: TypeRefSyntax, target: TypeRefSyntax): boolean | null => known.has(source.name) && known.has(target.name)\n ? source.name === target.name && source.isCollection === target.isCollection && (!source.isOptional || target.isOptional) : null;\n const formatStreamId = (expression: ExpressionSyntax | null | undefined, type: TypeRefSyntax): string | null => formatSpecificationStreamId(expression, type, application);\n const eventOf = (reference: string, slice: typeof resolver.slices[number]['slice']): EventSyntax | null => {\n const declared = resolver.resolve(reference, slice).declaration;\n return declared?.node.kind === 'EventSyntax' ? declared.node : null;\n };\n const producers: Producer[] = [];\n for (const { slice } of resolver.slices) {\n for (const command of slice.commands) for (const produced of command.produces) {\n if (!resolver.isEventProduction(produced, slice)) continue;\n const event = eventOf(produced.event, slice);\n if (event === null) continue;\n const type = commandDestinationType(command, produced, application, { resolver, slice });\n producers.push({ event, command, type, route: produced.stream ?? command.stream });\n }\n for (const produced of slice.reactions.flatMap(reaction => reaction.triggers).flatMap(trigger => [...trigger.produces, ...trigger.invokes.flatMap(invocation => invocation.onRefused ?? []).flatMap(branch => branch.produces)])) {\n const event = eventOf(produced.event, slice);\n if (event !== null) producers.push({ event, command: null, type: null });\n }\n for (const capture of slice.captures) for (const appended of [...capture.appends, ...capture.children.flatMap(child => child.appends), ...capture.nested.flatMap(nested => nested.appends)]) {\n const event = eventOf(appended.event, slice);\n if (event !== null) producers.push({ event, command: null, type: null });\n }\n }\n const validationSpecifications = [\n ...exampleSpecifications.flatMap(entry => resolver.slices.filter(owner => owner.scope.join('.') === entry.scope.join('.')).map(({ slice, scope }) => ({ slice, scope, specification: entry.specification }))),\n ...resolver.slices.flatMap(({ slice, scope }) => slice.specifications.map(specification => ({ slice, scope, specification })))\n ];\n for (const { slice, scope, specification } of validationSpecifications) {\n const commands = resolver.slices.flatMap(entry => entry.slice.commands.map(command => ({ command, scope: entry.scope })));\n const parts = specification.when?.commandType.split('.') ?? [];\n const qualifiers = parts.slice(0, -1);\n const candidates = commands.filter(entry => entry.command.name === parts.at(-1) && qualifiers.every((segment, index) => entry.scope[entry.scope.length - qualifiers.length + index] === segment));\n let command: CommandSyntax | null = qualifiers.length > 0 && candidates.length === 1 ? candidates[0].command : null;\n for (let depth = scope.length; qualifiers.length === 0 && depth >= 0 && command === null; depth--) {\n const visible = candidates.filter(entry => scope.slice(0, depth).every((segment, index) => entry.scope[index] === segment));\n if (visible.length > 0) { command = visible.length === 1 ? visible[0].command : null; break; }\n }\n const occurrences = [...specification.given.map(node => ({ node, required: true, expected: false })),\n ...(specification.whenAppended === null ? [] : [{ node: specification.whenAppended, required: true, expected: false }]),\n ...specification.thenEvents.map(node => ({ node, required: false, expected: !declarationSteps.has(node) })),\n ...(specification.whenRedelivered == null ? [] : [{ node: { ...specification.whenRedelivered, kind: 'SpecificationEventSyntax' as const }, required: false, expected: false }])];\n for (const { node, required, expected } of occurrences) {\n const step = expansion.specifications.flatMap(pair => pair.steps).find(step => step.effective === node);\n const validateRoute = step?.route?.origin !== 'example';\n const validateFor = validateRoute || node.for !== step?.example?.for;\n const contextualError = (code: string, message: string, location: typeof node.location): void => {\n context.error(code, step?.example == null ? message : `${message} Example '${step.example.name}' is used here.`, step?.example == null ? location : step.authored.location);\n };\n if (node.stream == null && node.noStream == null) continue;\n if (required && node.noStream != null)\n contextualError(DiagnosticCodes.InvalidSpecificationStream, \"Expected 'stream Source.Stream', or 'no stream' on a then event.\", node.noStream.location);\n let identifier: TypeRefSyntax | null = null;\n const event = eventOf(node.eventType, slice);\n const eventProducers = producers.filter(producer => producer.event === event);\n if (node.stream != null) {\n const route = node.stream;\n const resolution = catalog.resolve(route.eventSource, route.stream);\n if (resolution.kind !== EventSourceResolutionKind.Unique) {\n const state = { ambiguous: 'Ambiguous', notFound: 'NotFound', wrongKind: 'WrongKind' }[resolution.kind];\n if (validateRoute) context.error(DiagnosticCodes.InvalidSpecificationStreamRoute, `Stream '${route.eventSource}.${route.stream}' is ${state}; routing requires one physical source and stream.`, route.location);\n continue;\n }\n const source = resolution.sources[0];\n const stream = resolution.streams[0];\n const validateLiteral = (mapping: PropertyMappingSyntax, target: TypeRefSyntax | null): void => {\n const value = mapping.source;\n const formatted = formatStreamIdLiteral(value, target, application);\n if (formatted?.failure != null) context.error(DiagnosticCodes.InvalidSpecificationStreamRoute, streamIdFailureMessage(formatted.failure), value.location);\n else if (value.kind !== 'LiteralExpressionSyntax' || value.value === null || target !== null && !compatible(value, target))\n context.error(DiagnosticCodes.InvalidSpecificationStreamRoute, \"A specification stream id needs a nonempty concrete scalar literal compatible with the stream's declared type.\", value.location);\n };\n if (!validateRoute) { /* The authored example's route is checked once at its declaration. */ }\n else if (stream.streamIdParts.length > 0)\n validateStreamIdParts(stream, route.streamIdParts, route.streamId !== null, route.location, DiagnosticCodes.InvalidSpecificationStreamRoute, context, validateLiteral);\n else if (route.streamIdParts.length > 0)\n context.error(DiagnosticCodes.InvalidSpecificationStreamRoute, 'A streamId part block requires a composite stream.', route.location);\n else {\n if ((stream.streamId === null) !== (route.streamId === null))\n context.error(DiagnosticCodes.InvalidSpecificationStreamRoute, stream.streamId === null ? 'An unkeyed stream cannot take a streamId mapping.' : 'This keyed stream requires a streamId mapping.', route.location);\n if (route.streamId !== null) validateLiteral(route.streamId, stream.streamId);\n }\n identifier = source.identifier;\n if (identifier === null) {\n const types = eventProducers.map(producer => producer.type);\n const distinct = new Set(types.filter(type => type !== null).map(type => `${type.name}:${type.isOptional}:${type.isCollection}`));\n if (types.length === 0 || types.some(type => type === null) || distinct.size !== 1) {\n if (validateRoute) context.error(DiagnosticCodes.InvalidSpecificationStreamEventSource, `Declare an identifier on source '${source.name}'; the event's producers do not supply one unambiguous destination type.`, route.location);\n } else identifier = types[0];\n }\n let inheritedIdentityIsInvalid = false;\n if (step?.example?.stream != null && node.for !== null && node.for === step.example.for) {\n const prior = catalog.resolve(step.example.stream.eventSource, step.example.stream.stream);\n if (prior.kind === EventSourceResolutionKind.Unique) {\n const types = eventProducers.map(producer => producer.type);\n const distinct = new Set(types.filter(type => type !== null).map(type => `${type.name}:${type.isOptional}:${type.isCollection}`));\n const priorIdentifier = prior.sources[0].identifier ?? (types.length > 0 && !types.some(type => type === null) && distinct.size === 1 ? types[0] : null);\n if (priorIdentifier !== null)\n inheritedIdentityIsInvalid = node.for.kind !== 'LiteralExpressionSyntax' || node.for.value === null || priorIdentifier.isCollection || priorIdentifier.isOptional || !compatible(node.for, priorIdentifier);\n }\n }\n if (required && node.for === null)\n contextualError(DiagnosticCodes.InvalidSpecificationStreamEventSource, \"A routed given or when append event requires 'for <literal>'.\", route.location);\n else if (validateFor && !inheritedIdentityIsInvalid && node.for !== null && (node.for.kind !== 'LiteralExpressionSyntax' || node.for.value === null || identifier !== null && (identifier.isCollection || identifier.isOptional || !compatible(node.for, identifier))))\n contextualError(DiagnosticCodes.InvalidSpecificationStreamEventSource, \"A routed event's for value must be a concrete literal compatible with the source's identifier type.\", node.for.location);\n }\n if (!expected || command === null || eventProducers.length === 0 || eventProducers.some(producer => producer.command !== command)) continue;\n let contradicts = eventProducers.every(producer => {\n const commandRoute = producer.route?.propertyCandidate === null ? producer.route : null;\n let differs = node.noStream != null ? commandRoute != null : commandRoute == null || commandRoute.eventSource !== node.stream!.eventSource || commandRoute.stream !== node.stream!.stream;\n if (!differs && node.stream != null && commandRoute != null) {\n const resolution = catalog.resolve(node.stream.eventSource, node.stream.stream);\n const stream = resolution.kind === EventSourceResolutionKind.Unique ? resolution.streams[0] : null;\n if (stream !== null && stream.streamIdParts.length > 0) {\n if (commandRoute.streamId === null && node.stream.streamId === null && commandRoute.streamIdParts.length > 0 && node.stream.streamIdParts.length > 0) {\n for (const part of stream.streamIdParts) {\n const actual = commandRoute.streamIdParts.filter(mapping => mapping.property === part.name);\n const expected = node.stream.streamIdParts.filter(mapping => mapping.property === part.name);\n if (actual.length !== 1 || expected.length !== 1) continue;\n const actualId = formatStreamId(actual[0].source, part.type);\n const expectedId = formatStreamId(expected[0].source, part.type);\n if (actualId !== null && expectedId !== null && actualId !== expectedId) differs = true;\n }\n }\n } else if (stream?.streamId != null && commandRoute.streamIdParts.length === 0 && node.stream.streamIdParts.length === 0) {\n const actualId = formatStreamId(commandRoute.streamId?.source, stream.streamId);\n const expectedId = formatStreamId(node.stream.streamId?.source, stream.streamId);\n if (actualId !== null && expectedId !== null && actualId !== expectedId) differs = true;\n }\n }\n return differs;\n });\n if (node.for?.kind === 'LiteralExpressionSyntax' && eventProducers.every(producer => producer.type !== null &&\n (identifier !== null ? nominallyCompatible(producer.type, identifier) === false : !compatible(node.for!, producer.type)))) contradicts = true;\n if (contradicts) contextualError(DiagnosticCodes.SpecificationStreamContradictsCommand, 'The expected event route contradicts its only producer, the command under test.', (node.stream ?? node.noStream)!.location);\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SpecificationStreamValidator.js","names":["rows","AuthoringProductionResolver","application","slice","specification","context","sink","ParserContext","LineReader","reported","distinct","diagnostic","key","row","DiagnosticCodes","value","examples","specificationExamples","expansion","expandEffectiveSpecificationExamples","resolver","declarationSteps","exampleSpecifications","entry","diagnosticText","node","catalog","EventSourceCatalog","concepts","uniqueByName","composites","properties","name","type","compatibleValue","known","source","target","formatSpecificationStreamId","expression","declared","reference","producers","command","produced","event","commandDestinationType","reaction","trigger","capture","appended","child","nested","validationSpecifications","owner","commands","parts","qualifiers","candidates","index","segment","depth","scope","visible","occurrences","step","pair","validateRoute","validateFor","code","message","location","required","identifier","eventProducers","producer","route","resolution","state","stream","mapping","formatted","formatStreamIdLiteral","streamIdFailureMessage","validateStreamIdParts","types","inheritedIdentityIsInvalid","prior","priorIdentifier","expected","contradicts","commandRoute","differs","part","actual","actualId","expectedId"],"sources":["../../../../../../Compiler/Parsing/SpecificationStreamValidator.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { diagnosticText } from '../Diagnostics/DiagnosticArgument';\nimport { DiagnosticCodes } from '../Diagnostics/DiagnosticCodes';\nimport { AuthoringProductionResolver } from '../Syntax/AuthoringProductionResolver';\nimport { CommandSyntax } from '../Syntax/Commands';\nimport { EventSyntax, TypeRefSyntax } from '../Syntax/Declarations';\nimport { EventSourceCatalog } from '../Syntax/EventSourceCatalog';\nimport { CommandStreamSyntax, EventSourceResolutionKind } from '../Syntax/EventSources';\nimport { formatSpecificationStreamId } from './SpecificationRouteComparison';\nimport { streamIdFailureMessage } from '../Syntax/StreamIdFormatter';\nimport { ExpressionSyntax } from '../Syntax/Expressions';\nimport { commandDestinationType } from './CommandDestinationTypes';\nimport { formatStreamIdLiteral } from './EventSourceValidator';\nimport { ApplicationSyntax } from '../Syntax/Structure';\nimport { PropertyMappingSyntax } from '../Syntax/Expressions';\nimport { validateStreamIdParts } from './CompositeStreamIdValidator';\nimport { ParserContext } from './ParserContext';\nimport { LineReader } from './LineReader';\nimport { compatibleValue, uniqueByName } from './ResponseValidator';\nimport { expandEffectiveSpecificationExamples, specificationExamples } from './SpecificationCommandExamples';\nimport { SpecificationEventSyntax } from '../Syntax/Specifications';\n\ninterface Producer { event: EventSyntax; command: CommandSyntax | null; type: TypeRefSyntax | null; route?: CommandStreamSyntax | null }\n\nexport function validateSpecificationStreams(application: ApplicationSyntax, context: ParserContext): void {\n const rows = new AuthoringProductionResolver(application).slices.flatMap(({ slice }) => slice.specifications.flatMap(specification => specification.cases ?? []));\n if (rows.length === 0) return validateRoutes(application, context);\n const sink = new ParserContext(new LineReader([]));\n validateRoutes(application, sink);\n const reported = new Set<string>();\n const distinct = new Set<string>();\n for (const diagnostic of sink.diagnostics) {\n const key = JSON.stringify([diagnostic.code, diagnostic.location.path, diagnostic.location.line, diagnostic.location.column, diagnostic.message]);\n if (distinct.has(key)) continue;\n distinct.add(key);\n const row = diagnostic.code === DiagnosticCodes.InvalidSpecificationStreamRoute ? rows.find(row => row.values.some(value => value.source.location.line === diagnostic.location.line && value.source.location.column === diagnostic.location.column && value.source.location.path === diagnostic.location.path)) : undefined;\n if (row === undefined) context.error(diagnostic.code, diagnostic.message, diagnostic.location, diagnostic.arguments);\n else {\n const key = JSON.stringify(diagnostic.location);\n if (!reported.has(key)) context.error(diagnostic.code, `Case '${row.name}': ${diagnostic.message}`, diagnostic.location, diagnostic.arguments);\n reported.add(key);\n }\n }\n}\n\nfunction validateRoutes(application: ApplicationSyntax, context: ParserContext): void {\n const examples = specificationExamples(application).resolvedExamples;\n const expansion = expandEffectiveSpecificationExamples(application);\n application = expansion.application;\n const resolver = new AuthoringProductionResolver(application);\n const declarationSteps = new Set<SpecificationEventSyntax>();\n const exampleSpecifications = examples.flatMap(entry => {\n if (entry.kind !== 'event') {\n if ((entry.kind === 'command' || entry.kind === 'readmodel') && (entry.example.stream != null || entry.example.noStream != null))\n context.error(DiagnosticCodes.InvalidSpecificationExampleBody, \"only event examples carry routes; a command's route comes from its declaration, and read models have none\", (entry.example.stream ?? entry.example.noStream)!.location, diagnosticText('example', entry.example.name));\n return [];\n }\n const node: SpecificationEventSyntax = { kind: 'SpecificationEventSyntax', eventType: entry.name, values: entry.example.values, for: entry.example.for, stream: entry.example.stream, noStream: entry.example.noStream, location: entry.example.location };\n declarationSteps.add(node);\n return [{ scope: entry.scope, specification: { when: null, given: [], whenAppended: null, thenEvents: [node], whenRedelivered: null } }];\n });\n const catalog = new EventSourceCatalog(application);\n const concepts = uniqueByName(application.concepts);\n const composites = uniqueByName(application.types);\n const properties = new Map([...composites].map(([name, type]) => [name, uniqueByName(type.properties)]));\n const compatible = (value: Parameters<typeof compatibleValue>[0], type: TypeRefSyntax): boolean => compatibleValue(value, type, concepts, properties);\n const known = new Set(['String', 'Uuid', 'Int', 'Decimal', 'Bool', 'Date', 'DateTime', ...concepts.keys(), ...composites.keys()]);\n const nominallyCompatible = (source: TypeRefSyntax, target: TypeRefSyntax): boolean | null => known.has(source.name) && known.has(target.name)\n ? source.name === target.name && source.isCollection === target.isCollection && (!source.isOptional || target.isOptional) : null;\n const formatStreamId = (expression: ExpressionSyntax | null | undefined, type: TypeRefSyntax): string | null => formatSpecificationStreamId(expression, type, application);\n const eventOf = (reference: string, slice: typeof resolver.slices[number]['slice']): EventSyntax | null => {\n const declared = resolver.resolve(reference, slice).declaration;\n return declared?.node.kind === 'EventSyntax' ? declared.node : null;\n };\n const producers: Producer[] = [];\n for (const { slice } of resolver.slices) {\n for (const command of slice.commands) for (const produced of command.produces) {\n if (!resolver.isEventProduction(produced, slice)) continue;\n const event = eventOf(produced.event, slice);\n if (event === null) continue;\n const type = commandDestinationType(command, produced, application, { resolver, slice });\n producers.push({ event, command, type, route: produced.stream ?? command.stream });\n }\n for (const produced of slice.reactions.flatMap(reaction => reaction.triggers).flatMap(trigger => trigger.produces)) {\n const event = eventOf(produced.event, slice);\n if (event !== null) producers.push({ event, command: null, type: null });\n }\n for (const capture of slice.captures) for (const appended of [...capture.appends, ...capture.children.flatMap(child => child.appends), ...capture.nested.flatMap(nested => nested.appends)]) {\n const event = eventOf(appended.event, slice);\n if (event !== null) producers.push({ event, command: null, type: null });\n }\n }\n const validationSpecifications = [\n ...exampleSpecifications.flatMap(entry => resolver.slices.filter(owner => owner.scope.join('.') === entry.scope.join('.')).map(({ slice, scope }) => ({ slice, scope, specification: entry.specification }))),\n ...resolver.slices.flatMap(({ slice, scope }) => slice.specifications.map(specification => ({ slice, scope, specification })))\n ];\n for (const { slice, scope, specification } of validationSpecifications) {\n const commands = resolver.slices.flatMap(entry => entry.slice.commands.map(command => ({ command, scope: entry.scope })));\n const parts = specification.when?.commandType.split('.') ?? [];\n const qualifiers = parts.slice(0, -1);\n const candidates = commands.filter(entry => entry.command.name === parts.at(-1) && qualifiers.every((segment, index) => entry.scope[entry.scope.length - qualifiers.length + index] === segment));\n let command: CommandSyntax | null = qualifiers.length > 0 && candidates.length === 1 ? candidates[0].command : null;\n for (let depth = scope.length; qualifiers.length === 0 && depth >= 0 && command === null; depth--) {\n const visible = candidates.filter(entry => scope.slice(0, depth).every((segment, index) => entry.scope[index] === segment));\n if (visible.length > 0) { command = visible.length === 1 ? visible[0].command : null; break; }\n }\n const occurrences = [...specification.given.map(node => ({ node, required: true, expected: false })),\n ...(specification.whenAppended === null ? [] : [{ node: specification.whenAppended, required: true, expected: false }]),\n ...specification.thenEvents.map(node => ({ node, required: false, expected: !declarationSteps.has(node) })),\n ...(specification.whenRedelivered == null ? [] : [{ node: { ...specification.whenRedelivered, kind: 'SpecificationEventSyntax' as const }, required: false, expected: false }])];\n for (const { node, required, expected } of occurrences) {\n const step = expansion.specifications.flatMap(pair => pair.steps).find(step => step.effective === node);\n const validateRoute = step?.route?.origin !== 'example';\n const validateFor = validateRoute || node.for !== step?.example?.for;\n const contextualError = (code: string, message: string, location: typeof node.location): void => {\n context.error(code, step?.example == null ? message : `${message} Example '${step.example.name}' is used here.`, step?.example == null ? location : step.authored.location);\n };\n if (node.stream == null && node.noStream == null) continue;\n if (required && node.noStream != null)\n contextualError(DiagnosticCodes.InvalidSpecificationStream, \"Expected 'stream Source.Stream', or 'no stream' on a then event.\", node.noStream.location);\n let identifier: TypeRefSyntax | null = null;\n const event = eventOf(node.eventType, slice);\n const eventProducers = producers.filter(producer => producer.event === event);\n if (node.stream != null) {\n const route = node.stream;\n const resolution = catalog.resolve(route.eventSource, route.stream);\n if (resolution.kind !== EventSourceResolutionKind.Unique) {\n const state = { ambiguous: 'Ambiguous', notFound: 'NotFound', wrongKind: 'WrongKind' }[resolution.kind];\n if (validateRoute) context.error(DiagnosticCodes.InvalidSpecificationStreamRoute, `Stream '${route.eventSource}.${route.stream}' is ${state}; routing requires one physical source and stream.`, route.location);\n continue;\n }\n const source = resolution.sources[0];\n const stream = resolution.streams[0];\n const validateLiteral = (mapping: PropertyMappingSyntax, target: TypeRefSyntax | null): void => {\n const value = mapping.source;\n const formatted = formatStreamIdLiteral(value, target, application);\n if (formatted?.failure != null) context.error(DiagnosticCodes.InvalidSpecificationStreamRoute, streamIdFailureMessage(formatted.failure), value.location);\n else if (value.kind !== 'LiteralExpressionSyntax' || value.value === null || target !== null && !compatible(value, target))\n context.error(DiagnosticCodes.InvalidSpecificationStreamRoute, \"A specification stream id needs a nonempty concrete scalar literal compatible with the stream's declared type.\", value.location);\n };\n if (!validateRoute) { /* The authored example's route is checked once at its declaration. */ }\n else if (stream.streamIdParts.length > 0)\n validateStreamIdParts(stream, route.streamIdParts, route.streamId !== null, route.location, DiagnosticCodes.InvalidSpecificationStreamRoute, context, validateLiteral);\n else if (route.streamIdParts.length > 0)\n context.error(DiagnosticCodes.InvalidSpecificationStreamRoute, 'A streamId part block requires a composite stream.', route.location);\n else {\n if ((stream.streamId === null) !== (route.streamId === null))\n context.error(DiagnosticCodes.InvalidSpecificationStreamRoute, stream.streamId === null ? 'An unkeyed stream cannot take a streamId mapping.' : 'This keyed stream requires a streamId mapping.', route.location);\n if (route.streamId !== null) validateLiteral(route.streamId, stream.streamId);\n }\n identifier = source.identifier;\n if (identifier === null) {\n const types = eventProducers.map(producer => producer.type);\n const distinct = new Set(types.filter(type => type !== null).map(type => `${type.name}:${type.isOptional}:${type.isCollection}`));\n if (types.length === 0 || types.some(type => type === null) || distinct.size !== 1) {\n if (validateRoute) context.error(DiagnosticCodes.InvalidSpecificationStreamEventSource, `Declare an identifier on source '${source.name}'; the event's producers do not supply one unambiguous destination type.`, route.location);\n } else identifier = types[0];\n }\n let inheritedIdentityIsInvalid = false;\n if (step?.example?.stream != null && node.for !== null && node.for === step.example.for) {\n const prior = catalog.resolve(step.example.stream.eventSource, step.example.stream.stream);\n if (prior.kind === EventSourceResolutionKind.Unique) {\n const types = eventProducers.map(producer => producer.type);\n const distinct = new Set(types.filter(type => type !== null).map(type => `${type.name}:${type.isOptional}:${type.isCollection}`));\n const priorIdentifier = prior.sources[0].identifier ?? (types.length > 0 && !types.some(type => type === null) && distinct.size === 1 ? types[0] : null);\n if (priorIdentifier !== null)\n inheritedIdentityIsInvalid = node.for.kind !== 'LiteralExpressionSyntax' || node.for.value === null || priorIdentifier.isCollection || priorIdentifier.isOptional || !compatible(node.for, priorIdentifier);\n }\n }\n if (required && node.for === null)\n contextualError(DiagnosticCodes.InvalidSpecificationStreamEventSource, \"A routed given or when append event requires 'for <literal>'.\", route.location);\n else if (validateFor && !inheritedIdentityIsInvalid && node.for !== null && (node.for.kind !== 'LiteralExpressionSyntax' || node.for.value === null || identifier !== null && (identifier.isCollection || identifier.isOptional || !compatible(node.for, identifier))))\n contextualError(DiagnosticCodes.InvalidSpecificationStreamEventSource, \"A routed event's for value must be a concrete literal compatible with the source's identifier type.\", node.for.location);\n }\n if (!expected || command === null || eventProducers.length === 0 || eventProducers.some(producer => producer.command !== command)) continue;\n let contradicts = eventProducers.every(producer => {\n const commandRoute = producer.route?.propertyCandidate === null ? producer.route : null;\n let differs = node.noStream != null ? commandRoute != null : commandRoute == null || commandRoute.eventSource !== node.stream!.eventSource || commandRoute.stream !== node.stream!.stream;\n if (!differs && node.stream != null && commandRoute != null) {\n const resolution = catalog.resolve(node.stream.eventSource, node.stream.stream);\n const stream = resolution.kind === EventSourceResolutionKind.Unique ? resolution.streams[0] : null;\n if (stream !== null && stream.streamIdParts.length > 0) {\n if (commandRoute.streamId === null && node.stream.streamId === null && commandRoute.streamIdParts.length > 0 && node.stream.streamIdParts.length > 0) {\n for (const part of stream.streamIdParts) {\n const actual = commandRoute.streamIdParts.filter(mapping => mapping.property === part.name);\n const expected = node.stream.streamIdParts.filter(mapping => mapping.property === part.name);\n if (actual.length !== 1 || expected.length !== 1) continue;\n const actualId = formatStreamId(actual[0].source, part.type);\n const expectedId = formatStreamId(expected[0].source, part.type);\n if (actualId !== null && expectedId !== null && actualId !== expectedId) differs = true;\n }\n }\n } else if (stream?.streamId != null && commandRoute.streamIdParts.length === 0 && node.stream.streamIdParts.length === 0) {\n const actualId = formatStreamId(commandRoute.streamId?.source, stream.streamId);\n const expectedId = formatStreamId(node.stream.streamId?.source, stream.streamId);\n if (actualId !== null && expectedId !== null && actualId !== expectedId) differs = true;\n }\n }\n return differs;\n });\n if (node.for?.kind === 'LiteralExpressionSyntax' && eventProducers.every(producer => producer.type !== null &&\n (identifier !== null ? nominallyCompatible(producer.type, identifier) === false : !compatible(node.for!, producer.type)))) contradicts = true;\n if (contradicts) contextualError(DiagnosticCodes.SpecificationStreamContradictsCommand, 'The expected event route contradicts its only producer, the command under test.', (node.stream ?? node.noStream)!.location);\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e={unknownMatchPattern:`PLAY0366`,invalidMatchPattern:`PLAY0367`,patternOutsidePortableMatchDialect:`PLAY0699`,deprecatedStudioTextRulePattern:`PLAY0787`,repeatedSingularDeclarationAcrossFiles:`PLAY0172`,directionlessTranslationReactsToOwnCapture:`PLAY0694`,pendingIntentWithOtherHandler:`PLAY0698`,commandHandlerRequiresAttachment:`PLAY0800`,duplicateEventInProjectionScope:`PLAY0801`,
|
|
1
|
+
const e={unknownMatchPattern:`PLAY0366`,invalidMatchPattern:`PLAY0367`,patternOutsidePortableMatchDialect:`PLAY0699`,deprecatedStudioTextRulePattern:`PLAY0787`,repeatedSingularDeclarationAcrossFiles:`PLAY0172`,directionlessTranslationReactsToOwnCapture:`PLAY0694`,pendingIntentWithOtherHandler:`PLAY0698`,commandHandlerRequiresAttachment:`PLAY0800`,duplicateEventInProjectionScope:`PLAY0801`,describedCommandNotImplemented:`PLAY0695`,describedCommandWithoutProductions:`PLAY0696`,describedCommandCardinalityNotAdmitted:`PLAY0697`,invalidExposureDeclaration:`PLAY0621`,unknownExposureOwner:`PLAY0622`,reExposureCycle:`PLAY0623`,reExposureBroken:`PLAY0624`,invalidInstanceContribution:`PLAY0625`,unknownContributionInstance:`PLAY0626`,contributionNotExposed:`PLAY0627`,contributionTypeMismatch:`PLAY0628`,unknownTemplateContentSlot:`PLAY0629`,unknownNavigationOutlet:`PLAY0630`,templateScopeMismatch:`PLAY0631`,incompatibleComponentPackage:`PLAY0632`,unknownNavigationDestination:`PLAY0654`,unknownScreenContributionPoint:`PLAY0655`,templateNestingCycle:`PLAY0656`,templateCategoryMissing:`PLAY0720`,invalidTemplateVersionRange:`PLAY0721`,unknownTemplateBlueprint:`PLAY0722`,mixedEnumerationNumbering:`PLAY0667`,duplicateEnumerationNumber:`PLAY0668`,enumerationNumberOutsideInt32:`PLAY0669`,malformedEnumerationNumber:`PLAY0670`,unpinnedStoredEnumeration:`PLAY0671`,invalidIdentityDeclaration:`PLAY0633`,duplicateIdentity:`PLAY0634`,invalidIdentityDetail:`PLAY0635`,unknownIdentitySource:`PLAY0636`,identityDetailWithoutSource:`PLAY0637`,identitySourceWithBody:`PLAY0638`,duplicateIdentityDetail:`PLAY0639`,builtInIdentityDetail:`PLAY0640`,unknownIdentityQuery:`PLAY0641`,invalidIdentityQuery:`PLAY0642`,identityQueryWithoutKey:`PLAY0643`,invalidIdentityQueryKey:`PLAY0644`,identityQueryAuthorizationDependency:`PLAY0645`,identityQueryTypeMismatch:`PLAY0646`,invalidReactionIdentity:`PLAY0647`,gatedInvocationWithoutIdentity:`PLAY0648`,unusedReactionIdentity:`PLAY0649`,unusedReactionRole:`PLAY0650`,unsatisfiedReactionIdentity:`PLAY0651`,reactionPrivilegeEscalation:`PLAY0652`,commandProducesPublicEvent:`PLAY0607`,publicEventRequiresOutboundTranslation:`PLAY0608`,outboundPublicEventCount:`PLAY0609`,foreignPublicEventConsumer:`PLAY0610`,outboundTranslationInput:`PLAY0611`,inboundTranslationOutput:`PLAY0612`,foreignPublicEventProduced:`PLAY0613`,publicTranslationRequiresDirection:`PLAY0614`,translationConstructDirection:`PLAY0615`,inboundTranslationInput:`PLAY0616`,outboundTranslationOutput:`PLAY0617`,eventTargetOutsideOutboundTranslation:`PLAY0618`,eventsSourceOutsideInboundTranslation:`PLAY0619`,invalidCaptureEventsSource:`PLAY0620`,captureEventsFromSeveralOrigins:`PLAY0687`,captureEventsKeyNotRequired:`PLAY0700`,captureEventsRecordFixture:`PLAY0701`,refutedGeneratedConceptRule:`PLAY0688`,unprovenGeneratedConceptRule:`PLAY0689`,invalidReadModelKey:`PLAY0660`,incompleteReadModelKey:`PLAY0661`,invalidReadModelKeyLookup:`PLAY0662`,productionRouteOutsideCommand:`PLAY0663`,redundantProductionRoute:`PLAY0664`,invalidObserverFilter:`PLAY0665`,observerFilterExcludesEveryProducer:`PLAY0666`,reducerIdentityMismatch:`PLAY0690`,generationSupportBudgetExceeded:`PLAY0691`,emptyGenerationSupport:`PLAY0692`,invalidReactionBatchesDeclaration:`PLAY0693`,invalidCommandReadsDeclaration:`PLAY0780`,invalidDescription:`PLAY0145`,emptyDescription:`PLAY0146`,duplicateDescription:`PLAY0147`,unknownConceptDirective:`PLAY0010`,attributeReasonWithoutAttribute:`PLAY0012`,duplicateAttributeReason:`PLAY0013`,duplicateComplianceMarker:`PLAY0653`,legacyComplianceMarker:`PLAY0565`,unknownComplianceMarker:`PLAY0566`,invalidSecretScope:`PLAY0567`,duplicateSecretScope:`PLAY0568`,secretScopeIgnoredForPii:`PLAY0569`,invalidPersonalDataQualifier:`PLAY0570`,duplicateSpecialCategory:`PLAY0571`,invalidPurposeDeclaration:`PLAY0596`,invalidPurposeVocabulary:`PLAY0597`,duplicatePurposeField:`PLAY0598`,duplicatePurposeDeclaration:`PLAY0599`,unknownPurpose:`PLAY0600`,purposeInterestMismatch:`PLAY0601`,personalDataWithoutPurpose:`PLAY0602`,specialDataWithoutCondition:`PLAY0603`,criminalDataWithoutAuthorization:`PLAY0604`,purposeWithoutBasis:`PLAY0605`,unusedPurpose:`PLAY0606`,duplicateEventSubject:`PLAY0590`,invalidSubjectType:`PLAY0591`,protectedSubjectType:`PLAY0592`,invalidSubjectOwner:`PLAY0593`,readModelSubjectNotSupported:`PLAY0594`,invalidSubjectModifierOrder:`PLAY0595`,conflictingScreenDataBinding:`PLAY0530`,screenDataQueryMismatch:`PLAY0531`,actionWithoutInputSurface:`PLAY0532`,commandWithoutInputSurface:`PLAY0533`,readModelFieldWithoutOrigin:`PLAY0534`,queryParameterNotHeldByView:`PLAY0535`,unconsumedEvent:`PLAY0536`,unreachableScreen:`PLAY0537`,invalidSpecificationCallerPersona:`PLAY0572`,unsynthesizablePersonaCaller:`PLAY0573`,personaWithoutGate:`PLAY0574`,gateWithoutPersona:`PLAY0575`,ambiguousPersonaCaller:`PLAY0576`,invalidSpecificationParameter:`PLAY0577`,invalidSpecificationCase:`PLAY0578`,duplicateSpecificationParameter:`PLAY0579`,duplicateSpecificationCase:`PLAY0580`,incompleteSpecificationTable:`PLAY0581`,invalidSpecificationCaseAssignment:`PLAY0582`,invalidSpecificationCaseValue:`PLAY0583`,invalidSpecificationCaseReference:`PLAY0584`,optionalSpecificationParameterTarget:`PLAY0585`,specificationCaseNameCollision:`PLAY0586`,incompatibleSpecificationParameterType:`PLAY0587`,unusedSpecificationParameter:`PLAY0588`,singularSpecificationTableExpansion:`PLAY0589`,invalidActionAlternative:`PLAY0341`,guardedActionWithoutAlternatives:`PLAY0342`,misplacedActionOtherwise:`PLAY0343`,unsupportedActionConditionOperand:`PLAY0344`,unknownActionSubjectField:`PLAY0345`,unresolvedActionSubject:`PLAY0346`,unreachableActionAlternative:`PLAY0347`,unknownActionArgumentProperty:`PLAY0348`,invalidRefusalBranch:`PLAY0538`,invalidRefusalBranchBody:`PLAY0539`,unreachableRefusalBranch:`PLAY0540`,invalidRefusalValue:`PLAY0541`,unknownRefusalConstraint:`PLAY0542`,unmatchedRedeliveredOccurrence:`PLAY0543`,unknownRedeliveryReaction:`PLAY0544`,invalidNoEventsExpectation:`PLAY0545`,indeterminateNegatedClaimTarget:`PLAY0546`,invalidAbsentReadModelStep:`PLAY0453`,unknownConstraintProperty:`PLAY0391`,invalidSpecificationExample:`PLAY0518`,duplicateSpecificationAssignment:`PLAY0519`,unknownReadModelProperty:`PLAY0514`,piiNotSupportedOnIdentifier:`PLAY0515`,invalidEventSourceDeclaration:`PLAY0503`,invalidCommandStream:`PLAY0504`,invalidSpecificationStream:`PLAY0547`,specificationStreamOnCommand:`PLAY0548`,invalidSpecificationStreamRoute:`PLAY0549`,invalidSpecificationStreamEventSource:`PLAY0550`,specificationStreamContradictsCommand:`PLAY0551`,ambiguousCommandStream:`PLAY0505`,unsupportedStreamIdType:`PLAY0506`,redundantSourceStreamId:`PLAY0507`,eventFromLaterSlice:`PLAY0516`,timelineCycleGroup:`PLAY0517`,invalidSpecificationExampleBody:`PLAY0526`,undeclaredDependency:`PLAY0552`,unusedDependencyDeclaration:`PLAY0553`,invalidDependencyTarget:`PLAY0554`,repeatedDependencyDeclaration:`PLAY0555`,mutualDependencyDeclarations:`PLAY0556`,authorizationRefusalWithoutIdentity:`PLAY0557`,invalidDocumentation:`PLAY0558`,conflictingDocumentationAcrossFiles:`PLAY0559`,unsupportedInteractionAlternatives:`PLAY0560`,mixedInteractionAlternatives:`PLAY0561`,interactionAlternativeWithoutActions:`PLAY0562`,inlineInteractionAlternative:`PLAY0563`,legacyInteractionWhere:`PLAY0564`,ambiguousReference:`PLAY0198`,invalidImplementationBlock:`PLAY0492`,invalidImplementationHint:`PLAY0493`,conflictingImplementationSources:`PLAY0494`,eventSourceIdInPayload:`PLAY0469`,explicitProducesTargetsRequired:`PLAY0470`,redundantEventId:`PLAY0471`,invalidEventId:`PLAY0472`,inlineEventCollision:`PLAY0473`,inlineEventOutsideCommand:`PLAY0474`,inlineEventGeneration:`PLAY0475`,reservedProductionMetadata:`PLAY0476`,invalidEventDocumentation:`PLAY0477`,tabIndentation:`PLAY0006`,unknownPrimitiveType:`PLAY0008`,mismatchedSpecificationQueryResult:`PLAY0465`,unknownSliceType:`PLAY0028`,duplicateCommandIdentifier:`PLAY0036`,unknownContextPath:`PLAY0153`,unknownContextCausedByProperty:`PLAY0154`,unknownContextIdentityProperty:`PLAY0155`,unclosedCodeBlock:`PLAY0164`,unknownType:`PLAY0165`,unknownEvent:`PLAY0166`,unknownPolicy:`PLAY0167`,duplicateDeclaration:`PLAY0168`,unknownEventContextMember:`PLAY0295`,unknownEventContextPath:`PLAY0296`,eventContextPathBelowCollection:`PLAY0297`,missingEventContextPath:`PLAY0298`,unresolvedDynamicKeySource:`PLAY0299`,invalidFileImport:`PLAY0454`,omittedProductionDestination:`PLAY0478`,legacyOptionalSuffix:`PLAY0479`,invalidOptionalModifierOrder:`PLAY0480`,optionalReadsNotSupported:`PLAY0481`,unavailableResponseExecution:`PLAY0268`,generatedPropertyOutsideCommand:`PLAY0482`,invalidGeneratedType:`PLAY0483`,invalidGeneratedModifierOrder:`PLAY0484`,generatedPropertyInput:`PLAY0485`,invalidCommandResponse:`PLAY0486`,invalidResponseSource:`PLAY0487`,duplicateResponseField:`PLAY0488`,invalidResponseShape:`PLAY0489`,invalidGeneratedFixture:`PLAY0490`,invalidReturnExpectation:`PLAY0491`,unknownGenerationStrategy:`PLAY0672`,invalidGenerationArgument:`PLAY0673`,invalidGenerationModifier:`PLAY0674`,duplicateGenerationModifier:`PLAY0675`,duplicateGeneration:`PLAY0676`,invalidGenerationPrimitive:`PLAY0677`,invalidGenerationPrefix:`PLAY0678`,invalidGenerationAlphabet:`PLAY0679`,invalidTypeIdPrefix:`PLAY0680`,generationSizeOutsideRange:`PLAY0681`,reservedSequenceGeneration:`PLAY0682`,lowGenerationEntropy:`PLAY0683`,lowGeneratedIdentifierEntropy:`PLAY0684`,responseNameUsedOnFailure:`PLAY0685`,eventIdPinNotCarriedToRenderers:`PLAY0686`};export{e as diagnosticCodes};
|
|
2
2
|
//# sourceMappingURL=diagnostic-codes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostic-codes.js","names":["diagnosticCodes"],"sources":["../../diagnostic-codes.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\n// The PLAY codes the editor reports. Every one of them mirrors a condition the compiler checks and\n// carries the compiler's own code for it, so the same problem is called the same thing whether it was\n// found by the CLI or by a squiggle - see Documentation/screenplay/diagnostics.md for the catalogue.\n//\n// A code is only ever added here for a condition the compiler can also report. The editor makes a few\n// structural checks the compiler does not - the capture and projection validators are where they live -\n// and those stay codeless deliberately: minting a PLAY number for something no compiler run can emit\n// would make the catalogue describe two different tools.\nexport const diagnosticCodes = {\n unknownMatchPattern: 'PLAY0366',\n invalidMatchPattern: 'PLAY0367',\n patternOutsidePortableMatchDialect: 'PLAY0699',\n deprecatedStudioTextRulePattern: 'PLAY0787',\n repeatedSingularDeclarationAcrossFiles: 'PLAY0172',\n directionlessTranslationReactsToOwnCapture: 'PLAY0694',\n pendingIntentWithOtherHandler: 'PLAY0698',\n commandHandlerRequiresAttachment: 'PLAY0800', // C# only\n duplicateEventInProjectionScope: 'PLAY0801',\n reservedStoredName: 'PLAY0802',\n describedCommandNotImplemented: 'PLAY0695', // C# only\n describedCommandWithoutProductions: 'PLAY0696', // C# only\n describedCommandCardinalityNotAdmitted: 'PLAY0697', // C# only\n invalidExposureDeclaration: 'PLAY0621',\n unknownExposureOwner: 'PLAY0622',\n reExposureCycle: 'PLAY0623',\n reExposureBroken: 'PLAY0624',\n invalidInstanceContribution: 'PLAY0625',\n unknownContributionInstance: 'PLAY0626',\n contributionNotExposed: 'PLAY0627',\n contributionTypeMismatch: 'PLAY0628',\n unknownTemplateContentSlot: 'PLAY0629',\n unknownNavigationOutlet: 'PLAY0630',\n templateScopeMismatch: 'PLAY0631',\n incompatibleComponentPackage: 'PLAY0632',\n unknownNavigationDestination: 'PLAY0654',\n unknownScreenContributionPoint: 'PLAY0655',\n templateNestingCycle: 'PLAY0656',\n templateCategoryMissing: 'PLAY0720',\n invalidTemplateVersionRange: 'PLAY0721',\n unknownTemplateBlueprint: 'PLAY0722',\n mixedEnumerationNumbering: 'PLAY0667',\n duplicateEnumerationNumber: 'PLAY0668',\n enumerationNumberOutsideInt32: 'PLAY0669',\n malformedEnumerationNumber: 'PLAY0670',\n unpinnedStoredEnumeration: 'PLAY0671',\n invalidIdentityDeclaration: 'PLAY0633',\n duplicateIdentity: 'PLAY0634',\n invalidIdentityDetail: 'PLAY0635',\n unknownIdentitySource: 'PLAY0636',\n identityDetailWithoutSource: 'PLAY0637',\n identitySourceWithBody: 'PLAY0638',\n duplicateIdentityDetail: 'PLAY0639',\n builtInIdentityDetail: 'PLAY0640',\n unknownIdentityQuery: 'PLAY0641',\n invalidIdentityQuery: 'PLAY0642',\n identityQueryWithoutKey: 'PLAY0643',\n invalidIdentityQueryKey: 'PLAY0644',\n identityQueryAuthorizationDependency: 'PLAY0645',\n identityQueryTypeMismatch: 'PLAY0646',\n invalidReactionIdentity: 'PLAY0647',\n gatedInvocationWithoutIdentity: 'PLAY0648',\n unusedReactionIdentity: 'PLAY0649',\n unusedReactionRole: 'PLAY0650',\n unsatisfiedReactionIdentity: 'PLAY0651',\n reactionPrivilegeEscalation: 'PLAY0652',\n // Preserve supplied C# whole-model diagnostics; these checks are not yet run by the editor.\n commandProducesPublicEvent: 'PLAY0607',\n publicEventRequiresOutboundTranslation: 'PLAY0608',\n outboundPublicEventCount: 'PLAY0609',\n foreignPublicEventConsumer: 'PLAY0610',\n outboundTranslationInput: 'PLAY0611',\n inboundTranslationOutput: 'PLAY0612',\n foreignPublicEventProduced: 'PLAY0613',\n publicTranslationRequiresDirection: 'PLAY0614',\n translationConstructDirection: 'PLAY0615',\n inboundTranslationInput: 'PLAY0616',\n outboundTranslationOutput: 'PLAY0617',\n eventTargetOutsideOutboundTranslation: 'PLAY0618',\n eventsSourceOutsideInboundTranslation: 'PLAY0619',\n invalidCaptureEventsSource: 'PLAY0620',\n captureEventsFromSeveralOrigins: 'PLAY0687',\n captureEventsKeyNotRequired: 'PLAY0700',\n captureEventsRecordFixture: 'PLAY0701',\n refutedGeneratedConceptRule: 'PLAY0688',\n unprovenGeneratedConceptRule: 'PLAY0689',\n invalidReadModelKey: 'PLAY0660',\n incompleteReadModelKey: 'PLAY0661',\n invalidReadModelKeyLookup: 'PLAY0662',\n productionRouteOutsideCommand: 'PLAY0663',\n redundantProductionRoute: 'PLAY0664',\n invalidObserverFilter: 'PLAY0665',\n observerFilterExcludesEveryProducer: 'PLAY0666',\n reducerIdentityMismatch: 'PLAY0690',\n generationSupportBudgetExceeded: 'PLAY0691',\n emptyGenerationSupport: 'PLAY0692',\n invalidReactionBatchesDeclaration: 'PLAY0693',\n invalidCommandReadsDeclaration: 'PLAY0780',\n invalidDescription: 'PLAY0145',\n emptyDescription: 'PLAY0146',\n duplicateDescription: 'PLAY0147',\n unknownConceptDirective: 'PLAY0010',\n attributeReasonWithoutAttribute: 'PLAY0012',\n duplicateAttributeReason: 'PLAY0013',\n duplicateComplianceMarker: 'PLAY0653',\n legacyComplianceMarker: 'PLAY0565',\n unknownComplianceMarker: 'PLAY0566',\n invalidSecretScope: 'PLAY0567',\n duplicateSecretScope: 'PLAY0568',\n secretScopeIgnoredForPii: 'PLAY0569',\n invalidPersonalDataQualifier: 'PLAY0570',\n duplicateSpecialCategory: 'PLAY0571',\n invalidPurposeDeclaration: 'PLAY0596',\n invalidPurposeVocabulary: 'PLAY0597',\n duplicatePurposeField: 'PLAY0598',\n duplicatePurposeDeclaration: 'PLAY0599',\n unknownPurpose: 'PLAY0600',\n purposeInterestMismatch: 'PLAY0601',\n personalDataWithoutPurpose: 'PLAY0602',\n specialDataWithoutCondition: 'PLAY0603',\n criminalDataWithoutAuthorization: 'PLAY0604',\n purposeWithoutBasis: 'PLAY0605',\n unusedPurpose: 'PLAY0606',\n duplicateEventSubject: 'PLAY0590',\n invalidSubjectType: 'PLAY0591',\n protectedSubjectType: 'PLAY0592',\n invalidSubjectOwner: 'PLAY0593',\n readModelSubjectNotSupported: 'PLAY0594',\n invalidSubjectModifierOrder: 'PLAY0595',\n // Supplied compiler diagnostics are preserved, even for checks only the C# tool can run.\n // See Documentation/screenplay/editor-diagnostics.md for the validation boundary.\n conflictingScreenDataBinding: 'PLAY0530',\n screenDataQueryMismatch: 'PLAY0531',\n actionWithoutInputSurface: 'PLAY0532',\n commandWithoutInputSurface: 'PLAY0533',\n readModelFieldWithoutOrigin: 'PLAY0534',\n queryParameterNotHeldByView: 'PLAY0535',\n unconsumedEvent: 'PLAY0536',\n unreachableScreen: 'PLAY0537',\n invalidSpecificationCallerPersona: 'PLAY0572',\n unsynthesizablePersonaCaller: 'PLAY0573',\n personaWithoutGate: 'PLAY0574',\n gateWithoutPersona: 'PLAY0575',\n ambiguousPersonaCaller: 'PLAY0576',\n invalidSpecificationParameter: 'PLAY0577',\n invalidSpecificationCase: 'PLAY0578',\n duplicateSpecificationParameter: 'PLAY0579',\n duplicateSpecificationCase: 'PLAY0580',\n incompleteSpecificationTable: 'PLAY0581',\n invalidSpecificationCaseAssignment: 'PLAY0582',\n invalidSpecificationCaseValue: 'PLAY0583',\n invalidSpecificationCaseReference: 'PLAY0584',\n optionalSpecificationParameterTarget: 'PLAY0585',\n specificationCaseNameCollision: 'PLAY0586',\n incompatibleSpecificationParameterType: 'PLAY0587',\n unusedSpecificationParameter: 'PLAY0588',\n singularSpecificationTableExpansion: 'PLAY0589',\n invalidActionAlternative: 'PLAY0341',\n guardedActionWithoutAlternatives: 'PLAY0342',\n misplacedActionOtherwise: 'PLAY0343',\n unsupportedActionConditionOperand: 'PLAY0344',\n unknownActionSubjectField: 'PLAY0345',\n unresolvedActionSubject: 'PLAY0346',\n unreachableActionAlternative: 'PLAY0347',\n unknownActionArgumentProperty: 'PLAY0348',\n invalidRefusalBranch: 'PLAY0538',\n invalidRefusalBranchBody: 'PLAY0539',\n unreachableRefusalBranch: 'PLAY0540',\n invalidRefusalValue: 'PLAY0541',\n unknownRefusalConstraint: 'PLAY0542',\n unmatchedRedeliveredOccurrence: 'PLAY0543',\n unknownRedeliveryReaction: 'PLAY0544',\n invalidNoEventsExpectation: 'PLAY0545',\n indeterminateNegatedClaimTarget: 'PLAY0546',\n invalidAbsentReadModelStep: 'PLAY0453',\n unknownConstraintProperty: 'PLAY0391',\n invalidSpecificationExample: 'PLAY0518',\n duplicateSpecificationAssignment: 'PLAY0519',\n unknownReadModelProperty: 'PLAY0514',\n piiNotSupportedOnIdentifier: 'PLAY0515',\n invalidEventSourceDeclaration: 'PLAY0503',\n invalidCommandStream: 'PLAY0504',\n invalidSpecificationStream: 'PLAY0547',\n specificationStreamOnCommand: 'PLAY0548',\n invalidSpecificationStreamRoute: 'PLAY0549',\n invalidSpecificationStreamEventSource: 'PLAY0550',\n specificationStreamContradictsCommand: 'PLAY0551',\n ambiguousCommandStream: 'PLAY0505',\n unsupportedStreamIdType: 'PLAY0506',\n redundantSourceStreamId: 'PLAY0507',\n eventFromLaterSlice: 'PLAY0516',\n timelineCycleGroup: 'PLAY0517',\n invalidSpecificationExampleBody: 'PLAY0526',\n undeclaredDependency: 'PLAY0552',\n unusedDependencyDeclaration: 'PLAY0553',\n invalidDependencyTarget: 'PLAY0554',\n repeatedDependencyDeclaration: 'PLAY0555',\n mutualDependencyDeclarations: 'PLAY0556',\n authorizationRefusalWithoutIdentity: 'PLAY0557',\n invalidDocumentation: 'PLAY0558',\n conflictingDocumentationAcrossFiles: 'PLAY0559',\n unsupportedInteractionAlternatives: 'PLAY0560',\n mixedInteractionAlternatives: 'PLAY0561',\n interactionAlternativeWithoutActions: 'PLAY0562',\n inlineInteractionAlternative: 'PLAY0563',\n legacyInteractionWhere: 'PLAY0564',\n ambiguousReference: 'PLAY0198',\n invalidImplementationBlock: 'PLAY0492',\n invalidImplementationHint: 'PLAY0493',\n conflictingImplementationSources: 'PLAY0494',\n eventSourceIdInPayload: 'PLAY0469',\n explicitProducesTargetsRequired: 'PLAY0470',\n redundantEventId: 'PLAY0471',\n invalidEventId: 'PLAY0472',\n inlineEventCollision: 'PLAY0473',\n inlineEventOutsideCommand: 'PLAY0474',\n inlineEventGeneration: 'PLAY0475',\n reservedProductionMetadata: 'PLAY0476',\n invalidEventDocumentation: 'PLAY0477',\n tabIndentation: 'PLAY0006',\n unknownPrimitiveType: 'PLAY0008',\n mismatchedSpecificationQueryResult: 'PLAY0465',\n unknownSliceType: 'PLAY0028',\n duplicateCommandIdentifier: 'PLAY0036',\n unknownContextPath: 'PLAY0153',\n unknownContextCausedByProperty: 'PLAY0154',\n unknownContextIdentityProperty: 'PLAY0155',\n unclosedCodeBlock: 'PLAY0164',\n unknownType: 'PLAY0165',\n unknownEvent: 'PLAY0166',\n unknownPolicy: 'PLAY0167',\n duplicateDeclaration: 'PLAY0168',\n unknownEventContextMember: 'PLAY0295',\n unknownEventContextPath: 'PLAY0296',\n eventContextPathBelowCollection: 'PLAY0297',\n missingEventContextPath: 'PLAY0298',\n unresolvedDynamicKeySource: 'PLAY0299',\n invalidFileImport: 'PLAY0454',\n omittedProductionDestination: 'PLAY0478',\n legacyOptionalSuffix: 'PLAY0479',\n invalidOptionalModifierOrder: 'PLAY0480',\n optionalReadsNotSupported: 'PLAY0481',\n unavailableResponseExecution: 'PLAY0268',\n generatedPropertyOutsideCommand: 'PLAY0482',\n invalidGeneratedType: 'PLAY0483',\n invalidGeneratedModifierOrder: 'PLAY0484',\n generatedPropertyInput: 'PLAY0485',\n invalidCommandResponse: 'PLAY0486',\n invalidResponseSource: 'PLAY0487',\n duplicateResponseField: 'PLAY0488',\n invalidResponseShape: 'PLAY0489',\n invalidGeneratedFixture: 'PLAY0490',\n invalidReturnExpectation: 'PLAY0491',\n unknownGenerationStrategy: 'PLAY0672',\n invalidGenerationArgument: 'PLAY0673',\n invalidGenerationModifier: 'PLAY0674',\n duplicateGenerationModifier: 'PLAY0675',\n duplicateGeneration: 'PLAY0676',\n invalidGenerationPrimitive: 'PLAY0677',\n invalidGenerationPrefix: 'PLAY0678',\n invalidGenerationAlphabet: 'PLAY0679',\n invalidTypeIdPrefix: 'PLAY0680',\n generationSizeOutsideRange: 'PLAY0681',\n reservedSequenceGeneration: 'PLAY0682',\n lowGenerationEntropy: 'PLAY0683',\n lowGeneratedIdentifierEntropy: 'PLAY0684',\n responseNameUsedOnFailure: 'PLAY0685',\n // Retired by ESM v16; preserve supplied warnings from earlier native compilers.\n eventIdPinNotCarriedToRenderers: 'PLAY0686',\n} as const;\n\nexport type DiagnosticCode = (typeof diagnosticCodes)[keyof typeof diagnosticCodes];\n"],"mappings":"AAWA,MAAaA,EAAkB,CAC3B,oBAAqB,WACrB,oBAAqB,WACrB,mCAAoC,WACpC,gCAAiC,WACjC,uCAAwC,WACxC,2CAA4C,WAC5C,8BAA+B,WAC/B,iCAAkC,WAClC,gCAAiC,WACjC,mBAAoB,WACpB,+BAAgC,WAChC,mCAAoC,WACpC,uCAAwC,WACxC,2BAA4B,WAC5B,qBAAsB,WACtB,gBAAiB,WACjB,iBAAkB,WAClB,4BAA6B,WAC7B,4BAA6B,WAC7B,uBAAwB,WACxB,yBAA0B,WAC1B,2BAA4B,WAC5B,wBAAyB,WACzB,sBAAuB,WACvB,6BAA8B,WAC9B,6BAA8B,WAC9B,+BAAgC,WAChC,qBAAsB,WACtB,wBAAyB,WACzB,4BAA6B,WAC7B,yBAA0B,WAC1B,0BAA2B,WAC3B,2BAA4B,WAC5B,8BAA+B,WAC/B,2BAA4B,WAC5B,0BAA2B,WAC3B,2BAA4B,WAC5B,kBAAmB,WACnB,sBAAuB,WACvB,sBAAuB,WACvB,4BAA6B,WAC7B,uBAAwB,WACxB,wBAAyB,WACzB,sBAAuB,WACvB,qBAAsB,WACtB,qBAAsB,WACtB,wBAAyB,WACzB,wBAAyB,WACzB,qCAAsC,WACtC,0BAA2B,WAC3B,wBAAyB,WACzB,+BAAgC,WAChC,uBAAwB,WACxB,mBAAoB,WACpB,4BAA6B,WAC7B,4BAA6B,WAE7B,2BAA4B,WAC5B,uCAAwC,WACxC,yBAA0B,WAC1B,2BAA4B,WAC5B,yBAA0B,WAC1B,yBAA0B,WAC1B,2BAA4B,WAC5B,mCAAoC,WACpC,8BAA+B,WAC/B,wBAAyB,WACzB,0BAA2B,WAC3B,sCAAuC,WACvC,sCAAuC,WACvC,2BAA4B,WAC5B,gCAAiC,WACjC,4BAA6B,WAC7B,2BAA4B,WAC5B,4BAA6B,WAC7B,6BAA8B,WAC9B,oBAAqB,WACrB,uBAAwB,WACxB,0BAA2B,WAC3B,8BAA+B,WAC/B,yBAA0B,WAC1B,sBAAuB,WACvB,oCAAqC,WACrC,wBAAyB,WACzB,gCAAiC,WACjC,uBAAwB,WACxB,kCAAmC,WACnC,+BAAgC,WAChC,mBAAoB,WACpB,iBAAkB,WAClB,qBAAsB,WACtB,wBAAyB,WACzB,gCAAiC,WACjC,yBAA0B,WAC1B,0BAA2B,WAC3B,uBAAwB,WACxB,wBAAyB,WACzB,mBAAoB,WACpB,qBAAsB,WACtB,yBAA0B,WAC1B,6BAA8B,WAC9B,yBAA0B,WAC1B,0BAA2B,WAC3B,yBAA0B,WAC1B,sBAAuB,WACvB,4BAA6B,WAC7B,eAAgB,WAChB,wBAAyB,WACzB,2BAA4B,WAC5B,4BAA6B,WAC7B,iCAAkC,WAClC,oBAAqB,WACrB,cAAe,WACf,sBAAuB,WACvB,mBAAoB,WACpB,qBAAsB,WACtB,oBAAqB,WACrB,6BAA8B,WAC9B,4BAA6B,WAG7B,6BAA8B,WAC9B,wBAAyB,WACzB,0BAA2B,WAC3B,2BAA4B,WAC5B,4BAA6B,WAC7B,4BAA6B,WAC7B,gBAAiB,WACjB,kBAAmB,WACnB,kCAAmC,WACnC,6BAA8B,WAC9B,mBAAoB,WACpB,mBAAoB,WACpB,uBAAwB,WACxB,8BAA+B,WAC/B,yBAA0B,WAC1B,gCAAiC,WACjC,2BAA4B,WAC5B,6BAA8B,WAC9B,mCAAoC,WACpC,8BAA+B,WAC/B,kCAAmC,WACnC,qCAAsC,WACtC,+BAAgC,WAChC,uCAAwC,WACxC,6BAA8B,WAC9B,oCAAqC,WACrC,yBAA0B,WAC1B,iCAAkC,WAClC,yBAA0B,WAC1B,kCAAmC,WACnC,0BAA2B,WAC3B,wBAAyB,WACzB,6BAA8B,WAC9B,8BAA+B,WAC/B,qBAAsB,WACtB,yBAA0B,WAC1B,yBAA0B,WAC1B,oBAAqB,WACrB,yBAA0B,WAC1B,+BAAgC,WAChC,0BAA2B,WAC3B,2BAA4B,WAC5B,gCAAiC,WACjC,2BAA4B,WAC5B,0BAA2B,WAC3B,4BAA6B,WAC7B,iCAAkC,WAClC,yBAA0B,WAC1B,4BAA6B,WAC7B,8BAA+B,WAC/B,qBAAsB,WACtB,2BAA4B,WAC5B,6BAA8B,WAC9B,gCAAiC,WACjC,sCAAuC,WACvC,sCAAuC,WACvC,uBAAwB,WACxB,wBAAyB,WACzB,wBAAyB,WACzB,oBAAqB,WACrB,mBAAoB,WACpB,gCAAiC,WACjC,qBAAsB,WACtB,4BAA6B,WAC7B,wBAAyB,WACzB,8BAA+B,WAC/B,6BAA8B,WAC9B,oCAAqC,WACrC,qBAAsB,WACtB,oCAAqC,WACrC,mCAAoC,WACpC,6BAA8B,WAC9B,qCAAsC,WACtC,6BAA8B,WAC9B,uBAAwB,WACxB,mBAAoB,WACpB,2BAA4B,WAC5B,0BAA2B,WAC3B,iCAAkC,WAClC,uBAAwB,WACxB,gCAAiC,WACjC,iBAAkB,WAClB,eAAgB,WAChB,qBAAsB,WACtB,0BAA2B,WAC3B,sBAAuB,WACvB,2BAA4B,WAC5B,0BAA2B,WAC3B,eAAgB,WAChB,qBAAsB,WACtB,mCAAoC,WACpC,iBAAkB,WAClB,2BAA4B,WAC5B,mBAAoB,WACpB,+BAAgC,WAChC,+BAAgC,WAChC,kBAAmB,WACnB,YAAa,WACb,aAAc,WACd,cAAe,WACf,qBAAsB,WACtB,0BAA2B,WAC3B,wBAAyB,WACzB,gCAAiC,WACjC,wBAAyB,WACzB,2BAA4B,WAC5B,kBAAmB,WACnB,6BAA8B,WAC9B,qBAAsB,WACtB,6BAA8B,WAC9B,0BAA2B,WAC3B,6BAA8B,WAC9B,gCAAiC,WACjC,qBAAsB,WACtB,8BAA+B,WAC/B,uBAAwB,WACxB,uBAAwB,WACxB,sBAAuB,WACvB,uBAAwB,WACxB,qBAAsB,WACtB,wBAAyB,WACzB,yBAA0B,WAC1B,0BAA2B,WAC3B,0BAA2B,WAC3B,0BAA2B,WAC3B,4BAA6B,WAC7B,oBAAqB,WACrB,2BAA4B,WAC5B,wBAAyB,WACzB,0BAA2B,WAC3B,oBAAqB,WACrB,2BAA4B,WAC5B,2BAA4B,WAC5B,qBAAsB,WACtB,8BAA+B,WAC/B,0BAA2B,WAE3B,gCAAiC,UACrC"}
|
|
1
|
+
{"version":3,"file":"diagnostic-codes.js","names":["diagnosticCodes"],"sources":["../../diagnostic-codes.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\n// The PLAY codes the editor reports. Every one of them mirrors a condition the compiler checks and\n// carries the compiler's own code for it, so the same problem is called the same thing whether it was\n// found by the CLI or by a squiggle - see Documentation/screenplay/diagnostics.md for the catalogue.\n//\n// A code is only ever added here for a condition the compiler can also report. The editor makes a few\n// structural checks the compiler does not - the capture and projection validators are where they live -\n// and those stay codeless deliberately: minting a PLAY number for something no compiler run can emit\n// would make the catalogue describe two different tools.\nexport const diagnosticCodes = {\n unknownMatchPattern: 'PLAY0366',\n invalidMatchPattern: 'PLAY0367',\n patternOutsidePortableMatchDialect: 'PLAY0699',\n deprecatedStudioTextRulePattern: 'PLAY0787',\n repeatedSingularDeclarationAcrossFiles: 'PLAY0172',\n directionlessTranslationReactsToOwnCapture: 'PLAY0694',\n pendingIntentWithOtherHandler: 'PLAY0698',\n commandHandlerRequiresAttachment: 'PLAY0800', // C# only\n duplicateEventInProjectionScope: 'PLAY0801',\n describedCommandNotImplemented: 'PLAY0695', // C# only\n describedCommandWithoutProductions: 'PLAY0696', // C# only\n describedCommandCardinalityNotAdmitted: 'PLAY0697', // C# only\n invalidExposureDeclaration: 'PLAY0621',\n unknownExposureOwner: 'PLAY0622',\n reExposureCycle: 'PLAY0623',\n reExposureBroken: 'PLAY0624',\n invalidInstanceContribution: 'PLAY0625',\n unknownContributionInstance: 'PLAY0626',\n contributionNotExposed: 'PLAY0627',\n contributionTypeMismatch: 'PLAY0628',\n unknownTemplateContentSlot: 'PLAY0629',\n unknownNavigationOutlet: 'PLAY0630',\n templateScopeMismatch: 'PLAY0631',\n incompatibleComponentPackage: 'PLAY0632',\n unknownNavigationDestination: 'PLAY0654',\n unknownScreenContributionPoint: 'PLAY0655',\n templateNestingCycle: 'PLAY0656',\n templateCategoryMissing: 'PLAY0720',\n invalidTemplateVersionRange: 'PLAY0721',\n unknownTemplateBlueprint: 'PLAY0722',\n mixedEnumerationNumbering: 'PLAY0667',\n duplicateEnumerationNumber: 'PLAY0668',\n enumerationNumberOutsideInt32: 'PLAY0669',\n malformedEnumerationNumber: 'PLAY0670',\n unpinnedStoredEnumeration: 'PLAY0671',\n invalidIdentityDeclaration: 'PLAY0633',\n duplicateIdentity: 'PLAY0634',\n invalidIdentityDetail: 'PLAY0635',\n unknownIdentitySource: 'PLAY0636',\n identityDetailWithoutSource: 'PLAY0637',\n identitySourceWithBody: 'PLAY0638',\n duplicateIdentityDetail: 'PLAY0639',\n builtInIdentityDetail: 'PLAY0640',\n unknownIdentityQuery: 'PLAY0641',\n invalidIdentityQuery: 'PLAY0642',\n identityQueryWithoutKey: 'PLAY0643',\n invalidIdentityQueryKey: 'PLAY0644',\n identityQueryAuthorizationDependency: 'PLAY0645',\n identityQueryTypeMismatch: 'PLAY0646',\n invalidReactionIdentity: 'PLAY0647',\n gatedInvocationWithoutIdentity: 'PLAY0648',\n unusedReactionIdentity: 'PLAY0649',\n unusedReactionRole: 'PLAY0650',\n unsatisfiedReactionIdentity: 'PLAY0651',\n reactionPrivilegeEscalation: 'PLAY0652',\n // Preserve supplied C# whole-model diagnostics; these checks are not yet run by the editor.\n commandProducesPublicEvent: 'PLAY0607',\n publicEventRequiresOutboundTranslation: 'PLAY0608',\n outboundPublicEventCount: 'PLAY0609',\n foreignPublicEventConsumer: 'PLAY0610',\n outboundTranslationInput: 'PLAY0611',\n inboundTranslationOutput: 'PLAY0612',\n foreignPublicEventProduced: 'PLAY0613',\n publicTranslationRequiresDirection: 'PLAY0614',\n translationConstructDirection: 'PLAY0615',\n inboundTranslationInput: 'PLAY0616',\n outboundTranslationOutput: 'PLAY0617',\n eventTargetOutsideOutboundTranslation: 'PLAY0618',\n eventsSourceOutsideInboundTranslation: 'PLAY0619',\n invalidCaptureEventsSource: 'PLAY0620',\n captureEventsFromSeveralOrigins: 'PLAY0687',\n captureEventsKeyNotRequired: 'PLAY0700',\n captureEventsRecordFixture: 'PLAY0701',\n refutedGeneratedConceptRule: 'PLAY0688',\n unprovenGeneratedConceptRule: 'PLAY0689',\n invalidReadModelKey: 'PLAY0660',\n incompleteReadModelKey: 'PLAY0661',\n invalidReadModelKeyLookup: 'PLAY0662',\n productionRouteOutsideCommand: 'PLAY0663',\n redundantProductionRoute: 'PLAY0664',\n invalidObserverFilter: 'PLAY0665',\n observerFilterExcludesEveryProducer: 'PLAY0666',\n reducerIdentityMismatch: 'PLAY0690',\n generationSupportBudgetExceeded: 'PLAY0691',\n emptyGenerationSupport: 'PLAY0692',\n invalidReactionBatchesDeclaration: 'PLAY0693',\n invalidCommandReadsDeclaration: 'PLAY0780',\n invalidDescription: 'PLAY0145',\n emptyDescription: 'PLAY0146',\n duplicateDescription: 'PLAY0147',\n unknownConceptDirective: 'PLAY0010',\n attributeReasonWithoutAttribute: 'PLAY0012',\n duplicateAttributeReason: 'PLAY0013',\n duplicateComplianceMarker: 'PLAY0653',\n legacyComplianceMarker: 'PLAY0565',\n unknownComplianceMarker: 'PLAY0566',\n invalidSecretScope: 'PLAY0567',\n duplicateSecretScope: 'PLAY0568',\n secretScopeIgnoredForPii: 'PLAY0569',\n invalidPersonalDataQualifier: 'PLAY0570',\n duplicateSpecialCategory: 'PLAY0571',\n invalidPurposeDeclaration: 'PLAY0596',\n invalidPurposeVocabulary: 'PLAY0597',\n duplicatePurposeField: 'PLAY0598',\n duplicatePurposeDeclaration: 'PLAY0599',\n unknownPurpose: 'PLAY0600',\n purposeInterestMismatch: 'PLAY0601',\n personalDataWithoutPurpose: 'PLAY0602',\n specialDataWithoutCondition: 'PLAY0603',\n criminalDataWithoutAuthorization: 'PLAY0604',\n purposeWithoutBasis: 'PLAY0605',\n unusedPurpose: 'PLAY0606',\n duplicateEventSubject: 'PLAY0590',\n invalidSubjectType: 'PLAY0591',\n protectedSubjectType: 'PLAY0592',\n invalidSubjectOwner: 'PLAY0593',\n readModelSubjectNotSupported: 'PLAY0594',\n invalidSubjectModifierOrder: 'PLAY0595',\n // Supplied compiler diagnostics are preserved, even for checks only the C# tool can run.\n // See Documentation/screenplay/editor-diagnostics.md for the validation boundary.\n conflictingScreenDataBinding: 'PLAY0530',\n screenDataQueryMismatch: 'PLAY0531',\n actionWithoutInputSurface: 'PLAY0532',\n commandWithoutInputSurface: 'PLAY0533',\n readModelFieldWithoutOrigin: 'PLAY0534',\n queryParameterNotHeldByView: 'PLAY0535',\n unconsumedEvent: 'PLAY0536',\n unreachableScreen: 'PLAY0537',\n invalidSpecificationCallerPersona: 'PLAY0572',\n unsynthesizablePersonaCaller: 'PLAY0573',\n personaWithoutGate: 'PLAY0574',\n gateWithoutPersona: 'PLAY0575',\n ambiguousPersonaCaller: 'PLAY0576',\n invalidSpecificationParameter: 'PLAY0577',\n invalidSpecificationCase: 'PLAY0578',\n duplicateSpecificationParameter: 'PLAY0579',\n duplicateSpecificationCase: 'PLAY0580',\n incompleteSpecificationTable: 'PLAY0581',\n invalidSpecificationCaseAssignment: 'PLAY0582',\n invalidSpecificationCaseValue: 'PLAY0583',\n invalidSpecificationCaseReference: 'PLAY0584',\n optionalSpecificationParameterTarget: 'PLAY0585',\n specificationCaseNameCollision: 'PLAY0586',\n incompatibleSpecificationParameterType: 'PLAY0587',\n unusedSpecificationParameter: 'PLAY0588',\n singularSpecificationTableExpansion: 'PLAY0589',\n invalidActionAlternative: 'PLAY0341',\n guardedActionWithoutAlternatives: 'PLAY0342',\n misplacedActionOtherwise: 'PLAY0343',\n unsupportedActionConditionOperand: 'PLAY0344',\n unknownActionSubjectField: 'PLAY0345',\n unresolvedActionSubject: 'PLAY0346',\n unreachableActionAlternative: 'PLAY0347',\n unknownActionArgumentProperty: 'PLAY0348',\n invalidRefusalBranch: 'PLAY0538',\n invalidRefusalBranchBody: 'PLAY0539',\n unreachableRefusalBranch: 'PLAY0540',\n invalidRefusalValue: 'PLAY0541',\n unknownRefusalConstraint: 'PLAY0542',\n unmatchedRedeliveredOccurrence: 'PLAY0543',\n unknownRedeliveryReaction: 'PLAY0544',\n invalidNoEventsExpectation: 'PLAY0545',\n indeterminateNegatedClaimTarget: 'PLAY0546',\n invalidAbsentReadModelStep: 'PLAY0453',\n unknownConstraintProperty: 'PLAY0391',\n invalidSpecificationExample: 'PLAY0518',\n duplicateSpecificationAssignment: 'PLAY0519',\n unknownReadModelProperty: 'PLAY0514',\n piiNotSupportedOnIdentifier: 'PLAY0515',\n invalidEventSourceDeclaration: 'PLAY0503',\n invalidCommandStream: 'PLAY0504',\n invalidSpecificationStream: 'PLAY0547',\n specificationStreamOnCommand: 'PLAY0548',\n invalidSpecificationStreamRoute: 'PLAY0549',\n invalidSpecificationStreamEventSource: 'PLAY0550',\n specificationStreamContradictsCommand: 'PLAY0551',\n ambiguousCommandStream: 'PLAY0505',\n unsupportedStreamIdType: 'PLAY0506',\n redundantSourceStreamId: 'PLAY0507',\n eventFromLaterSlice: 'PLAY0516',\n timelineCycleGroup: 'PLAY0517',\n invalidSpecificationExampleBody: 'PLAY0526',\n undeclaredDependency: 'PLAY0552',\n unusedDependencyDeclaration: 'PLAY0553',\n invalidDependencyTarget: 'PLAY0554',\n repeatedDependencyDeclaration: 'PLAY0555',\n mutualDependencyDeclarations: 'PLAY0556',\n authorizationRefusalWithoutIdentity: 'PLAY0557',\n invalidDocumentation: 'PLAY0558',\n conflictingDocumentationAcrossFiles: 'PLAY0559',\n unsupportedInteractionAlternatives: 'PLAY0560',\n mixedInteractionAlternatives: 'PLAY0561',\n interactionAlternativeWithoutActions: 'PLAY0562',\n inlineInteractionAlternative: 'PLAY0563',\n legacyInteractionWhere: 'PLAY0564',\n ambiguousReference: 'PLAY0198',\n invalidImplementationBlock: 'PLAY0492',\n invalidImplementationHint: 'PLAY0493',\n conflictingImplementationSources: 'PLAY0494',\n eventSourceIdInPayload: 'PLAY0469',\n explicitProducesTargetsRequired: 'PLAY0470',\n redundantEventId: 'PLAY0471',\n invalidEventId: 'PLAY0472',\n inlineEventCollision: 'PLAY0473',\n inlineEventOutsideCommand: 'PLAY0474',\n inlineEventGeneration: 'PLAY0475',\n reservedProductionMetadata: 'PLAY0476',\n invalidEventDocumentation: 'PLAY0477',\n tabIndentation: 'PLAY0006',\n unknownPrimitiveType: 'PLAY0008',\n mismatchedSpecificationQueryResult: 'PLAY0465',\n unknownSliceType: 'PLAY0028',\n duplicateCommandIdentifier: 'PLAY0036',\n unknownContextPath: 'PLAY0153',\n unknownContextCausedByProperty: 'PLAY0154',\n unknownContextIdentityProperty: 'PLAY0155',\n unclosedCodeBlock: 'PLAY0164',\n unknownType: 'PLAY0165',\n unknownEvent: 'PLAY0166',\n unknownPolicy: 'PLAY0167',\n duplicateDeclaration: 'PLAY0168',\n unknownEventContextMember: 'PLAY0295',\n unknownEventContextPath: 'PLAY0296',\n eventContextPathBelowCollection: 'PLAY0297',\n missingEventContextPath: 'PLAY0298',\n unresolvedDynamicKeySource: 'PLAY0299',\n invalidFileImport: 'PLAY0454',\n omittedProductionDestination: 'PLAY0478',\n legacyOptionalSuffix: 'PLAY0479',\n invalidOptionalModifierOrder: 'PLAY0480',\n optionalReadsNotSupported: 'PLAY0481',\n unavailableResponseExecution: 'PLAY0268',\n generatedPropertyOutsideCommand: 'PLAY0482',\n invalidGeneratedType: 'PLAY0483',\n invalidGeneratedModifierOrder: 'PLAY0484',\n generatedPropertyInput: 'PLAY0485',\n invalidCommandResponse: 'PLAY0486',\n invalidResponseSource: 'PLAY0487',\n duplicateResponseField: 'PLAY0488',\n invalidResponseShape: 'PLAY0489',\n invalidGeneratedFixture: 'PLAY0490',\n invalidReturnExpectation: 'PLAY0491',\n unknownGenerationStrategy: 'PLAY0672',\n invalidGenerationArgument: 'PLAY0673',\n invalidGenerationModifier: 'PLAY0674',\n duplicateGenerationModifier: 'PLAY0675',\n duplicateGeneration: 'PLAY0676',\n invalidGenerationPrimitive: 'PLAY0677',\n invalidGenerationPrefix: 'PLAY0678',\n invalidGenerationAlphabet: 'PLAY0679',\n invalidTypeIdPrefix: 'PLAY0680',\n generationSizeOutsideRange: 'PLAY0681',\n reservedSequenceGeneration: 'PLAY0682',\n lowGenerationEntropy: 'PLAY0683',\n lowGeneratedIdentifierEntropy: 'PLAY0684',\n responseNameUsedOnFailure: 'PLAY0685',\n // Retired by ESM v16; preserve supplied warnings from earlier native compilers.\n eventIdPinNotCarriedToRenderers: 'PLAY0686',\n} as const;\n\nexport type DiagnosticCode = (typeof diagnosticCodes)[keyof typeof diagnosticCodes];\n"],"mappings":"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"}
|