alp-node
Version:
framework based on koa 2
1 lines • 30.7 kB
Source Map (JSON)
{"version":3,"file":"AlpNodeApp-node20.mjs","sources":["../src/errors.ts","../src/language.ts","../src/listen.ts","../src/params/ParamValidationResult.ts","../src/params/ParamValid.ts","../src/params/ParamValueValidator.ts","../src/params/ParamValueStringValidator.ts","../src/params/ParamValueFromContext.ts","../src/params/index.ts","../src/translate/load.ts","../src/translate/index.ts","../src/AlpNodeApp.ts"],"sourcesContent":["import { STATUS_CODES } from \"node:http\";\nimport ErrorHtmlRenderer from \"error-html\";\nimport { Logger } from \"nightingale-logger\";\nimport type { Context } from \"./AlpNodeApp\";\nimport type { HtmlError } from \"./types\";\n\nconst logger = new Logger(\"alp:errors\");\nconst errorHtmlRenderer = new ErrorHtmlRenderer({\n appPath: `${process.cwd()}/`,\n});\n\nexport default async function alpNodeErrors(\n ctx: Context,\n next: () => Promise<void> | void,\n): Promise<void> {\n try {\n await next();\n } catch (error: unknown) {\n // eslint-disable-next-line no-ex-assign\n if (!error) error = new Error(\"Unknown error\");\n // eslint-disable-next-line no-ex-assign\n if (typeof error === \"string\") error = new Error(error);\n\n ctx.status = (error as HtmlError).status || 500;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n logger.error(error as any);\n\n switch (ctx.request.accepts(\"html\", \"text\", \"json\")) {\n case \"json\":\n ctx.type = \"application/json\";\n if (\n process.env.NODE_ENV !== \"production\" ||\n (error as HtmlError).expose\n ) {\n ctx.body = { error: (error as Error).message };\n } else {\n ctx.body = { error: STATUS_CODES[ctx.status] };\n }\n\n break;\n\n case \"html\":\n ctx.type = \"text/html\";\n if (process.env.NODE_ENV !== \"production\") {\n ctx.body = errorHtmlRenderer.render(error as Error);\n } else if ((error as HtmlError).expose) {\n ctx.body = (error as Error).message;\n } else {\n throw error;\n }\n\n break;\n\n case \"text\":\n case false:\n default:\n ctx.type = \"text/plain\";\n if (\n process.env.NODE_ENV !== \"production\" ||\n (error as HtmlError).expose\n ) {\n ctx.body = (error as Error).message;\n } else {\n throw error;\n }\n\n break;\n }\n }\n}\n","import type { Context } from \"koa\";\nimport { defineLazyProperty } from \"object-properties\";\nimport type { AlpNodeApp } from \"./AlpNodeApp\";\n\nexport interface AlpLanguageContext {\n readonly firstAcceptedLanguage: string;\n readonly language: string;\n}\nexport default function alpLanguage(app: AlpNodeApp): void {\n const config = app.context.config;\n const availableLanguages: string[] = config.get(\"availableLanguages\");\n if (!availableLanguages) {\n throw new Error('Missing config \"availableLanguages\"');\n }\n\n defineLazyProperty(\n app.context,\n \"language\",\n function language(this: Context): string {\n return (\n this.acceptsLanguages(availableLanguages) ||\n availableLanguages[0] ||\n \"en\"\n );\n },\n );\n\n defineLazyProperty(\n app.context,\n \"firstAcceptedLanguage\",\n function firstAcceptedLanguage(this: Context): string {\n return this.acceptsLanguages()[0] || availableLanguages[0] || \"en\";\n },\n );\n}\n","import { chmodSync, readFileSync, unlinkSync } from \"node:fs\";\nimport { createServer as createServerHttp } from \"node:http\";\nimport type { IncomingMessage, Server, ServerResponse } from \"node:http\";\nimport { createServer as createServerHttps } from \"node:https\";\nimport { Logger } from \"nightingale-logger\";\nimport type { Config } from \"./config\";\n\nconst logger = new Logger(\"alp:listen\");\n\ntype RequestListener = (req: IncomingMessage, res: ServerResponse) => void;\n\nconst createServer = (\n callback: RequestListener,\n socketPath?: string,\n tls?: boolean,\n dirname = \"\",\n // eslint-disable-next-line @typescript-eslint/max-params\n): Server => {\n const createHttpServer =\n !socketPath && tls ? createServerHttps : createServerHttp;\n\n if (!tls) {\n return (createHttpServer as typeof createServerHttps)(callback);\n }\n\n const options = {\n key: readFileSync(`${dirname}/server.key`),\n cert: readFileSync(`${dirname}/server.crt`),\n };\n\n return (createHttpServer as typeof createServerHttps)(options, callback);\n};\n\nexport default function alpListen(\n config: Config,\n callback: RequestListener,\n dirname?: string,\n): Promise<Server> {\n return new Promise((resolve) => {\n const socketPath = config.get<string>(\"socketPath\");\n const port = config.get<number>(\"port\");\n const hostname = config.get<string>(\"hostname\");\n const tls = config.get<boolean>(\"tls\");\n\n logger.info(\"Creating server\", socketPath ? { socketPath } : { port });\n const server = createServer(callback, socketPath, tls, dirname);\n\n if (socketPath) {\n try {\n unlinkSync(socketPath);\n } catch {}\n\n server.listen(socketPath, () => {\n if (socketPath) {\n chmodSync(socketPath, \"777\");\n }\n\n logger.info(\"Server listening\", { socketPath });\n resolve(server);\n });\n } else {\n server.listen(port, hostname, () => {\n logger.info(\"Server listening\", { port });\n resolve(server);\n });\n }\n });\n}\n","export type Errors = Record<string, any>;\n\nexport class ParamValidationResult {\n _errors?: Errors;\n\n _error(name: string, key: string, value: unknown): void {\n if (!this._errors) {\n this._errors = {};\n }\n\n this._errors[name] = { error: key, value };\n }\n\n getErrors(): Errors | undefined {\n return this._errors;\n }\n\n hasErrors(): boolean {\n return this._errors !== undefined;\n }\n\n isValid(): boolean {\n return this._errors === undefined;\n }\n\n // string(name: string): ParamValueStringValidator {\n // return new ParamValueStringValidator(this, name, this.context.param(name));\n // }\n /* int(name, position) {\n return new ParamValueIntValidator(this, name, this.context.param(name, position));\n }\n model(modelName, name) {\n name = name || S.string.lcFirst(modelName);\n console.log('paramvalidator model', modelName, M[modelName]);\n let data = this.context.getOrPostParam(name);\n return new ParamValueModelValidator(this, name, !data ? null : new M[modelName](data));\n } */\n}\n","import type { Context } from \"../AlpNodeApp\";\nimport { ParamValidationResult } from \"./ParamValidationResult\";\n\nexport default class ParamValid extends ParamValidationResult {\n context: Context;\n\n constructor(context: Context) {\n super();\n this.context = context;\n }\n\n override _error(): void {\n this.context.throw(400, \"Invalid params\", { validator: this });\n }\n}\n","import type { ParamValidationResult } from \"./ParamValidationResult\";\n\nexport default class ParamValueValidator<T> {\n readonly validationResult: ParamValidationResult;\n\n readonly name: string;\n\n readonly value: T;\n\n constructor(validationResult: ParamValidationResult, name: string, value: T) {\n this.validationResult = validationResult;\n this.name = name;\n this.value = value;\n }\n\n isValid(): boolean {\n return this.validationResult.isValid();\n }\n\n _error(key: string): void {\n this.validationResult._error(this.name, key, this.value);\n }\n}\n","import ParamValueValidator from \"./ParamValueValidator\";\n\nexport default class ParamValueStringValidator<\n T extends string = string,\n> extends ParamValueValidator<T | null | undefined> {\n notEmpty(): ParamValueValidator<T> {\n if (this.value == null || this.value.trim() === \"\") {\n this._error(\"notEmpty\");\n }\n\n return this as ParamValueValidator<T>;\n }\n}\n","import type { Context } from \"../AlpNodeApp\";\nimport type { ParamValidationResult } from \"./ParamValidationResult\";\nimport ParamValueStringValidator from \"./ParamValueStringValidator\";\n\nexport class ParamValueFromContext {\n readonly validationResult: ParamValidationResult;\n\n readonly context: Context;\n\n constructor(context: Context, validationResult: ParamValidationResult) {\n this.validationResult = validationResult;\n this.context = context;\n }\n\n namedParam(name: string): ParamValueStringValidator {\n return new ParamValueStringValidator(\n this.validationResult,\n name,\n this.context.namedRouteParam(name),\n );\n }\n\n otherParam(position: number): ParamValueStringValidator {\n return new ParamValueStringValidator(\n this.validationResult,\n String(position),\n this.context.otherRouteParam(position),\n );\n }\n\n queryParam(name: string): ParamValueStringValidator {\n return new ParamValueStringValidator(\n this.validationResult,\n name,\n this.context.queryParam(name),\n );\n }\n\n // bodyParam: <T>(name: string): ParamValueValidator<string | undefined> {\n\n // }\n}\n","import { defineLazyProperty } from \"object-properties\";\nimport type { AlpNodeApp, Context } from \"../AlpNodeApp\";\nimport ParamValid from \"./ParamValid\";\nimport { ParamValidationResult } from \"./ParamValidationResult\";\nimport { ParamValueFromContext } from \"./ParamValueFromContext\";\n\nexport interface AlpParamsContext {\n params: ParamValueFromContext;\n validParams: ParamValueFromContext;\n namedRouteParam: (name: string) => string | undefined;\n otherRouteParam: (position: number) => string | undefined;\n /** @deprecated use namedRouteParam */\n namedParam: never;\n /** @deprecated use otherRouteParam */\n otherParam: never;\n queryParam: (name: string) => string | undefined;\n bodyParam: <T>(name: string) => T | undefined;\n}\n\nexport interface AlpParamsRequest {\n searchParams: URLSearchParams;\n}\n\nexport default function alpParams(app: AlpNodeApp): void {\n Object.assign(app.context, {\n namedRouteParam(this: Context, name: string): string | undefined {\n const namedParams = this.route.namedParams;\n return namedParams?.get(name);\n },\n\n otherRouteParam(this: Context, position: number): string | undefined {\n const otherParams = this.route.otherParams;\n return otherParams?.[position - 1];\n },\n\n queryParam(this: Context, name: string): string | undefined {\n const searchParams = this.request.searchParams;\n return searchParams.get(name) ?? undefined;\n },\n\n bodyParam<T>(this: Context, name: string): T | undefined {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access\n return (this.body as any)[name];\n },\n });\n\n defineLazyProperty(\n app.request,\n \"searchParams\",\n function searchParams(this: Context[\"request\"]): URLSearchParams {\n return new URLSearchParams(this.search);\n },\n );\n\n defineLazyProperty(\n app.context,\n \"params\",\n function params(this: Context): ParamValueFromContext {\n return new ParamValueFromContext(this, new ParamValidationResult());\n },\n );\n\n defineLazyProperty(\n app.context,\n \"validParams\",\n function validParams(this: Context): ParamValueFromContext {\n return new ParamValueFromContext(this, new ParamValid(this));\n },\n );\n}\n","import IntlMessageFormatDefault from \"intl-messageformat\";\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\nconst IntlMessageFormat: typeof IntlMessageFormatDefault =\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (IntlMessageFormatDefault as any).default || IntlMessageFormatDefault;\n\nexport type Translations = Readonly<Record<string, IntlMessageFormatDefault>>;\n\nexport default function load(\n translations: Readonly<Record<string, unknown>>,\n language: string,\n): Translations {\n const result: Record<string, IntlMessageFormatDefault> = {};\n\n (function loadMap(record: Record<string, unknown>, prefix: string) {\n Object.entries(record).forEach(([key, value]) => {\n if (typeof value === \"object\" && value !== null) {\n loadMap(value as Record<string, unknown>, `${prefix}${key}.`);\n return;\n }\n\n result[`${prefix}${key}`] = new IntlMessageFormat(\n value as string,\n language,\n );\n });\n })(translations, \"\");\n\n return result;\n}\n","import { Logger } from \"nightingale-logger\";\nimport type { AlpNodeApp, Context } from \"../AlpNodeApp\";\nimport type { Translations } from \"./load\";\nimport load from \"./load\";\n\nconst logger = new Logger(\"alp:translate\");\n\ntype Args = Record<string, any>;\n\nexport interface TranslateBaseContext {\n t: (id: string, args: Args) => string;\n}\nexport interface TranslateContext {\n readonly language: string;\n}\n\nexport default function alpTranslate(\n dirname: string,\n): (app: AlpNodeApp) => void {\n dirname = dirname.replace(/\\/*$/, \"/\");\n return (app: AlpNodeApp) => {\n const appTranslations = new Map<string, Translations>();\n\n Object.assign(app.context, {\n t(this: Context, id: string, args: Args): string {\n const msg = appTranslations.get(this.language)?.[id];\n if (!msg) {\n logger.warn(\"invalid msg\", { language: this.language, id });\n return id;\n }\n\n return msg.format(args) as string;\n },\n });\n\n const config = app.config;\n\n config.get<string[]>(\"availableLanguages\").forEach((language) => {\n const translations = app.loadConfigSync(dirname + language);\n appTranslations.set(language, load(translations, language));\n });\n\n return appTranslations;\n };\n}\n","import type {\n IncomingMessage,\n RequestListener,\n Server,\n ServerResponse,\n} from \"node:http\";\nimport path from \"node:path\";\nimport Koa from \"koa\";\nimport type { DefaultState, ParameterizedContext } from \"koa\";\nimport compress from \"koa-compress\";\nimport serve from \"koa-static\";\nimport { Logger } from \"nightingale-logger\";\nimport type { Router } from \"router-segments\";\nimport type { Config } from \"./config\";\nimport errors from \"./errors\";\nimport type { AlpLanguageContext } from \"./language\";\nimport language from \"./language\";\nimport _listen from \"./listen\";\nimport type { AlpParamsContext, AlpParamsRequest } from \"./params/index\";\nimport params from \"./params/index\";\nimport type {\n AlpRouteRef,\n RouterContext as AlpRouterContext,\n UrlGenerator,\n} from \"./router\";\nimport type { TranslateBaseContext, TranslateContext } from \"./translate/index\";\nimport translate from \"./translate/index\";\nimport type {\n Context as AlpContext,\n ContextSanitizedState,\n ContextState,\n NodeApplication,\n NodeConfig,\n} from \"./types\";\n\nconst logger = new Logger(\"alp\");\n\nexport interface AlpNodeAppOptions {\n appDirname: string;\n packageDirname: string;\n config: Config & NodeConfig;\n certPath?: string;\n publicPath?: string;\n}\n\ndeclare module \"koa\" {\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n interface DefaultState extends ContextState {}\n\n interface DefaultContext\n extends AlpContext,\n AlpParamsContext,\n AlpRouterContext,\n AlpLanguageContext,\n TranslateContext {}\n\n interface BaseContext extends AlpContext, TranslateBaseContext {\n urlGenerator: UrlGenerator;\n redirectTo: <P extends Record<string, unknown>>(\n to: string,\n params?: P,\n ) => void;\n }\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n interface BaseRequest extends AlpParamsRequest {}\n}\n\nexport class AlpNodeApp extends Koa<ContextState> implements NodeApplication {\n dirname: string;\n\n certPath: string;\n\n publicPath: string;\n\n config: Config & NodeConfig;\n\n _server?: Server;\n\n router?: Router<any, AlpRouteRef>;\n\n /**\n * @param {Object} [options]\n * @param {string} [options.certPath] directory of the ssl certificates\n * @param {string} [options.publicPath] directory of public files\n */\n constructor({\n appDirname,\n packageDirname,\n config,\n certPath,\n publicPath,\n }: AlpNodeAppOptions) {\n super();\n\n this.dirname = path.normalize(appDirname);\n this.certPath = certPath || `${packageDirname}/config/cert`;\n this.publicPath = publicPath || `${packageDirname}/public/`;\n\n this.config = config;\n this.context.config = this.config;\n\n params(this);\n language(this);\n translate(\"locales\")(this);\n\n this.use(compress());\n }\n\n existsConfigSync(name: string): ReturnType<Config[\"existsConfigSync\"]> {\n return this.config.existsConfigSync(name);\n }\n\n loadConfigSync(name: string): ReturnType<Config[\"loadConfigSync\"]> {\n return this.config.loadConfigSync(name);\n }\n\n override createContext<StateT = DefaultState>(\n req: IncomingMessage,\n res: ServerResponse,\n ): ParameterizedContext<StateT> {\n const ctx = super.createContext<StateT>(req, res);\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n ctx.sanitizedState = {} as ContextSanitizedState;\n return ctx;\n }\n\n servePublic(): void {\n this.use(serve(this.publicPath)); // static files\n }\n\n catchErrors(): void {\n this.use(errors);\n }\n\n override listen(): never {\n throw new Error(\"Use start instead\");\n }\n\n /**\n * Close server and emit close event\n */\n close(): void {\n if (this._server) {\n this._server.close();\n this.emit(\"close\");\n }\n }\n\n async start(fn: () => Promise<void> | void): Promise<Server> {\n await fn();\n try {\n const server = await _listen(\n this.config,\n this.callback() as RequestListener,\n this.certPath,\n );\n this._server = server;\n logger.success(\"started\");\n if (process.send) process.send(\"ready\");\n return server;\n } catch (error: unknown) {\n logger.error(\"start fail\", { err: error });\n throw error;\n }\n }\n}\n\nexport type { Context } from \"koa\";\n\nexport { type NodeApplication } from \"./types\";\n"],"names":["logger","Logger","errorHtmlRenderer","ErrorHtmlRenderer","appPath","process","cwd","alpNodeErrors","ctx","next","error","Error","status","request","accepts","type","env","NODE_ENV","expose","body","message","STATUS_CODES","render","alpLanguage","app","config","context","availableLanguages","get","defineLazyProperty","language","acceptsLanguages","firstAcceptedLanguage","createServer","callback","socketPath","tls","dirname","createHttpServer","createServerHttps","createServerHttp","options","key","readFileSync","cert","alpListen","Promise","resolve","port","hostname","info","server","unlinkSync","listen","chmodSync","ParamValidationResult","_error","name","value","_errors","getErrors","hasErrors","undefined","isValid","ParamValid","constructor","throw","validator","ParamValueValidator","validationResult","ParamValueStringValidator","notEmpty","trim","ParamValueFromContext","namedParam","namedRouteParam","otherParam","position","String","otherRouteParam","queryParam","alpParams","Object","assign","namedParams","route","otherParams","searchParams","bodyParam","URLSearchParams","search","params","validParams","IntlMessageFormat","IntlMessageFormatDefault","default","load","translations","result","loadMap","record","prefix","entries","forEach","alpTranslate","replace","appTranslations","Map","t","id","args","msg","warn","format","loadConfigSync","set","AlpNodeApp","Koa","appDirname","packageDirname","certPath","publicPath","path","normalize","translate","use","compress","existsConfigSync","createContext","req","res","sanitizedState","servePublic","serve","catchErrors","errors","close","_server","emit","start","fn","_listen","success","send","err"],"mappings":"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"}