├── .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 | 
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 |
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 |
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 |
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 |
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 |
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 |
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 |
272 |
273 | * [Valores primitivos - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Data_structures#valores_primitivos)
274 |
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 |
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 |
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 |
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 |
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 |
321 |
322 | * [Empezando con Jest - Documentación oficial](https://jestjs.io/docs/es-ES/getting-started)
323 |
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 |
348 |
349 | * [Sitio oficial de GitHub Pages](https://pages.github.com/)
350 | Links
Links
Links
Links
Links
Links
Links
Links
Links
Links
Links
Links
Links
Links
Links