@arkstack/http 0.10.1 → 0.10.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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redirect-Bt3re8Qq.js","names":["Request","BaseRequest","Response","BaseResponse","Request","defineClearRouterPlugin","defineKanunPlugin","Request","Response"],"sources":["../src/helpers.ts","../src/Request.ts","../src/Response.ts","../src/session/FlashBag.ts","../src/session/utils.ts","../src/session/ErrorBag.ts","../src/session/Session.ts","../src/old.ts","../src/session/helpers.ts","../src/session/cookie.ts","../src/session/serialization.ts","../src/session/encryption.ts","../src/session/drivers/BaseSessionDriver.ts","../src/session/drivers/CookieSessionDriver.ts","../src/session/drivers/DatabaseSessionDriver.ts","../src/session/drivers/FileSessionDriver.ts","../src/session/config.ts","../src/session/plugins.ts","../src/redirect.ts"],"sourcesContent":["import { HeaderMap, HeaderSource, HeaderValue, RequestSource } from './types/Http'\n\nexport const unwrapRequestSource = <TUser> (\n source: RequestSource<TUser>\n): RequestSource<TUser> => {\n if (source.headers) {\n return source\n }\n\n if (source.req) {\n return source.req\n }\n\n if (source.request) {\n return source.request\n }\n\n return source\n}\n\nexport const makeHeaders = (headers?: HeaderSource) => {\n return new Headers(normalizeHeaders(headers))\n}\n\nexport const normalizeHeaders = (headers?: HeaderSource): HeaderMap => {\n const normalized: HeaderMap = {}\n\n if (!headers) {\n return normalized\n }\n\n if (isHeaders(headers)) {\n headers.forEach((value, key) => {\n normalized[key.toLowerCase()] = value\n })\n\n return normalized\n }\n\n for (const [key, value] of Object.entries(headers)) {\n const normalizedValue = normalizeHeaderValue(value)\n\n if (typeof normalizedValue === 'string') {\n normalized[key.toLowerCase()] = normalizedValue\n }\n }\n\n return normalized\n}\n\nexport const normalizeHeaderValue = (value: HeaderValue) => {\n if (Array.isArray(value)) {\n return value.join(', ')\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value)\n }\n\n return value ?? undefined\n}\n\nexport const isHeaders = (value: unknown): value is Headers => (\n typeof Headers !== 'undefined' && value instanceof Headers\n)\n\nexport const isRecord = (value: unknown): value is Record<PropertyKey, any> => {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n","import { HeaderMap, RequestOptions, RequestSource } from './types/Http'\nimport { isRecord, normalizeHeaders, unwrapRequestSource } from './helpers'\n\nimport { Request as BaseRequest } from 'clear-router'\n\n/**\n * Represents an HTTP request, providing a consistent interface for accessing request data.\n * \n * @author 3m1n3nc3\n */\nexport class Request<TUser = unknown> extends BaseRequest {\n readonly headers: HeaderMap\n readonly ip: string | null\n readonly source?: unknown\n user?: TUser\n authToken?: string\n\n constructor(options: RequestOptions<TUser> = {}) {\n super(options)\n\n this.headers = normalizeHeaders(options.headers)\n if (this.method)\n this.method = options.method!\n if (this.url)\n this.url = options.url!\n if (this.path)\n this.path = options.path!\n this.ip = options.ip ?? null\n this.user = options.user\n this.authToken = options.authToken\n this.source = options.source\n\n globalThis.request = (key?: string) => key ? this.input(key) : this\n }\n\n static from<TUser = unknown> (\n source?: Request<TUser> | RequestSource<TUser>\n ): Request<TUser> | undefined {\n if (!source) {\n return undefined\n }\n\n if (source instanceof Request) {\n return source\n }\n\n const request = unwrapRequestSource(source)\n\n return new Request<TUser>({\n headers: request.headers,\n method: request.method,\n url: request.originalUrl ?? request.url,\n path: request.path,\n ip: request.ip ?? null,\n user: request.user,\n authToken: request.authToken,\n source,\n })\n }\n\n header (name: string): string {\n return this.headers[name.toLowerCase()]\n }\n\n bearerToken (): string | null {\n const authorization = this.header('authorization')\n\n if (!authorization?.startsWith('Bearer ')) {\n return null\n }\n\n return authorization.substring(7)\n }\n\n setUser (user: TUser) {\n this.user = user\n\n if (isRecord(this.source)) {\n this.source.user = user\n }\n\n return this\n }\n}","import { HeaderSource, ResponseSource } from './types/Http'\nimport { isRecord, makeHeaders, normalizeHeaders } from './helpers'\n\nimport { Response as BaseResponse } from 'clear-router'\nimport { RequestData } from 'clear-router/types/basic'\n\n/**\n * Represents an HTTP response, providing a consistent interface for accessing response data.\n * \n * @author 3m1n3nc3\n */\nexport class Response<TBody = unknown> extends BaseResponse {\n override body: TBody\n readonly source?: unknown\n\n constructor(options: {\n statusCode?: number;\n headers?: HeaderSource;\n body?: TBody;\n source?: unknown;\n } = {}) {\n super({\n body: options.body,\n headers: makeHeaders(options.headers),\n statusCode: options.statusCode ?? 200,\n })\n\n this.body = options.body ?? {} as TBody\n this.source = options.source\n\n globalThis.response = () => this\n }\n\n static from<TBody extends RequestData = RequestData> (\n source?: Response<TBody> | ResponseSource\n ): Response<TBody> | undefined {\n if (!source) {\n return undefined\n }\n\n if (source instanceof Response) {\n return source\n }\n\n return new Response<TBody>({\n statusCode: typeof source.status === 'number' ? source.status : source.statusCode,\n headers: source.headers,\n source,\n })\n }\n\n status (code: number) {\n this.statusCode = code\n\n if (isRecord(this.source)) {\n if (typeof this.source.status === 'function') {\n this.source.status(code)\n } else {\n this.source.statusCode = code\n }\n }\n\n return this\n }\n\n header (name: string, value: string) {\n this.headers.set(name.toLowerCase(), value)\n\n if (isRecord(this.source) && typeof this.source.setHeader === 'function') {\n this.source.setHeader(name, value)\n }\n\n return this\n }\n\n getHeaders () {\n return normalizeHeaders(this.headers)\n }\n\n json (body: TBody) {\n this.body = body\n\n if (isRecord(this.source) && typeof this.source.json === 'function') {\n return this.source.json(body)\n }\n\n return body\n }\n\n send (body: TBody) {\n this.body = body\n\n if (isRecord(this.source) && typeof this.source.send === 'function') {\n return this.source.send(body)\n }\n\n return body\n }\n}","export class FlashBag<T = unknown> {\n protected bag: Record<string, T> = {}\n private sweepKeys = new Set<string>()\n\n constructor(items?: Record<string, T>) {\n this.bag = { ...(items || {}) }\n this.sweepKeys = new Set(Object.keys(this.bag))\n }\n\n put (key: string, value: T) {\n this.bag[key] = value\n this.sweepKeys.delete(key)\n\n return this\n }\n\n set (key: string, value: T) {\n return this.put(key, value)\n }\n\n get (key: string, defaultValue?: T): T {\n return (key in this.bag ? this.bag[key] : defaultValue) as T\n }\n\n has (key?: string | string[] | null): boolean {\n if (Array.isArray(key)) {\n return key.every(item => this.has(item))\n }\n\n if (key) {\n return key in this.bag\n }\n\n return this.any()\n }\n\n any () {\n return Object.keys(this.bag).length > 0\n }\n\n isEmpty () {\n return !this.any()\n }\n\n isNotEmpty () {\n return this.any()\n }\n\n keys () {\n return Object.keys(this.bag)\n }\n\n all () {\n return { ...this.bag }\n }\n\n clear (key?: string | string[]) {\n if (Array.isArray(key)) {\n for (const item of key) {\n delete this.bag[item]\n this.sweepKeys.delete(item)\n }\n\n return this\n }\n\n if (key) {\n delete this.bag[key]\n this.sweepKeys.delete(key)\n\n return this\n }\n\n this.bag = {}\n this.sweepKeys.clear()\n\n return this\n }\n\n forget (key: string) {\n return this.clear(key)\n }\n\n markForSweep (keys: string[] = this.keys()) {\n this.sweepKeys = new Set(keys)\n\n return this\n }\n\n sweep () {\n for (const key of this.sweepKeys) {\n delete this.bag[key]\n }\n\n this.sweepKeys = new Set(Object.keys(this.bag))\n\n return this\n }\n\n toJSON () {\n return this.all()\n }\n}\n","import type { SessionErrorRecord, SessionErrorValue } from './types'\n\nimport { isRecord } from '../helpers'\n\nexport const defaultErrorKey = '_'\nexport const sessionKey = Symbol.for('arkstack:http:session')\n\nconst asMessageRecord = (value: unknown): SessionErrorRecord | undefined => {\n if (!isRecord(value)) {\n return undefined\n }\n\n return value as SessionErrorRecord\n}\n\nconst callRecordMethod = (source: Record<string, any>, method: string): SessionErrorRecord | undefined => {\n if (typeof source[method] !== 'function') {\n return undefined\n }\n\n const value = source[method]()\n\n return asMessageRecord(value)\n}\n\nexport const resolveMessageRecord = (source: unknown): SessionErrorRecord | undefined => {\n if (!isRecord(source)) {\n return undefined\n }\n\n if (typeof source.getMessageBag === 'function') {\n const bag = source.getMessageBag()\n\n if (bag && bag !== source) {\n const messages = resolveMessageRecord(bag)\n\n if (messages) {\n return messages\n }\n }\n }\n\n if (typeof source.errors === 'function') {\n const errors = source.errors()\n const messages = resolveMessageRecord(errors) || asMessageRecord(errors)\n\n if (messages) {\n return messages\n }\n }\n\n return callRecordMethod(source, 'getMessages')\n || callRecordMethod(source, 'messagesRaw')\n || callRecordMethod(source, 'toArray')\n || resolveMessageRecord(source.errors)\n || asMessageRecord(source.errors)\n}\n\nexport const getValidationIssueField = (issue: Record<string, any>) => {\n if (typeof issue.field === 'string') {\n return issue.field\n }\n\n if (typeof issue.attribute === 'string') {\n return issue.attribute\n }\n\n if (typeof issue.key === 'string') {\n return issue.key\n }\n\n if (typeof issue.path === 'string') {\n return issue.path\n }\n\n if (Array.isArray(issue.path)) {\n return issue.path.join('.') || defaultErrorKey\n }\n\n return defaultErrorKey\n}\n\nexport const toMessages = (value: SessionErrorValue): string[] => {\n if (Array.isArray(value)) {\n return value.flatMap(item => toMessages(item))\n }\n\n if (value instanceof Error) {\n return [value.message]\n }\n\n if (isRecord(value) && typeof value.message === 'string') {\n return [value.message]\n }\n\n if (value === null || typeof value === 'undefined') {\n return []\n }\n\n return [String(value)]\n}\n\nexport const getPath = <T = any> (source: Record<string, any>, key: string, defaultValue?: T): T => {\n const value = key.split('.').reduce<any>((current, part) => {\n if (!isRecord(current) && !Array.isArray(current)) {\n return undefined\n }\n\n return current[part]\n }, source)\n\n return (typeof value === 'undefined' ? defaultValue : value) as T\n}\n","import type { SessionErrorRecord, SessionErrorSource, SessionErrorValue } from './types'\nimport { defaultErrorKey, getValidationIssueField, resolveMessageRecord, toMessages } from './utils'\n\nimport { FlashBag } from './FlashBag'\nimport { isRecord } from '../helpers'\n\nexport class ErrorBag extends FlashBag<string[]> {\n constructor(errors?: SessionErrorSource) {\n super()\n\n if (errors) {\n this.merge(errors)\n this.markForSweep()\n }\n }\n\n add (field: string, message: SessionErrorValue) {\n const key = field || defaultErrorKey\n const messages = toMessages(message)\n\n if (!messages.length) {\n return this\n }\n\n this.put(key, [\n ...(this.bag[key] || []),\n ...messages,\n ])\n\n return this\n }\n\n addIf (condition: boolean, field: string, message: SessionErrorValue) {\n if (condition) {\n this.add(field, message)\n }\n\n return this\n }\n\n merge (errors: SessionErrorSource) {\n const incoming = resolveMessageRecord(errors) || (isRecord(errors) ? errors as SessionErrorRecord : undefined)\n\n if (!incoming) {\n return this.validation(errors)\n }\n\n for (const [field, messages] of Object.entries(incoming)) {\n this.add(field, messages)\n }\n\n return this\n }\n\n validation (error: unknown): ErrorBag {\n if (!error) {\n return this\n }\n\n if (error instanceof ErrorBag) {\n return this.merge(error)\n }\n\n const messages = resolveMessageRecord(error)\n\n if (messages) {\n return this.merge(messages)\n }\n\n if (Array.isArray(error)) {\n for (const item of error) {\n if (isRecord(item) && 'message' in item) {\n this.add(getValidationIssueField(item), item.message)\n } else {\n this.add(defaultErrorKey, item)\n }\n }\n\n return this\n }\n\n if (isRecord(error)) {\n if (typeof error.errors === 'function') {\n return this.validation(error.errors())\n }\n\n if (error.errors) {\n return this.validation(error.errors)\n }\n\n if (Array.isArray(error.issues)) {\n return this.validation(error.issues)\n }\n\n if ('message' in error) {\n return this.add(getValidationIssueField(error), error.message)\n }\n\n return this.merge(error as SessionErrorRecord)\n }\n\n if (error instanceof Error) {\n return this.add(defaultErrorKey, error.message)\n }\n\n return this.add(defaultErrorKey, error)\n }\n\n keys () {\n return Object.keys(this.bag)\n }\n\n get (field: string = defaultErrorKey) {\n return [...(this.bag[field] || [])]\n }\n\n first (field?: string | null) {\n if (field) {\n return this.bag[field]?.[0] || ''\n }\n\n return this.all()[0] || ''\n }\n\n has (field?: string | string[] | null): boolean {\n if (Array.isArray(field)) {\n return field.every(key => this.has(key))\n }\n\n if (field) {\n return (this.bag[field]?.length || 0) > 0\n }\n\n return this.any()\n }\n\n hasAny (fields: string | string[]) {\n const keys = Array.isArray(fields) ? fields : [fields]\n\n return keys.some(key => this.has(key))\n }\n\n missing (fields: string | string[]) {\n const keys = Array.isArray(fields) ? fields : [fields]\n\n return keys.every(key => !this.has(key))\n }\n\n any () {\n return Object.values(this.bag).some(messages => messages.length > 0)\n }\n\n isEmpty () {\n return !this.any()\n }\n\n isNotEmpty () {\n return this.any()\n }\n\n count () {\n return Object.values(this.bag).reduce((total, messages) => total + messages.length, 0)\n }\n\n all () {\n return Object.values(this.bag).flat() as never\n }\n\n unique () {\n return [...new Set(this.all())]\n }\n\n clear (field?: string | string[]) {\n super.clear(field)\n\n return this\n }\n\n forget (field: string) {\n return this.clear(field)\n }\n\n messagesRaw () {\n return this.toJSON()\n }\n\n getMessages () {\n return this.messagesRaw()\n }\n\n getMessageBag () {\n return this\n }\n\n toArray () {\n return this.toJSON()\n }\n\n toJSON () {\n return Object.entries(this.bag).reduce<Record<string, string[]>>((errors, [field, messages]) => {\n errors[field] = [...messages]\n\n return errors\n }, {})\n }\n}\n","import type {\n SessionDriverResult,\n SessionErrorRecord,\n SessionErrorValue,\n SessionInitialState,\n SessionPayload,\n} from './types'\n\nimport { ErrorBag } from './ErrorBag'\nimport { FlashBag } from './FlashBag'\n\nexport class Session {\n public readonly errors: ErrorBag\n public readonly flashBag: FlashBag\n readonly id?: string\n private data: Record<string, any>\n private persistent?: SessionDriverResult\n private saveQueue: Promise<void> = Promise.resolve()\n\n constructor(\n initial?: SessionInitialState | Record<string, any> | Session,\n persistent?: SessionDriverResult,\n ) {\n const current = initial instanceof Session ? initial : undefined\n const state = current\n ? current.snapshot()\n : initial &&\n ('data' in initial || 'errors' in initial || 'flash' in initial)\n ? (initial as SessionInitialState)\n : { data: initial as Record<string, any> | undefined }\n\n this.id = persistent?.id ?? current?.id\n this.persistent = persistent ?? current?.persistent\n this.saveQueue = current?.saveQueue ?? this.saveQueue\n this.data = current ? current.data : { ...(state.data || {}) }\n this.errors = current\n ? current.errors\n : state.errors instanceof ErrorBag\n ? state.errors\n : new ErrorBag(state.errors)\n this.flashBag = current\n ? current.flashBag\n : state.flash instanceof FlashBag\n ? state.flash\n : new FlashBag(state.flash as Record<string, any> | undefined)\n\n const helper = ((key?: string) =>\n key ? this.get(key) : this) as typeof globalThis.session &\n Partial<Session> &\n Record<string, any>\n\n Object.assign(helper, {\n get: this.get.bind(this),\n put: this.put.bind(this),\n set: this.set.bind(this),\n has: this.has.bind(this),\n forget: this.forget.bind(this),\n clear: this.clear.bind(this),\n all: this.all.bind(this),\n flash: this.flash.bind(this),\n getFlash: this.getFlash.bind(this),\n hasErrors: this.hasErrors.bind(this),\n clearErrors: this.clearErrors.bind(this),\n errors: this.errors,\n flashBag: this.flashBag,\n })\n\n globalThis.session = helper as typeof globalThis.session\n }\n\n private snapshot (): SessionPayload {\n return {\n data: this.all(),\n errors: this.errors.toJSON(),\n flash: this.flashBag.toJSON(),\n }\n }\n\n private queuePersist () {\n void this.save()\n }\n\n async save () {\n const payload = this.snapshot()\n\n const previous = this.saveQueue.catch(() => undefined)\n\n this.saveQueue = previous.then(async () => {\n await this.persistent?.save(payload)\n })\n\n await this.saveQueue\n\n return this\n }\n\n async destroy () {\n this.data = {}\n this.errors.clear()\n this.flashBag.clear()\n await this.persistent?.destroy?.()\n\n return this\n }\n\n /**\n * Get an item from the session bag\n *\n * @param key\n * @param defaultValue\n * @returns\n */\n get<T = any> (key: string, defaultValue?: T): T {\n return (key in this.data ? this.data[key] : defaultValue) as T\n }\n\n /**\n * Add an item to the session bag\n *\n * @param key\n * @param defaultValue\n * @returns\n */\n put<T = any> (key: string, value: T) {\n this.data[key] = value\n this.queuePersist()\n\n return this\n }\n\n /**\n * Add an item to the session bag\n *\n * @param key\n * @param defaultValue\n * @returns\n */\n set<T = any> (key: string, value: T) {\n return this.put(key, value)\n }\n\n /**\n * Check if an item exist in the session bag\n *\n * @param key\n * @returns\n */\n has (key: string) {\n return key in this.data\n }\n\n /**\n * Remove an item from the session bag\n *\n * @param key\n * @returns\n */\n forget (key: string) {\n delete this.data[key]\n this.queuePersist()\n\n return this\n }\n\n /**\n * Clear the session bag\n *\n * @returns\n */\n clear () {\n this.data = {}\n this.errors.clear()\n this.flashBag.clear()\n this.queuePersist()\n\n return this\n }\n\n /**\n * Get all items in the session bag\n *\n * @returns\n */\n all () {\n return { ...this.data }\n }\n\n /**\n * Add a flash item for the next request\n *\n * @param key\n * @param value\n * @returns\n */\n flash<T = any> (key: string, value: T) {\n this.flashBag.put(key, value)\n this.queuePersist()\n\n return this\n }\n\n /**\n * Get a flash item\n *\n * @param key\n * @param defaultValue\n * @returns\n */\n getFlash<T = any> (key: string, defaultValue?: T): T {\n return this.flashBag.get(key, defaultValue) as T\n }\n\n /**\n * Sweep flashed data that was loaded for this request\n *\n * @returns\n */\n async sweepFlash () {\n this.errors.sweep()\n this.flashBag.sweep()\n await this.save()\n\n return this\n }\n\n /**\n * Add an error to the session error bag\n *\n * @param field\n * @param message\n * @returns\n */\n addError (field: string, message: SessionErrorValue) {\n this.errors.add(field, message)\n this.queuePersist()\n\n return this\n }\n\n /**\n * Add multiple errors to the session error bag\n *\n * @param errors\n * @returns\n */\n addErrors (errors: SessionErrorRecord | ErrorBag) {\n this.errors.merge(errors)\n this.queuePersist()\n\n return this\n }\n\n /**\n * Add a validation error to the session error bag\n *\n * @param error\n * @returns\n */\n addValidationErrors (error: unknown) {\n this.errors.validation(error)\n this.queuePersist()\n\n return this\n }\n\n /**\n * Check if the session error bag has any errors\n *\n * @param field\n * @returns\n */\n hasErrors (field?: string) {\n return this.errors.has(field)\n }\n\n /**\n * Clear all errors in the session error bag\n *\n * @param field\n * @returns\n */\n clearErrors (field?: string) {\n this.errors.clear(field)\n this.queuePersist()\n\n return this\n }\n\n /**\n * Parse session for views\n *\n * @returns\n */\n forView () {\n return {\n ...this.all(),\n errors: this.errors,\n flash: this.flashBag,\n }\n }\n\n /**\n * Return session as json\n *\n * @returns\n */\n toJSON () {\n return {\n ...this.all(),\n errors: this.errors.toJSON(),\n flash: this.flashBag.toJSON(),\n }\n }\n}\n","import { Request } from './Request'\nimport { getPath } from './session/utils'\nimport { isRecord } from './helpers'\n\nconst requestInput = () => {\n const request = globalThis.request?.()\n\n if (request instanceof Request) {\n if (isRecord(request.body)) {\n return request.body\n }\n\n const source = isRecord(request.source) ? request.source : undefined\n\n if (source && typeof source.getBody === 'function') {\n return source.getBody() ?? {}\n }\n\n if (isRecord(source?.body)) {\n return source.body\n }\n }\n\n if (isRecord(request) && typeof request.getBody === 'function') {\n return request.getBody() ?? {}\n }\n\n return isRecord(request?.body) ? request.body : {}\n}\n\nexport const old = <T = any> (key?: string, defaultValue?: T): T => {\n const input = requestInput()\n\n if (!key) {\n return input as T\n }\n\n return getPath(input, key, defaultValue) as T\n}\n","import type { SessionDriverResult, SessionInitialState } from './types'\n\nimport { Session } from './Session'\nimport { isRecord } from '../helpers'\nimport { sessionKey } from './utils'\nimport { old } from '../old'\n\nconst sweepRegisteredKey = Symbol.for('arkstack:http:flash-sweep-registered')\n\nconst attachSessionProperty = (target: Record<PropertyKey, any>, session: Session) => {\n target.httpSession = session\n\n if (!('session' in target) || target.session instanceof Session) {\n target.session = session\n }\n}\n\nconst responseSource = (target: Record<PropertyKey, any>) => {\n return target.res\n ?? target.ctx?.res\n ?? target.response?.source\n ?? target.clearResponse?.source\n ?? target.context?.res\n ?? target.context?.response?.source\n}\n\nexport const registerResponseFlashSweep = (target: unknown, session?: Session) => {\n if (!isRecord(target)) {\n return\n }\n\n const current = session ?? getSession(target)\n const res = responseSource(target)\n\n if (!(current instanceof Session) || !isRecord(res) || typeof res.end !== 'function' || res[sweepRegisteredKey]) {\n return\n }\n\n res[sweepRegisteredKey] = true\n const end = res.end.bind(res)\n\n res.end = (...args: any[]) => {\n void current.sweepFlash()\n .catch(() => undefined)\n .finally(() => end(...args))\n\n return res\n }\n}\n\nexport const attachViewState = (target: Record<PropertyKey, any>, session: Session) => {\n attachSessionProperty(target, session)\n target.errors = session.errors\n\n if (isRecord(target.req)) {\n attachSessionProperty(target.req, session)\n target.req.errors = session.errors\n target.req.old = old\n }\n\n if (isRecord(target.res)) {\n target.res.locals = {\n ...(target.res.locals || {}),\n session,\n errors: session.errors,\n flash: session.flashBag,\n old,\n }\n }\n\n if (isRecord(target.response?.source)) {\n target.response.source.locals = {\n ...(target.response.source.locals || {}),\n session,\n errors: session.errors,\n flash: session.flashBag,\n old,\n }\n }\n\n if (isRecord(target.context)) {\n attachSessionProperty(target.context, session)\n target.context.errors = session.errors\n target.context.flash = session.flashBag\n target.context.old = old\n }\n\n if (isRecord(target.state)) {\n attachSessionProperty(target.state, session)\n target.state.errors = session.errors\n target.state.flash = session.flashBag\n target.state.old = old\n }\n\n if (typeof target.set === 'function') {\n target.set('session', session)\n target.set('errors', session.errors)\n target.set('flash', session.flashBag)\n target.set('old', old)\n }\n}\n\n/**\n * Ensure a valid session exists\n * \n * @param ctx \n * @param initial \n * @returns \n */\nexport const ensureSession = (\n ctx: unknown,\n initial?: SessionInitialState | Record<string, any>,\n persistent?: SessionDriverResult\n): Session => {\n if (!isRecord(ctx)) {\n return new Session(initial, persistent)\n }\n\n const existing = ctx[sessionKey]\n ?? (ctx.session instanceof Session ? ctx.session : undefined)\n ?? (isRecord(ctx.req) && ctx.req.httpSession instanceof Session ? ctx.req.httpSession : undefined)\n const session = existing instanceof Session\n ? existing\n : new Session(initial, persistent)\n\n ctx[sessionKey] = session\n attachViewState(ctx, session)\n\n return session\n}\n\n/**\n * Get the current session\n * \n * @param ctx \n * @returns \n */\nexport const getSession = (ctx: unknown): Session | undefined => {\n if (!isRecord(ctx)) {\n return undefined\n }\n\n const session = ctx[sessionKey] ?? ctx.session\n\n return session instanceof Session ? session : undefined\n}","import type { HttpContextLike, cookie_options } from './types'\nimport { createHmac, randomBytes, timingSafeEqual } from 'node:crypto'\n\nimport { isRecord } from '../helpers'\n\nexport const generateSessionId = () => randomBytes(32).toString('base64url')\n\nexport const signValue = (value: string, secret: string) =>\n createHmac('sha256', secret).update(value).digest('base64url')\n\nexport const encodeSignedValue = (value: string, secret: string) =>\n `${value}.${signValue(value, secret)}`\n\nexport const decodeSignedValue = (\n value: string | undefined,\n secret: string,\n) => {\n if (!value) return undefined\n const index = value.lastIndexOf('.')\n if (index < 1) return undefined\n const payload = value.slice(0, index)\n const signature = value.slice(index + 1)\n const expected = signValue(payload, secret)\n const signatureBuffer = Buffer.from(signature)\n const expectedBuffer = Buffer.from(expected)\n if (signatureBuffer.length !== expectedBuffer.length) return undefined\n\n return timingSafeEqual(signatureBuffer, expectedBuffer) ? payload : undefined\n}\n\nexport const encodeJson = (value: unknown) =>\n Buffer.from(JSON.stringify(value), 'utf8').toString('base64url')\n\nexport const decodeJson = <T = unknown> (\n value: string | undefined,\n): T | undefined => {\n if (!value) return undefined\n try {\n return JSON.parse(Buffer.from(value, 'base64url').toString('utf8')) as T\n } catch {\n return undefined\n }\n}\n\nexport const parseCookies = (\n header?: string | string[] | null,\n): Record<string, string> => {\n const source = Array.isArray(header) ? header.join('; ') : header || ''\n\n return source.split(';').reduce<Record<string, string>>((cookies, part) => {\n const index = part.indexOf('=')\n if (index < 0) return cookies\n const key = part.slice(0, index).trim()\n const value = part.slice(index + 1).trim()\n if (key) cookies[key] = decodeURIComponent(value)\n\n return cookies\n }, {})\n}\n\nexport const getCookie = (context: HttpContextLike, name: string) => {\n const ctx = isRecord(context.ctx) ? context.ctx : context\n const request = context.request || ctx.clearRequest || ctx.req || ctx.request\n const headers =\n request?.headers || ctx.headers || ctx.req?.headers || ctx.request?.headers\n const cookie =\n typeof headers?.get === 'function'\n ? headers.get('cookie')\n : headers?.cookie\n\n return parseCookies(cookie)[name]\n}\n\nexport const serializeCookie = (\n name: string,\n value: string,\n options: cookie_options = {},\n) => {\n const parts = [`${name}=${encodeURIComponent(value)}`]\n if (typeof options.maxAge === 'number')\n parts.push(`Max-Age=${Math.max(0, Math.floor(options.maxAge))}`)\n if (options.expires) parts.push(`Expires=${options.expires.toUTCString()}`)\n parts.push(`Path=${options.path || '/'}`)\n if (options.domain) parts.push(`Domain=${options.domain}`)\n if (options.httpOnly !== false) parts.push('HttpOnly')\n if (options.secure) parts.push('Secure')\n if (options.sameSite) parts.push(`SameSite=${options.sameSite}`)\n\n return parts.join('; ')\n}\n\nconst splitSetCookieHeader = (value: string) => {\n return value.split(/,\\s*(?=[^;,\\s]+=)/).filter(Boolean)\n}\n\nconst withoutCookie = (current: unknown, cookieName: string) => {\n const entries = Array.isArray(current)\n ? current.flatMap((item) => splitSetCookieHeader(String(item)))\n : typeof current === 'string'\n ? splitSetCookieHeader(current)\n : []\n\n return entries.filter(\n (cookie) => !cookie.trim().startsWith(`${cookieName}=`),\n )\n}\n\nconst upsertHeaderValue = (\n target: any,\n headerName: string,\n cookieName: string,\n value: string,\n) => {\n if (!target) return false\n\n if (typeof target.setHeader === 'function') {\n const current =\n typeof target.getHeader === 'function'\n ? target.getHeader(headerName)\n : undefined\n const next = [...withoutCookie(current, cookieName), value]\n\n target.setHeader(headerName, next)\n\n return true\n }\n\n if (target.headers && typeof target.headers.set === 'function') {\n const current = target.headers.get(headerName)\n const next = [...withoutCookie(current, cookieName), value]\n\n target.headers.set(headerName, next.join(', '))\n\n return true\n }\n\n if (typeof target.appendHeader === 'function') {\n target.appendHeader(headerName, value)\n\n return true\n }\n\n\n if (typeof target.append === 'function') {\n target.append(headerName, value)\n\n return true\n }\n\n return false\n}\n\nexport const setCookie = (\n context: HttpContextLike,\n name: string,\n value: string,\n options: cookie_options = {},\n) => {\n const ctx = isRecord(context.ctx) ? context.ctx : context\n const cookie = serializeCookie(name, value, options)\n const response = context.response || ctx.clearResponse\n if (response?.headers && typeof response.headers.set === 'function') {\n const current = response.headers.get('set-cookie')\n const next = [...withoutCookie(current, name), cookie]\n\n response.headers.set('set-cookie', next.join(', '))\n }\n\n const assigned =\n upsertHeaderValue(response?.source, 'Set-Cookie', name, cookie) ||\n upsertHeaderValue(ctx.res, 'Set-Cookie', name, cookie) ||\n upsertHeaderValue(ctx.response, 'Set-Cookie', name, cookie) ||\n upsertHeaderValue(ctx.response?.source, 'Set-Cookie', name, cookie) ||\n upsertHeaderValue(ctx.event?.res, 'Set-Cookie', name, cookie)\n\n void assigned\n\n return cookie\n}\n","import type { SessionPayload } from './types'\n\nconst byteLength = (value: string) => Buffer.byteLength(value, 'utf8')\n\nconst serializeValue = (value: unknown): string => {\n if (value === null || typeof value === 'undefined') {\n return 'N;'\n }\n\n if (typeof value === 'boolean') {\n return `b:${value ? 1 : 0};`\n }\n\n if (typeof value === 'number') {\n return Number.isInteger(value) ? `i:${value};` : `d:${value};`\n }\n\n if (typeof value === 'string') {\n return `s:${byteLength(value)}:\"${value}\";`\n }\n\n if (Array.isArray(value)) {\n return serializeEntries(value.map((item, index) => [index, item]))\n }\n\n if (typeof value === 'object') {\n return serializeEntries(Object.entries(value as Record<string, unknown>))\n }\n\n return serializeValue(String(value))\n}\n\nconst serializeEntries = (entries: Array<[string | number, unknown]>) => {\n return `a:${entries.length}:{${entries.map(([key, value]) => serializeValue(key) + serializeValue(value)).join('')}}`\n}\n\nclass Parser {\n private offset = 0\n\n constructor(private readonly source: string) { }\n\n parse (): unknown {\n const type = this.source[this.offset]\n this.offset += type === 'N' ? 1 : 2\n\n switch (type) {\n case 'N':\n this.expect(';')\n\n return null\n case 'b':\n return this.readUntil(';') === '1'\n case 'i':\n return Number.parseInt(this.readUntil(';'), 10)\n case 'd':\n return Number.parseFloat(this.readUntil(';'))\n case 's':\n return this.parseString()\n case 'a':\n return this.parseArray()\n default:\n throw new Error(`Unsupported serialized session value: ${type}`)\n }\n }\n\n private parseString () {\n const length = Number.parseInt(this.readUntil(':'), 10)\n this.expect('\"')\n let end = this.offset\n let bytes = 0\n\n while (end < this.source.length && bytes < length) {\n const char = this.source[end]\n bytes += Buffer.byteLength(char, 'utf8')\n end += 1\n }\n\n const value = this.source.slice(this.offset, end)\n this.offset = end\n this.expect('\"')\n this.expect(';')\n\n return value\n }\n\n private parseArray () {\n const length = Number.parseInt(this.readUntil(':'), 10)\n this.expect('{')\n const entries: Array<[string | number, unknown]> = []\n let sequential = true\n\n for (let index = 0; index < length; index += 1) {\n const key = this.parse() as string | number\n const value = this.parse()\n entries.push([key, value])\n\n if (key !== index) {\n sequential = false\n }\n }\n\n this.expect('}')\n\n if (sequential) {\n return entries.map(([, value]) => value)\n }\n\n return entries.reduce<Record<string, unknown>>((record, [key, value]) => {\n record[String(key)] = value\n\n return record\n }, {})\n }\n\n private readUntil (token: string) {\n const index = this.source.indexOf(token, this.offset)\n\n if (index < 0) {\n throw new Error('Invalid serialized session payload')\n }\n\n const value = this.source.slice(this.offset, index)\n this.offset = index + token.length\n\n return value\n }\n\n private expect (token: string) {\n if (this.source.slice(this.offset, this.offset + token.length) !== token) {\n throw new Error('Invalid serialized session payload')\n }\n\n this.offset += token.length\n }\n}\n\nexport const encodeSessionPayload = (\n payload: SessionPayload & { id?: string },\n) => {\n return serializeValue(payload)\n}\n\nconst normalizeSessionPayload = (payload: unknown) => {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {\n return payload\n }\n\n const record = payload as Record<string, unknown>\n\n for (const key of ['data', 'errors', 'flash']) {\n if (Array.isArray(record[key]) && record[key].length === 0) {\n record[key] = {}\n }\n }\n\n return record\n}\n\nexport const decodeSessionPayload = <\n T extends SessionPayload & { id?: string } = SessionPayload & { id?: string },\n> (\n value: string | undefined,\n): T | undefined => {\n if (!value) {\n return undefined\n }\n\n try {\n return normalizeSessionPayload(new Parser(value).parse()) as T\n } catch {\n return undefined\n }\n}\n","import { createCipheriv, createDecipheriv, createHash, createHmac, randomBytes, timingSafeEqual } from 'node:crypto'\n\ntype LaravelEncryptedPayload = {\n iv?: string\n value?: string\n mac?: string\n tag?: string\n}\n\nconst keyFromSecret = (secret: string) => {\n if (secret.startsWith('base64:')) {\n const decoded = Buffer.from(secret.slice(7), 'base64')\n\n if (decoded.length === 32) {\n return decoded\n }\n }\n\n const raw = Buffer.from(secret, 'base64')\n\n if (raw.length === 32) {\n return raw\n }\n\n return createHash('sha256').update(secret).digest()\n}\n\nconst macFor = (iv: string, value: string, key: Buffer) => {\n return createHmac('sha256', key).update(iv + value).digest('hex')\n}\n\nexport const encryptSessionValue = (value: string, secret: string) => {\n const key = keyFromSecret(secret)\n const iv = randomBytes(16)\n const ivValue = iv.toString('base64')\n const cipher = createCipheriv('aes-256-cbc', key, iv)\n const encrypted = Buffer.concat([\n cipher.update(value, 'utf8'),\n cipher.final(),\n ]).toString('base64')\n const payload: LaravelEncryptedPayload = {\n iv: ivValue,\n value: encrypted,\n mac: macFor(ivValue, encrypted, key),\n tag: '',\n }\n\n return JSON.stringify(payload)\n}\n\nexport const decryptSessionValue = (payload: string | undefined, secret: string) => {\n if (!payload) {\n return undefined\n }\n\n try {\n const decoded = JSON.parse(payload.startsWith('{') ? payload : Buffer.from(payload, 'base64').toString('utf8')) as LaravelEncryptedPayload\n\n if (!decoded.iv || !decoded.value || !decoded.mac) {\n return undefined\n }\n\n const key = keyFromSecret(secret)\n const expected = macFor(decoded.iv, decoded.value, key)\n const actualBuffer = Buffer.from(decoded.mac)\n const expectedBuffer = Buffer.from(expected)\n\n if (actualBuffer.length !== expectedBuffer.length || !timingSafeEqual(actualBuffer, expectedBuffer)) {\n return undefined\n }\n\n const decipher = createDecipheriv('aes-256-cbc', key, Buffer.from(decoded.iv, 'base64'))\n\n return Buffer.concat([\n decipher.update(Buffer.from(decoded.value, 'base64')),\n decipher.final(),\n ]).toString('utf8')\n } catch {\n return undefined\n }\n}\n","import { BaseSessionDriverOptions, HttpContextLike, SessionDriver, SessionDriverResult, cookie_options } from '../types'\nimport { decodeSignedValue, encodeSignedValue, getCookie, setCookie } from '../cookie'\nimport { decryptSessionValue, encryptSessionValue } from '../encryption'\n\nconst defaultSecret = () =>\n String(\n process.env.SESSION_SECRET ||\n process.env.APP_KEY ||\n 'arkstack-session-secret',\n )\n\nconst defaultcookie_options = (ttl?: number): cookie_options => ({\n httpOnly: true,\n sameSite: 'Lax',\n secure: process.env.NODE_ENV === 'production',\n path: '/',\n maxAge: ttl,\n})\n\nexport abstract class BaseSessionDriver implements SessionDriver {\n readonly cookie: string\n readonly secret: string\n readonly ttl?: number\n readonly cookie_options: cookie_options\n\n constructor(options: BaseSessionDriverOptions = {}) {\n this.cookie = options.cookie || 'arkstack_session'\n this.secret = options.secret || defaultSecret()\n this.ttl = options.ttl\n this.cookie_options = {\n ...defaultcookie_options(options.ttl),\n ...(options.cookie_options || {}),\n }\n }\n\n protected readSessionId (context: HttpContextLike) {\n return decodeSignedValue(getCookie(context, this.cookie), this.secret)\n }\n\n protected encryptPayload (value: string) {\n return encryptSessionValue(value, this.secret)\n }\n\n protected decryptPayload (value: string | undefined) {\n return decryptSessionValue(value, this.secret)\n }\n\n protected writeSessionId (context: HttpContextLike, id: string) {\n setCookie(\n context,\n this.cookie,\n encodeSignedValue(id, this.secret),\n this.cookie_options,\n )\n }\n\n abstract start (context: HttpContextLike): Promise<SessionDriverResult>;\n}","import { HttpContextLike, SessionDriverResult, SessionPayload } from '../types'\nimport { decodeJson, decodeSignedValue, generateSessionId, getCookie, setCookie } from '../cookie'\nimport { decodeSessionPayload, encodeSessionPayload } from '../serialization'\n\nimport { BaseSessionDriver } from './BaseSessionDriver'\n\nexport class CookieSessionDriver extends BaseSessionDriver {\n async start (context: HttpContextLike): Promise<SessionDriverResult> {\n const cookie = getCookie(context, this.cookie)\n const decoded = this.decryptPayload(cookie) ?? decodeSignedValue(cookie, this.secret)\n const payload = decodeSessionPayload<SessionPayload & { id?: string }>(decoded) ?? decodeJson<SessionPayload & { id?: string }>(decoded)\n const id = payload?.id || generateSessionId()\n const state = payload\n ? { data: payload.data, errors: payload.errors, flash: payload.flash }\n : undefined\n const save = async (next: SessionPayload) => {\n setCookie(\n context,\n this.cookie,\n this.encryptPayload(encodeSessionPayload({ id, ...next })),\n this.cookie_options,\n )\n }\n const destroy = async () => {\n setCookie(context, this.cookie, '', {\n ...this.cookie_options,\n maxAge: 0,\n expires: new Date(0),\n })\n }\n\n return { id, state, save, destroy }\n }\n}","import { DatabaseSessionDriverOptions, HttpContextLike, SessionDriverResult, SessionPayload } from '../types'\nimport { decodeJson, generateSessionId, setCookie } from '../cookie'\nimport { decodeSessionPayload, encodeSessionPayload } from '../serialization'\n\nimport { BaseSessionDriver } from './BaseSessionDriver'\nimport { DB } from 'arkormx'\nimport { isRecord } from '../../helpers'\n\nexport class DatabaseSessionDriver extends BaseSessionDriver {\n readonly tableName: string\n\n constructor(options: DatabaseSessionDriverOptions = {}) {\n super(options)\n this.tableName = options.table || 'sessions'\n }\n\n private table () {\n return DB.table(this.tableName)\n }\n\n async start (context: HttpContextLike): Promise<SessionDriverResult> {\n const id = this.readSessionId(context) || generateSessionId()\n this.writeSessionId(context, id)\n\n const row = await this.table().where({ id }).first()\n const state = isRecord(row) && typeof row.payload === 'string'\n ? decodeSessionPayload<SessionPayload>(this.decryptPayload(row.payload) ?? row.payload) ?? decodeJson<SessionPayload>(this.decryptPayload(row.payload) ?? row.payload)\n : isRecord(row?.payload)\n ? (row.payload as SessionPayload)\n : undefined\n\n const save = async (payload: SessionPayload) => {\n const now = new Date()\n const values = {\n id,\n payload: this.encryptPayload(encodeSessionPayload(payload)),\n updatedAt: now,\n expiresAt: this.ttl ? new Date(now.getTime() + this.ttl * 1000) : null,\n }\n const existing = await this.table().where({ id }).first()\n if (existing) await this.table().where({ id }).update(values)\n else await this.table().insert({ ...values, createdAt: now })\n this.writeSessionId(context, id)\n }\n\n const destroy = async () => {\n await this.table().where({ id }).delete()\n setCookie(context, this.cookie, '', {\n ...this.cookie_options,\n maxAge: 0,\n expires: new Date(0),\n })\n }\n\n return { id, state, save, destroy }\n }\n}","import { BaseSessionDriverOptions, HttpContextLike, SessionDriverResult, SessionPayload } from '../types'\nimport { decodeSessionPayload, encodeSessionPayload } from '../serialization'\nimport { dirname, join } from 'node:path'\nimport { generateSessionId, setCookie } from '../cookie'\nimport { mkdir, readFile, rm, writeFile } from 'node:fs/promises'\n\nimport { Arkstack } from '@arkstack/contract'\nimport { BaseSessionDriver } from './BaseSessionDriver'\n\nexport class FileSessionDriver extends BaseSessionDriver {\n readonly directory: string\n\n constructor(options: BaseSessionDriverOptions & { directory?: string } = {}) {\n super(options)\n this.directory =\n options.directory ||\n join(Arkstack.rootDir(), 'storage', 'framework', 'sessions')\n }\n\n private path (id: string) {\n return join(this.directory, id)\n }\n\n async start (context: HttpContextLike): Promise<SessionDriverResult> {\n const id = this.readSessionId(context) || generateSessionId()\n this.writeSessionId(context, id)\n let state: SessionPayload | undefined\n try {\n const contents = await readFile(this.path(id), 'utf8')\n const payload = this.decryptPayload(contents) ?? contents\n state = decodeSessionPayload<SessionPayload>(payload) ?? JSON.parse(payload) as SessionPayload\n } catch {\n state = undefined\n }\n\n const save = async (payload: SessionPayload) => {\n const path = this.path(id)\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, this.encryptPayload(encodeSessionPayload(payload)), 'utf8')\n this.writeSessionId(context, id)\n }\n\n const destroy = async () => {\n await rm(this.path(id), { force: true })\n setCookie(context, this.cookie, '', {\n ...this.cookie_options,\n maxAge: 0,\n expires: new Date(0),\n })\n }\n\n return { id, state, save, destroy }\n }\n}","import type { PersistentSessionConfig, SessionDriver } from './types'\n\nimport { CookieSessionDriver } from './drivers/CookieSessionDriver'\nimport { DatabaseSessionDriver } from './drivers/DatabaseSessionDriver'\nimport { FileSessionDriver } from './drivers/FileSessionDriver'\n\nlet configuredDriver: SessionDriver | undefined\n\nconst readAppSessionConfig = (): PersistentSessionConfig | undefined => {\n try {\n if (!globalThis.config) return\n\n return {\n driver: config('session.driver', 'cookie'),\n cookie: config('session.cookie', 'arkstack_session'),\n secret: config('session.secret'),\n ttl: config('session.ttl', 60 * 60 * 24 * 7),\n cookie_options: {\n path: config('session.path', '/'),\n httpOnly: config('session.http_only', true),\n secure: config('session.secure', true),\n sameSite: config('session.same_site', 'Lax'),\n },\n file: {\n directory: config('session.directory')\n },\n database: {\n table: config('session.table', 'sessions')\n },\n }\n } catch {\n return undefined\n }\n}\n\nexport const createSessionDriver = (\n config: PersistentSessionConfig = {},\n): SessionDriver => {\n if (config.driver && typeof config.driver !== 'string') return config.driver\n\n const common = {\n cookie: config.cookie,\n secret: config.secret,\n ttl: config.ttl,\n cookie_options: config.cookie_options,\n }\n\n switch (config.driver || 'cookie') {\n case 'file':\n return new FileSessionDriver({\n ...common,\n directory: config.file?.directory,\n })\n case 'database':\n return new DatabaseSessionDriver({\n ...common,\n table: config.database?.table,\n })\n case 'cookie':\n default:\n return new CookieSessionDriver(common)\n }\n}\n\nexport const configureSession = (\n config: PersistentSessionConfig | SessionDriver,\n) => {\n configuredDriver =\n typeof (config as SessionDriver).start === 'function'\n ? (config as SessionDriver)\n : createSessionDriver(config as PersistentSessionConfig)\n\n return configuredDriver\n}\n\nexport const getSessionDriver = () => {\n if (!configuredDriver)\n configuredDriver = createSessionDriver(readAppSessionConfig())\n\n return configuredDriver\n}\n","import { attachViewState, ensureSession, registerResponseFlashSweep } from './helpers'\n\nimport { HttpContext } from '../types/Http'\nimport { Session } from './Session'\nimport { definePlugin as defineClearRouterPlugin } from 'clear-router/core'\nimport { definePlugin as defineKanunPlugin } from 'kanun'\nimport { getSessionDriver } from './config'\n\nexport const arkstackHttpPlugin = defineClearRouterPlugin<any, HttpContext>({\n name: 'arkstack-http',\n setup: ({ bind, useHttpContext }) => {\n bind(Session, ({ ctx }: { ctx: HttpContext }) => ensureSession(ctx))\n\n useHttpContext(async (context) => {\n globalThis.request = (key?: string) => key\n ? context.request.input(key)\n : context.request\n\n const persistent = await getSessionDriver().start(context)\n const session = ensureSession(context.ctx, persistent.state, persistent)\n\n context.httpSession = session\n\n if (!('session' in context) || context.session instanceof Session) {\n context.session = session\n }\n context.errors = session.errors\n attachViewState(context, session)\n registerResponseFlashSweep(context, session)\n })\n },\n})\n\nexport const kanunSessionPlugin = defineKanunPlugin({\n name: 'kanun-session-plugin',\n install ({ onValidationError }) {\n onValidationError((validator) => {\n const currentSession: Session = globalThis.session?.() as never\n\n if (currentSession instanceof Session) {\n currentSession.addValidationErrors(validator)\n }\n })\n },\n})","import { Request } from './Request'\nimport { Response } from './Response'\nimport { isRecord } from './helpers'\n\nconst defaultRedirectStatus = 302\n\nconst headerValue = (value: unknown): string | undefined => {\n if (Array.isArray(value)) {\n return typeof value[0] === 'string' ? value[0] : undefined\n }\n\n return typeof value === 'string' ? value : undefined\n}\n\nexport const redirectBackTarget = (fallback: string = '/') => {\n const request = globalThis.request?.() as Request | { source: any }\n\n if (request instanceof Request) {\n return request.header('referer') || request.header('referrer') || fallback\n }\n\n const source = isRecord(request?.source) ? request.source : undefined\n const headers = isRecord(source?.headers) ? source.headers : undefined\n\n return headerValue(headers?.referer) || headerValue(headers?.referrer) || fallback\n}\n\nexport const resolveRedirectTarget = (to: string = 'back', fallback: string = '/') => {\n if (!to || to === 'back' || to === 'source') {\n return redirectBackTarget(fallback)\n }\n\n return to\n}\n\nexport const redirect = (to: string = 'back', status: number = defaultRedirectStatus) => {\n const target = resolveRedirectTarget(to)\n const response = globalThis.response?.() ?? new Response()\n\n response.status(status)\n response.header('Location', target)\n response.body = null\n\n const source = response.source\n\n if (isRecord(source) && typeof source.redirect === 'function') {\n source.redirect(status, target)\n }\n\n return response\n}\n"],"mappings":";;;;;;;;;AAEA,MAAa,uBACT,WACuB;CACvB,IAAI,OAAO,SACP,OAAO;CAGX,IAAI,OAAO,KACP,OAAO,OAAO;CAGlB,IAAI,OAAO,SACP,OAAO,OAAO;CAGlB,OAAO;;AAGX,MAAa,eAAe,YAA2B;CACnD,OAAO,IAAI,QAAQ,iBAAiB,QAAQ,CAAC;;AAGjD,MAAa,oBAAoB,YAAsC;CACnE,MAAM,aAAwB,EAAE;CAEhC,IAAI,CAAC,SACD,OAAO;CAGX,IAAI,UAAU,QAAQ,EAAE;EACpB,QAAQ,SAAS,OAAO,QAAQ;GAC5B,WAAW,IAAI,aAAa,IAAI;IAClC;EAEF,OAAO;;CAGX,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,EAAE;EAChD,MAAM,kBAAkB,qBAAqB,MAAM;EAEnD,IAAI,OAAO,oBAAoB,UAC3B,WAAW,IAAI,aAAa,IAAI;;CAIxC,OAAO;;AAGX,MAAa,wBAAwB,UAAuB;CACxD,IAAI,MAAM,QAAQ,MAAM,EACpB,OAAO,MAAM,KAAK,KAAK;CAG3B,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,WAC9C,OAAO,OAAO,MAAM;CAGxB,OAAO,SAAS,KAAA;;AAGpB,MAAa,aAAa,UACtB,OAAO,YAAY,eAAe,iBAAiB;AAGvD,MAAa,YAAY,UAAsD;CAC3E,OAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,MAAM;;;;;;;;;ACzDxE,IAAaA,YAAb,MAAaA,kBAAiCC,QAAY;CACtD;CACA;CACA;CACA;CACA;CAEA,YAAY,UAAiC,EAAE,EAAE;EAC7C,MAAM,QAAQ;EAEd,KAAK,UAAU,iBAAiB,QAAQ,QAAQ;EAChD,IAAI,KAAK,QACL,KAAK,SAAS,QAAQ;EAC1B,IAAI,KAAK,KACL,KAAK,MAAM,QAAQ;EACvB,IAAI,KAAK,MACL,KAAK,OAAO,QAAQ;EACxB,KAAK,KAAK,QAAQ,MAAM;EACxB,KAAK,OAAO,QAAQ;EACpB,KAAK,YAAY,QAAQ;EACzB,KAAK,SAAS,QAAQ;EAEtB,WAAW,WAAW,QAAiB,MAAM,KAAK,MAAM,IAAI,GAAG;;CAGnE,OAAO,KACH,QAC0B;EAC1B,IAAI,CAAC,QACD;EAGJ,IAAI,kBAAkBD,WAClB,OAAO;EAGX,MAAM,UAAU,oBAAoB,OAAO;EAE3C,OAAO,IAAIA,UAAe;GACtB,SAAS,QAAQ;GACjB,QAAQ,QAAQ;GAChB,KAAK,QAAQ,eAAe,QAAQ;GACpC,MAAM,QAAQ;GACd,IAAI,QAAQ,MAAM;GAClB,MAAM,QAAQ;GACd,WAAW,QAAQ;GACnB;GACH,CAAC;;CAGN,OAAQ,MAAsB;EAC1B,OAAO,KAAK,QAAQ,KAAK,aAAa;;CAG1C,cAA8B;EAC1B,MAAM,gBAAgB,KAAK,OAAO,gBAAgB;EAElD,IAAI,CAAC,eAAe,WAAW,UAAU,EACrC,OAAO;EAGX,OAAO,cAAc,UAAU,EAAE;;CAGrC,QAAS,MAAa;EAClB,KAAK,OAAO;EAEZ,IAAI,SAAS,KAAK,OAAO,EACrB,KAAK,OAAO,OAAO;EAGvB,OAAO;;;;;;;;;;ACtEf,IAAaE,aAAb,MAAaA,mBAAkCC,SAAa;CACxD;CACA;CAEA,YAAY,UAKR,EAAE,EAAE;EACJ,MAAM;GACF,MAAM,QAAQ;GACd,SAAS,YAAY,QAAQ,QAAQ;GACrC,YAAY,QAAQ,cAAc;GACrC,CAAC;EAEF,KAAK,OAAO,QAAQ,QAAQ,EAAE;EAC9B,KAAK,SAAS,QAAQ;EAEtB,WAAW,iBAAiB;;CAGhC,OAAO,KACH,QAC2B;EAC3B,IAAI,CAAC,QACD;EAGJ,IAAI,kBAAkBD,YAClB,OAAO;EAGX,OAAO,IAAIA,WAAgB;GACvB,YAAY,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS,OAAO;GACvE,SAAS,OAAO;GAChB;GACH,CAAC;;CAGN,OAAQ,MAAc;EAClB,KAAK,aAAa;EAElB,IAAI,SAAS,KAAK,OAAO,EACrB,IAAI,OAAO,KAAK,OAAO,WAAW,YAC9B,KAAK,OAAO,OAAO,KAAK;OAExB,KAAK,OAAO,aAAa;EAIjC,OAAO;;CAGX,OAAQ,MAAc,OAAe;EACjC,KAAK,QAAQ,IAAI,KAAK,aAAa,EAAE,MAAM;EAE3C,IAAI,SAAS,KAAK,OAAO,IAAI,OAAO,KAAK,OAAO,cAAc,YAC1D,KAAK,OAAO,UAAU,MAAM,MAAM;EAGtC,OAAO;;CAGX,aAAc;EACV,OAAO,iBAAiB,KAAK,QAAQ;;CAGzC,KAAM,MAAa;EACf,KAAK,OAAO;EAEZ,IAAI,SAAS,KAAK,OAAO,IAAI,OAAO,KAAK,OAAO,SAAS,YACrD,OAAO,KAAK,OAAO,KAAK,KAAK;EAGjC,OAAO;;CAGX,KAAM,MAAa;EACf,KAAK,OAAO;EAEZ,IAAI,SAAS,KAAK,OAAO,IAAI,OAAO,KAAK,OAAO,SAAS,YACrD,OAAO,KAAK,OAAO,KAAK,KAAK;EAGjC,OAAO;;;;;AChGf,IAAa,WAAb,MAAmC;CAC/B,MAAmC,EAAE;CACrC,4BAAoB,IAAI,KAAa;CAErC,YAAY,OAA2B;EACnC,KAAK,MAAM,EAAE,GAAI,SAAS,EAAE,EAAG;EAC/B,KAAK,YAAY,IAAI,IAAI,OAAO,KAAK,KAAK,IAAI,CAAC;;CAGnD,IAAK,KAAa,OAAU;EACxB,KAAK,IAAI,OAAO;EAChB,KAAK,UAAU,OAAO,IAAI;EAE1B,OAAO;;CAGX,IAAK,KAAa,OAAU;EACxB,OAAO,KAAK,IAAI,KAAK,MAAM;;CAG/B,IAAK,KAAa,cAAqB;EACnC,OAAQ,OAAO,KAAK,MAAM,KAAK,IAAI,OAAO;;CAG9C,IAAK,KAAyC;EAC1C,IAAI,MAAM,QAAQ,IAAI,EAClB,OAAO,IAAI,OAAM,SAAQ,KAAK,IAAI,KAAK,CAAC;EAG5C,IAAI,KACA,OAAO,OAAO,KAAK;EAGvB,OAAO,KAAK,KAAK;;CAGrB,MAAO;EACH,OAAO,OAAO,KAAK,KAAK,IAAI,CAAC,SAAS;;CAG1C,UAAW;EACP,OAAO,CAAC,KAAK,KAAK;;CAGtB,aAAc;EACV,OAAO,KAAK,KAAK;;CAGrB,OAAQ;EACJ,OAAO,OAAO,KAAK,KAAK,IAAI;;CAGhC,MAAO;EACH,OAAO,EAAE,GAAG,KAAK,KAAK;;CAG1B,MAAO,KAAyB;EAC5B,IAAI,MAAM,QAAQ,IAAI,EAAE;GACpB,KAAK,MAAM,QAAQ,KAAK;IACpB,OAAO,KAAK,IAAI;IAChB,KAAK,UAAU,OAAO,KAAK;;GAG/B,OAAO;;EAGX,IAAI,KAAK;GACL,OAAO,KAAK,IAAI;GAChB,KAAK,UAAU,OAAO,IAAI;GAE1B,OAAO;;EAGX,KAAK,MAAM,EAAE;EACb,KAAK,UAAU,OAAO;EAEtB,OAAO;;CAGX,OAAQ,KAAa;EACjB,OAAO,KAAK,MAAM,IAAI;;CAG1B,aAAc,OAAiB,KAAK,MAAM,EAAE;EACxC,KAAK,YAAY,IAAI,IAAI,KAAK;EAE9B,OAAO;;CAGX,QAAS;EACL,KAAK,MAAM,OAAO,KAAK,WACnB,OAAO,KAAK,IAAI;EAGpB,KAAK,YAAY,IAAI,IAAI,OAAO,KAAK,KAAK,IAAI,CAAC;EAE/C,OAAO;;CAGX,SAAU;EACN,OAAO,KAAK,KAAK;;;AC/FzB,MAAa,aAAa,OAAO,IAAI,wBAAwB;AAE7D,MAAM,mBAAmB,UAAmD;CACxE,IAAI,CAAC,SAAS,MAAM,EAChB;CAGJ,OAAO;;AAGX,MAAM,oBAAoB,QAA6B,WAAmD;CACtG,IAAI,OAAO,OAAO,YAAY,YAC1B;CAKJ,OAAO,gBAFO,OAAO,SAEO,CAAC;;AAGjC,MAAa,wBAAwB,WAAoD;CACrF,IAAI,CAAC,SAAS,OAAO,EACjB;CAGJ,IAAI,OAAO,OAAO,kBAAkB,YAAY;EAC5C,MAAM,MAAM,OAAO,eAAe;EAElC,IAAI,OAAO,QAAQ,QAAQ;GACvB,MAAM,WAAW,qBAAqB,IAAI;GAE1C,IAAI,UACA,OAAO;;;CAKnB,IAAI,OAAO,OAAO,WAAW,YAAY;EACrC,MAAM,SAAS,OAAO,QAAQ;EAC9B,MAAM,WAAW,qBAAqB,OAAO,IAAI,gBAAgB,OAAO;EAExE,IAAI,UACA,OAAO;;CAIf,OAAO,iBAAiB,QAAQ,cAAc,IACvC,iBAAiB,QAAQ,cAAc,IACvC,iBAAiB,QAAQ,UAAU,IACnC,qBAAqB,OAAO,OAAO,IACnC,gBAAgB,OAAO,OAAO;;AAGzC,MAAa,2BAA2B,UAA+B;CACnE,IAAI,OAAO,MAAM,UAAU,UACvB,OAAO,MAAM;CAGjB,IAAI,OAAO,MAAM,cAAc,UAC3B,OAAO,MAAM;CAGjB,IAAI,OAAO,MAAM,QAAQ,UACrB,OAAO,MAAM;CAGjB,IAAI,OAAO,MAAM,SAAS,UACtB,OAAO,MAAM;CAGjB,IAAI,MAAM,QAAQ,MAAM,KAAK,EACzB,OAAO,MAAM,KAAK,KAAK,IAAI,IAAA;CAG/B,OAAA;;AAGJ,MAAa,cAAc,UAAuC;CAC9D,IAAI,MAAM,QAAQ,MAAM,EACpB,OAAO,MAAM,SAAQ,SAAQ,WAAW,KAAK,CAAC;CAGlD,IAAI,iBAAiB,OACjB,OAAO,CAAC,MAAM,QAAQ;CAG1B,IAAI,SAAS,MAAM,IAAI,OAAO,MAAM,YAAY,UAC5C,OAAO,CAAC,MAAM,QAAQ;CAG1B,IAAI,UAAU,QAAQ,OAAO,UAAU,aACnC,OAAO,EAAE;CAGb,OAAO,CAAC,OAAO,MAAM,CAAC;;AAG1B,MAAa,WAAqB,QAA6B,KAAa,iBAAwB;CAChG,MAAM,QAAQ,IAAI,MAAM,IAAI,CAAC,QAAa,SAAS,SAAS;EACxD,IAAI,CAAC,SAAS,QAAQ,IAAI,CAAC,MAAM,QAAQ,QAAQ,EAC7C;EAGJ,OAAO,QAAQ;IAChB,OAAO;CAEV,OAAQ,OAAO,UAAU,cAAc,eAAe;;;;ACzG1D,IAAa,WAAb,MAAa,iBAAiB,SAAmB;CAC7C,YAAY,QAA6B;EACrC,OAAO;EAEP,IAAI,QAAQ;GACR,KAAK,MAAM,OAAO;GAClB,KAAK,cAAc;;;CAI3B,IAAK,OAAe,SAA4B;EAC5C,MAAM,MAAM,SAAA;EACZ,MAAM,WAAW,WAAW,QAAQ;EAEpC,IAAI,CAAC,SAAS,QACV,OAAO;EAGX,KAAK,IAAI,KAAK,CACV,GAAI,KAAK,IAAI,QAAQ,EAAE,EACvB,GAAG,SACN,CAAC;EAEF,OAAO;;CAGX,MAAO,WAAoB,OAAe,SAA4B;EAClE,IAAI,WACA,KAAK,IAAI,OAAO,QAAQ;EAG5B,OAAO;;CAGX,MAAO,QAA4B;EAC/B,MAAM,WAAW,qBAAqB,OAAO,KAAK,SAAS,OAAO,GAAG,SAA+B,KAAA;EAEpG,IAAI,CAAC,UACD,OAAO,KAAK,WAAW,OAAO;EAGlC,KAAK,MAAM,CAAC,OAAO,aAAa,OAAO,QAAQ,SAAS,EACpD,KAAK,IAAI,OAAO,SAAS;EAG7B,OAAO;;CAGX,WAAY,OAA0B;EAClC,IAAI,CAAC,OACD,OAAO;EAGX,IAAI,iBAAiB,UACjB,OAAO,KAAK,MAAM,MAAM;EAG5B,MAAM,WAAW,qBAAqB,MAAM;EAE5C,IAAI,UACA,OAAO,KAAK,MAAM,SAAS;EAG/B,IAAI,MAAM,QAAQ,MAAM,EAAE;GACtB,KAAK,MAAM,QAAQ,OACf,IAAI,SAAS,KAAK,IAAI,aAAa,MAC/B,KAAK,IAAI,wBAAwB,KAAK,EAAE,KAAK,QAAQ;QAErD,KAAK,IAAA,KAAqB,KAAK;GAIvC,OAAO;;EAGX,IAAI,SAAS,MAAM,EAAE;GACjB,IAAI,OAAO,MAAM,WAAW,YACxB,OAAO,KAAK,WAAW,MAAM,QAAQ,CAAC;GAG1C,IAAI,MAAM,QACN,OAAO,KAAK,WAAW,MAAM,OAAO;GAGxC,IAAI,MAAM,QAAQ,MAAM,OAAO,EAC3B,OAAO,KAAK,WAAW,MAAM,OAAO;GAGxC,IAAI,aAAa,OACb,OAAO,KAAK,IAAI,wBAAwB,MAAM,EAAE,MAAM,QAAQ;GAGlE,OAAO,KAAK,MAAM,MAA4B;;EAGlD,IAAI,iBAAiB,OACjB,OAAO,KAAK,IAAA,KAAqB,MAAM,QAAQ;EAGnD,OAAO,KAAK,IAAA,KAAqB,MAAM;;CAG3C,OAAQ;EACJ,OAAO,OAAO,KAAK,KAAK,IAAI;;CAGhC,IAAK,QAAA,KAAiC;EAClC,OAAO,CAAC,GAAI,KAAK,IAAI,UAAU,EAAE,CAAE;;CAGvC,MAAO,OAAuB;EAC1B,IAAI,OACA,OAAO,KAAK,IAAI,SAAS,MAAM;EAGnC,OAAO,KAAK,KAAK,CAAC,MAAM;;CAG5B,IAAK,OAA2C;EAC5C,IAAI,MAAM,QAAQ,MAAM,EACpB,OAAO,MAAM,OAAM,QAAO,KAAK,IAAI,IAAI,CAAC;EAG5C,IAAI,OACA,QAAQ,KAAK,IAAI,QAAQ,UAAU,KAAK;EAG5C,OAAO,KAAK,KAAK;;CAGrB,OAAQ,QAA2B;EAG/B,QAFa,MAAM,QAAQ,OAAO,GAAG,SAAS,CAAC,OAAO,EAE1C,MAAK,QAAO,KAAK,IAAI,IAAI,CAAC;;CAG1C,QAAS,QAA2B;EAGhC,QAFa,MAAM,QAAQ,OAAO,GAAG,SAAS,CAAC,OAAO,EAE1C,OAAM,QAAO,CAAC,KAAK,IAAI,IAAI,CAAC;;CAG5C,MAAO;EACH,OAAO,OAAO,OAAO,KAAK,IAAI,CAAC,MAAK,aAAY,SAAS,SAAS,EAAE;;CAGxE,UAAW;EACP,OAAO,CAAC,KAAK,KAAK;;CAGtB,aAAc;EACV,OAAO,KAAK,KAAK;;CAGrB,QAAS;EACL,OAAO,OAAO,OAAO,KAAK,IAAI,CAAC,QAAQ,OAAO,aAAa,QAAQ,SAAS,QAAQ,EAAE;;CAG1F,MAAO;EACH,OAAO,OAAO,OAAO,KAAK,IAAI,CAAC,MAAM;;CAGzC,SAAU;EACN,OAAO,CAAC,GAAG,IAAI,IAAI,KAAK,KAAK,CAAC,CAAC;;CAGnC,MAAO,OAA2B;EAC9B,MAAM,MAAM,MAAM;EAElB,OAAO;;CAGX,OAAQ,OAAe;EACnB,OAAO,KAAK,MAAM,MAAM;;CAG5B,cAAe;EACX,OAAO,KAAK,QAAQ;;CAGxB,cAAe;EACX,OAAO,KAAK,aAAa;;CAG7B,gBAAiB;EACb,OAAO;;CAGX,UAAW;EACP,OAAO,KAAK,QAAQ;;CAGxB,SAAU;EACN,OAAO,OAAO,QAAQ,KAAK,IAAI,CAAC,QAAkC,QAAQ,CAAC,OAAO,cAAc;GAC5F,OAAO,SAAS,CAAC,GAAG,SAAS;GAE7B,OAAO;KACR,EAAE,CAAC;;;;;AChMd,IAAa,UAAb,MAAa,QAAQ;CACjB;CACA;CACA;CACA;CACA;CACA,YAAmC,QAAQ,SAAS;CAEpD,YACI,SACA,YACF;EACE,MAAM,UAAU,mBAAmB,UAAU,UAAU,KAAA;EACvD,MAAM,QAAQ,UACR,QAAQ,UAAU,GAClB,YACG,UAAU,WAAW,YAAY,WAAW,WAAW,WACrD,UACD,EAAE,MAAM,SAA4C;EAE9D,KAAK,KAAK,YAAY,MAAM,SAAS;EACrC,KAAK,aAAa,cAAc,SAAS;EACzC,KAAK,YAAY,SAAS,aAAa,KAAK;EAC5C,KAAK,OAAO,UAAU,QAAQ,OAAO,EAAE,GAAI,MAAM,QAAQ,EAAE,EAAG;EAC9D,KAAK,SAAS,UACR,QAAQ,SACR,MAAM,kBAAkB,WACpB,MAAM,SACN,IAAI,SAAS,MAAM,OAAO;EACpC,KAAK,WAAW,UACV,QAAQ,WACR,MAAM,iBAAiB,WACnB,MAAM,QACN,IAAI,SAAS,MAAM,MAAyC;EAEtE,MAAM,WAAW,QACb,MAAM,KAAK,IAAI,IAAI,GAAG;EAI1B,OAAO,OAAO,QAAQ;GAClB,KAAK,KAAK,IAAI,KAAK,KAAK;GACxB,KAAK,KAAK,IAAI,KAAK,KAAK;GACxB,KAAK,KAAK,IAAI,KAAK,KAAK;GACxB,KAAK,KAAK,IAAI,KAAK,KAAK;GACxB,QAAQ,KAAK,OAAO,KAAK,KAAK;GAC9B,OAAO,KAAK,MAAM,KAAK,KAAK;GAC5B,KAAK,KAAK,IAAI,KAAK,KAAK;GACxB,OAAO,KAAK,MAAM,KAAK,KAAK;GAC5B,UAAU,KAAK,SAAS,KAAK,KAAK;GAClC,WAAW,KAAK,UAAU,KAAK,KAAK;GACpC,aAAa,KAAK,YAAY,KAAK,KAAK;GACxC,QAAQ,KAAK;GACb,UAAU,KAAK;GAClB,CAAC;EAEF,WAAW,UAAU;;CAGzB,WAAoC;EAChC,OAAO;GACH,MAAM,KAAK,KAAK;GAChB,QAAQ,KAAK,OAAO,QAAQ;GAC5B,OAAO,KAAK,SAAS,QAAQ;GAChC;;CAGL,eAAwB;EACpB,KAAU,MAAM;;CAGpB,MAAM,OAAQ;EACV,MAAM,UAAU,KAAK,UAAU;EAE/B,MAAM,WAAW,KAAK,UAAU,YAAY,KAAA,EAAU;EAEtD,KAAK,YAAY,SAAS,KAAK,YAAY;GACvC,MAAM,KAAK,YAAY,KAAK,QAAQ;IACtC;EAEF,MAAM,KAAK;EAEX,OAAO;;CAGX,MAAM,UAAW;EACb,KAAK,OAAO,EAAE;EACd,KAAK,OAAO,OAAO;EACnB,KAAK,SAAS,OAAO;EACrB,MAAM,KAAK,YAAY,WAAW;EAElC,OAAO;;;;;;;;;CAUX,IAAc,KAAa,cAAqB;EAC5C,OAAQ,OAAO,KAAK,OAAO,KAAK,KAAK,OAAO;;;;;;;;;CAUhD,IAAc,KAAa,OAAU;EACjC,KAAK,KAAK,OAAO;EACjB,KAAK,cAAc;EAEnB,OAAO;;;;;;;;;CAUX,IAAc,KAAa,OAAU;EACjC,OAAO,KAAK,IAAI,KAAK,MAAM;;;;;;;;CAS/B,IAAK,KAAa;EACd,OAAO,OAAO,KAAK;;;;;;;;CASvB,OAAQ,KAAa;EACjB,OAAO,KAAK,KAAK;EACjB,KAAK,cAAc;EAEnB,OAAO;;;;;;;CAQX,QAAS;EACL,KAAK,OAAO,EAAE;EACd,KAAK,OAAO,OAAO;EACnB,KAAK,SAAS,OAAO;EACrB,KAAK,cAAc;EAEnB,OAAO;;;;;;;CAQX,MAAO;EACH,OAAO,EAAE,GAAG,KAAK,MAAM;;;;;;;;;CAU3B,MAAgB,KAAa,OAAU;EACnC,KAAK,SAAS,IAAI,KAAK,MAAM;EAC7B,KAAK,cAAc;EAEnB,OAAO;;;;;;;;;CAUX,SAAmB,KAAa,cAAqB;EACjD,OAAO,KAAK,SAAS,IAAI,KAAK,aAAa;;;;;;;CAQ/C,MAAM,aAAc;EAChB,KAAK,OAAO,OAAO;EACnB,KAAK,SAAS,OAAO;EACrB,MAAM,KAAK,MAAM;EAEjB,OAAO;;;;;;;;;CAUX,SAAU,OAAe,SAA4B;EACjD,KAAK,OAAO,IAAI,OAAO,QAAQ;EAC/B,KAAK,cAAc;EAEnB,OAAO;;;;;;;;CASX,UAAW,QAAuC;EAC9C,KAAK,OAAO,MAAM,OAAO;EACzB,KAAK,cAAc;EAEnB,OAAO;;;;;;;;CASX,oBAAqB,OAAgB;EACjC,KAAK,OAAO,WAAW,MAAM;EAC7B,KAAK,cAAc;EAEnB,OAAO;;;;;;;;CASX,UAAW,OAAgB;EACvB,OAAO,KAAK,OAAO,IAAI,MAAM;;;;;;;;CASjC,YAAa,OAAgB;EACzB,KAAK,OAAO,MAAM,MAAM;EACxB,KAAK,cAAc;EAEnB,OAAO;;;;;;;CAQX,UAAW;EACP,OAAO;GACH,GAAG,KAAK,KAAK;GACb,QAAQ,KAAK;GACb,OAAO,KAAK;GACf;;;;;;;CAQL,SAAU;EACN,OAAO;GACH,GAAG,KAAK,KAAK;GACb,QAAQ,KAAK,OAAO,QAAQ;GAC5B,OAAO,KAAK,SAAS,QAAQ;GAChC;;;;;ACnTT,MAAM,qBAAqB;CACvB,MAAM,UAAU,WAAW,WAAW;CAEtC,IAAI,mBAAmBE,WAAS;EAC5B,IAAI,SAAS,QAAQ,KAAK,EACtB,OAAO,QAAQ;EAGnB,MAAM,SAAS,SAAS,QAAQ,OAAO,GAAG,QAAQ,SAAS,KAAA;EAE3D,IAAI,UAAU,OAAO,OAAO,YAAY,YACpC,OAAO,OAAO,SAAS,IAAI,EAAE;EAGjC,IAAI,SAAS,QAAQ,KAAK,EACtB,OAAO,OAAO;;CAItB,IAAI,SAAS,QAAQ,IAAI,OAAO,QAAQ,YAAY,YAChD,OAAO,QAAQ,SAAS,IAAI,EAAE;CAGlC,OAAO,SAAS,SAAS,KAAK,GAAG,QAAQ,OAAO,EAAE;;AAGtD,MAAa,OAAiB,KAAc,iBAAwB;CAChE,MAAM,QAAQ,cAAc;CAE5B,IAAI,CAAC,KACD,OAAO;CAGX,OAAO,QAAQ,OAAO,KAAK,aAAa;;;;AC9B5C,MAAM,qBAAqB,OAAO,IAAI,uCAAuC;AAE7E,MAAM,yBAAyB,QAAkC,YAAqB;CAClF,OAAO,cAAc;CAErB,IAAI,EAAE,aAAa,WAAW,OAAO,mBAAmB,SACpD,OAAO,UAAU;;AAIzB,MAAM,kBAAkB,WAAqC;CACzD,OAAO,OAAO,OACP,OAAO,KAAK,OACZ,OAAO,UAAU,UACjB,OAAO,eAAe,UACtB,OAAO,SAAS,OAChB,OAAO,SAAS,UAAU;;AAGrC,MAAa,8BAA8B,QAAiB,YAAsB;CAC9E,IAAI,CAAC,SAAS,OAAO,EACjB;CAGJ,MAAM,UAAU,WAAW,WAAW,OAAO;CAC7C,MAAM,MAAM,eAAe,OAAO;CAElC,IAAI,EAAE,mBAAmB,YAAY,CAAC,SAAS,IAAI,IAAI,OAAO,IAAI,QAAQ,cAAc,IAAI,qBACxF;CAGJ,IAAI,sBAAsB;CAC1B,MAAM,MAAM,IAAI,IAAI,KAAK,IAAI;CAE7B,IAAI,OAAO,GAAG,SAAgB;EAC1B,QAAa,YAAY,CACpB,YAAY,KAAA,EAAU,CACtB,cAAc,IAAI,GAAG,KAAK,CAAC;EAEhC,OAAO;;;AAIf,MAAa,mBAAmB,QAAkC,YAAqB;CACnF,sBAAsB,QAAQ,QAAQ;CACtC,OAAO,SAAS,QAAQ;CAExB,IAAI,SAAS,OAAO,IAAI,EAAE;EACtB,sBAAsB,OAAO,KAAK,QAAQ;EAC1C,OAAO,IAAI,SAAS,QAAQ;EAC5B,OAAO,IAAI,MAAM;;CAGrB,IAAI,SAAS,OAAO,IAAI,EACpB,OAAO,IAAI,SAAS;EAChB,GAAI,OAAO,IAAI,UAAU,EAAE;EAC3B;EACA,QAAQ,QAAQ;EAChB,OAAO,QAAQ;EACf;EACH;CAGL,IAAI,SAAS,OAAO,UAAU,OAAO,EACjC,OAAO,SAAS,OAAO,SAAS;EAC5B,GAAI,OAAO,SAAS,OAAO,UAAU,EAAE;EACvC;EACA,QAAQ,QAAQ;EAChB,OAAO,QAAQ;EACf;EACH;CAGL,IAAI,SAAS,OAAO,QAAQ,EAAE;EAC1B,sBAAsB,OAAO,SAAS,QAAQ;EAC9C,OAAO,QAAQ,SAAS,QAAQ;EAChC,OAAO,QAAQ,QAAQ,QAAQ;EAC/B,OAAO,QAAQ,MAAM;;CAGzB,IAAI,SAAS,OAAO,MAAM,EAAE;EACxB,sBAAsB,OAAO,OAAO,QAAQ;EAC5C,OAAO,MAAM,SAAS,QAAQ;EAC9B,OAAO,MAAM,QAAQ,QAAQ;EAC7B,OAAO,MAAM,MAAM;;CAGvB,IAAI,OAAO,OAAO,QAAQ,YAAY;EAClC,OAAO,IAAI,WAAW,QAAQ;EAC9B,OAAO,IAAI,UAAU,QAAQ,OAAO;EACpC,OAAO,IAAI,SAAS,QAAQ,SAAS;EACrC,OAAO,IAAI,OAAO,IAAI;;;;;;;;;;AAW9B,MAAa,iBACT,KACA,SACA,eACU;CACV,IAAI,CAAC,SAAS,IAAI,EACd,OAAO,IAAI,QAAQ,SAAS,WAAW;CAG3C,MAAM,WAAW,IAAI,gBACb,IAAI,mBAAmB,UAAU,IAAI,UAAU,KAAA,OAC/C,SAAS,IAAI,IAAI,IAAI,IAAI,IAAI,uBAAuB,UAAU,IAAI,IAAI,cAAc,KAAA;CAC5F,MAAM,UAAU,oBAAoB,UAC9B,WACA,IAAI,QAAQ,SAAS,WAAW;CAEtC,IAAI,cAAc;CAClB,gBAAgB,KAAK,QAAQ;CAE7B,OAAO;;;;;;;;AASX,MAAa,cAAc,QAAsC;CAC7D,IAAI,CAAC,SAAS,IAAI,EACd;CAGJ,MAAM,UAAU,IAAI,eAAe,IAAI;CAEvC,OAAO,mBAAmB,UAAU,UAAU,KAAA;;;;AC3IlD,MAAa,0BAA0B,YAAY,GAAG,CAAC,SAAS,YAAY;AAE5E,MAAa,aAAa,OAAe,WACrC,WAAW,UAAU,OAAO,CAAC,OAAO,MAAM,CAAC,OAAO,YAAY;AAElE,MAAa,qBAAqB,OAAe,WAC7C,GAAG,MAAM,GAAG,UAAU,OAAO,OAAO;AAExC,MAAa,qBACT,OACA,WACC;CACD,IAAI,CAAC,OAAO,OAAO,KAAA;CACnB,MAAM,QAAQ,MAAM,YAAY,IAAI;CACpC,IAAI,QAAQ,GAAG,OAAO,KAAA;CACtB,MAAM,UAAU,MAAM,MAAM,GAAG,MAAM;CACrC,MAAM,YAAY,MAAM,MAAM,QAAQ,EAAE;CACxC,MAAM,WAAW,UAAU,SAAS,OAAO;CAC3C,MAAM,kBAAkB,OAAO,KAAK,UAAU;CAC9C,MAAM,iBAAiB,OAAO,KAAK,SAAS;CAC5C,IAAI,gBAAgB,WAAW,eAAe,QAAQ,OAAO,KAAA;CAE7D,OAAO,gBAAgB,iBAAiB,eAAe,GAAG,UAAU,KAAA;;AAGxE,MAAa,cAAc,UACvB,OAAO,KAAK,KAAK,UAAU,MAAM,EAAE,OAAO,CAAC,SAAS,YAAY;AAEpE,MAAa,cACT,UACgB;CAChB,IAAI,CAAC,OAAO,OAAO,KAAA;CACnB,IAAI;EACA,OAAO,KAAK,MAAM,OAAO,KAAK,OAAO,YAAY,CAAC,SAAS,OAAO,CAAC;SAC/D;EACJ;;;AAIR,MAAa,gBACT,WACyB;CAGzB,QAFe,MAAM,QAAQ,OAAO,GAAG,OAAO,KAAK,KAAK,GAAG,UAAU,IAEvD,MAAM,IAAI,CAAC,QAAgC,SAAS,SAAS;EACvE,MAAM,QAAQ,KAAK,QAAQ,IAAI;EAC/B,IAAI,QAAQ,GAAG,OAAO;EACtB,MAAM,MAAM,KAAK,MAAM,GAAG,MAAM,CAAC,MAAM;EACvC,MAAM,QAAQ,KAAK,MAAM,QAAQ,EAAE,CAAC,MAAM;EAC1C,IAAI,KAAK,QAAQ,OAAO,mBAAmB,MAAM;EAEjD,OAAO;IACR,EAAE,CAAC;;AAGV,MAAa,aAAa,SAA0B,SAAiB;CACjE,MAAM,MAAM,SAAS,QAAQ,IAAI,GAAG,QAAQ,MAAM;CAElD,MAAM,WADU,QAAQ,WAAW,IAAI,gBAAgB,IAAI,OAAO,IAAI,UAEzD,WAAW,IAAI,WAAW,IAAI,KAAK,WAAW,IAAI,SAAS;CAMxE,OAAO,aAJH,OAAO,SAAS,QAAQ,aAClB,QAAQ,IAAI,SAAS,GACrB,SAAS,OAEQ,CAAC;;AAGhC,MAAa,mBACT,MACA,OACA,UAA0B,EAAE,KAC3B;CACD,MAAM,QAAQ,CAAC,GAAG,KAAK,GAAG,mBAAmB,MAAM,GAAG;CACtD,IAAI,OAAO,QAAQ,WAAW,UAC1B,MAAM,KAAK,WAAW,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,OAAO,CAAC,GAAG;CACpE,IAAI,QAAQ,SAAS,MAAM,KAAK,WAAW,QAAQ,QAAQ,aAAa,GAAG;CAC3E,MAAM,KAAK,QAAQ,QAAQ,QAAQ,MAAM;CACzC,IAAI,QAAQ,QAAQ,MAAM,KAAK,UAAU,QAAQ,SAAS;CAC1D,IAAI,QAAQ,aAAa,OAAO,MAAM,KAAK,WAAW;CACtD,IAAI,QAAQ,QAAQ,MAAM,KAAK,SAAS;CACxC,IAAI,QAAQ,UAAU,MAAM,KAAK,YAAY,QAAQ,WAAW;CAEhE,OAAO,MAAM,KAAK,KAAK;;AAG3B,MAAM,wBAAwB,UAAkB;CAC5C,OAAO,MAAM,MAAM,oBAAoB,CAAC,OAAO,QAAQ;;AAG3D,MAAM,iBAAiB,SAAkB,eAAuB;CAO5D,QANgB,MAAM,QAAQ,QAAQ,GAChC,QAAQ,SAAS,SAAS,qBAAqB,OAAO,KAAK,CAAC,CAAC,GAC7D,OAAO,YAAY,WACf,qBAAqB,QAAQ,GAC7B,EAAE,EAEG,QACV,WAAW,CAAC,OAAO,MAAM,CAAC,WAAW,GAAG,WAAW,GAAG,CAC1D;;AAGL,MAAM,qBACF,QACA,YACA,YACA,UACC;CACD,IAAI,CAAC,QAAQ,OAAO;CAEpB,IAAI,OAAO,OAAO,cAAc,YAAY;EAKxC,MAAM,OAAO,CAAC,GAAG,cAHb,OAAO,OAAO,cAAc,aACtB,OAAO,UAAU,WAAW,GAC5B,KAAA,GAC8B,WAAW,EAAE,MAAM;EAE3D,OAAO,UAAU,YAAY,KAAK;EAElC,OAAO;;CAGX,IAAI,OAAO,WAAW,OAAO,OAAO,QAAQ,QAAQ,YAAY;EAE5D,MAAM,OAAO,CAAC,GAAG,cADD,OAAO,QAAQ,IAAI,WACG,EAAE,WAAW,EAAE,MAAM;EAE3D,OAAO,QAAQ,IAAI,YAAY,KAAK,KAAK,KAAK,CAAC;EAE/C,OAAO;;CAGX,IAAI,OAAO,OAAO,iBAAiB,YAAY;EAC3C,OAAO,aAAa,YAAY,MAAM;EAEtC,OAAO;;CAIX,IAAI,OAAO,OAAO,WAAW,YAAY;EACrC,OAAO,OAAO,YAAY,MAAM;EAEhC,OAAO;;CAGX,OAAO;;AAGX,MAAa,aACT,SACA,MACA,OACA,UAA0B,EAAE,KAC3B;CACD,MAAM,MAAM,SAAS,QAAQ,IAAI,GAAG,QAAQ,MAAM;CAClD,MAAM,SAAS,gBAAgB,MAAM,OAAO,QAAQ;CACpD,MAAM,WAAW,QAAQ,YAAY,IAAI;CACzC,IAAI,UAAU,WAAW,OAAO,SAAS,QAAQ,QAAQ,YAAY;EAEjE,MAAM,OAAO,CAAC,GAAG,cADD,SAAS,QAAQ,IAAI,aACC,EAAE,KAAK,EAAE,OAAO;EAEtD,SAAS,QAAQ,IAAI,cAAc,KAAK,KAAK,KAAK,CAAC;;CAInD,kBAAkB,UAAU,QAAQ,cAAc,MAAM,OAAO,IAC/D,kBAAkB,IAAI,KAAK,cAAc,MAAM,OAAO,IACtD,kBAAkB,IAAI,UAAU,cAAc,MAAM,OAAO,IAC3D,kBAAkB,IAAI,UAAU,QAAQ,cAAc,MAAM,OAAO,IACnE,kBAAkB,IAAI,OAAO,KAAK,cAAc,MAAM,OAAO;CAIjE,OAAO;;;;AC/KX,MAAM,cAAc,UAAkB,OAAO,WAAW,OAAO,OAAO;AAEtE,MAAM,kBAAkB,UAA2B;CAC/C,IAAI,UAAU,QAAQ,OAAO,UAAU,aACnC,OAAO;CAGX,IAAI,OAAO,UAAU,WACjB,OAAO,KAAK,QAAQ,IAAI,EAAE;CAG9B,IAAI,OAAO,UAAU,UACjB,OAAO,OAAO,UAAU,MAAM,GAAG,KAAK,MAAM,KAAK,KAAK,MAAM;CAGhE,IAAI,OAAO,UAAU,UACjB,OAAO,KAAK,WAAW,MAAM,CAAC,IAAI,MAAM;CAG5C,IAAI,MAAM,QAAQ,MAAM,EACpB,OAAO,iBAAiB,MAAM,KAAK,MAAM,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;CAGtE,IAAI,OAAO,UAAU,UACjB,OAAO,iBAAiB,OAAO,QAAQ,MAAiC,CAAC;CAG7E,OAAO,eAAe,OAAO,MAAM,CAAC;;AAGxC,MAAM,oBAAoB,YAA+C;CACrE,OAAO,KAAK,QAAQ,OAAO,IAAI,QAAQ,KAAK,CAAC,KAAK,WAAW,eAAe,IAAI,GAAG,eAAe,MAAM,CAAC,CAAC,KAAK,GAAG,CAAC;;AAGvH,IAAM,SAAN,MAAa;CAGoB;CAF7B,SAAiB;CAEjB,YAAY,QAAiC;EAAhB,KAAA,SAAA;;CAE7B,QAAkB;EACd,MAAM,OAAO,KAAK,OAAO,KAAK;EAC9B,KAAK,UAAU,SAAS,MAAM,IAAI;EAElC,QAAQ,MAAR;GACI,KAAK;IACD,KAAK,OAAO,IAAI;IAEhB,OAAO;GACX,KAAK,KACD,OAAO,KAAK,UAAU,IAAI,KAAK;GACnC,KAAK,KACD,OAAO,OAAO,SAAS,KAAK,UAAU,IAAI,EAAE,GAAG;GACnD,KAAK,KACD,OAAO,OAAO,WAAW,KAAK,UAAU,IAAI,CAAC;GACjD,KAAK,KACD,OAAO,KAAK,aAAa;GAC7B,KAAK,KACD,OAAO,KAAK,YAAY;GAC5B,SACI,MAAM,IAAI,MAAM,yCAAyC,OAAO;;;CAI5E,cAAuB;EACnB,MAAM,SAAS,OAAO,SAAS,KAAK,UAAU,IAAI,EAAE,GAAG;EACvD,KAAK,OAAO,KAAI;EAChB,IAAI,MAAM,KAAK;EACf,IAAI,QAAQ;EAEZ,OAAO,MAAM,KAAK,OAAO,UAAU,QAAQ,QAAQ;GAC/C,MAAM,OAAO,KAAK,OAAO;GACzB,SAAS,OAAO,WAAW,MAAM,OAAO;GACxC,OAAO;;EAGX,MAAM,QAAQ,KAAK,OAAO,MAAM,KAAK,QAAQ,IAAI;EACjD,KAAK,SAAS;EACd,KAAK,OAAO,KAAI;EAChB,KAAK,OAAO,IAAI;EAEhB,OAAO;;CAGX,aAAsB;EAClB,MAAM,SAAS,OAAO,SAAS,KAAK,UAAU,IAAI,EAAE,GAAG;EACvD,KAAK,OAAO,IAAI;EAChB,MAAM,UAA6C,EAAE;EACrD,IAAI,aAAa;EAEjB,KAAK,IAAI,QAAQ,GAAG,QAAQ,QAAQ,SAAS,GAAG;GAC5C,MAAM,MAAM,KAAK,OAAO;GACxB,MAAM,QAAQ,KAAK,OAAO;GAC1B,QAAQ,KAAK,CAAC,KAAK,MAAM,CAAC;GAE1B,IAAI,QAAQ,OACR,aAAa;;EAIrB,KAAK,OAAO,IAAI;EAEhB,IAAI,YACA,OAAO,QAAQ,KAAK,GAAG,WAAW,MAAM;EAG5C,OAAO,QAAQ,QAAiC,QAAQ,CAAC,KAAK,WAAW;GACrE,OAAO,OAAO,IAAI,IAAI;GAEtB,OAAO;KACR,EAAE,CAAC;;CAGV,UAAmB,OAAe;EAC9B,MAAM,QAAQ,KAAK,OAAO,QAAQ,OAAO,KAAK,OAAO;EAErD,IAAI,QAAQ,GACR,MAAM,IAAI,MAAM,qCAAqC;EAGzD,MAAM,QAAQ,KAAK,OAAO,MAAM,KAAK,QAAQ,MAAM;EACnD,KAAK,SAAS,QAAQ,MAAM;EAE5B,OAAO;;CAGX,OAAgB,OAAe;EAC3B,IAAI,KAAK,OAAO,MAAM,KAAK,QAAQ,KAAK,SAAS,MAAM,OAAO,KAAK,OAC/D,MAAM,IAAI,MAAM,qCAAqC;EAGzD,KAAK,UAAU,MAAM;;;AAI7B,MAAa,wBACT,YACC;CACD,OAAO,eAAe,QAAQ;;AAGlC,MAAM,2BAA2B,YAAqB;CAClD,IAAI,CAAC,WAAW,OAAO,YAAY,YAAY,MAAM,QAAQ,QAAQ,EACjE,OAAO;CAGX,MAAM,SAAS;CAEf,KAAK,MAAM,OAAO;EAAC;EAAQ;EAAU;EAAQ,EACzC,IAAI,MAAM,QAAQ,OAAO,KAAK,IAAI,OAAO,KAAK,WAAW,GACrD,OAAO,OAAO,EAAE;CAIxB,OAAO;;AAGX,MAAa,wBAGT,UACgB;CAChB,IAAI,CAAC,OACD;CAGJ,IAAI;EACA,OAAO,wBAAwB,IAAI,OAAO,MAAM,CAAC,OAAO,CAAC;SACrD;EACJ;;;;;ACjKR,MAAM,iBAAiB,WAAmB;CACtC,IAAI,OAAO,WAAW,UAAU,EAAE;EAC9B,MAAM,UAAU,OAAO,KAAK,OAAO,MAAM,EAAE,EAAE,SAAS;EAEtD,IAAI,QAAQ,WAAW,IACnB,OAAO;;CAIf,MAAM,MAAM,OAAO,KAAK,QAAQ,SAAS;CAEzC,IAAI,IAAI,WAAW,IACf,OAAO;CAGX,OAAO,WAAW,SAAS,CAAC,OAAO,OAAO,CAAC,QAAQ;;AAGvD,MAAM,UAAU,IAAY,OAAe,QAAgB;CACvD,OAAO,WAAW,UAAU,IAAI,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,MAAM;;AAGrE,MAAa,uBAAuB,OAAe,WAAmB;CAClE,MAAM,MAAM,cAAc,OAAO;CACjC,MAAM,KAAK,YAAY,GAAG;CAC1B,MAAM,UAAU,GAAG,SAAS,SAAS;CACrC,MAAM,SAAS,eAAe,eAAe,KAAK,GAAG;CACrD,MAAM,YAAY,OAAO,OAAO,CAC5B,OAAO,OAAO,OAAO,OAAO,EAC5B,OAAO,OAAO,CACjB,CAAC,CAAC,SAAS,SAAS;CACrB,MAAM,UAAmC;EACrC,IAAI;EACJ,OAAO;EACP,KAAK,OAAO,SAAS,WAAW,IAAI;EACpC,KAAK;EACR;CAED,OAAO,KAAK,UAAU,QAAQ;;AAGlC,MAAa,uBAAuB,SAA6B,WAAmB;CAChF,IAAI,CAAC,SACD;CAGJ,IAAI;EACA,MAAM,UAAU,KAAK,MAAM,QAAQ,WAAW,IAAI,GAAG,UAAU,OAAO,KAAK,SAAS,SAAS,CAAC,SAAS,OAAO,CAAC;EAE/G,IAAI,CAAC,QAAQ,MAAM,CAAC,QAAQ,SAAS,CAAC,QAAQ,KAC1C;EAGJ,MAAM,MAAM,cAAc,OAAO;EACjC,MAAM,WAAW,OAAO,QAAQ,IAAI,QAAQ,OAAO,IAAI;EACvD,MAAM,eAAe,OAAO,KAAK,QAAQ,IAAI;EAC7C,MAAM,iBAAiB,OAAO,KAAK,SAAS;EAE5C,IAAI,aAAa,WAAW,eAAe,UAAU,CAAC,gBAAgB,cAAc,eAAe,EAC/F;EAGJ,MAAM,WAAW,iBAAiB,eAAe,KAAK,OAAO,KAAK,QAAQ,IAAI,SAAS,CAAC;EAExF,OAAO,OAAO,OAAO,CACjB,SAAS,OAAO,OAAO,KAAK,QAAQ,OAAO,SAAS,CAAC,EACrD,SAAS,OAAO,CACnB,CAAC,CAAC,SAAS,OAAO;SACf;EACJ;;;;;AC1ER,MAAM,sBACF,OACI,QAAQ,IAAI,kBACZ,QAAQ,IAAI,WACZ,0BACH;AAEL,MAAM,yBAAyB,SAAkC;CAC7D,UAAU;CACV,UAAU;CACV,QAAQ,QAAQ,IAAI,aAAa;CACjC,MAAM;CACN,QAAQ;CACX;AAED,IAAsB,oBAAtB,MAAiE;CAC7D;CACA;CACA;CACA;CAEA,YAAY,UAAoC,EAAE,EAAE;EAChD,KAAK,SAAS,QAAQ,UAAU;EAChC,KAAK,SAAS,QAAQ,UAAU,eAAe;EAC/C,KAAK,MAAM,QAAQ;EACnB,KAAK,iBAAiB;GAClB,GAAG,sBAAsB,QAAQ,IAAI;GACrC,GAAI,QAAQ,kBAAkB,EAAE;GACnC;;CAGL,cAAyB,SAA0B;EAC/C,OAAO,kBAAkB,UAAU,SAAS,KAAK,OAAO,EAAE,KAAK,OAAO;;CAG1E,eAA0B,OAAe;EACrC,OAAO,oBAAoB,OAAO,KAAK,OAAO;;CAGlD,eAA0B,OAA2B;EACjD,OAAO,oBAAoB,OAAO,KAAK,OAAO;;CAGlD,eAA0B,SAA0B,IAAY;EAC5D,UACI,SACA,KAAK,QACL,kBAAkB,IAAI,KAAK,OAAO,EAClC,KAAK,eACR;;;;;AC/CT,IAAa,sBAAb,cAAyC,kBAAkB;CACvD,MAAM,MAAO,SAAwD;EACjE,MAAM,SAAS,UAAU,SAAS,KAAK,OAAO;EAC9C,MAAM,UAAU,KAAK,eAAe,OAAO,IAAI,kBAAkB,QAAQ,KAAK,OAAO;EACrF,MAAM,UAAU,qBAAuD,QAAQ,IAAI,WAA6C,QAAQ;EACxI,MAAM,KAAK,SAAS,MAAM,mBAAmB;EAC7C,MAAM,QAAQ,UACR;GAAE,MAAM,QAAQ;GAAM,QAAQ,QAAQ;GAAQ,OAAO,QAAQ;GAAO,GACpE,KAAA;EACN,MAAM,OAAO,OAAO,SAAyB;GACzC,UACI,SACA,KAAK,QACL,KAAK,eAAe,qBAAqB;IAAE;IAAI,GAAG;IAAM,CAAC,CAAC,EAC1D,KAAK,eACR;;EAEL,MAAM,UAAU,YAAY;GACxB,UAAU,SAAS,KAAK,QAAQ,IAAI;IAChC,GAAG,KAAK;IACR,QAAQ;IACR,yBAAS,IAAI,KAAK,EAAE;IACvB,CAAC;;EAGN,OAAO;GAAE;GAAI;GAAO;GAAM;GAAS;;;;;ACvB3C,IAAa,wBAAb,cAA2C,kBAAkB;CACzD;CAEA,YAAY,UAAwC,EAAE,EAAE;EACpD,MAAM,QAAQ;EACd,KAAK,YAAY,QAAQ,SAAS;;CAGtC,QAAiB;EACb,OAAO,GAAG,MAAM,KAAK,UAAU;;CAGnC,MAAM,MAAO,SAAwD;EACjE,MAAM,KAAK,KAAK,cAAc,QAAQ,IAAI,mBAAmB;EAC7D,KAAK,eAAe,SAAS,GAAG;EAEhC,MAAM,MAAM,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,OAAO;EACpD,MAAM,QAAQ,SAAS,IAAI,IAAI,OAAO,IAAI,YAAY,WAChD,qBAAqC,KAAK,eAAe,IAAI,QAAQ,IAAI,IAAI,QAAQ,IAAI,WAA2B,KAAK,eAAe,IAAI,QAAQ,IAAI,IAAI,QAAQ,GACpK,SAAS,KAAK,QAAQ,GACjB,IAAI,UACL,KAAA;EAEV,MAAM,OAAO,OAAO,YAA4B;GAC5C,MAAM,sBAAM,IAAI,MAAM;GACtB,MAAM,SAAS;IACX;IACA,SAAS,KAAK,eAAe,qBAAqB,QAAQ,CAAC;IAC3D,WAAW;IACX,WAAW,KAAK,MAAM,IAAI,KAAK,IAAI,SAAS,GAAG,KAAK,MAAM,IAAK,GAAG;IACrE;GAED,IAAI,MADmB,KAAK,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,OAAO,EAC3C,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,OAAO,OAAO;QACxD,MAAM,KAAK,OAAO,CAAC,OAAO;IAAE,GAAG;IAAQ,WAAW;IAAK,CAAC;GAC7D,KAAK,eAAe,SAAS,GAAG;;EAGpC,MAAM,UAAU,YAAY;GACxB,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,QAAQ;GACzC,UAAU,SAAS,KAAK,QAAQ,IAAI;IAChC,GAAG,KAAK;IACR,QAAQ;IACR,yBAAS,IAAI,KAAK,EAAE;IACvB,CAAC;;EAGN,OAAO;GAAE;GAAI;GAAO;GAAM;GAAS;;;;;AC7C3C,IAAa,oBAAb,cAAuC,kBAAkB;CACrD;CAEA,YAAY,UAA6D,EAAE,EAAE;EACzE,MAAM,QAAQ;EACd,KAAK,YACD,QAAQ,aACR,KAAK,SAAS,SAAS,EAAE,WAAW,aAAa,WAAW;;CAGpE,KAAc,IAAY;EACtB,OAAO,KAAK,KAAK,WAAW,GAAG;;CAGnC,MAAM,MAAO,SAAwD;EACjE,MAAM,KAAK,KAAK,cAAc,QAAQ,IAAI,mBAAmB;EAC7D,KAAK,eAAe,SAAS,GAAG;EAChC,IAAI;EACJ,IAAI;GACA,MAAM,WAAW,MAAM,SAAS,KAAK,KAAK,GAAG,EAAE,OAAO;GACtD,MAAM,UAAU,KAAK,eAAe,SAAS,IAAI;GACjD,QAAQ,qBAAqC,QAAQ,IAAI,KAAK,MAAM,QAAQ;UACxE;GACJ,QAAQ,KAAA;;EAGZ,MAAM,OAAO,OAAO,YAA4B;GAC5C,MAAM,OAAO,KAAK,KAAK,GAAG;GAC1B,MAAM,MAAM,QAAQ,KAAK,EAAE,EAAE,WAAW,MAAM,CAAC;GAC/C,MAAM,UAAU,MAAM,KAAK,eAAe,qBAAqB,QAAQ,CAAC,EAAE,OAAO;GACjF,KAAK,eAAe,SAAS,GAAG;;EAGpC,MAAM,UAAU,YAAY;GACxB,MAAM,GAAG,KAAK,KAAK,GAAG,EAAE,EAAE,OAAO,MAAM,CAAC;GACxC,UAAU,SAAS,KAAK,QAAQ,IAAI;IAChC,GAAG,KAAK;IACR,QAAQ;IACR,yBAAS,IAAI,KAAK,EAAE;IACvB,CAAC;;EAGN,OAAO;GAAE;GAAI;GAAO;GAAM;GAAS;;;;;AC7C3C,IAAI;AAEJ,MAAM,6BAAkE;CACpE,IAAI;EACA,IAAI,CAAC,WAAW,QAAQ;EAExB,OAAO;GACH,QAAQ,OAAO,kBAAkB,SAAS;GAC1C,QAAQ,OAAO,kBAAkB,mBAAmB;GACpD,QAAQ,OAAO,iBAAiB;GAChC,KAAK,OAAO,eAAe,OAAU,KAAK,EAAE;GAC5C,gBAAgB;IACZ,MAAM,OAAO,gBAAgB,IAAI;IACjC,UAAU,OAAO,qBAAqB,KAAK;IAC3C,QAAQ,OAAO,kBAAkB,KAAK;IACtC,UAAU,OAAO,qBAAqB,MAAM;IAC/C;GACD,MAAM,EACF,WAAW,OAAO,oBAAoB,EACzC;GACD,UAAU,EACN,OAAO,OAAO,iBAAiB,WAAW,EAC7C;GACJ;SACG;EACJ;;;AAIR,MAAa,uBACT,SAAkC,EAAE,KACpB;CAChB,IAAI,OAAO,UAAU,OAAO,OAAO,WAAW,UAAU,OAAO,OAAO;CAEtE,MAAM,SAAS;EACX,QAAQ,OAAO;EACf,QAAQ,OAAO;EACf,KAAK,OAAO;EACZ,gBAAgB,OAAO;EAC1B;CAED,QAAQ,OAAO,UAAU,UAAzB;EACI,KAAK,QACD,OAAO,IAAI,kBAAkB;GACzB,GAAG;GACH,WAAW,OAAO,MAAM;GAC3B,CAAC;EACN,KAAK,YACD,OAAO,IAAI,sBAAsB;GAC7B,GAAG;GACH,OAAO,OAAO,UAAU;GAC3B,CAAC;EAEN,SACI,OAAO,IAAI,oBAAoB,OAAO;;;AAIlD,MAAa,oBACT,WACC;CACD,mBACI,OAAQ,OAAyB,UAAU,aACpC,SACD,oBAAoB,OAAkC;CAEhE,OAAO;;AAGX,MAAa,yBAAyB;CAClC,IAAI,CAAC,kBACD,mBAAmB,oBAAoB,sBAAsB,CAAC;CAElE,OAAO;;;;ACvEX,MAAa,qBAAqBC,aAA0C;CACxE,MAAM;CACN,QAAQ,EAAE,MAAM,qBAAqB;EACjC,KAAK,UAAU,EAAE,UAAgC,cAAc,IAAI,CAAC;EAEpE,eAAe,OAAO,YAAY;GAC9B,WAAW,WAAW,QAAiB,MACjC,QAAQ,QAAQ,MAAM,IAAI,GAC1B,QAAQ;GAEd,MAAM,aAAa,MAAM,kBAAkB,CAAC,MAAM,QAAQ;GAC1D,MAAM,UAAU,cAAc,QAAQ,KAAK,WAAW,OAAO,WAAW;GAExE,QAAQ,cAAc;GAEtB,IAAI,EAAE,aAAa,YAAY,QAAQ,mBAAmB,SACtD,QAAQ,UAAU;GAEtB,QAAQ,SAAS,QAAQ;GACzB,gBAAgB,SAAS,QAAQ;GACjC,2BAA2B,SAAS,QAAQ;IAC9C;;CAET,CAAC;AAEF,MAAa,qBAAqBC,eAAkB;CAChD,MAAM;CACN,QAAS,EAAE,qBAAqB;EAC5B,mBAAmB,cAAc;GAC7B,MAAM,iBAA0B,WAAW,WAAW;GAEtD,IAAI,0BAA0B,SAC1B,eAAe,oBAAoB,UAAU;IAEnD;;CAET,CAAA;;;ACxCD,MAAM,wBAAwB;AAE9B,MAAM,eAAe,UAAuC;CACxD,IAAI,MAAM,QAAQ,MAAM,EACpB,OAAO,OAAO,MAAM,OAAO,WAAW,MAAM,KAAK,KAAA;CAGrD,OAAO,OAAO,UAAU,WAAW,QAAQ,KAAA;;AAG/C,MAAa,sBAAsB,WAAmB,QAAQ;CAC1D,MAAM,UAAU,WAAW,WAAW;CAEtC,IAAI,mBAAmBC,WACnB,OAAO,QAAQ,OAAO,UAAU,IAAI,QAAQ,OAAO,WAAW,IAAI;CAGtE,MAAM,SAAS,SAAS,SAAS,OAAO,GAAG,QAAQ,SAAS,KAAA;CAC5D,MAAM,UAAU,SAAS,QAAQ,QAAQ,GAAG,OAAO,UAAU,KAAA;CAE7D,OAAO,YAAY,SAAS,QAAQ,IAAI,YAAY,SAAS,SAAS,IAAI;;AAG9E,MAAa,yBAAyB,KAAa,QAAQ,WAAmB,QAAQ;CAClF,IAAI,CAAC,MAAM,OAAO,UAAU,OAAO,UAC/B,OAAO,mBAAmB,SAAS;CAGvC,OAAO;;AAGX,MAAa,YAAY,KAAa,QAAQ,SAAiB,0BAA0B;CACrF,MAAM,SAAS,sBAAsB,GAAG;CACxC,MAAM,WAAW,WAAW,YAAY,IAAI,IAAIC,YAAU;CAE1D,SAAS,OAAO,OAAO;CACvB,SAAS,OAAO,YAAY,OAAO;CACnC,SAAS,OAAO;CAEhB,MAAM,SAAS,SAAS;CAExB,IAAI,SAAS,OAAO,IAAI,OAAO,OAAO,aAAa,YAC/C,OAAO,SAAS,QAAQ,OAAO;CAGnC,OAAO"}
|
|
1
|
+
{"version":3,"file":"redirect-Bt3re8Qq.js","names":["Request","BaseRequest","Response","BaseResponse","Request","defineClearRouterPlugin","defineKanunPlugin","Request","Response"],"sources":["../src/helpers.ts","../src/Request.ts","../src/Response.ts","../src/session/FlashBag.ts","../src/session/utils.ts","../src/session/ErrorBag.ts","../src/session/Session.ts","../src/old.ts","../src/session/helpers.ts","../src/session/cookie.ts","../src/session/serialization.ts","../src/session/encryption.ts","../src/session/drivers/BaseSessionDriver.ts","../src/session/drivers/CookieSessionDriver.ts","../src/session/drivers/DatabaseSessionDriver.ts","../src/session/drivers/FileSessionDriver.ts","../src/session/config.ts","../src/session/plugins.ts","../src/redirect.ts"],"sourcesContent":["import { HeaderMap, HeaderSource, HeaderValue, RequestSource } from './types/Http'\n\nexport const unwrapRequestSource = <TUser> (\n source: RequestSource<TUser>\n): RequestSource<TUser> => {\n if (source.headers) {\n return source\n }\n\n if (source.req) {\n return source.req\n }\n\n if (source.request) {\n return source.request\n }\n\n return source\n}\n\nexport const makeHeaders = (headers?: HeaderSource) => {\n return new Headers(normalizeHeaders(headers))\n}\n\nexport const normalizeHeaders = (headers?: HeaderSource): HeaderMap => {\n const normalized: HeaderMap = {}\n\n if (!headers) {\n return normalized\n }\n\n if (isHeaders(headers)) {\n headers.forEach((value, key) => {\n normalized[key.toLowerCase()] = value\n })\n\n return normalized\n }\n\n for (const [key, value] of Object.entries(headers)) {\n const normalizedValue = normalizeHeaderValue(value)\n\n if (typeof normalizedValue === 'string') {\n normalized[key.toLowerCase()] = normalizedValue\n }\n }\n\n return normalized\n}\n\nexport const normalizeHeaderValue = (value: HeaderValue) => {\n if (Array.isArray(value)) {\n return value.join(', ')\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value)\n }\n\n return value ?? undefined\n}\n\nexport const isHeaders = (value: unknown): value is Headers => (\n typeof Headers !== 'undefined' && value instanceof Headers\n)\n\nexport const isRecord = (value: unknown): value is Record<PropertyKey, any> => {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n","import { HeaderMap, RequestOptions, RequestSource } from './types/Http'\nimport { isRecord, normalizeHeaders, unwrapRequestSource } from './helpers'\n\nimport { Request as BaseRequest } from 'clear-router'\n\n/**\n * Represents an HTTP request, providing a consistent interface for accessing request data.\n * \n * @author 3m1n3nc3\n */\nexport class Request<TUser = unknown> extends BaseRequest {\n readonly headers: HeaderMap\n readonly ip: string | null\n readonly source?: unknown\n user?: TUser\n authToken?: string\n\n constructor(options: RequestOptions<TUser> = {}) {\n super(options)\n\n this.headers = normalizeHeaders(options.headers)\n if (this.method)\n this.method = options.method!\n if (this.url)\n this.url = options.url!\n if (this.path)\n this.path = options.path!\n this.ip = options.ip ?? null\n this.user = options.user\n this.authToken = options.authToken\n this.source = options.source\n\n globalThis.request = (key?: string) => key ? this.input(key) : this\n }\n\n static from<TUser = unknown> (\n source?: Request<TUser> | RequestSource<TUser>\n ): Request<TUser> | undefined {\n if (!source) {\n return undefined\n }\n\n if (source instanceof Request) {\n return source\n }\n\n const request = unwrapRequestSource(source)\n\n return new Request<TUser>({\n headers: request.headers,\n method: request.method,\n url: request.originalUrl ?? request.url,\n path: request.path,\n ip: request.ip ?? null,\n user: request.user,\n authToken: request.authToken,\n source,\n })\n }\n\n header (name: string): string {\n return this.headers[name.toLowerCase()]\n }\n\n bearerToken (): string | null {\n const authorization = this.header('authorization')\n\n if (!authorization?.startsWith('Bearer ')) {\n return null\n }\n\n return authorization.substring(7)\n }\n\n setUser (user: TUser) {\n this.user = user\n\n if (isRecord(this.source)) {\n this.source.user = user\n }\n\n return this\n }\n}","import { HeaderSource, ResponseSource } from './types/Http'\nimport { isRecord, makeHeaders, normalizeHeaders } from './helpers'\n\nimport { Response as BaseResponse } from 'clear-router'\nimport { RequestData } from 'clear-router/types/basic'\n\n/**\n * Represents an HTTP response, providing a consistent interface for accessing response data.\n * \n * @author 3m1n3nc3\n */\nexport class Response<TBody = unknown> extends BaseResponse {\n override body: TBody\n readonly source?: unknown\n\n constructor(options: {\n statusCode?: number;\n headers?: HeaderSource;\n body?: TBody;\n source?: unknown;\n } = {}) {\n super({\n body: options.body,\n headers: makeHeaders(options.headers),\n statusCode: options.statusCode ?? 200,\n })\n\n this.body = options.body ?? {} as TBody\n this.source = options.source\n\n globalThis.response = () => this\n }\n\n static from<TBody extends RequestData = RequestData> (\n source?: Response<TBody> | ResponseSource\n ): Response<TBody> | undefined {\n if (!source) {\n return undefined\n }\n\n if (source instanceof Response) {\n return source\n }\n\n return new Response<TBody>({\n statusCode: typeof source.status === 'number' ? source.status : source.statusCode,\n headers: source.headers,\n source,\n })\n }\n\n status (code: number) {\n this.statusCode = code\n\n if (isRecord(this.source)) {\n if (typeof this.source.status === 'function') {\n this.source.status(code)\n } else {\n this.source.statusCode = code\n }\n }\n\n return this\n }\n\n header (name: string, value: string) {\n this.headers.set(name.toLowerCase(), value)\n\n if (isRecord(this.source) && typeof this.source.setHeader === 'function') {\n this.source.setHeader(name, value)\n }\n\n return this\n }\n\n getHeaders () {\n return normalizeHeaders(this.headers)\n }\n\n json (body: TBody) {\n this.body = body\n\n if (isRecord(this.source) && typeof this.source.json === 'function') {\n return this.source.json(body)\n }\n\n return body\n }\n\n send (body: TBody) {\n this.body = body\n\n if (isRecord(this.source) && typeof this.source.send === 'function') {\n return this.source.send(body)\n }\n\n return body\n }\n}","export class FlashBag<T = unknown> {\n protected bag: Record<string, T> = {}\n private sweepKeys = new Set<string>()\n\n constructor(items?: Record<string, T>) {\n this.bag = { ...(items || {}) }\n this.sweepKeys = new Set(Object.keys(this.bag))\n }\n\n put (key: string, value: T) {\n this.bag[key] = value\n this.sweepKeys.delete(key)\n\n return this\n }\n\n set (key: string, value: T) {\n return this.put(key, value)\n }\n\n get (key: string, defaultValue?: T): T {\n return (key in this.bag ? this.bag[key] : defaultValue) as T\n }\n\n has (key?: string | string[] | null): boolean {\n if (Array.isArray(key)) {\n return key.every(item => this.has(item))\n }\n\n if (key) {\n return key in this.bag\n }\n\n return this.any()\n }\n\n any () {\n return Object.keys(this.bag).length > 0\n }\n\n isEmpty () {\n return !this.any()\n }\n\n isNotEmpty () {\n return this.any()\n }\n\n keys () {\n return Object.keys(this.bag)\n }\n\n all () {\n return { ...this.bag }\n }\n\n clear (key?: string | string[]) {\n if (Array.isArray(key)) {\n for (const item of key) {\n delete this.bag[item]\n this.sweepKeys.delete(item)\n }\n\n return this\n }\n\n if (key) {\n delete this.bag[key]\n this.sweepKeys.delete(key)\n\n return this\n }\n\n this.bag = {}\n this.sweepKeys.clear()\n\n return this\n }\n\n forget (key: string) {\n return this.clear(key)\n }\n\n markForSweep (keys: string[] = this.keys()) {\n this.sweepKeys = new Set(keys)\n\n return this\n }\n\n sweep () {\n for (const key of this.sweepKeys) {\n delete this.bag[key]\n }\n\n this.sweepKeys = new Set(Object.keys(this.bag))\n\n return this\n }\n\n toJSON () {\n return this.all()\n }\n}\n","import type { SessionErrorRecord, SessionErrorValue } from './types'\n\nimport { isRecord } from '../helpers'\n\nexport const defaultErrorKey = '_'\nexport const sessionKey = Symbol.for('arkstack:http:session')\n\nconst asMessageRecord = (value: unknown): SessionErrorRecord | undefined => {\n if (!isRecord(value)) {\n return undefined\n }\n\n return value as SessionErrorRecord\n}\n\nconst callRecordMethod = (source: Record<string, any>, method: string): SessionErrorRecord | undefined => {\n if (typeof source[method] !== 'function') {\n return undefined\n }\n\n const value = source[method]()\n\n return asMessageRecord(value)\n}\n\nexport const resolveMessageRecord = (source: unknown): SessionErrorRecord | undefined => {\n if (!isRecord(source)) {\n return undefined\n }\n\n if (typeof source.getMessageBag === 'function') {\n const bag = source.getMessageBag()\n\n if (bag && bag !== source) {\n const messages = resolveMessageRecord(bag)\n\n if (messages) {\n return messages\n }\n }\n }\n\n if (typeof source.errors === 'function') {\n const errors = source.errors()\n const messages = resolveMessageRecord(errors) || asMessageRecord(errors)\n\n if (messages) {\n return messages\n }\n }\n\n return callRecordMethod(source, 'getMessages')\n || callRecordMethod(source, 'messagesRaw')\n || callRecordMethod(source, 'toArray')\n || resolveMessageRecord(source.errors)\n || asMessageRecord(source.errors)\n}\n\nexport const getValidationIssueField = (issue: Record<string, any>) => {\n if (typeof issue.field === 'string') {\n return issue.field\n }\n\n if (typeof issue.attribute === 'string') {\n return issue.attribute\n }\n\n if (typeof issue.key === 'string') {\n return issue.key\n }\n\n if (typeof issue.path === 'string') {\n return issue.path\n }\n\n if (Array.isArray(issue.path)) {\n return issue.path.join('.') || defaultErrorKey\n }\n\n return defaultErrorKey\n}\n\nexport const toMessages = (value: SessionErrorValue): string[] => {\n if (Array.isArray(value)) {\n return value.flatMap(item => toMessages(item))\n }\n\n if (value instanceof Error) {\n return [value.message]\n }\n\n if (isRecord(value) && typeof value.message === 'string') {\n return [value.message]\n }\n\n if (value === null || typeof value === 'undefined') {\n return []\n }\n\n return [String(value)]\n}\n\nexport const getPath = <T = any> (source: Record<string, any>, key: string, defaultValue?: T): T => {\n const value = key.split('.').reduce<any>((current, part) => {\n if (!isRecord(current) && !Array.isArray(current)) {\n return undefined\n }\n\n return current[part as never]\n }, source)\n\n return (typeof value === 'undefined' ? defaultValue : value) as T\n}\n","import type { SessionErrorRecord, SessionErrorSource, SessionErrorValue } from './types'\nimport { defaultErrorKey, getValidationIssueField, resolveMessageRecord, toMessages } from './utils'\n\nimport { FlashBag } from './FlashBag'\nimport { isRecord } from '../helpers'\n\nexport class ErrorBag extends FlashBag<string[]> {\n constructor(errors?: SessionErrorSource) {\n super()\n\n if (errors) {\n this.merge(errors)\n this.markForSweep()\n }\n }\n\n add (field: string, message: SessionErrorValue) {\n const key = field || defaultErrorKey\n const messages = toMessages(message)\n\n if (!messages.length) {\n return this\n }\n\n this.put(key, [\n ...(this.bag[key] || []),\n ...messages,\n ])\n\n return this\n }\n\n addIf (condition: boolean, field: string, message: SessionErrorValue) {\n if (condition) {\n this.add(field, message)\n }\n\n return this\n }\n\n merge (errors: SessionErrorSource) {\n const incoming = resolveMessageRecord(errors) || (isRecord(errors) ? errors as SessionErrorRecord : undefined)\n\n if (!incoming) {\n return this.validation(errors)\n }\n\n for (const [field, messages] of Object.entries(incoming)) {\n this.add(field, messages)\n }\n\n return this\n }\n\n validation (error: unknown): ErrorBag {\n if (!error) {\n return this\n }\n\n if (error instanceof ErrorBag) {\n return this.merge(error)\n }\n\n const messages = resolveMessageRecord(error)\n\n if (messages) {\n return this.merge(messages)\n }\n\n if (Array.isArray(error)) {\n for (const item of error) {\n if (isRecord(item) && 'message' in item) {\n this.add(getValidationIssueField(item), item.message)\n } else {\n this.add(defaultErrorKey, item)\n }\n }\n\n return this\n }\n\n if (isRecord(error)) {\n if (typeof error.errors === 'function') {\n return this.validation(error.errors())\n }\n\n if (error.errors) {\n return this.validation(error.errors)\n }\n\n if (Array.isArray(error.issues)) {\n return this.validation(error.issues)\n }\n\n if ('message' in error) {\n return this.add(getValidationIssueField(error), error.message)\n }\n\n return this.merge(error as SessionErrorRecord)\n }\n\n if (error instanceof Error) {\n return this.add(defaultErrorKey, error.message)\n }\n\n return this.add(defaultErrorKey, error)\n }\n\n keys () {\n return Object.keys(this.bag)\n }\n\n get (field: string = defaultErrorKey) {\n return [...(this.bag[field] || [])]\n }\n\n first (field?: string | null) {\n if (field) {\n return this.bag[field]?.[0] || ''\n }\n\n return this.all()[0] || ''\n }\n\n has (field?: string | string[] | null): boolean {\n if (Array.isArray(field)) {\n return field.every(key => this.has(key))\n }\n\n if (field) {\n return (this.bag[field]?.length || 0) > 0\n }\n\n return this.any()\n }\n\n hasAny (fields: string | string[]) {\n const keys = Array.isArray(fields) ? fields : [fields]\n\n return keys.some(key => this.has(key))\n }\n\n missing (fields: string | string[]) {\n const keys = Array.isArray(fields) ? fields : [fields]\n\n return keys.every(key => !this.has(key))\n }\n\n any () {\n return Object.values(this.bag).some(messages => messages.length > 0)\n }\n\n isEmpty () {\n return !this.any()\n }\n\n isNotEmpty () {\n return this.any()\n }\n\n count () {\n return Object.values(this.bag).reduce((total, messages) => total + messages.length, 0)\n }\n\n all () {\n return Object.values(this.bag).flat() as never\n }\n\n unique () {\n return [...new Set(this.all())]\n }\n\n clear (field?: string | string[]) {\n super.clear(field)\n\n return this\n }\n\n forget (field: string) {\n return this.clear(field)\n }\n\n messagesRaw () {\n return this.toJSON()\n }\n\n getMessages () {\n return this.messagesRaw()\n }\n\n getMessageBag () {\n return this\n }\n\n toArray () {\n return this.toJSON()\n }\n\n toJSON () {\n return Object.entries(this.bag).reduce<Record<string, string[]>>((errors, [field, messages]) => {\n errors[field] = [...messages]\n\n return errors\n }, {})\n }\n}\n","import type {\n SessionDriverResult,\n SessionErrorRecord,\n SessionErrorValue,\n SessionInitialState,\n SessionPayload,\n} from './types'\n\nimport { ErrorBag } from './ErrorBag'\nimport { FlashBag } from './FlashBag'\n\nexport class Session {\n public readonly errors: ErrorBag\n public readonly flashBag: FlashBag\n readonly id?: string\n private data: Record<string, any>\n private persistent?: SessionDriverResult\n private saveQueue: Promise<void> = Promise.resolve()\n\n constructor(\n initial?: SessionInitialState | Record<string, any> | Session,\n persistent?: SessionDriverResult,\n ) {\n const current = initial instanceof Session ? initial : undefined\n const state = current\n ? current.snapshot()\n : initial &&\n ('data' in initial || 'errors' in initial || 'flash' in initial)\n ? (initial as SessionInitialState)\n : { data: initial as Record<string, any> | undefined }\n\n this.id = persistent?.id ?? current?.id\n this.persistent = persistent ?? current?.persistent\n this.saveQueue = current?.saveQueue ?? this.saveQueue\n this.data = current ? current.data : { ...(state.data || {}) }\n this.errors = current\n ? current.errors\n : state.errors instanceof ErrorBag\n ? state.errors\n : new ErrorBag(state.errors)\n this.flashBag = current\n ? current.flashBag\n : state.flash instanceof FlashBag\n ? state.flash\n : new FlashBag(state.flash as Record<string, any> | undefined)\n\n const helper = ((key?: string) =>\n key ? this.get(key) : this) as typeof globalThis.session &\n Partial<Session> &\n Record<string, any>\n\n Object.assign(helper, {\n get: this.get.bind(this),\n put: this.put.bind(this),\n set: this.set.bind(this),\n has: this.has.bind(this),\n forget: this.forget.bind(this),\n clear: this.clear.bind(this),\n all: this.all.bind(this),\n flash: this.flash.bind(this),\n getFlash: this.getFlash.bind(this),\n hasErrors: this.hasErrors.bind(this),\n clearErrors: this.clearErrors.bind(this),\n errors: this.errors,\n flashBag: this.flashBag,\n })\n\n globalThis.session = helper as typeof globalThis.session\n }\n\n private snapshot (): SessionPayload {\n return {\n data: this.all(),\n errors: this.errors.toJSON(),\n flash: this.flashBag.toJSON(),\n }\n }\n\n private queuePersist () {\n void this.save()\n }\n\n async save () {\n const payload = this.snapshot()\n\n const previous = this.saveQueue.catch(() => undefined)\n\n this.saveQueue = previous.then(async () => {\n await this.persistent?.save(payload)\n })\n\n await this.saveQueue\n\n return this\n }\n\n async destroy () {\n this.data = {}\n this.errors.clear()\n this.flashBag.clear()\n await this.persistent?.destroy?.()\n\n return this\n }\n\n /**\n * Get an item from the session bag\n *\n * @param key\n * @param defaultValue\n * @returns\n */\n get<T = any> (key: string, defaultValue?: T): T {\n return (key in this.data ? this.data[key] : defaultValue) as T\n }\n\n /**\n * Add an item to the session bag\n *\n * @param key\n * @param defaultValue\n * @returns\n */\n put<T = any> (key: string, value: T) {\n this.data[key] = value\n this.queuePersist()\n\n return this\n }\n\n /**\n * Add an item to the session bag\n *\n * @param key\n * @param defaultValue\n * @returns\n */\n set<T = any> (key: string, value: T) {\n return this.put(key, value)\n }\n\n /**\n * Check if an item exist in the session bag\n *\n * @param key\n * @returns\n */\n has (key: string) {\n return key in this.data\n }\n\n /**\n * Remove an item from the session bag\n *\n * @param key\n * @returns\n */\n forget (key: string) {\n delete this.data[key]\n this.queuePersist()\n\n return this\n }\n\n /**\n * Clear the session bag\n *\n * @returns\n */\n clear () {\n this.data = {}\n this.errors.clear()\n this.flashBag.clear()\n this.queuePersist()\n\n return this\n }\n\n /**\n * Get all items in the session bag\n *\n * @returns\n */\n all () {\n return { ...this.data }\n }\n\n /**\n * Add a flash item for the next request\n *\n * @param key\n * @param value\n * @returns\n */\n flash<T = any> (key: string, value: T) {\n this.flashBag.put(key, value)\n this.queuePersist()\n\n return this\n }\n\n /**\n * Get a flash item\n *\n * @param key\n * @param defaultValue\n * @returns\n */\n getFlash<T = any> (key: string, defaultValue?: T): T {\n return this.flashBag.get(key, defaultValue) as T\n }\n\n /**\n * Sweep flashed data that was loaded for this request\n *\n * @returns\n */\n async sweepFlash () {\n this.errors.sweep()\n this.flashBag.sweep()\n await this.save()\n\n return this\n }\n\n /**\n * Add an error to the session error bag\n *\n * @param field\n * @param message\n * @returns\n */\n addError (field: string, message: SessionErrorValue) {\n this.errors.add(field, message)\n this.queuePersist()\n\n return this\n }\n\n /**\n * Add multiple errors to the session error bag\n *\n * @param errors\n * @returns\n */\n addErrors (errors: SessionErrorRecord | ErrorBag) {\n this.errors.merge(errors)\n this.queuePersist()\n\n return this\n }\n\n /**\n * Add a validation error to the session error bag\n *\n * @param error\n * @returns\n */\n addValidationErrors (error: unknown) {\n this.errors.validation(error)\n this.queuePersist()\n\n return this\n }\n\n /**\n * Check if the session error bag has any errors\n *\n * @param field\n * @returns\n */\n hasErrors (field?: string) {\n return this.errors.has(field)\n }\n\n /**\n * Clear all errors in the session error bag\n *\n * @param field\n * @returns\n */\n clearErrors (field?: string) {\n this.errors.clear(field)\n this.queuePersist()\n\n return this\n }\n\n /**\n * Parse session for views\n *\n * @returns\n */\n forView () {\n return {\n ...this.all(),\n errors: this.errors,\n flash: this.flashBag,\n }\n }\n\n /**\n * Return session as json\n *\n * @returns\n */\n toJSON () {\n return {\n ...this.all(),\n errors: this.errors.toJSON(),\n flash: this.flashBag.toJSON(),\n }\n }\n}\n","import { Request } from './Request'\nimport { getPath } from './session/utils'\nimport { isRecord } from './helpers'\n\nconst requestInput = () => {\n const request = globalThis.request?.()\n\n if (request instanceof Request) {\n if (isRecord(request.body)) {\n return request.body\n }\n\n const source = isRecord(request.source) ? request.source : undefined\n\n if (source && typeof source.getBody === 'function') {\n return source.getBody() ?? {}\n }\n\n if (isRecord(source?.body)) {\n return source.body\n }\n }\n\n if (isRecord(request) && typeof request.getBody === 'function') {\n return request.getBody() ?? {}\n }\n\n return isRecord(request?.body) ? request.body : {}\n}\n\nexport const old = <T = any> (key?: string, defaultValue?: T): T => {\n const input = requestInput()\n\n if (!key) {\n return input as T\n }\n\n return getPath(input, key, defaultValue) as T\n}\n","import type { SessionDriverResult, SessionInitialState } from './types'\n\nimport { Session } from './Session'\nimport { isRecord } from '../helpers'\nimport { sessionKey } from './utils'\nimport { old } from '../old'\n\nconst sweepRegisteredKey = Symbol.for('arkstack:http:flash-sweep-registered')\n\nconst attachSessionProperty = (target: Record<PropertyKey, any>, session: Session) => {\n target.httpSession = session\n\n if (!('session' in target) || target.session instanceof Session) {\n target.session = session\n }\n}\n\nconst responseSource = (target: Record<PropertyKey, any>) => {\n return target.res\n ?? target.ctx?.res\n ?? target.response?.source\n ?? target.clearResponse?.source\n ?? target.context?.res\n ?? target.context?.response?.source\n}\n\nexport const registerResponseFlashSweep = (target: unknown, session?: Session) => {\n if (!isRecord(target)) {\n return\n }\n\n const current = session ?? getSession(target)\n const res = responseSource(target)\n\n if (!(current instanceof Session) || !isRecord(res) || typeof res.end !== 'function' || res[sweepRegisteredKey]) {\n return\n }\n\n res[sweepRegisteredKey] = true\n const end = res.end.bind(res)\n\n res.end = (...args: any[]) => {\n void current.sweepFlash()\n .catch(() => undefined)\n .finally(() => end(...args))\n\n return res\n }\n}\n\nexport const attachViewState = (target: Record<PropertyKey, any>, session: Session) => {\n attachSessionProperty(target, session)\n target.errors = session.errors\n\n if (isRecord(target.req)) {\n attachSessionProperty(target.req, session)\n target.req.errors = session.errors\n target.req.old = old\n }\n\n if (isRecord(target.res)) {\n target.res.locals = {\n ...(target.res.locals || {}),\n session,\n errors: session.errors,\n flash: session.flashBag,\n old,\n }\n }\n\n if (isRecord(target.response?.source)) {\n target.response.source.locals = {\n ...(target.response.source.locals || {}),\n session,\n errors: session.errors,\n flash: session.flashBag,\n old,\n }\n }\n\n if (isRecord(target.context)) {\n attachSessionProperty(target.context, session)\n target.context.errors = session.errors\n target.context.flash = session.flashBag\n target.context.old = old\n }\n\n if (isRecord(target.state)) {\n attachSessionProperty(target.state, session)\n target.state.errors = session.errors\n target.state.flash = session.flashBag\n target.state.old = old\n }\n\n if (typeof target.set === 'function') {\n target.set('session', session)\n target.set('errors', session.errors)\n target.set('flash', session.flashBag)\n target.set('old', old)\n }\n}\n\n/**\n * Ensure a valid session exists\n * \n * @param ctx \n * @param initial \n * @returns \n */\nexport const ensureSession = (\n ctx: unknown,\n initial?: SessionInitialState | Record<string, any>,\n persistent?: SessionDriverResult\n): Session => {\n if (!isRecord(ctx)) {\n return new Session(initial, persistent)\n }\n\n const existing = ctx[sessionKey]\n ?? (ctx.session instanceof Session ? ctx.session : undefined)\n ?? (isRecord(ctx.req) && ctx.req.httpSession instanceof Session ? ctx.req.httpSession : undefined)\n const session = existing instanceof Session\n ? existing\n : new Session(initial, persistent)\n\n ctx[sessionKey] = session\n attachViewState(ctx, session)\n\n return session\n}\n\n/**\n * Get the current session\n * \n * @param ctx \n * @returns \n */\nexport const getSession = (ctx: unknown): Session | undefined => {\n if (!isRecord(ctx)) {\n return undefined\n }\n\n const session = ctx[sessionKey] ?? ctx.session\n\n return session instanceof Session ? session : undefined\n}","import type { HttpContextLike, cookie_options } from './types'\nimport { createHmac, randomBytes, timingSafeEqual } from 'node:crypto'\n\nimport { isRecord } from '../helpers'\n\nexport const generateSessionId = () => randomBytes(32).toString('base64url')\n\nexport const signValue = (value: string, secret: string) =>\n createHmac('sha256', secret).update(value).digest('base64url')\n\nexport const encodeSignedValue = (value: string, secret: string) =>\n `${value}.${signValue(value, secret)}`\n\nexport const decodeSignedValue = (\n value: string | undefined,\n secret: string,\n) => {\n if (!value) return undefined\n const index = value.lastIndexOf('.')\n if (index < 1) return undefined\n const payload = value.slice(0, index)\n const signature = value.slice(index + 1)\n const expected = signValue(payload, secret)\n const signatureBuffer = Buffer.from(signature)\n const expectedBuffer = Buffer.from(expected)\n if (signatureBuffer.length !== expectedBuffer.length) return undefined\n\n return timingSafeEqual(signatureBuffer, expectedBuffer) ? payload : undefined\n}\n\nexport const encodeJson = (value: unknown) =>\n Buffer.from(JSON.stringify(value), 'utf8').toString('base64url')\n\nexport const decodeJson = <T = unknown> (\n value: string | undefined,\n): T | undefined => {\n if (!value) return undefined\n try {\n return JSON.parse(Buffer.from(value, 'base64url').toString('utf8')) as T\n } catch {\n return undefined\n }\n}\n\nexport const parseCookies = (\n header?: string | string[] | null,\n): Record<string, string> => {\n const source = Array.isArray(header) ? header.join('; ') : header || ''\n\n return source.split(';').reduce<Record<string, string>>((cookies, part) => {\n const index = part.indexOf('=')\n if (index < 0) return cookies\n const key = part.slice(0, index).trim()\n const value = part.slice(index + 1).trim()\n if (key) cookies[key] = decodeURIComponent(value)\n\n return cookies\n }, {})\n}\n\nexport const getCookie = (context: HttpContextLike, name: string) => {\n const ctx = isRecord(context.ctx) ? context.ctx : context\n const request = context.request || ctx.clearRequest || ctx.req || ctx.request\n const headers =\n request?.headers || ctx.headers || ctx.req?.headers || ctx.request?.headers\n const cookie =\n typeof headers?.get === 'function'\n ? headers.get('cookie')\n : headers?.cookie\n\n return parseCookies(cookie)[name]\n}\n\nexport const serializeCookie = (\n name: string,\n value: string,\n options: cookie_options = {},\n) => {\n const parts = [`${name}=${encodeURIComponent(value)}`]\n if (typeof options.maxAge === 'number')\n parts.push(`Max-Age=${Math.max(0, Math.floor(options.maxAge))}`)\n if (options.expires) parts.push(`Expires=${options.expires.toUTCString()}`)\n parts.push(`Path=${options.path || '/'}`)\n if (options.domain) parts.push(`Domain=${options.domain}`)\n if (options.httpOnly !== false) parts.push('HttpOnly')\n if (options.secure) parts.push('Secure')\n if (options.sameSite) parts.push(`SameSite=${options.sameSite}`)\n\n return parts.join('; ')\n}\n\nconst splitSetCookieHeader = (value: string) => {\n return value.split(/,\\s*(?=[^;,\\s]+=)/).filter(Boolean)\n}\n\nconst withoutCookie = (current: unknown, cookieName: string) => {\n const entries = Array.isArray(current)\n ? current.flatMap((item) => splitSetCookieHeader(String(item)))\n : typeof current === 'string'\n ? splitSetCookieHeader(current)\n : []\n\n return entries.filter(\n (cookie) => !cookie.trim().startsWith(`${cookieName}=`),\n )\n}\n\nconst upsertHeaderValue = (\n target: any,\n headerName: string,\n cookieName: string,\n value: string,\n) => {\n if (!target) return false\n\n if (typeof target.setHeader === 'function') {\n const current =\n typeof target.getHeader === 'function'\n ? target.getHeader(headerName)\n : undefined\n const next = [...withoutCookie(current, cookieName), value]\n\n target.setHeader(headerName, next)\n\n return true\n }\n\n if (target.headers && typeof target.headers.set === 'function') {\n const current = target.headers.get(headerName)\n const next = [...withoutCookie(current, cookieName), value]\n\n target.headers.set(headerName, next.join(', '))\n\n return true\n }\n\n if (typeof target.appendHeader === 'function') {\n target.appendHeader(headerName, value)\n\n return true\n }\n\n\n if (typeof target.append === 'function') {\n target.append(headerName, value)\n\n return true\n }\n\n return false\n}\n\nexport const setCookie = (\n context: HttpContextLike,\n name: string,\n value: string,\n options: cookie_options = {},\n) => {\n const ctx = isRecord(context.ctx) ? context.ctx : context\n const cookie = serializeCookie(name, value, options)\n const response = context.response || ctx.clearResponse\n if (response?.headers && typeof response.headers.set === 'function') {\n const current = response.headers.get('set-cookie')\n const next = [...withoutCookie(current, name), cookie]\n\n response.headers.set('set-cookie', next.join(', '))\n }\n\n const assigned =\n upsertHeaderValue(response?.source, 'Set-Cookie', name, cookie) ||\n upsertHeaderValue(ctx.res, 'Set-Cookie', name, cookie) ||\n upsertHeaderValue(ctx.response, 'Set-Cookie', name, cookie) ||\n upsertHeaderValue(ctx.response?.source, 'Set-Cookie', name, cookie) ||\n upsertHeaderValue(ctx.event?.res, 'Set-Cookie', name, cookie)\n\n void assigned\n\n return cookie\n}\n","import type { SessionPayload } from './types'\n\nconst byteLength = (value: string) => Buffer.byteLength(value, 'utf8')\n\nconst serializeValue = (value: unknown): string => {\n if (value === null || typeof value === 'undefined') {\n return 'N;'\n }\n\n if (typeof value === 'boolean') {\n return `b:${value ? 1 : 0};`\n }\n\n if (typeof value === 'number') {\n return Number.isInteger(value) ? `i:${value};` : `d:${value};`\n }\n\n if (typeof value === 'string') {\n return `s:${byteLength(value)}:\"${value}\";`\n }\n\n if (Array.isArray(value)) {\n return serializeEntries(value.map((item, index) => [index, item]))\n }\n\n if (typeof value === 'object') {\n return serializeEntries(Object.entries(value as Record<string, unknown>))\n }\n\n return serializeValue(String(value))\n}\n\nconst serializeEntries = (entries: Array<[string | number, unknown]>) => {\n return `a:${entries.length}:{${entries.map(([key, value]) => serializeValue(key) + serializeValue(value)).join('')}}`\n}\n\nclass Parser {\n private offset = 0\n\n constructor(private readonly source: string) { }\n\n parse (): unknown {\n const type = this.source[this.offset]\n this.offset += type === 'N' ? 1 : 2\n\n switch (type) {\n case 'N':\n this.expect(';')\n\n return null\n case 'b':\n return this.readUntil(';') === '1'\n case 'i':\n return Number.parseInt(this.readUntil(';'), 10)\n case 'd':\n return Number.parseFloat(this.readUntil(';'))\n case 's':\n return this.parseString()\n case 'a':\n return this.parseArray()\n default:\n throw new Error(`Unsupported serialized session value: ${type}`)\n }\n }\n\n private parseString () {\n const length = Number.parseInt(this.readUntil(':'), 10)\n this.expect('\"')\n let end = this.offset\n let bytes = 0\n\n while (end < this.source.length && bytes < length) {\n const char = this.source[end]\n bytes += Buffer.byteLength(char, 'utf8')\n end += 1\n }\n\n const value = this.source.slice(this.offset, end)\n this.offset = end\n this.expect('\"')\n this.expect(';')\n\n return value\n }\n\n private parseArray () {\n const length = Number.parseInt(this.readUntil(':'), 10)\n this.expect('{')\n const entries: Array<[string | number, unknown]> = []\n let sequential = true\n\n for (let index = 0; index < length; index += 1) {\n const key = this.parse() as string | number\n const value = this.parse()\n entries.push([key, value])\n\n if (key !== index) {\n sequential = false\n }\n }\n\n this.expect('}')\n\n if (sequential) {\n return entries.map(([, value]) => value)\n }\n\n return entries.reduce<Record<string, unknown>>((record, [key, value]) => {\n record[String(key)] = value\n\n return record\n }, {})\n }\n\n private readUntil (token: string) {\n const index = this.source.indexOf(token, this.offset)\n\n if (index < 0) {\n throw new Error('Invalid serialized session payload')\n }\n\n const value = this.source.slice(this.offset, index)\n this.offset = index + token.length\n\n return value\n }\n\n private expect (token: string) {\n if (this.source.slice(this.offset, this.offset + token.length) !== token) {\n throw new Error('Invalid serialized session payload')\n }\n\n this.offset += token.length\n }\n}\n\nexport const encodeSessionPayload = (\n payload: SessionPayload & { id?: string },\n) => {\n return serializeValue(payload)\n}\n\nconst normalizeSessionPayload = (payload: unknown) => {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {\n return payload\n }\n\n const record = payload as Record<string, unknown>\n\n for (const key of ['data', 'errors', 'flash']) {\n if (Array.isArray(record[key]) && record[key].length === 0) {\n record[key] = {}\n }\n }\n\n return record\n}\n\nexport const decodeSessionPayload = <\n T extends SessionPayload & { id?: string } = SessionPayload & { id?: string },\n> (\n value: string | undefined,\n): T | undefined => {\n if (!value) {\n return undefined\n }\n\n try {\n return normalizeSessionPayload(new Parser(value).parse()) as T\n } catch {\n return undefined\n }\n}\n","import { createCipheriv, createDecipheriv, createHash, createHmac, randomBytes, timingSafeEqual } from 'node:crypto'\n\ntype LaravelEncryptedPayload = {\n iv?: string\n value?: string\n mac?: string\n tag?: string\n}\n\nconst keyFromSecret = (secret: string) => {\n if (secret.startsWith('base64:')) {\n const decoded = Buffer.from(secret.slice(7), 'base64')\n\n if (decoded.length === 32) {\n return decoded\n }\n }\n\n const raw = Buffer.from(secret, 'base64')\n\n if (raw.length === 32) {\n return raw\n }\n\n return createHash('sha256').update(secret).digest()\n}\n\nconst macFor = (iv: string, value: string, key: Buffer) => {\n return createHmac('sha256', key).update(iv + value).digest('hex')\n}\n\nexport const encryptSessionValue = (value: string, secret: string) => {\n const key = keyFromSecret(secret)\n const iv = randomBytes(16)\n const ivValue = iv.toString('base64')\n const cipher = createCipheriv('aes-256-cbc', key, iv)\n const encrypted = Buffer.concat([\n cipher.update(value, 'utf8'),\n cipher.final(),\n ]).toString('base64')\n const payload: LaravelEncryptedPayload = {\n iv: ivValue,\n value: encrypted,\n mac: macFor(ivValue, encrypted, key),\n tag: '',\n }\n\n return JSON.stringify(payload)\n}\n\nexport const decryptSessionValue = (payload: string | undefined, secret: string) => {\n if (!payload) {\n return undefined\n }\n\n try {\n const decoded = JSON.parse(payload.startsWith('{') ? payload : Buffer.from(payload, 'base64').toString('utf8')) as LaravelEncryptedPayload\n\n if (!decoded.iv || !decoded.value || !decoded.mac) {\n return undefined\n }\n\n const key = keyFromSecret(secret)\n const expected = macFor(decoded.iv, decoded.value, key)\n const actualBuffer = Buffer.from(decoded.mac)\n const expectedBuffer = Buffer.from(expected)\n\n if (actualBuffer.length !== expectedBuffer.length || !timingSafeEqual(actualBuffer, expectedBuffer)) {\n return undefined\n }\n\n const decipher = createDecipheriv('aes-256-cbc', key, Buffer.from(decoded.iv, 'base64'))\n\n return Buffer.concat([\n decipher.update(Buffer.from(decoded.value, 'base64')),\n decipher.final(),\n ]).toString('utf8')\n } catch {\n return undefined\n }\n}\n","import { BaseSessionDriverOptions, HttpContextLike, SessionDriver, SessionDriverResult, cookie_options } from '../types'\nimport { decodeSignedValue, encodeSignedValue, getCookie, setCookie } from '../cookie'\nimport { decryptSessionValue, encryptSessionValue } from '../encryption'\n\nconst defaultSecret = () =>\n String(\n process.env.SESSION_SECRET ||\n process.env.APP_KEY ||\n 'arkstack-session-secret',\n )\n\nconst defaultcookie_options = (ttl?: number): cookie_options => ({\n httpOnly: true,\n sameSite: 'Lax',\n secure: process.env.NODE_ENV === 'production',\n path: '/',\n maxAge: ttl,\n})\n\nexport abstract class BaseSessionDriver implements SessionDriver {\n readonly cookie: string\n readonly secret: string\n readonly ttl?: number\n readonly cookie_options: cookie_options\n\n constructor(options: BaseSessionDriverOptions = {}) {\n this.cookie = options.cookie || 'arkstack_session'\n this.secret = options.secret || defaultSecret()\n this.ttl = options.ttl\n this.cookie_options = {\n ...defaultcookie_options(options.ttl),\n ...(options.cookie_options || {}),\n }\n }\n\n protected readSessionId (context: HttpContextLike) {\n return decodeSignedValue(getCookie(context, this.cookie), this.secret)\n }\n\n protected encryptPayload (value: string) {\n return encryptSessionValue(value, this.secret)\n }\n\n protected decryptPayload (value: string | undefined) {\n return decryptSessionValue(value, this.secret)\n }\n\n protected writeSessionId (context: HttpContextLike, id: string) {\n setCookie(\n context,\n this.cookie,\n encodeSignedValue(id, this.secret),\n this.cookie_options,\n )\n }\n\n abstract start (context: HttpContextLike): Promise<SessionDriverResult>;\n}","import { HttpContextLike, SessionDriverResult, SessionPayload } from '../types'\nimport { decodeJson, decodeSignedValue, generateSessionId, getCookie, setCookie } from '../cookie'\nimport { decodeSessionPayload, encodeSessionPayload } from '../serialization'\n\nimport { BaseSessionDriver } from './BaseSessionDriver'\n\nexport class CookieSessionDriver extends BaseSessionDriver {\n async start (context: HttpContextLike): Promise<SessionDriverResult> {\n const cookie = getCookie(context, this.cookie)\n const decoded = this.decryptPayload(cookie) ?? decodeSignedValue(cookie, this.secret)\n const payload = decodeSessionPayload<SessionPayload & { id?: string }>(decoded) ?? decodeJson<SessionPayload & { id?: string }>(decoded)\n const id = payload?.id || generateSessionId()\n const state = payload\n ? { data: payload.data, errors: payload.errors, flash: payload.flash }\n : undefined\n const save = async (next: SessionPayload) => {\n setCookie(\n context,\n this.cookie,\n this.encryptPayload(encodeSessionPayload({ id, ...next })),\n this.cookie_options,\n )\n }\n const destroy = async () => {\n setCookie(context, this.cookie, '', {\n ...this.cookie_options,\n maxAge: 0,\n expires: new Date(0),\n })\n }\n\n return { id, state, save, destroy }\n }\n}","import { DatabaseSessionDriverOptions, HttpContextLike, SessionDriverResult, SessionPayload } from '../types'\nimport { decodeJson, generateSessionId, setCookie } from '../cookie'\nimport { decodeSessionPayload, encodeSessionPayload } from '../serialization'\n\nimport { BaseSessionDriver } from './BaseSessionDriver'\nimport { DB } from 'arkormx'\nimport { isRecord } from '../../helpers'\n\nexport class DatabaseSessionDriver extends BaseSessionDriver {\n readonly tableName: string\n\n constructor(options: DatabaseSessionDriverOptions = {}) {\n super(options)\n this.tableName = options.table || 'sessions'\n }\n\n private table () {\n return DB.table(this.tableName)\n }\n\n async start (context: HttpContextLike): Promise<SessionDriverResult> {\n const id = this.readSessionId(context) || generateSessionId()\n this.writeSessionId(context, id)\n\n const row = await this.table().where({ id }).first()\n const state = isRecord(row) && typeof row.payload === 'string'\n ? decodeSessionPayload<SessionPayload>(this.decryptPayload(row.payload) ?? row.payload) ?? decodeJson<SessionPayload>(this.decryptPayload(row.payload) ?? row.payload)\n : isRecord(row?.payload)\n ? (row.payload as SessionPayload)\n : undefined\n\n const save = async (payload: SessionPayload) => {\n const now = new Date()\n const values = {\n id,\n payload: this.encryptPayload(encodeSessionPayload(payload)),\n updatedAt: now,\n expiresAt: this.ttl ? new Date(now.getTime() + this.ttl * 1000) : null,\n }\n const existing = await this.table().where({ id }).first()\n if (existing) await this.table().where({ id }).update(values)\n else await this.table().insert({ ...values, createdAt: now })\n this.writeSessionId(context, id)\n }\n\n const destroy = async () => {\n await this.table().where({ id }).delete()\n setCookie(context, this.cookie, '', {\n ...this.cookie_options,\n maxAge: 0,\n expires: new Date(0),\n })\n }\n\n return { id, state, save, destroy }\n }\n}","import { BaseSessionDriverOptions, HttpContextLike, SessionDriverResult, SessionPayload } from '../types'\nimport { decodeSessionPayload, encodeSessionPayload } from '../serialization'\nimport { dirname, join } from 'node:path'\nimport { generateSessionId, setCookie } from '../cookie'\nimport { mkdir, readFile, rm, writeFile } from 'node:fs/promises'\n\nimport { Arkstack } from '@arkstack/contract'\nimport { BaseSessionDriver } from './BaseSessionDriver'\n\nexport class FileSessionDriver extends BaseSessionDriver {\n readonly directory: string\n\n constructor(options: BaseSessionDriverOptions & { directory?: string } = {}) {\n super(options)\n this.directory =\n options.directory ||\n join(Arkstack.rootDir(), 'storage', 'framework', 'sessions')\n }\n\n private path (id: string) {\n return join(this.directory, id)\n }\n\n async start (context: HttpContextLike): Promise<SessionDriverResult> {\n const id = this.readSessionId(context) || generateSessionId()\n this.writeSessionId(context, id)\n let state: SessionPayload | undefined\n try {\n const contents = await readFile(this.path(id), 'utf8')\n const payload = this.decryptPayload(contents) ?? contents\n state = decodeSessionPayload<SessionPayload>(payload) ?? JSON.parse(payload) as SessionPayload\n } catch {\n state = undefined\n }\n\n const save = async (payload: SessionPayload) => {\n const path = this.path(id)\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, this.encryptPayload(encodeSessionPayload(payload)), 'utf8')\n this.writeSessionId(context, id)\n }\n\n const destroy = async () => {\n await rm(this.path(id), { force: true })\n setCookie(context, this.cookie, '', {\n ...this.cookie_options,\n maxAge: 0,\n expires: new Date(0),\n })\n }\n\n return { id, state, save, destroy }\n }\n}","import type { PersistentSessionConfig, SessionDriver } from './types'\n\nimport { CookieSessionDriver } from './drivers/CookieSessionDriver'\nimport { DatabaseSessionDriver } from './drivers/DatabaseSessionDriver'\nimport { FileSessionDriver } from './drivers/FileSessionDriver'\n\nlet configuredDriver: SessionDriver | undefined\n\nconst readAppSessionConfig = (): PersistentSessionConfig | undefined => {\n try {\n if (!globalThis.config) return\n\n return {\n driver: config('session.driver', 'cookie'),\n cookie: config('session.cookie', 'arkstack_session'),\n secret: config('session.secret'),\n ttl: config('session.ttl', 60 * 60 * 24 * 7),\n cookie_options: {\n path: config('session.path', '/'),\n httpOnly: config('session.http_only', true),\n secure: config('session.secure', true),\n sameSite: config('session.same_site', 'Lax'),\n },\n file: {\n directory: config('session.directory')\n },\n database: {\n table: config('session.table', 'sessions')\n },\n }\n } catch {\n return undefined\n }\n}\n\nexport const createSessionDriver = (\n config: PersistentSessionConfig = {},\n): SessionDriver => {\n if (config.driver && typeof config.driver !== 'string') return config.driver\n\n const common = {\n cookie: config.cookie,\n secret: config.secret,\n ttl: config.ttl,\n cookie_options: config.cookie_options,\n }\n\n switch (config.driver || 'cookie') {\n case 'file':\n return new FileSessionDriver({\n ...common,\n directory: config.file?.directory,\n })\n case 'database':\n return new DatabaseSessionDriver({\n ...common,\n table: config.database?.table,\n })\n case 'cookie':\n default:\n return new CookieSessionDriver(common)\n }\n}\n\nexport const configureSession = (\n config: PersistentSessionConfig | SessionDriver,\n) => {\n configuredDriver =\n typeof (config as SessionDriver).start === 'function'\n ? (config as SessionDriver)\n : createSessionDriver(config as PersistentSessionConfig)\n\n return configuredDriver\n}\n\nexport const getSessionDriver = () => {\n if (!configuredDriver)\n configuredDriver = createSessionDriver(readAppSessionConfig())\n\n return configuredDriver\n}\n","import { attachViewState, ensureSession, registerResponseFlashSweep } from './helpers'\n\nimport { HttpContext } from '../types/Http'\nimport { Session } from './Session'\nimport { definePlugin as defineClearRouterPlugin } from 'clear-router/core'\nimport { definePlugin as defineKanunPlugin } from 'kanun'\nimport { getSessionDriver } from './config'\n\nexport const arkstackHttpPlugin = defineClearRouterPlugin<any, HttpContext>({\n name: 'arkstack-http',\n setup: ({ bind, useHttpContext }) => {\n bind(Session, ({ ctx }: { ctx: HttpContext }) => ensureSession(ctx))\n\n useHttpContext(async (context) => {\n globalThis.request = (key?: string) => key\n ? context.request.input(key)\n : context.request\n\n const persistent = await getSessionDriver().start(context)\n const session = ensureSession(context.ctx, persistent.state, persistent)\n\n context.httpSession = session\n\n if (!('session' in context) || context.session instanceof Session) {\n context.session = session\n }\n context.errors = session.errors\n attachViewState(context, session)\n registerResponseFlashSweep(context, session)\n })\n },\n})\n\nexport const kanunSessionPlugin = defineKanunPlugin({\n name: 'kanun-session-plugin',\n install ({ onValidationError }) {\n onValidationError((validator) => {\n const currentSession: Session = globalThis.session?.() as never\n\n if (currentSession instanceof Session) {\n currentSession.addValidationErrors(validator)\n }\n })\n },\n})","import { Request } from './Request'\nimport { Response } from './Response'\nimport { isRecord } from './helpers'\n\nconst defaultRedirectStatus = 302\n\nconst headerValue = (value: unknown): string | undefined => {\n if (Array.isArray(value)) {\n return typeof value[0] === 'string' ? value[0] : undefined\n }\n\n return typeof value === 'string' ? value : undefined\n}\n\nexport const redirectBackTarget = (fallback: string = '/') => {\n const request = globalThis.request?.() as Request | { source: any }\n\n if (request instanceof Request) {\n return request.header('referer') || request.header('referrer') || fallback\n }\n\n const source = isRecord(request?.source) ? request.source : undefined\n const headers = isRecord(source?.headers) ? source.headers : undefined\n\n return headerValue(headers?.referer) || headerValue(headers?.referrer) || fallback\n}\n\nexport const resolveRedirectTarget = (to: string = 'back', fallback: string = '/') => {\n if (!to || to === 'back' || to === 'source') {\n return redirectBackTarget(fallback)\n }\n\n return to\n}\n\nexport const redirect = (to: string = 'back', status: number = defaultRedirectStatus) => {\n const target = resolveRedirectTarget(to)\n const response = globalThis.response?.() ?? new Response()\n\n response.status(status)\n response.header('Location', target)\n response.body = null\n\n const source = response.source\n\n if (isRecord(source) && typeof source.redirect === 'function') {\n source.redirect(status, target)\n }\n\n return response\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@arkstack/http",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "HTTP module for Arkstack, providing framework-agnostic request and response primitives.",
|
|
6
6
|
"homepage": "https://arkstack.toneflix.net/guide/http",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"clear-router": "^2.7.7",
|
|
32
|
-
"@arkstack/contract": "^0.10.
|
|
32
|
+
"@arkstack/contract": "^0.10.3"
|
|
33
33
|
},
|
|
34
34
|
"peerDependencies": {
|
|
35
35
|
"arkormx": "^2.4.1",
|