relay-compiler-language-typescript icon indicating copy to clipboard operation
relay-compiler-language-typescript copied to clipboard

Issue with import of the __generated__

Open smikayel opened this issue 2 years ago • 0 comments

Hi there please help to understand what is going on here ...

I'm trying to use React Relay and getting this error in next js application

error - ./pages/edit/[id].js:23:0
Module not found: Can't resolve '..\..\__generated__\IdEditPageQuery.graphql'
Did you mean './..\..\__generated__\IdEditPageQuery.graphql'?
Requests that should resolve in the current directory need to start with './'.
Requests that start with a name are treated as module requests and resolve within module directories (node_modules).
If changing the source code is not an option there is also a resolve options called 'preferRelative' which tries to resolve these kind of requests in the current directory too.
  21 |
  22 |
> 23 | Edit.query = graphql`
  24 |   query IdEditPageQuery($productId: ID!) {
  25 |     viewer {
  26 |       product(id: $productId) {

also let me attach the part of the code :

// @flow
import React from 'react';
import Box from "@material-ui/core/Box";
import { graphql } from 'react-relay';

import type { IdEditPageQueryResponse } from './../../__generated__/IdEditPageQuery.graphql';

type Props = {
  productId: string;
  ...IdEditPageQueryResponse;
};

function Edit(props: Props) {

  return (
    <Box>
      test
    </Box>
  );
}


Edit.query = graphql`
  query IdEditPageQuery($productId: ID!) {
    viewer {
      product(id: $productId) {
        id
        name
        description
        price
        createdAt
      }
    }
  }
`;


export default Edit;

the error is related to the line Edit.query = graphql so how to fix this error ? why it's happening

also let me attach the _app.js file maybe it's will realted to the this ::

here is the _app.js file

// @flow
import React, { Suspense } from 'react';
import App from 'next/app';
import Head from 'next/head';
import { QueryRenderer } from 'react-relay';
import ThemeProvider from '@material-ui/styles/ThemeProvider';
import CssBaseline from '@material-ui/core/CssBaseline';
import { createIntl, createIntlCache, RawIntlProvider } from 'react-intl';
import type { NextComponentType, NextPageContext } from 'next/next-server/lib/utils'; //eslint-disable-line

import theme from '../lib/theme';
import { initEnvironment, createEnvironment } from '../lib/createEnvironment';
import MainContainer from '../components/MainContainer';

if (!Intl.PluralRules) {
  /* eslint-disable global-require */
  require('@formatjs/intl-pluralrules/polyfill');
  require('@formatjs/intl-pluralrules/locale-data/en');
  require('@formatjs/intl-pluralrules/locale-data/ru');
  require('@formatjs/intl-pluralrules/locale-data/it');
  /* eslint-enable */
}

const cache = createIntlCache();

type InitialProps = {
  Component: NextComponentType<NextPageContext, $FlowFixMe, $FlowFixMe>,
  pageProps: $FlowFixMe,
  locale: string,
  messages: { [key: string]: string; },
  relayData: $FlowFixMe,
  token: string,
  records: $FlowFixMe,
};

type Props = {
  Component: NextComponentType<NextPageContext, $FlowFixMe, $FlowFixMe>,
  ctx: $FlowFixMe,
};

export default class MyApp extends App<InitialProps> {
  static async getInitialProps({ Component, ctx }: Props): $FlowFixMe {
    let pageProps = {};
    // $FlowFixMe[prop-missing]
    if (Component.getInitialProps) {
      // $FlowFixMe[not-a-function]
      pageProps = await Component.getInitialProps(ctx);
    }

    // Get the `locale` and `messages` from the request object on the server.
    // In the browser, use the same values that the server serialized.
    const { req } = ctx;
    let locale = 'en';
    let messages = {};
    if (req) {
      // $FlowFixMe
      const getLang = require('../lib/getLang').default; // eslint-disable-line global-require
      ({ locale, messages } = getLang(req));
    } else if (typeof window !== 'undefined') {
      ({ locale, messages } = window.__NEXT_DATA__.props); // eslint-disable-line no-underscore-dangle
    }

    return { pageProps, locale, messages };
  }

  componentDidMount() {
    // Remove the server-side injected CSS.
    const jssStyles = document.querySelector('#jss-server-side');
    if (jssStyles) {
      if (jssStyles.parentNode) jssStyles.parentNode.removeChild(jssStyles);
    }
  }

  render(): React$Node {
    const {
      // $FlowFixMe[incompatible-use]
      Component,
      pageProps,
      locale,
      messages,
      relayData,
      token,
      records,
    } = this.props;
    const intl = createIntl(
      {
        locale,
        messages,
      },
      cache,
    );

    if (!Component.query) {
      return <Component {...pageProps} locale={locale} />
    }

    const environment = createEnvironment(
      {
        relayData,
        records,
      },
      JSON.stringify({
        queryID: Component.query.params.name,
        variables: pageProps.variables || {},
      }),
    );

    return (
      <RawIntlProvider value={intl}>
        <Head>
          <meta charSet="utf-8" />
          <title>Products</title>
          <meta
            name="viewport"
            content="minimum-scale=1, initial-scale=1, width=device-width, shrink-to-fit=no"
          />
        </Head>
        <ThemeProvider theme={theme}>
          <CssBaseline />
          <QueryRenderer
            environment={environment}
            query={Component.query}
            variables={pageProps.variables}
            render={(params) => {
              const { error, props } = params;
              if (props && props.viewer) {

                return (
                  <Suspense fallback={null}>
                    <Component {...pageProps} environment={environment} {...props} locale={locale} />
                  </Suspense>
                );
              }

              if (error) {
                return "Error!";
              }
              return "Loading...";
            }}
          />
        </ThemeProvider>
      </RawIntlProvider>
    );
  }
}

P.S. also let me mention that I have index.js page which is working correct without issues here is code from index.js file

// @flow
import React, { Component } from 'react';
import { graphql } from 'react-relay';

import Box from "@material-ui/core/Box";
import { Button, Link } from '@material-ui/core';
import Typography from "@material-ui/core/Typography";
import ProductCard from "../components/ProductCard";
import type { pages_indexQueryResponse } from '../__generated__/pages_indexQuery.graphql';

type Props = {
  ...pages_indexQueryResponse;
};

function Index(props: Props) {
  return (
    <Box>
      <Box display="flex" alignItems="center" justifyContent="center" m={4}>
        <Typography variant="h1">
          Products
        </Typography>
      </Box>
      <Box display="flex" alignItems="center" justifyContent="center" m={4}>
        <Link href="/create">
          whant to create new product ? 
        </Link>
      </Box>
      <Box display="flex" flexWrap="wrap">
        {props.viewer.products.map(product => (
          <Link href={`/edit/${product.id}`} underline="none" key={product.id}>
            <ProductCard key={product.id} product={product} />
          </Link>
          
        ))}
      </Box>
    </Box>
  );
}

Index.query = graphql`
  query pages_indexQuery {
    viewer {
      products {
        id
        name
        description
        price
        createdAt
      }
    }
  }
`;

export default Index;

smikayel avatar Aug 21 '23 23:08 smikayel