{"version":3,"file":"XVType.cjs","sources":["../src/XVType.ts"],"sourcesContent":["import {\n  XVCheckCallback,\n  XVDefault,\n  XVDefaultValue,\n  XVMeta,\n  XVNullable,\n  XVOptional,\n  XVTransformCallback,\n} from \"./types\";\n\nabstract class XVType<T> {\n  readonly _type!: T;\n  protected checks: XVCheckCallback<T>[] = [];\n  protected transforms: XVTransformCallback<T>[] = [];\n  readonly meta: XVMeta<T> = {};\n  protected abstract check(value: unknown): T;\n\n  protected set(\n    method: string,\n    check: XVCheckCallback<T>,\n    args: any = true,\n  ): this {\n    if (!(method in this)) {\n      throw new Error(\n        `Method ${method} does not exist on ${this.constructor.name}`,\n      );\n    }\n    this.checks.push(check);\n    this.meta[method] = args;\n    return this;\n  }\n\n  clone(): this {\n    return Object.assign(Object.create(Object.getPrototypeOf(this)), this);\n  }\n\n  optional(): XVOptional<this> {\n    return this.set(\"optional\", () => {}) as any;\n  }\n\n  nullable(): XVNullable<this> {\n    return this.set(\"nullable\", () => {}) as any;\n  }\n\n  default(value: XVDefaultValue<T>): XVDefault<this, T> {\n    return this.set(\"default\", () => {}, value) as any;\n  }\n\n  transform(cb: XVTransformCallback<T>) {\n    this.transforms.push(cb);\n    return this;\n  }\n\n  parse(value: unknown): T | undefined | null {\n    // default\n    if (\n      this.meta.default !== undefined &&\n      (value === undefined || value === null)\n    ) {\n      value =\n        typeof this.meta.default === \"function\"\n          ? (this.meta.default as () => T)()\n          : this.meta.default;\n    }\n\n    // optional / nullable\n    if (this.meta.optional && value === undefined) return undefined;\n    if (this.meta.nullable && value === null) return null;\n\n    // run internal check\n    let result = this.check(value);\n\n    // run user checks\n    for (const check of this.checks) {\n      check(result);\n    }\n\n    // run transforms\n    for (const transform of this.transforms) {\n      result = transform(result);\n    }\n\n    return result;\n  }\n\n  getDefault(): T | undefined {\n    if (this.meta.default === undefined) return undefined;\n    return typeof this.meta.default === \"function\"\n      ? (this.meta.default as () => T)()\n      : this.meta.default;\n  }\n}\n\nexport default XVType;\n"],"names":[],"mappings":";;AAUA,MAAe,MAAM,CAAA;AAArB,IAAA,WAAA,GAAA;QAEY,IAAA,CAAA,MAAM,GAAyB,EAAE;QACjC,IAAA,CAAA,UAAU,GAA6B,EAAE;QAC1C,IAAA,CAAA,IAAI,GAAc,EAAE;IA6E/B;AA1EY,IAAA,GAAG,CACX,MAAc,EACd,KAAyB,EACzB,OAAY,IAAI,EAAA;AAEhB,QAAA,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC,EAAE;AACrB,YAAA,MAAM,IAAI,KAAK,CACb,CAAA,OAAA,EAAU,MAAM,CAAA,mBAAA,EAAsB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAA,CAAE,CAC9D;QACH;AACA,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI;AACxB,QAAA,OAAO,IAAI;IACb;IAEA,KAAK,GAAA;AACH,QAAA,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC;IACxE;IAEA,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,MAAK,EAAE,CAAC,CAAQ;IAC9C;IAEA,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,MAAK,EAAE,CAAC,CAAQ;IAC9C;AAEA,IAAA,OAAO,CAAC,KAAwB,EAAA;AAC9B,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAK,EAAE,CAAC,EAAE,KAAK,CAAQ;IACpD;AAEA,IAAA,SAAS,CAAC,EAA0B,EAAA;AAClC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;AACxB,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,KAAK,CAAC,KAAc,EAAA;;AAElB,QAAA,IACE,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS;aAC9B,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC,EACvC;YACA,KAAK;AACH,gBAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK;AAC3B,sBAAG,IAAI,CAAC,IAAI,CAAC,OAAmB;AAChC,sBAAE,IAAI,CAAC,IAAI,CAAC,OAAO;QACzB;;QAGA,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,KAAK,KAAK,SAAS;AAAE,YAAA,OAAO,SAAS;QAC/D,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,KAAK,KAAK,IAAI;AAAE,YAAA,OAAO,IAAI;;QAGrD,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;;AAG9B,QAAA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE;YAC/B,KAAK,CAAC,MAAM,CAAC;QACf;;AAGA,QAAA,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE;AACvC,YAAA,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAC5B;AAEA,QAAA,OAAO,MAAM;IACf;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS;AAAE,YAAA,OAAO,SAAS;AACrD,QAAA,OAAO,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK;AAClC,cAAG,IAAI,CAAC,IAAI,CAAC,OAAmB;AAChC,cAAE,IAAI,CAAC,IAAI,CAAC,OAAO;IACvB;AACD;;;;"}