import * as gracely from "gracely" import * as authly from "authly" import * as model from "@payfunc/model-card" import * as base from "@payfunc/model-base" import { Creatable as VerificationCreatable } from "../../Verification/Creatable" import { Base } from "./Base" import { Safe as CSafe } from "./Safe" export interface Creatable extends Base { card: authly.Token | model.Card.Creatable } export namespace Creatable { export function is(value: Creatable | any): value is Creatable { return ( typeof value == "object" && value != null && (authly.Token.is(value.card) || model.Card.Creatable.is(value.card)) && Base.is(value) ) } export type Safe = CSafe export namespace Safe { export const is = CSafe.is export const flaw = CSafe.flaw } export function flaw(value: Base | any): gracely.Flaw { return { type: "Authorization.Creatable", flaws: typeof value != "object" ? undefined : ([ ...(Base.flaw(value)?.flaws ?? []), authly.Token.is(value.card) || model.Card.Creatable.is(value.card) || { property: "card", type: "model.Card.Creatable | authly.Token", }, ].filter(gracely.Flaw.is) as gracely.Flaw[]), } } export function getAmount(value: Creatable | Creatable.Safe): number { return (value.items ? base.Item.amount(value.items) : value.amount) ?? 0 } export function toVerificationCreatable( value: Creatable.Safe, card: model.Card.Creatable.Safe, verification?: { type: "pares" | "method" | "challenge" | "guard"; data?: string | Record } ): VerificationCreatable.Safe export function toVerificationCreatable( value: Creatable, card: model.Card.Creatable, verification?: { type: "pares" | "method" | "challenge" | "guard"; data?: string | Record } ): VerificationCreatable export function toVerificationCreatable( value: Creatable | Creatable.Safe, card: model.Card.Creatable | model.Card.Creatable.Safe, verification?: { type: "pares" | "method" | "challenge" | "guard"; data?: string | Record } ): VerificationCreatable | VerificationCreatable.Safe { let result: VerificationCreatable | VerificationCreatable.Safe if (model.Card.Creatable.Safe.is(card)) result = { number: value.number, card: { ...card, verification: verification ?? card.verification }, currency: value.currency, items: value.items ?? value.amount ?? 0, browser: value.browser, category: value.category, contact: value.contact, recurring: value.recurring, target: value.target, } else result = { number: value.number, card: { ...card, verification: verification ?? card.verification }, currency: value.currency, items: value.items ?? value.amount ?? 0, browser: value.browser, category: value.category, contact: value.contact, recurring: value.recurring, target: value.target, } return result } }