@wener/console
Version:
Base console UI toolkit
100 lines (99 loc) • 4.12 kB
JavaScript
import { Client, fetchExchange } from "@urql/core";
import { devtoolsExchange } from "@urql/devtools";
import { cacheExchange } from "@urql/exchange-graphcache";
import { persistedExchange } from "@urql/exchange-persisted";
import { retryExchange } from "@urql/exchange-retry";
import { ms } from "@wener/utils";
import { batchFetchExchange } from "./batchFetchExchange.js";
export function createUrqlClient({ getToken, url, persisted = false, batch = true, schema, cache, resolveTypeNameFromKey }) {
const client = new Client({
url,
fetchSubscriptions: true,
// requestPolicy: 'cache-and-network',
exchanges: [
process.env.NODE_ENV === "development" && devtoolsExchange,
cacheExchange({
...cache,
schema,
keys: new Proxy({}, {
get(target, prop, receiver) {
if (typeof prop !== "string") {
return null;
}
let preset = target[prop];
if (preset) {
return preset;
}
// console.log(`cacheExchange key: ${prop}`);
let getKey = (data) => data?.id;
if (prop.endsWith("Payload")) {
getKey = () => null;
}
return target[prop] = getKey;
}
}),
resolvers: {
Query: {
node: (parent, args, cache, info) => {
let __typename;
let id = args.id;
if (typeof id === "string" && resolveTypeNameFromKey) {
// const idType = id.split('_')[0];
// __typename = (
// {
// usr: 'User',
// } as Record<string, string>
// )[idType];
__typename = resolveTypeNameFromKey(id);
}
return __typename ? {
__typename,
id
} : cache.resolve(parent, info.parentFieldKey);
}
},
...cache?.resolvers
}
}),
// scalarExchange({
// schema: schema as any,
// scalars: {
// JSON(value) {
// if (value && typeof value === 'string') return JSON.parse(value);
// return value;
// },
// },
// }),
batch ? batchFetchExchange({
maxBatchSize: 1000
}) : undefined,
persisted ? persistedExchange({
preferGetForPersistedQueries: true,
// enforcePersistedQueries: true,
enableForMutation: true,
// https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#normalized-caches-urql-and-apollo-client
generateHash: (_, document) => Promise.resolve(document["__meta__"]?.["hash"])
}) : undefined,
retryExchange({
initialDelayMs: 1000,
maxDelayMs: ms("5m"),
maxNumberAttempts: Number.POSITIVE_INFINITY,
// 默认只重试网络错误
retryIf: (err) => Boolean(err && err.networkError)
}),
fetchExchange
].filter(Boolean),
fetchOptions: () => {
let headers = {};
const token = getToken?.();
if (token) {
headers["Authorization"] = `Bearer ${token}`;
}
return {
headers
};
}
});
return client;
}
//# sourceMappingURL=createUrqlClient.js.map