Mirror: The highly customizable and versatile GraphQL client with which you add on features like normalized caching as you grow.

major(next): support Next 13 and React Server Components (#3214)

Co-authored-by: Phil Pluckthun <phil@kitten.sh>

+9
.changeset/generated-one-myself.md
···
+
---
+
'@urql/next': major
+
---
+
+
Create `@urql/next` which is a package meant to support Next 13 and
+
the React 18 features contained within.
+
+
For server components we have `@urql/next/rsc` and for client components
+
just `@urql/next`.
+153 -7
docs/advanced/server-side-rendering.md
···
## Next.js
If you're using [Next.js](https://nextjs.org/) you can save yourself a lot of work by using
-
`next-urql`. The `next-urql` package includes setup for `react-ssr-prepass` already, which automates
-
a lot of the complexity of setting up server-side rendering with `urql`.
-
-
We have a custom integration with [`Next.js`](https://nextjs.org/), being [`next-urql`](https://github.com/urql-graphql/urql/tree/main/packages/next-urql)
-
this integration contains convenience methods specifically for `Next.js`.
-
These will simplify the above setup for SSR.
+
`@urql/next`. The `@urql/next` package is set to work with Next 13.
-
To set up `next-urql`, first we'll install `next-urql` with `react-is` and `urql` as
+
To set up `@urql/next`, first we'll install `@urql/next` and `urql` as
peer dependencies:
+
+
```sh
+
yarn add @urql/next urql graphql
+
# or
+
npm install --save @urql/next urql graphql
+
```
+
+
We now have two ways to leverage `@urql/next`, one being part of a Server component
+
or being part of the general `app/` folder.
+
+
In a server component we will import from `@urql/next/rsc`
+
+
```ts
+
// app/page.tsx
+
import React from 'react';
+
import Head from 'next/head';
+
import { cacheExchange, createClient, fetchExchange, gql } from '@urql/core';
+
import { registerUrql } from '@urql/next/rsc';
+
+
const makeClient = () => {
+
return createClient({
+
url: 'https://trygql.formidable.dev/graphql/basic-pokedex',
+
exchanges: [cacheExchange, fetchExchange],
+
});
+
};
+
+
const { getClient } = registerUrql(makeClient);
+
+
export default async function Home() {
+
const result = await getClient().query(PokemonsQuery, {});
+
return (
+
<main>
+
<h1>This is rendered as part of an RSC</h1>
+
<ul>
+
{result.data.pokemons.map((x: any) => (
+
<li key={x.id}>{x.name}</li>
+
))}
+
</ul>
+
</main>
+
);
+
}
+
```
+
+
When we aren't leveraging server components we will import the things we will
+
need to do a bit more setup, we go to the `client` component's layout file and
+
structure it as the following.
+
+
```tsx
+
// app/client/layout.tsx
+
'use client';
+
+
import { UrqlProvider, ssrExchange, cacheExchange, fetchExchange, createClient } from '@urql/next';
+
+
const ssr = ssrExchange();
+
const client = createClient({
+
url: 'https://trygql.formidable.dev/graphql/web-collections',
+
exchanges: [cacheExchange, ssr, fetchExchange],
+
});
+
+
export default function Layout({ children }: React.PropsWithChildren) {
+
return (
+
<UrqlProvider client={client} ssr={ssr}>
+
{children}
+
</UrqlProvider>
+
);
+
}
+
```
+
+
It is important that we pas both a client as well as the `ssrExchange` to the `Provider`
+
this way we will be able to restore the data that Next streams to the client later on
+
when we are hydrating.
+
+
The next step is to query data in your client components by means of the `useQuery`
+
method defined in `@urql/next`.
+
+
```tsx
+
// app/client/page.tsx
+
'use client';
+
+
import Link from 'next/link';
+
import { Suspense } from 'react';
+
import { useQuery, gql } from '@urql/next';
+
+
export default function Page() {
+
return (
+
<Suspense>
+
<Pokemons />
+
</Suspense>
+
);
+
}
+
+
const PokemonsQuery = gql`
+
query {
+
pokemons(limit: 10) {
+
id
+
name
+
}
+
}
+
`;
+
+
function Pokemons() {
+
const [result] = useQuery({ query: PokemonsQuery });
+
return (
+
<main>
+
<h1>This is rendered as part of SSR</h1>
+
<ul>
+
{result.data.pokemons.map((x: any) => (
+
<li key={x.id}>{x.name}</li>
+
))}
+
</ul>
+
</main>
+
);
+
}
+
```
+
+
The data queried in the above component will be rendered on the server
+
and re-hydrated back on the client. When using multiple Suspense boundaries
+
these will also get flushed as they complete and re-hydrated.
+
+
> When data is used throughout the application we advise against
+
> rendering this as part of a server-component so you can benefit
+
> from the client-side cache.
+
+
### Invalidating data from a server-component
+
+
When data is rendered by a server component but you dispatch a mutation
+
from a client component the server won't automatically know that the
+
server-component on the client needs refreshing. You can forcefully
+
tell the server to do so by using the Next router and calling `.refresh()`.
+
+
```tsx
+
import { useRouter } from 'next/router';
+
+
const Todo = () => {
+
const router = useRouter();
+
const executeMutation = async () => {
+
await updateTodo();
+
router.refresh();
+
};
+
};
+
```
+
+
### Disabling RSC fetch caching
+
+
You can pass `fetchOptions: { cache: "no-store" }` to the `createClient`
+
constructor to avoid running into cached fetches with server-components.
+
+
## Legacy Next.js (pages)
+
+
If you're using [Next.js](https://nextjs.org/) with the classic `pages` you can instead use `next-urql`.
+
To set up `next-urql`, first we'll install `next-urql` with `react-is` and `urql` as peer dependencies:
```sh
yarn add next-urql react-is urql graphql
-47
examples/with-next/README.md
···
npm install
npm run start
```
-
-
## getInitialProps
-
-
This is the output you'll get when you're using `{ ssr: true }`, this way urql will try to automate
-
as much for you as it possibly can by using a [`prepass`](https://github.com/FormidableLabs/react-ssr-prepass)
-
this means that every `useQuery` used in your virtual-dom will be ran, the data will be collected on the server
-
and hydrated on the client.
-
-
> NOTE: to reduce performance complexities try to keep this to top-level renders as this can amount to waterfalls.
-
-
## getStaticProps
-
-
This requires some manual work, when we look at [`static.js`](./pages/static.js) we can see that we define our own
-
`getStaticProps` method, this because these methods are only `user-facing`. When doing a `yarn next build` we'll need to
-
ensure that the server we're targetting is running so we can successfully execute the static prerender.
-
-
## getServerSideProps
-
-
This requires some manual work, when we look at [`server.js`](./pages/server.js) we can see that we define our own
-
`getServerSideProps` method, this because these methods are only `user-facing`.
-
-
## Output
-
-
We can see that our `/` and `/server` routes are rendered on the server and `/static` is statically prerendered.
-
-
```
-
Page Size First Load JS
-
┌ λ / 4.98 kB 90 kB
-
├ /_app 0 B 85 kB
-
├ ○ /404 3.46 kB 88.5 kB
-
├ λ /api/graphql 0 B 85 kB
-
├ λ /server 878 B 85.9 kB
-
└ ● /static 895 B 85.9 kB
-
+ First Load JS shared by all 85 kB
-
├ chunks/d8c192fcf6e34535672c13f111ef41e3832b265d.d03071.js 17.4 kB
-
├ chunks/f6078781a05fe1bcb0902d23dbbb2662c8d200b3.6a2b27.js 13.3 kB
-
├ chunks/framework.4b1bec.js 41.8 kB
-
├ chunks/main.3d1d43.js 7.14 kB
-
├ chunks/pages/_app.92bde8.js 4.68 kB
-
└ chunks/webpack.50bee0.js 751 B
-
-
-
λ (Server) server-side renders at runtime (uses getInitialProps or getServerSideProps)
-
○ (Static) automatically rendered as static HTML (uses no initial props)
-
● (SSG) automatically generated as static HTML + JSON (uses getStaticProps)
-
(ISR) incremental static regeneration (uses revalidate in getStaticProps)
-
```
+16
examples/with-next/app/layout.tsx
···
+
export const metadata = {
+
title: 'Create Next App',
+
description: 'Generated by create next app',
+
};
+
+
export default function RootLayout({
+
children,
+
}: {
+
children: React.ReactNode;
+
}) {
+
return (
+
<html lang="en">
+
<body>{children}</body>
+
</html>
+
);
+
}
+24
examples/with-next/app/non-rsc/layout.tsx
···
+
'use client';
+
+
import {
+
UrqlProvider,
+
ssrExchange,
+
cacheExchange,
+
fetchExchange,
+
createClient,
+
} from '@urql/next';
+
+
const ssr = ssrExchange();
+
const client = createClient({
+
url: 'https://graphql-pokeapi.graphcdn.app/',
+
exchanges: [cacheExchange, ssr, fetchExchange],
+
suspense: true,
+
});
+
+
export default function Layout({ children }: React.PropsWithChildren) {
+
return (
+
<UrqlProvider client={client} ssr={ssr}>
+
{children}
+
</UrqlProvider>
+
);
+
}
+65
examples/with-next/app/non-rsc/page.tsx
···
+
'use client';
+
+
import Link from 'next/link';
+
import { Suspense } from 'react';
+
import { useQuery, gql } from '@urql/next';
+
+
export default function Page() {
+
return (
+
<Suspense>
+
<Pokemons />
+
</Suspense>
+
);
+
}
+
+
const PokemonsQuery = gql`
+
query {
+
pokemons(limit: 10) {
+
results {
+
id
+
name
+
}
+
}
+
}
+
`;
+
+
function Pokemons() {
+
const [result] = useQuery({ query: PokemonsQuery });
+
return (
+
<main>
+
<h1>This is rendered as part of SSR</h1>
+
<ul>
+
{result.data
+
? result.data.pokemons.results.map((x: any) => (
+
<li key={x.id}>{x.name}</li>
+
))
+
: JSON.stringify(result.error)}
+
</ul>
+
<Suspense>
+
<Pokemon name="bulbasaur" />
+
</Suspense>
+
<Link href="/">RSC</Link>
+
</main>
+
);
+
}
+
+
const PokemonQuery = gql`
+
query ($name: String!) {
+
pokemon(name: $name) {
+
id
+
name
+
}
+
}
+
`;
+
+
function Pokemon(props: any) {
+
const [result] = useQuery({
+
query: PokemonQuery,
+
variables: { name: props.name },
+
});
+
return (
+
<div>
+
<h1>{result.data && result.data.pokemon.name}</h1>
+
</div>
+
);
+
}
+40
examples/with-next/app/page.tsx
···
+
import Link from 'next/link';
+
import { cacheExchange, createClient, fetchExchange, gql } from '@urql/core';
+
import { registerUrql } from '@urql/next/rsc';
+
+
const makeClient = () => {
+
return createClient({
+
url: 'https://graphql-pokeapi.graphcdn.app/',
+
exchanges: [cacheExchange, fetchExchange],
+
});
+
};
+
+
const { getClient } = registerUrql(makeClient);
+
+
const PokemonsQuery = gql`
+
query {
+
pokemons(limit: 10) {
+
results {
+
id
+
name
+
}
+
}
+
}
+
`;
+
+
export default async function Home() {
+
const result = await getClient().query(PokemonsQuery, {});
+
return (
+
<main>
+
<h1>This is rendered as part of an RSC</h1>
+
<ul>
+
{result.data
+
? result.data.pokemons.results.map((x: any) => (
+
<li key={x.id}>{x.name}</li>
+
))
+
: JSON.stringify(result.error)}
+
</ul>
+
<Link href="/non-rsc">Non RSC</Link>
+
</main>
+
);
+
}
+5
examples/with-next/next-env.d.ts
···
+
/// <reference types="next" />
+
/// <reference types="next/image-types/global" />
+
+
// NOTE: This file should not be edited
+
// see https://nextjs.org/docs/basic-features/typescript for more information.
+5 -2
examples/with-next/package.json
···
"private": true,
"dependencies": {
"@urql/core": "^4.0.11",
+
"@urql/next": "^1.0.0-beta.2",
"graphql": "^16.6.0",
-
"next": "13.2.4",
-
"next-urql": "^5.0.2",
+
"next": "13.4.2",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"urql": "^4.0.4"
···
"dev": "next dev",
"start": "next",
"build": "next build"
+
},
+
"devDependencies": {
+
"@types/react": "18.2.6"
}
}
-12
examples/with-next/pages/_app.js
···
-
import { withUrqlClient } from 'next-urql';
-
import { cacheExchange, fetchExchange } from 'urql';
-
-
const App = ({ Component, pageProps }) => <Component {...pageProps} />;
-
-
export default withUrqlClient(
-
ssrExchange => ({
-
url: 'https://trygql.formidable.dev/graphql/basic-pokedex',
-
exchanges: [cacheExchange, ssrExchange, fetchExchange],
-
}),
-
{ ssr: false }
-
)(App);
-34
examples/with-next/pages/index.js
···
-
import { withUrqlClient } from 'next-urql';
-
import { useQuery, cacheExchange, fetchExchange, gql } from 'urql';
-
-
const POKEMONS_QUERY = gql`
-
query {
-
pokemons(limit: 10) {
-
id
-
name
-
}
-
}
-
`;
-
-
function Index() {
-
const [res] = useQuery({ query: POKEMONS_QUERY });
-
-
return (
-
<div>
-
<h1>Static</h1>
-
{res.data.pokemons.map(pokemon => (
-
<div key={pokemon.id}>
-
{pokemon.id} - {pokemon.name}
-
</div>
-
))}
-
</div>
-
);
-
}
-
-
export default withUrqlClient(
-
ssrExchange => ({
-
url: 'https://trygql.formidable.dev/graphql/basic-pokedex',
-
exchanges: [cacheExchange, ssrExchange, fetchExchange],
-
}),
-
{ ssr: true }
-
)(Index);
-51
examples/with-next/pages/server.js
···
-
import { initUrqlClient } from 'next-urql';
-
-
import { ssrExchange, cacheExchange, fetchExchange, useQuery, gql } from 'urql';
-
-
const POKEMONS_QUERY = gql`
-
query {
-
pokemons(limit: 10) {
-
id
-
name
-
}
-
}
-
`;
-
-
function Server() {
-
const [res] = useQuery({ query: POKEMONS_QUERY });
-
-
return (
-
<div>
-
<h1>Server-side render</h1>
-
{res.data.pokemons.map(pokemon => (
-
<div key={pokemon.id}>
-
{pokemon.id} - {pokemon.name}
-
</div>
-
))}
-
</div>
-
);
-
}
-
-
export async function getServerSideProps() {
-
const ssrCache = ssrExchange({ isClient: false });
-
const client = initUrqlClient(
-
{
-
url: 'https://trygql.formidable.dev/graphql/basic-pokedex',
-
exchanges: [cacheExchange, ssrCache, fetchExchange],
-
},
-
false
-
);
-
-
// This query is used to populate the cache for the query
-
// used on this page.
-
await client.query(POKEMONS_QUERY).toPromise();
-
-
return {
-
props: {
-
// urqlState is a keyword here so withUrqlClient can pick it up.
-
urqlState: ssrCache.extractData(),
-
},
-
};
-
}
-
-
export default Server;
-51
examples/with-next/pages/static.js
···
-
import { initUrqlClient } from 'next-urql';
-
-
import { ssrExchange, cacheExchange, fetchExchange, useQuery, gql } from 'urql';
-
-
const POKEMONS_QUERY = gql`
-
query {
-
pokemons(limit: 10) {
-
id
-
name
-
}
-
}
-
`;
-
-
function Static() {
-
const [res] = useQuery({ query: POKEMONS_QUERY });
-
-
return (
-
<div>
-
<h1>Static</h1>
-
{res.data.pokemons.map(pokemon => (
-
<div key={pokemon.id}>
-
{pokemon.id} - {pokemon.name}
-
</div>
-
))}
-
</div>
-
);
-
}
-
-
export async function getStaticProps() {
-
const ssrCache = ssrExchange({ isClient: false });
-
const client = initUrqlClient(
-
{
-
url: 'https://trygql.formidable.dev/graphql/basic-pokedex',
-
exchanges: [cacheExchange, ssrCache, fetchExchange],
-
},
-
false
-
);
-
-
// This query is used to populate the cache for the query
-
// used on this page.
-
await client.query(POKEMONS_QUERY).toPromise();
-
-
return {
-
props: {
-
// urqlState is a keyword here so withUrqlClient can pick it up.
-
urqlState: ssrCache.extractData(),
-
},
-
};
-
}
-
-
export default Static;
+24
examples/with-next/tsconfig.json
···
+
{
+
"compilerOptions": {
+
"lib": ["dom", "dom.iterable", "esnext"],
+
"allowJs": true,
+
"skipLibCheck": true,
+
"strict": false,
+
"forceConsistentCasingInFileNames": true,
+
"noEmit": true,
+
"incremental": true,
+
"esModuleInterop": true,
+
"module": "esnext",
+
"moduleResolution": "node",
+
"resolveJsonModule": true,
+
"isolatedModules": true,
+
"jsx": "preserve",
+
"plugins": [
+
{
+
"name": "next"
+
}
+
]
+
},
+
"include": ["next-env.d.ts", ".next/types/**/*.ts", "**/*.ts", "**/*.tsx"],
+
"exclude": ["node_modules"]
+
}
+1
packages/next-urql/.gitignore
···
+
/rsc
+29 -21
packages/next-urql/package.json
···
{
-
"name": "next-urql",
-
"version": "5.0.2",
+
"name": "@urql/next",
+
"version": "0.1.0",
"description": "Convenience wrappers for using urql with NextJS.",
"sideEffects": false,
"homepage": "https://formidable.com/open-source/urql/docs/",
···
"url": "https://github.com/urql-graphql/urql.git",
"directory": "packages/next-urql"
},
-
"main": "dist/next-urql.js",
-
"module": "dist/next-urql.es.js",
-
"types": "dist/next-urql.d.ts",
+
"main": "dist/urql-next",
+
"module": "dist/urql-next.mjs",
+
"types": "dist/urql-next.d.ts",
"source": "src/index.ts",
+
"exports": {
+
".": {
+
"types": "./dist/urql-next.d.ts",
+
"import": "./dist/urql-next.mjs",
+
"require": "./dist/urql-next.js",
+
"source": "./src/index.ts"
+
},
+
"./package.json": "./package.json",
+
"./rsc": {
+
"types": "./dist/urql-next-rsc.d.ts",
+
"import": "./dist/urql-next-rsc.mjs",
+
"require": "./dist/urql-next-rsc.js",
+
"source": "./src/rsc.ts"
+
}
+
},
"files": [
"LICENSE",
"CHANGELOG.md",
"README.md",
+
"rsc/",
"dist/"
],
"scripts": {
-
"test": "vitest --config ../../vitest.config.ts",
"clean": "rimraf dist",
"check": "tsc --noEmit",
"lint": "eslint --ext=js,jsx,ts,tsx .",
···
"devDependencies": {
"@urql/core": "workspace:*",
"urql": "workspace:*",
-
"@types/enzyme": "^3.10.3",
-
"@types/enzyme-adapter-react-16": "^1.0.5",
-
"@types/node-fetch": "^2.5.4",
-
"@types/react": "^17.0.4",
-
"@types/react-dom": "^17.0.3",
-
"enzyme": "^3.11.0",
-
"enzyme-adapter-react-16": "^1.15.2",
+
"@types/react": "^18.2.6",
+
"@types/react-dom": "^18.2.4",
"graphql": "^16.0.0",
-
"next": "^11.0.1",
-
"react": "^17.0.1",
-
"react-dom": "^17.0.1",
-
"react-is": "^17.0.1"
-
},
-
"dependencies": {
-
"react-ssr-prepass": "^1.4.0"
+
"next": "^13.0.0",
+
"react": "^18.0.0",
+
"react-dom": "^18.0.0"
},
"peerDependencies": {
-
"react": ">=16.8.0",
+
"next": ">=13.0.0",
+
"react": ">=18.0.0",
"urql": "^4.0.0"
},
"publishConfig": {
+
"access": "public",
"provenance": true
}
}
+80
packages/next-urql/src/DataHydrationContext.ts
···
+
import React from 'react';
+
import { ServerInsertedHTMLContext } from 'next/navigation';
+
import { UrqlResult } from './useUrqlValue';
+
+
interface DataHydrationValue {
+
isInjecting: boolean;
+
operationValuesByKey: Record<number, UrqlResult>;
+
RehydrateScript: () =>
+
| React.DetailedReactHTMLElement<
+
{ dangerouslySetInnerHTML: { __html: string } },
+
HTMLElement
+
>
+
| React.FunctionComponentElement<any>;
+
}
+
+
const DataHydrationContext = React.createContext<
+
DataHydrationValue | undefined
+
>(undefined);
+
+
function transportDataToJS(data: any) {
+
const key = 'urql_transport';
+
return `(window[Symbol.for("${key}")] ??= []).push(${JSON.stringify(data)})`;
+
}
+
+
export const DataHydrationContextProvider = ({
+
children,
+
}: React.PropsWithChildren<{}>) => {
+
const dataHydrationContext = React.useRef<DataHydrationValue>();
+
if (typeof window == 'undefined') {
+
if (!dataHydrationContext.current)
+
dataHydrationContext.current = buildContext();
+
}
+
+
return React.createElement(
+
DataHydrationContext.Provider,
+
{ value: dataHydrationContext.current },
+
children
+
);
+
};
+
+
export function useDataHydrationContext(): DataHydrationValue | undefined {
+
const dataHydrationContext = React.useContext(DataHydrationContext);
+
const insertHtml = React.useContext(ServerInsertedHTMLContext);
+
+
if (typeof window !== 'undefined') return;
+
+
if (insertHtml && dataHydrationContext && !dataHydrationContext.isInjecting) {
+
dataHydrationContext.isInjecting = true;
+
insertHtml(() =>
+
React.createElement(dataHydrationContext.RehydrateScript, {})
+
);
+
}
+
return dataHydrationContext;
+
}
+
+
let key = 0;
+
function buildContext(): DataHydrationValue {
+
const dataHydrationContext: DataHydrationValue = {
+
isInjecting: false,
+
operationValuesByKey: {},
+
RehydrateScript() {
+
dataHydrationContext.isInjecting = false;
+
if (!Object.keys(dataHydrationContext.operationValuesByKey).length)
+
return React.createElement(React.Fragment);
+
+
const __html = transportDataToJS({
+
rehydrate: { ...dataHydrationContext.operationValuesByKey },
+
});
+
+
dataHydrationContext.operationValuesByKey = {};
+
+
return React.createElement('script', {
+
key: key++,
+
dangerouslySetInnerHTML: { __html },
+
});
+
},
+
};
+
+
return dataHydrationContext;
+
}
+59
packages/next-urql/src/Provider.ts
···
+
'use client';
+
+
import React from 'react';
+
import { Provider, SSRExchange, Client } from 'urql';
+
import { DataHydrationContextProvider } from './DataHydrationContext';
+
+
export const SSRContext = React.createContext<SSRExchange | undefined>(
+
undefined
+
);
+
+
/** Provider for `@urql/next` during non-rsc interactions.
+
*
+
* @remarks
+
* `Provider` accepts a {@link Client} and provides it to all GraphQL hooks, it
+
* also accepts an {@link SSRExchange} to distribute data when re-hydrating
+
* on the client.
+
*
+
* @example
+
* ```tsx
+
* import {
+
* UrqlProvider,
+
* ssrExchange,
+
* cacheExchange,
+
* fetchExchange,
+
* createClient,
+
* } from '@urql/next';
+
*
+
* const ssr = ssrExchange();
+
* const client = createClient({
+
* url: 'https://trygql.formidable.dev/graphql/basic-pokedex',
+
* exchanges: [cacheExchange, ssr, fetchExchange],
+
* suspense: true,
+
* });
+
*
+
* export default function Layout({ children }: React.PropsWithChildren) {
+
* return (
+
* <UrqlProvider client={client} ssr={ssr}>
+
* {children}
+
* </UrqlProvider>
+
* );
+
* }
+
*
+
* ```
+
*/
+
export function UrqlProvider({
+
children,
+
ssr,
+
client,
+
}: React.PropsWithChildren<{ ssr: SSRExchange; client: Client }>) {
+
return React.createElement(
+
Provider,
+
{ value: client },
+
React.createElement(
+
SSRContext.Provider,
+
{ value: ssr },
+
React.createElement(DataHydrationContextProvider, {}, children)
+
)
+
);
+
}
-195
packages/next-urql/src/__tests__/with-urql-client.spec.ts
···
-
import React, { createElement as h } from 'react';
-
import { shallow, configure } from 'enzyme';
-
import Adapter from 'enzyme-adapter-react-16';
-
import {
-
Client,
-
dedupExchange,
-
fetchExchange,
-
cacheExchange,
-
} from '@urql/core';
-
import { vi, expect, it, beforeEach, describe, beforeAll } from 'vitest';
-
-
import { withUrqlClient } from '../with-urql-client';
-
import type { NextUrqlPageContext } from '../types';
-
import * as init from '../init-urql-client';
-
-
const MockApp: React.FC<any> = () => {
-
return h('div');
-
};
-
-
const MockAppTree: React.FC<any> = () => {
-
return h('div');
-
};
-
-
describe('withUrqlClient', () => {
-
const spyInitUrqlClient = vi.spyOn(init, 'initUrqlClient');
-
let Component: any;
-
-
beforeAll(() => {
-
configure({ adapter: new Adapter() });
-
});
-
-
describe('with client options', () => {
-
beforeEach(() => {
-
Component = withUrqlClient(
-
ssr => ({
-
url: 'http://localhost:3000',
-
exchanges: [dedupExchange, cacheExchange, ssr, fetchExchange],
-
}),
-
{
-
ssr: true,
-
}
-
)(MockApp);
-
});
-
-
const mockContext: NextUrqlPageContext = {
-
AppTree: MockAppTree,
-
pathname: '/',
-
query: {},
-
asPath: '/',
-
urqlClient: {} as Client,
-
};
-
-
it('should create the client instance when the component mounts', () => {
-
const tree = shallow(h(Component));
-
const app = tree.find(MockApp);
-
-
expect(app.props().urqlClient).toBeInstanceOf(Client);
-
expect(spyInitUrqlClient).toHaveBeenCalledTimes(1);
-
// @ts-ignore
-
expect(spyInitUrqlClient.mock.calls[0][0].exchanges).toHaveLength(4);
-
});
-
-
it('should create the urql client instance server-side inside getInitialProps', async () => {
-
const props =
-
Component.getInitialProps &&
-
(await Component.getInitialProps(mockContext));
-
expect(spyInitUrqlClient).toHaveBeenCalledTimes(1);
-
-
const tree = shallow(h(Component, props));
-
const app = tree.find(MockApp);
-
-
expect(app.props().urqlClient).toBeInstanceOf(Client);
-
});
-
});
-
-
describe('with ctx callback to create client options', () => {
-
// Simulate a token that might be passed in a request to the server-rendered application.
-
const token = Math.random().toString(36).slice(-10);
-
let mockSsrExchange;
-
-
const mockContext = {
-
AppTree: MockAppTree,
-
pathname: '/',
-
query: {},
-
asPath: '/',
-
req: {
-
headers: {
-
cookie: token,
-
},
-
} as NextUrqlPageContext['req'],
-
urqlClient: {} as Client,
-
} as unknown as NextUrqlPageContext;
-
-
beforeEach(() => {
-
Component = withUrqlClient(
-
(ssrExchange, ctx) => ({
-
url: 'http://localhost:3000',
-
fetchOptions: {
-
headers: { Authorization: (ctx && ctx.req!.headers!.cookie) || '' },
-
},
-
exchanges: [(mockSsrExchange = ssrExchange)],
-
}),
-
{ ssr: true }
-
)(MockApp);
-
});
-
-
it('should allow a user to access the ctx object from Next on the server', async () => {
-
Component.getInitialProps &&
-
(await Component.getInitialProps(mockContext));
-
expect(spyInitUrqlClient).toHaveBeenCalledWith(
-
{
-
url: 'http://localhost:3000',
-
fetchOptions: { headers: { Authorization: token } },
-
exchanges: [mockSsrExchange],
-
},
-
true
-
);
-
});
-
});
-
-
it('should not bind getInitialProps when there are no options', async () => {
-
const mockContext = {
-
AppTree: MockAppTree,
-
pathname: '/',
-
query: {},
-
asPath: '/',
-
req: {
-
headers: {
-
cookie: '',
-
},
-
} as NextUrqlPageContext['req'],
-
urqlClient: {} as Client,
-
} as unknown as NextUrqlPageContext;
-
const Component = withUrqlClient(
-
(ssrExchange, ctx) => ({
-
url: 'http://localhost:3000',
-
fetchOptions: {
-
headers: { Authorization: (ctx && ctx.req!.headers!.cookie) || '' },
-
},
-
exchanges: [ssrExchange],
-
}),
-
{ ssr: false }
-
)(MockApp);
-
-
Component.getInitialProps && (await Component.getInitialProps(mockContext));
-
expect(spyInitUrqlClient).toHaveBeenCalledTimes(0);
-
expect(Component.getInitialProps).toBeUndefined();
-
});
-
-
describe('never-suspend', () => {
-
// Simulate a token that might be passed in a request to the server-rendered application.
-
const token = Math.random().toString(36).slice(-10);
-
let mockSsrExchange;
-
-
const mockContext = {
-
AppTree: MockAppTree,
-
pathname: '/',
-
query: {},
-
asPath: '/',
-
req: {
-
headers: {
-
cookie: token,
-
},
-
} as NextUrqlPageContext['req'],
-
urqlClient: {} as Client,
-
} as unknown as NextUrqlPageContext;
-
-
beforeEach(() => {
-
Component = withUrqlClient(
-
(ssrExchange, ctx) => ({
-
url: 'http://localhost:3000',
-
fetchOptions: {
-
headers: { Authorization: (ctx && ctx.req!.headers!.cookie) || '' },
-
},
-
exchanges: [(mockSsrExchange = ssrExchange)],
-
}),
-
{ ssr: true, neverSuspend: true }
-
)(MockApp);
-
});
-
-
it('should not enable suspense', async () => {
-
Component.getInitialProps &&
-
(await Component.getInitialProps(mockContext));
-
-
expect(spyInitUrqlClient).toHaveBeenCalledWith(
-
{
-
url: 'http://localhost:3000',
-
fetchOptions: { headers: { Authorization: token } },
-
exchanges: [mockSsrExchange],
-
},
-
false
-
);
-
});
-
});
-
});
+3 -3
packages/next-urql/src/index.ts
···
-
export { withUrqlClient } from './with-urql-client';
-
export { initUrqlClient } from './init-urql-client';
-
export * from './types';
+
export * from 'urql';
+
export { useQuery } from './useQuery';
+
export { UrqlProvider } from './Provider';
-53
packages/next-urql/src/init-urql-client.ts
···
-
import { Client, ClientOptions, createClient } from '@urql/core';
-
-
let urqlClient: Client | null = null;
-
-
/** Resets the `Client` that {@link initUrqlClient} returns.
-
*
-
* @remarks
-
* `resetClient` will force {@link initUrqlClient} to create a new
-
* {@link Client}, rather than reusing the same `Client` it already
-
* created on the client-side.
-
*
-
* This may be used to force the cache and any state in the `Client`
-
* to be cleared and reset.
-
*/
-
export function resetClient() {
-
urqlClient = null;
-
}
-
-
/** Creates a {@link Client} the given options.
-
*
-
* @param clientOptions - {@link ClientOptions} to create the `Client` with.
-
* @param canEnableSuspense - Enables React Suspense on the server-side for `react-ssr-prepass`.
-
* @returns the created {@link Client}
-
*
-
* @remarks
-
* `initUrqlClient` creates a {@link Client} with the given options,
-
* like {@link createClient} does, but reuses the same client when
-
* run on the client-side.
-
*
-
* As long as `canEnableSuspense` is set to `true`, it enables React Suspense
-
* mode on the server-side for `react-ssr-prepass`.
-
*/
-
export function initUrqlClient(
-
clientOptions: ClientOptions,
-
canEnableSuspense: boolean
-
): Client {
-
// Create a new Client for every server-side rendered request.
-
// This ensures we reset the state for each rendered page.
-
// If there is an exising client instance on the client-side, use it.
-
const isServer = typeof window === 'undefined';
-
if (isServer || !urqlClient) {
-
urqlClient = createClient({
-
...clientOptions,
-
suspense: canEnableSuspense && (isServer || clientOptions.suspense),
-
});
-
// Serialize the urqlClient to null on the client-side.
-
// This ensures we don't share client and server instances of the urqlClient.
-
(urqlClient as any).toJSON = () => null;
-
}
-
-
// Return both the Client instance and the ssrCache.
-
return urqlClient;
-
}
+31
packages/next-urql/src/rsc.ts
···
+
import * as React from 'react';
+
import { Client } from '@urql/core';
+
+
/** Function to cache an urql-client across React Server Components.
+
*
+
* @param makeClient - A function that creates an urql-client.
+
* @returns an object containing a getClient method.
+
*
+
* @example
+
* ```ts
+
* import { cacheExchange, createClient, fetchExchange, gql } from '@urql/core';
+
* import { registerUrql } from '@urql/next/rsc';
+
* const makeClient = () => {
+
* return createClient({
+
* url: 'https://trygql.formidable.dev/graphql/basic-pokedex',
+
* exchanges: [cacheExchange, fetchExchange],
+
* });
+
* };
+
*
+
* const { getClient } = registerUrql(makeClient);
+
* ```
+
*/
+
export function registerUrql(makeClient: () => Client): {
+
getClient: () => Client;
+
} {
+
// @ts-ignore you exist don't worry
+
const getClient = React.cache(makeClient);
+
return {
+
getClient,
+
};
+
}
-102
packages/next-urql/src/types.ts
···
-
import type { ClientOptions, Client, SSRExchange, SSRData } from '@urql/core';
-
import type { NextPageContext } from 'next';
-
import type { AppContext } from 'next/app';
-
-
/** The Next.js {@link NextPageContext}, as modified by `next-urql`. */
-
export interface NextUrqlPageContext extends NextPageContext {
-
urqlClient: Client;
-
}
-
-
/** The Next.js {@link AppContext}, as modified by `next-urql`. */
-
export interface NextUrqlAppContext extends AppContext {
-
urqlClient: Client;
-
}
-
-
export type NextUrqlContext = NextUrqlPageContext | NextUrqlAppContext;
-
-
/** Passed to {@link withUrqlClient} returning the options a {@link Client} is created with.
-
*
-
* @param ssrExchange - the `ssrExchange` you must use in your `exchanges` array.
-
* @param ctx - Passed when `getInitialProps` is used and set to Next.js’ {@link NextPageContext}.
-
* @returns a {@link ClientOptions} configuration object to create a {@link Client} with.
-
*
-
* @remarks
-
* You must define a `getClientConfig` function and pass it to {@link withUrqlClient}.
-
*
-
* This function defines the options passed to {@link initUrqlClient}.
-
* It passes you an `ssrExchange` that you must use in your `exchanges` array.
-
*
-
* @example
-
* ```ts
-
* import { cacheExchange, fetchExchange } from '@urql/core';
-
* import { withUrqlClient } from 'next-urql';
-
*
-
* const WrappedPage = withUrqlClient(
-
* (ssrExchange) => ({
-
* url: 'https://YOUR_API',
-
* exchanges: [cacheExchange, ssrExchange, fetchExchange],
-
* })
-
* )(Page);
-
* ```
-
*/
-
export type NextUrqlClientConfig = (
-
ssrExchange: SSRExchange,
-
ctx?: NextPageContext
-
) => ClientOptions;
-
-
/** Props that {@link withUrqlClient} components pass on to your component. */
-
export interface WithUrqlProps {
-
/** The {@link Client} that {@link withUrqlClient} created for your component. */
-
urqlClient?: Client;
-
/** Next.js’ `pageProps` prop, as passed to it by Next.js. */
-
pageProps: any;
-
/** The SSR data that {@link withUrqlClient} created for your component. */
-
urqlState?: SSRData;
-
/** Resets the `Client` that on the client-side.
-
*
-
* @remarks
-
* `resetUrqlClient` will force a new {@link Client} to be created
-
* on the client-side, rather than the same `Client` with the same
-
* server-side data to be reused.
-
*
-
* This may be used to force the cache and any state in the `Client`
-
* to be cleared and reset.
-
*/
-
resetUrqlClient?(): void;
-
[key: string]: any;
-
}
-
-
/** Options that may be passed to the {@link withUrqlClient} wrapper function. */
-
export interface WithUrqlClientOptions {
-
/** Enables automatic server-side rendering mode.
-
*
-
* @remarks
-
* When enabled, {@link withUrqlClient} will add a `getInitialProps`
-
* function to the resulting component, even if you haven't defined
-
* one.
-
*
-
* This function will automatically capture `urql`'s SSR state on the
-
* server-side and rehydrate it on the client-side, unless
-
* {@link WithUrqlClientOptions.neverSuspend} is `true`.
-
*/
-
ssr?: boolean;
-
/** Disables automatic server-side rendering, even if a `getInitialProps` function is defined.
-
*
-
* @remarks
-
* When enabled, {@link withUrqlClient} will never execute queries
-
* on the server-side automatically, and will instead rely on you
-
* to do so manually.
-
*/
-
neverSuspend?: boolean;
-
/** Enables reexecuting operations on the client-side after rehydration.
-
*
-
* @remarks
-
* When enabled, `staleWhileRevalidate` will reexecute GraphQL queries on
-
* the client-side, if they’ve been rehydrated from SSR state.
-
*
-
* This is useful if you, for instance, cache your server-side rendered
-
* pages, or if you use `getStaticProps` and wish to get this data
-
* updated.
-
*/
-
staleWhileRevalidate?: boolean;
-
}
+214
packages/next-urql/src/useQuery.ts
···
+
'use client';
+
+
import {
+
AnyVariables,
+
CombinedError,
+
GraphQLRequestParams,
+
Operation,
+
OperationContext,
+
RequestPolicy,
+
createRequest,
+
useQuery as orig_useQuery,
+
} from 'urql';
+
import { useUrqlValue } from './useUrqlValue';
+
+
/** Input arguments for the {@link useQuery} hook.
+
*
+
* @param query - The GraphQL query that `useQuery` executes.
+
* @param variables - The variables for the GraphQL query that `useQuery` executes.
+
*/
+
export type UseQueryArgs<
+
Variables extends AnyVariables = AnyVariables,
+
Data = any
+
> = {
+
/** Updates the {@link RequestPolicy} for the executed GraphQL query operation.
+
*
+
* @remarks
+
* `requestPolicy` modifies the {@link RequestPolicy} of the GraphQL query operation
+
* that `useQuery` executes, and indicates a caching strategy for cache exchanges.
+
*
+
* For example, when set to `'cache-and-network'`, {@link useQuery} will
+
* receive a cached result with `stale: true` and an API request will be
+
* sent in the background.
+
*
+
* @see {@link OperationContext.requestPolicy} for where this value is set.
+
*/
+
requestPolicy?: RequestPolicy;
+
/** Updates the {@link OperationContext} for the executed GraphQL query operation.
+
*
+
* @remarks
+
* `context` may be passed to {@link useQuery}, to update the {@link OperationContext}
+
* of a query operation. This may be used to update the `context` that exchanges
+
* will receive for a single hook.
+
*
+
* Hint: This should be wrapped in a `useMemo` hook, to make sure that your
+
* component doesn’t infinitely update.
+
*
+
* @example
+
* ```ts
+
* const [result, reexecute] = useQuery({
+
* query,
+
* context: useMemo(() => ({
+
* additionalTypenames: ['Item'],
+
* }), [])
+
* });
+
* ```
+
*/
+
context?: Partial<OperationContext>;
+
/** Prevents {@link useQuery} from automatically executing GraphQL query operations.
+
*
+
* @remarks
+
* `pause` may be set to `true` to stop {@link useQuery} from executing
+
* automatically. The hook will stop receiving updates from the {@link Client}
+
* and won’t execute the query operation, until either it’s set to `false`
+
* or the {@link UseQueryExecute} function is called.
+
*
+
* @see {@link https://urql.dev/goto/docs/basics/react-preact/#pausing-usequery} for
+
* documentation on the `pause` option.
+
*/
+
pause?: boolean;
+
} & GraphQLRequestParams<Data, Variables>;
+
+
/** State of the current query, your {@link useQuery} hook is executing.
+
*
+
* @remarks
+
* `UseQueryState` is returned (in a tuple) by {@link useQuery} and
+
* gives you the updating {@link OperationResult} of GraphQL queries.
+
*
+
* Even when the query and variables passed to {@link useQuery} change,
+
* this state preserves the prior state and sets the `fetching` flag to
+
* `true`.
+
* This allows you to display the previous state, while implementing
+
* a separate loading indicator separately.
+
*/
+
export interface UseQueryState<
+
Data = any,
+
Variables extends AnyVariables = AnyVariables
+
> {
+
/** Indicates whether `useQuery` is waiting for a new result.
+
*
+
* @remarks
+
* When `useQuery` is passed a new query and/or variables, it will
+
* start executing the new query operation and `fetching` is set to
+
* `true` until a result arrives.
+
*
+
* Hint: This is subtly different than whether the query is actually
+
* fetching, and doesn’t indicate whether a query is being re-executed
+
* in the background. For this, see {@link UseQueryState.stale}.
+
*/
+
fetching: boolean;
+
/** Indicates that the state is not fresh and a new result will follow.
+
*
+
* @remarks
+
* The `stale` flag is set to `true` when a new result for the query
+
* is expected and `useQuery` is waiting for it. This may indicate that
+
* a new request is being requested in the background.
+
*
+
* @see {@link OperationResult.stale} for the source of this value.
+
*/
+
stale: boolean;
+
/** The {@link OperationResult.data} for the executed query. */
+
data?: Data;
+
/** The {@link OperationResult.error} for the executed query. */
+
error?: CombinedError;
+
/** The {@link OperationResult.extensions} for the executed query. */
+
extensions?: Record<string, any>;
+
/** The {@link Operation} that the current state is for.
+
*
+
* @remarks
+
* This is the {@link Operation} that is currently being executed.
+
* When {@link UseQueryState.fetching} is `true`, this is the
+
* last `Operation` that the current state was for.
+
*/
+
operation?: Operation<Data, Variables>;
+
}
+
+
/** Triggers {@link useQuery} to execute a new GraphQL query operation.
+
*
+
* @param opts - optionally, context options that will be merged with the hook's
+
* {@link UseQueryArgs.context} options and the `Client`’s options.
+
*
+
* @remarks
+
* When called, {@link useQuery} will re-execute the GraphQL query operation
+
* it currently holds, even if {@link UseQueryArgs.pause} is set to `true`.
+
*
+
* This is useful for executing a paused query or re-executing a query
+
* and get a new network result, by passing a new request policy.
+
*
+
* ```ts
+
* const [result, reexecuteQuery] = useQuery({ query });
+
*
+
* const refresh = () => {
+
* // Re-execute the query with a network-only policy, skipping the cache
+
* reexecuteQuery({ requestPolicy: 'network-only' });
+
* };
+
* ```
+
*/
+
export type UseQueryExecute = (opts?: Partial<OperationContext>) => void;
+
+
/** Result tuple returned by the {@link useQuery} hook.
+
*
+
* @remarks
+
* Similarly to a `useState` hook’s return value,
+
* the first element is the {@link useQuery}’s result and state,
+
* a {@link UseQueryState} object,
+
* and the second is used to imperatively re-execute the query
+
* via a {@link UseQueryExecute} function.
+
*/
+
export type UseQueryResponse<
+
Data = any,
+
Variables extends AnyVariables = AnyVariables
+
> = [UseQueryState<Data, Variables>, UseQueryExecute];
+
+
/** Hook to run a GraphQL query and get updated GraphQL results.
+
*
+
* @param args - a {@link UseQueryArgs} object, to pass a `query`, `variables`, and options.
+
* @returns a {@link UseQueryResponse} tuple of a {@link UseQueryState} result, and re-execute function.
+
*
+
* @remarks
+
* `useQuery` allows GraphQL queries to be defined and executed.
+
* Given {@link UseQueryArgs.query}, it executes the GraphQL query with the
+
* context’s {@link Client}.
+
*
+
* The returned result updates when the `Client` has new results
+
* for the query, and changes when your input `args` change.
+
*
+
* Additionally, if the `suspense` option is enabled on the `Client`,
+
* the `useQuery` hook will suspend instead of indicating that it’s
+
* waiting for a result via {@link UseQueryState.fetching}.
+
*
+
* @see {@link https://urql.dev/goto/urql/docs/basics/react-preact/#queries} for `useQuery` docs.
+
*
+
* @example
+
* ```ts
+
* import { gql, useQuery } from 'urql';
+
*
+
* const TodosQuery = gql`
+
* query { todos { id, title } }
+
* `;
+
*
+
* const Todos = () => {
+
* const [result, reexecuteQuery] = useQuery({
+
* query: TodosQuery,
+
* variables: {},
+
* });
+
* // ...
+
* };
+
* ```
+
*/
+
export function useQuery<
+
Data = any,
+
Variables extends AnyVariables = AnyVariables
+
>(args: UseQueryArgs<Variables, Data>): UseQueryResponse<Data, Variables> {
+
const request = createRequest(
+
args.query,
+
(args.variables || {}) as AnyVariables
+
);
+
useUrqlValue(request.key);
+
+
const [result, execute] = orig_useQuery(args);
+
+
useUrqlValue(request.key);
+
+
return [result, execute];
+
}
+60
packages/next-urql/src/useUrqlValue.ts
···
+
'use client';
+
+
import React from 'react';
+
import { useDataHydrationContext } from './DataHydrationContext';
+
import { SSRContext } from './Provider';
+
+
export const symbolString = 'urql_transport';
+
export const urqlTransportSymbol = Symbol.for(symbolString);
+
+
export type UrqlResult = { data?: any; error?: any; extensions?: any };
+
+
export function useUrqlValue(operationKey: number): void {
+
const ssrExchange = React.useContext(SSRContext);
+
const rehydrationContext = useDataHydrationContext();
+
+
if (!ssrExchange) {
+
throw new Error(
+
'Missing "UrqlProvider" component as a parent or did not pass in an "ssrExchange" to the Provider.'
+
);
+
}
+
+
if (typeof window == 'undefined') {
+
const data = ssrExchange.extractData();
+
if (rehydrationContext && data[operationKey]) {
+
const res = data[operationKey];
+
const parsed = {
+
...res,
+
extensions: res.extensions
+
? JSON.parse(res.extensions)
+
: res.extensions,
+
data: res.data ? JSON.parse(res.data) : res.data,
+
error: res.error,
+
};
+
rehydrationContext.operationValuesByKey[operationKey] = parsed;
+
}
+
} else {
+
const stores = (window[urqlTransportSymbol as any] ||
+
[]) as unknown as Array<{
+
rehydrate: Record<number, UrqlResult>;
+
}>;
+
+
const store = stores.find(
+
x => x && x.rehydrate && x.rehydrate[operationKey]
+
);
+
if (store) {
+
const result = store.rehydrate && store.rehydrate[operationKey];
+
if (result) {
+
delete store.rehydrate[operationKey];
+
ssrExchange.restoreData({
+
[operationKey]: {
+
extensions: JSON.stringify(result.extensions),
+
data: JSON.stringify(result.data),
+
error: result.error,
+
},
+
});
+
delete store.rehydrate[operationKey];
+
}
+
}
+
}
+
}
-199
packages/next-urql/src/with-urql-client.ts
···
-
import type { ReactNode, ReactElement } from 'react';
-
import * as React from 'react';
-
-
import {
-
Provider,
-
SSRExchange,
-
ssrExchange,
-
cacheExchange,
-
fetchExchange,
-
} from 'urql';
-
-
import ssrPrepass from 'react-ssr-prepass';
-
import { NextComponentType, NextPage, NextPageContext } from 'next';
-
import NextApp, { AppContext } from 'next/app';
-
-
import { initUrqlClient, resetClient } from './init-urql-client';
-
-
import {
-
NextUrqlClientConfig,
-
NextUrqlContext,
-
WithUrqlProps,
-
WithUrqlClientOptions,
-
} from './types';
-
-
let ssr: SSRExchange;
-
type NextPageWithLayout = NextPage & {
-
getLayout?: (page: ReactElement) => ReactNode;
-
};
-
-
/** Creates a wrapper for Next.js Page, App, or Document components that rehydrates `urql` state.
-
*
-
* @param getClientConfig - function used to create the {@link Client}
-
* @param options - optional {@link WithUrqlClientOptions} configuration options
-
* @returns a higher-order component function, which you can pass a Next.js page or app component.
-
*
-
* @remarks
-
* Used to wrap a Next.js page or app component. It will create a {@link Client} and passes
-
* it on to the child component and adds a React Provider for it.
-
*
-
* It will restore any page’s `pageProps.urqlState` with the {@link SSRExchange} and also
-
* supports doing this automatically when the {@link WithUrqlClientOptions.ssr} option
-
* is enabled.
-
*
-
* If you don’t define the above option, you will have to write `getServerSideProps` or
-
* `getStaticProps` methods on your component manually.
-
*
-
* @see {@link https://urql.dev/goto/docs/advanced/server-side-rendering/#nextjs} for more documentation.
-
*
-
* @example
-
* ```ts
-
* import { cacheExchange, fetchExchange } from '@urql/core';
-
* import { withUrqlClient } from 'next-urql';
-
*
-
* const WrappedPage = withUrqlClient(
-
* (ssrExchange) => ({
-
* url: 'https://YOUR_API',
-
* exchanges: [cacheExchange, ssrExchange, fetchExchange],
-
* }),
-
* { ssr: true },
-
* )(Page);
-
* ```
-
*/
-
export function withUrqlClient(
-
getClientConfig: NextUrqlClientConfig,
-
options?: WithUrqlClientOptions
-
) {
-
if (!options) options = {};
-
-
return <C extends NextPage<any> | typeof NextApp>(
-
AppOrPage: C
-
): NextComponentType<NextUrqlContext, {}, WithUrqlProps> => {
-
const shouldEnableSuspense = Boolean(
-
(AppOrPage.getInitialProps || options!.ssr) && !options!.neverSuspend
-
);
-
-
const WithUrql = ({
-
pageProps,
-
urqlClient,
-
urqlState,
-
...rest
-
}: WithUrqlProps) => {
-
const [version, forceUpdate] = React.useReducer(prev => prev + 1, 0);
-
const urqlServerState = (pageProps && pageProps.urqlState) || urqlState;
-
-
const client = React.useMemo(() => {
-
if (urqlClient && !version) {
-
return urqlClient;
-
}
-
-
if (!ssr || typeof window === 'undefined') {
-
// We want to force the cache to hydrate, we do this by setting the isClient flag to true
-
ssr = ssrExchange({
-
initialState: urqlServerState,
-
isClient: true,
-
staleWhileRevalidate:
-
typeof window !== 'undefined'
-
? options!.staleWhileRevalidate
-
: undefined,
-
});
-
} else if (!version) {
-
ssr.restoreData(urqlServerState);
-
}
-
-
const clientConfig = getClientConfig(ssr);
-
if (!clientConfig.exchanges) {
-
// When the user does not provide exchanges we make the default assumption.
-
clientConfig.exchanges = [cacheExchange, ssr, fetchExchange];
-
}
-
-
return initUrqlClient(clientConfig, shouldEnableSuspense)!;
-
}, [urqlClient, urqlServerState, version]);
-
-
const resetUrqlClient = React.useCallback(() => {
-
resetClient();
-
ssr = ssrExchange({ initialState: undefined });
-
forceUpdate();
-
}, []);
-
-
return React.createElement(
-
Provider,
-
{ value: client },
-
React.createElement(AppOrPage, {
-
...rest,
-
pageProps,
-
urqlClient: client,
-
resetUrqlClient,
-
})
-
);
-
};
-
-
// Set the displayName to indicate use of withUrqlClient.
-
const displayName =
-
(AppOrPage as any).displayName || AppOrPage.name || 'Component';
-
WithUrql.displayName = `withUrqlClient(${displayName})`;
-
-
if ((AppOrPage as NextPageWithLayout).getLayout) {
-
WithUrql.getLayout = (AppOrPage as NextPageWithLayout).getLayout;
-
}
-
-
if (AppOrPage.getInitialProps || options!.ssr) {
-
WithUrql.getInitialProps = async (appOrPageCtx: NextUrqlContext) => {
-
const AppTree = appOrPageCtx.AppTree!;
-
-
// Determine if we are wrapping an App component or a Page component.
-
const isApp = !!(appOrPageCtx as AppContext).Component;
-
const ctx = isApp
-
? (appOrPageCtx as AppContext).ctx
-
: (appOrPageCtx as NextPageContext);
-
-
const ssrCache = ssrExchange({ initialState: undefined });
-
const clientConfig = getClientConfig(ssrCache, ctx);
-
if (!clientConfig.exchanges) {
-
// When the user does not provide exchanges we make the default assumption.
-
clientConfig.exchanges = [cacheExchange, ssrCache, fetchExchange];
-
}
-
-
const urqlClient = initUrqlClient(clientConfig, !options!.neverSuspend);
-
-
if (urqlClient) {
-
(ctx as NextUrqlContext).urqlClient = urqlClient;
-
}
-
-
// Run the wrapped component's getInitialProps function.
-
let pageProps = {} as any;
-
if (AppOrPage.getInitialProps) {
-
pageProps = await AppOrPage.getInitialProps(appOrPageCtx as any);
-
if (ctx.res && (ctx.res.writableEnded || ctx.res.finished)) {
-
return { ...pageProps, urqlClient };
-
}
-
}
-
-
// Check the window object to determine whether or not we are on the server.
-
// getInitialProps runs on the server for initial render, and on the client for navigation.
-
// We only want to run the prepass step on the server.
-
if (typeof window !== 'undefined') {
-
return { ...pageProps, urqlClient };
-
}
-
-
const props = { ...pageProps, urqlClient };
-
const appTreeProps = isApp
-
? { pageProps: {}, ...props }
-
: { pageProps: props };
-
-
// Run the prepass step on AppTree. This will run all urql queries on the server.
-
if (!options!.neverSuspend) {
-
await ssrPrepass(React.createElement(AppTree, appTreeProps));
-
}
-
-
return {
-
...pageProps,
-
urqlState: ssrCache ? ssrCache.extractData() : undefined,
-
urqlClient,
-
};
-
};
-
}
-
-
return WithUrql;
-
};
-
}
+189 -832
pnpm-lock.yaml
···
-
lockfileVersion: '6.1'
+
lockfileVersion: '6.0'
settings:
autoInstallPeers: true
···
version: 16.6.0
packages/next-urql:
-
dependencies:
-
react-ssr-prepass:
-
specifier: ^1.4.0
-
version: 1.4.0(react@17.0.2)
devDependencies:
-
'@types/enzyme':
-
specifier: ^3.10.3
-
version: 3.10.8
-
'@types/enzyme-adapter-react-16':
-
specifier: ^1.0.5
-
version: 1.0.6
-
'@types/node-fetch':
-
specifier: ^2.5.4
-
version: 2.5.10
'@types/react':
specifier: ^17.0.39
version: 17.0.52
'@types/react-dom':
-
specifier: ^17.0.3
-
version: 17.0.18
+
specifier: ^18.2.4
+
version: 18.2.4
'@urql/core':
specifier: workspace:*
version: link:../core
-
enzyme:
-
specifier: ^3.11.0
-
version: 3.11.0
-
enzyme-adapter-react-16:
-
specifier: ^1.15.2
-
version: 1.15.6(enzyme@3.11.0)(react-dom@17.0.2)(react@17.0.2)
graphql:
specifier: ^16.6.0
version: 16.6.0
next:
-
specifier: ^11.0.1
-
version: 11.0.1(react-dom@17.0.2)(react@17.0.2)(typescript@5.0.4)
+
specifier: ^13.0.0
+
version: 13.0.0(@babel/core@7.21.5)(react-dom@17.0.2)(react@17.0.2)
react:
specifier: ^17.0.2
version: 17.0.2
react-dom:
specifier: ^17.0.2
version: 17.0.2(react@17.0.2)
-
react-is:
-
specifier: ^17.0.2
-
version: 17.0.2
urql:
specifier: workspace:*
version: link:../react-urql
···
chokidar: 3.5.3
transitivePeerDependencies:
- supports-color
-
-
/@babel/code-frame@7.12.11:
-
resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==}
-
dependencies:
-
'@babel/highlight': 7.22.5
-
dev: true
/@babel/code-frame@7.21.4:
resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==}
···
regenerator-runtime: 0.13.11
dev: true
-
/@babel/runtime@7.12.5:
-
resolution: {integrity: sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==}
-
dependencies:
-
regenerator-runtime: 0.13.11
-
dev: true
-
/@babel/runtime@7.21.0:
resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==}
engines: {node: '>=6.9.0'}
···
dependencies:
'@babel/helper-string-parser': 7.21.5
'@babel/helper-validator-identifier': 7.22.5
-
to-fast-properties: 2.0.0
-
dev: true
-
-
/@babel/types@7.8.3:
-
resolution: {integrity: sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==}
-
dependencies:
-
esutils: 2.0.3
-
lodash: 4.17.21
to-fast-properties: 2.0.0
dev: true
···
resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==}
dev: true
-
/@hapi/accept@5.0.2:
-
resolution: {integrity: sha512-CmzBx/bXUR8451fnZRuZAJRlzgm0Jgu5dltTX/bszmR2lheb9BpyN47Q1RbaGTsvFzn0PXAEs+lXDKfshccYZw==}
-
dependencies:
-
'@hapi/boom': 9.1.3
-
'@hapi/hoek': 9.2.0
-
dev: true
-
-
/@hapi/boom@9.1.3:
-
resolution: {integrity: sha512-RlrGyZ603hE/eRTZtTltocRm50HHmrmL3kGOP0SQ9MasazlW1mt/fkv4C5P/6rnpFXjwld/POFX1C8tMZE3ldg==}
-
dependencies:
-
'@hapi/hoek': 9.2.0
-
dev: true
-
-
/@hapi/hoek@9.2.0:
-
resolution: {integrity: sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug==}
-
dev: true
-
/@humanwhocodes/config-array@0.11.8:
resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==}
engines: {node: '>=10.10.0'}
···
/@mdx-js/util@1.6.22:
resolution: {integrity: sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==}
-
/@next/env@11.0.1:
-
resolution: {integrity: sha512-yZfKh2U6R9tEYyNUrs2V3SBvCMufkJ07xMH5uWy8wqcl5gAXoEw6A/1LDqwX3j7pUutF9d1ZxpdGDA3Uag+aQQ==}
+
/@next/env@13.0.0:
+
resolution: {integrity: sha512-65v9BVuah2Mplohm4+efsKEnoEuhmlGm8B2w6vD1geeEP2wXtlSJCvR/cCRJ3fD8wzCQBV41VcMBQeYET6MRkg==}
dev: true
-
/@next/polyfill-module@11.0.1:
-
resolution: {integrity: sha512-Cjs7rrKCg4CF4Jhri8PCKlBXhszTfOQNl9AjzdNy4K5jXFyxyoSzuX2rK4IuoyE+yGp5A3XJCBEmOQ4xbUp9Mg==}
+
/@next/swc-android-arm-eabi@13.0.0:
+
resolution: {integrity: sha512-+DUQkYF93gxFjWY+CYWE1QDX6gTgnUiWf+W4UqZjM1Jcef8U97fS6xYh+i+8rH4MM0AXHm7OSakvfOMzmjU6VA==}
+
engines: {node: '>= 10'}
+
cpu: [arm]
+
os: [android]
+
requiresBuild: true
dev: true
+
optional: true
-
/@next/react-dev-overlay@11.0.1(react-dom@17.0.2)(react@17.0.2):
-
resolution: {integrity: sha512-lvUjMVpLsgzADs9Q8wtC5LNqvfdN+M0BDMSrqr04EDWAyyX0vURHC9hkvLbyEYWyh+WW32pwjKBXdkMnJhoqMg==}
-
peerDependencies:
-
react: ^17.0.2 || 17
-
react-dom: ^17.0.2 || 17
-
dependencies:
-
'@babel/code-frame': 7.12.11
-
anser: 1.4.9
-
chalk: 4.0.0
-
classnames: 2.2.6
-
css.escape: 1.5.1
-
data-uri-to-buffer: 3.0.1
-
platform: 1.3.6
-
react: 17.0.2
-
react-dom: 17.0.2(react@17.0.2)
-
shell-quote: 1.7.2
-
source-map: 0.8.0-beta.0
-
stacktrace-parser: 0.1.10
-
strip-ansi: 6.0.0
+
/@next/swc-android-arm64@13.0.0:
+
resolution: {integrity: sha512-RW9Uy3bMSc0zVGCa11klFuwfP/jdcdkhdruqnrJ7v+7XHm6OFKkSRzX6ee7yGR1rdDZvTnP4GZSRSpzjLv/N0g==}
+
engines: {node: '>= 10'}
+
cpu: [arm64]
+
os: [android]
+
requiresBuild: true
dev: true
+
optional: true
-
/@next/react-refresh-utils@11.0.1(react-refresh@0.8.3):
-
resolution: {integrity: sha512-K347DM6Z7gBSE+TfUaTTceWvbj0B6iNAsFZXbFZOlfg3uyz2sbKpzPYYFocCc27yjLaS8OfR8DEdS2mZXi8Saw==}
-
peerDependencies:
-
react-refresh: 0.8.3
-
webpack: ^4 || ^5
-
peerDependenciesMeta:
-
webpack:
-
optional: true
-
dependencies:
-
react-refresh: 0.8.3
+
/@next/swc-darwin-arm64@13.0.0:
+
resolution: {integrity: sha512-APA26nps1j4qyhOIzkclW/OmgotVHj1jBxebSpMCPw2rXfiNvKNY9FA0TcuwPmUCNqaTnm703h6oW4dvp73A4Q==}
+
engines: {node: '>= 10'}
+
cpu: [arm64]
+
os: [darwin]
+
requiresBuild: true
dev: true
+
optional: true
+
+
/@next/swc-darwin-x64@13.0.0:
+
resolution: {integrity: sha512-qsUhUdoFuRJiaJ7LnvTQ6GZv1QnMDcRXCIjxaN0FNVXwrjkq++U7KjBUaxXkRzLV4C7u0NHLNOp0iZwNNE7ypw==}
+
engines: {node: '>= 10'}
+
cpu: [x64]
+
os: [darwin]
+
requiresBuild: true
+
dev: true
+
optional: true
+
+
/@next/swc-freebsd-x64@13.0.0:
+
resolution: {integrity: sha512-sCdyCbboS7CwdnevKH9J6hkJI76LUw1jVWt4eV7kISuLiPba3JmehZSWm80oa4ADChRVAwzhLAo2zJaYRrInbg==}
+
engines: {node: '>= 10'}
+
cpu: [x64]
+
os: [freebsd]
+
requiresBuild: true
+
dev: true
+
optional: true
+
+
/@next/swc-linux-arm-gnueabihf@13.0.0:
+
resolution: {integrity: sha512-/X/VxfFA41C9jrEv+sUsPLQ5vbDPVIgG0CJrzKvrcc+b+4zIgPgtfsaWq9ockjHFQi3ycvlZK4TALOXO8ovQ6Q==}
+
engines: {node: '>= 10'}
+
cpu: [arm]
+
os: [linux]
+
requiresBuild: true
+
dev: true
+
optional: true
+
+
/@next/swc-linux-arm64-gnu@13.0.0:
+
resolution: {integrity: sha512-x6Oxr1GIi0ZtNiT6jbw+JVcbEi3UQgF7mMmkrgfL4mfchOwXtWSHKTSSPnwoJWJfXYa0Vy1n8NElWNTGAqoWFw==}
+
engines: {node: '>= 10'}
+
cpu: [arm64]
+
os: [linux]
+
requiresBuild: true
+
dev: true
+
optional: true
+
+
/@next/swc-linux-arm64-musl@13.0.0:
+
resolution: {integrity: sha512-SnMH9ngI+ipGh3kqQ8+mDtWunirwmhQnQeZkEq9e/9Xsgjf04OetqrqRHKM1HmJtG2qMUJbyXFJ0F81TPuT+3g==}
+
engines: {node: '>= 10'}
+
cpu: [arm64]
+
os: [linux]
+
requiresBuild: true
+
dev: true
+
optional: true
+
+
/@next/swc-linux-x64-gnu@13.0.0:
+
resolution: {integrity: sha512-VSQwTX9EmdbotArtA1J67X8964oQfe0xHb32x4tu+JqTR+wOHyG6wGzPMdXH2oKAp6rdd7BzqxUXXf0J+ypHlw==}
+
engines: {node: '>= 10'}
+
cpu: [x64]
+
os: [linux]
+
requiresBuild: true
+
dev: true
+
optional: true
+
+
/@next/swc-linux-x64-musl@13.0.0:
+
resolution: {integrity: sha512-xBCP0nnpO0q4tsytXkvIwWFINtbFRyVY5gxa1zB0vlFtqYR9lNhrOwH3CBrks3kkeaePOXd611+8sjdUtrLnXA==}
+
engines: {node: '>= 10'}
+
cpu: [x64]
+
os: [linux]
+
requiresBuild: true
+
dev: true
+
optional: true
+
+
/@next/swc-win32-arm64-msvc@13.0.0:
+
resolution: {integrity: sha512-NutwDafqhGxqPj/eiUixJq9ImS/0sgx6gqlD7jRndCvQ2Q8AvDdu1+xKcGWGNnhcDsNM/n1avf1e62OG1GaqJg==}
+
engines: {node: '>= 10'}
+
cpu: [arm64]
+
os: [win32]
+
requiresBuild: true
+
dev: true
+
optional: true
+
+
/@next/swc-win32-ia32-msvc@13.0.0:
+
resolution: {integrity: sha512-zNaxaO+Kl/xNz02E9QlcVz0pT4MjkXGDLb25qxtAzyJL15aU0+VjjbIZAYWctG59dvggNIUNDWgoBeVTKB9xLg==}
+
engines: {node: '>= 10'}
+
cpu: [ia32]
+
os: [win32]
+
requiresBuild: true
+
dev: true
+
optional: true
+
+
/@next/swc-win32-x64-msvc@13.0.0:
+
resolution: {integrity: sha512-FFOGGWwTCRMu9W7MF496Urefxtuo2lttxF1vwS+1rIRsKvuLrWhVaVTj3T8sf2EBL6gtJbmh4TYlizS+obnGKA==}
+
engines: {node: '>= 10'}
+
cpu: [x64]
+
os: [win32]
+
requiresBuild: true
+
dev: true
+
optional: true
/@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents:
resolution: {integrity: sha512-+nb9vWloHNNMFHjGofEam3wopE3m1yuambrrd/fnPc+lFOMB9ROTqQlche9ByFWNkdNqfSgR/kkQtQ8DzEWt2w==}
···
resolution: {integrity: sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==}
engines: {node: '>=4'}
+
/@swc/helpers@0.4.11:
+
resolution: {integrity: sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==}
+
dependencies:
+
tslib: 2.5.0
+
dev: true
+
/@testing-library/dom@7.30.4:
resolution: {integrity: sha512-GObDVMaI4ARrZEXaRy4moolNAxWPKvEYNV/fa6Uc2eAzR/t4otS6A7EhrntPBIQLeehL9DbVhscvvv7gd6hWqA==}
engines: {node: '>=10'}
···
dependencies:
'@babel/runtime': 7.21.0
'@types/react': 17.0.52
-
'@types/react-dom': 17.0.18
+
'@types/react-dom': 18.2.4
'@types/react-test-renderer': 17.0.1
filter-console: 0.1.1
react: 17.0.2
···
resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==}
dev: true
-
/@types/cheerio@0.22.28:
-
resolution: {integrity: sha512-ehUMGSW5IeDxJjbru4awKYMlKGmo1wSSGUVqXtYwlgmUM8X1a0PZttEIm6yEY7vHsY/hh6iPnklF213G0UColw==}
-
dependencies:
-
'@types/node': 18.16.3
-
dev: true
-
-
/@types/enzyme-adapter-react-16@1.0.6:
-
resolution: {integrity: sha512-VonDkZ15jzqDWL8mPFIQnnLtjwebuL9YnDkqeCDYnB4IVgwUm0mwKkqhrxLL6mb05xm7qqa3IE95m8CZE9imCg==}
-
dependencies:
-
'@types/enzyme': 3.10.8
-
dev: true
-
-
/@types/enzyme@3.10.8:
-
resolution: {integrity: sha512-vlOuzqsTHxog6PV79+tvOHFb6hq4QZKMq1lLD9MaWD1oec2lHTKndn76XOpSwCA0oFTaIbKVPrgM3k78Jjd16g==}
-
dependencies:
-
'@types/cheerio': 0.22.28
-
'@types/react': 17.0.52
-
dev: true
-
/@types/estree@1.0.0:
resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==}
dev: true
···
resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==}
dev: true
-
/@types/node-fetch@2.5.10:
-
resolution: {integrity: sha512-IpkX0AasN44hgEad0gEF/V6EgR5n69VEqPEgnmoM8GsIGro3PowbWs4tR6IhxUTyPLpOn+fiGG6nrQhcmoCuIQ==}
-
dependencies:
-
'@types/node': 18.16.3
-
form-data: 3.0.1
-
dev: true
-
/@types/node@12.20.55:
resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==}
dev: true
···
/@types/q@1.5.4:
resolution: {integrity: sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==}
-
/@types/react-dom@17.0.18:
-
resolution: {integrity: sha512-rLVtIfbwyur2iFKykP2w0pl/1unw26b5td16d5xMgp7/yjTHomkyxPYChFoCr/FtEX1lN9wY6lFj1qvKdS5kDw==}
+
/@types/react-dom@18.2.4:
+
resolution: {integrity: sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw==}
dependencies:
'@types/react': 17.0.52
dev: true
···
indent-string: 4.0.0
dev: true
-
/airbnb-prop-types@2.16.0(react@17.0.2):
-
resolution: {integrity: sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==}
-
peerDependencies:
-
react: ^0.14 || ^15.0.0 || ^16.0.0-alpha || 17
-
dependencies:
-
array.prototype.find: 2.1.1
-
function.prototype.name: 1.1.5
-
is-regex: 1.1.4
-
object-is: 1.1.5
-
object.assign: 4.1.4
-
object.entries: 1.1.6
-
prop-types: 15.8.1
-
prop-types-exact: 1.2.0
-
react: 17.0.2
-
react-is: 17.0.2
-
dev: true
-
/ajv-errors@1.0.1(ajv@6.12.6):
resolution: {integrity: sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==}
peerDependencies:
···
/alphanum-sort@1.0.2:
resolution: {integrity: sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==}
-
-
/anser@1.4.9:
-
resolution: {integrity: sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA==}
-
dev: true
/ansi-align@2.0.0:
resolution: {integrity: sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==}
···
dependencies:
call-bind: 1.0.2
is-array-buffer: 3.0.2
-
-
/array-filter@1.0.0:
-
resolution: {integrity: sha512-Ene1hbrinPZ1qPoZp7NSx4jQnh4nr7MtY78pHNb+yr8yHbxmTS7ChGW0a55JKA7TkRDeoQxK4GcJaCvBYplSKA==}
-
dev: true
/array-flatten@1.1.1:
resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
···
resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==}
engines: {node: '>=0.10.0'}
-
/array.prototype.find@2.1.1:
-
resolution: {integrity: sha512-mi+MYNJYLTx2eNYy+Yh6raoQacCsNeeMUaspFPh9Y141lFSsWxxB8V9mM2ye+eqiRs917J6/pJ4M9ZPzenWckA==}
-
dependencies:
-
define-properties: 1.2.0
-
es-abstract: 1.21.2
-
dev: true
-
/array.prototype.flat@1.3.1:
resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==}
engines: {node: '>= 0.4'}
···
object-assign: 4.1.1
util: 0.10.3
-
/assert@2.0.0:
-
resolution: {integrity: sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==}
-
dependencies:
-
es6-object-assign: 1.1.0
-
is-nan: 1.3.2
-
object-is: 1.1.5
-
util: 0.12.4
-
dev: true
-
/assertion-error@1.1.0:
resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==}
dev: true
···
/assign-symbols@1.0.0:
resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==}
engines: {node: '>=0.10.0'}
-
-
/ast-types@0.13.2:
-
resolution: {integrity: sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA==}
-
engines: {node: '>=4'}
-
dev: true
/astral-regex@2.0.0:
resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
···
dependencies:
pako: 1.0.11
-
/browserslist@4.16.6:
-
resolution: {integrity: sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==}
-
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
-
hasBin: true
-
dependencies:
-
caniuse-lite: 1.0.30001466
-
colorette: 1.2.2
-
electron-to-chromium: 1.4.332
-
escalade: 3.1.1
-
node-releases: 1.1.71
-
dev: true
-
/browserslist@4.21.5:
resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
···
ieee754: 1.2.1
isarray: 1.0.0
-
/buffer@5.6.0:
-
resolution: {integrity: sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==}
-
dependencies:
-
base64-js: 1.5.1
-
ieee754: 1.2.1
-
dev: true
-
/buffer@5.7.1:
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
dependencies:
···
chownr: 1.1.4
figgy-pudding: 3.5.2
glob: 7.2.3
-
graceful-fs: 4.2.10
+
graceful-fs: 4.2.11
infer-owner: 1.0.4
lru-cache: 5.1.1
mississippi: 3.0.0
···
escape-string-regexp: 1.0.5
supports-color: 5.5.0
-
/chalk@4.0.0:
-
resolution: {integrity: sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==}
-
engines: {node: '>=10'}
-
dependencies:
-
ansi-styles: 4.3.0
-
supports-color: 7.2.0
-
dev: true
-
/chalk@4.1.2:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
···
/check-types@8.0.3:
resolution: {integrity: sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==}
-
/cheerio-select@1.4.0:
-
resolution: {integrity: sha512-sobR3Yqz27L553Qa7cK6rtJlMDbiKPdNywtR95Sj/YgfpLfy0u6CGJuaBKe5YE/vTc23SCRKxWSdlon/w6I/Ew==}
-
dependencies:
-
css-select: 4.3.0
-
css-what: 5.0.0
-
domelementtype: 2.2.0
-
domhandler: 4.3.1
-
domutils: 2.8.0
-
dev: true
-
-
/cheerio@1.0.0-rc.6:
-
resolution: {integrity: sha512-hjx1XE1M/D5pAtMgvWwE21QClmAEeGHOIDfycgmndisdNgI6PE1cGRQkMGBcsbUbmEQyWu5PJLUcAOjtQS8DWw==}
-
engines: {node: '>= 0.12'}
-
dependencies:
-
cheerio-select: 1.4.0
-
dom-serializer: 1.3.1
-
domhandler: 4.3.1
-
htmlparser2: 6.1.0
-
parse5: 6.0.1
-
parse5-htmlparser2-tree-adapter: 6.0.1
-
dev: true
-
/chokidar@2.1.8(supports-color@6.1.0):
resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==}
deprecated: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies
···
transitivePeerDependencies:
- supports-color
-
/chokidar@3.5.1:
-
resolution: {integrity: sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==}
-
engines: {node: '>= 8.10.0'}
-
dependencies:
-
anymatch: 3.1.2
-
braces: 3.0.2
-
glob-parent: 5.1.2
-
is-binary-path: 2.1.0
-
is-glob: 4.0.3
-
normalize-path: 3.0.0
-
readdirp: 3.5.0
-
optionalDependencies:
-
fsevents: 2.3.2
-
dev: true
-
/chokidar@3.5.3:
resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
engines: {node: '>= 8.10.0'}
···
isobject: 3.0.1
static-extend: 0.1.2
-
/classnames@2.2.6:
-
resolution: {integrity: sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==}
-
dev: true
-
/clean-css@4.2.3:
resolution: {integrity: sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==}
engines: {node: '>= 4.0'}
···
/cli-width@2.2.1:
resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==}
+
+
/client-only@0.0.1:
+
resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
+
dev: true
/clipboardy@1.2.3:
resolution: {integrity: sha512-2WNImOvCRe6r63Gk9pShfkwXsVtKCroMAevIbiae021mS850UkWPbevxsBz3tnvjZIEGvlwaqCPsw+4ulzNgJA==}
···
resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==}
engines: {node: '>= 0.6'}
-
/convert-source-map@1.7.0:
-
resolution: {integrity: sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==}
-
dependencies:
-
safe-buffer: 5.1.2
-
dev: true
-
/convert-source-map@1.9.0:
resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
···
/css-what@3.4.2:
resolution: {integrity: sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==}
engines: {node: '>= 6'}
-
-
/css-what@5.0.0:
-
resolution: {integrity: sha512-qxyKHQvgKwzwDWC/rGbT821eJalfupxYW2qbSJSAtdSTimsr/MlaGONoNLllaUPZWf8QnbcKM/kPVYUQuEKAFA==}
-
engines: {node: '>= 6'}
-
dev: true
/css-what@6.1.0:
resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
engines: {node: '>= 6'}
dev: true
-
/css.escape@1.5.1:
-
resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==}
-
dev: true
-
/cssesc@3.0.0:
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
engines: {node: '>=4'}
···
postcss-svgo: 4.0.3
postcss-unique-selectors: 4.0.1
-
/cssnano-preset-simple@2.0.0(postcss@8.2.13):
-
resolution: {integrity: sha512-HkufSLkaBJbKBFx/7aj5HmCK9Ni/JedRQm0mT2qBzMG/dEuJOLnMt2lK6K1rwOOyV4j9aSY+knbW9WoS7BYpzg==}
-
peerDependencies:
-
postcss: ^8.2.1
-
dependencies:
-
caniuse-lite: 1.0.30001466
-
postcss: 8.2.13
-
dev: true
-
-
/cssnano-simple@2.0.0(postcss@8.2.13):
-
resolution: {integrity: sha512-0G3TXaFxlh/szPEG/o3VcmCwl0N3E60XNb9YZZijew5eIs6fLjJuOPxQd9yEBaX2p/YfJtt49i4vYi38iH6/6w==}
-
peerDependencies:
-
postcss: ^8.2.2
-
dependencies:
-
cssnano-preset-simple: 2.0.0(postcss@8.2.13)
-
postcss: 8.2.13
-
dev: true
-
/cssnano-util-get-arguments@4.0.0:
resolution: {integrity: sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw==}
engines: {node: '>=6.9.0'}
···
assert-plus: 1.0.0
dev: true
-
/data-uri-to-buffer@3.0.1:
-
resolution: {integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==}
-
engines: {node: '>= 6'}
-
dev: true
-
/data-uri-to-buffer@4.0.1:
resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
engines: {node: '>= 12'}
···
decompress-tarbz2: 4.1.1
decompress-targz: 4.1.1
decompress-unzip: 4.0.1
-
graceful-fs: 4.2.10
+
graceful-fs: 4.2.11
make-dir: 1.3.0
pify: 2.3.0
strip-dirs: 2.1.0
···
path-type: 4.0.0
dev: true
-
/discontinuous-range@1.0.0:
-
resolution: {integrity: sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==}
-
dev: true
-
/dns-equal@1.0.0:
resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==}
···
/domain-browser@1.2.0:
resolution: {integrity: sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==}
engines: {node: '>=0.4', npm: '>=1.2'}
-
-
/domain-browser@4.19.0:
-
resolution: {integrity: sha512-fRA+BaAWOR/yr/t7T9E9GJztHPeFjj8U35ajyAjCDtAAnTn1Rc1f6W6VGPJrO1tkQv9zWu+JRof7z6oQtiYVFQ==}
-
engines: {node: '>=10'}
-
dev: true
/domelementtype@1.3.1:
resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==}
···
dependencies:
iconv-lite: 0.6.3
dev: true
+
optional: true
/end-of-stream@1.4.4:
resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
···
engines: {node: '>=6'}
dev: true
-
/enzyme-adapter-react-16@1.15.6(enzyme@3.11.0)(react-dom@17.0.2)(react@17.0.2):
-
resolution: {integrity: sha512-yFlVJCXh8T+mcQo8M6my9sPgeGzj85HSHi6Apgf1Cvq/7EL/J9+1JoJmJsRxZgyTvPMAqOEpRSu/Ii/ZpyOk0g==}
-
peerDependencies:
-
enzyme: ^3.0.0
-
react: ^16.0.0-0 || 17
-
react-dom: ^16.0.0-0 || 17
-
dependencies:
-
enzyme: 3.11.0
-
enzyme-adapter-utils: 1.14.0(react@17.0.2)
-
enzyme-shallow-equal: 1.0.4
-
has: 1.0.3
-
object.assign: 4.1.4
-
object.values: 1.1.6
-
prop-types: 15.8.1
-
react: 17.0.2
-
react-dom: 17.0.2(react@17.0.2)
-
react-is: 17.0.2
-
react-test-renderer: 16.14.0(react@17.0.2)
-
semver: 5.7.1
-
dev: true
-
-
/enzyme-adapter-utils@1.14.0(react@17.0.2):
-
resolution: {integrity: sha512-F/z/7SeLt+reKFcb7597IThpDp0bmzcH1E9Oabqv+o01cID2/YInlqHbFl7HzWBl4h3OdZYedtwNDOmSKkk0bg==}
-
peerDependencies:
-
react: 0.13.x || 0.14.x || ^15.0.0-0 || ^16.0.0-0 || 17
-
dependencies:
-
airbnb-prop-types: 2.16.0(react@17.0.2)
-
function.prototype.name: 1.1.5
-
has: 1.0.3
-
object.assign: 4.1.4
-
object.fromentries: 2.0.6
-
prop-types: 15.8.1
-
react: 17.0.2
-
semver: 5.7.1
-
dev: true
-
-
/enzyme-shallow-equal@1.0.4:
-
resolution: {integrity: sha512-MttIwB8kKxypwHvRynuC3ahyNc+cFbR8mjVIltnmzQ0uKGqmsfO4bfBuLxb0beLNPhjblUEYvEbsg+VSygvF1Q==}
-
dependencies:
-
has: 1.0.3
-
object-is: 1.1.5
-
dev: true
-
-
/enzyme@3.11.0:
-
resolution: {integrity: sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==}
-
dependencies:
-
array.prototype.flat: 1.3.1
-
cheerio: 1.0.0-rc.6
-
enzyme-shallow-equal: 1.0.4
-
function.prototype.name: 1.1.5
-
has: 1.0.3
-
html-element-map: 1.3.0
-
is-boolean-object: 1.1.2
-
is-callable: 1.2.7
-
is-number-object: 1.0.7
-
is-regex: 1.1.4
-
is-string: 1.0.7
-
is-subset: 0.1.1
-
lodash.escape: 4.0.1
-
lodash.isequal: 4.5.0
-
object-inspect: 1.12.3
-
object-is: 1.1.5
-
object.assign: 4.1.4
-
object.entries: 1.1.6
-
object.values: 1.1.6
-
raf: 3.4.1
-
rst-selector-parser: 2.2.3
-
string.prototype.trim: 1.2.7
-
dev: true
-
/err-code@2.0.3:
resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==}
dev: true
···
is-callable: 1.2.7
is-date-object: 1.0.5
is-symbol: 1.0.4
-
-
/es6-object-assign@1.1.0:
-
resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==}
-
dev: true
/esbuild-android-64@0.15.18:
resolution: {integrity: sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==}
···
make-dir: 2.1.0
pkg-dir: 3.0.0
-
/find-cache-dir@3.3.1:
-
resolution: {integrity: sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==}
-
engines: {node: '>=8'}
-
dependencies:
-
commondir: 1.0.1
-
make-dir: 3.1.0
-
pkg-dir: 4.2.0
-
dev: true
-
/find-cache-dir@3.3.2:
resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==}
engines: {node: '>=8'}
···
mime-types: 2.1.35
dev: true
-
/form-data@3.0.1:
-
resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==}
-
engines: {node: '>= 6'}
-
dependencies:
-
asynckit: 0.4.0
-
combined-stream: 1.0.8
-
mime-types: 2.1.35
-
dev: true
-
/form-data@4.0.0:
resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
engines: {node: '>= 6'}
···
/fs-write-stream-atomic@1.0.10:
resolution: {integrity: sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==}
dependencies:
-
graceful-fs: 4.2.10
+
graceful-fs: 4.2.11
iferr: 0.1.5
imurmurhash: 0.1.4
readable-stream: 2.3.7
···
resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==}
engines: {node: '>=0.6'}
dependencies:
-
graceful-fs: 4.2.10
+
graceful-fs: 4.2.11
inherits: 2.0.4
mkdirp: 0.5.5
rimraf: 2.7.1
···
has: 1.0.3
has-symbols: 1.0.3
-
/get-orientation@1.1.2:
-
resolution: {integrity: sha512-/pViTfifW+gBbh/RnlFYHINvELT9Znt+SYyDKAUL6uV6By019AK/s+i9XP4jSwq7lwP38Fd8HVeTxym3+hkwmQ==}
-
dependencies:
-
stream-parser: 0.3.1
-
transitivePeerDependencies:
-
- supports-color
-
dev: true
-
/get-proxy@2.1.0:
resolution: {integrity: sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==}
engines: {node: '>=4'}
···
engines: {node: '>=10.13.0'}
dependencies:
is-glob: 4.0.3
-
dev: true
-
-
/glob-to-regexp@0.4.1:
-
resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
dev: true
/glob@7.1.6:
···
/hsla-regex@1.0.0:
resolution: {integrity: sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==}
-
/html-element-map@1.3.0:
-
resolution: {integrity: sha512-AqCt/m9YaiMwaaAyOPdq4Ga0cM+jdDWWGueUMkdROZcTeClaGpN0AQeyGchZhTegQoABmc6+IqH7oCR/8vhQYg==}
-
dependencies:
-
array-filter: 1.0.0
-
call-bind: 1.0.2
-
dev: true
-
/html-encoding-sniffer@3.0.0:
resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==}
engines: {node: '>=12'}
···
inherits: 2.0.4
readable-stream: 3.6.2
-
/htmlparser2@6.1.0:
-
resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==}
-
dependencies:
-
domelementtype: 2.2.0
-
domhandler: 4.3.1
-
domutils: 2.8.0
-
entities: 2.2.0
-
dev: true
-
/http-cache-semantics@3.8.1:
resolution: {integrity: sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==}
···
/ignore@5.2.4:
resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
engines: {node: '>= 4'}
-
dev: true
-
-
/image-size@1.0.0:
-
resolution: {integrity: sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw==}
-
engines: {node: '>=12.0.0'}
-
hasBin: true
-
dependencies:
-
queue: 6.0.2
dev: true
/import-cwd@2.1.0:
···
engines: {node: '>=12'}
dev: true
-
/is-generator-function@1.0.9:
-
resolution: {integrity: sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==}
-
engines: {node: '>= 0.4'}
-
dev: true
-
/is-glob@3.1.0:
resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==}
engines: {node: '>=0.10.0'}
···
resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==}
dev: true
-
/is-nan@1.3.2:
-
resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==}
-
engines: {node: '>= 0.4'}
-
dependencies:
-
call-bind: 1.0.2
-
define-properties: 1.2.0
-
dev: true
-
/is-natural-number@4.0.1:
resolution: {integrity: sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==}
···
better-path-resolve: 1.0.0
dev: true
-
/is-subset@0.1.1:
-
resolution: {integrity: sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==}
-
dev: true
-
/is-symbol@1.0.4:
resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
engines: {node: '>= 0.4'}
···
has-to-string-tag-x: 1.4.1
is-object: 1.0.2
-
/jest-worker@27.0.0-next.5:
-
resolution: {integrity: sha512-mk0umAQ5lT+CaOJ+Qp01N6kz48sJG2kr2n1rX0koqKf6FIygQV0qLOdN9SCYID4IVeSigDOcPeGLozdMLYfb5g==}
-
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
-
dependencies:
-
'@types/node': 18.16.3
-
merge-stream: 2.0.0
-
supports-color: 8.1.1
-
dev: true
-
/js-beautify@1.14.6:
resolution: {integrity: sha512-GfofQY5zDp+cuHc+gsEXKPpNw2KbPddreEo35O6jT6i0RVK6LhsoYBhq5TvK4/n74wnA0QbK8gGd+jUZwTMKJw==}
engines: {node: '>=10'}
···
/jsonfile@4.0.0:
resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
optionalDependencies:
-
graceful-fs: 4.2.10
+
graceful-fs: 4.2.11
/jsonfile@6.1.0:
resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
dependencies:
universalify: 2.0.0
optionalDependencies:
-
graceful-fs: 4.2.10
+
graceful-fs: 4.2.11
dev: true
/jsonparse@1.3.1:
···
resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==}
engines: {node: '>=4'}
dependencies:
-
graceful-fs: 4.2.10
+
graceful-fs: 4.2.11
parse-json: 4.0.0
pify: 3.0.0
strip-bom: 3.0.0
···
json5: 0.5.1
object-assign: 4.1.1
-
/loader-utils@1.2.3:
-
resolution: {integrity: sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==}
-
engines: {node: '>=4.0.0'}
-
dependencies:
-
big.js: 5.2.2
-
emojis-list: 2.1.0
-
json5: 1.0.1
-
dev: true
-
/loader-utils@1.4.0:
resolution: {integrity: sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==}
engines: {node: '>=4.0.0'}
···
/lodash.debounce@4.0.8:
resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
-
/lodash.escape@4.0.1:
-
resolution: {integrity: sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==}
-
dev: true
-
-
/lodash.flattendeep@4.4.0:
-
resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==}
-
dev: true
-
-
/lodash.isequal@4.5.0:
-
resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
-
dev: true
-
/lodash.memoize@4.1.2:
resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==}
···
/lodash.once@4.1.1:
resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==}
-
dev: true
-
-
/lodash.sortby@4.7.0:
-
resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==}
dev: true
/lodash.startcase@4.4.0:
···
resolution: {integrity: sha512-Uj9iV0QYr6281G+o0TvqhKwHHWB2Q/qUTT4LPQ3qDGc0r8cbMuqQjRXPZuVZ+gcL7APx+iQgE8lcfWPrj1LsLA==}
dev: true
-
/moo@0.5.1:
-
resolution: {integrity: sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w==}
-
dev: true
-
/move-concurrently@1.0.1:
resolution: {integrity: sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==}
dependencies:
···
transitivePeerDependencies:
- supports-color
-
/native-url@0.3.4:
-
resolution: {integrity: sha512-6iM8R99ze45ivyH8vybJ7X0yekIcPf5GgLV5K0ENCbmRcaRIDoj37BC8iLEmaaBfqqb8enuZ5p0uhY+lVAbAcA==}
-
dependencies:
-
querystring: 0.2.1
-
dev: true
-
/natural-compare-lite@1.4.0:
resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==}
dev: true
···
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
dev: true
-
/nearley@2.20.1:
-
resolution: {integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==}
-
hasBin: true
-
dependencies:
-
commander: 2.20.3
-
moo: 0.5.1
-
railroad-diagrams: 1.0.0
-
randexp: 0.4.6
-
dev: true
-
/negotiator@0.6.2:
resolution: {integrity: sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==}
engines: {node: '>= 0.6'}
···
resolution: {integrity: sha512-ye8AIYWQcP9MvoM1i0Z2jV0qed31Z8EWXYnyGNkiUAd+Fo8J+7uy90xTV8g/oAbhtjkY7iZbNTizQaXdKUuwpQ==}
dev: true
-
/next@11.0.1(react-dom@17.0.2)(react@17.0.2)(typescript@5.0.4):
-
resolution: {integrity: sha512-yR7be7asNbvpVNpi6xxEg28wZ7Gqmj1nOt0sABH9qORmF3+pms2KZ7Cng33oK5nqPIzEEFJD0pp2PCe3/ueMIg==}
-
engines: {node: '>=12.0.0'}
+
/next@13.0.0(@babel/core@7.21.5)(react-dom@17.0.2)(react@17.0.2):
+
resolution: {integrity: sha512-puH1WGM6rGeFOoFdXXYfUxN9Sgi4LMytCV5HkQJvVUOhHfC1DoVqOfvzaEteyp6P04IW+gbtK2Q9pInVSrltPA==}
+
engines: {node: '>=14.6.0'}
hasBin: true
peerDependencies:
fibers: '>= 3.1.0'
-
node-sass: ^4.0.0 || ^5.0.0
-
react: ^17.0.2 || 17
-
react-dom: ^17.0.2 || 17
+
node-sass: ^6.0.0 || ^7.0.0
+
react: ^18.0.0-0 || 17
+
react-dom: ^18.0.0-0 || 17
sass: ^1.3.0
peerDependenciesMeta:
fibers:
···
sass:
optional: true
dependencies:
-
'@babel/runtime': 7.12.5
-
'@hapi/accept': 5.0.2
-
'@next/env': 11.0.1
-
'@next/polyfill-module': 11.0.1
-
'@next/react-dev-overlay': 11.0.1(react-dom@17.0.2)(react@17.0.2)
-
'@next/react-refresh-utils': 11.0.1(react-refresh@0.8.3)
-
assert: 2.0.0
-
ast-types: 0.13.2
-
browserify-zlib: 0.2.0
-
browserslist: 4.16.6
-
buffer: 5.6.0
+
'@next/env': 13.0.0
+
'@swc/helpers': 0.4.11
caniuse-lite: 1.0.30001466
-
chalk: 2.4.2
-
chokidar: 3.5.1
-
constants-browserify: 1.0.0
-
crypto-browserify: 3.12.0
-
cssnano-simple: 2.0.0(postcss@8.2.13)
-
domain-browser: 4.19.0
-
encoding: 0.1.13
-
etag: 1.8.1
-
find-cache-dir: 3.3.1
-
get-orientation: 1.1.2
-
https-browserify: 1.0.0
-
image-size: 1.0.0
-
jest-worker: 27.0.0-next.5
-
native-url: 0.3.4
-
node-fetch: 2.6.1
-
node-html-parser: 1.4.9
-
node-libs-browser: 2.2.1
-
os-browserify: 0.3.0
-
p-limit: 3.1.0
-
path-browserify: 1.0.1
-
pnp-webpack-plugin: 1.6.4(typescript@5.0.4)
-
postcss: 8.2.13
-
process: 0.11.10
-
prop-types: 15.7.2
-
querystring-es3: 0.2.1
-
raw-body: 2.4.1
+
postcss: 8.4.14
react: 17.0.2
react-dom: 17.0.2(react@17.0.2)
-
react-is: 17.0.2
-
react-refresh: 0.8.3
-
stream-browserify: 3.0.0
-
stream-http: 3.1.1
-
string_decoder: 1.3.0
-
styled-jsx: 3.3.2(react@17.0.2)
-
timers-browserify: 2.0.12
-
tty-browserify: 0.0.1
-
use-subscription: 1.5.1(react@17.0.2)
-
util: 0.12.3
-
vm-browserify: 1.1.2
-
watchpack: 2.1.1
+
styled-jsx: 5.1.0(@babel/core@7.21.5)(react@17.0.2)
+
use-sync-external-store: 1.2.0(react@17.0.2)
+
optionalDependencies:
+
'@next/swc-android-arm-eabi': 13.0.0
+
'@next/swc-android-arm64': 13.0.0
+
'@next/swc-darwin-arm64': 13.0.0
+
'@next/swc-darwin-x64': 13.0.0
+
'@next/swc-freebsd-x64': 13.0.0
+
'@next/swc-linux-arm-gnueabihf': 13.0.0
+
'@next/swc-linux-arm64-gnu': 13.0.0
+
'@next/swc-linux-arm64-musl': 13.0.0
+
'@next/swc-linux-x64-gnu': 13.0.0
+
'@next/swc-linux-x64-musl': 13.0.0
+
'@next/swc-win32-arm64-msvc': 13.0.0
+
'@next/swc-win32-ia32-msvc': 13.0.0
+
'@next/swc-win32-x64-msvc': 13.0.0
transitivePeerDependencies:
-
- supports-color
-
- typescript
-
- webpack
+
- '@babel/core'
+
- babel-plugin-macros
dev: true
/nice-try@1.0.5:
···
engines: {node: '>=10.5.0'}
dev: false
-
/node-fetch@2.6.1:
-
resolution: {integrity: sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==}
-
engines: {node: 4.x || >=6.0.0}
-
dev: true
-
/node-fetch@2.6.9:
resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==}
engines: {node: 4.x || >=6.0.0}
···
- supports-color
dev: true
-
/node-html-parser@1.4.9:
-
resolution: {integrity: sha512-UVcirFD1Bn0O+TSmloHeHqZZCxHjvtIeGdVdGMhyZ8/PWlEiZaZ5iJzR189yKZr8p0FXN58BUeC7RHRkf/KYGw==}
-
dependencies:
-
he: 1.2.0
-
dev: true
-
/node-html-parser@5.3.3:
resolution: {integrity: sha512-ncg1033CaX9UexbyA7e1N0aAoAYRDiV8jkTvzEnfd1GDvzFdrsXLzR4p4ik8mwLgnaKP/jyUFWDy9q3jvRT2Jw==}
dependencies:
···
url: 0.11.0
util: 0.11.1
vm-browserify: 1.1.2
-
-
/node-releases@1.1.71:
-
resolution: {integrity: sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==}
-
dev: true
/node-releases@2.0.10:
resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==}
···
json-parse-even-better-errors: 2.3.1
lines-and-columns: 1.2.4
-
/parse5-htmlparser2-tree-adapter@6.0.1:
-
resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==}
-
dependencies:
-
parse5: 6.0.1
-
dev: true
-
/parse5@6.0.1:
resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==}
···
/path-browserify@0.0.1:
resolution: {integrity: sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==}
-
-
/path-browserify@1.0.1:
-
resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
-
dev: true
/path-dirname@1.0.2:
resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==}
···
pathe: 1.1.0
dev: true
-
/platform@1.3.6:
-
resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==}
-
dev: true
-
/please-upgrade-node@3.2.0:
resolution: {integrity: sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==}
dependencies:
semver-compare: 1.0.0
dev: true
-
/pnp-webpack-plugin@1.6.4(typescript@5.0.4):
-
resolution: {integrity: sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==}
-
engines: {node: '>=6'}
-
dependencies:
-
ts-pnp: 1.2.0(typescript@5.0.4)
-
transitivePeerDependencies:
-
- typescript
-
dev: true
-
/portfinder@1.0.28(supports-color@6.1.0):
resolution: {integrity: sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==}
engines: {node: '>= 0.12.0'}
···
source-map: 0.6.1
supports-color: 6.1.0
-
/postcss@8.2.13:
-
resolution: {integrity: sha512-FCE5xLH+hjbzRdpbRb1IMCvPv9yZx2QnDarBEYSN0N0HYk+TcXsEhwdFcFb+SRWOKzKGErhIEbBK2ogyLdTtfQ==}
+
/postcss@8.4.14:
+
resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==}
engines: {node: ^10 || ^12 || >=14}
dependencies:
-
colorette: 1.2.2
nanoid: 3.3.4
-
source-map: 0.6.1
+
picocolors: 1.0.0
+
source-map-js: 1.0.2
dev: true
/postcss@8.4.21:
···
retry: 0.12.0
dev: true
-
/prop-types-exact@1.2.0:
-
resolution: {integrity: sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==}
-
dependencies:
-
has: 1.0.3
-
object.assign: 4.1.4
-
reflect.ownkeys: 0.2.0
-
dev: true
-
/prop-types@15.7.2:
resolution: {integrity: sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==}
dependencies:
loose-envify: 1.4.0
object-assign: 4.1.1
react-is: 17.0.2
+
dev: false
/prop-types@15.8.1:
resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
···
engines: {node: '>=0.4.x'}
deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
-
/querystring@0.2.1:
-
resolution: {integrity: sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==}
-
engines: {node: '>=0.4.x'}
-
deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
-
dev: true
-
/querystringify@2.2.0:
resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
···
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
dev: true
-
/queue@6.0.2:
-
resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==}
-
dependencies:
-
inherits: 2.0.4
-
dev: true
-
/quick-lru@4.0.1:
resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==}
engines: {node: '>=8'}
···
dependencies:
performance-now: 2.1.0
-
/railroad-diagrams@1.0.0:
-
resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==}
-
dev: true
-
-
/randexp@0.4.6:
-
resolution: {integrity: sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==}
-
engines: {node: '>=0.12'}
-
dependencies:
-
discontinuous-range: 1.0.0
-
ret: 0.1.15
-
dev: true
-
/randombytes@2.1.0:
resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
dependencies:
···
iconv-lite: 0.4.24
unpipe: 1.0.0
-
/raw-body@2.4.1:
-
resolution: {integrity: sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==}
-
engines: {node: '>= 0.8'}
-
dependencies:
-
bytes: 3.1.0
-
http-errors: 1.7.3
-
iconv-lite: 0.4.24
-
unpipe: 1.0.0
-
dev: true
-
/raw-loader@3.1.0(webpack@4.46.0):
resolution: {integrity: sha512-lzUVMuJ06HF4rYveaz9Tv0WRlUMxJ0Y1hgSkkgg+50iEdaI0TthyEDe08KIHb0XsF6rn8WYTqPCaGTZg3sX+qA==}
engines: {node: '>= 8.9.0'}
···
/react-lifecycles-compat@3.0.4:
resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==}
-
/react-refresh@0.8.3:
-
resolution: {integrity: sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==}
-
engines: {node: '>=0.10.0'}
-
dev: true
-
/react-router-dom@5.2.0(react@17.0.2):
resolution: {integrity: sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==}
peerDependencies:
···
react: ^16.8.0 || ^17.0.0 || 17
dependencies:
react: 17.0.2
+
dev: true
/react-static-plugin-md-pages@0.3.3(react-static@7.3.0)(react@17.0.2):
resolution: {integrity: sha512-2vJO2g62zKf5avSsT/5IEbDPhAoWjP4tH+nyMLKta1G4AixlqPYagS7aCpDXRpzgs9ot8LN/aewrd5Vi1oWqew==}
···
- webpack-cli
- webpack-command
-
/react-test-renderer@16.14.0(react@17.0.2):
-
resolution: {integrity: sha512-L8yPjqPE5CZO6rKsKXRO/rVPiaCOy0tQQJbC+UjPNlobl5mad59lvPjwFsQHTvL03caVDIVr9x9/OSgDe6I5Eg==}
-
peerDependencies:
-
react: ^16.14.0 || 17
-
dependencies:
-
object-assign: 4.1.1
-
prop-types: 15.8.1
-
react: 17.0.2
-
react-is: 17.0.2
-
scheduler: 0.19.1
-
dev: true
-
/react-test-renderer@17.0.2(react@17.0.2):
resolution: {integrity: sha512-yaQ9cB89c17PUb0x6UfWRs7kQCorVdHlutU1boVPEsB8IDZH6n9tHxMacc3y0JoXOJUsZb/t/Mb8FUWMKaM7iQ==}
peerDependencies:
···
resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==}
engines: {node: '>=0.10'}
dependencies:
-
graceful-fs: 4.2.10
+
graceful-fs: 4.2.11
micromatch: 3.1.10(supports-color@6.1.0)
readable-stream: 2.3.7
transitivePeerDependencies:
- supports-color
-
/readdirp@3.5.0:
-
resolution: {integrity: sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==}
-
engines: {node: '>=8.10.0'}
-
dependencies:
-
picomatch: 2.3.1
-
dev: true
-
/readdirp@3.6.0:
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
engines: {node: '>=8.10.0'}
···
dependencies:
indent-string: 4.0.0
strip-indent: 3.0.0
-
dev: true
-
-
/reflect.ownkeys@0.2.0:
-
resolution: {integrity: sha512-qOLsBKHCpSOFKK1NUOCGC5VyeufB6lEsFe92AL2bhIJsacZS1qdoOZSbPk3MYKuT2cFlRDnulKXuuElIrMjGUg==}
dev: true
/regenerate-unicode-properties@8.2.0:
···
resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==}
dev: true
-
/rst-selector-parser@2.2.3:
-
resolution: {integrity: sha512-nDG1rZeP6oFTLN6yNDV/uiAvs1+FS/KlrEwh7+y7dpuApDBy6bI2HTBcc0/V8lv9OTqfyD34eF7au2pm8aBbhA==}
-
dependencies:
-
lodash.flattendeep: 4.4.0
-
nearley: 2.20.1
-
dev: true
-
/run-async@2.4.1:
resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==}
engines: {node: '>=0.12.0'}
···
xmlchars: 2.2.0
dev: true
-
/scheduler@0.19.1:
-
resolution: {integrity: sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==}
-
dependencies:
-
loose-envify: 1.4.0
-
object-assign: 4.1.1
-
dev: true
-
/scheduler@0.20.2:
resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==}
dependencies:
···
/shebang-regex@3.0.0:
resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
engines: {node: '>=8'}
-
dev: true
-
-
/shell-quote@1.7.2:
-
resolution: {integrity: sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==}
dev: true
/shell-quote@1.8.0:
···
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
engines: {node: '>=0.10.0'}
-
/source-map@0.7.3:
-
resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==}
-
engines: {node: '>= 8'}
-
dev: true
-
/source-map@0.7.4:
resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
engines: {node: '>= 8'}
-
/source-map@0.8.0-beta.0:
-
resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==}
-
engines: {node: '>= 8'}
-
dependencies:
-
whatwg-url: 7.1.0
-
dev: true
-
/sourcemap-codec@1.4.8:
resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
deprecated: Please use @jridgewell/sourcemap-codec instead
···
resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
dev: true
-
/stacktrace-parser@0.1.10:
-
resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==}
-
engines: {node: '>=6'}
-
dependencies:
-
type-fest: 0.7.1
-
dev: true
-
/state-toggle@1.0.3:
resolution: {integrity: sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==}
···
dependencies:
inherits: 2.0.4
readable-stream: 2.3.7
-
-
/stream-browserify@3.0.0:
-
resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==}
-
dependencies:
-
inherits: 2.0.4
-
readable-stream: 3.6.2
-
dev: true
/stream-each@1.2.3:
resolution: {integrity: sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==}
···
to-arraybuffer: 1.0.1
xtend: 4.0.2
-
/stream-http@3.1.1:
-
resolution: {integrity: sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg==}
-
dependencies:
-
builtin-status-codes: 3.0.0
-
inherits: 2.0.4
-
readable-stream: 3.6.2
-
xtend: 4.0.2
-
dev: true
-
-
/stream-parser@0.3.1:
-
resolution: {integrity: sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==}
-
dependencies:
-
debug: 2.6.9(supports-color@6.1.0)
-
transitivePeerDependencies:
-
- supports-color
-
dev: true
-
/stream-shift@1.0.1:
resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==}
···
/string-argv@0.3.1:
resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==}
engines: {node: '>=0.6.19'}
-
dev: true
-
-
/string-hash@1.1.3:
-
resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==}
dev: true
/string-width@2.1.1:
···
dependencies:
ansi-regex: 4.1.0
-
/strip-ansi@6.0.0:
-
resolution: {integrity: sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==}
-
engines: {node: '>=8'}
-
dependencies:
-
ansi-regex: 5.0.1
-
dev: true
-
/strip-ansi@6.0.1:
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
engines: {node: '>=8'}
···
shallowequal: 1.1.0
supports-color: 5.5.0
-
/styled-jsx@3.3.2(react@17.0.2):
-
resolution: {integrity: sha512-daAkGd5mqhbBhLd6jYAjYBa9LpxYCzsgo/f6qzPdFxVB8yoGbhxvzQgkC0pfmCVvW3JuAEBn0UzFLBfkHVZG1g==}
+
/styled-jsx@5.1.0(@babel/core@7.21.5)(react@17.0.2):
+
resolution: {integrity: sha512-/iHaRJt9U7T+5tp6TRelLnqBqiaIT0HsO0+vgyj8hK2KUk7aejFqRrumqPUlAqDwAj8IbS/1hk3IhBAAK/FCUQ==}
+
engines: {node: '>= 12.0.0'}
peerDependencies:
-
react: 15.x.x || 16.x.x || 17.x.x || 17
+
'@babel/core': '*'
+
babel-plugin-macros: '*'
+
react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || 17'
+
peerDependenciesMeta:
+
'@babel/core':
+
optional: true
+
babel-plugin-macros:
+
optional: true
dependencies:
-
'@babel/types': 7.8.3
-
babel-plugin-syntax-jsx: 6.18.0
-
convert-source-map: 1.7.0
-
loader-utils: 1.2.3
+
'@babel/core': 7.21.5
+
client-only: 0.0.1
react: 17.0.2
-
source-map: 0.7.3
-
string-hash: 1.1.3
-
stylis: 3.5.4
-
stylis-rule-sheet: 0.0.10(stylis@3.5.4)
dev: true
/stylehacks@4.0.3:
···
browserslist: 4.21.5
postcss: 7.0.35
postcss-selector-parser: 3.1.2
-
-
/stylis-rule-sheet@0.0.10(stylis@3.5.4):
-
resolution: {integrity: sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==}
-
peerDependencies:
-
stylis: ^3.5.0
-
dependencies:
-
stylis: 3.5.4
-
dev: true
-
-
/stylis@3.5.4:
-
resolution: {integrity: sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==}
-
dev: true
/supports-color@5.5.0:
resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
···
/tr46@0.0.3:
resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
-
/tr46@1.0.1:
-
resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==}
-
dependencies:
-
punycode: 2.3.0
-
dev: true
-
/tr46@4.1.1:
resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==}
engines: {node: '>=14'}
···
/tryer@1.0.1:
resolution: {integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==}
-
/ts-pnp@1.2.0(typescript@5.0.4):
-
resolution: {integrity: sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==}
-
engines: {node: '>=6'}
-
peerDependencies:
-
typescript: '*'
-
peerDependenciesMeta:
-
typescript:
-
optional: true
-
dependencies:
-
typescript: 5.0.4
-
dev: true
-
/tsconfck@2.1.1(typescript@5.0.4):
resolution: {integrity: sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==}
engines: {node: ^14.13.1 || ^16 || >=18}
···
/tty-browserify@0.0.0:
resolution: {integrity: sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==}
-
-
/tty-browserify@0.0.1:
-
resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==}
-
dev: true
/tty-table@4.2.1:
resolution: {integrity: sha512-xz0uKo+KakCQ+Dxj1D/tKn2FSyreSYWzdkL/BYhgN6oMW808g8QRMuh1atAV9fjTPbWBjfbkKQpI/5rEcnAc7g==}
···
/type-fest@0.6.0:
resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==}
-
engines: {node: '>=8'}
-
dev: true
-
-
/type-fest@0.7.1:
-
resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==}
engines: {node: '>=8'}
dev: true
···
punycode: 1.3.2
querystring: 0.2.0
-
/use-subscription@1.5.1(react@17.0.2):
-
resolution: {integrity: sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==}
+
/use-sync-external-store@1.2.0(react@17.0.2):
+
resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==}
peerDependencies:
-
react: ^16.8.0 || ^17.0.0 || 17
+
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || 17
dependencies:
-
object-assign: 4.1.1
react: 17.0.2
dev: true
···
dependencies:
inherits: 2.0.3
-
/util@0.12.3:
-
resolution: {integrity: sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog==}
-
dependencies:
-
inherits: 2.0.4
-
is-arguments: 1.1.0
-
is-generator-function: 1.0.9
-
is-typed-array: 1.1.10
-
safe-buffer: 5.2.1
-
which-typed-array: 1.1.9
-
dev: true
-
-
/util@0.12.4:
-
resolution: {integrity: sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==}
-
dependencies:
-
inherits: 2.0.4
-
is-arguments: 1.1.0
-
is-generator-function: 1.0.9
-
is-typed-array: 1.1.10
-
safe-buffer: 5.2.1
-
which-typed-array: 1.1.9
-
dev: true
-
/utila@0.4.0:
resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==}
···
transitivePeerDependencies:
- supports-color
-
/watchpack@2.1.1:
-
resolution: {integrity: sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw==}
-
engines: {node: '>=10.13.0'}
-
dependencies:
-
glob-to-regexp: 0.4.1
-
graceful-fs: 4.2.10
-
dev: true
-
/wbuf@1.7.3:
resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==}
dependencies:
···
/webidl-conversions@3.0.1:
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
-
-
/webidl-conversions@4.0.2:
-
resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==}
-
dev: true
/webidl-conversions@7.0.0:
resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
···
dependencies:
tr46: 0.0.3
webidl-conversions: 3.0.1
-
-
/whatwg-url@7.1.0:
-
resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==}
-
dependencies:
-
lodash.sortby: 4.7.0
-
tr46: 1.0.1
-
webidl-conversions: 4.0.2
-
dev: true
/which-boxed-primitive@1.0.2:
resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
+8 -2
scripts/prepare/index.js
···
'peerDependencies',
].some((dep) => pkg[dep] && pkg[dep].react);
+
const hasNext = [
+
'dependencies',
+
'optionalDependencies',
+
'peerDependencies',
+
].some((dep) => pkg[dep] && pkg[dep].next);
+
const normalize = name => name
.replace(/[@\s\/\.]+/g, ' ')
.trim()
···
'package.json:source must exist'
);
-
if (hasReact) {
+
if (hasReact && !hasNext) {
invariant(
is(pkg.main, path.join('dist', `${name}.js`)),
'package.json:main path must end in `.js` for packages depending on React.'
···
'package.json:files must include "dist" and "LICENSE"'
);
-
if (hasReact) {
+
if (hasReact && !hasNext) {
invariant(!pkg.exports, 'package.json:exports must not be added for packages depending on React.');
} else {
invariant(!!pkg.exports, 'package.json:exports must be added and have a "." entry');
+2 -1
scripts/rollup/config.mjs
···
throw new Error('Invalid option `format` at output({ ... })');
let extension = format === 'esm'
-
? (settings.hasReact ? '.es.js' : '.mjs')
+
? (settings.hasReact && !settings.hasNext ? '.es.js' : '.mjs')
: '.js';
if (isProduction) {
extension = '.min' + extension;
···
dir: './dist',
exports: 'named',
sourcemap: true,
+
banner: chunk => chunk.name === 'urql-next' ? '"use client"' : undefined,
sourcemapExcludeSources: false,
hoistTransitiveImports: false,
indent: false,
+1 -1
scripts/rollup/plugins.mjs
···
export const makeBasePlugins = () => [
resolve({
dedupe: settings.externalModules,
-
extensions: ['.js', '.ts'],
+
extensions: ['.js', '.ts', '.tsx'],
mainFields: ['module', 'jsnext', 'main'],
preferBuiltins: false,
browser: true
+1
scripts/rollup/settings.mjs
···
return externalPredicate.test(id);
};
+
export const hasNext = prodDependencies.has('next');
export const hasReact = prodDependencies.has('react');
export const hasPreact = prodDependencies.has('preact');
export const hasSvelte = prodDependencies.has('svelte');