@sqrzro/server 2.0.0-bz.29 → 2.0.0-bz.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/index.cjs +59 -0
- package/dist/auth/index.cjs.map +1 -0
- package/dist/auth/index.d.cts +100 -0
- package/dist/auth/index.d.ts +100 -6
- package/dist/auth/index.js +21 -6
- package/dist/auth/index.js.map +1 -0
- package/dist/cache/index.cjs +10 -0
- package/dist/cache/index.cjs.map +1 -0
- package/dist/cache/index.d.cts +4 -0
- package/dist/cache/index.d.ts +4 -1
- package/dist/cache/index.js +7 -1
- package/dist/cache/index.js.map +1 -0
- package/dist/database/schema.cjs +16 -0
- package/dist/database/schema.cjs.map +1 -0
- package/dist/database/schema.d.cts +288 -0
- package/dist/database/schema.d.ts +38 -34
- package/dist/database/schema.js +7 -42
- package/dist/database/schema.js.map +1 -0
- package/dist/forms/index.cjs +22 -0
- package/dist/forms/index.cjs.map +1 -0
- package/dist/forms/index.d.cts +50 -0
- package/dist/forms/index.d.ts +50 -3
- package/dist/forms/index.js +8 -3
- package/dist/forms/index.js.map +1 -0
- package/dist/lists/index.cjs +9 -0
- package/dist/lists/index.cjs.map +1 -0
- package/dist/lists/{ListService.d.ts → index.d.cts} +5 -3
- package/dist/lists/index.d.ts +18 -1
- package/dist/lists/index.js +7 -1
- package/dist/lists/index.js.map +1 -0
- package/dist/mail/index.cjs +9 -0
- package/dist/mail/index.cjs.map +1 -0
- package/dist/mail/index.d.cts +13 -0
- package/dist/mail/index.d.ts +13 -1
- package/dist/mail/index.js +5 -1
- package/dist/mail/index.js.map +1 -0
- package/dist/middleware.cjs +9 -0
- package/dist/middleware.cjs.map +1 -0
- package/dist/middleware.d.cts +5 -0
- package/dist/middleware.d.ts +5 -3
- package/dist/middleware.js +6 -45
- package/dist/middleware.js.map +1 -0
- package/dist/url/index.cjs +12 -0
- package/dist/url/index.cjs.map +1 -0
- package/dist/url/{URLService.d.ts → index.d.cts} +6 -4
- package/dist/url/index.d.ts +33 -1
- package/dist/url/index.js +7 -1
- package/dist/url/index.js.map +1 -0
- package/jest.config.js +7 -0
- package/package.json +56 -29
- package/dist/auth/AuthService.d.ts +0 -14
- package/dist/auth/AuthService.js +0 -135
- package/dist/auth/ClientService.d.ts +0 -11
- package/dist/auth/ClientService.js +0 -47
- package/dist/auth/LoginRequest.d.ts +0 -4
- package/dist/auth/LoginRequest.js +0 -8
- package/dist/auth/MFARequest.d.ts +0 -4
- package/dist/auth/MFARequest.js +0 -9
- package/dist/auth/MFAService.d.ts +0 -6
- package/dist/auth/MFAService.js +0 -105
- package/dist/auth/PasswordRequest.d.ts +0 -4
- package/dist/auth/PasswordRequest.js +0 -12
- package/dist/auth/PasswordResetRequest.d.ts +0 -4
- package/dist/auth/PasswordResetRequest.js +0 -13
- package/dist/auth/PasswordService.d.ts +0 -8
- package/dist/auth/PasswordService.js +0 -54
- package/dist/auth/SessionService.d.ts +0 -42
- package/dist/auth/SessionService.js +0 -127
- package/dist/auth/interfaces.d.ts +0 -20
- package/dist/auth/interfaces.js +0 -1
- package/dist/cache/CacheService.d.ts +0 -2
- package/dist/cache/CacheService.js +0 -27
- package/dist/database/DatabaseService.d.ts +0 -7
- package/dist/database/DatabaseService.js +0 -12
- package/dist/forms/FormService.d.ts +0 -18
- package/dist/forms/FormService.js +0 -98
- package/dist/forms/ImageService.d.ts +0 -7
- package/dist/forms/ImageService.js +0 -19
- package/dist/forms/ValidationError.d.ts +0 -4
- package/dist/forms/ValidationError.js +0 -7
- package/dist/forms/ValidationService.d.ts +0 -20
- package/dist/forms/ValidationService.js +0 -59
- package/dist/forms/lang.d.ts +0 -2
- package/dist/forms/lang.js +0 -115
- package/dist/lists/ListService.js +0 -28
- package/dist/mail/MailService.d.ts +0 -12
- package/dist/mail/MailService.js +0 -55
- package/dist/url/URLService.js +0 -61
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core';
|
|
2
|
+
|
|
3
|
+
declare const mfaType: drizzle_orm_pg_core.PgEnum<["TOTP", "HARDWARE"]>;
|
|
4
|
+
declare const scope: drizzle_orm_pg_core.PgEnum<["ANON", "MFA", "AUTHED"]>;
|
|
5
|
+
type Scope = (typeof scope.enumValues)[number];
|
|
6
|
+
declare const authSchema: drizzle_orm_pg_core.PgSchema<"auth">;
|
|
7
|
+
declare const authUserTable: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
6
8
|
name: "user_credentials";
|
|
7
9
|
schema: "auth";
|
|
8
10
|
columns: {
|
|
9
|
-
id:
|
|
11
|
+
id: drizzle_orm_pg_core.PgColumn<{
|
|
10
12
|
name: "id";
|
|
11
13
|
tableName: "user_credentials";
|
|
12
14
|
dataType: "string";
|
|
@@ -18,7 +20,7 @@ export declare const authUserTable: import("drizzle-orm/pg-core").PgTableWithCol
|
|
|
18
20
|
enumValues: [string, ...string[]];
|
|
19
21
|
baseColumn: never;
|
|
20
22
|
}, {}, {}>;
|
|
21
|
-
email:
|
|
23
|
+
email: drizzle_orm_pg_core.PgColumn<{
|
|
22
24
|
name: "email";
|
|
23
25
|
tableName: "user_credentials";
|
|
24
26
|
dataType: "string";
|
|
@@ -30,7 +32,7 @@ export declare const authUserTable: import("drizzle-orm/pg-core").PgTableWithCol
|
|
|
30
32
|
enumValues: [string, ...string[]];
|
|
31
33
|
baseColumn: never;
|
|
32
34
|
}, {}, {}>;
|
|
33
|
-
password:
|
|
35
|
+
password: drizzle_orm_pg_core.PgColumn<{
|
|
34
36
|
name: "password";
|
|
35
37
|
tableName: "user_credentials";
|
|
36
38
|
dataType: "string";
|
|
@@ -42,7 +44,7 @@ export declare const authUserTable: import("drizzle-orm/pg-core").PgTableWithCol
|
|
|
42
44
|
enumValues: [string, ...string[]];
|
|
43
45
|
baseColumn: never;
|
|
44
46
|
}, {}, {}>;
|
|
45
|
-
role:
|
|
47
|
+
role: drizzle_orm_pg_core.PgColumn<{
|
|
46
48
|
name: "role";
|
|
47
49
|
tableName: "user_credentials";
|
|
48
50
|
dataType: "number";
|
|
@@ -57,12 +59,12 @@ export declare const authUserTable: import("drizzle-orm/pg-core").PgTableWithCol
|
|
|
57
59
|
};
|
|
58
60
|
dialect: "pg";
|
|
59
61
|
}>;
|
|
60
|
-
|
|
61
|
-
|
|
62
|
+
type AuthUser = typeof authUserTable.$inferSelect;
|
|
63
|
+
declare const authSessionTable: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
62
64
|
name: "sessions";
|
|
63
65
|
schema: "auth";
|
|
64
66
|
columns: {
|
|
65
|
-
id:
|
|
67
|
+
id: drizzle_orm_pg_core.PgColumn<{
|
|
66
68
|
name: "id";
|
|
67
69
|
tableName: "sessions";
|
|
68
70
|
dataType: "string";
|
|
@@ -74,7 +76,7 @@ export declare const authSessionTable: import("drizzle-orm/pg-core").PgTableWith
|
|
|
74
76
|
enumValues: [string, ...string[]];
|
|
75
77
|
baseColumn: never;
|
|
76
78
|
}, {}, {}>;
|
|
77
|
-
userId:
|
|
79
|
+
userId: drizzle_orm_pg_core.PgColumn<{
|
|
78
80
|
name: "userId";
|
|
79
81
|
tableName: "sessions";
|
|
80
82
|
dataType: "string";
|
|
@@ -86,7 +88,7 @@ export declare const authSessionTable: import("drizzle-orm/pg-core").PgTableWith
|
|
|
86
88
|
enumValues: [string, ...string[]];
|
|
87
89
|
baseColumn: never;
|
|
88
90
|
}, {}, {}>;
|
|
89
|
-
scope:
|
|
91
|
+
scope: drizzle_orm_pg_core.PgColumn<{
|
|
90
92
|
name: "scope";
|
|
91
93
|
tableName: "sessions";
|
|
92
94
|
dataType: "string";
|
|
@@ -98,7 +100,7 @@ export declare const authSessionTable: import("drizzle-orm/pg-core").PgTableWith
|
|
|
98
100
|
enumValues: ["ANON", "MFA", "AUTHED"];
|
|
99
101
|
baseColumn: never;
|
|
100
102
|
}, {}, {}>;
|
|
101
|
-
expiresAt:
|
|
103
|
+
expiresAt: drizzle_orm_pg_core.PgColumn<{
|
|
102
104
|
name: "expiresAt";
|
|
103
105
|
tableName: "sessions";
|
|
104
106
|
dataType: "date";
|
|
@@ -113,12 +115,12 @@ export declare const authSessionTable: import("drizzle-orm/pg-core").PgTableWith
|
|
|
113
115
|
};
|
|
114
116
|
dialect: "pg";
|
|
115
117
|
}>;
|
|
116
|
-
|
|
117
|
-
|
|
118
|
+
type AuthSession = typeof authSessionTable.$inferSelect;
|
|
119
|
+
declare const authResetTable: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
118
120
|
name: "resets";
|
|
119
121
|
schema: "auth";
|
|
120
122
|
columns: {
|
|
121
|
-
id:
|
|
123
|
+
id: drizzle_orm_pg_core.PgColumn<{
|
|
122
124
|
name: "id";
|
|
123
125
|
tableName: "resets";
|
|
124
126
|
dataType: "string";
|
|
@@ -130,7 +132,7 @@ export declare const authResetTable: import("drizzle-orm/pg-core").PgTableWithCo
|
|
|
130
132
|
enumValues: [string, ...string[]];
|
|
131
133
|
baseColumn: never;
|
|
132
134
|
}, {}, {}>;
|
|
133
|
-
userId:
|
|
135
|
+
userId: drizzle_orm_pg_core.PgColumn<{
|
|
134
136
|
name: "userId";
|
|
135
137
|
tableName: "resets";
|
|
136
138
|
dataType: "string";
|
|
@@ -142,7 +144,7 @@ export declare const authResetTable: import("drizzle-orm/pg-core").PgTableWithCo
|
|
|
142
144
|
enumValues: [string, ...string[]];
|
|
143
145
|
baseColumn: never;
|
|
144
146
|
}, {}, {}>;
|
|
145
|
-
expiresAt:
|
|
147
|
+
expiresAt: drizzle_orm_pg_core.PgColumn<{
|
|
146
148
|
name: "expiresAt";
|
|
147
149
|
tableName: "resets";
|
|
148
150
|
dataType: "date";
|
|
@@ -157,12 +159,12 @@ export declare const authResetTable: import("drizzle-orm/pg-core").PgTableWithCo
|
|
|
157
159
|
};
|
|
158
160
|
dialect: "pg";
|
|
159
161
|
}>;
|
|
160
|
-
|
|
161
|
-
|
|
162
|
+
type AuthReset = typeof authResetTable.$inferSelect;
|
|
163
|
+
declare const authMFATable: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
162
164
|
name: "mfas";
|
|
163
165
|
schema: "auth";
|
|
164
166
|
columns: {
|
|
165
|
-
id:
|
|
167
|
+
id: drizzle_orm_pg_core.PgColumn<{
|
|
166
168
|
name: "id";
|
|
167
169
|
tableName: "mfas";
|
|
168
170
|
dataType: "string";
|
|
@@ -174,7 +176,7 @@ export declare const authMFATable: import("drizzle-orm/pg-core").PgTableWithColu
|
|
|
174
176
|
enumValues: [string, ...string[]];
|
|
175
177
|
baseColumn: never;
|
|
176
178
|
}, {}, {}>;
|
|
177
|
-
name:
|
|
179
|
+
name: drizzle_orm_pg_core.PgColumn<{
|
|
178
180
|
name: "name";
|
|
179
181
|
tableName: "mfas";
|
|
180
182
|
dataType: "string";
|
|
@@ -186,7 +188,7 @@ export declare const authMFATable: import("drizzle-orm/pg-core").PgTableWithColu
|
|
|
186
188
|
enumValues: [string, ...string[]];
|
|
187
189
|
baseColumn: never;
|
|
188
190
|
}, {}, {}>;
|
|
189
|
-
userId:
|
|
191
|
+
userId: drizzle_orm_pg_core.PgColumn<{
|
|
190
192
|
name: "userId";
|
|
191
193
|
tableName: "mfas";
|
|
192
194
|
dataType: "string";
|
|
@@ -198,7 +200,7 @@ export declare const authMFATable: import("drizzle-orm/pg-core").PgTableWithColu
|
|
|
198
200
|
enumValues: [string, ...string[]];
|
|
199
201
|
baseColumn: never;
|
|
200
202
|
}, {}, {}>;
|
|
201
|
-
type:
|
|
203
|
+
type: drizzle_orm_pg_core.PgColumn<{
|
|
202
204
|
name: "type";
|
|
203
205
|
tableName: "mfas";
|
|
204
206
|
dataType: "string";
|
|
@@ -210,7 +212,7 @@ export declare const authMFATable: import("drizzle-orm/pg-core").PgTableWithColu
|
|
|
210
212
|
enumValues: ["TOTP", "HARDWARE"];
|
|
211
213
|
baseColumn: never;
|
|
212
214
|
}, {}, {}>;
|
|
213
|
-
secret:
|
|
215
|
+
secret: drizzle_orm_pg_core.PgColumn<{
|
|
214
216
|
name: "secret";
|
|
215
217
|
tableName: "mfas";
|
|
216
218
|
dataType: "string";
|
|
@@ -222,7 +224,7 @@ export declare const authMFATable: import("drizzle-orm/pg-core").PgTableWithColu
|
|
|
222
224
|
enumValues: [string, ...string[]];
|
|
223
225
|
baseColumn: never;
|
|
224
226
|
}, {}, {}>;
|
|
225
|
-
verifiedAt:
|
|
227
|
+
verifiedAt: drizzle_orm_pg_core.PgColumn<{
|
|
226
228
|
name: "verifiedAt";
|
|
227
229
|
tableName: "mfas";
|
|
228
230
|
dataType: "date";
|
|
@@ -237,12 +239,12 @@ export declare const authMFATable: import("drizzle-orm/pg-core").PgTableWithColu
|
|
|
237
239
|
};
|
|
238
240
|
dialect: "pg";
|
|
239
241
|
}>;
|
|
240
|
-
|
|
241
|
-
|
|
242
|
+
type AuthMFA = typeof authMFATable.$inferSelect;
|
|
243
|
+
declare const authClientTable: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
242
244
|
name: "client_credentials";
|
|
243
245
|
schema: "auth";
|
|
244
246
|
columns: {
|
|
245
|
-
id:
|
|
247
|
+
id: drizzle_orm_pg_core.PgColumn<{
|
|
246
248
|
name: "id";
|
|
247
249
|
tableName: "client_credentials";
|
|
248
250
|
dataType: "string";
|
|
@@ -254,7 +256,7 @@ export declare const authClientTable: import("drizzle-orm/pg-core").PgTableWithC
|
|
|
254
256
|
enumValues: [string, ...string[]];
|
|
255
257
|
baseColumn: never;
|
|
256
258
|
}, {}, {}>;
|
|
257
|
-
alias:
|
|
259
|
+
alias: drizzle_orm_pg_core.PgColumn<{
|
|
258
260
|
name: "alias";
|
|
259
261
|
tableName: "client_credentials";
|
|
260
262
|
dataType: "string";
|
|
@@ -266,7 +268,7 @@ export declare const authClientTable: import("drizzle-orm/pg-core").PgTableWithC
|
|
|
266
268
|
enumValues: [string, ...string[]];
|
|
267
269
|
baseColumn: never;
|
|
268
270
|
}, {}, {}>;
|
|
269
|
-
secret:
|
|
271
|
+
secret: drizzle_orm_pg_core.PgColumn<{
|
|
270
272
|
name: "secret";
|
|
271
273
|
tableName: "client_credentials";
|
|
272
274
|
dataType: "string";
|
|
@@ -281,4 +283,6 @@ export declare const authClientTable: import("drizzle-orm/pg-core").PgTableWithC
|
|
|
281
283
|
};
|
|
282
284
|
dialect: "pg";
|
|
283
285
|
}>;
|
|
284
|
-
|
|
286
|
+
type AuthClient = typeof authClientTable.$inferSelect;
|
|
287
|
+
|
|
288
|
+
export { type AuthClient, type AuthMFA, type AuthReset, type AuthSession, type AuthUser, type Scope, authClientTable, authMFATable, authResetTable, authSchema, authSessionTable, authUserTable, mfaType, scope };
|
package/dist/database/schema.js
CHANGED
|
@@ -1,42 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
id: text('id').primaryKey(),
|
|
9
|
-
email: text('email').notNull().unique(),
|
|
10
|
-
password: text('password'),
|
|
11
|
-
role: integer('role').notNull().default(DEFAULT_ROLE),
|
|
12
|
-
});
|
|
13
|
-
export const authSessionTable = authSchema.table('sessions', {
|
|
14
|
-
id: text('id').primaryKey(),
|
|
15
|
-
userId: text('userId')
|
|
16
|
-
.notNull()
|
|
17
|
-
.references(() => authUserTable.id),
|
|
18
|
-
scope: scope('scope').notNull().default('ANON'),
|
|
19
|
-
expiresAt: timestamp('expiresAt').notNull(),
|
|
20
|
-
});
|
|
21
|
-
export const authResetTable = authSchema.table('resets', {
|
|
22
|
-
id: text('id').primaryKey(),
|
|
23
|
-
userId: text('userId')
|
|
24
|
-
.notNull()
|
|
25
|
-
.references(() => authUserTable.id),
|
|
26
|
-
expiresAt: timestamp('expiresAt').notNull(),
|
|
27
|
-
});
|
|
28
|
-
export const authMFATable = authSchema.table('mfas', {
|
|
29
|
-
id: text('id').primaryKey(),
|
|
30
|
-
name: text('name').notNull(),
|
|
31
|
-
userId: text('userId')
|
|
32
|
-
.notNull()
|
|
33
|
-
.references(() => authUserTable.id),
|
|
34
|
-
type: mfaType('type').notNull().default('TOTP'),
|
|
35
|
-
secret: text('secret').notNull(),
|
|
36
|
-
verifiedAt: timestamp('verifiedAt'),
|
|
37
|
-
});
|
|
38
|
-
export const authClientTable = authSchema.table('client_credentials', {
|
|
39
|
-
id: text('id').primaryKey(),
|
|
40
|
-
alias: text('alias').notNull().unique(),
|
|
41
|
-
secret: text('secret').notNull().unique(),
|
|
42
|
-
});
|
|
1
|
+
import { pgEnum, pgSchema, text, integer, timestamp } from 'drizzle-orm/pg-core';
|
|
2
|
+
|
|
3
|
+
var i=10,p=pgEnum("mfaType",["TOTP","HARDWARE"]),u=pgEnum("scope",["ANON","MFA","AUTHED"]),t=pgSchema("auth"),l=t.table("user_credentials",{id:text("id").primaryKey(),email:text("email").notNull().unique(),password:text("password"),role:integer("role").notNull().default(i)}),c=t.table("sessions",{id:text("id").primaryKey(),userId:text("userId").notNull().references(()=>l.id),scope:u("scope").notNull().default("ANON"),expiresAt:timestamp("expiresAt").notNull()}),d=t.table("resets",{id:text("id").primaryKey(),userId:text("userId").notNull().references(()=>l.id),expiresAt:timestamp("expiresAt").notNull()}),y=t.table("mfas",{id:text("id").primaryKey(),name:text("name").notNull(),userId:text("userId").notNull().references(()=>l.id),type:p("type").notNull().default("TOTP"),secret:text("secret").notNull(),verifiedAt:timestamp("verifiedAt")}),f=t.table("client_credentials",{id:text("id").primaryKey(),alias:text("alias").notNull().unique(),secret:text("secret").notNull().unique()});
|
|
4
|
+
|
|
5
|
+
export { f as authClientTable, y as authMFATable, d as authResetTable, t as authSchema, c as authSessionTable, l as authUserTable, p as mfaType, u as scope };
|
|
6
|
+
//# sourceMappingURL=out.js.map
|
|
7
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/database/schema.ts"],"names":["integer","pgEnum","pgSchema","text","timestamp","DEFAULT_ROLE","mfaType","scope","authSchema","authUserTable","authSessionTable","authResetTable","authMFATable","authClientTable"],"mappings":"AAEA,OAAS,WAAAA,EAAS,UAAAC,EAAQ,YAAAC,EAAU,QAAAC,EAAM,aAAAC,MAAiB,sBAE3D,IAAMC,EAAe,GAERC,EAAUL,EAAO,UAAW,CAAC,OAAQ,UAAU,CAAC,EAChDM,EAAQN,EAAO,QAAS,CAAC,OAAQ,MAAO,QAAQ,CAAC,EAIjDO,EAAaN,EAAS,MAAM,EAE5BO,EAAgBD,EAAW,MAAM,mBAAoB,CAC9D,GAAIL,EAAK,IAAI,EAAE,WAAW,EAC1B,MAAOA,EAAK,OAAO,EAAE,QAAQ,EAAE,OAAO,EACtC,SAAUA,EAAK,UAAU,EACzB,KAAMH,EAAQ,MAAM,EAAE,QAAQ,EAAE,QAAQK,CAAY,CACxD,CAAC,EAIYK,EAAmBF,EAAW,MAAM,WAAY,CACzD,GAAIL,EAAK,IAAI,EAAE,WAAW,EAC1B,OAAQA,EAAK,QAAQ,EAChB,QAAQ,EACR,WAAW,IAAMM,EAAc,EAAE,EACtC,MAAOF,EAAM,OAAO,EAAE,QAAQ,EAAE,QAAQ,MAAM,EAC9C,UAAWH,EAAU,WAAW,EAAE,QAAQ,CAC9C,CAAC,EAIYO,EAAiBH,EAAW,MAAM,SAAU,CACrD,GAAIL,EAAK,IAAI,EAAE,WAAW,EAC1B,OAAQA,EAAK,QAAQ,EAChB,QAAQ,EACR,WAAW,IAAMM,EAAc,EAAE,EACtC,UAAWL,EAAU,WAAW,EAAE,QAAQ,CAC9C,CAAC,EAIYQ,EAAeJ,EAAW,MAAM,OAAQ,CACjD,GAAIL,EAAK,IAAI,EAAE,WAAW,EAC1B,KAAMA,EAAK,MAAM,EAAE,QAAQ,EAC3B,OAAQA,EAAK,QAAQ,EAChB,QAAQ,EACR,WAAW,IAAMM,EAAc,EAAE,EACtC,KAAMH,EAAQ,MAAM,EAAE,QAAQ,EAAE,QAAQ,MAAM,EAC9C,OAAQH,EAAK,QAAQ,EAAE,QAAQ,EAC/B,WAAYC,EAAU,YAAY,CACtC,CAAC,EAIYS,EAAkBL,EAAW,MAAM,qBAAsB,CAClE,GAAIL,EAAK,IAAI,EAAE,WAAW,EAC1B,MAAOA,EAAK,OAAO,EAAE,QAAQ,EAAE,OAAO,EACtC,OAAQA,EAAK,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAC5C,CAAC","sourcesContent":["/* istanbul ignore file */\n\nimport { integer, pgEnum, pgSchema, text, timestamp } from 'drizzle-orm/pg-core';\n\nconst DEFAULT_ROLE = 10;\n\nexport const mfaType = pgEnum('mfaType', ['TOTP', 'HARDWARE']);\nexport const scope = pgEnum('scope', ['ANON', 'MFA', 'AUTHED']);\n\nexport type Scope = (typeof scope.enumValues)[number];\n\nexport const authSchema = pgSchema('auth');\n\nexport const authUserTable = authSchema.table('user_credentials', {\n id: text('id').primaryKey(),\n email: text('email').notNull().unique(),\n password: text('password'),\n role: integer('role').notNull().default(DEFAULT_ROLE),\n});\n\nexport type AuthUser = typeof authUserTable.$inferSelect;\n\nexport const authSessionTable = authSchema.table('sessions', {\n id: text('id').primaryKey(),\n userId: text('userId')\n .notNull()\n .references(() => authUserTable.id),\n scope: scope('scope').notNull().default('ANON'),\n expiresAt: timestamp('expiresAt').notNull(),\n});\n\nexport type AuthSession = typeof authSessionTable.$inferSelect;\n\nexport const authResetTable = authSchema.table('resets', {\n id: text('id').primaryKey(),\n userId: text('userId')\n .notNull()\n .references(() => authUserTable.id),\n expiresAt: timestamp('expiresAt').notNull(),\n});\n\nexport type AuthReset = typeof authResetTable.$inferSelect;\n\nexport const authMFATable = authSchema.table('mfas', {\n id: text('id').primaryKey(),\n name: text('name').notNull(),\n userId: text('userId')\n .notNull()\n .references(() => authUserTable.id),\n type: mfaType('type').notNull().default('TOTP'),\n secret: text('secret').notNull(),\n verifiedAt: timestamp('verifiedAt'),\n});\n\nexport type AuthMFA = typeof authMFATable.$inferSelect;\n\nexport const authClientTable = authSchema.table('client_credentials', {\n id: text('id').primaryKey(),\n alias: text('alias').notNull().unique(),\n secret: text('secret').notNull().unique(),\n});\n\nexport type AuthClient = typeof authClientTable.$inferSelect;\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var server = require('next/server');
|
|
4
|
+
var l = require('joi');
|
|
5
|
+
|
|
6
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
|
|
8
|
+
var l__default = /*#__PURE__*/_interopDefault(l);
|
|
9
|
+
|
|
10
|
+
var o=class extends Error{messages;constructor(e){super(JSON.stringify(e)),this.messages=e,this.name="ValidationError";}},i=o;var c={"alternatives.all":"","alternatives.any":"","alternatives.match":"","alternatives.one":"","alternatives.types":"","any.custom":"","any.default":"","any.failover":"","any.invalid":"","any.only":"","any.ref":"","any.required":"{{#label}} is required","any.unknown":"","array.base":"","array.excludes":"","array.includesRequiredBoth":"","array.includesRequiredKnowns":"","array.includesRequiredUnknowns":"","array.includes":"","array.length":"","array.max":"","array.min":"","array.orderedLength":"","array.sort":"","array.sort.mismatching":"","array.sort.unsupported":"","array.sparse":"","array.unique":"","array.hasKnown":"","array.hasUnknown":"","binary.base":"","binary.length":"","binary.max":"","binary.min":"","boolean.base":"","date.base":"","date.format":"","date.greater":"","date.less":"","date.max":"","date.min":"","date.strict":"","function.arity":"","function.class":"","function.maxArity":"","function.minArity":"","number.base":"{{#label}} should be a number","number.greater":"","number.infinity":"","number.integer":"","number.less":"","number.max":"","number.min":"{{#label}} should be greater than or equal to {{#limit}}","number.multiple":"","number.negative":"","number.port":"","number.positive":"","number.precision":"","number.unsafe":"","object.unknown":"","object.and":"","object.assert":"","object.base":"","object.length":"","object.max":"","object.min":"","object.missing":"","object.nand":"","object.pattern.match":"","object.refType":"","object.regex":"","object.rename.multiple":"","object.rename.override":"","object.schema":"","object.instance":"","object.with":"","object.without":"","object.xor":"","object.oxor":"","string.alphanum":"","string.base64":"","string.base":"","string.creditCard":"","string.dataUri":"","string.domain":"","string.email":"","string.empty":"{{#label}} is required","string.guid":"","string.hexAlign":"","string.hex":"","string.hostname":"","string.ipVersion":"","string.ip":"","string.isoDate":"","string.isoDuration":"","string.length":"","string.lowercase":"","string.max":"","string.min":"","string.normalize":"","string.pattern.base":"","string.pattern.name":"","string.pattern.invert.base":"","string.pattern.invert.name":"","string.token":"","string.trim":"","string.uppercase":"","string.uri":"","string.uriCustomScheme":"","string.uriRelativeOnly":"","symbol.base":"","symbol.map":""},s=c;function S(){return l__default.default}function v(){return s}function d(){return Object.entries(s).reduce((r,[e,t])=>t?{...r,[e]:t}:r,{})}function b(r){let e=r.details.reduce((t,n)=>({...t,[n.path.join(".")]:n.message.replace(/"/gu,"")}),{});return new i(e)}async function m(r,e,t){try{return [await e.validateAsync(r,{abortEarly:!1,messages:t||d(),stripUnknown:!0}),null]}catch(n){return n instanceof l__default.default.ValidationError?[null,b(n)]:n instanceof Error?[null,n]:[null,new Error("Unknown validation error occured")]}}function A(r){return l__default.default.object(r)}function w(r,e){return r.append(e)}function g(r){return {cause:r.cause,message:r.message,name:r.name,stack:r.stack}}function p(r){return !!Object.prototype.hasOwnProperty.call(r,"fn")}async function f(r){let e={...r.formData};if(r.request){let[n,a]=await m(r.formData,r.request);if(a!==null)return a instanceof i&&r.onValidationError?.(a),[null,g(a)];e=n;}if(!p(r))return await r.onSuccess?.(e),[e,null];let t=null;if(t=await r.fn(e),!t)throw new Error("NO_MODEL");return await r.onSuccess?.(t),[t,null]}async function O(r){let[e,t]=await f(r);if(t!==null){if(t.name==="ValidationError")try{let n=JSON.parse(t.message);return [null,server.NextResponse.json(n,{status:422})]}catch{return [null,server.NextResponse.json({message:"An unknown error occured"},{status:500})]}return [null,server.NextResponse.json({message:t.message},{status:500})]}return [e,null]}var y=["image/png","image/jpeg","image/jpg"];async function R(r,e){return r?r instanceof File?(e?.types||y).includes(r.type)?r.size>(e?.maxSize||5242880)?Promise.resolve([null,new Error("IMAGE_TOO_HEAVY")]):Promise.resolve([r,null]):Promise.resolve([null,new Error("IMAGE_TYPE_NOT_VALID")]):Promise.resolve([null,new Error("IMAGE_NOT_VALID")]):Promise.resolve([null,new Error("IMAGE_UNDEFINED")])}
|
|
11
|
+
|
|
12
|
+
exports.ValidationError = i;
|
|
13
|
+
exports.createSchema = A;
|
|
14
|
+
exports.extendSchema = w;
|
|
15
|
+
exports.getDefaultErrorMessages = v;
|
|
16
|
+
exports.submitAPIRequest = O;
|
|
17
|
+
exports.submitForm = f;
|
|
18
|
+
exports.validate = S;
|
|
19
|
+
exports.validateImage = R;
|
|
20
|
+
exports.validateSchema = m;
|
|
21
|
+
//# sourceMappingURL=out.js.map
|
|
22
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/forms/FormService.ts","../../src/forms/ValidationError.ts","../../src/forms/ValidationService.ts","../../src/forms/lang.ts","../../src/forms/ImageService.ts"],"names":["NextResponse","ValidationError","messages","ValidationError_default","Joi","lang_default","validate","getDefaultErrorMessages","getErrorMessages","acc","key","value","transformErrors","error","cur","validateSchema","formData","validation","err","createSchema","schema","extendSchema","appends","serializeError","hasFn","args","submitForm","data","validated","validationError","model","submitAPIRequest","response","errors","DEFAULT_TYPES","validateImage","image","config"],"mappings":"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","sourcesContent":["/* eslint-disable max-statements */\n\nimport type { SerializedError, SerializedErrorable } from '@sqrzro/interfaces';\nimport type Joi from 'joi';\nimport { NextResponse } from 'next/server';\n\nimport ValidationError from './ValidationError';\nimport { validateSchema } from './ValidationService';\n\nfunction serializeError(err: Error): SerializedError {\n return {\n cause: err.cause,\n message: err.message,\n name: err.name,\n stack: err.stack,\n };\n}\n\ninterface SubmitFormArgs<F extends object> {\n formData: F;\n onSuccess?: (model: F) => Promise<void> | void;\n onValidationError?: (error: ValidationError) => void;\n request?: Joi.ObjectSchema<F>;\n}\n\ninterface SubmitFormArgsWithFn<F extends object, M> extends Omit<SubmitFormArgs<F>, 'onSuccess'> {\n fn: (data: F) => Promise<M | null>;\n onSuccess?: (model: M) => Promise<void> | void;\n}\n\nfunction hasFn<F extends object, M>(\n args: SubmitFormArgs<F> | SubmitFormArgsWithFn<F, M>\n): args is SubmitFormArgsWithFn<F, M> {\n return Boolean(Object.prototype.hasOwnProperty.call(args, 'fn'));\n}\n\nexport async function submitForm<F extends object>(\n args: SubmitFormArgs<F>\n): Promise<SerializedErrorable<F>>;\nexport async function submitForm<F extends object, M>(\n args: SubmitFormArgsWithFn<F, M>\n): Promise<SerializedErrorable<M>>;\n\nexport async function submitForm<F extends object, M>(\n args: SubmitFormArgs<F> | SubmitFormArgsWithFn<F, M>\n): Promise<[F, null] | [M, null] | [null, SerializedError]> {\n let data = { ...args.formData };\n\n if (args.request) {\n const [validated, validationError] = await validateSchema<F>(args.formData, args.request);\n\n if (validationError !== null) {\n if (validationError instanceof ValidationError) {\n args.onValidationError?.(validationError);\n }\n\n return [null, serializeError(validationError)];\n }\n\n data = validated;\n }\n\n if (!hasFn(args)) {\n // try {\n await args.onSuccess?.(data);\n // } catch (err) {\n // if (err instanceof Error) {\n // return [null, serializeError(err)];\n // }\n\n // return [\n // null,\n // serializeError(\n // new Error('The submitForm onSuccess function encountered an unknown error')\n // ),\n // ];\n // }\n\n return [data, null];\n }\n\n let model: Awaited<M> | null = null;\n\n // try {\n model = await args.fn(data);\n // } catch (err: unknown) {\n // if (err instanceof ValidationError) {\n // args.onValidationError?.(err);\n // return [null, serializeError(err)];\n // }\n\n // if (err instanceof Error) {\n // return [null, serializeError(err)];\n // }\n\n // return [\n // null,\n // serializeError(\n // new Error('The function supplied to submitForm encountered an unknown error')\n // ),\n // ];\n // }\n\n if (!model) {\n throw new Error('NO_MODEL');\n // return [\n // null,\n // serializeError(\n // new Error('No model has been returned from the function supplied to submitForm')\n // ),\n // ];\n }\n\n // try {\n await args.onSuccess?.(model);\n // } catch (err) {\n // if (err instanceof Error) {\n // return [null, serializeError(err)];\n // }\n\n // return [\n // null,\n // serializeError(\n // new Error('The submitForm onSuccess function encountered an unknown error')\n // ),\n // ];\n // }\n\n return [model, null];\n}\n\nexport async function submitAPIRequest<F extends object, M>(\n args: SubmitFormArgsWithFn<F, M>\n): Promise<[M, null] | [null, NextResponse]> {\n const [response, error] = await submitForm<F, M>(args);\n\n if (error !== null) {\n if (error.name === 'ValidationError') {\n try {\n const errors = JSON.parse(error.message) as Record<string, string>;\n return [null, NextResponse.json(errors, { status: 422 })];\n } catch (err) {\n return [\n null,\n NextResponse.json({ message: 'An unknown error occured' }, { status: 500 }),\n ];\n }\n }\n return [null, NextResponse.json({ message: error.message }, { status: 500 })];\n }\n\n return [response, null];\n}\n","class ValidationError extends Error {\n public messages: Record<string, string>;\n\n public constructor(messages: Record<string, string>) {\n super(JSON.stringify(messages));\n\n this.messages = messages;\n this.name = 'ValidationError';\n }\n}\n\nexport default ValidationError;\n","import type { Errorable } from '@sqrzro/interfaces';\nimport Joi from 'joi';\n\nimport lang from './lang';\nimport ValidationError from './ValidationError';\n\nexport function validate(): typeof Joi {\n return Joi;\n}\n\nexport type ValidationCustomHelpers<V = any> = Joi.CustomHelpers<V>; // eslint-disable-line @typescript-eslint/no-explicit-any\nexport type ValidationExternalHelpers<V = any> = Joi.ExternalHelpers<V>; // eslint-disable-line @typescript-eslint/no-explicit-any\nexport type ValidationErrorReport = Joi.ErrorReport;\n\nexport function getDefaultErrorMessages(): Record<string, string> {\n return lang;\n}\n\nfunction getErrorMessages(): Record<string, string> {\n return Object.entries(lang).reduce((acc, [key, value]) => {\n if (!value) {\n return acc;\n }\n return {\n ...acc,\n [key]: value,\n };\n }, {});\n}\n\nfunction transformErrors(error: Joi.ValidationError): ValidationError {\n const messages = error.details.reduce(\n (acc, cur) => ({\n ...acc,\n [cur.path.join('.')]: cur.message.replace(/\"/gu, ''),\n }),\n {}\n );\n return new ValidationError(messages);\n}\n\n/**\n * This function takes FormData and a schema. It then attempts to transform the FormData into an\n * object that matches `T`. This is because the FormData object is not typed and we want to be able\n * to validate it properly typed.\n *\n * Once transformed, the object is validated against the schema. This will result in either a\n * properly typed `T` object or an array of validation errors.\n * @param formData\n * @param validation\n * @returns\n */\nexport async function validateSchema<T>(\n formData: Partial<T>,\n validation: Joi.ObjectSchema<T>,\n messages?: Record<string, string>\n): Promise<Errorable<T>> {\n try {\n const validated = await validation.validateAsync(formData, {\n abortEarly: false,\n messages: messages || getErrorMessages(),\n stripUnknown: true,\n });\n\n return [validated, null];\n } catch (err) {\n if (err instanceof Joi.ValidationError) {\n return [null, transformErrors(err)];\n }\n\n if (err instanceof Error) {\n return [null, err];\n }\n\n return [null, new Error('Unknown validation error occured')];\n }\n}\n\nexport function createSchema<T>(schema: Joi.SchemaMap<T, true>): Joi.ObjectSchema<T> {\n return Joi.object<T>(schema);\n}\n\nexport function extendSchema<T, U extends T>(\n schema: Joi.ObjectSchema<T>,\n appends: Joi.PartialSchemaMap<U>\n): Joi.ObjectSchema<U> {\n return schema.append<U>(appends);\n}\n","const messages: Record<string, string> = {\n 'alternatives.all': '',\n 'alternatives.any': '',\n 'alternatives.match': '',\n 'alternatives.one': '',\n 'alternatives.types': '',\n 'any.custom': '',\n 'any.default': '',\n 'any.failover': '',\n 'any.invalid': '',\n 'any.only': '',\n 'any.ref': '',\n 'any.required': '{{#label}} is required',\n 'any.unknown': '',\n 'array.base': '',\n 'array.excludes': '',\n 'array.includesRequiredBoth': '',\n 'array.includesRequiredKnowns': '',\n 'array.includesRequiredUnknowns': '',\n 'array.includes': '',\n 'array.length': '',\n 'array.max': '',\n 'array.min': '',\n 'array.orderedLength': '',\n 'array.sort': '',\n 'array.sort.mismatching': '',\n 'array.sort.unsupported': '',\n 'array.sparse': '',\n 'array.unique': '',\n 'array.hasKnown': '',\n 'array.hasUnknown': '',\n 'binary.base': '',\n 'binary.length': '',\n 'binary.max': '',\n 'binary.min': '',\n 'boolean.base': '',\n 'date.base': '',\n 'date.format': '',\n 'date.greater': '',\n 'date.less': '',\n 'date.max': '',\n 'date.min': '',\n 'date.strict': '',\n 'function.arity': '',\n 'function.class': '',\n 'function.maxArity': '',\n 'function.minArity': '',\n 'number.base': '{{#label}} should be a number',\n 'number.greater': '',\n 'number.infinity': '',\n 'number.integer': '',\n 'number.less': '',\n 'number.max': '',\n 'number.min': '{{#label}} should be greater than or equal to {{#limit}}',\n 'number.multiple': '',\n 'number.negative': '',\n 'number.port': '',\n 'number.positive': '',\n 'number.precision': '',\n 'number.unsafe': '',\n 'object.unknown': '',\n 'object.and': '',\n 'object.assert': '',\n 'object.base': '',\n 'object.length': '',\n 'object.max': '',\n 'object.min': '',\n 'object.missing': '',\n 'object.nand': '',\n 'object.pattern.match': '',\n 'object.refType': '',\n 'object.regex': '',\n 'object.rename.multiple': '',\n 'object.rename.override': '',\n 'object.schema': '',\n 'object.instance': '',\n 'object.with': '',\n 'object.without': '',\n 'object.xor': '',\n 'object.oxor': '',\n 'string.alphanum': '',\n 'string.base64': '',\n 'string.base': '',\n 'string.creditCard': '',\n 'string.dataUri': '',\n 'string.domain': '',\n 'string.email': '',\n 'string.empty': '{{#label}} is required',\n 'string.guid': '',\n 'string.hexAlign': '',\n 'string.hex': '',\n 'string.hostname': '',\n 'string.ipVersion': '',\n 'string.ip': '',\n 'string.isoDate': '',\n 'string.isoDuration': '',\n 'string.length': '',\n 'string.lowercase': '',\n 'string.max': '',\n 'string.min': '',\n 'string.normalize': '',\n 'string.pattern.base': '',\n 'string.pattern.name': '',\n 'string.pattern.invert.base': '',\n 'string.pattern.invert.name': '',\n 'string.token': '',\n 'string.trim': '',\n 'string.uppercase': '',\n 'string.uri': '',\n 'string.uriCustomScheme': '',\n 'string.uriRelativeOnly': '',\n 'symbol.base': '',\n 'symbol.map': '',\n};\n\nexport default messages;\n","'use server';\n\nimport type { Errorable } from '@sqrzro/interfaces';\n\nconst DEFAULT_TYPES = ['image/png', 'image/jpeg', 'image/jpg'];\n// 5MB\nconst DEFAULT_MAX_SIZE = 5242880;\n\ninterface ImageValidationConfig {\n maxSize?: number;\n types?: string[];\n}\n\nexport async function validateImage(\n image: File | null,\n config?: ImageValidationConfig\n): Promise<Errorable<File>> {\n if (!image) {\n return Promise.resolve([null, new Error('IMAGE_UNDEFINED')]);\n }\n\n if (!(image instanceof File)) {\n return Promise.resolve([null, new Error('IMAGE_NOT_VALID')]);\n }\n\n if (!(config?.types || DEFAULT_TYPES).includes(image.type)) {\n return Promise.resolve([null, new Error('IMAGE_TYPE_NOT_VALID')]);\n }\n\n if (image.size > (config?.maxSize || DEFAULT_MAX_SIZE)) {\n return Promise.resolve([null, new Error('IMAGE_TOO_HEAVY')]);\n }\n\n return Promise.resolve([image, null]);\n}\n"]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { SerializedErrorable, Errorable } from '@sqrzro/interfaces';
|
|
2
|
+
import Joi from 'joi';
|
|
3
|
+
import { NextResponse } from 'next/server';
|
|
4
|
+
|
|
5
|
+
declare class ValidationError extends Error {
|
|
6
|
+
messages: Record<string, string>;
|
|
7
|
+
constructor(messages: Record<string, string>);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
interface SubmitFormArgs<F extends object> {
|
|
11
|
+
formData: F;
|
|
12
|
+
onSuccess?: (model: F) => Promise<void> | void;
|
|
13
|
+
onValidationError?: (error: ValidationError) => void;
|
|
14
|
+
request?: Joi.ObjectSchema<F>;
|
|
15
|
+
}
|
|
16
|
+
interface SubmitFormArgsWithFn<F extends object, M> extends Omit<SubmitFormArgs<F>, 'onSuccess'> {
|
|
17
|
+
fn: (data: F) => Promise<M | null>;
|
|
18
|
+
onSuccess?: (model: M) => Promise<void> | void;
|
|
19
|
+
}
|
|
20
|
+
declare function submitForm<F extends object>(args: SubmitFormArgs<F>): Promise<SerializedErrorable<F>>;
|
|
21
|
+
declare function submitForm<F extends object, M>(args: SubmitFormArgsWithFn<F, M>): Promise<SerializedErrorable<M>>;
|
|
22
|
+
declare function submitAPIRequest<F extends object, M>(args: SubmitFormArgsWithFn<F, M>): Promise<[M, null] | [null, NextResponse]>;
|
|
23
|
+
|
|
24
|
+
interface ImageValidationConfig {
|
|
25
|
+
maxSize?: number;
|
|
26
|
+
types?: string[];
|
|
27
|
+
}
|
|
28
|
+
declare function validateImage(image: File | null, config?: ImageValidationConfig): Promise<Errorable<File>>;
|
|
29
|
+
|
|
30
|
+
declare function validate(): typeof Joi;
|
|
31
|
+
type ValidationCustomHelpers<V = any> = Joi.CustomHelpers<V>;
|
|
32
|
+
type ValidationExternalHelpers<V = any> = Joi.ExternalHelpers<V>;
|
|
33
|
+
type ValidationErrorReport = Joi.ErrorReport;
|
|
34
|
+
declare function getDefaultErrorMessages(): Record<string, string>;
|
|
35
|
+
/**
|
|
36
|
+
* This function takes FormData and a schema. It then attempts to transform the FormData into an
|
|
37
|
+
* object that matches `T`. This is because the FormData object is not typed and we want to be able
|
|
38
|
+
* to validate it properly typed.
|
|
39
|
+
*
|
|
40
|
+
* Once transformed, the object is validated against the schema. This will result in either a
|
|
41
|
+
* properly typed `T` object or an array of validation errors.
|
|
42
|
+
* @param formData
|
|
43
|
+
* @param validation
|
|
44
|
+
* @returns
|
|
45
|
+
*/
|
|
46
|
+
declare function validateSchema<T>(formData: Partial<T>, validation: Joi.ObjectSchema<T>, messages?: Record<string, string>): Promise<Errorable<T>>;
|
|
47
|
+
declare function createSchema<T>(schema: Joi.SchemaMap<T, true>): Joi.ObjectSchema<T>;
|
|
48
|
+
declare function extendSchema<T, U extends T>(schema: Joi.ObjectSchema<T>, appends: Joi.PartialSchemaMap<U>): Joi.ObjectSchema<U>;
|
|
49
|
+
|
|
50
|
+
export { type ValidationCustomHelpers, ValidationError, type ValidationErrorReport, type ValidationExternalHelpers, createSchema, extendSchema, getDefaultErrorMessages, submitAPIRequest, submitForm, validate, validateImage, validateSchema };
|
package/dist/forms/index.d.ts
CHANGED
|
@@ -1,3 +1,50 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { SerializedErrorable, Errorable } from '@sqrzro/interfaces';
|
|
2
|
+
import Joi from 'joi';
|
|
3
|
+
import { NextResponse } from 'next/server';
|
|
4
|
+
|
|
5
|
+
declare class ValidationError extends Error {
|
|
6
|
+
messages: Record<string, string>;
|
|
7
|
+
constructor(messages: Record<string, string>);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
interface SubmitFormArgs<F extends object> {
|
|
11
|
+
formData: F;
|
|
12
|
+
onSuccess?: (model: F) => Promise<void> | void;
|
|
13
|
+
onValidationError?: (error: ValidationError) => void;
|
|
14
|
+
request?: Joi.ObjectSchema<F>;
|
|
15
|
+
}
|
|
16
|
+
interface SubmitFormArgsWithFn<F extends object, M> extends Omit<SubmitFormArgs<F>, 'onSuccess'> {
|
|
17
|
+
fn: (data: F) => Promise<M | null>;
|
|
18
|
+
onSuccess?: (model: M) => Promise<void> | void;
|
|
19
|
+
}
|
|
20
|
+
declare function submitForm<F extends object>(args: SubmitFormArgs<F>): Promise<SerializedErrorable<F>>;
|
|
21
|
+
declare function submitForm<F extends object, M>(args: SubmitFormArgsWithFn<F, M>): Promise<SerializedErrorable<M>>;
|
|
22
|
+
declare function submitAPIRequest<F extends object, M>(args: SubmitFormArgsWithFn<F, M>): Promise<[M, null] | [null, NextResponse]>;
|
|
23
|
+
|
|
24
|
+
interface ImageValidationConfig {
|
|
25
|
+
maxSize?: number;
|
|
26
|
+
types?: string[];
|
|
27
|
+
}
|
|
28
|
+
declare function validateImage(image: File | null, config?: ImageValidationConfig): Promise<Errorable<File>>;
|
|
29
|
+
|
|
30
|
+
declare function validate(): typeof Joi;
|
|
31
|
+
type ValidationCustomHelpers<V = any> = Joi.CustomHelpers<V>;
|
|
32
|
+
type ValidationExternalHelpers<V = any> = Joi.ExternalHelpers<V>;
|
|
33
|
+
type ValidationErrorReport = Joi.ErrorReport;
|
|
34
|
+
declare function getDefaultErrorMessages(): Record<string, string>;
|
|
35
|
+
/**
|
|
36
|
+
* This function takes FormData and a schema. It then attempts to transform the FormData into an
|
|
37
|
+
* object that matches `T`. This is because the FormData object is not typed and we want to be able
|
|
38
|
+
* to validate it properly typed.
|
|
39
|
+
*
|
|
40
|
+
* Once transformed, the object is validated against the schema. This will result in either a
|
|
41
|
+
* properly typed `T` object or an array of validation errors.
|
|
42
|
+
* @param formData
|
|
43
|
+
* @param validation
|
|
44
|
+
* @returns
|
|
45
|
+
*/
|
|
46
|
+
declare function validateSchema<T>(formData: Partial<T>, validation: Joi.ObjectSchema<T>, messages?: Record<string, string>): Promise<Errorable<T>>;
|
|
47
|
+
declare function createSchema<T>(schema: Joi.SchemaMap<T, true>): Joi.ObjectSchema<T>;
|
|
48
|
+
declare function extendSchema<T, U extends T>(schema: Joi.ObjectSchema<T>, appends: Joi.PartialSchemaMap<U>): Joi.ObjectSchema<U>;
|
|
49
|
+
|
|
50
|
+
export { type ValidationCustomHelpers, ValidationError, type ValidationErrorReport, type ValidationExternalHelpers, createSchema, extendSchema, getDefaultErrorMessages, submitAPIRequest, submitForm, validate, validateImage, validateSchema };
|
package/dist/forms/index.js
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { NextResponse } from 'next/server';
|
|
2
|
+
import l from 'joi';
|
|
3
|
+
|
|
4
|
+
var o=class extends Error{messages;constructor(e){super(JSON.stringify(e)),this.messages=e,this.name="ValidationError";}},i=o;var c={"alternatives.all":"","alternatives.any":"","alternatives.match":"","alternatives.one":"","alternatives.types":"","any.custom":"","any.default":"","any.failover":"","any.invalid":"","any.only":"","any.ref":"","any.required":"{{#label}} is required","any.unknown":"","array.base":"","array.excludes":"","array.includesRequiredBoth":"","array.includesRequiredKnowns":"","array.includesRequiredUnknowns":"","array.includes":"","array.length":"","array.max":"","array.min":"","array.orderedLength":"","array.sort":"","array.sort.mismatching":"","array.sort.unsupported":"","array.sparse":"","array.unique":"","array.hasKnown":"","array.hasUnknown":"","binary.base":"","binary.length":"","binary.max":"","binary.min":"","boolean.base":"","date.base":"","date.format":"","date.greater":"","date.less":"","date.max":"","date.min":"","date.strict":"","function.arity":"","function.class":"","function.maxArity":"","function.minArity":"","number.base":"{{#label}} should be a number","number.greater":"","number.infinity":"","number.integer":"","number.less":"","number.max":"","number.min":"{{#label}} should be greater than or equal to {{#limit}}","number.multiple":"","number.negative":"","number.port":"","number.positive":"","number.precision":"","number.unsafe":"","object.unknown":"","object.and":"","object.assert":"","object.base":"","object.length":"","object.max":"","object.min":"","object.missing":"","object.nand":"","object.pattern.match":"","object.refType":"","object.regex":"","object.rename.multiple":"","object.rename.override":"","object.schema":"","object.instance":"","object.with":"","object.without":"","object.xor":"","object.oxor":"","string.alphanum":"","string.base64":"","string.base":"","string.creditCard":"","string.dataUri":"","string.domain":"","string.email":"","string.empty":"{{#label}} is required","string.guid":"","string.hexAlign":"","string.hex":"","string.hostname":"","string.ipVersion":"","string.ip":"","string.isoDate":"","string.isoDuration":"","string.length":"","string.lowercase":"","string.max":"","string.min":"","string.normalize":"","string.pattern.base":"","string.pattern.name":"","string.pattern.invert.base":"","string.pattern.invert.name":"","string.token":"","string.trim":"","string.uppercase":"","string.uri":"","string.uriCustomScheme":"","string.uriRelativeOnly":"","symbol.base":"","symbol.map":""},s=c;function S(){return l}function v(){return s}function d(){return Object.entries(s).reduce((r,[e,t])=>t?{...r,[e]:t}:r,{})}function b(r){let e=r.details.reduce((t,n)=>({...t,[n.path.join(".")]:n.message.replace(/"/gu,"")}),{});return new i(e)}async function m(r,e,t){try{return [await e.validateAsync(r,{abortEarly:!1,messages:t||d(),stripUnknown:!0}),null]}catch(n){return n instanceof l.ValidationError?[null,b(n)]:n instanceof Error?[null,n]:[null,new Error("Unknown validation error occured")]}}function A(r){return l.object(r)}function w(r,e){return r.append(e)}function g(r){return {cause:r.cause,message:r.message,name:r.name,stack:r.stack}}function p(r){return !!Object.prototype.hasOwnProperty.call(r,"fn")}async function f(r){let e={...r.formData};if(r.request){let[n,a]=await m(r.formData,r.request);if(a!==null)return a instanceof i&&r.onValidationError?.(a),[null,g(a)];e=n;}if(!p(r))return await r.onSuccess?.(e),[e,null];let t=null;if(t=await r.fn(e),!t)throw new Error("NO_MODEL");return await r.onSuccess?.(t),[t,null]}async function O(r){let[e,t]=await f(r);if(t!==null){if(t.name==="ValidationError")try{let n=JSON.parse(t.message);return [null,NextResponse.json(n,{status:422})]}catch{return [null,NextResponse.json({message:"An unknown error occured"},{status:500})]}return [null,NextResponse.json({message:t.message},{status:500})]}return [e,null]}var y=["image/png","image/jpeg","image/jpg"];async function R(r,e){return r?r instanceof File?(e?.types||y).includes(r.type)?r.size>(e?.maxSize||5242880)?Promise.resolve([null,new Error("IMAGE_TOO_HEAVY")]):Promise.resolve([r,null]):Promise.resolve([null,new Error("IMAGE_TYPE_NOT_VALID")]):Promise.resolve([null,new Error("IMAGE_NOT_VALID")]):Promise.resolve([null,new Error("IMAGE_UNDEFINED")])}
|
|
5
|
+
|
|
6
|
+
export { i as ValidationError, A as createSchema, w as extendSchema, v as getDefaultErrorMessages, O as submitAPIRequest, f as submitForm, S as validate, R as validateImage, m as validateSchema };
|
|
7
|
+
//# sourceMappingURL=out.js.map
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/forms/FormService.ts","../../src/forms/ValidationError.ts","../../src/forms/ValidationService.ts","../../src/forms/lang.ts","../../src/forms/ImageService.ts"],"names":["NextResponse","ValidationError","messages","ValidationError_default","Joi","lang_default","validate","getDefaultErrorMessages","getErrorMessages","acc","key","value","transformErrors","error","cur","validateSchema","formData","validation","err","createSchema","schema","extendSchema","appends","serializeError","hasFn","args","submitForm","data","validated","validationError","model","submitAPIRequest","response","errors","DEFAULT_TYPES","validateImage","image","config"],"mappings":"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","sourcesContent":["/* eslint-disable max-statements */\n\nimport type { SerializedError, SerializedErrorable } from '@sqrzro/interfaces';\nimport type Joi from 'joi';\nimport { NextResponse } from 'next/server';\n\nimport ValidationError from './ValidationError';\nimport { validateSchema } from './ValidationService';\n\nfunction serializeError(err: Error): SerializedError {\n return {\n cause: err.cause,\n message: err.message,\n name: err.name,\n stack: err.stack,\n };\n}\n\ninterface SubmitFormArgs<F extends object> {\n formData: F;\n onSuccess?: (model: F) => Promise<void> | void;\n onValidationError?: (error: ValidationError) => void;\n request?: Joi.ObjectSchema<F>;\n}\n\ninterface SubmitFormArgsWithFn<F extends object, M> extends Omit<SubmitFormArgs<F>, 'onSuccess'> {\n fn: (data: F) => Promise<M | null>;\n onSuccess?: (model: M) => Promise<void> | void;\n}\n\nfunction hasFn<F extends object, M>(\n args: SubmitFormArgs<F> | SubmitFormArgsWithFn<F, M>\n): args is SubmitFormArgsWithFn<F, M> {\n return Boolean(Object.prototype.hasOwnProperty.call(args, 'fn'));\n}\n\nexport async function submitForm<F extends object>(\n args: SubmitFormArgs<F>\n): Promise<SerializedErrorable<F>>;\nexport async function submitForm<F extends object, M>(\n args: SubmitFormArgsWithFn<F, M>\n): Promise<SerializedErrorable<M>>;\n\nexport async function submitForm<F extends object, M>(\n args: SubmitFormArgs<F> | SubmitFormArgsWithFn<F, M>\n): Promise<[F, null] | [M, null] | [null, SerializedError]> {\n let data = { ...args.formData };\n\n if (args.request) {\n const [validated, validationError] = await validateSchema<F>(args.formData, args.request);\n\n if (validationError !== null) {\n if (validationError instanceof ValidationError) {\n args.onValidationError?.(validationError);\n }\n\n return [null, serializeError(validationError)];\n }\n\n data = validated;\n }\n\n if (!hasFn(args)) {\n // try {\n await args.onSuccess?.(data);\n // } catch (err) {\n // if (err instanceof Error) {\n // return [null, serializeError(err)];\n // }\n\n // return [\n // null,\n // serializeError(\n // new Error('The submitForm onSuccess function encountered an unknown error')\n // ),\n // ];\n // }\n\n return [data, null];\n }\n\n let model: Awaited<M> | null = null;\n\n // try {\n model = await args.fn(data);\n // } catch (err: unknown) {\n // if (err instanceof ValidationError) {\n // args.onValidationError?.(err);\n // return [null, serializeError(err)];\n // }\n\n // if (err instanceof Error) {\n // return [null, serializeError(err)];\n // }\n\n // return [\n // null,\n // serializeError(\n // new Error('The function supplied to submitForm encountered an unknown error')\n // ),\n // ];\n // }\n\n if (!model) {\n throw new Error('NO_MODEL');\n // return [\n // null,\n // serializeError(\n // new Error('No model has been returned from the function supplied to submitForm')\n // ),\n // ];\n }\n\n // try {\n await args.onSuccess?.(model);\n // } catch (err) {\n // if (err instanceof Error) {\n // return [null, serializeError(err)];\n // }\n\n // return [\n // null,\n // serializeError(\n // new Error('The submitForm onSuccess function encountered an unknown error')\n // ),\n // ];\n // }\n\n return [model, null];\n}\n\nexport async function submitAPIRequest<F extends object, M>(\n args: SubmitFormArgsWithFn<F, M>\n): Promise<[M, null] | [null, NextResponse]> {\n const [response, error] = await submitForm<F, M>(args);\n\n if (error !== null) {\n if (error.name === 'ValidationError') {\n try {\n const errors = JSON.parse(error.message) as Record<string, string>;\n return [null, NextResponse.json(errors, { status: 422 })];\n } catch (err) {\n return [\n null,\n NextResponse.json({ message: 'An unknown error occured' }, { status: 500 }),\n ];\n }\n }\n return [null, NextResponse.json({ message: error.message }, { status: 500 })];\n }\n\n return [response, null];\n}\n","class ValidationError extends Error {\n public messages: Record<string, string>;\n\n public constructor(messages: Record<string, string>) {\n super(JSON.stringify(messages));\n\n this.messages = messages;\n this.name = 'ValidationError';\n }\n}\n\nexport default ValidationError;\n","import type { Errorable } from '@sqrzro/interfaces';\nimport Joi from 'joi';\n\nimport lang from './lang';\nimport ValidationError from './ValidationError';\n\nexport function validate(): typeof Joi {\n return Joi;\n}\n\nexport type ValidationCustomHelpers<V = any> = Joi.CustomHelpers<V>; // eslint-disable-line @typescript-eslint/no-explicit-any\nexport type ValidationExternalHelpers<V = any> = Joi.ExternalHelpers<V>; // eslint-disable-line @typescript-eslint/no-explicit-any\nexport type ValidationErrorReport = Joi.ErrorReport;\n\nexport function getDefaultErrorMessages(): Record<string, string> {\n return lang;\n}\n\nfunction getErrorMessages(): Record<string, string> {\n return Object.entries(lang).reduce((acc, [key, value]) => {\n if (!value) {\n return acc;\n }\n return {\n ...acc,\n [key]: value,\n };\n }, {});\n}\n\nfunction transformErrors(error: Joi.ValidationError): ValidationError {\n const messages = error.details.reduce(\n (acc, cur) => ({\n ...acc,\n [cur.path.join('.')]: cur.message.replace(/\"/gu, ''),\n }),\n {}\n );\n return new ValidationError(messages);\n}\n\n/**\n * This function takes FormData and a schema. It then attempts to transform the FormData into an\n * object that matches `T`. This is because the FormData object is not typed and we want to be able\n * to validate it properly typed.\n *\n * Once transformed, the object is validated against the schema. This will result in either a\n * properly typed `T` object or an array of validation errors.\n * @param formData\n * @param validation\n * @returns\n */\nexport async function validateSchema<T>(\n formData: Partial<T>,\n validation: Joi.ObjectSchema<T>,\n messages?: Record<string, string>\n): Promise<Errorable<T>> {\n try {\n const validated = await validation.validateAsync(formData, {\n abortEarly: false,\n messages: messages || getErrorMessages(),\n stripUnknown: true,\n });\n\n return [validated, null];\n } catch (err) {\n if (err instanceof Joi.ValidationError) {\n return [null, transformErrors(err)];\n }\n\n if (err instanceof Error) {\n return [null, err];\n }\n\n return [null, new Error('Unknown validation error occured')];\n }\n}\n\nexport function createSchema<T>(schema: Joi.SchemaMap<T, true>): Joi.ObjectSchema<T> {\n return Joi.object<T>(schema);\n}\n\nexport function extendSchema<T, U extends T>(\n schema: Joi.ObjectSchema<T>,\n appends: Joi.PartialSchemaMap<U>\n): Joi.ObjectSchema<U> {\n return schema.append<U>(appends);\n}\n","const messages: Record<string, string> = {\n 'alternatives.all': '',\n 'alternatives.any': '',\n 'alternatives.match': '',\n 'alternatives.one': '',\n 'alternatives.types': '',\n 'any.custom': '',\n 'any.default': '',\n 'any.failover': '',\n 'any.invalid': '',\n 'any.only': '',\n 'any.ref': '',\n 'any.required': '{{#label}} is required',\n 'any.unknown': '',\n 'array.base': '',\n 'array.excludes': '',\n 'array.includesRequiredBoth': '',\n 'array.includesRequiredKnowns': '',\n 'array.includesRequiredUnknowns': '',\n 'array.includes': '',\n 'array.length': '',\n 'array.max': '',\n 'array.min': '',\n 'array.orderedLength': '',\n 'array.sort': '',\n 'array.sort.mismatching': '',\n 'array.sort.unsupported': '',\n 'array.sparse': '',\n 'array.unique': '',\n 'array.hasKnown': '',\n 'array.hasUnknown': '',\n 'binary.base': '',\n 'binary.length': '',\n 'binary.max': '',\n 'binary.min': '',\n 'boolean.base': '',\n 'date.base': '',\n 'date.format': '',\n 'date.greater': '',\n 'date.less': '',\n 'date.max': '',\n 'date.min': '',\n 'date.strict': '',\n 'function.arity': '',\n 'function.class': '',\n 'function.maxArity': '',\n 'function.minArity': '',\n 'number.base': '{{#label}} should be a number',\n 'number.greater': '',\n 'number.infinity': '',\n 'number.integer': '',\n 'number.less': '',\n 'number.max': '',\n 'number.min': '{{#label}} should be greater than or equal to {{#limit}}',\n 'number.multiple': '',\n 'number.negative': '',\n 'number.port': '',\n 'number.positive': '',\n 'number.precision': '',\n 'number.unsafe': '',\n 'object.unknown': '',\n 'object.and': '',\n 'object.assert': '',\n 'object.base': '',\n 'object.length': '',\n 'object.max': '',\n 'object.min': '',\n 'object.missing': '',\n 'object.nand': '',\n 'object.pattern.match': '',\n 'object.refType': '',\n 'object.regex': '',\n 'object.rename.multiple': '',\n 'object.rename.override': '',\n 'object.schema': '',\n 'object.instance': '',\n 'object.with': '',\n 'object.without': '',\n 'object.xor': '',\n 'object.oxor': '',\n 'string.alphanum': '',\n 'string.base64': '',\n 'string.base': '',\n 'string.creditCard': '',\n 'string.dataUri': '',\n 'string.domain': '',\n 'string.email': '',\n 'string.empty': '{{#label}} is required',\n 'string.guid': '',\n 'string.hexAlign': '',\n 'string.hex': '',\n 'string.hostname': '',\n 'string.ipVersion': '',\n 'string.ip': '',\n 'string.isoDate': '',\n 'string.isoDuration': '',\n 'string.length': '',\n 'string.lowercase': '',\n 'string.max': '',\n 'string.min': '',\n 'string.normalize': '',\n 'string.pattern.base': '',\n 'string.pattern.name': '',\n 'string.pattern.invert.base': '',\n 'string.pattern.invert.name': '',\n 'string.token': '',\n 'string.trim': '',\n 'string.uppercase': '',\n 'string.uri': '',\n 'string.uriCustomScheme': '',\n 'string.uriRelativeOnly': '',\n 'symbol.base': '',\n 'symbol.map': '',\n};\n\nexport default messages;\n","'use server';\n\nimport type { Errorable } from '@sqrzro/interfaces';\n\nconst DEFAULT_TYPES = ['image/png', 'image/jpeg', 'image/jpg'];\n// 5MB\nconst DEFAULT_MAX_SIZE = 5242880;\n\ninterface ImageValidationConfig {\n maxSize?: number;\n types?: string[];\n}\n\nexport async function validateImage(\n image: File | null,\n config?: ImageValidationConfig\n): Promise<Errorable<File>> {\n if (!image) {\n return Promise.resolve([null, new Error('IMAGE_UNDEFINED')]);\n }\n\n if (!(image instanceof File)) {\n return Promise.resolve([null, new Error('IMAGE_NOT_VALID')]);\n }\n\n if (!(config?.types || DEFAULT_TYPES).includes(image.type)) {\n return Promise.resolve([null, new Error('IMAGE_TYPE_NOT_VALID')]);\n }\n\n if (image.size > (config?.maxSize || DEFAULT_MAX_SIZE)) {\n return Promise.resolve([null, new Error('IMAGE_TOO_HEAVY')]);\n }\n\n return Promise.resolve([image, null]);\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var utility = require('@sqrzro/utility');
|
|
4
|
+
|
|
5
|
+
var g="id",c="asc",A=1,s=10;function d(n){return {skip:(n-1)*s,take:s}}function u(n,t=[]){let{dir:e,page:r,sort:i,...o}=n||{};return {...d(r?parseInt(r,10):A),orderBy:{[i||g]:e||c},where:utility.getFromObject(o,t)}}async function l({allowedFilters:n,fn:t,searchParams:e}){try{let r=u(e,n);return [await t(r),null]}catch(r){return r instanceof Error?[null,r]:[null,new Error("[getList] An unknown error occurred")]}}
|
|
6
|
+
|
|
7
|
+
exports.getList = l;
|
|
8
|
+
//# sourceMappingURL=out.js.map
|
|
9
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lists/ListService.ts"],"names":["getFromObject","DEFAULT_SORT","DEFAULT_DIR","DEFAULT_PAGE","DEFAULT_LIMIT","createPaginationArgs","page","createFindManyArgs","searchParams","allowedFilters","dir","sort","filters","getList","fn","args","err"],"mappings":"AACA,OAAS,iBAAAA,MAAqB,kBAY9B,IAAMC,EAAe,KACfC,EAAc,MACdC,EAAe,EACfC,EAAgB,GAQtB,SAASC,EAAqBC,EAAsB,CAChD,MAAO,CAAE,MAAOA,EAAO,GAAKF,EAAe,KAAMA,CAAc,CACnE,CAEA,SAASG,EACLC,EACAC,EAA2B,CAAC,EAChB,CACZ,GAAM,CAAE,IAAAC,EAAK,KAAAJ,EAAM,KAAAK,EAAM,GAAGC,CAAQ,EAAIJ,GAAgB,CAAC,EAEzD,MAAO,CACH,GAAGH,EAAqBC,EAAO,SAASA,EAAM,EAAE,EAAIH,CAAY,EAChE,QAAS,CAAE,CAACQ,GAAQV,CAAY,EAAGS,GAAOR,CAAY,EACtD,MAAOF,EAAcY,EAASH,CAAc,CAChD,CACJ,CAEA,eAAsBI,EAAW,CAC7B,eAAAJ,EACA,GAAAK,EACA,aAAAN,CACJ,EAA4C,CACxC,GAAI,CACA,IAAMO,EAAOR,EAAmBC,EAAcC,CAAc,EAC5D,MAAO,CAAC,MAAMK,EAAGC,CAAI,EAAG,IAAI,CAChC,OAASC,EAAK,CACV,OAAIA,aAAe,MACR,CAAC,KAAMA,CAAG,EAEd,CAAC,KAAM,IAAI,MAAM,qCAAqC,CAAC,CAClE,CACJ","sourcesContent":["import type { Errorable } from '@sqrzro/interfaces';\nimport { getFromObject } from '@sqrzro/utility';\n\ninterface PaginationArgs {\n skip: number;\n take: number;\n}\n\ninterface FindManyArgs extends PaginationArgs {\n orderBy: Record<string, string>;\n where: Record<string, string>;\n}\n\nconst DEFAULT_SORT = 'id';\nconst DEFAULT_DIR = 'asc';\nconst DEFAULT_PAGE = 1;\nconst DEFAULT_LIMIT = 10;\n\ninterface GetListArgs<T> {\n allowedFilters?: string[];\n fn: (args: FindManyArgs) => Promise<T[]>;\n searchParams?: Record<string, string>;\n}\n\nfunction createPaginationArgs(page): PaginationArgs {\n return { skip: (page - 1) * DEFAULT_LIMIT, take: DEFAULT_LIMIT };\n}\n\nfunction createFindManyArgs(\n searchParams?: Record<string, string>,\n allowedFilters: string[] = []\n): FindManyArgs {\n const { dir, page, sort, ...filters } = searchParams || {};\n\n return {\n ...createPaginationArgs(page ? parseInt(page, 10) : DEFAULT_PAGE),\n orderBy: { [sort || DEFAULT_SORT]: dir || DEFAULT_DIR },\n where: getFromObject(filters, allowedFilters),\n };\n}\n\nexport async function getList<T>({\n allowedFilters,\n fn,\n searchParams,\n}: GetListArgs<T>): Promise<Errorable<T[]>> {\n try {\n const args = createFindManyArgs(searchParams, allowedFilters);\n return [await fn(args), null];\n } catch (err) {\n if (err instanceof Error) {\n return [null, err];\n }\n return [null, new Error('[getList] An unknown error occurred')];\n }\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Errorable } from '@sqrzro/interfaces';
|
|
2
|
+
|
|
2
3
|
interface PaginationArgs {
|
|
3
4
|
skip: number;
|
|
4
5
|
take: number;
|
|
@@ -12,5 +13,6 @@ interface GetListArgs<T> {
|
|
|
12
13
|
fn: (args: FindManyArgs) => Promise<T[]>;
|
|
13
14
|
searchParams?: Record<string, string>;
|
|
14
15
|
}
|
|
15
|
-
|
|
16
|
-
|
|
16
|
+
declare function getList<T>({ allowedFilters, fn, searchParams, }: GetListArgs<T>): Promise<Errorable<T[]>>;
|
|
17
|
+
|
|
18
|
+
export { getList };
|
package/dist/lists/index.d.ts
CHANGED
|
@@ -1 +1,18 @@
|
|
|
1
|
-
|
|
1
|
+
import { Errorable } from '@sqrzro/interfaces';
|
|
2
|
+
|
|
3
|
+
interface PaginationArgs {
|
|
4
|
+
skip: number;
|
|
5
|
+
take: number;
|
|
6
|
+
}
|
|
7
|
+
interface FindManyArgs extends PaginationArgs {
|
|
8
|
+
orderBy: Record<string, string>;
|
|
9
|
+
where: Record<string, string>;
|
|
10
|
+
}
|
|
11
|
+
interface GetListArgs<T> {
|
|
12
|
+
allowedFilters?: string[];
|
|
13
|
+
fn: (args: FindManyArgs) => Promise<T[]>;
|
|
14
|
+
searchParams?: Record<string, string>;
|
|
15
|
+
}
|
|
16
|
+
declare function getList<T>({ allowedFilters, fn, searchParams, }: GetListArgs<T>): Promise<Errorable<T[]>>;
|
|
17
|
+
|
|
18
|
+
export { getList };
|
package/dist/lists/index.js
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
import { getFromObject } from '@sqrzro/utility';
|
|
2
|
+
|
|
3
|
+
var g="id",c="asc",A=1,s=10;function d(n){return {skip:(n-1)*s,take:s}}function u(n,t=[]){let{dir:e,page:r,sort:i,...o}=n||{};return {...d(r?parseInt(r,10):A),orderBy:{[i||g]:e||c},where:getFromObject(o,t)}}async function l({allowedFilters:n,fn:t,searchParams:e}){try{let r=u(e,n);return [await t(r),null]}catch(r){return r instanceof Error?[null,r]:[null,new Error("[getList] An unknown error occurred")]}}
|
|
4
|
+
|
|
5
|
+
export { l as getList };
|
|
6
|
+
//# sourceMappingURL=out.js.map
|
|
7
|
+
//# sourceMappingURL=index.js.map
|