@sqrzro/server 4.0.0-alpha.30 → 4.0.0-alpha.32

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.
Files changed (50) hide show
  1. package/dist/chunk-BA3BC4CD.js +2 -0
  2. package/dist/chunk-BA3BC4CD.js.map +1 -0
  3. package/dist/database/index.d.ts +54 -92
  4. package/dist/database/index.js +1 -1
  5. package/dist/database/index.js.map +1 -1
  6. package/dist/forms/index.js +1 -1
  7. package/dist/forms/index.js.map +1 -1
  8. package/dist/mail/index.d.ts +6 -1
  9. package/dist/mail/index.js +2 -2
  10. package/dist/mail/index.js.map +1 -1
  11. package/dist/proxy/index.d.ts +1 -5
  12. package/dist/proxy/index.js +1 -1
  13. package/dist/proxy/index.js.map +1 -1
  14. package/dist/storage/index.d.ts +3 -1
  15. package/dist/storage/index.js +1 -1
  16. package/dist/storage/index.js.map +1 -1
  17. package/dist/utility/index.d.ts +1 -1
  18. package/dist/utility/index.js +1 -1
  19. package/dist/utility/index.js.map +1 -1
  20. package/package.json +3 -27
  21. package/dist/auth/index.d.ts +0 -51
  22. package/dist/auth/index.js +0 -2
  23. package/dist/auth/index.js.map +0 -1
  24. package/dist/auth/utility/schema.d.ts +0 -348
  25. package/dist/auth/utility/schema.js +0 -2
  26. package/dist/auth/utility/schema.js.map +0 -1
  27. package/dist/chunk-3A4JSFVE.js +0 -2
  28. package/dist/chunk-3A4JSFVE.js.map +0 -1
  29. package/dist/chunk-3JA7XHAG.js +0 -2
  30. package/dist/chunk-3JA7XHAG.js.map +0 -1
  31. package/dist/chunk-C2XLUXVN.js +0 -2
  32. package/dist/chunk-C2XLUXVN.js.map +0 -1
  33. package/dist/chunk-CESWDV42.js +0 -2
  34. package/dist/chunk-CESWDV42.js.map +0 -1
  35. package/dist/chunk-DOBAUBXG.js +0 -2
  36. package/dist/chunk-DOBAUBXG.js.map +0 -1
  37. package/dist/chunk-JI2U2EMD.js +0 -2
  38. package/dist/chunk-JI2U2EMD.js.map +0 -1
  39. package/dist/chunk-KC7SPWBL.js +0 -2
  40. package/dist/chunk-KC7SPWBL.js.map +0 -1
  41. package/dist/chunk-U27WABYY.js +0 -2
  42. package/dist/chunk-U27WABYY.js.map +0 -1
  43. package/dist/cli/index.d.ts +0 -1
  44. package/dist/cli/index.js +0 -3
  45. package/dist/cli/index.js.map +0 -1
  46. package/dist/cli/scripts/db-generate.ts +0 -31
  47. package/dist/cli/scripts/db-reset.ts +0 -56
  48. package/dist/cli/scripts/db-seed.ts +0 -32
  49. package/dist/cli/static/drizzle.config.cjs +0 -19
  50. package/dist/interfaces-Gqu85VTW.d.ts +0 -7
@@ -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"]}
@@ -1,109 +1,71 @@
1
- import { PgColumn } from 'drizzle-orm/pg-core';
2
1
  import { SQL } from 'drizzle-orm';
2
+ import { PgColumn } from 'drizzle-orm/pg-core';
3
3
  import { P as Paginated } from '../interfaces-DTUqy5Oj.js';
4
4
 
5
5
  type QueryConditions = (SQL | undefined)[];
6
+ type UnwrapColumnType<T> = T extends PgColumn<infer C, any, any> ? C['data'] : never;
7
+ type UnwrapInsert<TConfig> = TConfig extends {
8
+ makeInsertMutation: (values: infer Data) => Promise<infer Model>;
9
+ } ? {
10
+ data: Data;
11
+ model: Model;
12
+ } : never;
13
+ type UnwrapFilters<TConfig extends RepositoryConfig> = TConfig['applyFilters'] extends (filters: infer TFilters) => any ? TFilters : never;
14
+ type UnwrapGuards<TConfig extends RepositoryConfig> = TConfig['applyGuards'] extends (guards: infer TGuards) => any ? TGuards : never;
15
+ type UnwrapID<TConfig extends RepositoryConfig> = TConfig extends {
16
+ indexes: {
17
+ id: infer IDColumn;
18
+ };
19
+ } ? UnwrapColumnType<IDColumn> : never;
20
+ type UnwrapModel<TConfig extends RepositoryConfig> = TConfig['makeQuery'] extends (...args: any) => Promise<(infer U)[]> ? U : never;
21
+ type UnwrapUpdate<TConfig> = TConfig extends {
22
+ makeUpdateMutation: (values: infer Data) => Promise<infer Model>;
23
+ } ? {
24
+ data: Data;
25
+ model: Model;
26
+ } : never;
6
27
  interface QueryConfig {
7
28
  limit: number;
8
29
  offset: number;
9
30
  }
10
- interface SelectFunctionConfig<Filters, Guards> extends Partial<QueryConfig> {
11
- filters?: Filters;
12
- guards?: Guards;
31
+ interface SelectFunctionConfig<TFilters, TGuards> extends Partial<QueryConfig> {
32
+ filters?: TFilters;
33
+ guards?: TGuards;
13
34
  }
14
- interface PaginatedSelectFunctionConfig<Filters, Guards> extends SelectFunctionConfig<Filters, Guards> {
35
+ interface PaginatedFunctionConfig<TFilters, TGuards> extends SelectFunctionConfig<TFilters, TGuards> {
15
36
  page?: number | null;
16
37
  }
17
- interface RepositoryConfig<Indexes = Record<string, PgColumn<any, any, any>>> {
18
- applyFilters?: (filters: any) => Promise<QueryConditions>;
19
- applyGuards?: (guards: any) => Promise<QueryConditions>;
20
- indexes?: Indexes;
21
- makeCreateMutation?: (values: any) => Promise<any>;
22
- makeMetaQuery?: (conditions: QueryConditions) => Promise<{
23
- count: number;
24
- }>;
38
+ type RepositoryConfig<TIndexes extends Record<string, PgColumn<any>> = Record<string, PgColumn<any>>, TFilters = never, TGuards = never> = {
39
+ indexes?: TIndexes;
40
+ makeCountQuery?: (conditions: QueryConditions) => Promise<number>;
41
+ makeDeleteMutation?: (id: any) => Promise<void>;
42
+ makeInsertMutation?: (values: any) => Promise<any>;
25
43
  makeQuery?: (conditions: QueryConditions, config: QueryConfig) => Promise<any[]>;
44
+ makeUndeleteMutation?: (id: any) => Promise<void>;
26
45
  makeUpdateMutation?: (values: any) => Promise<any>;
46
+ applyFilters?: (filters: TFilters) => Promise<QueryConditions>;
47
+ applyGuards?: (guards: TGuards) => Promise<QueryConditions>;
27
48
  paramKey?: string;
28
49
  prefix?: string;
29
- }
30
- type InferColumnType<T> = T extends PgColumn<infer C, any, any> ? C['data'] : never;
31
- type InferFilters<C> = C extends {
32
- applyFilters: (filters: infer F) => Promise<QueryConditions>;
33
- } ? F : never;
34
- type InferGuards<C> = C extends {
35
- applyGuards: (guards: infer G) => Promise<QueryConditions>;
36
- } ? G : never;
37
- type InferID<C> = C extends {
38
- indexes: {
39
- id: infer IDColumn;
40
- };
41
- } ? InferColumnType<IDColumn> : never;
42
- type InferQueryModel<C> = C extends {
43
- makeQuery: (conditions: QueryConditions, config: QueryConfig) => Promise<(infer M)[]>;
44
- } ? M : never;
45
- type InferCreate<C> = C extends {
46
- makeCreateMutation: (values: infer D) => Promise<infer M>;
47
- } ? {
48
- data: D;
49
- model: M;
50
- } : never;
51
- type InferUpdate<C> = C extends {
52
- makeUpdateMutation: (values: infer D) => Promise<infer M>;
53
- } ? {
54
- data: D;
55
- model: M;
56
- } : never;
57
- interface GuardID<T extends string> {
58
- (id: (string | null | undefined)[]): T[];
59
- (id: string | null | undefined): T | null;
60
- }
61
- type InferRepository<I extends Record<string, PgColumn<any, any, any>>, C extends RepositoryConfig> = (C extends {
62
- makeCreateMutation: any;
63
- } ? {
64
- create: (data: InferCreate<C>['data']) => Promise<InferCreate<C>['model']>;
65
- } : {}) & (C extends {
66
- makeQuery: any;
67
- } ? {
68
- getAll: (config?: SelectFunctionConfig<InferFilters<C>, InferGuards<C>> | undefined) => Promise<InferQueryModel<C>[]>;
69
- } & (C extends {
70
- indexes: any;
71
- } ? {
72
- ensureByID: (id: InferID<C>) => Promise<InferQueryModel<C>>;
73
- ensureByIndex: <K extends keyof I>(key: K, value: InferColumnType<I[K]>, config?: SelectFunctionConfig<InferFilters<C>, InferGuards<C>>) => Promise<InferQueryModel<C>>;
74
- getByID: (id: InferID<C>) => Promise<InferQueryModel<C> | null>;
75
- getByIndex: <K extends keyof I>(key: K, value: InferColumnType<I[K]>, config?: SelectFunctionConfig<InferFilters<C>, InferGuards<C>>) => Promise<InferQueryModel<C> | null>;
76
- } & (C extends {
77
- prefix: any;
78
- } ? {
79
- ensureFromSession: () => Promise<InferQueryModel<C>>;
80
- } & (C extends {
81
- paramKey: any;
82
- } ? {
83
- ensureFromParams: (params?: Record<string, string> | Promise<Record<string, string>> | null | undefined) => Promise<InferQueryModel<C>>;
84
- getFromParams: (params?: Record<string, string> | Promise<Record<string, string>> | null | undefined) => Promise<InferQueryModel<C> | null>;
85
- } : {}) : {}) : {}) & (C extends {
86
- makeMetaQuery: any;
87
- } ? {
88
- getPaginated: (config?: PaginatedSelectFunctionConfig<InferFilters<C>, InferGuards<C>> | undefined) => Promise<Paginated<InferQueryModel<C>>>;
89
- } : {}) : {}) & (C extends {
90
- prefix: any;
91
- } ? {
92
- ensureID: (id: string | null | undefined) => InferID<C>;
93
- guardID: GuardID<InferID<C>>;
94
- } & (C extends {
95
- paramKey: any;
96
- } ? {
97
- ensureIDFromParams: (params?: Record<string, string> | Promise<Record<string, string>> | null | undefined) => Promise<InferID<C>>;
98
- getIDFromParams: (params?: Record<string, string> | Promise<Record<string, string>> | null | undefined) => Promise<InferID<C> | null>;
99
- } : {}) : {}) & (C extends {
100
- makeUpdateMutation: any;
101
- } ? {
102
- update: (data: InferUpdate<C>['data']) => Promise<InferUpdate<C>['model']>;
103
- } : {});
50
+ };
104
51
 
105
- declare function createRepository<I extends Record<string, PgColumn<any, any, any>>, C extends RepositoryConfig>(repoConfig: C & {
106
- indexes?: I;
107
- }): InferRepository<I, C>;
52
+ declare function createRepository<TConfig extends RepositoryConfig<TIndexes, any, any>, TIndexes extends Record<string, PgColumn<any>> = Record<string, PgColumn<any>>>(config: TConfig): {
53
+ create: (data: UnwrapInsert<TConfig>["data"]) => Promise<UnwrapInsert<TConfig>["model"]>;
54
+ delete: (id: UnwrapID<TConfig>) => Promise<void>;
55
+ ensureByID: (id: UnwrapID<TConfig>) => Promise<UnwrapModel<TConfig>>;
56
+ ensureByIndex: <K extends keyof TIndexes>(key: K, value: UnwrapColumnType<TIndexes[K]>, fnConfig?: SelectFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>> | undefined) => Promise<UnwrapModel<TConfig>>;
57
+ ensureFromParams: (params?: Promise<Record<string, string>> | Record<string, string> | null) => Promise<UnwrapModel<TConfig>>;
58
+ ensureID: (id: string | null | undefined) => UnwrapID<TConfig>;
59
+ ensureIDFromParams: (params?: Promise<Record<string, string>> | Record<string, string> | null) => Promise<UnwrapID<TConfig>>;
60
+ getAll: (fnConfig?: SelectFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>) => Promise<UnwrapModel<TConfig>[]>;
61
+ getByID: (id: UnwrapID<TConfig>) => Promise<UnwrapModel<TConfig> | null>;
62
+ getByIndex: <K extends keyof TIndexes>(key: K, value: UnwrapColumnType<TIndexes[K]>, fnConfig?: SelectFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>) => Promise<UnwrapModel<TConfig> | null>;
63
+ getFromParams: (params?: Promise<Record<string, string>> | Record<string, string> | null) => Promise<UnwrapModel<TConfig> | null>;
64
+ getIDFromParams: (params?: Promise<Record<string, string>> | Record<string, string> | null) => Promise<UnwrapID<TConfig> | null>;
65
+ getPaginated: (fnConfig?: PaginatedFunctionConfig<UnwrapFilters<TConfig>, UnwrapGuards<TConfig>>) => Promise<Paginated<UnwrapModel<TConfig>>>;
66
+ guardID: (id: (string | null | undefined)[] | string | null | undefined) => UnwrapID<TConfig> | UnwrapID<TConfig>[] | null;
67
+ undelete: (id: UnwrapID<TConfig>) => Promise<void>;
68
+ update: (data: UnwrapUpdate<TConfig>["data"]) => Promise<UnwrapUpdate<TConfig>["model"]>;
69
+ };
108
70
 
109
- export { type QueryConditions, type QueryConfig, createRepository };
71
+ export { type PaginatedFunctionConfig, type QueryConditions, type QueryConfig, type RepositoryConfig, type SelectFunctionConfig, type UnwrapColumnType, type UnwrapFilters, type UnwrapGuards, type UnwrapID, type UnwrapInsert, type UnwrapModel, type UnwrapUpdate, createRepository };
@@ -1,2 +1,2 @@
1
- import {j}from'../chunk-DOBAUBXG.js';import'../chunk-C2XLUXVN.js';import {a,b,c}from'../chunk-3A4JSFVE.js';import'../chunk-KC7SPWBL.js';import'../chunk-JI2U2EMD.js';import {cache}from'react';import {eq}from'drizzle-orm';import {notFound}from'next/navigation';async function E(e,u,o){let d=await c(e,u,o);return b(d,u)}var g=E;function S(e){function u(r){if(!e.prefix)throw new Error("Could not `guardID`. `prefix` is not defined.");return Array.isArray(r)?a(r,e.prefix):a(r,e.prefix)}function o(r){if(!e.prefix)throw new Error("Could not `ensureID`. `prefix` is not defined.");return b(r,e.prefix)}async function d(r){if(!e.paramKey)throw new Error("Could not `getIDFromParams`. `paramKey` is not defined.");if(!e.prefix)throw new Error("Could not `getIDFromParams`. `prefix` is not defined.");return c(e.paramKey,e.prefix,r)}async function p(r){if(!e.paramKey)throw new Error("Could not `getIDFromParams`. `paramKey` is not defined.");if(!e.prefix)throw new Error("Could not `getIDFromParams`. `prefix` is not defined.");return g(e.paramKey,e.prefix,r)}async function x(r){if(!e.makeQuery)throw new Error("Could not `getAll`. `makeQuery` function is not defined.");let n=[],s=await e.applyFilters?.(r?.filters??null);n.push(...s||[]);let a=await e.applyGuards?.(r?.guards??null);return n.push(...a||[]),e.makeQuery(n,{limit:r?.limit??-1,offset:r?.offset??0})}async function C(r){if(!e.makeMetaQuery)throw new Error("Could not `getPaginated`. `makeMetaQuery` function is not defined.");if(!e.makeQuery)throw new Error("Could not `getPaginated`. `makeQuery` function is not defined.");let n=[],s=await e.applyFilters?.(r?.filters??null);n.push(...s||[]);let a=await e.applyGuards?.(r?.guards??null);n.push(...a||[]);let y=await e.makeMetaQuery(n);return {data:await e.makeQuery(n,{limit:r?.limit??10,offset:((r?.page??1)-1)*(r?.limit??10)}),meta:{limit:r?.limit??10,page:r?.page??1,total:y.count}}}async function f(r,n,s){if(!e.makeQuery)throw new Error("Could not `getByIndex`. `makeQuery` function is not defined.");if(!e.indexes?.[r])throw new Error(`'Could not \`getByIndex\`. Index ${String(r)} is not defined in the repository configuration.`);let a=[],y=await e.applyFilters?.(s?.filters??null);a.push(...y||[]);let D=await e.applyGuards?.(s?.guards??null);a.push(...D||[]),a.push(eq(e.indexes[r],n));let[K]=await e.makeQuery(a,{limit:1,offset:0});return K??null}async function P(r,n,s){let a=await f(r,n,s);return a||notFound()}async function w(r){return f("id",r)}async function c$1(r){return P("id",r)}async function F(r){let n=await d(r);return n?w(n):null}async function Q(r){let n=await p(r);return c$1(n)}async function k(){let r=await j(),n=o(r.id);return c$1(n)}async function M(r){if(!e.makeCreateMutation)throw new Error("Could not `create`. `makeCreateMutation` is not defined.");return e.makeCreateMutation(r)}async function R(r){if(!e.makeUpdateMutation)throw new Error("Could not `update`. `makeUpdateMutation` is not defined.");return e.makeUpdateMutation(r)}let t={};return "makeCreateMutation"in e&&(t.create=M),"makeQuery"in e&&(t.getAll=cache(x),"indexes"in e&&(t.ensureByID=cache(c$1),t.ensureByIndex=cache(P),t.getByID=cache(w),t.getByIndex=cache(f),"prefix"in e&&(t.ensureFromSession=cache(k),"paramKey"in e&&(t.ensureFromParams=cache(Q),t.getFromParams=cache(F)))),"makeMetaQuery"in e&&(t.getPaginated=cache(C))),"prefix"in e&&(t.ensureID=o,t.guardID=u,"paramKey"in e&&(t.ensureIDFromParams=p,t.getIDFromParams=d)),"makeUpdateMutation"in e&&(t.update=R),t}var G=S;export{G as createRepository};//# sourceMappingURL=index.js.map
1
+ import {a,b,c}from'../chunk-BA3BC4CD.js';import {eq}from'drizzle-orm';import {notFound}from'next/navigation';import {cache}from'react';async function B(r,d,u){let l=await c(r,d,u);return b(l,d)}var P=B;function o(r,d){for(let u of d)if(r[u]===void 0||r[u]===null)throw new Error(`Repository config is missing required field: "${String(u)}"`);return r}function G(r){function d(n){let{prefix:e}=o(r,["prefix"]);return Array.isArray(n)?a(n,e):a(n,e)}function u(n){let{prefix:e}=o(r,["prefix"]);return b(n,e)}async function l(n){let{paramKey:e,prefix:t}=o(r,["paramKey","prefix"]);return c(e,t,n)}async function w(n){let{paramKey:e,prefix:t}=o(r,["paramKey","prefix"]);try{return await P(e,t,n)}catch{notFound();}}async function D(n){let{makeQuery:e}=o(r,["makeQuery"]),t=[],i=await r.applyFilters?.(n?.filters??null);t.push(...i||[]);let a=await r.applyGuards?.(n?.guards??null);return t.push(...a||[]),e(t,{limit:n?.limit??-1,offset:n?.offset??0})}async function F(n){let{makeCountQuery:e,makeQuery:t}=o(r,["makeCountQuery","makeQuery"]),i=[],a=await r.applyFilters?.(n?.filters??null);i.push(...a||[]);let g=await r.applyGuards?.(n?.guards??null);i.push(...g||[]);let f=await e(i);return {data:await t(i,{limit:n?.limit??10,offset:((n?.page??1)-1)*(n?.limit??10)}),meta:{limit:n?.limit??10,page:n?.page??1,total:f}}}async function c$1(n,e,t){let{makeQuery:i}=o(r,["makeQuery"]);if(!r.indexes?.[n])throw new Error(`'Could not \`getByIndex\`. Index ${String(n)} is not defined in the repository configuration.`);let a=[],g=await r.applyFilters?.(t?.filters??null);a.push(...g||[]);let f=await r.applyGuards?.(t?.guards??null);a.push(...f||[]),a.push(eq(r.indexes[n],e));let[U]=await i(a,{limit:1,offset:0});return U??null}async function T(...n){let e=await c$1(...n);return e||notFound()}async function C(n){return c$1("id",n)}async function I(n){return T("id",n)}async function h(n){let e=await l(n);return e?C(e):null}async function k(n){let e=await w(n);return I(e)}async function R(n){let{makeInsertMutation:e}=o(r,["makeInsertMutation"]);return e(n)}async function K(n){let{makeUpdateMutation:e}=o(r,["makeUpdateMutation"]);return e(n)}async function M(n){let{makeDeleteMutation:e}=o(r,["makeDeleteMutation"]);return e(n)}async function Q(n){let{makeUndeleteMutation:e}=o(r,["makeUndeleteMutation"]);return e(n)}return {create:R,delete:M,ensureByID:cache(I),ensureByIndex:cache(T),ensureFromParams:cache(k),ensureID:u,ensureIDFromParams:w,getAll:cache(D),getByID:cache(C),getByIndex:cache(c$1),getFromParams:cache(h),getIDFromParams:l,getPaginated:cache(F),guardID:d,undelete:Q,update:K}}var S=G;export{S as createRepository};//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utility/ensure-id-from-params.ts","../../src/database/create-repository.ts"],"names":["ensureIDFromParams","key","prefix","params","id","get_id_from_params_default","ensure_id_default","ensure_id_from_params_default","createRepository","repoConfig","uncached_guardID","guard_id_default","uncached_ensureID","uncached_getIDFromParams","uncached_ensureIDFromParams","uncached_getAll","config","conditions","filters","guards","uncached_getPaginated","meta","uncached_getByIndex","value","eq","result","uncached_ensureByIndex","notFound","uncached_getByID","uncached_ensureByID","uncached_getFromParams","uncached_ensureFromParams","uncached_ensureFromSession","user","ensure_session_user_default","create","data","update","repository","cache","create_repository_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 { cache } from 'react';\n\nimport { eq } from 'drizzle-orm';\nimport type { PgColumn } from 'drizzle-orm/pg-core';\nimport { notFound } from 'next/navigation';\n\nimport ensureSessionUser from '../auth/users/ensure-session-user';\n\nimport ensureID from '../utility/ensure-id';\nimport getIDFromParams from '../utility/get-id-from-params';\nimport guardID from '../utility/guard-id';\nimport type { Paginated } from '../utility/interfaces';\n\nimport type {\n InferColumnType,\n InferCreate,\n InferFilters,\n InferGuards,\n InferID,\n InferQueryModel,\n InferRepository,\n InferUpdate,\n QueryConditions,\n PaginatedSelectFunctionConfig,\n RepositoryConfig,\n SelectFunctionConfig,\n} from './utility/interfaces';\nimport ensureIDFromParams from '../utility/ensure-id-from-params';\n\nfunction createRepository<\n I extends Record<string, PgColumn<any, any, any>>,\n C extends RepositoryConfig,\n>(repoConfig: C & { indexes?: I }): InferRepository<I, C> {\n // ----------------------------------------------------------------------------------\n // Guard Functions\n // ----------------------------------------------------------------------------------\n\n function uncached_guardID(\n id: (string | null | undefined)[] | string | null | undefined\n ): InferID<C>[] | InferID<C> | null {\n if (!repoConfig.prefix) {\n throw new Error('Could not `guardID`. `prefix` is not defined.');\n }\n\n if (Array.isArray(id)) {\n return guardID<InferID<C>>(id, repoConfig.prefix);\n }\n\n return guardID<InferID<C>>(id, repoConfig.prefix);\n }\n\n function uncached_ensureID(id: string | null | undefined): InferID<C> {\n if (!repoConfig.prefix) {\n throw new Error('Could not `ensureID`. `prefix` is not defined.');\n }\n\n return ensureID<InferID<C>>(id, repoConfig.prefix);\n }\n\n async function uncached_getIDFromParams(\n params?: Promise<Record<string, string>> | Record<string, string> | null\n ) {\n if (!repoConfig.paramKey) {\n throw new Error('Could not `getIDFromParams`. `paramKey` is not defined.');\n }\n\n if (!repoConfig.prefix) {\n throw new Error('Could not `getIDFromParams`. `prefix` is not defined.');\n }\n\n return getIDFromParams<InferID<C>>(repoConfig.paramKey, repoConfig.prefix, params);\n }\n\n async function uncached_ensureIDFromParams(\n params?: Promise<Record<string, string>> | Record<string, string> | null\n ) {\n if (!repoConfig.paramKey) {\n throw new Error('Could not `getIDFromParams`. `paramKey` is not defined.');\n }\n\n if (!repoConfig.prefix) {\n throw new Error('Could not `getIDFromParams`. `prefix` is not defined.');\n }\n\n return ensureIDFromParams<InferID<C>>(repoConfig.paramKey, repoConfig.prefix, params);\n }\n\n // ----------------------------------------------------------------------------------\n // List Functions\n // ----------------------------------------------------------------------------------\n\n async function uncached_getAll(\n config?: SelectFunctionConfig<InferFilters<C>, InferGuards<C>>\n ): Promise<InferQueryModel<C>[]> {\n if (!repoConfig.makeQuery) {\n throw new Error('Could not `getAll`. `makeQuery` function is not defined.');\n }\n\n const conditions: QueryConditions = [];\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<InferFilters<C>, InferGuards<C>>\n ): Promise<Paginated<InferQueryModel<C>>> {\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: QueryConditions = [];\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 // ----------------------------------------------------------------------------------\n // Index Functions\n // ----------------------------------------------------------------------------------\n\n async function uncached_getByIndex<K extends keyof I>(\n key: K,\n value: InferColumnType<I[K]>,\n config?: SelectFunctionConfig<InferFilters<C>, InferGuards<C>>\n ): Promise<InferQueryModel<C> | null> {\n if (!repoConfig.makeQuery) {\n throw new Error('Could not `getByIndex`. `makeQuery` function is not defined.');\n }\n\n if (!repoConfig.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 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 conditions.push(eq(repoConfig.indexes[key], value));\n\n const [result] = await repoConfig.makeQuery(conditions, { limit: 1, offset: 0 });\n\n return result ?? null;\n }\n\n async function uncached_ensureByIndex<K extends keyof I>(\n key: K,\n value: InferColumnType<I[K]>,\n config?: SelectFunctionConfig<InferFilters<C>, InferGuards<C>>\n ): Promise<InferQueryModel<C>> {\n const result = await uncached_getByIndex(key, value, config);\n\n if (!result) {\n return notFound();\n }\n\n return result;\n }\n\n async function uncached_getByID(id: InferID<C>): Promise<InferQueryModel<C> | null> {\n return uncached_getByIndex('id', id);\n }\n\n async function uncached_ensureByID(id: InferID<C>): Promise<InferQueryModel<C>> {\n return uncached_ensureByIndex('id', id);\n }\n\n async function uncached_getFromParams(\n params?: Promise<Record<string, string>> | Record<string, string> | null\n ): Promise<InferQueryModel<C> | null> {\n const id = await uncached_getIDFromParams(params);\n return id ? uncached_getByID(id) : null;\n }\n\n async function uncached_ensureFromParams(\n params?: Promise<Record<string, string>> | Record<string, string> | null\n ): Promise<InferQueryModel<C>> {\n const id = await uncached_ensureIDFromParams(params);\n return uncached_ensureByID(id);\n }\n\n async function uncached_ensureFromSession(): Promise<InferQueryModel<C>> {\n const user = await ensureSessionUser();\n const id = uncached_ensureID(user.id);\n\n return uncached_ensureByID(id);\n }\n\n // ----------------------------------------------------------------------------------\n // Mutation Functions\n // ----------------------------------------------------------------------------------\n\n async function create(data: InferCreate<C>['data']): Promise<InferCreate<C>['model']> {\n if (!repoConfig.makeCreateMutation) {\n throw new Error('Could not `create`. `makeCreateMutation` is not defined.');\n }\n\n return repoConfig.makeCreateMutation(data);\n }\n\n async function update(data: InferUpdate<C>['data']): Promise<InferUpdate<C>['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 const repository = {} as InferRepository<I, C>;\n\n if ('makeCreateMutation' in repoConfig) {\n (repository as any).create = create;\n }\n\n if ('makeQuery' in repoConfig) {\n (repository as any).getAll = cache(uncached_getAll);\n\n if ('indexes' in repoConfig) {\n (repository as any).ensureByID = cache(uncached_ensureByID);\n (repository as any).ensureByIndex = cache(uncached_ensureByIndex);\n (repository as any).getByID = cache(uncached_getByID);\n (repository as any).getByIndex = cache(uncached_getByIndex);\n\n if ('prefix' in repoConfig) {\n (repository as any).ensureFromSession = cache(uncached_ensureFromSession);\n\n if ('paramKey' in repoConfig) {\n (repository as any).ensureFromParams = cache(uncached_ensureFromParams);\n (repository as any).getFromParams = cache(uncached_getFromParams);\n }\n }\n }\n\n if ('makeMetaQuery' in repoConfig) {\n (repository as any).getPaginated = cache(uncached_getPaginated);\n }\n }\n\n if ('prefix' in repoConfig) {\n (repository as any).ensureID = uncached_ensureID;\n (repository as any).guardID = uncached_guardID;\n\n if ('paramKey' in repoConfig) {\n (repository as any).ensureIDFromParams = uncached_ensureIDFromParams;\n (repository as any).getIDFromParams = uncached_getIDFromParams;\n }\n }\n\n if ('makeUpdateMutation' in repoConfig) {\n (repository as any).update = update;\n }\n\n return repository;\n}\n\nexport default createRepository;\n"]}
1
+ {"version":3,"sources":["../../src/utility/ensure-id-from-params.ts","../../src/database/create-repository.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","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","create","data","makeInsertMutation","update","makeUpdateMutation","$delete","makeDeleteMutation","undelete","makeUndeleteMutation","cache","create_repository_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';\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 UnwrapFilters,\n UnwrapGuards,\n UnwrapID,\n UnwrapInsert,\n UnwrapModel,\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(\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 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(id: UnwrapID<TConfig>): Promise<UnwrapModel<TConfig> | null> {\n return uncached_getByIndex('id', id);\n }\n\n async function uncached_ensureByID(id: UnwrapID<TConfig>): Promise<UnwrapModel<TConfig>> {\n return uncached_ensureByIndex('id', id);\n }\n\n async function uncached_getFromParams(\n params?: Promise<Record<string, string>> | Record<string, string> | null\n ): Promise<UnwrapModel<TConfig> | null> {\n const id = await getIDFromParams(params);\n return id ? uncached_getByID(id) : null;\n }\n\n async function uncached_ensureFromParams(\n params?: Promise<Record<string, string>> | Record<string, string> | null\n ): Promise<UnwrapModel<TConfig>> {\n const id = await ensureIDFromParams(params);\n return uncached_ensureByID(id);\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 return {\n create,\n delete: $delete,\n ensureByID: cache(uncached_ensureByID),\n ensureByIndex: cache(uncached_ensureByIndex),\n ensureFromParams: cache(uncached_ensureFromParams),\n ensureID,\n ensureIDFromParams,\n getAll: cache(uncached_getAll),\n getByID: cache(uncached_getByID),\n getByIndex: cache(uncached_getByIndex),\n getFromParams: cache(uncached_getFromParams),\n getIDFromParams,\n getPaginated: cache(uncached_getPaginated),\n guardID,\n undelete,\n update,\n };\n}\n\nexport default createRepository;\n"]}
@@ -1,2 +1,2 @@
1
- import {a}from'../chunk-UCMLSO7F.js';import {a as a$1}from'../chunk-3JA7XHAG.js';export{a as ValidationError}from'../chunk-3JA7XHAG.js';import {redirect}from'next/navigation';import v,{z as z$1}from'zod';function c(e){return e}var s=c;function R(e){let[,,t]=e.split(";");redirect(`${t.startsWith("/")?"":"/"}${t}`);}var m=R;function l(e){let t={};for(let r in e)typeof e[r]=="string"?t[r]=e[r].trim():typeof e[r]=="object"&&e[r]!==null?t[r]=l(e[r]):t[r]=e[r];return t}var u=l;function g(e){return e.issues.reduce((t,r)=>({...t,[r.path.join(".")]:r.message.replace(/"/gu,"")}),{})}var f=g;function x(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 T(e){return x(e)?{message:"REQUIRED"}:e.message?{message:e.message}:null}var d=T;async function E(e,t){try{return await t.parseAsync(u(e),{error:o=>d(o)})}catch(r){throw r instanceof z$1.ZodError?new a$1(f(r)):r}}var n=E;async function I(e){let t={data:null,error:null,validation:null};try{let r=await n(e.formData,e.schema),o=await e.fn(r);return await e.onSuccess?.(o),{...t,data:o}}catch(r){if(r instanceof a$1)return e.onValidationError?.(r),{...t,validation:r.messages};if(r instanceof Error)throw r.message==="NEXT_REDIRECT"&&"digest"in r&&m(String(r.digest)),r;return {...t,error:"submitForm encountered an unknown error"}}}var V=I;var h=v.string().transform(a);function D(){return s({validator:h})}var w=D;async function S(e,t,r){let o=await r(t);if(!o)throw new a$1({[e]:"NOT_FOUND"});return o}var b=S;function Z(e){return [async t=>!!await e(t),{message:"NOT_FOUND"}]}var F=Z;function z(e){return [async t=>!await e(t),{message:"ALREADY_EXISTS"}]}var $=z;export{s as createRule,w as getCSVRule,b as getExistsTransformer,F as getExistsValidator,$ as getNotExistsValidator,V as submitForm,n as validateSchema};//# sourceMappingURL=index.js.map
1
+ import {a as a$1}from'../chunk-UCMLSO7F.js';import {redirect}from'next/navigation';import v,{z as z$1}from'zod';function p(e){return e}var a=p;function R(e){let[,,t]=e.split(";");redirect(`${t.startsWith("/")?"":"/"}${t}`);}var u=R;var n=class extends Error{messages;constructor(t){super(JSON.stringify(t)),this.messages=t,this.name="ValidationError";}},s=n;function l(e){let t={};for(let r in e)typeof e[r]=="string"?t[r]=e[r].trim():typeof e[r]=="object"&&e[r]!==null?t[r]=l(e[r]):t[r]=e[r];return t}var f=l;function x(e){return e.issues.reduce((t,r)=>({...t,[r.path.join(".")]:r.message.replace(/"/gu,"")}),{})}var d=x;function T(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 y(e){return T(e)?{message:"REQUIRED"}:e.message?{message:e.message}:null}var c=y;async function I(e,t){try{return await t.parseAsync(f(e),{error:o=>c(o)})}catch(r){throw r instanceof z$1.ZodError?new s(d(r)):r}}var i=I;async function h(e){let t={data:null,error:null,validation:null};try{let r=await i(e.formData,e.schema),o=await e.fn(r);return await e.onSuccess?.(o),{...t,data:o}}catch(r){if(r instanceof s)return e.onValidationError?.(r),{...t,validation:r.messages};if(r instanceof Error)throw r.message==="NEXT_REDIRECT"&&"digest"in r&&u(String(r.digest)),r;return {...t,error:"submitForm encountered an unknown error"}}}var V=h;var D=v.string().transform(a$1);function w(){return a({validator:D})}var S=w;async function b(e,t,r){let o=await r(t);if(!o)throw new s({[e]:"NOT_FOUND"});return o}var Z=b;function F(e){return [async t=>!!await e(t),{message:"NOT_FOUND"}]}var z=F;function $(e){return [async t=>!await e(t),{message:"ALREADY_EXISTS"}]}var A=$;export{s as ValidationError,a as createRule,S as getCSVRule,Z as getExistsTransformer,z as getExistsValidator,A as getNotExistsValidator,V as submitForm,i as validateSchema};//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/forms/create-rule.ts","../../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/rules/get-csv-rule.ts","../../src/forms/transformers/get-exists-transformer.ts","../../src/forms/validators/get-exists-validator.ts","../../src/forms/validators/get-not-exists-validator.ts"],"names":["createRule","config","create_rule_default","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","validator","parse_csv_default","getCSVRule","get_csv_rule_default","getExistsTransformer","value","fn","result","get_exists_transformer_default","getExistsValidator","get_exists_validator_default","getNotExistsValidator","get_not_exists_validator_default"],"mappings":"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","file":"index.js","sourcesContent":["import type { ValidationRule } from './utility/interfaces';\n\nfunction createRule<V, T = undefined>(\n config: { validator: V } | { validator: V; transformer: T }\n): ValidationRule<V, T> {\n return config as ValidationRule<V, T>;\n}\n\nexport default createRule;\n","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 (typeof data[key] === 'object' && data[key] !== null) {\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): 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","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 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","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<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 !result;\n },\n { message: 'ALREADY_EXISTS' },\n ];\n}\n\nexport default getNotExistsValidator;\n"]}
1
+ {"version":3,"sources":["../../src/forms/create-rule.ts","../../src/forms/utility/handle-redirect.ts","../../src/forms/ValidationError.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/rules/get-csv-rule.ts","../../src/forms/transformers/get-exists-transformer.ts","../../src/forms/validators/get-exists-validator.ts","../../src/forms/validators/get-not-exists-validator.ts"],"names":["createRule","config","create_rule_default","handleRedirect","digest","path","redirect","handle_redirect_default","ValidationError","messages","ValidationError_default","cleanData","data","cleanedData","key","clean_data_default","transformErrors","error","acc","cur","transform_errors_default","isRequired","issue","transformIssue","transform_issue_default","validateSchema","schema","z","validate_schema_default","submitForm","args","response","model","submit_form_default","validator","parse_csv_default","getCSVRule","get_csv_rule_default","getExistsTransformer","value","fn","result","get_exists_transformer_default","getExistsValidator","get_exists_validator_default","getNotExistsValidator","get_not_exists_validator_default"],"mappings":"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","file":"index.js","sourcesContent":["import type { ValidationRule } from './utility/interfaces';\n\nfunction createRule<V, T = undefined>(\n config: { validator: V } | { validator: V; transformer: T }\n): ValidationRule<V, T> {\n return config as ValidationRule<V, T>;\n}\n\nexport default createRule;\n","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","/**\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","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 (typeof data[key] === 'object' && data[key] !== null) {\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): 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","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 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","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<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 !result;\n },\n { message: 'ALREADY_EXISTS' },\n ];\n}\n\nexport default getNotExistsValidator;\n"]}
@@ -15,6 +15,11 @@ interface MailOptions {
15
15
 
16
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
17
 
18
+ declare function getMail<T extends object>(mail: MailObject<T>, data: T): Promise<{
19
+ subject: string;
20
+ html: string;
21
+ }>;
22
+
18
23
  declare function sendMail<T extends object>(to: string[] | string, mail: MailObject<T>, data?: T, options?: MailOptions): Promise<boolean>;
19
24
 
20
- export { type MailObject, createMail, sendMail };
25
+ export { type MailObject, createMail, getMail, sendMail };
@@ -1,3 +1,3 @@
1
- import y from'@sendgrid/mail';import x from'stream';function v(t,e){return {subject:t,template:e}}var w=v;function P(t){return t?Array.isArray(t)?t.map(e=>({email:e})):[{email:t}]:[]}var c=P;async function S(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 M=S;function f(t,e){return Array.isArray(t)?t.map(r=>({email:r,type:e})):[{email:t,type:e}]}function _(t,e,r){return [...f(t,"to"),...f(e||[],"cc"),...f(r||[],"bcc")]}var g=_;async function T(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:g(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 A=T;function D(t){return t?Array.isArray(t)?t.map(e=>({email:e})):[{email:t}]:[]}var l=D;async function L(t){if(!process.env.MAIL_API_KEY)throw new Error("Could not send mail via Sendgrid. Mail API key has not been set.");y.setApiKey(process.env.MAIL_API_KEY);let e=await y.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 R=L;async function N(t){let e=(await import('react-dom/server')).default;return new Promise(r=>{let n=new x.Writable,i="";function o(m,d,p){i+=m.toString(),p();}n._write=o;let{pipe:s}=e.renderToPipeableStream(t,{onShellReady:()=>{s(n),r(i);}});})}var b=N;async function O(t,e){let{subject:r,template:n}=t,i=typeof r=="function"?await r(e):r,o=await n(e);return {html:await b(o),subject:i}}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:M,MANDRILL:A,SENDGRID:R};async function k(t,e,r,n){let i=I(n?.from),{subject:o,html:s}=await h(e,r||{}),m={attachments:n?.attachments,bcc:n?.bcc,cc:n?.cc,from:i,html:s,subject:o,to:t},d=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(!d.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 u=E[a];if(!u)throw new Error(`Mail driver ${a} is not supported.`);return u(m)}var Y=k;
2
- export{w as createMail,Y as sendMail};//# sourceMappingURL=index.js.map
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
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/mail/create-mail.ts","../../src/mail/drivers/mailtrap/transform-mailtrap-recipients.ts","../../src/mail/drivers/mailtrap/index.ts","../../src/mail/drivers/mandrill/transform-mandrill-recipients.ts","../../src/mail/drivers/mandrill/index.ts","../../src/mail/drivers/sendgrid/transform-sendgrid-recipients.ts","../../src/mail/drivers/sendgrid/index.ts","../../src/mail/utility/render-mail.ts","../../src/mail/utility/get-mail.ts","../../src/mail/utility/get-sender-details.ts","../../src/mail/send-mail.ts"],"names":["createMail","subject","template","create_mail_default","transformMailtrapRecipients","emails","email","transform_mailtrap_recipients_default","sendMailtrapMail","sendObject","id","key","json","mailtrap_default","transformMandrillRecipientGroup","group","type","transformMandrillRecipients","to","cc","bcc","transform_mandrill_recipients_default","sendMandrillMail","message","attachment","item","mandrill_default","transformSendgridRecipients","transform_sendgrid_recipients_default","sendSendgridMail","sgMail","response","sendgrid_default","renderMail","element","ReactDOMServer","resolve","ws","stream","content","write","chunk","enc","next","pipe","render_mail_default","getMail","mail","data","subjectText","get_mail_default","getSenderDetails","from","matches","get_sender_details_default","DEVELOPMENT_DRIVERS","PRODUCTION_DRIVERS","DEFAULT_DEVELOPMENT_DRIVER","DEFAULT_PRODUCTION_DRIVER","driverMap","sendMail","options","html","allowedDriverAliases","defaultDriverAlias","driverAlias","driver","send_mail_default"],"mappings":"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","file":"index.js","sourcesContent":["import type { MailObject } from './utility/interfaces';\n\nfunction createMail<T extends object>(\n subject: string | ((data: T) => Promise<string> | string),\n template: (data: T) => Promise<React.ReactElement> | React.ReactElement\n): MailObject<T> {\n return { subject, template };\n}\n\nexport default createMail;\n","function transformMailtrapRecipients(emails?: string[] | string): { email: string }[] {\n if (!emails) {\n return [];\n }\n return Array.isArray(emails) ? emails.map((email) => ({ email })) : [{ email: emails }];\n}\n\nexport default transformMailtrapRecipients;\n","import type { SendableMailObject } from '../../utility/interfaces';\n\nimport transformMailtrapRecipients from './transform-mailtrap-recipients';\n\nasync function sendMailtrapMail(sendObject: SendableMailObject): Promise<boolean> {\n if (!process.env.MAIL_API_KEY) {\n throw new Error('Could not send mail via Mailtrap. Mail API key has not been set.');\n }\n\n /*\n * The account id and api key are both in the MAIL_API_KEY variable, separated by a `.`. We need\n * to split them.\n */\n\n const [id, key] = process.env.MAIL_API_KEY.split('.');\n\n const response = await fetch(`https://sandbox.api.mailtrap.io/api/send/${id}`, {\n method: 'POST',\n headers: { 'Api-Token': key, 'Content-Type': 'application/json' },\n body: JSON.stringify({\n attachments: sendObject.attachments,\n bcc: transformMailtrapRecipients(sendObject.bcc),\n cc: transformMailtrapRecipients(sendObject.cc),\n from: sendObject.from,\n html: sendObject.html,\n subject: sendObject.subject,\n to: transformMailtrapRecipients(sendObject.to),\n }),\n });\n\n const json = (await response.json()) as { errors?: string[] };\n\n if (json.errors) {\n throw new Error(`Could not send mail via Mailtrap. ${json.errors[0]}.`);\n }\n\n return true;\n}\n\nexport default sendMailtrapMail;\n","function transformMandrillRecipientGroup(\n group: string[] | string,\n type: 'bcc' | 'cc' | 'to'\n): { email: string; type: 'bcc' | 'cc' | 'to' }[] {\n if (Array.isArray(group)) {\n return group.map((email) => ({ email, type }));\n }\n return [{ email: group, type }];\n}\n\nfunction transformMandrillRecipients(\n to: string[] | string,\n cc?: string[] | string,\n bcc?: string[] | string\n): { email: string; type: 'bcc' | 'cc' | 'to' }[] {\n return [\n ...transformMandrillRecipientGroup(to, 'to'),\n ...transformMandrillRecipientGroup(cc || [], 'cc'),\n ...transformMandrillRecipientGroup(bcc || [], 'bcc'),\n ];\n}\n\nexport default transformMandrillRecipients;\n","import type { SendableMailObject } from '../../utility/interfaces';\n\nimport transformMandrillRecipients from './transform-mandrill-recipients';\n\ninterface MandrillResponse {\n status: string;\n}\n\nasync function sendMandrillMail(sendObject: SendableMailObject): Promise<boolean> {\n if (!process.env.MAIL_API_KEY) {\n throw new Error('Could not send mail via Mandrill. Mail API key has not been set.');\n }\n\n const attachments = sendObject.attachments?.map((attachment) => ({\n content: attachment.content,\n name: attachment.filename,\n type: attachment.type,\n }));\n\n /* eslint-disable camelcase */\n const message = {\n attachments,\n from_email: sendObject.from.email,\n from_name: sendObject.from.name,\n html: sendObject.html,\n subject: sendObject.subject,\n preserve_recipients: true,\n to: transformMandrillRecipients(sendObject.to, sendObject.cc, sendObject.bcc),\n };\n /* eslint-enable camelcase */\n\n const response = await fetch('https://mandrillapp.com/api/1.0/messages/send', {\n method: 'POST',\n body: JSON.stringify({\n key: process.env.MAIL_API_KEY,\n message,\n }),\n });\n\n const json = (await response.json()) as MandrillResponse | [MandrillResponse];\n\n return Array.isArray(json)\n ? json.every((item) => item.status === 'sent')\n : json.status === 'sent';\n}\n\nexport default sendMandrillMail;\n","function transformSendgridRecipients(emails?: string[] | string): { email: string }[] {\n if (!emails) {\n return [];\n }\n return Array.isArray(emails) ? emails.map((email) => ({ email })) : [{ email: emails }];\n}\n\nexport default transformSendgridRecipients;\n","import sgMail from '@sendgrid/mail';\n\nimport type { SendableMailObject } from '../../utility/interfaces';\n\nimport transformSendgridRecipients from './transform-sendgrid-recipients';\n\nasync function sendSendgridMail(sendObject: SendableMailObject): Promise<boolean> {\n if (!process.env.MAIL_API_KEY) {\n throw new Error('Could not send mail via Sendgrid. Mail API key has not been set.');\n }\n\n sgMail.setApiKey(process.env.MAIL_API_KEY);\n\n const response = await sgMail.send({\n attachments: sendObject.attachments,\n bcc: transformSendgridRecipients(sendObject.bcc),\n cc: transformSendgridRecipients(sendObject.cc),\n from: sendObject.from,\n html: sendObject.html,\n to: transformSendgridRecipients(sendObject.to),\n subject: sendObject.subject,\n });\n\n if (!response[0].statusCode.toString().startsWith('2')) {\n throw new Error(`Could not send mail via Sendgrid. ${JSON.stringify(response)}`);\n }\n\n return true;\n}\n\nexport default sendSendgridMail;\n","import stream from 'node:stream';\n\nasync function renderMail(element: React.ReactElement): Promise<string> {\n const ReactDOMServer = (await import('react-dom/server')).default;\n\n return new Promise((resolve) => {\n const ws = new stream.Writable();\n let content = '';\n\n function write<T extends { toString: () => string }>(\n chunk: T,\n enc: BufferEncoding,\n next: (error?: Error | null) => void\n ): void {\n content += chunk.toString();\n next();\n }\n\n ws._write = write; // eslint-disable-line no-underscore-dangle\n\n const { pipe } = ReactDOMServer.renderToPipeableStream(element, {\n onShellReady: () => {\n pipe(ws);\n resolve(content);\n },\n });\n });\n}\n\nexport default renderMail;\n","import renderMail from './render-mail';\nimport type { MailObject } from './interfaces';\n\nasync function getMail<T extends object>(\n mail: MailObject<T>,\n data: T\n): Promise<{ subject: string; html: string }> {\n const { subject, template } = mail;\n\n const subjectText = typeof subject === 'function' ? await subject(data) : subject;\n\n const element = await template(data);\n const html = await renderMail(element);\n\n return {\n html,\n subject: subjectText,\n };\n}\n\nexport default getMail;\n","function getSenderDetails(from?: string | null): { email: string; name: string } {\n if (!from && !process.env.MAIL_FROM) {\n throw new Error(\n 'Mail from address has not been set as an environment variable, or provided in options.'\n );\n }\n\n const matches = /^(?<name>[^<]+)<(?<email>[^>]+)>$/u.exec(from || process.env.MAIL_FROM || '');\n\n if (!matches?.groups?.name || !matches?.groups?.email) {\n throw new Error(\n 'Mail from address is not the correct format. It should be \"Name <email>\".'\n );\n }\n\n return {\n email: matches.groups.email.trim(),\n name: matches.groups.name.trim(),\n };\n}\n\nexport default getSenderDetails;\n","import sendMailtrapMail from './drivers/mailtrap';\nimport sendMandrillMail from './drivers/mandrill';\nimport sendSendgridMail from './drivers/sendgrid';\n\nimport getMail from './utility/get-mail';\nimport getSenderDetails from './utility/get-sender-details';\nimport type { MailDriver, MailObject, MailOptions, SendableMailObject } from './utility/interfaces';\n\nconst DEVELOPMENT_DRIVERS = ['MAILTRAP'];\nconst PRODUCTION_DRIVERS = ['MAILTRAP', 'MANDRILL', 'SENDGRID'];\n\nconst DEFAULT_DEVELOPMENT_DRIVER = 'MAILTRAP';\nconst DEFAULT_PRODUCTION_DRIVER = 'SENDGRID';\n\nconst driverMap: Record<string, MailDriver> = {\n MAILTRAP: sendMailtrapMail,\n MANDRILL: sendMandrillMail,\n SENDGRID: sendSendgridMail,\n};\n\nasync function sendMail<T extends object>(\n to: string[] | string,\n mail: MailObject<T>,\n data?: T,\n options?: MailOptions\n): Promise<boolean> {\n const from = getSenderDetails(options?.from);\n const { subject, html } = await getMail(mail, data || {});\n\n const sendObject: SendableMailObject = {\n attachments: options?.attachments,\n bcc: options?.bcc,\n cc: options?.cc,\n from,\n html,\n subject,\n to,\n };\n\n const allowedDriverAliases =\n process.env.MAIL_ENABLE_PRODUCTION === 'true' ? PRODUCTION_DRIVERS : DEVELOPMENT_DRIVERS;\n\n const defaultDriverAlias =\n process.env.MAIL_ENABLE_PRODUCTION === 'true'\n ? DEFAULT_PRODUCTION_DRIVER\n : DEFAULT_DEVELOPMENT_DRIVER;\n\n const driverAlias = process.env.MAIL_DRIVER\n ? process.env.MAIL_DRIVER.toUpperCase()\n : defaultDriverAlias;\n\n if (!allowedDriverAliases.includes(driverAlias) || !driverMap[driverAlias]) {\n throw new Error(\n `Mail driver ${driverAlias} 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.`\n );\n }\n\n const driver = driverMap[driverAlias];\n\n if (!driver) {\n throw new Error(`Mail driver ${driverAlias} is not supported.`);\n }\n\n return driver(sendObject);\n}\n\nexport default sendMail;\n"]}
1
+ {"version":3,"sources":["../../src/mail/create-mail.ts","../../src/mail/utility/render-mail.ts","../../src/mail/get-mail.ts","../../src/mail/drivers/mailtrap/transform-mailtrap-recipients.ts","../../src/mail/drivers/mailtrap/index.ts","../../src/mail/drivers/mandrill/transform-mandrill-recipients.ts","../../src/mail/drivers/mandrill/index.ts","../../src/mail/drivers/sendgrid/transform-sendgrid-recipients.ts","../../src/mail/drivers/sendgrid/index.ts","../../src/mail/utility/get-sender-details.ts","../../src/mail/send-mail.ts"],"names":["createMail","subject","template","create_mail_default","renderMail","element","ReactDOMServer","resolve","ws","stream","content","write","chunk","enc","next","pipe","render_mail_default","getMail","mail","data","subjectText","get_mail_default","transformMailtrapRecipients","emails","email","transform_mailtrap_recipients_default","sendMailtrapMail","sendObject","id","key","json","mailtrap_default","transformMandrillRecipientGroup","group","type","transformMandrillRecipients","to","cc","bcc","transform_mandrill_recipients_default","sendMandrillMail","message","attachment","item","mandrill_default","transformSendgridRecipients","transform_sendgrid_recipients_default","sendSendgridMail","sgMail","response","sendgrid_default","getSenderDetails","from","matches","get_sender_details_default","DEVELOPMENT_DRIVERS","PRODUCTION_DRIVERS","DEFAULT_DEVELOPMENT_DRIVER","DEFAULT_PRODUCTION_DRIVER","driverMap","sendMail","options","html","allowedDriverAliases","defaultDriverAlias","driverAlias","driver","send_mail_default"],"mappings":"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","file":"index.js","sourcesContent":["import type { MailObject } from './utility/interfaces';\n\nfunction createMail<T extends object>(\n subject: string | ((data: T) => Promise<string> | string),\n template: (data: T) => Promise<React.ReactElement> | React.ReactElement\n): MailObject<T> {\n return { subject, template };\n}\n\nexport default createMail;\n","import stream from 'node:stream';\n\nasync function renderMail(element: React.ReactElement): Promise<string> {\n const ReactDOMServer = (await import('react-dom/server')).default;\n\n return new Promise((resolve) => {\n const ws = new stream.Writable();\n let content = '';\n\n function write<T extends { toString: () => string }>(\n chunk: T,\n enc: BufferEncoding,\n next: (error?: Error | null) => void\n ): void {\n content += chunk.toString();\n next();\n }\n\n ws._write = write; // eslint-disable-line no-underscore-dangle\n\n const { pipe } = ReactDOMServer.renderToPipeableStream(element, {\n onShellReady: () => {\n pipe(ws);\n resolve(content);\n },\n });\n });\n}\n\nexport default renderMail;\n","import renderMail from './utility/render-mail';\nimport type { MailObject } from './utility/interfaces';\n\nasync function getMail<T extends object>(\n mail: MailObject<T>,\n data: T\n): Promise<{ subject: string; html: string }> {\n const { subject, template } = mail;\n\n const subjectText = typeof subject === 'function' ? await subject(data) : subject;\n\n const element = await template(data);\n const html = await renderMail(element);\n\n return {\n html,\n subject: subjectText,\n };\n}\n\nexport default getMail;\n","function transformMailtrapRecipients(emails?: string[] | string): { email: string }[] {\n if (!emails) {\n return [];\n }\n return Array.isArray(emails) ? emails.map((email) => ({ email })) : [{ email: emails }];\n}\n\nexport default transformMailtrapRecipients;\n","import type { SendableMailObject } from '../../utility/interfaces';\n\nimport transformMailtrapRecipients from './transform-mailtrap-recipients';\n\nasync function sendMailtrapMail(sendObject: SendableMailObject): Promise<boolean> {\n if (!process.env.MAIL_API_KEY) {\n throw new Error('Could not send mail via Mailtrap. Mail API key has not been set.');\n }\n\n /*\n * The account id and api key are both in the MAIL_API_KEY variable, separated by a `.`. We need\n * to split them.\n */\n\n const [id, key] = process.env.MAIL_API_KEY.split('.');\n\n const response = await fetch(`https://sandbox.api.mailtrap.io/api/send/${id}`, {\n method: 'POST',\n headers: { 'Api-Token': key, 'Content-Type': 'application/json' },\n body: JSON.stringify({\n attachments: sendObject.attachments,\n bcc: transformMailtrapRecipients(sendObject.bcc),\n cc: transformMailtrapRecipients(sendObject.cc),\n from: sendObject.from,\n html: sendObject.html,\n subject: sendObject.subject,\n to: transformMailtrapRecipients(sendObject.to),\n }),\n });\n\n const json = (await response.json()) as { errors?: string[] };\n\n if (json.errors) {\n throw new Error(`Could not send mail via Mailtrap. ${json.errors[0]}.`);\n }\n\n return true;\n}\n\nexport default sendMailtrapMail;\n","function transformMandrillRecipientGroup(\n group: string[] | string,\n type: 'bcc' | 'cc' | 'to'\n): { email: string; type: 'bcc' | 'cc' | 'to' }[] {\n if (Array.isArray(group)) {\n return group.map((email) => ({ email, type }));\n }\n return [{ email: group, type }];\n}\n\nfunction transformMandrillRecipients(\n to: string[] | string,\n cc?: string[] | string,\n bcc?: string[] | string\n): { email: string; type: 'bcc' | 'cc' | 'to' }[] {\n return [\n ...transformMandrillRecipientGroup(to, 'to'),\n ...transformMandrillRecipientGroup(cc || [], 'cc'),\n ...transformMandrillRecipientGroup(bcc || [], 'bcc'),\n ];\n}\n\nexport default transformMandrillRecipients;\n","import type { SendableMailObject } from '../../utility/interfaces';\n\nimport transformMandrillRecipients from './transform-mandrill-recipients';\n\ninterface MandrillResponse {\n status: string;\n}\n\nasync function sendMandrillMail(sendObject: SendableMailObject): Promise<boolean> {\n if (!process.env.MAIL_API_KEY) {\n throw new Error('Could not send mail via Mandrill. Mail API key has not been set.');\n }\n\n const attachments = sendObject.attachments?.map((attachment) => ({\n content: attachment.content,\n name: attachment.filename,\n type: attachment.type,\n }));\n\n /* eslint-disable camelcase */\n const message = {\n attachments,\n from_email: sendObject.from.email,\n from_name: sendObject.from.name,\n html: sendObject.html,\n subject: sendObject.subject,\n preserve_recipients: true,\n to: transformMandrillRecipients(sendObject.to, sendObject.cc, sendObject.bcc),\n };\n /* eslint-enable camelcase */\n\n const response = await fetch('https://mandrillapp.com/api/1.0/messages/send', {\n method: 'POST',\n body: JSON.stringify({\n key: process.env.MAIL_API_KEY,\n message,\n }),\n });\n\n const json = (await response.json()) as MandrillResponse | [MandrillResponse];\n\n return Array.isArray(json)\n ? json.every((item) => item.status === 'sent')\n : json.status === 'sent';\n}\n\nexport default sendMandrillMail;\n","function transformSendgridRecipients(emails?: string[] | string): { email: string }[] {\n if (!emails) {\n return [];\n }\n return Array.isArray(emails) ? emails.map((email) => ({ email })) : [{ email: emails }];\n}\n\nexport default transformSendgridRecipients;\n","import sgMail from '@sendgrid/mail';\n\nimport type { SendableMailObject } from '../../utility/interfaces';\n\nimport transformSendgridRecipients from './transform-sendgrid-recipients';\n\nasync function sendSendgridMail(sendObject: SendableMailObject): Promise<boolean> {\n if (!process.env.MAIL_API_KEY) {\n throw new Error('Could not send mail via Sendgrid. Mail API key has not been set.');\n }\n\n sgMail.setApiKey(process.env.MAIL_API_KEY);\n\n const response = await sgMail.send({\n attachments: sendObject.attachments,\n bcc: transformSendgridRecipients(sendObject.bcc),\n cc: transformSendgridRecipients(sendObject.cc),\n from: sendObject.from,\n html: sendObject.html,\n to: transformSendgridRecipients(sendObject.to),\n subject: sendObject.subject,\n });\n\n if (!response[0].statusCode.toString().startsWith('2')) {\n throw new Error(`Could not send mail via Sendgrid. ${JSON.stringify(response)}`);\n }\n\n return true;\n}\n\nexport default sendSendgridMail;\n","function getSenderDetails(from?: string | null): { email: string; name: string } {\n if (!from && !process.env.MAIL_FROM) {\n throw new Error(\n 'Mail from address has not been set as an environment variable, or provided in options.'\n );\n }\n\n const matches = /^(?<name>[^<]+)<(?<email>[^>]+)>$/u.exec(from || process.env.MAIL_FROM || '');\n\n if (!matches?.groups?.name || !matches?.groups?.email) {\n throw new Error(\n 'Mail from address is not the correct format. It should be \"Name <email>\".'\n );\n }\n\n return {\n email: matches.groups.email.trim(),\n name: matches.groups.name.trim(),\n };\n}\n\nexport default getSenderDetails;\n","import sendMailtrapMail from './drivers/mailtrap';\nimport sendMandrillMail from './drivers/mandrill';\nimport sendSendgridMail from './drivers/sendgrid';\n\nimport getMail from './get-mail';\n\nimport getSenderDetails from './utility/get-sender-details';\nimport type { MailDriver, MailObject, MailOptions, SendableMailObject } from './utility/interfaces';\n\nconst DEVELOPMENT_DRIVERS = ['MAILTRAP'];\nconst PRODUCTION_DRIVERS = ['MAILTRAP', 'MANDRILL', 'SENDGRID'];\n\nconst DEFAULT_DEVELOPMENT_DRIVER = 'MAILTRAP';\nconst DEFAULT_PRODUCTION_DRIVER = 'SENDGRID';\n\nconst driverMap: Record<string, MailDriver> = {\n MAILTRAP: sendMailtrapMail,\n MANDRILL: sendMandrillMail,\n SENDGRID: sendSendgridMail,\n};\n\nasync function sendMail<T extends object>(\n to: string[] | string,\n mail: MailObject<T>,\n data?: T,\n options?: MailOptions\n): Promise<boolean> {\n const from = getSenderDetails(options?.from);\n const { subject, html } = await getMail(mail, data || {});\n\n const sendObject: SendableMailObject = {\n attachments: options?.attachments,\n bcc: options?.bcc,\n cc: options?.cc,\n from,\n html,\n subject,\n to,\n };\n\n const allowedDriverAliases =\n process.env.MAIL_ENABLE_PRODUCTION === 'true' ? PRODUCTION_DRIVERS : DEVELOPMENT_DRIVERS;\n\n const defaultDriverAlias =\n process.env.MAIL_ENABLE_PRODUCTION === 'true'\n ? DEFAULT_PRODUCTION_DRIVER\n : DEFAULT_DEVELOPMENT_DRIVER;\n\n const driverAlias = process.env.MAIL_DRIVER\n ? process.env.MAIL_DRIVER.toUpperCase()\n : defaultDriverAlias;\n\n if (!allowedDriverAliases.includes(driverAlias) || !driverMap[driverAlias]) {\n throw new Error(\n `Mail driver ${driverAlias} 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.`\n );\n }\n\n const driver = driverMap[driverAlias];\n\n if (!driver) {\n throw new Error(`Mail driver ${driverAlias} is not supported.`);\n }\n\n return driver(sendObject);\n}\n\nexport default sendMail;\n"]}
@@ -1,14 +1,10 @@
1
1
  import { NextRequest, NextResponse } from 'next/server';
2
- import { A as AuthSession } from '../interfaces-Gqu85VTW.js';
3
2
 
4
3
  interface ProxyRedirect {
5
4
  redirect: string;
6
5
  }
7
6
  type ProxyFunction = (request: NextRequest) => Promise<ProxyRedirect | null>;
8
- type SessionProxyFunction = (session: AuthSession | null, request: NextRequest) => Promise<ProxyRedirect | null>;
9
7
 
10
8
  declare function handleProxy(request: NextRequest, functions: ProxyFunction[]): Promise<NextResponse>;
11
9
 
12
- declare function handleSessionProxy(request: NextRequest, functions: SessionProxyFunction[]): Promise<NextResponse>;
13
-
14
- export { type ProxyFunction, type ProxyRedirect, type SessionProxyFunction, handleProxy, handleSessionProxy };
10
+ export { type ProxyFunction, type ProxyRedirect, handleProxy };
@@ -1,2 +1,2 @@
1
- import'../chunk-U27WABYY.js';import'../chunk-CESWDV42.js';import {h}from'../chunk-DOBAUBXG.js';import'../chunk-C2XLUXVN.js';import'../chunk-3A4JSFVE.js';import'../chunk-KC7SPWBL.js';import'../chunk-JI2U2EMD.js';import'../chunk-3JA7XHAG.js';import {NextResponse}from'next/server';async function x(e,o){for(let r of o){let t=await r(e);if(t)return NextResponse.redirect(new URL(t.redirect,e.url))}return NextResponse.next()}var u=x;async function a(e,o){let r=await h(e.cookies);for(let t of o){let n=await t(r,e);if(n)return NextResponse.redirect(new URL(n.redirect,e.url))}return NextResponse.next()}var c=a;export{u as handleProxy,c as handleSessionProxy};//# sourceMappingURL=index.js.map
1
+ import {NextResponse}from'next/server';async function i(e,o){for(let n of o){let t=await n(e);if(t)return NextResponse.redirect(new URL(t.redirect,e.url))}return NextResponse.next()}var f=i;export{f as handleProxy};//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/proxy/handle-proxy.ts","../../src/proxy/handle-session-proxy.ts"],"names":["handleProxy","request","functions","func","result","NextResponse","handle_proxy_default","handleSessionProxy","session","validate_session_default","handle_session_proxy_default"],"mappings":"uRAKA,eAAeA,CAAAA,CACXC,CAAAA,CACAC,EACqB,CACrB,IAAA,IAAWC,CAAAA,IAAQD,CAAAA,CAAW,CAC1B,IAAME,CAAAA,CAAS,MAAMD,CAAAA,CAAKF,CAAO,EAEjC,GAAIG,CAAAA,CACA,OAAOC,YAAAA,CAAa,SAAS,IAAI,GAAA,CAAID,EAAO,QAAA,CAAUH,CAAAA,CAAQ,GAAG,CAAC,CAE1E,CAEA,OAAOI,YAAAA,CAAa,MACxB,KAEOC,CAAAA,CAAQN,ECbf,eAAeO,EACXN,CAAAA,CACAC,CAAAA,CACqB,CACrB,IAAMM,CAAAA,CAAU,MAAMC,CAAAA,CAAgBR,CAAAA,CAAQ,OAAO,CAAA,CAErD,IAAA,IAAWE,KAAQD,CAAAA,CAAW,CAC1B,IAAME,CAAAA,CAAS,MAAMD,EAAKK,CAAAA,CAASP,CAAO,CAAA,CAE1C,GAAIG,EACA,OAAOC,YAAAA,CAAa,SAAS,IAAI,GAAA,CAAID,EAAO,QAAA,CAAUH,CAAAA,CAAQ,GAAG,CAAC,CAE1E,CAEA,OAAOI,YAAAA,CAAa,MACxB,KAEOK,CAAAA,CAAQH","file":"index.js","sourcesContent":["import { NextResponse } from 'next/server';\nimport type { NextRequest } from 'next/server';\n\nimport type { ProxyFunction } from './utility/interfaces';\n\nasync function handleProxy(\n request: NextRequest,\n functions: ProxyFunction[]\n): Promise<NextResponse> {\n for (const func of functions) {\n const result = await func(request);\n\n if (result) {\n return NextResponse.redirect(new URL(result.redirect, request.url));\n }\n }\n\n return NextResponse.next();\n}\n\nexport default handleProxy;\n","import { NextResponse } from 'next/server';\nimport type { NextRequest } from 'next/server';\n\nimport { validateSession } from '../auth';\n\nimport type { SessionProxyFunction } from './utility/interfaces';\n\nasync function handleSessionProxy(\n request: NextRequest,\n functions: SessionProxyFunction[]\n): Promise<NextResponse> {\n const session = await validateSession(request.cookies);\n\n for (const func of functions) {\n const result = await func(session, request);\n\n if (result) {\n return NextResponse.redirect(new URL(result.redirect, request.url));\n }\n }\n\n return NextResponse.next();\n}\n\nexport default handleSessionProxy;\n"]}
1
+ {"version":3,"sources":["../../src/proxy/handle-proxy.ts"],"names":["handleProxy","request","functions","func","result","NextResponse","handle_proxy_default"],"mappings":"uCAKA,eAAeA,CAAAA,CACXC,EACAC,CAAAA,CACqB,CACrB,IAAA,IAAWC,CAAAA,IAAQD,EAAW,CAC1B,IAAME,EAAS,MAAMD,CAAAA,CAAKF,CAAO,CAAA,CAEjC,GAAIG,CAAAA,CACA,OAAOC,aAAa,QAAA,CAAS,IAAI,GAAA,CAAID,CAAAA,CAAO,SAAUH,CAAAA,CAAQ,GAAG,CAAC,CAE1E,CAEA,OAAOI,YAAAA,CAAa,MACxB,KAEOC,CAAAA,CAAQN","file":"index.js","sourcesContent":["import { NextResponse } from 'next/server';\nimport type { NextRequest } from 'next/server';\n\nimport type { ProxyFunction } from './utility/interfaces';\n\nasync function handleProxy(\n request: NextRequest,\n functions: ProxyFunction[]\n): Promise<NextResponse> {\n for (const func of functions) {\n const result = await func(request);\n\n if (result) {\n return NextResponse.redirect(new URL(result.redirect, request.url));\n }\n }\n\n return NextResponse.next();\n}\n\nexport default handleProxy;\n"]}
@@ -10,6 +10,7 @@ declare const serverStorage: {
10
10
  */
11
11
  getItem(prefix: string, key: string): Promise<Record<string, unknown> | null>;
12
12
  getArray(prefix: string, key: string): Promise<string[]>;
13
+ setArray(prefix: string, key: string, value: string[]): Promise<void>;
13
14
  addToArray(prefix: string, key: string, value: string): Promise<void>;
14
15
  removeFromArray(prefix: string, key: string, value: string): Promise<void>;
15
16
  /**
@@ -18,7 +19,8 @@ declare const serverStorage: {
18
19
  * @param key The key of the item to set.
19
20
  * @param value The value of the item to set.
20
21
  */
21
- setItem(prefix: string, key: string, value: Record<string, unknown>): Promise<void>;
22
+ setItem(prefix: string, key: string, value: Record<string, unknown>, ttl?: number): Promise<void>;
23
+ setExpiry(prefix: string, key: string, ttl: number): Promise<void>;
22
24
  /**
23
25
  * Remove an item from the cache.
24
26
  * @param prefix The prefix to use for the cache key.
@@ -1,2 +1,2 @@
1
- export{a as default}from'../chunk-C2XLUXVN.js';import'../chunk-KC7SPWBL.js';//# sourceMappingURL=index.js.map
1
+ import {createClient}from'redis';var n=null;async function g(){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=g;async function u(t,r,e){if(typeof e=="number")return e;let a=await(await i()).ttl(`[${t}]:${r}`);return a<0?0:a}var s=u;var c={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,a){await(await i()).set(`[${t}]:${r}`,JSON.stringify(e),{expiration:{type:"EX",value:await s(t,r,a)}});},async setExpiry(t,r,e){await(await i()).expire(`[${t}]:${r}`,e);},async removeItem(t,r){await(await i()).del(`[${t}]:${r}`);}},p=c;export{p as default};//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
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","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 await (\n await getClient()\n ).set(`[${prefix}]:${key}`, JSON.stringify(value), {\n expiration: { type: 'EX', value: await getTTL(prefix, key, ttl) },\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"]}
@@ -4,7 +4,7 @@ declare function ensureID<T extends string>(id: string | null | undefined, prefi
4
4
 
5
5
  declare function generateID<T extends string = string>(prefix?: string | null, length?: number): T;
6
6
 
7
- declare function getIDFromParams<T extends string>(key: string, prefix: string, params?: Promise<Record<string, string>> | Record<string, string> | null): Promise<T | null>;
7
+ declare function getIDFromParams<T extends string>(key: string, prefix: string, params?: Promise<Record<string, string[] | string>> | Record<string, string[] | string> | null): Promise<T | null>;
8
8
 
9
9
  declare function guardID<T extends string>(id: (string | null | undefined)[], prefix: string): T[];
10
10
  declare function guardID<T extends string>(id: string | null | undefined, prefix: string): T | null;