sonamu 0.13.1 → 0.13.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/plugins/entity-definitions/two-factor.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/two-factor.js +19 -1
- package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/two-factor.js +4 -2
- package/package.json +1 -1
- package/src/auth/__tests__/plugin-schema-mapping.test.ts +49 -0
- package/src/auth/plugins/entity-definitions/two-factor.ts +8 -0
- package/src/auth/plugins/wrappers/two-factor.ts +2 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"two-factor.d.ts","sourceRoot":"","sources":["../../../../src/auth/plugins/entity-definitions/two-factor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEnD;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,EAAE,
|
|
1
|
+
{"version":3,"file":"two-factor.d.ts","sourceRoot":"","sources":["../../../../src/auth/plugins/entity-definitions/two-factor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEnD;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,EAAE,mBAmDhC,CAAC"}
|
|
@@ -29,6 +29,24 @@ const twoFactorEntityDef = {
|
|
|
29
29
|
type: "string",
|
|
30
30
|
desc: "백업 코드"
|
|
31
31
|
},
|
|
32
|
+
{
|
|
33
|
+
name: "verified",
|
|
34
|
+
type: "boolean",
|
|
35
|
+
dbDefault: "true",
|
|
36
|
+
desc: "TOTP 검증 여부"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: "failed_verification_count",
|
|
40
|
+
type: "integer",
|
|
41
|
+
dbDefault: "0",
|
|
42
|
+
desc: "연속 검증 실패 횟수"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: "locked_until",
|
|
46
|
+
type: "date",
|
|
47
|
+
nullable: true,
|
|
48
|
+
desc: "검증 잠금 해제 일시"
|
|
49
|
+
},
|
|
32
50
|
{
|
|
33
51
|
name: "created_at",
|
|
34
52
|
type: "date",
|
|
@@ -77,4 +95,4 @@ const twoFactorEntityDef = {
|
|
|
77
95
|
};
|
|
78
96
|
export { twoFactorEntityDef };
|
|
79
97
|
|
|
80
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
98
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHdvLWZhY3Rvci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXV0aC9wbHVnaW5zL2VudGl0eS1kZWZpbml0aW9ucy90d28tZmFjdG9yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgQmV0dGVyQXV0aEVudGl0eURlZiB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogYmV0dGVyLWF1dGggMkZBIChUd28tRmFjdG9yIEF1dGhlbnRpY2F0aW9uKSDtlIzrn6zqt7jsnbgg7JeU7Yuw7YuwIOygleydmFxuICogaHR0cHM6Ly93d3cuYmV0dGVyLWF1dGguY29tL2RvY3MvcGx1Z2lucy8yZmFcbiAqXG4gKiBVc2VyIO2FjOydtOu4lOyXkCAyRkEg7Zmc7ISx7ZmUIO2VhOuTnOulvCDstpTqsIDtlZjqs6AsXG4gKiBUd29GYWN0b3Ig7YWM7J2067iU7J2EIOyDneyEse2VmOyXrCAyRkEg7ISk7KCV7J2EIOyggOyepe2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGNvbnN0IHR3b0ZhY3RvckVudGl0eURlZjogQmV0dGVyQXV0aEVudGl0eURlZiA9IHtcbiAgaWQ6IFwiMmZhXCIsXG4gIG5hbWU6IFwiVHdvLUZhY3RvciBBdXRoZW50aWNhdGlvblwiLFxuICBlbnRpdGllczogW1xuICAgIHtcbiAgICAgIGlkOiBcIlR3b0ZhY3RvclwiLFxuICAgICAgdGFibGU6IFwidHdvX2ZhY3RvcnNcIixcbiAgICAgIHRpdGxlOiBcIjJGQSDshKTsoJVcIixcbiAgICAgIHByb3BzOiBbXG4gICAgICAgIHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcInN0cmluZ1wiLCBkZXNjOiBcIklEXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInNlY3JldFwiLCB0eXBlOiBcInN0cmluZ1wiLCBkZXNjOiBcIuu5hOuwgCDtgqRcIiB9LFxuICAgICAgICB7IG5hbWU6IFwiYmFja3VwX2NvZGVzXCIsIHR5cGU6IFwic3RyaW5nXCIsIGRlc2M6IFwi67Cx7JeFIOy9lOuTnFwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJ2ZXJpZmllZFwiLCB0eXBlOiBcImJvb2xlYW5cIiwgZGJEZWZhdWx0OiBcInRydWVcIiwgZGVzYzogXCJUT1RQIOqygOymnSDsl6zrtoBcIiB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJmYWlsZWRfdmVyaWZpY2F0aW9uX2NvdW50XCIsXG4gICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgZGJEZWZhdWx0OiBcIjBcIixcbiAgICAgICAgICBkZXNjOiBcIuyXsOyGjSDqsoDspp0g7Iuk7YyoIO2an+yImFwiLFxuICAgICAgICB9LFxuICAgICAgICB7IG5hbWU6IFwibG9ja2VkX3VudGlsXCIsIHR5cGU6IFwiZGF0ZVwiLCBudWxsYWJsZTogdHJ1ZSwgZGVzYzogXCLqsoDspp0g7J6g6riIIO2VtOygnCDsnbzsi5xcIiB9LFxuICAgICAgICB7IG5hbWU6IFwiY3JlYXRlZF9hdFwiLCB0eXBlOiBcImRhdGVcIiwgZGJEZWZhdWx0OiBcIkNVUlJFTlRfVElNRVNUQU1QXCIsIGRlc2M6IFwi7IOd7ISx7J287IucXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInVwZGF0ZWRfYXRcIiwgdHlwZTogXCJkYXRlXCIsIGRiRGVmYXVsdDogXCJDVVJSRU5UX1RJTUVTVEFNUFwiLCBkZXNjOiBcIuyImOygleydvOyLnFwiIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInJlbGF0aW9uXCIsXG4gICAgICAgICAgbmFtZTogXCJ1c2VyXCIsXG4gICAgICAgICAgd2l0aDogXCJVc2VyXCIsXG4gICAgICAgICAgcmVsYXRpb25UeXBlOiBcIkJlbG9uZ3NUb09uZVwiLFxuICAgICAgICAgIG9uRGVsZXRlOiBcIkNBU0NBREVcIixcbiAgICAgICAgICBkZXNjOiBcIuyCrOyaqeyekFwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGluZGV4ZXM6IFt7IHR5cGU6IFwiaW5kZXhcIiwgbmFtZTogXCJ0d29fZmFjdG9yc191c2VyX2lkX2lkeFwiLCBjb2x1bW5zOiBbeyBuYW1lOiBcInVzZXJfaWRcIiB9XSB9XSxcbiAgICAgIHN1YnNldHM6IHtcbiAgICAgICAgQTogW1wiaWRcIiwgXCJzZWNyZXRcIiwgXCJiYWNrdXBfY29kZXNcIiwgXCJjcmVhdGVkX2F0XCIsIFwidXBkYXRlZF9hdFwiLCBcInVzZXIuaWRcIl0sXG4gICAgICB9LFxuICAgICAgZW51bXM6IHtcbiAgICAgICAgVHdvRmFjdG9yT3JkZXJCeTogeyBcImlkLWRlc2NcIjogXCJJROy1nOyLoOyInFwiIH0sXG4gICAgICAgIFR3b0ZhY3RvclNlYXJjaEZpZWxkOiB7IGlkOiBcIklEXCIgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgXSxcbiAgYWRkaXRpb25hbFByb3BzOiB7XG4gICAgVXNlcjogW1xuICAgICAge1xuICAgICAgICBuYW1lOiBcInR3b19mYWN0b3JfZW5hYmxlZFwiLFxuICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgICAgIGRlc2M6IFwiMkZBIO2ZnOyEse2ZlCDsl6zrtoBcIixcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBU0EsTUFBYSxxQkFBMEM7Q0FDckQsSUFBSTtDQUNKLE1BQU07Q0FDTixVQUFVLENBQ1I7RUFDRSxJQUFJO0VBQ0osT0FBTztFQUNQLE9BQU87RUFDUCxPQUFPO0dBQ0w7SUFBRSxNQUFNO0lBQU0sTUFBTTtJQUFVLE1BQU07R0FBSztHQUN6QztJQUFFLE1BQU07SUFBVSxNQUFNO0lBQVUsTUFBTTtHQUFPO0dBQy9DO0lBQUUsTUFBTTtJQUFnQixNQUFNO0lBQVUsTUFBTTtHQUFRO0dBQ3REO0lBQUUsTUFBTTtJQUFZLE1BQU07SUFBVyxXQUFXO0lBQVEsTUFBTTtHQUFhO0dBQzNFO0lBQ0UsTUFBTTtJQUNOLE1BQU07SUFDTixXQUFXO0lBQ1gsTUFBTTtHQUNSO0dBQ0E7SUFBRSxNQUFNO0lBQWdCLE1BQU07SUFBUSxVQUFVO0lBQU0sTUFBTTtHQUFjO0dBQzFFO0lBQUUsTUFBTTtJQUFjLE1BQU07SUFBUSxXQUFXO0lBQXFCLE1BQU07R0FBTztHQUNqRjtJQUFFLE1BQU07SUFBYyxNQUFNO0lBQVEsV0FBVztJQUFxQixNQUFNO0dBQU87R0FDakY7SUFDRSxNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixjQUFjO0lBQ2QsVUFBVTtJQUNWLE1BQU07R0FDUjtFQUNGO0VBQ0EsU0FBUyxDQUFDO0dBQUUsTUFBTTtHQUFTLE1BQU07R0FBMkIsU0FBUyxDQUFDLEVBQUUsTUFBTSxVQUFVLENBQUM7RUFBRSxDQUFDO0VBQzVGLFNBQVMsRUFDUCxHQUFHO0dBQUM7R0FBTTtHQUFVO0dBQWdCO0dBQWM7R0FBYztFQUFTLEVBQzNFO0VBQ0EsT0FBTztHQUNMLGtCQUFrQixFQUFFLFdBQVcsUUFBUTtHQUN2QyxzQkFBc0IsRUFBRSxJQUFJLEtBQUs7RUFDbkM7Q0FDRixDQUNGO0NBQ0EsaUJBQWlCLEVBQ2YsTUFBTSxDQUNKO0VBQ0UsTUFBTTtFQUNOLE1BQU07RUFDTixVQUFVO0VBQ1YsTUFBTTtDQUNSLENBQ0YsRUFDRjtBQUNGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"two-factor.d.ts","sourceRoot":"","sources":["../../../../src/auth/plugins/wrappers/two-factor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAI5D,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,EAAE,gBAAgB,CAAC,QAAQ,
|
|
1
|
+
{"version":3,"file":"two-factor.d.ts","sourceRoot":"","sources":["../../../../src/auth/plugins/wrappers/two-factor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAI5D,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,EAAE,gBAAgB,CAAC,QAAQ,CAexD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,SAAS,aAAa,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAGlD,CAAC"}
|
|
@@ -16,7 +16,9 @@ const TWO_FACTOR_SCHEMA = {
|
|
|
16
16
|
modelName: "two_factors",
|
|
17
17
|
fields: {
|
|
18
18
|
userId: "user_id",
|
|
19
|
-
backupCodes: "backup_codes"
|
|
19
|
+
backupCodes: "backup_codes",
|
|
20
|
+
failedVerificationCount: "failed_verification_count",
|
|
21
|
+
lockedUntil: "locked_until"
|
|
20
22
|
}
|
|
21
23
|
}
|
|
22
24
|
};
|
|
@@ -31,4 +33,4 @@ const twoFactor = (options = {}) => {
|
|
|
31
33
|
};
|
|
32
34
|
export { TWO_FACTOR_SCHEMA, twoFactor };
|
|
33
35
|
|
|
34
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHdvLWZhY3Rvci5qcyIsIm5hbWVzIjpbIl90d29GYWN0b3IiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXV0aC9wbHVnaW5zL3dyYXBwZXJzL3R3by1mYWN0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHdvRmFjdG9yIGFzIF90d29GYWN0b3IgfSBmcm9tIFwiYmV0dGVyLWF1dGgvcGx1Z2luc1wiO1xuaW1wb3J0IHsgdHlwZSBUd29GYWN0b3JPcHRpb25zIH0gZnJvbSBcImJldHRlci1hdXRoL3BsdWdpbnNcIjtcblxuaW1wb3J0IHsgbWVyZ2UgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvdXRpbHNcIjtcblxuZXhwb3J0IHR5cGUgeyBUd29GYWN0b3JPcHRpb25zIH0gZnJvbSBcImJldHRlci1hdXRoL3BsdWdpbnNcIjtcblxuLyoqXG4gKiBUd28tRmFjdG9yIO2UjOufrOq3uOyduCDsiqTtgqTrp4hcbiAqXG4gKiBiZXR0ZXItYXV0aCB0d29GYWN0b3Ig7ZSM65+
|
|
36
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHdvLWZhY3Rvci5qcyIsIm5hbWVzIjpbIl90d29GYWN0b3IiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXV0aC9wbHVnaW5zL3dyYXBwZXJzL3R3by1mYWN0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHdvRmFjdG9yIGFzIF90d29GYWN0b3IgfSBmcm9tIFwiYmV0dGVyLWF1dGgvcGx1Z2luc1wiO1xuaW1wb3J0IHsgdHlwZSBUd29GYWN0b3JPcHRpb25zIH0gZnJvbSBcImJldHRlci1hdXRoL3BsdWdpbnNcIjtcblxuaW1wb3J0IHsgbWVyZ2UgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvdXRpbHNcIjtcblxuZXhwb3J0IHR5cGUgeyBUd29GYWN0b3JPcHRpb25zIH0gZnJvbSBcImJldHRlci1hdXRoL3BsdWdpbnNcIjtcblxuLyoqXG4gKiBUd28tRmFjdG9yIO2UjOufrOq3uOyduCDsiqTtgqTrp4hcbiAqXG4gKiBiZXR0ZXItYXV0aCB0d29GYWN0b3Ig7ZSM65+s6re47J24IO2YuOy2nCDsi5wg7KCE64us7ZWp64uI64ukOlxuICogYGBgdHlwZXNjcmlwdFxuICogdHdvRmFjdG9yKHsgc2NoZW1hOiBUV09fRkFDVE9SX1NDSEVNQSB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBUV09fRkFDVE9SX1NDSEVNQTogVHdvRmFjdG9yT3B0aW9uc1tcInNjaGVtYVwiXSA9IHtcbiAgdXNlcjoge1xuICAgIGZpZWxkczoge1xuICAgICAgdHdvRmFjdG9yRW5hYmxlZDogXCJ0d29fZmFjdG9yX2VuYWJsZWRcIixcbiAgICB9LFxuICB9LFxuICB0d29GYWN0b3I6IHtcbiAgICBtb2RlbE5hbWU6IFwidHdvX2ZhY3RvcnNcIixcbiAgICBmaWVsZHM6IHtcbiAgICAgIHVzZXJJZDogXCJ1c2VyX2lkXCIsXG4gICAgICBiYWNrdXBDb2RlczogXCJiYWNrdXBfY29kZXNcIixcbiAgICAgIGZhaWxlZFZlcmlmaWNhdGlvbkNvdW50OiBcImZhaWxlZF92ZXJpZmljYXRpb25fY291bnRcIixcbiAgICAgIGxvY2tlZFVudGlsOiBcImxvY2tlZF91bnRpbFwiLFxuICAgIH0sXG4gIH0sXG59O1xuXG4vKipcbiAqIHR3b0ZhY3RvciDtlIzrn6zqt7jsnbgg656Y7Y28XG4gKlxuICogU29uYW117J2YIOyKpO2CpOuniCDrp6TtlZHsnYQg7J6Q64+Z7Jy866GcIOuzke2Vqe2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGNvbnN0IHR3b0ZhY3RvciA9IChvcHRpb25zOiBUd29GYWN0b3JPcHRpb25zID0ge30pID0+IHtcbiAgb3B0aW9ucy5zY2hlbWEgPSBtZXJnZShUV09fRkFDVE9SX1NDSEVNQSwgb3B0aW9ucy5zY2hlbWEgPz8ge30pO1xuICByZXR1cm4gX3R3b0ZhY3RvcihvcHRpb25zKTtcbn07XG4iXSwibWFwcGluZ3MiOiI7OztBQUc0QyxXQUFBOzs7Ozs7Ozs7QUFZNUMsTUFBYSxvQkFBZ0Q7Q0FDM0QsTUFBTSxFQUNKLFFBQVEsRUFDTixrQkFBa0IscUJBQ3BCLEVBQ0Y7Q0FDQSxXQUFXO0VBQ1QsV0FBVztFQUNYLFFBQVE7R0FDTixRQUFRO0dBQ1IsYUFBYTtHQUNiLHlCQUF5QjtHQUN6QixhQUFhO0VBQ2Y7Q0FDRjtBQUNGOzs7Ozs7QUFPQSxNQUFhLGFBQWEsVUFBNEIsQ0FBQyxNQUFNO0NBQzNELFFBQVEsU0FBUyxNQUFNLG1CQUFtQixRQUFRLFVBQVUsQ0FBQyxDQUFDO0NBQzlELE9BQU9BLFlBQVcsT0FBTztBQUMzQiJ9
|
package/package.json
CHANGED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
admin,
|
|
5
|
+
anonymous,
|
|
6
|
+
apiKey,
|
|
7
|
+
jwt,
|
|
8
|
+
organization,
|
|
9
|
+
passkey,
|
|
10
|
+
phoneNumber,
|
|
11
|
+
sso,
|
|
12
|
+
twoFactor,
|
|
13
|
+
username,
|
|
14
|
+
} from "../plugins/wrappers";
|
|
15
|
+
|
|
16
|
+
type PluginWithSchema = {
|
|
17
|
+
schema?: Record<string, { fields?: Record<string, { fieldName?: string }> }>;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// Sonamu 엔티티는 snake_case 컬럼을 쓰므로, 래퍼가 매핑하지 않은 camelCase 필드는 런타임 SQL 오류가 된다.
|
|
21
|
+
function findUnmappedFields(plugin: PluginWithSchema): string[] {
|
|
22
|
+
return Object.entries(plugin.schema ?? {}).flatMap(([model, definition]) =>
|
|
23
|
+
Object.entries(definition.fields ?? {})
|
|
24
|
+
.filter(([field, options]) => /[A-Z]/.test(options.fieldName ?? field))
|
|
25
|
+
.map(([field]) => `${model}.${field}`),
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
describe("better-auth 플러그인 래퍼 스키마 매핑", () => {
|
|
30
|
+
const plugins = {
|
|
31
|
+
admin: admin(),
|
|
32
|
+
anonymous: anonymous(),
|
|
33
|
+
apiKey: apiKey(),
|
|
34
|
+
jwt: jwt(),
|
|
35
|
+
organization: organization(),
|
|
36
|
+
passkey: passkey(),
|
|
37
|
+
phoneNumber: phoneNumber({ sendOTP: async () => undefined }),
|
|
38
|
+
sso: sso(),
|
|
39
|
+
twoFactor: twoFactor(),
|
|
40
|
+
username: username(),
|
|
41
|
+
} satisfies Record<string, PluginWithSchema>;
|
|
42
|
+
|
|
43
|
+
test.each(Object.entries(plugins))(
|
|
44
|
+
"%s 플러그인의 모든 필드가 snake_case 컬럼으로 매핑된다",
|
|
45
|
+
(_name, plugin) => {
|
|
46
|
+
expect(findUnmappedFields(plugin)).toEqual([]);
|
|
47
|
+
},
|
|
48
|
+
);
|
|
49
|
+
});
|
|
@@ -19,6 +19,14 @@ export const twoFactorEntityDef: BetterAuthEntityDef = {
|
|
|
19
19
|
{ name: "id", type: "string", desc: "ID" },
|
|
20
20
|
{ name: "secret", type: "string", desc: "비밀 키" },
|
|
21
21
|
{ name: "backup_codes", type: "string", desc: "백업 코드" },
|
|
22
|
+
{ name: "verified", type: "boolean", dbDefault: "true", desc: "TOTP 검증 여부" },
|
|
23
|
+
{
|
|
24
|
+
name: "failed_verification_count",
|
|
25
|
+
type: "integer",
|
|
26
|
+
dbDefault: "0",
|
|
27
|
+
desc: "연속 검증 실패 횟수",
|
|
28
|
+
},
|
|
29
|
+
{ name: "locked_until", type: "date", nullable: true, desc: "검증 잠금 해제 일시" },
|
|
22
30
|
{ name: "created_at", type: "date", dbDefault: "CURRENT_TIMESTAMP", desc: "생성일시" },
|
|
23
31
|
{ name: "updated_at", type: "date", dbDefault: "CURRENT_TIMESTAMP", desc: "수정일시" },
|
|
24
32
|
{
|