├── .babelrc ├── .editorconfig ├── .eslintrc ├── .gitignore ├── FAQ.md ├── README.md ├── package.json ├── src ├── index.html ├── index.js ├── style.css └── validator.js ├── test ├── .eslintrc └── validator.spec.js └── thumb.png /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": ["@babel/plugin-transform-modules-commonjs"] 3 | } -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | charset = utf-8 7 | trim_trailing_whitespace = true 8 | insert_final_newline = true 9 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true 4 | }, 5 | "parserOptions": { 6 | "ecmaVersion": 2018, 7 | "sourceType": "module" 8 | }, 9 | "extends": "eslint:recommended", 10 | "rules": { 11 | "no-console": "warn" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | coverage/ 2 | node_modules/ 3 | .DS_Store 4 | *.log 5 | 6 | # Editor directories and files 7 | .idea 8 | .vscode 9 | *.suo 10 | *.ntvs* 11 | *.njsproj 12 | *.sln 13 | *.sw* 14 | -------------------------------------------------------------------------------- /FAQ.md: -------------------------------------------------------------------------------- 1 | # FAQ (preguntas frecuentes) 2 | 3 | - [Por qué usar html semántico](https://youtu.be/vRqQRrULSxI) 4 | - [Diferencia entre datos atómicos y estructurados](https://www.todojs.com/tipos-datos-javascript-es6/) 5 | - [Para qué sirve el ESLint](https://antoniomasia.com/que-es-eslint-y-por-que-deberias-usarlo/) 6 | - [Para qué sirven las pruebas unitarias](http://oscarmoreno.com/pruebas-unitarias/) 7 | - Tengo que testear toda mi función 8 | 9 | > En líneas generales, sí, esto es, sabiendo que queremos que tu función haga pocas 10 | cosas. Si tu función hace varias cosas al mismo tiempo el problema sería otro 11 | y primero tendrías que dividir esa funcionalidad en varias funciones y escribir 12 | un test para cada una. 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Tarjeta de crédito válida 2 | 3 | ## Índice 4 | 5 | * [1. Objetivos de aprendizaje generales](#1-objetivos-de-aprendizaje-generales) 6 | * [2. Preámbulo](#2-preámbulo) 7 | * [3. Resumen del proyecto](#3-resumen-del-proyecto) 8 | * [4. Consideraciones generales](#4-consideraciones-generales) 9 | * [5. Hito 1: Criterios de aceptación mínimos del proyecto](#5-hito-1-criterios-de-aceptación-mínimos-del-proyecto) 10 | * [6. Hito 2 (opcional): Mostrar la franquicia de tarjeta](#6-hito-2-opcional-mostrar-la-franquicia-de-tarjeta) 11 | * [7. Consideraciones técnicas](#7-consideraciones-técnicas) 12 | * [8. Objetivos de aprendizaje](#8-objetivos-de-aprendizaje) 13 | * [9. Pistas, tips y lecturas complementarias](#9-pistas-tips-y-lecturas-complementarias) 14 | * [10. Para considerar Project Feedback](#10-para-considerar-project-feedback) 15 | 16 | *** 17 | 18 | ## 1. Objetivos de aprendizaje generales 19 | Como continuación del proyecto de preadmisión, volverás a trabajar sobre fundamentos de JavaScript, incluyendo conceptos como variables, condicionales, y funciones, así como eventos y manipulación básica del DOM, fundamentos de HTML y CSS. 20 | 21 | Mientras desarrollas este proyecto, te familiarizarás con estos nuevos conceptos: 22 | 23 | * Un _boilerplate_, la estructura básica de un proyecto en distintas carpetas (a través `modulos` en JS). 24 | * Las herramientas de mantenimiento y mejora del código (linters y pruebas unitarias). 25 | * Objetos en JavaScript, su estructura y métodos. 26 | * Iteración (bucles) en JavaScript. 27 | * Control de versiones con git (y la plataforma github) 28 | 29 | ## 2. Preámbulo 30 | 31 | El [algoritmo de Luhn](https://es.wikipedia.org/wiki/Algoritmo_de_Luhn), 32 | también llamado algoritmo de módulo 10, es un método de suma de verificación, 33 | se utiliza para validar números de identificación; tales como el IMEI de los 34 | celulares, tarjetas de crédito, etc. 35 | 36 | Este algoritmo es simple. Obtenemos el reverso del número a verificar (que 37 | solamente contiene dígitos [0-9]); a todos los números que ocupan una posición 38 | par se les debe multiplicar por dos, si este número es mayor o igual a 10, 39 | debemos sumar los dígitos del resultado; el número a verificar será válido si 40 | la suma de sus dígitos finales es un múltiplo de 10. 41 | 42 | ![gráfica de algoritmo de Luhn](https://www.101computing.net/wp/wp-content/uploads/Luhn-Algorithm.png) 43 | 44 | ## 3. Resumen del proyecto 45 | 46 | En este proyecto tendrás que construir una aplicación web que le permita a un 47 | usuario validar el número de una tarjeta de crédito. Además, tendrás que 48 | implementar funcionalidad para ocultar todos los dígitos de una tarjeta menos 49 | los últimos cuatro. 50 | 51 | La temática es libre. Tú debes pensar en qué situaciones de la vida real se 52 | necesitaría validar una tarjeta de crédito y pensar en cómo debe ser esa 53 | experiencia de uso (qué pantallas, explicaciones, mensajes, colores, ¿marca?) 54 | etc. 55 | 56 | Trabajando en parejas aprenderán a construir una aplicación web que interactuará 57 | con la usuaria final a través del navegador, utilizando HTML, CSS y JavaScript 58 | como tecnologías. 59 | 60 | ## 4. Consideraciones generales 61 | 62 | * Este proyecto lo resolvemos de manera individual. Te recomendamos una duracion de 1-3 sprints. 63 | * Enfócate en aprender y no solamente en "completar" el proyecto. Te va a costar. 64 | * Te sugerimos que no intentes saberlo todo antes de empezar a codear. 65 | No te preocupes demasiado ahora por lo que _todavía_ no entiendas. Irás aprendiendo. 66 | 67 | ## 5. Hito 1: Criterios de aceptación mínimos del proyecto 68 | 69 | Estos son los requisitos que tu proyecto debe que cumplir para asegurar que tu trabajo cubra los objetivos principales. 70 | 71 | **1. Una interfaz que debe permitir a la usuaria validar un numero** 72 | * Insertar un numero (texto) que quieres validar. Usa solo caracteres numéricos (dígitos) en la tarjeta a validar [0-9]. 73 | * Ver si el resultado es válido o no. 74 | * Ocultar todos los dígitos del número de tarjeta a exepción de los últimos 4 caracteres. 75 | * No debes poder ingresar un campo vacío. 76 | 77 | **2. Pruebas unitarias de los métodos.** 78 | Los metódos de `validator` (`isValid` y `maskify`) deben tener cobertura con pruebas unitarias. 79 | 80 | **3. Código de tu proyecto subido a tu repo y interfaz "desplegada".** 81 | El código final debe estar subido en un repositorio en GitHub. La interfaz o pagina web, debe ser "desplegada" usando GitHub Pages. 82 | 83 | **4. Un README que contiene una definición del producto.** 84 | En el README 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. 85 | Estas preguntas sirven como guía: 86 | 87 | * Quiénes son los principales usuarios de producto. 88 | * Cuáles son los objetivos de estos usuarios en relación con tu producto. 89 | * Cómo crees que el producto que estás creando está resolviendo sus problemas. 90 | 91 | Con estos requisitos cumplidos puedes [considerar agendar un Project Feedback con unx coach.](https://github.com/Laboratoria/DEV001-card-validation#10-para-considerar-project-feedback) 92 | 93 | ## 6. Hito 2 (opcional): Mostrar la franquicia de tarjeta 94 | 95 | Las partes "opcionales" tienen como intención permitirte profundizar un poco más sobre 96 | los objetivos de aprendizaje del proyecto. Todo en la vida tiene pros y contras, decide 97 | sabiamente si quieres invertir el tiempo en profundizar/perfeccionar o aprender cosas 98 | nuevas en el siguiente proyecto. 99 | 100 | En hito 2 puedes además de validar si el número de la 101 | tarjeta es válida, mostrar la [franquicia](https://es.wikipedia.org/wiki/N%C3%BAmero_de_tarjeta_bancaria) de la tarjeta (ej: Visa, MasterCard, etc) 102 | usando estas [reglas de validación](https://stevemorse.org/ssn/cc.html). Si escribes un nuevo método para eso, hay que hacer pruebas unitarias. 103 | 104 | *** 105 | 106 | ## 7. Consideraciones técnicas 107 | 108 | La lógica del proyecto debe estar implementada completamente en JavaScript. En 109 | este proyecto NO está permitido usar librerías o frameworks, solo JavaScript puro 110 | también conocido como Vanilla JavaScript. 111 | 112 | Para comenzar este proyecto tendrás que hacer un _fork_ y _clonar_ este 113 | repositorio que contiene un _boilerplate_ con tests (pruebas). Un _boilerplate_ es la estructura basica de un proyecto que sirve como un punto de partida con archivos inicial y configuración basica de dependencias y tests. 114 | 115 | Los tests unitarios deben cubrir un mínimo del 70% de _statements_, _functions_ 116 | y _lines_, y un mínimo del 50% de _branches_. El _boilerplate_ ya contiene el 117 | setup y configuración necesaria para ejecutar los tests (pruebas) así como _code 118 | coverage_ para ver el nivel de cobertura de los tests usando el comando `npm 119 | test`. 120 | 121 | El boilerplate que les damos contiene esta estructura: 122 | 123 | ```text 124 | ./ 125 | ├── .babelrc 126 | ├── .editorconfig 127 | ├── .eslintrc 128 | ├── .gitignore 129 | ├── README.md 130 | ├── package.json 131 | ├── src 132 | │ ├── validator.js 133 | │ ├── index.html 134 | │ ├── index.js 135 | │ └── style.css 136 | └── test 137 | ├── .eslintrc 138 | └── validator.spec.js 139 | ``` 140 | 141 | 142 | ### Descripción de scripts / archivos 143 | 144 | * `README.md`: debe explicar la información necesaria para el uso de tu aplicación web, 145 | así como una introducción a la aplicación, su funcionalidad y decisiones de 146 | diseño que tomaron. 147 | * `src/index.html`: este es el punto de entrada a tu aplicación. Este archivo 148 | debe contener tu _markup_ (HTML) e incluir el CSS y JavaScript necesario. 149 | * `src/style.css`: este archivo debe contener las reglas de estilo. Queremos que escribas tus 150 | propias reglas, por eso NO está permitido el uso de frameworks de CSS (Bootstrap, Materialize, etc). 151 | * `src/validator.js`: acá debes implementar el objeto `validator`, el cual ya está 152 | _exportado_ en el _boilerplate_. Este objeto (`validator`) debe contener dos 153 | métodos: 154 | - `validator.isValid(creditCardNumber)`: `creditCardNumber` es un `string` 155 | con el número de tarjeta que se va a verificar. Esta función debe retornar un 156 | `boolean` dependiendo si es válida de acuerdo al [algoritmo de Luhn](https://es.wikipedia.org/wiki/Algoritmo_de_Luhn). 157 | - `validator.maskify(creditCardNumber)`: `creditCardNumber` es un `string` con 158 | el número de tarjeta y esta función debe retornar un `string` donde todos menos 159 | los últimos cuatro caracteres sean reemplazados por un numeral (`#`) o 🐱. 160 | Esta función deberá siempre mantener los últimos cuatro caracteres intactos, aún 161 | cuando el `string` sea de menor longitud. 162 | 163 | Ejemplo de uso 164 | 165 | ```js 166 | maskify('4556364607935616') === '############5616' 167 | maskify( '64607935616') === '#######5616' 168 | maskify( '1') === '1' 169 | maskify( '') === '' 170 | ``` 171 | * `src/index.js`: acá debes escuchar eventos del DOM, invocar `validator.isValid()` 172 | y `validator.maskify()` según sea necesario y actualizar el resultado en la UI (interfaz de usuario). 173 | * `test/validator.spec.js`: este archivo contiene algunos tests de ejemplo y acá 174 | tendrás que implementar los tests para `validator.isValid()` y `validator.maskify()`. 175 | 176 | El _boilerplate_ incluye tareas que ejecutan [eslint](https://eslint.org/) y 177 | [htmlhint](https://github.com/yaniswang/HTMLHint) para verificar el `HTML` y 178 | `JavaScript` con respecto a una guías de estilos. Ambas tareas se ejecutan 179 | automáticamente antes de ejecutar las pruebas (tests) cuando usamos el comando 180 | `npm run test`. En el caso de `JavaScript` estamos usando un archivo de 181 | configuración de `eslint` que se llama `.eslintrc` que contiene un mínimo de 182 | información sobre el parser que usar (qué version de JavaScript/ECMAScript), el 183 | entorno (browser en este caso) y las [reglas recomendadas (`"eslint:recommended"`)](https://eslint.org/docs/rules/). 184 | En cuanto a reglas/guías de estilo en sí, 185 | usaremos las recomendaciones _por defecto_ de tanto `eslint` como `htmlhint`. 186 | 187 | ### Deploy 188 | 189 | Hacer que los sitios estén publicados (o _desplegados_) para que usuarias de 190 | la web puedan acceder a él es algo común en proyectos de desarrollo de software. 191 | 192 | En este proyecto, utilizaremos _Github Pages_ para desplegar nuestro sitio web. 193 | 194 | El comando `npm run deploy` puede ayudarte con esta tarea y también puedes 195 | consultar su [documentación oficial](https://docs.github.com/es/pages). 196 | 197 | *** 198 | 199 | ## 8. Objetivos de aprendizaje 200 | 201 | Reflexiona y luego marca los objetivos que has llegado a entender y aplicar en tu proyecto. Piensa en eso al decidir tu estrategia de trabajo. 202 | 203 | ### HTML 204 | 205 | - [ ] **Uso de HTML semántico** 206 | 207 |
Links

208 | 209 | * [HTML semántico](https://curriculum.laboratoria.la/es/topics/html/02-html5/02-semantic-html) 210 | * [Semantics - MDN Web Docs Glossary](https://developer.mozilla.org/en-US/docs/Glossary/Semantics#Semantics_in_HTML) 211 |

212 | 213 | ### CSS 214 | 215 | - [ ] **Uso de selectores de CSS** 216 | 217 |
Links

218 | 219 | * [Intro a CSS](https://curriculum.laboratoria.la/es/topics/css/01-css/01-intro-css) 220 | * [CSS Selectors - MDN](https://developer.mozilla.org/es/docs/Web/CSS/CSS_Selectors) 221 |

222 | 223 | - [ ] **Modelo de caja (box model): borde, margen, padding** 224 | 225 |
Links

226 | 227 | * [Box Model & Display](https://curriculum.laboratoria.la/es/topics/css/01-css/02-boxmodel-and-display) 228 | * [The box model - MDN](https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/The_box_model) 229 | * [Introduction to the CSS box model - MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Box_Model/Introduction_to_the_CSS_box_model) 230 | * [CSS display - MDN](https://developer.mozilla.org/pt-BR/docs/Web/CSS/display) 231 | * [display - CSS Tricks](https://css-tricks.com/almanac/properties/d/display/) 232 |

233 | 234 | ### Web APIs 235 | 236 | - [ ] **Uso de selectores del DOM** 237 | 238 |
Links

239 | 240 | * [Manipulación del DOM](https://curriculum.laboratoria.la/es/topics/browser/02-dom/03-1-dom-methods-selection) 241 | * [Introducción al DOM - MDN](https://developer.mozilla.org/es/docs/Web/API/Document_Object_Model/Introduction) 242 | * [Localizando elementos DOM usando selectores - MDN](https://developer.mozilla.org/es/docs/Web/API/Document_object_model/Locating_DOM_elements_using_selectors) 243 |

244 | 245 | - [ ] **Manejo de eventos del DOM (listeners, propagación, delegación)** 246 | 247 |
Links

248 | 249 | * [Introducción a eventos - MDN](https://developer.mozilla.org/es/docs/Learn/JavaScript/Building_blocks/Events) 250 | * [EventTarget.addEventListener() - MDN](https://developer.mozilla.org/es/docs/Web/API/EventTarget/addEventListener) 251 | * [EventTarget.removeEventListener() - MDN](https://developer.mozilla.org/es/docs/Web/API/EventTarget/removeEventListener) 252 | * [El objeto Event](https://developer.mozilla.org/es/docs/Web/API/Event) 253 |

254 | 255 | - [ ] **Manipulación dinámica del DOM** 256 | 257 |
Links

258 | 259 | * [Introducción al DOM](https://developer.mozilla.org/es/docs/Web/API/Document_Object_Model/Introduction) 260 | * [Node.appendChild() - MDN](https://developer.mozilla.org/es/docs/Web/API/Node/appendChild) 261 | * [Document.createElement() - MDN](https://developer.mozilla.org/es/docs/Web/API/Document/createElement) 262 | * [Document.createTextNode()](https://developer.mozilla.org/es/docs/Web/API/Document/createTextNode) 263 | * [Element.innerHTML - MDN](https://developer.mozilla.org/es/docs/Web/API/Element/innerHTML) 264 | * [Node.textContent - MDN](https://developer.mozilla.org/es/docs/Web/API/Node/textContent) 265 |

266 | 267 | ### JavaScript 268 | 269 | - [ ] **Tipos de datos primitivos** 270 | 271 |
Links

272 | 273 | * [Valores primitivos - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Data_structures#valores_primitivos) 274 |

275 | 276 | - [ ] **Strings (cadenas de caracteres)** 277 | 278 |
Links

279 | 280 | * [Strings](https://curriculum.laboratoria.la/es/topics/javascript/06-strings) 281 | * [String — Cadena de caracteres - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/String) 282 |

283 | 284 | - [ ] **Variables (declaración, asignación, ámbito)** 285 | 286 |
Links

287 | 288 | * [Valores, tipos de datos y operadores](https://curriculum.laboratoria.la/es/topics/javascript/01-basics/01-values-variables-and-types) 289 | * [Variables](https://curriculum.laboratoria.la/es/topics/javascript/01-basics/02-variables) 290 |

291 | 292 | - [ ] **Uso de condicionales (if-else, switch, operador ternario, lógica booleana)** 293 | 294 |
Links

295 | 296 | * [Estructuras condicionales y repetitivas](https://curriculum.laboratoria.la/es/topics/javascript/02-flow-control/01-conditionals-and-loops) 297 | * [Tomando decisiones en tu código — condicionales - MDN](https://developer.mozilla.org/es/docs/Learn/JavaScript/Building_blocks/conditionals) 298 |

299 | 300 | - [ ] **Uso de bucles/ciclos (while, for, for..of)** 301 | 302 |
Links

303 | 304 | * [Bucles (Loops)](https://curriculum.laboratoria.la/es/topics/javascript/02-flow-control/02-loops) 305 | * [Bucles e iteración - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Guide/Loops_and_iteration) 306 |

307 | 308 | - [ ] **Funciones (params, args, return)** 309 | 310 |
Links

311 | 312 | * [Funciones (control de flujo)](https://curriculum.laboratoria.la/es/topics/javascript/02-flow-control/03-functions) 313 | * [Funciones clásicas](https://curriculum.laboratoria.la/es/topics/javascript/03-functions/01-classic) 314 | * [Arrow Functions](https://curriculum.laboratoria.la/es/topics/javascript/03-functions/02-arrow) 315 | * [Funciones — bloques de código reutilizables - MDN](https://developer.mozilla.org/es/docs/Learn/JavaScript/Building_blocks/Functions) 316 |

317 | 318 | - [ ] **Pruebas unitarias (unit tests)** 319 | 320 |
Links

321 | 322 | * [Empezando con Jest - Documentación oficial](https://jestjs.io/docs/es-ES/getting-started) 323 |

324 | 325 | - [ ] **Módulos de ECMAScript (ES Modules)** 326 | 327 |
Links

328 | 329 | * [import - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Statements/import) 330 | * [export - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Statements/export) 331 |

332 | 333 | - [ ] **Uso de linter (ESLINT)** 334 | 335 | - [ ] **Uso de identificadores descriptivos (Nomenclatura y Semántica)** 336 | 337 | ### Control de Versiones (Git y GitHub) 338 | 339 | - [ ] **Git: Instalación y configuración** 340 | 341 | - [ ] **Git: Control de versiones con git (init, clone, add, commit, status, push, pull, remote)** 342 | 343 | - [ ] **GitHub: Creación de cuenta y repos, configuración de llaves SSH** 344 | 345 | - [ ] **GitHub: Despliegue con GitHub Pages** 346 | 347 |
Links

348 | 349 | * [Sitio oficial de GitHub Pages](https://pages.github.com/) 350 |

351 | 352 | ### Centrado en el usuario 353 | 354 | - [ ] **Diseñar y desarrollar un producto o servicio poniendo a las usuarias en el centro** 355 | 356 | ### Diseño de producto 357 | 358 | - [ ] **Crear prototipos de alta fidelidad que incluyan interacciones** 359 | 360 | - [ ] **Seguir los principios básicos de diseño visual** 361 | 362 | *** 363 | 364 | ## 9. Pistas, tips y lecturas complementarias 365 | 366 | ### Primeros pasos 367 | 368 | 1. Antes que nada, asegúrate de tener un :pencil: editor de texto en 369 | condiciones, algo como [Atom](https://atom.io/) o 370 | [Code](https://code.visualstudio.com/). 371 | 2. Para ejecutar los comandos a continuación necesitarás una :shell: 372 | [UNIX Shell](https://curriculum.laboratoria.la/es/topics/shell), 373 | que es un programita que interpreta líneas de comando (command-line 374 | interpreter) así como tener [git](https://curriculum.laboratoria.la/es/topics/scm/01-git) 375 | instalado. Si usas un sistema operativo "UNIX-like", como GNU/Linux o MacOS, 376 | ya tienes una _shell_ (terminal) instalada por defecto (y probablemente `git` 377 | también). Si usas Windows puedes usar la versión completa de [Cmder](https://cmder.net/) 378 | que incluye [Git bash](https://git-scm.com/download/win) y si tienes Windows 379 | 10 o superior puedes usar [Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10). 380 | 3. Una de las integrantes del equipo debe realizar un :fork_and_knife: 381 | [fork](https://help.github.com/articles/fork-a-repo/) del repo de tu cohort, 382 | tus _coaches_ te compartirán un _link_ a un repo y te darán acceso de lectura 383 | en ese repo. La otra integrante del equipo deber hacer un fork **del 384 | repositorio de su compañera** y 385 | [configurar](https://gist.github.com/BCasal/026e4c7f5c71418485c1) un `remote` 386 | hacia el mismo. 387 | 4. :arrow_down: [Clona](https://help.github.com/articles/cloning-a-repository/) 388 | tu _fork_ a tu computadora (copia local). 389 | 5. 📦 Instala las dependencias del proyecto con el comando `npm install`. Esto 390 | asume que has instalado [Node.js](https://nodejs.org/) (que incluye [npm](https://docs.npmjs.com/)). 391 | 6. Si todo ha ido bien, deberías poder ejecutar las :traffic_light: 392 | pruebas unitarias (unit tests) con el comando `npm test`. 393 | 7. Para ver la interfaz de tu programa en el navegador, usa el comando 394 | `npm start` para arrancar el servidor web y dirígete a 395 | `http://localhost:5000` en tu navegador. 396 | 8. A codear se ha dicho! :rocket: 397 | 398 | ### Recursos y temas relacionados 399 | 400 | Súmate al canal de Slack [#project-card-validation](https://claseslaboratoria.slack.com/archives/C03LXJ10WJD) para conversar y pedir ayuda de proyecto. 401 | 402 | A continuación un video de Michelle que te lleva a través del algoritmo de Luhn 403 | y un par de cosas más que debes saber para resolver este proyecto. ¡Escúchala 404 | con detenimiento y sigue sus consejos! :) 405 | 406 | [![tips credit card](https://img.youtube.com/vi/f0zL6Ot9y_w/0.jpg)](https://www.youtube.com/watch?v=f0zL6Ot9y_w) 407 | 408 | [Link](https://www.youtube.com/watch?v=f0zL6Ot9y_w) 409 | 410 | Terminal y shell de UNIX: 411 | 412 | [![Playlist de Terminal y shell de UNIX](https://img.youtube.com/vi/GB35Eyb-J4c/0.jpg)](https://www.youtube.com/playlist?list=PLiAEe0-R7u8nGH5TEHfSTeDNIvjZFe_Yd) 413 | 414 | [Link](https://www.youtube.com/playlist?list=PLiAEe0-R7u8nGH5TEHfSTeDNIvjZFe_Yd) 415 | 416 | Control de versiones y trabajo colaborativo con Git y GitHub: 417 | 418 | [![Playlist de control de versiones y trabajo colaborativo](https://img.youtube.com/vi/F1EoBbvhaqU/0.jpg)](https://www.youtube.com/playlist?list=PLiAEe0-R7u8k9o3PbT3_QdyoBW_RX8rnV) 419 | 420 | [Link](https://www.youtube.com/playlist?list=PLiAEe0-R7u8k9o3PbT3_QdyoBW_RX8rnV) 421 | 422 | Desarrollo Front-end: 423 | 424 | * [Documentación de NPM](https://docs.npmjs.com/) 425 | 426 | Organización del Trabajo: 427 | 428 | * [Metodologías Ágiles](https://www.youtube.com/watch?v=v3fLx7VHxGM) 429 | * [Scrum en menos de 2 minutos](https://www.youtube.com/watch?v=TRcReyRYIMg) 430 | * [Scrum en Detalle](https://www.youtube.com/watch?v=nOlwF3HRrAY&t=297s). No 431 | esperamos que hagas todo eso desde este proyecto. Iremos profundizando poco a 432 | poco a lo largo del -_bootcamp_. 433 | * [Blog: cómo funciona el algoritmo de Luhn](http://www.quobit.mx/asi-funciona-el-algoritmo-de-luhn-para-generar-numeros-de-tarjetas-de-credito.html). 434 | 435 | *** 436 | 437 | ## 10. Para considerar Project Feedback 438 | 439 | En resumen, los criterios de aceptación mínimos del proyecto para considerar Project Feedback: 440 | 441 | * [ ] Tiene una interfaz que permite a la usuaria saber si la tarjeta es valido y ocultar el numero hasta las 4 ultimos digitos 442 | * [ ] El proyecto será entregado incluyendo pruebas unitarios de los métodos de `validator` (`isValid` y `maskify`) 443 | * [ ] El proyecto será entregado libre de _errores_ de `eslint` (_warnings_ son ok) 444 | * [ ] El proyecto será entregado subiendo tu código a GitHub. 445 | * [ ] La interfaz será "desplegada" usando GitHub Pages. 446 | * [ ] El README contiene una definición del producto 447 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "card-validation", 3 | "version": "1.0.0", 4 | "main": "src/index.html", 5 | "license": "MIT", 6 | "scripts": { 7 | "htmlhint": "htmlhint src/*.html test/*.html", 8 | "eslint": "eslint --ext .js src/ test/", 9 | "pretest": "npm run eslint && npm run htmlhint", 10 | "test": "jest --verbose --coverage", 11 | "open-coverage-report": "opener ./coverage/lcov-report/index.html", 12 | "start": "serve ./src", 13 | "deploy": "gh-pages -d src" 14 | }, 15 | "dependencies": { 16 | "@babel/core": "^7.6.2", 17 | "@babel/plugin-transform-modules-commonjs": "^7.6.0", 18 | "babel-jest": "^27.0.1", 19 | "eslint": "^8.3.0", 20 | "gh-pages": "^3.1.0", 21 | "htmlhint": "^1.0.0", 22 | "jest": "^27.0.1", 23 | "opener": "^1.5.1", 24 | "serve": "^13.0.2" 25 | }, 26 | "engines": { 27 | "node": ">=16.x" 28 | } 29 | } 30 | 31 | -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Tarjeta de crédito válida 6 | 7 | 8 | 9 |
10 |
11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import validator from './validator.js'; 2 | 3 | console.log(validator); 4 | -------------------------------------------------------------------------------- /src/style.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Laboratoria/DEV001-card-validation/9299272a84741141fc8274102bcd2a0be4c93fbe/src/style.css -------------------------------------------------------------------------------- /src/validator.js: -------------------------------------------------------------------------------- 1 | const validator = { 2 | // ... 3 | }; 4 | 5 | export default validator; 6 | -------------------------------------------------------------------------------- /test/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "jest": true 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /test/validator.spec.js: -------------------------------------------------------------------------------- 1 | // importamos el objeto `validator`, que contiene las funciones `isValid` y `maskify` 2 | import validator from '../src/validator'; 3 | 4 | describe('validator', () => { 5 | it('debería ser un objeto', () => { 6 | expect(typeof validator).toBe('object'); 7 | }); 8 | 9 | describe('validator.isValid', () => { 10 | it('debería ser una función', () => { 11 | expect(typeof validator.isValid).toBe('function'); 12 | }); 13 | 14 | it('debería retornar true para "4083952015263"', () => { 15 | expect(validator.isValid('4083952015263')).toBe(true); 16 | }); 17 | 18 | it('debería retornar true para "79927398713"', () => { 19 | expect(validator.isValid('79927398713')).toBe(true); 20 | }); 21 | 22 | it('debería retornar false para "1234567890"', () => { 23 | expect(validator.isValid('1234567890')).toBe(false); 24 | }); 25 | }); 26 | 27 | describe('validator.maskify', () => { 28 | it('debería ser una función', () => { 29 | expect(typeof validator.maskify).toBe('function'); 30 | }); 31 | 32 | it('Debería retornar "############5616" para "4556364607935616"', () => { 33 | expect(validator.maskify('4556364607935616')).toBe('############5616'); 34 | }); 35 | 36 | it('Debería retornar "1" para "1"', () => { 37 | expect(validator.maskify('1')).toBe('1'); 38 | }); 39 | 40 | it('Debería retornar "######orld" para "helloworld"', () => { 41 | expect(validator.maskify('helloworld')).toBe('######orld'); 42 | }); 43 | }); 44 | }); 45 | -------------------------------------------------------------------------------- /thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Laboratoria/DEV001-card-validation/9299272a84741141fc8274102bcd2a0be4c93fbe/thumb.png --------------------------------------------------------------------------------