@sqrzro/server 4.0.0-alpha.5 → 4.0.0-alpha.50
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/chunk-2ZLU4AUD.js +2 -0
- package/dist/chunk-2ZLU4AUD.js.map +1 -0
- package/dist/chunk-6GDOIHTS.js +2 -0
- package/dist/chunk-6GDOIHTS.js.map +1 -0
- package/dist/chunk-BA3BC4CD.js +2 -0
- package/dist/chunk-BA3BC4CD.js.map +1 -0
- package/dist/chunk-UCMLSO7F.js +3 -0
- package/dist/chunk-UCMLSO7F.js.map +1 -0
- package/dist/csv/index.d.ts +7 -0
- package/dist/csv/index.js +2 -0
- package/dist/csv/index.js.map +1 -0
- package/dist/database/index.d.ts +86 -37
- package/dist/database/index.js +1 -1
- package/dist/database/index.js.map +1 -1
- package/dist/forms/index.d.ts +41 -10
- package/dist/forms/index.js +1 -1
- package/dist/forms/index.js.map +1 -1
- package/dist/{interfaces-BheedaEI.d.ts → interfaces-DTUqy5Oj.d.ts} +4 -3
- package/dist/interfaces-cnzok1wV.d.ts +13 -0
- package/dist/json/index.d.ts +3 -1
- package/dist/json/index.js +1 -1
- package/dist/json/index.js.map +1 -1
- package/dist/mail/index.d.ts +25 -0
- package/dist/mail/index.js +3 -0
- package/dist/mail/index.js.map +1 -0
- package/dist/proxy/index.d.ts +10 -0
- package/dist/proxy/index.js +2 -0
- package/dist/proxy/index.js.map +1 -0
- package/dist/storage/index.d.ts +32 -0
- package/dist/storage/index.js +2 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/utility/index.d.ts +8 -5
- package/dist/utility/index.js +1 -1
- package/package.json +27 -34
- package/dist/auth/index.d.ts +0 -49
- package/dist/auth/index.js +0 -2
- package/dist/auth/index.js.map +0 -1
- package/dist/auth/utility/schema.d.ts +0 -348
- package/dist/auth/utility/schema.js +0 -2
- package/dist/auth/utility/schema.js.map +0 -1
- package/dist/chunk-37TYQL5Y.js +0 -2
- package/dist/chunk-37TYQL5Y.js.map +0 -1
- package/dist/chunk-AGS5PPG2.js +0 -2
- package/dist/chunk-AGS5PPG2.js.map +0 -1
- package/dist/chunk-JI2U2EMD.js +0 -2
- package/dist/chunk-JI2U2EMD.js.map +0 -1
- package/dist/chunk-QE347FVL.js +0 -2
- package/dist/chunk-QE347FVL.js.map +0 -1
- package/dist/chunk-XSJ4OEIH.js +0 -2
- package/dist/chunk-XSJ4OEIH.js.map +0 -1
- package/dist/cli/index.d.ts +0 -1
- package/dist/cli/index.js +0 -4
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/static/drizzle.config.js +0 -19
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function s(r){return r}var l=s;var t=class extends Error{messages;constructor(e){super(JSON.stringify(e)),this.messages=e,this.name="ValidationError";}},n=t;async function a(r,e,o){let i=await o(e);if(!i)throw new n({[r]:"NOT_FOUND"});return i}var c=a;export{l as a,n as b,c};//# sourceMappingURL=chunk-2ZLU4AUD.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-2ZLU4AUD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/forms/create-rule.ts","../src/forms/ValidationError.ts","../src/forms/transformers/get-exists-transformer.ts"],"names":["createRule","config","create_rule_default","ValidationError","messages","ValidationError_default","getExistsTransformer","key","value","fn","result","get_exists_transformer_default"],"mappings":"AAEA,SAASA,CAAAA,CAA4CC,CAAAA,CAIzB,CACxB,OAAOA,CACX,CAEA,IAAOC,CAAAA,CAAQF,ECJf,IAAMG,CAAAA,CAAN,cAA8B,KAAM,CACzB,QAAA,CAEA,WAAA,CAAYC,CAAAA,CAAkC,CACjD,KAAA,CAAM,IAAA,CAAK,SAAA,CAAUA,CAAQ,CAAC,CAAA,CAE9B,IAAA,CAAK,QAAA,CAAWA,CAAAA,CAChB,IAAA,CAAK,KAAO,kBAChB,CACJ,CAAA,CAEOC,CAAAA,CAAQF,ECff,eAAeG,CAAAA,CACXC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACuB,CACvB,IAAMC,CAAAA,CAAS,MAAMD,CAAAA,CAAGD,CAAK,EAE7B,GAAI,CAACE,CAAAA,CACD,MAAM,IAAIL,CAAAA,CAAgB,CAAE,CAACE,CAAG,EAAG,WAAY,CAAC,CAAA,CAGpD,OAAOG,CACX,KAEOC,CAAAA,CAAQL","file":"chunk-2ZLU4AUD.js","sourcesContent":["import type { ValidationRule } from './utility/interfaces';\n\nfunction createRule<V, T = undefined, R = undefined>(config: {\n validator: V;\n transformer?: T;\n refiner?: R;\n}): ValidationRule<V, T, R> {\n return config as ValidationRule<V, T, R>;\n}\n\nexport default createRule;\n","/**\n * Custom error class to represent validation errors in form processing.\n *\n * It extends the built-in Error class and includes a messages property\n * that holds a record of validation error messages.\n */\nclass 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 ValidationError from '../ValidationError';\n\nasync function getExistsTransformer<T, ID>(\n key: string,\n value: ID,\n fn: (value: ID) => Promise<T>\n): Promise<NonNullable<T>> {\n const result = await fn(value);\n\n if (!result) {\n throw new ValidationError({ [key]: 'NOT_FOUND' });\n }\n\n return result;\n}\n\nexport default getExistsTransformer;\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {randomBytes}from'crypto';var a=16;function f(e,t=a){let r="abcdefghijklmnopqrstuvwxyz0123456789",n=randomBytes(t),o="";for(let s=0;s<t;s++)o+=r[n[s]%r.length];return `${e?e+"_":""}${o}`}var u=f;function i(e){return process.env.SZ_LOG==="true"?true:typeof process.env.SZ_LOG=="string"?process.env.SZ_LOG.split(",").includes(e):false}function g(e,t,r){i(e)&&console.log(`[${e}] ${t}: ${r}`);}var c=g;export{u as a,c as b};//# sourceMappingURL=chunk-6GDOIHTS.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-6GDOIHTS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utility/generate-id.ts","../src/utility/syslog.ts"],"names":["ID_LENGTH","generateID","prefix","length","chars","bytes","randomBytes","result","i","generate_id_default","shouldLog","alias","syslog","fnName","message","syslog_default"],"mappings":"iCAEA,IAAMA,EAAY,EAAA,CAElB,SAASC,EAAsCC,CAAAA,CAAwBC,CAAAA,CAASH,EAAc,CAC1F,IAAMI,EAAQ,sCAAA,CACRC,CAAAA,CAAQC,YAAYH,CAAM,CAAA,CAE5BI,EAAS,EAAA,CAEb,IAAA,IAASC,EAAI,CAAA,CAAGA,CAAAA,CAAIL,EAAQK,CAAAA,EAAAA,CACxBD,CAAAA,EAAUH,EAAMC,CAAAA,CAAMG,CAAC,EAAIJ,CAAAA,CAAM,MAAM,EAG3C,OAAO,CAAA,EAAGF,EAASA,CAAAA,CAAS,GAAA,CAAM,EAAE,CAAA,EAAGK,CAAM,CAAA,CACjD,CAEA,IAAOE,CAAAA,CAAQR,ECjBf,SAASS,CAAAA,CAAUC,EAAwB,CACvC,OAAI,QAAQ,GAAA,CAAI,MAAA,GAAW,OAChB,IAAA,CAGP,OAAO,QAAQ,GAAA,CAAI,MAAA,EAAW,SACX,OAAA,CAAQ,GAAA,CAAI,OAAO,KAAA,CAAM,GAAG,CAAA,CAC7B,QAAA,CAASA,CAAK,CAAA,CAG7B,KACX,CAEA,SAASC,EAAOD,CAAAA,CAAeE,CAAAA,CAAgBC,EAAuB,CAC9DJ,CAAAA,CAAUC,CAAK,CAAA,EACf,OAAA,CAAQ,IAAI,CAAA,CAAA,EAAIA,CAAK,KAAKE,CAAM,CAAA,EAAA,EAAKC,CAAO,CAAA,CAAE,EAEtD,CAEA,IAAOC,CAAAA,CAAQH","file":"chunk-6GDOIHTS.js","sourcesContent":["import { randomBytes } from 'crypto';\n\nconst ID_LENGTH = 16;\n\nfunction generateID<T extends string = string>(prefix?: string | null, length = ID_LENGTH): T {\n const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';\n const bytes = randomBytes(length);\n\n let result = '';\n\n for (let i = 0; i < length; i++) {\n result += chars[bytes[i] % chars.length];\n }\n\n return `${prefix ? prefix + '_' : ''}${result}` as T;\n}\n\nexport default generateID;\n","function shouldLog(alias: string): boolean {\n if (process.env.SZ_LOG === 'true') {\n return true;\n }\n\n if (typeof process.env.SZ_LOG === 'string') {\n const logAliases = process.env.SZ_LOG.split(',');\n return logAliases.includes(alias);\n }\n\n return false;\n}\n\nfunction syslog(alias: string, fnName: string, message: string): void {\n if (shouldLog(alias)) {\n console.log(`[${alias}] ${fnName}: ${message}`); // eslint-disable-line no-console\n }\n}\n\nexport default syslog;\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {filterNull}from'@sqrzro/utility';function s(n,r){return Array.isArray(n)?filterNull(n.map(t=>s(t,r))):n?.startsWith(r)?n:null}var e=s;function g(n,r){let t=e(n,r);if(!t)throw new Error(`Could not ensure ID. '${n}' is not a valid ID with prefix '${r}'.`);return t}var T=g;function o(n,r){let t=r.match(/^([^\[]+)\[(\d+)\]$/);if(t){let[,i,u]=t;return Array.isArray(n[i])?n[i][Number(u)]:null}return Array.isArray(n[r])?n[r][0]:n[r]}async function d(n,r,t){if(!t)return null;let i=t instanceof Promise?await t:t,u=o(i,n);return e(u,r)}var D=d;export{e as a,T as b,D as c};//# sourceMappingURL=chunk-BA3BC4CD.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-BA3BC4CD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utility/guard-id.ts","../src/utility/ensure-id.ts","../src/utility/get-id-from-params.ts"],"names":["guardID","id","prefix","filterNull","item","guard_id_default","ensureID","guardedID","ensure_id_default","getParamsValue","params","key","match","field","index","getIDFromParams","awaitedParams","value","get_id_from_params_default"],"mappings":"yCAKA,SAASA,EACLC,CAAAA,CACAC,CAAAA,CACc,CACd,OAAI,KAAA,CAAM,OAAA,CAAQD,CAAE,CAAA,CACTE,WAAWF,CAAAA,CAAG,GAAA,CAAKG,CAAAA,EAASJ,CAAAA,CAAWI,CAAAA,CAAMF,CAAM,CAAC,CAAC,EAG3DD,CAAAA,EAAI,UAAA,CAAWC,CAAM,CAAA,CAInBD,EAHI,IAIf,CAEA,IAAOI,CAAAA,CAAQL,EClBf,SAASM,CAAAA,CAA2BL,CAAAA,CAA+BC,CAAAA,CAAmB,CAClF,IAAMK,CAAAA,CAAYF,CAAAA,CAAWJ,EAAIC,CAAM,CAAA,CAEvC,GAAI,CAACK,CAAAA,CACD,MAAM,IAAI,KAAA,CAAM,yBAAyBN,CAAE,CAAA,iCAAA,EAAoCC,CAAM,CAAA,EAAA,CAAI,CAAA,CAG7F,OAAOK,CACX,KAEOC,CAAAA,CAAQF,ECVf,SAASG,CAAAA,CAAeC,EAA2CC,CAAAA,CAA4B,CAC3F,IAAMC,CAAAA,CAAQD,EAAI,KAAA,CAAM,qBAAqB,CAAA,CAE7C,GAAIC,CAAAA,CAAO,CACP,GAAM,EAAGC,CAAAA,CAAOC,CAAK,CAAA,CAAIF,CAAAA,CACzB,OAAO,KAAA,CAAM,OAAA,CAAQF,CAAAA,CAAOG,CAAK,CAAC,CAAA,CAAIH,CAAAA,CAAOG,CAAK,CAAA,CAAE,MAAA,CAAOC,CAAK,CAAC,EAAI,IACzE,CAEA,OAAO,KAAA,CAAM,QAAQJ,CAAAA,CAAOC,CAAG,CAAC,CAAA,CAAID,EAAOC,CAAG,CAAA,CAAE,CAAC,CAAA,CAAID,CAAAA,CAAOC,CAAG,CACnE,CAEA,eAAeI,CAAAA,CACXJ,CAAAA,CACAT,CAAAA,CACAQ,CAAAA,CACiB,CACjB,GAAI,CAACA,CAAAA,CACD,OAAO,KAGX,IAAMM,CAAAA,CAAgBN,CAAAA,YAAkB,OAAA,CAAU,MAAMA,CAAAA,CAASA,CAAAA,CAC3DO,CAAAA,CAAQR,EAAeO,CAAAA,CAAeL,CAAG,CAAA,CAE/C,OAAON,EAAWY,CAAAA,CAAOf,CAAM,CACnC,KAEOgB,CAAAA,CAAQH","file":"chunk-BA3BC4CD.js","sourcesContent":["import { filterNull } from '@sqrzro/utility';\n\nfunction guardID<T extends string>(id: (string | null | undefined)[], prefix: string): T[];\nfunction guardID<T extends string>(id: string | null | undefined, prefix: string): T | null;\n\nfunction guardID<T extends string>(\n id: (string | null | undefined)[] | string | null | undefined,\n prefix: string\n): T[] | T | null {\n if (Array.isArray(id)) {\n return filterNull(id.map((item) => guardID<T>(item, prefix)));\n }\n\n if (!id?.startsWith(prefix)) {\n return null;\n }\n\n return id as T;\n}\n\nexport default guardID;\n","import guardID from './guard-id';\n\nfunction ensureID<T extends string>(id: string | null | undefined, prefix: string): T {\n const guardedID = guardID<T>(id, prefix);\n\n if (!guardedID) {\n throw new Error(`Could not ensure ID. '${id}' is not a valid ID with prefix '${prefix}'.`);\n }\n\n return guardedID;\n}\n\nexport default ensureID;\n","import guardID from './guard-id';\n\nfunction getParamsValue(params: Record<string, string[] | string>, key: string): string | null {\n const match = key.match(/^([^\\[]+)\\[(\\d+)\\]$/);\n\n if (match) {\n const [, field, index] = match;\n return Array.isArray(params[field]) ? params[field][Number(index)] : null;\n }\n\n return Array.isArray(params[key]) ? params[key][0] : params[key];\n}\n\nasync function getIDFromParams<T extends string>(\n key: string,\n prefix: string,\n params?: Promise<Record<string, string[] | string>> | Record<string, string[] | string> | null\n): Promise<T | null> {\n if (!params) {\n return null;\n }\n\n const awaitedParams = params instanceof Promise ? await params : params;\n const value = getParamsValue(awaitedParams, key);\n\n return guardID<T>(value, prefix);\n}\n\nexport default getIDFromParams;\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import {parse}from'csv/sync';function p(s){let t=[],n=s.split(`
|
|
2
|
+
`).filter(r=>r.trim()!=="");for(let r of n){let i=parse(r,{skip_empty_lines:true});t.push(i[0].map(e=>e.trim()));}return t}var f=p;export{f as a};//# sourceMappingURL=chunk-UCMLSO7F.js.map
|
|
3
|
+
//# sourceMappingURL=chunk-UCMLSO7F.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/csv/parse-csv.ts"],"names":["parseCSV","csv","records","lines","item","line","record","parse","parse_csv_default"],"mappings":"6BAEA,SAASA,CAAAA,CAASC,CAAAA,CAAyB,CACvC,IAAMC,CAAAA,CAAsB,EAAC,CACvBC,CAAAA,CAAQF,EAAI,KAAA,CAAM;AAAA,CAAI,EAAE,MAAA,CAAQG,CAAAA,EAASA,CAAAA,CAAK,IAAA,KAAW,EAAE,CAAA,CAEjE,IAAA,IAAWC,CAAAA,IAAQF,EAAO,CACtB,IAAMG,EAASC,KAAAA,CAAMF,CAAAA,CAAM,CACvB,gBAAA,CAAkB,IACtB,CAAC,CAAA,CAEDH,EAAQ,IAAA,CAAKI,CAAAA,CAAO,CAAC,CAAA,CAAE,IAAKF,CAAAA,EAASA,CAAAA,CAAK,IAAA,EAAM,CAAC,EACrD,CAEA,OAAOF,CACX,KAEOM,CAAAA,CAAQR","file":"chunk-UCMLSO7F.js","sourcesContent":["import { parse } from 'csv/sync';\n\nfunction parseCSV(csv: string): string[][] {\n const records: string[][] = [];\n const lines = csv.split('\\n').filter((item) => item.trim() !== '');\n\n for (const line of lines) {\n const record = parse(line, {\n skip_empty_lines: true,\n }) as string[][];\n\n records.push(record[0].map((item) => item.trim()));\n }\n\n return records;\n}\n\nexport default parseCSV;\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export{a as parseCSV}from'../chunk-UCMLSO7F.js';import {stringify}from'csv/sync';function n(e){return stringify(e)}var t=n;function a(e){return new Blob([t(e)],{type:"text/csv"})}var f=a;export{t as generateCSV,f as generateCSVBlob};//# sourceMappingURL=index.js.map
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/csv/generate-csv.ts","../../src/csv/generate-csv-blob.ts"],"names":["generateCSV","data","stringify","generate_csv_default","generateCSVBlob","generate_csv_blob_default"],"mappings":"iFAEA,SAASA,EAAYC,CAAAA,CAA0B,CAC3C,OAAOC,SAAAA,CAAUD,CAAI,CACzB,CAEA,IAAOE,CAAAA,CAAQH,ECJf,SAASI,CAAAA,CAAgBH,CAAAA,CAAwB,CAC7C,OAAO,IAAI,IAAA,CAAK,CAACE,EAAYF,CAAI,CAAC,CAAA,CAAG,CAAE,KAAM,UAAW,CAAC,CAC7D,KAEOI,CAAAA,CAAQD","file":"index.js","sourcesContent":["import { stringify } from 'csv/sync';\n\nfunction generateCSV(data: string[][]): string {\n return stringify(data);\n}\n\nexport default generateCSV;\n","import generateCSV from './generate-csv';\n\nfunction generateCSVBlob(data: string[][]): Blob {\n return new Blob([generateCSV(data)], { type: 'text/csv' });\n}\n\nexport default generateCSVBlob;\n"]}
|
package/dist/database/index.d.ts
CHANGED
|
@@ -1,50 +1,99 @@
|
|
|
1
1
|
import { SQL } from 'drizzle-orm';
|
|
2
2
|
import { PgColumn } from 'drizzle-orm/pg-core';
|
|
3
|
-
import {
|
|
3
|
+
import { V as ValidationRule } from '../interfaces-cnzok1wV.js';
|
|
4
|
+
import z from 'zod';
|
|
5
|
+
import { P as Paginated } from '../interfaces-DTUqy5Oj.js';
|
|
6
|
+
import * as drizzle_orm_node_postgres from 'drizzle-orm/node-postgres';
|
|
7
|
+
import { Pool } from 'pg';
|
|
4
8
|
|
|
9
|
+
type QueryConditions = (SQL | undefined)[];
|
|
10
|
+
type UnwrapColumnType<T> = T extends PgColumn<infer C, any, any> ? C['data'] : never;
|
|
11
|
+
type UnwrapDropdown<TConfig extends RepositoryConfig> = TConfig['transformDropdown'] extends (...args: any) => infer U ? U : never;
|
|
12
|
+
type UnwrapInsert<TConfig> = TConfig extends {
|
|
13
|
+
makeInsertMutation: (values: infer Data) => Promise<infer Model>;
|
|
14
|
+
} ? {
|
|
15
|
+
data: Data;
|
|
16
|
+
model: Model;
|
|
17
|
+
} : never;
|
|
18
|
+
type UnwrapFilters<TConfig extends RepositoryConfig> = TConfig['applyFilters'] extends (filters: infer TFilters) => any ? TFilters : never;
|
|
19
|
+
type UnwrapGuards<TConfig extends RepositoryConfig> = TConfig['applyGuards'] extends (guards: infer TGuards) => any ? TGuards : never;
|
|
20
|
+
type UnwrapID<TConfig extends RepositoryConfig> = TConfig extends {
|
|
21
|
+
indexes: {
|
|
22
|
+
id: infer IDColumn;
|
|
23
|
+
};
|
|
24
|
+
} ? UnwrapColumnType<IDColumn> : never;
|
|
25
|
+
type UnwrapModel<TConfig extends RepositoryConfig> = TConfig['makeQuery'] extends (...args: any) => Promise<(infer U)[]> ? U : never;
|
|
26
|
+
type UnwrapParamKey<TConfig extends RepositoryConfig> = TConfig['paramKey'] extends infer U ? U extends string ? U : never : never;
|
|
27
|
+
type UnwrapUpdate<TConfig> = TConfig extends {
|
|
28
|
+
makeUpdateMutation: (values: infer Data) => Promise<infer Model>;
|
|
29
|
+
} ? {
|
|
30
|
+
data: Data;
|
|
31
|
+
model: Model;
|
|
32
|
+
} : never;
|
|
5
33
|
interface QueryConfig {
|
|
6
34
|
limit: number;
|
|
7
35
|
offset: number;
|
|
8
36
|
}
|
|
9
|
-
interface SelectFunctionConfig<
|
|
10
|
-
filters?:
|
|
11
|
-
guards?:
|
|
37
|
+
interface SelectFunctionConfig<TFilters, TGuards> extends Partial<QueryConfig> {
|
|
38
|
+
filters?: TFilters;
|
|
39
|
+
guards?: TGuards;
|
|
12
40
|
}
|
|
13
|
-
interface
|
|
41
|
+
interface PaginatedFunctionConfig<TFilters, TGuards> extends SelectFunctionConfig<TFilters, TGuards> {
|
|
14
42
|
page?: number | null;
|
|
15
43
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
count: number;
|
|
28
|
-
}>;
|
|
29
|
-
makeQuery?: (conditions: SQL[], config: QueryConfig) => Promise<Model[]>;
|
|
30
|
-
makeUpdateMutation?: (values: Partial<Data> & {
|
|
31
|
-
id: ID;
|
|
32
|
-
}) => Promise<Model>;
|
|
33
|
-
paramKey?: string;
|
|
44
|
+
type RepositoryConfig<TIndexes extends Record<string, PgColumn<any>> = Record<string, PgColumn<any>>, TFilters = never, TGuards = never, TParamKey extends string = string> = {
|
|
45
|
+
indexes?: TIndexes;
|
|
46
|
+
makeCountQuery?: (conditions: QueryConditions) => Promise<number>;
|
|
47
|
+
makeDeleteMutation?: (id: any) => Promise<void>;
|
|
48
|
+
makeInsertMutation?: (values: any) => Promise<any>;
|
|
49
|
+
makeQuery?: (conditions: QueryConditions, config: QueryConfig) => Promise<any[]>;
|
|
50
|
+
makeUndeleteMutation?: (id: any) => Promise<void>;
|
|
51
|
+
makeUpdateMutation?: (values: any) => Promise<any>;
|
|
52
|
+
applyFilters?: (filters: TFilters) => Promise<QueryConditions>;
|
|
53
|
+
applyGuards?: (guards: TGuards) => Promise<QueryConditions>;
|
|
54
|
+
paramKey?: TParamKey;
|
|
34
55
|
prefix?: string;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
56
|
+
transformDropdown?: (value: any) => any;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
declare function createRepository<TConfig extends RepositoryConfig<TIndexes, any, any>, TIndexes extends Record<string, PgColumn<any>> = Record<string, PgColumn<any>>>(config: TConfig): {
|
|
60
|
+
create: (data: UnwrapInsert<TConfig>["data"]) => Promise<UnwrapInsert<TConfig>["model"]>;
|
|
61
|
+
delete: (id: UnwrapID<TConfig>) => Promise<void>;
|
|
62
|
+
ensureByID: (id: UnwrapID<TConfig>, fnConfig?: SelectFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>) => Promise<UnwrapModel<TConfig>>;
|
|
63
|
+
ensureByIndex: <K extends keyof TIndexes>(key: K, value: UnwrapColumnType<TIndexes[K]>, fnConfig?: SelectFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>> | undefined) => Promise<UnwrapModel<TConfig>>;
|
|
64
|
+
ensureFromParams: (params?: Promise<Record<string, string>> | Record<string, string> | null, fnConfig?: SelectFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>) => Promise<UnwrapModel<TConfig>>;
|
|
65
|
+
ensureFromSearchParams: (searchParams?: Promise<Record<string, string>> | Record<string, string> | null, fnConfig?: SelectFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>, key?: string) => Promise<UnwrapModel<TConfig>>;
|
|
66
|
+
ensureID: (id: string | null | undefined) => UnwrapID<TConfig>;
|
|
67
|
+
ensureIDFromParams: (params?: Promise<Record<string, string>> | Record<string, string> | null) => Promise<UnwrapID<TConfig>>;
|
|
68
|
+
ensureIDFromSearchParams: (searchParams?: Promise<Record<string, string>> | Record<string, string> | null, key?: string) => Promise<UnwrapID<TConfig>>;
|
|
69
|
+
getAll: (fnConfig?: SelectFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>) => Promise<UnwrapModel<TConfig>[]>;
|
|
70
|
+
getAutocomplete: {
|
|
71
|
+
({ id, }: {
|
|
72
|
+
id?: UnwrapID<TConfig>;
|
|
73
|
+
}, fnConfig?: SelectFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>): Promise<UnwrapDropdown<TConfig> | null>;
|
|
74
|
+
({ search, }: {
|
|
75
|
+
search?: string;
|
|
76
|
+
}, fnConfig?: SelectFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>): Promise<UnwrapDropdown<TConfig>[]>;
|
|
77
|
+
};
|
|
78
|
+
getByID: (id: UnwrapID<TConfig>, fnConfig?: SelectFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>) => Promise<UnwrapModel<TConfig> | null>;
|
|
79
|
+
getByIndex: <K extends keyof TIndexes>(key: K, value: UnwrapColumnType<TIndexes[K]>, fnConfig?: SelectFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>) => Promise<UnwrapModel<TConfig> | null>;
|
|
80
|
+
getDropdown: (fnConfig?: SelectFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>) => Promise<UnwrapDropdown<TConfig>[]>;
|
|
81
|
+
getFromParams: (params?: Promise<Record<string, string>> | Record<string, string> | null, fnConfig?: SelectFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>) => Promise<UnwrapModel<TConfig> | null>;
|
|
82
|
+
getFromSearchParams: (searchParams?: Promise<Record<string, string>> | Record<string, string> | null, fnConfig?: SelectFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>, key?: string) => Promise<UnwrapModel<TConfig> | null>;
|
|
83
|
+
getIDFromParams: (params?: Promise<Record<string, string>> | Record<string, string> | null) => Promise<UnwrapID<TConfig> | null>;
|
|
84
|
+
getIDFromSearchParams: (searchParams?: Promise<Record<string, string>> | Record<string, string> | null, key?: string) => Promise<UnwrapID<TConfig> | null>;
|
|
85
|
+
getIDRule: (idKey: string) => ValidationRule<z.ZodTemplateLiteral<UnwrapID<TConfig>>, <T>(data: T) => Promise<T & Record<UnwrapParamKey<TConfig>, UnwrapModel<TConfig>>>, undefined>;
|
|
86
|
+
getPaginated: (fnConfig?: PaginatedFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>) => Promise<Paginated<UnwrapModel<TConfig>>>;
|
|
87
|
+
guardID: {
|
|
88
|
+
(id: (string | null | undefined)[]): UnwrapID<TConfig>[];
|
|
89
|
+
(id: string | null | undefined): UnwrapID<TConfig> | null;
|
|
90
|
+
};
|
|
91
|
+
undelete: (id: UnwrapID<TConfig>) => Promise<void>;
|
|
92
|
+
update: (data: UnwrapUpdate<TConfig>["data"]) => Promise<UnwrapUpdate<TConfig>["model"]>;
|
|
93
|
+
};
|
|
47
94
|
|
|
48
|
-
declare
|
|
95
|
+
declare const db: drizzle_orm_node_postgres.NodePgDatabase<Record<string, never>> & {
|
|
96
|
+
$client: Pool;
|
|
97
|
+
};
|
|
49
98
|
|
|
50
|
-
export { type QueryConfig, createRepository };
|
|
99
|
+
export { type PaginatedFunctionConfig, type QueryConditions, type QueryConfig, type RepositoryConfig, type SelectFunctionConfig, type UnwrapColumnType, type UnwrapDropdown, type UnwrapFilters, type UnwrapGuards, type UnwrapID, type UnwrapInsert, type UnwrapModel, type UnwrapParamKey, type UnwrapUpdate, ValidationRule, createRepository, db };
|
package/dist/database/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {a as a$1,c as c$1}from'../chunk-2ZLU4AUD.js';import {a,b,c}from'../chunk-BA3BC4CD.js';import {eq}from'drizzle-orm';import {notFound}from'next/navigation';import {cache}from'react';import k from'zod';import {drizzle}from'drizzle-orm/node-postgres';import {Pool}from'pg';async function $(e,l,u){let c$1=await c(e,l,u);return b(c$1,l)}var U=$;function i(e,l){for(let u of l)if(e[u]===void 0||e[u]===null)throw new Error(`Repository config is missing required field: "${String(u)}"`);return e}function V(e){function l(n){let{prefix:r}=i(e,["prefix"]);return Array.isArray(n)?a(n,r):a(n,r)}function u(n){let{prefix:r}=i(e,["prefix"]);return b(n,r)}async function c$2(n){let{paramKey:r,prefix:t}=i(e,["paramKey","prefix"]);return c(r,t,n)}async function I(n){let{paramKey:r,prefix:t}=i(e,["paramKey","prefix"]);try{return await U(r,t,n)}catch{notFound();}}async function D(n,r="id"){let{prefix:t}=i(e,["prefix"]);return c(r,t,n)}async function F(n,r="id"){let{prefix:t}=i(e,["prefix"]);try{return await U(r,t,n)}catch{notFound();}}async function f(n){let{makeQuery:r}=i(e,["makeQuery"]),t=[],o=await e.applyFilters?.(n?.filters??null);t.push(...o||[]);let s=await e.applyGuards?.(n?.guards??null);return t.push(...s||[]),r(t,{limit:n?.limit??-1,offset:n?.offset??0})}async function K(n){let{makeCountQuery:r,makeQuery:t}=i(e,["makeCountQuery","makeQuery"]),o=[],s=await e.applyFilters?.(n?.filters??null);o.push(...s||[]);let T=await e.applyGuards?.(n?.guards??null);o.push(...T||[]);let C=await r(o);return {data:await t(o,{limit:n?.limit??10,offset:((n?.page??1)-1)*(n?.limit??10)}),meta:{limit:n?.limit??10,page:n?.page??1,total:C}}}async function g(n,r,t){let{makeQuery:o}=i(e,["makeQuery"]);if(!e.indexes?.[n])throw new Error(`'Could not \`getByIndex\`. Index ${String(n)} is not defined in the repository configuration.`);let s=[],T=await e.applyFilters?.(t?.filters??null);s.push(...T||[]);let C=await e.applyGuards?.(t?.guards??null);s.push(...C||[]),s.push(eq(e.indexes[n],r));let[h]=await o(s,{limit:1,offset:0});return h??null}async function x(...n){let r=await g(...n);return r||notFound()}async function p(n,r){return g("id",n,r)}async function w(n,r){return x("id",n,r)}async function M(n,r){let t=await c$2(n);return t?p(t,r):null}async function G(n,r){let t=await I(n);return w(t,r)}async function _(n,r,t="id"){let o=await D(n,t);return o?p(o,r):null}async function Q(n,r,t="id"){let o=await F(n,t);return w(o,r)}async function A({id:n,search:r},t){if(i(e,["makeQuery","transformDropdown"]),n){let o=await p(n,t);return o?e.transformDropdown(o):null}if(r){let o=await f({...t,filters:{...t?.filters||{},search:r},limit:4});return Promise.all(o.map(e.transformDropdown))}return null}async function B(n){i(e,["makeQuery","transformDropdown"]);let r=await f(n);return Promise.all(r.map(e.transformDropdown))}async function b$1(n){let{makeInsertMutation:r}=i(e,["makeInsertMutation"]);return r(n)}async function v(n){let{makeUpdateMutation:r}=i(e,["makeUpdateMutation"]);return r(n)}async function z(n){let{makeDeleteMutation:r}=i(e,["makeDeleteMutation"]);return r(n)}async function E(n){let{makeUndeleteMutation:r}=i(e,["makeUndeleteMutation"]);return r(n)}function N(n){return async r=>{let{paramKey:t}=i(e,["paramKey"]),o=await c$1(n,r[n],cache(p));return {...r,[t]:o}}}function L(n){let{prefix:r}=i(e,["paramKey","prefix"]),t=k.templateLiteral([r,"_",k.string()]);return a$1({validator:t,transformer:N(n)})}return {create:b$1,delete:z,ensureByID:cache(w),ensureByIndex:cache(x),ensureFromParams:cache(G),ensureFromSearchParams:cache(Q),ensureID:u,ensureIDFromParams:I,ensureIDFromSearchParams:F,getAll:cache(f),getAutocomplete:cache(A),getByID:cache(p),getByIndex:cache(g),getDropdown:cache(B),getFromParams:cache(M),getFromSearchParams:cache(_),getIDFromParams:c$2,getIDFromSearchParams:D,getIDRule:L,getPaginated:cache(K),guardID:l,undelete:E,update:v}}var Z=V;var J=new Pool({connectionString:process.env.DATABASE_URL}),O=drizzle(J),W=O;export{Z as createRepository,W as db};//# sourceMappingURL=index.js.map
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/database/create-repository.ts"],"names":["createRepository","repoConfig","uncached_getAll","config","conditions","filters","guards","uncached_getPaginated","meta","uncached_getByID","id","eq","results","uncached_getFromParams","params","get_id_from_params_default","result","notFound","uncached_getFromSession","user","ensure_session_user_default","ensure_id_default","create","data","values","generate_id_default","pick","update","args","cache","create_repository_default"],"mappings":"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","file":"index.js","sourcesContent":["import { cache } from 'react';\n\nimport { pick } from '@sqrzro/utility';\nimport { eq } from 'drizzle-orm';\nimport type { SQL } from 'drizzle-orm';\nimport { notFound } from 'next/navigation';\n\nimport ensureSessionUser from '../auth/users/ensure-session-user';\n\nimport ensureID from '../utility/ensure-id';\nimport generateID from '../utility/generate-id';\nimport getIDFromParams from '../utility/get-id-from-params';\nimport type { Paginated } from '../utility/interfaces';\n\nimport type {\n PaginatedSelectFunctionConfig,\n RepositoryConfig,\n RepositoryObject,\n SelectFunctionConfig,\n} from './utility/interfaces';\n\nexport function createRepository<\n ID extends string,\n Model,\n Filters = null,\n Guards = null,\n Data extends object = {},\n>(\n repoConfig: RepositoryConfig<ID, Model, Filters, Guards, Data>\n): RepositoryObject<ID, Model, Filters, Guards, Data> {\n async function uncached_getAll(\n config?: SelectFunctionConfig<Filters, Guards>\n ): Promise<Model[]> {\n if (!repoConfig.makeQuery) {\n throw new Error('Could not `getAll`. `makeQuery` function is not defined.');\n }\n\n const conditions: SQL[] = [];\n\n const filters = await repoConfig.applyFilters?.(config?.filters ?? null);\n conditions.push(...(filters || []));\n\n const guards = await repoConfig.applyGuards?.(config?.guards ?? null);\n conditions.push(...(guards || []));\n\n return repoConfig.makeQuery(conditions, {\n limit: config?.limit ?? -1,\n offset: config?.offset ?? 0,\n });\n }\n\n async function uncached_getPaginated(\n config?: PaginatedSelectFunctionConfig<Filters, Guards>\n ): Promise<Paginated<Model>> {\n if (!repoConfig.makeMetaQuery) {\n throw new Error('Could not `getPaginated`. `makeMetaQuery` function is not defined.');\n }\n\n if (!repoConfig.makeQuery) {\n throw new Error('Could not `getPaginated`. `makeQuery` function is not defined.');\n }\n\n const conditions: SQL[] = [];\n\n const filters = await repoConfig.applyFilters?.(config?.filters ?? null);\n conditions.push(...(filters || []));\n\n const guards = await repoConfig.applyGuards?.(config?.guards ?? null);\n conditions.push(...(guards || []));\n\n const meta = await repoConfig.makeMetaQuery(conditions);\n const data = await repoConfig.makeQuery(conditions, {\n limit: config?.limit ?? 10,\n offset: ((config?.page ?? 1) - 1) * (config?.limit ?? 10),\n });\n\n return {\n data,\n meta: { limit: config?.limit ?? 10, page: config?.page ?? 1, total: meta.count },\n };\n }\n\n async function uncached_getByID(\n id: ID,\n config?: SelectFunctionConfig<Filters, Guards>\n ): Promise<Model | null> {\n if (!repoConfig.idColumn) {\n throw new Error('Could not `getByID`. `idColumn` is not defined.');\n }\n\n if (!repoConfig.makeQuery) {\n throw new Error('Could not `getByID`. `makeQuery` function is not defined.');\n }\n\n const conditions: SQL[] = [];\n\n const guards = await repoConfig.applyGuards?.(config?.guards ?? null);\n conditions.push(...(guards || []));\n\n const filters = await repoConfig.applyFilters?.(config?.filters ?? null);\n conditions.push(...(filters || []));\n\n conditions.push(eq(repoConfig.idColumn, id));\n\n const [results] = await repoConfig.makeQuery(conditions, { limit: 1, offset: 0 });\n return results || null;\n }\n\n async function uncached_getFromParams(\n params?: Promise<Record<string, string>> | null\n ): Promise<Model> {\n if (!repoConfig.paramKey) {\n throw new Error('Could not `getFromParams`. `paramKey` is not defined.');\n }\n\n if (!repoConfig.prefix) {\n throw new Error('Could not `getFromParams`. `prefix` is not defined.');\n }\n\n const id = await getIDFromParams<ID>(repoConfig.paramKey, repoConfig.prefix, params);\n const result = await uncached_getByID(id);\n\n if (!result) {\n return notFound();\n }\n\n return result;\n }\n\n async function uncached_getFromSession(): Promise<Model> {\n if (!repoConfig.prefix) {\n throw new Error('Could not `getFromSession`. `prefix` is not defined.');\n }\n\n const user = await ensureSessionUser();\n const id = ensureID<ID>(user.id, repoConfig.prefix);\n const result = await uncached_getByID(id);\n\n if (!result) {\n throw new Error(`Could not \\`getFromSession\\`. No record with ID '${id}' found.`);\n }\n\n return result;\n }\n\n async function create(data: Data): Promise<Model> {\n if (!repoConfig.makeCreateMutation) {\n throw new Error('Could not `create`. `makeCreateMutation` is not defined.');\n }\n\n const values: Data & { id: ID } = {\n id: generateID<ID>(repoConfig.prefix),\n ...pick(data, repoConfig.fillable || []),\n };\n\n return repoConfig.makeCreateMutation(values);\n }\n\n async function update(data: Partial<Data> & { id: ID }): Promise<Model> {\n if (!repoConfig.makeUpdateMutation) {\n throw new Error('Could not `update`. `makeUpdateMutation` is not defined.');\n }\n\n return repoConfig.makeUpdateMutation(data);\n }\n\n return {\n create,\n getAll: (\n ...args: Parameters<typeof uncached_getAll>\n ): ReturnType<typeof uncached_getAll> => {\n return cache(uncached_getAll)(...args);\n },\n getByID: (\n ...args: Parameters<typeof uncached_getByID>\n ): ReturnType<typeof uncached_getByID> => {\n return cache(uncached_getByID)(...args);\n },\n getFromParams: (\n ...args: Parameters<typeof uncached_getFromParams>\n ): ReturnType<typeof uncached_getFromParams> => {\n return cache(uncached_getFromParams)(...args);\n },\n getFromSession: (\n ...args: Parameters<typeof uncached_getFromSession>\n ): ReturnType<typeof uncached_getFromSession> => {\n return cache(uncached_getFromSession)(...args);\n },\n getPaginated: (\n ...args: Parameters<typeof uncached_getPaginated>\n ): ReturnType<typeof uncached_getPaginated> => {\n return cache(uncached_getPaginated)(...args);\n },\n update,\n };\n}\n\nexport default createRepository;\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/utility/ensure-id-from-params.ts","../../src/database/create-repository.ts","../../src/database/db.ts"],"names":["ensureIDFromParams","key","prefix","params","id","get_id_from_params_default","ensure_id_default","ensure_id_from_params_default","ensureConfig","config","keys","createRepository","guardID","guard_id_default","ensureID","getIDFromParams","paramKey","notFound","getIDFromSearchParams","searchParams","ensureIDFromSearchParams","uncached_getAll","fnConfig","makeQuery","conditions","filters","guards","uncached_getPaginated","makeCountQuery","total","uncached_getByIndex","value","eq","result","uncached_ensureByIndex","args","uncached_getByID","uncached_ensureByID","uncached_getFromParams","uncached_ensureFromParams","uncached_getFromSearchParams","uncached_ensureFromSearchParams","uncached_getAutocomplete","search","results","uncached_getDropdown","create","data","makeInsertMutation","update","makeUpdateMutation","$delete","makeDeleteMutation","undelete","makeUndeleteMutation","makeTransformer","idKey","model","get_exists_transformer_default","cache","getIDRule","validator","z","create_rule_default","create_repository_default","pool","Pool","db","drizzle","db_default"],"mappings":"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","file":"index.js","sourcesContent":["import ensureID from './ensure-id';\nimport getIDFromParams from './get-id-from-params';\n\nasync function ensureIDFromParams<T extends string>(\n key: string,\n prefix: string,\n params?: Promise<Record<string, string>> | Record<string, string> | null\n): Promise<T> {\n const id = await getIDFromParams<T>(key, prefix, params);\n return ensureID<T>(id, prefix);\n}\n\nexport default ensureIDFromParams;\n","import { eq } from 'drizzle-orm';\nimport { PgColumn } from 'drizzle-orm/pg-core';\nimport { notFound } from 'next/navigation';\nimport { cache } from 'react';\nimport z from 'zod';\n\nimport createRule from '../forms/create-rule';\nimport getExistsTransformer from '../forms/transformers/get-exists-transformer';\n\nimport ensureIDFn from '../utility/ensure-id';\nimport ensureIDFromParamsFn from '../utility/ensure-id-from-params';\nimport getIDFromParamsFn from '../utility/get-id-from-params';\nimport guardIDFn from '../utility/guard-id';\nimport { Paginated } from '../utility/interfaces';\n\nimport {\n QueryConditions,\n PaginatedFunctionConfig,\n RepositoryConfig,\n SelectFunctionConfig,\n UnwrapColumnType,\n UnwrapDropdown,\n UnwrapFilters,\n UnwrapGuards,\n UnwrapID,\n UnwrapInsert,\n UnwrapModel,\n UnwrapParamKey,\n UnwrapUpdate,\n} from './interfaces';\n\nfunction ensureConfig<TConfig extends RepositoryConfig, TKeys extends keyof TConfig>(\n config: TConfig,\n keys: TKeys[]\n): { [K in TKeys]-?: NonNullable<TConfig[K]> } {\n for (const key of keys) {\n if (config[key] === undefined || config[key] === null) {\n throw new Error(`Repository config is missing required field: \"${String(key)}\"`);\n }\n }\n return config as unknown as { [K in TKeys]-?: NonNullable<TConfig[K]> };\n}\n\nfunction createRepository<\n TConfig extends RepositoryConfig<TIndexes, any, any>,\n TIndexes extends Record<string, PgColumn<any>> = Record<string, PgColumn<any>>,\n>(config: TConfig) {\n function guardID(id: (string | null | undefined)[]): UnwrapID<TConfig>[];\n function guardID(id: string | null | undefined): UnwrapID<TConfig> | null;\n\n function guardID(\n id: (string | null | undefined)[] | string | null | undefined\n ): UnwrapID<TConfig> | UnwrapID<TConfig>[] | null {\n const { prefix } = ensureConfig(config, ['prefix']);\n\n if (Array.isArray(id)) {\n return guardIDFn<UnwrapID<TConfig>>(id, prefix);\n }\n\n return guardIDFn<UnwrapID<TConfig>>(id, prefix);\n }\n\n function ensureID(id: string | null | undefined): UnwrapID<TConfig> {\n const { prefix } = ensureConfig(config, ['prefix']);\n return ensureIDFn<UnwrapID<TConfig>>(id, prefix);\n }\n\n async function getIDFromParams(\n params?: Promise<Record<string, string>> | Record<string, string> | null\n ): Promise<UnwrapID<TConfig> | null> {\n const { paramKey, prefix } = ensureConfig(config, ['paramKey', 'prefix']);\n return getIDFromParamsFn<UnwrapID<TConfig>>(paramKey, prefix, params);\n }\n\n async function ensureIDFromParams(\n params?: Promise<Record<string, string>> | Record<string, string> | null\n ): Promise<UnwrapID<TConfig>> {\n const { paramKey, prefix } = ensureConfig(config, ['paramKey', 'prefix']);\n\n try {\n const id = await ensureIDFromParamsFn<UnwrapID<TConfig>>(paramKey, prefix, params);\n return id;\n } catch (err) {\n notFound();\n }\n }\n\n async function getIDFromSearchParams(\n searchParams?: Promise<Record<string, string>> | Record<string, string> | null,\n key = 'id'\n ): Promise<UnwrapID<TConfig> | null> {\n const { prefix } = ensureConfig(config, ['prefix']);\n return getIDFromParamsFn<UnwrapID<TConfig>>(key, prefix, searchParams);\n }\n\n async function ensureIDFromSearchParams(\n searchParams?: Promise<Record<string, string>> | Record<string, string> | null,\n key = 'id'\n ): Promise<UnwrapID<TConfig>> {\n const { prefix } = ensureConfig(config, ['prefix']);\n\n try {\n const id = await ensureIDFromParamsFn<UnwrapID<TConfig>>(key, prefix, searchParams);\n return id;\n } catch (err) {\n notFound();\n }\n }\n\n async function uncached_getAll(\n fnConfig?: SelectFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>\n ): Promise<UnwrapModel<TConfig>[]> {\n const { makeQuery } = ensureConfig(config, ['makeQuery']);\n\n const conditions: QueryConditions = [];\n\n const filters = await config.applyFilters?.(fnConfig?.filters ?? null);\n conditions.push(...(filters || []));\n\n const guards = await config.applyGuards?.(fnConfig?.guards ?? null);\n conditions.push(...(guards || []));\n\n return makeQuery(conditions, {\n limit: fnConfig?.limit ?? -1,\n offset: fnConfig?.offset ?? 0,\n });\n }\n\n async function uncached_getPaginated(\n fnConfig?: PaginatedFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>\n ): Promise<Paginated<UnwrapModel<TConfig>>> {\n const { makeCountQuery, makeQuery } = ensureConfig(config, ['makeCountQuery', 'makeQuery']);\n\n const conditions: QueryConditions = [];\n\n const filters = await config.applyFilters?.(fnConfig?.filters ?? null);\n conditions.push(...(filters || []));\n\n const guards = await config.applyGuards?.(fnConfig?.guards ?? null);\n conditions.push(...(guards || []));\n\n const total = await makeCountQuery(conditions);\n\n const data = await makeQuery(conditions, {\n limit: fnConfig?.limit ?? 10,\n offset: ((fnConfig?.page ?? 1) - 1) * (fnConfig?.limit ?? 10),\n });\n\n return {\n data,\n meta: { limit: fnConfig?.limit ?? 10, page: fnConfig?.page ?? 1, total },\n };\n }\n\n async function uncached_getByIndex<K extends keyof TIndexes>(\n key: K,\n value: UnwrapColumnType<TIndexes[K]>,\n fnConfig?: SelectFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>\n ): Promise<UnwrapModel<TConfig> | null> {\n const { makeQuery } = ensureConfig(config, ['makeQuery']);\n\n if (!config.indexes?.[key]) {\n throw new Error(\n `'Could not \\`getByIndex\\`. Index ${String(key)} is not defined in the repository configuration.`\n );\n }\n\n const conditions: QueryConditions = [];\n\n const filters = await config.applyFilters?.(fnConfig?.filters ?? null);\n conditions.push(...(filters || []));\n\n const guards = await config.applyGuards?.(fnConfig?.guards ?? null);\n conditions.push(...(guards || []));\n\n conditions.push(eq(config.indexes[key], value));\n\n const [result] = await makeQuery(conditions, { limit: 1, offset: 0 });\n\n return result ?? null;\n }\n\n async function uncached_ensureByIndex<K extends keyof TIndexes>(\n ...args: Parameters<typeof uncached_getByIndex<K>>\n ): Promise<UnwrapModel<TConfig>> {\n const result = await uncached_getByIndex(...args);\n\n if (!result) {\n return notFound();\n }\n\n return result;\n }\n\n async function uncached_getByID(\n id: UnwrapID<TConfig>,\n fnConfig?: SelectFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>\n ): Promise<UnwrapModel<TConfig> | null> {\n return uncached_getByIndex('id', id, fnConfig);\n }\n\n async function uncached_ensureByID(\n id: UnwrapID<TConfig>,\n fnConfig?: SelectFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>\n ): Promise<UnwrapModel<TConfig>> {\n return uncached_ensureByIndex('id', id, fnConfig);\n }\n\n async function uncached_getFromParams(\n params?: Promise<Record<string, string>> | Record<string, string> | null,\n fnConfig?: SelectFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>\n ): Promise<UnwrapModel<TConfig> | null> {\n const id = await getIDFromParams(params);\n return id ? uncached_getByID(id, fnConfig) : null;\n }\n\n async function uncached_ensureFromParams(\n params?: Promise<Record<string, string>> | Record<string, string> | null,\n fnConfig?: SelectFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>\n ): Promise<UnwrapModel<TConfig>> {\n const id = await ensureIDFromParams(params);\n return uncached_ensureByID(id, fnConfig);\n }\n\n async function uncached_getFromSearchParams(\n searchParams?: Promise<Record<string, string>> | Record<string, string> | null,\n fnConfig?: SelectFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>,\n key = 'id'\n ): Promise<UnwrapModel<TConfig> | null> {\n const id = await getIDFromSearchParams(searchParams, key);\n return id ? uncached_getByID(id, fnConfig) : null;\n }\n\n async function uncached_ensureFromSearchParams(\n searchParams?: Promise<Record<string, string>> | Record<string, string> | null,\n fnConfig?: SelectFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>,\n key = 'id'\n ): Promise<UnwrapModel<TConfig>> {\n const id = await ensureIDFromSearchParams(searchParams, key);\n return uncached_ensureByID(id, fnConfig);\n }\n\n async function uncached_getAutocomplete(\n {\n id,\n }: {\n id?: UnwrapID<TConfig>;\n },\n fnConfig?: SelectFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>\n ): Promise<UnwrapDropdown<TConfig> | null>;\n\n async function uncached_getAutocomplete(\n {\n search,\n }: {\n search?: string;\n },\n fnConfig?: SelectFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>\n ): Promise<UnwrapDropdown<TConfig>[]>;\n\n async function uncached_getAutocomplete(\n {\n id,\n search,\n }: {\n id?: UnwrapID<TConfig>;\n search?: string;\n },\n fnConfig?: SelectFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>\n ): Promise<UnwrapDropdown<TConfig> | UnwrapDropdown<TConfig>[] | null> {\n ensureConfig(config, ['makeQuery', 'transformDropdown']);\n\n if (id) {\n const result = await uncached_getByID(id, fnConfig);\n return result ? config.transformDropdown!(result) : null;\n }\n\n if (search) {\n const results = await uncached_getAll({\n ...fnConfig,\n filters: { ...(fnConfig?.filters || {}), search } as UnwrapFilters<TConfig>,\n limit: 4,\n });\n return Promise.all(results.map(config.transformDropdown!));\n }\n\n return null;\n }\n\n async function uncached_getDropdown(\n fnConfig?: SelectFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>\n ): Promise<UnwrapDropdown<TConfig>[]> {\n ensureConfig(config, ['makeQuery', 'transformDropdown']);\n\n const results = await uncached_getAll(fnConfig);\n return Promise.all(results.map(config.transformDropdown!));\n }\n\n async function create(\n data: UnwrapInsert<TConfig>['data']\n ): Promise<UnwrapInsert<TConfig>['model']> {\n const { makeInsertMutation } = ensureConfig(config, ['makeInsertMutation']);\n return makeInsertMutation(data);\n }\n\n async function update(\n data: UnwrapUpdate<TConfig>['data']\n ): Promise<UnwrapUpdate<TConfig>['model']> {\n const { makeUpdateMutation } = ensureConfig(config, ['makeUpdateMutation']);\n return makeUpdateMutation(data);\n }\n\n async function $delete(id: UnwrapID<TConfig>): Promise<void> {\n const { makeDeleteMutation } = ensureConfig(config, ['makeDeleteMutation']);\n return makeDeleteMutation(id);\n }\n\n async function undelete(id: UnwrapID<TConfig>): Promise<void> {\n const { makeUndeleteMutation } = ensureConfig(config, ['makeUndeleteMutation']);\n return makeUndeleteMutation(id);\n }\n\n function makeTransformer(idKey: string) {\n return async <T>(\n data: T\n ): Promise<T & Record<UnwrapParamKey<TConfig>, UnwrapModel<TConfig>>> => {\n const { paramKey } = ensureConfig(config, ['paramKey']);\n\n const model = await getExistsTransformer(idKey, data[idKey], cache(uncached_getByID));\n\n return { ...data, [paramKey]: model };\n };\n }\n\n function getIDRule(idKey: string) {\n const { prefix } = ensureConfig(config, ['paramKey', 'prefix']);\n\n const validator = z.templateLiteral([prefix, '_', z.string()]) as z.ZodTemplateLiteral<\n UnwrapID<TConfig>\n >;\n\n return createRule({ validator, transformer: makeTransformer(idKey) });\n }\n\n return {\n create,\n delete: $delete,\n ensureByID: cache(uncached_ensureByID),\n ensureByIndex: cache(uncached_ensureByIndex),\n ensureFromParams: cache(uncached_ensureFromParams),\n ensureFromSearchParams: cache(uncached_ensureFromSearchParams),\n ensureID,\n ensureIDFromParams,\n ensureIDFromSearchParams,\n getAll: cache(uncached_getAll),\n getAutocomplete: cache(uncached_getAutocomplete),\n getByID: cache(uncached_getByID),\n getByIndex: cache(uncached_getByIndex),\n getDropdown: cache(uncached_getDropdown),\n getFromParams: cache(uncached_getFromParams),\n getFromSearchParams: cache(uncached_getFromSearchParams),\n getIDFromParams,\n getIDFromSearchParams,\n getIDRule,\n getPaginated: cache(uncached_getPaginated),\n guardID,\n undelete,\n update,\n };\n}\n\nexport default createRepository;\n","import { drizzle } from 'drizzle-orm/node-postgres';\nimport { Pool } from 'pg';\n\nconst pool = new Pool({\n connectionString: process.env.DATABASE_URL,\n});\n\nconst db = drizzle(pool);\n\nexport default db;\n"]}
|
package/dist/forms/index.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { V as ValidationRule, F as FormResponse } from '../interfaces-cnzok1wV.js';
|
|
2
|
+
import z$1, { z } from 'zod';
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
type FormResponse<M> = Promise<AwaitedFormResponse<M>>;
|
|
4
|
+
declare function createRule<V, T = undefined, R = undefined>(config: {
|
|
5
|
+
validator: V;
|
|
6
|
+
transformer?: T;
|
|
7
|
+
refiner?: R;
|
|
8
|
+
}): ValidationRule<V, T, R>;
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* Custom error class to represent validation errors in form processing.
|
|
@@ -18,7 +18,7 @@ declare class ValidationError extends Error {
|
|
|
18
18
|
constructor(messages: Record<string, string>);
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
interface SubmitFormArgs<Schema extends z.
|
|
21
|
+
interface SubmitFormArgs<Schema extends z.ZodTypeAny, Response> {
|
|
22
22
|
fn: (data: z.infer<Schema>) => Promise<Response>;
|
|
23
23
|
formData: object;
|
|
24
24
|
onSuccess?: (model: Response) => Promise<void> | void;
|
|
@@ -31,6 +31,37 @@ interface SubmitFormArgs<Schema extends z.ZodType, Response> {
|
|
|
31
31
|
* @param args The arguments for submitting the form.
|
|
32
32
|
* @returns A promise that resolves to either the submitted model or an error.
|
|
33
33
|
*/
|
|
34
|
-
declare function submitForm<Schema extends z.
|
|
34
|
+
declare function submitForm<Schema extends z.ZodTypeAny, Response>(args: SubmitFormArgs<Schema, Response>): FormResponse<Response>;
|
|
35
|
+
|
|
36
|
+
declare function validateSchema<T extends z.ZodTypeAny>(data: object, schema: T): Promise<z.infer<T>>;
|
|
37
|
+
|
|
38
|
+
declare function uploadFile(file: File): FormResponse<string>;
|
|
39
|
+
|
|
40
|
+
declare function getNotExistsRefiner(field: string, fn: (value: any) => Promise<any>): [
|
|
41
|
+
(data: any) => Promise<boolean>,
|
|
42
|
+
{
|
|
43
|
+
message: string;
|
|
44
|
+
path: string[];
|
|
45
|
+
}
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
declare function getCSVRule(): ValidationRule<z$1.ZodPipe<z$1.ZodString, z$1.ZodTransform<string[][], string>>, undefined, undefined>;
|
|
49
|
+
|
|
50
|
+
interface PhoneRuleOptions {
|
|
51
|
+
max?: number;
|
|
52
|
+
min?: number;
|
|
53
|
+
optional?: boolean;
|
|
54
|
+
}
|
|
55
|
+
declare function getPhoneRule({ max, min, optional }?: PhoneRuleOptions): ValidationRule<z$1.ZodPipe<z$1.ZodTransform<unknown, unknown>, z$1.ZodOptional<z$1.ZodString> | z$1.ZodNonOptional<z$1.ZodString>>, undefined, undefined>;
|
|
56
|
+
|
|
57
|
+
declare function getExistsTransformer<T, ID>(key: string, value: ID, fn: (value: ID) => Promise<T>): Promise<NonNullable<T>>;
|
|
58
|
+
|
|
59
|
+
declare function getExistsValidator<T, ID>(fn: (value: ID) => Promise<T>): [(value: ID) => Promise<boolean>, {
|
|
60
|
+
message: string;
|
|
61
|
+
}];
|
|
62
|
+
|
|
63
|
+
declare function getNotExistsValidator<ID>(fn: (value: ID) => Promise<any>): [(value: ID) => Promise<boolean>, {
|
|
64
|
+
message: string;
|
|
65
|
+
}];
|
|
35
66
|
|
|
36
|
-
export {
|
|
67
|
+
export { FormResponse, ValidationError, ValidationRule, createRule, getCSVRule, getExistsTransformer, getExistsValidator, getNotExistsRefiner, getNotExistsValidator, getPhoneRule, submitForm, uploadFile, validateSchema };
|
package/dist/forms/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {a as a$1}from'../chunk-
|
|
1
|
+
import {a as a$1}from'../chunk-UCMLSO7F.js';import {b as b$1,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 I(e){let[,,t]=e.split(";");redirect(`${t.startsWith("/")?"":"/"}${t}`);}var l=I;function f(e){let t={};for(let r in e)typeof e[r]=="string"?t[r]=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 b(e){return e.issues.reduce((t,r)=>({...t,[r.path.join(".")]:r.message.replace(/"/gu,"")}),{})}var c=b;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$1(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$1?(e.onValidationError?.(r),{...t,validation:r.messages}):r instanceof Error?(r.message==="NEXT_REDIRECT"&&"digest"in r&&l(String(r.digest)),{...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.optional():o.nonoptional(),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
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/forms/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/forms/utility/handle-redirect.ts","../../src/forms/utility/transform-errors.ts","../../src/forms/utility/validate-schema.ts","../../src/forms/submit-form.ts"],"names":["handleRedirect","digest","path","redirect","handle_redirect_default","transformErrors","error","acc","cur","transform_errors_default","validateSchema","data","schema","z","ValidationError_default","validate_schema_default","submitForm","args","response","model","submit_form_default"],"mappings":"uGAEA,SAASA,EAAeC,CAAAA,CAAsB,CAC1C,GAAM,GAAKC,CAAI,CAAA,CAAID,EAAO,KAAA,CAAM,GAAG,EACnCE,QAAAA,CAAS,CAAA,EAAGD,EAAK,UAAA,CAAW,GAAG,EAAI,EAAA,CAAK,GAAG,GAAGA,CAAI,CAAA,CAAE,EACxD,CAEA,IAAOE,EAAQJ,CAAAA,CCLf,SAASK,CAAAA,CAAgBC,CAAAA,CAA2C,CAChE,OAAOA,CAAAA,CAAM,OAAO,MAAA,CAChB,CAACC,EAAKC,CAAAA,IAAS,CACX,GAAGD,CAAAA,CACH,CAACC,EAAI,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,EAAGA,EAAI,OAAA,CAAQ,OAAA,CAAQ,MAAO,EAAE,CACvD,GACA,EACJ,CACJ,CAEA,IAAOC,EAAQJ,CAAAA,CCPf,eAAeK,EAAoCC,CAAAA,CAAcC,CAAAA,CAAgC,CAC7F,GAAI,CAEA,OADe,MAAMA,CAAAA,CAAO,WAAWD,CAAI,CAE/C,OAASL,CAAAA,CAAO,CACZ,MAAIA,CAAAA,YAAiBO,CAAAA,CAAE,QAAA,CACb,IAAIC,GAAAA,CAAgBL,CAAAA,CAAgBH,CAAK,CAAC,CAAA,CAE9CA,CACV,CACJ,CAEA,IAAOS,CAAAA,CAAQL,CAAAA,CCIf,eAAeM,CAAAA,CACXC,CAAAA,CAC+B,CAC/B,IAAIC,CAAAA,CAA0C,CAAE,IAAA,CAAM,IAAA,CAAM,MAAO,IAAA,CAAM,UAAA,CAAY,IAAK,CAAA,CAE1F,GAAI,CACA,IAAMP,CAAAA,CAAO,MAAMI,CAAAA,CAAeE,CAAAA,CAAK,SAAUA,CAAAA,CAAK,MAAM,EACtDE,CAAAA,CAAQ,MAAMF,EAAK,EAAA,CAAGN,CAAI,EAEhC,OAAA,MAAMM,CAAAA,CAAK,YAAYE,CAAK,CAAA,CAErB,CAAE,GAAGD,CAAAA,CAAU,KAAMC,CAAM,CACtC,OAASb,CAAAA,CAAO,CACZ,GAAIA,CAAAA,YAAiBQ,GAAAA,CACjB,OAAAG,CAAAA,CAAK,iBAAA,GAAoBX,CAAK,CAAA,CACvB,CAAE,GAAGY,CAAAA,CAAU,UAAA,CAAYZ,EAAM,QAAS,CAAA,CAErD,GAAIA,CAAAA,YAAiB,KAAA,CACjB,MAAIA,CAAAA,CAAM,OAAA,GAAY,iBAAmB,QAAA,GAAYA,CAAAA,EACjDF,EAAe,MAAA,CAAOE,CAAAA,CAAM,MAAM,CAAC,CAAA,CAEjCA,EAGV,OAAO,CAAE,GAAGY,CAAAA,CAAU,KAAA,CAAO,yCAA0C,CAC3E,CACJ,CAEA,IAAOE,CAAAA,CAAQJ","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","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 { z } from 'zod';\n\nimport ValidationError from './ValidationError';\nimport transformErrors from './transform-errors';\n\nasync function validateSchema<T extends z.ZodType>(data: object, schema: T): Promise<z.infer<T>> {\n try {\n const result = await schema.parseAsync(data);\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';\nimport ValidationError from './utility/ValidationError';\nimport validateSchema from './utility/validate-schema';\n\ninterface SubmitFormArgs<Schema extends z.ZodType, 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.ZodType, Response>(\n args: SubmitFormArgs<Schema, Response>\n): Promise<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 throw error;\n // return { ...response, error: error.message };\n }\n return { ...response, error: 'submitForm encountered an unknown error' };\n }\n}\n\nexport default submitForm;\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","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();\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 // throw 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.optional() : baseRule.nonoptional();\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,8 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
filters?: Partial<Filters> | null;
|
|
1
|
+
type ListFunctionConfig<Filters = undefined> = {
|
|
3
2
|
params?: Record<string, string> | null;
|
|
4
3
|
page?: number | null;
|
|
5
|
-
}
|
|
4
|
+
} & (Filters extends undefined ? {} : {
|
|
5
|
+
filters?: Partial<Filters> | null;
|
|
6
|
+
});
|
|
6
7
|
type MakeNullOptional<T> = {
|
|
7
8
|
[K in keyof T as null extends T[K] ? K : never]?: T[K];
|
|
8
9
|
} & {
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface AwaitedFormResponse<M> {
|
|
2
|
+
data: M | null;
|
|
3
|
+
error: string | null;
|
|
4
|
+
validation: Record<string, string> | null;
|
|
5
|
+
}
|
|
6
|
+
type FormResponse<M> = Promise<AwaitedFormResponse<M>>;
|
|
7
|
+
type ValidationRule<V, T = undefined, R = undefined> = {
|
|
8
|
+
refiner: R;
|
|
9
|
+
transformer: T;
|
|
10
|
+
validator: V;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export type { FormResponse as F, ValidationRule as V };
|
package/dist/json/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
|
|
3
|
+
declare function validateJsonResponse<T extends z.ZodType>(query: Promise<Response>, schema: T): Promise<z.infer<T>>;
|
|
4
|
+
|
|
3
5
|
declare function validateJson<T extends z.ZodType>(data: unknown, schema: T): z.infer<T>;
|
|
4
6
|
|
|
5
|
-
export { validateJson };
|
|
7
|
+
export { validateJson, validateJsonResponse };
|
package/dist/json/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function
|
|
1
|
+
function s(e,o){return o.parse(e)}var t=s;async function a(e,o){let n=await(await e).json();return t(n,o)}var r=a;export{t as validateJson,r as validateJsonResponse};//# sourceMappingURL=index.js.map
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/json/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/json/validate-json.ts"],"names":["validateJson","data","schema","validate_json_default"],"mappings":"AAEA,SAASA,CAAAA,CAAkCC,CAAAA,CAAeC,CAAAA,CAAuB,CAC7E,OAAOA,CAAAA,CAAO,KAAA,CAAMD,CAAI,CAC5B,CAEA,IAAOE,CAAAA,CAAQH","file":"index.js","sourcesContent":["import type { z } from 'zod';\n\nfunction validateJson<T extends z.ZodType>(data: unknown, schema: T): z.infer<T> {\n return schema.parse(data);\n}\n\nexport default validateJson;\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/json/validate-json.ts","../../src/json/validate-json-response.ts"],"names":["validateJson","data","schema","validate_json_default","validateJsonResponse","query","validate_json_response_default"],"mappings":"AAEA,SAASA,CAAAA,CAAkCC,CAAAA,CAAeC,CAAAA,CAAuB,CAC7E,OAAOA,CAAAA,CAAO,KAAA,CAAMD,CAAI,CAC5B,CAEA,IAAOE,CAAAA,CAAQH,ECFf,eAAeI,CAAAA,CACXC,CAAAA,CACAH,CAAAA,CACmB,CAEnB,IAAMD,CAAAA,CAAO,KAAA,CADI,MAAMI,GACK,IAAA,EAAK,CAEjC,OAAOF,CAAAA,CAAaF,CAAAA,CAAMC,CAAM,CACpC,KAEOI,CAAAA,CAAQF","file":"index.js","sourcesContent":["import type { z } from 'zod';\n\nfunction validateJson<T extends z.ZodType>(data: unknown, schema: T): z.infer<T> {\n return schema.parse(data);\n}\n\nexport default validateJson;\n","import type { z } from 'zod';\n\nimport validateJson from './validate-json';\n\nasync function validateJsonResponse<T extends z.ZodType>(\n query: Promise<Response>,\n schema: T\n): Promise<z.infer<T>> {\n const response = await query;\n const data = await response.json();\n\n return validateJson(data, schema);\n}\n\nexport default validateJsonResponse;\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
interface MailObject<T extends object> {
|
|
2
|
+
subject: string | ((data: T) => Promise<string> | string);
|
|
3
|
+
template: (data: T) => Promise<React.ReactElement> | React.ReactElement;
|
|
4
|
+
}
|
|
5
|
+
interface MailOptions {
|
|
6
|
+
attachments?: {
|
|
7
|
+
content: string;
|
|
8
|
+
filename: string;
|
|
9
|
+
type: string;
|
|
10
|
+
}[];
|
|
11
|
+
bcc?: string[] | string;
|
|
12
|
+
cc?: string[] | string;
|
|
13
|
+
from?: string | null;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
declare function createMail<T extends object>(subject: string | ((data: T) => Promise<string> | string), template: (data: T) => Promise<React.ReactElement> | React.ReactElement): MailObject<T>;
|
|
17
|
+
|
|
18
|
+
declare function getMail<T extends object>(mail: MailObject<T>, data: T): Promise<{
|
|
19
|
+
subject: string;
|
|
20
|
+
html: string;
|
|
21
|
+
}>;
|
|
22
|
+
|
|
23
|
+
declare function sendMail<T extends object>(to: string[] | string, mail: MailObject<T>, data?: T, options?: MailOptions): Promise<boolean>;
|
|
24
|
+
|
|
25
|
+
export { type MailObject, createMail, getMail, sendMail };
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import P from'stream';import b from'@sendgrid/mail';function v(t,e){return {subject:t,template:e}}var w=v;async function S(t){let e=(await import('react-dom/server')).default;return new Promise(r=>{let n=new P.Writable,i="";function o(m,u,p){i+=m.toString(),p();}n._write=o;let{pipe:s}=e.renderToPipeableStream(t,{onShellReady:()=>{s(n),r(i);}});})}var g=S;async function _(t,e){let{subject:r,template:n}=t,i=typeof r=="function"?await r(e):r,o=await n(e);return {html:await g(o),subject:i}}var f=_;function T(t){return t?Array.isArray(t)?t.map(e=>({email:e})):[{email:t}]:[]}var c=T;async function D(t){if(!process.env.MAIL_API_KEY)throw new Error("Could not send mail via Mailtrap. Mail API key has not been set.");let[e,r]=process.env.MAIL_API_KEY.split("."),i=await(await fetch(`https://sandbox.api.mailtrap.io/api/send/${e}`,{method:"POST",headers:{"Api-Token":r,"Content-Type":"application/json"},body:JSON.stringify({attachments:t.attachments,bcc:c(t.bcc),cc:c(t.cc),from:t.from,html:t.html,subject:t.subject,to:c(t.to)})})).json();if(i.errors)throw new Error(`Could not send mail via Mailtrap. ${i.errors[0]}.`);return true}var A=D;function d(t,e){return Array.isArray(t)?t.map(r=>({email:r,type:e})):[{email:t,type:e}]}function L(t,e,r){return [...d(t,"to"),...d(e||[],"cc"),...d(r||[],"bcc")]}var y=L;async function x(t){if(!process.env.MAIL_API_KEY)throw new Error("Could not send mail via Mandrill. Mail API key has not been set.");let r={attachments:t.attachments?.map(o=>({content:o.content,name:o.filename,type:o.type})),from_email:t.from.email,from_name:t.from.name,html:t.html,subject:t.subject,preserve_recipients:true,to:y(t.to,t.cc,t.bcc)},i=await(await fetch("https://mandrillapp.com/api/1.0/messages/send",{method:"POST",body:JSON.stringify({key:process.env.MAIL_API_KEY,message:r})})).json();return Array.isArray(i)?i.every(o=>o.status==="sent"):i.status==="sent"}var R=x;function N(t){return t?Array.isArray(t)?t.map(e=>({email:e})):[{email:t}]:[]}var l=N;async function O(t){if(!process.env.MAIL_API_KEY)throw new Error("Could not send mail via Sendgrid. Mail API key has not been set.");b.setApiKey(process.env.MAIL_API_KEY);let e=await b.send({attachments:t.attachments,bcc:l(t.bcc),cc:l(t.cc),from:t.from,html:t.html,to:l(t.to),subject:t.subject});if(!e[0].statusCode.toString().startsWith("2"))throw new Error(`Could not send mail via Sendgrid. ${JSON.stringify(e)}`);return true}var h=O;function j(t){if(!t&&!process.env.MAIL_FROM)throw new Error("Mail from address has not been set as an environment variable, or provided in options.");let e=/^(?<name>[^<]+)<(?<email>[^>]+)>$/u.exec(t||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()}}var I=j;var C=["MAILTRAP"],U=["MAILTRAP","MANDRILL","SENDGRID"],V="MAILTRAP",K="SENDGRID",E={MAILTRAP:A,MANDRILL:R,SENDGRID:h};async function k(t,e,r,n){let i=I(n?.from),{subject:o,html:s}=await f(e,r||{}),m={attachments:n?.attachments,bcc:n?.bcc,cc:n?.cc,from:i,html:s,subject:o,to:t},u=process.env.MAIL_ENABLE_PRODUCTION==="true"?U:C,p=process.env.MAIL_ENABLE_PRODUCTION==="true"?K:V,a=process.env.MAIL_DRIVER?process.env.MAIL_DRIVER.toUpperCase():p;if(!u.includes(a)||!E[a])throw new Error(`Mail driver ${a} is not supported. If you're in a production environment, you might need to set the MAIL_ENABLE_PRODUCTION environment variable to access this driver.`);let M=E[a];if(!M)throw new Error(`Mail driver ${a} is not supported.`);return M(m)}var Y=k;
|
|
2
|
+
export{w as createMail,f as getMail,Y as sendMail};//# sourceMappingURL=index.js.map
|
|
3
|
+
//# sourceMappingURL=index.js.map
|