@cratis/screenplay-language 4.50.0 → 4.51.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/DestinationHint.ts +8 -0
- package/ProductionSymbol.ts +11 -0
- package/completion-items.ts +14 -0
- package/completion-planner.ts +6 -0
- package/completions.ts +4 -2
- package/diagnostic-codes.ts +9 -0
- package/dist/DestinationHint.d.ts +6 -0
- package/dist/DestinationHint.d.ts.map +1 -0
- package/dist/DestinationHint.js +4 -0
- package/dist/DestinationHint.js.map +1 -0
- package/dist/ProductionSymbol.d.ts +13 -0
- package/dist/ProductionSymbol.d.ts.map +1 -0
- package/dist/ProductionSymbol.js +4 -0
- package/dist/ProductionSymbol.js.map +1 -0
- package/dist/completion-items.d.ts +2 -0
- package/dist/completion-items.d.ts.map +1 -1
- package/dist/completion-items.js +12 -0
- package/dist/completion-items.js.map +1 -1
- package/dist/completion-planner.d.ts.map +1 -1
- package/dist/completion-planner.js +7 -0
- package/dist/completion-planner.js.map +1 -1
- package/dist/completions.d.ts.map +1 -1
- package/dist/completions.js +4 -1
- package/dist/completions.js.map +1 -1
- package/dist/diagnostic-codes.d.ts +9 -0
- package/dist/diagnostic-codes.d.ts.map +1 -1
- package/dist/diagnostic-codes.js +9 -0
- package/dist/diagnostic-codes.js.map +1 -1
- package/dist/event-analysis-source.d.ts +2 -0
- package/dist/event-analysis-source.d.ts.map +1 -0
- package/dist/event-analysis-source.js +19 -0
- package/dist/event-analysis-source.js.map +1 -0
- package/dist/hover-content.d.ts.map +1 -1
- package/dist/hover-content.js +9 -1
- package/dist/hover-content.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/inlay-hints.d.ts +3 -0
- package/dist/inlay-hints.d.ts.map +1 -0
- package/dist/inlay-hints.js +15 -0
- package/dist/inlay-hints.js.map +1 -0
- package/dist/inline-event-validation.d.ts +4 -0
- package/dist/inline-event-validation.d.ts.map +1 -0
- package/dist/inline-event-validation.js +131 -0
- package/dist/inline-event-validation.js.map +1 -0
- package/dist/keyword-docs.d.ts.map +1 -1
- package/dist/keyword-docs.js +5 -3
- package/dist/keyword-docs.js.map +1 -1
- package/dist/production-destinations.d.ts +8 -0
- package/dist/production-destinations.d.ts.map +1 -0
- package/dist/production-destinations.js +32 -0
- package/dist/production-destinations.js.map +1 -0
- package/dist/symbols.d.ts +5 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +68 -20
- package/dist/symbols.js.map +1 -1
- package/dist/tokens.d.ts.map +1 -1
- package/dist/tokens.js +13 -4
- package/dist/tokens.js.map +1 -1
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +11 -32
- package/dist/validation.js.map +1 -1
- package/event-analysis-source.ts +18 -0
- package/for_inlineEvents/when_analyzing_many_inline_events.ts +59 -0
- package/for_inlineEvents/when_authoring_inline_events.ts +149 -0
- package/for_inlineEvents/when_completing_many_events.ts +49 -0
- package/for_inlineEvents/when_indexing_command_production_ownership.ts +79 -0
- package/for_tokens/when_highlighting_event_metadata.ts +63 -0
- package/for_validateLines/when_validating_a_document/with_a_problem_of_every_coded_kind.ts +14 -0
- package/hover-content.ts +9 -1
- package/index.ts +5 -0
- package/inlay-hints.ts +17 -0
- package/inline-event-validation.ts +115 -0
- package/keyword-docs.ts +5 -3
- package/package.json +1 -1
- package/production-destinations.ts +32 -0
- package/symbols.ts +70 -19
- package/tokens.ts +14 -4
- package/validation.ts +13 -28
package/dist/validation.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
// Copyright (c) Cratis. All rights reserved.
|
|
2
2
|
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
import { validateInlineEvents } from './inline-event-validation';
|
|
3
4
|
import { causedByProperties, contextRoots, identityProperties, primitiveTypes, sliceTypes } from './language';
|
|
4
5
|
import { diagnosticCodes } from './diagnostic-codes';
|
|
5
|
-
import { enclosingChain, fenceMap, indentOf
|
|
6
|
+
import { enclosingChain, fenceMap, indentOf } from './document-context';
|
|
7
|
+
import { eventAnalysisSource } from './event-analysis-source';
|
|
6
8
|
import { resolveEventContextPath } from './event-context';
|
|
7
9
|
import { knownEventNames, knownTypeNames, mergeSymbols, scanDocument, } from './symbols';
|
|
8
10
|
import { fileImportOn, isFileImportLine } from './file-imports';
|
|
@@ -61,7 +63,7 @@ export function validateLines(lines, context = {}) {
|
|
|
61
63
|
const events = new Set([...knownEventNames(symbols), ...knownEventNames(application)]);
|
|
62
64
|
const policies = new Set([...symbols.policies, ...application.policies].map((policy) => policy.name));
|
|
63
65
|
const issues = validateDeclarations(lines, symbols, application);
|
|
64
|
-
issues.push(...validateProductionDestinations(lines,
|
|
66
|
+
issues.push(...validateProductionDestinations(lines, symbols));
|
|
65
67
|
const checkEvent = (line, text, name) => {
|
|
66
68
|
if (!events.has(name)) {
|
|
67
69
|
issues.push(tokenIssue('warning', line, text, name, `Unknown event type '${name}' — declare it in a slice or import it.`, diagnosticCodes.unknownEvent));
|
|
@@ -154,6 +156,7 @@ export function validateLines(lines, context = {}) {
|
|
|
154
156
|
}
|
|
155
157
|
}
|
|
156
158
|
issues.push(...validateEventContextPaths(lines, fences));
|
|
159
|
+
issues.push(...validateInlineEvents(lines, symbols, application));
|
|
157
160
|
const fenceLines = lines
|
|
158
161
|
.map((line, index) => ({ line, index }))
|
|
159
162
|
.filter(({ line }) => /^\s*```(?:[a-z]+)?\s*$/.test(line));
|
|
@@ -164,42 +167,18 @@ export function validateLines(lines, context = {}) {
|
|
|
164
167
|
return issues;
|
|
165
168
|
}
|
|
166
169
|
// This is advice, not a semantic default: accepting the typed workspace repair changes routing.
|
|
167
|
-
function validateProductionDestinations(lines,
|
|
170
|
+
function validateProductionDestinations(lines, symbols) {
|
|
168
171
|
const issues = [];
|
|
169
|
-
lines = lines
|
|
172
|
+
lines = eventAnalysisSource(lines);
|
|
170
173
|
for (const command of symbols.commands) {
|
|
171
174
|
const identifiers = command.properties.filter(property => property.isIdentifier && !property.type.endsWith('?') && !property.type.endsWith('[]'));
|
|
172
175
|
if (identifiers.length !== 1)
|
|
173
176
|
continue;
|
|
174
|
-
const
|
|
175
|
-
|
|
176
|
-
for (let line = command.line + 1; line < lines.length; line++) {
|
|
177
|
-
const text = lines[line].trim();
|
|
178
|
-
if (fences[line] || text.length === 0)
|
|
177
|
+
for (const production of command.produces ?? []) {
|
|
178
|
+
if (production.inline || production.conditional || production.target !== undefined)
|
|
179
179
|
continue;
|
|
180
|
-
const
|
|
181
|
-
|
|
182
|
-
break;
|
|
183
|
-
while (ancestors[ancestors.length - 1] >= indent)
|
|
184
|
-
ancestors.pop();
|
|
185
|
-
const direct = ancestors.length === 1;
|
|
186
|
-
ancestors.push(indent);
|
|
187
|
-
const produces = text.match(/^produces\s+([A-Z]\w*)$/);
|
|
188
|
-
if (!produces || !direct)
|
|
189
|
-
continue;
|
|
190
|
-
let explicit = false;
|
|
191
|
-
for (let child = line + 1; child < lines.length; child++) {
|
|
192
|
-
const body = lines[child].trim();
|
|
193
|
-
if (fences[child] || body.length === 0)
|
|
194
|
-
continue;
|
|
195
|
-
if (indentOf(lines[child]) <= indent)
|
|
196
|
-
break;
|
|
197
|
-
if (/^for\s+/.test(body))
|
|
198
|
-
explicit = true;
|
|
199
|
-
}
|
|
200
|
-
if (!explicit) {
|
|
201
|
-
issues.push(issue('information', line, indent + 1, text.length, `Plain 'produces ${produces[1]}' omits its destination — use 'for ${identifiers[0].name}' to explicitly select the command's identifier.`, diagnosticCodes.omittedProductionDestination));
|
|
202
|
-
}
|
|
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));
|
|
203
182
|
}
|
|
204
183
|
}
|
|
205
184
|
return issues;
|
package/dist/validation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../validation.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
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 { describe, expect, it, vi } from 'vitest';
|
|
5
|
+
import * as context from '../document-context';
|
|
6
|
+
import { destinationHints } from '../production-destinations';
|
|
7
|
+
import { scanDocument } from '../symbols';
|
|
8
|
+
import { validateLines } from '../validation';
|
|
9
|
+
|
|
10
|
+
function document(count: number, malformedDocumentation = false): string[] {
|
|
11
|
+
return ['module Projects', ' feature Naming', ...Array.from({ length: count }, (_, index) => [
|
|
12
|
+
` slice StateChange Rename${index}`,
|
|
13
|
+
` command Rename${index}`,
|
|
14
|
+
' projectId Uuid identifier',
|
|
15
|
+
' name String',
|
|
16
|
+
` produces event Renamed${index}`,
|
|
17
|
+
' name String = name',
|
|
18
|
+
malformedDocumentation ? ' documentation "details"' : ' // mapping complete',
|
|
19
|
+
]).flat()];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Count actual work, not elapsed time: indentation visits catch ancestry walks,
|
|
23
|
+
// replacements catch whole-document normalization per event, and filter input
|
|
24
|
+
// sizes catch rebuilding/scanning the event catalog for every declaration.
|
|
25
|
+
function work(action: () => void): number {
|
|
26
|
+
const indentation = vi.spyOn(context, 'indentOf');
|
|
27
|
+
const replacements = vi.spyOn(String.prototype, 'replace');
|
|
28
|
+
const trims = vi.spyOn(String.prototype, 'trim');
|
|
29
|
+
const filters = vi.spyOn(Array.prototype, 'filter');
|
|
30
|
+
try {
|
|
31
|
+
action();
|
|
32
|
+
return indentation.mock.calls.length + replacements.mock.calls.length + trims.mock.calls.length +
|
|
33
|
+
filters.mock.contexts.reduce<number>((sum, receiver) => sum + (receiver as unknown[]).length, 0);
|
|
34
|
+
} finally {
|
|
35
|
+
indentation.mockRestore();
|
|
36
|
+
replacements.mockRestore();
|
|
37
|
+
trims.mockRestore();
|
|
38
|
+
filters.mockRestore();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
describe('when analyzing many inline events', () => {
|
|
43
|
+
it.each(['validation', 'destination hints', 'malformed documentation'])('should keep %s work linear', path => {
|
|
44
|
+
const measure = (count: number) => {
|
|
45
|
+
const lines = document(count, path === 'malformed documentation');
|
|
46
|
+
const application = scanDocument(Array.from({ length: count }, (_, index) => `import Other.Imported${index}`));
|
|
47
|
+
let results = 0;
|
|
48
|
+
const units = work(() => {
|
|
49
|
+
results = path === 'destination hints' ? destinationHints(lines).length : validateLines(lines, { application }).length;
|
|
50
|
+
});
|
|
51
|
+
expect(results).toBe(path === 'validation' ? 0 : count);
|
|
52
|
+
return units;
|
|
53
|
+
};
|
|
54
|
+
const small = measure(100);
|
|
55
|
+
const large = measure(200);
|
|
56
|
+
expect(small).toBeGreaterThan(0);
|
|
57
|
+
expect(large).toBeLessThan(small * 2.2);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
@@ -0,0 +1,149 @@
|
|
|
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 { describe, it, expect } from 'vitest';
|
|
5
|
+
import { planCompletions } from '../completion-planner';
|
|
6
|
+
import { hoverContent } from '../hover-content';
|
|
7
|
+
import { destinationHints } from '../production-destinations';
|
|
8
|
+
import { scanDocument } from '../symbols';
|
|
9
|
+
import { validateLines } from '../validation';
|
|
10
|
+
|
|
11
|
+
const source = [
|
|
12
|
+
'command Rename', ' projectId Uuid identifier', ' name String', ' produces event Renamed',
|
|
13
|
+
' description "A new name"', ' documentation', ' ```markdown', ' event NotADeclaration', ' ```',
|
|
14
|
+
' @tag String = name', ' name String = name',
|
|
15
|
+
];
|
|
16
|
+
|
|
17
|
+
describe('when authoring inline events', () => {
|
|
18
|
+
it('should index the event and its typed properties, not its prose', () => {
|
|
19
|
+
const symbols = scanDocument(source);
|
|
20
|
+
expect(symbols.events.map(event => event.name)).toEqual(['Renamed']);
|
|
21
|
+
expect(symbols.events[0].properties.map(property => property.name)).toEqual(['tag', 'name']);
|
|
22
|
+
expect(symbols.commands[0].properties.map(property => property.name)).toEqual(['projectId', 'name']);
|
|
23
|
+
});
|
|
24
|
+
it('should validate its metadata without false positives', () => expect(validateLines(source)).toEqual([]));
|
|
25
|
+
it.each([
|
|
26
|
+
[' documentation "details"'],
|
|
27
|
+
[' documentation'],
|
|
28
|
+
[' documentation', ' ```text', ' Details', ' ```'],
|
|
29
|
+
[' documentation', ' ```markdown', ' Details', ' ```'],
|
|
30
|
+
[' documentation', ' ```markdown', ' ', ' ```'],
|
|
31
|
+
[' documentation', ' ```markdown', ' Details'],
|
|
32
|
+
])('should reject malformed documentation without searching later declarations for its fence', (...body) => {
|
|
33
|
+
const lines = ['command Rename', ' produces event Renamed', ...body];
|
|
34
|
+
expect(validateLines(lines).filter(issue => issue.code === 'PLAY0477').map(issue => issue.line)).toEqual([2]);
|
|
35
|
+
});
|
|
36
|
+
it('should distinguish adjacent complete documentation blocks from malformed directives', () => {
|
|
37
|
+
const lines = ['event First', ' documentation "details"', 'event Second', ' documentation',
|
|
38
|
+
' ```markdown', ' Details', ' ```', 'event Third', ' documentation',
|
|
39
|
+
' ```markdown', ' ', ' ```', 'event Fourth', ' documentation', '',
|
|
40
|
+
' ```markdown', ' More details', ' ```'];
|
|
41
|
+
expect(validateLines(lines).filter(issue => issue.code === 'PLAY0477').map(issue => issue.line)).toEqual([1, 8]);
|
|
42
|
+
});
|
|
43
|
+
it('should offer event metadata and typed mappings inside the body', () => {
|
|
44
|
+
const plan = planCompletions([...source, ' '], source.length, ' ');
|
|
45
|
+
expect(plan.kind).toBe('entries');
|
|
46
|
+
if (plan.kind === 'entries') expect(plan.entries.map(entry => entry.label)).toEqual(expect.arrayContaining(['description', 'documentation', 'id', 'tag', 'for', 'property mapping']));
|
|
47
|
+
});
|
|
48
|
+
it('should show the implicit command identifier', () => expect(destinationHints(source).map(hint => hint.label)).toEqual(['for projectId']));
|
|
49
|
+
it('should suppress hints for uncertain mixed destinations', () => expect(destinationHints([...source, ' produces Another', ' for otherId'])).toEqual([]));
|
|
50
|
+
it('should suppress hints for incomplete and repeated explicit destinations', () => {
|
|
51
|
+
expect(destinationHints([...source, ' for'])).toEqual([]);
|
|
52
|
+
expect(destinationHints([...source, ' for projectId', ' for projectId'])).toEqual([]);
|
|
53
|
+
});
|
|
54
|
+
it('should not hint a header that has no event name', () => expect(destinationHints(['command Rename', ' produces'])).toEqual([]));
|
|
55
|
+
it('should explain the new declaration form', () => expect(hoverContent(source, 3, 'produces', 3, 11)).toContain('produces event'));
|
|
56
|
+
it('should preserve information severity for redundant pins', () => expect(validateLines([...source, ' id "Renamed"']).find(issue => issue.code === 'PLAY0471')?.severity).toBe('information'));
|
|
57
|
+
it.each(['namespace', 'sequence', 'correlation', 'causation', 'causedBy', 'occurred'])('should reject %s as system metadata', keyword => {
|
|
58
|
+
expect(validateLines([...source, ` ${keyword} = name`]).map(issue => issue.code)).toContain('PLAY0476');
|
|
59
|
+
});
|
|
60
|
+
it('should warn about identifier duplication', () => expect(validateLines([...source, ' projectId Uuid = projectId']).find(issue => issue.code === 'PLAY0469')?.severity).toBe('warning'));
|
|
61
|
+
it('should reject an inline event in a reaction', () => expect(validateLines(['reaction React', ' every 1 day', ' produces event Done']).map(issue => issue.code)).toContain('PLAY0474'));
|
|
62
|
+
it('should require explicit destinations for mixed inline and plain omissions', () => {
|
|
63
|
+
const lines = [...source, ' produces Legacy // retained allocation'];
|
|
64
|
+
expect(validateLines(lines).filter(issue => issue.code === 'PLAY0470').map(issue => issue.message)).toContain("Production 'Legacy' must state for explicitly when destinations differ.");
|
|
65
|
+
expect(destinationHints(lines)).toEqual([]);
|
|
66
|
+
});
|
|
67
|
+
it('should suppress legacy allocation hints when a sibling can promote a destination', () => {
|
|
68
|
+
expect(destinationHints(['command Rename', ' projectId Uuid identifier', ' produces First', ' for projectId', ' produces Legacy'])).toEqual([]);
|
|
69
|
+
});
|
|
70
|
+
it.each([
|
|
71
|
+
[' produces First', ' name = name', ' for projectId', ' produces Legacy'],
|
|
72
|
+
[' produces First', ' name = name', ' for projectId', ' produces Legacy'],
|
|
73
|
+
[' produces First', ' name = name', ' for projectId', ' produces Legacy'],
|
|
74
|
+
[' produces when name != ""', ' First', ' name = name', ' for projectId', ' produces Legacy'],
|
|
75
|
+
])('should not hint allocation when a differently indented destination is promoted', (...productions) => {
|
|
76
|
+
const lines = ['command Rename', ' projectId Uuid identifier', ' name String', ...productions];
|
|
77
|
+
expect(scanDocument(lines).commands[0].produces?.[0].target).toBe('projectId');
|
|
78
|
+
expect(destinationHints(lines)).toEqual([]);
|
|
79
|
+
});
|
|
80
|
+
it('should see deeper destinations after fenced event documentation', () => {
|
|
81
|
+
const lines = ['command Rename', ' projectId Uuid identifier', ' produces event Renamed',
|
|
82
|
+
' documentation', ' ```markdown', ' Details', ' ```', ' for otherId', ' produces Legacy'];
|
|
83
|
+
expect(scanDocument(lines).commands[0].produces?.[0].target).toBe('otherId');
|
|
84
|
+
expect(destinationHints(lines)).toEqual([]);
|
|
85
|
+
});
|
|
86
|
+
it('should suppress hints when a sibling production cannot be classified', () => {
|
|
87
|
+
expect(destinationHints(['command Rename', ' projectId Uuid identifier', ' produces First', ' produces event'])).toEqual([]);
|
|
88
|
+
expect(destinationHints(['command Rename', ' projectId Uuid identifier', ' produces event'])).toEqual([]);
|
|
89
|
+
expect(destinationHints(['command Rename', ' produces First', ' produces when'])).toEqual([]);
|
|
90
|
+
});
|
|
91
|
+
it('should place a destination hint before a trailing comment', () => {
|
|
92
|
+
const lines = ['command Rename', ' projectId Uuid identifier', ' produces event Renamed // note'];
|
|
93
|
+
expect(destinationHints(lines)).toEqual([{ line: 2, column: ' produces event Renamed'.length + 1, label: 'for projectId' }]);
|
|
94
|
+
});
|
|
95
|
+
it('should report duplicate typed properties at the repeated mapping', () => {
|
|
96
|
+
const lines = [...source, ' name Uuid = otherId // duplicate'];
|
|
97
|
+
expect(validateLines(lines).filter(issue => issue.code === 'PLAY0168').map(issue => ({ line: issue.line, severity: issue.severity })))
|
|
98
|
+
.toEqual([{ line: source.length, severity: 'error' }]);
|
|
99
|
+
});
|
|
100
|
+
it('should treat escaped and unescaped inline property names as the same name', () => {
|
|
101
|
+
expect(validateLines([...source, ' @name String = name']).filter(issue => issue.code === 'PLAY0168').map(issue => issue.line)).toEqual([source.length]);
|
|
102
|
+
});
|
|
103
|
+
it('should detect collisions with commented imports in the document', () => {
|
|
104
|
+
expect(validateLines(['import Other.Renamed // note', ...source]).filter(issue => issue.code === 'PLAY0473').map(issue => issue.line)).toEqual([4]);
|
|
105
|
+
});
|
|
106
|
+
it('should detect collisions with commented imports from other files', () => {
|
|
107
|
+
const application = scanDocument(['import Other.Renamed // note']);
|
|
108
|
+
expect(validateLines(source, { application }).filter(issue => issue.code === 'PLAY0473').map(issue => issue.line)).toEqual([3]);
|
|
109
|
+
});
|
|
110
|
+
it('should not scan imports inside event documentation', () => {
|
|
111
|
+
const lines = source.map(line => line === ' event NotADeclaration' ? ' import Other.Renamed // prose' : line);
|
|
112
|
+
expect(scanDocument(lines).imports).toEqual([]);
|
|
113
|
+
expect(validateLines(lines)).toEqual([]);
|
|
114
|
+
});
|
|
115
|
+
it('should hint allocation when all plain productions omit destinations', () => {
|
|
116
|
+
expect(destinationHints(['command Rename', ' produces First', ' produces Legacy']).map(hint => hint.label)).toEqual(['for <new event source>', 'for <new event source>']);
|
|
117
|
+
});
|
|
118
|
+
it('should analyze commented headers, destinations, mappings and metadata like the compiler', () => {
|
|
119
|
+
const lines = source.map(line => line === ' documentation' ? `${line} // details` : line);
|
|
120
|
+
lines.push(' projectId Uuid = projectId // note', ' produces Other // sibling', ' for projectId // same identifier');
|
|
121
|
+
expect(validateLines(lines).filter(issue => ['PLAY0470', 'PLAY0477'].includes(issue.code ?? ''))).toEqual([]);
|
|
122
|
+
expect(validateLines(lines).find(issue => issue.code === 'PLAY0469')?.severity).toBe('warning');
|
|
123
|
+
expect(destinationHints(lines).map(hint => hint.label)).toEqual(['for projectId']);
|
|
124
|
+
});
|
|
125
|
+
it('should suppress hints when a commented sibling targets another source', () => {
|
|
126
|
+
const lines = [...source, ' produces Other // sibling', ' for otherId // other source'];
|
|
127
|
+
expect(validateLines(lines).some(issue => issue.code === 'PLAY0470')).toBe(true);
|
|
128
|
+
expect(destinationHints(lines)).toEqual([]);
|
|
129
|
+
});
|
|
130
|
+
it('should preserve comment markers inside strings and templates and ignore fences', () => {
|
|
131
|
+
const lines = [...source, ' url String = "https://example.org" // url', ' template String = `https://{name}` // template'];
|
|
132
|
+
expect(scanDocument(lines).commands[0].produces?.[0].mappings.map(mapping => mapping.source)).toContain('"https://example.org"');
|
|
133
|
+
expect(scanDocument(lines).commands[0].produces?.[0].mappings.map(mapping => mapping.source)).toContain('`https://{name}`');
|
|
134
|
+
expect(destinationHints(lines).map(hint => hint.label)).toEqual(['for projectId']);
|
|
135
|
+
const fenced = ['command Rename', ' documentation', ' ```markdown', ' produces event Fake', ' for otherId', ' ```'];
|
|
136
|
+
expect(destinationHints(fenced)).toEqual([]);
|
|
137
|
+
expect(validateLines(fenced).filter(issue => issue.code?.startsWith('PLAY047'))).toEqual([]);
|
|
138
|
+
});
|
|
139
|
+
it('should show metadata hover only on event directives', () => {
|
|
140
|
+
expect(hoverContent(['event Done', ' id "Old"'], 1, 'id', 3, 5)).toContain('rename');
|
|
141
|
+
expect(hoverContent(['event Done', ' documentation'], 1, 'documentation', 3, 16)).not.toBeNull();
|
|
142
|
+
for (const line of [' id String', ' key id', ' name String = id', ' id String = name']) {
|
|
143
|
+
const start = line.indexOf('id') + 1;
|
|
144
|
+
expect(hoverContent(['event Done', line], 1, 'id', start, start + 2)).toBeNull();
|
|
145
|
+
}
|
|
146
|
+
expect(hoverContent(['command Done', ' documentation'], 1, 'documentation', 3, 16)).toBeNull();
|
|
147
|
+
});
|
|
148
|
+
it('should retain standalone property-shaped id and documentation names', () => expect(scanDocument(['event Done', ' id String', ' documentation String']).events[0].properties.map(property => property.name)).toEqual(['id', 'documentation']));
|
|
149
|
+
});
|
|
@@ -0,0 +1,49 @@
|
|
|
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 { describe, expect, it, vi } from 'vitest';
|
|
5
|
+
import type { editor, languages, Position } from 'monaco-editor';
|
|
6
|
+
import { createCompletionProvider } from '../completions';
|
|
7
|
+
import { Monaco } from '../language';
|
|
8
|
+
|
|
9
|
+
const monaco = {
|
|
10
|
+
Range: class {},
|
|
11
|
+
languages: { CompletionItemKind: { Event: 1 }, CompletionItemInsertTextRule: { InsertAsSnippet: 1 } },
|
|
12
|
+
} as unknown as Monaco;
|
|
13
|
+
|
|
14
|
+
function complete(count: number, inline: boolean): { work: number; suggestions: languages.CompletionItem[] } {
|
|
15
|
+
const lines = [...Array.from({ length: count }, (_, index) => inline ? `command Record${index}\n produces event Recorded${index}` : `event Recorded${index}`).join('\n').split('\n'),
|
|
16
|
+
'constraint Unique', ' on '];
|
|
17
|
+
const model = {
|
|
18
|
+
getLinesContent: () => lines,
|
|
19
|
+
getWordUntilPosition: () => ({ word: '', startColumn: 6, endColumn: 6 }),
|
|
20
|
+
} as unknown as editor.ITextModel;
|
|
21
|
+
const searches = vi.spyOn(Array.prototype, 'some');
|
|
22
|
+
const filters = vi.spyOn(Array.prototype, 'filter');
|
|
23
|
+
const membership = vi.spyOn(Set.prototype, 'has');
|
|
24
|
+
try {
|
|
25
|
+
const result = createCompletionProvider(monaco).provideCompletionItems(model, { lineNumber: lines.length, column: 6 } as Position, {} as languages.CompletionContext, {} as never) as languages.CompletionList;
|
|
26
|
+
return {
|
|
27
|
+
suggestions: result.suggestions,
|
|
28
|
+
work: [...searches.mock.contexts, ...filters.mock.contexts].reduce<number>((sum, receiver) => sum + (receiver as unknown[]).length, 0) + membership.mock.calls.length,
|
|
29
|
+
};
|
|
30
|
+
} finally {
|
|
31
|
+
searches.mockRestore();
|
|
32
|
+
filters.mockRestore();
|
|
33
|
+
membership.mockRestore();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
describe('when completing many event names in Monaco', () => {
|
|
38
|
+
it.each([false, true])('should keep completion work linear for inline declarations: %s', inline => {
|
|
39
|
+
const small = complete(500, inline);
|
|
40
|
+
const medium = complete(1000, inline);
|
|
41
|
+
const large = complete(2000, inline);
|
|
42
|
+
expect(small.work).toBeGreaterThan(0);
|
|
43
|
+
expect(medium.work).toBeLessThan(small.work * 2.2);
|
|
44
|
+
expect(large.work).toBeLessThan(medium.work * 2.2);
|
|
45
|
+
expect(large.suggestions).toHaveLength(2000);
|
|
46
|
+
expect(large.suggestions.map(item => item.label)).toEqual(Array.from({ length: 2000 }, (_, index) => `Recorded${index}`));
|
|
47
|
+
expect(large.suggestions.every(item => item.detail === (inline ? 'inline event' : 'event'))).toBe(true);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
@@ -0,0 +1,79 @@
|
|
|
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 { describe, expect, it } from 'vitest';
|
|
5
|
+
import { destinationHints } from '../production-destinations';
|
|
6
|
+
import { scanDocument } from '../symbols';
|
|
7
|
+
import { validateLines } from '../validation';
|
|
8
|
+
|
|
9
|
+
describe('when indexing command production ownership', () => {
|
|
10
|
+
it('should keep the documented multiline authorization out of command properties', () => {
|
|
11
|
+
const lines = ['policy IsAccountant', ' require role "Accountant"', 'policy IsCustomerSelf', ' require authenticated',
|
|
12
|
+
'command Rename', ' projectId Uuid identifier',
|
|
13
|
+
' authorize IsAccountant', ' or IsCustomerSelf', ' produces event Renamed'];
|
|
14
|
+
const command = scanDocument(lines).commands[0];
|
|
15
|
+
expect(command.properties.map(property => property.name)).toEqual(['projectId']);
|
|
16
|
+
expect(command.produces?.map(production => production.name)).toEqual(['Renamed']);
|
|
17
|
+
expect(validateLines(lines)).toEqual([]);
|
|
18
|
+
expect(destinationHints(lines).map(hint => hint.label)).toEqual(['for projectId']);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it.each(['or IsCustomerSelf', 'and IsCustomerSelf', 'IsCustomerSelf', '(IsCustomerSelf)', 'or IsCüstomerSelf', 'produces Ghost'])('should consume %s as an authorization continuation', continuation => {
|
|
22
|
+
const lines = ['command Rename', ' authorize IsAccountant', ` ${continuation}`, ' produces Legacy'];
|
|
23
|
+
const command = scanDocument(lines).commands[0];
|
|
24
|
+
expect(command.properties).toEqual([]);
|
|
25
|
+
expect(command.productionHeaders).toEqual([3]);
|
|
26
|
+
expect(destinationHints(lines).map(hint => hint.line)).toEqual([3]);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('should end authorization ownership at the first nonmatching line, not merely a dedent', () => {
|
|
30
|
+
const lines = ['command Rename', ' projectId Uuid identifier', ' authorize IsAccountant',
|
|
31
|
+
' or IsCustomerSelf // continuation', ' names String[]', ' produces event Renamed'];
|
|
32
|
+
const command = scanDocument(lines).commands[0];
|
|
33
|
+
expect(command.properties.map(property => property.name)).toEqual(['projectId', 'names']);
|
|
34
|
+
expect(command.productionHeaders).toEqual([5]);
|
|
35
|
+
expect(destinationHints(lines).map(hint => hint.label)).toEqual(['for projectId']);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it.each([
|
|
39
|
+
[[' description "Rename the project"']],
|
|
40
|
+
[[' description', ' ```text', ' produces Ghost', ' ```']],
|
|
41
|
+
])('should leave deeper syntax after a description in its command', description => {
|
|
42
|
+
const lines = ['command Rename', ' projectId Uuid identifier', ...description, ' produces event Renamed'];
|
|
43
|
+
const command = scanDocument(lines).commands[0];
|
|
44
|
+
expect(command.properties.map(property => property.name)).toEqual(['projectId']);
|
|
45
|
+
expect(command.produces?.map(production => production.name)).toEqual(['Renamed']);
|
|
46
|
+
expect(destinationHints(lines).map(hint => hint.label)).toEqual(['for projectId']);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it.each(['validate', 'handler', 'concurrency', 'name'])('should keep a deeper production after the %s property in its command', name => {
|
|
50
|
+
const lines = ['command Rename', ' projectId Uuid identifier', ` ${name} String`,
|
|
51
|
+
' produces event Renamed', ' value String = "renamed"'];
|
|
52
|
+
expect(scanDocument(lines).commands[0].produces?.map(production => production.name)).toEqual(['Renamed']);
|
|
53
|
+
expect(validateLines(lines)).toEqual([]);
|
|
54
|
+
expect(destinationHints(lines).map(hint => hint.label)).toEqual(['for projectId']);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it.each(['validate', 'handler', 'concurrency'])('should not hint allocation after a deeper destination beneath the %s property', name => {
|
|
58
|
+
const lines = ['command Rename', ' projectId Uuid identifier', ` ${name} String // a property, not a block`,
|
|
59
|
+
' produces First', ' for projectId', ' produces Legacy'];
|
|
60
|
+
expect(scanDocument(lines).commands[0].produces?.map(production => [production.name, production.target]))
|
|
61
|
+
.toEqual([['First', 'projectId'], ['Legacy', undefined]]);
|
|
62
|
+
expect(destinationHints(lines)).toEqual([]);
|
|
63
|
+
expect(validateLines(lines).filter(issue => issue.code === 'PLAY0478').map(issue => issue.line)).toEqual([5]);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it.each(['validate', 'handler', 'concurrency'])('should suppress hints for an unclassifiable production beneath the %s property', name => {
|
|
67
|
+
expect(destinationHints(['command Rename', ' projectId Uuid identifier', ` ${name} String`,
|
|
68
|
+
' produces event', ' produces Legacy'])).toEqual([]);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it.each(['validate', 'validate csharp', 'handler', 'concurrency'])('should keep the %s block opaque to command ownership', directive => {
|
|
72
|
+
const lines = ['command Rename', ` ${directive}`, ' ghost Uuid identifier', ' produces First', ' for ghost', ' produces Legacy'];
|
|
73
|
+
const command = scanDocument(lines).commands[0];
|
|
74
|
+
expect(command.properties).toEqual([]);
|
|
75
|
+
expect(command.produces?.map(production => production.name)).toEqual(['Legacy']);
|
|
76
|
+
expect(destinationHints(lines).map(hint => hint.line)).toEqual([5]);
|
|
77
|
+
expect(validateLines(lines).filter(issue => issue.code === 'PLAY0478')).toEqual([]);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
@@ -0,0 +1,63 @@
|
|
|
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 { describe, expect, it } from 'vitest';
|
|
5
|
+
import type { Token } from 'monaco-editor';
|
|
6
|
+
import { clauseKeywords } from '../language';
|
|
7
|
+
import { createTokensProvider } from '../tokens';
|
|
8
|
+
|
|
9
|
+
const provider = createTokensProvider([]);
|
|
10
|
+
const rules = provider.tokenizer.eventBody as unknown as [RegExp, unknown][];
|
|
11
|
+
|
|
12
|
+
describe('when highlighting event metadata', () => {
|
|
13
|
+
it.each(['id', 'documentation'])('should leave %s available as an ordinary name', word => {
|
|
14
|
+
expect(clauseKeywords).not.toContain(word);
|
|
15
|
+
});
|
|
16
|
+
it('should recognize only directive-shaped metadata inside the event state', () => {
|
|
17
|
+
expect(rules[1][0].test(' id "Old"')).toBe(true);
|
|
18
|
+
expect(rules[1][0].test(' id String')).toBe(false);
|
|
19
|
+
expect(rules[1][0].test(' name String = id')).toBe(false);
|
|
20
|
+
expect(rules[2][0].test(' documentation // details')).toBe(true);
|
|
21
|
+
expect(rules[2][0].test(' documentation String')).toBe(false);
|
|
22
|
+
});
|
|
23
|
+
it('should tokenize event directives without claiming property names or later blocks', async () => {
|
|
24
|
+
const compilerPath = 'monaco-editor/esm/vs/editor/standalone/common/monarch/monarchCompile.js';
|
|
25
|
+
const lexerPath = 'monaco-editor/esm/vs/editor/standalone/common/monarch/monarchLexer.js';
|
|
26
|
+
const { compile } = await import(compilerPath);
|
|
27
|
+
const { MonarchTokenizer } = await import(lexerPath);
|
|
28
|
+
const tokenizer = new MonarchTokenizer({}, {}, 'screenplay', compile('screenplay', provider), {
|
|
29
|
+
getValue: () => 20000,
|
|
30
|
+
onDidChangeConfiguration: () => ({ dispose() {} }),
|
|
31
|
+
});
|
|
32
|
+
let state = tokenizer.getInitialState();
|
|
33
|
+
const tokenize = (line: string): Token[] => {
|
|
34
|
+
const result = tokenizer.tokenize(line, true, state);
|
|
35
|
+
state = result.endState;
|
|
36
|
+
return result.tokens;
|
|
37
|
+
};
|
|
38
|
+
try {
|
|
39
|
+
for (const header of [' event Done', ' produces event Done']) {
|
|
40
|
+
tokenize(header);
|
|
41
|
+
expect(tokenize(' id "Old"').find(token => token.offset === 4)?.type).toBe('keyword.play');
|
|
42
|
+
expect(tokenize(' id String').find(token => token.offset === 4)?.type).toBe('identifier.play');
|
|
43
|
+
expect(tokenize(' documentation String').find(token => token.offset === 4)?.type).toBe('identifier.play');
|
|
44
|
+
const documentation = tokenize(' documentation // details');
|
|
45
|
+
expect(documentation.find(token => token.offset === 4)?.type).toBe('keyword.play');
|
|
46
|
+
expect(documentation.find(token => token.offset === 18)?.type).toBe('comment.play');
|
|
47
|
+
expect(tokenize(' ```markdown').find(token => token.type === 'string.quote.play')).toBeDefined();
|
|
48
|
+
expect(tokenize(' event Prose')[0].type).toBe('string.play');
|
|
49
|
+
tokenize(' ```');
|
|
50
|
+
tokenize(' command Other');
|
|
51
|
+
expect(tokenize(' id "NotMetadata"').find(token => token.offset === 4)?.type).toBe('identifier.play');
|
|
52
|
+
}
|
|
53
|
+
} finally {
|
|
54
|
+
tokenizer.dispose();
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
it('should leave the event state when a line is not nested under its header', () => {
|
|
58
|
+
const exit = new RegExp(rules[0][0].source.replace('$S2', ' '));
|
|
59
|
+
expect(exit.test(' command Other')).toBe(true);
|
|
60
|
+
expect(exit.test(' id "Old"')).toBe(false);
|
|
61
|
+
expect(exit.test('')).toBe(false);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
@@ -38,6 +38,20 @@ const document = [
|
|
|
38
38
|
' firstCause = $eventContext.causation.occurred',
|
|
39
39
|
' nothing = $eventContext.',
|
|
40
40
|
' count byUser.$causedBy.subject',
|
|
41
|
+
' command Rename',
|
|
42
|
+
' invoiceId InvoiceId identifier',
|
|
43
|
+
' otherId InvoiceId',
|
|
44
|
+
' produces event Renamed generation 2',
|
|
45
|
+
' invoiceId InvoiceId = invoiceId',
|
|
46
|
+
' id "Renamed"',
|
|
47
|
+
' id "Older"',
|
|
48
|
+
' documentation "not fenced"',
|
|
49
|
+
' produces Other',
|
|
50
|
+
' for otherId',
|
|
51
|
+
' event Renamed',
|
|
52
|
+
' reaction React',
|
|
53
|
+
' every 1 day',
|
|
54
|
+
' produces event Unsupported',
|
|
41
55
|
' query Overdue => OverdueReadModel[]',
|
|
42
56
|
' performer',
|
|
43
57
|
' csharp',
|
package/hover-content.ts
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
3
|
|
|
4
4
|
import { enclosingChain, fenceMap, indentOf } from './document-context';
|
|
5
|
-
import { scanDocument } from './symbols';
|
|
5
|
+
import { directBody, scanDocument } from './symbols';
|
|
6
|
+
import { eventAnalysisSource } from './event-analysis-source';
|
|
6
7
|
import { getSubLanguage } from './sub-language-registry';
|
|
7
8
|
import { attributeDocs, contextVariableDocs, keywordDocs, specificationKeywordDocs } from './keyword-docs';
|
|
8
9
|
|
|
@@ -102,6 +103,13 @@ export function hoverContent(
|
|
|
102
103
|
return `**${word}** — ${specificationKeywordDocs[word]}`;
|
|
103
104
|
}
|
|
104
105
|
|
|
106
|
+
if (word === 'id' || word === 'documentation') {
|
|
107
|
+
const source = eventAnalysisSource(lines);
|
|
108
|
+
const inEvent = symbols.events.some(event => directBody(source, fences, event.line, indentOf(source[event.line])).includes(lineIndex));
|
|
109
|
+
const directive = word === 'id' ? /^\s*id\s+"/.test(source[lineIndex]) : /^\s*documentation\s*$/.test(source[lineIndex]);
|
|
110
|
+
if (!inEvent || !directive || startColumn !== indentOf(line) + 1) return null;
|
|
111
|
+
}
|
|
112
|
+
|
|
105
113
|
const keywordDoc = keywordDocs[word];
|
|
106
114
|
if (keywordDoc) return `**${word}** — ${keywordDoc}`;
|
|
107
115
|
|