@arkstack/driver-h3 0.4.1 → 0.4.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.
@@ -24,11 +24,14 @@ const auth = async (event, next) => {
24
24
  url: event.req.url,
25
25
  path: getEventPath(event)
26
26
  };
27
- const user = await Auth.make().setRequest(requestSource).authorizeToken(token);
27
+ const auth = Auth.make().setRequest(requestSource);
28
+ const user = await auth.authorizeToken(token);
28
29
  event.context.user = user;
30
+ event.context.auth = auth;
29
31
  event.context.authUser = user;
30
32
  event.context.authToken = token;
31
33
  event.req.user = user;
34
+ event.req.auth = auth;
32
35
  event.req.authUser = user;
33
36
  event.req.authToken = token;
34
37
  if (Hook.has("middleware:auth", "after")) Hook.get("middleware:auth", "after")?.(event);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/middlewares/auth.ts","../../src/middlewares/request-logger.ts","../../src/middlewares/static-asset-handler.ts"],"sourcesContent":["import { Auth, AuthenticationException } from '@arkstack/auth'\n\nimport type { H3Event } from 'h3'\nimport { Hook } from '@arkstack/common'\n\nexport const auth = async (event: H3Event, next: () => unknown | Promise<unknown>) => {\n try {\n const token = readBearerToken(event.req.headers.get('authorization'))\n\n if (!token) {\n throw new AuthenticationException('Unauthenticated', {\n req: {\n headers: event.req.headers,\n method: event.req.method,\n url: event.req.url,\n path: getEventPath(event),\n },\n status: 401,\n })\n }\n\n if (Hook.has('middleware:auth', 'before'))\n Hook.get('middleware:auth', 'before')?.(event)\n\n const requestSource = {\n headers: event.req.headers,\n method: event.req.method,\n url: event.req.url,\n path: getEventPath(event),\n }\n const user = await Auth.make().setRequest(requestSource).authorizeToken(token)\n\n event.context.user = user\n event.context.authUser = user\n event.context.authToken = token;\n (event.req as any).user = user;\n (event.req as any).authUser = user;\n (event.req as any).authToken = token\n\n if (Hook.has('middleware:auth', 'after'))\n Hook.get('middleware:auth', 'after')?.(event)\n\n return await next()\n } catch (error) {\n if (Hook.has('middleware:auth', 'error'))\n Hook.get('middleware:auth', 'error')?.(error, event)\n\n throw error\n }\n}\n\nconst readBearerToken = (authorization: string | null) => {\n if (!authorization?.startsWith('Bearer ')) {\n return null\n }\n\n return authorization.substring(7)\n}\n\nconst getEventPath = (event: H3Event) => event.req._url?.pathname\n","import { Logger, nodeEnv } from '@arkstack/common'\n\nimport { H3Middleware } from '..'\n\nconst colors: Record<string, 'green' | 'blue' | 'yellow' | 'red' | 'cyan'> = {\n GET: 'green',\n POST: 'blue',\n PUT: 'yellow',\n DELETE: 'red',\n PATCH: 'cyan',\n}\n\n/**\n * Middleware to log incoming requests and their response times.\n * \n * @param config Configuration options for the request logger middleware.\n * @param config.allowInProduction If true, the logger will also log requests in production environment. Default is false. \n * @returns H3Middleware function\n */\nexport const requestLogger = ({\n allowInProduction = false,\n}: {\n allowInProduction?: boolean\n} = {}): H3Middleware => async (event, next) => {\n if (nodeEnv() === 'prod' && !allowInProduction) return next()\n\n await next()\n\n const start = Date.now()\n const req = event.req\n const status = event.res.status || 200\n const duration = Date.now() - start\n\n Logger.log([\n [`[${req.method}]`, colors[req.method] || 'green'],\n [req.url, 'cyan'],\n [status.toString(), status >= 500 ? 'red' : status >= 400 ? 'yellow' : 'green'],\n [`- ${duration}ms`, 'dim']\n ], ' ')\n}","import { H3Event, serveStatic } from 'h3'\nimport { readFile, stat } from 'node:fs/promises'\nimport { join, resolve } from 'node:path'\n\nexport const staticAssetHandler = (publicPath: string = 'public') => {\n const rootPath = resolve(process.cwd(), publicPath)\n\n return (event: H3Event) => {\n const { pathname } = new URL(event.req.url)\n\n if (!/\\.[a-zA-Z0-9]+$/.test(pathname)) return\n if (pathname.startsWith('/.') || pathname.includes('..')) return\n\n event.res.headers.set('Cache-Control', 'public, max-age=31536000, immutable')\n event.res.headers.set('Access-Control-Allow-Origin', '*')\n event.res.headers.set('Access-Control-Allow-Methods', 'GET, HEAD, OPTIONS')\n event.res.headers.set('Access-Control-Allow-Headers', 'Content-Type, Authorization')\n\n return serveStatic(event, {\n indexNames: ['/index.html'],\n getContents: (id) => {\n const relativePath = id.replace(/^\\/+/, '')\n const file = join(rootPath, relativePath)\n\n return readFile(file).catch(() => null) as never\n },\n getMeta: async (id) => {\n const relativePath = id.replace(/^\\/+/, '')\n const file = join(rootPath, relativePath)\n const stats = await stat(file).catch(() => undefined)\n\n if (stats?.isFile()) {\n return {\n size: stats.size,\n mtime: stats.mtimeMs,\n }\n }\n },\n })\n }\n}"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/middlewares/auth.ts","../../src/middlewares/request-logger.ts","../../src/middlewares/static-asset-handler.ts"],"sourcesContent":["import { Auth, AuthenticationException } from '@arkstack/auth'\n\nimport type { H3Event } from 'h3'\nimport { Hook } from '@arkstack/common'\n\nexport const auth = async (event: H3Event, next: () => unknown | Promise<unknown>) => {\n try {\n const token = readBearerToken(event.req.headers.get('authorization'))\n\n if (!token) {\n throw new AuthenticationException('Unauthenticated', {\n req: {\n headers: event.req.headers,\n method: event.req.method,\n url: event.req.url,\n path: getEventPath(event),\n },\n status: 401,\n })\n }\n\n if (Hook.has('middleware:auth', 'before'))\n Hook.get('middleware:auth', 'before')?.(event)\n\n const requestSource = {\n headers: event.req.headers,\n method: event.req.method,\n url: event.req.url,\n path: getEventPath(event),\n }\n const auth = Auth.make().setRequest(requestSource)\n const user = await auth.authorizeToken(token)\n\n event.context.user = user\n event.context.auth = auth\n event.context.authUser = user\n event.context.authToken = token;\n (event.req as any).user = user;\n (event.req as any).auth = auth;\n (event.req as any).authUser = user;\n (event.req as any).authToken = token\n\n if (Hook.has('middleware:auth', 'after'))\n Hook.get('middleware:auth', 'after')?.(event)\n\n return await next()\n } catch (error) {\n if (Hook.has('middleware:auth', 'error'))\n Hook.get('middleware:auth', 'error')?.(error, event)\n\n throw error\n }\n}\n\nconst readBearerToken = (authorization: string | null) => {\n if (!authorization?.startsWith('Bearer ')) {\n return null\n }\n\n return authorization.substring(7)\n}\n\nconst getEventPath = (event: H3Event) => event.req._url?.pathname\n","import { Logger, nodeEnv } from '@arkstack/common'\n\nimport { H3Middleware } from '..'\n\nconst colors: Record<string, 'green' | 'blue' | 'yellow' | 'red' | 'cyan'> = {\n GET: 'green',\n POST: 'blue',\n PUT: 'yellow',\n DELETE: 'red',\n PATCH: 'cyan',\n}\n\n/**\n * Middleware to log incoming requests and their response times.\n * \n * @param config Configuration options for the request logger middleware.\n * @param config.allowInProduction If true, the logger will also log requests in production environment. Default is false. \n * @returns H3Middleware function\n */\nexport const requestLogger = ({\n allowInProduction = false,\n}: {\n allowInProduction?: boolean\n} = {}): H3Middleware => async (event, next) => {\n if (nodeEnv() === 'prod' && !allowInProduction) return next()\n\n await next()\n\n const start = Date.now()\n const req = event.req\n const status = event.res.status || 200\n const duration = Date.now() - start\n\n Logger.log([\n [`[${req.method}]`, colors[req.method] || 'green'],\n [req.url, 'cyan'],\n [status.toString(), status >= 500 ? 'red' : status >= 400 ? 'yellow' : 'green'],\n [`- ${duration}ms`, 'dim']\n ], ' ')\n}","import { H3Event, serveStatic } from 'h3'\nimport { readFile, stat } from 'node:fs/promises'\nimport { join, resolve } from 'node:path'\n\nexport const staticAssetHandler = (publicPath: string = 'public') => {\n const rootPath = resolve(process.cwd(), publicPath)\n\n return (event: H3Event) => {\n const { pathname } = new URL(event.req.url)\n\n if (!/\\.[a-zA-Z0-9]+$/.test(pathname)) return\n if (pathname.startsWith('/.') || pathname.includes('..')) return\n\n event.res.headers.set('Cache-Control', 'public, max-age=31536000, immutable')\n event.res.headers.set('Access-Control-Allow-Origin', '*')\n event.res.headers.set('Access-Control-Allow-Methods', 'GET, HEAD, OPTIONS')\n event.res.headers.set('Access-Control-Allow-Headers', 'Content-Type, Authorization')\n\n return serveStatic(event, {\n indexNames: ['/index.html'],\n getContents: (id) => {\n const relativePath = id.replace(/^\\/+/, '')\n const file = join(rootPath, relativePath)\n\n return readFile(file).catch(() => null) as never\n },\n getMeta: async (id) => {\n const relativePath = id.replace(/^\\/+/, '')\n const file = join(rootPath, relativePath)\n const stats = await stat(file).catch(() => undefined)\n\n if (stats?.isFile()) {\n return {\n size: stats.size,\n mtime: stats.mtimeMs,\n }\n }\n },\n })\n }\n}"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arkstack/driver-h3",
3
- "version": "0.4.1",
3
+ "version": "0.4.3",
4
4
  "type": "module",
5
5
  "description": "H3 driver package for Arkstack providing H3-specific implementations of core Arkstack features such as routing, middleware, and database integration.",
6
6
  "homepage": "https://arkstack.toneflix.net",
@@ -39,12 +39,12 @@
39
39
  "clear-router": "^2.5.4",
40
40
  "@resora/plugin-clear-router": "^1.0.3",
41
41
  "resora": "^1.2.0",
42
- "@arkstack/contract": "^0.4.1"
42
+ "@arkstack/contract": "^0.4.3"
43
43
  },
44
44
  "peerDependencies": {
45
45
  "h3": "2.0.1-rc.16",
46
- "@arkstack/auth": "^0.4.1",
47
- "@arkstack/common": "^0.4.1"
46
+ "@arkstack/auth": "^0.4.3",
47
+ "@arkstack/common": "^0.4.3"
48
48
  },
49
49
  "peerDependenciesMeta": {
50
50
  "@arkstack/auth": {