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 {