chore: send structured codegen info to the debug controller (#18491)
This commit is contained in:
parent
2183d9e9a2
commit
67c9624924
|
|
@ -340,6 +340,9 @@ scheme.DebugControllerStateChangedEvent = tObject({
|
||||||
});
|
});
|
||||||
scheme.DebugControllerSourceChangedEvent = tObject({
|
scheme.DebugControllerSourceChangedEvent = tObject({
|
||||||
text: tString,
|
text: tString,
|
||||||
|
header: tOptional(tString),
|
||||||
|
footer: tOptional(tString),
|
||||||
|
actions: tOptional(tArray(tString)),
|
||||||
});
|
});
|
||||||
scheme.DebugControllerBrowsersChangedEvent = tObject({
|
scheme.DebugControllerBrowsersChangedEvent = tObject({
|
||||||
browsers: tArray(tObject({
|
browsers: tArray(tObject({
|
||||||
|
|
|
||||||
|
|
@ -231,6 +231,7 @@ class InspectingRecorderApp extends EmptyRecorderApp {
|
||||||
|
|
||||||
override async setSources(sources: Source[]): Promise<void> {
|
override async setSources(sources: Source[]): Promise<void> {
|
||||||
const source = sources.find(s => s.id === this._debugController._codegenId);
|
const source = sources.find(s => s.id === this._debugController._codegenId);
|
||||||
this._debugController.emit(DebugController.Events.SourceChanged, source?.text || '');
|
const { text, header, footer, actions } = source || { text: '' };
|
||||||
|
this._debugController.emit(DebugController.Events.SourceChanged, { text, header, footer, actions });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -31,8 +31,8 @@ export class DebugControllerDispatcher extends Dispatcher<DebugController, chann
|
||||||
this._object.on(DebugController.Events.InspectRequested, ({ selector, locator }) => {
|
this._object.on(DebugController.Events.InspectRequested, ({ selector, locator }) => {
|
||||||
this._dispatchEvent('inspectRequested', { selector, locator });
|
this._dispatchEvent('inspectRequested', { selector, locator });
|
||||||
});
|
});
|
||||||
this._object.on(DebugController.Events.SourceChanged, text => {
|
this._object.on(DebugController.Events.SourceChanged, ({ text, header, footer, actions }) => {
|
||||||
this._dispatchEvent('sourceChanged', { text });
|
this._dispatchEvent('sourceChanged', ({ text, header, footer, actions }));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -340,16 +340,20 @@ class ContextRecorder extends EventEmitter {
|
||||||
generator.on('change', () => {
|
generator.on('change', () => {
|
||||||
this._recorderSources = [];
|
this._recorderSources = [];
|
||||||
for (const languageGenerator of this._orderedLanguages) {
|
for (const languageGenerator of this._orderedLanguages) {
|
||||||
|
const { header, footer, actions, text } = generator.generateStructure(languageGenerator);
|
||||||
const source: Source = {
|
const source: Source = {
|
||||||
isRecorded: true,
|
isRecorded: true,
|
||||||
label: languageGenerator.name,
|
label: languageGenerator.name,
|
||||||
group: languageGenerator.groupName,
|
group: languageGenerator.groupName,
|
||||||
id: languageGenerator.id,
|
id: languageGenerator.id,
|
||||||
text: generator.generateText(languageGenerator),
|
text,
|
||||||
|
header,
|
||||||
|
footer,
|
||||||
|
actions,
|
||||||
language: languageGenerator.highlighter,
|
language: languageGenerator.highlighter,
|
||||||
highlight: []
|
highlight: []
|
||||||
};
|
};
|
||||||
source.revealLine = source.text.split('\n').length - 1;
|
source.revealLine = text.split('\n').length - 1;
|
||||||
this._recorderSources.push(source);
|
this._recorderSources.push(source);
|
||||||
if (languageGenerator === this._orderedLanguages[0])
|
if (languageGenerator === this._orderedLanguages[0])
|
||||||
this._throttledOutputFile?.setContent(source.text);
|
this._throttledOutputFile?.setContent(source.text);
|
||||||
|
|
|
||||||
|
|
@ -158,15 +158,11 @@ export class CodeGenerator extends EventEmitter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
generateText(languageGenerator: LanguageGenerator) {
|
generateStructure(languageGenerator: LanguageGenerator) {
|
||||||
const text = [];
|
const header = languageGenerator.generateHeader(this._options);
|
||||||
text.push(languageGenerator.generateHeader(this._options));
|
const footer = languageGenerator.generateFooter(this._options.saveStorage);
|
||||||
for (const action of this._actions) {
|
const actions = this._actions.map(a => languageGenerator.generateAction(a)).filter(Boolean);
|
||||||
const actionText = languageGenerator.generateAction(action);
|
const text = [header, ...actions, footer].join('\n');
|
||||||
if (actionText)
|
return { header, footer, actions, text };
|
||||||
text.push(actionText);
|
|
||||||
}
|
|
||||||
text.push(languageGenerator.generateFooter(this._options.saveStorage));
|
|
||||||
return text.join('\n');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -615,6 +615,9 @@ export type DebugControllerStateChangedEvent = {
|
||||||
};
|
};
|
||||||
export type DebugControllerSourceChangedEvent = {
|
export type DebugControllerSourceChangedEvent = {
|
||||||
text: string,
|
text: string,
|
||||||
|
header?: string,
|
||||||
|
footer?: string,
|
||||||
|
actions?: string[],
|
||||||
};
|
};
|
||||||
export type DebugControllerBrowsersChangedEvent = {
|
export type DebugControllerBrowsersChangedEvent = {
|
||||||
browsers: {
|
browsers: {
|
||||||
|
|
|
||||||
|
|
@ -716,6 +716,12 @@ DebugController:
|
||||||
sourceChanged:
|
sourceChanged:
|
||||||
parameters:
|
parameters:
|
||||||
text: string
|
text: string
|
||||||
|
header: string?
|
||||||
|
footer: string?
|
||||||
|
actions:
|
||||||
|
type: array?
|
||||||
|
items: string
|
||||||
|
|
||||||
|
|
||||||
# Deprecated
|
# Deprecated
|
||||||
browsersChanged:
|
browsersChanged:
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,9 @@ export type Source = {
|
||||||
revealLine?: number;
|
revealLine?: number;
|
||||||
// used to group the language generators
|
// used to group the language generators
|
||||||
group?: string;
|
group?: string;
|
||||||
|
header?: string;
|
||||||
|
footer?: string;
|
||||||
|
actions?: string[];
|
||||||
};
|
};
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
|
|
|
||||||
|
|
@ -161,6 +161,14 @@ test('should record', async ({ backend, connectedBrowser }) => {
|
||||||
await page.getByRole('button').click();
|
await page.getByRole('button').click();
|
||||||
|
|
||||||
await expect.poll(() => events[events.length - 1]).toEqual({
|
await expect.poll(() => events[events.length - 1]).toEqual({
|
||||||
|
header: `import { test, expect } from '@playwright/test';
|
||||||
|
|
||||||
|
test('test', async ({ page }) => {`,
|
||||||
|
footer: `});`,
|
||||||
|
actions: [
|
||||||
|
` await page.goto('about:blank');`,
|
||||||
|
` await page.getByRole('button', { name: 'Submit' }).click();`,
|
||||||
|
],
|
||||||
text: `import { test, expect } from '@playwright/test';
|
text: `import { test, expect } from '@playwright/test';
|
||||||
|
|
||||||
test('test', async ({ page }) => {
|
test('test', async ({ page }) => {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue