@graphql-codegen/typescript-react-offix
Version:
GraphQL Code Generator plugin for generating useOffline mutations for offix use
73 lines (72 loc) • 3.83 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ReactApolloVisitor = void 0;
const tslib_1 = require("tslib");
const visitor_plugin_common_1 = require("@graphql-codegen/visitor-plugin-common");
const auto_bind_1 = tslib_1.__importDefault(require("auto-bind"));
const change_case_all_1 = require("change-case-all");
class ReactApolloVisitor extends visitor_plugin_common_1.ClientSideBaseVisitor {
constructor(schema, fragments, rawConfig, documents) {
super(schema, fragments, rawConfig, {});
this.imports = new Set();
this._externalImportPrefix = this.config.importOperationTypesFrom ? `${this.config.importOperationTypesFrom}.` : '';
this._documents = documents;
(0, auto_bind_1.default)(this);
}
getOffixReactHooksImport() {
return `import * as OffixReactHooks from "react-offix-hooks";`;
}
getDocumentNodeVariable(node, documentVariableName) {
return this.config.documentMode === visitor_plugin_common_1.DocumentMode.external ? `Operations.${node.name.value}` : documentVariableName;
}
getImports() {
const baseImports = super.getImports({ excludeFragments: true });
const hasOperations = this._collectedOperations.length > 0;
if (!hasOperations) {
return baseImports;
}
return [...baseImports, ...Array.from(this.imports)];
}
_buildHooks(node, operationType, documentVariableName, operationResultType, operationVariablesTypes) {
var _a, _b;
const operationName = this.convertName((_b = (_a = node.name) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : '', {
useTypesPrefix: false,
});
this.imports.add(this.getOffixReactHooksImport());
const hookFns = [];
if (operationType === 'Mutation') {
hookFns.push(`export function useOffline${operationName}(baseOptions?: OffixReactHooks.${operationType}HookOptions<${operationResultType}, ${operationVariablesTypes}>) {
return OffixReactHooks.useOfflineMutation<${operationResultType}, ${operationVariablesTypes}>(${this.getDocumentNodeVariable(node, documentVariableName)}, baseOptions);
}`);
}
return [...hookFns].join('\n');
}
buildOperation(node, documentVariableName, operationType, operationResultType, operationVariablesTypes) {
operationResultType = this._externalImportPrefix + operationResultType;
operationVariablesTypes = this._externalImportPrefix + operationVariablesTypes;
const hooks = this._buildHooks(node, operationType, documentVariableName, operationResultType, operationVariablesTypes);
return [hooks].filter(a => a).join('\n');
}
OperationDefinition(node) {
if (!node.name || !node.name.value) {
return null;
}
this._collectedOperations.push(node);
const documentVariableName = this.convertName(node, {
suffix: this.config.documentVariableSuffix,
prefix: this.config.documentVariablePrefix,
useTypesPrefix: false,
});
const operationType = (0, change_case_all_1.pascalCase)(node.operation);
const operationTypeSuffix = this.getOperationSuffix(node, operationType);
const operationResultType = this.convertName(node, {
suffix: operationTypeSuffix + this._parsedConfig.operationResultSuffix,
});
const operationVariablesTypes = this.convertName(node, {
suffix: operationTypeSuffix + 'Variables',
});
const additional = this.buildOperation(node, documentVariableName, operationType, operationResultType, operationVariablesTypes);
return [additional].filter(a => a).join('\n');
}
}
exports.ReactApolloVisitor = ReactApolloVisitor;