jotform / jotform-api-nodejs

JotForm API - NodeJS Client
GNU General Public License v2.0
34 stars 26 forks source link

TypeScript typings #34

Open wojtekmaj opened 1 year ago

wojtekmaj commented 1 year ago

Since I had to write these anyway, I'm sharing TypeScript typings for this package in case somebody needs them. It would be also a neat base for potential TypeScript migration in the future.

They are far from being ideal; I was not able to find a definite documentation for each and every call, so this is my "best guess" so that I have ANYTHING to work with.

/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unused-vars */

declare module 'jotform' {
  type ControlOptions = string; // optionone|optiontwo|optionthree…
  type ControlValues = string; // valueone|valuetwo|valuethree…
  type EnableDisableFlag = 'enable' | 'disable';
  type EnableDisableUppercaseFlag = 'Enable' | 'Disable';
  type HintOptions = string; // optionone,optiontwo,optionthree…
  type HorizontalAlign = 'Auto' | 'Center' | 'Left' | 'Right' | string; // TODO: Add all possible values
  type ISODate = string;
  type NumberLikeString = `${number}`;
  type Special =
    | 'Canadian Provinces'
    | 'Countries'
    | 'Days'
    | 'Gender'
    | 'Last 100 Years'
    | 'Months'
    | 'None'
    | 'Time Zones'
    | 'US States Abbr'
    | 'US States';
  type StringifiedJson<T> = string;
  type Url = string;
  type Validation =
    | 'Alphabetic'
    | 'AlphaNumeric'
    | 'Currency'
    | 'Cyrillic'
    | 'Email'
    | 'Numeric'
    | 'Url'
    | 'None';
  type VerticalAlign = 'Top' | 'Middle' | 'Bottom' | string; // TODO: Add all possible values
  type Weekday = 'Sunday' | 'Monday' | 'Tuesday' | 'Wednesday' | 'Thursday' | 'Friday' | 'Saturday';
  type WidgetType = 'native' | string; // TODO: Add all possible values
  type YesNoFlag = 'Yes' | 'No';
  type ZeroOneFlag = '0' | '1';

  export type Options = {
    apiKey?: string;
    debug?: boolean;
    url?: string;
    version?: string;
    timeout?: number;
  };

  type Filter = Record<string, any>;

  type Query = {
    direction?: 'ASC' | 'DESC';
    filter?: Filter;
    limit?: number;
    offset?: number;
    orderby?: any;
  };

  export type User = {
    username: string;
    name: string;
    email: string;
    website: Url | null;
    time_zone: string;
    account_type: Url;
    status: 'ACTIVE' | string; // TODO: Add all possible values
    created_at: ISODate;
    updated_at: ISODate | null;
    region: 'EMEA' | string; // TODO: Add all possible values
    is_verified: ZeroOneFlag;
    usage: Url;
    euOnly: ZeroOneFlag;
    new_users_campaign: string;
    loginToGetSubmissions: ZeroOneFlag;
    loginToViewUploadedFiles: ZeroOneFlag;
    loginToViewSubmissionRSS: ZeroOneFlag;
    showJotFormPowered: ZeroOneFlag;
    defaultTheme: string;
    submission_inbox_group: string;
    avatarUrl: Url;
    formListingsTestUser: ZeroOneFlag;
    company_logo: Url;
    company: string;
    tablesIntroVideoShown: YesNoFlag;
    disableViewLimits: boolean;
    allowBoards: boolean;
    allowDigest: boolean;
    allowPrefills: boolean;
    allowWorkflowFeatures: boolean;
    allowAutoDeleteSubmissions: boolean;
    teamsBetaUser: ZeroOneFlag;
    paymentNewProductManagement: boolean;
    allowEncryptionV2: boolean;
  };

  export type Usage = {
    submissions: string;
    ssl_submissions: string;
    payments: string;
    uploads: string;
    total_submissions: string;
    signed_documents: string;
    pdf_attachment_submissions: string;
    mobile_submissions: string;
    views: string;
    api: number;
    form_count: string;
  };

  export type Form<K extends string = string> = {
    id: K;
    username: string;
    title: string;
    height: NumberLikeString;
    status: 'ENABLED' | 'DELETED' | string; // TODO: Add all possible values
    created_at: ISODate;
    updated_at: ISODate | null;
    last_submission: string | null;
    new: ZeroOneFlag;
    count: NumberLikeString;
    type: 'LEGACY' | 'CARD';
    favorite: ZeroOneFlag;
    archived: ZeroOneFlag;
    url: Url;
  };

  export type FormQuestionBase<K extends string = string> = {
    hidden?: YesNoFlag;
    name: string;
    order: NumberLikeString;
    protected?: YesNoFlag;
    qid: K;
    text: string;
    type: string;
  };

  export type FormQuestionControlBase<K extends string = string> = FormQuestionBase<K> & {
    labelAlign: HorizontalAlign;
    readonly?: YesNoFlag;
    required?: YesNoFlag;
    subLabel?: string;
    useCalculations?: YesNoFlag;
  };

  export type FormQuestionComplexBase<K extends string = string> = FormQuestionBase<K> & {
    labelAlign: HorizontalAlign;
    readonly?: YesNoFlag;
    required?: YesNoFlag;
  };

  export type FormQuestionAddress<K extends string = string> = FormQuestionComplexBase<K> & {
    compoundHint: HintOptions;
    countryDropdownDefaultText: string;
    customCountryDropdown: YesNoFlag;
    customCountryOptions: string;
    customStateOptions?: '';
    description?: string;
    hasAutocomplete: YesNoFlag;
    hasGeolocation: YesNoFlag;
    requiredInputs: ControlOptions;
    selectedCountry: string;
    states: 'americanStates' | 'textbox';
    subfields: ControlOptions;
    sublabels: {
      addr_line1: string;
      addr_line2: string;
      city: string;
      state: string;
      postal: string;
      country: string;
    };
    type: 'control_address';
  };

  export type FormQuestionButton<K extends string = string> = FormQuestionBase<K> & {
    buttonAlign: HorizontalAlign;
    buttonStyle?: 'None' | string; // TODO: Add all possible values
    clear?: YesNoFlag;
    clearText?: string;
    encryptIcon?: YesNoFlag;
    print?: YesNoFlag;
    printText?: string;
    type: 'control_button';
  };

  export type FormQuestionCheckbox<K extends string = string> = FormQuestionControlBase<K> & {
    allowOther?: YesNoFlag;
    calcValues?: ControlValues;
    description?: string;
    maxSelection?: NumberLikeString | '';
    minSelection?: NumberLikeString | '';
    options: ControlOptions;
    otherText?: string;
    selected?: string;
    shuffle?: YesNoFlag;
    special?: Special;
    spreadCols?: NumberLikeString;
    type: 'control_checkbox';
  };

  export type FormQuestionDatetime<K extends string = string> = FormQuestionComplexBase<K> & {
    ageVerification: YesNoFlag;
    allowTime: YesNoFlag;
    autoCalendar: YesNoFlag;
    dateSeparator: '-' | '/' | '.';
    days: ControlOptions; // Localized names of days
    description?: string;
    defaultDate: 'none' | 'current' | `custom_${string}-${string}-${string}`;
    defaultTime: 'none' | 'current' | `custom_${string}:${string}`;
    format: string;
    limitDate: StringifiedJson<{
      days: {
        monday: boolean;
        tuesday: boolean;
        wednesday: boolean;
        thursday: boolean;
        friday: boolean;
        saturday: boolean;
        sunday: boolean;
      };
      future: true;
      past: boolean;
      custom: boolean;
      ranges: boolean;
      start: ISODate | '';
      end: ISODate | '';
    }>;
    liteMode: YesNoFlag;
    minAge: NumberLikeString;
    months: ControlOptions; // Localized names of months
    onlyFuture: YesNoFlag;
    startWeekOn: Weekday;
    step: NumberLikeString;
    sublabels: {
      day: string;
      month: string;
      year: string;
      last: string;
      hour: string;
      minutes: string;
      litemode: string;
    };
    timeFormat: 'AM/PM' | '24 Hour';
    today: string; // Localized "Today"
    validateLiteDate: YesNoFlag;
    type: 'control_datetime';
  };

  export type FormQuestionDivider<K extends string = string> = FormQuestionBase<K> & {
    color: string;
    height: NumberLikeString;
    lineStyle: 'solid' | 'dotted' | 'dashed';
    margin: NumberLikeString;
    protected?: never;
    spaceAbove: NumberLikeString;
    spaceBelow: NumberLikeString;
    type: 'control_divider';
  };

  export type FormQuestionDropdown<K extends string = string> = FormQuestionControlBase<K> & {
    autoFixed?: YesNoFlag;
    calcValues?: ControlValues;
    description?: string;
    emptyText?: string;
    multipleSelections?: YesNoFlag;
    options: ControlOptions;
    searchText?: string;
    selected?: string;
    shuffle?: YesNoFlag;
    size?: NumberLikeString;
    special?: Special;
    type: 'control_dropdown';
    visibleOptions?: NumberLikeString;
    width?: NumberLikeString;
  };

  export type FormQuestionEmail<K extends string = string> = FormQuestionControlBase<K> & {
    allowCustomDomains: YesNoFlag;
    allowedDomains: string;
    autoFixed?: YesNoFlag;
    confirmation: YesNoFlag;
    confirmationHint: string;
    confirmationSublabel: string;
    defaultValue: string;
    description?: string;
    disallowFree: YesNoFlag;
    domainCheck: YesNoFlag;
    hint: string;
    maxsize: NumberLikeString | '';
    shrink?: YesNoFlag;
    size?: NumberLikeString;
    validation?: Extract<Validation, 'Email'>;
    verificationCode: YesNoFlag;
    type: 'control_email';
  };

  export type FormQuestionFullname<K extends string = string> = FormQuestionComplexBase<K> & {
    compoundHint: HintOptions;
    description?: string;
    middle: YesNoFlag;
    prefix: YesNoFlag;
    prefixChoices: ControlOptions;
    sublabels: {
      prefix: string;
      first: string;
      middle: string;
      last: string;
      suffix: string;
    };
    suffix: YesNoFlag;
    type: 'control_fullname';
  };

  export type FormQuestionHead<K extends string = string> = FormQuestionBase<K> & {
    alt?: string;
    headerImage?: string;
    headerType: 'Default' | 'Large' | 'Small';
    imageAlign: HorizontalAlign;
    nextButtonText?: string;
    previousButtonText?: string;
    protected?: never;
    showQuestionCount?: YesNoFlag;
    subHeader: string;
    textAlign: HorizontalAlign;
    type: 'control_head';
    verticalTextAlign: VerticalAlign;
    width?: string;
  };

  export type FormQuestionHidden<K extends string = string> = FormQuestionBase<K> & {
    browserInfo: YesNoFlag;
    defaultValue: string;
    type: 'control_hidden';
    labelAlign: HorizontalAlign;
    selectedField: string;
    widgetType: WidgetType;
  };

  export type FormQuestionImage<K extends string = string> = FormQuestionBase<K> & {
    align?: HorizontalAlign;
    alt: string;
    description?: string;
    height: NumberLikeString;
    labelText: string;
    link: Url | '';
    protected?: never;
    src: Url;
    target: '_blank' | '_self' | '_parent' | '_top';
    type: 'control_image';
    width: NumberLikeString;
  };

  export type FormQuestionNumber<K extends string = string> = FormQuestionControlBase<K> & {
    autoFixed: YesNoFlag;
    defaultValue: string;
    description?: string;
    hint: string;
    maxsize: NumberLikeString | '';
    maxValue: NumberLikeString | '';
    minValue: NumberLikeString | '';
    shrink?: YesNoFlag;
    size?: NumberLikeString;
    type: 'control_number';
  };

  export type FormQuestionPagebreak<K extends string = string> = FormQuestionBase<K> & {
    autoNext: YesNoFlag;
    backText: string;
    backVisi: 'Visible' | 'Hidden';
    buttonStyle: 'None' | string; // TODO: Add all possible values
    nextText: string;
    nextVisi: 'Visible' | 'Hidden';
    pageInfo: string;
    type: 'control_pagebreak';
  };

  export type FormQuestionPhone<K extends string = string> = FormQuestionComplexBase<K> & {
    compoundHint: HintOptions;
    countryCode: YesNoFlag;
    description?: string;
    inputMask: EnableDisableFlag;
    inputMaskValue: string;
    sublabels: {
      country: string;
      area: string;
      phone: string;
      full: string;
      masked: string;
    };
    shrink?: YesNoFlag;
    size?: NumberLikeString;
    type: 'control_phone';
  };

  export type FormQuestionRadio<K extends string = string> = FormQuestionControlBase<K> & {
    allowOther?: YesNoFlag;
    calcValues?: ControlValues;
    description?: string;
    options: ControlOptions;
    otherText?: string;
    selected?: string;
    shuffle?: YesNoFlag;
    special?: Special;
    spreadCols?: NumberLikeString;
    type: 'control_radio';
  };

  export type FormQuestionText<K extends string = string> = FormQuestionBase<K> & {
    type: 'control_text';
  };

  export type FormQuestionTextbox<K extends string = string> = FormQuestionControlBase<K> & {
    autoFixed?: YesNoFlag;
    defaultValue?: string;
    description?: string;
    hint?: string;
    inputTextMask?: string;
    maxsize?: NumberLikeString | '';
    minsize?: NumberLikeString | '';
    shrink?: YesNoFlag;
    size?: NumberLikeString;
    type: 'control_textbox';
    validation?: Validation;
  };

  type FormQuestionTextareaV1<K extends string = string> = FormQuestionControlBase<K> & {
    cols: NumberLikeString;
    maxsize?: NumberLikeString | '';
    rows: NumberLikeString;
    type: 'control_textarea';
  };

  type FormQuestionTextareaV2<K extends string = string> = FormQuestionControlBase<K> & {
    autoFixed: YesNoFlag;
    cols: NumberLikeString; // Height in pixels, NOT rows
    defaultValue: string;
    description?: string;
    entryLimit: string;
    entryLimitMin: string;
    hint: string;
    maxsize?: NumberLikeString | '';
    mde: YesNoFlag;
    rows: NumberLikeString; // Height in pixels, NOT rows
    type: 'control_textarea';
    validation?: Validation;
    wysiwyg: EnableDisableUppercaseFlag;
  };

  export type FormQuestionTextarea<K extends string = string> =
    | FormQuestionTextareaV1<K>
    | FormQuestionTextareaV2<K>;

  export type FormQuestion<K extends string = string> =
    | FormQuestionAddress<K>
    | FormQuestionButton<K>
    | FormQuestionCheckbox<K>
    | FormQuestionDatetime<K>
    | FormQuestionDivider<K>
    | FormQuestionDropdown<K>
    | FormQuestionEmail<K>
    | FormQuestionFullname<K>
    | FormQuestionHead<K>
    | FormQuestionHidden<K>
    | FormQuestionImage<K>
    | FormQuestionNumber<K>
    | FormQuestionPagebreak<K>
    | FormQuestionPhone<K>
    | FormQuestionRadio<K>
    | FormQuestionText<K>
    | FormQuestionTextbox<K>
    | FormQuestionTextarea<K>;

  export type FormQuestions = { [K in string]: FormQuestion<K> };

  type SubmissionAnswerBase<T> = Omit<T, 'answer'> & {
    name: string;
    order: NumberLikeString;
    text: string;
    type: string;
    answer?: any;
  };

  type SubmissionAnswerAddress = SubmissionAnswerBase<{
    answer?: {
      addr_line1?: string;
      addr_line2?: string;
      city?: string;
      state?: string;
      postal?: string;
      country?: string;
    };
    prettyFormat?: string;
  }>;

  type SubmissionAnswerButton = SubmissionAnswerBase<{ answer?: never }>;

  type SubmissionAnswerCheckbox = SubmissionAnswerBase<{ answer?: string[] }>;

  type SubmissionAnswerDatetime = SubmissionAnswerBase<{ answer?: any }>; // TODO

  type SubmissionAnswerDivider = SubmissionAnswerBase<{ answer?: never }>;

  type SubmissionAnswerDropdown = SubmissionAnswerBase<{ answer?: string }>;

  type SubmissionAnswerEmail = SubmissionAnswerBase<{ answer?: string }>;

  type SubmissionAnswerFullname = SubmissionAnswerBase<{
    answer?: {
      prefix?: string;
      first?: string;
      middle?: string;
      last?: string;
      suffix?: string;
    };
    prettyFormat?: string;
  }>;

  type SubmissionAnswerHead = SubmissionAnswerBase<{ answer?: never }>;

  type SubmissionAnswerImage = SubmissionAnswerBase<{ answer?: never }>;

  type SubmissionAnswerNumber = SubmissionAnswerBase<{ answer?: any }>; // TODO

  type SubmissionAnswerPhone = SubmissionAnswerBase<{
    answer?: {
      country: string;
      area: string;
      phone: string;
      full: string;
      masked: string;
    };
    prettyFormat?: string;
  }>;

  type SubmissionAnswerRadio = SubmissionAnswerBase<{ answer?: string }>;

  type SubmissionAnswerText = SubmissionAnswerBase<{ answer?: never }>;

  type SubmissionAnswerTextbox = SubmissionAnswerBase<{ answer?: string }>;

  type SubmissionAnswerTextarea = SubmissionAnswerBase<{ answer?: string }>;

  type SubmissionAnswer =
    | SubmissionAnswerButton
    | SubmissionAnswerCheckbox
    | SubmissionAnswerDatetime
    | SubmissionAnswerDivider
    | SubmissionAnswerDropdown
    | SubmissionAnswerEmail
    | SubmissionAnswerFullname
    | SubmissionAnswerHead
    | SubmissionAnswerImage
    | SubmissionAnswerNumber
    | SubmissionAnswerPhone
    | SubmissionAnswerRadio
    | SubmissionAnswerText
    | SubmissionAnswerTextbox
    | SubmissionAnswerTextarea;

  export type Submission<K1 extends string = string, K2 extends string = string> = {
    id: K2;
    form_id: K1;
    ip: string;
    created_at: ISODate;
    status: 'ACTIVE' | 'CUSTOM' | 'DELETED' | string; // TODO: Add all possible values
    new: ZeroOneFlag;
    flag: ZeroOneFlag;
    notes: string;
    updated_at: ISODate | null;
    answers: {
      [K in string]: SubmissionAnswer;
    };
  };

  export type Subuser = Record<string, any>; // TODO

  export type Folder<K extends string = string> = {
    id: K;
    path: string;
    owner: string;
    name: string;
    parent: string;
    color: string;
    forms: Form[];
    subfolders: Folder[];
  };

  export type FolderRoot = {
    id: string;
    path: string;
    owner: string;
    name: string;
    parent: 'root';
    color: string;
    forms: {
      [K in string]: Form<K>;
    };
    subfolders: Folder[];
  };

  export type Report<K extends string = string> = Record<string, any>; // TODO

  type FolderLayoutNode = {
    [K in string]: {
      nodes: FolderLayoutNode;
    };
  };

  export type Settings = {
    username: string;
    name: string;
    email: string;
    website: string | null;
    time_zone: string;
    account_type: Url;
    status: 'ACTIVE' | string; // TODO: Add all possible values
    created_at: ISODate;
    updated_at: ISODate | null;
    region: 'EMEA' | string; // TODO: Add all possible values
    is_verified: ZeroOneFlag;
    usage: Url;
    euOnly: ZeroOneFlag;
    new_users_campaign: string;
    loginToGetSubmissions: ZeroOneFlag;
    loginToViewUploadedFiles: ZeroOneFlag;
    loginToViewSubmissionRSS: ZeroOneFlag;
    showJotFormPowered: ZeroOneFlag;
    defaultTheme: string;
    submission_inbox_group: string;
    avatarUrl: Url;
    formListingsTestUser: ZeroOneFlag;
    company_logo: Url;
    company: string;
    tablesIntroVideoShown: YesNoFlag;
    folderLayout: StringifiedJson<FolderLayoutNode>;
    disableViewLimits: boolean;
  };

  export type HistoryEntry = Record<string, any>; // TODO

  export type FormFile<K1 extends string = string, K2 extends string = string> = {
    id: K2;
    name: string;
    type: string;
    size: string;
    username: string;
    form_id: K1;
    submission_id: string;
    uploaded: string;
    date: string;
    url: Url;
  };

  export type FormWebhook = string;

  type ConditionActionBase = {
    id: string;
    isError: boolean;
  };

  export type ConditionVisibilityActionSingle = ConditionActionBase & {
    visibility: 'Show' | 'Hide' | 'Require' | 'Unrequire';
    field: string;
  };

  export type ConditionVisibilityActionMultiple = ConditionActionBase & {
    visibility: 'ShowMultiple' | 'HideMultiple' | 'RequireMultiple' | 'UnrequireMultiple';
    fields: string[];
  };

  export type ConditionVisibilityAction =
    | ConditionVisibilityActionSingle
    | ConditionVisibilityActionMultiple;

  export type ConditionCalculationAction = ConditionActionBase & {
    equation: string;
    resultField: string;
  };

  export type ConditionAction = ConditionVisibilityAction | ConditionCalculationAction;

  export type ConditionTerm = {
    id: string;
    field: string;
    operator: 'contains' | 'notContains' | 'equals' | 'notEquals' | 'isEmpty' | 'isFilled';
    value: string;
    isError: boolean;
  };

  type Condition = {
    action: StringifiedJson<ConditionAction[]>;
    disabled?: ZeroOneFlag;
    id: string;
    index: string;
    link: 'Any' | 'All';
    priority: NumberLikeString;
    terms: StringifiedJson<ConditionTerm[]>;
    type: 'field' | 'require' | string; // TODO: Add all possible values
  };

  type Email = {
    body: string;
    branding21Email: ZeroOneFlag | '';
    dirty: string;
    from: 'default' | string;
    hideEmptyFields: ZeroOneFlag;
    html: ZeroOneFlag;
    lastQuestionID: string;
    name: string;
    pdfattachment: string;
    replyTo: string;
    sendOnEdit: ZeroOneFlag;
    sendOnSubmit: ZeroOneFlag;
    subject: string;
    to: string;
    type: 'notification' | string; // TODO: Add all possible values
    uniqueID: string;
    uploadAttachment: string;
  };

  export type SubmissionSetting = Record<string, any>; // TODO

  export type Integrations = Record<string, any> & {
    webhooks?: {
     endpoints: StringifiedJson<string[]>;
    };
  }; // TODO

  type FormPropertiesBase<K extends string = string> = {
    activeRedirect?: 'thanktext' | 'thankurl';
    alignment: VerticalAlign;
    conditions?: Condition[];
    defaultAutoResponderEmailAssigned: YesNoFlag;
    defaultEmailAssigned: YesNoFlag;
    defaultTheme: string;
    emails: Email[];
    formOwnerAccountType: 'ENTERPRISE' | 'FREE' | string; // TODO: Add all possible values
    formOwnerName: string;
    hash: string;
    height: NumberLikeString;
    id: K;
    injectCSS: string;
    integrations: Integrations | never[];
    isEUForm: ZeroOneFlag;
    isHIPAA: ZeroOneFlag;
    lastQuestionID: string;
    owner: string;
    pagetitle: string;
    pageTitleChanged: YesNoFlag;
    slug: string;
    status: 'ENABLED' | string; // TODO: Add all possible values
    styleJSON: string;
    submissionSettings: SubmissionSetting[];
    thanktext: string;
    thankurl?: Url;
    thankYouIconSrc: Url;
    thankYouImageSrc: Url;
    thankYouPageLayout: 'smallImageUp' | string; // TODO: Add all possible values
    themeID: string;
    title: string;
    type: 'LEGACY' | string; // TODO: Add all possible values
  };

  export type FormPropertiesV3<K extends string = string> = FormPropertiesBase<K> & {
    allowFormFillerToContact: YesNoFlag;
    assigneeSubmissionPermission: 'submitOnly' | string; // TODO: Add all possible values
    assignLinkExpireDate: string;
    assignLinkExpireTimezone: string;
    assignSlug: string;
    datetimeMigrationIncludesBirthDate: ZeroOneFlag;
    datetimeMigrationStatus: 'done' | string; // TODO: Add all possible values
    defaultTheme: 'v1';
    isOrganizationSettingModalClosed: ZeroOneFlag;
  };

  type FormStrings = Record<string, string>;

  export type FormPropertiesV4<K extends string = string> = FormPropertiesBase<K> & {
    allowSubmissionEdit: YesNoFlag;
    background: string;
    cardThemeID: string;
    clearFieldOnHide: EnableDisableFlag;
    creationLanguage: string;
    defaultTheme: 'v2';
    errorNavigation: YesNoFlag;
    expireDate: 'No Limit' | any; // TODO: Add all possible values
    font: string;
    fontcolor: string;
    fontsize: NumberLikeString;
    formStrings: [FormStrings];
    formStringsChanged: YesNoFlag;
    formType: 'legacyForm' | string; // TODO: Add all possible values
    formWidth: NumberLikeString;
    hideEmptySubmissionFields: YesNoFlag;
    hideMailEmptyFields: EnableDisableFlag;
    hideNonInputSubmissionFields: YesNoFlag;
    hideSubmissionHeader: YesNoFlag;
    highlightLine: 'Enabled' | string; // TODO: Add all possible values
    isEncrypted: YesNoFlag;
    labelWidth: NumberLikeString;
    limitSubmission: 'No Limit' | any; // TODO: Add all possible values
    lineSpacing: NumberLikeString;
    messageOfLimitedForm: string;
    mobileGoButton: 'enable' | string; // TODO: Add all possible values
    newPaymentUIForNewCreatedForms: YesNoFlag;
    optioncolor: string;
    pageColor: string;
    preventCloningForm: YesNoFlag;
    responsive: YesNoFlag;
    sendpostdata: YesNoFlag;
    showJotFormLogo: YesNoFlag;
    showProgressBar: EnableDisableFlag;
    styles: string;
    submissionHeaders: string;
    submitError: 'jumpToFirstError' | string; // TODO: Add all possible values
    thankYouDownloadPDF: YesNoFlag;
    thankYouEditSubmission: YesNoFlag;
    thankYouFillAgain: YesNoFlag;
    thankYouSelectedPDFs: YesNoFlag;
    unique: 'None' | string; // TODO: Add all possible values
    uniqueField: '<Field Id>' | string; // TODO: Add all possible values
    usesNewPDF: YesNoFlag;
    v4: '1';
  };

  export type FormProperties<K extends string = string> = FormPropertiesV3<K> | FormPropertiesV4<K>;

  export function options(options: Options): void;

  export function getUser(): Promise<User>;

  export function getUsage(): Promise<Usage>;

  export function getForms(query?: Query): Promise<Form[]>;

  export function getSubmissions(
    query?: Query & {
      fullText?: any;
      nocache?: any;
    },
  ): Promise<Submission[]>;

  export function getSubusers(): Promise<Subuser[]>;

  export function getFolders(): Promise<FolderRoot | 'You do not have any folders'>;

  export function getReports(): Promise<Report[]>;

  export function getSettings(): Promise<Settings>;

  export function getHistory(query?: {
    action?: any;
    date?: any;
    sortBy?: any;
    startDate?: any;
    endDate?: any;
  }): Promise<HistoryEntry[]>;

  export function getForm<K extends string>(formID: K): Promise<Form<K>>;

  export function getFormQuestions(formID: string): Promise<FormQuestions>;

  export function getFormQuestion<K extends string>(
    formID: string,
    questionID: K,
  ): Promise<FormQuestion<K>>;

  export function getFormSubmissions<K extends string>(
    formID: K,
    query?: Query,
  ): Promise<Submission<K>[]>;

  export function createFormSubmission<K extends string>(
    formID: K,
    submission: {
      submission: Record<string, any>;
    },
  ): Promise<{ submissionID: string, URL: string }>;

  export function createFormSubmissions(
    formID: string,
    submissions: Record<string, any>[],
  ): Promise<{ submissionID: string, URL: string }[]>;

  export function getFormFiles<K extends string>(formID: K): Promise<FormFile<K>[]>;

  export function getFormWebhooks(formID: string): Promise<Record<string, FormWebhook>>;

  export function createFormWebhook(
    formID: string,
    webhookURL: string,
  ): Promise<Record<string, FormWebhook>>;

  export function deleteFormWebhook(formID: string, webhookID: string): Promise<any>;

  export function getSubmission<K extends string>(submissionID: K): Promise<Submission<string, K>>;

  export function editSubmission<K extends string>(
    submissionID: K,
    submission: Partial<Submission<string, K>>,
  ): Promise<{ submissionID: K; URL: Url }>;

  export function deleteSubmission(submissionID: string): Promise<any>;

  export function getReport<K extends string>(reportID: K): Promise<Report<K>>;

  export function getFolder<K extends string>(folderID: K): Promise<Folder<K>>;

  export function createForm(form: Partial<Form>): Promise<Form>;

  export function createForms(forms: Partial<Form>[]): Promise<any>;

  export function deleteForm(formID: string): Promise<any>;

  export function cloneForm(formID: string): Promise<Form>;

  export function addFormQuestion(
    formID: string,
    question: Partial<FormQuestion>,
  ): Promise<FormQuestion>;

  export function addFormQuestions(
    formID: string,
    questions: Partial<FormQuestion>[],
  ): Promise<any>;

  export function deleteFormQuestion(formID: string, questionID: string): Promise<any>;

  export function getFormProperties<K extends string>(formID: K): Promise<FormProperties<K>>;

  export function addFormProperty(formID: string, property: any): Promise<any>;

  export function addFormProperties(formID: string, properties: any): Promise<any>;

  export function getFormPropertyByKey(formID: string, propertyKey: string): Promise<any>;
}
itsalysialynn commented 9 months ago

Plus one to this feature request. And thank you kind stranger!