{"version":3,"file":"AlpNodeApp-node.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    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 { DefaultContext, 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\n  extends Koa<DefaultState, DefaultContext>\n  implements NodeApplication\n{\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","createServerHttps","createServerHttp","params","language","translate","errors","_listen"],"mappings":"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"}