sonamu 0.13.0 → 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.
@@ -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,mBA2ChC,CAAC"}
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHdvLWZhY3Rvci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXV0aC9wbHVnaW5zL2VudGl0eS1kZWZpbml0aW9ucy90d28tZmFjdG9yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgQmV0dGVyQXV0aEVudGl0eURlZiB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogYmV0dGVyLWF1dGggMkZBIChUd28tRmFjdG9yIEF1dGhlbnRpY2F0aW9uKSDtlIzrn6zqt7jsnbgg7JeU7Yuw7YuwIOygleydmFxuICogaHR0cHM6Ly93d3cuYmV0dGVyLWF1dGguY29tL2RvY3MvcGx1Z2lucy8yZmFcbiAqXG4gKiBVc2VyIO2FjOydtOu4lOyXkCAyRkEg7Zmc7ISx7ZmUIO2VhOuTnOulvCDstpTqsIDtlZjqs6AsXG4gKiBUd29GYWN0b3Ig7YWM7J2067iU7J2EIOyDneyEse2VmOyXrCAyRkEg7ISk7KCV7J2EIOyggOyepe2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGNvbnN0IHR3b0ZhY3RvckVudGl0eURlZjogQmV0dGVyQXV0aEVudGl0eURlZiA9IHtcbiAgaWQ6IFwiMmZhXCIsXG4gIG5hbWU6IFwiVHdvLUZhY3RvciBBdXRoZW50aWNhdGlvblwiLFxuICBlbnRpdGllczogW1xuICAgIHtcbiAgICAgIGlkOiBcIlR3b0ZhY3RvclwiLFxuICAgICAgdGFibGU6IFwidHdvX2ZhY3RvcnNcIixcbiAgICAgIHRpdGxlOiBcIjJGQSDshKTsoJVcIixcbiAgICAgIHByb3BzOiBbXG4gICAgICAgIHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcInN0cmluZ1wiLCBkZXNjOiBcIklEXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInNlY3JldFwiLCB0eXBlOiBcInN0cmluZ1wiLCBkZXNjOiBcIuu5hOuwgCDtgqRcIiB9LFxuICAgICAgICB7IG5hbWU6IFwiYmFja3VwX2NvZGVzXCIsIHR5cGU6IFwic3RyaW5nXCIsIGRlc2M6IFwi67Cx7JeFIOy9lOuTnFwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJjcmVhdGVkX2F0XCIsIHR5cGU6IFwiZGF0ZVwiLCBkYkRlZmF1bHQ6IFwiQ1VSUkVOVF9USU1FU1RBTVBcIiwgZGVzYzogXCLsg53shLHsnbzsi5xcIiB9LFxuICAgICAgICB7IG5hbWU6IFwidXBkYXRlZF9hdFwiLCB0eXBlOiBcImRhdGVcIiwgZGJEZWZhdWx0OiBcIkNVUlJFTlRfVElNRVNUQU1QXCIsIGRlc2M6IFwi7IiY7KCV7J287IucXCIgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwicmVsYXRpb25cIixcbiAgICAgICAgICBuYW1lOiBcInVzZXJcIixcbiAgICAgICAgICB3aXRoOiBcIlVzZXJcIixcbiAgICAgICAgICByZWxhdGlvblR5cGU6IFwiQmVsb25nc1RvT25lXCIsXG4gICAgICAgICAgb25EZWxldGU6IFwiQ0FTQ0FERVwiLFxuICAgICAgICAgIGRlc2M6IFwi7IKs7Jqp7J6QXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgaW5kZXhlczogW3sgdHlwZTogXCJpbmRleFwiLCBuYW1lOiBcInR3b19mYWN0b3JzX3VzZXJfaWRfaWR4XCIsIGNvbHVtbnM6IFt7IG5hbWU6IFwidXNlcl9pZFwiIH1dIH1dLFxuICAgICAgc3Vic2V0czoge1xuICAgICAgICBBOiBbXCJpZFwiLCBcInNlY3JldFwiLCBcImJhY2t1cF9jb2Rlc1wiLCBcImNyZWF0ZWRfYXRcIiwgXCJ1cGRhdGVkX2F0XCIsIFwidXNlci5pZFwiXSxcbiAgICAgIH0sXG4gICAgICBlbnVtczoge1xuICAgICAgICBUd29GYWN0b3JPcmRlckJ5OiB7IFwiaWQtZGVzY1wiOiBcIklE7LWc7Iug7IicXCIgfSxcbiAgICAgICAgVHdvRmFjdG9yU2VhcmNoRmllbGQ6IHsgaWQ6IFwiSURcIiB9LFxuICAgICAgfSxcbiAgICB9LFxuICBdLFxuICBhZGRpdGlvbmFsUHJvcHM6IHtcbiAgICBVc2VyOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwidHdvX2ZhY3Rvcl9lbmFibGVkXCIsXG4gICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICAgICAgZGVzYzogXCIyRkEg7Zmc7ISx7ZmUIOyXrOu2gFwiLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFTQSxNQUFhLHFCQUEwQztDQUNyRCxJQUFJO0NBQ0osTUFBTTtDQUNOLFVBQVUsQ0FDUjtFQUNFLElBQUk7RUFDSixPQUFPO0VBQ1AsT0FBTztFQUNQLE9BQU87R0FDTDtJQUFFLE1BQU07SUFBTSxNQUFNO0lBQVUsTUFBTTtHQUFLO0dBQ3pDO0lBQUUsTUFBTTtJQUFVLE1BQU07SUFBVSxNQUFNO0dBQU87R0FDL0M7SUFBRSxNQUFNO0lBQWdCLE1BQU07SUFBVSxNQUFNO0dBQVE7R0FDdEQ7SUFBRSxNQUFNO0lBQWMsTUFBTTtJQUFRLFdBQVc7SUFBcUIsTUFBTTtHQUFPO0dBQ2pGO0lBQUUsTUFBTTtJQUFjLE1BQU07SUFBUSxXQUFXO0lBQXFCLE1BQU07R0FBTztHQUNqRjtJQUNFLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLGNBQWM7SUFDZCxVQUFVO0lBQ1YsTUFBTTtHQUNSO0VBQ0Y7RUFDQSxTQUFTLENBQUM7R0FBRSxNQUFNO0dBQVMsTUFBTTtHQUEyQixTQUFTLENBQUMsRUFBRSxNQUFNLFVBQVUsQ0FBQztFQUFFLENBQUM7RUFDNUYsU0FBUyxFQUNQLEdBQUc7R0FBQztHQUFNO0dBQVU7R0FBZ0I7R0FBYztHQUFjO0VBQVMsRUFDM0U7RUFDQSxPQUFPO0dBQ0wsa0JBQWtCLEVBQUUsV0FBVyxRQUFRO0dBQ3ZDLHNCQUFzQixFQUFFLElBQUksS0FBSztFQUNuQztDQUNGLENBQ0Y7Q0FDQSxpQkFBaUIsRUFDZixNQUFNLENBQ0o7RUFDRSxNQUFNO0VBQ04sTUFBTTtFQUNOLFVBQVU7RUFDVixNQUFNO0NBQ1IsQ0FDRixFQUNGO0FBQ0YifQ==
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,CAaxD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,SAAS,aAAa,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAGlD,CAAC"}
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+s6re47J24IO2YuOy2nCDsi5wg7KCE64us7ZWp64uI64ukOlxuICogYGBgdHlwZXNjcmlwdFxuICogdHdvRmFjdG9yKHsgc2NoZW1hOiBUV09fRkFDVE9SX1NDSEVNQSB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBUV09fRkFDVE9SX1NDSEVNQTogVHdvRmFjdG9yT3B0aW9uc1tcInNjaGVtYVwiXSA9IHtcbiAgdXNlcjoge1xuICAgIGZpZWxkczoge1xuICAgICAgdHdvRmFjdG9yRW5hYmxlZDogXCJ0d29fZmFjdG9yX2VuYWJsZWRcIixcbiAgICB9LFxuICB9LFxuICB0d29GYWN0b3I6IHtcbiAgICBtb2RlbE5hbWU6IFwidHdvX2ZhY3RvcnNcIixcbiAgICBmaWVsZHM6IHtcbiAgICAgIHVzZXJJZDogXCJ1c2VyX2lkXCIsXG4gICAgICBiYWNrdXBDb2RlczogXCJiYWNrdXBfY29kZXNcIixcbiAgICB9LFxuICB9LFxufTtcblxuLyoqXG4gKiB0d29GYWN0b3Ig7ZSM65+s6re47J24IOuemO2NvFxuICpcbiAqIFNvbmFtdeydmCDsiqTtgqTrp4gg66ek7ZWR7J2EIOyekOuPmeycvOuhnCDrs5Htlantlanri4jri6QuXG4gKi9cbmV4cG9ydCBjb25zdCB0d29GYWN0b3IgPSAob3B0aW9uczogVHdvRmFjdG9yT3B0aW9ucyA9IHt9KSA9PiB7XG4gIG9wdGlvbnMuc2NoZW1hID0gbWVyZ2UoVFdPX0ZBQ1RPUl9TQ0hFTUEsIG9wdGlvbnMuc2NoZW1hID8/IHt9KTtcbiAgcmV0dXJuIF90d29GYWN0b3Iob3B0aW9ucyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7QUFHNEMsV0FBQTs7Ozs7Ozs7O0FBWTVDLE1BQWEsb0JBQWdEO0NBQzNELE1BQU0sRUFDSixRQUFRLEVBQ04sa0JBQWtCLHFCQUNwQixFQUNGO0NBQ0EsV0FBVztFQUNULFdBQVc7RUFDWCxRQUFRO0dBQ04sUUFBUTtHQUNSLGFBQWE7RUFDZjtDQUNGO0FBQ0Y7Ozs7OztBQU9BLE1BQWEsYUFBYSxVQUE0QixDQUFDLE1BQU07Q0FDM0QsUUFBUSxTQUFTLE1BQU0sbUJBQW1CLFFBQVEsVUFBVSxDQUFDLENBQUM7Q0FDOUQsT0FBT0EsWUFBVyxPQUFPO0FBQzNCIn0=
36
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHdvLWZhY3Rvci5qcyIsIm5hbWVzIjpbIl90d29GYWN0b3IiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXV0aC9wbHVnaW5zL3dyYXBwZXJzL3R3by1mYWN0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHdvRmFjdG9yIGFzIF90d29GYWN0b3IgfSBmcm9tIFwiYmV0dGVyLWF1dGgvcGx1Z2luc1wiO1xuaW1wb3J0IHsgdHlwZSBUd29GYWN0b3JPcHRpb25zIH0gZnJvbSBcImJldHRlci1hdXRoL3BsdWdpbnNcIjtcblxuaW1wb3J0IHsgbWVyZ2UgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvdXRpbHNcIjtcblxuZXhwb3J0IHR5cGUgeyBUd29GYWN0b3JPcHRpb25zIH0gZnJvbSBcImJldHRlci1hdXRoL3BsdWdpbnNcIjtcblxuLyoqXG4gKiBUd28tRmFjdG9yIO2UjOufrOq3uOyduCDsiqTtgqTrp4hcbiAqXG4gKiBiZXR0ZXItYXV0aCB0d29GYWN0b3Ig7ZSM65+s6re47J24IO2YuOy2nCDsi5wg7KCE64us7ZWp64uI64ukOlxuICogYGBgdHlwZXNjcmlwdFxuICogdHdvRmFjdG9yKHsgc2NoZW1hOiBUV09fRkFDVE9SX1NDSEVNQSB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBUV09fRkFDVE9SX1NDSEVNQTogVHdvRmFjdG9yT3B0aW9uc1tcInNjaGVtYVwiXSA9IHtcbiAgdXNlcjoge1xuICAgIGZpZWxkczoge1xuICAgICAgdHdvRmFjdG9yRW5hYmxlZDogXCJ0d29fZmFjdG9yX2VuYWJsZWRcIixcbiAgICB9LFxuICB9LFxuICB0d29GYWN0b3I6IHtcbiAgICBtb2RlbE5hbWU6IFwidHdvX2ZhY3RvcnNcIixcbiAgICBmaWVsZHM6IHtcbiAgICAgIHVzZXJJZDogXCJ1c2VyX2lkXCIsXG4gICAgICBiYWNrdXBDb2RlczogXCJiYWNrdXBfY29kZXNcIixcbiAgICAgIGZhaWxlZFZlcmlmaWNhdGlvbkNvdW50OiBcImZhaWxlZF92ZXJpZmljYXRpb25fY291bnRcIixcbiAgICAgIGxvY2tlZFVudGlsOiBcImxvY2tlZF91bnRpbFwiLFxuICAgIH0sXG4gIH0sXG59O1xuXG4vKipcbiAqIHR3b0ZhY3RvciDtlIzrn6zqt7jsnbgg656Y7Y28XG4gKlxuICogU29uYW117J2YIOyKpO2CpOuniCDrp6TtlZHsnYQg7J6Q64+Z7Jy866GcIOuzke2Vqe2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGNvbnN0IHR3b0ZhY3RvciA9IChvcHRpb25zOiBUd29GYWN0b3JPcHRpb25zID0ge30pID0+IHtcbiAgb3B0aW9ucy5zY2hlbWEgPSBtZXJnZShUV09fRkFDVE9SX1NDSEVNQSwgb3B0aW9ucy5zY2hlbWEgPz8ge30pO1xuICByZXR1cm4gX3R3b0ZhY3RvcihvcHRpb25zKTtcbn07XG4iXSwibWFwcGluZ3MiOiI7OztBQUc0QyxXQUFBOzs7Ozs7Ozs7QUFZNUMsTUFBYSxvQkFBZ0Q7Q0FDM0QsTUFBTSxFQUNKLFFBQVEsRUFDTixrQkFBa0IscUJBQ3BCLEVBQ0Y7Q0FDQSxXQUFXO0VBQ1QsV0FBVztFQUNYLFFBQVE7R0FDTixRQUFRO0dBQ1IsYUFBYTtHQUNiLHlCQUF5QjtHQUN6QixhQUFhO0VBQ2Y7Q0FDRjtBQUNGOzs7Ozs7QUFPQSxNQUFhLGFBQWEsVUFBNEIsQ0FBQyxNQUFNO0NBQzNELFFBQVEsU0FBUyxNQUFNLG1CQUFtQixRQUFRLFVBQVUsQ0FBQyxDQUFDO0NBQzlELE9BQU9BLFlBQVcsT0FBTztBQUMzQiJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sonamu",
3
- "version": "0.13.0",
3
+ "version": "0.13.2",
4
4
  "description": "Sonamu — TypeScript Fullstack API Framework",
5
5
  "keywords": [
6
6
  "framework",
@@ -104,10 +104,10 @@
104
104
  "@logtape/pretty": "2.4.2",
105
105
  "@logtape/redaction": "2.4.2",
106
106
  "@sheetkit/node": "^0.5.1",
107
- "@sonamu-kit/hmr-hook": "^0.6.0",
108
- "@sonamu-kit/hmr-runner": "^0.2.0",
109
- "@sonamu-kit/tasks": "^0.3.1",
110
- "@sonamu-kit/ts-loader": "^2.2.0",
107
+ "@sonamu-kit/hmr-hook": "^0.7.0",
108
+ "@sonamu-kit/hmr-runner": "^0.3.0",
109
+ "@sonamu-kit/tasks": "^0.4.0",
110
+ "@sonamu-kit/ts-loader": "^2.3.0",
111
111
  "@types/ws": "^8.18.2",
112
112
  "@typescript/typescript6": "6.0.2",
113
113
  "bcrypt": "^6.0.0",
@@ -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
  {
@@ -24,6 +24,8 @@ export const TWO_FACTOR_SCHEMA: TwoFactorOptions["schema"] = {
24
24
  fields: {
25
25
  userId: "user_id",
26
26
  backupCodes: "backup_codes",
27
+ failedVerificationCount: "failed_verification_count",
28
+ lockedUntil: "locked_until",
27
29
  },
28
30
  },
29
31
  };