@sqrzro/server 2.0.0-bz.62 → 2.0.0-bz.64
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 -65
- package/dist/auth/index.cjs.map +1 -1
- package/dist/auth/index.js +2 -20
- package/dist/auth/index.js.map +1 -1
- package/dist/cache/index.cjs +1 -9
- package/dist/cache/index.cjs.map +1 -1
- package/dist/cache/index.js +1 -6
- package/dist/cache/index.js.map +1 -1
- package/dist/database/schema.cjs +1 -15
- package/dist/database/schema.cjs.map +1 -1
- package/dist/database/schema.d.cts +105 -0
- package/dist/database/schema.d.ts +105 -0
- package/dist/database/schema.js +1 -6
- package/dist/database/schema.js.map +1 -1
- package/dist/forms/index.cjs +1 -21
- package/dist/forms/index.cjs.map +1 -1
- package/dist/forms/index.js +1 -7
- package/dist/forms/index.js.map +1 -1
- package/dist/lists/index.cjs +1 -8
- package/dist/lists/index.cjs.map +1 -1
- package/dist/lists/index.js +1 -6
- package/dist/lists/index.js.map +1 -1
- package/dist/mail/index.cjs +2 -14
- package/dist/mail/index.cjs.map +1 -1
- package/dist/mail/index.js +2 -6
- package/dist/mail/index.js.map +1 -1
- package/dist/middleware.cjs +1 -8
- package/dist/middleware.cjs.map +1 -1
- package/dist/middleware.js +1 -6
- package/dist/middleware.js.map +1 -1
- package/dist/url/index.cjs +2 -11
- package/dist/url/index.cjs.map +1 -1
- package/dist/url/index.js +2 -6
- package/dist/url/index.js.map +1 -1
- package/package.json +1 -1
package/dist/forms/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/forms/FormService.ts","../../src/forms/ValidationError.ts","../../src/forms/ValidationService.ts","../../src/forms/lang.ts","../../src/forms/ImageService.ts"],"names":["NextResponse","ValidationError","messages","ValidationError_default","Joi","lang_default","validate","getDefaultErrorMessages","getErrorMessages","acc","key","value","transformErrors","error","cur","validateSchema","formData","validation","err","createSchema","schema","extendSchema","appends","serializeError","hasFn","args","submitForm","data","validated","validationError","model","submitAPIRequest","response","errors","DEFAULT_TYPES","validateImage","image","config"],"mappings":"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","sourcesContent":["/* eslint-disable max-statements */\n\nimport type { SerializedError, SerializedErrorable } from '@sqrzro/interfaces';\nimport type Joi from 'joi';\nimport { NextResponse } from 'next/server';\n\nimport ValidationError from './ValidationError';\nimport { validateSchema } from './ValidationService';\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 | null>;\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, 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> | null = null;\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 (!model) {\n throw new Error('NO_MODEL');\n }\n\n await args.onSuccess?.(model);\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","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","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","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","'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","submitAPIRequest","response","errors","NextResponse","DEFAULT_TYPES","validateImage","image","config"],"mappings":"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","file":"index.cjs","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 { NextResponse } from 'next/server';\n\nimport ValidationError from './ValidationError';\nimport { validateSchema } from './ValidationService';\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 | null>;\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, 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> | null = null;\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 (!model) {\n throw new Error('NO_MODEL');\n }\n\n await args.onSuccess?.(model);\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"]}
|
package/dist/forms/index.js
CHANGED
|
@@ -1,8 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import l from 'joi';
|
|
3
|
-
|
|
4
|
-
var a=class extends Error{messages;constructor(e){super(JSON.stringify(e)),this.messages=e,this.name="ValidationError";}},i=a;var d={"alternatives.all":"","alternatives.any":"","alternatives.match":"","alternatives.one":"","alternatives.types":"","any.custom":"","any.default":"","any.failover":"","any.invalid":"","any.only":"","any.ref":"","any.required":"{{#label}} is required","any.unknown":"","array.base":"","array.excludes":"","array.includesRequiredBoth":"","array.includesRequiredKnowns":"","array.includesRequiredUnknowns":"","array.includes":"","array.length":"","array.max":"","array.min":"","array.orderedLength":"","array.sort":"","array.sort.mismatching":"","array.sort.unsupported":"","array.sparse":"","array.unique":"","array.hasKnown":"","array.hasUnknown":"","binary.base":"","binary.length":"","binary.max":"","binary.min":"","boolean.base":"","date.base":"","date.format":"","date.greater":"","date.less":"","date.max":"","date.min":"","date.strict":"","function.arity":"","function.class":"","function.maxArity":"","function.minArity":"","number.base":"{{#label}} should be a number","number.greater":"","number.infinity":"","number.integer":"","number.less":"","number.max":"","number.min":"{{#label}} should be greater than or equal to {{#limit}}","number.multiple":"","number.negative":"","number.port":"","number.positive":"","number.precision":"","number.unsafe":"","object.unknown":"","object.and":"","object.assert":"","object.base":"","object.length":"","object.max":"","object.min":"","object.missing":"","object.nand":"","object.pattern.match":"","object.refType":"","object.regex":"","object.rename.multiple":"","object.rename.override":"","object.schema":"","object.instance":"","object.with":"","object.without":"","object.xor":"","object.oxor":"","string.alphanum":"","string.base64":"","string.base":"","string.creditCard":"","string.dataUri":"","string.domain":"","string.email":"","string.empty":"{{#label}} is required","string.guid":"","string.hexAlign":"","string.hex":"","string.hostname":"","string.ipVersion":"","string.ip":"","string.isoDate":"","string.isoDuration":"","string.length":"","string.lowercase":"","string.max":"","string.min":"","string.normalize":"","string.pattern.base":"{{#label}} is not in the correct format","string.pattern.name":"","string.pattern.invert.base":"","string.pattern.invert.name":"","string.token":"","string.trim":"","string.uppercase":"","string.uri":"","string.uriCustomScheme":"","string.uriRelativeOnly":"","symbol.base":"","symbol.map":""},s=d;function S(){return l}function v(){return s}function b(){return Object.entries(s).reduce((r,[e,n])=>n?{...r,[e]:n}:r,{})}function g(r){let e=r.details.reduce((n,t)=>({...n,[t.path.join(".")]:t.message.replace(/"/gu,"")}),{});return new i(e)}async function m(r,e,n){try{return [await e.validateAsync(r,{abortEarly:!1,messages:n||b(),stripUnknown:!0}),null]}catch(t){return t instanceof l.ValidationError?[null,g(t)]:t instanceof Error?[null,t]:[null,new Error("Unknown validation error occured")]}}function w(r){return l.object(r)}function A(r,e){return r.append(e)}function c(r){return {cause:r.cause,message:r.message,name:r.name,stack:r.stack}}function p(r){return !!Object.prototype.hasOwnProperty.call(r,"fn")}async function f(r){let e={...r.formData};if(r.request){let[t,o]=await m(r.formData,r.request);if(o!==null)return o instanceof i&&r.onValidationError?.(o),[null,c(o)];e=t;}if(!p(r))return await r.onSuccess?.(e),[e,null];let n=null;try{n=await r.fn(e);}catch(t){if(t instanceof i)return r.onValidationError?.(t),[null,c(t)];throw t instanceof Error?t:new Error("The function supplied to submitForm encountered an unknown error")}if(!n)throw new Error("NO_MODEL");return await r.onSuccess?.(n),[n,null]}async function O(r){let[e,n]=await f(r);if(n!==null){if(n.name==="ValidationError")try{let t=JSON.parse(n.message);return [null,NextResponse.json(t,{status:422})]}catch{return [null,NextResponse.json({message:"An unknown error occured"},{status:500})]}return [null,NextResponse.json({message:n.message},{status:500})]}return [e,null]}var y=["image/png","image/jpeg","image/jpg"];async function R(r,e){return r?r instanceof File?(e?.types||y).includes(r.type)?r.size>(e?.maxSize||5242880)?Promise.resolve([null,new Error("IMAGE_TOO_HEAVY")]):Promise.resolve([r,null]):Promise.resolve([null,new Error("IMAGE_TYPE_NOT_VALID")]):Promise.resolve([null,new Error("IMAGE_NOT_VALID")]):Promise.resolve([null,new Error("IMAGE_UNDEFINED")])}
|
|
5
|
-
|
|
6
|
-
export { i as ValidationError, w as createSchema, A as extendSchema, v as getDefaultErrorMessages, O as submitAPIRequest, f as submitForm, S as validate, R as validateImage, m as validateSchema };
|
|
7
|
-
//# sourceMappingURL=out.js.map
|
|
1
|
+
import {NextResponse}from'next/server';import l from'joi';var a=class extends Error{messages;constructor(e){super(JSON.stringify(e)),this.messages=e,this.name="ValidationError";}},i=a;var d={"alternatives.all":"","alternatives.any":"","alternatives.match":"","alternatives.one":"","alternatives.types":"","any.custom":"","any.default":"","any.failover":"","any.invalid":"","any.only":"","any.ref":"","any.required":"{{#label}} is required","any.unknown":"","array.base":"","array.excludes":"","array.includesRequiredBoth":"","array.includesRequiredKnowns":"","array.includesRequiredUnknowns":"","array.includes":"","array.length":"","array.max":"","array.min":"","array.orderedLength":"","array.sort":"","array.sort.mismatching":"","array.sort.unsupported":"","array.sparse":"","array.unique":"","array.hasKnown":"","array.hasUnknown":"","binary.base":"","binary.length":"","binary.max":"","binary.min":"","boolean.base":"","date.base":"","date.format":"","date.greater":"","date.less":"","date.max":"","date.min":"","date.strict":"","function.arity":"","function.class":"","function.maxArity":"","function.minArity":"","number.base":"{{#label}} should be a number","number.greater":"","number.infinity":"","number.integer":"","number.less":"","number.max":"","number.min":"{{#label}} should be greater than or equal to {{#limit}}","number.multiple":"","number.negative":"","number.port":"","number.positive":"","number.precision":"","number.unsafe":"","object.unknown":"","object.and":"","object.assert":"","object.base":"","object.length":"","object.max":"","object.min":"","object.missing":"","object.nand":"","object.pattern.match":"","object.refType":"","object.regex":"","object.rename.multiple":"","object.rename.override":"","object.schema":"","object.instance":"","object.with":"","object.without":"","object.xor":"","object.oxor":"","string.alphanum":"","string.base64":"","string.base":"","string.creditCard":"","string.dataUri":"","string.domain":"","string.email":"","string.empty":"{{#label}} is required","string.guid":"","string.hexAlign":"","string.hex":"","string.hostname":"","string.ipVersion":"","string.ip":"","string.isoDate":"","string.isoDuration":"","string.length":"","string.lowercase":"","string.max":"","string.min":"","string.normalize":"","string.pattern.base":"{{#label}} is not in the correct format","string.pattern.name":"","string.pattern.invert.base":"","string.pattern.invert.name":"","string.token":"","string.trim":"","string.uppercase":"","string.uri":"","string.uriCustomScheme":"","string.uriRelativeOnly":"","symbol.base":"","symbol.map":""},s=d;function S(){return l}function v(){return s}function b(){return Object.entries(s).reduce((r,[e,n])=>n?{...r,[e]:n}:r,{})}function g(r){let e=r.details.reduce((n,t)=>({...n,[t.path.join(".")]:t.message.replace(/"/gu,"")}),{});return new i(e)}async function m(r,e,n){try{return [await e.validateAsync(r,{abortEarly:!1,messages:n||b(),stripUnknown:!0}),null]}catch(t){return t instanceof l.ValidationError?[null,g(t)]:t instanceof Error?[null,t]:[null,new Error("Unknown validation error occured")]}}function w(r){return l.object(r)}function A(r,e){return r.append(e)}function c(r){return {cause:r.cause,message:r.message,name:r.name,stack:r.stack}}function p(r){return !!Object.prototype.hasOwnProperty.call(r,"fn")}async function f(r){let e={...r.formData};if(r.request){let[t,o]=await m(r.formData,r.request);if(o!==null)return o instanceof i&&r.onValidationError?.(o),[null,c(o)];e=t;}if(!p(r))return await r.onSuccess?.(e),[e,null];let n=null;try{n=await r.fn(e);}catch(t){if(t instanceof i)return r.onValidationError?.(t),[null,c(t)];throw t instanceof Error?t:new Error("The function supplied to submitForm encountered an unknown error")}if(!n)throw new Error("NO_MODEL");return await r.onSuccess?.(n),[n,null]}async function O(r){let[e,n]=await f(r);if(n!==null){if(n.name==="ValidationError")try{let t=JSON.parse(n.message);return [null,NextResponse.json(t,{status:422})]}catch{return [null,NextResponse.json({message:"An unknown error occured"},{status:500})]}return [null,NextResponse.json({message:n.message},{status:500})]}return [e,null]}var y=["image/png","image/jpeg","image/jpg"];async function R(r,e){return r?r instanceof File?(e?.types||y).includes(r.type)?r.size>(e?.maxSize||5242880)?Promise.resolve([null,new Error("IMAGE_TOO_HEAVY")]):Promise.resolve([r,null]):Promise.resolve([null,new Error("IMAGE_TYPE_NOT_VALID")]):Promise.resolve([null,new Error("IMAGE_NOT_VALID")]):Promise.resolve([null,new Error("IMAGE_UNDEFINED")])}export{i as ValidationError,w as createSchema,A as extendSchema,v as getDefaultErrorMessages,O as submitAPIRequest,f as submitForm,S as validate,R as validateImage,m as validateSchema};//# sourceMappingURL=index.js.map
|
|
8
2
|
//# sourceMappingURL=index.js.map
|
package/dist/forms/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/forms/FormService.ts","../../src/forms/ValidationError.ts","../../src/forms/ValidationService.ts","../../src/forms/lang.ts","../../src/forms/ImageService.ts"],"names":["NextResponse","ValidationError","messages","ValidationError_default","Joi","lang_default","validate","getDefaultErrorMessages","getErrorMessages","acc","key","value","transformErrors","error","cur","validateSchema","formData","validation","err","createSchema","schema","extendSchema","appends","serializeError","hasFn","args","submitForm","data","validated","validationError","model","submitAPIRequest","response","errors","DEFAULT_TYPES","validateImage","image","config"],"mappings":"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","sourcesContent":["/* eslint-disable max-statements */\n\nimport type { SerializedError, SerializedErrorable } from '@sqrzro/interfaces';\nimport type Joi from 'joi';\nimport { NextResponse } from 'next/server';\n\nimport ValidationError from './ValidationError';\nimport { validateSchema } from './ValidationService';\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 | null>;\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, 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> | null = null;\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 (!model) {\n throw new Error('NO_MODEL');\n }\n\n await args.onSuccess?.(model);\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","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","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","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","'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","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 { NextResponse } from 'next/server';\n\nimport ValidationError from './ValidationError';\nimport { validateSchema } from './ValidationService';\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 | null>;\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, 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> | null = null;\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 (!model) {\n throw new Error('NO_MODEL');\n }\n\n await args.onSuccess?.(model);\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"]}
|
package/dist/lists/index.cjs
CHANGED
|
@@ -1,9 +1,2 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var utility = require('@sqrzro/utility');
|
|
4
|
-
|
|
5
|
-
var g="id",c="asc",A=1,s=10;function d(n){return {skip:(n-1)*s,take:s}}function u(n,t=[]){let{dir:e,page:r,sort:i,...o}=n||{};return {...d(r?parseInt(r,10):A),orderBy:{[i||g]:e||c},where:utility.getFromObject(o,t)}}async function l({allowedFilters:n,fn:t,searchParams:e}){try{let r=u(e,n);return [await t(r),null]}catch(r){return r instanceof Error?[null,r]:[null,new Error("[getList] An unknown error occurred")]}}
|
|
6
|
-
|
|
7
|
-
exports.getList = l;
|
|
8
|
-
//# sourceMappingURL=out.js.map
|
|
1
|
+
'use strict';var utility=require('@sqrzro/utility');var g="id",c="asc",A=1,s=10;function d(n){return {skip:(n-1)*s,take:s}}function u(n,t=[]){let{dir:e,page:r,sort:i,...o}=n||{};return {...d(r?parseInt(r,10):A),orderBy:{[i||g]:e||c},where:utility.getFromObject(o,t)}}async function l({allowedFilters:n,fn:t,searchParams:e}){try{let r=u(e,n);return [await t(r),null]}catch(r){return r instanceof Error?[null,r]:[null,new Error("[getList] An unknown error occurred")]}}exports.getList=l;//# sourceMappingURL=index.cjs.map
|
|
9
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/lists/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lists/ListService.ts"],"names":["
|
|
1
|
+
{"version":3,"sources":["../../src/lists/ListService.ts"],"names":["DEFAULT_SORT","DEFAULT_DIR","DEFAULT_PAGE","DEFAULT_LIMIT","createPaginationArgs","page","createFindManyArgs","searchParams","allowedFilters","dir","sort","filters","getFromObject","getList","fn","args","err"],"mappings":"oDAaA,IAAMA,CAAAA,CAAe,IACfC,CAAAA,CAAAA,CAAc,KACdC,CAAAA,CAAAA,CAAe,CACfC,CAAAA,CAAAA,CAAgB,EAQtB,CAAA,SAASC,EAAqBC,CAAsB,CAAA,CAChD,OAAO,CAAE,IAAOA,CAAAA,CAAAA,CAAAA,CAAO,CAAKF,EAAAA,CAAAA,CAAe,IAAMA,CAAAA,CAAc,CACnE,CAEA,SAASG,CAAAA,CACLC,EACAC,CAA2B,CAAA,EACf,CAAA,CACZ,GAAM,CAAE,GAAAC,CAAAA,CAAAA,CAAK,IAAAJ,CAAAA,CAAAA,CAAM,IAAAK,CAAAA,CAAAA,CAAM,GAAGC,CAAQ,CAAIJ,CAAAA,CAAAA,EAAgB,EAAC,CAEzD,OAAO,CACH,GAAGH,CAAAA,CAAqBC,CAAO,CAAA,QAAA,CAASA,CAAM,CAAA,EAAE,CAAIH,CAAAA,CAAY,CAChE,CAAA,OAAA,CAAS,CAAE,CAACQ,CAAAA,EAAQV,CAAY,EAAGS,CAAOR,EAAAA,CAAY,CACtD,CAAA,KAAA,CAAOW,qBAAcD,CAAAA,CAAAA,CAASH,CAAc,CAChD,CACJ,CAEA,eAAsBK,CAAW,CAAA,CAC7B,cAAAL,CAAAA,CAAAA,CACA,EAAAM,CAAAA,CAAAA,CACA,YAAAP,CAAAA,CACJ,CAA4C,CAAA,CACxC,GAAI,CACA,IAAMQ,CAAAA,CAAOT,EAAmBC,CAAcC,CAAAA,CAAc,CAC5D,CAAA,OAAO,CAAC,MAAMM,CAAGC,CAAAA,CAAI,CAAG,CAAA,IAAI,CAChC,CAAA,MAASC,CAAK,CAAA,CACV,OAAIA,CAAAA,YAAe,KACR,CAAA,CAAC,IAAMA,CAAAA,CAAG,CAEd,CAAA,CAAC,IAAM,CAAA,IAAI,KAAM,CAAA,qCAAqC,CAAC,CAClE,CACJ","file":"index.cjs","sourcesContent":["import type { Errorable } from '@sqrzro/interfaces';\nimport { getFromObject } from '@sqrzro/utility';\n\ninterface PaginationArgs {\n skip: number;\n take: number;\n}\n\ninterface FindManyArgs extends PaginationArgs {\n orderBy: Record<string, string>;\n where: Record<string, string>;\n}\n\nconst DEFAULT_SORT = 'id';\nconst DEFAULT_DIR = 'asc';\nconst DEFAULT_PAGE = 1;\nconst DEFAULT_LIMIT = 10;\n\ninterface GetListArgs<T> {\n allowedFilters?: string[];\n fn: (args: FindManyArgs) => Promise<T[]>;\n searchParams?: Record<string, string>;\n}\n\nfunction createPaginationArgs(page): PaginationArgs {\n return { skip: (page - 1) * DEFAULT_LIMIT, take: DEFAULT_LIMIT };\n}\n\nfunction createFindManyArgs(\n searchParams?: Record<string, string>,\n allowedFilters: string[] = []\n): FindManyArgs {\n const { dir, page, sort, ...filters } = searchParams || {};\n\n return {\n ...createPaginationArgs(page ? parseInt(page, 10) : DEFAULT_PAGE),\n orderBy: { [sort || DEFAULT_SORT]: dir || DEFAULT_DIR },\n where: getFromObject(filters, allowedFilters),\n };\n}\n\nexport async function getList<T>({\n allowedFilters,\n fn,\n searchParams,\n}: GetListArgs<T>): Promise<Errorable<T[]>> {\n try {\n const args = createFindManyArgs(searchParams, allowedFilters);\n return [await fn(args), null];\n } catch (err) {\n if (err instanceof Error) {\n return [null, err];\n }\n return [null, new Error('[getList] An unknown error occurred')];\n }\n}\n"]}
|
package/dist/lists/index.js
CHANGED
|
@@ -1,7 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
var g="id",c="asc",A=1,s=10;function d(n){return {skip:(n-1)*s,take:s}}function u(n,t=[]){let{dir:e,page:r,sort:i,...o}=n||{};return {...d(r?parseInt(r,10):A),orderBy:{[i||g]:e||c},where:getFromObject(o,t)}}async function l({allowedFilters:n,fn:t,searchParams:e}){try{let r=u(e,n);return [await t(r),null]}catch(r){return r instanceof Error?[null,r]:[null,new Error("[getList] An unknown error occurred")]}}
|
|
4
|
-
|
|
5
|
-
export { l as getList };
|
|
6
|
-
//# sourceMappingURL=out.js.map
|
|
1
|
+
import {getFromObject}from'@sqrzro/utility';var g="id",c="asc",A=1,s=10;function d(n){return {skip:(n-1)*s,take:s}}function u(n,t=[]){let{dir:e,page:r,sort:i,...o}=n||{};return {...d(r?parseInt(r,10):A),orderBy:{[i||g]:e||c},where:getFromObject(o,t)}}async function l({allowedFilters:n,fn:t,searchParams:e}){try{let r=u(e,n);return [await t(r),null]}catch(r){return r instanceof Error?[null,r]:[null,new Error("[getList] An unknown error occurred")]}}export{l as getList};//# sourceMappingURL=index.js.map
|
|
7
2
|
//# sourceMappingURL=index.js.map
|
package/dist/lists/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lists/ListService.ts"],"names":["
|
|
1
|
+
{"version":3,"sources":["../../src/lists/ListService.ts"],"names":["DEFAULT_SORT","DEFAULT_DIR","DEFAULT_PAGE","DEFAULT_LIMIT","createPaginationArgs","page","createFindManyArgs","searchParams","allowedFilters","dir","sort","filters","getFromObject","getList","fn","args","err"],"mappings":"4CAaA,IAAMA,CAAAA,CAAe,IACfC,CAAAA,CAAAA,CAAc,KACdC,CAAAA,CAAAA,CAAe,CACfC,CAAAA,CAAAA,CAAgB,EAQtB,CAAA,SAASC,EAAqBC,CAAsB,CAAA,CAChD,OAAO,CAAE,IAAOA,CAAAA,CAAAA,CAAAA,CAAO,CAAKF,EAAAA,CAAAA,CAAe,IAAMA,CAAAA,CAAc,CACnE,CAEA,SAASG,CAAAA,CACLC,EACAC,CAA2B,CAAA,EACf,CAAA,CACZ,GAAM,CAAE,GAAAC,CAAAA,CAAAA,CAAK,IAAAJ,CAAAA,CAAAA,CAAM,IAAAK,CAAAA,CAAAA,CAAM,GAAGC,CAAQ,CAAIJ,CAAAA,CAAAA,EAAgB,EAAC,CAEzD,OAAO,CACH,GAAGH,CAAAA,CAAqBC,CAAO,CAAA,QAAA,CAASA,CAAM,CAAA,EAAE,CAAIH,CAAAA,CAAY,CAChE,CAAA,OAAA,CAAS,CAAE,CAACQ,CAAAA,EAAQV,CAAY,EAAGS,CAAOR,EAAAA,CAAY,CACtD,CAAA,KAAA,CAAOW,aAAcD,CAAAA,CAAAA,CAASH,CAAc,CAChD,CACJ,CAEA,eAAsBK,CAAW,CAAA,CAC7B,cAAAL,CAAAA,CAAAA,CACA,EAAAM,CAAAA,CAAAA,CACA,YAAAP,CAAAA,CACJ,CAA4C,CAAA,CACxC,GAAI,CACA,IAAMQ,CAAAA,CAAOT,EAAmBC,CAAcC,CAAAA,CAAc,CAC5D,CAAA,OAAO,CAAC,MAAMM,CAAGC,CAAAA,CAAI,CAAG,CAAA,IAAI,CAChC,CAAA,MAASC,CAAK,CAAA,CACV,OAAIA,CAAAA,YAAe,KACR,CAAA,CAAC,IAAMA,CAAAA,CAAG,CAEd,CAAA,CAAC,IAAM,CAAA,IAAI,KAAM,CAAA,qCAAqC,CAAC,CAClE,CACJ","file":"index.js","sourcesContent":["import type { Errorable } from '@sqrzro/interfaces';\nimport { getFromObject } from '@sqrzro/utility';\n\ninterface PaginationArgs {\n skip: number;\n take: number;\n}\n\ninterface FindManyArgs extends PaginationArgs {\n orderBy: Record<string, string>;\n where: Record<string, string>;\n}\n\nconst DEFAULT_SORT = 'id';\nconst DEFAULT_DIR = 'asc';\nconst DEFAULT_PAGE = 1;\nconst DEFAULT_LIMIT = 10;\n\ninterface GetListArgs<T> {\n allowedFilters?: string[];\n fn: (args: FindManyArgs) => Promise<T[]>;\n searchParams?: Record<string, string>;\n}\n\nfunction createPaginationArgs(page): PaginationArgs {\n return { skip: (page - 1) * DEFAULT_LIMIT, take: DEFAULT_LIMIT };\n}\n\nfunction createFindManyArgs(\n searchParams?: Record<string, string>,\n allowedFilters: string[] = []\n): FindManyArgs {\n const { dir, page, sort, ...filters } = searchParams || {};\n\n return {\n ...createPaginationArgs(page ? parseInt(page, 10) : DEFAULT_PAGE),\n orderBy: { [sort || DEFAULT_SORT]: dir || DEFAULT_DIR },\n where: getFromObject(filters, allowedFilters),\n };\n}\n\nexport async function getList<T>({\n allowedFilters,\n fn,\n searchParams,\n}: GetListArgs<T>): Promise<Errorable<T[]>> {\n try {\n const args = createFindManyArgs(searchParams, allowedFilters);\n return [await fn(args), null];\n } catch (err) {\n if (err instanceof Error) {\n return [null, err];\n }\n return [null, new Error('[getList] An unknown error occurred')];\n }\n}\n"]}
|
package/dist/mail/index.cjs
CHANGED
|
@@ -1,15 +1,3 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var m = require('stream');
|
|
4
|
-
|
|
5
|
-
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
6
|
-
|
|
7
|
-
var m__default = /*#__PURE__*/_interopDefault(m);
|
|
8
|
-
|
|
9
|
-
function b(e,n){return {subject:e,template:n}}async function l(e){let n=(await import('react-dom/server')).default;return new Promise(s=>{let r=new m__default.default.Writable,t="";r._write=(a,c,i)=>{t+=a.toString(),i();};let{pipe:o}=n.renderToPipeableStream(e,{onShellReady:()=>{o(r),s(t);}});})}async function p(e,n){let{subject:s,template:r}=e,t=await r(n),o=await l(t);return {subject:s,html:o}}function g(){if(!process.env.MAIL_FROM)throw new Error("Mail from address has not been set");let e=/^(?<name>[^<]+)<(?<email>[^>]+)>$/u.exec(process.env.MAIL_FROM);if(!e?.groups?.name||!e?.groups?.email)throw new Error('Mail from address is not the correct format. It should be "Name <email>".');return {email:e.groups.email.trim(),name:e.groups.name.trim()}}async function u(e){if(!process.env.MAIL_API_KEY)throw new Error("Mail API key has not been set");let[n,s]=process.env.MAIL_API_KEY.split("."),r=Array.isArray(e.to)?e.to.map(t=>({email:t})):[{email:e.to}];try{return (await(await fetch(`https://sandbox.api.mailtrap.io/api/send/${n}`,{method:"POST",headers:{"Api-Token":s,"Content-Type":"application/json"},body:JSON.stringify({attachments:e.attachments,bcc:e.bcc?.map(a=>({email:a})),cc:e.cc?.map(a=>({email:a})),from:e.from,html:e.html,subject:e.subject,to:r})})).json()).success}catch{return !1}}async function h(e,n,s,r,t){if(!process.env.MAIL_API_KEY)throw new Error("Mail API key has not been set");let o=g(),{subject:a,html:c}=await p(e,n),i={attachments:t,bcc:r?.bcc,cc:r?.cc,from:o,html:c,subject:a,to:s};return u(i)}
|
|
10
|
-
|
|
11
|
-
exports.createMail = b;
|
|
12
|
-
exports.getMail = p;
|
|
13
|
-
exports.sendMail = h;
|
|
14
|
-
//# sourceMappingURL=out.js.map
|
|
1
|
+
'use strict';var m=require('@sendgrid/mail'),p=require('stream');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var m__default=/*#__PURE__*/_interopDefault(m);var p__default=/*#__PURE__*/_interopDefault(p);function w(t,e){return {subject:t,template:e}}async function u(t){let e=(await import('react-dom/server')).default;return new Promise(o=>{let r=new p__default.default.Writable,n="";function s(c,l,g){n+=c.toString(),g();}r._write=s;let{pipe:a}=e.renderToPipeableStream(t,{onShellReady:()=>{a(r),o(n);}});})}async function f(t,e){let{subject:o,template:r}=t,n=await r(e),s=await u(n);return {subject:o,html:s}}function h(){if(!process.env.MAIL_FROM)throw new Error("Mail from address has not been set");let t=/^(?<name>[^<]+)<(?<email>[^>]+)>$/u.exec(process.env.MAIL_FROM);if(!t?.groups?.name||!t?.groups?.email)throw new Error('Mail from address is not the correct format. It should be "Name <email>".');return {email:t.groups.email.trim(),name:t.groups.name.trim()}}function i(t){return t?Array.isArray(t)?t.map(e=>({email:e})):[{email:t}]:[]}async function M(t){if(!process.env.MAIL_API_KEY)throw new Error("Mail API key has not been set");let[e,o]=process.env.MAIL_API_KEY.split("."),r=Array.isArray(t.to)?t.to.map(n=>({email:n})):[{email:t.to}];try{return (await(await fetch(`https://sandbox.api.mailtrap.io/api/send/${e}`,{method:"POST",headers:{"Api-Token":o,"Content-Type":"application/json"},body:JSON.stringify({attachments:t.attachments,bcc:i(t.bcc),cc:i(t.cc),from:t.from,html:t.html,subject:t.subject,to:r})})).json()).success}catch{return !1}}async function b(t){if(process.env.APP_ENV!=="production")throw new Error("Trying to run production mail in a development environment");if(!process.env.MAIL_ENABLE_PRODUCTION)throw new Error("Mail has not been enabled in production. Please add MAIL_ENABLE_PRODUCTION to your environment variables.");if(!process.env.MAIL_API_KEY)throw new Error("Mail API key has not been set");m__default.default.setApiKey(process.env.MAIL_API_KEY);try{let e=await m__default.default.send({attachments:t.attachments,bcc:i(t.bcc),cc:i(t.cc),from:t.from,html:t.html,to:i(t.to),subject:t.subject});return console.log(e),e[0].statusCode.toString().startsWith("2")}catch(e){return console.log(e),!1}}async function E(t,e,o,r,n){if(console.log(1),!process.env.MAIL_API_KEY)throw new Error("Mail API key has not been set");let s=h(),{subject:a,html:c}=await f(t,e),l={attachments:n,bcc:r?.bcc,cc:r?.cc,from:s,html:c,subject:a,to:o};return process.env.APP_ENV==="production"?(console.log(2),b(l)):(console.log(3),M(l))}
|
|
2
|
+
exports.createMail=w;exports.getMail=f;exports.sendMail=E;//# sourceMappingURL=index.cjs.map
|
|
15
3
|
//# sourceMappingURL=index.cjs.map
|
package/dist/mail/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/mail/MailService.ts"],"names":["stream","createMail","subject","template","renderMail","element","ReactDOMServer","resolve","ws","content","chunk","enc","next","pipe","getMail","mail","data","html","getSenderDetails","matches","sendDevelopmentMail","sendObject","id","key","to","email","sendMail","options","attachments","from"],"mappings":"AAEA,OAAOA,MAAY,SAOZ,SAASC,EACZC,EACAC,EACa,CACb,MAAO,CAAE,QAAAD,EAAS,SAAAC,CAAS,CAC/B,CAEA,eAAeC,EAAWC,EAA8C,CACpE,IAAMC,GAAkB,KAAM,QAAO,kBAAkB,GAAG,QAE1D,OAAO,IAAI,QAASC,GAAY,CAC5B,IAAMC,EAAK,IAAIR,EAAO,SAClBS,EAAU,GAEdD,EAAG,OAAS,CACRE,EACAC,EACAC,IACO,CACPH,GAAWC,EAAM,SAAS,EAC1BE,EAAK,CACT,EAEA,GAAM,CAAE,KAAAC,CAAK,EAAIP,EAAe,uBAAuBD,EAAS,CAC5D,aAAc,IAAM,CAChBQ,EAAKL,CAAE,EACPD,EAAQE,CAAO,CACnB,CACJ,CAAC,CACL,CAAC,CACL,CAEA,eAAsBK,EAClBC,EACAC,EAC0C,CAC1C,GAAM,CAAE,QAAAd,EAAS,SAAAC,CAAS,EAAIY,EAExBV,EAAU,MAAMF,EAASa,CAAI,EAC7BC,EAAO,MAAMb,EAAWC,CAAO,EAErC,MAAO,CACH,QAAAH,EACA,KAAAe,CACJ,CACJ,CAEA,SAASC,GAAoD,CACzD,GAAI,CAAC,QAAQ,IAAI,UACb,MAAM,IAAI,MAAM,oCAAoC,EAGxD,IAAMC,EAAU,qCAAqC,KAAK,QAAQ,IAAI,SAAS,EAE/E,GAAI,CAACA,GAAS,QAAQ,MAAQ,CAACA,GAAS,QAAQ,MAC5C,MAAM,IAAI,MACN,2EACJ,EAGJ,MAAO,CACH,MAAOA,EAAQ,OAAO,MAAM,KAAK,EACjC,KAAMA,EAAQ,OAAO,KAAK,KAAK,CACnC,CACJ,CAYA,eAAeC,EAAoBC,EAA8C,CAC7E,GAAI,CAAC,QAAQ,IAAI,aACb,MAAM,IAAI,MAAM,+BAA+B,EAQnD,GAAM,CAACC,EAAIC,CAAG,EAAI,QAAQ,IAAI,aAAa,MAAM,GAAG,EAE9CC,EAAK,MAAM,QAAQH,EAAW,EAAE,EAChCA,EAAW,GAAG,IAAKI,IAAW,CAAE,MAAAA,CAAM,EAAE,EACxC,CAAC,CAAE,MAAOJ,EAAW,EAAG,CAAC,EAE/B,GAAI,CAeA,OADc,MAbG,MAAM,MAAM,4CAA4CC,CAAE,GAAI,CAC3E,OAAQ,OACR,QAAS,CAAE,YAAaC,EAAK,eAAgB,kBAAmB,EAChE,KAAM,KAAK,UAAU,CACjB,YAAaF,EAAW,YACxB,IAAKA,EAAW,KAAK,IAAKI,IAAW,CAAE,MAAAA,CAAM,EAAE,EAC/C,GAAIJ,EAAW,IAAI,IAAKI,IAAW,CAAE,MAAAA,CAAM,EAAE,EAC7C,KAAMJ,EAAW,KACjB,KAAMA,EAAW,KACjB,QAASA,EAAW,QACpB,GAAAG,CACJ,CAAC,CACL,CAAC,GAC4B,KAAK,GACtB,OAChB,MAAc,CACV,MAAO,EACX,CACJ,CAuCA,eAAsBE,EAClBX,EACAC,EACAQ,EACAG,EACAC,EACgB,CAChB,GAAI,CAAC,QAAQ,IAAI,aACb,MAAM,IAAI,MAAM,+BAA+B,EAGnD,IAAMC,EAAOX,EAAiB,EACxB,CAAE,QAAAhB,EAAS,KAAAe,CAAK,EAAI,MAAMH,EAAQC,EAAMC,CAAI,EAE5CK,EAA6B,CAC/B,YAAAO,EACA,IAAKD,GAAS,IACd,GAAIA,GAAS,GACb,KAAAE,EACA,KAAAZ,EACA,QAAAf,EACA,GAAAsB,CACJ,EAOA,OAAOJ,EAAoBC,CAAU,CACzC","sourcesContent":["// import sgMail from '@sendgrid/mail';\n\nimport stream from 'node:stream';\n\nexport interface MailObject<T extends object> {\n subject: string;\n template: (data: T) => Promise<React.ReactElement> | React.ReactElement;\n}\n\nexport function createMail<T extends object>(\n subject: string,\n template: (data: T) => Promise<React.ReactElement> | React.ReactElement\n): MailObject<T> {\n return { subject, template };\n}\n\nasync function renderMail(element: React.ReactElement): Promise<string> {\n const ReactDOMServer = (await import('react-dom/server')).default;\n\n return new Promise((resolve) => {\n const ws = new stream.Writable();\n let content = '';\n\n ws._write = <T extends { toString: () => string }>( // eslint-disable-line no-underscore-dangle\n chunk: T,\n enc: BufferEncoding,\n next: (error?: Error | null) => void\n ): void => {\n content += chunk.toString();\n next();\n };\n\n const { pipe } = ReactDOMServer.renderToPipeableStream(element, {\n onShellReady: () => {\n pipe(ws);\n resolve(content);\n },\n });\n });\n}\n\nexport async function getMail<T extends object>(\n mail: MailObject<T>,\n data: T\n): Promise<{ subject: string; html: string }> {\n const { subject, template } = mail;\n\n const element = await template(data);\n const html = await renderMail(element);\n\n return {\n subject,\n html,\n };\n}\n\nfunction getSenderDetails(): { email: string; name: string } {\n if (!process.env.MAIL_FROM) {\n throw new Error('Mail from address has not been set');\n }\n\n const matches = /^(?<name>[^<]+)<(?<email>[^>]+)>$/u.exec(process.env.MAIL_FROM);\n\n if (!matches?.groups?.name || !matches?.groups?.email) {\n throw new Error(\n 'Mail from address is not the correct format. It should be \"Name <email>\".'\n );\n }\n\n return {\n email: matches.groups.email.trim(),\n name: matches.groups.name.trim(),\n };\n}\n\ninterface SendMailObject {\n attachments?: { content: string; filename: string; type: string }[];\n bcc?: string[];\n cc?: string[];\n from: { email: string; name: string };\n html: string;\n subject: string;\n to: string[] | string;\n}\n\nasync function sendDevelopmentMail(sendObject: SendMailObject): Promise<boolean> {\n if (!process.env.MAIL_API_KEY) {\n throw new Error('Mail API key has not been set');\n }\n\n /*\n * The account id and api key are both in the MAIL_API_KEY variable, separated by a `.`. We need\n * to split them.\n */\n\n const [id, key] = process.env.MAIL_API_KEY.split('.');\n\n const to = Array.isArray(sendObject.to)\n ? sendObject.to.map((email) => ({ email }))\n : [{ email: sendObject.to }];\n\n try {\n const response = await fetch(`https://sandbox.api.mailtrap.io/api/send/${id}`, {\n method: 'POST',\n headers: { 'Api-Token': key, 'Content-Type': 'application/json' },\n body: JSON.stringify({\n attachments: sendObject.attachments,\n bcc: sendObject.bcc?.map((email) => ({ email })),\n cc: sendObject.cc?.map((email) => ({ email })),\n from: sendObject.from,\n html: sendObject.html,\n subject: sendObject.subject,\n to,\n }),\n });\n const json = (await response.json()) as { success: boolean };\n return json.success;\n } catch (err) {\n return false;\n }\n}\n\n// async function sendProductionMail<T extends object>(\n// mail: Promise<MailFn<T>>,\n// data: T,\n// to: string\n// ): Promise<boolean> {\n// if (process.env.NODE_ENV === 'production') {\n// throw new Error('Trying to run production mail in a development environment');\n// }\n\n// if (!process.env.MAIL_ENABLE_PRODUCTION) {\n// throw new Error(\n// 'Mail has not been enabled in production. Please add MAIL_ENABLE_PRODUCTION to your environment variables.'\n// );\n// }\n\n// if (!process.env.MAIL_API_KEY) {\n// throw new Error('Mail API key has not been set');\n// }\n\n// sgMail.setApiKey(process.env.MAIL_API_KEY);\n\n// try {\n// const response = await sgMail.send({\n// to,\n// from,\n// subject,\n// html,\n// });\n// console.log(response);\n\n// return true;\n// } catch (err) {\n// console.log('err', err);\n// return false;\n// }\n// }\n\nexport async function sendMail<T extends object>(\n mail: MailObject<T>,\n data: T,\n to: string[] | string,\n options?: { cc?: string[]; bcc?: string[] },\n attachments?: { content: string; filename: string; type: string }[]\n): Promise<boolean> {\n if (!process.env.MAIL_API_KEY) {\n throw new Error('Mail API key has not been set');\n }\n\n const from = getSenderDetails();\n const { subject, html } = await getMail(mail, data);\n\n const sendObject: SendMailObject = {\n attachments,\n bcc: options?.bcc,\n cc: options?.cc,\n from,\n html,\n subject,\n to,\n };\n\n /*\n * For now, just send the email in development.\n * @TODO: Implement the production email sending.\n */\n\n return sendDevelopmentMail(sendObject);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/mail/MailService.ts"],"names":["createMail","subject","template","renderMail","element","ReactDOMServer","resolve","ws","stream","content","write","chunk","enc","next","pipe","getMail","mail","data","html","getSenderDetails","matches","transformEmailData","emails","email","sendDevelopmentMail","sendObject","id","key","to","sendProductionMail","sgMail","response","err","sendMail","options","attachments","from"],"mappings":"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","file":"index.cjs","sourcesContent":["import sgMail from '@sendgrid/mail';\n\nimport stream from 'node:stream';\n\nexport interface MailObject<T extends object> {\n subject: string;\n template: (data: T) => Promise<React.ReactElement> | React.ReactElement;\n}\n\nexport function createMail<T extends object>(\n subject: string,\n template: (data: T) => Promise<React.ReactElement> | React.ReactElement\n): MailObject<T> {\n return { subject, template };\n}\n\nasync function renderMail(element: React.ReactElement): Promise<string> {\n const ReactDOMServer = (await import('react-dom/server')).default;\n\n return new Promise((resolve) => {\n const ws = new stream.Writable();\n let content = '';\n\n function write<T extends { toString: () => string }>(\n chunk: T,\n enc: BufferEncoding,\n next: (error?: Error | null) => void\n ): void {\n content += chunk.toString();\n next();\n }\n\n ws._write = write; // eslint-disable-line no-underscore-dangle\n\n const { pipe } = ReactDOMServer.renderToPipeableStream(element, {\n onShellReady: () => {\n pipe(ws);\n resolve(content);\n },\n });\n });\n}\n\nexport async function getMail<T extends object>(\n mail: MailObject<T>,\n data: T\n): Promise<{ subject: string; html: string }> {\n const { subject, template } = mail;\n\n const element = await template(data);\n const html = await renderMail(element);\n\n return {\n subject,\n html,\n };\n}\n\nfunction getSenderDetails(): { email: string; name: string } {\n if (!process.env.MAIL_FROM) {\n throw new Error('Mail from address has not been set');\n }\n\n const matches = /^(?<name>[^<]+)<(?<email>[^>]+)>$/u.exec(process.env.MAIL_FROM);\n\n if (!matches?.groups?.name || !matches?.groups?.email) {\n throw new Error(\n 'Mail from address is not the correct format. It should be \"Name <email>\".'\n );\n }\n\n return {\n email: matches.groups.email.trim(),\n name: matches.groups.name.trim(),\n };\n}\n\nfunction transformEmailData(emails?: string[] | string): { email: string }[] {\n if (!emails) {\n return [];\n }\n return Array.isArray(emails) ? emails.map((email) => ({ email })) : [{ email: emails }];\n}\n\ninterface SendMailObject {\n attachments?: { content: string; filename: string; type: string }[];\n bcc?: string[] | string;\n cc?: string[] | string;\n from: { email: string; name: string };\n html: string;\n subject: string;\n to: string[] | string;\n}\n\nasync function sendDevelopmentMail(sendObject: SendMailObject): Promise<boolean> {\n if (!process.env.MAIL_API_KEY) {\n throw new Error('Mail API key has not been set');\n }\n\n /*\n * The account id and api key are both in the MAIL_API_KEY variable, separated by a `.`. We need\n * to split them.\n */\n\n const [id, key] = process.env.MAIL_API_KEY.split('.');\n\n const to = Array.isArray(sendObject.to)\n ? sendObject.to.map((email) => ({ email }))\n : [{ email: sendObject.to }];\n\n try {\n const response = await fetch(`https://sandbox.api.mailtrap.io/api/send/${id}`, {\n method: 'POST',\n headers: { 'Api-Token': key, 'Content-Type': 'application/json' },\n body: JSON.stringify({\n attachments: sendObject.attachments,\n bcc: transformEmailData(sendObject.bcc),\n cc: transformEmailData(sendObject.cc),\n from: sendObject.from,\n html: sendObject.html,\n subject: sendObject.subject,\n to,\n }),\n });\n const json = (await response.json()) as { success: boolean };\n return json.success;\n } catch (err) {\n return false;\n }\n}\n\nasync function sendProductionMail(sendObject: SendMailObject): Promise<boolean> {\n if (process.env.APP_ENV !== 'production') {\n throw new Error('Trying to run production mail in a development environment');\n }\n\n if (!process.env.MAIL_ENABLE_PRODUCTION) {\n throw new Error(\n 'Mail has not been enabled in production. Please add MAIL_ENABLE_PRODUCTION to your environment variables.'\n );\n }\n\n if (!process.env.MAIL_API_KEY) {\n throw new Error('Mail API key has not been set');\n }\n\n sgMail.setApiKey(process.env.MAIL_API_KEY);\n\n try {\n const response = await sgMail.send({\n attachments: sendObject.attachments,\n bcc: transformEmailData(sendObject.bcc),\n cc: transformEmailData(sendObject.cc),\n from: sendObject.from,\n html: sendObject.html,\n to: transformEmailData(sendObject.to),\n subject: sendObject.subject,\n });\n console.log(response);\n return response[0].statusCode.toString().startsWith('2');\n } catch (err) {\n console.log(err);\n return false;\n }\n}\n\nexport async function sendMail<T extends object>(\n mail: MailObject<T>,\n data: T,\n to: string[] | string,\n options?: { cc?: string[]; bcc?: string[] },\n attachments?: { content: string; filename: string; type: string }[]\n): Promise<boolean> {\n console.log(1);\n\n if (!process.env.MAIL_API_KEY) {\n throw new Error('Mail API key has not been set');\n }\n\n const from = getSenderDetails();\n const { subject, html } = await getMail(mail, data);\n\n const sendObject: SendMailObject = {\n attachments,\n bcc: options?.bcc,\n cc: options?.cc,\n from,\n html,\n subject,\n to,\n };\n\n if (process.env.APP_ENV === 'production') {\n console.log(2);\n return sendProductionMail(sendObject);\n }\n\n console.log(3);\n return sendDevelopmentMail(sendObject);\n}\n"]}
|
package/dist/mail/index.js
CHANGED
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
import m from 'stream';
|
|
2
|
-
|
|
3
|
-
function b(e,n){return {subject:e,template:n}}async function l(e){let n=(await import('react-dom/server')).default;return new Promise(s=>{let r=new m.Writable,t="";r._write=(a,c,i)=>{t+=a.toString(),i();};let{pipe:o}=n.renderToPipeableStream(e,{onShellReady:()=>{o(r),s(t);}});})}async function p(e,n){let{subject:s,template:r}=e,t=await r(n),o=await l(t);return {subject:s,html:o}}function g(){if(!process.env.MAIL_FROM)throw new Error("Mail from address has not been set");let e=/^(?<name>[^<]+)<(?<email>[^>]+)>$/u.exec(process.env.MAIL_FROM);if(!e?.groups?.name||!e?.groups?.email)throw new Error('Mail from address is not the correct format. It should be "Name <email>".');return {email:e.groups.email.trim(),name:e.groups.name.trim()}}async function u(e){if(!process.env.MAIL_API_KEY)throw new Error("Mail API key has not been set");let[n,s]=process.env.MAIL_API_KEY.split("."),r=Array.isArray(e.to)?e.to.map(t=>({email:t})):[{email:e.to}];try{return (await(await fetch(`https://sandbox.api.mailtrap.io/api/send/${n}`,{method:"POST",headers:{"Api-Token":s,"Content-Type":"application/json"},body:JSON.stringify({attachments:e.attachments,bcc:e.bcc?.map(a=>({email:a})),cc:e.cc?.map(a=>({email:a})),from:e.from,html:e.html,subject:e.subject,to:r})})).json()).success}catch{return !1}}async function h(e,n,s,r,t){if(!process.env.MAIL_API_KEY)throw new Error("Mail API key has not been set");let o=g(),{subject:a,html:c}=await p(e,n),i={attachments:t,bcc:r?.bcc,cc:r?.cc,from:o,html:c,subject:a,to:s};return u(i)}
|
|
4
|
-
|
|
5
|
-
export { b as createMail, p as getMail, h as sendMail };
|
|
6
|
-
//# sourceMappingURL=out.js.map
|
|
1
|
+
import m from'@sendgrid/mail';import p from'stream';function w(t,e){return {subject:t,template:e}}async function u(t){let e=(await import('react-dom/server')).default;return new Promise(o=>{let r=new p.Writable,n="";function s(c,l,g){n+=c.toString(),g();}r._write=s;let{pipe:a}=e.renderToPipeableStream(t,{onShellReady:()=>{a(r),o(n);}});})}async function f(t,e){let{subject:o,template:r}=t,n=await r(e),s=await u(n);return {subject:o,html:s}}function h(){if(!process.env.MAIL_FROM)throw new Error("Mail from address has not been set");let t=/^(?<name>[^<]+)<(?<email>[^>]+)>$/u.exec(process.env.MAIL_FROM);if(!t?.groups?.name||!t?.groups?.email)throw new Error('Mail from address is not the correct format. It should be "Name <email>".');return {email:t.groups.email.trim(),name:t.groups.name.trim()}}function i(t){return t?Array.isArray(t)?t.map(e=>({email:e})):[{email:t}]:[]}async function M(t){if(!process.env.MAIL_API_KEY)throw new Error("Mail API key has not been set");let[e,o]=process.env.MAIL_API_KEY.split("."),r=Array.isArray(t.to)?t.to.map(n=>({email:n})):[{email:t.to}];try{return (await(await fetch(`https://sandbox.api.mailtrap.io/api/send/${e}`,{method:"POST",headers:{"Api-Token":o,"Content-Type":"application/json"},body:JSON.stringify({attachments:t.attachments,bcc:i(t.bcc),cc:i(t.cc),from:t.from,html:t.html,subject:t.subject,to:r})})).json()).success}catch{return !1}}async function b(t){if(process.env.APP_ENV!=="production")throw new Error("Trying to run production mail in a development environment");if(!process.env.MAIL_ENABLE_PRODUCTION)throw new Error("Mail has not been enabled in production. Please add MAIL_ENABLE_PRODUCTION to your environment variables.");if(!process.env.MAIL_API_KEY)throw new Error("Mail API key has not been set");m.setApiKey(process.env.MAIL_API_KEY);try{let e=await m.send({attachments:t.attachments,bcc:i(t.bcc),cc:i(t.cc),from:t.from,html:t.html,to:i(t.to),subject:t.subject});return console.log(e),e[0].statusCode.toString().startsWith("2")}catch(e){return console.log(e),!1}}async function E(t,e,o,r,n){if(console.log(1),!process.env.MAIL_API_KEY)throw new Error("Mail API key has not been set");let s=h(),{subject:a,html:c}=await f(t,e),l={attachments:n,bcc:r?.bcc,cc:r?.cc,from:s,html:c,subject:a,to:o};return process.env.APP_ENV==="production"?(console.log(2),b(l)):(console.log(3),M(l))}
|
|
2
|
+
export{w as createMail,f as getMail,E as sendMail};//# sourceMappingURL=index.js.map
|
|
7
3
|
//# sourceMappingURL=index.js.map
|
package/dist/mail/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/mail/MailService.ts"],"names":["stream","createMail","subject","template","renderMail","element","ReactDOMServer","resolve","ws","content","chunk","enc","next","pipe","getMail","mail","data","html","getSenderDetails","matches","sendDevelopmentMail","sendObject","id","key","to","email","sendMail","options","attachments","from"],"mappings":"AAEA,OAAOA,MAAY,SAOZ,SAASC,EACZC,EACAC,EACa,CACb,MAAO,CAAE,QAAAD,EAAS,SAAAC,CAAS,CAC/B,CAEA,eAAeC,EAAWC,EAA8C,CACpE,IAAMC,GAAkB,KAAM,QAAO,kBAAkB,GAAG,QAE1D,OAAO,IAAI,QAASC,GAAY,CAC5B,IAAMC,EAAK,IAAIR,EAAO,SAClBS,EAAU,GAEdD,EAAG,OAAS,CACRE,EACAC,EACAC,IACO,CACPH,GAAWC,EAAM,SAAS,EAC1BE,EAAK,CACT,EAEA,GAAM,CAAE,KAAAC,CAAK,EAAIP,EAAe,uBAAuBD,EAAS,CAC5D,aAAc,IAAM,CAChBQ,EAAKL,CAAE,EACPD,EAAQE,CAAO,CACnB,CACJ,CAAC,CACL,CAAC,CACL,CAEA,eAAsBK,EAClBC,EACAC,EAC0C,CAC1C,GAAM,CAAE,QAAAd,EAAS,SAAAC,CAAS,EAAIY,EAExBV,EAAU,MAAMF,EAASa,CAAI,EAC7BC,EAAO,MAAMb,EAAWC,CAAO,EAErC,MAAO,CACH,QAAAH,EACA,KAAAe,CACJ,CACJ,CAEA,SAASC,GAAoD,CACzD,GAAI,CAAC,QAAQ,IAAI,UACb,MAAM,IAAI,MAAM,oCAAoC,EAGxD,IAAMC,EAAU,qCAAqC,KAAK,QAAQ,IAAI,SAAS,EAE/E,GAAI,CAACA,GAAS,QAAQ,MAAQ,CAACA,GAAS,QAAQ,MAC5C,MAAM,IAAI,MACN,2EACJ,EAGJ,MAAO,CACH,MAAOA,EAAQ,OAAO,MAAM,KAAK,EACjC,KAAMA,EAAQ,OAAO,KAAK,KAAK,CACnC,CACJ,CAYA,eAAeC,EAAoBC,EAA8C,CAC7E,GAAI,CAAC,QAAQ,IAAI,aACb,MAAM,IAAI,MAAM,+BAA+B,EAQnD,GAAM,CAACC,EAAIC,CAAG,EAAI,QAAQ,IAAI,aAAa,MAAM,GAAG,EAE9CC,EAAK,MAAM,QAAQH,EAAW,EAAE,EAChCA,EAAW,GAAG,IAAKI,IAAW,CAAE,MAAAA,CAAM,EAAE,EACxC,CAAC,CAAE,MAAOJ,EAAW,EAAG,CAAC,EAE/B,GAAI,CAeA,OADc,MAbG,MAAM,MAAM,4CAA4CC,CAAE,GAAI,CAC3E,OAAQ,OACR,QAAS,CAAE,YAAaC,EAAK,eAAgB,kBAAmB,EAChE,KAAM,KAAK,UAAU,CACjB,YAAaF,EAAW,YACxB,IAAKA,EAAW,KAAK,IAAKI,IAAW,CAAE,MAAAA,CAAM,EAAE,EAC/C,GAAIJ,EAAW,IAAI,IAAKI,IAAW,CAAE,MAAAA,CAAM,EAAE,EAC7C,KAAMJ,EAAW,KACjB,KAAMA,EAAW,KACjB,QAASA,EAAW,QACpB,GAAAG,CACJ,CAAC,CACL,CAAC,GAC4B,KAAK,GACtB,OAChB,MAAc,CACV,MAAO,EACX,CACJ,CAuCA,eAAsBE,EAClBX,EACAC,EACAQ,EACAG,EACAC,EACgB,CAChB,GAAI,CAAC,QAAQ,IAAI,aACb,MAAM,IAAI,MAAM,+BAA+B,EAGnD,IAAMC,EAAOX,EAAiB,EACxB,CAAE,QAAAhB,EAAS,KAAAe,CAAK,EAAI,MAAMH,EAAQC,EAAMC,CAAI,EAE5CK,EAA6B,CAC/B,YAAAO,EACA,IAAKD,GAAS,IACd,GAAIA,GAAS,GACb,KAAAE,EACA,KAAAZ,EACA,QAAAf,EACA,GAAAsB,CACJ,EAOA,OAAOJ,EAAoBC,CAAU,CACzC","sourcesContent":["// import sgMail from '@sendgrid/mail';\n\nimport stream from 'node:stream';\n\nexport interface MailObject<T extends object> {\n subject: string;\n template: (data: T) => Promise<React.ReactElement> | React.ReactElement;\n}\n\nexport function createMail<T extends object>(\n subject: string,\n template: (data: T) => Promise<React.ReactElement> | React.ReactElement\n): MailObject<T> {\n return { subject, template };\n}\n\nasync function renderMail(element: React.ReactElement): Promise<string> {\n const ReactDOMServer = (await import('react-dom/server')).default;\n\n return new Promise((resolve) => {\n const ws = new stream.Writable();\n let content = '';\n\n ws._write = <T extends { toString: () => string }>( // eslint-disable-line no-underscore-dangle\n chunk: T,\n enc: BufferEncoding,\n next: (error?: Error | null) => void\n ): void => {\n content += chunk.toString();\n next();\n };\n\n const { pipe } = ReactDOMServer.renderToPipeableStream(element, {\n onShellReady: () => {\n pipe(ws);\n resolve(content);\n },\n });\n });\n}\n\nexport async function getMail<T extends object>(\n mail: MailObject<T>,\n data: T\n): Promise<{ subject: string; html: string }> {\n const { subject, template } = mail;\n\n const element = await template(data);\n const html = await renderMail(element);\n\n return {\n subject,\n html,\n };\n}\n\nfunction getSenderDetails(): { email: string; name: string } {\n if (!process.env.MAIL_FROM) {\n throw new Error('Mail from address has not been set');\n }\n\n const matches = /^(?<name>[^<]+)<(?<email>[^>]+)>$/u.exec(process.env.MAIL_FROM);\n\n if (!matches?.groups?.name || !matches?.groups?.email) {\n throw new Error(\n 'Mail from address is not the correct format. It should be \"Name <email>\".'\n );\n }\n\n return {\n email: matches.groups.email.trim(),\n name: matches.groups.name.trim(),\n };\n}\n\ninterface SendMailObject {\n attachments?: { content: string; filename: string; type: string }[];\n bcc?: string[];\n cc?: string[];\n from: { email: string; name: string };\n html: string;\n subject: string;\n to: string[] | string;\n}\n\nasync function sendDevelopmentMail(sendObject: SendMailObject): Promise<boolean> {\n if (!process.env.MAIL_API_KEY) {\n throw new Error('Mail API key has not been set');\n }\n\n /*\n * The account id and api key are both in the MAIL_API_KEY variable, separated by a `.`. We need\n * to split them.\n */\n\n const [id, key] = process.env.MAIL_API_KEY.split('.');\n\n const to = Array.isArray(sendObject.to)\n ? sendObject.to.map((email) => ({ email }))\n : [{ email: sendObject.to }];\n\n try {\n const response = await fetch(`https://sandbox.api.mailtrap.io/api/send/${id}`, {\n method: 'POST',\n headers: { 'Api-Token': key, 'Content-Type': 'application/json' },\n body: JSON.stringify({\n attachments: sendObject.attachments,\n bcc: sendObject.bcc?.map((email) => ({ email })),\n cc: sendObject.cc?.map((email) => ({ email })),\n from: sendObject.from,\n html: sendObject.html,\n subject: sendObject.subject,\n to,\n }),\n });\n const json = (await response.json()) as { success: boolean };\n return json.success;\n } catch (err) {\n return false;\n }\n}\n\n// async function sendProductionMail<T extends object>(\n// mail: Promise<MailFn<T>>,\n// data: T,\n// to: string\n// ): Promise<boolean> {\n// if (process.env.NODE_ENV === 'production') {\n// throw new Error('Trying to run production mail in a development environment');\n// }\n\n// if (!process.env.MAIL_ENABLE_PRODUCTION) {\n// throw new Error(\n// 'Mail has not been enabled in production. Please add MAIL_ENABLE_PRODUCTION to your environment variables.'\n// );\n// }\n\n// if (!process.env.MAIL_API_KEY) {\n// throw new Error('Mail API key has not been set');\n// }\n\n// sgMail.setApiKey(process.env.MAIL_API_KEY);\n\n// try {\n// const response = await sgMail.send({\n// to,\n// from,\n// subject,\n// html,\n// });\n// console.log(response);\n\n// return true;\n// } catch (err) {\n// console.log('err', err);\n// return false;\n// }\n// }\n\nexport async function sendMail<T extends object>(\n mail: MailObject<T>,\n data: T,\n to: string[] | string,\n options?: { cc?: string[]; bcc?: string[] },\n attachments?: { content: string; filename: string; type: string }[]\n): Promise<boolean> {\n if (!process.env.MAIL_API_KEY) {\n throw new Error('Mail API key has not been set');\n }\n\n const from = getSenderDetails();\n const { subject, html } = await getMail(mail, data);\n\n const sendObject: SendMailObject = {\n attachments,\n bcc: options?.bcc,\n cc: options?.cc,\n from,\n html,\n subject,\n to,\n };\n\n /*\n * For now, just send the email in development.\n * @TODO: Implement the production email sending.\n */\n\n return sendDevelopmentMail(sendObject);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/mail/MailService.ts"],"names":["createMail","subject","template","renderMail","element","ReactDOMServer","resolve","ws","stream","content","write","chunk","enc","next","pipe","getMail","mail","data","html","getSenderDetails","matches","transformEmailData","emails","email","sendDevelopmentMail","sendObject","id","key","to","sendProductionMail","sgMail","response","err","sendMail","options","attachments","from"],"mappings":"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","file":"index.js","sourcesContent":["import sgMail from '@sendgrid/mail';\n\nimport stream from 'node:stream';\n\nexport interface MailObject<T extends object> {\n subject: string;\n template: (data: T) => Promise<React.ReactElement> | React.ReactElement;\n}\n\nexport function createMail<T extends object>(\n subject: string,\n template: (data: T) => Promise<React.ReactElement> | React.ReactElement\n): MailObject<T> {\n return { subject, template };\n}\n\nasync function renderMail(element: React.ReactElement): Promise<string> {\n const ReactDOMServer = (await import('react-dom/server')).default;\n\n return new Promise((resolve) => {\n const ws = new stream.Writable();\n let content = '';\n\n function write<T extends { toString: () => string }>(\n chunk: T,\n enc: BufferEncoding,\n next: (error?: Error | null) => void\n ): void {\n content += chunk.toString();\n next();\n }\n\n ws._write = write; // eslint-disable-line no-underscore-dangle\n\n const { pipe } = ReactDOMServer.renderToPipeableStream(element, {\n onShellReady: () => {\n pipe(ws);\n resolve(content);\n },\n });\n });\n}\n\nexport async function getMail<T extends object>(\n mail: MailObject<T>,\n data: T\n): Promise<{ subject: string; html: string }> {\n const { subject, template } = mail;\n\n const element = await template(data);\n const html = await renderMail(element);\n\n return {\n subject,\n html,\n };\n}\n\nfunction getSenderDetails(): { email: string; name: string } {\n if (!process.env.MAIL_FROM) {\n throw new Error('Mail from address has not been set');\n }\n\n const matches = /^(?<name>[^<]+)<(?<email>[^>]+)>$/u.exec(process.env.MAIL_FROM);\n\n if (!matches?.groups?.name || !matches?.groups?.email) {\n throw new Error(\n 'Mail from address is not the correct format. It should be \"Name <email>\".'\n );\n }\n\n return {\n email: matches.groups.email.trim(),\n name: matches.groups.name.trim(),\n };\n}\n\nfunction transformEmailData(emails?: string[] | string): { email: string }[] {\n if (!emails) {\n return [];\n }\n return Array.isArray(emails) ? emails.map((email) => ({ email })) : [{ email: emails }];\n}\n\ninterface SendMailObject {\n attachments?: { content: string; filename: string; type: string }[];\n bcc?: string[] | string;\n cc?: string[] | string;\n from: { email: string; name: string };\n html: string;\n subject: string;\n to: string[] | string;\n}\n\nasync function sendDevelopmentMail(sendObject: SendMailObject): Promise<boolean> {\n if (!process.env.MAIL_API_KEY) {\n throw new Error('Mail API key has not been set');\n }\n\n /*\n * The account id and api key are both in the MAIL_API_KEY variable, separated by a `.`. We need\n * to split them.\n */\n\n const [id, key] = process.env.MAIL_API_KEY.split('.');\n\n const to = Array.isArray(sendObject.to)\n ? sendObject.to.map((email) => ({ email }))\n : [{ email: sendObject.to }];\n\n try {\n const response = await fetch(`https://sandbox.api.mailtrap.io/api/send/${id}`, {\n method: 'POST',\n headers: { 'Api-Token': key, 'Content-Type': 'application/json' },\n body: JSON.stringify({\n attachments: sendObject.attachments,\n bcc: transformEmailData(sendObject.bcc),\n cc: transformEmailData(sendObject.cc),\n from: sendObject.from,\n html: sendObject.html,\n subject: sendObject.subject,\n to,\n }),\n });\n const json = (await response.json()) as { success: boolean };\n return json.success;\n } catch (err) {\n return false;\n }\n}\n\nasync function sendProductionMail(sendObject: SendMailObject): Promise<boolean> {\n if (process.env.APP_ENV !== 'production') {\n throw new Error('Trying to run production mail in a development environment');\n }\n\n if (!process.env.MAIL_ENABLE_PRODUCTION) {\n throw new Error(\n 'Mail has not been enabled in production. Please add MAIL_ENABLE_PRODUCTION to your environment variables.'\n );\n }\n\n if (!process.env.MAIL_API_KEY) {\n throw new Error('Mail API key has not been set');\n }\n\n sgMail.setApiKey(process.env.MAIL_API_KEY);\n\n try {\n const response = await sgMail.send({\n attachments: sendObject.attachments,\n bcc: transformEmailData(sendObject.bcc),\n cc: transformEmailData(sendObject.cc),\n from: sendObject.from,\n html: sendObject.html,\n to: transformEmailData(sendObject.to),\n subject: sendObject.subject,\n });\n console.log(response);\n return response[0].statusCode.toString().startsWith('2');\n } catch (err) {\n console.log(err);\n return false;\n }\n}\n\nexport async function sendMail<T extends object>(\n mail: MailObject<T>,\n data: T,\n to: string[] | string,\n options?: { cc?: string[]; bcc?: string[] },\n attachments?: { content: string; filename: string; type: string }[]\n): Promise<boolean> {\n console.log(1);\n\n if (!process.env.MAIL_API_KEY) {\n throw new Error('Mail API key has not been set');\n }\n\n const from = getSenderDetails();\n const { subject, html } = await getMail(mail, data);\n\n const sendObject: SendMailObject = {\n attachments,\n bcc: options?.bcc,\n cc: options?.cc,\n from,\n html,\n subject,\n to,\n };\n\n if (process.env.APP_ENV === 'production') {\n console.log(2);\n return sendProductionMail(sendObject);\n }\n\n console.log(3);\n return sendDevelopmentMail(sendObject);\n}\n"]}
|
package/dist/middleware.cjs
CHANGED
|
@@ -1,9 +1,2 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var server = require('next/server');
|
|
4
|
-
|
|
5
|
-
var c="/auth/login";function p(e){return e.headers.get("accept")==="application/json"}function r(e,t){return t.headers.set("x-origin",e.nextUrl.origin),t.headers.set("x-pathname",e.nextUrl.pathname),t.headers.set("x-search-params",e.nextUrl.searchParams.toString()),t}function x(e){return e.toString().replace(e.origin,"")}function o(e,t=c){return e.nextUrl.pathname===t?r(e,server.NextResponse.next()):r(e,p(e)?server.NextResponse.json({error:"Unauthorized"},{status:401}):server.NextResponse.redirect(`${e.nextUrl.origin}${t}?r=${encodeURIComponent(x(e.nextUrl))}`))}function l(){let e=new Headers;return process.env.VERCEL_AUTOMATION_BYPASS_SECRET&&e.append("x-vercel-protection-bypass",process.env.VERCEL_AUTOMATION_BYPASS_SECRET),{headers:e}}async function d(e,t){if(e.nextUrl.pathname==="/api/session")return r(e,t?t():server.NextResponse.next());let i=e.cookies.get(process.env.AUTH_COOKIE_NAME||"auth_session")?.value||"";try{let s=await(await fetch(`${e.nextUrl.origin}/api/session?id=${i}&pathname=${e.nextUrl.pathname}`,l())).json();return s.redirect===null?r(e,t?t():server.NextResponse.next()):o(e,s.redirect)}catch{return o(e)}}
|
|
6
|
-
|
|
7
|
-
exports.handleMiddleware = d;
|
|
8
|
-
//# sourceMappingURL=out.js.map
|
|
1
|
+
'use strict';var server=require('next/server');var c="/auth/login";function p(e){return e.headers.get("accept")==="application/json"}function r(e,t){return t.headers.set("x-origin",e.nextUrl.origin),t.headers.set("x-pathname",e.nextUrl.pathname),t.headers.set("x-search-params",e.nextUrl.searchParams.toString()),t}function x(e){return e.toString().replace(e.origin,"")}function o(e,t=c){return e.nextUrl.pathname===t?r(e,server.NextResponse.next()):r(e,p(e)?server.NextResponse.json({error:"Unauthorized"},{status:401}):server.NextResponse.redirect(`${e.nextUrl.origin}${t}?r=${encodeURIComponent(x(e.nextUrl))}`))}function l(){let e=new Headers;return process.env.VERCEL_AUTOMATION_BYPASS_SECRET&&e.append("x-vercel-protection-bypass",process.env.VERCEL_AUTOMATION_BYPASS_SECRET),{headers:e}}async function d(e,t){if(e.nextUrl.pathname==="/api/session")return r(e,t?t():server.NextResponse.next());let i=e.cookies.get(process.env.AUTH_COOKIE_NAME||"auth_session")?.value||"";try{let s=await(await fetch(`${e.nextUrl.origin}/api/session?id=${i}&pathname=${e.nextUrl.pathname}`,l())).json();return s.redirect===null?r(e,t?t():server.NextResponse.next()):o(e,s.redirect)}catch{return o(e)}}exports.handleMiddleware=d;//# sourceMappingURL=middleware.cjs.map
|
|
9
2
|
//# sourceMappingURL=middleware.cjs.map
|
package/dist/middleware.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/middleware.ts"],"names":["
|
|
1
|
+
{"version":3,"sources":["../src/middleware.ts"],"names":["DEFAULT_REDIRECT","isJsonRequest","request","applyHeaders","response","getRelativeUrl","url","redirect","pathname","NextResponse","bypassProtection","headers","handleMiddleware","nextFn","sessionID","json"],"mappings":"+CAGA,IAAMA,CAAAA,CAAmB,cAEzB,SAASC,CAAAA,CAAcC,CAA+B,CAAA,CAClD,OAAOA,CAAAA,CAAQ,QAAQ,GAAI,CAAA,QAAQ,CAAM,GAAA,kBAC7C,CAEA,SAASC,EAAaD,CAAsBE,CAAAA,CAAAA,CAAsC,CAC9E,OAAAA,CAAS,CAAA,OAAA,CAAQ,IAAI,UAAYF,CAAAA,CAAAA,CAAQ,OAAQ,CAAA,MAAM,CACvDE,CAAAA,CAAAA,CAAS,QAAQ,GAAI,CAAA,YAAA,CAAcF,CAAQ,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAC3DE,EAAS,OAAQ,CAAA,GAAA,CAAI,iBAAmBF,CAAAA,CAAAA,CAAQ,OAAQ,CAAA,YAAA,CAAa,UAAU,CAAA,CACxEE,CACX,CAEA,SAASC,CAAAA,CAAeC,EAAqC,CACzD,OAAOA,CAAI,CAAA,QAAA,EAAW,CAAA,OAAA,CAAQA,EAAI,MAAQ,CAAA,EAAE,CAChD,CAEA,SAASC,CAAAA,CAASL,EAAsBM,CAAWR,CAAAA,CAAAA,CAAgC,CAC/E,OAAIE,CAAQ,CAAA,OAAA,CAAQ,WAAaM,CACtBL,CAAAA,CAAAA,CAAaD,CAASO,CAAAA,mBAAAA,CAAa,IAAK,EAAC,EAG7CN,CACHD,CAAAA,CAAAA,CACAD,CAAcC,CAAAA,CAAO,CACfO,CAAAA,mBAAAA,CAAa,KAAK,CAAE,KAAA,CAAO,cAAe,CAAA,CAAG,CAAE,MAAA,CAAQ,GAAI,CAAC,CAAA,CAC5DA,mBAAa,CAAA,QAAA,CACT,CAAGP,EAAAA,CAAAA,CAAQ,QAAQ,MAAM,CAAA,EAAGM,CAAQ,CAAA,GAAA,EAAM,kBACtCH,CAAAA,CAAAA,CAAeH,EAAQ,OAAO,CAClC,CAAC,CAAA,CACL,CACV,CACJ,CAMA,SAASQ,CAAAA,EAAgC,CACrC,IAAMC,CAAU,CAAA,IAAI,QAEpB,OAAI,OAAA,CAAQ,GAAI,CAAA,+BAAA,EACZA,CAAQ,CAAA,MAAA,CAAO,6BAA8B,OAAQ,CAAA,GAAA,CAAI,+BAA+B,CAAA,CAGrF,CAAE,OAAA,CAAAA,CAAQ,CACrB,CAEA,eAAsBC,CAAAA,CAClBV,CACAW,CAAAA,CAAAA,CACqB,CAErB,GAAIX,CAAAA,CAAQ,OAAQ,CAAA,QAAA,GAAa,cAC7B,CAAA,OAAOC,EAAaD,CAASW,CAAAA,CAAAA,CAASA,CAAO,EAAA,CAAIJ,mBAAa,CAAA,IAAA,EAAM,CAGxE,CAAA,IAAMK,CACFZ,CAAAA,CAAAA,CAAQ,OAAQ,CAAA,GAAA,CAAI,QAAQ,GAAI,CAAA,gBAAA,EAAoB,cAAc,CAAA,EAAG,KAAS,EAAA,EAAA,CAElF,GAAI,CAKA,IAAMa,CAAQ,CAAA,KAAA,CAJE,MAAM,KAAA,CAClB,GAAGb,CAAQ,CAAA,OAAA,CAAQ,MAAM,CAAA,gBAAA,EAAmBY,CAAS,CAAA,UAAA,EAAaZ,EAAQ,OAAQ,CAAA,QAAQ,CAC1FQ,CAAAA,CAAAA,CAAAA,EACJ,CAAA,EAC4B,MAE5B,CAAA,OAAIK,CAAK,CAAA,QAAA,GAAa,IACXZ,CAAAA,CAAAA,CAAaD,EAASW,CAASA,CAAAA,CAAAA,EAAWJ,CAAAA,mBAAAA,CAAa,IAAK,EAAC,EAGjEF,CAASL,CAAAA,CAAAA,CAASa,CAAK,CAAA,QAAQ,CAC1C,CAAA,KAAc,CACV,OAAOR,CAAAA,CAASL,CAAO,CAC3B,CACJ","file":"middleware.cjs","sourcesContent":["import { NextResponse } from 'next/server';\nimport type { NextRequest } from 'next/server';\n\nconst DEFAULT_REDIRECT = '/auth/login';\n\nfunction isJsonRequest(request: NextRequest): boolean {\n return request.headers.get('accept') === 'application/json';\n}\n\nfunction applyHeaders(request: NextRequest, response: NextResponse): NextResponse {\n response.headers.set('x-origin', request.nextUrl.origin);\n response.headers.set('x-pathname', request.nextUrl.pathname);\n response.headers.set('x-search-params', request.nextUrl.searchParams.toString());\n return response;\n}\n\nfunction getRelativeUrl(url: NextRequest['nextUrl']): string {\n return url.toString().replace(url.origin, '');\n}\n\nfunction redirect(request: NextRequest, pathname = DEFAULT_REDIRECT): NextResponse {\n if (request.nextUrl.pathname === pathname) {\n return applyHeaders(request, NextResponse.next());\n }\n\n return applyHeaders(\n request,\n isJsonRequest(request)\n ? NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n : NextResponse.redirect(\n `${request.nextUrl.origin}${pathname}?r=${encodeURIComponent(\n getRelativeUrl(request.nextUrl)\n )}`\n )\n );\n}\n\n/*\n * When deployed to Vercel in a preview environment, we need to bypass the protection when fetching\n * the session from the API.\n */\nfunction bypassProtection(): RequestInit {\n const headers = new Headers();\n\n if (process.env.VERCEL_AUTOMATION_BYPASS_SECRET) {\n headers.append('x-vercel-protection-bypass', process.env.VERCEL_AUTOMATION_BYPASS_SECRET);\n }\n\n return { headers };\n}\n\nexport async function handleMiddleware(\n request: NextRequest,\n nextFn?: () => NextResponse\n): Promise<NextResponse> {\n // If the URL is /api/session, we should just return the response, otherwise we end up in a loop\n if (request.nextUrl.pathname === '/api/session') {\n return applyHeaders(request, nextFn ? nextFn() : NextResponse.next());\n }\n\n const sessionID =\n request.cookies.get(process.env.AUTH_COOKIE_NAME || 'auth_session')?.value || '';\n\n try {\n const session = await fetch(\n `${request.nextUrl.origin}/api/session?id=${sessionID}&pathname=${request.nextUrl.pathname}`,\n bypassProtection()\n );\n const json = (await session.json()) as { redirect: string | null };\n\n if (json.redirect === null) {\n return applyHeaders(request, nextFn ? nextFn() : NextResponse.next());\n }\n\n return redirect(request, json.redirect);\n } catch (err) {\n return redirect(request);\n }\n}\n"]}
|
package/dist/middleware.js
CHANGED
|
@@ -1,7 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
var c="/auth/login";function p(e){return e.headers.get("accept")==="application/json"}function r(e,t){return t.headers.set("x-origin",e.nextUrl.origin),t.headers.set("x-pathname",e.nextUrl.pathname),t.headers.set("x-search-params",e.nextUrl.searchParams.toString()),t}function x(e){return e.toString().replace(e.origin,"")}function o(e,t=c){return e.nextUrl.pathname===t?r(e,NextResponse.next()):r(e,p(e)?NextResponse.json({error:"Unauthorized"},{status:401}):NextResponse.redirect(`${e.nextUrl.origin}${t}?r=${encodeURIComponent(x(e.nextUrl))}`))}function l(){let e=new Headers;return process.env.VERCEL_AUTOMATION_BYPASS_SECRET&&e.append("x-vercel-protection-bypass",process.env.VERCEL_AUTOMATION_BYPASS_SECRET),{headers:e}}async function d(e,t){if(e.nextUrl.pathname==="/api/session")return r(e,t?t():NextResponse.next());let i=e.cookies.get(process.env.AUTH_COOKIE_NAME||"auth_session")?.value||"";try{let s=await(await fetch(`${e.nextUrl.origin}/api/session?id=${i}&pathname=${e.nextUrl.pathname}`,l())).json();return s.redirect===null?r(e,t?t():NextResponse.next()):o(e,s.redirect)}catch{return o(e)}}
|
|
4
|
-
|
|
5
|
-
export { d as handleMiddleware };
|
|
6
|
-
//# sourceMappingURL=out.js.map
|
|
1
|
+
import {NextResponse}from'next/server';var c="/auth/login";function p(e){return e.headers.get("accept")==="application/json"}function r(e,t){return t.headers.set("x-origin",e.nextUrl.origin),t.headers.set("x-pathname",e.nextUrl.pathname),t.headers.set("x-search-params",e.nextUrl.searchParams.toString()),t}function x(e){return e.toString().replace(e.origin,"")}function o(e,t=c){return e.nextUrl.pathname===t?r(e,NextResponse.next()):r(e,p(e)?NextResponse.json({error:"Unauthorized"},{status:401}):NextResponse.redirect(`${e.nextUrl.origin}${t}?r=${encodeURIComponent(x(e.nextUrl))}`))}function l(){let e=new Headers;return process.env.VERCEL_AUTOMATION_BYPASS_SECRET&&e.append("x-vercel-protection-bypass",process.env.VERCEL_AUTOMATION_BYPASS_SECRET),{headers:e}}async function d(e,t){if(e.nextUrl.pathname==="/api/session")return r(e,t?t():NextResponse.next());let i=e.cookies.get(process.env.AUTH_COOKIE_NAME||"auth_session")?.value||"";try{let s=await(await fetch(`${e.nextUrl.origin}/api/session?id=${i}&pathname=${e.nextUrl.pathname}`,l())).json();return s.redirect===null?r(e,t?t():NextResponse.next()):o(e,s.redirect)}catch{return o(e)}}export{d as handleMiddleware};//# sourceMappingURL=middleware.js.map
|
|
7
2
|
//# sourceMappingURL=middleware.js.map
|
package/dist/middleware.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/middleware.ts"],"names":["
|
|
1
|
+
{"version":3,"sources":["../src/middleware.ts"],"names":["DEFAULT_REDIRECT","isJsonRequest","request","applyHeaders","response","getRelativeUrl","url","redirect","pathname","NextResponse","bypassProtection","headers","handleMiddleware","nextFn","sessionID","json"],"mappings":"uCAGA,IAAMA,CAAAA,CAAmB,cAEzB,SAASC,CAAAA,CAAcC,CAA+B,CAAA,CAClD,OAAOA,CAAAA,CAAQ,QAAQ,GAAI,CAAA,QAAQ,CAAM,GAAA,kBAC7C,CAEA,SAASC,EAAaD,CAAsBE,CAAAA,CAAAA,CAAsC,CAC9E,OAAAA,CAAS,CAAA,OAAA,CAAQ,IAAI,UAAYF,CAAAA,CAAAA,CAAQ,OAAQ,CAAA,MAAM,CACvDE,CAAAA,CAAAA,CAAS,QAAQ,GAAI,CAAA,YAAA,CAAcF,CAAQ,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAC3DE,EAAS,OAAQ,CAAA,GAAA,CAAI,iBAAmBF,CAAAA,CAAAA,CAAQ,OAAQ,CAAA,YAAA,CAAa,UAAU,CAAA,CACxEE,CACX,CAEA,SAASC,CAAAA,CAAeC,EAAqC,CACzD,OAAOA,CAAI,CAAA,QAAA,EAAW,CAAA,OAAA,CAAQA,EAAI,MAAQ,CAAA,EAAE,CAChD,CAEA,SAASC,CAAAA,CAASL,EAAsBM,CAAWR,CAAAA,CAAAA,CAAgC,CAC/E,OAAIE,CAAQ,CAAA,OAAA,CAAQ,WAAaM,CACtBL,CAAAA,CAAAA,CAAaD,CAASO,CAAAA,YAAAA,CAAa,IAAK,EAAC,EAG7CN,CACHD,CAAAA,CAAAA,CACAD,CAAcC,CAAAA,CAAO,CACfO,CAAAA,YAAAA,CAAa,KAAK,CAAE,KAAA,CAAO,cAAe,CAAA,CAAG,CAAE,MAAA,CAAQ,GAAI,CAAC,CAAA,CAC5DA,YAAa,CAAA,QAAA,CACT,CAAGP,EAAAA,CAAAA,CAAQ,QAAQ,MAAM,CAAA,EAAGM,CAAQ,CAAA,GAAA,EAAM,kBACtCH,CAAAA,CAAAA,CAAeH,EAAQ,OAAO,CAClC,CAAC,CAAA,CACL,CACV,CACJ,CAMA,SAASQ,CAAAA,EAAgC,CACrC,IAAMC,CAAU,CAAA,IAAI,QAEpB,OAAI,OAAA,CAAQ,GAAI,CAAA,+BAAA,EACZA,CAAQ,CAAA,MAAA,CAAO,6BAA8B,OAAQ,CAAA,GAAA,CAAI,+BAA+B,CAAA,CAGrF,CAAE,OAAA,CAAAA,CAAQ,CACrB,CAEA,eAAsBC,CAAAA,CAClBV,CACAW,CAAAA,CAAAA,CACqB,CAErB,GAAIX,CAAAA,CAAQ,OAAQ,CAAA,QAAA,GAAa,cAC7B,CAAA,OAAOC,EAAaD,CAASW,CAAAA,CAAAA,CAASA,CAAO,EAAA,CAAIJ,YAAa,CAAA,IAAA,EAAM,CAGxE,CAAA,IAAMK,CACFZ,CAAAA,CAAAA,CAAQ,OAAQ,CAAA,GAAA,CAAI,QAAQ,GAAI,CAAA,gBAAA,EAAoB,cAAc,CAAA,EAAG,KAAS,EAAA,EAAA,CAElF,GAAI,CAKA,IAAMa,CAAQ,CAAA,KAAA,CAJE,MAAM,KAAA,CAClB,GAAGb,CAAQ,CAAA,OAAA,CAAQ,MAAM,CAAA,gBAAA,EAAmBY,CAAS,CAAA,UAAA,EAAaZ,EAAQ,OAAQ,CAAA,QAAQ,CAC1FQ,CAAAA,CAAAA,CAAAA,EACJ,CAAA,EAC4B,MAE5B,CAAA,OAAIK,CAAK,CAAA,QAAA,GAAa,IACXZ,CAAAA,CAAAA,CAAaD,EAASW,CAASA,CAAAA,CAAAA,EAAWJ,CAAAA,YAAAA,CAAa,IAAK,EAAC,EAGjEF,CAASL,CAAAA,CAAAA,CAASa,CAAK,CAAA,QAAQ,CAC1C,CAAA,KAAc,CACV,OAAOR,CAAAA,CAASL,CAAO,CAC3B,CACJ","file":"middleware.js","sourcesContent":["import { NextResponse } from 'next/server';\nimport type { NextRequest } from 'next/server';\n\nconst DEFAULT_REDIRECT = '/auth/login';\n\nfunction isJsonRequest(request: NextRequest): boolean {\n return request.headers.get('accept') === 'application/json';\n}\n\nfunction applyHeaders(request: NextRequest, response: NextResponse): NextResponse {\n response.headers.set('x-origin', request.nextUrl.origin);\n response.headers.set('x-pathname', request.nextUrl.pathname);\n response.headers.set('x-search-params', request.nextUrl.searchParams.toString());\n return response;\n}\n\nfunction getRelativeUrl(url: NextRequest['nextUrl']): string {\n return url.toString().replace(url.origin, '');\n}\n\nfunction redirect(request: NextRequest, pathname = DEFAULT_REDIRECT): NextResponse {\n if (request.nextUrl.pathname === pathname) {\n return applyHeaders(request, NextResponse.next());\n }\n\n return applyHeaders(\n request,\n isJsonRequest(request)\n ? NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n : NextResponse.redirect(\n `${request.nextUrl.origin}${pathname}?r=${encodeURIComponent(\n getRelativeUrl(request.nextUrl)\n )}`\n )\n );\n}\n\n/*\n * When deployed to Vercel in a preview environment, we need to bypass the protection when fetching\n * the session from the API.\n */\nfunction bypassProtection(): RequestInit {\n const headers = new Headers();\n\n if (process.env.VERCEL_AUTOMATION_BYPASS_SECRET) {\n headers.append('x-vercel-protection-bypass', process.env.VERCEL_AUTOMATION_BYPASS_SECRET);\n }\n\n return { headers };\n}\n\nexport async function handleMiddleware(\n request: NextRequest,\n nextFn?: () => NextResponse\n): Promise<NextResponse> {\n // If the URL is /api/session, we should just return the response, otherwise we end up in a loop\n if (request.nextUrl.pathname === '/api/session') {\n return applyHeaders(request, nextFn ? nextFn() : NextResponse.next());\n }\n\n const sessionID =\n request.cookies.get(process.env.AUTH_COOKIE_NAME || 'auth_session')?.value || '';\n\n try {\n const session = await fetch(\n `${request.nextUrl.origin}/api/session?id=${sessionID}&pathname=${request.nextUrl.pathname}`,\n bypassProtection()\n );\n const json = (await session.json()) as { redirect: string | null };\n\n if (json.redirect === null) {\n return applyHeaders(request, nextFn ? nextFn() : NextResponse.next());\n }\n\n return redirect(request, json.redirect);\n } catch (err) {\n return redirect(request);\n }\n}\n"]}
|
package/dist/url/index.cjs
CHANGED
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var headers = require('next/headers');
|
|
4
|
-
|
|
5
|
-
async function s(){let t=process.env.SZ_ORIGIN;if(t)return t;let r=(await headers.headers()).get("x-origin");if(r)return r;let n=(await headers.headers()).get("x-forwarded-proto"),e=(await headers.headers()).get("x-forwarded-host");if(n&&e)return `${n}://${e}`;throw new Error("No origin could be determined")}async function u(){let t=(await headers.headers()).get("x-pathname");if(t)return t;throw new Error("No pathname could be determined. Please make sure middleware is being applied to the current request.")}async function a(t){let r=await s();if(!t)return r;let e=r.startsWith("https://")?"https://":"http://",i=`${r.replace(/^https?:\/\//u,"")}/${t}`.replace(/\/+/gu,"/");return `${e}${i}`}async function p(t){return a(t)}
|
|
6
|
-
|
|
7
|
-
exports.getOrigin = s;
|
|
8
|
-
exports.getPathname = u;
|
|
9
|
-
exports.getURL = p;
|
|
10
|
-
exports.makeURL = a;
|
|
11
|
-
//# sourceMappingURL=out.js.map
|
|
1
|
+
'use strict';var headers=require('next/headers');async function s(){let t=process.env.SZ_ORIGIN;if(t)return t;let r=(await headers.headers()).get("x-origin");if(r)return r;let n=(await headers.headers()).get("x-forwarded-proto"),e=(await headers.headers()).get("x-forwarded-host");if(n&&e)return `${n}://${e}`;throw new Error("No origin could be determined")}async function u(){let t=(await headers.headers()).get("x-pathname");if(t)return t;throw new Error("No pathname could be determined. Please make sure middleware is being applied to the current request.")}async function a(t){let r=await s();if(!t)return r;let e=r.startsWith("https://")?"https://":"http://",i=`${r.replace(/^https?:\/\//u,"")}/${t}`.replace(/\/+/gu,"/");return `${e}${i}`}async function p(t){return a(t)}
|
|
2
|
+
exports.getOrigin=s;exports.getPathname=u;exports.getURL=p;exports.makeURL=a;//# sourceMappingURL=index.cjs.map
|
|
12
3
|
//# sourceMappingURL=index.cjs.map
|