@giraphql/plugin-validation
Version:
A GiraphQL plugin for adding argument validation
131 lines • 6.6 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createZodSchema = exports.GiraphQLValidationPlugin = void 0;
require("./global-types");
const zod = __importStar(require("zod"));
const core_1 = __importStar(require("@giraphql/core"));
const createZodSchema_1 = __importStar(require("./createZodSchema"));
__exportStar(require("./types"), exports);
const pluginName = 'validation';
class GiraphQLValidationPlugin extends core_1.BasePlugin {
constructor() {
super(...arguments);
this.inputFieldValidators = new Map();
this.inputTypeValidators = new Map();
}
onInputFieldConfig(fieldConfig) {
const fieldType = (0, core_1.resolveInputTypeConfig)(fieldConfig.type, this.buildCache);
const validationOptions = fieldConfig.giraphqlOptions.validate;
if (!validationOptions && fieldType.kind !== 'InputObject') {
return fieldConfig;
}
const fieldName = fieldConfig.kind === 'Arg'
? `${fieldConfig.parentType}.${fieldConfig.parentField}(${fieldConfig.name})`
: `${fieldConfig.parentType}.${fieldConfig.name}`;
const validator = this.createValidator(validationOptions, fieldConfig.type, fieldName);
if (fieldConfig.kind === 'InputObject') {
this.inputFieldValidators.set(fieldConfig.parentType, {
...this.inputFieldValidators.get(fieldConfig.parentType),
[fieldConfig.name]: validator,
});
}
if (fieldConfig.kind === 'Arg') {
return {
...fieldConfig,
extensions: {
...fieldConfig.extensions,
validator,
},
};
}
this.inputFieldValidators.set(fieldConfig.parentType, {
...this.inputFieldValidators.get(fieldConfig.parentType),
[fieldConfig.name]: validator,
});
return fieldConfig;
}
wrapResolve(resolver, fieldConfig) {
// Only used to check if validation is required
const argMap = (0, core_1.mapInputFields)(fieldConfig.args, this.buildCache, (field) => { var _a, _b; return (_b = (_a = field.extensions) === null || _a === void 0 ? void 0 : _a.validator) !== null && _b !== void 0 ? _b : null; });
if (!argMap && !fieldConfig.giraphqlOptions.validate) {
return resolver;
}
const args = {};
Object.keys(fieldConfig.args).forEach((argName) => {
var _a;
const validator = (_a = fieldConfig.args[argName].extensions) === null || _a === void 0 ? void 0 : _a.validator;
if (validator) {
args[argName] = validator;
}
});
let validator = zod.object(args).passthrough();
if (fieldConfig.giraphqlOptions.validate) {
validator = (0, createZodSchema_1.refine)(validator, {
refine: fieldConfig.giraphqlOptions.validate,
});
}
return async (parent, rawArgs, context, info) => resolver(parent, (await validator.parseAsync(rawArgs)), context, info);
}
createValidator(optionsOrConstraint, type, fieldName) {
const options = Array.isArray(optionsOrConstraint) || typeof optionsOrConstraint === 'function'
? { refine: optionsOrConstraint }
: optionsOrConstraint;
if ((type === null || type === void 0 ? void 0 : type.kind) === 'InputObject') {
const typeConfig = this.buildCache.getTypeConfig(type.ref, 'InputObject');
let fieldValidator = (0, createZodSchema_1.refine)(zod.lazy(() => { var _a; return zod.object((_a = this.inputFieldValidators.get(typeConfig.name)) !== null && _a !== void 0 ? _a : {}).passthrough(); }), options);
if (typeConfig.giraphqlOptions.validate) {
fieldValidator = (0, createZodSchema_1.refine)(fieldValidator, {
refine: typeConfig.giraphqlOptions.validate,
});
}
return (0, createZodSchema_1.combine)([fieldValidator], type.required);
}
if ((type === null || type === void 0 ? void 0 : type.kind) === 'List') {
if (options && !(0, createZodSchema_1.isArrayValidator)(options)) {
throw new Error(`Expected valid array validator for ${fieldName}`);
}
const items = (options === null || options === void 0 ? void 0 : options.items)
? this.createValidator(options.items, type.type, fieldName)
: zod.unknown();
if (options) {
return (0, createZodSchema_1.combine)([(0, createZodSchema_1.createArrayValidator)(options, items)], type.required);
}
return (0, createZodSchema_1.combine)([items.array()], type.required);
}
if (!options) {
return zod.unknown();
}
return (0, createZodSchema_1.default)(options, !type || type.required);
}
}
exports.GiraphQLValidationPlugin = GiraphQLValidationPlugin;
core_1.default.registerPlugin(pluginName, GiraphQLValidationPlugin);
exports.default = pluginName;
var createZodSchema_2 = require("./createZodSchema");
Object.defineProperty(exports, "createZodSchema", { enumerable: true, get: function () { return __importDefault(createZodSchema_2).default; } });
//# sourceMappingURL=index.js.map