@warlock.js/auth 4.0.162 → 4.0.163

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 (67) hide show
  1. package/esm/index.d.ts +8 -0
  2. package/esm/index.d.ts.map +1 -0
  3. package/esm/index.js +1 -0
  4. package/esm/index.js.map +1 -0
  5. package/esm/middleware/auth.middleware.d.ts +2 -0
  6. package/esm/middleware/auth.middleware.d.ts.map +1 -0
  7. package/esm/middleware/auth.middleware.js +72 -0
  8. package/esm/middleware/auth.middleware.js.map +1 -0
  9. package/esm/middleware/index.d.ts +2 -0
  10. package/esm/middleware/index.d.ts.map +1 -0
  11. package/esm/models/access-token/access-token.model.d.ts +9 -0
  12. package/esm/models/access-token/access-token.model.d.ts.map +1 -0
  13. package/esm/models/access-token/access-token.model.js +14 -0
  14. package/esm/models/access-token/access-token.model.js.map +1 -0
  15. package/esm/models/access-token/index.d.ts +2 -0
  16. package/esm/models/access-token/index.d.ts.map +1 -0
  17. package/esm/models/access-token/migration.d.ts +2 -0
  18. package/esm/models/access-token/migration.d.ts.map +1 -0
  19. package/esm/models/access-token/migration.js +22 -0
  20. package/esm/models/access-token/migration.js.map +1 -0
  21. package/esm/models/auth.model.d.ts +58 -0
  22. package/esm/models/auth.model.d.ts.map +1 -0
  23. package/esm/models/auth.model.js +68 -0
  24. package/esm/models/auth.model.js.map +1 -0
  25. package/esm/models/index.d.ts +5 -0
  26. package/esm/models/index.d.ts.map +1 -0
  27. package/esm/models/index.js +1 -0
  28. package/esm/models/index.js.map +1 -0
  29. package/esm/models/refresh-token/index.d.ts +2 -0
  30. package/esm/models/refresh-token/index.d.ts.map +1 -0
  31. package/esm/models/refresh-token/migration.d.ts +2 -0
  32. package/esm/models/refresh-token/migration.d.ts.map +1 -0
  33. package/esm/models/refresh-token/migration.js +23 -0
  34. package/esm/models/refresh-token/migration.js.map +1 -0
  35. package/esm/models/refresh-token/refresh-token.model.d.ts +32 -0
  36. package/esm/models/refresh-token/refresh-token.model.d.ts.map +1 -0
  37. package/esm/models/refresh-token/refresh-token.model.js +53 -0
  38. package/esm/models/refresh-token/refresh-token.model.js.map +1 -0
  39. package/esm/services/auth-events.d.ts +85 -0
  40. package/esm/services/auth-events.d.ts.map +1 -0
  41. package/esm/services/auth-events.js +65 -0
  42. package/esm/services/auth-events.js.map +1 -0
  43. package/esm/services/auth.service.d.ts +92 -0
  44. package/esm/services/auth.service.d.ts.map +1 -0
  45. package/esm/services/auth.service.js +322 -0
  46. package/esm/services/auth.service.js.map +1 -0
  47. package/esm/services/generate-jwt-secret.d.ts +2 -0
  48. package/esm/services/generate-jwt-secret.d.ts.map +1 -0
  49. package/esm/services/generate-jwt-secret.js +47 -0
  50. package/esm/services/generate-jwt-secret.js.map +1 -0
  51. package/esm/services/index.d.ts +5 -0
  52. package/esm/services/index.d.ts.map +1 -0
  53. package/esm/services/jwt.d.ts +23 -0
  54. package/esm/services/jwt.d.ts.map +1 -0
  55. package/esm/services/jwt.js +40 -0
  56. package/esm/services/jwt.js.map +1 -0
  57. package/esm/utils/auth-error-codes.d.ts +18 -0
  58. package/esm/utils/auth-error-codes.d.ts.map +1 -0
  59. package/esm/utils/auth-error-codes.js +18 -0
  60. package/esm/utils/auth-error-codes.js.map +1 -0
  61. package/esm/utils/duration.d.ts +45 -0
  62. package/esm/utils/duration.d.ts.map +1 -0
  63. package/esm/utils/duration.js +93 -0
  64. package/esm/utils/duration.js.map +1 -0
  65. package/esm/utils/index.d.ts +3 -0
  66. package/esm/utils/index.d.ts.map +1 -0
  67. package/package.json +5 -5
package/esm/index.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ export * from "./commands/auth-cleanup-command";
2
+ export * from "./commands/jwt-secret-generator-command";
3
+ export * from "./contracts";
4
+ export * from "./middleware";
5
+ export * from "./models";
6
+ export * from "./services";
7
+ export * from "./utils";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAC;AAChD,cAAc,yCAAyC,CAAC;AACxD,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
package/esm/index.js ADDED
@@ -0,0 +1 @@
1
+ export{registerAuthCleanupCommand}from'./commands/auth-cleanup-command.js';export{registerJWTSecretGeneratorCommand}from'./commands/jwt-secret-generator-command.js';export{NO_EXPIRATION}from'./contracts/types.js';export{authMiddleware}from'./middleware/auth.middleware.js';export{authMigrations}from'./models/index.js';export{authEvents}from'./services/auth-events.js';export{authService}from'./services/auth.service.js';export{generateJWTSecret}from'./services/generate-jwt-secret.js';export{jwt}from'./services/jwt.js';export{AuthErrorCodes}from'./utils/auth-error-codes.js';export{parseExpirationToMs,toJwtExpiresIn}from'./utils/duration.js';export{AccessToken}from'./models/access-token/access-token.model.js';export{Auth}from'./models/auth.model.js';export{RefreshToken}from'./models/refresh-token/refresh-token.model.js';//# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare function authMiddleware(allowedUserType?: string | string[]): Middleware;
2
+ //# sourceMappingURL=auth.middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.middleware.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.middleware.ts"],"names":[],"mappings":"AAMA,wBAAgB,cAAc,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,cAsFjE"}
@@ -0,0 +1,72 @@
1
+ import {t,config}from'@warlock.js/core';import {log}from'@warlock.js/logger';import {AccessToken}from'../models/access-token/access-token.model.js';import {jwt}from'../services/jwt.js';import {AuthErrorCodes}from'../utils/auth-error-codes.js';function authMiddleware(allowedUserType) {
2
+ const allowedTypes = !allowedUserType
3
+ ? []
4
+ : Array.isArray(allowedUserType)
5
+ ? allowedUserType
6
+ : [allowedUserType];
7
+ const auth = async (request, response) => {
8
+ try {
9
+ const authorizationValue = request.authorizationValue;
10
+ if (!allowedTypes.length && !authorizationValue)
11
+ return;
12
+ if (!authorizationValue) {
13
+ return response.unauthorized({
14
+ error: t("auth.errors.missingAccessToken"),
15
+ errorCode: AuthErrorCodes.MissingAccessToken,
16
+ });
17
+ }
18
+ // get current user jwt
19
+ const user = await jwt.verify(authorizationValue);
20
+ // store decoded access token object in request object
21
+ request.decodedAccessToken = user;
22
+ // use our own jwt verify to verify the token
23
+ const accessToken = await AccessToken.first({
24
+ token: authorizationValue,
25
+ });
26
+ if (!accessToken) {
27
+ return response.unauthorized({
28
+ error: t("auth.errors.invalidAccessToken"),
29
+ errorCode: AuthErrorCodes.InvalidAccessToken,
30
+ });
31
+ }
32
+ // now, we need to get an instance of user using its corresponding model
33
+ const userType = user.userType || accessToken.get("userType");
34
+ // check if the user type is allowed
35
+ if (allowedTypes.length && !allowedTypes.includes(userType)) {
36
+ return response.unauthorized({
37
+ error: t("auth.errors.unauthorized"),
38
+ errorCode: AuthErrorCodes.Unauthorized,
39
+ });
40
+ }
41
+ // get user model class
42
+ const UserModel = config.key(`auth.userType.${userType}`);
43
+ if (!UserModel) {
44
+ throw new Error(`User type ${userType} is unknown type.`);
45
+ }
46
+ // get user model instance
47
+ const currentUser = await UserModel.find(user.id);
48
+ if (!currentUser) {
49
+ accessToken.destroy();
50
+ return response.unauthorized({
51
+ error: t("auth.errors.invalidAccessToken"),
52
+ errorCode: AuthErrorCodes.InvalidAccessToken,
53
+ });
54
+ }
55
+ // update last access
56
+ // accessToken.set("lastAccess", new Date());
57
+ // await accessToken.save({ skipEvents: true });
58
+ // set current user
59
+ request.user = currentUser;
60
+ }
61
+ catch (err) {
62
+ log.error("http", "auth", err);
63
+ // unset current user
64
+ request.clearCurrentUser();
65
+ return response.unauthorized({
66
+ error: t("auth.errors.invalidAccessToken"),
67
+ errorCode: AuthErrorCodes.InvalidAccessToken,
68
+ });
69
+ }
70
+ };
71
+ return auth;
72
+ }export{authMiddleware};//# sourceMappingURL=auth.middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.middleware.js","sources":["../../src/middleware/auth.middleware.ts"],"sourcesContent":[null],"names":[],"mappings":"mPAMM,SAAU,cAAc,CAAC,eAAmC,EAAA;IAChE,MAAM,YAAY,GAAG,CAAC,eAAe;AACnC,UAAE,EAAE;AACJ,UAAE,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC;AAC9B,cAAE,eAAe;AACjB,cAAE,CAAC,eAAe,CAAC,CAAC;IAExB,MAAM,IAAI,GAAe,OAAO,OAAgB,EAAE,QAAkB,KAAI;QACtE,IAAI;AACF,YAAA,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;AAEtD,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,kBAAkB;gBAAE,OAAO;YAExD,IAAI,CAAC,kBAAkB,EAAE;gBACvB,OAAO,QAAQ,CAAC,YAAY,CAAC;AAC3B,oBAAA,KAAK,EAAE,CAAC,CAAC,gCAAgC,CAAC;oBAC1C,SAAS,EAAE,cAAc,CAAC,kBAAkB;AAC7C,iBAAA,CAAC,CAAC;AACJ,aAAA;;YAGD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;;AAGlD,YAAA,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;;AAElC,YAAA,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC;AAC1C,gBAAA,KAAK,EAAE,kBAAkB;AAC1B,aAAA,CAAC,CAAC;YAEH,IAAI,CAAC,WAAW,EAAE;gBAChB,OAAO,QAAQ,CAAC,YAAY,CAAC;AAC3B,oBAAA,KAAK,EAAE,CAAC,CAAC,gCAAgC,CAAC;oBAC1C,SAAS,EAAE,cAAc,CAAC,kBAAkB;AAC7C,iBAAA,CAAC,CAAC;AACJ,aAAA;;AAGD,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;;YAG9D,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;gBAC3D,OAAO,QAAQ,CAAC,YAAY,CAAC;AAC3B,oBAAA,KAAK,EAAE,CAAC,CAAC,0BAA0B,CAAC;oBACpC,SAAS,EAAE,cAAc,CAAC,YAAY;AACvC,iBAAA,CAAC,CAAC;AACJ,aAAA;;YAGD,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAiB,cAAA,EAAA,QAAQ,CAAE,CAAA,CAAC,CAAC;YAE1D,IAAI,CAAC,SAAS,EAAE;AACd,gBAAA,MAAM,IAAI,KAAK,CAAC,aAAa,QAAQ,CAAA,iBAAA,CAAmB,CAAC,CAAC;AAC3D,aAAA;;YAGD,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAElD,IAAI,CAAC,WAAW,EAAE;gBAChB,WAAW,CAAC,OAAO,EAAE,CAAC;gBACtB,OAAO,QAAQ,CAAC,YAAY,CAAC;AAC3B,oBAAA,KAAK,EAAE,CAAC,CAAC,gCAAgC,CAAC;oBAC1C,SAAS,EAAE,cAAc,CAAC,kBAAkB;AAC7C,iBAAA,CAAC,CAAC;AACJ,aAAA;;;;;AAOD,YAAA,OAAO,CAAC,IAAI,GAAG,WAAW,CAAC;AAC5B,SAAA;AAAC,QAAA,OAAO,GAAQ,EAAE;YACjB,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;;YAG/B,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAE3B,OAAO,QAAQ,CAAC,YAAY,CAAC;AAC3B,gBAAA,KAAK,EAAE,CAAC,CAAC,gCAAgC,CAAC;gBAC1C,SAAS,EAAE,cAAc,CAAC,kBAAkB;AAC7C,aAAA,CAAC,CAAC;AACJ,SAAA;AACH,KAAC,CAAC;AAEF,IAAA,OAAO,IAAI,CAAC;AACd"}
@@ -0,0 +1,2 @@
1
+ export * from "./auth.middleware";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Model } from "@warlock.js/cascade";
2
+ export declare class AccessToken extends Model {
3
+ /**
4
+ * {@inheritDoc}
5
+ */
6
+ static table: string;
7
+ static schema: any;
8
+ }
9
+ //# sourceMappingURL=access-token.model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-token.model.d.ts","sourceRoot":"","sources":["../../../src/models/access-token/access-token.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAW5C,qBAAa,WAAY,SAAQ,KAAK;IACpC;;OAEG;IACH,OAAc,KAAK,SAAmB;IAEtC,OAAc,MAAM,MAAqB;CAC1C"}
@@ -0,0 +1,14 @@
1
+ import {Model}from'@warlock.js/cascade';import {v}from'@warlock.js/seal';const accessTokenSchema = v.object({
2
+ token: v.string().required(),
3
+ last_access: v.date().defaultNow().optional(),
4
+ user_id: v.scalar().required(),
5
+ user_type: v.string().required(),
6
+ is_active: v.boolean().default(true),
7
+ });
8
+ class AccessToken extends Model {
9
+ /**
10
+ * {@inheritDoc}
11
+ */
12
+ static table = "access_tokens";
13
+ static schema = accessTokenSchema;
14
+ }export{AccessToken};//# sourceMappingURL=access-token.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-token.model.js","sources":["../../../src/models/access-token/access-token.model.ts"],"sourcesContent":[null],"names":[],"mappings":"yEAGA,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;AACjC,IAAA,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE;AAC7C,IAAA,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;AAC9B,IAAA,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;AACrC,CAAA,CAAC,CAAC;AAEG,MAAO,WAAY,SAAQ,KAAK,CAAA;AACpC;;AAEG;AACI,IAAA,OAAO,KAAK,GAAG,eAAe,CAAC;AAE/B,IAAA,OAAO,MAAM,GAAG,iBAAiB,CAAC;"}
@@ -0,0 +1,2 @@
1
+ export * from "./access-token.model";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/models/access-token/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const AccessTokenMigration: any;
2
+ //# sourceMappingURL=migration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../../src/models/access-token/migration.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,oBAAoB,KA0B/B,CAAC"}
@@ -0,0 +1,22 @@
1
+ import {migrate}from'@warlock.js/cascade';import {AccessToken}from'./access-token.model.js';const AccessTokenMigration = migrate(AccessToken, {
2
+ name: "accessToken",
3
+ up() {
4
+ // Create table
5
+ this.createTableIfNotExists();
6
+ // Primary key
7
+ this.primaryUuid();
8
+ // Token field
9
+ this.text("token").unique();
10
+ this.timestamp("last_access").nullable();
11
+ // User reference (flat columns for cross-driver compatibility)
12
+ this.uuid("user_id").index();
13
+ this.string("user_type", 50).nullable();
14
+ // Status (for token revocation)
15
+ this.boolean("is_active").nullable();
16
+ // Timestamps
17
+ this.timestamps();
18
+ },
19
+ down() {
20
+ this.dropTableIfExists();
21
+ },
22
+ });export{AccessTokenMigration};//# sourceMappingURL=migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.js","sources":["../../../src/models/access-token/migration.ts"],"sourcesContent":[null],"names":[],"mappings":"4FAGa,MAAA,oBAAoB,GAAG,OAAO,CAAC,WAAW,EAAE;AACvD,IAAA,IAAI,EAAE,aAAa;IACnB,EAAE,GAAA;;QAEA,IAAI,CAAC,sBAAsB,EAAE,CAAC;;QAG9B,IAAI,CAAC,WAAW,EAAE,CAAC;;QAGnB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;QAC5B,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE,CAAC;;QAGzC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;;QAGxC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;;QAGrC,IAAI,CAAC,UAAU,EAAE,CAAC;KACnB;IACD,IAAI,GAAA;QACF,IAAI,CAAC,iBAAiB,EAAE,CAAC;KAC1B;AACF,CAAA"}
@@ -0,0 +1,58 @@
1
+ import { type ChildModel, Model, type ModelSchema } from "@warlock.js/cascade";
2
+ import type { AccessTokenOutput, DeviceInfo, TokenPair } from "../contracts/types";
3
+ import type { RefreshToken } from "./refresh-token/refresh-token.model";
4
+ export declare abstract class Auth<Schema extends ModelSchema = ModelSchema> extends Model<Schema> {
5
+ /**
6
+ * Get user type
7
+ */
8
+ abstract get userType(): string;
9
+ /**
10
+ * Get access token payload
11
+ */
12
+ accessTokenPayload(): {
13
+ id: any;
14
+ userType: string;
15
+ created_at: number;
16
+ };
17
+ /**
18
+ * Create both access and refresh tokens
19
+ */
20
+ createTokenPair(deviceInfo?: DeviceInfo): Promise<TokenPair>;
21
+ /**
22
+ * Generate access token
23
+ */
24
+ generateAccessToken(data?: any): Promise<AccessTokenOutput>;
25
+ /**
26
+ * Generate refresh token
27
+ */
28
+ generateRefreshToken(deviceInfo?: DeviceInfo): Promise<RefreshToken>;
29
+ /**
30
+ * Remove current access token
31
+ */
32
+ removeAccessToken(token: string): Promise<void>;
33
+ /**
34
+ * Remove refresh token
35
+ */
36
+ removeRefreshToken(token: string): Promise<void>;
37
+ /**
38
+ * Remove all access tokens
39
+ */
40
+ removeAllAccessTokens(): Promise<void>;
41
+ /**
42
+ * Revoke all tokens (logout from all devices)
43
+ */
44
+ revokeAllTokens(): Promise<void>;
45
+ /**
46
+ * Get active sessions
47
+ */
48
+ activeSessions(): Promise<RefreshToken[]>;
49
+ /**
50
+ * Attempt to login the user
51
+ */
52
+ static attempt(this: ChildModel<Auth>, data: any): Promise<Auth | null>;
53
+ /**
54
+ * Confirm password
55
+ */
56
+ confirmPassword(password: string): Promise<boolean>;
57
+ }
58
+ //# sourceMappingURL=auth.model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.model.d.ts","sourceRoot":"","sources":["../../src/models/auth.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEnF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAExE,8BAAsB,IAAI,CAAC,MAAM,SAAS,WAAW,GAAG,WAAW,CAAE,SAAQ,KAAK,CAAC,MAAM,CAAC;IACxF;;OAEG;IACH,aAAoB,QAAQ,IAAI,MAAM,CAAC;IAEvC;;OAEG;IACI,kBAAkB;;;;;IAIzB;;OAEG;IACU,eAAe,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;IAIzE;;OAEG;IACU,mBAAmB,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIxE;;OAEG;IACU,oBAAoB,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IAIjF;;OAEG;IACU,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5D;;OAEG;IACU,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D;;OAEG;IACU,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAInD;;OAEG;IACU,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7C;;OAEG;IACU,cAAc,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAItD;;OAEG;WACiB,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAIpF;;OAEG;IACU,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAGjE"}
@@ -0,0 +1,68 @@
1
+ import {Model}from'@warlock.js/cascade';import'@mongez/events';import {authService}from'../services/auth.service.js';import'@mongez/fs';import'@mongez/reinforcements';import'@warlock.js/core';import'@warlock.js/logger';import'fast-jwt';class Auth extends Model {
2
+ /**
3
+ * Get access token payload
4
+ */
5
+ accessTokenPayload() {
6
+ return authService.buildAccessTokenPayload(this);
7
+ }
8
+ /**
9
+ * Create both access and refresh tokens
10
+ */
11
+ async createTokenPair(deviceInfo) {
12
+ return authService.createTokenPair(this, deviceInfo);
13
+ }
14
+ /**
15
+ * Generate access token
16
+ */
17
+ async generateAccessToken(data) {
18
+ return authService.generateAccessToken(this, data);
19
+ }
20
+ /**
21
+ * Generate refresh token
22
+ */
23
+ async generateRefreshToken(deviceInfo) {
24
+ return authService.createRefreshToken(this, deviceInfo);
25
+ }
26
+ /**
27
+ * Remove current access token
28
+ */
29
+ async removeAccessToken(token) {
30
+ return authService.removeAccessToken(this, token);
31
+ }
32
+ /**
33
+ * Remove refresh token
34
+ */
35
+ async removeRefreshToken(token) {
36
+ return authService.removeRefreshToken(this, token);
37
+ }
38
+ /**
39
+ * Remove all access tokens
40
+ */
41
+ async removeAllAccessTokens() {
42
+ return authService.removeAllAccessTokens(this);
43
+ }
44
+ /**
45
+ * Revoke all tokens (logout from all devices)
46
+ */
47
+ async revokeAllTokens() {
48
+ return authService.revokeAllTokens(this);
49
+ }
50
+ /**
51
+ * Get active sessions
52
+ */
53
+ async activeSessions() {
54
+ return authService.getActiveSessions(this);
55
+ }
56
+ /**
57
+ * Attempt to login the user
58
+ */
59
+ static async attempt(data) {
60
+ return authService.attemptLogin(this, data);
61
+ }
62
+ /**
63
+ * Confirm password
64
+ */
65
+ async confirmPassword(password) {
66
+ return authService.verifyPassword(this.string("password"), password);
67
+ }
68
+ }export{Auth};//# sourceMappingURL=auth.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.model.js","sources":["../../src/models/auth.model.ts"],"sourcesContent":[null],"names":[],"mappings":"4OAKM,MAAgB,IAA+C,SAAQ,KAAa,CAAA;AAMxF;;AAEG;IACI,kBAAkB,GAAA;AACvB,QAAA,OAAO,WAAW,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;KAClD;AAED;;AAEG;IACI,MAAM,eAAe,CAAC,UAAuB,EAAA;QAClD,OAAO,WAAW,CAAC,eAAe,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;KACtD;AAED;;AAEG;IACI,MAAM,mBAAmB,CAAC,IAAU,EAAA;QACzC,OAAO,WAAW,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;KACpD;AAED;;AAEG;IACI,MAAM,oBAAoB,CAAC,UAAuB,EAAA;QACvD,OAAO,WAAW,CAAC,kBAAkB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;KACzD;AAED;;AAEG;IACI,MAAM,iBAAiB,CAAC,KAAa,EAAA;QAC1C,OAAO,WAAW,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;KACnD;AAED;;AAEG;IACI,MAAM,kBAAkB,CAAC,KAAa,EAAA;QAC3C,OAAO,WAAW,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;KACpD;AAED;;AAEG;AACI,IAAA,MAAM,qBAAqB,GAAA;AAChC,QAAA,OAAO,WAAW,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;KAChD;AAED;;AAEG;AACI,IAAA,MAAM,eAAe,GAAA;AAC1B,QAAA,OAAO,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;KAC1C;AAED;;AAEG;AACI,IAAA,MAAM,cAAc,GAAA;AACzB,QAAA,OAAO,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;KAC5C;AAED;;AAEG;AACI,IAAA,aAAa,OAAO,CAAyB,IAAS,EAAA;QAC3D,OAAO,WAAW,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;KAC7C;AAED;;AAEG;IACI,MAAM,eAAe,CAAC,QAAgB,EAAA;AAC3C,QAAA,OAAO,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAE,EAAE,QAAQ,CAAC,CAAC;KACvE;AACF"}
@@ -0,0 +1,5 @@
1
+ export * from "./access-token";
2
+ export * from "./auth.model";
3
+ export * from "./refresh-token";
4
+ export declare const authMigrations: any[];
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAGA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAEhC,eAAO,MAAM,cAAc,OAAgD,CAAC"}
@@ -0,0 +1 @@
1
+ import {AccessTokenMigration}from'./access-token/migration.js';import {RefreshTokenMigration}from'./refresh-token/migration.js';export{AccessToken}from'./access-token/access-token.model.js';import'@warlock.js/cascade';import'@mongez/events';import'@mongez/reinforcements';import'@warlock.js/core';export{RefreshToken}from'./refresh-token/refresh-token.model.js';import'fast-jwt';import'@mongez/fs';import'@warlock.js/logger';const authMigrations = [AccessTokenMigration, RefreshTokenMigration];export{authMigrations};//# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/models/index.ts"],"sourcesContent":[null],"names":[],"mappings":"+aAOa,cAAc,GAAG,CAAC,oBAAoB,EAAE,qBAAqB"}
@@ -0,0 +1,2 @@
1
+ export * from "./refresh-token.model";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/models/refresh-token/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const RefreshTokenMigration: any;
2
+ //# sourceMappingURL=migration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../../src/models/refresh-token/migration.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,qBAAqB,KAyBhC,CAAC"}
@@ -0,0 +1,23 @@
1
+ import {migrate}from'@warlock.js/cascade';import {RefreshToken}from'./refresh-token.model.js';const RefreshTokenMigration = migrate(RefreshToken, {
2
+ name: "refreshToken",
3
+ up() {
4
+ // Create table
5
+ this.createTableIfNotExists();
6
+ // Primary key
7
+ this.primaryUuid();
8
+ // Token fields
9
+ this.text("token").unique();
10
+ this.uuid("user_id").index();
11
+ this.string("user_type", 50).nullable();
12
+ this.text("family_id").index().nullable();
13
+ this.timestamp("expires_at").index().nullable();
14
+ this.timestamp("last_used_at").nullable();
15
+ this.timestamp("revoked_at").nullable();
16
+ this.json("device_info").nullable();
17
+ // Timestamps
18
+ this.timestamps();
19
+ },
20
+ down() {
21
+ this.dropTableIfExists();
22
+ },
23
+ });export{RefreshTokenMigration};//# sourceMappingURL=migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.js","sources":["../../../src/models/refresh-token/migration.ts"],"sourcesContent":[null],"names":[],"mappings":"8FAGa,MAAA,qBAAqB,GAAG,OAAO,CAAC,YAAY,EAAE;AACzD,IAAA,IAAI,EAAE,cAAc;IACpB,EAAE,GAAA;;QAEA,IAAI,CAAC,sBAAsB,EAAE,CAAC;;QAG9B,IAAI,CAAC,WAAW,EAAE,CAAC;;QAGnB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC;QAC1C,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC;QAChD,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC1C,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE,CAAC;;QAGpC,IAAI,CAAC,UAAU,EAAE,CAAC;KACnB;IACD,IAAI,GAAA;QACF,IAAI,CAAC,iBAAiB,EAAE,CAAC;KAC1B;AACF,CAAA"}
@@ -0,0 +1,32 @@
1
+ import { Model } from "@warlock.js/cascade";
2
+ export declare class RefreshToken extends Model {
3
+ /**
4
+ * {@inheritDoc}
5
+ */
6
+ static table: string;
7
+ /**
8
+ * {@inheritDoc}
9
+ */
10
+ static schema: any;
11
+ /**
12
+ * Check if token is expired
13
+ */
14
+ get isExpired(): boolean;
15
+ /**
16
+ * Check if token is revoked
17
+ */
18
+ get isRevoked(): boolean;
19
+ /**
20
+ * Check if token is valid (not expired and not revoked)
21
+ */
22
+ get isValid(): boolean;
23
+ /**
24
+ * Revoke this token
25
+ */
26
+ revoke(): Promise<this>;
27
+ /**
28
+ * Mark token as used (update last_used_at)
29
+ */
30
+ markAsUsed(): Promise<void>;
31
+ }
32
+ //# sourceMappingURL=refresh-token.model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-token.model.d.ts","sourceRoot":"","sources":["../../../src/models/refresh-token/refresh-token.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAc5C,qBAAa,YAAa,SAAQ,KAAK;IACrC;;OAEG;IACH,OAAc,KAAK,SAAoB;IAEvC;;OAEG;IACH,OAAc,MAAM,MAAsB;IAE1C;;OAEG;IACH,IAAW,SAAS,IAAI,OAAO,CAI9B;IAED;;OAEG;IACH,IAAW,SAAS,IAAI,OAAO,CAE9B;IAED;;OAEG;IACH,IAAW,OAAO,IAAI,OAAO,CAE5B;IAED;;OAEG;IACU,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC;;OAEG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAGzC"}
@@ -0,0 +1,53 @@
1
+ import {Model}from'@warlock.js/cascade';import {v}from'@warlock.js/seal';const refreshTokenSchema = v.object({
2
+ token: v.string().required(),
3
+ user_id: v.scalar().required(),
4
+ user_type: v.string().required(),
5
+ family_id: v.string().required(),
6
+ expires_at: v.date().required(),
7
+ last_used_at: v.date().default(() => new Date()),
8
+ revoked_at: v.date().optional(),
9
+ device_info: v.record(v.any()).optional(),
10
+ });
11
+ class RefreshToken extends Model {
12
+ /**
13
+ * {@inheritDoc}
14
+ */
15
+ static table = "refresh_tokens";
16
+ /**
17
+ * {@inheritDoc}
18
+ */
19
+ static schema = refreshTokenSchema;
20
+ /**
21
+ * Check if token is expired
22
+ */
23
+ get isExpired() {
24
+ const expiresAt = this.get("expires_at");
25
+ if (!expiresAt)
26
+ return false;
27
+ return new Date() > new Date(expiresAt);
28
+ }
29
+ /**
30
+ * Check if token is revoked
31
+ */
32
+ get isRevoked() {
33
+ return !!this.get("revoked_at");
34
+ }
35
+ /**
36
+ * Check if token is valid (not expired and not revoked)
37
+ */
38
+ get isValid() {
39
+ return !this.isExpired && !this.isRevoked;
40
+ }
41
+ /**
42
+ * Revoke this token
43
+ */
44
+ async revoke() {
45
+ return this.merge({ revoked_at: new Date() }).save();
46
+ }
47
+ /**
48
+ * Mark token as used (update last_used_at)
49
+ */
50
+ async markAsUsed() {
51
+ await this.merge({ last_used_at: new Date() }).save();
52
+ }
53
+ }export{RefreshToken};//# sourceMappingURL=refresh-token.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-token.model.js","sources":["../../../src/models/refresh-token/refresh-token.model.ts"],"sourcesContent":[null],"names":[],"mappings":"yEAGA,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;AAClC,IAAA,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;AAC5B,IAAA,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;AAC9B,IAAA,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;AAChC,IAAA,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;AAChC,IAAA,UAAU,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;AAC/B,IAAA,YAAY,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;AAChD,IAAA,UAAU,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;AAC/B,IAAA,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;AAC1C,CAAA,CAAC,CAAC;AAEG,MAAO,YAAa,SAAQ,KAAK,CAAA;AACrC;;AAEG;AACI,IAAA,OAAO,KAAK,GAAG,gBAAgB,CAAC;AAEvC;;AAEG;AACI,IAAA,OAAO,MAAM,GAAG,kBAAkB,CAAC;AAE1C;;AAEG;AACH,IAAA,IAAW,SAAS,GAAA;QAClB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,KAAK,CAAC;QAC7B,OAAO,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;KACzC;AAED;;AAEG;AACH,IAAA,IAAW,SAAS,GAAA;QAClB,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;KACjC;AAED;;AAEG;AACH,IAAA,IAAW,OAAO,GAAA;QAChB,OAAO,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;KAC3C;AAED;;AAEG;AACI,IAAA,MAAM,MAAM,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;KACtD;AAED;;AAEG;AACI,IAAA,MAAM,UAAU,GAAA;AACrB,QAAA,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;KACvD;"}
@@ -0,0 +1,85 @@
1
+ import { type EventSubscription } from "@mongez/events";
2
+ import type { DeviceInfo, TokenPair } from "../contracts/types";
3
+ import type { Auth } from "../models/auth.model";
4
+ import type { RefreshToken } from "../models/refresh-token";
5
+ /**
6
+ * Auth event payload types
7
+ */
8
+ export type AuthEventPayloads = {
9
+ "login.success": [user: Auth, tokenPair: TokenPair, deviceInfo?: DeviceInfo];
10
+ "login.failed": [credentials: {
11
+ email?: string;
12
+ username?: string;
13
+ }, reason: string];
14
+ "login.attempt": [credentials: {
15
+ email?: string;
16
+ username?: string;
17
+ }];
18
+ logout: [user: Auth];
19
+ "logout.all": [user: Auth];
20
+ "logout.failsafe": [user: Auth];
21
+ "token.created": [user: Auth, tokenPair: TokenPair];
22
+ "token.refreshed": [user: Auth, newTokenPair: TokenPair, oldRefreshToken: RefreshToken];
23
+ "token.revoked": [user: Auth, token: RefreshToken];
24
+ "token.expired": [token: RefreshToken];
25
+ "token.familyRevoked": [familyId: string, tokens: RefreshToken[]];
26
+ "password.changed": [user: Auth];
27
+ "password.resetRequested": [user: Auth, resetToken: string];
28
+ "password.reset": [user: Auth];
29
+ "session.created": [user: Auth, refreshToken: RefreshToken, deviceInfo?: DeviceInfo];
30
+ "session.destroyed": [user: Auth, refreshToken: RefreshToken];
31
+ "cleanup.completed": [expiredCount: number];
32
+ };
33
+ /**
34
+ * Auth event names
35
+ */
36
+ export type AuthEventName = keyof AuthEventPayloads;
37
+ /**
38
+ * Callback type for a specific event
39
+ */
40
+ export type AuthEventCallback<T extends AuthEventName> = (...args: AuthEventPayloads[T]) => void | Promise<void>;
41
+ /**
42
+ * Type-safe auth events manager
43
+ *
44
+ * @example
45
+ * ```typescript
46
+ * // Subscribe to events with full autocomplete
47
+ * authEvents.on("login.success", (user, tokenPair, deviceInfo) => {
48
+ * console.log(`User ${user.id} logged in`);
49
+ * });
50
+ *
51
+ * authEvents.on("token.refreshed", (user, newPair, oldToken) => {
52
+ * console.log(`Token refreshed for user ${user.id}`);
53
+ * });
54
+ *
55
+ * // Trigger events
56
+ * authEvents.emit("login.success", user, tokenPair, deviceInfo);
57
+ * ```
58
+ */
59
+ export declare const authEvents: {
60
+ /**
61
+ * Subscribe to an auth event
62
+ */
63
+ on<T extends keyof AuthEventPayloads>(event: T, callback: AuthEventCallback<T>): EventSubscription;
64
+ /**
65
+ * Subscribe to an auth event (alias for `on`)
66
+ */
67
+ subscribe<T_1 extends keyof AuthEventPayloads>(event: T_1, callback: AuthEventCallback<T_1>): EventSubscription;
68
+ /**
69
+ * Emit an auth event
70
+ */
71
+ emit<T_2 extends keyof AuthEventPayloads>(event: T_2, ...args: AuthEventPayloads[T_2]): void;
72
+ /**
73
+ * Emit an auth event (alias for `emit`)
74
+ */
75
+ trigger<T_3 extends keyof AuthEventPayloads>(event: T_3, ...args: AuthEventPayloads[T_3]): void;
76
+ /**
77
+ * Unsubscribe from all auth events
78
+ */
79
+ unsubscribeAll(): void;
80
+ /**
81
+ * Unsubscribe from a specific auth event
82
+ */
83
+ off(event?: AuthEventName): void;
84
+ };
85
+ //# sourceMappingURL=auth-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-events.d.ts","sourceRoot":"","sources":["../../src/services/auth-events.ts"],"names":[],"mappings":"AAAA,OAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAE9B,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC;IAC7E,cAAc,EAAE,CAAC,WAAW,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACrF,eAAe,EAAE,CAAC,WAAW,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAGtE,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrB,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC3B,iBAAiB,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAGhC,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACpD,iBAAiB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;IACxF,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;IACnD,eAAe,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IACvC,qBAAqB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IAGlE,kBAAkB,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjC,yBAAyB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAC5D,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAG/B,iBAAiB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC;IACrF,mBAAmB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;IAG9D,mBAAmB,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;CAC7C,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC;AAEpD;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,aAAa,IAAI,CACvD,GAAG,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAC1B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAO1B;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,UAAU;IACrB;;OAEG;qFACoE,iBAAiB;IAIxF;;OAEG;kGAC2E,iBAAiB;IAI/F;;OAEG;4FACqE,IAAI;IAI5E;;OAEG;+FACwE,IAAI;IAI/E;;OAEG;sBACe,IAAI;IAItB;;OAEG;gBACS,aAAa,GAAG,IAAI;CAOjC,CAAC"}