From c90074a5946ed3ca3570ea17a70a2cee04711e94 Mon Sep 17 00:00:00 2001 From: Derlys Dominguez Date: Tue, 30 Jan 2024 20:01:55 +0000 Subject: [PATCH] feat: dev to posts imported --- .../src/lib/api-core-provision-data.ts | 12 + .../src/lib/provision-data/derlys-dev-to.ts | 102 +++ .../feature/src/lib/settings-feature.tsx | 2 +- .../feature/src/lib/user-detail-feature.tsx | 2 +- .../lib/user-detail-post-detail-feature.tsx | 3 +- package.json | 1 + pnpm-lock.yaml | 587 +++++++++++++++++- 7 files changed, 702 insertions(+), 7 deletions(-) create mode 100644 libs/api/core/data-access/src/lib/provision-data/derlys-dev-to.ts diff --git a/libs/api/core/data-access/src/lib/api-core-provision-data.ts b/libs/api/core/data-access/src/lib/api-core-provision-data.ts index 4355df6..f35e6bd 100644 --- a/libs/api/core/data-access/src/lib/api-core-provision-data.ts +++ b/libs/api/core/data-access/src/lib/api-core-provision-data.ts @@ -1,6 +1,7 @@ import { faker } from '@faker-js/faker' import { IdentityProvider, Prisma, Token, UserRole, UserStatus } from '@prisma/client' import { slugifyId } from './helpers/slugify-id' +import { postDerlys } from './provision-data/derlys-dev-to' const prices = [ // @@ -16,6 +17,11 @@ export const provisionUsers: Prisma.UserCreateInput[] = [ avatarUrl: 'https://avatars.githubusercontent.com/u/58484607?v=4', posts: { create: [ + ...postDerlys.map((post) => ({ + ...post, + updatedAt: post.createdAt, + prices: { create: prices }, + })), { title: 'Derlys Post 1', content: 'Hola!!', prices: { create: prices } }, { title: 'Derlys Post 2', content: 'Hola!!', prices: { create: prices } }, { title: 'Derlys Post 3', content: 'Hola!!', prices: { create: prices } }, @@ -35,6 +41,12 @@ export const provisionUsers: Prisma.UserCreateInput[] = [ developer: true, posts: { create: [ + ...postDerlys.map((post) => ({ + ...post, + title: `${post.title} (Alice)`, + updatedAt: post.createdAt, + prices: { create: prices }, + })), { title: 'Alice Post 1', content: 'Hola from Alice!!' }, { title: 'Alice Post 2', content: 'Hola from Alice!!' }, { title: 'Alice Post 3', content: 'Hola from Alice!!' }, diff --git a/libs/api/core/data-access/src/lib/provision-data/derlys-dev-to.ts b/libs/api/core/data-access/src/lib/provision-data/derlys-dev-to.ts new file mode 100644 index 0000000..166fc5d --- /dev/null +++ b/libs/api/core/data-access/src/lib/provision-data/derlys-dev-to.ts @@ -0,0 +1,102 @@ +import { Prisma } from '@prisma/client' + +export const postDerlys: Prisma.PostCreateWithoutAuthorInput[] = [ + { + title: 'Generar direcciones personalizadas en Solana', + createdAt: '2024-01-10T17:04:58.900Z', + id: 'generar-direcciones-personalizadas-en-solana-1na5', + content: + 'Las direcciones personalizadas dan cierta legibilidad a la cadena aleatoria de letras y números conocida como dirección del monedero Solana.\n\n\n\nSi alguna vez ha realizado una sola transacción en la blockchain Solana, hay una probabilidad muy alta de que haya interactuado antes con una de estas direcciones de vanidad. Algunos de los programas más conocidos utilizan una dirección, como estás:\n\n- [TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA](https://solscan.io/account/TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA)- SPL Token program\n\n- [TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb](https://solscan.io/account/TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb)- SPL Token 2022 program\n\n- [whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc ](https://solscan.io/account/whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc)- Orca Whirlpools\n\n- [srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX](https://solscan.io/account/srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX)- Openbook\n\nObservará que cada una de las direcciones de cuenta comienza con algunas palabras legibles (o partes de ellas). Todas son "Vanity Address".\n\n> ¿Inmersión técnica?\n\n> Puede leer todo acerca de [cómo se derivan y generan las direcciones Solana](https://nick.af/articles/derive-solana-addresses) en mi profundización técnica al respecto. Incluyendo la comprensión de la "ruta de derivación" utilizada para generar direcciones vanidad con la Solana CLI. Cosas bastante interesantes 😀.\n\n## Cómo generar una dirección personalizada\n\nLa manera más fácil y común de generar direcciones vanity es usando el [CLI de Solana](https://dev.to/derlys/introduccion-a-la-cli-de-solana-5e1m). Así que eso es lo que voy a demostrar aquí también.\n\n> Instale el Solana CLI\n\n> Si usted no tiene el Solana CLI ya instalada y configurado en su computadora, entonces usted puede leer mi otro artículo sobre [Como Instalar y Configurar el Solana CLI](https://dev.to/derlys/introduccion-a-la-cli-de-solana-5e1m)\n\nAsegúrese de que tiene el programa **solana-keygen** instalado y funcionando ejecutándolo:\n\n```bash\nsolana-keygen --version\n\n# output (note the version)\n# solana-keygen 1.17.6 (src:61caae6b; feat:3073089885, client:SolanaLabs)\n```\n\nAnote la versión que tiene instalada. Esto será importante si desea generar una dirección de vanidad para su uso en carteras web/navegadores como Phantom o Solflare. Más sobre esto en un momento.\n\nUtilizando el programa solana keygen, podemos buscar (es decir, generar por fuerza bruta) nuevas direcciones de vanidad que empiecen por, acaben por, o empiecen Y acaben por determinados caracteres.\n\nPara ver todas las opciones que puede utilizar para generar direcciones vanity aleatorias de Solana, consulte la ayuda de grind:\n\n```\nsolana-keygen grind --help\n```\n\n## Caracteres no admitidos\n\nLas direcciones públicas y las transacciones de Solana funcionan con el juego de caracteres base-58. Es decir, solo hay 58 caracteres posibles:\n\n- incluidas las mayúsculas A-Z, excluidas las mayúsculas **O** e **I**(como en **Oscar** e **India**)\n\n- letras minúsculas de la A a la Z, excepto la **l** minúscula (como en **letter**)\n- dígitos 1-9, (que no incluyen el **0**)\n\nEstas letras específicas están **excluidas** del conjunto de caracteres base-58, ya que pueden confundirse fácilmente con otros caracteres. Y si se utiliza el carácter equivocado, ¡la dirección de la cadena de bloques es completamente diferente!\n\nAsí que cuando intente generar direcciones vanity usando uno de los 4 caracteres no soportados, el CLI de Solana le dará un error.\n\n## Velocidad de generación de las direcciones de vanidad\n\nEn el momento actual, el CLI de Solana solo soporta este método de fuerza bruta para generar direcciones de vanidad con todos los hilos de las CPUs de tu ordenador. Así que cuanto más potente sea tu CPU, menos tiempo tardará.\n\nDato: mi portátil de gama media con una CPU Intel i7 de 8 núcleos puede generar 1.000.000 de direcciones de clave privada cada ~6,3 segundos.\n\nEl otro gran factor que influye en la velocidad de generación de direcciones es la cadena de caracteres que se busca. Cuanto más larga sea la cadena (por ejemplo, 4 caracteres frente a 8 caracteres) y si se ignoran las mayúsculas o minúsculas (por ejemplo, "n" frente a "Nnn"), más tiempo se tardará.\n\nEl último factor importante es si estás intentando generar la frase mnemotécnica o solo la clave privada. Generar la frase mnemotécnica llevará SIGNIFICATIVAMENTE MÁS TIEMPO que sin.\n\nDato: el mismo ordenador del dato anterior puede generar `1.000.000` de direcciones de frases mnemotécnicas cada `~15-20 minutos`. Mucho más tiempo.\n\n## Rectificado básico\n\nPara iniciar el proceso de `grind` buscando una dirección que empiece por una cadena establecida:\n\n```\nsolana-keygen grind --starts-with nemesis:1 --ignore-case\n```\nEste simple comando se ejecutará hasta que se encuentre `1 `dirección de vanidad que empiece por `nemeisis` (ignorando las mayúsculas y minúsculas). Bastante simple.\n\nTambién hay que tener en cuenta que, una vez encontrada una dirección que coincida, la clave privada (en forma de matriz de bytes) se guardará en el directorio de trabajo actual de su terminal con el archivo denominado `.json`\n\n## Coincidencia de varias cadenas\n\nEl comando `grind` también le permite especificar múltiples cadenas que desea buscar y comparar. Esta suele ser una forma más eficaz de buscar si está buscando más de una dirección de vanidad posible.\n\nPara buscar y hacer coincidir varias cadenas, basta con especificar varias veces el indicador `--starts-with` o `--ends-with` o `--starts-and-ends-with` (con su valor). Por ejemplo:\n\n```bash\nsolana-keygen grind --ignore-case --starts-with n:2 --starts-with fress:2 --ends-with dominguez:2\n```\n\nEste proceso continuará hasta que se encuentren `2` coincidencias para **CADA** una de las comparaciones de cadena dadas. Al final, se generarán 6 direcciones.\n\n## Generar con frase mnemotécnica\n\n\n\n## Vanidad con ruta mnemotécnica y de derivación\n\nEl uso de la opción `--derivation-path` le permitirá establecer una ruta de derivación personalizada en la CLI de Solana. Si no especifica una ruta de derivación personalizada, este indicador utilizará una ruta codificada de `m/44\'/501\'/0\'/0\'` (que está lista para utilizarse con Phantom y Solflare).\n\nA diferencia del valor predeterminado de la CLI de Solana, la ruta de derivación de `m/44\'/501\'` (que NO es compatible con los monederos de navegador).\n\n```\n./solana/target/release/solana-keygen grind --use-mnemonic --derivation-path --starts-with nick:1 --no-passphrase\n```\n\nSi lo desea, también puede establecer una ruta de derivación personalizada como esta:\n\n```\n./solana/target/release/solana-keygen grind --use-mnemonic --derivation-path m/44/117/0/0 --starts-with nick:1 --no-passphrase\n```\n\n### Añade tu dirección de vanidad en el monedero de tu navegador\n\nEl mnemotécnico resultante de este comando puede introducirse en el monedero de su navegador y funcionará.\n\nA continuación, puede utilizar cualquiera de las otras banderas de `grind` para personalizar las direcciones de vanidad que está buscando, y ser más utilizable en el resto de la blockchain Solana 🙃\n\n## Cómo genero las direcciones personalizadas\n\nLa forma en que me gusta generar direcciones de vanidad con mnemónicos es creando una carpeta `grind_keys` separada en mi ordenador. A continuación, la salida de los mnemónicos generados a un archivo de texto en mi ordenador.\n\nA continuación, envío la salida del proceso a un archivo de texto (también conocido como mnemónico) para su uso posterior.\n\nAsí:\n\n```\nmkdir grinder_keys && cd grind_keys\nmkdir keys && cd keys\n./solana/target/release/solana-keygen grind --no-passphrase --use-mnemonic --derivation-path --ignore-case --starts-with nick:100 --starts-with more:100 >> ../mnemonics.txt\n```\n\nEsto me permite simplemente ejecutar el mismo comando `grind `cada vez que inicio mi ordenador. Así puedo generar direcciones durante periodos de tiempo más largos, como días y semanas, en mi ordenador de sobremesa. Sin miedo a perder la mnemotecnia generada.\n\n\nA excepción de algunos links actualizados y párrafos, este tutorial fue creado en el idioma inglés por [Nick Frostbutter](https://twitter.com/nickfrosty). Muchas gracias por crear este tipo de contenido.\n\nEspero esta traducción le sea de ayuda a la comunidad Hispanohablante que usa [Solana](https://solana.com/) que está creciendo enormemente.\n\nHaz parte de la comunidad [SOLANA LATAM](https://discord.gg/sPVaqarbxY).\n\n[HispanaSol](https://t.me/+Axat5MuV6ow5NWY0)\n\n\n\n', + }, + { + title: '2023: El año de la comunidad Solana', + createdAt: '2023-12-22T14:52:16.862Z', + id: 'la-comunidad-de-solana-en-2023-cki', + content: + '¿Ya estamos en otro Solsticio de Solana? 2023 parece haber pasado volando: un año lleno de acontecimientos, marcado por retos y oportunidades. Y ahora que la comunidad echa la vista atrás, es importante recordar lo lejos que hemos llegado.\n\nEl comienzo de 2023 fue la profundidad de los inviernos más fríos, un momento difícil para la gente en todo el ecosistema Solana y la comunidad blockchain en general. La comunidad Solana no solo se mantuvo firme, sino que se redobló.\n\nUn grito de guerra orgánico, "solo es posible con Solana", resumía la actitud de quienes seguían construyendo. El ecosistema de Solana puede ser el lugar donde las tarifas bajas y el alto rendimiento abren nuevos casos de uso, por supuesto, pero también es el lugar donde una comunidad comprometida, vibrante y orgánica lidera por encima de todo. Los aspectos más destacados y las victorias de 2023 no son obra de ningún equipo ni de ningún individuo, sino que pertenecen al gran colectivo de constructores, artistas, líderes y usuarios que hacen que Solana sea Solana.\n\nSolana les pertenece. De parte de los que trabajamos en la Fundación Solana, gracias.\n\nAsí es como hiciste de 2023 el año de la comunidad de Solana.\n\n## Un resurgimiento liderado por la comunidad\n\nEn diciembre de 2022, la gente empezó a recibir algo extraño en sus carteras (wallets): un token con el logotipo de un shiba inu. Los recibían por usar dApps y proyectos de Solana, por unirse a eventos y por ser participantes activos en la comunidad de Solana.\n\nUn año después, la manía Bonk ha arrasado el mundo de la web3.\n\n{% embed https://twitter.com/bonk_inu/status/1735344728995139609 %}\n\n\nLa historia de Bonk es la historia del renacimiento del ecosistema de Solana en 2023, y de cómo lo lideró la comunidad. Los planes que se habían trazado meses o años antes empezaron a dar sus frutos, y las personas que se quedaron y construyeron durante tiempos inciertos se convirtieron en los nuevos líderes de la comunidad. Tras un año de impulso, el ecosistema de Solana volvió a despegar.\n\nPor ejemplo, 2023 fue el año en que **Saga**, de Solana Mobile, salió al mercado. A pesar de la expectación suscitada por el anuncio y el lanzamiento iniciales, no fue hasta que estalló el entusiasmo de la comunidad cuando el dispositivo móvil web3-nativo, insignia, se agotó en diciembre de 2023.\n\n{% embed https://twitter.com/solanamobile/status/1735835498025832651 %}\n\nEn febrero, la comunidad de Helium votó a favor de migrar de su propia blockchain de capa-1 a Solana. La migración tuvo lugar a finales de marzo... y se produjo sin contratiempos, demostrando que Solana tiene un hogar para los proyectos de infraestructuras descentralizadas y allanando el camino para que futuros equipos den el salto por sí mismos.\n\n{% embed https://twitter.com/helium/status/1648725076571766786 %}\n\nEste ha sido el año de Solana DeFi 2.0: nuevos conjuntos de herramientas y proyectos, liderados por la comunidad descentralizada, que hacen posible la próxima generación de finanzas: **Maple Finance** volvió a Solana con tokenized t-bills; Pyth se trasladó a la gobernanza comunitaria de su Solana Permissioned Environment; TBTC trajo BTC a Solana; **Armada** lanzó una infraestructura de tokens de código abierto; el lanzamiento de múltiples nuevas stablecoins; y mucho más. Hace unos días, el volumen DEX de 24 horas de Solana superó al de Ethereum por primera vez en la historia.\n\n{% embed https://twitter.com/DegenerateNews/status/1735842380257869974 %}\n\nY la infraestructura de validadores dirigida por la comunidad siguió avanzando. Como una de las cadenas más descentralizadas en web3 por el coeficiente de Nakamoto, los clientes validadores alternativos como **Firedancer** de Jump Crypto, el cliente de **Jito Labs** y **Tinydancer **continuaron diversificando y asegurando la pila tecnológica de Solana.\n\n{% embed https://twitter.com/solana/status/1719310929593057720 %}\n\n## Desarrolladores que innovan\n\nLas innovaciones dentro del ecosistema Solana avanzaron a un ritmo vertiginoso en 2023, ya que los equipos colaboraron para introducir nuevos estándares y herramientas para toda la comunidad. Quizá nada lo ejemplifique mejor que el equipo de todo el ecosistema que trabaja para implantar la compresión de estados, una innovación que utiliza árboles de Merkle para reducir significativamente el coste del alquiler en la red Solana.\n\n{% embed https://twitter.com/solana/status/1643972968433975296 %}\n\nDel mismo modo, Solana Labs introdujo un plugin que permitía a la IA interactuar con la cadena de bloques Solana, permitiendo a los desarrolladores crear herramientas útiles que unían el poder de la cadena de bloques y la inteligencia artificial.\n\n{% embed https://twitter.com/solanalabs/status/1650955017585606656 %}\n\nNo sólo trabajaron los grandes equipos: la comunidad de desarrolladores de Solana siguió creciendo. Dos [hackathones de Solana](https://solana.com/hackathon), **Grizzlython** e **Hyperdrive**, registraron un número récord de solicitudes y propuestas. En Hyperdrive se presentaron más de 900 proyectos, el mayor número hasta la fecha, a pesar de las difíciles condiciones del mercado.\n\n{% embed https://twitter.com/mattytay/status/1720579154737873218 %}\n\nTodo se debe a que la experiencia de los desarrolladores al construir sobre Solana sigue mejorando: en lugar del viejo meme de que construir sobre la blockchain Solana es como masticar vidrio, hoy es más como surfear sobre vidrio. Los **nuevos recursos y herramientas para desarrolladores** han permitido a miles de desarrolladores crear la aplicación descentralizada de sus sueños. Más información en [el portal para desarrolladores de Solana.com](https://solana.com/developers)\n\n{% embed https://www.youtube.com/watch?v=zTddk2pf2yI %}\n\n## Las instituciones se apoyan en Solana\n\nA medida que la vibrante comunidad de Solana proseguía su labor, las instituciones empezaron a tomar nota. En 2023, varias grandes empresas y firmas tradicionales empezaron a explorar el ecosistema de Solana.\n\nEn abril, **Mastercard**, en colaboración con la Fundación Solana, trabajó en herramientas para ayudar a asegurar las transacciones entre instituciones web2 y web3.\n\n{% embed https://twitter.com/MastercardNews/status/1652003395052380160 %}\n\n**Visa** amplió su programa piloto de stablecoin USDC a la red Solana, tras meses de investigación exhaustiva sobre la pila tecnológica y las ventajas de la cadena de bloques Solana.\n\n{% embed https://twitter.com/cuysheffield/status/1699031109080945049 %}\n\nSolana Pay, un protocolo de pagos entre pares descentralizado y de código abierto construido sobre la cadena de bloques Solana por Solana Labs, se integró con **Shopify** - desbloqueando pagos USDC a millones de empresas como una integración de aplicación aprobada.\n\n{% embed https://twitter.com/solana/status/1694336131599393186 %}\n\n**Boba Guys**, una popular tienda de té, llevó a cabo una prueba piloto de su programa de fidelización basado en Solana en una tienda de San Francisco. ¿Los resultados? [Un 67% más](https://cointelegraph.com/news/boba-guys-shopify-users-showcase-adoption-web3-tools-solana-breakpoint) de visitas mensuales entre los participantes en el programa de fidelización y un 65% más de consumo. El programa se extendió a todo el país en noviembre.\n\n{% embed https://www.youtube.com/watch?v=yoZ2eF6Na7w %}\n\nMás allá de los productos dirigidos a consumidores y empresas, las grandes instituciones de infraestructuras también empezaron a integrar el soporte para la blockchain Solana. **Google Cloud** integró los datos de [Solana onchain en BigQuery](https://solana.com/news/solana-data-live-on-google-cloud-bigquery), desbloqueando nuevos casos de uso.\n\n{% embed https://twitter.com/googlecloud/status/1680654353357582337 %}\n\n**Amazon Web Services** también anunció que la [compatibilidad con los nodos de red Solana](https://solana.com/news/solana-blockchain-node-development-blueprints-available-on-aws) estaba disponible para su despliegue.\n\n{% embed https://www.youtube.com/watch?v=wqADZnNPSV0 %}\n\n## Reunirse IRL (In real life)\n\nA pesar de las frías condiciones de la industria, en 2023 la comunidad de Solana tomó el mando. En ningún lugar esto fue más evidente que en las reuniones de la vida real de creadores, usuarios y fanáticos del ecosistema de Solana que tuvieron lugar en todo el mundo.\n\n**Breakpoint**, la conferencia anual de la comunidad Solana organizada por la Fundación Solana, congregó a más de 3.000 asistentes en el Campus Solana, a las afueras de Ámsterdam, durante una semana de construcción y creación de redes. Pero fueron los actos organizados por la comunidad que proliferaron en el campus y fuera de él, desde conferencias como **Block Zero**, **DRiP Haus** y **The Network State** hasta actos paralelos de **Superteam** y otros proyectos del ecosistema, los que encarnaron el verdadero espíritu comunitario.\n\n{% embed https://www.youtube.com/watch?v=0MoYSUxYDFk %}\n\n**Las Solanas Hacker Houses**, que muestran el trabajo del ecosistema Solana en ciudades de todo el mundo, vieron a más de 6.000 desarrolladores enviar y aprender colectivamente\n\n{% embed https://twitter.com/hackerhouses/status/1620458593563574277 %}\n\n**AthensDAOx**, un evento organizado por el equipo de DeansListDAO, causó sensación con un fin de semana centrado en la gobernanza.\n\n{% embed https://twitter.com/Cointelegraph/status/1734927545156669615 %}\n\nMientras tanto, **Solana Crossroads** -una conferencia independiente en Estambul, organizada por Step Finance- mostró la creciente comunidad de constructores en Turquía.\n\n{% embed https://twitter.com/SolanaCrossroad/status/1649042474449637382 %}\n\n**mtnDAO**, el hacker house comunitario de Salt Lake City, acogió una semana de talleres, aprendizaje y mucho más sobre el ecosistema Solana.\n\n{% embed https://twitter.com/mtndao/status/1625981076593348608 %}\n\nLa comunidad de creadores del ecosistema Solana [hizo su debut](https://solana.com/art-basel) en **Art Basel Miami Beach**, con artistas que organizaron estudios y crearon piezas en directo y experiencias organizadas por equipos de apoyo a los creadores de todo el ecosistema Solana.\n\n{% embed https://twitter.com/sofiagarcia_io/status/1734653445171273838 %}\n\nEstos eventos no fueron los únicos. Desde festivales como **PlayGG** hasta **reuniones informales de la comunidad, desde Vancouver hasta Tokio**, la comunidad Solana demostró su fuerza en todo el mundo.\n\n## ¿Y ahora qué?\n\nSegún todos los indicios, la comunidad de Solana no ha hecho más que empezar. Si 2023 fue el año del renacimiento del ecosistema de Solana, 2024 volverá a ser el verano de Solana.\n\nPero para que eso ocurra, la comunidad tiene que liderar, construir y seguir avanzando. Es un momento emocionante para el ecosistema Solana, con nuevos proyectos y noticias que aparecen a diario. Pero todo depende de ti.\n\nEl impulso hacia adelante que la comunidad Solana está experimentando en este momento puede continuar, pero requiere un enfoque implacable y priorización. Sigue escribiendo código innovador, sigue creando la próxima generación de arte, sigue esforzándote por encontrar el próximo caso de uso en el mundo real y sigue mostrando al mundo el poder de una blockchain que se mueve a la velocidad de la luz.\n\nEl mejor momento para dar el paso y comenzar su proyecto Solana es ahora. ¿Qué vas a construir?\n\n\nEste tutorial fue creado en el idioma inglés por [Solana](https://solana.com/news/solana-solstice-2023-community-review).\n\nEspero esta traducción le sea de ayuda a la comunidad Hispanohablante que usa [Solana](https://solana.com/) que está creciendo enormemente.\n\nHaz parte de la comunidad [SOLANA LATAM](https://discord.gg/sPVaqarbxY).\n', + }, + { + title: 'Configurar Solana en Linux', + createdAt: '2023-12-18T17:14:49.768Z', + id: 'configurar-solana-en-linux-5f70', + content: + '---\nseries: Solana\n---\n\nEn este tutorial vamos a: Instalar las herramientas, crear una billetera local y crear un ejemplo de hola mundo. Programa para probar que está correctamente configurado.\n\nConfigure su entorno de desarrollo Solana en Linux con esta guía de instalación completa\n\nPara configurar e instalar Solana en Linux, necesitará para instalar lo siguiente:\n\n- NodeJS y Yarn\n- Varios paquetes y bibliotecas del sistema Linux\n- Rust and Cargo (usando Rustup)\n- El conjunto de herramientas CLI de Solana\n- El marco `Anchor` (no es realmente necesario, ¡pero sí muy recomendable!)\n\n> Aviso: Es posible que se encuentre con errores del compilador o del generador durante el proceso de configuración, dependiendo de qué bibliotecas y dependencias ya tenga su sistema Linux instalado.\n\n## Instalar NodeJS y Yarn\n\nSeamos realistas, el mundo de web 3 y blockchain se está construyendo con Aplicaciones basadas en JavaScript/TypeScript. De los cuales, NodeJS y el paquete NPM está a la vanguardia.\n\nAsí que simplemente [instala NodeJS](https://nodejs.org/en) (si eres uno de esos desarrolladores cripto curiosos que aún no lo tienen instalado). En Linux/Ubuntu, recomiendo instalar NodeJS usando [administrador de versiones de nodo](https://github.com/nvm-sh/nvm)(también conocido como NVM). ¡Actualizar las versiones de Node es lo más sencillo posible!\n\nA continuación, recomiendo encarecidamente instalar el [Administrador de paquetes de Yarn](https://www.npmjs.com/package/yarn). Mucha gente está usando `Yarn` en el ecosistema Solana. (¡[Incluyéndome](https://twitter.com/derlys_paola) y al equipo `Anchor`!):\n\n```terminal\nnpm i -g yarn\n```\n## Instalar librerías y paquetes de Linux\n\nPara comenzar esta fiesta de Solana, asegúrese de que su sistema Linux esté actualizado:\n\n```terminal\nsudo apt-get update && sudo apt-get upgrade\n```\nCada distribución de Linux es diferente. Y dependiendo del tipo de Linux que uses se están ejecutando, es posible que necesite instalar más o menos paquetes adicionales en tu sistema.\n\nLa instalación de los siguientes paquetes debería cubrir la mayoría de los casos para sistemas basados ​​en Ubuntu o Debian:\n\n```terminal\nsudo apt-get install -y pkg-config build-essential libudev-dev libssl-dev\n```\n> Nota: En el pasado usaba Edición Parrot OS Home (Debian y apt) como mi conductor diario, y estos paquetes también eran necesarios para comenzar en el desarrollo de Solana.\n\nLas personas a menudo se encuentran con varios errores al configurar la variedad de Solana. Herramientas de desarrollo en sistemas operativos basados ​​en Linux como Ubuntu o Parrot OS (que es lo que me gusta usar). Esto generalmente se debe a que falta en su sistema algunas dependencias diversas. Lo bueno es que si tienes algún problema al instalar o crear programas Solana, `Anchor` y/o `Solana`, su salida del terminal suele ser lo suficientemente descriptiva como para indicarle qué paquete/dependencia te falta. ¡Hermoso!\n\n## Instalar Rust y Cargo\n\n```terminal\ncurl --proto \'=https\' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n```\n\nA medida que avanza a través de este asistente de instalación de `Rust`, se le dará algunas opciones al instalar. Cuando se le solicite, recomiendo seleccionar la opción de construcción `nocturna`(nightly). Esto parece funcionar mejor con el conjunto de herramientas Solana CLI.\n\n> Nota: Este comando de instalación de `Rustup` proviene directamente del sitio web [Rustup.rs](https://rustup.rs/).\n\n## Instale la CLI de Solana\n\n```terminal\nsh -c "$(curl -sSfL https://release.solana.com/stable/install)"\n```\n> Nota: Este comando de instalación para el conjunto de herramientas Solana CLI proviene directamente de los documentos oficiales de Solana.\n\n## Instalar Anchor Lang para Solana\n\nAnchor es el framework más popular para crear programas Solana. Es un proyecto de código abierto que puede ayudar a simplificar tus programas, además de hacerlos más seguros.\n\n> Nota: El equipo de Anchor recomienda [instalar Anchor](https://www.anchor-lang.com/docs/installation) usando la herramienta Anchor Version Manager, AVM, ¡así que eso es lo que usaremos aquí! Este proceso construirá AVM desde el código fuente y puede llevar un poco de tiempo, dependiendo del hardware de tu ordenador.\n\nUna vez que haya instalado Cargo, puede instalar AVM con el siguiente comando:\n\n```terminal\ncargo install --git https://github.com/coral-xyz/anchor avm --locked --force\n```\nA continuación, podemos usar `AVM` para instalar `Anchor CLI` (esto puede tardar un poco), ya que `Cargo` compilará la CLI durante la instalación):\n\n```terminal\navm install latest\n```\nFinalmente, indique que configure la última versión de `Anchor` como predeterminada de su sistema y verifique tu versión:\n\n```terminal\navm use latest && anchor --version\n```\n## Crea una billetera Solana local\n\nUna de las últimas cosas que necesitará desarrollar (más específicamente implementar) Los programas Solana son una billetera. No profundizaré en los detalles del uso de la Solana CLI aquí, sino más bien una comprensión superficial de los comandos para empezar a desarrollar.\n\n\n## TLDR;\n\nLas billeteras del sistema de archivos guardarán la clave privada de su billetera en un archivo local en su computadora\ndebe seleccionar la red Solana correcta que desea mediante la CLI necesitarás enviar el token SOL a tu billetera\n\n\n## Crear una billetera Solana\n\nCree una nueva billetera del sistema de archivos llamada "demo-wallet":\n\n```terminal\nsolana-keygen new --outfile ~/.config/solana/demo-wallet.json\n```\n## Seleccione la red Solana\n\nSeleccione Solana "testnet" red y configure su nueva billetera del sistema de archivos como la predeterminada:\n\n```terminal\nsolana config set --url testnet --keypair ~/.config/solana/demo-wallet.json\n```\n## Verifique sus ajustes de configuración\n\nLea la configuración de su CLI de Solana para verificar que su billetera esté correctamente configurado y estás en la red correcta:\n\n```terminal\nsolana config get\n```\n\nEl resultado debería ser algo parecido a esto:\n\n```terminal\nConfig File: /Users/derlys/.config/solana/cli/config.yml\nRPC URL: https://api.devnet.solana.com\nWebSocket URL: wss://api.devnet.solana.com/ (computed)\nKeypair Path: /Users/derlys/.config/solana/id.json\nCommitment: confirmed\n```\n> Yo utilice la red `devnet` que es donde puedes hacer pruebas y solicitar `airDrop`(sol para para probar tus DApps). En la `testdev` también puedes solicitarlos sin embargo se usa mas que todo para comprobar que tus transacciones esten llegando correctamente.\n\n## Financia tu billetera con un AirDrop\n\nObtenga un token SOL gratuito lanzado desde el AirDrop (también conocido como depositado) en su nueva billetera:\n\n```terminal\nsolana airdrop 1 \n```\n\n> si ejecutas el comando sin especificar la direccion( publickey) te carga los soles en la billetera (wallet) que tengas configurada por defecto.\n\n\nPara comprobar el saldo de la billetera de su sistema de archivos:\n\n```terminal\nsolana balance \n```\n## ¿Qué sigue?\n\nAhora que tiene todas las herramientas de desarrollo de Solana necesarias instaladas en su entorno local, ¡está listo para comenzar a crear sus primeros programas Solana!\n\n[Introducción a Solana CLI](https://dev.to/derlys/introduccion-a-la-cli-de-solana-5e1m): obtenga más información sobre comandos importantes y cómo navegar por la CLI de Solana.\n\nImplemente un programa Solana (próximamente): cree, edite, implemente y vuelva a implementar su primer programa Solana para blockchain.\n\nA excepción de algunos links y párrafos, este tutorial fue creado en el idioma inglés por [Nick Frostbutter](https://twitter.com/nickfrosty). Muchas gracias por producir este tipo de contenido.\n\nEspero esta traducción le sea de ayuda a la comunidad Hispanohablante que usa [Solana](https://solana.com/) que está creciendo enormemente.\n\nHaz parte de la comunidad [SOLANA LATAM](https://discord.gg/sPVaqarbxY).\n\n', + }, + { + title: 'Introducción a la CLI de Solana', + createdAt: '2023-12-13T16:45:24.762Z', + id: 'introduccion-a-la-cli-de-solana-5e1m', + content: + '---\nseries: "Solana"\n---\nComo parte de su viaje de desarrollo de Solana, deberá familiarizarse con la CLI de Solana.\n\nEs muy poderoso y muy importante comprender algunos comandos para realizar algunas tareas específicas:\n\n1️⃣ Crear billeteras\n2️⃣ Actualizar la configuración de su red Solana\n3️⃣ SOL gratuito desde el AirDrop (también conocido como fondos en su cuenta)\n4️⃣ Ejecutar un validador de prueba\n5️⃣ Implementar programas Solana\n\n> PD: También hay un [video de YouTube](https://www.youtube.com/watch?v=pNzT3hgFbpg) para este tutorial de Solana.\n\n## Aprenda a utilizar la CLI de Solana\n\n> Esta guía asume que ya tiene instalada la CLI de Solana. Si no es así, [consulte esta guía sobre cómo instalar Solana CLI en Linux](https://solanacookbook.com/es/getting-started/installation.html#instalacion-de-cli).\n\n## Crea una billetera Solana para el desarrollo\n\nPara implementar programas Solana en la cadena de bloques (ya sea un validador local o un RPC remoto), necesitará crear una billetera Solana.\n\nPara simplificar, generaremos una billetera con sistema de archivos que almacenará nuestra clave privada (privateKey) en un archivo en su computadora. De esta manera, podemos decirle fácilmente a Solana CLI y/o Anchor CLI que usen esta billetera para implementar nuestros programas Solana.\n\nLa billetera del sistema de archivos predeterminada generalmente se encuentra en `~/.config/solana/id.json`. \n\nCuando crea nuevas wallets de sistema de archivos, puede especificar cualquier ubicación de archivo específica con el indicador `--outfile /path/to/file `.\n\nPara generar una nueva wallet (billetera) Solana utiliza este comando:\n\n```terminal\nsolana-keygen new --outfile ~/.config/solana/solfate-dev.json\n```\n\nAl generar cada wallet (billetera), también puedes establecer una frase de contraseña (como un archivo de claves SSH).\n\n> ¡RECOMIENDO ENCARECIDAMENTE establecer una frase de contraseña para la billetera, especialmente para cualquier billetera que pueda usar en producción en algún momento!\n\n\n>> Para efectos de este tutorial he decidido no usar esta frase de contraseña.\n\nUna vez creada su billetera, obtendrá una lectura de su ` pubkey` (también conocida como dirección de su billetera) y su frase inicial. No olvides escribir tu frase inicial en un lugar seguro si realmente vas a conservar esta dirección de billetera.\n\n## Lea la configuración de Solana\n\nPara lograr cualquier cosa en la cadena de bloques de Solana, incluso con un validador de prueba local, deberá asegurarse de que su CLI de Solana esté configurada para conectarse a la red Solana RPC correcta y con la billetera correcta.\n\nPara ver la configuración actual de Solana CLI, ejecute este comando:\n\n```terminal\nsolana config get\n```\n\nDebería obtener una lectura como esta:\n\n`Config File: /home/nick/.config/solana/cli/config.yml\nRPC URL: https://api.testnet.solana.com\nWebSocket URL: wss://api.testnet.solana.com/ (computed)\nKeypair Path: /home/nick/.config/solana/id.json\nCommitment: confirmed`\n\nLas configuraciones son MUY importantes son la `URL RPC` y el archivo `Keypair Path`.\n\nRPC URL: le indica a la CLI a qué [clúster](https://solanacookbook.com/es/core-concepts/transactions.html#hechos) de red Solana desea conectarse. Generalmente, para el desarrollo local, debe configurar su propio validador de pruebas local (también conocido como localnet). Solo los RPC de la “red principal” utilizarán realmente tokens SOL reales y, por lo tanto, dinero real.\n\nKeypair Path: la clave privada de la billetera (como la que creamos anteriormente) para usar para implementar programas e interactuar con el RPC.\n\n## Actualice su configuración de Solana\n\nCuando desee cambiar la configuración de su red Solana o cambiar el archivo de clave de billetera predeterminado, deberá actualizar su configuración con la CLI de Solana.\n\nAl configurar su URL RPC (también conocido como cambiar su red Solana), puede usar el nombre corto de la red (como “mainnet”, “testnet”, etc.) o la URL completa para un nodo RPC activo:\n\n```terminal\nsolana config set --url testnet\n```\n\nPara cambiar el archivo de la clave de billetera que utiliza la CLI:\n\n```terminal\nsolana config set --keypair /path/to/file\n```\n\n## Consulta el saldo de tu billetera\n\nNecesitará SOL para interactuar con la cadena de bloques, incluso durante el desarrollo. Siempre puede consultar fácilmente el saldo de su billetera (o la de cualquier persona) utilizando la CLI de Solana.\n\nPara verificar el saldo de la dirección de su billetera configurada por CLI (también conocida como la que ha configurado con el archivo de claves de su sistema de archivos):\n\n```terminal\nsolana balance\n```\n\nPara consultar el saldo de cualquier otra billetera:\n\n```\nsolana balance WALLET_ADDRESS_HERE\n```\n\n> El comando `solana balance `solo verificará el saldo de la billetera determinada en la red Solana actualmente seleccionada.\n\n## Financia tu billetera a través de AirDrop\n\nCon su nueva configuración de billetera y seleccionada en la red RPC correcta, deberá depositar fondos en su billetera con SOL.\n\nEste SOL se utilizará para implementar programas en la cadena de bloques, así como para pagar el alquiler y las transacciones mientras desarrolla programas.\n\nPeriódicamente, a medida que implemente o interactúe con los programas de Solana, deberá financiar su billetera con SOL (el token nativo de Solana).\n\nPuede depositar fondos en su cuenta utilizando dos métodos:\n\n1. AirDrop a través de Solana CLI\n\nPara solicitar un AirDrop gratuito a su billetera seleccionada actualmente:\n\n```terminal\nsolana airdrop 1\n```\n\n> El comando `solana airdrop` de solana tiene un límite en la cantidad de SOL que se puede lanzar. Cualquier solicitud que supere este límite hará que la transacción falle. Al momento de escribir esto, el límite es 5.\n\nTal como habrás adivinado, el AirDrop se producirá en la red que estás seleccionado en la configuración de Solana. Y no, el lanzamiento aéreo no funciona en la red principal. No seas tonto.\n\n2. AirDrop a través de Solfate faucet\n\nOtra manera fácil de obtener su SOL devnet y/o testnet gratuito en su billetera es usar un grifo público. Aquí en Solfate operamos un grifo público [Solana faucet](https://faucet.solana.com/).\n\nTodo lo que necesita hacer es ingresar la dirección de su billetera y hacer clic en el botón de la red Solana que desee: devnet o testnet.\n\n## Ejecute el validador de pruebas de Solana\n\nComo mencioné anteriormente, cuando desarrolle sus programas Solana localmente, lo más probable es que desee ejecutar una versión de host local de la cadena de bloques Solana llamada “validador de prueba”(test validator). Tal como puede pensar, esto le permitirá tener una versión completa de la cadena de bloques Solana directamente en su computadora local.\n\nEjecutar y desarrollar usando el validador de pruebas es excelente (y recomendado) por varias razones:\n\n- Transacciones aún más rápidas (¡tú eres el único que las realiza!)\n- Menor riesgo de transacciones rechazadas\n- sin limitación desde puntos finales RPC públicos\n- fácil acceso a los registros del programa Solana (a través de la macro "msg" en Rust)\n\nPara ejecutar el validador de pruebas de Solana, abra una nueva ventana de terminal y ejecute el siguiente comando:\n\n```terminal\nsolana-test-validator\n```\n\nEsta red localhost, también conocida como “localnet”, que se ejecuta en su terminal, enviará todos los mensajes que su programa Solana envíe a la cadena de bloques. Lo cual es una excelente manera de ayudar a depurar sus programas.\n\nA excepción de algunos links actualizados y párrafos, este tutorial fue escrito en el idioma inglés por [Nick Frostbutter](https://twitter.com/nickfrosty). Muchas gracias por crear este tipo de contenido.\n\nEspero esta traducción le sea de ayuda a la comunidad Hispanohablante que usa [Solana](https://solana.com/) que está creciendo enormemente.\n\nHaz parte de la comunidad [SOLANA LATAM](https://discord.gg/sPVaqarbxY).\n\n[HispanaSol](https://t.me/+Axat5MuV6ow5NWY0)\n\n', + }, + { + title: 'Tutorial 2: Creando una aplicación Angular V17 con Tailwind', + createdAt: '2023-12-03T15:26:55.869Z', + id: 'creando-una-aplicacion-angular-v17-con-tailwind-21c2', + content: + '--- : Tutorial 2: Creando una aplicación Angular V17 con Tailwind\npublished: true\ndescription: \nseries: Caja de Herramientas del Desarrollador\ncover_image: "https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7tnqjc63exhfxfnfxi1q.png"\n# Use a ratio of 100:42 for best results.\n# createdAt: 2023-11-29 19:23 +0000\n---\n\nEn este tutorial, aprenderás a usar Tailwind para dar estilo a aplicaciones Angular CLI.\n\nEl objetivo es construir un diseño de aplicación con un encabezado y pie de página con sus respectivas rutas.\n\n## Requisitos\n\nAsegúrate de tener las siguientes herramientas instaladas:\n\n- Node JS y NPM, visite [su página](https://nodejs.org/en/) para ver las instrucciones.\n - Ejecute node -v para verificar que tiene la versión 20 o superior.\n - Ejecute `npm -v` para comprobar que tiene la versión 10 o superior.\n- Angular CLI (npm install -g @angular/cli)\n - Ejecute `ng version` para revisar que tiene la versión 17.\n\nSi prefiere usar `yarn`, [primero configure el administrador de paquetes predeterminado de Angular CLI](https://dev.to/ruslangonzalez/configurar-yarn-en-tus-proyectos-de-angular-video-goj). Esto asegura que la aplicación generada tenga un archivo `yarn.lock` en lugar de un `paquete-lock.json`.\n\n## 1. Crea una nueva aplicación\n\nAbra una terminal y ejecute el siguiente comando:\n\n```\nng new angular17\n```\nEl comando `ng new` genera una aplicación Angular básica en una carpeta llamada `angular17` e instala las dependencias.\n\nLa ejecución de este comando te da un recorrido por varias preguntas que configuran tu app con los estilos que quieras.\n\n![Styles](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i2n97mne065c4guwvnck.png)\n\nAdemás, una de las nuevas actualizaciones de Angular V17 es que nos permite desde el comienzo crear nuestro `server side rendering` algo increíblemente útil.\n\n![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nbwrtm1ki1mp51se8z1c.png)\n\nAl final de la configuración, la CLI de Angular también inicializa un repositorio git y hace un commit inicial.\n\n## 2. Abrir la aplicación en modo de desarrollo\n\nDespués que la instalación haya finalizado, ejecuta el siguiente comando e ingresa a la carpeta de tu proyecto.\n\n```\ncd angular17\n```\n\nEn la carpeta del proyecto tú puedes iniciar el servidor de desarrollo usando el comando `ng serve`.\n\n> ** El servidor de desarrollo de Angular utiliza el `localhost:4200`, abre tu navegador en [localhost:4200](ocalhost:4200)**\n\nHaz clic en el enlace anterior y comprueba que funciona. ¡Ahora si la aplicación está lista para utilizar algunos estilos 🤗!\n\n## 3. Instala Tailwind\n\nEjecuta los siguientes dos comandos en la carpeta de tu proyecto para instalar Tailwind.\n\n```\nyarn add -D tailwindcss postcss autoprefixer\nyarn add tailwindcss init\n```\nDespués que finalice el proceso, abre el archivo `tailwind.config.js` y agrega lo siguiente:\n\n```javascript\n/** @type {import(\'tailwindcss\').Config} */\nmodule.exports = {\n content: [\n "./src/**/*.{html,ts}",\n ],\n theme: {\n extend: {},\n },\n plugins: [],\n}\n```\nAbre el archivo `styles.css` y agrega las siguientes directivas:\n\n```css\n@tailwind base;\n@tailwind components;\n@tailwind utilities;\n```\n> Si quieres comprobar que Tailwind se instalo haz un cambio pequeño en tu `app.component.html`, prueba agregando esto:\n\n```html\n

\n Hello world!\n

\n```\n\n>> MD Tip 💡\n> Recuerda que no debes eliminar la etiqueta ``.\n\n>>MDato 🗃️\n> Angular ahora no tiene modulos y en los siguientes pasos del tutorial te daras cuenta por que\n\n## 4. Configura el layout de la aplicación\n\nEn este paso generaremos 3 componentes `layout`, `header` y `footer` dentro de una carpeta llamada `ui`.\n\n>💡 Es una buena idea mantener la UI (Interfaz de ususario) separada del resto de la aplicacion. Esta `Separacion de tareas` tambien te permite reutilizar facilmente la UI en otros proyectos.\n\nEjecuta el comando: \n\n```\nng generate component ui/layout\n```\n\nEsto te generará una carpeta que se llama `ui` y dentro de esta un componente llamado `layout`.\n\nA partir de aquí crearemos el componente `header` y ` footer` dentro de esta carpeta, ejecutando estos 2 comandos:\n\n```\nng generate component ui/header\nng generate component ui/footer\n\n```\n\n> MDato\n> 💡 El comando `ng generate` acepta abreviaturas: usa `ng g c` Para generar un componente, `ng g s` para generar un servicio, etc.\n\n## 4.1 Implementa el LayoutComponent\n\nAbre `src/app/ui/layout/layout.component.html` y remplaza su contenido por lo siguiente:\n\n```html\n
\n \n
\n
\n \n
\n
\n \n
\n```\n> Vas a notar que las etiquetas de `header` ` footer` y `router-outlet` se colocan rojas, eso es porque debes importarlas en el respectivo componentes donde las uses\n\nAbre `src/app/ui/layout/layout.component.ts` y agrega esto en los imports:\n\n```typescript\nimport { Component } from \'@angular/core\';\nimport {HeaderComponent} from \'../header/header.component\'\nimport {FooterComponent} from \'../footer/footer.component\'\nimport {RouterOutlet} from \'@angular/router\'\n\n@Component({\n selector: \'app-layout\',\n standalone: true,\n imports: [HeaderComponent,FooterComponent, RouterOutlet],\n templateUrl: \'./layout.component.html\',\n styleUrl: \'./layout.component.scss\'\n})\nexport class LayoutComponent {\n\n}\n```\n\n## 4.2 Usa el LayoutComponent\n\nAbra el archivo `src/app/app-routes.ts` y agrega el siguiente código que es una lista de objetos que irán dentro del array de `routes`.\n\n```typescript\n{\n path: \'\',\n component: LayoutComponent,\n children: [\n // Here we will add our application pages\n ],\n },\n```\n\nPara que puedas usar el LayoutComponent debes importarlo en este mismo archivo en la parte superior.\n\n```typescript\nimport {LayoutComponent} from \'./ui/layout/layout.component\'\n```\nAbre el archivo `app.component.html` y deja solo la etiqueta `router-outlet`.\n\nGuarda y deberías ver en tu navegador el `HeaderComponent`\ny `FooterComponent` renderizados.\n\n## 4.3 Implementa el Header\n\nAbre el archivo `header.component.html` y pega este código\n\n```html\n
\n
\n
LOGO
\n
\n \n Home\n Blog\n Contact\n
\n
\n
\n\n```\n\nImporta `RoterLink` y `RoterLinkActive` en el archivo `header.component.ts`.\n\n```\n imports: [RouterLink, RouterLinkActive],\n```\n\n\n## 4.4 Implementa el Footer\n\nAbre el archivo `footer.component.html` y pega este código\n\n```html\n
\n COPYRIGHT © 2069\n
\n```\n\n## 5. Agrega páginas a tu aplicación\n\nCon el layout en su lugar es momento de agregar páginas a nuestra app.\n\nEjecuta el siguiente comando:\n\n```\nng g c pages/home\n```\n\nAbre el siguiente archivo en la ruta `src/app/pages/home/home.component.html` y remplaza el contenido por esto:\n\n```html\n
\n
\n

This is my home

\n

Anim aute id magna aliqua ad ad non deserunt sunt. Qui irure qui lorem cupidatat commodo. Elit sunt amet fugiat veniam occaecat fugiat aliqua.

\n
\n
\n\n```\n\n> Recuerdas que habiamos configurado nuestro layout en el archivo `app-routes.ts` \n\nAgrega tu primera ruta`Home` que es hija del layout el cual es compartido en cualquiera de las rutas, copia y pega lo siguiente el archivo `app-routes.ts` dentro del array`children:`\n\n```typescript\n{ path: \'home\', component: HomeComponent },\n```\n\nY ahora, si das clic en la ruta `Home` en tu navegador te mostrará el `Homecomponent` que acabaste de diseñar en el punto anterior.\n\n> MDato 🗃️\n> Puedes investigar mas acerca de rutas hijas o Nesting routes [aqui](https://angular.dev/guide/routing/common-router-tasks#nesting-routes)\n\n## 5.1 Crea la página blog\n\nEjecuta el comando:\n\n```\nng g c pages/blog\n```\nAbre el archivo `blog.component.html` y copia esto:\n\n```html\n
\n
\n
\n
\n \n
\n
\n

“Lorem ipsum dolor sit amet consectetur adipisicing elit. Nemo expedita voluptas culpa sapiente alias molestiae. Numquam corrupti in laborum sed rerum et corporis.”

\n
\n
\n \n
\n
Judith Black
\n \n
CEO of Workcation
\n
\n
\n
\n
\n
\n```\n\nAbre nuevamente el archivo de tus rutas`app-routes.ts` y agrega la nueva ruta de `blog`\n\n```typescript\nchildren: [\n { path: \'home\', component: HomeComponent },\n { path: \'blog\', component: BlogComponent },\n ],\n```\n\n> 💡 Recuerda que cada ruta que agregues la debes importar en la parte superior de este mismo archivo.\n\n## 5.2 Crea la página contact\n\nEjecuta el comando:\n\n```\nng g c pages/contact\n```\nAbre el archivo `contact.component.html` y copia esto:\n\n```html\n
\n
\n
\n \n
\n \n
\n
\n \n
\n \n
\n
\n
\n
\n \n
\n
\n```\n\nAbre nuevamente el archivo de tus rutas `app.routes.ts` y agrega la nueva ruta de `contact`\n\n```typescript\nchildren: [\n { path: \'home\', component: HomeComponent },\n { path: \'blog\', component: BlogComponent },\n { path: \'contact\', component: ContactComponent },\n ],\n```\n\nPara que nuestro formulario reactivo funcione debemos hacer algunos cambios en el archivo `contact.component.ts` \n\nCopia y pega lo siguiente:\n\n```typescript\n\nimport { Component } from \'@angular/core\';\nimport {FormControl, FormGroup, ReactiveFormsModule} from \'@angular/forms\'\n\n@Component({\n selector: \'app-contact\',\n standalone: true,\n imports: [\n ReactiveFormsModule\n ],\n templateUrl: \'./contact.component.html\',\n styleUrl: \'./contact.component.scss\'\n})\nexport class ContactComponent {\n\n form = new FormGroup({\n\n email: new FormControl(\'\'),\n password: new FormControl(\'\'),\n });\n public submit() {\n\n console.log(this.form.value);\n }\n}\n```\n\n\n## 6. Redirigir la ruta raíz\n\nAbre el archivo `app.routes.ts` y agrega el siguiente objeto en el array de `Routes`\n\n```typescript\n{\n path: \'\',\n // If this path is the \'full\' match...\n pathMatch: \'full\',\n // ...redirect to this route.\n redirectTo:\'home\',\n },\n```\n\n## Que hacer a partir de aquí?\n\nComo se explica en la introducción, este es un punto de partida y debe ser sencillo mejorar esta app como te parezca\n\nTailwind es un framework de CSS poderoso y con muchas alternativas para colocar estilos a una app de forma rápida, después que aprendas a manejar su sintaxis podrás usarla a tu favor.\n\nTe dejo por [aquí]( https://tailwindui.com/) su página oficial para que explores un poco más.\n\n## Conclusión\n\nEn este tutorial has aprendido a crear una aplicación básica y utilizar tailwind para crear un diseño con encabezado(header) y pie de página(footer) la aplicación tiene varias páginas, así que esta es una oportunidad para que apliques carga perezosa(Lazy loading).\n\nPuedes guiarte por la nueva documentación de Angular V17 en la sección [Guías detalladas(In depth Guides)](https://angular.dev/guide/ngmodules/lazy-loading#verify-lazy-loading)\n\nSi tienes alguna pregunta no dudes en dejar un comentario en DEV o enviarme un mensaje al [X](https://twitter.com/derlys_paola)\n\nMuchas gracias a [Beeman](https://twitter.com/beeman_nl) por revisar este post.\n\nNos vemos en otro post ✋🏽\n\n\n\n\n\n\n\n\n', + }, + { + title: 'Tutorial 1: Formulario reactivo con Angular V17', + createdAt: '2023-11-29T17:50:24.282Z', + id: 'tutorial-1-formulario-reactivo-con-angular-v17-2889', + content: + '--- : Tutorial 1: Formulario reactivo con Angular V17\npublished: true\ndescription: Explora en cada artículo herramientas específicas para tareas particulares, desde desarrollo front-end, backend, frameworks y más. Brindándote las claves para que sigas avanzando en tu aprendizaje.\nseries: Caja de Herramientas del Desarrollador\ntags: angularv17, formulariosReactivos, beginner, español\ncover_image: "https://dev-to-uploads.s3.amazonaws.com/uploads/articles/50j277x778t5gjd6pjcc.png"\n# Use a ratio of 100:42 for best results.\n# createdAt: 2023-11-23 13:09 +0000\n---\n\n\n“¡Bienvenidos a nuestra ‘Caja de Herramientas del Desarrollador’! Esta serie de artículos es una exploración en el mundo del desarrollo de software, donde cada artículo es una herramienta de conocimiento que está diseñada para elevar tus habilidades de desarrollo al siguiente nivel.”\n\n## Requisitos\n\nPara este tutorial asegúrate de tener lo siguiente:\n\n- Una cuenta en la plataforma de [StackBlitz](https://stackblitz.com/), la puedes obtener de forma sencilla si tienes una cuenta en [GitHub](https://github.com/).\n\n\n> Si quieres que agreguemos a la caja de herramientas como crear una cuenta en GitHub, solo escribeme.😉\n\n### Paso # 1\n\n- Crea un proyecto en StackBlitz con Angular, al hacerlo se verá así:\n\n![Poyecto stackblitz](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e80xfgfw42htud6eglgz.png)\n\nEn el panel del lado izquierdo tendrás varios archivos que son básicamente los que el proyecto te da por defecto y que causan la renderización de lo que parece al lado derecho.\n\n ![Archivos generados](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/viyijfc2j671p1sui2ls.png)\n\nPara que todo esto funcione, StackBlitz también tiene unas dependencias instaladas y son estas:\n\n![Dependencies](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6189ajzaw0gdzh033v5l.png)\n\n> Normalmente cuando creas un proyecto con Angular desde cero y no en un editor online estas dependencias ya viene en el paquete de Angular que se llama [Angular CLI](https://angular.dev/tools/cli)\n\n### Paso # 2\n\nAbre el archivo `main.ts` y exploremos lo que contiene, sigue los colores de las áreas demarcadas en la imagen:\n\n![main](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5vr1aezupandqnhnxk10.png)\n\n- En el área naranja tenemos las dependencias que necesitamos para que esto funcione. 🤗\n\n- En el área roja tenemos un decorador `@Component` con su respectivo témplate que es en donde haremos unos cambios en el siguiente paso.\n\n> Si quieres saber mas sobre el decorador `@Component` y la anatomia de un componente te dejo este [enlace](https://angular.dev/guide/components) y me retiro lentamente 🤭 🤭 🤭\n\n- Por último, en el área azul tenemos una `clase` que lo que hace es que da la lógica a nuestro código y nos deja hacer cosas como la interpolación que está en la línea 9\n\n### Paso # 3\n\n- Quédate en este archivo `main.ts` y comienza hacer los cambios en el template, es decir, de línea 9 a la 12.\n\n- Borra la línea 10, 11, y 12 de esa manera desaparecerá el link y solo te quedará la etiqueta `h1` con el título.\n\n- Copia y pega el siguiente código dentro del template:\n\n```html\n
\n
\n \n \n \n \n \n
\n
\n```\n- Agrega una línea para importar el módulo que te permite usar todos los superpoderes de `Formularios reactivos`.\n\nDe esa manera te podrás importar módulos que utilizaremos en el siguiente paso.\n\n\n![Imports](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3xz6rrs1bjt6tv1lsf5v.png)\n\n\n> Cada vez que necesites usar una herramienta de Angular que es parte de su Core debes importarlo en el archivo de tu componente. \n\n\n### Paso # 4\n\n- En la parte superior de tu código donde importaste `ReactiveForms` agrega `FormControl` de esa manera lo importaras.\n\n- Crea una nueva instancia en tu clase `App`.\n\n```TypeScript\nexport class App {\n name = new FormControl(\'\');\n}\n```\nAhora puedes asociarlo con tú template, ¡Hazlo en el siguiente paso!\n\n### Paso # 5\n\nLas etiquetas de label e input necesitan ciertos atributos para usar el `Formcontrol`.\n\n- Copia y pega el siguiente código:\n\n```HTML\n

Mi formulario reactivo con Angular!

\n
\n
\n \n \n
{{name.value | json}}
\n\n \n \n
\n \n
\n
\n```\n\n> La etiqueta `pre` nos permite visualizar que los valores ingresados en el input estan siendo registrados.\n\n### Paso # 6 \n\nAhora debemos asegurarnos que los valores que colocamos en los inputs se guarden en memoria.\n\n- Mediante el `button` guardaremos la información del formulario y lo hacemos así:\n\n - Convierte tu formulario en un grupo con la propiedad `formGroup`\n\n\n- Copia y pega este código en la `clase`:\n\n```TypeScript\nexport class App {\n form = new FormGroup({\n name: new FormControl(\'\'),\n email: new FormControl(\'\'),\n });\n```\n\nPara que estas propiedades funcionen debes hacer algunos cambios en tu `HTML` de esa manera lo enlazas.\n\n- Copia y pega este código en tú template:\n\n```HTML\n

Mi formulario reactivo con Angular!

\n
\n
\n \n \n
\n \n \n
\n \n
\n
\n```\n\n>> Como te puedes dar cuenta las etiquetas tienen muchos atributos que se usan para que tu logica funcione y de esa manera puedas o renderizar(mostrar) lo que quieres y que los metodos cumplan la funcion para lo que fueron creados. [¡Animate a conocer un poco mas de las etiuietas en HTML!](https://developer.mozilla.org/en-US/docs/Glossary/HTML5)\n\n### Paso # 7 \n\n- Ahora crea la lógica del botón mediante un método en la clase, copia y pega este código:\n\n```Typescript\n\nonSubmit() {\n console.warn(this.form.value);\n }\n```\n\n> El console nos permite ver un mensaje de advertencia que nos muestra los datos de los inputs ingresados por los usuarios.\n\n- Como te diste cuenta en tu código `HTML` anterior, la etiqueta `form` no solo tiene el atributo `[formGroup]="form"` también tiene la llamada a nuestro método `(ngSubmit)="onSubmit()`, sí justo el que acabaste de generar anteriormente.\n\nY con esto lo único que nos falta es hacer es ver nuestros datos renderizados. Quedaría algo así:\n\n![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k40pv5sjvgym24liprtz.png)\n\n💪🏽 Waoo se ve genial verdad, capturaste los datos.\n\nLo que dire para finalizar este tutorial es que aprendimos bastantes conceptos así no lo parezca y que te puedes estar haciendo preguntas como:\n\n1- Que tal si el usuario escribe algo diferente en el campo email.\n>> Como nos aseguramos que escriba lo que deberia ir en ese campo.\n\n2- Y si el usuario quiere volver a llenar el formulario y está lleno con los datos que escribió anteriormente.\n\nSí, estás totalmente en lo cierto, eso también lo podemos programar. Eso y muchas cosas más 🚀.\n\nQuédate pendiente de mis futuros artículos que hacen parte de esta serie 🗃️ > Caja de Herramientas del Desarrollador.\n\nLes dejo por aquí el [código en la plataforma de StackBlitz](https://stackblitz.com/edit/stackblitz-starters-s61kff?file=src%2Fmain.ts) y él [repositorio](https://github.com/Derlys/tutorial-1-reactive-form/tree/main) si quieren mirarlo 👀 para guiarse.\n\n\n\n\n\n \n\n', + }, + { + title: 'Usando Dev.to para escribir mis posts', + createdAt: '2023-11-23T13:31:34.611Z', + id: 'usando-devto-para-escribir-mis-post-55lp', + content: + '--- : Usando Dev.to para escribir mis posts\npublished: true\ndescription: Mi experiencia escribiendo posts en la plataforma de dev.to \nseries: "Formas y plataformas para escribir tu blog"\ncover_image: "https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qdak77i16j7zruogz9jx.png""', + }, + { + title: 'Agregando autenticación a tu app', + createdAt: '2020-10-24T17:31:37.538Z', + id: 'agregando-autenticacion-a-tu-app-5aka', + content: + '--- : "Agregando autenticación a tu app"\ndescription: "En este tutorial implementaremos la autenticación de nuestra app, con la posibilidad de\ningresar a ella con diferentes medios como: google,redes sociales etc.\npublished: true\nseries: "Agregando funcionalidad a tu app"\ncover_image: ""\ncanonical_', + }, + { + title: 'Aplicando lazy loading a tu app', + createdAt: '2020-08-04T17:51:58.102Z', + id: 'aplicando-lazy-loading-a-tu-app-j5c', + content: + '--- : "Aplicando lazy loading a tu app"\ndescription: "En primer lugar generamos los componentes y módulos que necesitamos para agregar páginas a nuestra app."\npublished: true\ncover_image: "https://dev-to-uploads.s3.amazonaws.com/uploads/articles/50j277x778t5gjd6pjcc.png"\ncanonical_', + }, + { + title: 'Tutorial: Aplicaciones de Angular CLI con bootstrap', + createdAt: '2020-07-28T01:52:20.049Z', + id: 'tutorial-aplicaciones-de-angular-cli-con-bootstrap-pfb', + content: + '--- : "Tutorial: Aplicaciones de Angular CLI con bootstrap"\ndescription: "En este tutorial, tu aprendes cómo usar estilos en Apps de Angular CLI."\npublished: true\ncover_image: ""\ncanonical_', + }, + { + title: 'Tutorial 4: Desplegar una app de Angular CLI a Firebase', + createdAt: '2020-07-17T15:30:55.088Z', + id: 'tutorial-4-desplegar-una-app-de-angular-cli-a-firebase-3aij', + content: + '--- : "Tutorial 4: Desplegar una app de Angular CLI a Firebase"\ndescription: "En este tutorial vamos a aprender cómo desplegar nuestra app a Firebase."\npublished: true\n', + }, + { + title: 'Tutorial 3: Configurar rutas en una app de Angular CLI', + createdAt: '2020-07-15T21:57:56.693Z', + id: 'tutorial-3-configurar-rutas-en-una-app-de-angular-cli-48pg', + content: + '--- : "Tutorial 3: Configurar rutas en una app de Angular CLI"\ndescription: "Crear y configurar rutas"\npublished: true\nseries: "Introducción a Kikstart UI"\ncover_image: "https://dev-to-uploads.s3.amazonaws.com/i/c60ri1xnyuhzrqt7wm2i.png"', + }, + { + title: 'Tutorial 2: Instalación de Kikstart UI', + createdAt: '2020-07-14T20:37:53.238Z', + id: 'tutorial-2-instalacion-de-kikstart-ui-539j', + content: + '--- : "Tutorial 2: Instalación de Kikstart UI"\ndescription: "En este tutorial aprenderemos que Kikstart UI contiene dependencias que podemos utilizar para construir nuestra app."\npublished: true\nseries: "Introducción a Kikstart UI"\ncover_image: "https://dev-to-uploads.s3.amazonaws.com/i/c60ri1xnyuhzrqt7wm2i.png"', + }, + { + title: 'Tutorial 1: Instalando Angular CLI', + createdAt: '2020-07-06T16:51:54.265Z', + id: 'tutorial-1-instalando-angular-cli-40ed', + content: + '--- : "Tutorial 1: Instalando Angular CLI"\ndescription: "Esta serie contiene 4 tutoriales en donde aprendemos los primeros pasos para crear una app en angular, utilizamos las herramientas de `Kikstart UI` para crear un layout, configuramos las rutas y finalmente desplegamos nuestra app."\npublished: true\nseries: "Introducción a Kikstart UI"\ncover_image: "https://dev-to-uploads.s3.amazonaws.com/i/c60ri1xnyuhzrqt7wm2i.png"', + }, +] diff --git a/libs/web/settings/feature/src/lib/settings-feature.tsx b/libs/web/settings/feature/src/lib/settings-feature.tsx index 90cab54..7e0013f 100644 --- a/libs/web/settings/feature/src/lib/settings-feature.tsx +++ b/libs/web/settings/feature/src/lib/settings-feature.tsx @@ -18,7 +18,7 @@ export default function SettingsFeature() { } return ( - + + - {item.content ?
{item.content}
: null} + {item.content ? {item.content} : null} {!userIsAuthor ? ( diff --git a/package.json b/package.json index 9c9b501..622f9af 100644 --- a/package.json +++ b/package.json @@ -90,6 +90,7 @@ "prisma-extension-pagination": "^0.6.0", "react": "18.2.0", "react-dom": "18.2.0", + "react-markdown": "^9.0.1", "react-router-dom": "6.21.1", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0ec0052..0bba3b9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -185,6 +185,9 @@ dependencies: react-dom: specifier: 18.2.0 version: 18.2.0(react@18.2.0) + react-markdown: + specifier: ^9.0.1 + version: 9.0.1(@types/react@18.2.47)(react@18.2.0) react-router-dom: specifier: 6.21.1 version: 6.21.1(react-dom@18.2.0)(react@18.2.0) @@ -6592,6 +6595,12 @@ packages: dependencies: '@types/node': 20.10.8 + /@types/debug@4.1.12: + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + dependencies: + '@types/ms': 0.7.34 + dev: false + /@types/eslint-scope@3.7.7: resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} dependencies: @@ -6606,13 +6615,18 @@ packages: '@types/json-schema': 7.0.15 dev: true + /@types/estree-jsx@1.0.3: + resolution: {integrity: sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==} + dependencies: + '@types/estree': 1.0.5 + dev: false + /@types/estree@0.0.39: resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} dev: true /@types/estree@1.0.5: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true /@types/express-serve-static-core@4.17.41: resolution: {integrity: sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==} @@ -6649,6 +6663,12 @@ packages: '@types/node': 20.10.8 dev: true + /@types/hast@3.0.3: + resolution: {integrity: sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==} + dependencies: + '@types/unist': 3.0.2 + dev: false + /@types/http-cache-semantics@4.0.4: resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} dev: true @@ -6725,6 +6745,12 @@ packages: resolution: {integrity: sha512-LblarKeI26YsMLxHDIQ0295wPSLjkl98eNwDcVhz3zbo1H+kfnkzR01H5Ai5LBzSeddX0ZJSpGwKEZihGb5diw==} dev: false + /@types/mdast@4.0.3: + resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} + dependencies: + '@types/unist': 3.0.2 + dev: false + /@types/mime@1.3.5: resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} @@ -6735,6 +6761,10 @@ packages: resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} dev: true + /@types/ms@0.7.34: + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + dev: false + /@types/node-fetch@2.6.9: resolution: {integrity: sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==} dependencies: @@ -6921,6 +6951,14 @@ packages: resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} dev: true + /@types/unist@2.0.10: + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + dev: false + + /@types/unist@3.0.2: + resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + dev: false + /@types/ws@7.4.7: resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} dependencies: @@ -7175,7 +7213,6 @@ packages: /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: true /@wallet-standard/app@1.0.1: resolution: {integrity: sha512-LnLYq2Vy2guTZ8GQKKSXQK3+FRGPil75XEdkZqE6fiLixJhZJoJa5hT7lXxwe0ykVTt9LEThdTbOpT7KadS26Q==} @@ -8096,6 +8133,10 @@ packages: resolution: {integrity: sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==} dev: false + /bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + dev: false + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -8488,6 +8529,10 @@ packages: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} dev: true + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + dev: false + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -8558,6 +8603,22 @@ packages: engines: {node: '>=10'} dev: true + /character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + dev: false + + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + dev: false + + /character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + dev: false + + /character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + dev: false + /chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true @@ -8772,6 +8833,10 @@ packages: dependencies: delayed-stream: 1.0.0 + /comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + dev: false + /command-exists@1.2.9: resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} dev: false @@ -9495,6 +9560,12 @@ packages: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} dev: true + /decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + dependencies: + character-entities: 2.0.2 + dev: false + /decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} @@ -9622,7 +9693,6 @@ packages: /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - dev: true /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} @@ -9667,6 +9737,12 @@ packages: - supports-color dev: true + /devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dependencies: + dequal: 2.0.3 + dev: false + /diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10338,6 +10414,10 @@ packages: engines: {node: '>=4.0'} dev: true + /estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + dev: false + /estree-walker@0.6.1: resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} dev: true @@ -10537,7 +10617,6 @@ packages: /extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: true /external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} @@ -11384,6 +11463,34 @@ packages: dependencies: function-bind: 1.1.2 + /hast-util-to-jsx-runtime@2.3.0: + resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} + dependencies: + '@types/estree': 1.0.5 + '@types/hast': 3.0.3 + '@types/unist': 3.0.2 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.0.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.4.1 + space-separated-tokens: 2.0.2 + style-to-object: 1.0.5 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + dependencies: + '@types/hast': 3.0.3 + dev: false + /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true @@ -11443,6 +11550,10 @@ packages: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true + /html-url-attributes@3.0.0: + resolution: {integrity: sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow==} + dev: false + /http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} dev: true @@ -11745,6 +11856,10 @@ packages: engines: {node: '>=10'} dev: true + /inline-style-parser@0.2.2: + resolution: {integrity: sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==} + dev: false + /inquirer@8.2.6: resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} engines: {node: '>=12.0.0'} @@ -11800,6 +11915,17 @@ packages: is-relative: 1.0.0 is-windows: 1.0.2 + /is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + dev: false + + /is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + dev: false + /is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} @@ -11877,6 +12003,10 @@ packages: has-tostringtag: 1.0.0 dev: true + /is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + dev: false + /is-directory@0.3.1: resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} engines: {node: '>=0.10.0'} @@ -11936,6 +12066,10 @@ packages: dependencies: is-extglob: 2.1.1 + /is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + dev: false + /is-installed-globally@0.4.0: resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} engines: {node: '>=10'} @@ -11997,6 +12131,11 @@ packages: engines: {node: '>=10'} dev: true + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + dev: false + /is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} @@ -13376,6 +13515,10 @@ packages: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} dev: false + /longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + dev: false + /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -13502,6 +13645,111 @@ packages: resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} engines: {node: '>=0.10.0'} + /mdast-util-from-markdown@2.0.0: + resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx-expression@2.0.0: + resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/hast': 3.0.3 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx-jsx@3.0.0: + resolution: {integrity: sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA==} + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/hast': 3.0.3 + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-remove-position: 5.0.0 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/hast': 3.0.3 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-phrasing@4.0.0: + resolution: {integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==} + dependencies: + '@types/mdast': 4.0.3 + unist-util-is: 6.0.0 + dev: false + + /mdast-util-to-hast@13.1.0: + resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} + dependencies: + '@types/hast': 3.0.3 + '@types/mdast': 4.0.3 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + dev: false + + /mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.0.0 + mdast-util-to-string: 4.0.0 + micromark-util-decode-string: 2.0.0 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + dev: false + + /mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + dependencies: + '@types/mdast': 4.0.3 + dev: false + /mdn-data@2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} dev: true @@ -13869,6 +14117,181 @@ packages: - utf-8-validate dev: false + /micromark-core-commonmark@2.0.0: + resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + dependencies: + micromark-util-character: 2.1.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + dependencies: + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.1.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + dev: false + + /micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + dev: false + + /micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + dependencies: + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + dependencies: + micromark-util-character: 2.1.0 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-subtokenize@2.0.0: + resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + dev: false + + /micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + dev: false + + /micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.4(supports-color@8.1.1) + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: false + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -14648,6 +15071,19 @@ packages: callsites: 3.1.0 dev: true + /parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + dependencies: + '@types/unist': 2.0.10 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + dev: false + /parse-filepath@1.0.2: resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} engines: {node: '>=0.8'} @@ -15854,6 +16290,10 @@ packages: object-assign: 4.1.1 react-is: 16.13.1 + /property-information@6.4.1: + resolution: {integrity: sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==} + dev: false + /proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -16012,6 +16452,28 @@ packages: /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + /react-markdown@9.0.1(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==} + peerDependencies: + '@types/react': '>=18' + react: '>=18' + dependencies: + '@types/hast': 3.0.3 + '@types/react': 18.2.47 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.3.0 + html-url-attributes: 3.0.0 + mdast-util-to-hast: 13.1.0 + react: 18.2.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + unified: 11.0.4 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: false + /react-native@0.72.7(@babel/core@7.23.7)(@babel/preset-env@7.23.5)(react@18.2.0): resolution: {integrity: sha512-dqVFojOO9rOvyFbbM3/v9/GJR355OSuBhEY4NQlMIRc2w0Xch5MT/2uPoq3+OvJ+5h7a8LFAco3fucSffG0FbA==} engines: {node: '>=16'} @@ -16332,6 +16794,27 @@ packages: transitivePeerDependencies: - encoding + /remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-from-markdown: 2.0.0 + micromark-util-types: 2.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-rehype@11.1.0: + resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} + dependencies: + '@types/hast': 3.0.3 + '@types/mdast': 4.0.3 + mdast-util-to-hast: 13.1.0 + unified: 11.0.4 + vfile: 6.0.1 + dev: false + /remedial@1.0.8: resolution: {integrity: sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg==} dev: true @@ -17033,6 +17516,10 @@ packages: deprecated: Please use @jridgewell/sourcemap-codec instead dev: true + /space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + dev: false + /spdy-transport@3.0.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} dependencies: @@ -17215,6 +17702,13 @@ packages: dependencies: safe-buffer: 5.2.1 + /stringify-entities@4.0.3: + resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + dev: false + /strip-ansi@5.2.0: resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} engines: {node: '>=6'} @@ -17302,6 +17796,12 @@ packages: webpack: 5.89.0(@swc/core@1.3.102) dev: true + /style-to-object@1.0.5: + resolution: {integrity: sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==} + dependencies: + inline-style-parser: 0.2.2 + dev: false + /stylehacks@5.1.1(postcss@8.4.33): resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} engines: {node: ^10 || ^12 || >=14.0} @@ -17648,6 +18148,10 @@ packages: punycode: 2.3.1 dev: true + /trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + dev: false + /trim-repeated@2.0.0: resolution: {integrity: sha512-QUHBFTJGdOwmp0tbOG505xAgOp/YliZP/6UgafFXYZ26WT1bvQmSMJUvkeVSASuJJHbqsFbynTvkd5W8RBTipg==} engines: {node: '>=12'} @@ -17655,6 +18159,10 @@ packages: escape-string-regexp: 5.0.0 dev: true + /trough@2.1.0: + resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} + dev: false + /ts-api-utils@1.0.3(typescript@5.3.3): resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} engines: {node: '>=16.13.0'} @@ -18029,6 +18537,18 @@ packages: resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} + /unified@11.0.4: + resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + dependencies: + '@types/unist': 3.0.2 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 6.0.1 + dev: false + /union@0.5.0: resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==} engines: {node: '>= 0.8.0'} @@ -18036,6 +18556,46 @@ packages: qs: 6.11.2 dev: true + /unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + dependencies: + '@types/unist': 3.0.2 + unist-util-visit: 5.0.0 + dev: false + + /unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + dev: false + + /unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: false + /universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -18269,6 +18829,21 @@ packages: extsprintf: 1.3.0 dev: true + /vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + dev: false + + /vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + dev: false + /vlq@1.0.1: resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} dev: false @@ -18784,3 +19359,7 @@ packages: /zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} dev: false + + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + dev: false