@cratis/screenplay-language 4.52.0 → 4.54.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/README.md +15 -0
  2. package/dist/TypeReferenceSymbol.d.ts +8 -0
  3. package/dist/TypeReferenceSymbol.d.ts.map +1 -0
  4. package/dist/bundles/chunk-GJX4NJYC.js +4836 -0
  5. package/dist/bundles/chunk-GJX4NJYC.js.map +7 -0
  6. package/dist/bundles/index.js +1417 -0
  7. package/dist/bundles/index.js.map +7 -0
  8. package/dist/bundles/sub-languages/capture/index.js +677 -0
  9. package/dist/bundles/sub-languages/capture/index.js.map +7 -0
  10. package/dist/bundles/sub-languages/projection/index.js +1647 -0
  11. package/dist/bundles/sub-languages/projection/index.js.map +7 -0
  12. package/dist/code-actions.d.ts +3 -0
  13. package/dist/code-actions.d.ts.map +1 -0
  14. package/dist/completion-items.d.ts +1 -0
  15. package/dist/completion-items.d.ts.map +1 -1
  16. package/dist/completion-planner.d.ts.map +1 -1
  17. package/dist/completions.d.ts.map +1 -1
  18. package/dist/diagnostic-codes.d.ts +3 -0
  19. package/dist/diagnostic-codes.d.ts.map +1 -1
  20. package/dist/diagnostics.d.ts.map +1 -1
  21. package/dist/hover-content.d.ts.map +1 -1
  22. package/dist/index.d.ts +3 -0
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/keyword-docs.d.ts.map +1 -1
  25. package/dist/language.d.ts +1 -0
  26. package/dist/language.d.ts.map +1 -1
  27. package/dist/production-destinations.d.ts.map +1 -1
  28. package/dist/symbols.d.ts +4 -0
  29. package/dist/symbols.d.ts.map +1 -1
  30. package/dist/tokens.d.ts.map +1 -1
  31. package/dist/validation.d.ts +1 -0
  32. package/dist/validation.d.ts.map +1 -1
  33. package/package.json +13 -9
  34. package/DestinationHint.ts +0 -8
  35. package/ProductionSymbol.ts +0 -11
  36. package/completion-items.ts +0 -261
  37. package/completion-planner.ts +0 -167
  38. package/completions.ts +0 -156
  39. package/diagnostic-codes.ts +0 -43
  40. package/diagnostics.ts +0 -55
  41. package/dist/DestinationHint.js +0 -4
  42. package/dist/DestinationHint.js.map +0 -1
  43. package/dist/ProductionSymbol.js +0 -4
  44. package/dist/ProductionSymbol.js.map +0 -1
  45. package/dist/completion-items.js +0 -228
  46. package/dist/completion-items.js.map +0 -1
  47. package/dist/completion-planner.js +0 -143
  48. package/dist/completion-planner.js.map +0 -1
  49. package/dist/completions.js +0 -101
  50. package/dist/completions.js.map +0 -1
  51. package/dist/diagnostic-codes.js +0 -41
  52. package/dist/diagnostic-codes.js.map +0 -1
  53. package/dist/diagnostics.js +0 -50
  54. package/dist/diagnostics.js.map +0 -1
  55. package/dist/document-context.js +0 -85
  56. package/dist/document-context.js.map +0 -1
  57. package/dist/event-analysis-source.js +0 -19
  58. package/dist/event-analysis-source.js.map +0 -1
  59. package/dist/event-context-catalog.js +0 -116
  60. package/dist/event-context-catalog.js.map +0 -1
  61. package/dist/event-context.js +0 -88
  62. package/dist/event-context.js.map +0 -1
  63. package/dist/file-imports.js +0 -58
  64. package/dist/file-imports.js.map +0 -1
  65. package/dist/file-references.js +0 -70
  66. package/dist/file-references.js.map +0 -1
  67. package/dist/hover-content.js +0 -98
  68. package/dist/hover-content.js.map +0 -1
  69. package/dist/hover.js +0 -15
  70. package/dist/hover.js.map +0 -1
  71. package/dist/index.js +0 -61
  72. package/dist/index.js.map +0 -1
  73. package/dist/inlay-hints.js +0 -15
  74. package/dist/inlay-hints.js.map +0 -1
  75. package/dist/inline-event-validation.js +0 -131
  76. package/dist/inline-event-validation.js.map +0 -1
  77. package/dist/keyword-docs.js +0 -148
  78. package/dist/keyword-docs.js.map +0 -1
  79. package/dist/language.js +0 -196
  80. package/dist/language.js.map +0 -1
  81. package/dist/production-destinations.js +0 -32
  82. package/dist/production-destinations.js.map +0 -1
  83. package/dist/sub-language-registry.js +0 -18
  84. package/dist/sub-language-registry.js.map +0 -1
  85. package/dist/sub-languages/capture/CompletionProvider.js +0 -332
  86. package/dist/sub-languages/capture/CompletionProvider.js.map +0 -1
  87. package/dist/sub-languages/capture/HoverProvider.js +0 -87
  88. package/dist/sub-languages/capture/HoverProvider.js.map +0 -1
  89. package/dist/sub-languages/capture/Validator.js +0 -72
  90. package/dist/sub-languages/capture/Validator.js.map +0 -1
  91. package/dist/sub-languages/capture/index.js +0 -58
  92. package/dist/sub-languages/capture/index.js.map +0 -1
  93. package/dist/sub-languages/capture/language.js +0 -160
  94. package/dist/sub-languages/capture/language.js.map +0 -1
  95. package/dist/sub-languages/cdl.js +0 -74
  96. package/dist/sub-languages/cdl.js.map +0 -1
  97. package/dist/sub-languages/pdl.js +0 -73
  98. package/dist/sub-languages/pdl.js.map +0 -1
  99. package/dist/sub-languages/projection/CodeActionProvider.js +0 -93
  100. package/dist/sub-languages/projection/CodeActionProvider.js.map +0 -1
  101. package/dist/sub-languages/projection/CompletionProvider.js +0 -595
  102. package/dist/sub-languages/projection/CompletionProvider.js.map +0 -1
  103. package/dist/sub-languages/projection/HoverProvider.js +0 -333
  104. package/dist/sub-languages/projection/HoverProvider.js.map +0 -1
  105. package/dist/sub-languages/projection/Validator.js +0 -388
  106. package/dist/sub-languages/projection/Validator.js.map +0 -1
  107. package/dist/sub-languages/projection/index.js +0 -160
  108. package/dist/sub-languages/projection/index.js.map +0 -1
  109. package/dist/sub-languages/projection/language.js +0 -171
  110. package/dist/sub-languages/projection/language.js.map +0 -1
  111. package/dist/symbols.js +0 -275
  112. package/dist/symbols.js.map +0 -1
  113. package/dist/themes/screenplay-dark.js +0 -30
  114. package/dist/themes/screenplay-dark.js.map +0 -1
  115. package/dist/themes/screenplay-light.js +0 -30
  116. package/dist/themes/screenplay-light.js.map +0 -1
  117. package/dist/tokens.js +0 -147
  118. package/dist/tokens.js.map +0 -1
  119. package/dist/validation.js +0 -248
  120. package/dist/validation.js.map +0 -1
  121. package/document-context.ts +0 -93
  122. package/event-analysis-source.ts +0 -18
  123. package/event-context-catalog.ts +0 -135
  124. package/event-context.ts +0 -119
  125. package/file-imports.ts +0 -70
  126. package/file-references.ts +0 -87
  127. package/for_documentContext/when_stripping_comments.ts +0 -32
  128. package/for_eventContext/when_resolving_generated_catalog_vectors.ts +0 -15
  129. package/for_eventGenerations/when_editing_event_generations.ts +0 -57
  130. package/for_fileImports/when_finding_file_imports.ts +0 -38
  131. package/for_fileReferences/when_recognizing_an_absolute_path/with_paths_of_every_shape.ts +0 -26
  132. package/for_fileReferences/when_scanning_a_document/inside_a_code_fence.ts +0 -26
  133. package/for_fileReferences/when_scanning_a_document/with_a_bare_file_keyword.ts +0 -19
  134. package/for_fileReferences/when_scanning_a_document/with_a_file_directive.ts +0 -30
  135. package/for_fileReferences/when_scanning_a_document/with_a_property_named_file.ts +0 -25
  136. package/for_fileReferences/when_scanning_a_document/with_a_trailing_comment.ts +0 -25
  137. package/for_fileReferences/when_scanning_a_document/with_directives_on_several_constructs.ts +0 -41
  138. package/for_importablePaths/when_listing_what_a_document_can_import.ts +0 -34
  139. package/for_inlineEvents/when_analyzing_many_inline_events.ts +0 -59
  140. package/for_inlineEvents/when_authoring_inline_events.ts +0 -149
  141. package/for_inlineEvents/when_completing_many_events.ts +0 -49
  142. package/for_inlineEvents/when_indexing_command_production_ownership.ts +0 -79
  143. package/for_planCompletions/when_completing_a_file_import.ts +0 -26
  144. package/for_planCompletions/when_completing_a_specification_query.ts +0 -24
  145. package/for_planCompletions/when_completing_a_specification_step.ts +0 -42
  146. package/for_planCompletions/when_completing_an_absent_read_model.ts +0 -14
  147. package/for_planCompletions/when_completing_reaction_reads.ts +0 -36
  148. package/for_projectionCompletionProvider/when_completing_an_event_context_path.ts +0 -102
  149. package/for_projectionHoverProvider/when_hovering_an_event_context_path.ts +0 -44
  150. package/for_projectionValidator/when_validating_a_projection_with_variants.ts +0 -128
  151. package/for_projectionValidator/when_validating_event_context_paths.ts +0 -31
  152. package/for_scanDocument/when_scanning_a_query/with_a_dotted_return_type.ts +0 -34
  153. package/for_scanDocument/when_scanning_aliased_reads.ts +0 -33
  154. package/for_scanDocument/when_scanning_many_commands.ts +0 -47
  155. package/for_tokens/when_highlighting_a_file_import.ts +0 -18
  156. package/for_tokens/when_highlighting_event_metadata.ts +0 -63
  157. package/for_tokens/when_highlighting_specification_steps.ts +0 -28
  158. package/for_validateLines/when_validating_a_document/with_a_problem_of_every_coded_kind.ts +0 -77
  159. package/for_validateLines/when_validating_a_document/with_an_unknown_policy.ts +0 -33
  160. package/for_validateLines/when_validating_a_file_placed_by_an_import/with_names_declared_in_other_files.ts +0 -43
  161. package/for_validateLines/when_validating_event_context_paths/in_a_projection.ts +0 -97
  162. package/for_validateLines/when_validating_file_imports/at_every_level.ts +0 -36
  163. package/for_validateLines/when_validating_production_destinations/with_an_available_identifier.ts +0 -120
  164. package/hover-content.ts +0 -117
  165. package/hover.ts +0 -23
  166. package/index.ts +0 -125
  167. package/inlay-hints.ts +0 -17
  168. package/inline-event-validation.ts +0 -115
  169. package/keyword-docs.ts +0 -152
  170. package/language.ts +0 -212
  171. package/production-destinations.ts +0 -32
  172. package/sub-language-registry.ts +0 -42
  173. package/sub-languages/capture/CompletionProvider.ts +0 -365
  174. package/sub-languages/capture/HoverProvider.ts +0 -99
  175. package/sub-languages/capture/Validator.ts +0 -97
  176. package/sub-languages/capture/index.ts +0 -72
  177. package/sub-languages/capture/language.ts +0 -176
  178. package/sub-languages/cdl.ts +0 -76
  179. package/sub-languages/pdl.ts +0 -75
  180. package/sub-languages/projection/CodeActionProvider.ts +0 -123
  181. package/sub-languages/projection/CompletionProvider.ts +0 -660
  182. package/sub-languages/projection/HoverProvider.ts +0 -377
  183. package/sub-languages/projection/Validator.ts +0 -441
  184. package/sub-languages/projection/index.ts +0 -223
  185. package/sub-languages/projection/language.ts +0 -193
  186. package/symbols.ts +0 -374
  187. package/themes/screenplay-dark.ts +0 -33
  188. package/themes/screenplay-light.ts +0 -33
  189. package/tokens.ts +0 -174
  190. package/validation.ts +0 -443
  191. package/vitest.setup.ts +0 -5
package/dist/tokens.js DELETED
@@ -1,147 +0,0 @@
1
- // Copyright (c) Cratis. All rights reserved.
2
- // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
- import { clauseKeywords, codeBlockTags, constructKeywords, primitiveTypes, sliceTypes, } from './language';
4
- // Maps a Screenplay inline code tag to the Monaco language id used for embedded highlighting.
5
- const embeddedLanguages = {
6
- csharp: 'csharp',
7
- typescript: 'typescript',
8
- react: 'typescript',
9
- html: 'html',
10
- sql: 'sql',
11
- };
12
- function subLanguageState(keyword) {
13
- return `subLanguage_${keyword}`;
14
- }
15
- // A construct keyword at the start of a line ends any indented sub-language block.
16
- function subLanguageExitRule(subLanguages) {
17
- const exitKeywords = [...constructKeywords, ...subLanguages.map((subLanguage) => subLanguage.keyword)];
18
- return [
19
- new RegExp(`^\\s*(?:${exitKeywords.join('|')})\\b`),
20
- { token: '@rematch', next: '@pop' },
21
- ];
22
- }
23
- // Shared across the composite `.play` tokenizer and every standalone sub-language tokenizer
24
- // (comments, `$`-prefixed context variables, strings, numbers, operators, delimiters, whitespace).
25
- export const commonTokenRules = [
26
- [/\/\/.*$/, 'comment'],
27
- [/\$(?:context|eventContext|eventSourceId|causedBy)(?:\.\w+)*/, 'variable.predefined'],
28
- [/\$(?:env|secrets|strings)\.[\w.]+/, 'variable.predefined'],
29
- [/\$\.[\w.]*/, 'variable.predefined'],
30
- [/"(?:[^"\\]|\\.)*"/, 'string'],
31
- [/"(?:[^"\\]|\\.)*$/, 'string.invalid'],
32
- [/\d+(?:ms|s|m|h|d)\b/, 'number'],
33
- [/-?\d+\.\d+/, 'number.float'],
34
- [/-?\d+/, 'number'],
35
- [/=>|==|!=|>=|<=|[><=:?]/, 'operator'],
36
- [/[[\](),.]/, 'delimiter'],
37
- [/\s+/, 'white'],
38
- ];
39
- export function createTokensProvider(subLanguages) {
40
- const tokenizer = {
41
- root: [
42
- // A specification's clock, trigger, capture and query steps - matched before a sub-language keyword
43
- // can claim 'capture' and read the rest of the specification as change data capture.
44
- [/^(\s*)(given|when)(\s+)(clock|capture|trigger|query)\b/, ['white', 'keyword', 'white', 'keyword']],
45
- [/^(\s*)(then)(\s+)(result|no\s+result)\b/, ['white', 'keyword', 'white', 'keyword']],
46
- // A quoted import names .play files rather than a qualified name - the path reads as a link.
47
- [/^(\s*)(import)(\s+)("[^"\\]*")/, ['white', 'keyword', 'white', 'string.link']],
48
- // Retain the header indent so event metadata stops at the enclosing block boundary.
49
- [/^(\s*)((?:produces\s+)?event)(\s+)([A-Za-z_]\w*)(\s+)(generation)(\s+)(\d+)(?=\s*(?:\/\/.*)?$)/,
50
- ['white', 'keyword', 'white', 'type.identifier', 'white', 'keyword', 'white', { token: 'number', next: '@eventBody.$1' }]],
51
- [/^(\s*)((?:produces\s+)?event)(\s+)([A-Za-z_]\w*)(?=\s*(?:\/\/.*)?$)/,
52
- ['white', 'keyword', 'white', { token: 'type.identifier', next: '@eventBody.$1' }]],
53
- // A tagged opening fence carries the embedded language; legacy tag lines still highlight.
54
- ...codeBlockTags.map((tag) => [
55
- new RegExp(`^\\s*\\x60\\x60\\x60${tag}\\s*$`),
56
- { token: 'string.quote', next: `@codeBlock.${embeddedLanguages[tag]}`, nextEmbedded: embeddedLanguages[tag] },
57
- ]),
58
- // Inline code block tags at end of line open an embedded code block.
59
- ...codeBlockTags.map((tag) => [
60
- new RegExp(`\\b${tag}\\b(?=\\s*$)`),
61
- { token: 'keyword.tag', next: `@codeBlockPending.${embeddedLanguages[tag]}` },
62
- ]),
63
- // Sub-language constructs switch to the registered sub-language's token rules.
64
- ...subLanguages.map((subLanguage) => [
65
- new RegExp(`\\b${subLanguage.keyword}\\b`),
66
- { token: 'keyword', next: `@${subLanguageState(subLanguage.keyword)}` },
67
- ]),
68
- // A bare description keyword at end of line opens a fenced plain-text block.
69
- [/\bdescription\b(?=\s*$)/, { token: 'keyword', next: '@descriptionBlockPending' }],
70
- [/\brow-click\b/, 'keyword'],
71
- // A leading @ escapes a name that collides with a directive keyword - it is a name, not an attribute.
72
- [/^\s*@[a-z_]\w*/, 'identifier'],
73
- [/@\w+/, 'annotation'],
74
- [
75
- /[A-Z]\w*/,
76
- {
77
- cases: {
78
- '@sliceTypes': 'keyword.type',
79
- '@primitiveTypes': 'type',
80
- '@default': 'type.identifier',
81
- },
82
- },
83
- ],
84
- [
85
- /[a-z_]\w*/,
86
- {
87
- cases: {
88
- '@keywords': 'keyword',
89
- '@default': 'identifier',
90
- },
91
- },
92
- ],
93
- { include: '@common' },
94
- ],
95
- eventBody: [
96
- [/^(?!$S2[ \t]+|\s*$)/, { token: '@rematch', next: '@pop' }],
97
- [/^(\s*)(id)(?=\s+")/, ['white', 'keyword']],
98
- [/^(\s*)(documentation)(?=\s*(?:\/\/.*)?$)/, ['white', { token: 'keyword', next: '@descriptionBlockPending' }]],
99
- { include: '@root' },
100
- ],
101
- common: commonTokenRules,
102
- // After a code tag, the only thing allowed before the opening fence is whitespace.
103
- codeBlockPending: [
104
- [
105
- /^\s*```\s*$/,
106
- { token: 'string.quote', switchTo: '@codeBlock.$S2', nextEmbedded: '$S2' },
107
- ],
108
- [/^\s*[^\s`].*$/, { token: '@rematch', next: '@pop' }],
109
- [/\s+/, 'white'],
110
- ],
111
- codeBlock: [
112
- [/^\s*```\s*$/, { token: 'string.quote', next: '@pop', nextEmbedded: '@pop' }],
113
- [/[^`]+/, ''],
114
- [/`/, ''],
115
- ],
116
- // After a bare description, the only thing allowed before the opening fence is whitespace.
117
- descriptionBlockPending: [
118
- [/\/\/.*$/, 'comment'],
119
- [/^\s*```(?:text|markdown)?\s*$/, { token: 'string.quote', switchTo: '@descriptionBlock' }],
120
- [/^\s*[^\s`].*$/, { token: '@rematch', next: '@pop' }],
121
- [/\s+/, 'white'],
122
- ],
123
- descriptionBlock: [
124
- [/^\s*```\s*$/, { token: 'string.quote', next: '@pop' }],
125
- [/.+/, 'string'],
126
- ],
127
- };
128
- for (const subLanguage of subLanguages) {
129
- tokenizer[subLanguageState(subLanguage.keyword)] = [
130
- subLanguageExitRule(subLanguages),
131
- ...subLanguage.tokens,
132
- { include: '@common' },
133
- [/[A-Z]\w*/, 'type.identifier'],
134
- [/[a-z_]\w*/, 'identifier'],
135
- ];
136
- }
137
- return {
138
- defaultToken: '',
139
- tokenPostfix: '.play',
140
- ignoreCase: false,
141
- keywords: [...constructKeywords, ...clauseKeywords, ...codeBlockTags],
142
- sliceTypes,
143
- primitiveTypes,
144
- tokenizer,
145
- };
146
- }
147
- //# sourceMappingURL=tokens.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../tokens.ts"],"names":[],"mappings":"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"}
@@ -1,248 +0,0 @@
1
- // Copyright (c) Cratis. All rights reserved.
2
- // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
- import { validateInlineEvents } from './inline-event-validation';
4
- import { causedByProperties, contextRoots, identityProperties, primitiveTypes, sliceTypes } from './language';
5
- import { diagnosticCodes } from './diagnostic-codes';
6
- import { enclosingChain, fenceMap, indentOf } from './document-context';
7
- import { eventAnalysisSource } from './event-analysis-source';
8
- import { resolveEventContextPath } from './event-context';
9
- import { knownEventNames, knownTypeNames, mergeSymbols, scanDocument, } from './symbols';
10
- import { fileImportOn, isFileImportLine } from './file-imports';
11
- function issue(severity, line, startColumn, length, message, code) {
12
- return { severity, message, line, startColumn, endColumn: startColumn + length, code };
13
- }
14
- function tokenIssue(severity, line, text, token, message, code) {
15
- const column = text.indexOf(token) + 1;
16
- return issue(severity, line, column, token.length, message, code);
17
- }
18
- // Reports every property whose type reference names nothing the document declares, and
19
- // every command that marks more than one property as its identifier.
20
- function validateDeclarations(lines, symbols, application) {
21
- const issues = [];
22
- const types = new Set([...knownTypeNames(symbols, primitiveTypes), ...knownTypeNames(application, [])]);
23
- const checkProperties = (properties, owner) => {
24
- for (const property of properties.filter((candidate) => !types.has(candidate.type.replace(/[[\]?]/g, '')))) {
25
- const bare = property.type.replace(/[[\]?]/g, '');
26
- issues.push(tokenIssue('warning', property.line, lines[property.line], property.type, `Unknown type '${bare}' on '${property.name}' of ${owner} — declare it with 'concept ${bare} : <Primitive>' or 'type ${bare}'.`, diagnosticCodes.unknownType));
27
- }
28
- };
29
- for (const type of symbols.types)
30
- checkProperties(type.properties, `type '${type.name}'`);
31
- for (const event of symbols.events)
32
- checkProperties(event.properties, `event '${event.name}'`);
33
- for (const query of symbols.queries)
34
- checkProperties(query.parameters, `query '${query.name}'`);
35
- for (const command of symbols.commands) {
36
- checkProperties(command.properties, `command '${command.name}'`);
37
- const identifiers = command.properties.filter((property) => property.isIdentifier);
38
- for (const extra of identifiers.slice(1)) {
39
- issues.push(tokenIssue('error', extra.line, lines[extra.line], 'identifier', `Command '${command.name}' already marks '${identifiers[0].name}' as identifier — only one property can be the identifier.`, diagnosticCodes.duplicateCommandIdentifier));
40
- }
41
- }
42
- const declared = new Map();
43
- for (const declaration of [...symbols.concepts, ...symbols.types]) {
44
- const first = declared.get(declaration.name);
45
- if (first === undefined) {
46
- declared.set(declaration.name, declaration.line);
47
- continue;
48
- }
49
- issues.push(tokenIssue('error', declaration.line, lines[declaration.line], declaration.name, `Duplicate declaration of '${declaration.name}' — concept and type names must be unique.`, diagnosticCodes.duplicateDeclaration));
50
- }
51
- return issues;
52
- }
53
- // Validates a Screenplay document without any editor dependency — both the Monaco
54
- // service and the VSCode extension adapt these issues to their marker/diagnostic APIs.
55
- //
56
- // The checks read the document line by line, never as a whole document's top level, so a file an import
57
- // places in a module or feature - holding slices or features at its top level - validates as it is written.
58
- // Where it is placed, and whether its imports resolve, is the compiler's to say.
59
- export function validateLines(lines, context = {}) {
60
- const fences = fenceMap(lines);
61
- const symbols = scanDocument(lines);
62
- const application = context.application ?? mergeSymbols();
63
- const events = new Set([...knownEventNames(symbols), ...knownEventNames(application)]);
64
- const policies = new Set([...symbols.policies, ...application.policies].map((policy) => policy.name));
65
- const issues = validateDeclarations(lines, symbols, application);
66
- issues.push(...validateProductionDestinations(lines, symbols));
67
- const checkEvent = (line, text, name) => {
68
- if (!events.has(name)) {
69
- issues.push(tokenIssue('warning', line, text, name, `Unknown event type '${name}' — declare it in a slice or import it.`, diagnosticCodes.unknownEvent));
70
- }
71
- };
72
- let authorizeIndent = -1;
73
- for (let index = 0; index < lines.length; index++) {
74
- const line = lines[index];
75
- const trimmed = line.trim();
76
- if (fences[index] || trimmed.length === 0)
77
- continue;
78
- const leading = line.match(/^[ ]*(\t+)/);
79
- if (leading) {
80
- issues.push(issue('warning', index, leading[0].length - leading[1].length + 1, leading[1].length, 'Screenplay is indentation-based — use spaces, not tabs.', diagnosticCodes.tabIndentation));
81
- }
82
- // Policy references continue on indented lines below an authorize clause.
83
- if (authorizeIndent >= 0) {
84
- if (indentOf(line) > authorizeIndent &&
85
- /^(?:or\s+)?[A-Z]\w*(?:\s+or\s+[A-Z]\w*)*$/.test(trimmed)) {
86
- for (const name of trimmed.split(/\s+/).filter((token) => token !== 'or')) {
87
- if (!policies.has(name)) {
88
- issues.push(tokenIssue('warning', index, line, name, `Unknown policy '${name}' — declare it with 'policy ${name}'.`, diagnosticCodes.unknownPolicy));
89
- }
90
- }
91
- continue;
92
- }
93
- authorizeIndent = -1;
94
- }
95
- const fileImportIssue = validateImport(lines, fences, index);
96
- if (fileImportIssue)
97
- issues.push(fileImportIssue);
98
- const slice = trimmed.match(/^slice\s+(\w+)/);
99
- if (slice && !sliceTypes.includes(slice[1])) {
100
- issues.push(tokenIssue('error', index, line, slice[1], `Unknown slice type '${slice[1]}' — expected ${sliceTypes.join(', ')}.`, diagnosticCodes.unknownSliceType));
101
- }
102
- const concept = trimmed.match(/^concept\s+\w+\s*:\s*(\w+)/);
103
- if (concept && concept[1] !== 'Enum' && !primitiveTypes.includes(concept[1])) {
104
- issues.push(tokenIssue('error', index, line, concept[1], `Unknown primitive type '${concept[1]}' — expected ${primitiveTypes.join(', ')} or Enum.`, diagnosticCodes.unknownPrimitiveType));
105
- }
106
- const authorize = trimmed.match(/^authorize\s+(.*)$/);
107
- if (authorize) {
108
- authorizeIndent = indentOf(line);
109
- for (const name of authorize[1].split(/\s+/).filter((token) => token !== 'or' && token.length > 0)) {
110
- if (!policies.has(name)) {
111
- issues.push(tokenIssue('warning', index, line, name, `Unknown policy '${name}' — declare it with 'policy ${name}'.`, diagnosticCodes.unknownPolicy));
112
- }
113
- }
114
- }
115
- const reactsOn = trimmed.match(/^on\s+([A-Z]\w*)\s*$/);
116
- if (reactsOn)
117
- checkEvent(index, line, reactsOn[1]);
118
- const produces = trimmed.match(/^produces\s+([A-Z]\w*)\s*$/);
119
- if (produces)
120
- checkEvent(index, line, produces[1]);
121
- if (/^produces\s+when\b/.test(trimmed)) {
122
- for (let next = index + 1; next < lines.length; next++) {
123
- const candidate = lines[next];
124
- if (fences[next] || candidate.trim().length === 0)
125
- continue;
126
- if (indentOf(candidate) > indentOf(line)) {
127
- const name = candidate.trim().match(/^([A-Z]\w*)\s*$/);
128
- if (name)
129
- checkEvent(next, candidate, name[1]);
130
- }
131
- break;
132
- }
133
- }
134
- const uniqueEvent = trimmed.match(/^unique\s+event\s+([A-Z]\w*)/);
135
- if (uniqueEvent)
136
- checkEvent(index, line, uniqueEvent[1]);
137
- const uniqueProperty = trimmed.match(/^unique\s+[a-z_]\w*\s+on\s+([A-Z]\w*)/);
138
- if (uniqueProperty)
139
- checkEvent(index, line, uniqueProperty[1]);
140
- // Every $context. path must name something CommandContext or QueryContext carries.
141
- for (const path of line.match(/\$context\.[\w.]+/g) ?? []) {
142
- const segments = path.substring('$context.'.length).split('.');
143
- if (!contextRoots.includes(segments[0])) {
144
- issues.push(tokenIssue('warning', index, line, path, `Unknown $context path '${segments.join('.')}' — expected one of ${contextRoots.join(', ')}.`, diagnosticCodes.unknownContextPath));
145
- }
146
- else if (segments[0] === 'causedBy' &&
147
- segments.length > 1 &&
148
- !causedByProperties.includes(segments[1])) {
149
- issues.push(tokenIssue('warning', index, line, path, `Unknown $context.causedBy property '${segments[1]}' — expected ${causedByProperties.join(', ')}.`, diagnosticCodes.unknownContextCausedByProperty));
150
- }
151
- else if (segments[0] === 'identity' &&
152
- segments.length > 1 &&
153
- !identityProperties.includes(segments[1])) {
154
- issues.push(tokenIssue('warning', index, line, path, `Unknown $context.identity property '${segments[1]}' — expected ${identityProperties.join(', ')}.`, diagnosticCodes.unknownContextIdentityProperty));
155
- }
156
- }
157
- }
158
- issues.push(...validateEventContextPaths(lines, fences));
159
- issues.push(...validateInlineEvents(lines, symbols, application));
160
- const fenceLines = lines
161
- .map((line, index) => ({ line, index }))
162
- .filter(({ line }) => /^\s*```(?:[a-z]+)?\s*$/.test(line));
163
- if (fenceLines.length % 2 === 1) {
164
- const last = fenceLines[fenceLines.length - 1];
165
- issues.push(issue('error', last.index, 1, last.line.length + 1, 'Unclosed inline code block — expected a closing ``` line.', diagnosticCodes.unclosedCodeBlock));
166
- }
167
- return issues;
168
- }
169
- // This is advice, not a semantic default: accepting the typed workspace repair changes routing.
170
- function validateProductionDestinations(lines, symbols) {
171
- const issues = [];
172
- lines = eventAnalysisSource(lines);
173
- for (const command of symbols.commands) {
174
- const identifiers = command.properties.filter(property => property.isIdentifier && !property.type.endsWith('?') && !property.type.endsWith('[]'));
175
- if (identifiers.length !== 1)
176
- continue;
177
- for (const production of command.produces ?? []) {
178
- if (production.inline || production.conditional || production.target !== undefined)
179
- continue;
180
- const line = production.line;
181
- issues.push(issue('information', line, indentOf(lines[line]) + 1, lines[line].trim().length, `Plain 'produces ${production.name}' omits its destination — use 'for ${identifiers[0].name}' to explicitly select the command's identifier.`, diagnosticCodes.omittedProductionDestination));
182
- }
183
- }
184
- return issues;
185
- }
186
- // Inside a module or feature an import names files, and a quoted import anywhere has the compiler's shape.
187
- function validateImport(lines, fences, index) {
188
- const line = lines[index];
189
- const trimmed = line.trim().replace(/\s*\/\/.*$/, '');
190
- if (!/^import\b/.test(trimmed) || fileImportOn(line, index))
191
- return undefined;
192
- const indent = indentOf(line);
193
- const inBody = indent > 0 && ['module', 'feature'].includes(enclosingChain(lines, fences, index, indent)[0]);
194
- if (!inBody && !isFileImportLine(line))
195
- return undefined;
196
- return issue('error', index, indent + 1, trimmed.length, `Invalid import '${trimmed}' — inside a module or feature, import names files: 'import "<path or glob>"'.`, diagnosticCodes.invalidFileImport);
197
- }
198
- // A mapping target: the first word of a mapping line, after the keyword that opens it if there is one.
199
- const mappingTarget = /^(?:(?:increment|decrement|count|clear|add|subtract|set)\s+)?@?([$\w.]+)(?=\s|=|$)/;
200
- // Every $eventContext.<path> - in an expression or as the dynamic key of a mapping target - checked against the
201
- // event-context catalog the way the compiler checks it (Parsing/EventContextPathValidator.cs).
202
- export function validateEventContextPaths(lines, fences) {
203
- const issues = [];
204
- const names = (members) => members.map((member) => member.name).join(', ');
205
- for (let index = 0; index < lines.length; index++) {
206
- const line = lines[index];
207
- if (fences[index])
208
- continue;
209
- for (const match of line.matchAll(/(\.)?\$eventContext((?:\.(?:\w+(?:\(\))?)?)*)/g)) {
210
- const token = match[0].substring(match[1]?.length ?? 0);
211
- const written = match[2];
212
- if (written.length === 0) {
213
- // A bare $eventContext names nothing only as a dynamic key; in an expression the compiler rejects it as invalid.
214
- if (match[1]) {
215
- issues.push(issue('error', index, (match.index ?? 0) + 2, token.length, `'$eventContext' names no member - expected one of ${names(resolveEventContextPath('').expected)}.`, diagnosticCodes.missingEventContextPath));
216
- }
217
- continue;
218
- }
219
- const path = written.substring(1);
220
- const resolution = resolveEventContextPath(path);
221
- const column = (match.index ?? 0) + (match[1]?.length ?? 0) + 1;
222
- switch (resolution.status) {
223
- case 'missing':
224
- issues.push(issue('error', index, column, token.length, `'$eventContext.${path}' names no member - expected one of ${names(resolution.expected)}.`, diagnosticCodes.missingEventContextPath));
225
- break;
226
- case 'unknownMember':
227
- issues.push(issue('warning', index, column, token.length, `Unknown event context member '${resolution.segment}' in '$eventContext.${path}' - expected one of ${names(resolution.expected)}.`, diagnosticCodes.unknownEventContextMember));
228
- break;
229
- case 'unknownSubPath': {
230
- const has = resolution.expected.length === 0 ? 'no members to address' : `members ${names(resolution.expected)}`;
231
- issues.push(issue('warning', index, column, token.length, `Unknown event context path '$eventContext.${path}' - '${resolution.member?.name}' (${resolution.member?.type}) has ${has}.`, diagnosticCodes.unknownEventContextPath));
232
- break;
233
- }
234
- case 'belowCollection':
235
- issues.push(issue('error', index, column, token.length, `'$eventContext.${path}' cannot resolve - '${resolution.member?.name}' is a collection (${resolution.member?.type}) and cannot be addressed below.`, diagnosticCodes.eventContextPathBelowCollection));
236
- break;
237
- }
238
- }
239
- // Only $eventContext resolves in a dynamic key; any other $ source is kept as the literal key text.
240
- const target = line.trim().match(mappingTarget)?.[1];
241
- const source = target?.match(/\.\$(\w+)/)?.[1];
242
- if (target && source && source !== 'eventContext') {
243
- issues.push(tokenIssue('warning', index, line, target, `Dynamic dictionary key '$${source}' in '${target}' is never resolved - only '$eventContext.<path>' is, so the literal text '$${source}' becomes the key.`, diagnosticCodes.unresolvedDynamicKeySource));
244
- }
245
- }
246
- return issues;
247
- }
248
- //# sourceMappingURL=validation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../validation.ts"],"names":[],"mappings":"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"}
@@ -1,93 +0,0 @@
1
- // Copyright (c) Cratis. All rights reserved.
2
- // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
-
4
- // Matches SourceLineSplitter.CommentStart: // inside a double-quoted string or a
5
- // backtick template is content; a backslash escapes the next character only in a string.
6
- export function withoutComment(line: string): string {
7
- let inString = false;
8
- let inTemplate = false;
9
- for (let index = 0; index < line.length; index++) {
10
- const character = line[index];
11
- if (character === '\\' && inString && index + 1 < line.length) {
12
- index++;
13
- } else if (character === '"' && !inTemplate) {
14
- inString = !inString;
15
- } else if (character === '`' && !inString) {
16
- inTemplate = !inTemplate;
17
- } else if (!inString && !inTemplate && character === '/' && line[index + 1] === '/') {
18
- return line.slice(0, index);
19
- }
20
- }
21
- return line;
22
- }
23
-
24
- export function indentOf(line: string): number {
25
- return line.length - line.trimStart().length;
26
- }
27
-
28
- export function firstWord(line: string): string {
29
- return line.trim().split(/\s+/)[0] ?? '';
30
- }
31
-
32
- // Marks every line that is a code fence or lives inside one, so structural
33
- // scanning never mistakes inline C#/TypeScript/HTML for Screenplay.
34
- export function fenceMap(lines: string[]): boolean[] {
35
- const map: boolean[] = new Array(lines.length).fill(false);
36
- let open = false;
37
- for (let index = 0; index < lines.length; index++) {
38
- if (/^\s*```(?:[a-z]+)?\s*$/.test(lines[index]) && (!open || /^\s*```\s*$/.test(lines[index]))) {
39
- map[index] = true;
40
- open = !open;
41
- continue;
42
- }
43
- map[index] = open;
44
- }
45
- return map;
46
- }
47
-
48
- // Walks upward from a position and returns the chain of enclosing block openers,
49
- // innermost first — e.g. ['command', 'slice', 'feature', 'module']. A block opener
50
- // is any less-indented line above; its first word names the construct (for layout
51
- // slots this is the slot name, which callers treat as an unknown construct).
52
- export function enclosingChain(
53
- lines: string[],
54
- fences: boolean[],
55
- lineIndex: number,
56
- indent: number,
57
- ): string[] {
58
- const chain: string[] = [];
59
- let currentIndent = indent;
60
- for (let index = lineIndex - 1; index >= 0 && currentIndent > 0; index--) {
61
- if (fences[index]) continue;
62
- const line = withoutComment(lines[index]);
63
- if (line.trim().length === 0) continue;
64
- const lineIndent = indentOf(line);
65
- if (lineIndent < currentIndent) {
66
- chain.push(firstWord(line));
67
- currentIndent = lineIndent;
68
- }
69
- }
70
- return chain;
71
- }
72
-
73
- // Returns the full trimmed text of the nearest enclosing block opener above a
74
- // position — the same line enclosingChain's first entry is derived from, but kept
75
- // whole rather than reduced to its first word. Used where the construct is not
76
- // identified by a fixed leading keyword, such as a validation rule line, whose
77
- // first word is the property it applies to rather than "rule".
78
- export function nearestEnclosingLine(
79
- lines: string[],
80
- fences: boolean[],
81
- lineIndex: number,
82
- indent: number,
83
- ): string | undefined {
84
- for (let index = lineIndex - 1; index >= 0 && indent > 0; index--) {
85
- if (fences[index]) continue;
86
- const line = withoutComment(lines[index]);
87
- if (line.trim().length === 0) continue;
88
- if (indentOf(line) < indent) {
89
- return line.trim();
90
- }
91
- }
92
- return undefined;
93
- }
@@ -1,18 +0,0 @@
1
- // Copyright (c) Cratis. All rights reserved.
2
- // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
-
4
- import { withoutComment } from './document-context';
5
-
6
- // Match SourceLineSplitter: comments begin outside strings/templates; fenced bodies remain opaque.
7
- export function eventAnalysisSource(lines: string[]): string[] {
8
- let fenced = false;
9
- return lines.map(line => {
10
- if (fenced) {
11
- if (line.trim() === '```') fenced = false;
12
- return line;
13
- }
14
- const text = withoutComment(line);
15
- if (/^\s*```(?:[a-z]+)?\s*$/.test(text)) fenced = true;
16
- return text.trimEnd();
17
- });
18
- }