@tayo-dev/rtl 1.3.0 → 1.4.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/README.md +66 -33
- package/assets/claude/commands/@tayo-dev/rtl/generate.md +2 -2
- package/assets/claude/commands/@tayo-dev/rtl/help.md +1 -1
- package/assets/codex/@tayo-dev/rtl-conventions/SKILL.md +2 -2
- package/assets/codex/@tayo-dev/rtl-generate/SKILL.md +6 -5
- package/assets/codex/@tayo-dev/rtl-help/SKILL.md +1 -1
- package/assets/gemini/commands/@tayo-dev/rtl/generate.toml +2 -2
- package/assets/gemini/commands/@tayo-dev/rtl/help.toml +1 -1
- package/assets/opencode/commands/@tayo-dev/rtl-generate.md +2 -2
- package/assets/opencode/commands/@tayo-dev/rtl-help.md +1 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +485 -67
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/install.js +6 -6
- package/dist/core/baseline-normalizer.d.ts.map +1 -1
- package/dist/core/baseline-normalizer.js +42 -0
- package/dist/core/baseline-normalizer.js.map +1 -1
- package/dist/core/generator.d.ts +5 -1
- package/dist/core/generator.d.ts.map +1 -1
- package/dist/core/generator.js +235 -17
- package/dist/core/generator.js.map +1 -1
- package/dist/core/input-loader.d.ts.map +1 -1
- package/dist/core/input-loader.js +1 -0
- package/dist/core/input-loader.js.map +1 -1
- package/dist/core/js-parser.d.ts +2 -1
- package/dist/core/js-parser.d.ts.map +1 -1
- package/dist/core/js-parser.js +69 -0
- package/dist/core/js-parser.js.map +1 -1
- package/dist/core/orchestrator.d.ts +1 -1
- package/dist/core/orchestrator.js +4 -4
- package/dist/core/parser.js +2 -2
- package/dist/core/recording-intelligence.d.ts +1 -1
- package/dist/core/recording-intelligence.d.ts.map +1 -1
- package/dist/core/recording-intelligence.js +298 -4
- package/dist/core/recording-intelligence.js.map +1 -1
- package/dist/core/resolver.d.ts +28 -2
- package/dist/core/resolver.d.ts.map +1 -1
- package/dist/core/resolver.js +462 -23
- package/dist/core/resolver.js.map +1 -1
- package/dist/core/scanner.d.ts +11 -3
- package/dist/core/scanner.d.ts.map +1 -1
- package/dist/core/scanner.js +47 -9
- package/dist/core/scanner.js.map +1 -1
- package/dist/core/scorer.d.ts +6 -2
- package/dist/core/scorer.d.ts.map +1 -1
- package/dist/core/scorer.js +163 -9
- package/dist/core/scorer.js.map +1 -1
- package/dist/core/suite-planner.d.ts +4 -1
- package/dist/core/suite-planner.d.ts.map +1 -1
- package/dist/core/suite-planner.js +261 -11
- package/dist/core/suite-planner.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +4 -4
- package/dist/install/planner.js +1 -1
- package/dist/install/types.d.ts +1 -1
- package/dist/learner/index.d.ts +2 -2
- package/dist/learner/index.js +3 -3
- package/dist/learner/storage.d.ts +1 -1
- package/dist/learner/storage.js +2 -2
- package/dist/templates/test-template.d.ts +26 -2
- package/dist/templates/test-template.d.ts.map +1 -1
- package/dist/templates/test-template.js +46 -6
- package/dist/templates/test-template.js.map +1 -1
- package/dist/types/recording.d.ts +162 -0
- package/dist/types/recording.d.ts.map +1 -1
- package/dist/types/recording.js.map +1 -1
- package/dist/types/score.d.ts +37 -0
- package/dist/types/score.d.ts.map +1 -1
- package/package.json +5 -5
|
@@ -1,3 +1,42 @@
|
|
|
1
|
+
import { resolveSemanticMarkerAssertion } from './resolver.js';
|
|
2
|
+
function getStepKey(step, index) {
|
|
3
|
+
return step.id ?? `${index}:${step.action}:${step.target ?? ''}:${step.originalType}`;
|
|
4
|
+
}
|
|
5
|
+
function sharesAnyStep(left, right) {
|
|
6
|
+
const leftKeys = new Set(left.map((step, index) => getStepKey(step, index)));
|
|
7
|
+
return right.some((step, index) => leftKeys.has(getStepKey(step, index)));
|
|
8
|
+
}
|
|
9
|
+
function enrichSemanticMarkerContext(step, stepsById) {
|
|
10
|
+
const anchorStepId = step.semanticMarkerLink?.anchorStepId ??
|
|
11
|
+
step.unresolvedSemanticMarker?.anchor?.anchorStepId ??
|
|
12
|
+
step.semanticMarkerCandidate?.anchor?.anchorStepId;
|
|
13
|
+
if (!anchorStepId) {
|
|
14
|
+
return step;
|
|
15
|
+
}
|
|
16
|
+
const anchorStep = stepsById.get(anchorStepId);
|
|
17
|
+
if (!anchorStep) {
|
|
18
|
+
return step;
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
...step,
|
|
22
|
+
metadata: {
|
|
23
|
+
...step.metadata,
|
|
24
|
+
semanticMarkerAnchorStep: {
|
|
25
|
+
id: anchorStep.id,
|
|
26
|
+
action: anchorStep.action,
|
|
27
|
+
target: anchorStep.target,
|
|
28
|
+
originalType: anchorStep.originalType,
|
|
29
|
+
source: anchorStep.source,
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function enrichGroupSteps(groups, stepsById) {
|
|
35
|
+
return groups.map((group) => ({
|
|
36
|
+
...group,
|
|
37
|
+
steps: group.steps.map((step) => enrichSemanticMarkerContext(step, stepsById)),
|
|
38
|
+
}));
|
|
39
|
+
}
|
|
1
40
|
function buildFallbackGroups(analyzedRecording, fallbackTitle) {
|
|
2
41
|
if (analyzedRecording.intentGroups.length > 0) {
|
|
3
42
|
return analyzedRecording.intentGroups;
|
|
@@ -9,6 +48,145 @@ function buildFallbackGroups(analyzedRecording, fallbackTitle) {
|
|
|
9
48
|
},
|
|
10
49
|
];
|
|
11
50
|
}
|
|
51
|
+
function getSemanticMarkerCandidate(step) {
|
|
52
|
+
const metadataCandidate = step.metadata?.semanticMarkerCandidate;
|
|
53
|
+
if (metadataCandidate &&
|
|
54
|
+
typeof metadataCandidate === 'object' &&
|
|
55
|
+
'stepId' in metadataCandidate &&
|
|
56
|
+
typeof metadataCandidate.stepId === 'string') {
|
|
57
|
+
return metadataCandidate;
|
|
58
|
+
}
|
|
59
|
+
return step.semanticMarkerCandidate;
|
|
60
|
+
}
|
|
61
|
+
function getSemanticMarkerLink(step) {
|
|
62
|
+
const metadataLink = step.metadata?.semanticMarkerLink;
|
|
63
|
+
if (metadataLink &&
|
|
64
|
+
typeof metadataLink === 'object' &&
|
|
65
|
+
'markerStepId' in metadataLink &&
|
|
66
|
+
typeof metadataLink.markerStepId === 'string') {
|
|
67
|
+
return metadataLink;
|
|
68
|
+
}
|
|
69
|
+
return step.semanticMarkerLink;
|
|
70
|
+
}
|
|
71
|
+
function getUnresolvedSemanticMarker(step) {
|
|
72
|
+
const metadataMarker = step.metadata?.unresolvedSemanticMarker;
|
|
73
|
+
if (metadataMarker &&
|
|
74
|
+
typeof metadataMarker === 'object' &&
|
|
75
|
+
'stepId' in metadataMarker &&
|
|
76
|
+
typeof metadataMarker.stepId === 'string') {
|
|
77
|
+
return metadataMarker;
|
|
78
|
+
}
|
|
79
|
+
return step.unresolvedSemanticMarker;
|
|
80
|
+
}
|
|
81
|
+
function isManagedSemanticMarkerStep(step) {
|
|
82
|
+
return Boolean(getSemanticMarkerCandidate(step) ||
|
|
83
|
+
getSemanticMarkerLink(step) ||
|
|
84
|
+
getUnresolvedSemanticMarker(step));
|
|
85
|
+
}
|
|
86
|
+
function filterManagedSemanticMarkerSteps(steps) {
|
|
87
|
+
return steps.filter((step) => !isManagedSemanticMarkerStep(step));
|
|
88
|
+
}
|
|
89
|
+
function getHelperPlacement(params) {
|
|
90
|
+
const { anchorStepId, helperRefs, helperStepsByName } = params;
|
|
91
|
+
for (const helperRef of helperRefs) {
|
|
92
|
+
if (helperStepsByName.get(helperRef)?.has(anchorStepId)) {
|
|
93
|
+
return {
|
|
94
|
+
kind: 'after-helper',
|
|
95
|
+
helperName: helperRef,
|
|
96
|
+
stepId: anchorStepId,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
function collectScenarioMarkerState(params) {
|
|
103
|
+
const { group, helperRefs, helperStepsByName } = params;
|
|
104
|
+
const strongestMarkerAssertionsByAnchor = new Map();
|
|
105
|
+
const unresolvedMarkerAssertions = [];
|
|
106
|
+
for (const [sourceOrder, step] of group.steps.entries()) {
|
|
107
|
+
if (!isManagedSemanticMarkerStep(step)) {
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
const resolution = resolveSemanticMarkerAssertion(step);
|
|
111
|
+
if (resolution.status === 'unresolved') {
|
|
112
|
+
unresolvedMarkerAssertions.push(resolution);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
const placement = getHelperPlacement({
|
|
116
|
+
anchorStepId: resolution.anchorStepId,
|
|
117
|
+
helperRefs,
|
|
118
|
+
helperStepsByName,
|
|
119
|
+
}) ?? {
|
|
120
|
+
kind: 'after-step',
|
|
121
|
+
stepId: resolution.anchorStepId,
|
|
122
|
+
};
|
|
123
|
+
const markerAssertion = {
|
|
124
|
+
markerStepId: resolution.markerStepId,
|
|
125
|
+
anchorStepId: resolution.anchorStepId,
|
|
126
|
+
placement,
|
|
127
|
+
assertion: resolution.assertion,
|
|
128
|
+
};
|
|
129
|
+
const proofRank = getSemanticMarkerProofRank(resolution.assertion.proofKind);
|
|
130
|
+
const existing = strongestMarkerAssertionsByAnchor.get(resolution.anchorStepId);
|
|
131
|
+
if (!existing ||
|
|
132
|
+
proofRank < existing.proofRank ||
|
|
133
|
+
(proofRank === existing.proofRank && sourceOrder < existing.sourceOrder)) {
|
|
134
|
+
strongestMarkerAssertionsByAnchor.set(resolution.anchorStepId, {
|
|
135
|
+
markerAssertion,
|
|
136
|
+
proofRank,
|
|
137
|
+
sourceOrder,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
markerAssertions: [...strongestMarkerAssertionsByAnchor.values()]
|
|
143
|
+
.sort((left, right) => left.sourceOrder - right.sourceOrder)
|
|
144
|
+
.map((entry) => entry.markerAssertion),
|
|
145
|
+
unresolvedMarkerAssertions,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
function getSemanticMarkerProofRank(proofKind) {
|
|
149
|
+
switch (proofKind) {
|
|
150
|
+
case 'role-name':
|
|
151
|
+
return 0;
|
|
152
|
+
case 'visible-text':
|
|
153
|
+
case 'visible-value':
|
|
154
|
+
return 1;
|
|
155
|
+
case 'label-text':
|
|
156
|
+
return 2;
|
|
157
|
+
case 'placeholder-text':
|
|
158
|
+
return 3;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
function sanitizeIdentifierPart(value) {
|
|
162
|
+
return value
|
|
163
|
+
.replace(/[^a-zA-Z0-9]+/g, ' ')
|
|
164
|
+
.trim()
|
|
165
|
+
.split(/\s+/)
|
|
166
|
+
.map((part, index) => {
|
|
167
|
+
const normalized = part.toLowerCase();
|
|
168
|
+
return index === 0
|
|
169
|
+
? normalized
|
|
170
|
+
: normalized.charAt(0).toUpperCase() + normalized.slice(1);
|
|
171
|
+
})
|
|
172
|
+
.join('');
|
|
173
|
+
}
|
|
174
|
+
function toHelperName(groupName, index) {
|
|
175
|
+
const normalized = sanitizeIdentifierPart(groupName);
|
|
176
|
+
return normalized ? `plan${normalized.charAt(0).toUpperCase()}${normalized.slice(1)}` : `planScenario${index + 1}`;
|
|
177
|
+
}
|
|
178
|
+
function inferScenarioGoal(groupName) {
|
|
179
|
+
if (/validation|error|required|missing/i.test(groupName)) {
|
|
180
|
+
return 'validation';
|
|
181
|
+
}
|
|
182
|
+
if (/review|summary|confirm/i.test(groupName)) {
|
|
183
|
+
return 'review';
|
|
184
|
+
}
|
|
185
|
+
if (/save|submit|pending|success|failure|mutation/i.test(groupName)) {
|
|
186
|
+
return 'mutation-state';
|
|
187
|
+
}
|
|
188
|
+
return 'flow';
|
|
189
|
+
}
|
|
12
190
|
function hasMutationSignals(mockAnalysis) {
|
|
13
191
|
if (!mockAnalysis) {
|
|
14
192
|
return false;
|
|
@@ -31,6 +209,32 @@ function isWizardFlow(recording) {
|
|
|
31
209
|
const hasReviewLanguage = recording.steps.some((step) => /(review|invoice|details)/i.test(step.target ?? ''));
|
|
32
210
|
return actionableSteps.length >= 6 && hasFormInput && (milestoneClicks.length >= 2 || hasReviewLanguage);
|
|
33
211
|
}
|
|
212
|
+
function assessStateSafety(params) {
|
|
213
|
+
const { recording, analyzedRecording, mockAnalysis } = params;
|
|
214
|
+
const wizardFlow = isWizardFlow(recording);
|
|
215
|
+
if (wizardFlow && hasMutationSignals(mockAnalysis)) {
|
|
216
|
+
return {
|
|
217
|
+
status: 'single-flow-required',
|
|
218
|
+
reason: 'This flow spans multiple wizard steps and repo evidence shows mutation-driven state, so downstream tests should share one coordinated flow unless setup recreation is proven.',
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
if (wizardFlow) {
|
|
222
|
+
return {
|
|
223
|
+
status: 'unknown',
|
|
224
|
+
reason: 'This flow looks stateful, but repo evidence is not strong enough yet to prove whether multi-test recreation is safe.',
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
if (analyzedRecording.intentGroups.length > 1) {
|
|
228
|
+
return {
|
|
229
|
+
status: 'safe-multi-it',
|
|
230
|
+
reason: 'Intent groups are already separated into user-visible milestones and no mutation-heavy wizard state was detected.',
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
return {
|
|
234
|
+
status: 'safe-multi-it',
|
|
235
|
+
reason: 'No mutation-heavy wizard state was detected, so scenario splitting is safe when it improves readability.',
|
|
236
|
+
};
|
|
237
|
+
}
|
|
34
238
|
export function assessRenderBoundary(params) {
|
|
35
239
|
const { recording, mockAnalysis } = params;
|
|
36
240
|
const signals = [];
|
|
@@ -50,7 +254,7 @@ export function assessRenderBoundary(params) {
|
|
|
50
254
|
kind: 'module',
|
|
51
255
|
confidence: 'medium',
|
|
52
256
|
resolvedTarget: null,
|
|
53
|
-
reason: 'This flow spans multiple user-visible steps and repo evidence shows data/mutation setup around it, so
|
|
257
|
+
reason: 'This flow spans multiple user-visible steps and repo evidence shows data/mutation setup around it, so Tayo should prefer a container/module boundary rather than a leaf component test.',
|
|
54
258
|
signals,
|
|
55
259
|
};
|
|
56
260
|
}
|
|
@@ -59,7 +263,7 @@ export function assessRenderBoundary(params) {
|
|
|
59
263
|
kind: 'unknown',
|
|
60
264
|
confidence: 'low',
|
|
61
265
|
resolvedTarget: null,
|
|
62
|
-
reason: 'This flow behaves like a stateful wizard, but
|
|
266
|
+
reason: 'This flow behaves like a stateful wizard, but Tayo cannot resolve the owning render target from repo context yet.',
|
|
63
267
|
signals,
|
|
64
268
|
};
|
|
65
269
|
}
|
|
@@ -74,26 +278,72 @@ export function assessRenderBoundary(params) {
|
|
|
74
278
|
export function planJsSuite(params) {
|
|
75
279
|
const { recording, analyzedRecording, mockAnalysis, fallbackTitle } = params;
|
|
76
280
|
const renderBoundary = assessRenderBoundary({ recording, mockAnalysis });
|
|
281
|
+
const stateSafety = assessStateSafety({ recording, analyzedRecording, mockAnalysis });
|
|
77
282
|
const warnings = [];
|
|
283
|
+
const stepsById = new Map(analyzedRecording.steps
|
|
284
|
+
.filter((step) => Boolean(step.id))
|
|
285
|
+
.map((step) => [step.id, step]));
|
|
78
286
|
if (renderBoundary.kind === 'module') {
|
|
79
287
|
warnings.push('Prefer a repo-local module/container render boundary for this flow instead of targeting a leaf form component directly.');
|
|
80
288
|
}
|
|
81
289
|
if (renderBoundary.kind !== 'component' && !renderBoundary.resolvedTarget) {
|
|
82
|
-
warnings.push('
|
|
290
|
+
warnings.push('Tayo could not resolve the exact render target from repo context; generated output should be treated as a boundary draft.');
|
|
83
291
|
}
|
|
84
292
|
const repeatedTarget = findRepeatedMockTarget(mockAnalysis);
|
|
85
293
|
if (repeatedTarget) {
|
|
86
294
|
warnings.push(`Reuse shared mocks for repeated targets such as "${repeatedTarget}" instead of re-mocking internal query hooks inline.`);
|
|
87
295
|
}
|
|
296
|
+
const baseGroups = enrichGroupSteps(renderBoundary.kind === 'module'
|
|
297
|
+
? [
|
|
298
|
+
{
|
|
299
|
+
name: fallbackTitle || 'complete recorded flow',
|
|
300
|
+
steps: analyzedRecording.steps,
|
|
301
|
+
},
|
|
302
|
+
]
|
|
303
|
+
: buildFallbackGroups(analyzedRecording, fallbackTitle), stepsById);
|
|
304
|
+
const helperGroups = enrichGroupSteps(analyzedRecording.intentGroups, stepsById);
|
|
305
|
+
const helpers = helperGroups.map((group, index) => ({
|
|
306
|
+
name: toHelperName(group.name, index),
|
|
307
|
+
sourceGroup: group.name,
|
|
308
|
+
purpose: `Navigate the UI through "${group.name}" without hiding assertions.`,
|
|
309
|
+
steps: filterManagedSemanticMarkerSteps(group.steps),
|
|
310
|
+
assertionPolicy: 'sync-only',
|
|
311
|
+
}));
|
|
312
|
+
const helperStepsByName = new Map(helpers.map((helper) => [
|
|
313
|
+
helper.name,
|
|
314
|
+
new Set(helper.steps
|
|
315
|
+
.filter((step) => Boolean(step.id))
|
|
316
|
+
.map((step) => step.id)),
|
|
317
|
+
]));
|
|
318
|
+
const scenarios = baseGroups.map((group, index) => {
|
|
319
|
+
const helperRefs = stateSafety.status === 'safe-multi-it'
|
|
320
|
+
? helpers
|
|
321
|
+
.filter((helper) => sharesAnyStep(group.steps, helper.steps))
|
|
322
|
+
.map((helper) => helper.name)
|
|
323
|
+
: [];
|
|
324
|
+
const markerState = collectScenarioMarkerState({
|
|
325
|
+
group,
|
|
326
|
+
helperRefs,
|
|
327
|
+
helperStepsByName,
|
|
328
|
+
});
|
|
329
|
+
return {
|
|
330
|
+
name: group.name,
|
|
331
|
+
goal: inferScenarioGoal(group.name),
|
|
332
|
+
steps: filterManagedSemanticMarkerSteps(group.steps),
|
|
333
|
+
helperRefs,
|
|
334
|
+
requiresFreshRender: true,
|
|
335
|
+
markerAssertions: markerState.markerAssertions,
|
|
336
|
+
unresolvedMarkerAssertions: markerState.unresolvedMarkerAssertions,
|
|
337
|
+
};
|
|
338
|
+
});
|
|
339
|
+
if (stateSafety.status !== 'safe-multi-it' && baseGroups.length > 1) {
|
|
340
|
+
warnings.push('Keep this flow in a single end-to-end scenario until Tayo can prove that downstream state can be recreated safely per test.');
|
|
341
|
+
}
|
|
88
342
|
return {
|
|
89
|
-
itGroups:
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
steps: analyzedRecording.steps,
|
|
94
|
-
},
|
|
95
|
-
]
|
|
96
|
-
: buildFallbackGroups(analyzedRecording, fallbackTitle),
|
|
343
|
+
itGroups: baseGroups,
|
|
344
|
+
scenarios,
|
|
345
|
+
helpers,
|
|
346
|
+
stateSafety,
|
|
97
347
|
renderBoundary,
|
|
98
348
|
warnings,
|
|
99
349
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suite-planner.js","sourceRoot":"","sources":["../../src/core/suite-planner.ts"],"names":[],"mappings":"AAoBA,SAAS,mBAAmB,CAC1B,iBAAoC,EACpC,aAAqB;IAErB,IAAI,iBAAiB,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,OAAO,iBAAiB,CAAC,YAAY,CAAA;IACvC,CAAC;IAED,OAAO;QACL;YACE,IAAI,EAAE,aAAa,IAAI,eAAe;YACtC,KAAK,EAAE,iBAAiB,CAAC,KAAK;SAC/B;KACF,CAAA;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,YAAiC;IAC3D,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO,CACL,YAAY,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC;QAC1C,YAAY,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CACxC,CAAA;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,YAAiC;IAC/D,OAAO,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,IAAI,CAAA;AACzD,CAAC;AAED,SAAS,YAAY,CAAC,SAA8B;IAClD,MAAM,eAAe,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CACtD,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAClD,CAAA;IACD,MAAM,eAAe,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACtD,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5C,OAAO,KAAK,CAAA;QACd,CAAC;QAED,OAAO,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC9F,CAAC,CAAC,CAAA;IACF,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAA;IACvG,MAAM,iBAAiB,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAA;IAE7G,OAAO,eAAe,CAAC,MAAM,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,eAAe,CAAC,MAAM,IAAI,CAAC,IAAI,iBAAiB,CAAC,CAAA;AAC1G,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAGpC;IACC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM,CAAA;IAC1C,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,MAAM,UAAU,GAAG,YAAY,CAAC,SAAS,CAAC,CAAA;IAC1C,MAAM,eAAe,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAA;IAExD,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;IACxC,CAAC;IAED,IAAI,YAAY,EAAE,kBAAkB,CAAC,MAAM,EAAE,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAA;IAChE,CAAC;IAED,IAAI,YAAY,EAAE,eAAe,CAAC,MAAM,EAAE,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAA;IAC3D,CAAC;IAED,IAAI,UAAU,IAAI,eAAe,EAAE,CAAC;QAClC,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,QAAQ;YACpB,cAAc,EAAE,IAAI;YACpB,MAAM,EACJ,yLAAyL;YAC3L,OAAO;SACR,CAAA;IACH,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,OAAO;YACL,IAAI,EAAE,SAAS;YACf,UAAU,EAAE,KAAK;YACjB,cAAc,EAAE,IAAI;YACpB,MAAM,EACJ,mHAAmH;YACrH,OAAO;SACR,CAAA;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,UAAU,EAAE,KAAK;QACjB,cAAc,EAAE,IAAI;QACpB,MAAM,EACJ,+GAA+G;QACjH,OAAO;KACR,CAAA;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAK3B;IACC,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,MAAM,CAAA;IAC5E,MAAM,cAAc,GAAG,oBAAoB,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAA;IACxE,MAAM,QAAQ,GAAa,EAAE,CAAA;IAE7B,IAAI,cAAc,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,QAAQ,CAAC,IAAI,CACX,yHAAyH,CAC1H,CAAA;IACH,CAAC;IAED,IAAI,cAAc,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;QAC1E,QAAQ,CAAC,IAAI,CACX,2HAA2H,CAC5H,CAAA;IACH,CAAC;IAED,MAAM,cAAc,GAAG,sBAAsB,CAAC,YAAY,CAAC,CAAA;IAC3D,IAAI,cAAc,EAAE,CAAC;QACnB,QAAQ,CAAC,IAAI,CACX,oDAAoD,cAAc,sDAAsD,CACzH,CAAA;IACH,CAAC;IAED,OAAO;QACL,QAAQ,EACN,cAAc,CAAC,IAAI,KAAK,QAAQ;YAC9B,CAAC,CAAC;gBACE;oBACE,IAAI,EAAE,aAAa,IAAI,wBAAwB;oBAC/C,KAAK,EAAE,iBAAiB,CAAC,KAAK;iBAC/B;aACF;YACH,CAAC,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,aAAa,CAAC;QAC3D,cAAc;QACd,QAAQ;KACT,CAAA;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"suite-planner.js","sourceRoot":"","sources":["../../src/core/suite-planner.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Tayo CLI entry point
|
|
4
4
|
* Installer-first package surface with generator access preserved under `generate`.
|
|
5
5
|
*/
|
|
6
6
|
import { Command } from 'commander';
|
|
@@ -10,11 +10,11 @@ import { applyInstallOptions, createInstallCommand, runInstallCommand, } from '.
|
|
|
10
10
|
const program = new Command();
|
|
11
11
|
applyInstallOptions(program);
|
|
12
12
|
program
|
|
13
|
-
.name('
|
|
14
|
-
.description(`${pc.bold('@tayo-dev/rtl')} — Install
|
|
13
|
+
.name('tayo')
|
|
14
|
+
.description(`${pc.bold('@tayo-dev/rtl')} — Install Tayo into Claude Code, OpenCode, Gemini CLI, or Codex`)
|
|
15
15
|
.version('1.3.0-alpha.0', '-v, --version', 'Output the current version')
|
|
16
16
|
.helpOption('-h, --help', 'Display help for command')
|
|
17
|
-
.addHelpText('after', `\nExisting capability:\n ${pc.bold('
|
|
17
|
+
.addHelpText('after', `\nExisting capability:\n ${pc.bold('tayo generate <file>')} Generate RTL tests from Recorder exports`)
|
|
18
18
|
.action(async () => {
|
|
19
19
|
await runInstallCommand(program.optsWithGlobals());
|
|
20
20
|
});
|
package/dist/install/planner.js
CHANGED
|
@@ -18,7 +18,7 @@ function buildRuntimeOperations(target) {
|
|
|
18
18
|
export function buildInstallPlan(selection, context = {}) {
|
|
19
19
|
return {
|
|
20
20
|
packageName: '@tayo-dev/rtl',
|
|
21
|
-
commandName: '
|
|
21
|
+
commandName: 'tayo',
|
|
22
22
|
stage: 'ready-to-write',
|
|
23
23
|
source: selection.source,
|
|
24
24
|
mode: selection.mode,
|
package/dist/install/types.d.ts
CHANGED
|
@@ -93,7 +93,7 @@ export interface InstallAssetConflict {
|
|
|
93
93
|
}
|
|
94
94
|
export interface InstallPlan {
|
|
95
95
|
packageName: '@tayo-dev/rtl';
|
|
96
|
-
commandName: '
|
|
96
|
+
commandName: 'tayo';
|
|
97
97
|
stage: 'prewrite-preview' | 'ready-to-write';
|
|
98
98
|
source: InstallSelectionSource;
|
|
99
99
|
mode: 'interactive' | 'non-interactive';
|
package/dist/learner/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Convention Learning Module
|
|
3
3
|
*
|
|
4
|
-
* Analyzes existing test patterns to derive
|
|
5
|
-
* Implements CNV-01:
|
|
4
|
+
* Analyzes existing test patterns to derive Tayo's conventions.
|
|
5
|
+
* Implements CNV-01: Tayo derives conventions from observation.
|
|
6
6
|
* Implements CNV-02: Conventions persist across runs via SQLite storage.
|
|
7
7
|
* Implements CNV-03: Faster subsequent runs via caching.
|
|
8
8
|
*/
|
package/dist/learner/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Convention Learning Module
|
|
3
3
|
*
|
|
4
|
-
* Analyzes existing test patterns to derive
|
|
5
|
-
* Implements CNV-01:
|
|
4
|
+
* Analyzes existing test patterns to derive Tayo's conventions.
|
|
5
|
+
* Implements CNV-01: Tayo derives conventions from observation.
|
|
6
6
|
* Implements CNV-02: Conventions persist across runs via SQLite storage.
|
|
7
7
|
* Implements CNV-03: Faster subsequent runs via caching.
|
|
8
8
|
*/
|
|
@@ -149,7 +149,7 @@ function mergeConventions(a, b) {
|
|
|
149
149
|
*/
|
|
150
150
|
export function getConventions(projectRoot) {
|
|
151
151
|
try {
|
|
152
|
-
const taroDir = path.join(projectRoot, '.
|
|
152
|
+
const taroDir = path.join(projectRoot, '.tayo');
|
|
153
153
|
const dbPath = path.join(taroDir, 'conventions.db');
|
|
154
154
|
// Check if database exists
|
|
155
155
|
if (!fs.existsSync(dbPath)) {
|
|
@@ -61,7 +61,7 @@ export declare class ConventionStore {
|
|
|
61
61
|
}
|
|
62
62
|
/**
|
|
63
63
|
* Create a ConventionStore instance
|
|
64
|
-
* @param projectRoot - Root directory of the project (will create .
|
|
64
|
+
* @param projectRoot - Root directory of the project (will create .tayo/ subdirectory)
|
|
65
65
|
* @returns Initialized ConventionStore
|
|
66
66
|
*/
|
|
67
67
|
export declare function createStore(projectRoot: string): ConventionStore;
|
package/dist/learner/storage.js
CHANGED
|
@@ -188,11 +188,11 @@ export class ConventionStore {
|
|
|
188
188
|
}
|
|
189
189
|
/**
|
|
190
190
|
* Create a ConventionStore instance
|
|
191
|
-
* @param projectRoot - Root directory of the project (will create .
|
|
191
|
+
* @param projectRoot - Root directory of the project (will create .tayo/ subdirectory)
|
|
192
192
|
* @returns Initialized ConventionStore
|
|
193
193
|
*/
|
|
194
194
|
export function createStore(projectRoot) {
|
|
195
|
-
const taroDir = path.join(projectRoot, '.
|
|
195
|
+
const taroDir = path.join(projectRoot, '.tayo');
|
|
196
196
|
const dbPath = path.join(taroDir, 'conventions.db');
|
|
197
197
|
const store = new ConventionStore(dbPath);
|
|
198
198
|
store.init();
|
|
@@ -3,19 +3,43 @@
|
|
|
3
3
|
* Functions return string fragments for composing test files.
|
|
4
4
|
*/
|
|
5
5
|
import type { NormalizedAction } from '../types/recording.js';
|
|
6
|
-
export
|
|
6
|
+
export interface RenderTargetImport {
|
|
7
|
+
symbol: string;
|
|
8
|
+
importPath: string;
|
|
9
|
+
}
|
|
10
|
+
export interface ImportBlockOptions {
|
|
11
|
+
renderTarget?: RenderTargetImport | null;
|
|
12
|
+
needsWithin?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function importBlock(hasUserEvents: boolean, importStyle?: 'esm' | 'cjs', options?: ImportBlockOptions): string;
|
|
7
15
|
export interface StepTemplateOptions {
|
|
8
16
|
action: NormalizedAction;
|
|
9
17
|
query: string;
|
|
10
18
|
value?: string;
|
|
11
19
|
matcher?: string;
|
|
20
|
+
checkpoint?: {
|
|
21
|
+
reason: string;
|
|
22
|
+
selector: string;
|
|
23
|
+
};
|
|
12
24
|
}
|
|
13
25
|
export declare function stepTemplate(opts: StepTemplateOptions): string;
|
|
26
|
+
export declare function markerAssertionTemplate(opts: {
|
|
27
|
+
queryExpression: string;
|
|
28
|
+
matcher?: string;
|
|
29
|
+
}): string;
|
|
14
30
|
export declare function describeBlock(name: string, bodyLines: string[], hasUserEvents: boolean): string;
|
|
15
31
|
export interface ItBlockTemplate {
|
|
16
32
|
name: string;
|
|
17
33
|
stepLines: string[];
|
|
18
34
|
hasUserEvents: boolean;
|
|
19
35
|
}
|
|
20
|
-
export
|
|
36
|
+
export interface HelperBlockTemplate {
|
|
37
|
+
name: string;
|
|
38
|
+
stepLines: string[];
|
|
39
|
+
}
|
|
40
|
+
export declare function helperBlock(block: HelperBlockTemplate): string;
|
|
41
|
+
export declare function describeBlockMultiIt(name: string, itBlocks: ItBlockTemplate[], options?: {
|
|
42
|
+
renderExpression?: string;
|
|
43
|
+
helpers?: HelperBlockTemplate[];
|
|
44
|
+
}): string;
|
|
21
45
|
//# sourceMappingURL=test-template.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-template.d.ts","sourceRoot":"","sources":["../../src/templates/test-template.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,
|
|
1
|
+
{"version":3,"file":"test-template.d.ts","sourceRoot":"","sources":["../../src/templates/test-template.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAA;IACxC,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,wBAAgB,WAAW,CACzB,aAAa,EAAE,OAAO,EACtB,WAAW,GAAE,KAAK,GAAG,KAAa,EAClC,OAAO,GAAE,kBAAuB,GAC/B,MAAM,CAiCR;AAcD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,gBAAgB,CAAA;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE;QACX,MAAM,EAAE,MAAM,CAAA;QACd,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;CACF;AAcD,wBAAgB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CA0C9D;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC5C,eAAe,EAAE,MAAM,CAAA;IACvB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,GAAG,MAAM,CAET;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EAAE,EACnB,aAAa,EAAE,OAAO,GACrB,MAAM,CAYR;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,aAAa,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAO9D;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,eAAe,EAAE,EAC3B,OAAO,GAAE;IACP,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,OAAO,CAAC,EAAE,mBAAmB,EAAE,CAAA;CAC3B,GACL,MAAM,CAmBR"}
|
|
@@ -2,25 +2,35 @@
|
|
|
2
2
|
* Code templates for RTL test structure.
|
|
3
3
|
* Functions return string fragments for composing test files.
|
|
4
4
|
*/
|
|
5
|
-
export function importBlock(hasUserEvents, importStyle = 'esm') {
|
|
5
|
+
export function importBlock(hasUserEvents, importStyle = 'esm', options = {}) {
|
|
6
|
+
const testingLibraryMembers = ['render', 'screen'];
|
|
7
|
+
if (options.needsWithin) {
|
|
8
|
+
testingLibraryMembers.push('within');
|
|
9
|
+
}
|
|
6
10
|
if (importStyle === 'cjs') {
|
|
7
11
|
const lines = [
|
|
8
|
-
|
|
12
|
+
`const { ${testingLibraryMembers.join(', ')} } = require('@testing-library/react')`,
|
|
9
13
|
"require('@testing-library/jest-dom')",
|
|
10
14
|
];
|
|
11
15
|
if (hasUserEvents) {
|
|
12
16
|
lines.push("const userEvent = require('@testing-library/user-event')");
|
|
13
17
|
}
|
|
18
|
+
if (options.renderTarget) {
|
|
19
|
+
lines.push(`const ${options.renderTarget.symbol} = require('${options.renderTarget.importPath}').default`);
|
|
20
|
+
}
|
|
14
21
|
return lines.join('\n');
|
|
15
22
|
}
|
|
16
23
|
// ESM (default)
|
|
17
24
|
const lines = [
|
|
18
|
-
|
|
25
|
+
`import { ${testingLibraryMembers.join(', ')} } from '@testing-library/react'`,
|
|
19
26
|
"import '@testing-library/jest-dom'",
|
|
20
27
|
];
|
|
21
28
|
if (hasUserEvents) {
|
|
22
29
|
lines.push("import userEvent from '@testing-library/user-event'");
|
|
23
30
|
}
|
|
31
|
+
if (options.renderTarget) {
|
|
32
|
+
lines.push(`import ${options.renderTarget.symbol} from '${options.renderTarget.importPath}'`);
|
|
33
|
+
}
|
|
24
34
|
return lines.join('\n');
|
|
25
35
|
}
|
|
26
36
|
function escapeSingleQuote(s) {
|
|
@@ -33,9 +43,26 @@ function indentLines(text, spaces) {
|
|
|
33
43
|
.map((line) => (line.trim() ? pad + line : ''))
|
|
34
44
|
.join('\n');
|
|
35
45
|
}
|
|
46
|
+
function sanitizeCommentText(value) {
|
|
47
|
+
return value.replace(/\s+/g, ' ').trim();
|
|
48
|
+
}
|
|
49
|
+
function normalizeAssertionMatcher(matcher) {
|
|
50
|
+
if (matcher.startsWith('.')) {
|
|
51
|
+
return /\)\s*$/u.test(matcher) ? matcher : `${matcher}()`;
|
|
52
|
+
}
|
|
53
|
+
return /\)\s*$/u.test(matcher) ? `.${matcher}` : `.${matcher}()`;
|
|
54
|
+
}
|
|
36
55
|
export function stepTemplate(opts) {
|
|
37
56
|
const { action, query, value = '' } = opts;
|
|
38
57
|
const escapedValue = escapeSingleQuote(value);
|
|
58
|
+
if (opts.checkpoint) {
|
|
59
|
+
return [
|
|
60
|
+
`// tayo-query-checkpoint: ${action} step requires manual RTL query recovery`,
|
|
61
|
+
`// selector: ${sanitizeCommentText(opts.checkpoint.selector)}`,
|
|
62
|
+
`// reason: ${sanitizeCommentText(opts.checkpoint.reason)}`,
|
|
63
|
+
'// TODO: replace this checkpoint with a trustworthy RTL query before keeping the generated test',
|
|
64
|
+
].join('\n');
|
|
65
|
+
}
|
|
39
66
|
switch (action) {
|
|
40
67
|
case 'click':
|
|
41
68
|
return `await user.click(${query})`;
|
|
@@ -59,6 +86,9 @@ export function stepTemplate(opts) {
|
|
|
59
86
|
return `// TODO: unsupported step — original selector: ${query}`;
|
|
60
87
|
}
|
|
61
88
|
}
|
|
89
|
+
export function markerAssertionTemplate(opts) {
|
|
90
|
+
return `expect(await ${opts.queryExpression})${normalizeAssertionMatcher(opts.matcher ?? 'toBeVisible')}`;
|
|
91
|
+
}
|
|
62
92
|
export function describeBlock(name, bodyLines, hasUserEvents) {
|
|
63
93
|
const body = bodyLines.join('\n');
|
|
64
94
|
const indented = indentLines(body, 4);
|
|
@@ -72,8 +102,18 @@ export function describeBlock(name, bodyLines, hasUserEvents) {
|
|
|
72
102
|
`})`,
|
|
73
103
|
].join('\n');
|
|
74
104
|
}
|
|
75
|
-
export function
|
|
105
|
+
export function helperBlock(block) {
|
|
106
|
+
const indented = indentLines(block.stepLines.join('\n'), 2);
|
|
107
|
+
return [
|
|
108
|
+
`const ${block.name} = async (user: ReturnType<typeof userEvent.setup>) => {`,
|
|
109
|
+
indented,
|
|
110
|
+
`}`,
|
|
111
|
+
].join('\n');
|
|
112
|
+
}
|
|
113
|
+
export function describeBlockMultiIt(name, itBlocks, options = {}) {
|
|
76
114
|
const escapedName = escapeSingleQuote(name);
|
|
115
|
+
const renderExpression = options.renderExpression ?? '<App />';
|
|
116
|
+
const helperBlocks = (options.helpers ?? []).map((block) => helperBlock(block));
|
|
77
117
|
const blocks = itBlocks.map((block) => {
|
|
78
118
|
const setup = block.hasUserEvents
|
|
79
119
|
? ` const user = userEvent.setup()\n`
|
|
@@ -81,12 +121,12 @@ export function describeBlockMultiIt(name, itBlocks) {
|
|
|
81
121
|
const indented = indentLines(block.stepLines.join('\n'), 4);
|
|
82
122
|
return [
|
|
83
123
|
` it('${escapeSingleQuote(block.name)}', async () => {`,
|
|
84
|
-
` render(
|
|
124
|
+
` render(${renderExpression})`,
|
|
85
125
|
setup,
|
|
86
126
|
indented,
|
|
87
127
|
` })`,
|
|
88
128
|
].join('\n');
|
|
89
129
|
});
|
|
90
|
-
return [`describe('${escapedName}', () => {`, ...blocks, `})`].join('\n');
|
|
130
|
+
return [`describe('${escapedName}', () => {`, ...helperBlocks, ...blocks, `})`].join('\n\n');
|
|
91
131
|
}
|
|
92
132
|
//# sourceMappingURL=test-template.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-template.js","sourceRoot":"","sources":["../../src/templates/test-template.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"test-template.js","sourceRoot":"","sources":["../../src/templates/test-template.ts"],"names":[],"mappings":"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"}
|