graphql-codegen-plugin-typescript-swr 0.8.4 → 0.8.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/main/config.d.ts +27 -0
- package/build/main/config.js +3 -0
- package/build/main/index.d.ts +6 -0
- package/build/main/index.js +35 -0
- package/build/main/visitor.d.ts +30 -0
- package/build/main/visitor.js +160 -0
- package/build/module/config.d.ts +27 -0
- package/build/module/config.js +2 -0
- package/build/module/index.d.ts +6 -0
- package/build/module/index.js +30 -0
- package/build/module/visitor.d.ts +30 -0
- package/build/module/visitor.js +153 -0
- package/build/tsconfig.main.tsbuildinfo +1 -0
- package/build/tsconfig.module.tsbuildinfo +1 -0
- package/package.json +1 -1
- package/yarn-error.log +0 -5477
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { RawClientSideBasePluginConfig } from '@graphql-codegen/visitor-plugin-common';
|
|
2
|
+
/**
|
|
3
|
+
* @description This plugin generates [`graphql-request`](https://www.npmjs.com/package/graphql-request) ready-to-use SDK, which is fully-typed.
|
|
4
|
+
*/
|
|
5
|
+
export interface RawSWRPluginConfig extends RawClientSideBasePluginConfig {
|
|
6
|
+
/**
|
|
7
|
+
* @description By default the `request` method return the `data` or `errors` key from the response. If you need to access the `extensions` key you can use the `rawRequest` method.
|
|
8
|
+
* @default false
|
|
9
|
+
*
|
|
10
|
+
* @exampleMarkdown
|
|
11
|
+
* ```yml
|
|
12
|
+
* generates:
|
|
13
|
+
* path/to/file.ts:
|
|
14
|
+
* plugins:
|
|
15
|
+
* - typescript
|
|
16
|
+
* - typescript-operations
|
|
17
|
+
* - typescript-graphql-request
|
|
18
|
+
* - graphql-codegen-plugin-typescript-swr
|
|
19
|
+
* config:
|
|
20
|
+
* rawRequest: true
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
rawRequest?: boolean;
|
|
24
|
+
excludeQueries?: string | string[];
|
|
25
|
+
useSWRInfinite?: string | string[];
|
|
26
|
+
autogenSWRKey?: boolean;
|
|
27
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { PluginValidateFn, PluginFunction } from '@graphql-codegen/plugin-helpers';
|
|
2
|
+
import { RawSWRPluginConfig } from './config';
|
|
3
|
+
import { SWRVisitor } from './visitor';
|
|
4
|
+
export declare const plugin: PluginFunction<RawSWRPluginConfig>;
|
|
5
|
+
export declare const validate: PluginValidateFn<any>;
|
|
6
|
+
export { SWRVisitor };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SWRVisitor = exports.validate = exports.plugin = void 0;
|
|
4
|
+
const path_1 = require("path");
|
|
5
|
+
const plugin_helpers_1 = require("@graphql-codegen/plugin-helpers");
|
|
6
|
+
const graphql_1 = require("graphql");
|
|
7
|
+
const visitor_1 = require("./visitor");
|
|
8
|
+
Object.defineProperty(exports, "SWRVisitor", { enumerable: true, get: function () { return visitor_1.SWRVisitor; } });
|
|
9
|
+
const plugin = (schema, documents, config) => {
|
|
10
|
+
const allAst = (0, graphql_1.concatAST)(documents.map((v) => v.document));
|
|
11
|
+
const allFragments = [
|
|
12
|
+
// prettier-ignore
|
|
13
|
+
...allAst.definitions.filter((d) => d.kind === graphql_1.Kind.FRAGMENT_DEFINITION).map((fragmentDef) => ({
|
|
14
|
+
node: fragmentDef,
|
|
15
|
+
name: fragmentDef.name.value,
|
|
16
|
+
onType: fragmentDef.typeCondition.name.value,
|
|
17
|
+
isExternal: false,
|
|
18
|
+
})),
|
|
19
|
+
...(config.externalFragments || []),
|
|
20
|
+
];
|
|
21
|
+
const visitor = new visitor_1.SWRVisitor(schema, allFragments, config);
|
|
22
|
+
(0, plugin_helpers_1.oldVisit)(allAst, { leave: visitor });
|
|
23
|
+
return {
|
|
24
|
+
prepend: visitor.getImports(),
|
|
25
|
+
content: visitor.sdkContent,
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
exports.plugin = plugin;
|
|
29
|
+
const validate = async (_schema, _documents, _config, outputFile) => {
|
|
30
|
+
if ((0, path_1.extname)(outputFile) !== '.ts') {
|
|
31
|
+
throw new Error(`Plugin "typescript-swr" requires extension to be ".ts"!`);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
exports.validate = validate;
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQThCO0FBRTlCLG9FQUt3QztBQUV4QyxxQ0FBZ0Y7QUFHaEYsdUNBQXNDO0FBeUM3QiwyRkF6Q0Esb0JBQVUsT0F5Q0E7QUF2Q1osTUFBTSxNQUFNLEdBQXVDLENBQ3hELE1BQXFCLEVBQ3JCLFNBQStCLEVBQy9CLE1BQTBCLEVBQzFCLEVBQUU7SUFDRixNQUFNLE1BQU0sR0FBRyxJQUFBLG1CQUFTLEVBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7SUFFMUQsTUFBTSxZQUFZLEdBQXFCO1FBQ3JDLGtCQUFrQjtRQUNsQixHQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUMzQixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxjQUFJLENBQUMsbUJBQW1CLENBQ2QsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbkQsSUFBSSxFQUFFLFdBQVc7WUFDakIsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSztZQUM1QixNQUFNLEVBQUUsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSztZQUM1QyxVQUFVLEVBQUUsS0FBSztTQUNsQixDQUFDLENBQUM7UUFDSCxHQUFHLENBQUMsTUFBTSxDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQztLQUNwQyxDQUFBO0lBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxvQkFBVSxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDNUQsSUFBQSx5QkFBUSxFQUFDLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFBO0lBQ3BDLE9BQU87UUFDTCxPQUFPLEVBQUUsT0FBTyxDQUFDLFVBQVUsRUFBRTtRQUM3QixPQUFPLEVBQUUsT0FBTyxDQUFDLFVBQVU7S0FDNUIsQ0FBQTtBQUNILENBQUMsQ0FBQTtBQTFCWSxRQUFBLE1BQU0sVUEwQmxCO0FBRU0sTUFBTSxRQUFRLEdBQTBCLEtBQUssRUFDbEQsT0FBc0IsRUFDdEIsVUFBZ0MsRUFDaEMsT0FBMkIsRUFDM0IsVUFBa0IsRUFDbEIsRUFBRTtJQUNGLElBQUksSUFBQSxjQUFPLEVBQUMsVUFBVSxDQUFDLEtBQUssS0FBSyxFQUFFO1FBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMseURBQXlELENBQUMsQ0FBQTtLQUMzRTtBQUNILENBQUMsQ0FBQTtBQVRZLFFBQUEsUUFBUSxZQVNwQiJ9
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { ClientSideBasePluginConfig, ClientSideBaseVisitor, LoadedFragment, ParsedConfig } from '@graphql-codegen/visitor-plugin-common';
|
|
2
|
+
import { GraphQLSchema, OperationDefinitionNode } from 'graphql';
|
|
3
|
+
import { RawSWRPluginConfig } from './config';
|
|
4
|
+
export interface SWRPluginConfig extends ClientSideBasePluginConfig {
|
|
5
|
+
rawRequest: boolean;
|
|
6
|
+
excludeQueries: string | string[];
|
|
7
|
+
useSWRInfinite: string | string[];
|
|
8
|
+
autogenSWRKey: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface Operation {
|
|
11
|
+
node: OperationDefinitionNode;
|
|
12
|
+
documentVariableName: string;
|
|
13
|
+
operationType: string;
|
|
14
|
+
operationResultType: string;
|
|
15
|
+
operationVariablesTypes: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ComposeQueryHandlerConfig {
|
|
18
|
+
autogenKey: SWRPluginConfig['autogenSWRKey'];
|
|
19
|
+
infinite: boolean;
|
|
20
|
+
rawRequest: SWRPluginConfig['rawRequest'];
|
|
21
|
+
typesPrefix: ParsedConfig['typesPrefix'];
|
|
22
|
+
typesSuffix: ParsedConfig['typesSuffix'];
|
|
23
|
+
}
|
|
24
|
+
export declare class SWRVisitor extends ClientSideBaseVisitor<RawSWRPluginConfig, SWRPluginConfig> {
|
|
25
|
+
private _operationsToInclude;
|
|
26
|
+
private _enabledInfinite;
|
|
27
|
+
constructor(schema: GraphQLSchema, fragments: LoadedFragment[], rawConfig: RawSWRPluginConfig);
|
|
28
|
+
protected buildOperation(node: OperationDefinitionNode, documentVariableName: string, operationType: string, operationResultType: string, operationVariablesTypes: string): string;
|
|
29
|
+
get sdkContent(): string;
|
|
30
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SWRVisitor = void 0;
|
|
7
|
+
const visitor_plugin_common_1 = require("@graphql-codegen/visitor-plugin-common");
|
|
8
|
+
const graphql_1 = require("graphql");
|
|
9
|
+
const micromatch_1 = __importDefault(require("micromatch"));
|
|
10
|
+
const pascal_case_1 = require("pascal-case");
|
|
11
|
+
const composeQueryHandler = (operation, config) => {
|
|
12
|
+
const codes = [];
|
|
13
|
+
const { node } = operation;
|
|
14
|
+
const optionalVariables = !node.variableDefinitions ||
|
|
15
|
+
node.variableDefinitions.length === 0 ||
|
|
16
|
+
node.variableDefinitions.every((v) => v.type.kind !== graphql_1.Kind.NON_NULL_TYPE || v.defaultValue)
|
|
17
|
+
? '?'
|
|
18
|
+
: '';
|
|
19
|
+
const name = node.name.value;
|
|
20
|
+
const pascalName = (0, pascal_case_1.pascalCase)(node.name.value);
|
|
21
|
+
const responseType = config.rawRequest
|
|
22
|
+
? `SWRRawResponse<${operation.operationResultType}>`
|
|
23
|
+
: operation.operationResultType;
|
|
24
|
+
const variablesType = operation.operationVariablesTypes;
|
|
25
|
+
codes.push(`use${pascalName}(${config.autogenKey ? '' : 'key: SWRKeyInterface, '}variables${optionalVariables}: ${variablesType}, config?: SWRConfigInterface<${responseType}, ClientError>) {
|
|
26
|
+
return useSWR<${responseType}, ClientError>(${config.autogenKey
|
|
27
|
+
? `genKey<${variablesType}>('${pascalName}', variables)`
|
|
28
|
+
: 'key'}, () => sdk.${name}(variables), config);
|
|
29
|
+
}`);
|
|
30
|
+
if (config.infinite) {
|
|
31
|
+
codes.push(`use${pascalName}Infinite(${config.autogenKey ? '' : 'id: string, '}getKey: ${config.typesPrefix}SWRInfiniteKeyLoader${config.typesSuffix}<${responseType}, ${variablesType}>, variables${optionalVariables}: ${variablesType}, config?: SWRInfiniteConfiguration<${responseType}, ClientError>) {
|
|
32
|
+
return useSWRInfinite<${responseType}, ClientError>(
|
|
33
|
+
utilsForInfinite.generateGetKey<${responseType}, ${variablesType}>(${config.autogenKey
|
|
34
|
+
? `genKey<${variablesType}>('${pascalName}', variables)`
|
|
35
|
+
: 'id'}, getKey),
|
|
36
|
+
utilsForInfinite.generateFetcher<${responseType}, ${variablesType}>(sdk.${name}, variables),
|
|
37
|
+
config);
|
|
38
|
+
}`);
|
|
39
|
+
}
|
|
40
|
+
return codes;
|
|
41
|
+
};
|
|
42
|
+
class SWRVisitor extends visitor_plugin_common_1.ClientSideBaseVisitor {
|
|
43
|
+
constructor(schema, fragments, rawConfig) {
|
|
44
|
+
super(schema, fragments, rawConfig, {
|
|
45
|
+
excludeQueries: rawConfig.excludeQueries || null,
|
|
46
|
+
useSWRInfinite: rawConfig.useSWRInfinite || null,
|
|
47
|
+
autogenSWRKey: rawConfig.autogenSWRKey || false,
|
|
48
|
+
});
|
|
49
|
+
this._operationsToInclude = [];
|
|
50
|
+
this._enabledInfinite = false;
|
|
51
|
+
this._enabledInfinite =
|
|
52
|
+
(this.config.useSWRInfinite &&
|
|
53
|
+
typeof this.config.useSWRInfinite === 'string') ||
|
|
54
|
+
(Array.isArray(this.config.useSWRInfinite) &&
|
|
55
|
+
this.config.useSWRInfinite.length > 0);
|
|
56
|
+
const typeImport = this.config.useTypeImports ? 'import type' : 'import';
|
|
57
|
+
this._additionalImports.push(`${typeImport} { ClientError } from 'graphql-request/dist/types';`);
|
|
58
|
+
if (this.config.useTypeImports) {
|
|
59
|
+
if (this._enabledInfinite) {
|
|
60
|
+
this._additionalImports.push(`import type { SWRConfiguration as SWRConfigInterface, Key as SWRKeyInterface } from 'swr';`);
|
|
61
|
+
this._additionalImports.push(`import type { SWRInfiniteConfiguration } from 'swr/infinite';`);
|
|
62
|
+
this._additionalImports.push(`import useSWR from 'swr';`);
|
|
63
|
+
this._additionalImports.push(`import useSWRInfinite from 'swr/infinite';`);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
this._additionalImports.push(`import type { SWRConfiguration as SWRConfigInterface, Key as SWRKeyInterface } from 'swr';`);
|
|
67
|
+
this._additionalImports.push(`import useSWR from 'swr';`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else if (this._enabledInfinite) {
|
|
71
|
+
this._additionalImports.push(`import useSWR, { SWRConfiguration as SWRConfigInterface, Key as SWRKeyInterface } from 'swr';`);
|
|
72
|
+
this._additionalImports.push(`import useSWRInfinite, { SWRInfiniteConfiguration } from 'swr/infinite';`);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
this._additionalImports.push(`import useSWR, { SWRConfiguration as SWRConfigInterface, Key as SWRKeyInterface } from 'swr';`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
buildOperation(node, documentVariableName, operationType, operationResultType, operationVariablesTypes) {
|
|
79
|
+
this._operationsToInclude.push({
|
|
80
|
+
node,
|
|
81
|
+
documentVariableName,
|
|
82
|
+
operationType,
|
|
83
|
+
operationResultType,
|
|
84
|
+
operationVariablesTypes,
|
|
85
|
+
});
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
get sdkContent() {
|
|
89
|
+
const codes = [];
|
|
90
|
+
const { config } = this;
|
|
91
|
+
const disabledexcludeQueries = !config.excludeQueries ||
|
|
92
|
+
(Array.isArray(config.excludeQueries) && !config.excludeQueries.length);
|
|
93
|
+
const allPossibleActions = this._operationsToInclude
|
|
94
|
+
.filter((o) => {
|
|
95
|
+
if (o.operationType !== 'Query') {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
if (disabledexcludeQueries) {
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
return !micromatch_1.default.isMatch(o.node.name.value, config.excludeQueries);
|
|
102
|
+
})
|
|
103
|
+
.map((o) => composeQueryHandler(o, {
|
|
104
|
+
autogenKey: config.autogenSWRKey,
|
|
105
|
+
infinite: this._enabledInfinite &&
|
|
106
|
+
micromatch_1.default.isMatch(o.node.name.value, config.useSWRInfinite),
|
|
107
|
+
rawRequest: config.rawRequest,
|
|
108
|
+
typesPrefix: config.typesPrefix,
|
|
109
|
+
typesSuffix: config.typesSuffix,
|
|
110
|
+
}))
|
|
111
|
+
.reduce((p, c) => p.concat(c), [])
|
|
112
|
+
.map((s) => (0, visitor_plugin_common_1.indentMultiline)(s, 2));
|
|
113
|
+
// Add type of SWRRawResponse
|
|
114
|
+
if (config.rawRequest) {
|
|
115
|
+
codes.push(`type SWRRawResponse<Data = any> = { data?: Data | undefined; extensions?: any; headers: Headers; status: number; errors?: GraphQLError[] | undefined; };`);
|
|
116
|
+
}
|
|
117
|
+
// Add type of SWRInfiniteKeyLoader
|
|
118
|
+
if (this._enabledInfinite) {
|
|
119
|
+
codes.push(`export type ${config.typesPrefix}SWRInfiniteKeyLoader${config.typesSuffix}<Data = unknown, Variables = unknown> = (
|
|
120
|
+
index: number,
|
|
121
|
+
previousPageData: Data | null
|
|
122
|
+
) => [keyof Variables, Variables[keyof Variables] | null] | null;`);
|
|
123
|
+
}
|
|
124
|
+
// Add getSdkWithHooks function
|
|
125
|
+
codes.push(`export function getSdkWithHooks(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) {
|
|
126
|
+
const sdk = getSdk(client, withWrapper);`);
|
|
127
|
+
// Add the utility for useSWRInfinite
|
|
128
|
+
if (this._enabledInfinite) {
|
|
129
|
+
codes.push(` const utilsForInfinite = {
|
|
130
|
+
generateGetKey: <Data = unknown, Variables = unknown>(
|
|
131
|
+
id: ${config.autogenSWRKey ? 'SWRKeyInterface' : 'string'},
|
|
132
|
+
getKey: ${config.typesPrefix}SWRInfiniteKeyLoader${config.typesSuffix}<Data, Variables>
|
|
133
|
+
) => (pageIndex: number, previousData: Data | null) => {
|
|
134
|
+
const key = getKey(pageIndex, previousData)
|
|
135
|
+
return key ? [id, ...key] : null
|
|
136
|
+
},
|
|
137
|
+
generateFetcher: <Query = unknown, Variables = unknown>(query: (variables: Variables) => Promise<Query>, variables?: Variables) => (
|
|
138
|
+
id: string,
|
|
139
|
+
fieldName: keyof Variables,
|
|
140
|
+
fieldValue: Variables[typeof fieldName]
|
|
141
|
+
) => query({ ...variables, [fieldName]: fieldValue } as Variables)
|
|
142
|
+
}`);
|
|
143
|
+
}
|
|
144
|
+
// Add the function for auto-generation key for SWR
|
|
145
|
+
if (config.autogenSWRKey) {
|
|
146
|
+
codes.push(` const genKey = <V extends Record<string, unknown> = Record<string, unknown>>(name: string, object: V = {} as V): SWRKeyInterface => [name, ...Object.keys(object).sort().map(key => object[key])];`);
|
|
147
|
+
}
|
|
148
|
+
// Add return statement for getSdkWithHooks function and close the function
|
|
149
|
+
codes.push(` return {
|
|
150
|
+
...sdk,
|
|
151
|
+
${allPossibleActions.join(',\n')}
|
|
152
|
+
};
|
|
153
|
+
}`);
|
|
154
|
+
// Add type of Sdk
|
|
155
|
+
codes.push(`export type ${config.typesPrefix}SdkWithHooks${config.typesSuffix} = ReturnType<typeof getSdkWithHooks>;`);
|
|
156
|
+
return codes.join('\n');
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
exports.SWRVisitor = SWRVisitor;
|
|
160
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92aXNpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGtGQU0rQztBQUMvQyxxQ0FBc0U7QUFDdEUsNERBQTZCO0FBQzdCLDZDQUF3QztBQTJCeEMsTUFBTSxtQkFBbUIsR0FBRyxDQUMxQixTQUFvQixFQUNwQixNQUFpQyxFQUN2QixFQUFFO0lBQ1osTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFBO0lBQzFCLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUE7SUFDMUIsTUFBTSxpQkFBaUIsR0FDckIsQ0FBQyxJQUFJLENBQUMsbUJBQW1CO1FBQ3pCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUNyQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUM1QixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssY0FBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUM1RDtRQUNDLENBQUMsQ0FBQyxHQUFHO1FBQ0wsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUNSLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFBO0lBQzVCLE1BQU0sVUFBVSxHQUFHLElBQUEsd0JBQVUsRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzlDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxVQUFVO1FBQ3BDLENBQUMsQ0FBQyxrQkFBa0IsU0FBUyxDQUFDLG1CQUFtQixHQUFHO1FBQ3BELENBQUMsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUE7SUFDakMsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLHVCQUF1QixDQUFBO0lBRXZELEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxVQUFVLElBQ3pCLE1BQU0sQ0FBQyxV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
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { RawClientSideBasePluginConfig } from '@graphql-codegen/visitor-plugin-common';
|
|
2
|
+
/**
|
|
3
|
+
* @description This plugin generates [`graphql-request`](https://www.npmjs.com/package/graphql-request) ready-to-use SDK, which is fully-typed.
|
|
4
|
+
*/
|
|
5
|
+
export interface RawSWRPluginConfig extends RawClientSideBasePluginConfig {
|
|
6
|
+
/**
|
|
7
|
+
* @description By default the `request` method return the `data` or `errors` key from the response. If you need to access the `extensions` key you can use the `rawRequest` method.
|
|
8
|
+
* @default false
|
|
9
|
+
*
|
|
10
|
+
* @exampleMarkdown
|
|
11
|
+
* ```yml
|
|
12
|
+
* generates:
|
|
13
|
+
* path/to/file.ts:
|
|
14
|
+
* plugins:
|
|
15
|
+
* - typescript
|
|
16
|
+
* - typescript-operations
|
|
17
|
+
* - typescript-graphql-request
|
|
18
|
+
* - graphql-codegen-plugin-typescript-swr
|
|
19
|
+
* config:
|
|
20
|
+
* rawRequest: true
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
rawRequest?: boolean;
|
|
24
|
+
excludeQueries?: string | string[];
|
|
25
|
+
useSWRInfinite?: string | string[];
|
|
26
|
+
autogenSWRKey?: boolean;
|
|
27
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { PluginValidateFn, PluginFunction } from '@graphql-codegen/plugin-helpers';
|
|
2
|
+
import { RawSWRPluginConfig } from './config';
|
|
3
|
+
import { SWRVisitor } from './visitor';
|
|
4
|
+
export declare const plugin: PluginFunction<RawSWRPluginConfig>;
|
|
5
|
+
export declare const validate: PluginValidateFn<any>;
|
|
6
|
+
export { SWRVisitor };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { extname } from 'path';
|
|
2
|
+
import { oldVisit, } from '@graphql-codegen/plugin-helpers';
|
|
3
|
+
import { concatAST, Kind } from 'graphql';
|
|
4
|
+
import { SWRVisitor } from './visitor';
|
|
5
|
+
export const plugin = (schema, documents, config) => {
|
|
6
|
+
const allAst = concatAST(documents.map((v) => v.document));
|
|
7
|
+
const allFragments = [
|
|
8
|
+
// prettier-ignore
|
|
9
|
+
...allAst.definitions.filter((d) => d.kind === Kind.FRAGMENT_DEFINITION).map((fragmentDef) => ({
|
|
10
|
+
node: fragmentDef,
|
|
11
|
+
name: fragmentDef.name.value,
|
|
12
|
+
onType: fragmentDef.typeCondition.name.value,
|
|
13
|
+
isExternal: false,
|
|
14
|
+
})),
|
|
15
|
+
...(config.externalFragments || []),
|
|
16
|
+
];
|
|
17
|
+
const visitor = new SWRVisitor(schema, allFragments, config);
|
|
18
|
+
oldVisit(allAst, { leave: visitor });
|
|
19
|
+
return {
|
|
20
|
+
prepend: visitor.getImports(),
|
|
21
|
+
content: visitor.sdkContent,
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
export const validate = async (_schema, _documents, _config, outputFile) => {
|
|
25
|
+
if (extname(outputFile) !== '.ts') {
|
|
26
|
+
throw new Error(`Plugin "typescript-swr" requires extension to be ".ts"!`);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
export { SWRVisitor };
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUU5QixPQUFPLEVBSUwsUUFBUSxHQUNULE1BQU0saUNBQWlDLENBQUE7QUFFeEMsT0FBTyxFQUFpQixTQUFTLEVBQUUsSUFBSSxFQUEwQixNQUFNLFNBQVMsQ0FBQTtBQUdoRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBRXRDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBdUMsQ0FDeEQsTUFBcUIsRUFDckIsU0FBK0IsRUFDL0IsTUFBMEIsRUFDMUIsRUFBRTtJQUNGLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtJQUUxRCxNQUFNLFlBQVksR0FBcUI7UUFDckMsa0JBQWtCO1FBQ2xCLEdBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQzNCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxtQkFBbUIsQ0FDZCxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNuRCxJQUFJLEVBQUUsV0FBVztZQUNqQixJQUFJLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQzVCLE1BQU0sRUFBRSxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQzVDLFVBQVUsRUFBRSxLQUFLO1NBQ2xCLENBQUMsQ0FBQztRQUNILEdBQUcsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLElBQUksRUFBRSxDQUFDO0tBQ3BDLENBQUE7SUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFBO0lBQzVELFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQTtJQUNwQyxPQUFPO1FBQ0wsT0FBTyxFQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQUU7UUFDN0IsT0FBTyxFQUFFLE9BQU8sQ0FBQyxVQUFVO0tBQzVCLENBQUE7QUFDSCxDQUFDLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQTBCLEtBQUssRUFDbEQsT0FBc0IsRUFDdEIsVUFBZ0MsRUFDaEMsT0FBMkIsRUFDM0IsVUFBa0IsRUFDbEIsRUFBRTtJQUNGLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEtBQUssRUFBRTtRQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLHlEQUF5RCxDQUFDLENBQUE7S0FDM0U7QUFDSCxDQUFDLENBQUE7QUFFRCxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUEifQ==
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { ClientSideBasePluginConfig, ClientSideBaseVisitor, LoadedFragment, ParsedConfig } from '@graphql-codegen/visitor-plugin-common';
|
|
2
|
+
import { GraphQLSchema, OperationDefinitionNode } from 'graphql';
|
|
3
|
+
import { RawSWRPluginConfig } from './config';
|
|
4
|
+
export interface SWRPluginConfig extends ClientSideBasePluginConfig {
|
|
5
|
+
rawRequest: boolean;
|
|
6
|
+
excludeQueries: string | string[];
|
|
7
|
+
useSWRInfinite: string | string[];
|
|
8
|
+
autogenSWRKey: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface Operation {
|
|
11
|
+
node: OperationDefinitionNode;
|
|
12
|
+
documentVariableName: string;
|
|
13
|
+
operationType: string;
|
|
14
|
+
operationResultType: string;
|
|
15
|
+
operationVariablesTypes: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ComposeQueryHandlerConfig {
|
|
18
|
+
autogenKey: SWRPluginConfig['autogenSWRKey'];
|
|
19
|
+
infinite: boolean;
|
|
20
|
+
rawRequest: SWRPluginConfig['rawRequest'];
|
|
21
|
+
typesPrefix: ParsedConfig['typesPrefix'];
|
|
22
|
+
typesSuffix: ParsedConfig['typesSuffix'];
|
|
23
|
+
}
|
|
24
|
+
export declare class SWRVisitor extends ClientSideBaseVisitor<RawSWRPluginConfig, SWRPluginConfig> {
|
|
25
|
+
private _operationsToInclude;
|
|
26
|
+
private _enabledInfinite;
|
|
27
|
+
constructor(schema: GraphQLSchema, fragments: LoadedFragment[], rawConfig: RawSWRPluginConfig);
|
|
28
|
+
protected buildOperation(node: OperationDefinitionNode, documentVariableName: string, operationType: string, operationResultType: string, operationVariablesTypes: string): string;
|
|
29
|
+
get sdkContent(): string;
|
|
30
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { ClientSideBaseVisitor, indentMultiline, } from '@graphql-codegen/visitor-plugin-common';
|
|
2
|
+
import { Kind } from 'graphql';
|
|
3
|
+
import glob from 'micromatch';
|
|
4
|
+
import { pascalCase } from 'pascal-case';
|
|
5
|
+
const composeQueryHandler = (operation, config) => {
|
|
6
|
+
const codes = [];
|
|
7
|
+
const { node } = operation;
|
|
8
|
+
const optionalVariables = !node.variableDefinitions ||
|
|
9
|
+
node.variableDefinitions.length === 0 ||
|
|
10
|
+
node.variableDefinitions.every((v) => v.type.kind !== Kind.NON_NULL_TYPE || v.defaultValue)
|
|
11
|
+
? '?'
|
|
12
|
+
: '';
|
|
13
|
+
const name = node.name.value;
|
|
14
|
+
const pascalName = pascalCase(node.name.value);
|
|
15
|
+
const responseType = config.rawRequest
|
|
16
|
+
? `SWRRawResponse<${operation.operationResultType}>`
|
|
17
|
+
: operation.operationResultType;
|
|
18
|
+
const variablesType = operation.operationVariablesTypes;
|
|
19
|
+
codes.push(`use${pascalName}(${config.autogenKey ? '' : 'key: SWRKeyInterface, '}variables${optionalVariables}: ${variablesType}, config?: SWRConfigInterface<${responseType}, ClientError>) {
|
|
20
|
+
return useSWR<${responseType}, ClientError>(${config.autogenKey
|
|
21
|
+
? `genKey<${variablesType}>('${pascalName}', variables)`
|
|
22
|
+
: 'key'}, () => sdk.${name}(variables), config);
|
|
23
|
+
}`);
|
|
24
|
+
if (config.infinite) {
|
|
25
|
+
codes.push(`use${pascalName}Infinite(${config.autogenKey ? '' : 'id: string, '}getKey: ${config.typesPrefix}SWRInfiniteKeyLoader${config.typesSuffix}<${responseType}, ${variablesType}>, variables${optionalVariables}: ${variablesType}, config?: SWRInfiniteConfiguration<${responseType}, ClientError>) {
|
|
26
|
+
return useSWRInfinite<${responseType}, ClientError>(
|
|
27
|
+
utilsForInfinite.generateGetKey<${responseType}, ${variablesType}>(${config.autogenKey
|
|
28
|
+
? `genKey<${variablesType}>('${pascalName}', variables)`
|
|
29
|
+
: 'id'}, getKey),
|
|
30
|
+
utilsForInfinite.generateFetcher<${responseType}, ${variablesType}>(sdk.${name}, variables),
|
|
31
|
+
config);
|
|
32
|
+
}`);
|
|
33
|
+
}
|
|
34
|
+
return codes;
|
|
35
|
+
};
|
|
36
|
+
export class SWRVisitor extends ClientSideBaseVisitor {
|
|
37
|
+
_operationsToInclude = [];
|
|
38
|
+
_enabledInfinite = false;
|
|
39
|
+
constructor(schema, fragments, rawConfig) {
|
|
40
|
+
super(schema, fragments, rawConfig, {
|
|
41
|
+
excludeQueries: rawConfig.excludeQueries || null,
|
|
42
|
+
useSWRInfinite: rawConfig.useSWRInfinite || null,
|
|
43
|
+
autogenSWRKey: rawConfig.autogenSWRKey || false,
|
|
44
|
+
});
|
|
45
|
+
this._enabledInfinite =
|
|
46
|
+
(this.config.useSWRInfinite &&
|
|
47
|
+
typeof this.config.useSWRInfinite === 'string') ||
|
|
48
|
+
(Array.isArray(this.config.useSWRInfinite) &&
|
|
49
|
+
this.config.useSWRInfinite.length > 0);
|
|
50
|
+
const typeImport = this.config.useTypeImports ? 'import type' : 'import';
|
|
51
|
+
this._additionalImports.push(`${typeImport} { ClientError } from 'graphql-request/dist/types';`);
|
|
52
|
+
if (this.config.useTypeImports) {
|
|
53
|
+
if (this._enabledInfinite) {
|
|
54
|
+
this._additionalImports.push(`import type { SWRConfiguration as SWRConfigInterface, Key as SWRKeyInterface } from 'swr';`);
|
|
55
|
+
this._additionalImports.push(`import type { SWRInfiniteConfiguration } from 'swr/infinite';`);
|
|
56
|
+
this._additionalImports.push(`import useSWR from 'swr';`);
|
|
57
|
+
this._additionalImports.push(`import useSWRInfinite from 'swr/infinite';`);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
this._additionalImports.push(`import type { SWRConfiguration as SWRConfigInterface, Key as SWRKeyInterface } from 'swr';`);
|
|
61
|
+
this._additionalImports.push(`import useSWR from 'swr';`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else if (this._enabledInfinite) {
|
|
65
|
+
this._additionalImports.push(`import useSWR, { SWRConfiguration as SWRConfigInterface, Key as SWRKeyInterface } from 'swr';`);
|
|
66
|
+
this._additionalImports.push(`import useSWRInfinite, { SWRInfiniteConfiguration } from 'swr/infinite';`);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
this._additionalImports.push(`import useSWR, { SWRConfiguration as SWRConfigInterface, Key as SWRKeyInterface } from 'swr';`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
buildOperation(node, documentVariableName, operationType, operationResultType, operationVariablesTypes) {
|
|
73
|
+
this._operationsToInclude.push({
|
|
74
|
+
node,
|
|
75
|
+
documentVariableName,
|
|
76
|
+
operationType,
|
|
77
|
+
operationResultType,
|
|
78
|
+
operationVariablesTypes,
|
|
79
|
+
});
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
get sdkContent() {
|
|
83
|
+
const codes = [];
|
|
84
|
+
const { config } = this;
|
|
85
|
+
const disabledexcludeQueries = !config.excludeQueries ||
|
|
86
|
+
(Array.isArray(config.excludeQueries) && !config.excludeQueries.length);
|
|
87
|
+
const allPossibleActions = this._operationsToInclude
|
|
88
|
+
.filter((o) => {
|
|
89
|
+
if (o.operationType !== 'Query') {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
if (disabledexcludeQueries) {
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
return !glob.isMatch(o.node.name.value, config.excludeQueries);
|
|
96
|
+
})
|
|
97
|
+
.map((o) => composeQueryHandler(o, {
|
|
98
|
+
autogenKey: config.autogenSWRKey,
|
|
99
|
+
infinite: this._enabledInfinite &&
|
|
100
|
+
glob.isMatch(o.node.name.value, config.useSWRInfinite),
|
|
101
|
+
rawRequest: config.rawRequest,
|
|
102
|
+
typesPrefix: config.typesPrefix,
|
|
103
|
+
typesSuffix: config.typesSuffix,
|
|
104
|
+
}))
|
|
105
|
+
.reduce((p, c) => p.concat(c), [])
|
|
106
|
+
.map((s) => indentMultiline(s, 2));
|
|
107
|
+
// Add type of SWRRawResponse
|
|
108
|
+
if (config.rawRequest) {
|
|
109
|
+
codes.push(`type SWRRawResponse<Data = any> = { data?: Data | undefined; extensions?: any; headers: Headers; status: number; errors?: GraphQLError[] | undefined; };`);
|
|
110
|
+
}
|
|
111
|
+
// Add type of SWRInfiniteKeyLoader
|
|
112
|
+
if (this._enabledInfinite) {
|
|
113
|
+
codes.push(`export type ${config.typesPrefix}SWRInfiniteKeyLoader${config.typesSuffix}<Data = unknown, Variables = unknown> = (
|
|
114
|
+
index: number,
|
|
115
|
+
previousPageData: Data | null
|
|
116
|
+
) => [keyof Variables, Variables[keyof Variables] | null] | null;`);
|
|
117
|
+
}
|
|
118
|
+
// Add getSdkWithHooks function
|
|
119
|
+
codes.push(`export function getSdkWithHooks(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) {
|
|
120
|
+
const sdk = getSdk(client, withWrapper);`);
|
|
121
|
+
// Add the utility for useSWRInfinite
|
|
122
|
+
if (this._enabledInfinite) {
|
|
123
|
+
codes.push(` const utilsForInfinite = {
|
|
124
|
+
generateGetKey: <Data = unknown, Variables = unknown>(
|
|
125
|
+
id: ${config.autogenSWRKey ? 'SWRKeyInterface' : 'string'},
|
|
126
|
+
getKey: ${config.typesPrefix}SWRInfiniteKeyLoader${config.typesSuffix}<Data, Variables>
|
|
127
|
+
) => (pageIndex: number, previousData: Data | null) => {
|
|
128
|
+
const key = getKey(pageIndex, previousData)
|
|
129
|
+
return key ? [id, ...key] : null
|
|
130
|
+
},
|
|
131
|
+
generateFetcher: <Query = unknown, Variables = unknown>(query: (variables: Variables) => Promise<Query>, variables?: Variables) => (
|
|
132
|
+
id: string,
|
|
133
|
+
fieldName: keyof Variables,
|
|
134
|
+
fieldValue: Variables[typeof fieldName]
|
|
135
|
+
) => query({ ...variables, [fieldName]: fieldValue } as Variables)
|
|
136
|
+
}`);
|
|
137
|
+
}
|
|
138
|
+
// Add the function for auto-generation key for SWR
|
|
139
|
+
if (config.autogenSWRKey) {
|
|
140
|
+
codes.push(` const genKey = <V extends Record<string, unknown> = Record<string, unknown>>(name: string, object: V = {} as V): SWRKeyInterface => [name, ...Object.keys(object).sort().map(key => object[key])];`);
|
|
141
|
+
}
|
|
142
|
+
// Add return statement for getSdkWithHooks function and close the function
|
|
143
|
+
codes.push(` return {
|
|
144
|
+
...sdk,
|
|
145
|
+
${allPossibleActions.join(',\n')}
|
|
146
|
+
};
|
|
147
|
+
}`);
|
|
148
|
+
// Add type of Sdk
|
|
149
|
+
codes.push(`export type ${config.typesPrefix}SdkWithHooks${config.typesSuffix} = ReturnType<typeof getSdkWithHooks>;`);
|
|
150
|
+
return codes.join('\n');
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92aXNpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxxQkFBcUIsRUFDckIsZUFBZSxHQUdoQixNQUFNLHdDQUF3QyxDQUFBO0FBQy9DLE9BQU8sRUFBaUIsSUFBSSxFQUEyQixNQUFNLFNBQVMsQ0FBQTtBQUN0RSxPQUFPLElBQUksTUFBTSxZQUFZLENBQUE7QUFDN0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQTJCeEMsTUFBTSxtQkFBbUIsR0FBRyxDQUMxQixTQUFvQixFQUNwQixNQUFpQyxFQUN2QixFQUFFO0lBQ1osTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFBO0lBQzFCLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUE7SUFDMUIsTUFBTSxpQkFBaUIsR0FDckIsQ0FBQyxJQUFJLENBQUMsbUJBQW1CO1FBQ3pCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUNyQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUM1QixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUM1RDtRQUNDLENBQUMsQ0FBQyxHQUFHO1FBQ0wsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUNSLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFBO0lBQzVCLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzlDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxVQUFVO1FBQ3BDLENBQUMsQ0FBQyxrQkFBa0IsU0FBUyxDQUFDLG1CQUFtQixHQUFHO1FBQ3BELENBQUMsQ0FBQyxTQUFTLENBQUMs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
|