@mesob/auth-hono 0.1.0 → 0.2.0

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,5 +1,5 @@
1
1
  import { Context } from 'hono';
2
- import { A as AuthConfig } from '../index-CScADcDn.js';
2
+ import { A as AuthConfig } from '../index-DCxsFKQ2.js';
3
3
  import '@hono/zod-openapi';
4
4
  import '../index-ULpI-i0z.js';
5
5
  import 'drizzle-orm/node-postgres';
@@ -0,0 +1,5 @@
1
+ import { Context } from 'hono';
2
+
3
+ declare const handleError: (error: unknown, c: Context) => Response;
4
+
5
+ export { handleError };
@@ -0,0 +1,99 @@
1
+ // src/lib/error-handler.ts
2
+ import { logger } from "@mesob/common";
3
+ import { HTTPException } from "hono/http-exception";
4
+ var isDatabaseError = (error) => {
5
+ if (typeof error !== "object" || error === null) {
6
+ return false;
7
+ }
8
+ if ("code" in error || "query" in error || "detail" in error) {
9
+ return true;
10
+ }
11
+ if (error instanceof Error) {
12
+ const message = error.message.toLowerCase();
13
+ return message.includes("failed query") || message.includes("relation") || message.includes("column") || message.includes("syntax error") || message.includes("duplicate key") || message.includes("foreign key") || message.includes("null value");
14
+ }
15
+ return false;
16
+ };
17
+ var sanitizeDatabaseError = (error) => {
18
+ const code = error.code;
19
+ if (code === "23505") {
20
+ return "Resource already exists";
21
+ }
22
+ if (code === "23503") {
23
+ return "Referenced resource not found";
24
+ }
25
+ if (code === "23502") {
26
+ return "Required field is missing";
27
+ }
28
+ if (code === "42P01") {
29
+ return "Resource not found";
30
+ }
31
+ if (code === "42703") {
32
+ return "Invalid request";
33
+ }
34
+ if (code === "23514") {
35
+ return "Validation failed";
36
+ }
37
+ return "An error occurred while processing your request";
38
+ };
39
+ var isDatabaseErrorMessage = (message) => {
40
+ const lowerMessage = message.toLowerCase();
41
+ return lowerMessage.includes("failed query") || lowerMessage.includes("select") || lowerMessage.includes("insert") || lowerMessage.includes("update") || lowerMessage.includes("delete") || lowerMessage.includes("from") || lowerMessage.includes("where") || lowerMessage.includes("limit") || lowerMessage.includes("params:") || lowerMessage.includes("query") || message.includes('"iam".') || message.includes('"tenants"') || message.includes('"users"') || message.includes('"sessions"') || message.includes('"accounts"') || lowerMessage.includes("relation") || lowerMessage.includes("column") || lowerMessage.includes("syntax error") || lowerMessage.includes("database") || lowerMessage.includes("postgres") || lowerMessage.includes("sql");
42
+ };
43
+ var handleError = (error, c) => {
44
+ logger.error("API Error:", {
45
+ error,
46
+ path: c.req.path,
47
+ method: c.req.method,
48
+ url: c.req.url
49
+ });
50
+ if (error instanceof HTTPException) {
51
+ const message = isDatabaseErrorMessage(error.message) ? "An error occurred while processing your request" : error.message;
52
+ return c.json({ error: message }, error.status);
53
+ }
54
+ if (isDatabaseError(error)) {
55
+ const userMessage = sanitizeDatabaseError(error);
56
+ logger.error("Database error details:", {
57
+ code: error.code,
58
+ message: error.message,
59
+ detail: error.detail,
60
+ query: error.query,
61
+ parameters: error.parameters
62
+ });
63
+ return c.json({ error: userMessage }, 500);
64
+ }
65
+ if (error instanceof Error) {
66
+ const message = error.message;
67
+ const lowerMessage = message.toLowerCase();
68
+ const isDatabaseError2 = lowerMessage.includes("failed query") || lowerMessage.includes("select") || lowerMessage.includes("insert") || lowerMessage.includes("update") || lowerMessage.includes("delete") || lowerMessage.includes("from") || lowerMessage.includes("where") || lowerMessage.includes("limit") || lowerMessage.includes("params:") || lowerMessage.includes("query") || message.includes('"iam".') || message.includes('"tenants"') || message.includes('"users"') || message.includes('"sessions"') || message.includes('"accounts"') || lowerMessage.includes("relation") || lowerMessage.includes("column") || lowerMessage.includes("syntax error") || lowerMessage.includes("duplicate key") || lowerMessage.includes("foreign key") || lowerMessage.includes("null value") || lowerMessage.includes("database") || lowerMessage.includes("postgres") || lowerMessage.includes("sql");
69
+ if (isDatabaseError2) {
70
+ logger.error("SQL/database error detected:", {
71
+ message: error.message,
72
+ stack: error.stack,
73
+ name: error.name
74
+ });
75
+ return c.json(
76
+ { error: "An error occurred while processing your request" },
77
+ 500
78
+ );
79
+ }
80
+ logger.error("Error details:", {
81
+ message: error.message,
82
+ stack: error.stack,
83
+ name: error.name
84
+ });
85
+ return c.json(
86
+ { error: "An error occurred while processing your request" },
87
+ 500
88
+ );
89
+ }
90
+ logger.error("Unknown error:", error);
91
+ return c.json(
92
+ { error: "An error occurred while processing your request" },
93
+ 500
94
+ );
95
+ };
96
+ export {
97
+ handleError
98
+ };
99
+ //# sourceMappingURL=error-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/error-handler.ts"],"sourcesContent":["import { logger } from '@mesob/common';\nimport type { Context } from 'hono';\nimport { HTTPException } from 'hono/http-exception';\n\ntype DatabaseError = {\n code?: string;\n message?: string;\n detail?: string;\n query?: string;\n parameters?: unknown[];\n};\n\nconst isDatabaseError = (error: unknown): error is DatabaseError => {\n if (typeof error !== 'object' || error === null) {\n return false;\n }\n\n if ('code' in error || 'query' in error || 'detail' in error) {\n return true;\n }\n\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n return (\n message.includes('failed query') ||\n message.includes('relation') ||\n message.includes('column') ||\n message.includes('syntax error') ||\n message.includes('duplicate key') ||\n message.includes('foreign key') ||\n message.includes('null value')\n );\n }\n\n return false;\n};\n\nconst sanitizeDatabaseError = (error: DatabaseError): string => {\n const code = error.code;\n\n if (code === '23505') {\n return 'Resource already exists';\n }\n\n if (code === '23503') {\n return 'Referenced resource not found';\n }\n\n if (code === '23502') {\n return 'Required field is missing';\n }\n\n if (code === '42P01') {\n return 'Resource not found';\n }\n\n if (code === '42703') {\n return 'Invalid request';\n }\n\n if (code === '23514') {\n return 'Validation failed';\n }\n\n return 'An error occurred while processing your request';\n};\n\nconst isDatabaseErrorMessage = (message: string): boolean => {\n const lowerMessage = message.toLowerCase();\n return (\n lowerMessage.includes('failed query') ||\n lowerMessage.includes('select') ||\n lowerMessage.includes('insert') ||\n lowerMessage.includes('update') ||\n lowerMessage.includes('delete') ||\n lowerMessage.includes('from') ||\n lowerMessage.includes('where') ||\n lowerMessage.includes('limit') ||\n lowerMessage.includes('params:') ||\n lowerMessage.includes('query') ||\n message.includes('\"iam\".') ||\n message.includes('\"tenants\"') ||\n message.includes('\"users\"') ||\n message.includes('\"sessions\"') ||\n message.includes('\"accounts\"') ||\n lowerMessage.includes('relation') ||\n lowerMessage.includes('column') ||\n lowerMessage.includes('syntax error') ||\n lowerMessage.includes('database') ||\n lowerMessage.includes('postgres') ||\n lowerMessage.includes('sql')\n );\n};\n\nexport const handleError = (error: unknown, c: Context): Response => {\n logger.error('API Error:', {\n error,\n path: c.req.path,\n method: c.req.method,\n url: c.req.url,\n });\n\n if (error instanceof HTTPException) {\n const message = isDatabaseErrorMessage(error.message)\n ? 'An error occurred while processing your request'\n : error.message;\n return c.json({ error: message }, error.status);\n }\n\n if (isDatabaseError(error)) {\n const userMessage = sanitizeDatabaseError(error);\n logger.error('Database error details:', {\n code: error.code,\n message: error.message,\n detail: error.detail,\n query: error.query,\n parameters: error.parameters,\n });\n return c.json({ error: userMessage }, 500);\n }\n\n if (error instanceof Error) {\n const message = error.message;\n const lowerMessage = message.toLowerCase();\n\n // Check for any database/SQL related content\n const isDatabaseError =\n lowerMessage.includes('failed query') ||\n lowerMessage.includes('select') ||\n lowerMessage.includes('insert') ||\n lowerMessage.includes('update') ||\n lowerMessage.includes('delete') ||\n lowerMessage.includes('from') ||\n lowerMessage.includes('where') ||\n lowerMessage.includes('limit') ||\n lowerMessage.includes('params:') ||\n lowerMessage.includes('query') ||\n message.includes('\"iam\".') ||\n message.includes('\"tenants\"') ||\n message.includes('\"users\"') ||\n message.includes('\"sessions\"') ||\n message.includes('\"accounts\"') ||\n lowerMessage.includes('relation') ||\n lowerMessage.includes('column') ||\n lowerMessage.includes('syntax error') ||\n lowerMessage.includes('duplicate key') ||\n lowerMessage.includes('foreign key') ||\n lowerMessage.includes('null value') ||\n lowerMessage.includes('database') ||\n lowerMessage.includes('postgres') ||\n lowerMessage.includes('sql');\n\n if (isDatabaseError) {\n logger.error('SQL/database error detected:', {\n message: error.message,\n stack: error.stack,\n name: error.name,\n });\n return c.json(\n { error: 'An error occurred while processing your request' },\n 500,\n );\n }\n\n logger.error('Error details:', {\n message: error.message,\n stack: error.stack,\n name: error.name,\n });\n return c.json(\n { error: 'An error occurred while processing your request' },\n 500,\n );\n }\n\n logger.error('Unknown error:', error);\n return c.json(\n { error: 'An error occurred while processing your request' },\n 500,\n );\n};\n"],"mappings":"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","names":["isDatabaseError"]}
@@ -1,4 +1,4 @@
1
- import { U as User } from '../index-CScADcDn.js';
1
+ import { U as User } from '../index-DCxsFKQ2.js';
2
2
  import 'hono';
3
3
  import '@hono/zod-openapi';
4
4
  import '../index-ULpI-i0z.js';
@@ -1,4 +1,4 @@
1
- import { A as AuthConfig } from '../index-CScADcDn.js';
1
+ import { A as AuthConfig } from '../index-DCxsFKQ2.js';
2
2
  import 'hono';
3
3
  import '@hono/zod-openapi';
4
4
  import '../index-ULpI-i0z.js';
@@ -36,13 +36,18 @@ var createOpenApiConfig = (config) => {
36
36
  },
37
37
  { name: "User Roles", description: "User-role assignment (IAM)" },
38
38
  { name: "Sessions", description: "Session management (IAM)" },
39
- { name: "Verifications", description: "Verification management (IAM)" }
39
+ { name: "Verifications", description: "Verification management (IAM)" },
40
+ { name: "System", description: "System initialization" }
40
41
  ],
41
42
  "x-tagGroups": [
42
43
  {
43
44
  name: "Authentication",
44
45
  tags: ["Auth", "Profile", "Password", "Email", "Phone"]
45
46
  },
47
+ {
48
+ name: "System",
49
+ tags: ["System"]
50
+ },
46
51
  {
47
52
  name: "IAM Management",
48
53
  tags: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/openapi-config.ts"],"sourcesContent":["import type { AuthConfig } from '../types';\n\nexport const createOpenApiConfig = (config: AuthConfig) => {\n const basePath = config.basePath || '';\n const servers = config.docs?.servers || [\n {\n url: 'http://localhost:3000',\n description: 'Development server',\n },\n ];\n const serversWithBasePath = servers.map((server) => ({\n ...server,\n url: `${server.url.replace(/\\/$/, '')}${basePath}`,\n }));\n\n return {\n openapi: '3.0.0',\n info: {\n title: config.docs?.title || 'IAM API',\n version: config.docs?.version || '1.0.0',\n description: 'Complete Identity and Access Management API',\n },\n servers: serversWithBasePath,\n tags: [\n { name: 'Auth', description: 'Authentication endpoints' },\n { name: 'Profile', description: 'User profile management' },\n { name: 'Password', description: 'Password management' },\n { name: 'Email', description: 'Email verification' },\n { name: 'Phone', description: 'Phone verification' },\n { name: 'Users', description: 'User management (IAM)' },\n { name: 'Tenants', description: 'Tenant management (IAM)' },\n { name: 'Domains', description: 'Domain management (IAM)' },\n { name: 'Roles', description: 'Role management (IAM)' },\n { name: 'Permissions', description: 'Permission management (IAM)' },\n {\n name: 'Role Permissions',\n description: 'Role-permission mapping (IAM)',\n },\n { name: 'User Roles', description: 'User-role assignment (IAM)' },\n { name: 'Sessions', description: 'Session management (IAM)' },\n { name: 'Verifications', description: 'Verification management (IAM)' },\n ],\n 'x-tagGroups': [\n {\n name: 'Authentication',\n tags: ['Auth', 'Profile', 'Password', 'Email', 'Phone'],\n },\n {\n name: 'IAM Management',\n tags: [\n 'Users',\n 'Tenants',\n 'Domains',\n 'Roles',\n 'Permissions',\n 'Role Permissions',\n 'User Roles',\n 'Sessions',\n 'Verifications',\n ],\n },\n ],\n };\n};\n"],"mappings":";AAEO,IAAM,sBAAsB,CAAC,WAAuB;AACzD,QAAM,WAAW,OAAO,YAAY;AACpC,QAAM,UAAU,OAAO,MAAM,WAAW;AAAA,IACtC;AAAA,MACE,KAAK;AAAA,MACL,aAAa;AAAA,IACf;AAAA,EACF;AACA,QAAM,sBAAsB,QAAQ,IAAI,CAAC,YAAY;AAAA,IACnD,GAAG;AAAA,IACH,KAAK,GAAG,OAAO,IAAI,QAAQ,OAAO,EAAE,CAAC,GAAG,QAAQ;AAAA,EAClD,EAAE;AAEF,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,MACJ,OAAO,OAAO,MAAM,SAAS;AAAA,MAC7B,SAAS,OAAO,MAAM,WAAW;AAAA,MACjC,aAAa;AAAA,IACf;AAAA,IACA,SAAS;AAAA,IACT,MAAM;AAAA,MACJ,EAAE,MAAM,QAAQ,aAAa,2BAA2B;AAAA,MACxD,EAAE,MAAM,WAAW,aAAa,0BAA0B;AAAA,MAC1D,EAAE,MAAM,YAAY,aAAa,sBAAsB;AAAA,MACvD,EAAE,MAAM,SAAS,aAAa,qBAAqB;AAAA,MACnD,EAAE,MAAM,SAAS,aAAa,qBAAqB;AAAA,MACnD,EAAE,MAAM,SAAS,aAAa,wBAAwB;AAAA,MACtD,EAAE,MAAM,WAAW,aAAa,0BAA0B;AAAA,MAC1D,EAAE,MAAM,WAAW,aAAa,0BAA0B;AAAA,MAC1D,EAAE,MAAM,SAAS,aAAa,wBAAwB;AAAA,MACtD,EAAE,MAAM,eAAe,aAAa,8BAA8B;AAAA,MAClE;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,EAAE,MAAM,cAAc,aAAa,6BAA6B;AAAA,MAChE,EAAE,MAAM,YAAY,aAAa,2BAA2B;AAAA,MAC5D,EAAE,MAAM,iBAAiB,aAAa,gCAAgC;AAAA,IACxE;AAAA,IACA,eAAe;AAAA,MACb;AAAA,QACE,MAAM;AAAA,QACN,MAAM,CAAC,QAAQ,WAAW,YAAY,SAAS,OAAO;AAAA,MACxD;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/lib/openapi-config.ts"],"sourcesContent":["import type { AuthConfig } from '../types';\n\nexport const createOpenApiConfig = (config: AuthConfig) => {\n const basePath = config.basePath || '';\n const servers = config.docs?.servers || [\n {\n url: 'http://localhost:3000',\n description: 'Development server',\n },\n ];\n const serversWithBasePath = servers.map((server) => ({\n ...server,\n url: `${server.url.replace(/\\/$/, '')}${basePath}`,\n }));\n\n return {\n openapi: '3.0.0',\n info: {\n title: config.docs?.title || 'IAM API',\n version: config.docs?.version || '1.0.0',\n description: 'Complete Identity and Access Management API',\n },\n servers: serversWithBasePath,\n tags: [\n { name: 'Auth', description: 'Authentication endpoints' },\n { name: 'Profile', description: 'User profile management' },\n { name: 'Password', description: 'Password management' },\n { name: 'Email', description: 'Email verification' },\n { name: 'Phone', description: 'Phone verification' },\n { name: 'Users', description: 'User management (IAM)' },\n { name: 'Tenants', description: 'Tenant management (IAM)' },\n { name: 'Domains', description: 'Domain management (IAM)' },\n { name: 'Roles', description: 'Role management (IAM)' },\n { name: 'Permissions', description: 'Permission management (IAM)' },\n {\n name: 'Role Permissions',\n description: 'Role-permission mapping (IAM)',\n },\n { name: 'User Roles', description: 'User-role assignment (IAM)' },\n { name: 'Sessions', description: 'Session management (IAM)' },\n { name: 'Verifications', description: 'Verification management (IAM)' },\n { name: 'System', description: 'System initialization' },\n ],\n 'x-tagGroups': [\n {\n name: 'Authentication',\n tags: ['Auth', 'Profile', 'Password', 'Email', 'Phone'],\n },\n {\n name: 'System',\n tags: ['System'],\n },\n {\n name: 'IAM Management',\n tags: [\n 'Users',\n 'Tenants',\n 'Domains',\n 'Roles',\n 'Permissions',\n 'Role Permissions',\n 'User Roles',\n 'Sessions',\n 'Verifications',\n ],\n },\n ],\n };\n};\n"],"mappings":";AAEO,IAAM,sBAAsB,CAAC,WAAuB;AACzD,QAAM,WAAW,OAAO,YAAY;AACpC,QAAM,UAAU,OAAO,MAAM,WAAW;AAAA,IACtC;AAAA,MACE,KAAK;AAAA,MACL,aAAa;AAAA,IACf;AAAA,EACF;AACA,QAAM,sBAAsB,QAAQ,IAAI,CAAC,YAAY;AAAA,IACnD,GAAG;AAAA,IACH,KAAK,GAAG,OAAO,IAAI,QAAQ,OAAO,EAAE,CAAC,GAAG,QAAQ;AAAA,EAClD,EAAE;AAEF,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,MACJ,OAAO,OAAO,MAAM,SAAS;AAAA,MAC7B,SAAS,OAAO,MAAM,WAAW;AAAA,MACjC,aAAa;AAAA,IACf;AAAA,IACA,SAAS;AAAA,IACT,MAAM;AAAA,MACJ,EAAE,MAAM,QAAQ,aAAa,2BAA2B;AAAA,MACxD,EAAE,MAAM,WAAW,aAAa,0BAA0B;AAAA,MAC1D,EAAE,MAAM,YAAY,aAAa,sBAAsB;AAAA,MACvD,EAAE,MAAM,SAAS,aAAa,qBAAqB;AAAA,MACnD,EAAE,MAAM,SAAS,aAAa,qBAAqB;AAAA,MACnD,EAAE,MAAM,SAAS,aAAa,wBAAwB;AAAA,MACtD,EAAE,MAAM,WAAW,aAAa,0BAA0B;AAAA,MAC1D,EAAE,MAAM,WAAW,aAAa,0BAA0B;AAAA,MAC1D,EAAE,MAAM,SAAS,aAAa,wBAAwB;AAAA,MACtD,EAAE,MAAM,eAAe,aAAa,8BAA8B;AAAA,MAClE;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,EAAE,MAAM,cAAc,aAAa,6BAA6B;AAAA,MAChE,EAAE,MAAM,YAAY,aAAa,2BAA2B;AAAA,MAC5D,EAAE,MAAM,iBAAiB,aAAa,gCAAgC;AAAA,MACtE,EAAE,MAAM,UAAU,aAAa,wBAAwB;AAAA,IACzD;AAAA,IACA,eAAe;AAAA,MACb;AAAA,QACE,MAAM;AAAA,QACN,MAAM,CAAC,QAAQ,WAAW,YAAY,SAAS,OAAO;AAAA,MACxD;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM,CAAC,QAAQ;AAAA,MACjB;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,15 @@
1
+ import { A as AuthConfig } from '../index-DCxsFKQ2.js';
2
+ import 'hono';
3
+ import '@hono/zod-openapi';
4
+ import '../index-ULpI-i0z.js';
5
+ import 'drizzle-orm/node-postgres';
6
+ import 'drizzle-orm/pg-core';
7
+ import 'drizzle-orm';
8
+ import 'pg';
9
+
10
+ declare const createPhoneField: (config: AuthConfig) => {
11
+ validate: (phone: string) => boolean;
12
+ regex: RegExp;
13
+ };
14
+
15
+ export { createPhoneField };
@@ -0,0 +1,15 @@
1
+ // src/lib/phone-validation.ts
2
+ var createPhoneField = (config) => {
3
+ const phoneRegex = config.phone.phoneRegex || /^(\+2519|\+2517|2519|2517|09|07)\d{8}$/;
4
+ const regex = typeof phoneRegex === "string" ? new RegExp(phoneRegex) : phoneRegex;
5
+ return {
6
+ validate: (phone) => {
7
+ return regex.test(phone.trim());
8
+ },
9
+ regex
10
+ };
11
+ };
12
+ export {
13
+ createPhoneField
14
+ };
15
+ //# sourceMappingURL=phone-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/phone-validation.ts"],"sourcesContent":["import type { AuthConfig } from '../types';\n\nexport const createPhoneField = (config: AuthConfig) => {\n const phoneRegex =\n config.phone.phoneRegex || /^(\\+2519|\\+2517|2519|2517|09|07)\\d{8}$/;\n const regex =\n typeof phoneRegex === 'string' ? new RegExp(phoneRegex) : phoneRegex;\n\n return {\n validate: (phone: string): boolean => {\n return regex.test(phone.trim());\n },\n regex,\n };\n};\n"],"mappings":";AAEO,IAAM,mBAAmB,CAAC,WAAuB;AACtD,QAAM,aACJ,OAAO,MAAM,cAAc;AAC7B,QAAM,QACJ,OAAO,eAAe,WAAW,IAAI,OAAO,UAAU,IAAI;AAE5D,SAAO;AAAA,IACL,UAAU,CAAC,UAA2B;AACpC,aAAO,MAAM,KAAK,MAAM,KAAK,CAAC;AAAA,IAChC;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
@@ -1,4 +1,4 @@
1
- import { b as SessionConfig } from '../index-CScADcDn.js';
1
+ import { c as SessionConfig } from '../index-DCxsFKQ2.js';
2
2
  import 'hono';
3
3
  import '@hono/zod-openapi';
4
4
  import '../index-ULpI-i0z.js';
@@ -1,4 +1,4 @@
1
- import { A as AuthConfig } from '../index-CScADcDn.js';
1
+ import { A as AuthConfig } from '../index-DCxsFKQ2.js';
2
2
  import 'hono';
3
3
  import '@hono/zod-openapi';
4
4
  import '../index-ULpI-i0z.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mesob/auth-hono",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -32,7 +32,7 @@
32
32
  "pg": "^8.16.3",
33
33
  "resend": "^4.8.0",
34
34
  "zod": "^4.1.12",
35
- "@mesob/common": "0.1.0"
35
+ "@mesob/common": "0.2.0"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@types/jsonwebtoken": "^9.0.10",