{"version":3,"file":"HttpMigrateRouteComposer.mjs","sources":["../../../src/composers/migrate/HttpMigrateRouteComposer.ts"],"sourcesContent":["import { OpenApi } from \"../../OpenApi\";\nimport { IHttpMigrateRoute } from \"../../structures/IHttpMigrateRoute\";\nimport { EndpointUtil } from \"../../utils/EndpointUtil\";\nimport { Escaper } from \"../../utils/Escaper\";\nimport { OpenApiTypeChecker } from \"../../utils/OpenApiTypeChecker\";\n\nexport namespace HttpMigrateRouteComposer {\n  export interface IProps {\n    document: OpenApi.IDocument;\n    method: \"head\" | \"get\" | \"post\" | \"put\" | \"patch\" | \"delete\";\n    path: string;\n    emendedPath: string;\n    operation: OpenApi.IOperation;\n  }\n  export const compose = (props: IProps): IHttpMigrateRoute | string[] => {\n    //----\n    // REQUEST AND RESPONSE BODY\n    //----\n    const body: false | null | IHttpMigrateRoute.IBody = emplaceBodySchema(\n      \"request\",\n    )((schema) =>\n      emplaceReference({\n        document: props.document,\n        name:\n          EndpointUtil.pascal(`I/Api/${props.path}`) +\n          \".\" +\n          EndpointUtil.pascal(`${props.method}/Body`),\n        schema,\n      }),\n    )(props.operation.requestBody);\n    const success: false | null | IHttpMigrateRoute.ISuccess = (() => {\n      const body = emplaceBodySchema(\"response\")((schema) =>\n        emplaceReference({\n          document: props.document,\n          name:\n            EndpointUtil.pascal(`I/Api/${props.path}`) +\n            \".\" +\n            EndpointUtil.pascal(`${props.method}/Response`),\n          schema,\n        }),\n      )(\n        props.operation.responses?.[\"201\"] ??\n          props.operation.responses?.[\"200\"] ??\n          props.operation.responses?.default,\n      );\n      return body\n        ? {\n            ...body,\n            status: props.operation.responses?.[\"201\"]\n              ? \"201\"\n              : props.operation.responses?.[\"200\"]\n                ? \"200\"\n                : \"default\",\n          }\n        : body;\n    })();\n\n    const failures: string[] = [];\n    if (body === false)\n      failures.push(\n        `supports only \"application/json\", \"application/x-www-form-urlencoded\", \"multipart/form-data\" and \"text/plain\" content type in the request body.`,\n      );\n    if (success === false)\n      failures.push(\n        `supports only \"application/json\", \"application/x-www-form-urlencoded\" and \"text/plain\" content type in the response body.`,\n      );\n\n    //----\n    // HEADERS AND QUERY\n    //---\n    const [headers, query] = [\"header\", \"query\"].map((type) => {\n      // FIND TARGET PARAMETERS\n      const parameters: OpenApi.IOperation.IParameter[] = (\n        props.operation.parameters ?? []\n      ).filter((p) => p.in === type);\n      if (parameters.length === 0) return null;\n\n      // CHECK PARAMETER TYPES -> TO BE OBJECT\n      const objects = parameters\n        .map((p) =>\n          OpenApiTypeChecker.isObject(p.schema)\n            ? p.schema\n            : OpenApiTypeChecker.isReference(p.schema) &&\n                OpenApiTypeChecker.isObject(\n                  props.document.components.schemas?.[\n                    p.schema.$ref.replace(`#/components/schemas/`, ``)\n                  ] ?? {},\n                )\n              ? p.schema\n              : null!,\n        )\n        .filter((s) => !!s);\n      const primitives = parameters.filter(\n        (p) =>\n          OpenApiTypeChecker.isBoolean(p.schema) ||\n          OpenApiTypeChecker.isInteger(p.schema) ||\n          OpenApiTypeChecker.isNumber(p.schema) ||\n          OpenApiTypeChecker.isString(p.schema) ||\n          OpenApiTypeChecker.isArray(p.schema) ||\n          OpenApiTypeChecker.isTuple(p.schema),\n      );\n      const out = (elem: {\n        schema: OpenApi.IJsonSchema;\n        title?: string;\n        description?: string;\n        example?: any;\n        examples?: Record<string, any>;\n      }) =>\n        ({\n          ...elem,\n          name: type,\n          key: type,\n          title: () => elem.title,\n          description: () => elem.description,\n          example: () => elem.example,\n          examples: () => elem.examples,\n        }) satisfies IHttpMigrateRoute.IHeaders;\n\n      if (objects.length === 1 && primitives.length === 0)\n        return out(parameters[0]);\n      else if (objects.length > 1) {\n        failures.push(`${type} typed parameters must be only one object type`);\n        return false;\n      }\n\n      // GATHER TO OBJECT TYPE\n      const dto: OpenApi.IJsonSchema.IObject | null = objects[0]\n        ? OpenApiTypeChecker.isObject(objects[0])\n          ? objects[0]\n          : ((props.document.components.schemas ?? {})[\n              (objects[0] as OpenApi.IJsonSchema.IReference).$ref.replace(\n                `#/components/schemas/`,\n                ``,\n              )\n            ] as OpenApi.IJsonSchema.IObject)\n        : null;\n      const entire: OpenApi.IJsonSchema.IObject[] = [\n        ...objects.map((o) =>\n          OpenApiTypeChecker.isObject(o)\n            ? o\n            : (props.document.components.schemas?.[\n                o.$ref.replace(`#/components/schemas/`, ``)\n              ]! as OpenApi.IJsonSchema.IObject),\n        ),\n        {\n          type: \"object\",\n          properties: Object.fromEntries([\n            ...primitives.map((p) => [\n              p.name,\n              {\n                ...p.schema,\n                description: p.schema.description ?? p.description,\n              },\n            ]),\n            ...(dto ? Object.entries(dto.properties ?? {}) : []),\n          ]),\n          required: [\n            ...new Set([\n              ...primitives.filter((p) => p.required).map((p) => p.name!),\n              ...(dto?.required ?? []),\n            ]),\n          ],\n        },\n      ];\n      return parameters.length === 0\n        ? null\n        : out({\n            schema: emplaceReference({\n              document: props.document,\n              name:\n                EndpointUtil.pascal(`I/Api/${props.path}`) +\n                \".\" +\n                EndpointUtil.pascal(`${props.method}/${type}`),\n              schema: {\n                type: \"object\",\n                properties: Object.fromEntries([\n                  ...new Map<string, OpenApi.IJsonSchema>(\n                    entire\n                      .map((o) =>\n                        Object.entries(o.properties ?? {}).map(\n                          ([name, schema]) =>\n                            [\n                              name,\n                              {\n                                ...schema,\n                                description:\n                                  schema.description ?? schema.description,\n                              } as OpenApi.IJsonSchema,\n                            ] as const,\n                        ),\n                      )\n                      .flat(),\n                  ),\n                ]),\n                required: [\n                  ...new Set(entire.map((o) => o.required ?? []).flat()),\n                ],\n              } satisfies OpenApi.IJsonSchema.IObject,\n            }),\n          });\n    });\n\n    //----\n    // PATH PARAMETERS\n    //----\n    const parameterNames: string[] = EndpointUtil.splitWithNormalization(\n      props.emendedPath,\n    )\n      .filter((str) => str[0] === \":\")\n      .map((str) => str.substring(1));\n    const pathParameters: OpenApi.IOperation.IParameter[] = (\n      props.operation.parameters ?? []\n    ).filter((p) => p.in === \"path\");\n    if (parameterNames.length !== pathParameters.length)\n      if (\n        pathParameters.length < parameterNames.length &&\n        pathParameters.every(\n          (p) => p.name !== undefined && parameterNames.includes(p.name),\n        )\n      ) {\n        for (const name of parameterNames)\n          if (pathParameters.find((p) => p.name === name) === undefined)\n            pathParameters.push({\n              name,\n              in: \"path\",\n              schema: { type: \"string\" },\n            });\n        pathParameters.sort(\n          (a, b) =>\n            parameterNames.indexOf(a.name!) - parameterNames.indexOf(b.name!),\n        );\n        props.operation.parameters = [\n          ...pathParameters,\n          ...(props.operation.parameters ?? []).filter((p) => p.in !== \"path\"),\n        ];\n      } else\n        failures.push(\n          \"number of path parameters are not matched with its full path.\",\n        );\n    if (failures.length) return failures;\n\n    const parameters: IHttpMigrateRoute.IParameter[] = (\n      props.operation.parameters ?? []\n    )\n      .filter((p) => p.in === \"path\")\n      .map((p, i) => ({\n        // FILL KEY NAME IF NOT EXISTsS\n        name: parameterNames[i],\n        key: (() => {\n          let key: string = EndpointUtil.normalize(parameterNames[i]);\n          if (Escaper.variable(key)) return key;\n          while (true) {\n            key = \"_\" + key;\n            if (!parameterNames.some((s) => s === key)) return key;\n          }\n        })(),\n        schema: p.schema,\n        parameter: () => p,\n      }));\n    return {\n      method: props.method,\n      path: props.path,\n      emendedPath: props.emendedPath,\n      accessor: [\"@lazy\"],\n      parameters: (props.operation.parameters ?? [])\n        .filter((p) => p.in === \"path\")\n        .map((p, i) => ({\n          // FILL KEY NAME IF NOT EXISTsS\n          name: parameterNames[i],\n          key: (() => {\n            let key: string = EndpointUtil.normalize(parameterNames[i]);\n            if (Escaper.variable(key)) return key;\n            while (true) {\n              key = \"_\" + key;\n              if (!parameterNames.some((s) => s === key)) return key;\n            }\n          })(),\n          schema: p.schema,\n          parameter: () => p,\n        })),\n      headers: headers || null,\n      query: query || null,\n      body: body || null,\n      success: success || null,\n      exceptions: Object.fromEntries(\n        Object.entries(props.operation.responses ?? {})\n          .filter(\n            ([key]) => key !== \"200\" && key !== \"201\" && key !== \"default\",\n          )\n          .map(([status, response]) => [\n            status,\n            {\n              schema: (response.content?.[\"application/json\"]?.schema ??\n                {}) satisfies OpenApi.IJsonSchema,\n              response: () => response,\n              media: () =>\n                (response.content?.[\"application/json\"] ??\n                  {}) satisfies OpenApi.IJsonSchema,\n            } satisfies IHttpMigrateRoute.IException,\n          ]),\n      ),\n      comment: () =>\n        writeRouteComment({\n          operation: props.operation,\n          parameters,\n          query: query || null,\n          body: body || null,\n        }),\n      operation: () => props.operation,\n    } satisfies IHttpMigrateRoute as IHttpMigrateRoute;\n  };\n\n  const writeRouteComment = (props: {\n    operation: OpenApi.IOperation;\n    parameters: IHttpMigrateRoute.IParameter[];\n    query: IHttpMigrateRoute.IQuery | null;\n    body: IHttpMigrateRoute.IBody | null;\n  }): string => {\n    const commentTags: string[] = [];\n    const add = (text: string) => {\n      if (commentTags.every((line) => line !== text)) commentTags.push(text);\n    };\n\n    let description: string = props.operation.description ?? \"\";\n    if (props.operation.summary) {\n      const emended: string = props.operation.summary.endsWith(\".\")\n        ? props.operation.summary\n        : props.operation.summary + \".\";\n      if (\n        !!description.length &&\n        !description.startsWith(props.operation.summary)\n      )\n        description = `${emended}\\n${description}`;\n    }\n    description = description\n      .split(\"\\n\")\n      .map((s) => s.trim())\n      .join(\"\\n\");\n\n    for (const p of props.parameters ?? []) {\n      const param = p.parameter();\n      if (param.description || param.title) {\n        const text: string = (param.description ?? param.title)!;\n        add(`@param ${p.name} ${writeIndented(text, p.name.length + 8)}`);\n      }\n    }\n    if (props.body?.description()?.length)\n      add(`@param body ${writeIndented(props.body.description()!, 12)}`);\n    for (const security of props.operation.security ?? [])\n      for (const [name, scopes] of Object.entries(security))\n        add(`@security ${[name, ...scopes].join(\"\")}`);\n    if (props.operation.tags)\n      props.operation.tags.forEach((name) => add(`@tag ${name}`));\n    if (props.operation.deprecated) add(\"@deprecated\");\n    description = description.length\n      ? commentTags.length\n        ? `${description}\\n\\n${commentTags.join(\"\\n\")}`\n        : description\n      : commentTags.join(\"\\n\");\n    description = description.split(\"*/\").join(\"*\\\\/\");\n    return description;\n  };\n\n  const writeIndented = (text: string, spaces: number): string =>\n    text\n      .split(\"\\n\")\n      .map((s) => s.trim())\n      .map((s, i) => (i === 0 ? s : `${\" \".repeat(spaces)}${s}`))\n      .join(\"\\n\");\n\n  const emplaceBodySchema =\n    (from: \"request\" | \"response\") =>\n    (\n      emplacer: (schema: OpenApi.IJsonSchema) => OpenApi.IJsonSchema.IReference,\n    ) =>\n    (meta?: {\n      description?: string;\n      content?: Partial<Record<string, OpenApi.IOperation.IMediaType>>; // ISwaggerRouteBodyContent;\n      \"x-nestia-encrypted\"?: boolean;\n    }): false | null | IHttpMigrateRoute.IBody => {\n      if (!meta?.content) return null;\n\n      const entries: [string, OpenApi.IOperation.IMediaType][] = Object.entries(\n        meta.content,\n      ).filter(([_, v]) => !!v) as [string, OpenApi.IOperation.IMediaType][];\n      const json = entries.find((e) =>\n        meta[\"x-nestia-encrypted\"] === true\n          ? e[0].includes(\"text/plain\") || e[0].includes(\"application/json\")\n          : e[0].includes(\"application/json\") || e[0].includes(\"*/*\"),\n      );\n      if (json) {\n        const { schema } = json[1];\n        return schema || from === \"response\"\n          ? {\n              type: \"application/json\",\n              name: \"body\",\n              key: \"body\",\n              schema: schema\n                ? isNotObjectLiteral(schema)\n                  ? schema\n                  : emplacer(schema)\n                : {},\n              description: () => meta.description,\n              media: () => json[1],\n              \"x-nestia-encrypted\": meta[\"x-nestia-encrypted\"],\n            }\n          : null;\n      }\n\n      const query = entries.find((e) =>\n        e[0].includes(\"application/x-www-form-urlencoded\"),\n      );\n      if (query) {\n        const { schema } = query[1];\n        return schema || from === \"response\"\n          ? {\n              type: \"application/x-www-form-urlencoded\",\n              name: \"body\",\n              key: \"body\",\n              schema: schema\n                ? isNotObjectLiteral(schema)\n                  ? schema\n                  : emplacer(schema)\n                : {},\n              description: () => meta.description,\n              media: () => query[1],\n            }\n          : null;\n      }\n\n      const text = entries.find((e) => e[0].includes(\"text/plain\"));\n      if (text)\n        return {\n          type: \"text/plain\",\n          name: \"body\",\n          key: \"body\",\n          schema: { type: \"string\" },\n          description: () => meta.description,\n          media: () => text[1],\n        };\n\n      if (from === \"request\") {\n        const multipart = entries.find((e) =>\n          e[0].includes(\"multipart/form-data\"),\n        );\n        if (multipart) {\n          const { schema } = multipart[1];\n          return {\n            type: \"multipart/form-data\",\n            name: \"body\",\n            key: \"body\",\n            schema: schema\n              ? isNotObjectLiteral(schema)\n                ? schema\n                : emplacer(schema)\n              : {},\n            description: () => meta.description,\n            media: () => multipart[1],\n          };\n        }\n      }\n      return false;\n    };\n\n  const emplaceReference = (props: {\n    document: OpenApi.IDocument;\n    name: string;\n    schema: OpenApi.IJsonSchema;\n  }): OpenApi.IJsonSchema.IReference => {\n    props.document.components.schemas ??= {};\n    props.document.components.schemas[props.name] = props.schema;\n    return {\n      $ref: `#/components/schemas/${props.name}`,\n    } satisfies OpenApi.IJsonSchema.IReference;\n  };\n\n  const isNotObjectLiteral = (schema: OpenApi.IJsonSchema): boolean =>\n    OpenApiTypeChecker.isReference(schema) ||\n    OpenApiTypeChecker.isBoolean(schema) ||\n    OpenApiTypeChecker.isNumber(schema) ||\n    OpenApiTypeChecker.isString(schema) ||\n    OpenApiTypeChecker.isUnknown(schema) ||\n    (OpenApiTypeChecker.isOneOf(schema) &&\n      schema.oneOf.every(isNotObjectLiteral)) ||\n    (OpenApiTypeChecker.isArray(schema) && isNotObjectLiteral(schema.items));\n}\n"],"names":["HttpMigrateRouteComposer","compose","props","body","emplaceBodySchema","schema","emplaceReference","document","name","EndpointUtil","pascal","path","method","operation","requestBody","success","responses","default","status","failures","push","headers","query","map","type","parameters","filter","p","in","length","objects","OpenApiTypeChecker","isObject","isReference","components","schemas","$ref","replace","s","primitives","isBoolean","isInteger","isNumber","isString","isArray","isTuple","out","elem","key","title","description","example","examples","dto","entire","o","properties","Object","fromEntries","entries","required","Set","Map","flat","parameterNames","splitWithNormalization","emendedPath","str","substring","pathParameters","every","undefined","includes","find","sort","a","b","indexOf","i","normalize","Escaper","variable","some","parameter","accessor","exceptions","response","content","media","comment","writeRouteComment","commentTags","add","text","line","summary","emended","endsWith","startsWith","split","trim","join","param","writeIndented","security","scopes","tags","forEach","deprecated","spaces","repeat","from","emplacer","meta","_","v","json","e","isNotObjectLiteral","multipart","_a","isUnknown","isOneOf","oneOf","items"],"mappings":"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"}