Skip to content

Commit 17f00d8

Browse files
committed
Fix syntax error from crashing the playground
1 parent 91e5c3d commit 17f00d8

File tree

3 files changed

+40
-1
lines changed

3 files changed

+40
-1
lines changed

compiler/apps/playground/__tests__/e2e/page.spec.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,36 @@ test('disableMemoizationForDebugging flag works as expected', async ({
314314
expect(output).toMatchSnapshot('disableMemoizationForDebugging-output.txt');
315315
});
316316

317+
test('error is displayed when source has syntax error', async ({page}) => {
318+
const syntaxErrorSource = `function TestComponent(props) {
319+
const oops = props.
320+
return (
321+
<>{oops}</>
322+
);
323+
}`;
324+
const store: Store = {
325+
source: syntaxErrorSource,
326+
config: defaultConfig,
327+
showInternals: false,
328+
};
329+
const hash = encodeStore(store);
330+
await page.goto(`/#${hash}`);
331+
await page.waitForFunction(isMonacoLoaded);
332+
await expandConfigs(page);
333+
await page.screenshot({
334+
fullPage: true,
335+
path: 'test-results/08-source-syntax-error.png',
336+
});
337+
338+
const text =
339+
(await page.locator('.monaco-editor-output').allInnerTexts()) ?? [];
340+
const output = text.join('');
341+
342+
expect(output.replace(/\s+/g, ' ')).toContain(
343+
'Expected identifier to be defined before being used',
344+
);
345+
});
346+
317347
TEST_CASE_INPUTS.forEach((t, idx) =>
318348
test(`playground compiles: ${t.name}`, async ({page}) => {
319349
const store: Store = {

compiler/apps/playground/components/Editor/Input.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,15 @@ import React$Types from '../../node_modules/@types/react/index.d.ts';
2929

3030
loader.config({monaco});
3131

32+
declare global {
33+
interface Window {
34+
/**
35+
* Set to true once the Monaco editor instance has mounted. Used as an imperative signal for any code that needs to defer until Monaco is available.
36+
*/
37+
__MONACO_LOADED__?: true;
38+
}
39+
}
40+
3241
type Props = {
3342
errors: Array<CompilerErrorDetail | CompilerDiagnostic>;
3443
language: 'flow' | 'typescript';

compiler/apps/playground/lib/compilation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ export function compile(
297297
if (!error.hasErrors() && otherErrors.length !== 0) {
298298
otherErrors.forEach(e => error.details.push(e));
299299
}
300-
if (error.hasErrors()) {
300+
if (error.hasErrors() || !transformOutput) {
301301
return [{kind: 'err', results, error}, language, baseOpts];
302302
}
303303
return [

0 commit comments

Comments
 (0)