UNPKG

veffect

Version:

powerful TypeScript validation library built on the robust foundation of Effect combining exceptional type safety, high performance, and developer experience. Taking inspiration from Effect's functional principles, VEffect delivers a balanced approach tha

177 lines (176 loc) 7.05 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (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 () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.custom = custom; exports.passthrough = passthrough; exports.lazy = lazy; /** * Custom schema implementation */ const E = __importStar(require("../internal/effect")); const validator_1 = require("../validator"); const errors_1 = require("../errors"); const EffectMod = __importStar(require("effect/Effect")); /** * Create a custom schema with a validation function */ function custom(validator) { const validations = []; const schema = { _tag: 'CustomSchema', // Refinement implementation refine: (refinement, message) => { validations.push((input, options) => refinement(input) ? E.succeed(input) : E.fail(new errors_1.CustomValidationError(typeof message === 'function' ? message(input) : message || 'Failed refinement', options === null || options === void 0 ? void 0 : options.path))); return schema; }, // Transformation implementation transform: (transformer) => { return { _tag: 'TransformedSchema', toValidator: () => (0, validator_1.createEffectValidator)((input, options) => { return E.pipe(schema.toValidator().validate(input, options), E.map(value => transformer(value))); }) }; }, // Default value implementation default: (defaultValue) => { return { ...schema, _tag: 'CustomSchema', toValidator: () => (0, validator_1.createEffectValidator)((input, options) => { if (input === undefined) { const value = typeof defaultValue === 'function' ? defaultValue() : defaultValue; return E.succeed(value); } return schema.toValidator().validate(input, options); }) }; }, // Nullable implementation nullable: () => { return { _tag: 'NullableSchema', toValidator: () => (0, validator_1.createEffectValidator)((input, options) => { if (input === null) { return E.succeed(null); } return schema.toValidator().validate(input, options); }) }; }, // Optional implementation optional: () => { return { _tag: 'OptionalSchema', toValidator: () => (0, validator_1.createEffectValidator)((input, options) => { if (input === undefined) { return E.succeed(undefined); } return schema.toValidator().validate(input, options); }) }; }, // Nullish implementation nullish: () => { return { _tag: 'NullishSchema', toValidator: () => (0, validator_1.createEffectValidator)((input, options) => { if (input === null || input === undefined) { return E.succeed(input); } return schema.toValidator().validate(input, options); }) }; }, toValidator: () => (0, validator_1.createEffectValidator)((input, options) => { // Convert Promise to Effect return EffectMod.tryPromise({ try: async () => { try { // Run the custom validator const result = await validator(input, options); // If the result is a ValidationError, fail with that error if (result && typeof result === 'object' && '_tag' in result) { const error = result; return E.runSync(E.fail(error)); } // Otherwise, succeed with the result const validatedInput = result; // Apply any additional validations return E.runSync(validations.reduce((acc, validation) => E.flatMap(acc, val => validation(val, options)), E.succeed(validatedInput))); } catch (err) { // Handle any synchronous errors return E.runSync(E.fail(new errors_1.CustomValidationError(err instanceof Error ? err.message : String(err), options === null || options === void 0 ? void 0 : options.path))); } }, catch: (err) => new errors_1.CustomValidationError(err instanceof Error ? err.message : String(err), options === null || options === void 0 ? void 0 : options.path) }); }) }; return schema; } /** * Create a passthrough schema that always succeeds with the input value */ function passthrough() { return { _tag: 'PassthroughSchema', toValidator: () => (0, validator_1.createEffectValidator)((input) => { return E.succeed(input); }) }; } /** * Create a lazy schema for recursive definitions */ function lazy(schemaFn) { let cachedSchema = null; return { _tag: 'LazySchema', toValidator: () => { if (!cachedSchema) { cachedSchema = schemaFn(); } return cachedSchema.toValidator(); } }; }