diff --git a/.changeset/stupid-doors-open.md b/.changeset/stupid-doors-open.md new file mode 100644 index 00000000..476d28da --- /dev/null +++ b/.changeset/stupid-doors-open.md @@ -0,0 +1,5 @@ +--- +'@tanstack/devtools-vite': patch +--- + +fix issue with sourcemaps and vite plugin diff --git a/.gitignore b/.gitignore index c161882e..4121b416 100644 --- a/.gitignore +++ b/.gitignore @@ -56,3 +56,4 @@ vite.config.ts.timestamp-* .angular .nitro +.sonda \ No newline at end of file diff --git a/docs/vite-plugin.md b/docs/vite-plugin.md index 75d22bd2..c41175b2 100644 --- a/docs/vite-plugin.md +++ b/docs/vite-plugin.md @@ -134,6 +134,22 @@ export default { } ``` +### logging + Whether to log information to the console. Defaults to true. + +```ts +import { devtools } from '@tanstack/devtools-vite' + +export default { + plugins: [ + devtools({ + logging: true + }), + // ... rest of your plugins here + ], +} +``` + ### injectSource Configuration for source injection. Defaults to enabled. diff --git a/examples/react/basic/package.json b/examples/react/basic/package.json index ef495c0c..bda592ed 100644 --- a/examples/react/basic/package.json +++ b/examples/react/basic/package.json @@ -25,6 +25,7 @@ "@types/react": "^19.1.12", "@types/react-dom": "^19.1.2", "@vitejs/plugin-react": "^4.5.2", + "sonda": "0.9.0", "vite": "^7.0.6", "vite-plugin-inspect": "11.3.2" }, diff --git a/examples/react/basic/vite.config.ts b/examples/react/basic/vite.config.ts index 5ea9c49a..f4d37d0d 100644 --- a/examples/react/basic/vite.config.ts +++ b/examples/react/basic/vite.config.ts @@ -2,6 +2,7 @@ import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import { devtools } from '@tanstack/devtools-vite' import Inspect from 'vite-plugin-inspect' +import sonda from 'sonda/vite' // https://vite.dev/config/ export default defineConfig({ @@ -10,10 +11,14 @@ export default defineConfig({ removeDevtoolsOnBuild: true, }), Inspect(), + sonda(), react({ // babel: { // plugins: [['babel-plugin-react-compiler', { target: '19' }]], // }, }), ], + build: { + sourcemap: true, + }, }) diff --git a/packages/devtools-vite/src/enhance-logs.test.ts b/packages/devtools-vite/src/enhance-logs.test.ts index 3aeeb190..4e9be263 100644 --- a/packages/devtools-vite/src/enhance-logs.test.ts +++ b/packages/devtools-vite/src/enhance-logs.test.ts @@ -14,7 +14,7 @@ describe('remove-devtools', () => { `, 'test.jsx', 3000, - ).code, + )!.code, ) expect( output.includes( @@ -26,96 +26,62 @@ describe('remove-devtools', () => { }) test('it does not add enhanced console.logs to console.log that is not called', () => { - const output = removeEmptySpace( - enhanceConsoleLog( - ` + const output = enhanceConsoleLog( + ` console.log `, - 'test.jsx', - 3000, - ).code, - ) - expect(output).toBe( - removeEmptySpace(` - console.log - `), + 'test.jsx', + 3000, ) + expect(output).toBe(undefined) }) test('it does not add enhanced console.logs to console.log that is inside a comment', () => { - const output = removeEmptySpace( - enhanceConsoleLog( - ` + const output = enhanceConsoleLog( + ` // console.log('This is a log') `, - 'test.jsx', - 3000, - ).code, - ) - expect(output).toBe( - removeEmptySpace(` - // console.log('This is a log') - `), + 'test.jsx', + 3000, ) + expect(output).toBe(undefined) }) test('it does not add enhanced console.logs to console.log that is inside a multiline comment', () => { - const output = removeEmptySpace( - enhanceConsoleLog( - ` + const output = enhanceConsoleLog( + ` /* console.log('This is a log') */ `, - 'test.jsx', - 3000, - ).code, - ) - expect(output).toBe( - removeEmptySpace(` - /* - console.log('This is a log') - */ - `), + 'test.jsx', + 3000, ) + expect(output).toBe(undefined) }) test('it does not add enhanced console.error to console.error that is inside a comment', () => { - const output = removeEmptySpace( - enhanceConsoleLog( - ` + const output = enhanceConsoleLog( + ` // console.error('This is a log') `, - 'test.jsx', - 3000, - ).code, - ) - expect(output).toBe( - removeEmptySpace(` - // console.error('This is a log') - `), + 'test.jsx', + 3000, ) + expect(output).toBe(undefined) }) test('it does not add enhanced console.error to console.error that is inside a multiline comment', () => { - const output = removeEmptySpace( - enhanceConsoleLog( - ` + const output = enhanceConsoleLog( + ` /* console.error('This is a log') */ `, - 'test.jsx', - 3000, - ).code, - ) - expect(output).toBe( - removeEmptySpace(` - /* - console.error('This is a log') - */ - `), + 'test.jsx', + 3000, ) + expect(output).toBe(undefined) }) test('it adds enhanced console.error to console.error()', () => { @@ -126,7 +92,7 @@ describe('remove-devtools', () => { `, 'test.jsx', 3000, - ).code, + )!.code, ) console.log('output', output) expect( @@ -139,19 +105,13 @@ describe('remove-devtools', () => { }) test('it does not add enhanced console.error to console.error that is not called', () => { - const output = removeEmptySpace( - enhanceConsoleLog( - ` + const output = enhanceConsoleLog( + ` console.log `, - 'test.jsx', - 3000, - ).code, - ) - expect(output).toBe( - removeEmptySpace(` - console.log - `), + 'test.jsx', + 3000, ) + expect(output).toBe(undefined) }) }) diff --git a/packages/devtools-vite/src/enhance-logs.ts b/packages/devtools-vite/src/enhance-logs.ts index 0e30cf73..d0d2aee6 100644 --- a/packages/devtools-vite/src/enhance-logs.ts +++ b/packages/devtools-vite/src/enhance-logs.ts @@ -56,7 +56,7 @@ export function enhanceConsoleLog(code: string, id: string, port: number) { }) const didTransform = transform(ast, location, port) if (!didTransform) { - return { code } + return } return gen(ast, { sourceMaps: true, @@ -65,6 +65,6 @@ export function enhanceConsoleLog(code: string, id: string, port: number) { sourceFileName: filePath, }) } catch (e) { - return { code } + return } } diff --git a/packages/devtools-vite/src/inject-source.test.ts b/packages/devtools-vite/src/inject-source.test.ts index fd6134f8..d8c8d55c 100644 --- a/packages/devtools-vite/src/inject-source.test.ts +++ b/packages/devtools-vite/src/inject-source.test.ts @@ -7,62 +7,38 @@ const removeEmptySpace = (str: string) => { describe('inject source', () => { it("shouldn't augment react fragments", () => { - const output = removeEmptySpace( - addSourceToJsx( - ` + const output = addSourceToJsx( + ` export const Route = createFileRoute("/test")({ component: function() { return <>Hello World }, }) `, - 'test.jsx', - ).code, - ) - expect(output).toBe( - removeEmptySpace(` - export const Route = createFileRoute("/test")({ - component: function() { return <>Hello World }, - }) - `), + 'test.jsx', ) + expect(output).toBe(undefined) }) it("shouldn't augment react fragments if they start with Fragment ", () => { - const output = removeEmptySpace( - addSourceToJsx( - ` + const output = addSourceToJsx( + ` export const Route = createFileRoute("/test")({ component: function() { return Hello World }, }) `, - 'test.jsx', - ).code, - ) - expect(output).toBe( - removeEmptySpace(` - export const Route = createFileRoute("/test")({ - component: function() { return Hello World }, - }) - `), + 'test.jsx', ) + expect(output).toBe(undefined) }) it("shouldn't augment react fragments if they start with React.Fragment ", () => { - const output = removeEmptySpace( - addSourceToJsx( - ` + const output = addSourceToJsx( + ` export const Route = createFileRoute("/test")({ component: function() { return Hello World }, }) `, - 'test.jsx', - ).code, - ) - expect(output).toBe( - removeEmptySpace(` - export const Route = createFileRoute("/test")({ - component: function() { return Hello World }, - }) - `), + 'test.jsx', ) + expect(output).toBe(undefined) }) describe('FunctionExpression', () => { it('should work with deeply nested custom JSX syntax', () => { @@ -74,7 +50,7 @@ describe('inject source', () => { }) `, 'test.jsx', - ).code, + )!.code, ) expect(output).toBe( removeEmptySpace(` @@ -86,63 +62,39 @@ describe('inject source', () => { }) it('should work with props not destructured and spread', () => { - const output = removeEmptySpace( - addSourceToJsx( - ` + const output = addSourceToJsx( + ` export const Route = createFileRoute("/test")({ component: function(props) { return
Hello World
}, }) `, - 'test.jsx', - ).code, - ) - expect(output).toBe( - removeEmptySpace(` - export const Route = createFileRoute("/test")({ - component: function(props) { return
Hello World
}, - }) - `), + 'test.jsx', ) + expect(output).toBe(undefined) }) it('should work with props destructured and spread', () => { - const output = removeEmptySpace( - addSourceToJsx( - ` + const output = addSourceToJsx( + ` export const Route = createFileRoute("/test")({ component: function({...props}) { return
Hello World
}, }) `, - 'test.jsx', - ).code, - ) - expect(output).toBe( - removeEmptySpace(` - export const Route = createFileRoute("/test")({ - component: function({...props}) { return
Hello World
}, - }) - `), + 'test.jsx', ) + expect(output).toBe(undefined) }) it('should work with props destructured and spread with a different name', () => { - const output = removeEmptySpace( - addSourceToJsx( - ` + const output = addSourceToJsx( + ` export const Route = createFileRoute("/test")({ component: function({...rest}) { return
Hello World
}, }) `, - 'test.jsx', - ).code, - ) - expect(output).toBe( - removeEmptySpace(` - export const Route = createFileRoute("/test")({ - component: function({...rest}) { return
Hello World
}, - }) - `), + 'test.jsx', ) + expect(output).toBe(undefined) }) it('should work with props spread and other normal elements', () => { @@ -154,7 +106,7 @@ describe('inject source', () => { }) `, 'test.jsx', - ).code, + )!.code, ) expect(output).toBe( removeEmptySpace(` @@ -176,7 +128,7 @@ describe('inject source', () => { }) `, 'test.jsx', - ).code, + )!.code, ) expect(output).toBe( removeEmptySpace(` @@ -188,63 +140,39 @@ describe('inject source', () => { }) it('should work with props not destructured and spread', () => { - const output = removeEmptySpace( - addSourceToJsx( - ` + const output = addSourceToJsx( + ` export const Route = createFileRoute("/test")({ component: (props) =>
Hello World
, }) `, - 'test.jsx', - ).code, - ) - expect(output).toBe( - removeEmptySpace(` - export const Route = createFileRoute("/test")({ - component: (props) =>
Hello World
, - }) - `), + 'test.jsx', ) + expect(output).toBe(undefined) }) it('should work with props destructured and spread', () => { - const output = removeEmptySpace( - addSourceToJsx( - ` + const output = addSourceToJsx( + ` export const Route = createFileRoute("/test")({ component: ({...props}) =>
Hello World
, }) `, - 'test.jsx', - ).code, - ) - expect(output).toBe( - removeEmptySpace(` - export const Route = createFileRoute("/test")({ - component: ({...props}) =>
Hello World
, - }) - `), + 'test.jsx', ) + expect(output).toBe(undefined) }) it('should work with props destructured and spread with a different name', () => { - const output = removeEmptySpace( - addSourceToJsx( - ` + const output = addSourceToJsx( + ` export const Route = createFileRoute("/test")({ component: ({...rest}) =>
Hello World
, }) `, - 'test.jsx', - ).code, - ) - expect(output).toBe( - removeEmptySpace(` - export const Route = createFileRoute("/test")({ - component: ({...rest}) =>
Hello World
, - }) - `), + 'test.jsx', ) + expect(output).toBe(undefined) }) it('should work with props spread and other normal elements', () => { @@ -256,7 +184,7 @@ describe('inject source', () => { }) `, 'test.jsx', - ).code, + )!.code, ) expect(output).toBe( removeEmptySpace(` @@ -280,7 +208,7 @@ describe('inject source', () => { } `, 'test.jsx', - ).code, + )!.code, ) expect(output).toBe( removeEmptySpace(` @@ -305,7 +233,7 @@ function test({...props }) { } `, 'test.tsx', - ).code, + )!.code, ) expect(output).toBe( removeEmptySpace(` @@ -325,7 +253,7 @@ function test({...props }) { } `, 'test.jsx', - ).code, + )!.code, ) expect(output).toBe( removeEmptySpace(` @@ -337,23 +265,15 @@ function test(props) { }) it("doesn't transform when props are spread across the element", () => { - const output = removeEmptySpace( - addSourceToJsx( - ` + const output = addSourceToJsx( + ` function test(props) { return