@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.
- package/dist/index-CwcbaCwi.d.ts +71 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +2397 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/crypto.d.ts +7 -0
- package/dist/lib/crypto.js +94 -0
- package/dist/lib/crypto.js.map +1 -0
- package/dist/lib/jwt.d.ts +15 -0
- package/dist/lib/jwt.js +25 -0
- package/dist/lib/jwt.js.map +1 -0
- package/dist/lib/send-email.d.ts +14 -0
- package/dist/lib/send-email.js +32 -0
- package/dist/lib/send-email.js.map +1 -0
- package/dist/lib/session.d.ts +23 -0
- package/dist/lib/session.js +58 -0
- package/dist/lib/session.js.map +1 -0
- package/dist/lib/tenant.d.ts +5 -0
- package/dist/lib/tenant.js +22 -0
- package/dist/lib/tenant.js.map +1 -0
- package/package.json +56 -0
|
@@ -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,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
|
+
}
|