{"version":3,"file":"OpenApiTypeChecker.mjs","sources":["../../src/utils/OpenApiTypeChecker.ts"],"sourcesContent":["import { OpenApi } from \"../OpenApi\";\nimport { IOpenApiSchemaError } from \"../structures/IOpenApiSchemaError\";\nimport { IResult } from \"../structures/IResult\";\nimport { OpenApiTypeCheckerBase } from \"./internal/OpenApiTypeCheckerBase\";\n\n/**\n * Type checker of OpenAPI type schema.\n *\n * `OpenApiTypeChecker` is a type checker of {@link OpenApi.IJsonSchema}.\n *\n * @author Jeongho Nam - https://github.com/samchon\n */\nexport namespace OpenApiTypeChecker {\n  /* -----------------------------------------------------------\n    TYPE CHECKERS\n  ----------------------------------------------------------- */\n  /**\n   * Test whether the schema is a nul type.\n   *\n   * @param schema Target schema\n   * @returns Whether null type or not\n   */\n  export const isNull = (\n    schema: OpenApi.IJsonSchema,\n  ): schema is OpenApi.IJsonSchema.INull =>\n    OpenApiTypeCheckerBase.isNull(schema);\n\n  /**\n   * Test whether the schema is an unknown type.\n   *\n   * @param schema Target schema\n   * @returns Whether unknown type or not\n   */\n  export const isUnknown = (\n    schema: OpenApi.IJsonSchema,\n  ): schema is OpenApi.IJsonSchema.IUnknown =>\n    OpenApiTypeCheckerBase.isUnknown(schema);\n\n  /**\n   * Test whether the schema is a constant type.\n   *\n   * @param schema Target schema\n   * @returns Whether constant type or not\n   */\n  export const isConstant = (\n    schema: OpenApi.IJsonSchema,\n  ): schema is OpenApi.IJsonSchema.IConstant =>\n    OpenApiTypeCheckerBase.isConstant(schema);\n\n  /**\n   * Test whether the schema is a boolean type.\n   *\n   * @param schema Target schema\n   * @returns Whether boolean type or not\n   */\n  export const isBoolean = (\n    schema: OpenApi.IJsonSchema,\n  ): schema is OpenApi.IJsonSchema.IBoolean =>\n    OpenApiTypeCheckerBase.isBoolean(schema);\n\n  /**\n   * Test whether the schema is an integer type.\n   *\n   * @param schema Target schema\n   * @returns Whether integer type or not\n   */\n  export const isInteger = (\n    schema: OpenApi.IJsonSchema,\n  ): schema is OpenApi.IJsonSchema.IInteger =>\n    OpenApiTypeCheckerBase.isInteger(schema);\n\n  /**\n   * Test whether the schema is a number type.\n   *\n   * @param schema Target schema\n   * @returns Whether number type or not\n   */\n  export const isNumber = (\n    schema: OpenApi.IJsonSchema,\n  ): schema is OpenApi.IJsonSchema.INumber =>\n    OpenApiTypeCheckerBase.isNumber(schema);\n\n  /**\n   * Test whether the schema is a string type.\n   *\n   * @param schema Target schema\n   * @returns Whether string type or not\n   */\n  export const isString = (\n    schema: OpenApi.IJsonSchema,\n  ): schema is OpenApi.IJsonSchema.IString =>\n    OpenApiTypeCheckerBase.isString(schema);\n\n  /**\n   * Test whether the schema is an array type.\n   *\n   * @param schema Target schema\n   * @returns Whether array type or not\n   */\n  export const isArray = (\n    schema: OpenApi.IJsonSchema,\n  ): schema is OpenApi.IJsonSchema.IArray =>\n    OpenApiTypeCheckerBase.isArray(schema);\n\n  /**\n   * Test whether the schema is a tuple type.\n   *\n   * @param schema Target schema\n   * @returns Whether tuple type or not\n   */\n  export const isTuple = (\n    schema: OpenApi.IJsonSchema,\n  ): schema is OpenApi.IJsonSchema.ITuple =>\n    OpenApiTypeCheckerBase.isTuple(schema);\n\n  /**\n   * Test whether the schema is an object type.\n   *\n   * @param schema Target schema\n   * @returns Whether object type or not\n   */\n  export const isObject = (\n    schema: OpenApi.IJsonSchema,\n  ): schema is OpenApi.IJsonSchema.IObject =>\n    OpenApiTypeCheckerBase.isObject(schema);\n\n  /**\n   * Test whether the schema is a reference type.\n   *\n   * @param schema Target schema\n   * @returns Whether reference type or not\n   */\n  export const isReference = (\n    schema: OpenApi.IJsonSchema,\n  ): schema is OpenApi.IJsonSchema.IReference =>\n    OpenApiTypeCheckerBase.isReference(schema);\n\n  /**\n   * Test whether the schema is an union type.\n   *\n   * @param schema Target schema\n   * @returns Whether union type or not\n   */\n  export const isOneOf = (\n    schema: OpenApi.IJsonSchema,\n  ): schema is OpenApi.IJsonSchema.IOneOf =>\n    OpenApiTypeCheckerBase.isOneOf(schema);\n\n  /**\n   * Test whether the schema is recursive reference type.\n   *\n   * Test whether the target schema is a reference type, and test one thing more\n   * that the reference is self-recursive or not.\n   *\n   * @param props Properties for recursive reference test\n   * @returns Whether the schema is recursive reference type or not\n   */\n  export const isRecursiveReference = (props: {\n    components: OpenApi.IComponents;\n    schema: OpenApi.IJsonSchema;\n  }): boolean =>\n    OpenApiTypeCheckerBase.isRecursiveReference({\n      prefix: \"#/components/schemas/\",\n      components: props.components,\n      schema: props.schema,\n    });\n\n  /* -----------------------------------------------------------\n    OPERATORS\n  ----------------------------------------------------------- */\n  /**\n   * Escape from the {@link OpenApi.IJsonSchema.IReference} type.\n   *\n   * Escape from the {@link OpenApi.IJsonSchema.IReference} type, replacing the\n   * every references to the actual schemas. If the escape is successful, the\n   * returned schema never contains any {@link OpenApi.IJsonSchema.IReference}\n   * type in its structure.\n   *\n   * If the schema has a recursive reference, the recursive reference would be\n   * repeated as much as the `props.recursive` depth. If you've configured the\n   * `props.recursive` as `false` or `0`, it would be failed and return an\n   * {@link IOpenApiSchemaError}. Also, if there's a\n   * {@link OpenApi.IJsonSchema.IReference} type which cannot find the matched\n   * type in the {@link OpenApi.IComponents.schemas}, it would also be failed and\n   * return an {@link IOpenApiSchemaError} either.\n   *\n   * @param props Properties for escaping\n   * @returns Escaped schema, or error with reason\n   */\n  export const escape = (props: {\n    components: OpenApi.IComponents;\n    schema: OpenApi.IJsonSchema;\n    recursive: false | number;\n    accessor?: string;\n    refAccessor?: string;\n  }): IResult<OpenApi.IJsonSchema, IOpenApiSchemaError> =>\n    OpenApiTypeCheckerBase.escape({\n      ...props,\n      prefix: \"#/components/schemas/\",\n      method: \"OpenApiTypeChecker.method\",\n    });\n\n  /**\n   * Unreference the schema.\n   *\n   * Unreference the schema, replacing the {@link OpenApi.IJsonSchema.IReference}\n   * type to the actual schema. Different with {@link escape} is, the\n   * `unreference` function does not resolve every references in the schema, but\n   * resolve only one time.\n   *\n   * If there's a {@link OpenApi.IJsonSchema.IReference} type which cannot find\n   * the matched type in the {@link OpenApi.IComponents.schemas}, and you've\n   * called this `unreference()` function with the reference, it would also be\n   * failed and return an {@link IOpenApiSchemaError} value.\n   *\n   * @param props Properties of unreference\n   * @returns Unreferenced schema\n   */\n  export const unreference = (props: {\n    components: OpenApi.IComponents;\n    schema: OpenApi.IJsonSchema;\n    accessor?: string;\n    refAccessor?: string;\n  }): IResult<OpenApi.IJsonSchema, IOpenApiSchemaError> =>\n    OpenApiTypeCheckerBase.unreference({\n      ...props,\n      prefix: \"#/components/schemas/\",\n      method: \"OpenApiTypeChecker.unreference\",\n    });\n\n  /**\n   * Visit every nested schemas.\n   *\n   * Visit every nested schemas of the target, and apply the `props.closure`\n   * function.\n   *\n   * Here is the list of occurring nested visitings:\n   *\n   * - {@link OpenApi.IJsonSchema.IOneOf.oneOf}\n   * - {@link OpenApi.IJsonSchema.IReference}\n   * - {@link OpenApi.IJsonSchema.IObject.properties}\n   * - {@link OpenApi.IJsonSchema.IObject.additionalProperties}\n   * - {@link OpenApi.IJsonSchema.IArray.items}\n   * - {@link OpenApi.IJsonSchema.ITuple.prefixItems}\n   * - {@link OpenApi.IJsonSchema.ITuple.additionalItems}\n   *\n   * @param props Properties for visiting\n   */\n  export const visit = (props: {\n    closure: (schema: OpenApi.IJsonSchema, accessor: string) => void;\n    components: OpenApi.IComponents;\n    schema: OpenApi.IJsonSchema;\n    accessor?: string;\n    refAccessor?: string;\n  }): void =>\n    OpenApiTypeCheckerBase.visit({\n      ...props,\n      prefix: \"#/components/schemas/\",\n    });\n\n  /**\n   * Test whether the `x` schema covers the `y` schema.\n   *\n   * @param props Properties for testing\n   * @returns Whether the `x` schema covers the `y` schema\n   */\n  export const covers = (props: {\n    components: OpenApi.IComponents;\n    x: OpenApi.IJsonSchema;\n    y: OpenApi.IJsonSchema;\n  }): boolean =>\n    OpenApiTypeCheckerBase.covers({\n      prefix: \"#/components/schemas/\",\n      components: props.components,\n      x: props.x,\n      y: props.y,\n    });\n}\n"],"names":["OpenApiTypeChecker","isNull","schema","OpenApiTypeCheckerBase","isUnknown","isConstant","isBoolean","isInteger","isNumber","isString","isArray","isTuple","isObject","isReference","isOneOf","isRecursiveReference","props","prefix","components","escape","method","unreference","visit","covers","x","y"],"mappings":";;AAYM,IAAWA;;CAAjB,SAAiBA;IAUFA,mBAAAC,SACXC,UAEAC,uBAAuBF,OAAOC;IAQnBF,mBAAAI,YACXF,UAEAC,uBAAuBC,UAAUF;IAQtBF,mBAAAK,aACXH,UAEAC,uBAAuBE,WAAWH;IAQvBF,mBAAAM,YACXJ,UAEAC,uBAAuBG,UAAUJ;IAQtBF,mBAAAO,YACXL,UAEAC,uBAAuBI,UAAUL;IAQtBF,mBAAAQ,WACXN,UAEAC,uBAAuBK,SAASN;IAQrBF,mBAAAS,WACXP,UAEAC,uBAAuBM,SAASP;IAQrBF,mBAAAU,UACXR,UAEAC,uBAAuBO,QAAQR;IAQpBF,mBAAAW,UACXT,UAEAC,uBAAuBQ,QAAQT;IAQpBF,mBAAAY,WACXV,UAEAC,uBAAuBS,SAASV;IAQrBF,mBAAAa,cACXX,UAEAC,uBAAuBU,YAAYX;IAQxBF,mBAAAc,UACXZ,UAEAC,uBAAuBW,QAAQZ;IAWpBF,mBAAAe,uBAAwBC,SAInCb,uBAAuBY,qBAAqB;QAC1CE,QAAQ;QACRC,YAAYF,MAAME;QAClBhB,QAAQc,MAAMd;;IAyBLF,mBAAAmB,SAAUH,SAOrBb,uBAAuBgB,OAAO;WACzBH;QACHC,QAAQ;QACRG,QAAQ;;IAmBCpB,mBAAAqB,cAAeL,SAM1Bb,uBAAuBkB,YAAY;WAC9BL;QACHC,QAAQ;QACRG,QAAQ;;IAqBCpB,mBAAAsB,QAASN,SAOpBb,uBAAuBmB,MAAM;WACxBN;QACHC,QAAQ;;IASCjB,mBAAAuB,SAAUP,SAKrBb,uBAAuBoB,OAAO;QAC5BN,QAAQ;QACRC,YAAYF,MAAME;QAClBM,GAAGR,MAAMQ;QACTC,GAAGT,MAAMS;;AAEd,EAzQD,CAAiBzB,uBAAAA,qBAAkB,CAAA;;"}