@sqrzro/server 2.0.0-r19.13 → 2.0.0-r19.14
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/dist/auth/index.cjs +2 -2
- package/dist/auth/index.cjs.map +1 -1
- package/dist/auth/index.js +2 -2
- package/dist/auth/index.js.map +1 -1
- package/dist/forms/index.cjs +1 -1
- package/dist/forms/index.cjs.map +1 -1
- package/dist/forms/index.js +1 -1
- package/dist/forms/index.js.map +1 -1
- package/package.json +1 -1
package/dist/forms/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/forms/ValidationError.ts","../../src/forms/lang.ts","../../src/forms/ValidationService.ts","../../src/forms/FormService.ts","../../src/forms/ImageService.ts"],"names":["ValidationError","messages","ValidationError_default","lang_default","validate","Joi","getDefaultErrorMessages","getErrorMessages","acc","key","value","transformErrors","error","cur","validateSchema","formData","validation","err","createSchema","schema","extendSchema","appends","serializeError","hasFn","args","submitForm","data","validated","validationError","model","redirect","submitAPIRequest","response","errors","NextResponse","DEFAULT_TYPES","validateImage","image","config"],"mappings":"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","file":"index.js","sourcesContent":["class ValidationError extends Error {\n public messages: Record<string, string>;\n\n public constructor(messages: Record<string, string>) {\n super(JSON.stringify(messages));\n\n this.messages = messages;\n this.name = 'ValidationError';\n }\n}\n\nexport default ValidationError;\n","const messages: Record<string, string> = {\n 'alternatives.all': '',\n 'alternatives.any': '',\n 'alternatives.match': '',\n 'alternatives.one': '',\n 'alternatives.types': '',\n 'any.custom': '',\n 'any.default': '',\n 'any.failover': '',\n 'any.invalid': '',\n 'any.only': '',\n 'any.ref': '',\n 'any.required': '{{#label}} is required',\n 'any.unknown': '',\n 'array.base': '',\n 'array.excludes': '',\n 'array.includesRequiredBoth': '',\n 'array.includesRequiredKnowns': '',\n 'array.includesRequiredUnknowns': '',\n 'array.includes': '',\n 'array.length': '',\n 'array.max': '',\n 'array.min': '',\n 'array.orderedLength': '',\n 'array.sort': '',\n 'array.sort.mismatching': '',\n 'array.sort.unsupported': '',\n 'array.sparse': '',\n 'array.unique': '',\n 'array.hasKnown': '',\n 'array.hasUnknown': '',\n 'binary.base': '',\n 'binary.length': '',\n 'binary.max': '',\n 'binary.min': '',\n 'boolean.base': '',\n 'date.base': '',\n 'date.format': '',\n 'date.greater': '',\n 'date.less': '',\n 'date.max': '',\n 'date.min': '',\n 'date.strict': '',\n 'function.arity': '',\n 'function.class': '',\n 'function.maxArity': '',\n 'function.minArity': '',\n 'number.base': '{{#label}} should be a number',\n 'number.greater': '',\n 'number.infinity': '',\n 'number.integer': '',\n 'number.less': '',\n 'number.max': '',\n 'number.min': '{{#label}} should be greater than or equal to {{#limit}}',\n 'number.multiple': '',\n 'number.negative': '',\n 'number.port': '',\n 'number.positive': '',\n 'number.precision': '',\n 'number.unsafe': '',\n 'object.unknown': '',\n 'object.and': '',\n 'object.assert': '',\n 'object.base': '',\n 'object.length': '',\n 'object.max': '',\n 'object.min': '',\n 'object.missing': '',\n 'object.nand': '',\n 'object.pattern.match': '',\n 'object.refType': '',\n 'object.regex': '',\n 'object.rename.multiple': '',\n 'object.rename.override': '',\n 'object.schema': '',\n 'object.instance': '',\n 'object.with': '',\n 'object.without': '',\n 'object.xor': '',\n 'object.oxor': '',\n 'string.alphanum': '',\n 'string.base64': '',\n 'string.base': '',\n 'string.creditCard': '',\n 'string.dataUri': '',\n 'string.domain': '',\n 'string.email': '',\n 'string.empty': '{{#label}} is required',\n 'string.guid': '',\n 'string.hexAlign': '',\n 'string.hex': '',\n 'string.hostname': '',\n 'string.ipVersion': '',\n 'string.ip': '',\n 'string.isoDate': '',\n 'string.isoDuration': '',\n 'string.length': '',\n 'string.lowercase': '',\n 'string.max': '',\n 'string.min': '',\n 'string.normalize': '',\n 'string.pattern.base': '{{#label}} is not in the correct format',\n 'string.pattern.name': '',\n 'string.pattern.invert.base': '',\n 'string.pattern.invert.name': '',\n 'string.token': '',\n 'string.trim': '',\n 'string.uppercase': '',\n 'string.uri': '',\n 'string.uriCustomScheme': '',\n 'string.uriRelativeOnly': '',\n 'symbol.base': '',\n 'symbol.map': '',\n};\n\nexport default messages;\n","import type { Errorable } from '@sqrzro/interfaces';\nimport Joi from 'joi';\n\nimport lang from './lang';\nimport ValidationError from './ValidationError';\n\nexport function validate(): typeof Joi {\n return Joi;\n}\n\nexport type ValidationCustomHelpers<V = any> = Joi.CustomHelpers<V>; // eslint-disable-line @typescript-eslint/no-explicit-any\nexport type ValidationExternalHelpers<V = any> = Joi.ExternalHelpers<V>; // eslint-disable-line @typescript-eslint/no-explicit-any\nexport type ValidationErrorReport = Joi.ErrorReport;\n\nexport function getDefaultErrorMessages(): Record<string, string> {\n return lang;\n}\n\nfunction getErrorMessages(): Record<string, string> {\n return Object.entries(lang).reduce((acc, [key, value]) => {\n if (!value) {\n return acc;\n }\n return {\n ...acc,\n [key]: value,\n };\n }, {});\n}\n\nfunction transformErrors(error: Joi.ValidationError): ValidationError {\n const messages = error.details.reduce(\n (acc, cur) => ({\n ...acc,\n [cur.path.join('.')]: cur.message.replace(/\"/gu, ''),\n }),\n {}\n );\n return new ValidationError(messages);\n}\n\n/**\n * This function takes FormData and a schema. It then attempts to transform the FormData into an\n * object that matches `T`. This is because the FormData object is not typed and we want to be able\n * to validate it properly typed.\n *\n * Once transformed, the object is validated against the schema. This will result in either a\n * properly typed `T` object or an array of validation errors.\n * @param formData\n * @param validation\n * @returns\n */\nexport async function validateSchema<T>(\n formData: Partial<T>,\n validation: Joi.ObjectSchema<T>,\n messages?: Record<string, string>\n): Promise<Errorable<T>> {\n try {\n const validated = await validation.validateAsync(formData, {\n abortEarly: false,\n messages: messages || getErrorMessages(),\n stripUnknown: true,\n });\n\n return [validated, null];\n } catch (err) {\n if (err instanceof Joi.ValidationError) {\n return [null, transformErrors(err)];\n }\n\n if (err instanceof Error) {\n return [null, err];\n }\n\n return [null, new Error('Unknown validation error occured')];\n }\n}\n\nexport function createSchema<T>(schema: Joi.SchemaMap<T, true>): Joi.ObjectSchema<T> {\n return Joi.object<T>(schema);\n}\n\nexport function extendSchema<T, U extends T>(\n schema: Joi.ObjectSchema<T>,\n appends: Joi.PartialSchemaMap<U>\n): Joi.ObjectSchema<U> {\n return schema.append<U>(appends);\n}\n","/* eslint-disable max-statements */\n\nimport type { SerializedError, SerializedErrorable } from '@sqrzro/interfaces';\nimport type Joi from 'joi';\nimport { redirect } from 'next/navigation';\nimport { NextResponse } from 'next/server';\n\nimport ValidationError from './ValidationError';\nimport { validateSchema } from './ValidationService';\n\nexport interface NextRedirect {\n NEXT_REDIRECT: string;\n}\n\nfunction serializeError(err: Error): SerializedError {\n return {\n cause: err.cause,\n message: err.message,\n name: err.name,\n stack: err.stack,\n };\n}\n\ninterface SubmitFormArgs<F extends object> {\n formData: F;\n onSuccess?: (model: F) => Promise<void> | void;\n onValidationError?: (error: ValidationError) => void;\n request?: Joi.ObjectSchema<F>;\n}\n\ninterface SubmitFormArgsWithFn<F extends object, M> extends Omit<SubmitFormArgs<F>, 'onSuccess'> {\n fn: (data: F) => Promise<M>;\n onSuccess?: (model: M) => Promise<void> | void;\n}\n\nfunction hasFn<F extends object, M>(\n args: SubmitFormArgs<F> | SubmitFormArgsWithFn<F, M>\n): args is SubmitFormArgsWithFn<F, M> {\n return Boolean(Object.prototype.hasOwnProperty.call(args, 'fn'));\n}\n\nexport async function submitForm<F extends object>(\n args: SubmitFormArgs<F>\n): Promise<SerializedErrorable<F>>;\nexport async function submitForm<F extends object, M>(\n args: SubmitFormArgsWithFn<F, M>\n): Promise<SerializedErrorable<M>>;\n\nexport async function submitForm<F extends object, M>(\n args: SubmitFormArgs<F> | SubmitFormArgsWithFn<F, M>\n): Promise<[F, null] | [M | null, null] | [null, SerializedError]> {\n let data = { ...args.formData };\n\n if (args.request) {\n const [validated, validationError] = await validateSchema<F>(args.formData, args.request);\n\n if (validationError !== null) {\n if (validationError instanceof ValidationError) {\n args.onValidationError?.(validationError);\n }\n\n return [null, serializeError(validationError)];\n }\n\n data = validated;\n }\n\n if (!hasFn(args)) {\n await args.onSuccess?.(data);\n return [data, null];\n }\n\n let model: Awaited<M> | undefined; // eslint-disable-line @typescript-eslint/init-declarations\n\n try {\n model = await args.fn(data);\n } catch (err: unknown) {\n if (err instanceof ValidationError) {\n args.onValidationError?.(err);\n return [null, serializeError(err)];\n }\n if (err instanceof Error) {\n throw err;\n }\n throw new Error('The function supplied to submitForm encountered an unknown error');\n }\n\n if (typeof model === 'undefined') {\n throw new Error('The function supplied to submitForm is returning undefined.');\n }\n\n await args.onSuccess?.(model);\n\n if (typeof model === 'object' && model !== null && 'NEXT_REDIRECT' in model) {\n redirect(String(model.NEXT_REDIRECT));\n }\n\n return [model, null];\n}\n\nexport async function submitAPIRequest<F extends object, M>(\n args: SubmitFormArgsWithFn<F, M>\n): Promise<[M, null] | [null, NextResponse]> {\n const [response, error] = await submitForm<F, M>(args);\n\n if (error !== null) {\n if (error.name === 'ValidationError') {\n try {\n const errors = JSON.parse(error.message) as Record<string, string>;\n return [null, NextResponse.json(errors, { status: 422 })];\n } catch (err) {\n return [\n null,\n NextResponse.json({ message: 'An unknown error occured' }, { status: 500 }),\n ];\n }\n }\n return [null, NextResponse.json({ message: error.message }, { status: 500 })];\n }\n\n return [response, null];\n}\n","'use server';\n\nimport type { Errorable } from '@sqrzro/interfaces';\n\nconst DEFAULT_TYPES = ['image/png', 'image/jpeg', 'image/jpg'];\n// 5MB\nconst DEFAULT_MAX_SIZE = 5242880;\n\ninterface ImageValidationConfig {\n maxSize?: number;\n types?: string[];\n}\n\nexport async function validateImage(\n image: File | null,\n config?: ImageValidationConfig\n): Promise<Errorable<File>> {\n if (!image) {\n return Promise.resolve([null, new Error('IMAGE_UNDEFINED')]);\n }\n\n if (!(image instanceof File)) {\n return Promise.resolve([null, new Error('IMAGE_NOT_VALID')]);\n }\n\n if (!(config?.types || DEFAULT_TYPES).includes(image.type)) {\n return Promise.resolve([null, new Error('IMAGE_TYPE_NOT_VALID')]);\n }\n\n if (image.size > (config?.maxSize || DEFAULT_MAX_SIZE)) {\n return Promise.resolve([null, new Error('IMAGE_TOO_HEAVY')]);\n }\n\n return Promise.resolve([image, null]);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/forms/ValidationError.ts","../../src/forms/lang.ts","../../src/forms/ValidationService.ts","../../src/forms/FormService.ts","../../src/forms/ImageService.ts"],"names":["ValidationError","messages","ValidationError_default","lang_default","validate","Joi","getDefaultErrorMessages","getErrorMessages","acc","key","value","transformErrors","error","cur","validateSchema","formData","validation","err","createSchema","schema","extendSchema","appends","serializeError","hasFn","args","submitForm","data","validated","validationError","model","path","redirect","submitAPIRequest","response","errors","NextResponse","DEFAULT_TYPES","validateImage","image","config"],"mappings":"iGAAMA,IAAAA,CAAAA,CAAN,cAA8B,KAAM,CACzB,SAEA,WAAYC,CAAAA,CAAAA,CAAkC,CACjD,KAAM,CAAA,IAAA,CAAK,UAAUA,CAAQ,CAAC,EAE9B,IAAK,CAAA,QAAA,CAAWA,EAChB,IAAK,CAAA,IAAA,CAAO,kBAChB,CACJ,CAAA,CAEOC,EAAQF,ECXf,IAAMC,EAAmC,CACrC,kBAAA,CAAoB,GACpB,kBAAoB,CAAA,EAAA,CACpB,qBAAsB,EACtB,CAAA,kBAAA,CAAoB,EACpB,CAAA,oBAAA,CAAsB,GACtB,YAAc,CAAA,EAAA,CACd,cAAe,EACf,CAAA,cAAA,CAAgB,GAChB,aAAe,CAAA,EAAA,CACf,WAAY,EACZ,CAAA,SAAA,CAAW,GACX,cAAgB,CAAA,wBAAA,CAChB,cAAe,EACf,CAAA,YAAA,CAAc,GACd,gBAAkB,CAAA,EAAA,CAClB,6BAA8B,EAC9B,CAAA,8BAAA,CAAgC,GAChC,gCAAkC,CAAA,EAAA,CAClC,iBAAkB,EAClB,CAAA,cAAA,CAAgB,GAChB,WAAa,CAAA,EAAA,CACb,YAAa,EACb,CAAA,qBAAA,CAAuB,GACvB,YAAc,CAAA,EAAA,CACd,yBAA0B,EAC1B,CAAA,wBAAA,CAA0B,GAC1B,cAAgB,CAAA,EAAA,CAChB,cAAgB,CAAA,EAAA,CAChB,iBAAkB,EAClB,CAAA,kBAAA,CAAoB,GACpB,aAAe,CAAA,EAAA,CACf,gBAAiB,EACjB,CAAA,YAAA,CAAc,GACd,YAAc,CAAA,EAAA,CACd,eAAgB,EAChB,CAAA,WAAA,CAAa,GACb,aAAe,CAAA,EAAA,CACf,eAAgB,EAChB,CAAA,WAAA,CAAa,GACb,UAAY,CAAA,EAAA,CACZ,WAAY,EACZ,CAAA,aAAA,CAAe,GACf,gBAAkB,CAAA,EAAA,CAClB,iBAAkB,EAClB,CAAA,mBAAA,CAAqB,GACrB,mBAAqB,CAAA,EAAA,CACrB,cAAe,+BACf,CAAA,gBAAA,CAAkB,GAClB,iBAAmB,CAAA,EAAA,CACnB,iBAAkB,EAClB,CAAA,aAAA,CAAe,GACf,YAAc,CAAA,EAAA,CACd,aAAc,0DACd,CAAA,iBAAA,CAAmB,GACnB,iBAAmB,CAAA,EAAA,CACnB,cAAe,EACf,CAAA,iBAAA,CAAmB,GACnB,kBAAoB,CAAA,EAAA,CACpB,gBAAiB,EACjB,CAAA,gBAAA,CAAkB,GAClB,YAAc,CAAA,EAAA,CACd,gBAAiB,EACjB,CAAA,aAAA,CAAe,GACf,eAAiB,CAAA,EAAA,CACjB,aAAc,EACd,CAAA,YAAA,CAAc,GACd,gBAAkB,CAAA,EAAA,CAClB,cAAe,EACf,CAAA,sBAAA,CAAwB,GACxB,gBAAkB,CAAA,EAAA,CAClB,eAAgB,EAChB,CAAA,wBAAA,CAA0B,GAC1B,wBAA0B,CAAA,EAAA,CAC1B,gBAAiB,EACjB,CAAA,iBAAA,CAAmB,EACnB,CAAA,aAAA,CAAe,GACf,gBAAkB,CAAA,EAAA,CAClB,aAAc,EACd,CAAA,aAAA,CAAe,GACf,iBAAmB,CAAA,EAAA,CACnB,gBAAiB,EACjB,CAAA,aAAA,CAAe,GACf,mBAAqB,CAAA,EAAA,CACrB,iBAAkB,EAClB,CAAA,eAAA,CAAiB,GACjB,cAAgB,CAAA,EAAA,CAChB,eAAgB,wBAChB,CAAA,aAAA,CAAe,GACf,iBAAmB,CAAA,EAAA,CACnB,aAAc,EACd,CAAA,iBAAA,CAAmB,GACnB,kBAAoB,CAAA,EAAA,CACpB,YAAa,EACb,CAAA,gBAAA,CAAkB,GAClB,oBAAsB,CAAA,EAAA,CACtB,gBAAiB,EACjB,CAAA,kBAAA,CAAoB,GACpB,YAAc,CAAA,EAAA,CACd,aAAc,EACd,CAAA,kBAAA,CAAoB,GACpB,qBAAuB,CAAA,yCAAA,CACvB,sBAAuB,EACvB,CAAA,4BAAA,CAA8B,GAC9B,4BAA8B,CAAA,EAAA,CAC9B,eAAgB,EAChB,CAAA,aAAA,CAAe,GACf,kBAAoB,CAAA,EAAA,CACpB,aAAc,EACd,CAAA,wBAAA,CAA0B,GAC1B,wBAA0B,CAAA,EAAA,CAC1B,cAAe,EACf,CAAA,YAAA,CAAc,EAClB,CAEOE,CAAAA,CAAAA,CAAQF,EC7GR,SAASG,CAAAA,EAAuB,CACnC,OAAOC,CACX,CAMO,SAASC,CAAAA,EAAkD,CAC9D,OAAOH,CACX,CAEA,SAASI,CAAAA,EAA2C,CAChD,OAAO,MAAA,CAAO,OAAQJ,CAAAA,CAAI,EAAE,MAAO,CAAA,CAACK,EAAK,CAACC,CAAAA,CAAKC,CAAK,CAC3CA,GAAAA,CAAAA,CAGE,CACH,GAAGF,CAAAA,CACH,CAACC,CAAG,EAAGC,CACX,CALWF,CAAAA,CAAAA,CAMZ,EAAE,CACT,CAEA,SAASG,CAAAA,CAAgBC,EAA6C,CAClE,IAAMX,EAAWW,CAAM,CAAA,OAAA,CAAQ,OAC3B,CAACJ,CAAAA,CAAKK,KAAS,CACX,GAAGL,EACH,CAACK,CAAAA,CAAI,KAAK,IAAK,CAAA,GAAG,CAAC,EAAGA,CAAAA,CAAI,QAAQ,OAAQ,CAAA,KAAA,CAAO,EAAE,CACvD,CAAA,CAAA,CACA,EACJ,CAAA,CACA,OAAO,IAAIX,CAAAA,CAAgBD,CAAQ,CACvC,CAaA,eAAsBa,CAClBC,CAAAA,CAAAA,CACAC,EACAf,CACqB,CAAA,CACrB,GAAI,CAOA,OAAO,CANW,MAAMe,CAAAA,CAAW,cAAcD,CAAU,CAAA,CACvD,WAAY,CACZ,CAAA,CAAA,QAAA,CAAUd,GAAYM,CAAiB,EAAA,CACvC,aAAc,CAClB,CAAA,CAAC,EAEkB,IAAI,CAC3B,OAASU,CAAK,CAAA,CACV,OAAIA,CAAeZ,YAAAA,CAAAA,CAAI,eACZ,CAAA,CAAC,KAAMM,CAAgBM,CAAAA,CAAG,CAAC,CAGlCA,CAAAA,CAAAA,YAAe,MACR,CAAC,IAAA,CAAMA,CAAG,CAGd,CAAA,CAAC,KAAM,IAAI,KAAA,CAAM,kCAAkC,CAAC,CAC/D,CACJ,CAEO,SAASC,EAAgBC,CAAqD,CAAA,CACjF,OAAOd,CAAI,CAAA,MAAA,CAAUc,CAAM,CAC/B,CAEO,SAASC,CACZD,CAAAA,CAAAA,CACAE,EACmB,CACnB,OAAOF,EAAO,MAAUE,CAAAA,CAAO,CACnC,CCzEA,SAASC,EAAeL,CAA6B,CAAA,CACjD,OAAO,CACH,KAAA,CAAOA,EAAI,KACX,CAAA,OAAA,CAASA,EAAI,OACb,CAAA,IAAA,CAAMA,EAAI,IACV,CAAA,KAAA,CAAOA,EAAI,KACf,CACJ,CAcA,SAASM,CAAAA,CACLC,EACkC,CAClC,OAAO,EAAQ,MAAO,CAAA,SAAA,CAAU,eAAe,IAAKA,CAAAA,CAAAA,CAAM,IAAI,CAClE,CASA,eAAsBC,CAClBD,CAAAA,CAAAA,CAC+D,CAC/D,IAAIE,CAAAA,CAAO,CAAE,GAAGF,CAAAA,CAAK,QAAS,CAE9B,CAAA,GAAIA,EAAK,OAAS,CAAA,CACd,GAAM,CAACG,CAAAA,CAAWC,CAAe,CAAA,CAAI,MAAMd,CAAkBU,CAAAA,CAAAA,CAAK,SAAUA,CAAK,CAAA,OAAO,EAExF,GAAII,CAAAA,GAAoB,KACpB,OAAIA,CAAAA,YAA2B1B,GAC3BsB,CAAK,CAAA,iBAAA,GAAoBI,CAAe,CAGrC,CAAA,CAAC,KAAMN,CAAeM,CAAAA,CAAe,CAAC,CAGjDF,CAAAA,CAAAA,CAAOC,EACX,CAEA,GAAI,CAACJ,CAAMC,CAAAA,CAAI,EACX,OAAMA,MAAAA,CAAAA,CAAK,YAAYE,CAAI,CAAA,CACpB,CAACA,CAAM,CAAA,IAAI,EAGtB,IAAIG,CAAAA,CAEJ,GAAI,CACAA,CAAAA,CAAQ,MAAML,CAAK,CAAA,EAAA,CAAGE,CAAI,EAC9B,CAAA,MAAST,EAAc,CACnB,GAAIA,aAAef,CACf,CAAA,OAAAsB,EAAK,iBAAoBP,GAAAA,CAAG,EACrB,CAAC,IAAA,CAAMK,EAAeL,CAAG,CAAC,EAErC,MAAIA,CAAAA,YAAe,MACTA,CAEJ,CAAA,IAAI,MAAM,kEAAkE,CACtF,CAEA,GAAI,OAAOY,EAAU,GACjB,CAAA,MAAM,IAAI,KAAM,CAAA,6DAA6D,EAKjF,GAFA,MAAML,EAAK,SAAYK,GAAAA,CAAK,EAExB,OAAOA,CAAAA,EAAU,QAAYA,EAAAA,CAAAA,GAAU,MAAQ,eAAmBA,GAAAA,CAAAA,CAAO,CACzE,IAAMC,CAAAA,CAAO,OAAOD,CAAM,CAAA,aAAa,EACvCE,QAAS,CAAA,CAAA,EAAGD,EAAK,UAAW,CAAA,GAAG,EAAI,EAAK,CAAA,GAAG,GAAGA,CAAI,CAAA,CAAE,EACxD,CAEA,OAAO,CAACD,CAAO,CAAA,IAAI,CACvB,CAEA,eAAsBG,EAClBR,CACyC,CAAA,CACzC,GAAM,CAACS,CAAAA,CAAUrB,CAAK,CAAI,CAAA,MAAMa,EAAiBD,CAAI,CAAA,CAErD,GAAIZ,CAAU,GAAA,IAAA,CAAM,CAChB,GAAIA,CAAAA,CAAM,OAAS,iBACf,CAAA,GAAI,CACA,IAAMsB,CAAAA,CAAS,KAAK,KAAMtB,CAAAA,CAAAA,CAAM,OAAO,CACvC,CAAA,OAAO,CAAC,IAAMuB,CAAAA,YAAAA,CAAa,KAAKD,CAAQ,CAAA,CAAE,OAAQ,GAAI,CAAC,CAAC,CAC5D,CAAA,KAAc,CACV,OAAO,CACH,KACAC,YAAa,CAAA,IAAA,CAAK,CAAE,OAAS,CAAA,0BAA2B,EAAG,CAAE,MAAA,CAAQ,GAAI,CAAC,CAC9E,CACJ,CAEJ,OAAO,CAAC,IAAMA,CAAAA,YAAAA,CAAa,IAAK,CAAA,CAAE,QAASvB,CAAM,CAAA,OAAQ,EAAG,CAAE,MAAA,CAAQ,GAAI,CAAC,CAAC,CAChF,CAEA,OAAO,CAACqB,CAAU,CAAA,IAAI,CAC1B,CCtHA,IAAMG,EAAgB,CAAC,WAAA,CAAa,aAAc,WAAW,CAAA,CAS7D,eAAsBC,CAClBC,CAAAA,CAAAA,CACAC,EACwB,CACxB,OAAKD,EAICA,CAAiB,YAAA,IAAA,CAAA,CAIjBC,GAAQ,KAASH,EAAAA,CAAAA,EAAe,SAASE,CAAM,CAAA,IAAI,EAIrDA,CAAM,CAAA,IAAA,EAAQC,GAAQ,OAAW,EAAA,OAAA,CAAA,CAC1B,QAAQ,OAAQ,CAAA,CAAC,KAAM,IAAI,KAAA,CAAM,iBAAiB,CAAC,CAAC,EAGxD,OAAQ,CAAA,OAAA,CAAQ,CAACD,CAAO,CAAA,IAAI,CAAC,CAPzB,CAAA,OAAA,CAAQ,QAAQ,CAAC,IAAA,CAAM,IAAI,KAAM,CAAA,sBAAsB,CAAC,CAAC,CAAA,CAJzD,QAAQ,OAAQ,CAAA,CAAC,KAAM,IAAI,KAAA,CAAM,iBAAiB,CAAC,CAAC,EAJpD,OAAQ,CAAA,OAAA,CAAQ,CAAC,IAAM,CAAA,IAAI,MAAM,iBAAiB,CAAC,CAAC,CAgBnE","file":"index.js","sourcesContent":["class ValidationError extends Error {\n public messages: Record<string, string>;\n\n public constructor(messages: Record<string, string>) {\n super(JSON.stringify(messages));\n\n this.messages = messages;\n this.name = 'ValidationError';\n }\n}\n\nexport default ValidationError;\n","const messages: Record<string, string> = {\n 'alternatives.all': '',\n 'alternatives.any': '',\n 'alternatives.match': '',\n 'alternatives.one': '',\n 'alternatives.types': '',\n 'any.custom': '',\n 'any.default': '',\n 'any.failover': '',\n 'any.invalid': '',\n 'any.only': '',\n 'any.ref': '',\n 'any.required': '{{#label}} is required',\n 'any.unknown': '',\n 'array.base': '',\n 'array.excludes': '',\n 'array.includesRequiredBoth': '',\n 'array.includesRequiredKnowns': '',\n 'array.includesRequiredUnknowns': '',\n 'array.includes': '',\n 'array.length': '',\n 'array.max': '',\n 'array.min': '',\n 'array.orderedLength': '',\n 'array.sort': '',\n 'array.sort.mismatching': '',\n 'array.sort.unsupported': '',\n 'array.sparse': '',\n 'array.unique': '',\n 'array.hasKnown': '',\n 'array.hasUnknown': '',\n 'binary.base': '',\n 'binary.length': '',\n 'binary.max': '',\n 'binary.min': '',\n 'boolean.base': '',\n 'date.base': '',\n 'date.format': '',\n 'date.greater': '',\n 'date.less': '',\n 'date.max': '',\n 'date.min': '',\n 'date.strict': '',\n 'function.arity': '',\n 'function.class': '',\n 'function.maxArity': '',\n 'function.minArity': '',\n 'number.base': '{{#label}} should be a number',\n 'number.greater': '',\n 'number.infinity': '',\n 'number.integer': '',\n 'number.less': '',\n 'number.max': '',\n 'number.min': '{{#label}} should be greater than or equal to {{#limit}}',\n 'number.multiple': '',\n 'number.negative': '',\n 'number.port': '',\n 'number.positive': '',\n 'number.precision': '',\n 'number.unsafe': '',\n 'object.unknown': '',\n 'object.and': '',\n 'object.assert': '',\n 'object.base': '',\n 'object.length': '',\n 'object.max': '',\n 'object.min': '',\n 'object.missing': '',\n 'object.nand': '',\n 'object.pattern.match': '',\n 'object.refType': '',\n 'object.regex': '',\n 'object.rename.multiple': '',\n 'object.rename.override': '',\n 'object.schema': '',\n 'object.instance': '',\n 'object.with': '',\n 'object.without': '',\n 'object.xor': '',\n 'object.oxor': '',\n 'string.alphanum': '',\n 'string.base64': '',\n 'string.base': '',\n 'string.creditCard': '',\n 'string.dataUri': '',\n 'string.domain': '',\n 'string.email': '',\n 'string.empty': '{{#label}} is required',\n 'string.guid': '',\n 'string.hexAlign': '',\n 'string.hex': '',\n 'string.hostname': '',\n 'string.ipVersion': '',\n 'string.ip': '',\n 'string.isoDate': '',\n 'string.isoDuration': '',\n 'string.length': '',\n 'string.lowercase': '',\n 'string.max': '',\n 'string.min': '',\n 'string.normalize': '',\n 'string.pattern.base': '{{#label}} is not in the correct format',\n 'string.pattern.name': '',\n 'string.pattern.invert.base': '',\n 'string.pattern.invert.name': '',\n 'string.token': '',\n 'string.trim': '',\n 'string.uppercase': '',\n 'string.uri': '',\n 'string.uriCustomScheme': '',\n 'string.uriRelativeOnly': '',\n 'symbol.base': '',\n 'symbol.map': '',\n};\n\nexport default messages;\n","import type { Errorable } from '@sqrzro/interfaces';\nimport Joi from 'joi';\n\nimport lang from './lang';\nimport ValidationError from './ValidationError';\n\nexport function validate(): typeof Joi {\n return Joi;\n}\n\nexport type ValidationCustomHelpers<V = any> = Joi.CustomHelpers<V>; // eslint-disable-line @typescript-eslint/no-explicit-any\nexport type ValidationExternalHelpers<V = any> = Joi.ExternalHelpers<V>; // eslint-disable-line @typescript-eslint/no-explicit-any\nexport type ValidationErrorReport = Joi.ErrorReport;\n\nexport function getDefaultErrorMessages(): Record<string, string> {\n return lang;\n}\n\nfunction getErrorMessages(): Record<string, string> {\n return Object.entries(lang).reduce((acc, [key, value]) => {\n if (!value) {\n return acc;\n }\n return {\n ...acc,\n [key]: value,\n };\n }, {});\n}\n\nfunction transformErrors(error: Joi.ValidationError): ValidationError {\n const messages = error.details.reduce(\n (acc, cur) => ({\n ...acc,\n [cur.path.join('.')]: cur.message.replace(/\"/gu, ''),\n }),\n {}\n );\n return new ValidationError(messages);\n}\n\n/**\n * This function takes FormData and a schema. It then attempts to transform the FormData into an\n * object that matches `T`. This is because the FormData object is not typed and we want to be able\n * to validate it properly typed.\n *\n * Once transformed, the object is validated against the schema. This will result in either a\n * properly typed `T` object or an array of validation errors.\n * @param formData\n * @param validation\n * @returns\n */\nexport async function validateSchema<T>(\n formData: Partial<T>,\n validation: Joi.ObjectSchema<T>,\n messages?: Record<string, string>\n): Promise<Errorable<T>> {\n try {\n const validated = await validation.validateAsync(formData, {\n abortEarly: false,\n messages: messages || getErrorMessages(),\n stripUnknown: true,\n });\n\n return [validated, null];\n } catch (err) {\n if (err instanceof Joi.ValidationError) {\n return [null, transformErrors(err)];\n }\n\n if (err instanceof Error) {\n return [null, err];\n }\n\n return [null, new Error('Unknown validation error occured')];\n }\n}\n\nexport function createSchema<T>(schema: Joi.SchemaMap<T, true>): Joi.ObjectSchema<T> {\n return Joi.object<T>(schema);\n}\n\nexport function extendSchema<T, U extends T>(\n schema: Joi.ObjectSchema<T>,\n appends: Joi.PartialSchemaMap<U>\n): Joi.ObjectSchema<U> {\n return schema.append<U>(appends);\n}\n","/* eslint-disable max-statements */\n\nimport type { SerializedError, SerializedErrorable } from '@sqrzro/interfaces';\nimport type Joi from 'joi';\nimport { redirect } from 'next/navigation';\nimport { NextResponse } from 'next/server';\n\nimport ValidationError from './ValidationError';\nimport { validateSchema } from './ValidationService';\n\nexport interface NextRedirect {\n NEXT_REDIRECT: string;\n}\n\nfunction serializeError(err: Error): SerializedError {\n return {\n cause: err.cause,\n message: err.message,\n name: err.name,\n stack: err.stack,\n };\n}\n\ninterface SubmitFormArgs<F extends object> {\n formData: F;\n onSuccess?: (model: F) => Promise<void> | void;\n onValidationError?: (error: ValidationError) => void;\n request?: Joi.ObjectSchema<F>;\n}\n\ninterface SubmitFormArgsWithFn<F extends object, M> extends Omit<SubmitFormArgs<F>, 'onSuccess'> {\n fn: (data: F) => Promise<M>;\n onSuccess?: (model: M) => Promise<void> | void;\n}\n\nfunction hasFn<F extends object, M>(\n args: SubmitFormArgs<F> | SubmitFormArgsWithFn<F, M>\n): args is SubmitFormArgsWithFn<F, M> {\n return Boolean(Object.prototype.hasOwnProperty.call(args, 'fn'));\n}\n\nexport async function submitForm<F extends object>(\n args: SubmitFormArgs<F>\n): Promise<SerializedErrorable<F>>;\nexport async function submitForm<F extends object, M>(\n args: SubmitFormArgsWithFn<F, M>\n): Promise<SerializedErrorable<M>>;\n\nexport async function submitForm<F extends object, M>(\n args: SubmitFormArgs<F> | SubmitFormArgsWithFn<F, M>\n): Promise<[F, null] | [M | null, null] | [null, SerializedError]> {\n let data = { ...args.formData };\n\n if (args.request) {\n const [validated, validationError] = await validateSchema<F>(args.formData, args.request);\n\n if (validationError !== null) {\n if (validationError instanceof ValidationError) {\n args.onValidationError?.(validationError);\n }\n\n return [null, serializeError(validationError)];\n }\n\n data = validated;\n }\n\n if (!hasFn(args)) {\n await args.onSuccess?.(data);\n return [data, null];\n }\n\n let model: Awaited<M> | undefined; // eslint-disable-line @typescript-eslint/init-declarations\n\n try {\n model = await args.fn(data);\n } catch (err: unknown) {\n if (err instanceof ValidationError) {\n args.onValidationError?.(err);\n return [null, serializeError(err)];\n }\n if (err instanceof Error) {\n throw err;\n }\n throw new Error('The function supplied to submitForm encountered an unknown error');\n }\n\n if (typeof model === 'undefined') {\n throw new Error('The function supplied to submitForm is returning undefined.');\n }\n\n await args.onSuccess?.(model);\n\n if (typeof model === 'object' && model !== null && 'NEXT_REDIRECT' in model) {\n const path = String(model.NEXT_REDIRECT);\n redirect(`${path.startsWith('/') ? '' : '/'}${path}`);\n }\n\n return [model, null];\n}\n\nexport async function submitAPIRequest<F extends object, M>(\n args: SubmitFormArgsWithFn<F, M>\n): Promise<[M, null] | [null, NextResponse]> {\n const [response, error] = await submitForm<F, M>(args);\n\n if (error !== null) {\n if (error.name === 'ValidationError') {\n try {\n const errors = JSON.parse(error.message) as Record<string, string>;\n return [null, NextResponse.json(errors, { status: 422 })];\n } catch (err) {\n return [\n null,\n NextResponse.json({ message: 'An unknown error occured' }, { status: 500 }),\n ];\n }\n }\n return [null, NextResponse.json({ message: error.message }, { status: 500 })];\n }\n\n return [response, null];\n}\n","'use server';\n\nimport type { Errorable } from '@sqrzro/interfaces';\n\nconst DEFAULT_TYPES = ['image/png', 'image/jpeg', 'image/jpg'];\n// 5MB\nconst DEFAULT_MAX_SIZE = 5242880;\n\ninterface ImageValidationConfig {\n maxSize?: number;\n types?: string[];\n}\n\nexport async function validateImage(\n image: File | null,\n config?: ImageValidationConfig\n): Promise<Errorable<File>> {\n if (!image) {\n return Promise.resolve([null, new Error('IMAGE_UNDEFINED')]);\n }\n\n if (!(image instanceof File)) {\n return Promise.resolve([null, new Error('IMAGE_NOT_VALID')]);\n }\n\n if (!(config?.types || DEFAULT_TYPES).includes(image.type)) {\n return Promise.resolve([null, new Error('IMAGE_TYPE_NOT_VALID')]);\n }\n\n if (image.size > (config?.maxSize || DEFAULT_MAX_SIZE)) {\n return Promise.resolve([null, new Error('IMAGE_TOO_HEAVY')]);\n }\n\n return Promise.resolve([image, null]);\n}\n"]}
|