@sqrzro/server 4.0.0-alpha.56 → 4.0.0-alpha.58

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.
@@ -1,2 +1,2 @@
1
- import {a as a$1}from'../chunk-UCMLSO7F.js';import {b,a as a$2}from'../chunk-2ZLU4AUD.js';export{b as ValidationError,a as createRule,c as getExistsTransformer}from'../chunk-2ZLU4AUD.js';import {a as a$3}from'../chunk-6GDOIHTS.js';import'../chunk-BA3BC4CD.js';import {redirect}from'next/navigation';import x,{z as z$1}from'zod';import {put}from'@vercel/blob';import {joinURL}from'@sqrzro/utility';function w(e){let[,,t]=e.split(";");redirect(`${t.startsWith("/")?"":"/"}${t}`);}var l=w;function f(e){let t={};for(let r in e)typeof e[r]=="string"?t[r]=e[r].trim()===""?null:e[r].trim():typeof e[r]=="object"&&e[r]!==null&&!(e[r]instanceof Date)&&!(e[r]instanceof File)?t[r]=f(e[r]):t[r]=e[r];return t}var p=f;function I(e){return e.issues.reduce((t,r)=>({...t,[r.path.join(".")]:r.message.replace(/"/gu,"")}),{})}var c=I;function D(e){return typeof e.input>"u"&&(e.code==="invalid_type"||e.code==="invalid_value")||!e.input&&(e.code==="invalid_format"||e.code==="too_small")}function v(e){return D(e)?{message:"REQUIRED"}:e.message?{message:e.message}:null}var d=v;async function P(e,t){try{return await t.parseAsync(p(e),{error:o=>d(o)})}catch(r){throw r instanceof z$1.ZodError?new b(c(r)):r}}var a=P;async function T(e){let t={data:null,error:null,validation:null};try{let r=await a(e.formData,e.schema),o=await e.fn(r);return await e.onSuccess?.(o),{...t,data:o}}catch(r){return r instanceof b?(e.onValidationError?.(r),{...t,validation:r.messages}):r instanceof Error?(r.message==="NEXT_REDIRECT"&&"digest"in r&&l(String(r.digest)),console.error(r),{...t,error:r.message}):{...t,error:"submitForm encountered an unknown error"}}}var i=T;function z(e){let t=process.env.APP_URL??"_default_",r=new URL(t),o=e.name.split(".").pop()??"";return joinURL(`${r.hostname.replace("www.","").replace(/\./g,"-")}${r.port?`-${r.port}`:""}`,`${a$3(null,32)}.${o}`)}var g=z;async function Z(e){return (await put(g(e),e,{access:"public"})).url}var R=Z;var A=x.object({file:x.instanceof(File)});async function _(e){return i({fn:async t=>R(t.file),formData:{file:e},schema:A})}var j=_;function N(e,t){return [async function(r){let o=await t(r[e]);return o?o.id===r.id:true},{message:"ALREADY_EXISTS",path:[e]}]}var k=N;var U=x.string().transform(a$1);function B(){return a$2({validator:U})}var C=B;function O(e){return typeof e=="string"?e.replace(/[\s-]/g,""):e}function X({max:e=20,min:t=4,optional:r=false}={}){let o=x.string().regex(/^\d+$/).max(e).min(t),h=r?o.nullable():o.nonempty(),E=x.preprocess(O,h);return a$2({validator:E})}var Y=X;function q(e){return [async t=>!!await e(t),{message:"NOT_FOUND"}]}var Q=q;function W(e){return [async t=>!await e(t),{message:"ALREADY_EXISTS"}]}var G=W;export{C as getCSVRule,Q as getExistsValidator,k as getNotExistsRefiner,G as getNotExistsValidator,Y as getPhoneRule,i as submitForm,j as uploadFile,a as validateSchema};//# sourceMappingURL=index.js.map
1
+ import {a as a$1}from'../chunk-UCMLSO7F.js';import {b,a as a$2}from'../chunk-2ZLU4AUD.js';export{b as ValidationError,a as createRule,c as getExistsTransformer}from'../chunk-2ZLU4AUD.js';import {a as a$3}from'../chunk-6GDOIHTS.js';import'../chunk-BA3BC4CD.js';import {joinURL}from'@sqrzro/utility';import {redirect}from'next/navigation';import x,{z}from'zod';import {put}from'@vercel/blob';function I(e){let[,,t]=e.split(";");redirect(joinURL(t));}var l=I;function f(e){let t={};for(let r in e)typeof e[r]=="string"?t[r]=e[r].trim()===""?null:e[r].trim():typeof e[r]=="object"&&e[r]!==null&&!(e[r]instanceof Date)&&!(e[r]instanceof File)?t[r]=f(e[r]):t[r]=e[r];return t}var p=f;function D(e){return e.issues.reduce((t,r)=>({...t,[r.path.join(".")]:r.message.replace(/"/gu,"")}),{})}var c=D;function v(e){return typeof e.input>"u"&&(e.code==="invalid_type"||e.code==="invalid_value")||!e.input&&(e.code==="invalid_format"||e.code==="too_small")}function S(e){return v(e)?{message:"REQUIRED"}:e.message?{message:e.message}:null}var d=S;async function T(e,t){try{return await t.parseAsync(p(e),{error:o=>d(o)})}catch(r){throw r instanceof z.ZodError?new b(c(r)):r}}var a=T;async function $(e){let t={data:null,error:null,validation:null};try{let r=await a(e.formData,e.schema),o=await e.fn(r);return await e.onSuccess?.(o),{...t,data:o}}catch(r){return r instanceof b?(e.onValidationError?.(r),{...t,validation:r.messages}):r instanceof Error?(r.message==="NEXT_REDIRECT"&&"digest"in r&&l(String(r.digest)),console.error(r),{...t,error:r.message}):{...t,error:"submitForm encountered an unknown error"}}}var i=$;function V(e){let t=process.env.APP_URL??"_default_",r=new URL(t),o=e.name.split(".").pop()??"";return joinURL(`${r.hostname.replace("www.","").replace(/\./g,"-")}${r.port?`-${r.port}`:""}`,`${a$3(null,32)}.${o}`)}var g=V;async function A(e){return (await put(g(e),e,{access:"public"})).url}var R=A;var j=x.object({file:x.instanceof(File)});async function _(e){return i({fn:async t=>R(t.file),formData:{file:e},schema:j})}var N=_;function L(e,t){return [async function(r){let o=await t(r[e]);return o?o.id===r.id:true},{message:"ALREADY_EXISTS",path:[e]}]}var U=L;var B=x.string().transform(a$1);function C(){return a$2({validator:B})}var O=C;function X(e){return typeof e=="string"?e.replace(/[\s-]/g,""):e}function Y({max:e=20,min:t=4,optional:r=false}={}){let o=x.string().regex(/^\d+$/).max(e).min(t),h=r?o.nullable():o.nonempty(),E=x.preprocess(X,h);return a$2({validator:E})}var q=Y;function Q(e){return [async t=>!!await e(t),{message:"NOT_FOUND"}]}var G=Q;function H(e){return [async t=>!await e(t),{message:"ALREADY_EXISTS"}]}var J=H;export{O as getCSVRule,G as getExistsValidator,U as getNotExistsRefiner,J as getNotExistsValidator,q as getPhoneRule,i as submitForm,N as uploadFile,a as validateSchema};//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/forms/utility/handle-redirect.ts","../../src/forms/utility/clean-data.ts","../../src/forms/utility/transform-errors.ts","../../src/forms/utility/transform-issue.ts","../../src/forms/validate-schema.ts","../../src/forms/submit-form.ts","../../src/forms/utility/transform-file-path.ts","../../src/forms/files/put-file.ts","../../src/forms/files/upload-file.ts","../../src/forms/refiner/get-not-exists-refiner.ts","../../src/forms/rules/get-csv-rule.ts","../../src/forms/rules/get-phone-rule.ts","../../src/forms/validators/get-exists-validator.ts","../../src/forms/validators/get-not-exists-validator.ts"],"names":["handleRedirect","digest","path","redirect","handle_redirect_default","cleanData","data","cleanedData","key","clean_data_default","transformErrors","error","acc","cur","transform_errors_default","isRequired","issue","transformIssue","transform_issue_default","validateSchema","schema","z","ValidationError_default","validate_schema_default","submitForm","args","response","model","submit_form_default","transformFilePath","file","url","obj","extension","joinURL","generate_id_default","transform_file_path_default","putFile","put","put_file_default","uploadFile","upload_file_default","getNotExistsRefiner","field","fn","result","get_not_exists_refiner_default","validator","parse_csv_default","getCSVRule","create_rule_default","get_csv_rule_default","preprocess","value","getPhoneRule","max","min","optional","baseRule","rule","get_phone_rule_default","getExistsValidator","get_exists_validator_default","getNotExistsValidator","get_not_exists_validator_default"],"mappings":"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","file":"index.js","sourcesContent":["import { redirect } from 'next/navigation';\n\nfunction handleRedirect(digest: string): void {\n const [, , path] = digest.split(';');\n redirect(`${path.startsWith('/') ? '' : '/'}${path}`);\n}\n\nexport default handleRedirect;\n","function cleanData(data: object): object {\n const cleanedData: Record<string, unknown> = {};\n\n for (const key in data) {\n if (typeof data[key] === 'string') {\n cleanedData[key] = data[key].trim() === '' ? null : data[key].trim();\n } else if (\n typeof data[key] === 'object' &&\n data[key] !== null &&\n !(data[key] instanceof Date) &&\n !(data[key] instanceof File)\n ) {\n cleanedData[key] = cleanData(data[key] as object);\n } else {\n cleanedData[key] = data[key];\n }\n }\n\n return cleanedData;\n}\n\nexport default cleanData;\n","import { z } from 'zod';\n\nfunction transformErrors(error: z.ZodError): Record<string, string> {\n return error.issues.reduce(\n (acc, cur) => ({\n ...acc,\n [cur.path.join('.')]: cur.message.replace(/\"/gu, ''),\n }),\n {}\n );\n}\n\nexport default transformErrors;\n","import type { $ZodIssue, $ZodIssueBase, $ZodRawIssue } from 'zod/v4/core';\n\nfunction isRequired<T extends $ZodIssueBase = $ZodIssue>(issue: $ZodRawIssue<T>): boolean {\n if (\n typeof issue.input === 'undefined' &&\n (issue.code === 'invalid_type' || issue.code === 'invalid_value')\n ) {\n return true;\n }\n\n if (!issue.input && (issue.code === 'invalid_format' || issue.code === 'too_small')) {\n return true;\n }\n\n return false;\n}\n\nfunction transformIssue<T extends $ZodIssueBase = $ZodIssue>(\n issue: $ZodRawIssue<T>\n): { message: string } | null {\n if (isRequired(issue)) {\n return { message: 'REQUIRED' };\n }\n\n return issue.message ? { message: issue.message } : null;\n}\n\nexport default transformIssue;\n","import { z } from 'zod';\n\nimport cleanData from './utility/clean-data';\nimport transformErrors from './utility/transform-errors';\nimport transformIssue from './utility/transform-issue';\n\nimport ValidationError from './ValidationError';\n\nasync function validateSchema<T extends z.ZodTypeAny>(\n data: object,\n schema: T\n): Promise<z.infer<T>> {\n try {\n const result = await schema.parseAsync(cleanData(data), {\n error: (issue) => transformIssue(issue),\n });\n return result;\n } catch (error) {\n if (error instanceof z.ZodError) {\n throw new ValidationError(transformErrors(error));\n }\n throw error;\n }\n}\n\nexport default validateSchema;\n","import { z } from 'zod';\n\nimport handleRedirect from './utility/handle-redirect';\nimport type { AwaitedFormResponse, FormResponse } from './utility/interfaces';\n\nimport ValidationError from './ValidationError';\nimport validateSchema from './validate-schema';\n\ninterface SubmitFormArgs<Schema extends z.ZodTypeAny, Response> {\n fn: (data: z.infer<Schema>) => Promise<Response>;\n formData: object;\n onSuccess?: (model: Response) => Promise<void> | void;\n onValidationError?: (error: ValidationError) => void;\n schema: Schema;\n}\n\n/**\n * Submit a form and handle validation and submission errors.\n *\n * @param args The arguments for submitting the form.\n * @returns A promise that resolves to either the submitted model or an error.\n */\nasync function submitForm<Schema extends z.ZodTypeAny, Response>(\n args: SubmitFormArgs<Schema, Response>\n): FormResponse<Response> {\n let response: AwaitedFormResponse<Response> = { data: null, error: null, validation: null };\n\n try {\n const data = await validateSchema(args.formData, args.schema);\n const model = await args.fn(data);\n\n await args.onSuccess?.(model);\n\n return { ...response, data: model };\n } catch (error) {\n if (error instanceof ValidationError) {\n args.onValidationError?.(error);\n return { ...response, validation: error.messages };\n }\n if (error instanceof Error) {\n if (error.message === 'NEXT_REDIRECT' && 'digest' in error) {\n handleRedirect(String(error.digest));\n }\n console.error(error);\n return { ...response, error: error.message };\n }\n return { ...response, error: 'submitForm encountered an unknown error' };\n }\n}\n\nexport default submitForm;\n","import { joinURL } from '@sqrzro/utility';\n\nimport { generateID } from '../../utility';\n\nfunction transformFilePath(file: File): string {\n const url = process.env.APP_URL ?? '_default_';\n const obj = new URL(url);\n\n const extension = file.name.split('.').pop() ?? '';\n\n return joinURL(\n `${obj.hostname.replace('www.', '').replace(/\\./g, '-')}${obj.port ? `-${obj.port}` : ''}`,\n `${generateID(null, 32)}.${extension}`\n );\n}\n\nexport default transformFilePath;\n","import { put } from '@vercel/blob';\n\nimport transformFilePath from '../utility/transform-file-path';\n\nasync function putFile(file: File): Promise<string> {\n const result = await put(transformFilePath(file), file, {\n access: 'public',\n });\n\n return result.url;\n}\n\nexport default putFile;\n","import z from 'zod';\n\nimport submitForm from '../submit-form';\nimport type { FormResponse } from '../utility/interfaces';\n\nimport putFile from './put-file';\n\nconst schema = z.object({\n file: z.instanceof(File),\n});\n\nasync function uploadFile(file: File): FormResponse<string> {\n return submitForm({\n fn: async (data: z.infer<typeof schema>): Promise<string> => putFile(data.file),\n formData: { file },\n schema,\n });\n}\n\nexport default uploadFile;\n","function getNotExistsRefiner(\n field: string,\n fn: (value: any) => Promise<any>\n): [\n (data: any) => Promise<boolean>,\n {\n message: string;\n path: string[];\n },\n] {\n return [\n async function (data: any) {\n const result = await fn(data[field]);\n\n if (!result) {\n return true;\n }\n\n return result.id === data.id;\n },\n { message: 'ALREADY_EXISTS', path: [field] },\n ];\n}\n\nexport default getNotExistsRefiner;\n","import z from 'zod';\n\nimport parseCSV from '../../csv/parse-csv';\n\nimport createRule from '../create-rule';\n\nconst validator = z.string().transform(parseCSV);\n\nfunction getCSVRule() {\n return createRule({ validator });\n}\n\nexport default getCSVRule;\n","import z from 'zod';\n\nimport createRule from '../create-rule';\n\ninterface PhoneRuleOptions {\n max?: number;\n min?: number;\n optional?: boolean;\n}\n\nfunction preprocess(value: unknown): unknown {\n if (typeof value === 'string') {\n return value.replace(/[\\s-]/g, '');\n }\n return value;\n}\n\nfunction getPhoneRule({ max = 20, min = 4, optional = false }: PhoneRuleOptions = {}) {\n const baseRule = z.string().regex(/^\\d+$/).max(max).min(min);\n const rule = optional ? baseRule.nullable() : baseRule.nonempty();\n\n const validator = z.preprocess(preprocess, rule);\n return createRule({ validator });\n}\n\nexport default getPhoneRule;\n","function getExistsValidator<T, ID>(\n fn: (value: ID) => Promise<T>\n): [(value: ID) => Promise<boolean>, { message: string }] {\n return [\n async (value: ID) => {\n const result = await fn(value);\n return Boolean(result);\n },\n { message: 'NOT_FOUND' },\n ];\n}\n\nexport default getExistsValidator;\n","function getNotExistsValidator<ID>(\n fn: (value: ID) => Promise<any>\n): [(value: ID) => Promise<boolean>, { message: string }] {\n return [\n async (value: ID) => {\n const result = await fn(value);\n return !result;\n },\n { message: 'ALREADY_EXISTS' },\n ];\n}\n\nexport default getNotExistsValidator;\n"]}
1
+ {"version":3,"sources":["../../src/forms/utility/handle-redirect.ts","../../src/forms/utility/clean-data.ts","../../src/forms/utility/transform-errors.ts","../../src/forms/utility/transform-issue.ts","../../src/forms/validate-schema.ts","../../src/forms/submit-form.ts","../../src/forms/utility/transform-file-path.ts","../../src/forms/files/put-file.ts","../../src/forms/files/upload-file.ts","../../src/forms/refiner/get-not-exists-refiner.ts","../../src/forms/rules/get-csv-rule.ts","../../src/forms/rules/get-phone-rule.ts","../../src/forms/validators/get-exists-validator.ts","../../src/forms/validators/get-not-exists-validator.ts"],"names":["handleRedirect","digest","path","redirect","joinURL","handle_redirect_default","cleanData","data","cleanedData","key","clean_data_default","transformErrors","error","acc","cur","transform_errors_default","isRequired","issue","transformIssue","transform_issue_default","validateSchema","schema","z","ValidationError_default","validate_schema_default","submitForm","args","response","model","submit_form_default","transformFilePath","file","url","obj","extension","generate_id_default","transform_file_path_default","putFile","put","put_file_default","uploadFile","upload_file_default","getNotExistsRefiner","field","fn","result","get_not_exists_refiner_default","validator","parse_csv_default","getCSVRule","create_rule_default","get_csv_rule_default","preprocess","value","getPhoneRule","max","min","optional","baseRule","rule","get_phone_rule_default","getExistsValidator","get_exists_validator_default","getNotExistsValidator","get_not_exists_validator_default"],"mappings":"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","file":"index.js","sourcesContent":["import { joinURL } from '@sqrzro/utility';\nimport { redirect } from 'next/navigation';\n\nfunction handleRedirect(digest: string): void {\n const [, , path] = digest.split(';');\n redirect(joinURL(path));\n}\n\nexport default handleRedirect;\n","function cleanData(data: object): object {\n const cleanedData: Record<string, unknown> = {};\n\n for (const key in data) {\n if (typeof data[key] === 'string') {\n cleanedData[key] = data[key].trim() === '' ? null : data[key].trim();\n } else if (\n typeof data[key] === 'object' &&\n data[key] !== null &&\n !(data[key] instanceof Date) &&\n !(data[key] instanceof File)\n ) {\n cleanedData[key] = cleanData(data[key] as object);\n } else {\n cleanedData[key] = data[key];\n }\n }\n\n return cleanedData;\n}\n\nexport default cleanData;\n","import { z } from 'zod';\n\nfunction transformErrors(error: z.ZodError): Record<string, string> {\n return error.issues.reduce(\n (acc, cur) => ({\n ...acc,\n [cur.path.join('.')]: cur.message.replace(/\"/gu, ''),\n }),\n {}\n );\n}\n\nexport default transformErrors;\n","import type { $ZodIssue, $ZodIssueBase, $ZodRawIssue } from 'zod/v4/core';\n\nfunction isRequired<T extends $ZodIssueBase = $ZodIssue>(issue: $ZodRawIssue<T>): boolean {\n if (\n typeof issue.input === 'undefined' &&\n (issue.code === 'invalid_type' || issue.code === 'invalid_value')\n ) {\n return true;\n }\n\n if (!issue.input && (issue.code === 'invalid_format' || issue.code === 'too_small')) {\n return true;\n }\n\n return false;\n}\n\nfunction transformIssue<T extends $ZodIssueBase = $ZodIssue>(\n issue: $ZodRawIssue<T>\n): { message: string } | null {\n if (isRequired(issue)) {\n return { message: 'REQUIRED' };\n }\n\n return issue.message ? { message: issue.message } : null;\n}\n\nexport default transformIssue;\n","import { z } from 'zod';\n\nimport cleanData from './utility/clean-data';\nimport transformErrors from './utility/transform-errors';\nimport transformIssue from './utility/transform-issue';\n\nimport ValidationError from './ValidationError';\n\nasync function validateSchema<T extends z.ZodTypeAny>(\n data: object,\n schema: T\n): Promise<z.infer<T>> {\n try {\n const result = await schema.parseAsync(cleanData(data), {\n error: (issue) => transformIssue(issue),\n });\n return result;\n } catch (error) {\n if (error instanceof z.ZodError) {\n throw new ValidationError(transformErrors(error));\n }\n throw error;\n }\n}\n\nexport default validateSchema;\n","import { z } from 'zod';\n\nimport handleRedirect from './utility/handle-redirect';\nimport type { AwaitedFormResponse, FormResponse } from './utility/interfaces';\n\nimport ValidationError from './ValidationError';\nimport validateSchema from './validate-schema';\n\ninterface SubmitFormArgs<Schema extends z.ZodTypeAny, Response> {\n fn: (data: z.infer<Schema>) => Promise<Response>;\n formData: object;\n onSuccess?: (model: Response) => Promise<void> | void;\n onValidationError?: (error: ValidationError) => void;\n schema: Schema;\n}\n\n/**\n * Submit a form and handle validation and submission errors.\n *\n * @param args The arguments for submitting the form.\n * @returns A promise that resolves to either the submitted model or an error.\n */\nasync function submitForm<Schema extends z.ZodTypeAny, Response>(\n args: SubmitFormArgs<Schema, Response>\n): FormResponse<Response> {\n let response: AwaitedFormResponse<Response> = { data: null, error: null, validation: null };\n\n try {\n const data = await validateSchema(args.formData, args.schema);\n const model = await args.fn(data);\n\n await args.onSuccess?.(model);\n\n return { ...response, data: model };\n } catch (error) {\n if (error instanceof ValidationError) {\n args.onValidationError?.(error);\n return { ...response, validation: error.messages };\n }\n if (error instanceof Error) {\n if (error.message === 'NEXT_REDIRECT' && 'digest' in error) {\n handleRedirect(String(error.digest));\n }\n console.error(error);\n return { ...response, error: error.message };\n }\n return { ...response, error: 'submitForm encountered an unknown error' };\n }\n}\n\nexport default submitForm;\n","import { joinURL } from '@sqrzro/utility';\n\nimport { generateID } from '../../utility';\n\nfunction transformFilePath(file: File): string {\n const url = process.env.APP_URL ?? '_default_';\n const obj = new URL(url);\n\n const extension = file.name.split('.').pop() ?? '';\n\n return joinURL(\n `${obj.hostname.replace('www.', '').replace(/\\./g, '-')}${obj.port ? `-${obj.port}` : ''}`,\n `${generateID(null, 32)}.${extension}`\n );\n}\n\nexport default transformFilePath;\n","import { put } from '@vercel/blob';\n\nimport transformFilePath from '../utility/transform-file-path';\n\nasync function putFile(file: File): Promise<string> {\n const result = await put(transformFilePath(file), file, {\n access: 'public',\n });\n\n return result.url;\n}\n\nexport default putFile;\n","import z from 'zod';\n\nimport submitForm from '../submit-form';\nimport type { FormResponse } from '../utility/interfaces';\n\nimport putFile from './put-file';\n\nconst schema = z.object({\n file: z.instanceof(File),\n});\n\nasync function uploadFile(file: File): FormResponse<string> {\n return submitForm({\n fn: async (data: z.infer<typeof schema>): Promise<string> => putFile(data.file),\n formData: { file },\n schema,\n });\n}\n\nexport default uploadFile;\n","function getNotExistsRefiner(\n field: string,\n fn: (value: any) => Promise<any>\n): [\n (data: any) => Promise<boolean>,\n {\n message: string;\n path: string[];\n },\n] {\n return [\n async function (data: any) {\n const result = await fn(data[field]);\n\n if (!result) {\n return true;\n }\n\n return result.id === data.id;\n },\n { message: 'ALREADY_EXISTS', path: [field] },\n ];\n}\n\nexport default getNotExistsRefiner;\n","import z from 'zod';\n\nimport parseCSV from '../../csv/parse-csv';\n\nimport createRule from '../create-rule';\n\nconst validator = z.string().transform(parseCSV);\n\nfunction getCSVRule() {\n return createRule({ validator });\n}\n\nexport default getCSVRule;\n","import z from 'zod';\n\nimport createRule from '../create-rule';\n\ninterface PhoneRuleOptions {\n max?: number;\n min?: number;\n optional?: boolean;\n}\n\nfunction preprocess(value: unknown): unknown {\n if (typeof value === 'string') {\n return value.replace(/[\\s-]/g, '');\n }\n return value;\n}\n\nfunction getPhoneRule({ max = 20, min = 4, optional = false }: PhoneRuleOptions = {}) {\n const baseRule = z.string().regex(/^\\d+$/).max(max).min(min);\n const rule = optional ? baseRule.nullable() : baseRule.nonempty();\n\n const validator = z.preprocess(preprocess, rule);\n return createRule({ validator });\n}\n\nexport default getPhoneRule;\n","function getExistsValidator<T, ID>(\n fn: (value: ID) => Promise<T>\n): [(value: ID) => Promise<boolean>, { message: string }] {\n return [\n async (value: ID) => {\n const result = await fn(value);\n return Boolean(result);\n },\n { message: 'NOT_FOUND' },\n ];\n}\n\nexport default getExistsValidator;\n","function getNotExistsValidator<ID>(\n fn: (value: ID) => Promise<any>\n): [(value: ID) => Promise<boolean>, { message: string }] {\n return [\n async (value: ID) => {\n const result = await fn(value);\n return !result;\n },\n { message: 'ALREADY_EXISTS' },\n ];\n}\n\nexport default getNotExistsValidator;\n"]}
@@ -1,2 +1,2 @@
1
- import {createClient}from'redis';var n=null;async function c(){if(!process.env.REDIS_URL)throw new Error("REDIS_URL is not defined. Access to the cache is not possible.");return n||(n=createClient({url:process.env.REDIS_URL}),await n.connect(),n)}var i=c;async function g(t,r,e){if(typeof e=="number")return e;let s=await(await i()).ttl(`[${t}]:${r}`);return s<0?0:s}var o=g;var m={async getItem(t,r){let e=await(await i()).get(`[${t}]:${r}`);if(!e)return null;try{return JSON.parse(e)}catch{return null}},async getArray(t,r){return await(await i()).sMembers(`[${t}]:${r}`)},async setArray(t,r,e){await(await i()).del(`[${t}]:${r}`),await(await i()).sAdd(`[${t}]:${r}`,e);},async addToArray(t,r,e){await(await i()).sAdd(`[${t}]:${r}`,e);},async removeFromArray(t,r,e){await(await i()).sRem(`[${t}]:${r}`,e);},async setItem(t,r,e,s){let a=await o(t,r,s);await(await i()).set(`[${t}]:${r}`,JSON.stringify(e),a>0?{expiration:{type:"EX",value:a}}:void 0);},async setExpiry(t,r,e){await(await i()).expire(`[${t}]:${r}`,e);},async removeItem(t,r){await(await i()).del(`[${t}]:${r}`);}},p=m;export{p as default};//# sourceMappingURL=index.js.map
1
+ import {createClient}from'redis';var s=null;async function c(){if(!process.env.REDIS_URL)throw new Error("REDIS_URL is not defined. Access to the cache is not possible.");return s||(s=createClient({url:process.env.REDIS_URL}),await s.connect(),s)}var i=c;async function g(t,r,e){if(typeof e=="number")return e;let a=await(await i()).ttl(`[${t}]:${r}`);return a<0?0:a}var m=g;function l(t,r){return `${process.env.REDIS_PREFIX?`[${process.env.REDIS_PREFIX}]`:""}[${t}]:${r}`}var n=l;var w={async getItem(t,r){let e=await(await i()).get(n(t,r));if(!e)return null;try{return JSON.parse(e)}catch{return null}},async getArray(t,r){return await(await i()).sMembers(n(t,r))},async setArray(t,r,e){await(await i()).del(n(t,r)),await(await i()).sAdd(n(t,r),e);},async addToArray(t,r,e){await(await i()).sAdd(n(t,r),e);},async removeFromArray(t,r,e){await(await i()).sRem(n(t,r),e);},async setItem(t,r,e,a){let o=await m(t,r,a);await(await i()).set(n(t,r),JSON.stringify(e),o>0?{expiration:{type:"EX",value:o}}:void 0);},async setExpiry(t,r,e){await(await i()).expire(n(t,r),e);},async removeItem(t,r){await(await i()).del(n(t,r));}},I=w;export{I as default};//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/storage/utility/get-client.ts","../../src/storage/utility/get-ttl.ts","../../src/storage/index.ts"],"names":["client","getClient","createClient","get_client_default","getTTL","prefix","key","ttl","result","get_ttl_default","serverStorage","value","itemTTL","storage_default"],"mappings":"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","file":"index.js","sourcesContent":["import { createClient } from 'redis';\n\nimport isLocalhost from './is-localhost.js';\n\nlet client: ReturnType<typeof createClient> | null = null;\n\n/**\n * Get a Redis client instance. If the client does not exist, it creates a new one and connects to the Redis server.\n * If the client already exists, it returns the existing instance.\n *\n * @returns A promise that resolves to a Redis client instance.\n */\nasync function getClient(): Promise<ReturnType<typeof createClient>> {\n if (!process.env.REDIS_URL) {\n throw new Error('REDIS_URL is not defined. Access to the cache is not possible.');\n }\n\n if (client) {\n return client;\n }\n\n client = createClient({\n url: process.env.REDIS_URL,\n });\n\n await client.connect();\n return client;\n}\n\nexport default getClient;\n","import getClient from './get-client';\n\nasync function getTTL(prefix: string, key: string, ttl?: number): Promise<number> {\n // If a TTL is provided, return it directly\n\n if (typeof ttl === 'number') {\n return ttl;\n }\n\n // Otherwise, get the TTL from the storage\n\n const result = await (await getClient()).ttl(`[${prefix}]:${key}`);\n\n // If the result is -2, the key does not exist. If it's -1, the key exists but has no associated expire. In both cases, we return 0.\n\n if (result < 0) {\n return 0;\n }\n\n return result;\n}\n\nexport default getTTL;\n","import getClient from './utility/get-client';\nimport getTTL from './utility/get-ttl';\n\n/**\n * Server-side storage utility for caching data using Redis. It is designed to match the interface of localStorage, but operates on the server side.\n */\nconst serverStorage = {\n /**\n * Get an item from the cache.\n * @param prefix The prefix to use for the cache key.\n * @param key The key of the item to retrieve.\n * @returns The cached item, or null if not found.\n */\n async getItem(prefix: string, key: string): Promise<Record<string, unknown> | null> {\n const value = await (await getClient()).get(`[${prefix}]:${key}`);\n\n if (!value) {\n return null;\n }\n\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n },\n\n async getArray(prefix: string, key: string): Promise<string[]> {\n const values = await (await getClient()).sMembers(`[${prefix}]:${key}`);\n return values;\n },\n\n async setArray(prefix: string, key: string, value: string[]): Promise<void> {\n await (await getClient()).del(`[${prefix}]:${key}`);\n await (await getClient()).sAdd(`[${prefix}]:${key}`, value);\n },\n\n async addToArray(prefix: string, key: string, value: string): Promise<void> {\n await (await getClient()).sAdd(`[${prefix}]:${key}`, value);\n },\n\n async removeFromArray(prefix: string, key: string, value: string): Promise<void> {\n await (await getClient()).sRem(`[${prefix}]:${key}`, value);\n },\n\n /**\n * Set an item in the cache.\n * @param prefix The prefix to use for the cache key.\n * @param key The key of the item to set.\n * @param value The value of the item to set.\n */\n async setItem(\n prefix: string,\n key: string,\n value: Record<string, unknown>,\n ttl?: number\n ): Promise<void> {\n const itemTTL = await getTTL(prefix, key, ttl);\n\n await (\n await getClient()\n ).set(\n `[${prefix}]:${key}`,\n JSON.stringify(value),\n itemTTL > 0\n ? {\n expiration: { type: 'EX', value: itemTTL },\n }\n : undefined\n );\n },\n\n async setExpiry(prefix: string, key: string, ttl: number): Promise<void> {\n await (await getClient()).expire(`[${prefix}]:${key}`, ttl);\n },\n\n /**\n * Remove an item from the cache.\n * @param prefix The prefix to use for the cache key.\n * @param key The key of the item to remove.\n */\n async removeItem(prefix: string, key: string): Promise<void> {\n await (await getClient()).del(`[${prefix}]:${key}`);\n },\n};\n\nexport default serverStorage;\n"]}
1
+ {"version":3,"sources":["../../src/storage/utility/get-client.ts","../../src/storage/utility/get-ttl.ts","../../src/storage/utility/make-key.ts","../../src/storage/index.ts"],"names":["client","getClient","createClient","get_client_default","getTTL","prefix","key","ttl","result","get_ttl_default","makeKey","make_key_default","serverStorage","value","itemTTL","storage_default"],"mappings":"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","file":"index.js","sourcesContent":["import { createClient } from 'redis';\n\nimport isLocalhost from './is-localhost.js';\n\nlet client: ReturnType<typeof createClient> | null = null;\n\n/**\n * Get a Redis client instance. If the client does not exist, it creates a new one and connects to the Redis server.\n * If the client already exists, it returns the existing instance.\n *\n * @returns A promise that resolves to a Redis client instance.\n */\nasync function getClient(): Promise<ReturnType<typeof createClient>> {\n if (!process.env.REDIS_URL) {\n throw new Error('REDIS_URL is not defined. Access to the cache is not possible.');\n }\n\n if (client) {\n return client;\n }\n\n client = createClient({\n url: process.env.REDIS_URL,\n });\n\n await client.connect();\n return client;\n}\n\nexport default getClient;\n","import getClient from './get-client';\n\nasync function getTTL(prefix: string, key: string, ttl?: number): Promise<number> {\n // If a TTL is provided, return it directly\n\n if (typeof ttl === 'number') {\n return ttl;\n }\n\n // Otherwise, get the TTL from the storage\n\n const result = await (await getClient()).ttl(`[${prefix}]:${key}`);\n\n // If the result is -2, the key does not exist. If it's -1, the key exists but has no associated expire. In both cases, we return 0.\n\n if (result < 0) {\n return 0;\n }\n\n return result;\n}\n\nexport default getTTL;\n","function makeKey(prefix: string, key: string): string {\n return `${process.env.REDIS_PREFIX ? `[${process.env.REDIS_PREFIX}]` : ''}[${prefix}]:${key}`;\n}\n\nexport default makeKey;\n","import getClient from './utility/get-client';\nimport getTTL from './utility/get-ttl';\nimport makeKey from './utility/make-key';\n\n/**\n * Server-side storage utility for caching data using Redis. It is designed to match the interface of localStorage, but operates on the server side.\n */\nconst serverStorage = {\n /**\n * Get an item from the cache.\n * @param prefix The prefix to use for the cache key.\n * @param key The key of the item to retrieve.\n * @returns The cached item, or null if not found.\n */\n async getItem(prefix: string, key: string): Promise<Record<string, unknown> | null> {\n const value = await (await getClient()).get(makeKey(prefix, key));\n\n if (!value) {\n return null;\n }\n\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n },\n\n async getArray(prefix: string, key: string): Promise<string[]> {\n const values = await (await getClient()).sMembers(makeKey(prefix, key));\n return values;\n },\n\n async setArray(prefix: string, key: string, value: string[]): Promise<void> {\n await (await getClient()).del(makeKey(prefix, key));\n await (await getClient()).sAdd(makeKey(prefix, key), value);\n },\n\n async addToArray(prefix: string, key: string, value: string): Promise<void> {\n await (await getClient()).sAdd(makeKey(prefix, key), value);\n },\n\n async removeFromArray(prefix: string, key: string, value: string): Promise<void> {\n await (await getClient()).sRem(makeKey(prefix, key), value);\n },\n\n /**\n * Set an item in the cache.\n * @param prefix The prefix to use for the cache key.\n * @param key The key of the item to set.\n * @param value The value of the item to set.\n */\n async setItem(\n prefix: string,\n key: string,\n value: Record<string, unknown>,\n ttl?: number\n ): Promise<void> {\n const itemTTL = await getTTL(prefix, key, ttl);\n\n await (\n await getClient()\n ).set(\n makeKey(prefix, key),\n JSON.stringify(value),\n itemTTL > 0\n ? {\n expiration: { type: 'EX', value: itemTTL },\n }\n : undefined\n );\n },\n\n async setExpiry(prefix: string, key: string, ttl: number): Promise<void> {\n await (await getClient()).expire(makeKey(prefix, key), ttl);\n },\n\n /**\n * Remove an item from the cache.\n * @param prefix The prefix to use for the cache key.\n * @param key The key of the item to remove.\n */\n async removeItem(prefix: string, key: string): Promise<void> {\n await (await getClient()).del(makeKey(prefix, key));\n },\n};\n\nexport default serverStorage;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sqrzro/server",
3
- "version": "4.0.0-alpha.56",
3
+ "version": "4.0.0-alpha.58",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -53,7 +53,7 @@
53
53
  "react-dom": "^19.2.7",
54
54
  "redis": "^5.12.1",
55
55
  "zod": "^4.4.3",
56
- "@sqrzro/utility": "^4.0.0-alpha.20"
56
+ "@sqrzro/utility": "^4.0.0-alpha.21"
57
57
  },
58
58
  "devDependencies": {
59
59
  "@types/jest": "^29.5.14",