tRPC Client webpack error

Mmugeenn12/13/2022
As soon as I add the client part to my legacy app i get an error and Can't figure out what is wrong.

Version: webpack 4.35.3
...
ERROR in ./node_modules/.pnpm/@trpc+react-query@10.5.0_d022380f8796fe4307eb66404abcd925/node_modules/@trpc/react-query/dist/createHooksInternal-808efaa7.mjs 127:13
Module parse failed: Unexpected token (127:13)
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
|         path,
|         input,
>         opts?.trpc
|     ];
| }
 @ ./node_modules/.pnpm/@trpc+react-query@10.5.0_d022380f8796fe4307eb66404abcd925/node_modules/@trpc/react-query/dist/index.mjs 4:0-144 17:27-53 26:15-41 30:18-37 39:17-36
 @ ./src/universal/TrpcWrapper.tsx
 @ ./src/renderer.js
 @ ./src/client/index.js

ERROR in ./node_modules/.pnpm/@trpc+client@10.5.0_@trpc+server@10.5.0/node_modules/@trpc/client/dist/index.js 33:24
Module parse failed: Unexpected token (33:24)
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
|         const { promise , abort  } = observable.observableToPromise(req$);
|         const abortablePromise = new Promise((resolve, reject)=>{
>             opts.signal?.addEventListener('abort', abort);
|             promise.then((envelope)=>{
|                 resolve(envelope.result.data);
 @ ./node_modules/.pnpm/@trpc+react-query@10.5.0_d022380f8796fe4307eb66404abcd925/node_modules/@trpc/react-query/dist/index.mjs 1:0-29 1:0-29
 @ ./src/universal/TrpcWrapper.tsx
 @ ./src/renderer.js
 @ ./src/client/index.js
ℹ 「wdm」: Failed to compile.
Mmugeenn12/13/2022
As soon as I add the wrapper it crashes
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { httpBatchLink, loggerLink } from '@trpc/react-query'
import React, { useState } from 'react'
import superjson from 'superjson'
import { trpc } from './trpc'

const getBaseUrl = () => {
  if (typeof window !== 'undefined') return '' // browser should use relative url
  return `http://localhost:${process.env.PORT ?? 3000}` // dev SSR should use localhost
}

export const TrpcWrapper: React.FC = ({ children }) => {
  const [queryClient] = useState(() => new QueryClient())
  const [client] = useState(() =>
    trpc.createClient({
      transformer: superjson,
      links: [
        loggerLink({
          enabled: (opts) =>
            process.env.NODE_ENV === 'development' ||
            (opts.direction === 'down' && opts.result instanceof Error),
        }),
        httpBatchLink({
          url: `${getBaseUrl()}/trpc`,
        }),
      ],
    }),
  )

  // todo  CONTEXT SHARING?      <QueryClientProvider client={queryClient} contextSharing>
  return (
    <trpc.Provider client={client} queryClient={queryClient}>
      <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
    </trpc.Provider>
  )
}


// trpc.ts
import { createTRPCReact } from '@trpc/react-query'
import type { AppRouter } from '../server/trpc/router'

export const trpc = createTRPCReact<AppRouter>({})
A/Kalex / KATT12/13/2022
hmmmmmmmmm it might be that the compiled output is too "modern"?
A/Kalex / KATT12/13/2022
it looks like it's complaining about that optional chaining line
A/Kalex / KATT12/13/2022
interesting
A/Kalex / KATT12/13/2022
looking at the compiled output it seems like we're not transpiling optional chaining but we are transpiling i.e. async/await (which I think is an older feature in browsers?)
A/Kalex / KATT12/13/2022
@julius this feels like your territory. we used to use babel for this stuff - do you think we need to do anything here?
A/Kalex / KATT12/13/2022
it seems like all environments are extending this tsconfig (https://github.com/trpc/trpc/blob/main/tsconfig.build.json) but i think we might need some lower compile target for browser-facing stuff?
Mmarminge12/13/2022
if this is a monorepo with nextjs you should use next-transpile-packages or the experimental option in next13
Mmarminge12/13/2022
you get that loader error if you dont do that
Mmarminge12/13/2022
not sure if this is the same scenario though
Mmarminge12/13/2022
oh wait it complains about some file within trpc 🤔
Mmarminge12/13/2022
is it the optional chaining then which doesn't work for legacy stuff?
Mmarminge12/13/2022
do we care about that? like isn't that pretty old stuff?
A/Kalex / KATT12/13/2022
i think we should, one of the superpowers of trpc is that you can add it to legacy project and incrementally migrate
A/Kalex / KATT12/13/2022
https://caniuse.com/?search=Proxy
https://caniuse.com/?search=nullish%20coalescing

Proxy is a must for trpc to work but we should probably do something that does the nullish coalescing etc
A/Kalex / KATT12/13/2022
i'm perplexed that it rewrites async/await (https://caniuse.com/async-functions) but not nullish coal
Mmarminge12/13/2022
we could rewrite this row to be
if (opts.signal) opts.signal.addEventListener('abort', abort);
😉
Mmarminge12/13/2022
if thats the only place
Mmarminge12/13/2022
nullish seems to have come a tad bit later than async
Mmarminge12/13/2022
is it just a target in the tsconfig or do we need babel stuff?
A/Kalex / KATT12/13/2022
i'm having a play with it now...
Mmarminge12/13/2022
cool, im still fighting with my bloody matrix.........
A/Kalex / KATT12/13/2022
seems like i can't do it easily

@Mugetsu can you have a look at https://stackoverflow.com/questions/58813176/webpack-cant-compile-ts-3-7-optional-chaining-nullish-coalescing?

what version of webpack/babel are you using?
Mmugeenn12/14/2022
@alex / KATT
"webpack": "4.35.3",
 "@babel/runtime": "7.16.3",
 "@babel/cli": "7.5.0",
 "@babel/core": "7.5.0",


Solution from the stackoverflow you linked didn't help.
I do have already
"@babel/plugin-proposal-nullish-coalescing-operator",
"@babel/plugin-proposal-optional-chaining",

In my babelrc

But thanks to this link I was able to track this a bit and found this
https://github.com/webpack/webpack/issues/10227
Which worked.
I've added this to package.json and webpack compiled successfully.
  "pnpm": {
    "overrides": {
      "acorn": "npm:acorn@8.8.1"
    }
  },


Now I have a different problem as when I want to use the query it complains
>QueryClientProvider.js:58 Uncaught Error: No QueryClient set, use QueryClientProvider to set one

Dunno why is this happening. I've wrapped my whole app within the TrpcWrapper from above
https://discord.com/channels/867764511159091230/1052253855884263484/1052254812185563166
and it still complain.
A/Kalex / KATT12/14/2022
if it's a monorepo, this might come that you have multiple versions of tanstack query installed
Mmugeenn12/14/2022
I had tanstack query installed prior trpc. But I dont see why it would happen? I installed fresh newest version of tanstack. I expect that this would run two separate instances of ReactQuery and work? My raw reactquery works but trpc complains.

import { Provider } from 'react-redux'
import { Router, RouterContext } from 'react-router'
import { renderToString } from 'react-dom/server'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
import { TrpcWrapper } from './universal/TrpcWrapper'

const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      refetchOnWindowFocus: false,
      staleTime: 5 * 1000, // seconds
      useErrorBoundary: true,
    },
  },
})

export const renderServer = (store, props, sheet) => {
  const RootComponent = ( // eslint-disable-line no-extra-parens
    <Provider store={store}>
      <TrpcWrapper>
        <QueryClientProvider client={queryClient}>
          {/* eslint-disable-next-line react/jsx-props-no-spreading */}
          <RouterContext {...props} />
        </QueryClientProvider>
      </TrpcWrapper>
    </Provider>
  )

  return renderToString(sheet.collectStyles(RootComponent))
}

export const renderClient = (store, routes, history) => {
  const RootComponent = ( // eslint-disable-line no-extra-parens
    <Provider store={store}>
      <TrpcWrapper>
        <QueryClientProvider client={queryClient}>
          <Router history={history} routes={routes} />
          <ReactQueryDevtools />
        </QueryClientProvider>
      </TrpcWrapper>
    </Provider>
  )

  return ReactDOM.render(RootComponent, document.getElementById('main')) // eslint-disable-line react/no-render-return-value
}
Mmugeenn12/14/2022
I've tried clean setup with trpc with commits before I introduced raw tanstack query and its the same behaviour.
No QueryClient set, use QueryClientProvider to set one @alex / KATT is there anything more you could recommend I could check what could be the issue here?
A/Kalex / KATT12/14/2022
I think it is that you need to have the QueryClientProvider further up the tree than the trpc initialization
A/Kalex / KATT12/14/2022
hmm
A/Kalex / KATT12/14/2022
nooo, that can't be it
A/Kalex / KATT12/14/2022
well in the code above you have two query client providers, it might be that?
Mmugeenn12/14/2022
I've checked that and It doesn't seem this is the issue
Mmugeenn12/14/2022
Dunno what I miss here... QueryClientProvider is there why it complains for god sake 😭
A/Kalex / KATT12/14/2022
does it complain when you add a query or mutation?
Mmugeenn12/14/2022
query havent checked mutation
Ccloudfox12/14/2022
we purposefully transpile to whatever node 14 supports (I think es2020)
Mmugeenn12/14/2022
@alex / KATT This solved the problem. But why I would need to do this ??
https://github.com/TanStack/query/discussions/4619
Ccloudfox12/14/2022
we can lower that target if you want @alex / KATT
A/Kalex / KATT12/14/2022
if tsconfig is enough, that's great, i played around briefly yday and couldn't get tsconfig to transpile optional chains
A/Kalex / KATT12/14/2022
are you sure you don't have several react-query in node_modules?
Ccloudfox12/14/2022
I think there's a way to set it so it uses the tsconfig target
Mmugeenn12/14/2022
Im pretty sure. How I verify that?
Mmugeenn12/14/2022
I guess this should be okay? Having two react-query. One from tanstack and second from trpc ??
Ccloudfox12/14/2022
@Mugetsuis it a must for you to be on webpack 4 (i.e. it's too hard to move off of it)?
A/Kalex / KATT12/14/2022
That looks fine
Mmugeenn12/15/2022
@sachin I tried but the dependency chain in this legacy app (more than 3 yrs oldd) is a nightmare and overwhelm me with upgrade try. I might try again. But Anyway i was able to successfuly run trpc with the found workarounds
A/Kalex / KATT12/15/2022
great!!
HHussam1/6/2023
Hey, can you say me more about this.

I am running into this problem , I'm using turborepo with next13

../../packages/trpc/utils/trpc.ts
Module parse failed: Unexpected token (3:12)
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders

> import type { AppRouter } from '../server/routers/_app';
HHussam1/6/2023
got it thanks.