Open Source Licenses

storage

Version 7.17.1

Apache-2.0
Published by Google Inc.
View License Text
Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

react

Version 1.7.19

MIT
View License Text
<h3 align="center">
  @headlessui/react
</h3>

<p align="center">
  A set of completely unstyled, fully accessible UI components for React, designed to integrate
  beautifully with Tailwind CSS.
</p>

<p align="center">
  <a href="https://www.npmjs.com/package/@headlessui/react"><img src="https://img.shields.io/npm/dt/@headlessui/react.svg" alt="Total Downloads"></a>
  <a href="https://github.com/tailwindlabs/headlessui/releases"><img src="https://img.shields.io/npm/v/@headlessui/react.svg" alt="Latest Release"></a>
  <a href="https://github.com/tailwindlabs/headlessui/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/@headlessui/react.svg" alt="License"></a>
</p>

## Installation

```sh
npm install @headlessui/react
```

## Documentation

For full documentation, visit [headlessui.dev](https://headlessui.dev/react/menu).

## Community

For help, discussion about best practices, or any other conversation that would benefit from being searchable:

[Discuss Headless UI on GitHub](https://github.com/tailwindlabs/headlessui/discussions)

For casual chit-chat with others using the library:

[Join the Tailwind CSS Discord Server](https://discord.gg/7NF8GNe)

react

Version 2.2.0

MIT
View License Text
MIT License

Copyright (c) Tailwind Labs, Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

resolvers

Version 3.10.0

MIT
Published by bluebill1049 (bluebill1049@hotmail.com)
View License Text
MIT License

Copyright (c) 2019-present Beier(Bill) Luo

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

third-parties

Version 14.2.29

MIT
View License Text
# Experimental `@next/third-parties`

`@next/third-parties` is a collection of components and utilities that can be used to efficiently load third-party libraries into your Next.js application.

> Note: `@next/third-parties` is still experimental and under active development.

# Usage

## Google Third-Parties

### YouTube Embed

The `YouTubeEmbed` component is used to load and display a YouTube embed. This component loads faster by using [lite-youtube-embed](https://github.com/paulirish/lite-youtube-embed) under the hood.

```js
import { YouTubeEmbed } from '@next/third-parties/google'

export default function Page() {
  return <YouTubeEmbed videoid="ogfYd705cRs" height={400} />
}
```

### Google Maps Embed

The `GoogleMapsEmbed` component can be used to add a [Google Maps Embed](https://developers.google.com/maps/documentation/embed/get-started) to your page. By default, it uses the `loading` attribute to lazy-load below the fold.

```js
import { GoogleMapsEmbed } from '@next/third-parties/google'

export default function Page() {
  return (
    <GoogleMapsEmbed
      apiKey="XYZ"
      height={200}
      width="100%"
      mode="place"
      q="Brooklyn+Bridge,New+York,NY"
    />
  )
}
```

To get a better idea of how these components work, take a look at this [demo](https://test-next-script-housseindjirdeh.vercel.app/). <!--- TODO: Replace with a better demo page -->

api

Version 1.9.0

Apache-2.0
Published by OpenTelemetry Authors
View License Text
Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

react-accordion

Version 1.2.2

MIT
View License Text
# `react-accordion`

## Installation

```sh
$ yarn add @radix-ui/react-accordion
# or
$ npm install @radix-ui/react-accordion
```

## Usage

View docs [here](https://radix-ui.com/primitives/docs/components/accordion).

react-alert-dialog

Version 1.1.5

MIT
View License Text
# `react-alert-dialog`

## Installation

```sh
$ yarn add @radix-ui/react-alert-dialog
# or
$ npm install @radix-ui/react-alert-dialog
```

## Usage

View docs [here](https://radix-ui.com/primitives/docs/components/alert-dialog).

react-avatar

Version 1.1.2

MIT
View License Text
# `react-avatar`

## Installation

```sh
$ yarn add @radix-ui/react-avatar
# or
$ npm install @radix-ui/react-avatar
```

## Usage

View docs [here](https://radix-ui.com/primitives/docs/components/avatar).

react-checkbox

Version 1.1.3

MIT
View License Text
# `react-checkbox`

## Installation

```sh
$ yarn add @radix-ui/react-checkbox
# or
$ npm install @radix-ui/react-checkbox
```

## Usage

View docs [here](https://radix-ui.com/primitives/docs/components/checkbox).

react-collapsible

Version 1.1.2

MIT
View License Text
# `react-collapsible`

## Installation

```sh
$ yarn add @radix-ui/react-collapsible
# or
$ npm install @radix-ui/react-collapsible
```

## Usage

View docs [here](https://radix-ui.com/primitives/docs/components/collapsible).

react-dialog

Version 1.1.5

MIT
View License Text
# `react-dialog`

## Installation

```sh
$ yarn add @radix-ui/react-dialog
# or
$ npm install @radix-ui/react-dialog
```

## Usage

View docs [here](https://radix-ui.com/primitives/docs/components/dialog).

react-dropdown-menu

Version 2.1.5

MIT
View License Text
# `react-dropdown-menu`

## Installation

```sh
$ yarn add @radix-ui/react-dropdown-menu
# or
$ npm install @radix-ui/react-dropdown-menu
```

## Usage

View docs [here](https://radix-ui.com/primitives/docs/components/dropdown-menu).

react-hover-card

Version 1.1.5

MIT
View License Text
# `react-hover-card`

## Installation

```sh
$ yarn add @radix-ui/react-hover-card
# or
$ npm install @radix-ui/react-hover-card
```

## Usage

View docs [here](https://radix-ui.com/primitives/docs/components/hover-card).

react-label

Version 2.1.1

MIT
View License Text
# `react-label`

## Installation

```sh
$ yarn add @radix-ui/react-label
# or
$ npm install @radix-ui/react-label
```

## Usage

View docs [here](https://radix-ui.com/primitives/docs/utilities/label).

react-popover

Version 1.1.5

MIT
View License Text
# `react-popover`

## Installation

```sh
$ yarn add @radix-ui/react-popover
# or
$ npm install @radix-ui/react-popover
```

## Usage

View docs [here](https://radix-ui.com/primitives/docs/components/popover).

react-scroll-area

Version 1.2.8

MIT
View License Text
MIT License

Copyright (c) 2022 WorkOS

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

react-select

Version 2.1.5

MIT
View License Text
# `react-select`

## Installation

```sh
$ yarn add @radix-ui/react-select
# or
$ npm install @radix-ui/react-select
```

## Usage

View docs [here](https://radix-ui.com/primitives/docs/components/select).

react-separator

Version 1.1.1

MIT
View License Text
# `react-separator`

## Installation

```sh
$ yarn add @radix-ui/react-separator
# or
$ npm install @radix-ui/react-separator
```

## Usage

View docs [here](https://radix-ui.com/primitives/docs/components/separator).

react-slider

Version 1.2.3

MIT
View License Text
# `react-slider`

## Installation

```sh
$ yarn add @radix-ui/react-slider
# or
$ npm install @radix-ui/react-slider
```

## Usage

View docs [here](https://radix-ui.com/primitives/docs/components/slider).

react-slot

Version 1.1.1

MIT
View License Text
# `react-slot`

## Installation

```sh
$ yarn add @radix-ui/react-slot
# or
$ npm install @radix-ui/react-slot
```

## Usage

View docs [here](https://radix-ui.com/primitives/docs/utilities/slot).

react-tabs

Version 1.1.12

MIT
View License Text
MIT License

Copyright (c) 2022 WorkOS

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

react-toast

Version 1.2.5

MIT
View License Text
# `react-toast`

## Installation

```sh
$ yarn add @radix-ui/react-toast
# or
$ npm install @radix-ui/react-toast
```

## Usage

View docs [here](https://radix-ui.com/primitives/docs/components/toast).

react-tooltip

Version 1.1.7

MIT
View License Text
# `react-tooltip`

## Installation

```sh
$ yarn add @radix-ui/react-tooltip
# or
$ npm install @radix-ui/react-tooltip
```

## Usage

View docs [here](https://radix-ui.com/primitives/docs/components/tooltip).

react-query

Version 5.66.0

MIT
Published by tannerlinsley
View License Text
MIT License

Copyright (c) 2021-present Tanner Linsley

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

react-table

Version 8.20.6

MIT
Published by Tanner Linsley
View License Text
MIT License

Copyright (c) 2016 Tanner Linsley

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

bcryptjs

Version 2.4.3

MIT
Published by Daniel Wirtz (dcode@dcode.io)
View License Text
bcrypt.js
---------
Copyright (c) 2012 Nevins Bartolomeo <nevins.bartolomeo@gmail.com>
Copyright (c) 2012 Shane Girish <shaneGirish@gmail.com>
Copyright (c) 2014 Daniel Wirtz <dcode@dcode.io>
 
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
   derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

isaac.js
--------
Copyright (c) 2012 Yves-Marie K. Rinquin

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

better-sqlite3

Version 11.8.1

MIT
Published by Joshua Wise (joshuathomaswise@gmail.com)
View License Text
The MIT License (MIT)

Copyright (c) 2017 Joshua Wise

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Apache-2.0
Published by Joe Bell
View License Text
Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   Copyright 2022 Joe Bell

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

clsx

Version 2.1.1

MIT
Published by Luke Edwards (luke.edwards05@gmail.com)
View License Text
MIT License

Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

cmdk

Version 1.0.4

MIT
Published by Paco
View License Text
MIT License

Copyright (c) 2022 Paco Coursey

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

common-password

Version 0.1.2

ISC
Published by Michał Adamski (meehow808@gmail.com)
View License Text
This package was inspired by an article "[10,000 Top Passwords](https://xato.net/passwords/more-top-worst-passwords/)" by [Mark Burnett](https://xato.net/author/mb/).

![Popular passwords](http://i.imgur.com/9OzTQVk.png)

This package can be used as password requirement, but should be combined with length checking. Some passwords are not listed as popular because they don't meet length requirement in many systems. For example `1234` is listed as popular password, but `123` is not.

Installation
------------

```
npm install common-password
```

Example
-------

Check [example.js](./example.js).

```
$ node ./example.js passw0rd
password is too easy to guess
not OK
$ node ./example.js eiGoh8ou
OK
```

date-fns-tz

Version 3.2.0

MIT
Published by Marnus Weststrate (marnusw@gmail.com)
View License Text
The MIT License (MIT)

Copyright © 2018 Marnus Weststrate

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the “Software”), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

date-fns

Version 3.6.0

MIT
View License Text
MIT License

Copyright (c) 2021 Sasha Koss and Lesha Koss https://kossnocorp.mit-license.org

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

envalid

Version 8.0.0

MIT
Published by Aaron Franks
View License Text
(The MIT License)

Copyright (c) 2012 Aaron Franks

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
'Software'), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

envars

Version 1.1.0

MIT
Published by Kriasoft (hello@kriasoft.com)
View License Text
Copyright 2021-present Kriasoft <hello@kriasoft.com>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

geist

Version 1.3.1

MIT*
View License Text
Copyright (c) 2023 Vercel, in collaboration with basement.studio

This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL

-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------

PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.

The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.

DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.

"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).

"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).

"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.

"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.

PERMISSION AND CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:

1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.

2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.

3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.

4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.

5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.

TERMINATION
This license becomes null and void if any of the above conditions are
not met.

DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

handlebars

Version 4.7.8

MIT
Published by Yehuda Katz
View License Text
Copyright (C) 2011-2019 by Yehuda Katz

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

knex

Version 3.1.0

MIT
Published by Tim Griesser
View License Text
Copyright (c) 2013-present Tim Griesser

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

lucide-react

Version 0.453.0

ISC
Published by Eric Fennis
View License Text
ISC License

Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2022 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2022.

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

mailgun.js

Version 10.4.0

MIT
Published by Mailgun
View License Text
# Mailgun.js

A javascript sdk for Mailgun built with webpack, babel & es6. This can be used in node or in the browser*.

NOTE: If used in the browser, a proxy is required to communicate with the Mailgun api due to cors limitations. Also, do not publish your private api key in frontend code.

__Table of Contents__

- [Documentation](#documentation)
  - [Install](#install)
  - [Setup Client](#setup-client)
    - [Available Imports](#imports)
    - [Using Subaccounts](#using-subaccounts)
    - [Types imports](#types-imports)
    - [Interfaces and Enums imports](#interfaces-and-enums-imports)
  - [Generated docs](#generated-docs)
  - [Methods](#methods)
  - [Browser Demo](#browser-demo)
  - [Examples](https://github.com/mailgun/mailgun-js/tree/master/examples)
- [Development](#development)
  - [Requirements](#requirements)
  - [Build](#build)
  - [Tests](#tests)
  - [Release Process](#release-process)

# Documentation
[Mailgun API Documentation](https://documentation.mailgun.com/en/latest/api_reference.html):

## Install

- Requires node.js >= 18.x

Install mailgun.js with:

```sh
npm install mailgun.js
```

## Setup Client

Next, require the module and instantiate a mailgun client by calling `new Mailgun(formData)` and then using `mailgun.client` setup the client with basic auth credentials `(username: 'api', key: 'key-yourkeyhere')`.

NOTE: starting from version 3.0 you need to pass FormData (we need this to keep library universal). For node.js you can use `form-data` library.

IMPORTANT: if you are using EU infrastructure, you need to also pass `url: 'https://api.eu.mailgun.net'` together with auth credentials as stated in [Mailgun docs](https://documentation.mailgun.com/en/latest/quickstart-sending.html#send-via-api)

### Imports
Once the package is installed, you can import the library using `import` or `require` approach:

```js
  const formData = require('form-data');
  const Mailgun = require('mailgun.js');
  const mailgun = new Mailgun(formData);
  const mg = mailgun.client({username: 'api', key: process.env.MAILGUN_API_KEY || 'key-yourkeyhere'});
```
```js
  import FormData from 'form-data';
  import Mailgun from 'mailgun.js';
  const mailgun = new Mailgun(FormData);
  const mg = mailgun.client({username: 'api', key: process.env.MAILGUN_API_KEY || 'key-yourkeyhere'});
```
### Using Subaccounts
Primary accounts can make API calls on behalf of their subaccounts. [API documentation](https://documentation.mailgun.com/en/latest/subaccounts.html#subaccounts)
```js
  import FormData from 'form-data';
  import Mailgun from 'mailgun.js';
  const mailgun = new Mailgun(FormData);
  const mg = mailgun.client({username: 'api', key: process.env.MAILGUN_API_KEY || 'key-yourkeyhere'});
  mg.setSubaccount('subaccount-id');
  // then, if you need to reset it back to the primary account:
  mg.resetSubaccount();
```

### Proxy configuration
By leveraging client configuration options, users can effortlessly establish proxy connections that align with their network requirements.
Ex:
```js
  import FormData from 'form-data';
  import Mailgun from 'mailgun.js';
  const mailgun = new Mailgun(FormData);

  const mg = mailgun.client({
    username: 'api',
    key: process.env.MAILGUN_API_KEY || 'key-yourkeyhere',
    proxy: {
      protocol: 'https' // 'http' ,
      host: '127.0.0.1', // use your proxy host here
      port: 9000, // use your proxy port here
      auth: { // may be omitted if proxy doesn't require authentication
        username: 'user_name', // provide username
        password: 'user_password' // provide password
      }
    },
  });
```
### Types imports
Starting from version **9.0.0.** Types can be includes as named import:
```TS
 import Mailgun, { MailgunClientOptions, MessagesSendResult } from 'mailgun.js';
```

### Interfaces and Enums imports
Starting from version **9.0.0.** Interfaces and Enums can be imported in the next way:
```TS
  import Mailgun, { Interfaces, Enums } from 'mailgun.js';
  ...
  const mailgunClient: Interfaces.IMailgunClient = mailgun.client(clientOptions);
  const yes = Enums.YesNo.YES;
  ...
```

### Generated docs
The list of all available Types, Interfaces and Enums is auto-generated and located in the [docs](./docs/modules.md) folder.

## Methods

The following service methods are available to instantiated clients. The examples assume you have already created a mailgun client as `mg` with valid credentials.

- [Documentation](#documentation)
  - [Install](#install)
  - [Setup Client](#setup-client)
  - [Methods](#methods)
    - [messages](#messages)
      - [create](#create)
    - [domains](#domains)
      - [list](#list)
      - [get](#get)
      - [create](#create-1)
      - [update](#update)
      - [destroy](#destroy)
      - [getTracking](#gettracking)
      - [updateTracking](#updatetracking)
      - [getIps](#getips)
      - [assignIp](#assignip)
    - [events](#events)
      - [get](#get-1)
        - [Example with Date and *Filter field*](#example-with-date-and-filter-field)
    - [stats](#stats)
      - [Stats Options](#stats-options)
      - [getDomain](#getdomain)
      - [getAccount](#getaccount)
    - [Metrics](#metrics)
      - [getAccount](#getaccount-1)
      - [getAccountUsage](#getaccountusage)
    - [suppressions](#suppressions)
      - [list](#list-1)
        - [Bounces Example](#bounces-example)
        - [Unsubscribes Example](#unsubscribes-example)
        - [Complaints Example](#complaints-example)
      - [get](#get-2)
        - [Bounces Example](#bounces-example-1)
        - [Unsubscribes Example](#unsubscribes-example-1)
        - [Complaints Example](#complaints-example-1)
      - [create](#create-2)
        - [Bounces Example](#bounces-example-2)
        - [Unsubscribes Example](#unsubscribes-example-2)
          - [Unsubscribe from one tag](#unsubscribe-from-one-tag)
          - [Unsubscribe from particular tags](#unsubscribe-from-particular-tags)
        - [Complaints Example](#complaints-example-2)
      - [destroy](#destroy-1)
        - [Bounces Example](#bounces-example-3)
        - [Unsubscribes Example](#unsubscribes-example-3)
        - [Complaints Example](#complaints-example-3)
    - [webhooks](#webhooks)
      - [list](#list-2)
      - [get](#get-3)
      - [create](#create-3)
      - [update](#update-1)
      - [destroy](#destroy-2)
    - [routes](#routes)
      - [list](#list-3)
      - [get](#get-4)
      - [create](#create-4)
      - [update](#update-2)
      - [destroy](#destroy-3)
    - [validate](#validate)
      - [get](#get-5)
    - [multiple validation](#multiple-validation)
      - [create](#create-5)
      - [list](#list-4)
      - [get](#get-5)
      - [destroy](#destroy-4)
    - [mailing lists](#mailing-lists)
      - [list](#list-5)
      - [get](#get-6)
      - [create](#create-6)
      - [update](#update-3)
      - [destroy](#destroy-5)
    - [mailing list members](#mailing-list-members)
      - [listMembers](#listmember)
      - [getMember](#getmember)
      - [createMember](#createmember)
      - [createMembers](#createmembers)
      - [updateMember](#updatemember)
      - [destroyMember](#destroymember)
    - [subaccounts](#subaccounts)
      - [list](#list-6)
      - [get](#get-8)
      - [create](#create-7)
      - [enable](#enable)
      - [disable](#disable)
    - [Inbox Placements](#inbox-placements)
      - [SeedsLists](#seedslists)
        - [list](#list-7)
        - [get](#get-9)
        - [create](#create-8)
        - [update](#update-4)
        - [destroy](#destroy-6)
        - [SeedsLists Attributes](#attributes)
          - [list](#list-8)
          - [get](#get-10)
        - [SeedsLists Filters](#filters)
          - [list](#list-9)
      - [Providers](#providers)
        - [list](#list-10)
      - [Results](#results)
        - [list](#list-11)
        - [get](#get-11)
        - [destroy](#destroy-7)
        - [getResultByShareId](#getresultbyshareid)
        - [Results Attributes](#attributes-1)
          - [list](#list-12)
          - [get](#get-12)
        - [Results Filters](#filters-1)
          - [list](#list-13)
        - [Sharing](#sharing)
          - [get](#get-13)
          - [update](#update-5)
      - [Run Test](#run-test)
  - [Navigation thru lists](#navigation-thru-lists)
  - [Browser Demo](#browser-demo)
- [Development](#development)
  - [Requirements](#requirements)
  - [Build](#build)
  - [Tests](#tests)
  - [Release Process](#release-process)
  - [TODO](#todo)

### Method naming conventions:
- `get` or `get{{Item}}` - expected response for client is a single object
- `list` or `list{{Items}}` - expected response for client is a list of objects
- `create` or `create{{Item}}` - expected response for client is a single object
- `update` or `update{{Item}}` - expected response is an object with a status message
- `destroy` or `destroy{{Item}}` - expected response is an object with a status message

### Messages

- #### create

  `mg.messages.create(domain, data)` - [api docs](https://documentation.mailgun.com/en/latest/api-sending.html)

  Options:

  Parameter         | Description
  :---------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  to                | Email address of the recipient(s). Example: "Bob <bob@host.com>". You can use commas to separate multiple recipients (e.g.: "test@example.com,test@example.com" or ["test@example.com", "test@example.com"]).
  cc                | Same as `To` but for `carbon copy`
  bcc               | Same as `To` but for `blind carbon copy`
  subject           | Subject of the message.
  html              | HTML version of the message.
  text              | Text version of the message.
  message           | MIME string of the message. Make sure to use multipart/form-data to send this as a file upload.
  attachment        | File attachment. You can post multiple attachment values. Important: You must use multipart/form-data encoding when sending attachments. Also you can use `{data: file, filename: filename}` to define custom filename.
  o:tag             | Tag string. See Tagging for more information.
  o:campaign        | Id of the campaign the message belongs to. See um-campaign-analytics for details.
  o:deliverytime    | Desired time of delivery. See Date Format. Note: Messages can be scheduled for a maximum of 3 days in the future.
  o:dkim            | Enables/disabled DKIM signatures on per-message basis. Pass yes or no
  o:testmode        | Enables sending in test mode. Pass yes if needed. See Sending in Test Mode
  o:tracking        | Toggles tracking on a per-message basis, see Tracking Messages for details. Pass yes or no.
  o:tracking-clicks | Toggles clicks tracking on a per-message basis. Has higher priority than domain-level setting. Pass yes, no or htmlonly.
  o:tracking-opens  | Toggles opens tracking on a per-message basis. Has higher priority than domain-level setting. Pass yes or no.
  h:X-My-Header     | h: prefix followed by an arbitrary value allows to append a custom MIME header to the message (X-My-Header in this case). For example, h:Reply-To to specify Reply-To address.
  v:my-var          | v: prefix followed by an arbitrary name allows to attach a custom JSON data to the message. See Attaching Data to Messages for more information.


  - HTML/TEXT Example:

    ```JS
    mg.messages.create('sandbox-123.mailgun.org', {
        from: "Excited User <mailgun@sandbox-123.mailgun.org>",
        to: ["test@example.com"],
        subject: "Hello",
        text: "Testing some Mailgun awesomness!",
        html: "<h1>Testing some Mailgun awesomness!</h1>"
      })
      .then(msg => console.log(msg)) // logs response data
      .catch(err => console.error(err)); // logs any error
    ```

  - MIME Example:

    ```js
    mg.messages.create('sandbox-123.mailgun.org', {
        from: "Excited User <mailgun@sandbox-123.mailgun.org>",
        to: ["test@example.com"],
        subject: "Hello",
        message: "<mime encoded string here>"
      })
      .then(msg => console.log(msg)) // logs response data
      .catch(err => console.error(err)); // logs any error
    ```

  - Messages with attachments:

    - Node.js example of send file as an attachment

      ```js
        const fsPromises = require('fs').promises;
        const path = require('path');
        const filepath = path.resolve(__dirname, '../test.pdf');
        let messageParams = {
            from: "Excited User <mailgun@sandbox-123.mailgun.org>",
            to: ["test@example.com"],
            subject: "Test subject",
            text: "Hello here is a file in the attachment"
        }

        fsPromises.readFile(filepath)
        .then(data => {
          const file = {
              filename: 'test-rename.pdf',
              data
          }
          messageParams.attachment = file;
          return mg.messages.create('sandbox-123.mailgun.org', messageParams);
        })
        .then(response => {
            console.log(response);
        })
      ```
    - Node.js example of send multiple files as an attachment
      ```js
      const fsPromises = require('fs').promises;
      const path = require('path');
      const filepath = path.resolve(__dirname, '../test.pdf');
      const filepath1 = path.resolve(__dirname, '../test.jpg');

      let messageParams = {
          from: "Excited User <mailgun@sandbox-123.mailgun.org>",
          to: ["test@example.com"],
          subject: "Test subject",
          text: "Test message"
      }

      (async () =>{
          try {
              const firstFile = {
                  filename: 'test.pdf',
                  data: await fsPromises.readFile(filepath)
              }

              const secondFile = {
                  filename: 'test.jpg',
                  data: await fsPromises.readFile(filepath1)
              }

              messageParams.attachment = [firstFile, secondFile];
              const result =  await mg.messages.create('sandbox-123.mailgun.org', messageParams);
              console.log(result);
              } catch (error) {
                  console.error(error);
              }
      })()
      ```
    - Node.js example of send file as inline image
      ```js
        const fsPromises = require('fs').promises;
        const path = require('path');
        const filepath = path.resolve(__dirname, '../test.jpg');
        let messageParams = {
            from: "Excited User <mailgun@sandbox-123.mailgun.org>",
            to: ["test@example.com"],
            subject: "Test subject",
            html: '<div><img alt="image" id="1" src="cid:test.jpg"/></div> Some extra text'
        }

        fsPromises.readFile(filepath)
        .then(data => {
          const file = {
              filename: 'test.jpg',
              data
          }

          messageParams.inline = file;
          return mg.messages.create('sandbox-123.mailgun.org', messageParams);
        })
        .then(response => console.log(response))
      ```

    - Browser example of send file

      Before sending the file you need to somehow get the Blob of the file.
      Usually can get it from the onChange event of input tag with type file.
      ```js
      const handleFileSelected = async (event) => {
        const files = Array.from(event.target.files)
        const fileBuffer = await files[0];
      }
      <input type="file" onChange={handleFileSelected} name="file-uploader"/>
      ```

      Then you can use the same approach as shown above for node.js apps.
      ```js
        const file = {
          filename: 'test.pdf',
          data: fileBuffer
        };

        let messageParams = {
          from: "Excited User <mailgun@sandbox-123.mailgun.org>",
          to: ["test@example.com"],
          subject: "Test subject",
          text: "Hello here is a file in the attachment",
          attachment: file
        };

        const res = await mg.messages.create(DOMAIN, messageParams);
      ```
  Promise returns:

  ```js
  {
    id: '<20151025002517.117282.79817@sandbox-123.mailgun.org>',
    message: 'Queued. Thank you.'
  }
  ```

### Templates

  Mailgun’s templates uses a fork of the very popular template engine [handlebars](https://handlebarsjs.com/).

  To provide values for a substitution you need to use 'h:X-Mailgun-Variables' property in the message description.

  Make sure that this property is a JSON string like:
  ```js
  JSON.stringify({
    "title": "A title",
    "body": "The body"
  })
  ```

  You can find few examples of how to use templates below.
- Providing values for **title** and **slug** variables to render in template
  ```js
    ...
    const {
      title,
      slug,
    } = someDataSource;

    const mailgunData = {
      from: 'mailer@example.com>',
      to: 'recipient@example.com',
      subject: `Email ${title}`,
      template: 'name-of-the-template-you-made-in-mailgun-web-portal',
      'h:X-Mailgun-Variables': JSON.stringify({ // be sure to stringify your payload
        title,
        slug,
      }),
      'h:Reply-To': 'reply-to@example.com',
    };

    try {
      const response = await mailgun.messages.create(DOMAIN_NAME, mailgunData);
    ...
  ```

- Providing an array of objects to render them in the template
  ```JS
    ...
    const mailgunData = {
      from: 'mailer@example.com>',
      to: 'recipient@example.com',
      subject: `Email ${title}`,
      template: 'name-of-the-another-template-you-made-in-mailgun-web-portal',
      'h:X-Mailgun-Variables': JSON.stringify({
      "arrayItems": [
          {
              "question": "test_question",
              "answer": "test_answer"
          },
          {
              "question": "test_question",
              "answer": "test_answer"
          }
      ]})
    };
    try {
      const response = await mailgun.messages.create(DOMAIN_NAME, mailgunData);
    ...
  ```

### Recipient Variables

  [Docs](https://documentation.mailgun.com/en/latest/user_manual.html#batch-sending)

  Recipient Variables are custom variables that you define, which you can then reference in the message body. They give you the ability to send a custom message to each recipient while still using a single API Call.

  ```JS
  ...
  const mailgunData = {
      from: 'Example.com Mailer <mailer@mailer.example.com>',
      to: ['me@example.com', 'you@example.com'],
      subject: 'Recipient - %recipient.title%',
      html: 'Here\'s %recipient.title% and <a href="%recipient.link%">link</a>',
      'recipient-variables': JSON.stringify({
        'me@example.com': {
          title: 'Me',
          link: 'href-var',
        },
        'you@example.com': {
          title: 'You',
          link: 'slug-recipient-var-c',
        },
      }),
    };

    try {
      const response = await mailgun.messages.create(DOMAIN_NAME, mailgunData);
  ...
  ```

### Domains

- #### list

  `mg.domains.list(query)` - [api docs](https://documentation.mailgun.com/en/latest/api-domains.html)

  Example:

  ```js
  mg.domains.list()
    .then(domains => console.log(domains)) // logs array of domains
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns: array of Domain instances

  ```JS
  [{
    created_at: 'Sun, 19 Oct 2014 18:49:36 GMT',
    name: 'testing.example.com',
    receiving_dns_records: null,
    require_tls: true,
    sending_dns_records: null,
    skip_verification: true,
    smtp_login: 'postmaster@testing.example.com',
    smtp_password: 'password',
    spam_action: 'disabled',
    state: 'unverified',
    type: 'custom',
    wildcard: true
  }]
  ```

  Query data may have next properties:

  | Property | Description                                           |
  |:----------|:------------------------------------------------------|
  | limit     | Maximum number of records to return. (100 by default) |
  | skip      | Number of records to skip. (0 by default)             |

- #### get

  `mg.domains.get(domain)`

  Example:

  ```JS
  mg.domains.get('testing.example.com')
    .then(domains => console.log(domains)) // logs domain object
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns: Domain instance

  ```JS
  {
    created_at: 'Sun, 19 Oct 2014 18:49:36 GMT',
    name: 'testing.example.com',
    receiving_dns_records: [{
        "name": "testing.example.com",
        "record_type": "TXT",
        "valid": "unknown",
        "value": "v=spf1 include:mailgun.org ~all"
      },
      {
        "name": "k1._domainkey.testing.example.com",
        "record_type": "TXT",
        "valid": "unknown",
        "value": "k=rsa; 123456"
      },
      {
        "name": "email.testing.example.com",
        "record_type": "CNAME",
        "valid": "unknown",
        "value": "mailgun.org"
      }],
    require_tls: true,
    sending_dns_records: [{
        "priority": "10",
        "record_type": "MX",
        "valid": "unknown",
        "value": "mxa.mailgun.org"
      },
      {
        "priority": "10",
        "record_type": "MX",
        "valid": "unknown",
        "value": "mxb.mailgun.org"
      }],
    skip_verification: true,
    smtp_login: 'postmaster@testing.example.com',
    smtp_password: 'password',
    spam_action: 'disabled',
    state: 'unverified',
    type: 'custom',
    wildcard: true,
    id: '64a4291ebbe4ec7e1d78bc80',
    is_disabled: false,
    web_prefix: 'email',
    web_scheme: 'http'
  }
  ```

- #### create

  `mg.domains.create(data)`

  Example:

  ```js
  mg.domains.create({name: 'foobar.example.com'})
    .then(msg => console.log(msg)) // logs response data
    .catch(err => console.error(err)); // logs any error
  ```

  Create method accepts data object with next properties:

  | Parameter 	| Description 	|
  |---	|---	|
  | name 	| Name of the domain (ex. domain.com) 	|
  | smtp_password 	| Password for SMTP authentication 	|
  | spam_action 	| `disabled`, `block`, or `tag`<br>If `disabled`, no spam filtering will occur for inbound messages.<br>If `block`, inbound spam messages will not be delivered.<br>If `tag`, inbound messages will be tagged with a spam header. [Spam Filter](https://documentation.mailgun.com/en/latest/user_manual.html#um-spam-filter)<br>The default is `disabled`. 	|
  | wildcard 	| Can be string `'true'` or `'false'` or `boolean`<br>Determines whether the domain will accept email for sub-domains when sending messages.<br>The default is `false`. 	|
  | force_dkim_authority 	| Can be string `'true'` or `'false'` or `boolean`<br>If set to `true`, the domain will be the DKIM authority for itself even if the root domain is registered on the same mailgun account<br>If set to `false`, the domain will have the same DKIM authority as the root domain registered on the same mailgun account<br>The default is `false`. 	|
  | dkim_key_size 	| **1024** or **2048**<br>Set the length of your domain’s generated DKIM key<br>The default is **1024** 	|
  | ips 	| An optional, comma-separated list of IP addresses to be assigned to this domain. If not specified, all dedicated IP addresses on the account will be assigned. If the request cannot be fulfilled (e.g. a requested IP is not assigned to the account, etc), a 400 will be returned. 	|
  | pool_id 	| The id of the IP Pool that you wish to assign to the domain. The pool must contain at least 1 IP. (Note: IP Pools are only available on certain plans; see http://mailgun.com/pricing) 	|
  | web_scheme 	| String with `http` or `https`<br>Set your **open**, **click** and **unsubscribe** URLs to use `http` or `https`<br>The default is `http` 	|

  Promise returns:

  ```JS
  name: 'foobar.example.com',
  require_tls: false,
  skip_verification: false,
  state: 'unverified',
  wildcard: false,
  spam_action: 'disabled',
  created_at: 'Tue, 04 Jul 2023 14:09:18 GMT',
  smtp_password: undefined,
  smtp_login: 'postmaster@foobar.example.com',
  type: 'custom',
  receiving_dns_records: [{
      "name": "foobar.example.com",
      "record_type": "TXT",
      "valid": "unknown",
      "value": "v=spf1 include:mailgun.org ~all"
    },
    {
      "name": "k1._domainkey.foobar.example.com",
      "record_type": "TXT",
      "valid": "unknown",
      "value": "k=rsa; 123456"
    },
    {
      "name": "email.foobar.example.com",
      "record_type": "CNAME",
      "valid": "unknown",
      "value": "mailgun.org"
    }
  ],
  sending_dns_records: [{
      "priority": "10",
      "record_type": "MX",
      "valid": "unknown",
      "value": "mxa.mailgun.org"
    },
    {
      "priority": "10",
      "record_type": "MX",
      "valid": "unknown",
      "value": "mxb.mailgun.org"
  }],
  id: '64a4291ebbe4ec7e1d78bc80',
  is_disabled: false,
  web_prefix: 'email',
  web_scheme: 'http'
  ```

- #### update

  `mg.domains.update(domain, options)`

  Example:

  ```js
  mg.domains.update('foobar.example.com',{
      wildcard: 'true',
      web_scheme: 'http',
      spam_action: 'disabled',
    })
    .then(msg => console.log(msg)) // logs response data
    .catch(err => console.error(err)); // logs any error
  ```

  Update method accepts data object with next properties:

  | Property    | Description                                                                                                                                   |
  |:--------------|:----------------------------------------------------------------------------------------------------------------------------------------------|
  | spam_action   | Can be string with value `disabled`, `block`, or `tag`. If *disabled*, no spam filtering will occur for inbound messages. If `block`, inbound spam messages will not be delivered. If `tag`, inbound messages will be tagged with a spam header. See [Spam Filter](https://documentation.mailgun.com/en/latest/user_manual.html#um-spam-filter).|
  | web_scheme | Can be string with value `http` or `https`. Set your **open**, **click** and **unsubscribe** URLs to use `http` or `https`. The default is `http`|
  | wildcard   | Can be string `'true'` or `'false'` or `boolean`. Determines whether the domain will accept email for sub-domains. The default is `false`.|

  Promise returns:

  ```JS
  {
    name: 'foobar.example.com',
    require_tls: false,
    skip_verification: false,
    state: 'unverified',
    wildcard: true,
    spam_action: 'disabled',
    created_at: 'Tue, 04 Jul 2023 14:09:18 GMT',
    smtp_password: undefined,
    smtp_login: 'postmaster@foobar.example.com',
    type: 'custom',
    receiving_dns_records: [
      {
        is_active: true,
        cached: [],
        priority: '10',
        record_type: 'MX',
        valid: 'unknown',
        value: 'mxa.mailgun.org'
      },
      {
        is_active: true,
        cached: [],
        priority: '10',
        record_type: 'MX',
        valid: 'unknown',
        value: 'mxb.mailgun.org'
      }
    ],
    sending_dns_records: [
      {
        is_active: true,
        cached: [],
        name: 'foobar.example.com',
        record_type: 'TXT',
        valid: 'unknown',
        value: 'v=spf1 include:mailgun.org ~all'
      },
      {
        is_active: true,
        cached: [],
        name: 'email.foobar.example.com',
        record_type: 'CNAME',
        valid: 'unknown',
        value: 'mailgun.org'
      }
    ],
    id: '64a5880eere4eg7e1d85bc69',
    is_disabled: false,
    web_prefix: 'email',
    web_scheme: 'http'
  }
  ```

- #### destroy

  `mg.domains.destroy(domainAddress)`

  Example:

  ```JS
  mg.domains.destroy('foobar.example.com')
    .then(msg => console.log(msg)) // logs response data
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns:

  ```JS
  {
    message: "Domain has been deleted"
  }
  ```

- #### getTracking

  `mg.domains.getTracking(domainAddress)`

  Example:

  ```JS
  mg.domains.getTracking('foobar.example.com')
    .then(msg => console.log(msg)) // logs response data
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns:

  ```JS
  {
    "click": {
      "active": false
    },
    "open": {
      "active": false
    },
    "unsubscribe": {
      "active": false,
      "html_footer": "\n<br>\n<p><a href=\"%unsubscribe_url%\">unsubscribe</a></p>\n",
      "text_footer": "\n\nTo unsubscribe click: <%unsubscribe_url%>\n\n"
    }
  }
  ```

- #### updateTracking

  `mg.domains.updateTracking(domain, trackingType, data)`

  - Open Tracking Example:

    ```js
    mg.domains.updateTracking('foobar.example.com', 'open', {active: true})
      .then(msg => console.log(msg)) // logs response data
      .catch(err => console.error(err)); // logs any error
    ```

    Open tracking data object properties:

    | Property | Description                                |
    |:----------|:-------------------------------------------|
    | active    | Boolean, enables or disables open tracking |

    Promise returns:

    ```JS
    {
      message: 'Tracking settings have been updated',
      open: {
        active: true
      }
    }
    ```

  - Click Tracking Example:

    ```JS
    mg.domains.updateTracking('foobar.example.com', 'click', {active: true})
      .then(msg => console.log(msg)) // logs response data
      .catch(err => console.error(err)); // logs any error
    ```

    Click tracking data object properties:

    | Property | Description                                 |
    |:----------|:--------------------------------------------|
    | active    | Boolean, enables or disables click tracking |

    Promise returns:

    ```JS
    {
      message: 'Tracking settings have been updated',
      click: {
        active: true
      }
    }
    ```

  - Unsubscribe Tracking Example:

    ```js
    mg.domains.updateTracking('foobar.example.com', 'unsubscribe', {
        active: true,
        html_footer: "\n<br>\n<p><a href=\"%unsubscribe_url%\">unsubscribe</a></p>\n",
        text_footer: "\n\nTo unsubscribe click: <%unsubscribe_url%>\n\n"
      })
      .then(msg => console.log(msg)) // logs response data
      .catch(err => console.error(err)); // logs any error
    ```

    Unsubscribe Tracking data object properties:

    | Property   | Description                                                   |
    |:------------|:--------------------------------------------------------------|
    | active      | Boolean, enables or disables unsubscribe tracking             |
    | html_footer | string appended to html emails for managing unsubscribe links |
    | text_footer | string appended to html emails for managing unsubscribe links |

    Promise returns:

    ```JS
    {
      message: 'Tracking settings have been updated',
      "unsubscribe": {
        "active": true,
        "html_footer": "\n<br>\n<p><a href=\"%unsubscribe_url%\">unsubscribe</a></p>\n",
        "text_footer": "\n\nTo unsubscribe click: <%unsubscribe_url%>\n\n"
      }
    }
    ```

- #### getIps
    `mg.domains.getIps(domain)`

    Example:

    ```js
    mg.domains.getIps('foobar.example.com')
      .then(msg => console.log(msg)) // logs response data
      .catch(err => console.error(err)); // logs any error
    ```

    Promise returns:

    ```JS
    ["192.168.0.1", "192.168.0.2"]
    ```

- #### assignIp
  `mg.domains.assignIp(domain, ip)`

  Example:

  ```JS
  mg.domains.assignIp('foobar.example.com', "192.168.0.3")
    .then(msg => console.log(msg)) // logs response data
    .catch(err => console.error(err)); // logs any error
  ```


  ```JS
  {
    message: 'success',
    status: 200,
  }
  ```

- #### deleteIp
  `mg.domains.deleteIp(domain, ip)`

  Example:

  ```JS
  mg.domains.deleteIp('foobar.example.com', "192.168.0.3")
    .then(msg => console.log(msg)) // logs response data
    .catch(err => console.error(err)); // logs any error
  ```

  ```JS
  {
    message: 'success'
  }
  ```

### Events

- #### get

  `mg.events.get(domain, data)`

  Example:

  ```js
  mg.events.get('foobar.example.com', {
      page: 'mypageid',
      event: 'opened'
  }).then(data => console.log(data.items)) // logs array of event objects
    .catch(err => console.error(err)); // logs any error
  ```

  Options:


  | Parameter | Description                                                                                                                                                                                                                                                                     |
  |:----------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
  | page      | Fetches the specified page of log records, assuming that the URL was returned by the previous request                                                                                                                                                                           |
  | begin     | The beginning of the search time range. It can be specified as a string (see Date Format) or linux epoch seconds. Refer to Time Range for details.                                                                                                                              |
  | end       | The end of the search time range. It can be specified as a string (see Date Format) or linux epoch seconds. Refer to Time Range for details.                                                                                                                                    |
  | ascending | Defines the direction of the search time range if the range end time is not specified. Can be either yes or no. Refer to Time Range for details.                                                                                                                                |
  | limit     | Number of entries to return. (300 max)                                                                                                                                                                                                                                          |
  | **field** | **field** is the name of the *[Filter Field](https://documentation.mailgun.com/en/latest/api-events.html#filter-field)*. The value of the parameter should be a valid Filter Expression. Several field filters can be specified in one request. If the same field is mentioned, more then once, then all its filter expressions are combined with AND operator. |
  - #### Example with Date and *Filter field*
    ```js
      const date = new Date(2023, 7, 2, 0, 0, 0, 0); // Wed Aug 02 2023 00:00:00 GMT+0300
        const events = await mg.events.get('foobar.example.com', {
          begin: date.toUTCString(), // 'Tue, 01 Aug 2023 21:00:00 GMT'
          ascending: 'yes',
          limit: 5,
          event: 'delivered'
        });
    ```
  Promise returns: items (array of event objects), pages (paging keys grouped by id)

  ```JS
  {
  items: [{
      type: 'accepted',
      summary: 'got it',
      content: { more: 'data' },
      timestamp: Wed Nov 19 2014 10:32:57 GMT-0800 (PST) },
    }],
    pages: {
      first: { id: 'first', number: 'W3siYSI6IGZhbHNlLC', url: 'apiurl' },
      last: { id: 'last', number: 'W3siYSI6IGZhbHNlLC', url: 'apiurl' },
      next: { id: 'next', number: W3siYSI6IGZhbHNlLC'', url: 'apiurl' },
      previous: { id: 'previous', number: 'W3siYSI6IGZhbHNlLC', url: 'apiurl' }
    }
  }
  ```

### Stats
- #### Stats Options

    | Parameter  | Description                                                                                                                |
    |:-----------|:---------------------------------------------------------------------------------------------------------------------------|
    | event      | The type of the event. For a complete list of all events written to the log see the `Event Types` table below. (Required)  |
    | start      | The starting time. Should be in :rfc:`2822#page-14` or unix epoch format. Default: 7 days from the current time.           |
    | end        | The ending date. Should be in :rfc:`2822#page-14` or unix epoch format. Default: current time.                             |
    | resolution | Can be either ``hour``, ``day`` or ``month``. Default: ``day``                                                             |
    | duration   | Period of time with resolution encoded. If provided, overwrites the start date. See list below.                                             |

    Duration is a string that represents a period of time with some resolution. It has a format `[0-9]+[m,d,h]` where

    - `h` - an hour
    - `d` - a day
    - `m` - a month

    Examples:

    - `24h` - a period of 24 hours (a day) with hourly resolution
    - `1d` - a period of 1 day with daily resolution
    - `2m` - a period of 2 months with monthly resolution

    Event Types

    | Event Type   | Description                                                                                                                                                                       |
    |:-------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
    | accepted     | Mailgun accepted the request to send/forward the email and the message has been placed in queue.                                                                                  |
    | delivered    | Mailgun sent the email and it was accepted by the recipient email server.                                                                                                         |
    | failed       | Mailgun could not deliver the email to the recipient email server.                                                                                                                |
    | opened       | The email recipient opened the email and enabled image viewing. Open tracking must be enabled in the Mailgun control panel, and the CNAME record must be pointing to mailgun.org. |
    | clicked      | The email recipient clicked on a link in the email. Click tracking must be enabled in the Mailgun control panel, and the CNAME record must be pointing to mailgun.org.            |
    | unsubscribed | The email recipient clicked on the unsubscribe link. Unsubscribe tracking must be enabled in the Mailgun control panel.                                                           |
    | complained   | The email recipient clicked on the spam complaint button within their email client. Feedback loops enable the notification to be received by Mailgun.                             |
    | stored       | Mailgun has stored an incoming message

- #### getDomain

  `mg.stats.getDomain(domain, query)`

  Example:

  ```js
  mg.stats.getDomain('foobar.example.com', {event: ['delivered', 'accepted', 'failed', 'complained']})
    .then(msg => console.log(msg)) // logs response data
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns:

  ```JS
  {
    start: Sun Mar 15 2015 17:00:00 GMT-0700 (PDT),
    end: Sun Mar 22 2015 17:00:00 GMT-0700 (PDT),
    resolution: 'day',
    stats: [{
      time: Sun Mar 15 2015 17:00:00 GMT-0700 (PDT),
      delivered: { smtp: 2, http: 1, total: 3 }
    }]
  }
  ```

- #### getAccount

  `mg.stats.getDomain(domain, query)`

  Example:

  ```js
  mg.stats.getDomain('foobar.example.com', {event: ['delivered', 'accepted', 'failed', 'complained']})
    .then(msg => console.log(msg)) // logs response data
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns:

  ```JS
  {
    start: Sun Mar 15 2015 17:00:00 GMT-0700 (PDT),
    end: Sun Mar 22 2015 17:00:00 GMT-0700 (PDT),
    resolution: 'day',
    stats: [{
      time: Sun Mar 15 2015 17:00:00 GMT-0700 (PDT),
      delivered: { smtp: 2, http: 1, total: 3 }
    }]
  }
  ```


  ```

### Metrics
  Mailgun collects many different events and generates event metrics which are available in your Control Panel. This data is also available via our analytics metrics [API endpoint](https://documentation.mailgun.com/docs/mailgun/api-reference/openapi-final/tag/Metrics/#tag/Metrics).

- #### getAccount
  Gets filtered metrics for an account

  `mg.metrics.getAccount(MetricsQuery);`

  Example:
  ```JS
    mg.metrics.getAccount({
      start: '2024-12-16T10:47:51.661Z',
      end: '2024-12-23T10:47:51.661Z',
      resolution: 'hour',
      metrics: ['opened_count'],
      filter: {
        AND: [{
          attribute: 'domain',
          comparator: 'contains',
          values: [{
            value: 'mailgun'
          }]
        }]
      },
      include_subaccounts: true,
      include_aggregates: true
    })
    .then(data => console.log(data)) // logs response data
    .catch(err => console.error(err)); //logs any error
  ```
  *getAccount* method accepts data object with next properties:
  | Property    | Type |Description                                                                                                                                   |
  |:--------------|:-----|:-----------------------------------------------------------------------------------------------------------------------------------|
  | start      | String that contains date in RFC 2822 format: https://datatracker.ietf.org/doc/html/rfc2822.html#page-14 or JS Date object | A start date (default: 7 days before current time)|
  | end        | String that contains date in RFC 2822 format: https://datatracker.ietf.org/doc/html/rfc2822.html#page-14 or JS Date object | An end date (default: current time)|
  | resolution | String | A resolution in the format of 'day' 'hour' 'month'. Default is day.|
  | duration   | String | A duration in the format of '1d' '2h' '2m'. If duration is provided then it is calculated from the end date and overwrites the start date.|
  | dimensions | Array of strings | Attributes of the metric data such as 'subaccount'.|
  | metrics    | Array of strings | Name of the metrics to receive the stats for such as 'processed_count'.|
  | filter    | object | Filters to apply to the query. The 'AND' property is required and should contains array of filters objects. See this [document](https://documentation.mailgun.com/docs/mailgun/api-reference/openapi-final/tag/Metrics/#tag/Metrics/operation/api.(*MetricsAPI).PostMetricQuery-fm-3!path=filter&t=request) for an object shape. |
  | include_subaccounts | Boolean | Include stats from all subaccounts. |
  | include_aggregates  | Boolean | Include top-level aggregate metrics.|

  Promise returns: MetricsResult

  ```JS
  {
    start: new Date('2024-12-16T01:00:00.000Z'),
    end: new Date('2024-12-23T00:00:00.000Z'),
    resolution: 'hour',
    dimensions: [ 'time' ],
    pagination: { sort: '', skip: 0, limit: 1500, total: 1 },
    items: [
      {
        dimensions: [{
          {
            dimension: 'time',
            value: 'Sat, 21 Dec 2024 17:00:00 +0000',
            display_value: 'Sat, 21 Dec 2024 17:00:00 +0000'
          }
        }],
        metrics: { opened_count: 1 }
      },
      ...
    ],
    aggregates: { metrics: { opened_count: 1 } },
    status: 200
  }
  ```

- #### getAccountUsage
  Gets filtered **usage metrics** for an account
  `mg.metrics.getAccountUsage(MetricsQuery);`

  Example:
  ```JS
    mg.metrics.getAccountUsage({
      start: '2024-12-16T10:47:51.661Z',
      end: '2024-12-23T10:47:51.661Z',
      resolution: 'hour',
      metrics: ['opened_count'],
      filter: {
        AND: [{
          attribute: 'domain',
          comparator: 'contains',
          values: [{
            value: 'mailgun'
          }]
        }]
      },
      include_subaccounts: true,
      include_aggregates: true
    })
    .then(data => console.log(data)) // logs response data
    .catch(err => console.error(err)); //logs any error
  ```
  *getAccountUsage* method accepts data object with next properties:
  | Property    | Type |Description                                                                                                                                   |
  |:--------------|:-----|:-----------------------------------------------------------------------------------------------------------------------------------|
  | start      | String that contains date in RFC 2822 format: https://datatracker.ietf.org/doc/html/rfc2822.html#page-14 or JS Date object | A start date (default: 7 days before current time)|
  | end        | String that contains date in RFC 2822 format: https://datatracker.ietf.org/doc/html/rfc2822.html#page-14 or JS Date object | An end date (default: current time)|
  | resolution | String | A resolution in the format of 'day' 'hour' 'month'. Default is day.|
  | duration   | String | A duration in the format of '1d' '2h' '2m'. If duration is provided then it is calculated from the end date and overwrites the start date.|
  | dimensions | Array of strings | Attributes of the metric data such as 'subaccount'.|
  | metrics    | Array of strings | Name of the metrics to receive the stats for such as 'processed_count'.|
  | filter    | object | Filters to apply to the query. The 'AND' property is required and should contains array of filters objects. See this [document](https://documentation.mailgun.com/docs/mailgun/api-reference/openapi-final/tag/Metrics/#tag/Metrics/operation/api.(*MetricsAPI).PostMetricQuery-fm-3!path=filter&t=request) for an object shape. |
  | include_subaccounts | Boolean | Include stats from all subaccounts. |
  | include_aggregates  | Boolean | Include top-level aggregate metrics.|

  Promise returns: MetricsResult

  ```JS
  {
    start: new Date('2024-12-16T01:00:00.000Z'),
    end: new Date('2024-12-23T00:00:00.000Z'),
    resolution: 'hour',
    dimensions: [ 'time' ],
    pagination: { sort: '', skip: 0, limit: 1500, total: 1 },
    items: [
      {
        dimensions: [{
          {
            dimension: 'time',
            value: 'Sat, 21 Dec 2024 17:00:00 +0000',
            display_value: 'Sat, 21 Dec 2024 17:00:00 +0000'
          }
        }],
        metrics: { opened_count: 1 }
      },
      ...
    ],
    aggregates: { metrics: { opened_count: 1 } },
    status: 200
  }
  ```

### Suppressions

- #### list

  `mg.suppressions.list(domain, suppressionType, query?)`

  - #### Bounces Example:

    ```js
    mg.suppressions.list('foobar.example.com', 'bounces')
      .then(msg => console.log(msg)) // logs response data
      .catch(err => console.error(err)); // logs any error
    ```

  - #### Unsubscribes Example:

    ```js
    mg.suppressions.list('foobar.example.com', 'unsubscribes')
      .then(msg => console.log(msg)) // logs response data
      .catch(err => console.error(err)); // logs any error
    ```

  - #### Complaints Example:

    ```js
    mg.suppressions.list('foobar.example.com', 'complaints')
      .then(msg => console.log(msg)) // logs response data
      .catch(err => console.error(err)); // logs any error
    ```

    Promise returns:

    ```JS
    {
    items: [
      {
        type: "bounces",
        address: "unknown@unknown.com",
        code: 550,
        error: "No such mailbox",
        created_at: Fri Oct 21 2011 04:02:55 GMT-0700 (PDT)
      }],
    pages: {
      first: { id: "first", page: "", address: "", url: "apiurl" },
      last: { id: "last", page: "", address: "", url: "apiurl" },
      next: { id: "next", page: "", address: "", url: "apiurl" },
      previous: { id: "prev", page: "", address: "", url: "apiurl" }
    }
    }
    ```

- #### get

  `mg.suppressions.get(domain, suppressionType, address)`

  - #### Bounces Example:

    ```js
    mg.suppressions.get('foobar.example.com', 'bounces', 'address@example.com')
      .then(msg => console.log(msg)) // logs response data
      .catch(err => console.error(err)); // logs any error
    ```

  - #### Unsubscribes Example:

    ```js
    mg.suppressions.get('foobar.example.com', 'unsubscribes', 'address@example.com')
      .then(msg => console.log(msg)) // logs response data
      .catch(err => console.error(err)); // logs any error
    ```

  - #### Complaints Example:

    ```js
    mg.suppressions.get('foobar.example.com', 'complaints', 'address@example.com')
      .then(msg => console.log(msg)) // logs response data
      .catch(err => console.error(err)); // logs any error
    ```

  Response example:

  ```JS
  {
    type: "bounces",
    address: "address?@unknown.com",
    tags: [ "*" ],
    created_at: Fri Oct 21 2011 05:02:55 GMT-0700 (PDT)
  }
  ```

-   #### create
    `mg.suppressions.create(domain, suppressionType, data || data[])`

    - #### Bounces Example:
      ```JS
      mg.suppressions.create('foobar.example.com', 'bounces', [{address: 'bob@example.com'}])
        .then(msg => console.log(msg)) // logs response data
        .catch(err => console.error(err)); // logs any error
      ```

      Bounces Options: Contains an array with the following object properties

      | Parameter  | Description                                                                     |
      |:-----------|:--------------------------------------------------------------------------------|
      | address    | Valid email address                                                             |
      | code       | Error code (optional, default: 550)                                             |
      | error      | Error description (optional, default: empty string)                             |
      | created_at | Timestamp of a bounce event in RFC2822 format (optional, default: current time) |

      Promise returns:

      ```js
      {
        message: "1 address has been added to the bounces table"
      }
      ```

    - #### Unsubscribes Example:

      ```js
      mg.suppressions.create('foobar.example.com', 'unsubscribes', {address: 'bob@example.com'})
        .then(msg => console.log(msg)) // logs response data
        .catch(err => console.error(err)); // logs any error
      ```

      Unsubscribes Options: Contains an array with the following object properties

      | Parameter  | Description                                                                                                      |
      |:-----------|:-----------------------------------------------------------------------------------------------------------------|
      | address    | Valid email address                                                                                              |
      | tag        | Tag to unsubscribe from, use * to unsubscribe an address from all domain’s correspondence (optional, default: *) |
      | tags       | Array with tags to unsubscribe from |
      | created_at | Timestamp of a bounce event in RFC2822 format (optional, default: current time)                                  |

      Promise returns:

      ```JS
      {
        message: "1 address has been added to the unsubscribes table"
      }
      ```
       - #### Unsubscribe from one tag
          ```js
          mg.suppressions.create('foobar.example.com', 'unsubscribes', {address: 'bob@example.com', tag: 'your_tag_to_unsubscribe']})
            .then(msg => console.log(msg)) // logs response data
            .catch(err => console.error(err)); // logs any error
          ```
          Promise returns:

          ```JS
          {
            message: "1 address has been added to the unsubscribes table"
          }
          ```
      - #### Unsubscribe from particular tags
          ```js
          mg.suppressions.create('foobar.example.com', 'unsubscribes', [{address: 'bob@example.com', tags: ['your_tag_to_unsubscribe', 'another_tag_to_unsubscribe']}])
            .then(msg => console.log(msg)) // logs response data
            .catch(err => console.error(err)); // logs any error
          ```
          Promise returns:

          ```JS
          {
            message: "1 address has been added to the unsubscribes table"
          }
          ```

    - #### Complaints Example:

      ```js
      mg.suppressions.create('foobar.example.com', 'complaints', [{address: 'bob@example.com'}])
        .then(msg => console.log(msg)) // logs response data
        .catch(err => console.error(err)); // logs any error
      ```

      Complaints Options: Contains an array with the following object properties

      | Parameter  | Description                                                                                                      |
      |:-----------|:-----------------------------------------------------------------------------------------------------------------|
      | address    | Valid email address                                                                                              |
      | created_at | Timestamp of a bounce event in RFC2822 format (optional, default: current time)                                  |

      Promise returns:

      ```JS
      {
        message: "1 address has been added to the complaints table"
      }
      ```

-   #### destroy
    `mg.suppressions.destroy(domain, suppressionType, address)`

    - #### Bounces Example:

      ```JS
      mg.suppressions.destroy('foobar.example.com', 'bounces', 'bob@example.com')
        .then(msg => console.log(msg)) // logs response data
        .catch(err => console.error(err)); // logs any error
      ```

      Promise returns:

      ```JS
      {
        message: "Bounced address has been removed",
        value: "",
        address: "bob@example.com",
        status: 200
      }
      ```

    - #### Unsubscribes Example:

      ```js
      mg.suppressions.destroy('foobar.example.com', 'unsubscribes', 'bob@example.com')
        .then(msg => console.log(msg)) // logs response data
        .catch(err => console.error(err)); // logs any error
      ```

      Promise returns:

      ```JS
      {
        message: 'Unsubscribe event has been removed',
        value: '',
        address: 'bob@example.com',
        status: 200
      }
      ```

    - #### Complaints Example:

      ```js
      mg.suppressions.destroy('foobar.example.com', 'complaints', 'bob@example.com')
        .then(msg => console.log(msg)) // logs response data
        .catch(err => console.error(err)); // logs any error
      ```

      Promise returns:

      ```JS
        message: 'Spam complaint has been removed',
        value: '',
        address: 'bob@example.com',
        status: 200
      ```


### Webhooks

- #### list

  `mg.webhooks.list(domain, query)`

  Example:

  ```js
  mg.webhooks.list('foobar.example.com')
    .then(msg => console.log(msg)) // logs response data
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns:

  ```JS
  {
    open: { 'url': 'http://requestb.in' },
    click: { 'url': 'http://requestb.in' },
    bounce: { 'url': 'http://requestb.in' },
    deliver: { 'url': 'http://requestb.in' },
    drop: { 'url': 'http://requestb.in' },
    spam: { 'url': 'http://requestb.in' },
    unsubscribe: { 'url': 'http://requestb.in' },
    click: { 'url': 'http://requestb.in' },
    open: { 'url': 'http://requestb.in' },
  }
  ```

- #### get

  `mg.webhooks.get(domain, id)`

  Example:

  ```js
  mg.webhooks.get('foobar.example.com', 'open') // bounce, deliver, drop, spam, unsubscribe, click, open
    .then(msg => console.log(msg)) // logs response data
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns:

  ```JS
  {
    'open': { 'url': 'http://requestb.in', 'urls': ['trackclick.com'] }
  }
  ```

- #### create

  `mg.webhooks.create(domain, id, data, test)`

  Example:

  ```js
  mg.webhooks.create('foobar.example.com', 'open', 'http://requestb.in') // bounce, deliver, drop, spam, unsubscribe, click, open
    .then(msg => console.log(msg)) // logs response data
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns:

  ```JS
  {
    'open': { 'url': 'http://requestb.in', 'urls': ['http://requestb.in'] }
  }
  ```

  Test Webhook Example:

  ```JS
  mg.webhooks.get('foobar.example.com', 'open', 'http://requestb.in', true) // bounce, deliver, drop, spam, unsubscribe, click, open
    .then(msg => console.log(msg)) // logs response data
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns:

  ```JS
  {
    'code': '500',
    'message': 'Hi!'
  }
  ```

- #### update

  `mg.webhooks.update(domain, id, url, test)`

  Example:

  ```js
  mg.webhooks.update('foobar.example.com', 'open', 'http://requestb.in') // bounce, deliver, drop, spam, unsubscribe, click, open
    .then(msg => console.log(msg)) // logs response data
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns:

  ```JS
  {
    'open': { 'url': 'http://requestb.in', 'urls': ['http://requestb.in'] }
  }
  ```

  ```js
  mg.webhooks.update('foobar.example.com', 'open', ['http://requestb.in', 'http://requestb1.in' ]) // bounce, deliver, drop, spam, unsubscribe, click, open
    .then(msg => console.log(msg)) // logs response data
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns:
  ```JS
  {
    'open': { 'url': 'http://requestb.in', 'urls': ['http://requestb.in', 'http://requestb1.in'] }
  }
  ```


- #### destroy

  `mg.webhooks.destroy(domain, id)`

  Example:

  ```JS
  mg.webhooks.update('foobar.example.com', 'open') // bounce, deliver, drop, spam, unsubscribe, click, open
    .then(msg => console.log(msg)) // logs response data
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns:

  ```JS
  {
    'open': { 'url': 'http://requestb.in', 'urls': ['http://requestb.in']}
  }
  ```

### Routes

- #### list

  `mg.routes.list(query)`

  Example:

  ```JS
  mg.routes.list()
    .then(data => console.log(data)) // logs response body
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns:

  ```JS
  [
    {
      actions: [ 'forward("http://myhost.com/messages/")', 'stop()' ],
      created_at: 'Mon, 26 Oct 2015 03:56:51 GMT',
      description: 'sample',
      expression: 'match_recipient(".*@example.com")',
      id: '562da483125730608a7d1719',
      priority: 0
    }
  ]
  ```

- #### get

  `mg.routes.get(id)`

  Example:

  ```js
  mg.routes.get('562da483125730608a7d1719')
    .then(data => console.log(data)) // logs response body
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns: response body

  ```JS
  {
    actions: [ 'forward("http://myhost.com/messages/")', 'stop()' ],
    created_at: 'Mon, 26 Oct 2015 03:56:51 GMT',
    description: 'sample',
    expression: 'match_recipient(".*@example.com")',
    id: '562da483125730608a7d1719',
    priority: 0
  }
  ```

- #### create

  `mg.routes.create(options)`

  Example:

  ```JS
  mg.routes.create({
      priority: 0,
      description: 'sample',
      expression: 'match_recipient(".*@example.org")',
      action: ['forward("http://myhost.com/messages/")', 'stop()']
    })
    .then(data => console.log(data)) // logs response body
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns: response body

  ```js
  {
    actions: [ 'forward("http://myhost.com/messages/")', 'stop()' ],
    created_at: 'Mon, 26 Oct 2015 03:56:51 GMT',
    description: 'sample',
    expression: 'match_recipient(".*@example.com")',
    id: '562da483125730608a7d1719',
    priority: 0
  }
  ```

- #### update

  `mg.routes.update(id, options)`

  Example:

  ```JS
  mg.routes.update('562da483125730608a7d1719', {
      priority: 0,
      description: 'sample',
      expression: 'match_recipient(".*@example.org")',
      action: ['forward("http://myhost.com/messages/")', 'stop()']
    })
    .then(data => console.log(data)) // logs response body
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns: response body

  ```JS
  {
    actions: [ 'forward("http://myhost.com/messages/")', 'stop()' ],
    created_at: 'Mon, 26 Oct 2015 03:56:51 GMT',
    description: 'sample',
    expression: 'match_recipient(".*@example.com")',
    id: '562da483125730608a7d1719',
    message: 'Route has been updated',
    priority: 0
  }
  ```

- #### destroy

  `mg.routes.destroy(id)`

  Example:

  ```js
  mg.routes.destroy('562da483125730608a7d1719')
    .then(data => console.log(data)) // logs response body
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns: response body

  ```JS
  {
    id: '562da483125730608a7d1719',
    message: 'Route has been deleted'
  }
  ```

### Validation

- #### get

  `mg.validate.get(address)`

  Example:

  ```JS
  mg.validate.get('foo@mailgun.net')
    .then(data => console.log(data)) // logs response body
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns: response body

  ```JS
  {
    address: 'alice@example.com',
    did_you_mean: null,
    is_valid: false,
    parts: {
       display_name: null,
        domain: null,
        local_part: null
    }
  }
  ```

### Multiple validation
https://documentation.mailgun.com/en/latest/api-email-validation.html#email-validation
- #### create
  `mg.validate.multipleValidation.create('name_of_the_list', { file })`

  ```js
  const fsPromises = require('fs').promises;
  const filepath = path.resolve(__dirname, '../path_to_your_file_with_emails_list.csv');

  ...

  (async () => {
    try {
      const file = {
        filename: 'test.csv',
        data: await fsPromises.readFile(filepath)
      };

      const validateBulkResult = await mg.validate.multipleValidation.create('name_of_the_list', { file });
      console.log('validateBulkResult', validateBulkResult);
    } catch (error) {
      console.error(error);
    }
  })();
  ```

  Response shape:
  ```JSON
  {
    "id": "name_of_the_list",
    "message": "The validation job was submitted."
  }
  ```

- #### list

  `mg.validate.multipleValidation.list()`

  ```js
  mg.validate.multipleValidation.list()
    .then(data => console.log(data)) // logs response body
    .catch(err => console.error(err)); // logs any error
  ```

  Response shape:
  ```JSON
  {
    "jobs": [
      {
        "created_at": 1643965937,
        "download_url": {
          "csv": "csv-url",
          "json": "json-url"
        },
        "id": "name_of_the_list",
        "quantity": 40,
        "records_processed": 40,
        "status": "uploaded",
        "summary": {
          "result": {
            "catch_all": 0,
            "deliverable": 0,
            "do_not_send": 0,
            "undeliverable": 0,
            "unknown": 40
          },
          "risk": { "high": 0, "low": 0, "medium": 0, "unknown": 40 }
        }
      }
    ],
    "paging": {
      "first": "https://api.mailgun.net/v4/address/validate/bulk?limit=100&page=first&pivot=",
      "last": "https://api.mailgun.net/v4/address/validate/bulk?limit=100&page=last&pivot=",
      "next": "https://api.mailgun.net/v4/address/validate/bulk?limit=100&page=next&pivot=b4808b5b-1111-2222-3333-6cd0b63f41ea",
      "prev": "https://api.mailgun.net/v4/address/validate/bulk?limit=100&page=prev&pivot="
    },
    "total": 1
  }
  ```

- #### get

  `mg.validate.multipleValidation.get('name_of_the_list')`

  ```js
  mg.validate.multipleValidation.get('name_of_the_list')
    .then(data => console.log(data)) // logs response body
    .catch(err => console.error(err)); // logs any error
  ```

  Response shape:
  ```JSON
  {
    "created_at": 1643965937,
    "download_url": {
      "csv": "csv-url",
      "json": "json-url"
    },
    "id": "name_of_the_list",
    "quantity": 40,
    "records_processed": 40,
    "responseStatusCode": 200,
    "status": "uploaded",
    "summary": {
      "result": {
        "catch_all": 0,
        "deliverable": 0,
        "do_not_send": 0,
        "undeliverable": 0,
        "unknown": 40
      },
      "risk": { "high": 0, "low": 0, "medium": 0, "unknown": 40 }
    }
  }
  ```

- #### destroy

  `mg.validate.multipleValidation.destroy('name_of_the_list');`

  cancels bulk validation job
  ```JS
  mg.validate.multipleValidation.destroy('name_of_the_list');
    .then(data => console.log(data)) // logs response body
    .catch(err => console.error(err)); // logs any error
  ```

  Response shape:
  ```JS
  {
    body: "Validation job canceled.",
    status: 200
  }
  ```

### Mailing lists

  A client to manage mailing lists.

- #### list

  `mg.lists.list()`

  Example:

  ```js
  mg.lists.list()
    .then(data => console.log(data)) // logs response body
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns: response body

  ```JS
  [
    {
      access_level: 'readonly',
      address: 'noreply@sample.com',
      created_at: 'Wed, 27 Oct 2021 21:59:21 -0000',
      description: '',
      members_count: 0,
      name: '',
      reply_preference: 'list'
    }
  ]
  ```

- #### get

  `mg.lists.get(mailListAddress)`

  Example:

  ```JS
  mg.lists.get('noreply@sample.com')
    .then(data => console.log(data)) // logs response body
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns:

  ```JS
  {
    access_level: 'readonly',
    address: 'noreply@sample.com',
    created_at: 'Thu, 28 Oct 2021 00:16:56 -0000',
    description: '',
    members_count: 0,
    name: '',
    reply_preference: 'list'
  }
  ```

- #### create

  `mg.lists.create(data)`

  Example:

  ```js
  mg.lists.create({
      address: 'reply@sample.com',
      name: 'Reply Address', // optional, modifiable on website
      description: 'Mailing lists for repliable address', // optional, modifiable on website
      access_level: 'readonly', // optional, modifiable on website
      reply_preference: 'list', // optional, modifiable on website
    })
    .then(data => console.log(data)) // logs response body
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns:

  ```JS
  {
    access_level: 'readonly',
    address: 'reply@sample.com',
    created_at: 'Thu, 28 Oct 2021 03:12:17 -0000',
    description: 'Mailing lists for repliable address',
    members_count: 0,
    name: 'Reply Address',
    reply_preference: 'list'
  }
  ```

- #### update

  `mg.lists.update(mailListAddress)`

  Example:

  ```js
  mg.lists.update('reply@sample.com', {
      address: 'foo@sample.com',
      name: 'Foo', // optional, modifiable on website
      description: 'Foo bar bat', // optional, modifiable on website
      access_level: 'members', // optional, modifiable on website
      reply_preference: 'sender', // optional, modifiable on website
    })
    .then(data => console.log(data)) // logs response body
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns:

  ```JS
  {
    access_level: 'members',
    address: 'foo@sample.com',
    created_at: 'Thu, 28 Oct 2021 03:21:15 -0000',
    description: 'Foo bar bat',
    members_count: 0,
    name: 'Foo',
    reply_preference: 'sender'
  }
  ```

- #### destroy

  `mg.lists.destroy(mailListAddress)`

  Example:

  ```js
  mg.lists.destroy('foo@sample.com')
    .then(data => console.log(data)) // logs response body
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns: response body

  ```JS
  {
    address: 'foo@sample.com',
    message: 'Mailing list has been removed'
  }
  ```

### Mailing list members
A client to manage members within a specific mailing list.

- #### listMembers

  `mg.lists.members.listMembers(mailListAddress)`

  Example:

  ```js
  mg.lists.members.listMembers('reply@sample.com')
    .then(data => console.log(data)) // logs response body
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns:

  ```JS
  [
    {
      address: 'foo@bar.com',
      name: 'Jane Doe',
      subscribed: true,
      vars: { age: 50 }
    }
  ]
  ```

- #### getMember
  `mg.lists.members.getMember(mailListAddress, mailListMemberAddress)`

  Example:

  ```JS
  mg.lists.members.getMember('reply@sample.com', 'foo@bar.com')
    .then(data => console.log(data)) // logs response body
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns:

  ```JS
  {
    address: 'foo@bar.com',
    name: 'Jane Doe',
    subscribed: true,
    vars: { age: 50 }
  }
  ```

- #### createMember
  `mg.lists.members.createMember(mailListAddress, data)`

  Example:

  ```JS
  mg.lists.members.createMember('reply@sample.com', {
      address: 'bat@bar.com',
      name: 'John Smith', // optional, modifiable on website
      vars: {hobby: "chess"}, // optional, modifiable on website
      subscribed: 'no', // optional, modifiable on website
      upsert: 'yes', // optional, choose yes to insert if not exist, or update it exist
    })
    .then(data => console.log(data)) // logs response body
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns: response body

  ```JS
  {
    address: 'bat@bar.com',
    name: 'John Smith',
    subscribed: false,
    vars: { hobby: 'chess' }
  }
  ```

- #### createMembers
  `mg.lists.members.createMembers(mailListAddress, data)`

  Example:

  ```JS
  mg.lists.members.createMembers('reply@sample.com', {
      members: [
        {
          address: "bot1@foobar.com",
          name: "Bot1 Superbot",
          vars: {location: "loc1"},
          subscribed: true,
        },
        {
          address: "bot2@foobar.com",
          name: "Bot2 Superbot",
          vars: {location: "loc2"},
          subscribed: false,
        },
      ],
      upsert: "yes",
    })
    .then(data => console.log(data)) // logs response body
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns:

  ```JS
  {
    list: {
      access_level: 'readonly',
      address: 'reply@sample.com',
      created_at: 'Thu, 28 Oct 2021 03:21:15 -0000',
      description: 'For reply purpose',
      members_count: 2,
      name: 'Reply',
      reply_preference: 'list'
    },
    message: 'Mailing list has been updated',
    'task-id': '575b943c37a211ec8a520242ac11000a'
  }
  ```

- #### updateMember

  `mg.lists.members.updateMember(mailListAddress, mailListMemberAddress, data)`

  Example:

  ```JS
  mg.lists.members.updateMember('reply@sample.com', 'bot1@foobar.com', {
      address: 'bot0@barfoo.com',
      name: 'Bot0 Normalbot', // optional, modifiable on website
      vars: {location: "space"},
      subscribed: false,
    })
    .then(data => console.log(data)) // logs response body
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns: response body

  ```JS
  {
    address: 'bot0@barfoo.com',
    name: 'Bot0 Normalbot',
    subscribed: false,
    vars: { location: 'space' }
  }
  ```

- #### destroyMember

  `mg.lists.members.destroyMember(mailListAddress, mailListMemberAddress)`

  Example:

  ```JS
  mg.lists.members.destroyMember('reply@sample.com', 'bot2@foobar.com')
    .then(data => console.log(data)) // logs response body
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns: response body

  ```JS
  {
    member: { address: 'bot2@foobar.com' },
    message: 'Mailing list member has been deleted'
  }
  ```
### Subaccounts

  A client to manage subaccounts.

- #### list

  `mg.subaccounts.list(query)` - [api docs](https://documentation.mailgun.com/en/latest/subaccounts.html)

  Example:

  ```js
  mg.subaccounts.list()
    .then(subaccounts => console.log(subaccounts)) // logs array of subaccounts
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns: array of Subaccounts instances

  ```JS
  [
    { id: "XYZ", name: "test.subaccount1", status: "open" },
    { id: "YYY", name: "test.subaccount2", status: "open" }
  ]
  ```

  Query data may have next properties:

  | Property | Description                                                            |
  |:---------|:-----------------------------------------------------------------------|
  | limit    | Maximum number of records to return. (10 by default)                   |
  | skip     | Number of records to skip. (0 by default)                              |
  | sort     | "asc" or "desc".                                                       |
  | enabled  | Returns all enabled/disabled subaccounts. (Defaults to all if omitted) |

- #### get

  `mg.subaccounts.get(subaccount_id)`

  Example:

  ```JS
  mg.subaccounts.get('123')
    .then(subaccount => console.log(subaccount)) // logs subaccount object
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns: Subaccount instance

  ```JS
  { id: "123", name: "test.subaccount1", status: "open" }
  ```

- #### create

  `mg.subaccounts.create(name)`

  Example:

  ```js
  mg.subaccounts.create('foobar')
    .then(msg => console.log(msg)) // logs response data
    .catch(err => console.error(err)); // logs any error
  ```

  Promise returns: Subaccount instance

  ```JS
  { id: "123", name: "foobar", status: "open" }
  ```

  Create method accepts data object with next properties:

  | Parameter 	 | Description 	                                             |
  |-------------|-----------------------------------------------------------|
  | name 	     | Name of the subaccount being created (ex. 'mysubaccount') 	 |

- #### enable

  `mg.subaccounts.enable(subaccount_id)`

  Example:

  ```js
  mg.subaccounts.enable('123')
    .then(msg => console.log(msg)) // logs response data
    .catch(err => console.error(err)); // logs any error
  ```
  Promise returns: Subaccount instance

  ```JS
  { id: "123", name: "foobar", status: "open" }
  ```

- #### disable

  `mg.subaccounts.disable(subaccount_id)`

  Example:

  ```js
  mg.subaccounts.disable('123')
    .then(msg => console.log(msg)) // logs response data
    .catch(err => console.error(err)); // logs any error
  ```
  Promise returns: Subaccount instance

  ```JS
  { id: "123", name: "foobar", status: "disabled" }
  ```


### Inbox Placements
  A client to allows you to see the likely deliverability of your email campaigns.
- #### SeedsLists

  - #### list
    `mg.inboxPlacements.seedsLists.list()`

      Example:

      ```JS
      mg.inboxPlacements.seedsLists.list()
      .then(data => console.log(data)) // logs response data
      .catch(err => console.error(err)); //logs any error
      ```

      Promise returns: available SeedsLists
      ```JS
      {
        status: 200,
        items: [
          {
            kid: 'kid',
            ID: 'ID',
            AccountID: 'AccountID',
            created_at: new Date('2024-08-09T14:32:57.183Z'),
            updated_at: new Date('2024-08-09T14:33:57.183Z'),
            last_result_at: new Date('2024-08-09T14:32:57.183Z'),
            Seeds: [
              {
                AccountID: 'acount id',
                id: 'seed id',
                token: 'token',
                email: 'email',
                provider: 'provider',
                sync_state: 'sync_state',
                local_state: 'local_state',
                created_at: new Date('2024-08-09T14:32:57.183Z'),
                updated_at: new Date('2024-08-09T14:32:57.183Z'),
                message_count: 0,
                max_email_count_hit_at: new Date('2024-08-09T14:32:57.183Z'),
                total_msgs: 0,
                matched_msgs: 0,
                spam_message: 0,
                expected_msgs: 0,
                last_sent_to_at: new Date('2024-08-09T14:32:57.183Z'),
                last_delivered_at: new Date('2024-08-09T14:32:57.183Z'),
                account_quality: 0,
                quality_label: 'quality_label',
                password: 'password',
                phone_number: 'phone_number',
                attributes: {},
                totp: {
                  secret: 'secret',
                }
              },
              ...
            ],
            target_email: 'test_email@test.com',
            sending_domains: ['test_domain.com'],
            has_results: true,
            name: 'test name',
            seed_filter: 'test filter',
            mailing_list: 'test mailing_list',
            CreatedTS: 1723214101728,
            tags: {
              sfmc_remote_id: 'test sfmc_remote_id',
            },
            delivery_stats: {
              all: {
                delivered: 0,
                missing: 0,
                pending: 0,
                spam: 0,
                inbox: 0,
                total: 0,
                provider: 'test provider',
                categories: {
                  primary: 0,
                  promotions: 0,
                  updates: 0,
                }
              }
            },
            SeedQuality: 1,
            is_auto_generated: true,
          },
          ...
        ],
        paging: {
          first: 'first_page_link',
          last: 'last_page_link',
          next: 'next_page_link',
          previous: 'previous_page_link',
        }
      }
      ```

  - #### get
    `mg.inboxPlacements.seedsLists.get(seedsListId)`

    Example:

    ```JS
    mg.inboxPlacements.seedsLists.get(seedsListId);
    .then(data => console.log(data)) // logs response data
    .catch(err => console.error(err)); //logs any error
    ```

    Promise returns: SeedsLists item by id
    ```JS
    {
      status: 200,
      kid: 'kid',
      ID: 'ID',
      AccountID: 'AccountID',
      created_at: new Date('2024-08-09T14:32:57.183Z'),
      updated_at: new Date('2024-08-09T14:33:57.183Z'),
      last_result_at: new Date('2024-08-09T14:32:57.183Z'),
      Seeds: [
        {
          AccountID: 'acount id',
          id: 'seed id',
          token: 'token',
          email: 'email',
          provider: 'provider',
          sync_state: 'sync_state',
          local_state: 'local_state',
          created_at: new Date('2024-08-09T14:32:57.183Z'),
          updated_at: new Date('2024-08-09T14:32:57.183Z'),
          message_count: 0,
          max_email_count_hit_at: new Date('2024-08-09T14:32:57.183Z'),
          total_msgs: 0,
          matched_msgs: 0,
          spam_message: 0,
          expected_msgs: 0,
          last_sent_to_at: new Date('2024-08-09T14:32:57.183Z'),
          last_delivered_at: new Date('2024-08-09T14:32:57.183Z'),
          account_quality: 0,
          quality_label: 'quality_label',
          password: 'password',
          phone_number: 'phone_number',
          attributes: {},
          totp: {
            secret: 'secret',
          }
        },
        ...
      ],
      target_email: 'test_email@test.com',
      sending_domains: ['test_domain.com'],
      has_results: true,
      name: 'test name',
      seed_filter: 'test filter',
      mailing_list: 'test mailing_list',
      CreatedTS: 1723214101728,
      tags: {
        sfmc_remote_id: 'test sfmc_remote_id',
      },
      delivery_stats: {
        all: {
          delivered: 0,
          missing: 0,
          pending: 0,
          spam: 0,
          inbox: 0,
          total: 0,
          provider: 'test provider',
          categories: {
            primary: 0,
            promotions: 0,
            updates: 0,
          }
        }
      },
      SeedQuality: 1,
      is_auto_generated: true,
    }
    ```

  - #### create
    ```js
    mg.inboxPlacements.seedsLists.create({
      name: 'seedLists name',
      sending_domains: 'your_sending_domain',
      seed_filter: 'seed filter',
      remote_id: 'remote_id'
    })
    ```


    Example:

    ```JS
    mg.inboxPlacements.seedsLists.create({
      sending_domains: 'your_sending_domain',
      name: 'seedLists name';
      seed_filter: 'seed filter';
      remote_id: 'remote_id';
    });
    .then(data => console.log(data)) // logs response data
    .catch(err => console.error(err)); //logs any error
    ```

    Promise returns: created SeedsLists item
    ```JS
    {
      kid: 'kid',
      created_at: new Date('2024-08-09T14:32:57.183Z'),
      updated_at: new Date('2024-08-09T14:32:57.183Z'),
      last_result_at: new Date('2024-08-09T14:32:57.183Z'),
      target_email: 'test_email@test.com',
      sending_domains: [ 'your_sending_domain' ],
      has_results: false,
      name: 'seedLists name',
      seed_filter: 'seed filter',
      provider_filter: [],
      mailing_list: 'test_email@test.com',
      previous_mailing_list: '',
      tags: {
        sfmc_remote_id: 'remote_id'
      },
      delivery_stats: {
        all: {
          delivered: 0,
          missing: 0,
          pending: 0,
          spam: 0,
          inbox: 0,
          total: 0,
          provider: 'all',
          categories: {}
        }
      },
      is_auto_generated: false,
      version: 2,
      Seeds: null,
      status: 200
    }
    ```

  - #### update

    ```JS
    mg.inboxPlacements.seedsLists.update(seedsListId,{
      name: 'new seedLists name', // optional
      provider_filter: 'provider_filter', // optional
      shuffle: true, // optional
      sending_domains: 'your_sending_domain' // optional
    })
    ```


    Example:

    ```JS
     mg.inboxPlacements.seedsLists.update(seedsListId,{
      name: 'new seedLists name',
      provider_filter: 'gmail.com',
      sending_domains: 'your_sending_domain'
    })
    .then(data => console.log(data)) // logs response data
    .catch(err => console.error(err)); //logs any error
    ```

    Promise returns: updated SeedsLists item
    ```JS
    {
      kid: '674dcab31169b0619005a9f8',
      created_at: new Date('2024-08-09T14:32:57.183Z'),
      updated_at: 2024-12-02T14:59:42.231Z,
      last_result_at: new Date('2024-08-09T14:32:57.183Z'),
      target_email: 'test_email@test.com',
      sending_domains: [ 'your_sending_domain' ],
      has_results: false,
      name: 'seedLists name',
      seed_filter: '.*',
      provider_filter: ['gmail.com'],
      mailing_list: 'test_email@test.com',
      previous_mailing_list: '',
      tags: {
         sfmc_remote_id: 'remote_id'
      },
      delivery_stats: {
        all: {
          delivered: 0,
          missing: 0,
          pending: 0,
          spam: 0,
          inbox: 0,
          total: 0,
          provider: 'all',
          categories: {}
        }
      },
      is_auto_generated: false,
      version: 2,
      Seeds: null,
      status: 200
    }
    ```

  - #### destroy
    ```js
    mg.inboxPlacements.seedsLists.destroy(seedsListId)
    ```

    Example:

    ```JS
     mg.inboxPlacements.seedsLists.destroy(seedsListId)
    .then(data => console.log(data)) // logs response data
    .catch(err => console.error(err)); //logs any error
    ```

    Promise returns: status object
    ```JS
    {
      status: 200,
      body: null
    }
    ```

  - #### Attributes

    - #### list
      `mg.inboxPlacements.seedsLists.attributes.list()`

      Example:

      ```JS
      mg.inboxPlacements.seedsLists.attributes.list()
      .then(data => console.log(data)) // logs response data
      .catch(err => console.error(err)); //logs any error
      ```
      Promise returns: SeedsLists attributes
      ```JS
      {
        status: 200,
        items:[{
          attribute: 'available attribute',
          values: ['attribute_value', ...]
        }, ...]
      }
      ```

    - #### get
      `mg.inboxPlacements.attributes.get('attribute_name');`

      Example:
      ```JS
      mg.inboxPlacements.seedsLists.attributes.get('attribute_name')
      .then(data => console.log(data)) // logs response data
      .catch(err => console.error(err)); //logs any error
      ```
      Promise returns: SeedsLists attribute
      ```JS
      {
        status: 200,
        items: {
          attribute: 'attribute_name',
            values: ['attribute_value', ...]
          }
      }
      ```

  - #### Filters

    - #### list
      `mg.inboxPlacements.seedsLists.filters.list()`

      Example:

      ```JS
      mg.inboxPlacements.seedsLists.filters.list()
      .then(data => console.log(data)) // logs response data
      .catch(err => console.error(err)); //logs any error
      ```
      Promise returns: SeedsLists filters
      ```JS
      {
        status: 200,
        supported_filters:{
          filters: [
            {
            parameter: 'parameter_name',
            description: 'parameter_description'
            }, ....
          ]
        }
      }
      ```

- #### Providers

  - #### list
    List all available email providers.

    `mg.inboxPlacements.providers.list()`

    Example:

    ```JS
    mg.inboxPlacements.providers.list()
    .then(data => console.log(data)) // logs response data
    .catch(err => console.error(err)); //logs any error
    ```
    Promise returns: providers list
    ```JS
    {
      items: [
        {
          domain: 'something.com',
          region: 'provider region',
          display_name: 'provider name',
          created_at: new Date('2024-08-09T14:32:57.183Z'),
          updated_at: new Date('2024-08-09T14:32:59.183Z')
        },
        ...
        ]
    }
    ```

- #### Results

  - #### list
      Get the details for all placement test results.

      ```js
      mg.inboxPlacements.results.list({
        'sender': 'sender value', // optional
        'subject': 'subject value', // optional
        'provider': 'provider value', // optional
        'target_email': 'target_email value', // optional
        'time_after': new Date('2024-08-09T14:32:57.183Z'), // optional
        'time_before': new Date('2024-08-11T14:32:57.183Z'), // optional
        'cursor': '', // optional
        'sort': '', // optional
        'offset': 1, // optional
        'ascending': true, // optional
        'limit': 5, // optional
      })
      ```

      Example:

      ```JS
      mg.inboxPlacements.results.list({
        'sender': 'sender value', // optional
        'subject': 'subject value', // optional
      })
      .then(data => console.log(data)) // logs response data
      .catch(err => console.error(err)); //logs any error
      ```
      Promise returns: results list
      ```JS
      {
        status: 200,
        items: [
          {
            rid: 'rid_value',
            result_id: 'result_id_value',
            AccountID: 'AccountID_value',
            KeyBoxID: 'KeyBoxID_value',
            keybox_email: 'keybox_email_value',
            subject: 'subject_value',
            sender: 'sender_value',
            seedlist_name: 'seedlist_name_value',
            created_at: new Date('2024-08-09T14:32:57.183Z'),
            updated_at: new Date('2024-08-11T14:32:57.183Z'),
            status: 'status_value',
            CreatedTS: 1723214101728,
            attributes: {
              attribute_value: 'attribute_value_value'
            },
            campaign_id: 'campaign_id_value',
            sharing_enabled: true,
            sharing_id: 'sharing_id_value',
            sharing_expires_at: new Date('2024-08-14T14:32:57.183Z'),
            Box: {
              Id: 'box_Id_value',
              kid: 'box_kid_value',
              AccountID: 'box_AccountID_value',
              created_at: new Date('2024-08-11T14:32:57.183Z'),
              updated_at: new Date('2024-08-12T14:32:57.183Z'),
              last_result_at: new Date('2024-08-13T14:32:57.183Z'),
              Seeds: null,
              target_email: 'box_target_email_value',
              sending_domains: null,
              has_results: true,
              name: 'box_name_value',
              seed_filter: 'box_seed_filter_value',
              mailing_list: 'box_mailing_list_value',
              CreatedTS: 1723214101728,
              tags: ['tag_value'],
              SeedQuality: 100,
              is_auto_generated: true,
            },
            seed_results: [{
              email: 'seed_result_email_value',
              provider: 'seed_result_provider_value',
              destination: 'seed_result_destination_value',
              state: 'seed_result_state_value',
              originating_ip: 'seed_result_originating_ip_value',
              tags: ['seed_result_tag_value'],
              dkim: 'seed_result_dkim_value',
              spf: 'seed_result_spf_value',
              dmarc: 'seed_result_dmarc_value',
              headers: [{
                key: 'seed_result_header_key_value',
                value: 'seed_result_header_value_value',
              }],
              extensions: {
                category: 'seed_result_extensions_category_value',
              }
            }],
            spamassassin: {
              is_spam: false,
              score: 1,
              required: 1,
              rules: [{
                name: 'rule_name_value',
                points: 100,
                short_description: 'short_description_value',
                long_description: 'long_description_value',
              }],
            },
            delivery_stats: {
              test_delivery_stat: {
                delivered: 1,
                missing: 0,
                pending: 0,
                spam: 0,
                inbox: 0,
                total: 1,
                provider: 'provider_value',
                categories: {
                  primary: 1,
                  updates: 0,
                }
              }
            }
          }
        ],
        pages: {
          first: '?page=first',
          last: '?page=last',
          next: '?page=next',
          previous: '?page=previous',
        },
      }
      ```

  - #### get

    Get the details for a single result.

    `mg.inboxPlacements.results.get(IBPResultId)`

    Example:

    ```JS
    mg.inboxPlacements.results.get(IBPResultId);
    .then(data => console.log(data)) // logs response data
    .catch(err => console.error(err)); //logs any error
    ```

    Promise returns: Inbox Placement result item
    ```JS
    {
      status: 200,
      inboxPlacementResult: {
          rid: 'rid_value',
          result_id: 'result_id_value',
          AccountID: 'AccountID_value',
          KeyBoxID: 'KeyBoxID_value',
          keybox_email: 'keybox_email_value',
          subject: 'subject_value',
          sender: 'sender_value',
          seedlist_name: 'seedlist_name_value',
          created_at: new Date('2024-08-09T14:32:57.183Z'),
          updated_at: new Date('2024-08-11T14:32:57.183Z'),
          status: 'status_value',
          CreatedTS: 1723214101728,
          attributes: {
            attribute_value: 'attribute_value_value'
          },
          campaign_id: 'campaign_id_value',
          sharing_enabled: true,
          sharing_id: 'sharing_id_value',
          sharing_expires_at: new Date('2024-08-14T14:32:57.183Z'),
          Box: {
            Id: 'box_Id_value',
            kid: 'box_kid_value',
            AccountID: 'box_AccountID_value',
            created_at: new Date('2024-08-11T14:32:57.183Z'),
            updated_at: new Date('2024-08-12T14:32:57.183Z'),
            last_result_at: new Date('2024-08-13T14:32:57.183Z'),
            Seeds: null,
            target_email: 'box_target_email_value',
            sending_domains: null,
            has_results: true,
            name: 'box_name_value',
            seed_filter: 'box_seed_filter_value',
            mailing_list: 'box_mailing_list_value',
            CreatedTS: 1723214101728,
            tags: ['tag_value'],
            SeedQuality: 100,
            is_auto_generated: true,
          },
          seed_results: [{
            email: 'seed_result_email_value',
            provider: 'seed_result_provider_value',
            destination: 'seed_result_destination_value',
            state: 'seed_result_state_value',
            originating_ip: 'seed_result_originating_ip_value',
            tags: ['seed_result_tag_value'],
            dkim: 'seed_result_dkim_value',
            spf: 'seed_result_spf_value',
            dmarc: 'seed_result_dmarc_value',
            headers: [{
              key: 'seed_result_header_key_value',
              value: 'seed_result_header_value_value',
            }],
            extensions: {
              category: 'seed_result_extensions_category_value',
            }
          }],
          spamassassin: {
            is_spam: false,
            score: 1,
            required: 1,
            rules: [{
              name: 'rule_name_value',
              points: 100,
              short_description: 'short_description_value',
              long_description: 'long_description_value',
            }],
          },
          delivery_stats: {
            test_delivery_stat: {
              delivered: 1,
              missing: 0,
              pending: 0,
              spam: 0,
              inbox: 0,
              total: 1,
              provider: 'provider_value',
              categories: {
                primary: 1,
                updates: 0,
              }
            }
          }
      }
    }
    ```

  - #### destroy
    Delete the result and all associated information.

    `mg.inboxPlacements.results.destroy(IBPResultId)`

    Example:

    ```JS
    mg.inboxPlacements.results.destroy(IBPResultId)
    .then(data => console.log(data)) // logs response data
    .catch(err => console.error(err)); //logs any error
    ```

    Promise returns: status object
    ```JS
    {
      status: 200,
      message: 'deleted'
    }
    ```

  - #### getResultByShareId
      Get a result by the share ID.
      ```js
      mg.inboxPlacements.results.getResultByShareId('result_sharing_id')
      ```

      Example:

      ```JS
      mg.inboxPlacements.results.getResultByShareId('result_sharing_id')
      .then(data => console.log(data)) // logs response data
      .catch(err => console.error(err)); //logs any error
      ```

      Promise returns: Inbox Placement result item
      ```JS
      {
        status: 200,
        inboxPlacementResult: {
            rid: 'rid_value',
            result_id: 'result_id_value',
            AccountID: 'AccountID_value',
            KeyBoxID: 'KeyBoxID_value',
            keybox_email: 'keybox_email_value',
            subject: 'subject_value',
            sender: 'sender_value',
            seedlist_name: 'seedlist_name_value',
            created_at: new Date('2024-08-09T14:32:57.183Z'),
            updated_at: new Date('2024-08-11T14:32:57.183Z'),
            status: 'status_value',
            CreatedTS: 1723214101728,
            attributes: {
              attribute_value: 'attribute_value_value'
            },
            campaign_id: 'campaign_id_value',
            sharing_enabled: true,
            sharing_id: 'sharing_id_value',
            sharing_expires_at: new Date('2024-08-14T14:32:57.183Z'),
            Box: {
              Id: 'box_Id_value',
              kid: 'box_kid_value',
              AccountID: 'box_AccountID_value',
              created_at: new Date('2024-08-11T14:32:57.183Z'),
              updated_at: new Date('2024-08-12T14:32:57.183Z'),
              last_result_at: new Date('2024-08-13T14:32:57.183Z'),
              Seeds: null,
              target_email: 'box_target_email_value',
              sending_domains: null,
              has_results: true,
              name: 'box_name_value',
              seed_filter: 'box_seed_filter_value',
              mailing_list: 'box_mailing_list_value',
              CreatedTS: 1723214101728,
              tags: ['tag_value'],
              SeedQuality: 100,
              is_auto_generated: true,
            },
            seed_results: [{
              email: 'seed_result_email_value',
              provider: 'seed_result_provider_value',
              destination: 'seed_result_destination_value',
              state: 'seed_result_state_value',
              originating_ip: 'seed_result_originating_ip_value',
              tags: ['seed_result_tag_value'],
              dkim: 'seed_result_dkim_value',
              spf: 'seed_result_spf_value',
              dmarc: 'seed_result_dmarc_value',
              headers: [{
                key: 'seed_result_header_key_value',
                value: 'seed_result_header_value_value',
              }],
              extensions: {
                category: 'seed_result_extensions_category_value',
              }
            }],
            spamassassin: {
              is_spam: false,
              score: 1,
              required: 1,
              rules: [{
                name: 'rule_name_value',
                points: 100,
                short_description: 'short_description_value',
                long_description: 'long_description_value',
              }],
            },
            delivery_stats: {
              test_delivery_stat: {
                delivered: 1,
                missing: 0,
                pending: 0,
                spam: 0,
                inbox: 0,
                total: 1,
                provider: 'provider_value',
                categories: {
                  primary: 1,
                  updates: 0,
                }
              }
            }
          }
      }
      ```

  - #### Attributes

    - #### list
      `mg.inboxPlacements.results.attributes.list()`

      Example:

      ```JS
      mg.inboxPlacements.results.attributes.list()
      .then(data => console.log(data)) // logs response data
      .catch(err => console.error(err)); //logs any error
      ```
      Promise returns: results attributes
      ```JS
      {
        status: 200,
        items:[{
          attribute: 'available attribute',
          values: ['attribute_value', ...]
        }, ...]
      }
      ```

    - #### get
      `mg.inboxPlacements.attributes.get('attribute_name');`

      Example:
      ```JS
      mg.inboxPlacements.results.attributes.get('attribute_name')
      .then(data => console.log(data)) // logs response data
      .catch(err => console.error(err)); //logs any error
      ```
      Promise returns: results attribute
      ```JS
      {
        status: 200,
        items: {
          attribute: 'attribute_name',
            values: ['attribute_value', ...]
          }
      }
      ```

  - #### Filters

    - #### list
        `mg.inboxPlacements.results.filters.list()`

        Example:

        ```JS
        mg.inboxPlacements.results.filters.list()
        .then(data => console.log(data)) // logs response data
        .catch(err => console.error(err)); //logs any error
        ```
        Promise returns: SeedsLists filters
        ```JS
        {
          status: 200,
          supported_filters:{
            filters: [
              {
              parameter: 'parameter_name',
              description: 'parameter_description'
              }, ....
            ]
          }
        }
        ```

  - #### Sharing
    - #### get
      The sharing status of a result.

      `mg.inboxPlacements.results.sharing.get('result_id');`
      Example:
        ```JS
        mg.inboxPlacements.results.sharing.get('result_id');
        .then(data => console.log(data)) // logs response data
        .catch(err => console.error(err)); //logs any error
        ```
        Promise returns: IPRSharingResult
        ```JS
        {
          status: 200,
          result_id: 'result_id',
          expires_at: new Date('2024-08-12T14:32:57.183Z'),
          enabled: true,
          url_id: 'result_sharing_id',
          url: 'url-to-shared-result-page',
          api_url: 'url-shared-result-page-in-json'
        }
        ```
    - #### update
      Change the sharing status of a result or create a new share URL

      `mg.inboxPlacements.results.sharing.update('result_id', IPRSharingUpdateData);`

      Example:
        ```JS
        mg.inboxPlacements.results.sharing.update('result_id', { enabled: false });
        .then(data => console.log(data)) // logs response data
        .catch(err => console.error(err)); //logs any error
        ```
        Promise returns: IPRSharingResult
        ```JS
        {
          status: 200,
          result_id: 'result_id',
          expires_at: new Date('2024-08-12T14:32:57.183Z'),
          enabled: false,
          url_id: 'result_sharing_id',
          url: '',
          api_url: ''
        }
        ```

- #### Run test
  Create and run a new inbox placement test.

  Either 'html' or 'template_name' field should be provided.

  'variables' are Template variables, which could be used in html or template. You can use next recipient variables inside Template variables, which will be filled for every seed automatically: %recipient.first_name%, %recipient.last_name%.

  `mg.inboxPlacements.runTest(InboxPlacementsData);`

  Example:
  ```JS
    mg.inboxPlacements.runTest({
      from: 'Excited User <mailgun@sandbox-123.mailgun.org>',
      subject: 'Subject of test email',
      provider_filter: ['o365.mailgun.email'],
      html: `<html><body>
      <h4>Waiting for inbox placements support in mailgun.js SDK?</h4>
      <h3>We are working on this </h3>
      </body></html>`,
      template_name: 'name-of-the-template-you-made-in-mailgun-web-portal';
      variables: JSON.stringify({
          'template_variable_name': 'template_variable_value'
      },
      seed_list: 'previously-generated-seed-list',
    })
    .then(data => console.log(data)) // logs response data
    .catch(err => console.error(err)); //logs any error
  ```

  Promise returns: InboxPlacementsTestResult

  ```JS
  {
    status: 200,
    result_id: 'result_id',
    links: {
      results: 'link to result page',
    }
  }

## Navigation thru lists
  Most of the methods that return items in a list support pagination.
  There are two ways to receive part of the list:
  1. Provide properties 'limit' and 'page' in the query.
  This way uses more frequently in the SDK and works for the next methods:
  - mg.domains.domainTags.list()
  - mg.domains.domainTemplates.list()
  - mg.domains.domainTemplates.listVersions()
  - mg.events.get()
  - mg.lists.list()
  - mg.lists.members.listMembers()
  - mg.validate.list()
  - mg.suppressions.list()

    The general idea is that after you made the first call with a limit property in the query you will receive a response with a property called pages in it. This property implements the next interface:

    ```TS
    {
        previous: {
            id: string;
            page: string;
            iteratorPosition: string | undefined;
            url: string
        };
        first: {
            id: string;
            page: string;
            iteratorPosition: string | undefined;
            url: string
        };
        last: {
            id: string;
            page: string;
            iteratorPosition: string | undefined;
            url: string
        };
        next: {
            id: string;
            page: string;
            iteratorPosition: string | undefined;
            url: string
        };
    }
    ```
    To receive the next page you need to add the page property to the query argument. This property should contain a string value from 'page' property in response.pages.(previous/first/last/next).

    Example:
    ```Js
    // first call
    const listMembers = await mg.lists.members.listMembers('your_mailing_list', { limit: 2 });

    /* response
    {
      items: [
        {
          address: 'test-0@example.com',
          name: 'test name 0',
          subscribed: true,
          vars: [Object]
        },
        {
          address: 'test-1@example.com',
          name: 'test name 1',
          subscribed: true,
          vars: [Object]
        }
      ],
      pages: {
        first: {
          id: 'first',
          page: '?page=first&limit=2',
          iteratorPosition: undefined,
          url: 'https://your_domain/v3/lists/your_mailing_list/members/pages?page=first&limit=2'
        },
        last: {
          id: 'last',
          page: '?page=last&limit=2',
          iteratorPosition: undefined,
          url: 'https://your_domain/v3/lists/your_mailing_list/members/pages?page=last&limit=2'
        },
        next: {
          id: 'next',
          page: '?page=next&address=test-1%40example.com&limit=2',
          iteratorPosition: 'test-1@example.com',
          url: 'https://your_domain/v3/lists/your_mailing_list/members/pages?page=next&address=test-1%40example.com&limit=2'
        },
        previous: {
          id: 'previous',
          page: '?page=prev&address=test-0%40example.com&limit=2',
          iteratorPosition: 'test-0@example.com',
          url: 'https://your_domain/v3/lists/your_mailing_list/members/pages?page=prev&address=test-0%40example.com&limit=2'
        }
      }
    }
    */
    // second call
    const listMembers = await mg.lists.members.listMembers(
        'your_mailing_list',
        {
          limit: 2,
          page: '?page=next&address=test-1%40example.com&limit=2'
        }
      );

    /* response
    {
      items: [
        {
          address: 'test-2@example.com',
          name: 'test name 2',
          subscribed: true,
          vars: [Object]
        },
        {
          address: 'test-3@example.com',
          name: 'test name 3',
          subscribed: true,
          vars: [Object]
        }
      ],
      pages: {
        first: {
          id: 'first',
          page: '?page=first&limit=2',
          iteratorPosition: undefined,
          url: 'https://your_domain/v3/lists/your_mailing_list/members/pages?page=first&limit=2'
        },
        last: {
          id: 'last',
          page: '?page=last&limit=2',
          iteratorPosition: undefined,
          url: 'https://your_domain/v3/lists/your_mailing_list/members/pages?page=last&limit=2'
        },
        next: {
          id: 'next',
          page: '?page=next&address=test-3%40example.com&limit=2',
          iteratorPosition: 'test-3@example.com',
          url: 'https://your_domain/v3/lists/your_mailing_list/members/pages?page=next&address=test-3%40example.com&limit=2'
        },
        previous: {
          id: 'previous',
          page: '?page=prev&address=test-2%40example.com&limit=2',
          iteratorPosition: 'test-2@example.com',
          url: 'https://your_domain/v3/lists/your_mailing_list/members/pages?page=prev&address=test-2%40example.com&limit=2'
        }
      }
    }
    */
    ```
    2. The second option of navigation is to provide properties 'limit' and 'skip' in the query. This way uses only in a few places for now:
      - mg.domains.list()
      - mg.domains.domainCredentials.list()
      - mg.routes.list()
      - mg.webhooks.list()
    The main idea here is quite simple you just need to provide how many records from the start of a list you want to skip and how many to receive. You can do it using the query parameter in each method.
    Example:
    ```js
    const listDomainCredentials = await client.domains.domainCredentials.list(
    'your_domain_name',
    {
      skip: 10,
      limit: 1
    }
    );
    ```

## Browser Demo

![image](https://cloud.githubusercontent.com/assets/399776/10718632/e8fe56e4-7b34-11e5-84c8-cfcfde978711.png)

For this demo to work, you'll need to install and run `http-proxy` locally. Install it with:

```sh
npm install -g http-proxy
```

Then run the following command from the mailgun-js directory:

```sh
http-server -p 4001 --proxy="https://api.mailgun.net"
```

Demo should be up and running at http://0.0.0.0:4001/examples/

# Development

## Requirements

- Requires node.js >= 18.x

Install node dependencies with:

```sh
npm install
```

## Build
Build for dev purposes(without minimizing)
```sh
npm run build
```
Build for release purposes(include minimizing)
```sh
npm run build:release
```

## Merging changes

Before PR merge check that commits info will be correctly added to the CHANGELOG.md file:
'npm run release -- --dry-run'

> CI process isn't working currently, so please manually run ```npm run test```

## Tests

```sh
npm run tests
```

Watch tests with

```sh
npm run watch-tests
```

To test new functionality locally using ```npm link``` please use npm script ```npm run link```.
This is needed for correct exporting d.ts files.

## Release Process

Releases occur after feature branches have been tested and merged into master.

First, checkout master and pull the latest commits.

```sh
git checkout master
git pull
```

Next, run ```npm run release```.

After that, `cd ./dist` and then run ```npm login``` and ```npm publish``` to publish changes on npm.

next-auth

Version 4.24.11

ISC
Published by Iain Collins (me@iaincollins.com)
View License Text
ISC License

Copyright (c) 2018-2021, Iain Collins

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

next

Version 14.2.25

MIT
View License Text
The MIT License (MIT)

Copyright (c) 2024 Vercel, Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

pg-query-stream

Version 4.7.1

MIT
Published by Brian M. Carlson
View License Text
The MIT License (MIT)

Copyright (c) 2013 Brian M. Carlson

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

pg

Version 8.13.1

MIT
Published by Brian Carlson (brian.m.carlson@gmail.com)
View License Text
MIT License

Copyright (c) 2010 - 2021 Brian Carlson

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

react-day-picker

Version 8.10.1

MIT
Published by Giampaolo Bellavite (io@gpbl.dev)
View License Text
The MIT License (MIT)

Copyright (c) 2014-2024 Giampaolo Bellavite <io@gpbl.dev> and contributors

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

react-dom

Version 18.3.1

MIT
View License Text
MIT License

Copyright (c) Facebook, Inc. and its affiliates.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

react-hook-form

Version 7.54.2

MIT
(bluebill1049@hotmail.com)
View License Text
MIT License

Copyright (c) 2019-present Beier(Bill) Luo

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Published by Daniel Schmidt
View License Text
The MIT License (MIT)

Copyright (c) 2023 React Intersection Observer authors

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

react

Version 18.3.1

MIT
View License Text
MIT License

Copyright (c) Facebook, Inc. and its affiliates.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

redis

Version 4.7.0

MIT
View License Text
MIT License

Copyright (c) 2022-2023, Redis, inc.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

sqlite3

Version 5.1.7

BSD-3-Clause
Published by Mapbox
View License Text
Copyright (c) MapBox
All rights reserved.

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

- Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
  list of conditions and the following disclaimer in the documentation and/or
  other materials provided with the distribution.
- Neither the name "MapBox" nor the names of its contributors may be
  used to endorse or promote products derived from this software without
  specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

tailwind-merge

Version 2.6.0

MIT
Published by Dany Castillo
View License Text
MIT License

Copyright (c) 2021 Dany Castillo

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

tailwindcss-animate@1.0.7

Version 1.0.7

MIT
Published by Jamie Kyle (me@thejameskyle.com)
View License Text
MIT License

Copyright (c) 2020 Jamie Kyle

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

uuid

Version 13.0.0

MIT
View License Text
The MIT License (MIT)

Copyright (c) 2010-2020 Robert Kieffer and other contributors

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

zod

Version 3.24.1

MIT
Published by Colin McDonnell (colin@colinhacks.com)
View License Text
MIT License

Copyright (c) 2020 Colin McDonnell

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

zustand

Version 5.0.3

MIT
Published by Paul Henschel
View License Text
MIT License

Copyright (c) 2019 Paul Henschel

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

This page lists dependencies with licenses that require attribution or disclosure. Each package is listed with its license type, version, and links to source repositories where available.