diff --git a/compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/CodegenReactiveFunction.ts b/compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/CodegenReactiveFunction.ts index d3a64dd460..1349817201 100644 --- a/compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/CodegenReactiveFunction.ts +++ b/compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/CodegenReactiveFunction.ts @@ -2680,7 +2680,12 @@ function setMissingLocationsToNull(ast: any): void { return; } if (ast['loc'] == null) { - ast['loc'] = null; + ast['loc'] = { + start: {line: null, column: null, index: null}, + end: {line: null, column: null, index: null}, + filename: null, + identifierName: null, + }; } for (const key in ast) { if (!hasOwnProperty(ast, key)) { diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/sourcemaps-simple.expect.md b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/sourcemaps-simple.expect.md new file mode 100644 index 0000000000..97f2b97f40 --- /dev/null +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/sourcemaps-simple.expect.md @@ -0,0 +1,55 @@ + +## Input + +```javascript +// @sourceMaps +export const Button = () => { + return ; +}; + +``` + +## Code + +```javascript +import { c as _c } from "react/compiler-runtime"; // @sourceMaps +export const Button = () => { + const $ = _c(1); + let t0; + if ($[0] === Symbol.for("react.memo_cache_sentinel")) { + t0 = ; + $[0] = t0; + } else { + t0 = $[0]; + } + return t0; +}; + +``` + +## Source Map + +``` +{ + "version": 3, + "names": [ + "Button", + "$", + "_c", + "t0", + "Symbol", + "for" + ], + "sources": [ + "sourcemaps-simple.ts" + ], + "sourcesContent": [ + "// @sourceMaps\nexport const Button = () => {\n return ;\n};\n" + ], + "mappings": "kDAAA;AACA,OAAO,MAAMA,MAAM,GAAGA,CAAA,YAAAC,CAAA,GAAAC,EAAA,QAAAC,EAAA,KAAAF,CAAA,QAAAG,MAAA,CAAAC,GAAA;IACbF,EAAA,UAAyB,CAAjB,QAAQ,EAAhB,MAAyB,EAAAF,CAAA,MAAAE,EAAA,SAAAA,EAAA,GAAAF,CAAA,YAAzBE,EAAyB,EACjC", + "ignoreList": [] +} +``` + +### Eval output +(kind: exception) Fixture not implemented \ No newline at end of file diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/sourcemaps-simple.js b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/sourcemaps-simple.js new file mode 100644 index 0000000000..dd68df6a86 --- /dev/null +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/sourcemaps-simple.js @@ -0,0 +1,4 @@ +// @sourceMaps +export const Button = () => { + return ; +}; diff --git a/compiler/packages/snap/src/compiler.ts b/compiler/packages/snap/src/compiler.ts index 6fce644542..119364deb8 100644 --- a/compiler/packages/snap/src/compiler.ts +++ b/compiler/packages/snap/src/compiler.ts @@ -306,6 +306,7 @@ export type TransformResult = { original: string; forget: string; } | null; + sourceMap: BabelCore.BabelFileResult['map']; }; export async function transformFixtureInput( @@ -331,6 +332,9 @@ export async function transformFixtureInput( // with `cwd`, which is different across machines const virtualFilepath = '/' + filename; + // Check if we should emit source maps in the test fixture + const includeSourceMaps = firstLine.includes('@sourceMaps'); + const presets = language === 'typescript' ? TypescriptEvaluatorPresets @@ -357,6 +361,7 @@ export async function transformFixtureInput( 'babel-plugin-idx', ], sourceType: 'module', + sourceMaps: includeSourceMaps, ast: includeEvaluator, cloneInputAst: includeEvaluator, configFile: false, @@ -447,6 +452,7 @@ export async function transformFixtureInput( forgetOutput, logs: formattedLogs, evaluatorCode, + sourceMap: includeSourceMaps ? forgetResult.map : null, }, }; } diff --git a/compiler/packages/snap/src/reporter.ts b/compiler/packages/snap/src/reporter.ts index 9f7d1d9a50..5839f14650 100644 --- a/compiler/packages/snap/src/reporter.ts +++ b/compiler/packages/snap/src/reporter.ts @@ -5,6 +5,7 @@ * LICENSE file in the root directory of this source tree. */ +import {BabelFileResult} from '@babel/core'; import chalk from 'chalk'; import fs from 'fs'; import invariant from 'invariant'; @@ -24,6 +25,7 @@ export function writeOutputToString( evaluatorOutput: string | null, logs: string | null, errorMessage: string | null, + sourceMap: BabelFileResult['map'] | null, ) { // leading newline intentional let result = ` @@ -42,6 +44,14 @@ ${wrapWithTripleBackticks(compilerOutput, 'javascript')} result += '\n'; } + if (sourceMap != null) { + result += ` +## Source Map + +${wrapWithTripleBackticks(JSON.stringify(sourceMap, null, 2))} +`; + } + if (logs != null) { result += ` ## Logs diff --git a/compiler/packages/snap/src/runner-worker.ts b/compiler/packages/snap/src/runner-worker.ts index a72acf34db..305a0d54aa 100644 --- a/compiler/packages/snap/src/runner-worker.ts +++ b/compiler/packages/snap/src/runner-worker.ts @@ -245,6 +245,7 @@ export async function transformFixture( sproutOutput, compileResult?.logs ?? null, error, + compileResult?.sourceMap ?? null, ); return {