@mesob/auth-hono 0.0.3

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/send-email.ts"],"sourcesContent":["import { Resend } from 'resend';\n\ntype SendEmailProps = {\n key: string;\n provider: 'resend';\n to: string[];\n subject: string;\n html: string;\n text: string;\n from: string;\n};\n\nexport const SendEmail = async ({\n key,\n provider,\n to,\n subject,\n html,\n text,\n from,\n}: SendEmailProps) => {\n switch (provider) {\n case 'resend':\n return await sendEmailWithResend(key, to, subject, html, text, from);\n default:\n throw new Error(`Unsupported email provider: ${provider}`);\n }\n};\n\nconst sendEmailWithResend = async (\n key: string,\n to: string[],\n subject: string,\n html: string,\n text: string,\n from: string,\n) => {\n const resend = new Resend(key);\n\n return await resend.emails.send({\n from,\n to,\n subject,\n html,\n text,\n });\n};\n"],"mappings":";AAAA,SAAS,cAAc;AAYhB,IAAM,YAAY,OAAO;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAsB;AACpB,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,MAAM,oBAAoB,KAAK,IAAI,SAAS,MAAM,MAAM,IAAI;AAAA,IACrE;AACE,YAAM,IAAI,MAAM,+BAA+B,QAAQ,EAAE;AAAA,EAC7D;AACF;AAEA,IAAM,sBAAsB,OAC1B,KACA,IACA,SACA,MACA,MACA,SACG;AACH,QAAM,SAAS,IAAI,OAAO,GAAG;AAE7B,SAAO,MAAM,OAAO,OAAO,KAAK;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -0,0 +1,23 @@
1
+ declare const SESSION_COOKIE_NAME = "session_token";
2
+ type SessionMeta = Record<string, unknown>;
3
+ type BuildSessionPayloadOptions = {
4
+ id: string;
5
+ expiresAt: string;
6
+ createdAt?: string;
7
+ userAgent?: string | null;
8
+ ip?: string | null;
9
+ };
10
+ declare const buildSessionPayload: ({ id, expiresAt, createdAt, userAgent, ip, }: BuildSessionPayloadOptions) => {
11
+ id: string;
12
+ expiresAt: string;
13
+ createdAt: string | undefined;
14
+ userAgent: string | null;
15
+ ip: string | null;
16
+ };
17
+ declare const generateHandle: (seed?: string | null) => string;
18
+ declare const getSessionExpiresAt: (days?: number) => string;
19
+ declare const parseDuration: (duration: string) => number;
20
+ declare const addDuration: (duration: string) => string;
21
+ declare const generateOtpCode: (length?: number) => string;
22
+
23
+ export { type BuildSessionPayloadOptions, SESSION_COOKIE_NAME, type SessionMeta, addDuration, buildSessionPayload, generateHandle, generateOtpCode, getSessionExpiresAt, parseDuration };
@@ -0,0 +1,58 @@
1
+ // src/lib/session.ts
2
+ import { dayjs } from "@mesob/common";
3
+ var SESSION_COOKIE_NAME = "session_token";
4
+ var buildSessionPayload = ({
5
+ id,
6
+ expiresAt,
7
+ createdAt,
8
+ userAgent,
9
+ ip
10
+ }) => ({
11
+ id,
12
+ expiresAt,
13
+ createdAt,
14
+ userAgent: userAgent || null,
15
+ ip: ip || null
16
+ });
17
+ var generateHandle = (seed) => {
18
+ const base = seed?.replace(/[^a-zA-Z0-9]/g, "").toLowerCase() || `user${Math.random().toString(36).slice(2, 8)}`;
19
+ return `${base}-${Math.random().toString(36).slice(2, 6)}`;
20
+ };
21
+ var getSessionExpiresAt = (days = 30) => dayjs().add(days, "day").toISOString();
22
+ var parseDuration = (duration) => {
23
+ const match = duration.match(/^(\d+)([smhd])$/);
24
+ if (!match) {
25
+ throw new Error(`Invalid duration format: ${duration}`);
26
+ }
27
+ const value = Number.parseInt(match[1], 10);
28
+ const unit = match[2];
29
+ const multipliers = {
30
+ s: 1,
31
+ m: 60,
32
+ h: 3600,
33
+ d: 86400
34
+ };
35
+ return value * (multipliers[unit] || 1);
36
+ };
37
+ var addDuration = (duration) => {
38
+ const seconds = parseDuration(duration);
39
+ return dayjs().add(seconds, "second").toISOString();
40
+ };
41
+ var generateOtpCode = (length = 6) => {
42
+ const digits = "0123456789";
43
+ let code = "";
44
+ for (let i = 0; i < length; i++) {
45
+ code += digits[Math.floor(Math.random() * digits.length)];
46
+ }
47
+ return code;
48
+ };
49
+ export {
50
+ SESSION_COOKIE_NAME,
51
+ addDuration,
52
+ buildSessionPayload,
53
+ generateHandle,
54
+ generateOtpCode,
55
+ getSessionExpiresAt,
56
+ parseDuration
57
+ };
58
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/session.ts"],"sourcesContent":["import { dayjs } from '@mesob/common';\n\nexport const SESSION_COOKIE_NAME = 'session_token';\n\nexport type SessionMeta = Record<string, unknown>;\n\nexport type BuildSessionPayloadOptions = {\n id: string;\n expiresAt: string;\n createdAt?: string;\n userAgent?: string | null;\n ip?: string | null;\n};\n\nexport const buildSessionPayload = ({\n id,\n expiresAt,\n createdAt,\n userAgent,\n ip,\n}: BuildSessionPayloadOptions) => ({\n id,\n expiresAt,\n createdAt,\n userAgent: userAgent || null,\n ip: ip || null,\n});\n\nexport const generateHandle = (seed?: string | null) => {\n const base =\n seed?.replace(/[^a-zA-Z0-9]/g, '').toLowerCase() ||\n `user${Math.random().toString(36).slice(2, 8)}`;\n return `${base}-${Math.random().toString(36).slice(2, 6)}`;\n};\n\nexport const getSessionExpiresAt = (days = 30) =>\n dayjs().add(days, 'day').toISOString();\n\nexport const parseDuration = (duration: string): number => {\n const match = duration.match(/^(\\d+)([smhd])$/);\n if (!match) {\n throw new Error(`Invalid duration format: ${duration}`);\n }\n const value = Number.parseInt(match[1]!, 10);\n const unit = match[2]!;\n const multipliers: Record<string, number> = {\n s: 1,\n m: 60,\n h: 3600,\n d: 86400,\n };\n return value * (multipliers[unit] || 1);\n};\n\nexport const addDuration = (duration: string): string => {\n const seconds = parseDuration(duration);\n return dayjs().add(seconds, 'second').toISOString();\n};\n\nexport const generateOtpCode = (length = 6): string => {\n const digits = '0123456789';\n let code = '';\n for (let i = 0; i < length; i++) {\n code += digits[Math.floor(Math.random() * digits.length)]!;\n }\n return code;\n};\n"],"mappings":";AAAA,SAAS,aAAa;AAEf,IAAM,sBAAsB;AAY5B,IAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,OAAmC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW,aAAa;AAAA,EACxB,IAAI,MAAM;AACZ;AAEO,IAAM,iBAAiB,CAAC,SAAyB;AACtD,QAAM,OACJ,MAAM,QAAQ,iBAAiB,EAAE,EAAE,YAAY,KAC/C,OAAO,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAC/C,SAAO,GAAG,IAAI,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAC1D;AAEO,IAAM,sBAAsB,CAAC,OAAO,OACzC,MAAM,EAAE,IAAI,MAAM,KAAK,EAAE,YAAY;AAEhC,IAAM,gBAAgB,CAAC,aAA6B;AACzD,QAAM,QAAQ,SAAS,MAAM,iBAAiB;AAC9C,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,4BAA4B,QAAQ,EAAE;AAAA,EACxD;AACA,QAAM,QAAQ,OAAO,SAAS,MAAM,CAAC,GAAI,EAAE;AAC3C,QAAM,OAAO,MAAM,CAAC;AACpB,QAAM,cAAsC;AAAA,IAC1C,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,SAAO,SAAS,YAAY,IAAI,KAAK;AACvC;AAEO,IAAM,cAAc,CAAC,aAA6B;AACvD,QAAM,UAAU,cAAc,QAAQ;AACtC,SAAO,MAAM,EAAE,IAAI,SAAS,QAAQ,EAAE,YAAY;AACpD;AAEO,IAAM,kBAAkB,CAAC,SAAS,MAAc;AACrD,QAAM,SAAS;AACf,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,YAAQ,OAAO,KAAK,MAAM,KAAK,OAAO,IAAI,OAAO,MAAM,CAAC;AAAA,EAC1D;AACA,SAAO;AACT;","names":[]}
@@ -0,0 +1,5 @@
1
+ import { A as AuthConfig } from '../index-CwcbaCwi.js';
2
+
3
+ declare const ensureTenantId: (config: AuthConfig, tenantId: string | undefined) => string;
4
+
5
+ export { ensureTenantId };
@@ -0,0 +1,22 @@
1
+ // src/lib/tenant.ts
2
+ import { HTTPException } from "hono/http-exception";
3
+ var ensureTenantId = (config, tenantId) => {
4
+ if (config.enableTenant) {
5
+ if (!tenantId) {
6
+ throw new HTTPException(400, {
7
+ message: "Missing tenantId. Tenant isolation is enabled."
8
+ });
9
+ }
10
+ return tenantId;
11
+ }
12
+ if (!config.tenantId) {
13
+ throw new HTTPException(500, {
14
+ message: "tenantId must be provided in config when enableTenant is false."
15
+ });
16
+ }
17
+ return config.tenantId;
18
+ };
19
+ export {
20
+ ensureTenantId
21
+ };
22
+ //# sourceMappingURL=tenant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/tenant.ts"],"sourcesContent":["import { HTTPException } from 'hono/http-exception';\nimport type { AuthConfig } from '../types';\n\nexport const ensureTenantId = (\n config: AuthConfig,\n tenantId: string | undefined,\n): string => {\n if (config.enableTenant) {\n if (!tenantId) {\n throw new HTTPException(400, {\n message: 'Missing tenantId. Tenant isolation is enabled.',\n });\n }\n return tenantId;\n }\n\n // When tenant is disabled, use tenantId from config\n if (!config.tenantId) {\n throw new HTTPException(500, {\n message:\n 'tenantId must be provided in config when enableTenant is false.',\n });\n }\n return config.tenantId;\n};\n"],"mappings":";AAAA,SAAS,qBAAqB;AAGvB,IAAM,iBAAiB,CAC5B,QACA,aACW;AACX,MAAI,OAAO,cAAc;AACvB,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,cAAc,KAAK;AAAA,QAC3B,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAGA,MAAI,CAAC,OAAO,UAAU;AACpB,UAAM,IAAI,cAAc,KAAK;AAAA,MAC3B,SACE;AAAA,IACJ,CAAC;AAAA,EACH;AACA,SAAO,OAAO;AAChB;","names":[]}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@mesob/auth-hono",
3
+ "version": "0.0.3",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ },
13
+ "./lib/*": {
14
+ "types": "./dist/lib/*.d.ts",
15
+ "default": "./dist/lib/*.js"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "dependencies": {
22
+ "@hono/zod-openapi": "^1.1.4",
23
+ "@noble/hashes": "^2.0.1",
24
+ "argon2-wasm-edge": "^1.0.23",
25
+ "drizzle-orm": "^0.44.4",
26
+ "hash-wasm": "^4.12.0",
27
+ "hono": "^4.10.3",
28
+ "jsonwebtoken": "^9.0.2",
29
+ "pg": "^8.16.3",
30
+ "resend": "^4.8.0",
31
+ "zod": "^4.1.12",
32
+ "@mesob/common": "0.0.3"
33
+ },
34
+ "devDependencies": {
35
+ "@types/jsonwebtoken": "^9.0.10",
36
+ "@types/node": "^20",
37
+ "@types/pg": "^8.15.6",
38
+ "drizzle-kit": "^0.31.7",
39
+ "tsup": "^8.5.0",
40
+ "typescript": "^5.7.2",
41
+ "vitest": "^2.1.8"
42
+ },
43
+ "publishConfig": {
44
+ "access": "public"
45
+ },
46
+ "scripts": {
47
+ "build": "tsup",
48
+ "dev": "tsup --watch",
49
+ "lint": "biome check --write .",
50
+ "db:introspect": "drizzle-kit introspect --config=./drizzle.config.ts && drizzle-kit drop",
51
+ "postdb:introspect": "biome format --write './src/db/schema.ts' './src/db/relations.ts'",
52
+ "check-types": "tsc --noEmit",
53
+ "test": "vitest run",
54
+ "test:watch": "vitest"
55
+ }
56
+ }