diff --git a/.npmignore b/.npmignore index c942ad7..5b7e938 100644 --- a/.npmignore +++ b/.npmignore @@ -3,6 +3,8 @@ .gitignore package-lock.json tsconfig.json +jest.config.json src node_modules +docs __test__ \ No newline at end of file diff --git a/README.md b/README.md index 427c5a1..8952cdd 100644 --- a/README.md +++ b/README.md @@ -9,21 +9,27 @@ Dentro del proyecto verás las estructura de carpetas y archivos: ``` / +├── __test__/ +│ ├── auth/ +│ │ └── ... +│ ├── .../ +│ │ └── ... +├── docs/ +│ ├── ... ├── src/ │ ├── api/ │ │ └── ... │ ├── helpers/ │ │ └── ... │ └── interfaces/ -│ └── ... -├── test/ -│ ├── ... +│ │ └── ... +│ └── index.ts └── package.json ``` --- -## 📖 Documentación: +## 📖 Instrucciones: 1. Instala el SDK. @@ -64,431 +70,8 @@ const appAuth = { --- -## 🔐 Auth: - -> La sección Auth contiene las funciones login, register y logout. Estas funciones son esenciales para garantizar que solo los usuarios autorizados puedan acceder al contenido y realizar acciones en la aplicación. Todas las funciones son asíncronas y retornan una promesa con la data o el error de la request. - -### Login - -> Esta función se encarga de realizar una petición POST a la API de Qvapay para iniciar sesión. - -```js -import { login } from 'qvapay-sdk'; - -const res = await login(userLogin); -``` - -### Register - -> Esta función se usa para registrar un usuario. Utiliza la API de qvapay para enviar los datos de registro al servidor. Si el registro se realiza correctamente, devuelve los datos recibidos del servidor. Si hay algún error, devuelve el error. - -```js -import { register } from 'qvapay-sdk'; - -const newUser = { - name: 'Juan Perez', - email: 'juan@gmail.com', - password: 'CffasdKB73iTtzNJN', - c_password: 'CffasdKB73iTtzNJN', - invite: 'referer_username (OPTIONAL)', -}; - -const res = await register(newUser); -``` - -### Logout - -> Esta función intenta realizar una solicitud GET a la API qvapay para cerrar la sesión del usuario. Si la solicitud se realiza con éxito, devuelve los datos de respuesta. Si hay algún error, devuelve los datos de respuesta del error. - -```js -import { login, logout } from 'qvapay-sdk'; - -const { accessToken } = await login(userLogin); -const res = await logout(accessToken); -``` -``` -🔔 En los ejemplos que siguen, se usa el accessToken que retorna la función login(). Sin embargo, tenga presente que usted puede guardar este token de la forma que prefiera y usarlo posteriormente para realizar operaciones en su aplicación. -``` - -## 😎 User: - -> La sección User ofrece una variedad de funcionalidades para administrar la información de los usuarios. La función getUser permite obtener información acerca de un usuario específico. La función updateUser permite actualizar la información del usuario. La función deposit permite realizar depósitos en la cuenta del usuario. Por último, la función withdraw permite realizar retiros desde la cuenta del usuario. Estas funcionalidades permiten a los usuarios administrar sus cuentas de forma segura y eficiente. Todas las funciones retornan una promesa con la data o el error de la request. - -### getUser - -> Este código es una función asíncrona que obtiene un usuario de la API de Qvapay. Esta función toma un token de acceso como parámetro y realiza una solicitud GET a la ruta '/user' con el token de acceso en los encabezados. Si la solicitud se completa con éxito, devuelve los datos del usuario como respuesta. Si hay algún error, devuelve los datos del error como respuesta. - -```js -import { login, getUser } from 'qvapay-sdk'; - -const { accessToken } = await login(userLogin); -const res = await getUser(accessToken); -``` - -### updateUser - -> Esta función se utiliza para actualizar un usuario en la API de Qvapay. Toma dos parámetros: un token de acceso y los datos a actualizar. La función intenta realizar la solicitud PUT a la API con los datos proporcionados y el token de acceso. Si la solicitud es exitosa, devuelve los datos recibidos. Si hay algún error, devuelve los datos recibidos en la respuesta del error. - -```js -import { login, updateUser } from 'qvapay-sdk'; - -const { accessToken } = await login(userLogin); -const dataToUpdate = { - name: 'Pedro Perez1', - lastname: 'st', - bio: 'svwb erberberb', - logo: '', - kyc: 1, - username: 'wpiuwe', - email: 'egc31@gmail.com', - password: 'CffasdKB73iTtzNJN', -}; - -const res = await updateUser(accessToken, dataToUpdate); -``` - -### deposit - -> Esta función se utiliza para realizar un depósito. La función toma dos parámetros: un token de acceso y un nuevo depósito. Utiliza la API de Qvapay para realizar el depósito. Si hay un error, la función devuelve los datos de la respuesta del servidor. Si no hay errores, devuelve los datos de la transacción. - -```js -import { login, deposit } from 'qvapay-sdk'; - -const { accessToken } = await login(userLogin); -const newDeposit = { - pay_method: 'BTCLN', - amount: 67, -}; - -const res = await deposit(accessToken, newDeposit); -``` - -### withdraw - -> Esta función se utiliza para hacer una extracción de la API Qvapay. Toma dos parámetros: un token de acceso y un objeto Withdraw. Luego, intenta realizar una solicitud POST a la ruta '/withdraw' con los datos del objeto Withdraw y el token de acceso en el encabezado. Si la solicitud es exitosa, devuelve los datos recibidos. Si hay algún error, devuelve los datos recibidos en la respuesta del error. - -```js -import { login, withdraw } from 'qvapay-sdk'; - -const { accessToken } = await login(userLogin); -const newWithdraw = { - pay_method: 'BTCLN', - amount: 4, - details: [ - { - Wallet: 'bc1qs67kwcf7znpnc06xjh8cnc0zwsechcfxscghun', - }, - ], -}; - -const res = await withdraw(accessToken, newWithdraw); -``` - ---- - -## 💱 Transactions: - -> La sección Transactions ofrece una variedad de funciones para administrar las transacciones y retiros realizados por los usuarios. Estas funciones incluyen getOneTransaction, que permite obtener información sobre una transacción específica; getOneWithdraw, que permite obtener información sobre un retiro específico; getTransactionsFromUserAuth, que permite obtener todas las transacciones realizadas por el usuario autenticado; getWithdrawsFromUserAuth, que permite obtener todos los retiros realizados por el usuario autenticado; payPendingTransaction, que permite pagar una transacción pendiente; y transferBetweenUser, que permite transferir fondos entre dos usuarios. Estas funciones permiten a los usuarios administrar sus transacciones y retiros de forma segura y eficiente. - -### getTransactionsFromUserAuth - -> Esta función obtiene transacciones de un usuario autenticado. Toma dos parámetros, un token de acceso y un objeto de propiedades de transacción. Convierte el objeto de propiedades en entradas y parámetros de búsqueda, luego hace una solicitud GET a la API qvapay con los encabezados adecuados. Si la solicitud se realiza con éxito, devuelve los datos recibidos. Si hay un error, devuelve los datos recibidos como respuesta del error. - -```js -import {login, getTransactionsFromUserAuth} from 'qvapay-sdk' - -const { accessToken } = await login(userLogin); -const props = { - start: date_time - end: date_time - status: [paid, pending, cancelled] - remote_id: string - description: string -} - -const res = await getTransactionsFromUserAuth(accessToken, props) -``` - -### getOneTransaction - -> Este código es una función asíncrona que se utiliza para obtener una transacción específica a partir de un token de acceso y un ID. Utiliza la API Qvapay para hacer la solicitud, y devuelve los datos de la transacción como respuesta. Si hay algún error, devuelve los datos de la respuesta del error. - -```js -import { login, getOneTransaction } from 'qvapay-sdk'; - -const { accessToken } = await login(userLogin); -const id = '7e48853f-949c-4271-9b4a-1213ee83ac11'; - -const res = await getOneTransaction(accessToken, id); -``` - -### getWithdrawsFromUserAuth - -> Esta función se utiliza para obtener los retiros de un usuario autenticado. Utiliza el token de acceso proporcionado como parámetro para realizar una solicitud GET a la API Qvapay. Si la solicitud es exitosa, devuelve los datos recibidos en forma de respuesta con retiro. Si hay algún error, devuelve los datos recibidos en la respuesta del error. - -```js -import { login, getWithdrawsFromUserAuth } from 'qvapay-sdk'; - -const { accessToken } = await login(userLogin); -const res = await getWithdrawsFromUserAuth(accessToken); -``` - -### getOneWithdraw - -> Esta función recibe dos parámetros: un token de acceso y una identificación. Esta función intenta obtener los datos de un retiro específico a través de la API Qvapay utilizando el token de acceso proporcionado. Si la solicitud se realiza con éxito, devuelve los datos del retiro. Si hay algún error, devuelve los datos del error. - -```js -import { login, getOneWithdraw } from 'qvapay-sdk'; - -const { accessToken } = await login(userLogin); -const id = '10790'; - -const res = await getOneWithdraw(accessToken, id); -``` - -### transferBetweenUser - -> Esta función se utiliza para transferir fondos entre usuarios. La función toma dos parámetros: accessToken y transfer. El accessToken se utiliza para autenticar la solicitud de transferencia. El transfer es un objeto que contiene información sobre el monto a transferir, el destinatario, etc. La función realiza una solicitud POST a la API qvapay para realizar la transferencia. Si la solicitud es exitosa, devuelve los datos de la transacción como resultado. En caso de error, devuelve los datos de error. - -```js -import { login, transferBetweenUser } from 'qvapay-sdk'; - -const { accessToken } = await login(userLogin); -const transfer = { - to: '52ff1628-5e91-4083-bc8e-6accce9a7d15', - amount: 10, - description: 'TESTING', -}; - -const res = await transferBetweenUser(accessToken, transfer); -``` - -### payPendingTransaction - -> Esta función se encarga de realizar el pago de una transacción pendiente. Toma como parámetros el token de acceso y los detalles de la transacción a pagar. Intenta realizar el pago utilizando la API Qvapay y devuelve una respuesta con los resultados. Si hay un error, devuelve los datos del error. El PIN por defecto es 0000, pero se recomienda configurar un PIN secreto en el panel de usuario para mayor seguridad. - -```js -import { login, payPendingTransaction } from 'qvapay-sdk'; - -const { accessToken } = await login(userLogin); -const pay = { - uuid: '710296b7-0d5d-4e86-ab1b-9d79080dd042', - pin: '0000', -}; - -const res = await payPendingTransaction(accessToken, pay); -``` - ---- - -## 🤑 Merchants - -> La sección Merchants le permite a los usuarios realizar operaciones financieras como consultar el saldo de una aplicación, obtener información sobre una aplicación, crear facturas, obtener una transacción de una aplicación y obtener transacciones de una aplicación. Estas funcionalidades le permiten al usuario administrar sus finanzas con facilidad y seguridad. - -### appInfo - -> Esta función se utiliza para obtener información sobre una aplicación. La función toma un objeto "AppAuth" como parámetro y devuelve un objeto "AppInfo" como promesa. La función intenta realizar una solicitud POST a la API qvapay para obtener la información de la aplicación. Si la solicitud es exitosa, devuelve los datos recibidos en el objeto "data". Si hay algún error, devuelve los datos recibidos en el objeto "response". - -```js -import { appInfo } from 'qvapay-sdk'; - -const res = await appInfo(appAuth); -``` - -### appBalance - -> Esta función se utiliza para obtener el saldo de una aplicación. Utiliza la API de Qvapay para enviar una solicitud POST con los datos de autenticación de la aplicación. Si la solicitud se procesa correctamente, devuelve los datos del saldo. Si hay un error, devuelve los datos del error. - -```js -import { appBalance } from 'qvapay-sdk'; - -const res = await appBalance(appAuth); -``` - -### createInvoice - -> Esta función permite crear una factura mediante la API de Qvapay. La función toma un objeto "invoice" como parámetro y devuelve una promesa con el objeto de respuesta "InvoiceResponse". El código intenta realizar una solicitud POST a la API de Qvapay para crear la factura. Si hay algún error, el código captura el error y devuelve los datos de la respuesta. - -```js -import { createInvoice } from 'qvapay-sdk'; - -const invoice = { - ...appAuth, - amount: 99.99, - description: 'Enanitos verdes', - remote_id: 'MY_OWN_CUSTOM_ID', - signed: 1, -}; -const res = await createInvoice(invoice); -``` - -### getTransactionsFromApp - -> Esta función toma un parámetro auth de tipo AppAuth. Esta función hace una solicitud POST a la API qvapay para obtener datos de transacciones. Si la solicitud se realiza con éxito, devuelve los datos recuperados en formato de promesa. Si hay algún error, devuelve los datos recuperados en el objeto de respuesta AxiosError. - -```js -import { getTransactionsFromApp } from 'qvapay-sdk'; - -const res = await getTransactionsFromApp(appAuth); -``` - -### getOneTransactionFromApp - -> Esta función se utiliza para obtener una transacción específica de una aplicación. Toma dos parámetros: auth (una autenticación de la aplicación) y id (el identificador de la transacción). La función envía una solicitud POST al servidor para recuperar los datos de la transacción especificada. Si la solicitud tiene éxito, devuelve los datos recuperados. En caso contrario, devuelve los datos del error. - -```js -import { getOneTransactionFromApp } from 'qvapay-sdk'; - -const id = '54079648-39bc-49ef-bd3e-b89032a7ac05'; -const res = await getOneTransactionFromApp(appAuth, id); -``` - ---- - -## 🔗 Payment Links - -> La sección Payment Links le permite a los usuarios crear enlaces de pago personalizados para recibir pagos de sus clientes. Estos enlaces pueden ser compartidos a través de correo electrónico, redes sociales o cualquier otra plataforma para que los clientes realicen el pago directamente desde su dispositivo. Además, la sección Payment Links también le permite al usuario ver todos los enlaces de pago creados y consultar el estado de cada uno. - -### getAllPaymentLinks - -> Esta función se utiliza para obtener todos los enlaces de pago. Utiliza la API QVAPay para realizar una solicitud GET a la ruta '/payment_links' con el token de acceso proporcionado como encabezado. Si la solicitud se realiza correctamente, devuelve los datos recibidos en la respuesta. En caso de error, devuelve los datos recibidos en la respuesta del error. - -```js -import { login, getAllPaymentLinks } from 'qvapay-sdk'; - -const { accessToken } = await login(userLogin); -const res = await getAllPaymentLinks(accessToken); -``` - -### createPaymentLink - -> Esta función crea un enlace de pago usando la API de Qvapay. Toma un token de acceso y un objeto con información sobre el pago como parámetros, realiza una solicitud POST a la API y devuelve los datos de respuesta. Si hay algún error, captura la excepción y devuelve los datos de respuesta. - -```js -import { login, createPaymentLink } from 'qvapay-sdk'; - -const { accessToken } = await login(userLogin); -const info = { - name: 'Pulover de guinga azul', - product_id: 'PVG-AZUL', - amount: 10.32, -}; - -const res = await createPaymentLink(accessToken, info); -``` - ---- - -## 🤖 Services - -> Nuestra sección de servicios cuenta con dos funcionalidades principales: getAllServices y getOneService, que te permiten obtener información detallada sobre cada uno de nuestros servicios. +## 🗒️ Docs +[Accede a la documentación detallada aquí](https://qvapay-ts.surge.sh/#/) -### getAllServices - -> Esta función se encarga de obtener todos los servicios disponibles. Esta función toma un token de acceso como parámetro y realiza una solicitud GET a la API qvapay para obtener los datos de los servicios. Si la solicitud es exitosa, devuelve los datos como respuesta. En caso contrario, devuelve los datos de la respuesta del error. - -```js -import { login, getAllServices } from 'qvapay-sdk'; -const { accessToken } = await login(userLogin); -const res = await getAllServices(accessToken); -``` - -### getOneService - -> Esta función se utiliza para obtener un servicio específico utilizando un token de acceso y un ID. Utiliza la API Qvapay para realizar la solicitud y devolver los datos del servicio solicitado. Si hay un error, maneja el error y devuelve los datos de la respuesta. - -```js -import { login, getOneService } from 'qvapay-sdk'; - -const { accessToken } = await login(userLogin); -const id = 'e286449c-5bf4-4fbc-9a85-95bb5b54c73e'; - -const res = await getOneService(accessToken, id); -``` - ---- - -## 💆‍♂️ P2P - -> La sección P2P ofrece una variedad de funciones para facilitar el intercambio de monedas digitales entre usuarios. Estas funciones incluyen getEnabledCurrencies, que permite a los usuarios ver qué monedas están habilitadas para el intercambio; getOffers, que permite a los usuarios ver todas las ofertas disponibles; getOneOffer, que permite a los usuarios ver una oferta específica; y getPairsAverage, que calcula el promedio de precios para un par de monedas específico. Estas herramientas permiten a los usuarios realizar transacciones rápidas y seguras con otros usuarios en la plataforma. - -### getEnabledCurrencies - -> Esta función se utiliza para obtener una lista de monedas habilitadas. Utiliza la API de Qvapay para realizar una solicitud GET a la ruta '/p2p/get_coins_list'. Si la solicitud se completa con éxito, devuelve los datos recibidos. Si hay algún error, devuelve los datos de la respuesta del error. - -```js -import { getEnabledCurrencies } from 'qvapay-sdk'; - -const res = await getEnabledCurrencies(); -``` - -### getPairsAverage - -> Esta función se utiliza para obtener el promedio de pares completados para una moneda específica. Utiliza la API de Qvapay para realizar la solicitud y devuelve los datos como una respuesta de promesa. En caso de que ocurra un error, maneja la excepción y devuelve los datos del error como respuesta. - -```js -import { getPairsAverage } from 'qvapay-sdk'; - -const coin = 'TRX'; -const res = await getPairsAverage(coin); -``` - -### getOffers - -> Esta función toma dos parámetros: accessToken y props. Primero, convierte los parámetros en un objeto URLSearchParams y luego realiza una solicitud GET a la API con el token de acceso proporcionado como encabezado de autorización. Si la solicitud se completa correctamente, devuelve los datos recibidos. Si hay algún error, devuelve los datos del error recibido en la respuesta. - -```js -import { login, getOffers } from 'qvapay-sdk'; - -const { accessToken } = await login(userLogin); -const props = { - type: 'buy', - coin: 'ETECSA', - min: 1, - max: 50, -}; -const res = await getOffers(accessToken, props); -``` - -### getOneOffer - -> Esta función se utiliza para obtener una oferta específica a través de la API QVapay. La función toma dos parámetros: accessToken y id. Utiliza el token de acceso para autenticar la solicitud y el id para identificar la oferta específica. Luego, realiza una solicitud GET a la API QVapay para recuperar los datos de la oferta. Si hay algún error, manejará la respuesta del servidor y devolverá los datos. Finalmente, devuelve los datos de la oferta como un objeto Promise. - -```js -import { login, getOneOffer } from 'qvapay-sdk'; - -const { accessToken } = await login(userLogin); -const id = '949780ed-7303-4a34-b8c3-2d55d802c75d'; - -const res = await getOneOffer(accessToken, id); -``` -___ - -## 🏦 Rates - -> La sección reates cuenta con las funciones currentCoins, currentRates. Haciendo uso de estas puede mantener a sus usuarios al tanto de las tarifas actualizadas. - -### currentRates - -> Esta función devuelve una promesa de una matriz de tasas actuales. Obtiene los datos desde la API de qvapayAPI. Si la solicitud se realiza correctamente, devolverá los datos recibidos. Si hay algún error en la solicitud, devolverá los datos recibidos en la respuesta del error. - -```js -import { currentRates } from 'qvapay-sdk'; - -const res = await currentRates(); -``` - -### currentCoins - -> Esta función devuelve una promesa con una matriz de tasas actuales. Esta función obtiene los datos de la API qvapay. Si la solicitud es exitosa, los datos se devuelven como parte de la respuesta. Si hay un error, los datos se devuelven como parte de la respuesta del error. Esta función es útil para obtener información sobre las monedas actuales y sus tasas de cambio. - -```js -import { currentCoins } from 'qvapay-sdk'; - -const res = await currentCoins(); -``` - -``` -💡 Este proyecto está en desarrollo y busca ofrecer una solución de código abierto para interactuar con la API de QvaPay. Estamos abiertos a cualquier sugerencia o feedback que nos ayude a mejorar el proyecto. Estamos comprometidos con la satisfacción de nuestros usuarios, por lo que cualquier contribución es bienvenida. Si tienes alguna idea para mejorar el proyecto, no dudes en compartirla con nosotros. ¡Estamos ansiosos por escuchar tus ideas! -``` +> 💡 Este proyecto está en desarrollo y busca ofrecer una solución de código abierto para interactuar con la API de QvaPay. Estamos abiertos a cualquier sugerencia o feedback que nos ayude a mejorar el proyecto. Estamos comprometidos con la satisfacción de nuestros usuarios, por lo que cualquier contribución es bienvenida. Si tienes alguna idea para mejorar el proyecto, no dudes en compartirla con nosotros. ¡Estamos ansiosos por escuchar tus ideas! diff --git a/__test__/auth/login.test.ts b/__test__/auth/login.test.ts index 4c1c529..264bdf4 100644 --- a/__test__/auth/login.test.ts +++ b/__test__/auth/login.test.ts @@ -1,36 +1,35 @@ import 'dotenv/config'; -import { Login, Me } from '../../src/interfaces'; - +import { Login } from '../../src/interfaces'; import { login } from '../../src'; describe('login', () => { - it('should return a LoginResponse when the request is successful', async () => { + test('should return a LoginResponse when the request is successful', async () => { const loginData: Login = { email: process.env.EMAIL, password: process.env.PASSWORD, }; - const expectedResult: Me = { - uuid: 'fcc52d8c-e37d-49ad-a276-4613664c9a88', - username: 'd3vqba', - name: 'David', - lastname: '', - bio: 'Ingeniero de Software', - profile_photo_path: '', - balance: 0, - complete_name: 'David ', - name_verified: 'David', - profile_photo_url: - 'https://ui-avatars.com/api/?name=D&color=7F9CF5&background=EBF4FF', - average_rating: '0.00', - }; + const expectedResult = [ + 'uuid', + 'username', + 'name', + 'lastname', + 'bio', + 'profile_photo_path', + 'balance', + 'complete_name', + 'name_verified', + 'profile_photo_url', + 'average_rating', + ]; const { me } = await login(loginData); + const result = Object.keys(me); - expect(me).toEqual(expectedResult); + expect(result).toEqual(expectedResult); }); - it('should return an AxiosResponse when the request fails', async () => { + test('should return an AxiosResponse when the email fails', async () => { const loginData: Login = { email: 'asd@asd.asd', password: process.env.PASSWORD, @@ -44,4 +43,19 @@ describe('login', () => { expect(result).toEqual(expectedResult); }); + + test('should return an AxiosResponse when the password fails', async () => { + const loginData: Login = { + email: process.env.EMAIL, + password: '123test', + }; + + const expectedResult = { + error: 'Password mismatch', + }; + + const result = await login(loginData); + + expect(result).toEqual(expectedResult); + }); }); diff --git a/__test__/auth/logout.test.ts b/__test__/auth/logout.test.ts new file mode 100644 index 0000000..34d5ef2 --- /dev/null +++ b/__test__/auth/logout.test.ts @@ -0,0 +1,30 @@ +import 'dotenv/config'; +import { login, logout } from '../../src/api/auth'; +import { Login } from '../../src/interfaces'; + +const loginData: Login = { + email: process.env.EMAIL, + password: process.env.PASSWORD, +}; + +describe('logout', () => { + test('should return a successful response', async () => { + const expectedResponse = { + message: 'You have been successfully logged out!', + }; + + const { accessToken } = await login(loginData); + const response = await logout(accessToken); + + expect(response).toEqual(expectedResponse); + }); + + test('should return an error response', async () => { + const expectedErrorResponse = { message: 'Unauthenticated.' }; + + const accessToken = '123456789'; + const response = await logout(accessToken); + + expect(response).toEqual(expectedErrorResponse); + }); +}); diff --git a/__test__/auth/suma.test.ts b/__test__/auth/suma.test.ts deleted file mode 100644 index 372cd4c..0000000 --- a/__test__/auth/suma.test.ts +++ /dev/null @@ -1,6 +0,0 @@ - -describe('suma', () => { - test('suma 3', () => { - expect(2+2).toEqual(3) - }); -}); \ No newline at end of file diff --git a/__test__/merchants/appBalance.test.ts b/__test__/merchants/appBalance.test.ts new file mode 100644 index 0000000..055e084 --- /dev/null +++ b/__test__/merchants/appBalance.test.ts @@ -0,0 +1,30 @@ +import 'dotenv/config'; +import { AppAuth } from '../../src/interfaces'; +import { appBalance } from '../../src'; + +const authApp: AppAuth = { + app_id: process.env.APP_ID, + app_secret: process.env.APP_SECRET, +}; + +describe('app balance', () => { + test('should return a app balance', async () => { + const result = await appBalance(authApp); + + expect(typeof result).toEqual('number'); + }); + + test('should return an AxiosResponse when the request fails', async () => { + const expectedResult = { + error: 'APP no existe', + }; + + const authApp: AppAuth = { + app_id: 'test', + app_secret: 'test', + }; + const result = await appBalance(authApp); + + expect(result).toEqual(expectedResult); + }); +}); diff --git a/__test__/merchants/appInfo.test.ts b/__test__/merchants/appInfo.test.ts new file mode 100644 index 0000000..e9d85e3 --- /dev/null +++ b/__test__/merchants/appInfo.test.ts @@ -0,0 +1,42 @@ +import 'dotenv/config'; +import { AppAuth } from '../../src/interfaces'; +import { appInfo } from '../../src'; + +const authApp: AppAuth = { + app_id: process.env.APP_ID, + app_secret: process.env.APP_SECRET, +}; + +describe('app info', () => { + test('should return a successful response', async () => { + const expectedResult = [ + 'name', + 'url', + 'desc', + 'logo', + 'uuid', + 'active', + 'enabled', + 'created_at', + 'updated_at', + 'app_photo_url', + ]; + const result = await appInfo(authApp); + + expect(Object.keys(result)).toEqual(expectedResult); + }); + + test('should return an AxiosResponse when the request fails', async () => { + const expectedResult = { + error: 'APP no existe', + }; + + const authApp: AppAuth = { + app_id: 'test', + app_secret: 'test', + }; + const result = await appInfo(authApp); + + expect(result).toEqual(expectedResult); + }); +}); diff --git a/__test__/merchants/createInvoice.test.ts b/__test__/merchants/createInvoice.test.ts new file mode 100644 index 0000000..4022a4b --- /dev/null +++ b/__test__/merchants/createInvoice.test.ts @@ -0,0 +1,51 @@ +import 'dotenv/config'; +import { AppAuth, Invoice, InvoiceResponse } from '../../src/interfaces'; +import { createInvoice } from '../../src'; + +const authApp: AppAuth = { + app_id: process.env.APP_ID, + app_secret: process.env.APP_SECRET, +}; + +describe('create invoice', () => { + test('should return the invoice created', async () => { + const expectedResult: InvoiceResponse = { + app_id: '', + amount: 0, + description: '', + remote_id: '', + signed: 0, + transation_uuid: '', + url: '', + signedUrl: '', + }; + const invoice: Invoice = { + ...authApp, + amount: 99.99, + description: 'Enanitos verdes', + remote_id: 'MY_OWN_CUSTOM_ID', + signed: 1, + }; + + const result = await createInvoice(invoice); + + expect(Object.keys(result)).toEqual(Object.keys(expectedResult)); + }); + + test('should return an AxiosResponse when the request fails', async () => { + const expectedResult = { + error: 'APP no existe', + }; + const invoice: Invoice = { + app_id: 'test', + app_secret: 'test', + amount: 99.99, + description: 'Enanitos verdes', + remote_id: 'MY_OWN_CUSTOM_ID', + signed: 1, + }; + const result = await createInvoice(invoice); + + expect(result).toEqual(expectedResult); + }); +}); diff --git a/__test__/merchants/getOneTransactionFromApp.test.ts b/__test__/merchants/getOneTransactionFromApp.test.ts new file mode 100644 index 0000000..3ef9d57 --- /dev/null +++ b/__test__/merchants/getOneTransactionFromApp.test.ts @@ -0,0 +1,32 @@ +import 'dotenv/config'; +import { AppAuth } from '../../src/interfaces'; +import { getOneTransactionFromApp } from '../../src'; + +const authApp: AppAuth = { + app_id: process.env.APP_ID, + app_secret: process.env.APP_SECRET, +}; + +describe('get Transactions From App', () => { + test('should return the invoice created', async () => { + const id = 'ae06dce6-309c-4f96-9ef3-01b14938e8d7'; + const result = await getOneTransactionFromApp(authApp, id); + + expect(result).toBeInstanceOf(Object); + }); + + test('should return an AxiosResponse when the request fails', async () => { + const expectedResult = { + error: 'APP no existe', + }; + + const authApp: AppAuth = { + app_id: 'test', + app_secret: 'test', + }; + const id = 'ae06dce6-309c-4f96-9ef3-01b14938e8d7'; + const result = await getOneTransactionFromApp(authApp, id); + + expect(result).toEqual(expectedResult); + }); +}); diff --git a/__test__/merchants/getTransactionsFromApp.test.ts b/__test__/merchants/getTransactionsFromApp.test.ts new file mode 100644 index 0000000..9c85599 --- /dev/null +++ b/__test__/merchants/getTransactionsFromApp.test.ts @@ -0,0 +1,45 @@ +import 'dotenv/config'; +import { AppAuth } from '../../src/interfaces'; +import { getTransactionsFromApp } from '../../src'; + +const authApp: AppAuth = { + app_id: process.env.APP_ID, + app_secret: process.env.APP_SECRET, +}; + +describe('get Transactions From App', () => { + test('should return the invoice created', async () => { + const expectedResult = [ + 'current_page', + 'data', + 'first_page_url', + 'from', + 'last_page', + 'last_page_url', + 'links', + 'next_page_url', + 'path', + 'per_page', + 'prev_page_url', + 'to', + 'total', + ]; + const result = await getTransactionsFromApp(authApp); + + expect(Object.keys(result)).toEqual(expectedResult); + }); + + test('should return an AxiosResponse when the request fails', async () => { + const expectedResult = { + error: 'APP no existe', + }; + + const authApp: AppAuth = { + app_id: 'test', + app_secret: 'test', + }; + const result = await getTransactionsFromApp(authApp); + + expect(result).toEqual(expectedResult); + }); +}); diff --git a/__test__/p2p/getEnabledCurrencies.test.ts b/__test__/p2p/getEnabledCurrencies.test.ts new file mode 100644 index 0000000..9388585 --- /dev/null +++ b/__test__/p2p/getEnabledCurrencies.test.ts @@ -0,0 +1,9 @@ +import { getEnabledCurrencies } from '../../src'; + +describe('get Enabled Currencies', () => { + test('should return an array with the list of available currencies', async () => { + const result = await getEnabledCurrencies(); + + expect(result).toBeInstanceOf(Array); + }); +}); diff --git a/__test__/p2p/getOffers.test.ts b/__test__/p2p/getOffers.test.ts new file mode 100644 index 0000000..b4505df --- /dev/null +++ b/__test__/p2p/getOffers.test.ts @@ -0,0 +1,32 @@ +import 'dotenv/config'; +import { login, getOffers } from '../../src'; +import { Login, OffersParams } from '../../src/interfaces'; + +const loginData: Login = { + email: process.env.EMAIL, + password: process.env.PASSWORD, +}; +const props: OffersParams = { + coin: 'ETECSA', + min: 1, + max: 50, + type: 'buy' +}; + +describe('get Offers', () => { + test('should return an object with the data of the offers in an array', async () => { + const { accessToken } = await login(loginData); + const result = await getOffers(accessToken, props); + + expect(Object.keys(result)).toContain('data'); + }); + + test('should return an AxiosResponse when the request fails', async () => { + const expectedResult = { + message: 'Unauthenticated.', + }; + const result = await getOffers('test', props); + + expect(result).toEqual(expectedResult); + }); +}); diff --git a/__test__/p2p/getOneOffer.test.ts b/__test__/p2p/getOneOffer.test.ts new file mode 100644 index 0000000..a2088fb --- /dev/null +++ b/__test__/p2p/getOneOffer.test.ts @@ -0,0 +1,27 @@ +import 'dotenv/config'; +import { login, getOneOffer } from '../../src'; +import { Login } from '../../src/interfaces'; + +const loginData: Login = { + email: process.env.EMAIL, + password: process.env.PASSWORD, +}; +const id = '9e94e64d-3f4c-4010-9c3d-a855fbf0f04f'; + +describe('get one offer', () => { + test('should return an object with the data of the offers in an array', async () => { + const { accessToken } = await login(loginData); + const result = await getOneOffer(accessToken, id); + + expect(Object.keys(result)).toContain('data'); + }); + + test('should return an AxiosResponse when the request fails', async () => { + const expectedResult = { + message: 'Unauthenticated.', + }; + const result = await getOneOffer('test', id); + + expect(result).toEqual(expectedResult); + }); +}); diff --git a/__test__/p2p/getPairsAverage.test.ts b/__test__/p2p/getPairsAverage.test.ts new file mode 100644 index 0000000..7f32a12 --- /dev/null +++ b/__test__/p2p/getPairsAverage.test.ts @@ -0,0 +1,17 @@ +import { getPairsAverage } from '../../src'; + +describe('get Pairs Average', () => { + test('should return an object containing an array with the available offers', async () => { + const coin = 'usdt'; + const result = await getPairsAverage(coin); + + expect(Object.keys(result)).toContain('offers'); + }); + + test('should return 0 when no result is found', async () => { + const coin = 'test'; + const result = await getPairsAverage(coin); + + expect(result).toBe(0); + }); +}); diff --git a/__test__/payment-links/createPaymentLink.test.ts b/__test__/payment-links/createPaymentLink.test.ts new file mode 100644 index 0000000..8447ab3 --- /dev/null +++ b/__test__/payment-links/createPaymentLink.test.ts @@ -0,0 +1,41 @@ +import 'dotenv/config'; +import { Login, PaymentLink } from '../../src/interfaces'; +import { login, createPaymentLink } from '../../src'; + +const loginData: Login = { + email: process.env.EMAIL, + password: process.env.PASSWORD, +}; + +const info: PaymentLink = { + name: 'Pulover de guinga azul', + product_id: 'PVG-AZUL', + amount: 10.32, +}; + +describe('get All Payment Links', () => { + test('should return an object with the payment link information', async () => { + const expectedResult = [ + 'name', + 'product_id', + 'amount', + 'updated_at', + 'created_at', + 'payment_link_url', + ]; + const { accessToken } = await login(loginData); + const result = await createPaymentLink(accessToken, info); + + expect(Object.keys(result)).toEqual(expectedResult); + }); + + test('should return an AxiosResponse when the request fails', async () => { + const expectedResult = { + message: 'Unauthenticated.', + }; + const accessToken = 'test'; + const result = await createPaymentLink(accessToken, info); + + expect(result).toEqual(expectedResult); + }); +}); diff --git a/__test__/payment-links/getAllPaymentLinks.test.ts b/__test__/payment-links/getAllPaymentLinks.test.ts new file mode 100644 index 0000000..d7c2064 --- /dev/null +++ b/__test__/payment-links/getAllPaymentLinks.test.ts @@ -0,0 +1,27 @@ +import 'dotenv/config'; +import { Login } from '../../src/interfaces'; +import { login, getAllPaymentLinks } from '../../src'; + +const loginData: Login = { + email: process.env.EMAIL, + password: process.env.PASSWORD, +}; + +describe('get All Payment Links', () => { + test('should return an array with all payment links', async () => { + const { accessToken } = await login(loginData); + const result = await getAllPaymentLinks(accessToken); + + expect(result).toBeInstanceOf(Array); + }); + + test('should return an AxiosResponse when the request fails', async () => { + const expectedResult = { + message: 'Unauthenticated.', + }; + const accessToken = 'test'; + const result = await getAllPaymentLinks(accessToken); + + expect(result).toEqual(expectedResult); + }); +}); diff --git a/__test__/rates/currentCoins.test.ts b/__test__/rates/currentCoins.test.ts new file mode 100644 index 0000000..da764a9 --- /dev/null +++ b/__test__/rates/currentCoins.test.ts @@ -0,0 +1,9 @@ +import { currentCoins } from '../../src'; + +describe('current Coins', () => { + test('should return an array that in its first position contains an object with the coins', async () => { + const result = await currentCoins(); + + expect(Object.keys(result[0])).toContain('coins'); + }); +}); diff --git a/__test__/rates/currentRates.test.ts b/__test__/rates/currentRates.test.ts new file mode 100644 index 0000000..884d515 --- /dev/null +++ b/__test__/rates/currentRates.test.ts @@ -0,0 +1,9 @@ +import { currentRates } from '../../src'; + +describe('current Rates', () => { + test('should return an array that in its first position contains an object with the coins', async () => { + const result = await currentRates(); + + expect(Object.keys(result[0])).toContain('coins'); + }); +}); diff --git a/__test__/services/getOneService.test.ts b/__test__/services/getOneService.test.ts new file mode 100644 index 0000000..7c48baf --- /dev/null +++ b/__test__/services/getOneService.test.ts @@ -0,0 +1,36 @@ +import 'dotenv/config'; +import { Login } from '../../src/interfaces'; +import { login, getOneService } from '../../src'; + +const loginData: Login = { + email: process.env.EMAIL, + password: process.env.PASSWORD, +}; +const id: string = '629f7ec8-579e-4282-892c-f13a342a0975'; + +describe('get One Service', () => { + test('should return an object with the information of the service that is consulted', async () => { + const expectedResult = [ + 'uuid', + 'name', + 'lead', + 'price', + 'desc', + 'service_photo_url', + ]; + const { accessToken } = await login(loginData); + const result = await getOneService(accessToken, id); + + expect(Object.keys(result)).toEqual(expectedResult); + }); + + test('should return an AxiosResponse when the request fails', async () => { + const expectedResult = { + message: 'Unauthenticated.', + }; + const accessToken = 'test'; + const result = await getOneService(accessToken, id); + + expect(result).toEqual(expectedResult); + }); +}); diff --git a/__test__/services/getServices.test.ts b/__test__/services/getServices.test.ts new file mode 100644 index 0000000..53ed092 --- /dev/null +++ b/__test__/services/getServices.test.ts @@ -0,0 +1,27 @@ +import 'dotenv/config'; +import { Login } from '../../src/interfaces'; +import { login, getAllServices } from '../../src'; + +const loginData: Login = { + email: process.env.EMAIL, + password: process.env.PASSWORD, +}; + +describe('get All Services', () => { + test('should return an arrangement with all the services offered', async () => { + const { accessToken } = await login(loginData); + const result = await getAllServices(accessToken); + + expect(result).toBeInstanceOf(Array); + }); + + test('should return an AxiosResponse when the request fails', async () => { + const expectedResult = { + message: 'Unauthenticated.', + }; + const accessToken = 'test'; + const result = await getAllServices(accessToken); + + expect(result).toEqual(expectedResult); + }); +}); diff --git a/__test__/transactions/getOneTransaction.test.ts b/__test__/transactions/getOneTransaction.test.ts new file mode 100644 index 0000000..b8ad500 --- /dev/null +++ b/__test__/transactions/getOneTransaction.test.ts @@ -0,0 +1,46 @@ +import 'dotenv/config'; +import { Login } from '../../src/interfaces'; +import { login, getOneTransaction } from '../../src'; + +const loginData: Login = { + email: process.env.EMAIL, + password: process.env.PASSWORD, +}; + +describe('get one transaction', () => { + test('should return a successful response', async () => { + const expectedResult = [ + 'uuid', + 'app_id', + 'amount', + 'description', + 'remote_id', + 'status', + 'created_at', + 'updated_at', + 'app', + 'paid_by', + 'app_owner', + 'owner', + 'wallet', + 'servicebuy', + ]; + + const { accessToken } = await login(loginData); + const id = '252952e6-4f19-46a8-83ae-491abcdf93e4'; + const result = await getOneTransaction(accessToken, id); + + expect(Object.keys(result)).toEqual(expectedResult); + }); + + test('should return an AxiosResponse when the request fails', async () => { + const expectedResult = { + message: 'Unauthenticated.', + }; + const accessToken = 'test'; + const id = '252952e6-4f19-46a8-83ae-491abcdf93e4'; + const result = await getOneTransaction(accessToken, id); + + expect(result).toEqual(expectedResult); + }); +}); diff --git a/__test__/transactions/getOneWithdraw.test.ts b/__test__/transactions/getOneWithdraw.test.ts new file mode 100644 index 0000000..dc667e6 --- /dev/null +++ b/__test__/transactions/getOneWithdraw.test.ts @@ -0,0 +1,29 @@ +import 'dotenv/config'; +import { Login } from '../../src/interfaces'; +import { login, getOneWithdraw } from '../../src'; + +const loginData: Login = { + email: process.env.EMAIL, + password: process.env.PASSWORD, +}; + +describe('get one withdraw', () => { + test('should return a successful response', async () => { + const { accessToken } = await login(loginData); + const id = '10790'; + const result = await getOneWithdraw(accessToken, id); + + expect(result).toBeInstanceOf(Object); + }); + + test('should return an AxiosResponse when the request fails', async () => { + const expectedResult = { + message: 'Unauthenticated.', + }; + const accessToken = 'test'; + const id = '252952e6-4f19-46a8-83ae-491abcdf93e4'; + const result = await getOneWithdraw(accessToken, id); + + expect(result).toEqual(expectedResult); + }); +}); diff --git a/__test__/transactions/getTransactionsFromUserAuth.test.ts b/__test__/transactions/getTransactionsFromUserAuth.test.ts new file mode 100644 index 0000000..b659873 --- /dev/null +++ b/__test__/transactions/getTransactionsFromUserAuth.test.ts @@ -0,0 +1,33 @@ +import 'dotenv/config'; +import { Login, TransactionProps } from '../../src/interfaces'; +import { login, getTransactionsFromUserAuth } from '../../src'; + +const loginData: Login = { + email: process.env.EMAIL, + password: process.env.PASSWORD, +}; + +describe('get Transactions From User Auth', () => { + test('should return a instace of Array when the request is successful', async () => { + const { accessToken } = await login(loginData); + const props: TransactionProps = { + status: 'pending', + }; + const result = await getTransactionsFromUserAuth(accessToken, props); + + expect(result).toBeInstanceOf(Array); + }); + + test('should return an AxiosResponse when the request fails', async () => { + const expectedResult = { + message: 'Unauthenticated.', + }; + const accessToken = 'test'; + const props: TransactionProps = { + status: 'pending', + }; + const result = await getTransactionsFromUserAuth(accessToken, props); + + expect(result).toEqual(expectedResult); + }); +}); diff --git a/__test__/transactions/getWithdrawsFromUserAuth.test.ts b/__test__/transactions/getWithdrawsFromUserAuth.test.ts new file mode 100644 index 0000000..2ac6982 --- /dev/null +++ b/__test__/transactions/getWithdrawsFromUserAuth.test.ts @@ -0,0 +1,43 @@ +import 'dotenv/config'; +import { Login } from '../../src/interfaces'; +import { login, getWithdrawsFromUserAuth } from '../../src'; + +const loginData: Login = { + email: process.env.EMAIL, + password: process.env.PASSWORD, +}; + +describe('get Withdraws From User Auth', () => { + test('should return a successful response', async () => { + const expectedResult = [ + 'current_page', + 'data', + 'first_page_url', + 'from', + 'last_page', + 'last_page_url', + 'links', + 'next_page_url', + 'path', + 'per_page', + 'prev_page_url', + 'to', + 'total', + ]; + + const { accessToken } = await login(loginData); + const result = await getWithdrawsFromUserAuth(accessToken); + + expect(Object.keys(result)).toEqual(expectedResult); + }); + + test('should return an AxiosResponse when the request fails', async () => { + const expectedResult = { + message: 'Unauthenticated.', + }; + const accessToken = 'test'; + const result = await getWithdrawsFromUserAuth(accessToken); + + expect(result).toEqual(expectedResult); + }); +}); diff --git a/__test__/user/getUser.test.ts b/__test__/user/getUser.test.ts new file mode 100644 index 0000000..f34e0ab --- /dev/null +++ b/__test__/user/getUser.test.ts @@ -0,0 +1,45 @@ +import 'dotenv/config'; +import { login, getUser } from '../../src'; +import { Login } from '../../src/interfaces'; + +const loginData: Login = { + email: process.env.EMAIL, + password: process.env.PASSWORD, +}; + +describe('get User', () => { + test('should return a successful response', async () => { + const expectedResponse = [ + 'uuid', + 'username', + 'name', + 'lastname', + 'email', + 'bio', + 'profile_photo_path', + 'balance', + 'total_in', + 'total_out', + 'latestTransactions', + 'complete_name', + 'name_verified', + 'profile_photo_url', + 'average_rating', + ]; + + const { accessToken } = await login(loginData); + const response = await getUser(accessToken); + const compare = Object.keys(response); + + expect(compare).toEqual(expectedResponse); + }); + + test('should return an error response', async () => { + const expectedErrorResponse = { message: 'Unauthenticated.' }; + + const accessToken = '123456789'; + const response = await getUser(accessToken); + + expect(response).toEqual(expectedErrorResponse); + }); +}); diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..495244a --- /dev/null +++ b/docs/README.md @@ -0,0 +1,471 @@ +# Instrucciones + +1. Instala el SDK. + +```shell +npm install qvapay-sdk +o +yarn add qvapay-sdk +``` + +2. Configure en su archivo .env las siguentes variables de entorno: + +```shell +APP_ID= +APP_SECRET= +EMAIL= +PASSWORD= +``` + +3. Cree un objeto con sus credenciales, incluyendo nombre de usuario y contraseña. Asegúrese de que la contraseña sea segura y no se comparta con nadie: + +```js +const userLogin = { + email: process.env.EMAIL, + password: process.env.PASSWORD, +}; +``` + +4. Cree un objeto con sus credenciales de Auth para su aplicación: + +```js +const appAuth = { + app_id: process.env.APP_ID, + app_secret: process.env.APP_SECRET, +}; +``` + +> Ahora que has instalado el SDK y configurado sus opciones primarias, estás listo para comenzar a usar todas las funcionalidades que te ofrece. ¡Aprovecha al máximo todas las posibilidades que este SDK te ofrece! + +--- + +# Aviso +!> En los ejemplos que siguen, se usa el accessToken que retorna la función login(). Sin embargo, tenga presente que usted puede guardar este token de la forma que prefiera y usarlo posteriormente para realizar operaciones en su aplicación. + +# Guía + +> El SDK de Qvapay para Typescript le permite a los desarrolladores aprovechar la API de Qvapay para crear aplicaciones y servicios con una interfaz de programación sencilla. El SDK proporciona herramientas para realizar pagos, administrar cuentas, realizar transacciones, consultar información de usuarios y mucho más. Está diseñado para ser fácilmente integrable con cualquier aplicación o servicio que se ejecute en Typescript. + +## Auth + +> La sección Auth contiene las funciones login, register y logout. Estas funciones son esenciales para garantizar que solo los usuarios autorizados puedan acceder al contenido y realizar acciones en la aplicación. Todas las funciones son asíncronas y retornan una promesa con la data o el error de la request. + +### Login + +> Esta función se encarga de realizar una petición POST a la API de Qvapay para iniciar sesión. + +```js +import { login } from 'qvapay-sdk'; + +const res = await login(userLogin); +``` + +### Register + +> Esta función se usa para registrar un usuario. Utiliza la API de qvapay para enviar los datos de registro al servidor. Si el registro se realiza correctamente, devuelve los datos recibidos del servidor. Si hay algún error, devuelve el error. + +```js +import { register } from 'qvapay-sdk'; + +const newUser = { + name: 'Juan Perez', + email: 'juan@gmail.com', + password: 'CffasdKB73iTtzNJN', + c_password: 'CffasdKB73iTtzNJN', + invite: 'referer_username (OPTIONAL)', +}; + +const res = await register(newUser); +``` + +### Logout + +> Esta función intenta realizar una solicitud GET a la API qvapay para cerrar la sesión del usuario. Si la solicitud se realiza con éxito, devuelve los datos de respuesta. Si hay algún error, devuelve los datos de respuesta del error. + +```js +import { login, logout } from 'qvapay-sdk'; + +const { accessToken } = await login(userLogin); +const res = await logout(accessToken); +``` + +## User + +> La sección User ofrece una variedad de funcionalidades para administrar la información de los usuarios. La función getUser permite obtener información acerca de un usuario específico. La función updateUser permite actualizar la información del usuario. La función deposit permite realizar depósitos en la cuenta del usuario. Por último, la función withdraw permite realizar retiros desde la cuenta del usuario. Estas funcionalidades permiten a los usuarios administrar sus cuentas de forma segura y eficiente. Todas las funciones retornan una promesa con la data o el error de la request. + +### getUser + +> Este código es una función asíncrona que obtiene un usuario de la API de Qvapay. Esta función toma un token de acceso como parámetro y realiza una solicitud GET a la ruta '/user' con el token de acceso en los encabezados. Si la solicitud se completa con éxito, devuelve los datos del usuario como respuesta. Si hay algún error, devuelve los datos del error como respuesta. + +```js +import { login, getUser } from 'qvapay-sdk'; + +const { accessToken } = await login(userLogin); +const res = await getUser(accessToken); +``` + +### updateUser + +> Esta función se utiliza para actualizar un usuario en la API de Qvapay. Toma dos parámetros: un token de acceso y los datos a actualizar. La función intenta realizar la solicitud PUT a la API con los datos proporcionados y el token de acceso. Si la solicitud es exitosa, devuelve los datos recibidos. Si hay algún error, devuelve los datos recibidos en la respuesta del error. + +```js +import { login, updateUser } from 'qvapay-sdk'; + +const { accessToken } = await login(userLogin); +const dataToUpdate = { + name: 'Pedro Perez1', + lastname: 'st', + bio: 'svwb erberberb', + logo: '', + kyc: 1, + username: 'wpiuwe', + email: 'egc31@gmail.com', + password: 'CffasdKB73iTtzNJN', +}; + +const res = await updateUser(accessToken, dataToUpdate); +``` + +### deposit + +> Esta función se utiliza para realizar un depósito. La función toma dos parámetros: un token de acceso y un nuevo depósito. Utiliza la API de Qvapay para realizar el depósito. Si hay un error, la función devuelve los datos de la respuesta del servidor. Si no hay errores, devuelve los datos de la transacción. + +```js +import { login, deposit } from 'qvapay-sdk'; + +const { accessToken } = await login(userLogin); +const newDeposit = { + pay_method: 'BTCLN', + amount: 67, +}; + +const res = await deposit(accessToken, newDeposit); +``` + +### withdraw + +> Esta función se utiliza para hacer una extracción de la API Qvapay. Toma dos parámetros: un token de acceso y un objeto Withdraw. Luego, intenta realizar una solicitud POST a la ruta '/withdraw' con los datos del objeto Withdraw y el token de acceso en el encabezado. Si la solicitud es exitosa, devuelve los datos recibidos. Si hay algún error, devuelve los datos recibidos en la respuesta del error. + +```js +import { login, withdraw } from 'qvapay-sdk'; + +const { accessToken } = await login(userLogin); +const newWithdraw = { + pay_method: 'BTCLN', + amount: 4, + details: [ + { + Wallet: 'bc1qs67kwcf7znpnc06xjh8cnc0zwsechcfxscghun', + }, + ], +}; + +const res = await withdraw(accessToken, newWithdraw); +``` + +--- + +## Transactions + +> La sección Transactions ofrece una variedad de funciones para administrar las transacciones y retiros realizados por los usuarios. Estas funciones incluyen getOneTransaction, que permite obtener información sobre una transacción específica; getOneWithdraw, que permite obtener información sobre un retiro específico; getTransactionsFromUserAuth, que permite obtener todas las transacciones realizadas por el usuario autenticado; getWithdrawsFromUserAuth, que permite obtener todos los retiros realizados por el usuario autenticado; payPendingTransaction, que permite pagar una transacción pendiente; y transferBetweenUser, que permite transferir fondos entre dos usuarios. Estas funciones permiten a los usuarios administrar sus transacciones y retiros de forma segura y eficiente. + +### getTransactionsFromUserAuth + +> Esta función obtiene transacciones de un usuario autenticado. Toma dos parámetros, un token de acceso y un objeto de propiedades de transacción. Convierte el objeto de propiedades en entradas y parámetros de búsqueda, luego hace una solicitud GET a la API qvapay con los encabezados adecuados. Si la solicitud se realiza con éxito, devuelve los datos recibidos. Si hay un error, devuelve los datos recibidos como respuesta del error. + +```js +import {login, getTransactionsFromUserAuth} from 'qvapay-sdk' + +const { accessToken } = await login(userLogin); +const props = { + start: date_time + end: date_time + status: [paid, pending, cancelled] + remote_id: string + description: string +} + +const res = await getTransactionsFromUserAuth(accessToken, props) +``` + +### getOneTransaction + +> Este código es una función asíncrona que se utiliza para obtener una transacción específica a partir de un token de acceso y un ID. Utiliza la API Qvapay para hacer la solicitud, y devuelve los datos de la transacción como respuesta. Si hay algún error, devuelve los datos de la respuesta del error. + +```js +import { login, getOneTransaction } from 'qvapay-sdk'; + +const { accessToken } = await login(userLogin); +const id = '7e48853f-949c-4271-9b4a-1213ee83ac11'; + +const res = await getOneTransaction(accessToken, id); +``` + +### getWithdrawsFromUserAuth + +> Esta función se utiliza para obtener los retiros de un usuario autenticado. Utiliza el token de acceso proporcionado como parámetro para realizar una solicitud GET a la API Qvapay. Si la solicitud es exitosa, devuelve los datos recibidos en forma de respuesta con retiro. Si hay algún error, devuelve los datos recibidos en la respuesta del error. + +```js +import { login, getWithdrawsFromUserAuth } from 'qvapay-sdk'; + +const { accessToken } = await login(userLogin); +const res = await getWithdrawsFromUserAuth(accessToken); +``` + +### getOneWithdraw + +> Esta función recibe dos parámetros: un token de acceso y una identificación. Esta función intenta obtener los datos de un retiro específico a través de la API Qvapay utilizando el token de acceso proporcionado. Si la solicitud se realiza con éxito, devuelve los datos del retiro. Si hay algún error, devuelve los datos del error. + +```js +import { login, getOneWithdraw } from 'qvapay-sdk'; + +const { accessToken } = await login(userLogin); +const id = '10790'; + +const res = await getOneWithdraw(accessToken, id); +``` + +### transferBetweenUser + +> Esta función se utiliza para transferir fondos entre usuarios. La función toma dos parámetros: accessToken y transfer. El accessToken se utiliza para autenticar la solicitud de transferencia. El transfer es un objeto que contiene información sobre el monto a transferir, el destinatario, etc. La función realiza una solicitud POST a la API qvapay para realizar la transferencia. Si la solicitud es exitosa, devuelve los datos de la transacción como resultado. En caso de error, devuelve los datos de error. + +```js +import { login, transferBetweenUser } from 'qvapay-sdk'; + +const { accessToken } = await login(userLogin); +const transfer = { + to: '52ff1628-5e91-4083-bc8e-6accce9a7d15', + amount: 10, + description: 'TESTING', +}; + +const res = await transferBetweenUser(accessToken, transfer); +``` + +### payPendingTransaction + +> Esta función se encarga de realizar el pago de una transacción pendiente. Toma como parámetros el token de acceso y los detalles de la transacción a pagar. Intenta realizar el pago utilizando la API Qvapay y devuelve una respuesta con los resultados. Si hay un error, devuelve los datos del error. El PIN por defecto es 0000, pero se recomienda configurar un PIN secreto en el panel de usuario para mayor seguridad. + +```js +import { login, payPendingTransaction } from 'qvapay-sdk'; + +const { accessToken } = await login(userLogin); +const pay = { + uuid: '710296b7-0d5d-4e86-ab1b-9d79080dd042', + pin: '0000', +}; + +const res = await payPendingTransaction(accessToken, pay); +``` + +--- + +## Merchants + +> La sección Merchants le permite a los usuarios realizar operaciones financieras como consultar el saldo de una aplicación, obtener información sobre una aplicación, crear facturas, obtener una transacción de una aplicación y obtener transacciones de una aplicación. Estas funcionalidades le permiten al usuario administrar sus finanzas con facilidad y seguridad. + +### appInfo + +> Esta función se utiliza para obtener información sobre una aplicación. La función toma un objeto "AppAuth" como parámetro y devuelve un objeto "AppInfo" como promesa. La función intenta realizar una solicitud POST a la API qvapay para obtener la información de la aplicación. Si la solicitud es exitosa, devuelve los datos recibidos en el objeto "data". Si hay algún error, devuelve los datos recibidos en el objeto "response". + +```js +import { appInfo } from 'qvapay-sdk'; + +const res = await appInfo(appAuth); +``` + +### appBalance + +> Esta función se utiliza para obtener el saldo de una aplicación. Utiliza la API de Qvapay para enviar una solicitud POST con los datos de autenticación de la aplicación. Si la solicitud se procesa correctamente, devuelve los datos del saldo. Si hay un error, devuelve los datos del error. + +```js +import { appBalance } from 'qvapay-sdk'; + +const res = await appBalance(appAuth); +``` + +### createInvoice + +> Esta función permite crear una factura mediante la API de Qvapay. La función toma un objeto "invoice" como parámetro y devuelve una promesa con el objeto de respuesta "InvoiceResponse". El código intenta realizar una solicitud POST a la API de Qvapay para crear la factura. Si hay algún error, el código captura el error y devuelve los datos de la respuesta. + +```js +import { createInvoice } from 'qvapay-sdk'; + +const invoice = { + ...appAuth, + amount: 99.99, + description: 'Enanitos verdes', + remote_id: 'MY_OWN_CUSTOM_ID', + signed: 1, +}; +const res = await createInvoice(invoice); +``` + +### getTransactionsFromApp + +> Esta función toma un parámetro auth de tipo AppAuth. Esta función hace una solicitud POST a la API qvapay para obtener datos de transacciones. Si la solicitud se realiza con éxito, devuelve los datos recuperados en formato de promesa. Si hay algún error, devuelve los datos recuperados en el objeto de respuesta AxiosError. + +```js +import { getTransactionsFromApp } from 'qvapay-sdk'; + +const res = await getTransactionsFromApp(appAuth); +``` + +### getOneTransactionFromApp + +> Esta función se utiliza para obtener una transacción específica de una aplicación. Toma dos parámetros: auth (una autenticación de la aplicación) y id (el identificador de la transacción). La función envía una solicitud POST al servidor para recuperar los datos de la transacción especificada. Si la solicitud tiene éxito, devuelve los datos recuperados. En caso contrario, devuelve los datos del error. + +```js +import { getOneTransactionFromApp } from 'qvapay-sdk'; + +const id = '54079648-39bc-49ef-bd3e-b89032a7ac05'; +const res = await getOneTransactionFromApp(appAuth, id); +``` + +--- + +## Payment Links + +> La sección Payment Links le permite a los usuarios crear enlaces de pago personalizados para recibir pagos de sus clientes. Estos enlaces pueden ser compartidos a través de correo electrónico, redes sociales o cualquier otra plataforma para que los clientes realicen el pago directamente desde su dispositivo. Además, la sección Payment Links también le permite al usuario ver todos los enlaces de pago creados y consultar el estado de cada uno. + +### getAllPaymentLinks + +> Esta función se utiliza para obtener todos los enlaces de pago. Utiliza la API QVAPay para realizar una solicitud GET a la ruta '/payment_links' con el token de acceso proporcionado como encabezado. Si la solicitud se realiza correctamente, devuelve los datos recibidos en la respuesta. En caso de error, devuelve los datos recibidos en la respuesta del error. + +```js +import { login, getAllPaymentLinks } from 'qvapay-sdk'; + +const { accessToken } = await login(userLogin); +const res = await getAllPaymentLinks(accessToken); +``` + +### createPaymentLink + +> Esta función crea un enlace de pago usando la API de Qvapay. Toma un token de acceso y un objeto con información sobre el pago como parámetros, realiza una solicitud POST a la API y devuelve los datos de respuesta. Si hay algún error, captura la excepción y devuelve los datos de respuesta. + +```js +import { login, createPaymentLink } from 'qvapay-sdk'; + +const { accessToken } = await login(userLogin); +const info = { + name: 'Pulover de guinga azul', + product_id: 'PVG-AZUL', + amount: 10.32, +}; + +const res = await createPaymentLink(accessToken, info); +``` + +--- + +## Services + +> Nuestra sección de servicios cuenta con dos funcionalidades principales: getAllServices y getOneService, que te permiten obtener información detallada sobre cada uno de nuestros servicios. + +### getAllServices + +> Esta función se encarga de obtener todos los servicios disponibles. Esta función toma un token de acceso como parámetro y realiza una solicitud GET a la API qvapay para obtener los datos de los servicios. Si la solicitud es exitosa, devuelve los datos como respuesta. En caso contrario, devuelve los datos de la respuesta del error. + +```js +import { login, getAllServices } from 'qvapay-sdk'; + +const { accessToken } = await login(userLogin); +const res = await getAllServices(accessToken); +``` + +### getOneService + +> Esta función se utiliza para obtener un servicio específico utilizando un token de acceso y un ID. Utiliza la API Qvapay para realizar la solicitud y devolver los datos del servicio solicitado. Si hay un error, maneja el error y devuelve los datos de la respuesta. + +```js +import { login, getOneService } from 'qvapay-sdk'; + +const { accessToken } = await login(userLogin); +const id = 'e286449c-5bf4-4fbc-9a85-95bb5b54c73e'; + +const res = await getOneService(accessToken, id); +``` + +--- + +## P2P + +> La sección P2P ofrece una variedad de funciones para facilitar el intercambio de monedas digitales entre usuarios. Estas funciones incluyen getEnabledCurrencies, que permite a los usuarios ver qué monedas están habilitadas para el intercambio; getOffers, que permite a los usuarios ver todas las ofertas disponibles; getOneOffer, que permite a los usuarios ver una oferta específica; y getPairsAverage, que calcula el promedio de precios para un par de monedas específico. Estas herramientas permiten a los usuarios realizar transacciones rápidas y seguras con otros usuarios en la plataforma. + +### getEnabledCurrencies + +> Esta función se utiliza para obtener una lista de monedas habilitadas. Utiliza la API de Qvapay para realizar una solicitud GET a la ruta '/p2p/get_coins_list'. Si la solicitud se completa con éxito, devuelve los datos recibidos. Si hay algún error, devuelve los datos de la respuesta del error. + +```js +import { getEnabledCurrencies } from 'qvapay-sdk'; + +const res = await getEnabledCurrencies(); +``` + +### getPairsAverage + +> Esta función se utiliza para obtener el promedio de pares completados para una moneda específica. Utiliza la API de Qvapay para realizar la solicitud y devuelve los datos como una respuesta de promesa. En caso de que ocurra un error, maneja la excepción y devuelve los datos del error como respuesta. + +```js +import { getPairsAverage } from 'qvapay-sdk'; + +const coin = 'TRX'; +const res = await getPairsAverage(coin); +``` + +### getOffers + +> Esta función toma dos parámetros: accessToken y props. Primero, convierte los parámetros en un objeto URLSearchParams y luego realiza una solicitud GET a la API con el token de acceso proporcionado como encabezado de autorización. Si la solicitud se completa correctamente, devuelve los datos recibidos. Si hay algún error, devuelve los datos del error recibido en la respuesta. + +```js +import { login, getOffers } from 'qvapay-sdk'; + +const { accessToken } = await login(userLogin); +const props = { + type: 'buy', + coin: 'ETECSA', + min: 1, + max: 50, +}; +const res = await getOffers(accessToken, props); +``` + +### getOneOffer + +> Esta función se utiliza para obtener una oferta específica a través de la API QVapay. La función toma dos parámetros: accessToken y id. Utiliza el token de acceso para autenticar la solicitud y el id para identificar la oferta específica. Luego, realiza una solicitud GET a la API QVapay para recuperar los datos de la oferta. Si hay algún error, manejará la respuesta del servidor y devolverá los datos. Finalmente, devuelve los datos de la oferta como un objeto Promise. + +```js +import { login, getOneOffer } from 'qvapay-sdk'; + +const { accessToken } = await login(userLogin); +const id = '949780ed-7303-4a34-b8c3-2d55d802c75d'; + +const res = await getOneOffer(accessToken, id); +``` +___ + +## Rates + +> La sección reates cuenta con las funciones currentCoins, currentRates. Haciendo uso de estas puede mantener a sus usuarios al tanto de las tarifas actualizadas. + +### currentRates + +> Esta función devuelve una promesa de una matriz de tasas actuales. Obtiene los datos desde la API de qvapayAPI. Si la solicitud se realiza correctamente, devolverá los datos recibidos. Si hay algún error en la solicitud, devolverá los datos recibidos en la respuesta del error. + +```js +import { currentRates } from 'qvapay-sdk'; + +const res = await currentRates(); +``` + +### currentCoins + +> Esta función devuelve una promesa con una matriz de tasas actuales. Esta función obtiene los datos de la API qvapay. Si la solicitud es exitosa, los datos se devuelven como parte de la respuesta. Si hay un error, los datos se devuelven como parte de la respuesta del error. Esta función es útil para obtener información sobre las monedas actuales y sus tasas de cambio. + +```js +import { currentCoins } from 'qvapay-sdk'; + +const res = await currentCoins(); +``` +# Ayúdanos a mejorar +?> Este proyecto está en desarrollo y busca ofrecer una solución de código abierto para interactuar con la API de QvaPay. Estamos abiertos a cualquier sugerencia o feedback que nos ayude a mejorar el proyecto. Estamos comprometidos con la satisfacción de nuestros usuarios, por lo que cualquier contribución es bienvenida. Si tienes alguna idea para mejorar el proyecto, no dudes en compartirla con nosotros. ¡Estamos ansiosos por escuchar tus ideas! \ No newline at end of file diff --git a/docs/cover.md b/docs/cover.md new file mode 100644 index 0000000..cbd5b40 --- /dev/null +++ b/docs/cover.md @@ -0,0 +1,14 @@ +![logo](https://avatars.githubusercontent.com/u/88758865?s=200&v=4) + +# QvaPay SDK + +> ¿Qué resultados puedes esperar? + +- Integra QvaPay a tus proyectos en minutos. +- Mejora la seguridad de tu aplicación. +- Funciones totalmente testeadas. +- Reduce el tiempo de desarrollo. + +[Get Started](/?id=instrucciones) + +![color](#8300FF) diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..26f0c59 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,34 @@ + + + + + QvaPay Docs + + + + + + + + +
+ + + + + diff --git a/docs/theme-simple-dark.css b/docs/theme-simple-dark.css new file mode 100644 index 0000000..c7c1bd3 --- /dev/null +++ b/docs/theme-simple-dark.css @@ -0,0 +1,2582 @@ +.github-corner { + position: absolute; + z-index: 40; + top: 0; + right: 0; + border-bottom: 0; + text-decoration: none; +} +.github-corner svg { + height: 70px; + width: 70px; + fill: var(--theme-color); + color: var(--base-background-color); +} +.github-corner:hover .octo-arm { + -webkit-animation: octocat-wave 560ms ease-in-out; + animation: octocat-wave 560ms ease-in-out; +} +@-webkit-keyframes octocat-wave { + 0%, + 100% { + transform: rotate(0); + } + 20%, + 60% { + transform: rotate(-25deg); + } + 40%, + 80% { + transform: rotate(10deg); + } +} +@keyframes octocat-wave { + 0%, + 100% { + transform: rotate(0); + } + 20%, + 60% { + transform: rotate(-25deg); + } + 40%, + 80% { + transform: rotate(10deg); + } +} +.progress { + position: fixed; + z-index: 2147483647; + top: 0; + left: 0; + right: 0; + height: 3px; + width: 0; + background-color: var(--theme-color); + transition: width var(--duration-fast), opacity calc(var(--duration-fast) * 2); +} +body.ready-transition:after, +body.ready-transition > *:not(.progress) { + opacity: 0; + transition: opacity var(--spinner-transition-duration); +} +body.ready-transition:after { + content: ''; + position: absolute; + z-index: 1000; + top: calc(50% - var(--spinner-size) / 2); + left: calc(50% - var(--spinner-size) / 2); + height: var(--spinner-size); + width: var(--spinner-size); + border: var(--spinner-track-width, 0) solid var(--spinner-track-color); + border-left-color: var(--theme-color); + border-left-color: var(--theme-color); + border-radius: 50%; + -webkit-animation: spinner var(--duration-slow) infinite linear; + animation: spinner var(--duration-slow) infinite linear; +} +body.ready-transition.ready-spinner:after { + opacity: 1; +} +body.ready-transition.ready-fix:after { + opacity: 0; +} +body.ready-transition.ready-fix > *:not(.progress) { + opacity: 1; + transition-delay: var(--spinner-transition-duration); +} +@-webkit-keyframes spinner { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} +@keyframes spinner { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} +*, +*:before, +*:after { + box-sizing: inherit; + font-size: inherit; + -webkit-overflow-scrolling: touch; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + -webkit-text-size-adjust: none; + -webkit-touch-callout: none; +} +:root { + box-sizing: border-box; + background-color: var(--base-background-color); + font-size: var(--base-font-size); + font-weight: var(--base-font-weight); + line-height: var(--base-line-height); + letter-spacing: var(--base-letter-spacing); + color: var(--base-color); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + font-smoothing: antialiased; +} +html, +button, +input, +optgroup, +select, +textarea { + font-family: var(--base-font-family); +} +button, +input, +optgroup, +select, +textarea { + font-size: 100%; + margin: 0; +} +a { + text-decoration: none; + -webkit-text-decoration-skip: ink; + text-decoration-skip-ink: auto; + color: rgb(218, 218, 218); + font-weight: bold; +} +body { + margin: 0; +} +hr { + height: 0; + margin: 2em 0; + border: none; + border-bottom: var(--hr-border, 0); +} +img { + max-width: 100%; + border: 0; +} +main { + display: block; +} +main.hidden { + display: none; +} +mark { + background: var(--mark-background); + color: var(--mark-color); +} +pre { + font-family: var(--pre-font-family); + font-size: var(--pre-font-size); + font-weight: var(--pre-font-weight); + line-height: var(--pre-line-height); +} +small { + display: inline-block; + font-size: var(--small-font-size); +} +strong { + font-weight: var(--strong-font-weight); + color: var(--strong-color, currentColor); +} +sub, +sup { + font-size: var(--subsup-font-size); + line-height: 0; + position: relative; + vertical-align: baseline; +} +sub { + bottom: -0.25em; +} +sup { + top: -0.5em; +} +body:not([data-platform^='Mac']) * { + scrollbar-color: hsla(var(--mono-hue), var(--mono-saturation), 50%, 0.3) + hsla(var(--mono-hue), var(--mono-saturation), 50%, 0.1); + scrollbar-width: thin; +} +body:not([data-platform^='Mac']) * ::-webkit-scrollbar { + width: 5px; + height: 5px; +} +body:not([data-platform^='Mac']) * ::-webkit-scrollbar-thumb { + background: hsla(var(--mono-hue), var(--mono-saturation), 50%, 0.3); +} +body:not([data-platform^='Mac']) * ::-webkit-scrollbar-track { + background: hsla(var(--mono-hue), var(--mono-saturation), 50%, 0.1); +} +::-moz-selection { + background: var(--selection-color); +} +::selection { + background: var(--selection-color); +} +.emoji { + height: var(--emoji-size); + vertical-align: middle; +} +.task-list-item { + list-style: none; +} +.task-list-item input { + margin-right: 0.5em; + margin-left: 0; + vertical-align: 0.075em; +} +.markdown-section code[class*='lang-'], +.markdown-section pre[data-lang] { + font-family: var(--code-font-family); + font-size: var(--code-font-size); + font-weight: var(--code-font-weight); + letter-spacing: normal; + line-height: var(--code-block-line-height); + -moz-tab-size: var(--code-tab-size); + -o-tab-size: var(--code-tab-size); + tab-size: var(--code-tab-size); + text-align: left; + white-space: pre; + word-spacing: normal; + word-wrap: normal; + word-break: normal; + -webkit-hyphens: none; + hyphens: none; +} +.markdown-section pre[data-lang] { + position: relative; + overflow: hidden; + margin: var(--code-block-margin); + padding: 0; + border-radius: var(--code-block-border-radius); +} +.markdown-section pre[data-lang]::after { + content: attr(data-lang); + position: absolute; + top: 0.75em; + right: 0.75em; + opacity: 0.6; + color: inherit; + font-size: var(--font-size-s); + line-height: 1; +} +.markdown-section pre[data-lang] code { + display: block; + overflow: auto; + padding: var(--code-block-padding); +} +code[class*='lang-'], +pre[data-lang] { + color: var(--code-theme-text); +} +pre[data-lang]::-moz-selection, +pre[data-lang] ::-moz-selection, +code[class*='lang-']::-moz-selection, +code[class*='lang-'] ::-moz-selection { + background: var(--code-theme-selection, var(--selection-color)); +} +pre[data-lang]::-moz-selection, +pre[data-lang] ::-moz-selection, +code[class*='lang-']::-moz-selection, +code[class*='lang-'] ::-moz-selection { + background: var(--code-theme-selection, var(--selection-color)); +} +pre[data-lang]::selection, +pre[data-lang] ::selection, +code[class*='lang-']::selection, +code[class*='lang-'] ::selection { + background: var(--code-theme-selection, var(--selection-color)); +} +:not(pre) > code[class*='lang-'], +pre[data-lang] { + background: var(--code-theme-background); +} +.namespace { + opacity: 0.7; +} +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: var(--code-theme-comment); +} +.token.punctuation { + color: var(--code-theme-punctuation); +} +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: var(--code-theme-tag); +} +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: var(--code-theme-selector); +} +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: var(--code-theme-operator); +} +.token.atrule, +.token.attr-value, +.token.keyword { + color: var(--code-theme-keyword); +} +.token.function { + color: var(--code-theme-function); +} +.token.regex, +.token.important, +.token.variable { + color: var(--code-theme-variable); +} +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} +.token.entity { + cursor: help; +} +.markdown-section { + position: relative; + max-width: var(--content-max-width); + margin: 0 auto; + padding: 2rem 45px; +} +.app-nav:not(:empty) ~ main .markdown-section { + padding-top: 3.5rem; +} +.markdown-section figure, +.markdown-section p, +.markdown-section ol, +.markdown-section ul { + margin: 1em 0; +} +.markdown-section ol, +.markdown-section ul { + padding-left: 1.5rem; +} +.markdown-section ol ol, +.markdown-section ol ul, +.markdown-section ul ol, +.markdown-section ul ul { + margin-top: 0.15rem; + margin-bottom: 0.15rem; +} +.markdown-section a { + border-bottom: var(--link-border-bottom); + color: var(--link-color); + -webkit-text-decoration: var(--link-text-decoration); + text-decoration: var(--link-text-decoration); + -webkit-text-decoration-color: var(--link-text-decoration-color); + text-decoration-color: var(--link-text-decoration-color); +} +.markdown-section a:hover { + border-bottom: var(--link-border-bottom--hover, var(--link-border-bottom, 0)); + color: var(--link-color--hover, var(--link-color)); + -webkit-text-decoration: var( + --link-text-decoration--hover, + var(--link-text-decoration) + ); + text-decoration: var( + --link-text-decoration--hover, + var(--link-text-decoration) + ); + -webkit-text-decoration-color: var( + --link-text-decoration-color--hover, + var(--link-text-decoration-color) + ); + text-decoration-color: var( + --link-text-decoration-color--hover, + var(--link-text-decoration-color) + ); +} +.markdown-section a.anchor { + border-bottom: 0; + color: inherit; + text-decoration: none; +} +.markdown-section a.anchor:hover { + text-decoration: underline; +} +.markdown-section blockquote { + overflow: visible; + margin: 2em 0; + padding: var(--blockquote-padding); + border-width: var(--blockquote-border-width, 0); + border-style: var(--blockquote-border-style); + border-color: var(--blockquote-border-color); + border-radius: var(--blockquote-border-radius); + background: var(--blockquote-background); + color: var(--blockquote-color); + font-family: var(--blockquote-font-family); + font-size: var(--blockquote-font-size); + font-style: var(--blockquote-font-style); + font-weight: var(--blockquote-font-weight); + quotes: '“' '”' '‘' '’'; +} +.markdown-section blockquote em { + font-family: var(--blockquote-em-font-family); + font-size: var(--blockquote-em-font-size); + font-style: var(--blockquote-em-font-style); + font-weight: var(--blockquote-em-font-weight); +} +.markdown-section blockquote p:first-child { + margin-top: 0; +} +.markdown-section blockquote p:first-child:before, +.markdown-section blockquote p:first-child:after { + color: var(--blockquote-quotes-color); + font-family: var(--blockquote-quotes-font-family); + font-size: var(--blockquote-quotes-font-size); + line-height: 0; +} +.markdown-section blockquote p:first-child:before { + content: var(--blockquote-quotes-open); + margin-right: 0.15em; + vertical-align: -0.45em; +} +.markdown-section blockquote p:first-child:after { + content: var(--blockquote-quotes-close); + margin-left: 0.15em; + vertical-align: -0.55em; +} +.markdown-section blockquote p:last-child { + margin-bottom: 0; +} +.markdown-section code { + font-family: var(--code-font-family); + font-size: var(--code-font-size); + font-weight: var(--code-font-weight); + line-height: inherit; +} +.markdown-section code:not([class*='lang-']):not([class*='language-']) { + margin: var(--code-inline-margin); + padding: var(--code-inline-padding); + border-radius: var(--code-inline-border-radius); + background: var(--code-inline-background); + color: var(--code-inline-color, currentColor); + white-space: nowrap; +} +.markdown-section h1:first-child, +.markdown-section h2:first-child, +.markdown-section h3:first-child, +.markdown-section h4:first-child, +.markdown-section h5:first-child, +.markdown-section h6:first-child { + margin-top: 0; +} +.markdown-section h1 a[data-id], +.markdown-section h2 a[data-id], +.markdown-section h3 a[data-id], +.markdown-section h4 a[data-id], +.markdown-section h5 a[data-id], +.markdown-section h6 a[data-id] { + display: inline-block; +} +.markdown-section h1 code, +.markdown-section h2 code, +.markdown-section h3 code, +.markdown-section h4 code, +.markdown-section h5 code, +.markdown-section h6 code { + font-size: 0.875em; +} +.markdown-section h1 + h2, +.markdown-section h1 + h3, +.markdown-section h1 + h4, +.markdown-section h1 + h5, +.markdown-section h1 + h6, +.markdown-section h2 + h3, +.markdown-section h2 + h4, +.markdown-section h2 + h5, +.markdown-section h2 + h6, +.markdown-section h3 + h4, +.markdown-section h3 + h5, +.markdown-section h3 + h6, +.markdown-section h4 + h5, +.markdown-section h4 + h6, +.markdown-section h5 + h6 { + margin-top: 1rem; +} +.markdown-section h1 { + margin: var(--heading-h1-margin, var(--heading-margin)); + padding: var(--heading-h1-padding, var(--heading-padding)); + border-width: var(--heading-h1-border-width, 0); + border-style: var(--heading-h1-border-style); + border-color: var(--heading-h1-border-color); + font-family: var(--heading-h1-font-family, var(--heading-font-family)); + font-size: var(--heading-h1-font-size); + font-weight: var(--heading-h1-font-weight, var(--heading-font-weight)); + line-height: var(--base-line-height); + color: var(--heading-h1-color, var(--heading-color)); +} +.markdown-section h2 { + margin: var(--heading-h2-margin, var(--heading-margin)); + padding: var(--heading-h2-padding, var(--heading-padding)); + border-width: var(--heading-h2-border-width, 0); + border-style: var(--heading-h2-border-style); + border-color: var(--heading-h2-border-color); + font-family: var(--heading-h2-font-family, var(--heading-font-family)); + font-size: var(--heading-h2-font-size); + font-weight: var(--heading-h2-font-weight, var(--heading-font-weight)); + line-height: var(--base-line-height); + color: var(--heading-h2-color, var(--heading-color)); +} +.markdown-section h3 { + margin: var(--heading-h3-margin, var(--heading-margin)); + padding: var(--heading-h3-padding, var(--heading-padding)); + border-width: var(--heading-h3-border-width, 0); + border-style: var(--heading-h3-border-style); + border-color: var(--heading-h3-border-color); + font-family: var(--heading-h3-font-family, var(--heading-font-family)); + font-size: var(--heading-h3-font-size); + font-weight: var(--heading-h3-font-weight, var(--heading-font-weight)); + color: var(--heading-h3-color, var(--heading-color)); +} +.markdown-section h4 { + margin: var(--heading-h4-margin, var(--heading-margin)); + padding: var(--heading-h4-padding, var(--heading-padding)); + border-width: var(--heading-h4-border-width, 0); + border-style: var(--heading-h4-border-style); + border-color: var(--heading-h4-border-color); + font-family: var(--heading-h4-font-family, var(--heading-font-family)); + font-size: var(--heading-h4-font-size); + font-weight: var(--heading-h4-font-weight, var(--heading-font-weight)); + color: var(--heading-h4-color, var(--heading-color)); +} +.markdown-section h5 { + margin: var(--heading-h5-margin, var(--heading-margin)); + padding: var(--heading-h5-padding, var(--heading-padding)); + border-width: var(--heading-h5-border-width, 0); + border-style: var(--heading-h5-border-style); + border-color: var(--heading-h5-border-color); + font-family: var(--heading-h5-font-family, var(--heading-font-family)); + font-size: var(--heading-h5-font-size); + font-weight: var(--heading-h5-font-weight, var(--heading-font-weight)); + color: var(--heading-h5-color, var(--heading-color)); +} +.markdown-section h6 { + margin: var(--heading-h6-margin, var(--heading-margin)); + padding: var(--heading-h6-padding, var(--heading-padding)); + border-width: var(--heading-h6-border-width, 0); + border-style: var(--heading-h6-border-style); + border-color: var(--heading-h6-border-color); + font-family: var(--heading-h6-font-family, var(--heading-font-family)); + font-size: var(--heading-h6-font-size); + font-weight: var(--heading-h6-font-weight, var(--heading-font-weight)); + color: var(--heading-h6-color, var(--heading-color)); +} +.markdown-section iframe { + margin: 1em 0; +} +.markdown-section img { + max-width: 100%; +} +.markdown-section kbd { + display: inline-block; + min-width: var(--kbd-min-width); + margin: var(--kbd-margin); + padding: var(--kbd-padding); + border: var(--kbd-border); + border-radius: var(--kbd-border-radius); + background: var(--kbd-background); + font-family: inherit; + font-size: var(--kbd-font-size); + text-align: center; + letter-spacing: 0; + line-height: 1; + color: var(--kbd-color); +} +.markdown-section kbd + kbd { + margin-left: -0.15em; +} +.markdown-section table { + display: block; + overflow: auto; + margin: 1rem 0; + border-spacing: 0; + border-collapse: collapse; +} +.markdown-section th, +.markdown-section td { + padding: var(--table-cell-padding); +} +.markdown-section th:not([align]) { + text-align: left; +} +.markdown-section thead { + border-color: var(--table-head-border-color); + border-style: solid; + border-width: var(--table-head-border-width, 0); + background: var(--table-head-background); +} +.markdown-section th { + font-weight: var(--table-head-font-weight); + color: var(--strong-color); +} +.markdown-section td { + border-color: var(--table-cell-border-color); + border-style: solid; + border-width: var(--table-cell-border-width, 0); +} +.markdown-section tbody { + border-color: var(--table-body-border-color); + border-style: solid; + border-width: var(--table-body-border-width, 0); +} +.markdown-section tbody tr:nth-child(odd) { + background: var(--table-row-odd-background); +} +.markdown-section tbody tr:nth-child(even) { + background: var(--table-row-even-background); +} +.markdown-section > ul .task-list-item { + margin-left: -1.25em; +} +.markdown-section > ul .task-list-item .task-list-item { + margin-left: 0; +} +.markdown-section .table-wrapper { + overflow-x: auto; +} +.markdown-section .table-wrapper table { + display: table; + width: 100%; +} +.markdown-section .table-wrapper td::before { + display: none; +} +@media (max-width: 30em) { + .markdown-section .table-wrapper tbody, + .markdown-section .table-wrapper tr, + .markdown-section .table-wrapper td { + display: block; + } + .markdown-section .table-wrapper th, + .markdown-section .table-wrapper td { + border: none; + } + .markdown-section .table-wrapper thead { + display: none; + } + .markdown-section .table-wrapper tr { + border-color: var(--table-cell-border-color); + border-style: solid; + border-width: var(--table-cell-border-width, 0); + padding: var(--table-cell-padding); + } + .markdown-section .table-wrapper tr:not(:last-child) { + border-bottom: 0; + } + .markdown-section .table-wrapper td { + padding: 0.15em 0 0.15em 8em; + } + .markdown-section .table-wrapper td::before { + display: inline-block; + float: left; + width: 8em; + margin-left: -8em; + font-weight: bold; + text-align: left; + } +} +.markdown-section .tip, +.markdown-section .warn { + position: relative; + margin: 2em 0; + padding: var(--notice-padding); + border-width: var(--notice-border-width, 0); + border-style: var(--notice-border-style); + border-color: var(--notice-border-color); + border-radius: var(--notice-border-radius); + background: var(--notice-background); + font-family: var(--notice-font-family); + font-weight: var(--notice-font-weight); + color: var(--notice-color); +} +.markdown-section .tip:before, +.markdown-section .warn:before { + display: inline-block; + position: var(--notice-before-position, relative); + top: var(--notice-before-top); + left: var(--notice-before-left); + height: var(--notice-before-height); + width: var(--notice-before-width); + margin: var(--notice-before-margin); + padding: var(--notice-before-padding); + border-radius: var(--notice-before-border-radius); + line-height: var(--notice-before-line-height); + font-family: var(--notice-before-font-family); + font-size: var(--notice-before-font-size); + font-weight: var(--notice-before-font-weight); + text-align: center; +} +.markdown-section .tip { + border-width: var( + --notice-important-border-width, + var(--notice-border-width, 0) + ); + border-style: var( + --notice-important-border-style, + var(--notice-border-style) + ); + border-color: var( + --notice-important-border-color, + var(--notice-border-color) + ); + background: var(--notice-important-background, var(--notice-background)); + color: var(--notice-important-color, var(--notice-color)); +} +.markdown-section .tip:before { + content: var(--notice-important-before-content, var(--notice-before-content)); + background: var( + --notice-important-before-background, + var(--notice-before-background) + ); + color: var(--notice-important-before-color, var(--notice-before-color)); +} +.markdown-section .warn { + border-width: var(--notice-tip-border-width, var(--notice-border-width, 0)); + border-style: var(--notice-tip-border-style, var(--notice-border-style)); + border-color: var(--notice-tip-border-color, var(--notice-border-color)); + background: var(--notice-tip-background, var(--notice-background)); + color: var(--notice-tip-color, var(--notice-color)); +} +.markdown-section .warn:before { + content: var(--notice-tip-before-content, var(--notice-before-content)); + background: var( + --notice-tip-before-background, + var(--notice-before-background) + ); + color: var(--notice-tip-before-color, var(--notice-before-color)); +} +.cover { + display: none; + position: relative; + z-index: 20; + min-height: 100vh; + flex-direction: column; + align-items: center; + justify-content: center; + padding: calc( + var(--cover-border-inset, 0px) + var(--cover-border-width, 0px) + ); + color: var(--cover-color); + text-align: var(--cover-text-align); +} +@media screen and (-ms-high-contrast: active), + screen and (-ms-high-contrast: none) { + .cover { + height: 100vh; + } +} +.cover:before, +.cover:after { + content: ''; + position: absolute; +} +.cover:before { + top: 0; + bottom: 0; + left: 0; + right: 0; + background-blend-mode: var(--cover-background-blend-mode); + background-color: var(--cover-background-color); + background-image: var(--cover-background-image); + background-position: var(--cover-background-position); + background-repeat: var(--cover-background-repeat); + background-size: var(--cover-background-size); +} +.cover:after { + top: var(--cover-border-inset, 0); + bottom: var(--cover-border-inset, 0); + left: var(--cover-border-inset, 0); + right: var(--cover-border-inset, 0); + border-width: var(--cover-border-width, 0); + border-style: solid; + border-color: var(--cover-border-color); +} +.cover a { + border-bottom: var(--cover-link-border-bottom); + color: var(--cover-link-color); + -webkit-text-decoration: var(--cover-link-text-decoration); + text-decoration: var(--cover-link-text-decoration); + -webkit-text-decoration-color: var(--cover-link-text-decoration-color); + text-decoration-color: var(--cover-link-text-decoration-color); +} +.cover a:hover { + border-bottom: var( + --cover-link-border-bottom--hover, + var(--cover-link-border-bottom) + ); + color: var(--cover-link-color--hover, var(--cover-link-color)); + -webkit-text-decoration: var( + --cover-link-text-decoration--hover, + var(--cover-link-text-decoration) + ); + text-decoration: var( + --cover-link-text-decoration--hover, + var(--cover-link-text-decoration) + ); + -webkit-text-decoration-color: var( + --cover-link-text-decoration-color--hover, + var(--cover-link-text-decoration-color) + ); + text-decoration-color: var( + --cover-link-text-decoration-color--hover, + var(--cover-link-text-decoration-color) + ); +} +.cover h1 { + color: var(--cover-heading-color); + position: relative; + margin: 0; + font-size: var(--cover-heading-font-size); + font-weight: var(--cover-heading-font-weight); + line-height: 1.2; +} +.cover h1 a, +.cover h1 a:hover { + display: block; + border-bottom: none; + color: inherit; + text-decoration: none; +} +.cover h1 small { + position: absolute; + bottom: 0; + margin-left: 0.5em; +} +.cover h1 span { + font-size: calc(var(--cover-heading-font-size-min) * 1px); +} +@media (min-width: 26em) { + .cover h1 span { + font-size: calc( + var(--cover-heading-font-size-min) * 1px + + ( + var(--cover-heading-font-size-max) - + var(--cover-heading-font-size-min) + ) * (100vw - 420px) / 604 + ); + } +} +@media (min-width: 64em) { + .cover h1 span { + font-size: calc(var(--cover-heading-font-size-max) * 1px); + } +} +.cover blockquote { + margin: 0; + color: var(--cover-blockquote-color); + font-size: var(--cover-blockquote-font-size); +} +.cover blockquote a { + color: inherit; +} +.cover ul { + padding: 0; + list-style-type: none; +} +.cover .cover-main { + position: relative; + z-index: 1; + max-width: var(--cover-max-width); + margin: var(--cover-margin); + padding: 0 45px; +} +.cover .cover-main > p:last-child { + margin: 1.25em -0.25em; +} +.cover .cover-main > p:last-child a { + display: block; + margin: 0.375em 0.25em; + padding: var(--cover-button-padding); + border: var(--cover-button-border); + border-radius: var(--cover-button-border-radius); + box-shadow: var(--cover-button-box-shadow); + background: var(--cover-button-background); + text-align: center; + -webkit-text-decoration: var(--cover-button-text-decoration); + text-decoration: var(--cover-button-text-decoration); + -webkit-text-decoration-color: var(--cover-button-text-decoration-color); + text-decoration-color: var(--cover-button-text-decoration-color); + color: var(--cover-button-color); + white-space: nowrap; + transition: var(--cover-button-transition); +} +.cover .cover-main > p:last-child a:hover { + border: var(--cover-button-border--hover, var(--cover-button-border)); + box-shadow: var( + --cover-button-box-shadow--hover, + var(--cover-button-box-shadow) + ); + background: var( + --cover-button-background--hover, + var(--cover-button-background) + ); + -webkit-text-decoration: var( + --cover-button-text-decoration--hover, + var(--cover-button-text-decoration) + ); + text-decoration: var( + --cover-button-text-decoration--hover, + var(--cover-button-text-decoration) + ); + -webkit-text-decoration-color: var( + --cover-button-text-decoration-color--hover, + var(--cover-button-text-decoration-color) + ); + text-decoration-color: var( + --cover-button-text-decoration-color--hover, + var(--cover-button-text-decoration-color) + ); + color: var(--cover-button-color--hover, var(--cover-button-color)); +} +.cover .cover-main > p:last-child a:first-child { + border: var(--cover-button-primary-border, var(--cover-button-border)); + box-shadow: var( + --cover-button-primary-box-shadow, + var(--cover-button-box-shadow) + ); + background: var( + --cover-button-primary-background, + var(--cover-button-background) + ); + -webkit-text-decoration: var( + --cover-button-primary-text-decoration, + var(--cover-button-text-decoration) + ); + text-decoration: var( + --cover-button-primary-text-decoration, + var(--cover-button-text-decoration) + ); + -webkit-text-decoration-color: var( + --cover-button-primary-text-decoration-color, + var(--cover-button-text-decoration-color) + ); + text-decoration-color: var( + --cover-button-primary-text-decoration-color, + var(--cover-button-text-decoration-color) + ); + color: var(--cover-button-primary-color, var(--cover-button-color)); +} +.cover .cover-main > p:last-child a:first-child:hover { + border: var( + --cover-button-primary-border--hover, + var( + --cover-button-border--hover, + var(--cover-button-primary-border, var(--cover-button-border)) + ) + ); + box-shadow: var( + --cover-button-primary-box-shadow--hover, + var( + --cover-button-box-shadow--hover, + var(--cover-button-primary-box-shadow, var(--cover-button-box-shadow)) + ) + ); + background: var( + --cover-button-primary-background--hover, + var( + --cover-button-background--hover, + var(--cover-button-primary-background, var(--cover-button-background)) + ) + ); + -webkit-text-decoration: var( + --cover-button-primary-text-decoration--hover, + var( + --cover-button-text-decoration--hover, + var( + --cover-button-primary-text-decoration, + var(--cover-button-text-decoration) + ) + ) + ); + text-decoration: var( + --cover-button-primary-text-decoration--hover, + var( + --cover-button-text-decoration--hover, + var( + --cover-button-primary-text-decoration, + var(--cover-button-text-decoration) + ) + ) + ); + -webkit-text-decoration-color: var( + --cover-button-primary-text-decoration-color--hover, + var( + --cover-button-text-decoration-color--hover, + var( + --cover-button-primary-text-decoration-color, + var(--cover-button-text-decoration-color) + ) + ) + ); + text-decoration-color: var( + --cover-button-primary-text-decoration-color--hover, + var( + --cover-button-text-decoration-color--hover, + var( + --cover-button-primary-text-decoration-color, + var(--cover-button-text-decoration-color) + ) + ) + ); + color: var( + --cover-button-primary-color--hover, + var( + --cover-button-color--hover, + var(--cover-button-primary-color, var(--cover-button-color)) + ) + ); +} +@media (min-width: 30.01em) { + .cover .cover-main > p:last-child a { + display: inline-block; + } +} +.cover .mask { + visibility: var(--cover-background-mask-visibility, hidden); + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + background-color: var(--cover-background-mask-color); + opacity: var(--cover-background-mask-opacity); +} +.cover.has-mask .mask { + visibility: visible; +} +.cover.show { + display: flex; +} +.app-nav { + position: absolute; + z-index: 30; + top: calc(35px - 0.5em * var(--base-line-height)); + left: 45px; + right: 80px; + text-align: right; +} +.app-nav.no-badge { + right: 45px; +} +.app-nav li > img, +.app-nav li > a > img { + margin-top: -0.25em; + vertical-align: middle; +} +.app-nav li > img:first-child, +.app-nav li > a > img:first-child { + margin-right: 0.5em; +} +.app-nav ul, +.app-nav li { + margin: 0; + padding: 0; + list-style: none; +} +.app-nav li { + position: relative; +} +.app-nav li a { + display: block; + line-height: 1; + transition: var(--navbar-root-transition); +} +.app-nav > ul > li { + display: inline-block; + margin: var(--navbar-root-margin); +} +.app-nav > ul > li:first-child { + margin-left: 0; +} +.app-nav > ul > li:last-child { + margin-right: 0; +} +.app-nav > ul > li > a, +.app-nav > ul > li > span { + padding: var(--navbar-root-padding); + border-width: var(--navbar-root-border-width, 0); + border-style: var(--navbar-root-border-style); + border-color: var(--navbar-root-border-color); + border-radius: var(--navbar-root-border-radius); + background: var(--navbar-root-background); + color: var(--navbar-root-color); + -webkit-text-decoration: var(--navbar-root-text-decoration); + text-decoration: var(--navbar-root-text-decoration); + -webkit-text-decoration-color: var(--navbar-root-text-decoration-color); + text-decoration-color: var(--navbar-root-text-decoration-color); +} +.app-nav > ul > li > a:hover, +.app-nav > ul > li > span:hover { + background: var( + --navbar-root-background--hover, + var(--navbar-root-background) + ); + border-style: var( + --navbar-root-border-style--hover, + var(--navbar-root-border-style) + ); + border-color: var( + --navbar-root-border-color--hover, + var(--navbar-root-border-color) + ); + color: var(--navbar-root-color--hover, var(--navbar-root-color)); + -webkit-text-decoration: var( + --navbar-root-text-decoration--hover, + var(--navbar-root-text-decoration) + ); + text-decoration: var( + --navbar-root-text-decoration--hover, + var(--navbar-root-text-decoration) + ); + -webkit-text-decoration-color: var( + --navbar-root-text-decoration-color--hover, + var(--navbar-root-text-decoration-color) + ); + text-decoration-color: var( + --navbar-root-text-decoration-color--hover, + var(--navbar-root-text-decoration-color) + ); +} +.app-nav > ul > li > a:not(:last-child), +.app-nav > ul > li > span:not(:last-child) { + padding: var(--navbar-menu-root-padding, var(--navbar-root-padding)); + background: var(--navbar-menu-root-background, var(--navbar-root-background)); +} +.app-nav > ul > li > a:not(:last-child):hover, +.app-nav > ul > li > span:not(:last-child):hover { + background: var( + --navbar-menu-root-background--hover, + var( + --navbar-menu-root-background, + var(--navbar-root-background--hover, var(--navbar-root-background)) + ) + ); +} +.app-nav > ul > li > a.active { + background: var( + --navbar-root-background--active, + var(--navbar-root-background) + ); + border-style: var( + --navbar-root-border-style--active, + var(--navbar-root-border-style) + ); + border-color: var( + --navbar-root-border-color--active, + var(--navbar-root-border-color) + ); + color: var(--navbar-root-color--active, var(--navbar-root-color)); + -webkit-text-decoration: var( + --navbar-root-text-decoration--active, + var(--navbar-root-text-decoration) + ); + text-decoration: var( + --navbar-root-text-decoration--active, + var(--navbar-root-text-decoration) + ); + -webkit-text-decoration-color: var( + --navbar-root-text-decoration-color--active, + var(--navbar-root-text-decoration-color) + ); + text-decoration-color: var( + --navbar-root-text-decoration-color--active, + var(--navbar-root-text-decoration-color) + ); +} +.app-nav > ul > li > a.active:not(:last-child):hover { + background: var( + --navbar-menu-root-background--active, + var( + --navbar-menu-root-background, + var(--navbar-root-background--active, var(--navbar-root-background)) + ) + ); +} +.app-nav > ul > li ul { + visibility: hidden; + position: absolute; + top: 100%; + right: 50%; + overflow-y: auto; + box-sizing: border-box; + max-height: 50vh; + padding: var(--navbar-menu-padding); + border-width: var(--navbar-menu-border-width, 0); + border-style: solid; + border-color: var(--navbar-menu-border-color); + border-radius: var(--navbar-menu-border-radius); + background: var(--navbar-menu-background); + box-shadow: var(--navbar-menu-box-shadow); + text-align: left; + white-space: nowrap; + opacity: 0; + transform: translate(50%, -0.35em); + transition: var(--navbar-menu-transition); +} +.app-nav > ul > li ul li { + white-space: nowrap; +} +.app-nav > ul > li ul a { + margin: var(--navbar-menu-link-margin); + padding: var(--navbar-menu-link-padding); + border-width: var(--navbar-menu-link-border-width, 0); + border-style: var(--navbar-menu-link-border-style); + border-color: var(--navbar-menu-link-border-color); + border-radius: var(--navbar-menu-link-border-radius); + background: var(--navbar-menu-link-background); + color: var(--navbar-menu-link-color); + -webkit-text-decoration: var(--navbar-menu-link-text-decoration); + text-decoration: var(--navbar-menu-link-text-decoration); + -webkit-text-decoration-color: var(--navbar-menu-link-text-decoration-color); + text-decoration-color: var(--navbar-menu-link-text-decoration-color); +} +.app-nav > ul > li ul a:hover { + background: var( + --navbar-menu-link-background--hover, + var(--navbar-menu-link-background) + ); + border-style: var( + --navbar-menu-link-border-style--hover, + var(--navbar-menu-link-border-style) + ); + border-color: var( + --navbar-menu-link-border-color--hover, + var(--navbar-menu-link-border-color) + ); + color: var(--navbar-menu-link-color--hover, var(--navbar-menu-link-color)); + -webkit-text-decoration: var( + --navbar-menu-link-text-decoration--hover, + var(--navbar-menu-link-text-decoration) + ); + text-decoration: var( + --navbar-menu-link-text-decoration--hover, + var(--navbar-menu-link-text-decoration) + ); + -webkit-text-decoration-color: var( + --navbar-menu-link-text-decoration-color--hover, + var(--navbar-menu-link-text-decoration-color) + ); + text-decoration-color: var( + --navbar-menu-link-text-decoration-color--hover, + var(--navbar-menu-link-text-decoration-color) + ); +} +.app-nav > ul > li ul a.active { + background: var( + --navbar-menu-link-background--active, + var(--navbar-menu-link-background) + ); + border-style: var( + --navbar-menu-link-border-style--active, + var(--navbar-menu-link-border-style) + ); + border-color: var( + --navbar-menu-link-border-color--active, + var(--navbar-menu-link-border-color) + ); + color: var(--navbar-menu-link-color--active, var(--navbar-menu-link-color)); + -webkit-text-decoration: var( + --navbar-menu-link-text-decoration--active, + var(--navbar-menu-link-text-decoration) + ); + text-decoration: var( + --navbar-menu-link-text-decoration--active, + var(--navbar-menu-link-text-decoration) + ); + -webkit-text-decoration-color: var( + --navbar-menu-link-text-decoration-color--active, + var(--navbar-menu-link-text-decoration-color) + ); + text-decoration-color: var( + --navbar-menu-link-text-decoration-color--active, + var(--navbar-menu-link-text-decoration-color) + ); +} +.app-nav > ul > li:hover ul, +.app-nav > ul > li:focus ul, +.app-nav > ul > li.focus-within ul { + visibility: visible; + opacity: 1; + transform: translate(50%, 0); +} +@media (min-width: 48em) { + nav.app-nav { + margin-left: var(--sidebar-width); + } +} +main { + position: relative; + overflow-x: hidden; + min-height: 100vh; +} +.sidebar, +.sidebar-toggle, +.sidebar + .content { + transition: all var(--sidebar-transition-duration) ease-out; +} +@media (min-width: 48em) { + .sidebar + .content { + margin-left: var(--sidebar-width); + } +} +.sidebar { + display: flex; + flex-direction: column; + position: fixed; + z-index: 10; + top: 0; + right: 100%; + overflow-x: hidden; + overflow-y: auto; + height: 100vh; + width: var(--sidebar-width); + padding: var(--sidebar-padding); + border-width: var(--sidebar-border-width); + border-style: solid; + border-color: var(--sidebar-border-color); + background: var(--sidebar-background); +} +.sidebar > h1 { + margin: 0; + margin: var(--sidebar-name-margin); + padding: var(--sidebar-name-padding); + background: var(--sidebar-name-background); + color: var(--sidebar-name-color); + font-family: var(--sidebar-name-font-family); + font-size: var(--sidebar-name-font-size); + font-weight: var(--sidebar-name-font-weight); + text-align: var(--sidebar-name-text-align); +} +.sidebar > h1 img { + max-width: 100%; +} +.sidebar > h1 .app-name-link { + color: var(--sidebar-name-color); +} +body:not([data-platform^='Mac']) .sidebar::-webkit-scrollbar { + width: 5px; +} +body:not([data-platform^='Mac']) .sidebar::-webkit-scrollbar-thumb { + border-radius: 50vw; +} +@media (min-width: 48em) { + .sidebar { + position: absolute; + transform: translateX(var(--sidebar-width)); + } +} +@media print { + .sidebar { + display: none; + } +} +.sidebar-nav, +.sidebar nav { + order: 1; + margin: var(--sidebar-nav-margin); + padding: var(--sidebar-nav-padding); + background: var(--sidebar-nav-background); +} +.sidebar-nav ul, +.sidebar nav ul { + margin: 0; + padding: 0; + list-style: none; +} +.sidebar-nav ul ul, +.sidebar nav ul ul { + margin-left: var(--sidebar-nav-indent); +} +.sidebar-nav a, +.sidebar nav a { + display: block; + overflow: hidden; + margin: var(--sidebar-nav-link-margin); + padding: var(--sidebar-nav-link-padding); + border-width: var(--sidebar-nav-link-border-width, 0); + border-style: var(--sidebar-nav-link-border-style); + border-color: var(--sidebar-nav-link-border-color); + border-radius: var(--sidebar-nav-link-border-radius); + background: var(--sidebar-nav-link-background); + color: var(--sidebar-nav-link-color); + font-weight: var(--sidebar-nav-link-font-weight); + white-space: nowrap; + -webkit-text-decoration: var(--sidebar-nav-link-text-decoration); + text-decoration: var(--sidebar-nav-link-text-decoration); + -webkit-text-decoration-color: var(--sidebar-nav-link-text-decoration-color); + text-decoration-color: var(--sidebar-nav-link-text-decoration-color); + text-overflow: ellipsis; + transition: var(--sidebar-nav-link-transition); +} +.sidebar-nav a img, +.sidebar nav a img { + margin-top: -0.25em; + vertical-align: middle; +} +.sidebar-nav a img:first-child, +.sidebar nav a img:first-child { + margin-right: 0.5em; +} +.sidebar-nav a:hover, +.sidebar nav a:hover { + border-width: var( + --sidebar-nav-link-border-width--hover, + var(--sidebar-nav-link-border-width, 0) + ); + border-style: var( + --sidebar-nav-link-border-style--hover, + var(--sidebar-nav-link-border-style) + ); + border-color: var( + --sidebar-nav-link-border-color--hover, + var(--sidebar-nav-link-border-color) + ); + background: var( + --sidebar-nav-link-background--hover, + var(--sidebar-nav-link-background) + ); + color: var(--sidebar-nav-link-color--hover, var(--sidebar-nav-link-color)); + font-weight: var( + --sidebar-nav-link-font-weight--hover, + var(--sidebar-nav-link-font-weight) + ); + -webkit-text-decoration: var( + --sidebar-nav-link-text-decoration--hover, + var(--sidebar-nav-link-text-decoration) + ); + text-decoration: var( + --sidebar-nav-link-text-decoration--hover, + var(--sidebar-nav-link-text-decoration) + ); + -webkit-text-decoration-color: var(--sidebar-nav-link-text-decoration-color); + text-decoration-color: var(--sidebar-nav-link-text-decoration-color); +} +.sidebar-nav ul > li > span, +.sidebar-nav ul > li > strong, +.sidebar nav ul > li > span, +.sidebar nav ul > li > strong { + display: block; + margin: var(--sidebar-nav-strong-margin); + padding: var(--sidebar-nav-strong-padding); + border-width: var(--sidebar-nav-strong-border-width, 0); + border-style: solid; + border-color: var(--sidebar-nav-strong-border-color); + color: var(--sidebar-nav-strong-color); + font-size: var(--sidebar-nav-strong-font-size); + font-weight: var(--sidebar-nav-strong-font-weight); + text-transform: var(--sidebar-nav-strong-text-transform); +} +.sidebar-nav ul > li > span + ul, +.sidebar-nav ul > li > strong + ul, +.sidebar nav ul > li > span + ul, +.sidebar nav ul > li > strong + ul { + margin-left: 0; +} +.sidebar-nav ul > li:first-child > span, +.sidebar-nav ul > li:first-child > strong, +.sidebar nav ul > li:first-child > span, +.sidebar nav ul > li:first-child > strong { + margin-top: 0; +} +.sidebar-nav::-webkit-scrollbar, +.sidebar nav::-webkit-scrollbar { + width: 0; +} +@supports (width: env(safe-area-inset)) { + @media only screen and (orientation: landscape) { + .sidebar-nav, + .sidebar nav { + margin-left: calc(env(safe-area-inset-left) / 2); + } + } +} +.sidebar-nav li > a:before, +.sidebar-nav li > strong:before { + display: inline-block; +} +.sidebar-nav li > a { + background-repeat: var(--sidebar-nav-pagelink-background-repeat); + background-size: var(--sidebar-nav-pagelink-background-size); +} +.sidebar-nav li > a[href^='/']:not([href*='?id=']), +.sidebar-nav li > a[href^='#/']:not([href*='?id=']) { + transition: var(--sidebar-nav-pagelink-transition); +} +.sidebar-nav li > a[href^='/']:not([href*='?id=']), +.sidebar-nav li > a[href^='/']:not([href*='?id=']) ~ ul a, +.sidebar-nav li > a[href^='#/']:not([href*='?id=']), +.sidebar-nav li > a[href^='#/']:not([href*='?id=']) ~ ul a { + padding: var(--sidebar-nav-pagelink-padding, var(--sidebar-nav-link-padding)); +} +.sidebar-nav li > a[href^='/']:not([href*='?id=']):only-child, +.sidebar-nav li > a[href^='#/']:not([href*='?id=']):only-child { + background: var(--sidebar-nav-pagelink-background); +} +.sidebar-nav li > a[href^='/']:not([href*='?id=']):not(:only-child), +.sidebar-nav li > a[href^='#/']:not([href*='?id=']):not(:only-child) { + background: var( + --sidebar-nav-pagelink-background--loaded, + var(--sidebar-nav-pagelink-background) + ); +} +.sidebar-nav li.active > a, +.sidebar-nav li.collapse > a { + border-width: var( + --sidebar-nav-link-border-width--active, + var(--sidebar-nav-link-border-width) + ); + border-style: var( + --sidebar-nav-link-border-style--active, + var(--sidebar-nav-link-border-style) + ); + border-color: var( + --sidebar-nav-link-border-color--active, + var(--sidebar-nav-link-border-color) + ); + background: var( + --sidebar-nav-link-background--active, + var(--sidebar-nav-link-background) + ); + color: var(--sidebar-nav-link-color--active, var(--sidebar-nav-link-color)); + font-weight: var( + --sidebar-nav-link-font-weight--active, + var(--sidebar-nav-link-font-weight) + ); + -webkit-text-decoration: var( + --sidebar-nav-link-text-decoration--active, + var(--sidebar-nav-link-text-decoration) + ); + text-decoration: var( + --sidebar-nav-link-text-decoration--active, + var(--sidebar-nav-link-text-decoration) + ); + -webkit-text-decoration-color: var(--sidebar-nav-link-text-decoration-color); + text-decoration-color: var(--sidebar-nav-link-text-decoration-color); +} +.sidebar-nav li.active > a[href^='/']:not([href*='?id=']):not(:only-child), +.sidebar-nav li.active > a[href^='#/']:not([href*='?id=']):not(:only-child) { + background: var( + --sidebar-nav-pagelink-background--active, + var( + --sidebar-nav-pagelink-background--loaded, + var(--sidebar-nav-pagelink-background) + ) + ); +} +.sidebar-nav li.collapse > a[href^='/']:not([href*='?id=']):not(:only-child), +.sidebar-nav li.collapse > a[href^='#/']:not([href*='?id=']):not(:only-child) { + background: var( + --sidebar-nav-pagelink-background--collapse, + var( + --sidebar-nav-pagelink-background--loaded, + var(--sidebar-nav-pagelink-background) + ) + ); +} +.sidebar-nav li.collapse .app-sub-sidebar { + display: none; +} +.sidebar-nav > ul > li > a:before { + content: var( + --sidebar-nav-link-before-content-l1, + var(--sidebar-nav-link-before-content) + ); + margin: var( + --sidebar-nav-link-before-margin-l1, + var(--sidebar-nav-link-before-margin) + ); + color: var( + --sidebar-nav-link-before-color-l1, + var(--sidebar-nav-link-before-color) + ); +} +.sidebar-nav > ul > li.active > a:before { + content: var( + --sidebar-nav-link-before-content-l1--active, + var( + --sidebar-nav-link-before-content--active, + var( + --sidebar-nav-link-before-content-l1, + var(--sidebar-nav-link-before-content) + ) + ) + ); + color: var( + --sidebar-nav-link-before-color-l1--active, + var( + --sidebar-nav-link-before-color--active, + var( + --sidebar-nav-link-before-color-l1, + var(--sidebar-nav-link-before-color) + ) + ) + ); +} +.sidebar-nav > ul > li > ul > li > a:before { + content: var( + --sidebar-nav-link-before-content-l2, + var(--sidebar-nav-link-before-content) + ); + margin: var( + --sidebar-nav-link-before-margin-l2, + var(--sidebar-nav-link-before-margin) + ); + color: var( + --sidebar-nav-link-before-color-l2, + var(--sidebar-nav-link-before-color) + ); +} +.sidebar-nav > ul > li > ul > li.active > a:before { + content: var( + --sidebar-nav-link-before-content-l2--active, + var( + --sidebar-nav-link-before-content--active, + var( + --sidebar-nav-link-before-content-l2, + var(--sidebar-nav-link-before-content) + ) + ) + ); + color: var( + --sidebar-nav-link-before-color-l2--active, + var( + --sidebar-nav-link-before-color--active, + var( + --sidebar-nav-link-before-color-l2, + var(--sidebar-nav-link-before-color) + ) + ) + ); +} +.sidebar-nav > ul > li > ul > li > ul > li > a:before { + content: var( + --sidebar-nav-link-before-content-l3, + var(--sidebar-nav-link-before-content) + ); + margin: var( + --sidebar-nav-link-before-margin-l3, + var(--sidebar-nav-link-before-margin) + ); + color: var( + --sidebar-nav-link-before-color-l3, + var(--sidebar-nav-link-before-color) + ); +} +.sidebar-nav > ul > li > ul > li > ul > li.active > a:before { + content: var( + --sidebar-nav-link-before-content-l3--active, + var( + --sidebar-nav-link-before-content--active, + var( + --sidebar-nav-link-before-content-l3, + var(--sidebar-nav-link-before-content) + ) + ) + ); + color: var( + --sidebar-nav-link-before-color-l3--active, + var( + --sidebar-nav-link-before-color--active, + var( + --sidebar-nav-link-before-color-l3, + var(--sidebar-nav-link-before-color) + ) + ) + ); +} +.sidebar-nav > ul > li > ul > li > ul > li > ul > li > a:before { + content: var( + --sidebar-nav-link-before-content-l4, + var(--sidebar-nav-link-before-content) + ); + margin: var( + --sidebar-nav-link-before-margin-l4, + var(--sidebar-nav-link-before-margin) + ); + color: var( + --sidebar-nav-link-before-color-l4, + var(--sidebar-nav-link-before-color) + ); +} +.sidebar-nav > ul > li > ul > li > ul > li > ul > li.active > a:before { + content: var( + --sidebar-nav-link-before-content-l4--active, + var( + --sidebar-nav-link-before-content--active, + var( + --sidebar-nav-link-before-content-l4, + var(--sidebar-nav-link-before-content) + ) + ) + ); + color: var( + --sidebar-nav-link-before-color-l4--active, + var( + --sidebar-nav-link-before-color--active, + var( + --sidebar-nav-link-before-color-l4, + var(--sidebar-nav-link-before-color) + ) + ) + ); +} +.sidebar-nav > :last-child { + margin-bottom: 2rem; +} +.sidebar-toggle, +.sidebar-toggle-button { + width: var(--sidebar-toggle-width); + outline: none; +} +.sidebar-toggle { + position: fixed; + z-index: 11; + top: 0; + bottom: 0; + left: 0; + max-width: 40px; + margin: 0; + padding: 0; + border: 0; + background: rgba(0, 0, 0, 0); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + cursor: pointer; +} +.sidebar-toggle .sidebar-toggle-button { + position: absolute; + top: var(--sidebar-toggle-offset-top); + left: var(--sidebar-toggle-offset-left); + height: var(--sidebar-toggle-height); + border-radius: var(--sidebar-toggle-border-radius); + border-width: var(--sidebar-toggle-border-width); + border-style: var(--sidebar-toggle-border-style); + border-color: var(--sidebar-toggle-border-color); + background: var(--sidebar-toggle-background, transparent); + color: var(--sidebar-toggle-icon-color); +} +.sidebar-toggle span { + position: absolute; + top: calc(50% - var(--sidebar-toggle-icon-stroke-width) / 2); + left: calc(50% - var(--sidebar-toggle-icon-width) / 2); + height: var(--sidebar-toggle-icon-stroke-width); + width: var(--sidebar-toggle-icon-width); + background-color: currentColor; +} +.sidebar-toggle span:nth-child(1) { + margin-top: calc(0px - var(--sidebar-toggle-icon-height) / 2); +} +.sidebar-toggle span:nth-child(3) { + margin-top: calc(var(--sidebar-toggle-icon-height) / 2); +} +@media (min-width: 48em) { + .sidebar-toggle { + position: absolute; + overflow: visible; + top: var(--sidebar-toggle-offset-top); + bottom: auto; + left: 0; + height: var(--sidebar-toggle-height); + transform: translateX(var(--sidebar-width)); + } + .sidebar-toggle .sidebar-toggle-button { + top: 0; + } +} +@media print { + .sidebar-toggle { + display: none; + } +} +@media (max-width: 47.99em) { + body.close .sidebar, + body.close .sidebar-toggle, + body.close .sidebar + .content { + transform: translateX(var(--sidebar-width)); + } +} +@media (min-width: 48em) { + body.close .sidebar + .content { + transform: translateX(0); + } +} +@media (max-width: 47.99em) { + body.close nav.app-nav, + body.close .github-corner { + display: none; + } +} +@media (min-width: 48em) { + body.close .sidebar, + body.close .sidebar-toggle { + transform: translateX(0); + } +} +@media (min-width: 48em) { + body.close nav.app-nav { + margin-left: 0; + } +} +@media (max-width: 47.99em) { + body.close .sidebar-toggle { + width: 100%; + max-width: none; + } + body.close .sidebar-toggle span { + margin-top: 0; + } + body.close .sidebar-toggle span:nth-child(1) { + transform: rotate(45deg); + } + body.close .sidebar-toggle span:nth-child(2) { + display: none; + } + body.close .sidebar-toggle span:nth-child(3) { + transform: rotate(-45deg); + } +} +@media (min-width: 48em) { + body.close .sidebar + .content { + margin-left: 0; + } +} +@media (min-width: 48em) { + body.sticky .sidebar, + body.sticky .sidebar-toggle { + position: fixed; + } +} +body .docsify-copy-code-button, +body .docsify-copy-code-button:after { + border-radius: var(--border-radius-m, 0); + border-top-left-radius: 0; + border-bottom-right-radius: 0; + background: var(--copycode-background); + color: var(--copycode-color); +} +body .docsify-copy-code-button span { + border-radius: var(--border-radius-s, 0); +} +body .docsify-pagination-container { + border-top: var(--pagination-border-top); + color: var(--pagination-color); +} +body .pagination-item-label { + font-size: var(--pagination-label-font-size); +} +body .pagination-item-label svg { + color: var(--pagination-label-color); + height: var(--pagination-chevron-height); + stroke: var(--pagination-chevron-stroke); + stroke-linecap: var(--pagination-chevron-stroke-linecap); + stroke-linejoin: var(--pagination-chevron-stroke-linecap); + stroke-width: var(--pagination-chevron-stroke-width); +} +body .pagination-item-title { + color: var(--pagination-title-color); + font-size: var(--pagination-title-font-size); +} +body .app-name.hide { + display: block; +} +body .sidebar { + padding: var(--sidebar-padding); +} +.sidebar .search { + margin: 0; + padding: 0; + border: 0; +} +.sidebar .search input { + padding: 0; + line-height: 1; + font-size: inherit; +} +.sidebar .search .clear-button { + width: auto; +} +.sidebar .search .clear-button svg { + transform: scale(1); +} +.sidebar .search .matching-post { + border: none; +} +.sidebar .search p { + font-size: inherit; +} +.sidebar .search { + order: var(--search-flex-order); + margin: var(--search-margin); + padding: var(--search-padding); + background: var(--search-background); +} +.sidebar .search a { + color: inherit; +} +.sidebar .search h2 { + margin: var(--search-result-heading-margin); + font-size: var(--search-result-heading-font-size); + font-weight: var(--search-result-heading-font-weight); + color: var(--search-result-heading-color); +} +.sidebar .search .input-wrap { + align-items: stretch; + margin: var(--search-input-margin); + background-color: var(--search-input-background-color); + border-width: var(--search-input-border-width, 0); + border-style: solid; + border-color: var(--search-input-border-color); + border-radius: var(--search-input-border-radius); +} +.sidebar .search input[type='search'] { + min-width: 0; + padding: var(--search-input-padding); + border: none; + background-color: rgba(0, 0, 0, 0); + background-image: var(--search-input-background-image); + background-position: var(--search-input-background-position); + background-repeat: var(--search-input-background-repeat); + background-size: var(--search-input-background-size); + font-size: var(--search-input-font-size); + color: var(--search-input-color); + transition: var(--search-input-transition); +} +.sidebar .search input[type='search']::-ms-clear { + display: none; +} +.sidebar .search input[type='search']::-moz-placeholder { + color: var(--search-input-placeholder-color, #808080); +} +.sidebar .search input[type='search']::placeholder { + color: var(--search-input-placeholder-color, #808080); +} +.sidebar .search input[type='search']::-webkit-input-placeholder { + line-height: normal; +} +.sidebar .search input[type='search']:focus { + background-color: var( + --search-input-background-color--focus, + var(--search-input-background-color) + ); + background-image: var( + --search-input-background-image--focus, + var(--search-input-background-image) + ); + background-position: var( + --search-input-background-position--focus, + var(--search-input-background-position) + ); + background-size: var( + --search-input-background-size--focus, + var(--search-input-background-size) + ); +} +@supports (width: env(safe-area-inset)) { + @media only screen and (orientation: landscape) { + .sidebar .search input[type='search'] { + margin-left: calc(env(safe-area-inset-left) / 2); + } + } +} +.sidebar .search p { + overflow: hidden; + text-overflow: ellipsis; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; +} +.sidebar .search p:empty { + text-align: center; +} +.sidebar .search .clear-button { + margin: 0; + padding: 0 10px; + border: none; + line-height: 1; + background: rgba(0, 0, 0, 0); + cursor: pointer; +} +.sidebar .search .clear-button svg circle { + fill: var(--search-clear-icon-color1, #808080); +} +.sidebar .search .clear-button svg path { + stroke: var(--search-clear-icon-color2, #fff); +} +.sidebar .search.show ~ *:not(h1) { + display: none; +} +.sidebar .search .results-panel { + display: none; + color: var(--search-result-item-color); + font-size: var(--search-result-item-font-size); + font-weight: var(--search-result-item-font-weight); +} +.sidebar .search .results-panel.show { + display: block; +} +.sidebar .search .matching-post { + margin: var(--search-result-item-margin); + padding: var(--search-result-item-padding); +} +.sidebar .search .matching-post, +.sidebar .search .matching-post:last-child { + border-width: var(--search-result-item-border-width, 0) !important; + border-style: var(--search-result-item-border-style); + border-color: var(--search-result-item-border-color); +} +.sidebar .search .matching-post p { + margin: 0; +} +.sidebar .search .search-keyword { + margin: var(--search-result-keyword-margin); + padding: var(--search-result-keyword-padding); + border-radius: var(--search-result-keyword-border-radius); + background-color: var(--search-result-keyword-background); + color: var(--search-result-keyword-color, currentColor); + font-style: normal; + font-weight: var(--search-result-keyword-font-weight); +} +.medium-zoom-overlay, +.medium-zoom-image--open, +.medium-zoom-image--opened { + z-index: 2147483646 !important; +} +.medium-zoom-overlay { + background: var(--zoomimage-overlay-background) !important; +} +:root { + --mono-hue: 113; + --mono-saturation: 0%; + --mono-shade3: hsl(var(--mono-hue), var(--mono-saturation), 20%); + --mono-shade2: hsl(var(--mono-hue), var(--mono-saturation), 30%); + --mono-shade1: hsl(var(--mono-hue), var(--mono-saturation), 40%); + --mono-base: hsl(var(--mono-hue), var(--mono-saturation), 50%); + --mono-tint1: hsl(var(--mono-hue), var(--mono-saturation), 70%); + --mono-tint2: hsl(var(--mono-hue), var(--mono-saturation), 89%); + --mono-tint3: hsl(var(--mono-hue), var(--mono-saturation), 97%); + --theme-hue: 204; + --theme-saturation: 90%; + --theme-lightness: 45%; + --theme-color: hsl( + var(--theme-hue), + var(--theme-saturation), + var(--theme-lightness) + ); + --modular-scale: 1.333; + --modular-scale--2: calc(var(--modular-scale--1) / var(--modular-scale)); + --modular-scale--1: calc(var(--modular-scale-1) / var(--modular-scale)); + --modular-scale-1: 1rem; + --modular-scale-2: calc(var(--modular-scale-1) * var(--modular-scale)); + --modular-scale-3: calc(var(--modular-scale-2) * var(--modular-scale)); + --modular-scale-4: calc(var(--modular-scale-3) * var(--modular-scale)); + --modular-scale-5: calc(var(--modular-scale-4) * var(--modular-scale)); + --font-size-xxxl: var(--modular-scale-5); + --font-size-xxl: var(--modular-scale-4); + --font-size-xl: var(--modular-scale-3); + --font-size-l: var(--modular-scale-2); + --font-size-m: var(--modular-scale-1); + --font-size-s: var(--modular-scale--1); + --font-size-xs: var(--modular-scale--2); + --duration-slow: 1s; + --duration-medium: 0.5s; + --duration-fast: 0.25s; + --spinner-size: 60px; + --spinner-track-width: 4px; + --spinner-track-color: rgba(0, 0, 0, 0.15); + --spinner-transition-duration: var(--duration-medium); +} +:root { + --base-background-color: #fff; + --base-color: var(--mono-shade2); + --base-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, + Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; + --base-font-size: 16px; + --base-font-weight: normal; + --base-line-height: 1.7; + --emoji-size: calc(var(--base-line-height) * 1em); + --hr-border: 1px solid var(--mono-tint2); + --mark-background: #ffecb3; + --pre-font-family: var(--code-font-family); + --pre-font-size: var(--code-font-size); + --pre-font-weight: normal; + --selection-color: #b4d5fe; + --small-font-size: var(--font-size-s); + --strong-color: var(--heading-color); + --strong-font-weight: 600; + --subsup-font-size: var(--font-size-s); +} +:root { + --content-max-width: 55em; + --blockquote-background: var(--mono-tint3); + --blockquote-border-style: solid; + --blockquote-border-radius: var(--border-radius-m); + --blockquote-em-font-weight: normal; + --blockquote-font-weight: normal; + --blockquote-padding: 1.5em; + --code-font-family: Inconsolata, Consolas, Menlo, Monaco, 'Andale Mono WT', + 'Andale Mono', 'Lucida Console', 'DejaVu Sans Mono', + 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; + --code-font-size: calc(var(--font-size-m) * 0.95); + --code-font-weight: normal; + --code-tab-size: 4; + --code-block-border-radius: var(--border-radius-m); + --code-block-line-height: var(--base-line-height); + --code-block-margin: 1em 0; + --code-block-padding: 1.75em 1.5em 1.5em 1.5em; + --code-inline-background: var(--code-theme-background); + --code-inline-border-radius: var(--border-radius-s); + --code-inline-color: var(--code-theme-text); + --code-inline-margin: 0 0.15em; + --code-inline-padding: 0.125em 0.4em; + --code-theme-background: var(--mono-tint3); + --heading-color: var(--mono-shade3); + --heading-margin: 2.5rem 0 0; + --heading-h1-border-style: solid; + --heading-h1-font-size: var(--font-size-xxl); + --heading-h2-border-style: solid; + --heading-h2-font-size: var(--font-size-xl); + --heading-h3-border-style: solid; + --heading-h3-font-size: var(--font-size-l); + --heading-h4-border-style: solid; + --heading-h4-font-size: var(--font-size-m); + --heading-h5-border-style: solid; + --heading-h5-font-size: var(--font-size-s); + --heading-h6-border-style: solid; + --heading-h6-font-size: var(--font-size-xs); + --kbd-background: var(--mono-tint3); + --kbd-border-radius: var(--border-radius-m); + --kbd-margin: 0 0.3em; + --kbd-min-width: 2.5em; + --kbd-padding: 0.65em 0.5em; + --link-text-decoration: underline; + --notice-background: var(--mono-tint3); + --notice-border-radius: var(--border-radius-m); + --notice-border-style: solid; + --notice-font-weight: normal; + --notice-padding: 1em 1.5em; + --notice-before-font-weight: normal; + --table-cell-padding: 0.75em 0.5em; + --table-head-border-color: var(--table-cell-border-color); + --table-head-font-weight: var(--strong-font-weight); + --table-row-odd-background: var(--mono-tint3); +} +:root { + --cover-margin: 0 auto; + --cover-max-width: 40em; + --cover-text-align: center; + --cover-background-color: var(--base-background-color); + --cover-background-mask-color: var(--base-background-color); + --cover-background-mask-opacity: 0.8; + --cover-background-position: center center; + --cover-background-repeat: no-repeat; + --cover-background-size: cover; + --cover-blockquote-font-size: var(--font-size-l); + --cover-border-color: var(--theme-color); + --cover-button-border: 1px solid var(--theme-color); + --cover-button-border-radius: var(--border-radius-m); + --cover-button-color: var(--theme-color); + --cover-button-padding: 0.5em 2rem; + --cover-button-text-decoration: none; + --cover-button-transition: all var(--duration-fast) ease-in-out; + --cover-button-primary-background: var(--theme-color); + --cover-button-primary-border: 1px solid var(--theme-color); + --cover-button-primary-color: #fff; + --cover-heading-color: var(--theme-color); + --cover-heading-font-size: var(--font-size-xxl); + --cover-heading-font-weight: normal; + --cover-link-text-decoration: underline; +} +:root { + --navbar-root-border-style: solid; + --navbar-root-margin: 0 0 0 1.5em; + --navbar-root-transition: all var(--duration-fast); + --navbar-menu-background: var(--base-background-color); + --navbar-menu-border-radius: var(--border-radius-m); + --navbar-menu-box-shadow: rgba(45, 45, 45, 0.05) 0px 0px 1px, + rgba(49, 49, 49, 0.05) 0px 1px 2px, rgba(42, 42, 42, 0.05) 0px 2px 4px, + rgba(32, 32, 32, 0.05) 0px 4px 8px, rgba(49, 49, 49, 0.05) 0px 8px 16px, + rgba(35, 35, 35, 0.05) 0px 16px 32px; + --navbar-menu-padding: 0.5em; + --navbar-menu-transition: all var(--duration-fast); + --navbar-menu-link-border-style: solid; + --navbar-menu-link-margin: 0.75em 0.5em; + --navbar-menu-link-padding: 0.2em 0; +} +:root { + --copycode-background: #808080; + --copycode-color: #fff; +} +:root { + --docsifytabs-border-color: var(--mono-tint2); + --docsifytabs-border-radius-px: var(--border-radius-s); + --docsifytabs-tab-background: var(--mono-tint3); + --docsifytabs-tab-color: var(--mono-tint1); +} +:root { + --pagination-border-top: 1px solid var(--mono-tint2); + --pagination-chevron-height: 0.8em; + --pagination-chevron-stroke: currentColor; + --pagination-chevron-stroke-linecap: round; + --pagination-chevron-stroke-width: 1px; + --pagination-label-font-size: var(--font-size-s); + --pagination-title-font-size: var(--font-size-l); +} +:root { + --search-margin: 1.5rem 0 0; + --search-input-background-repeat: no-repeat; + --search-input-border-color: var(--mono-tint1); + --search-input-border-width: 1px; + --search-input-padding: 0.5em; + --search-flex-order: 1; + --search-result-heading-color: var(--heading-color); + --search-result-heading-font-size: var(--base-font-size); + --search-result-heading-font-weight: normal; + --search-result-heading-margin: 0 0 0.25em; + --search-result-item-border-color: var(--mono-tint2); + --search-result-item-border-style: solid; + --search-result-item-border-width: 0 0 1px 0; + --search-result-item-font-weight: normal; + --search-result-item-padding: 1em 0; + --search-result-keyword-background: var(--mark-background); + --search-result-keyword-border-radius: var(--border-radius-s); + --search-result-keyword-color: var(--mark-color); + --search-result-keyword-font-weight: normal; + --search-result-keyword-margin: 0 0.1em; + --search-result-keyword-padding: 0.2em 0; +} +:root { + --zoomimage-overlay-background: rgba(0, 0, 0, 0.875); +} +:root { + --sidebar-background: var(--base-background-color); + --sidebar-border-width: 0; + --sidebar-padding: 0 25px; + --sidebar-transition-duration: var(--duration-fast); + --sidebar-width: 17rem; + --sidebar-name-font-size: var(--font-size-l); + --sidebar-name-font-weight: normal; + --sidebar-name-margin: 1.5rem 0 0; + --sidebar-name-text-align: center; + --sidebar-nav-strong-border-color: var(--sidebar-border-color); + --sidebar-nav-strong-color: var(--heading-color); + --sidebar-nav-strong-font-weight: var(--strong-font-weight); + --sidebar-nav-strong-margin: 1.5em 0 0.5em; + --sidebar-nav-strong-padding: 0.25em 0; + --sidebar-nav-indent: 1em; + --sidebar-nav-margin: 1.5rem 0 0; + --sidebar-nav-link-border-style: solid; + --sidebar-nav-link-border-width: 0; + --sidebar-nav-link-color: var(--base-color); + --sidebar-nav-link-font-weight: normal; + --sidebar-nav-link-padding: 0.25em 0; + --sidebar-nav-link-text-decoration--active: underline; + --sidebar-nav-link-text-decoration--hover: underline; + --sidebar-nav-link-before-margin: 0 0.35em 0 0; + --sidebar-nav-pagelink-transition: var(--sidebar-nav-link-transition); + --sidebar-toggle-border-radius: var(--border-radius-s); + --sidebar-toggle-border-style: solid; + --sidebar-toggle-border-width: 0; + --sidebar-toggle-height: 36px; + --sidebar-toggle-icon-color: var(--base-color); + --sidebar-toggle-icon-height: 10px; + --sidebar-toggle-icon-stroke-width: 1px; + --sidebar-toggle-icon-width: 16px; + --sidebar-toggle-offset-left: 0; + --sidebar-toggle-offset-top: calc(35px - (var(--sidebar-toggle-height) / 2)); + --sidebar-toggle-width: 44px; +} +:root { + --code-theme-background: #f3f3f3; + --code-theme-comment: #6e8090; + --code-theme-function: #dd4a68; + --code-theme-keyword: #07a; + --code-theme-operator: #a67f59; + --code-theme-punctuation: #999; + --code-theme-selector: #690; + --code-theme-tag: #905; + --code-theme-text: #333; + --code-theme-variable: #e90; +} +:root { + --border-radius-s: 2px; + --border-radius-m: 4px; + --border-radius-l: 8px; + --strong-font-weight: 600; + --blockquote-border-color: var(--theme-color); + --blockquote-border-radius: 0 var(--border-radius-m) var(--border-radius-m) 0; + --blockquote-border-width: 0 0 0 4px; + --code-inline-background: var(--mono-tint2); + --code-theme-background: var(--mono-tint3); + --heading-font-weight: var(--strong-font-weight); + --heading-h1-font-weight: 400; + --heading-h2-font-weight: 400; + --heading-h2-border-color: var(--mono-tint2); + --heading-h2-border-width: 0 0 1px 0; + --heading-h2-margin: 2.5rem 0 1.5rem; + --heading-h2-padding: 0 0 1rem 0; + --kbd-border: 1px solid var(--mono-tint2); + --notice-border-radius: 0 var(--border-radius-m) var(--border-radius-m) 0; + --notice-border-width: 0 0 0 4px; + --notice-padding: 1em 1.5em 1em 3em; + --notice-before-border-radius: 100%; + --notice-before-font-weight: bold; + --notice-before-height: 1.5em; + --notice-before-left: 0.75em; + --notice-before-line-height: 1.5; + --notice-before-margin: 0 0.25em 0 0; + --notice-before-position: absolute; + --notice-before-width: var(--notice-before-height); + --notice-important-background: hsl(340, 60%, 96%); + --notice-important-border-color: hsl(340, 90%, 45%); + --notice-important-before-background: var(--notice-important-border-color) + url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3E%3Cpath d='M10 14C10 15.1 9.1 16 8 16 6.9 16 6 15.1 6 14 6 12.9 6.9 12 8 12 9.1 12 10 12.9 10 14Z'/%3E%3Cpath d='M10 1.6C10 1.2 9.8 0.9 9.6 0.7 9.2 0.3 8.6 0 8 0 7.4 0 6.8 0.2 6.5 0.6 6.2 0.9 6 1.2 6 1.6 6 1.7 6 1.8 6 1.9L6.8 9.6C6.9 9.9 7 10.1 7.2 10.2 7.4 10.4 7.7 10.5 8 10.5 8.3 10.5 8.6 10.4 8.8 10.3 9 10.1 9.1 9.9 9.2 9.6L10 1.9C10 1.8 10 1.7 10 1.6Z'/%3E%3C/svg%3E") + center / 0.875em no-repeat; + --notice-important-before-color: #fff; + --notice-important-before-content: ''; + --notice-tip-background: hsl(204, 60%, 96%); + --notice-tip-border-color: hsl(204, 90%, 45%); + --notice-tip-before-background: var(--notice-tip-border-color) + url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3E%3Cpath d='M9.1 0C10.2 0 10.7 0.7 10.7 1.6 10.7 2.6 9.8 3.6 8.6 3.6 7.6 3.6 7 3 7 2 7 1.1 7.7 0 9.1 0Z'/%3E%3Cpath d='M5.8 16C5 16 4.4 15.5 5 13.2L5.9 9.1C6.1 8.5 6.1 8.2 5.9 8.2 5.7 8.2 4.6 8.6 3.9 9.1L3.5 8.4C5.6 6.6 7.9 5.6 8.9 5.6 9.8 5.6 9.9 6.6 9.5 8.2L8.4 12.5C8.2 13.2 8.3 13.5 8.5 13.5 8.7 13.5 9.6 13.2 10.4 12.5L10.9 13.2C8.9 15.2 6.7 16 5.8 16Z'/%3E%3C/svg%3E") + center / 0.875em no-repeat; + --notice-tip-before-color: #fff; + --notice-tip-before-content: ''; + --table-cell-border-color: var(--mono-tint2); + --table-cell-border-width: 1px 0; + --cover-background-color: hsl(var(--theme-hue), 25%, 60%); + --cover-background-image: radial-gradient( + ellipse at center 115%, + rgba(255, 255, 255, 0.9), + transparent + ); + --cover-blockquote-color: var(--strong-color); + --cover-heading-color: #fff; + --cover-heading-font-size-max: 56; + --cover-heading-font-size-min: 34; + --cover-heading-font-weight: 200; + --navbar-root-color--active: var(--theme-color); + --navbar-menu-border-radius: var(--border-radius-m); + --navbar-menu-root-background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='9.6' height='6' viewBox='0 0 9.6 6'%3E%3Cpath d='M1.5 1.5l3.3 3 3.3-3' stroke-width='1.5' stroke='rgb%28179, 179, 179%29' fill='none' stroke-linecap='square' stroke-linejoin='miter' vector-effect='non-scaling-stroke'/%3E%3C/svg%3E") + right no-repeat; + --navbar-menu-root-padding: 0 18px 0 0; + --search-input-background-color: #fff; + --search-input-background-image: url("data:image/svg+xml,%3Csvg height='20px' width='20px' viewBox='0 0 24 24' fill='none' stroke='rgba(0, 0, 0, 0.3)' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round' preserveAspectRatio='xMidYMid meet' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='10.5' cy='10.5' r='7.5' vector-effect='non-scaling-stroke'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='15.8' y2='15.8' vector-effect='non-scaling-stroke'%3E%3C/line%3E%3C/svg%3E"); + --search-input-background-position: 21px center; + --search-input-border-color: var(--sidebar-border-color); + --search-input-border-width: 1px 0; + --search-input-margin: 0 -25px; + --search-input-padding: 0.65em 1em 0.65em 50px; + --search-input-placeholder-color: rgba(0, 0, 0, 0.4); + --search-clear-icon-color1: rgba(0, 0, 0, 0.3); + --search-result-heading-font-weight: var(--strong-font-weight); + --search-result-item-border-color: var(--sidebar-border-color); + --search-result-keyword-border-radius: var(--border-radius-s); + --sidebar-background: var(--mono-tint3); + --sidebar-border-color: var(--mono-tint2); + --sidebar-border-width: 0 1px 0 0; + --sidebar-name-color: var(--theme-color); + --sidebar-name-font-weight: 300; + --sidebar-nav-strong-border-width: 0 0 1px 0; + --sidebar-nav-strong-font-size: smaller; + --sidebar-nav-strong-margin: 2em -25px 0.75em 0; + --sidebar-nav-strong-padding: 0.25em 0 0.75em 0; + --sidebar-nav-strong-text-transform: uppercase; + --sidebar-nav-link-border-color: transparent; + --sidebar-nav-link-border-color--active: var(--theme-color); + --sidebar-nav-link-border-width: 0 4px 0 0; + --sidebar-nav-link-color--active: var(--theme-color); + --sidebar-nav-link-margin: 0 -25px 0 0; + --sidebar-nav-link-text-decoration: none; + --sidebar-nav-link-text-decoration--active: none; + --sidebar-nav-link-text-decoration--hover: underline; + --sidebar-nav-pagelink-background: no-repeat 2px calc(50% - 2.5px) / 6px 5px + linear-gradient( + 45deg, + transparent 2.75px, + var(--mono-tint1) 2.75px 4.25px, + transparent 4px + ), + no-repeat 2px calc(50% + 2.5px) / 6px 5px + linear-gradient( + 135deg, + transparent 2.75px, + var(--mono-tint1) 2.75px 4.25px, + transparent 4px + ); + --sidebar-nav-pagelink-background--active: no-repeat 0px center / 5px 6px + linear-gradient( + 225deg, + transparent 2.75px, + var(--theme-color) 2.75px 4.25px, + transparent 4.25px + ), + no-repeat 5px center / 5px 6px + linear-gradient( + 135deg, + transparent 2.75px, + var(--theme-color) 2.75px 4.25px, + transparent 4.25px + ); + --sidebar-nav-pagelink-background--collapse: no-repeat 2px calc(50% - 2.5px) / + 6px 5px + linear-gradient( + 45deg, + transparent 2.75px, + var(--theme-color) 2.75px 4.25px, + transparent 4px + ), + no-repeat 2px calc(50% + 2.5px) / 6px 5px + linear-gradient( + 135deg, + transparent 2.75px, + var(--theme-color) 2.75px 4.25px, + transparent 4px + ); + --sidebar-nav-pagelink-background--loaded: no-repeat 0px center / 5px 6px + linear-gradient( + 225deg, + transparent 2.75px, + var(--mono-tint1) 2.75px 4.25px, + transparent 4.25px + ), + no-repeat 5px center / 5px 6px + linear-gradient( + 135deg, + transparent 2.75px, + var(--mono-tint1) 2.75px 4.25px, + transparent 4.25px + ); + --sidebar-nav-pagelink-padding: 0.25em 0 0.25em 20px; + --sidebar-nav-pagelink-transition: none; + --sidebar-toggle-background: var(--sidebar-border-color); + --sidebar-toggle-border-radius: 0 var(--border-radius-s) + var(--border-radius-s) 0; + --sidebar-toggle-width: 32px; +} +:root { + --code-theme-background: #222; + --code-theme-comment: #516e7a; + --code-theme-function: #f07178; + --code-theme-keyword: #c2e78c; + --code-theme-operator: #ffcb6b; + --code-theme-punctuation: #89ddff; + --code-theme-selector: #ffcb6b; + --code-theme-tag: #f07178; + --code-theme-text: #f3f3f3; + --code-theme-variable: #ffcb6b; +} +:root { + --mono-hue: 201; + --mono-saturation: 18%; + --mono-shade3: hsl(var(--mono-hue), var(--mono-saturation), 13%); + --mono-shade2: hsl(var(--mono-hue), var(--mono-saturation), 15%); + --mono-shade1: hsl(var(--mono-hue), var(--mono-saturation), 17%); + --mono-base: hsl(var(--mono-hue), var(--mono-saturation), 19%); + --mono-tint1: hsl(var(--mono-hue), var(--mono-saturation), 25%); + --mono-tint2: hsl(var(--mono-hue), var(--mono-saturation), 35%); + --mono-tint3: hsl(var(--mono-hue), var(--mono-saturation), 43%); + --spinner-track-color: rgba(255, 255, 255, 0.15); + --base-background-color: var(--mono-base); + --base-color: #d3d3d3; + --hr-border: 1px solid var(--mono-tint2); + --mark-background: #ffcb6b; + --mark-color: var(--base-background-color); + --selection-color: rgba(94, 131, 175, 0.75); + --blockquote-background: var(--mono-shade2); + --code-inline-background: var(--mono-tint1); + --code-theme-background: var(--mono-shade2); + --heading-color: #fff; + --heading-h2-border-color: var(--mono-tint2); + --kbd-background: var(--mono-shade2); + --kbd-border: none; + --kbd-color: var(--strong-color); + --notice-important-background: var(--mono-shade2); + --notice-tip-background: var(--mono-shade2); + --table-cell-border-color: var(--mono-tint1); + --table-row-odd-background: var(--mono-shade2); + --cover-background-color: var(--base-background-color); + --cover-background-image: radial-gradient( + ellipse at center bottom, + var(--mono-tint3), + transparent + ); + --cover-blockquote-color: var(--mark-background); + --cover-button-border: 1px solid var(--mono-tint3); + --cover-button-color: #fff; + --navbar-menu-background: var(--mono-tint1); + --navbar-menu-box-shadow: rgba(0, 0, 0, 0.05) 0px 0px 1px, + rgba(0, 0, 0, 0.05) 0px 1px 2px, rgba(0, 0, 0, 0.05) 0px 2px 4px, + rgba(0, 0, 0, 0.05) 0px 4px 8px, rgba(0, 0, 0, 0.05) 0px 8px 16px, + rgba(0, 0, 0, 0.05) 0px 16px 32px; + --copycode-background: var(--mono-tint1); + --copycode-color: #fff; + --docsifytabs-border-color: var(--mono-tint2); + --docsifytabs-tab-background: var(--mono-shade1); + --docsifytabs-tab-color: var(--mono-tint2); + --pagination-border-top: 1px solid var(--mono-tint2); + --pagination-title-color: #fff; + --search-input-background-color: var(--mono-shade2); + --search-input-background-image: url("data:image/svg+xml,%3Csvg height='20px' width='20px' viewBox='0 0 24 24' fill='none' stroke='rgba(255, 255, 255, 0.3)' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round' preserveAspectRatio='xMidYMid meet' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='10.5' cy='10.5' r='7.5' vector-effect='non-scaling-stroke'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='15.8' y2='15.8' vector-effect='non-scaling-stroke'%3E%3C/line%3E%3C/svg%3E"); + --search-input-border-color: var(--mono-tint1); + --search-input-placeholder-color: rgba(255, 255, 255, 0.4); + --search-clear-icon-color1: rgba(255, 255, 255, 0.3); + --sidebar-background: var(--mono-shade1); + --sidebar-border-color: var(--mono-tint1); + --sidebar-nav-pagelink-background: no-repeat 2px calc(50% - 2.5px) / 6px 5px + linear-gradient( + 45deg, + transparent 2.75px, + var(--mono-tint2) 2.75px 4.25px, + transparent 4px + ), + no-repeat 2px calc(50% + 2.5px) / 6px 5px + linear-gradient( + 135deg, + transparent 2.75px, + var(--mono-tint2) 2.75px 4.25px, + transparent 4px + ); + --sidebar-nav-pagelink-background--loaded: no-repeat 0px center / 5px 6px + linear-gradient( + 225deg, + transparent 2.75px, + var(--mono-tint2) 2.75px 4.25px, + transparent 4.25px + ), + no-repeat 5px center / 5px 6px + linear-gradient( + 135deg, + transparent 2.75px, + var(--mono-tint2) 2.75px 4.25px, + transparent 4.25px + ); +} + +:root { + --cover-background-color: #0c0e25; + --search-padding : 8px; +} + +/*# sourceMappingURL=theme-simple-dark.css.map */ diff --git a/module.d.ts b/module.d.ts deleted file mode 100644 index 087f56d..0000000 --- a/module.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare module 'qvapay-ts'; diff --git a/package-lock.json b/package-lock.json index 9dff391..e2c2956 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "qvapay-sdk", - "version": "0.0.1", + "version": "0.0.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "qvapay-sdk", - "version": "0.0.1", + "version": "0.0.2", "license": "MIT", "dependencies": { "axios": "^1.3.3", diff --git a/package.json b/package.json index 70e51d3..d2d9112 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "qvapay-sdk", - "version": "0.0.1", + "version": "0.0.2", "description": "Este proyecto es un SDK en TypeScript para Node.js que permite interactuar con la API de QvaPay.", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -15,7 +15,7 @@ "dev": "nodemon ./src/index.ts", "prepare": "npm run build", "p": "npm publish", - "test": "jest" + "test": "jest --runInBand --detectOpenHandles --forceExit" }, "dependencies": { "axios": "^1.3.3", diff --git a/src/api/transactions.ts b/src/api/transactions.ts index ef168f5..33b7b3d 100644 --- a/src/api/transactions.ts +++ b/src/api/transactions.ts @@ -35,7 +35,7 @@ export const getOneTransaction = async ( id: string ): Promise => { try { - const { data } = await qvapayAPI.get(`/transactions/${id}`, { + const { data } = await qvapayAPI.post(`/transactions/${id}`, null, { headers: { Authorization: `Bearer ${accessToken}`, }, diff --git a/src/app.ts b/src/app.ts new file mode 100644 index 0000000..d9fc679 --- /dev/null +++ b/src/app.ts @@ -0,0 +1,20 @@ +import 'dotenv/config'; +import { login, getOneTransaction, getOffers } from './api'; +import { OffersParams } from './interfaces'; +import { Login } from './interfaces/login'; + +(async () => { + const loginData: Login = { + email: process.env.EMAIL, + password: process.env.PASSWORD, + }; + const props: OffersParams = { + coin: 'ETECSA', + }; + const id = '252952e6-4f19-46a8-83ae-491abcdf93e4'; + const { accessToken } = await login(loginData); + + const res = await getOffers(accessToken, props); + + console.log(res); +})(); diff --git a/src/interfaces/updateUser.ts b/src/interfaces/updateUser.ts index 55cca60..7966b69 100644 --- a/src/interfaces/updateUser.ts +++ b/src/interfaces/updateUser.ts @@ -1,10 +1,10 @@ export interface UpdateUser { - name?: string; + name: string; + username: string; lastname?: string; bio?: string; logo?: string; kyc?: number; - username?: string; email?: string; password?: string; } diff --git a/src/interfaces/user.ts b/src/interfaces/user.ts index d2d6a0d..0558d9e 100644 --- a/src/interfaces/user.ts +++ b/src/interfaces/user.ts @@ -5,11 +5,15 @@ export interface User { username: string; name: string; lastname: string; + email: string; bio: string; - logo: string; balance: string; - kyc: number; total_in: string; total_out: string; latestTransactions: LatestTransaction[]; + profile_photo_path: string; + complete_name: string; + name_verified: string; + profile_photo_url: string; + average_rating: string; } diff --git a/tsconfig.json b/tsconfig.json index b371378..c5530f3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -22,5 +22,6 @@ /* Completeness */ "skipLibCheck": true /* Skip type checking all .d.ts files. */ - } + }, + "exclude": ["node_modules", "__test__", "docs"] }