- 1. Preámbulo
- 2. Resumen del proyecto
- 3. Objetivos de aprendizaje
- 4. Consideraciones generales
- 5. Criterios de aceptación mínimos del proyecto
- 6. Hacker edition
- 7. Consideraciones técnicas
- 8. Pistas, tips y lecturas complementarias
- 9. Checklist
El algoritmo de Luhn, también llamado algoritmo de módulo 10, es un método de suma de verificación, se utiliza para validar números de identificación; tales como el IMEI de los celulares, tarjetas de crédito, etc.
Este algoritmo es simple. Obtenemos la reversa del número a verificar (que solamente contiene dígitos [0-9]); a todos los números que ocupan una posición par se les debe multiplicar por dos, si este número es mayor o igual a 10, debemos sumar los dígitos del resultado; el número a verificar será válido si la suma de sus dígitos finales es un múltiplo de 10.
En este proyecto tendrás que construir una aplicación web que le permita a un usuario validar el número de una tarjeta de crédito. Además, tendrás que implementar funcionalidad para ocultar todos los dígitos de una tarjeta menos los últimos cuatro.
La temática es libre. Tú debes pensar en qué situaciones de la vida real se necesitaría validar una tarjeta de crédito y pensar en cómo debe ser esa experiencia de uso (qué pantallas, explicaciones, mensajes, colores, ¿marca?) etc.
En este proyecto trabajaras de manera individual para aprender a construir una aplicación web (webapp) que interactuará con lx usuarix final a través del navegador, utilizando HTML, CSS y JavaScript como tecnologías.
- Uso de HTML semántico.
- Uso de selectores de CSS.
- Uso de selectores del DOM.
- Manejo de eventos del DOM.
- Manipulación dinámica del DOM. (appendChild |createElement | createTextNode| innerHTML | textContent | etc.)
- Manipulación de strings.
- Uso de condicionales (if-else | switch | operador ternario)
- Uso de bucles (for | for..in | for..of | while)
- Uso de funciones (parámetros | argumentos | valor de retorno)
- Declaración correcta de variables (const & let)
- Organizar y dividir el código en módulos (Modularización)
- Uso de identificadores descriptivos (Nomenclatura | Semántica)
- Uso de linter (ESLINT)
- Uso de comandos de git (add | commit | pull | status | push)
- Manejo de repositorios de GitHub (clone | fork | gh-pages)
- Diseñar la aplicación pensando y entendiendo al usuario.
- Crear prototipos para obtener feedback e iterar.
- Aplicar los principios de diseño visual (contraste, alineación, jerarquía)
- El equipo de coaches te dará un tiempo sugerido. Recuerda que cada una aprende a diferente ritmo.
- El proyecto será entregado subiendo tu código a GitHub (commit/push) y la interfaz será desplegada usando GitHub pages. Si no sabes lo que es GitHub, no te preocupes, lo aprenderás durante este proyecto.
Usa solo caracteres numéricos (dígitos) en la tarjeta a validar [0-9].
En el README.md
, cuéntanos cómo pensaste en los usuarios y cuál fue tu proceso
para definir el producto final a nivel de experiencia y de interfaz.
- Quiénes son los principales usuarios de producto.
- Cuáles son los objetivos de estos usuarios en relación con tu producto.
- Cómo crees que el producto que estás creando está resolviendo sus problemas.
La interfaz debe permitir al usuario:
- Insertar el número que queremos validar.
- Ver el resultado si es válido o no.
- Ocultar todos los dígitos de su número de tarjeta menos los últimos 4 caracteres.
- No debe poder ingresar un campo vacío.
Antes de iniciar a codear, debes entender el problema que quieres solucionar y cómo tu aplicación lo soluciona.
- Trabaja tu primer prototipo con papel y lápiz (blanco y negro).
- Luego valida esta solución con una compañera (pedir feedback).
- Toma lo aprendido al momento de validar tu primer prototipo y desarrolla un
nuevo prototipo usando alguna herramienta para diseño de prototipos
(Balsamiq, Figma,
Google Slides, etc.)
Estos puntos los presentarás en el
README.md
.
Debe contener lo siguiente:
- Un título con el nombre de tu proyecto.
- Un resumen de 1 o 2 líneas de qué se trata tu proyecto.
- La imagen final de tu proyecto.
- Investigación UX:
- Explicar quiénes son los usuarios y los objetivos en relación con el producto.
- Explicar cómo el producto soluciona los problemas/necesidades de dichos usuarios.
- Luego colocarás la foto de tu primer prototipo en papel.
- Agregar un resumen del feedback recibido indicando las mejoras a realizar.
- Imagen del prototipo final.
Deberás maquetar de forma exacta el prototipo final que hiciste en la herramienta de diseño de prototipos que escogiste utilizando HTML y CSS. En este momento elegirás los colores, tipo de fuente, etc a usar.
A continuación describimos los archivos que utilizarás:
En este archivo va el contenido que se mostrará al usuario (esqueleto HTML). Encontrarás 3 etiquetas iniciales, las cuales si deseas puedes borrar y empezar de cero:
<header>
: encabezado de tu proyecto.<main>
: contenido principal de tu proyecto.<footer>
: pie de página de tu proyecto.
Este archivo debe contener las reglas de estilo. Queremos que escribas tus propias reglas, por eso NO está permitido el uso de frameworks de CSS (Bootstrap, materialize, etc).
- La lógica del proyecto debe estar implementada completamente en JavaScript.
- En este proyecto NO está permitido usar librerías o frameworks, solo JavaScript puro también conocido como Vanilla JavaScript.
Vas a tener 2 archivos JavaScript separando responsabilidades, a continuación indicamos qué harás en cada archivo:
Acá escribirás las funciones necesarias para que el usuario pueda verificar la tarjeta de crédito y ocultar los dígitos de su número de tarjeta. Esta función debe ser pura e independiente del DOM.
Para esto debes implementar el objeto validator
, el cual ya se encuentra
exportado en el boilerplate. Este objeto (validator
) contiene
dos métodos (isValid
y maskify
):
-
validator.isValid(creditCardNumber)
:creditCardNumber
es unstring
con el número de tarjeta que se va a verificar. Esta función debe retornar unboolean
dependiendo si es válida de acuerdo al algoritmo de Luhn. -
validator.maskify(creditCardNumber)
:creditCardNumber
es unstring
con el número de tarjeta y esta función debe retornar unstring
donde todos menos los últimos cuatro caracteres sean reemplazados por un numeral (#
) o 🐱. Esta función deberá siempre mantener los últimos cuatro caracteres intactos, aún cuando elstring
sea de menor longitud.Ejemplo de uso
maskify('4556364607935616') === '############5616' maskify( '64607935616') === '#######5616' maskify( '1') === '1' maskify( '') === ''
Acá escribirás todo el código que tenga que ver con la interacción del DOM
(seleccionar, actualizar y manipular elementos del DOM y eventos).
Es decir, en este archivo deberás invocar las funciones isValid
y maskify
según sea necesario para actualizar el resultado en la pantalla (UI).
En este archivo tendrás que completar las pruebas unitarias de las funciones
validator.isValid(creditCardNumber)
y validator.maskify(creditCardNumber)
implementadas en validator.js
utilizando Jest.
Tus pruebas unitarias deben dar un 70% en coverage (cobertura),
statements (sentencias), functions (funciones) y lines (líneas); y un
mínimo del 50% de branches (ramas).
Las secciones llamadas Hacker Edition son opcionales. Si terminaste con todo lo anterior y te queda tiempo, intenta completarlas. Así podrás profundizar y/o ejercitar más sobre los objetivos de aprendizaje del proyecto.
En esta versión Hacker edition puedes además de validar si el número de la tarjeta es válida, mostrar la franquicia de la tarjeta (ej: Visa, MasterCard, etc) usando estas reglas de validación.
La lógica del proyecto debe estar implementada completamente en JavaScript. En este proyecto NO está permitido usar librerías o frameworks, solo JavaScript puro también conocido como Vanilla JavaScript.
Los tests unitarios deben cubrir un mínimo del 70% de statements, functions
y lines, y un mínimo del 50% de branches. El boilerplate ya contiene el
setup y configuración necesaria para ejecutar los tests (pruebas) así como code
coverage para ver el nivel de cobertura de los tests usando el comando npm test
.
El boilerplate incluye tests (pruebas) de ejemplo como punto de partida.
Para comenzar este proyecto tendrás que hacer un fork y clonar este repositorio que contiene el boilerplate.
El boilerplate contiene una estructura de archivos como punto de partida así como toda la configuración de dependencias y tests de ejemplo:
./
├── .babelrc
├── .editorconfig
├── .eslintrc
├── .gitignore
├── FAQ.md
├── README.md
├── package.json
├── src
│ ├── index.html
│ ├── index.js
│ ├── style.css
│ └── validator.js
└── test
├── .eslintrc
└── validator.spec.js
El boilerplate incluye tareas que ejecutan eslint y
htmlhint para verificar el HTML
y
JavaScript
con respecto a una guías de estilos. Ambas tareas se ejecutan
automáticamente antes de ejecutar las pruebas (tests) cuando usamos el comando
npm run test
. En el caso de JavaScript
estamos usando un archivo de
configuración de eslint
que se llama .eslintrc
que contiene un mínimo de
información sobre el parser que usar (qué version de JavaScript/ECMAScript), el
entorno (browser en este caso) y las reglas recomendadas ("eslint:recommended"
).
En cuanto a reglas/guías de estilo en sí,
usaremos las recomendaciones por defecto de tanto eslint
como htmlhint
.
- Antes que nada, asegúrate de tener un 📝 editor de texto en condiciones, algo como Atom o Code.
- Para ejecutar los comandos a continuación necesitarás una 🐚
UNIX Shell,
que es un programita que interpreta líneas de comando (command-line
interpreter) así como tener git
instalado. Si usas un sistema operativo "UNIX-like", como GNU/Linux o MacOS,
ya tienes una shell (terminal) instalada por defecto (y probablemente
git
también). Si usas Windows puedes usar la versión completa de Cmder que incluye Git bash y si tienes Windows 10 o superior puedes usar Windows Subsystem for Linux. - Deberas realizar un 🍴 fork de este repo.
- ⬇️ Clona tu fork a tu computadora (copia local).
- 📦 Instala las dependencias del proyecto con el comando
npm install
. Esto asume que has instalado previamente Node.js LTS v14.+ para windows ó Node.js LTS v14.+ para macOS(ambas instalciones incluyen npm). - Si todo ha ido bien, deberías poder ejecutar las 🚥
pruebas unitarias (unit tests) con el comando
npm test
. - Para ver la interfaz de tu programa en el navegador, usa el comando
npm start
para arrancar el servidor web y dirígete ahttp://localhost:5000
en tu navegador. - A codear se ha dicho! 🚀
A continuación un video de Michelle que te lleva a través del algoritmo de Luhn y un par de cosas más que debes saber para resolver este proyecto. ¡Escúchala con detenimiento y sigue sus consejos! :)
También una metodología para empezar a desarrollar tareas con JavaScript:
Terminal y shell de UNIX:
Control de versiones y trabajo colaborativo con Git y GitHub:
Diseño de experiencia de usuario (User Experience Design):
- Ideación
- Prototipado (sketching)
- Testeo e Iteración
Desarrollo Front-end:
- Valores
- Tipos
- Variables
- Control de flujo
- Tests unitarios
- Documentación de NPM
Organización del Trabajo:
- Metodologías Ágiles
- Scrum en menos de 2 minutos
- Scrum en Detalle. No esperamos que hagas todo eso desde este proyecto. Iremos profundizando poco a poco a lo largo del -bootcamp.
- Blog: cómo funciona el algoritmo de Luhn.
Esta sección está para ayudarte a llevar un control de lo que vas completando.
-
README.md
incluye info sobre proceso y decisiones de diseño. -
README.md
explica claramente quiénes son los usuarios y su relación con el producto. -
README.md
explica claramente cómo el producto soluciona los problemas/necesidades de los usuarios. -
README.md
(o otro archivo) contiene tu plan de acción - Objetivos que prioritizaste este proyecto. - Usa VanillaJS.
- No utiliza
this
. - Implementa
validator.isValid
. - Implementa
validator.maskify
. - Pasa linter con configuración provista.
- Pasa pruebas unitarias.
- Pruebas unitarias cubren 70% de statements, functions y lines, y un mínimo del 50% de branches.
- Interfaz permite escribir un número para ser validado.
- Interfaz muestra el resultado de la validación correctamente.
- Interfaz oculta todos los números escritos excepto los 4 últimos
- Implementa
validator.getIssuer
. - Interfaz muestra la franquicia de la tarjeta