@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.
Files changed (88) hide show
  1. package/dist/auth/index.cjs +59 -0
  2. package/dist/auth/index.cjs.map +1 -0
  3. package/dist/auth/index.d.cts +100 -0
  4. package/dist/auth/index.d.ts +100 -6
  5. package/dist/auth/index.js +21 -6
  6. package/dist/auth/index.js.map +1 -0
  7. package/dist/cache/index.cjs +10 -0
  8. package/dist/cache/index.cjs.map +1 -0
  9. package/dist/cache/index.d.cts +4 -0
  10. package/dist/cache/index.d.ts +4 -1
  11. package/dist/cache/index.js +7 -1
  12. package/dist/cache/index.js.map +1 -0
  13. package/dist/database/schema.cjs +16 -0
  14. package/dist/database/schema.cjs.map +1 -0
  15. package/dist/database/schema.d.cts +288 -0
  16. package/dist/database/schema.d.ts +38 -34
  17. package/dist/database/schema.js +7 -42
  18. package/dist/database/schema.js.map +1 -0
  19. package/dist/forms/index.cjs +22 -0
  20. package/dist/forms/index.cjs.map +1 -0
  21. package/dist/forms/index.d.cts +50 -0
  22. package/dist/forms/index.d.ts +50 -3
  23. package/dist/forms/index.js +8 -3
  24. package/dist/forms/index.js.map +1 -0
  25. package/dist/lists/index.cjs +9 -0
  26. package/dist/lists/index.cjs.map +1 -0
  27. package/dist/lists/{ListService.d.ts → index.d.cts} +5 -3
  28. package/dist/lists/index.d.ts +18 -1
  29. package/dist/lists/index.js +7 -1
  30. package/dist/lists/index.js.map +1 -0
  31. package/dist/mail/index.cjs +9 -0
  32. package/dist/mail/index.cjs.map +1 -0
  33. package/dist/mail/index.d.cts +13 -0
  34. package/dist/mail/index.d.ts +13 -1
  35. package/dist/mail/index.js +5 -1
  36. package/dist/mail/index.js.map +1 -0
  37. package/dist/middleware.cjs +9 -0
  38. package/dist/middleware.cjs.map +1 -0
  39. package/dist/middleware.d.cts +5 -0
  40. package/dist/middleware.d.ts +5 -3
  41. package/dist/middleware.js +6 -45
  42. package/dist/middleware.js.map +1 -0
  43. package/dist/url/index.cjs +12 -0
  44. package/dist/url/index.cjs.map +1 -0
  45. package/dist/url/{URLService.d.ts → index.d.cts} +6 -4
  46. package/dist/url/index.d.ts +33 -1
  47. package/dist/url/index.js +7 -1
  48. package/dist/url/index.js.map +1 -0
  49. package/jest.config.js +7 -0
  50. package/package.json +56 -29
  51. package/dist/auth/AuthService.d.ts +0 -14
  52. package/dist/auth/AuthService.js +0 -135
  53. package/dist/auth/ClientService.d.ts +0 -11
  54. package/dist/auth/ClientService.js +0 -47
  55. package/dist/auth/LoginRequest.d.ts +0 -4
  56. package/dist/auth/LoginRequest.js +0 -8
  57. package/dist/auth/MFARequest.d.ts +0 -4
  58. package/dist/auth/MFARequest.js +0 -9
  59. package/dist/auth/MFAService.d.ts +0 -6
  60. package/dist/auth/MFAService.js +0 -105
  61. package/dist/auth/PasswordRequest.d.ts +0 -4
  62. package/dist/auth/PasswordRequest.js +0 -12
  63. package/dist/auth/PasswordResetRequest.d.ts +0 -4
  64. package/dist/auth/PasswordResetRequest.js +0 -13
  65. package/dist/auth/PasswordService.d.ts +0 -8
  66. package/dist/auth/PasswordService.js +0 -54
  67. package/dist/auth/SessionService.d.ts +0 -42
  68. package/dist/auth/SessionService.js +0 -127
  69. package/dist/auth/interfaces.d.ts +0 -20
  70. package/dist/auth/interfaces.js +0 -1
  71. package/dist/cache/CacheService.d.ts +0 -2
  72. package/dist/cache/CacheService.js +0 -27
  73. package/dist/database/DatabaseService.d.ts +0 -7
  74. package/dist/database/DatabaseService.js +0 -12
  75. package/dist/forms/FormService.d.ts +0 -18
  76. package/dist/forms/FormService.js +0 -98
  77. package/dist/forms/ImageService.d.ts +0 -7
  78. package/dist/forms/ImageService.js +0 -19
  79. package/dist/forms/ValidationError.d.ts +0 -4
  80. package/dist/forms/ValidationError.js +0 -7
  81. package/dist/forms/ValidationService.d.ts +0 -20
  82. package/dist/forms/ValidationService.js +0 -59
  83. package/dist/forms/lang.d.ts +0 -2
  84. package/dist/forms/lang.js +0 -115
  85. package/dist/lists/ListService.js +0 -28
  86. package/dist/mail/MailService.d.ts +0 -12
  87. package/dist/mail/MailService.js +0 -55
  88. package/dist/url/URLService.js +0 -61
@@ -1,12 +1,14 @@
1
- export declare const mfaType: import("drizzle-orm/pg-core").PgEnum<["TOTP", "HARDWARE"]>;
2
- export declare const scope: import("drizzle-orm/pg-core").PgEnum<["ANON", "MFA", "AUTHED"]>;
3
- export type Scope = (typeof scope.enumValues)[number];
4
- export declare const authSchema: import("drizzle-orm/pg-core").PgSchema<"auth">;
5
- export declare const authUserTable: import("drizzle-orm/pg-core").PgTableWithColumns<{
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: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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
- export type AuthUser = typeof authUserTable.$inferSelect;
61
- export declare const authSessionTable: import("drizzle-orm/pg-core").PgTableWithColumns<{
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: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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
- export type AuthSession = typeof authSessionTable.$inferSelect;
117
- export declare const authResetTable: import("drizzle-orm/pg-core").PgTableWithColumns<{
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: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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
- export type AuthReset = typeof authResetTable.$inferSelect;
161
- export declare const authMFATable: import("drizzle-orm/pg-core").PgTableWithColumns<{
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: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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
- export type AuthMFA = typeof authMFATable.$inferSelect;
241
- export declare const authClientTable: import("drizzle-orm/pg-core").PgTableWithColumns<{
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: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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
- export type AuthClient = typeof authClientTable.$inferSelect;
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 };
@@ -1,42 +1,7 @@
1
- /* istanbul ignore file */
2
- import { integer, pgEnum, pgSchema, text, timestamp } from 'drizzle-orm/pg-core';
3
- const DEFAULT_ROLE = 10;
4
- export const mfaType = pgEnum('mfaType', ['TOTP', 'HARDWARE']);
5
- export const scope = pgEnum('scope', ['ANON', 'MFA', 'AUTHED']);
6
- export const authSchema = pgSchema('auth');
7
- export const authUserTable = authSchema.table('user_credentials', {
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 };
@@ -1,3 +1,50 @@
1
- export * from './FormService';
2
- export * from './ImageService';
3
- export * from './ValidationService';
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 };
@@ -1,3 +1,8 @@
1
- export * from './FormService';
2
- export * from './ImageService';
3
- export * from './ValidationService';
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":"AAIA,OAAS,gBAAAA,MAAoB,cCJ7B,IAAMC,EAAN,cAA8B,KAAM,CACzB,SAEA,YAAYC,EAAkC,CACjD,MAAM,KAAK,UAAUA,CAAQ,CAAC,EAE9B,KAAK,SAAWA,EAChB,KAAK,KAAO,iBAChB,CACJ,EAEOC,EAAQF,ECVf,OAAOG,MAAS,MCDhB,IAAMF,EAAmC,CACrC,mBAAoB,GACpB,mBAAoB,GACpB,qBAAsB,GACtB,mBAAoB,GACpB,qBAAsB,GACtB,aAAc,GACd,cAAe,GACf,eAAgB,GAChB,cAAe,GACf,WAAY,GACZ,UAAW,GACX,eAAgB,yBAChB,cAAe,GACf,aAAc,GACd,iBAAkB,GAClB,6BAA8B,GAC9B,+BAAgC,GAChC,iCAAkC,GAClC,iBAAkB,GAClB,eAAgB,GAChB,YAAa,GACb,YAAa,GACb,sBAAuB,GACvB,aAAc,GACd,yBAA0B,GAC1B,yBAA0B,GAC1B,eAAgB,GAChB,eAAgB,GAChB,iBAAkB,GAClB,mBAAoB,GACpB,cAAe,GACf,gBAAiB,GACjB,aAAc,GACd,aAAc,GACd,eAAgB,GAChB,YAAa,GACb,cAAe,GACf,eAAgB,GAChB,YAAa,GACb,WAAY,GACZ,WAAY,GACZ,cAAe,GACf,iBAAkB,GAClB,iBAAkB,GAClB,oBAAqB,GACrB,oBAAqB,GACrB,cAAe,gCACf,iBAAkB,GAClB,kBAAmB,GACnB,iBAAkB,GAClB,cAAe,GACf,aAAc,GACd,aAAc,2DACd,kBAAmB,GACnB,kBAAmB,GACnB,cAAe,GACf,kBAAmB,GACnB,mBAAoB,GACpB,gBAAiB,GACjB,iBAAkB,GAClB,aAAc,GACd,gBAAiB,GACjB,cAAe,GACf,gBAAiB,GACjB,aAAc,GACd,aAAc,GACd,iBAAkB,GAClB,cAAe,GACf,uBAAwB,GACxB,iBAAkB,GAClB,eAAgB,GAChB,yBAA0B,GAC1B,yBAA0B,GAC1B,gBAAiB,GACjB,kBAAmB,GACnB,cAAe,GACf,iBAAkB,GAClB,aAAc,GACd,cAAe,GACf,kBAAmB,GACnB,gBAAiB,GACjB,cAAe,GACf,oBAAqB,GACrB,iBAAkB,GAClB,gBAAiB,GACjB,eAAgB,GAChB,eAAgB,yBAChB,cAAe,GACf,kBAAmB,GACnB,aAAc,GACd,kBAAmB,GACnB,mBAAoB,GACpB,YAAa,GACb,iBAAkB,GAClB,qBAAsB,GACtB,gBAAiB,GACjB,mBAAoB,GACpB,aAAc,GACd,aAAc,GACd,mBAAoB,GACpB,sBAAuB,GACvB,sBAAuB,GACvB,6BAA8B,GAC9B,6BAA8B,GAC9B,eAAgB,GAChB,cAAe,GACf,mBAAoB,GACpB,aAAc,GACd,yBAA0B,GAC1B,yBAA0B,GAC1B,cAAe,GACf,aAAc,EAClB,EAEOG,EAAQH,ED7GR,SAASI,GAAuB,CACnC,OAAOF,CACX,CAMO,SAASG,GAAkD,CAC9D,OAAOF,CACX,CAEA,SAASG,GAA2C,CAChD,OAAO,OAAO,QAAQH,CAAI,EAAE,OAAO,CAACI,EAAK,CAACC,EAAKC,CAAK,IAC3CA,EAGE,CACH,GAAGF,EACH,CAACC,CAAG,EAAGC,CACX,EALWF,EAMZ,CAAC,CAAC,CACT,CAEA,SAASG,EAAgBC,EAA6C,CAClE,IAAMX,EAAWW,EAAM,QAAQ,OAC3B,CAACJ,EAAKK,KAAS,CACX,GAAGL,EACH,CAACK,EAAI,KAAK,KAAK,GAAG,CAAC,EAAGA,EAAI,QAAQ,QAAQ,MAAO,EAAE,CACvD,GACA,CAAC,CACL,EACA,OAAO,IAAIX,EAAgBD,CAAQ,CACvC,CAaA,eAAsBa,EAClBC,EACAC,EACAf,EACqB,CACrB,GAAI,CAOA,MAAO,CANW,MAAMe,EAAW,cAAcD,EAAU,CACvD,WAAY,GACZ,SAAUd,GAAYM,EAAiB,EACvC,aAAc,EAClB,CAAC,EAEkB,IAAI,CAC3B,OAASU,EAAK,CACV,OAAIA,aAAed,EAAI,gBACZ,CAAC,KAAMQ,EAAgBM,CAAG,CAAC,EAGlCA,aAAe,MACR,CAAC,KAAMA,CAAG,EAGd,CAAC,KAAM,IAAI,MAAM,kCAAkC,CAAC,CAC/D,CACJ,CAEO,SAASC,EAAgBC,EAAqD,CACjF,OAAOhB,EAAI,OAAUgB,CAAM,CAC/B,CAEO,SAASC,EACZD,EACAE,EACmB,CACnB,OAAOF,EAAO,OAAUE,CAAO,CACnC,CF9EA,SAASC,EAAeL,EAA6B,CACjD,MAAO,CACH,MAAOA,EAAI,MACX,QAASA,EAAI,QACb,KAAMA,EAAI,KACV,MAAOA,EAAI,KACf,CACJ,CAcA,SAASM,EACLC,EACkC,CAClC,MAAO,EAAQ,OAAO,UAAU,eAAe,KAAKA,EAAM,IAAI,CAClE,CASA,eAAsBC,EAClBD,EACwD,CACxD,IAAIE,EAAO,CAAE,GAAGF,EAAK,QAAS,EAE9B,GAAIA,EAAK,QAAS,CACd,GAAM,CAACG,EAAWC,CAAe,EAAI,MAAMd,EAAkBU,EAAK,SAAUA,EAAK,OAAO,EAExF,GAAII,IAAoB,KACpB,OAAIA,aAA2B1B,GAC3BsB,EAAK,oBAAoBI,CAAe,EAGrC,CAAC,KAAMN,EAAeM,CAAe,CAAC,EAGjDF,EAAOC,CACX,CAEA,GAAI,CAACJ,EAAMC,CAAI,EAEX,aAAMA,EAAK,YAAYE,CAAI,EAcpB,CAACA,EAAM,IAAI,EAGtB,IAAIG,EAA2B,KAsB/B,GAnBAA,EAAQ,MAAML,EAAK,GAAGE,CAAI,EAmBtB,CAACG,EACD,MAAM,IAAI,MAAM,UAAU,EAU9B,aAAML,EAAK,YAAYK,CAAK,EAcrB,CAACA,EAAO,IAAI,CACvB,CAEA,eAAsBC,EAClBN,EACyC,CACzC,GAAM,CAACO,EAAUnB,CAAK,EAAI,MAAMa,EAAiBD,CAAI,EAErD,GAAIZ,IAAU,KAAM,CAChB,GAAIA,EAAM,OAAS,kBACf,GAAI,CACA,IAAMoB,EAAS,KAAK,MAAMpB,EAAM,OAAO,EACvC,MAAO,CAAC,KAAMb,EAAa,KAAKiC,EAAQ,CAAE,OAAQ,GAAI,CAAC,CAAC,CAC5D,MAAc,CACV,MAAO,CACH,KACAjC,EAAa,KAAK,CAAE,QAAS,0BAA2B,EAAG,CAAE,OAAQ,GAAI,CAAC,CAC9E,CACJ,CAEJ,MAAO,CAAC,KAAMA,EAAa,KAAK,CAAE,QAASa,EAAM,OAAQ,EAAG,CAAE,OAAQ,GAAI,CAAC,CAAC,CAChF,CAEA,MAAO,CAACmB,EAAU,IAAI,CAC1B,CIpJA,IAAME,EAAgB,CAAC,YAAa,aAAc,WAAW,EAS7D,eAAsBC,EAClBC,EACAC,EACwB,CACxB,OAAKD,EAICA,aAAiB,MAIjBC,GAAQ,OAASH,GAAe,SAASE,EAAM,IAAI,EAIrDA,EAAM,MAAQC,GAAQ,SAAW,SAC1B,QAAQ,QAAQ,CAAC,KAAM,IAAI,MAAM,iBAAiB,CAAC,CAAC,EAGxD,QAAQ,QAAQ,CAACD,EAAO,IAAI,CAAC,EAPzB,QAAQ,QAAQ,CAAC,KAAM,IAAI,MAAM,sBAAsB,CAAC,CAAC,EAJzD,QAAQ,QAAQ,CAAC,KAAM,IAAI,MAAM,iBAAiB,CAAC,CAAC,EAJpD,QAAQ,QAAQ,CAAC,KAAM,IAAI,MAAM,iBAAiB,CAAC,CAAC,CAgBnE","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 type { Errorable } from '@sqrzro/interfaces';
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
- export declare function getList<T>({ allowedFilters, fn, searchParams, }: GetListArgs<T>): Promise<Errorable<T[]>>;
16
- export {};
16
+ declare function getList<T>({ allowedFilters, fn, searchParams, }: GetListArgs<T>): Promise<Errorable<T[]>>;
17
+
18
+ export { getList };
@@ -1 +1,18 @@
1
- export * from './ListService';
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 };
@@ -1 +1,7 @@
1
- export * from './ListService';
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