From fb58e474be5ad97964878c188eb640bd48c10f39 Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Wed, 2 Jun 2021 12:46:17 +0900 Subject: [PATCH 01/35] chore: codeformatter, cypress, tsconfig, docs --- .eslintrc.json | 15 + .prettierc.json | 5 + cypress.json | 3 + cypress/fixtures/example.json | 5 + cypress/integration/racingcar.spec.js | 12 + cypress/plugins/index.js | 22 + cypress/support/commands.js | 25 + cypress/support/index.js | 20 + docs/README.md | 1 + index.html | 3 +- package.json | 25 + src/css/index.css | 37 - src/css/shared/button.css | 18 - src/css/shared/layout.css | 108 - src/css/shared/sizing.css | 4 - src/css/shared/typhography.css | 15 - src/css/ui/spinner.css | 29 - src/js/index.ts | 1 + tsconfig.json | 78 + yarn.lock | 2594 +++++++++++++++++++++++++ 20 files changed, 2808 insertions(+), 212 deletions(-) create mode 100644 .eslintrc.json create mode 100644 .prettierc.json create mode 100644 cypress.json create mode 100644 cypress/fixtures/example.json create mode 100644 cypress/integration/racingcar.spec.js create mode 100644 cypress/plugins/index.js create mode 100644 cypress/support/commands.js create mode 100644 cypress/support/index.js create mode 100644 docs/README.md create mode 100644 package.json delete mode 100644 src/css/index.css delete mode 100644 src/css/shared/button.css delete mode 100644 src/css/shared/layout.css delete mode 100644 src/css/shared/sizing.css delete mode 100644 src/css/shared/typhography.css delete mode 100644 src/css/ui/spinner.css create mode 100644 src/js/index.ts create mode 100644 tsconfig.json create mode 100644 yarn.lock diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 000000000..f350d16f0 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,15 @@ +{ + "env": { + "browser": true, + "es2021": true + }, + "extends": ["airbnb-base"], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 12, + "sourceType": "module" + }, + "plugins": ["@typescript-eslint"], + "ignorePatterns": ["dist/", "node_modules/"], + "rules": {} +} diff --git a/.prettierc.json b/.prettierc.json new file mode 100644 index 000000000..0678f27e5 --- /dev/null +++ b/.prettierc.json @@ -0,0 +1,5 @@ +{ + "parser": "typescript", + "singleQuote": true, + "trailingComma": "all" +} diff --git a/cypress.json b/cypress.json new file mode 100644 index 000000000..f348ac0ce --- /dev/null +++ b/cypress.json @@ -0,0 +1,3 @@ +{ + "baseUrl": "http://127.0.0.1:5500" +} diff --git a/cypress/fixtures/example.json b/cypress/fixtures/example.json new file mode 100644 index 000000000..02e425437 --- /dev/null +++ b/cypress/fixtures/example.json @@ -0,0 +1,5 @@ +{ + "name": "Using fixtures to represent data", + "email": "hello@cypress.io", + "body": "Fixtures are a great way to mock data for responses to routes" +} diff --git a/cypress/integration/racingcar.spec.js b/cypress/integration/racingcar.spec.js new file mode 100644 index 000000000..e8f7b3680 --- /dev/null +++ b/cypress/integration/racingcar.spec.js @@ -0,0 +1,12 @@ +describe('initial value', () => { + beforeEach(() => { + cy.visit('/javascript-racingcar/'); + }); + it('total value', () => { + cy.get('.w-100[type=text]').type('holee') + cy.get('.w-100[type=text]').should('have.value', 'holee'); + cy.get('.w-100[type=number]').type(1) + cy.get('.w-100[type=number]').should('have.value', 1); + }); + }); + \ No newline at end of file diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js new file mode 100644 index 000000000..59b2bab6e --- /dev/null +++ b/cypress/plugins/index.js @@ -0,0 +1,22 @@ +/// +// *********************************************************** +// This example plugins/index.js can be used to load plugins +// +// You can change the location of this file or turn off loading +// the plugins file with the 'pluginsFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/plugins-guide +// *********************************************************** + +// This function is called when a project is opened or re-opened (e.g. due to +// the project's config changing) + +/** + * @type {Cypress.PluginConfig} + */ +// eslint-disable-next-line no-unused-vars +module.exports = (on, config) => { + // `on` is used to hook into various events Cypress emits + // `config` is the resolved Cypress config +} diff --git a/cypress/support/commands.js b/cypress/support/commands.js new file mode 100644 index 000000000..119ab03f7 --- /dev/null +++ b/cypress/support/commands.js @@ -0,0 +1,25 @@ +// *********************************************** +// This example commands.js shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** +// +// +// -- This is a parent command -- +// Cypress.Commands.add('login', (email, password) => { ... }) +// +// +// -- This is a child command -- +// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This will overwrite an existing command -- +// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) diff --git a/cypress/support/index.js b/cypress/support/index.js new file mode 100644 index 000000000..d68db96df --- /dev/null +++ b/cypress/support/index.js @@ -0,0 +1,20 @@ +// *********************************************************** +// This example support/index.js is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import './commands' + +// Alternatively you can use CommonJS syntax: +// require('./commands') diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..9d007f823 --- /dev/null +++ b/docs/README.md @@ -0,0 +1 @@ +## κΈ°λŠ₯ κ΅¬ν˜„ diff --git a/index.html b/index.html index ea5891942..6533418f3 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ 🏎️ μžλ™μ°¨ κ²½μ£Ό κ²Œμž„ - +
@@ -67,5 +67,6 @@

πŸ† μ΅œμ’… 우승자: EAST, WEST πŸ†

+ diff --git a/package.json b/package.json new file mode 100644 index 000000000..2a1fff62c --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "javascript-racingcar", + "version": "1.0.0", + "main": "index.js", + "repository": "https://github.com/hochan222/javascript-racingcar.git", + "author": "hochan Lee ", + "license": "MIT", + "scripts": { + "cypress:open": "./node_modules/.bin/cypress open", + "cypress:run": "./node_modules/.bin/cypress run", + "tsc": "tsc", + "lint": "eslint ." + }, + "devDependencies": { + "prettier": "^2.3.0", + "@typescript-eslint/eslint-plugin": "^4.26.0", + "@typescript-eslint/parser": "^4.26.0", + "cypress": "^7.4.0", + "eslint": "^7.27.0", + "eslint-config-airbnb-base": "^14.2.1", + "eslint-plugin-cypress": "^2.11.3", + "eslint-plugin-import": "^2.23.4", + "typescript": "^4.3.2" + } +} diff --git a/src/css/index.css b/src/css/index.css deleted file mode 100644 index 4b1abf762..000000000 --- a/src/css/index.css +++ /dev/null @@ -1,37 +0,0 @@ -@import './shared/button.css'; -@import './shared/layout.css'; -@import './shared/sizing.css'; -@import './shared/typhography.css'; -@import './ui/spinner.css'; - -html, -body { - margin: 0; - height: 100%; -} - -.car-player { - height: 36px; - min-width: 64px; - padding: 0 16px; - border-radius: 4px; - outline: 0; - border-style: none; - background-color: #f5f5f5; - display: inline-flex; - font-weight: bold; - align-items: center; - justify-content: center; - position: relative; -} - -.forward-icon { - font-size: 32px; - display: flex; - justify-content: center; -} - -fieldset { - border: none; - padding: 0; -} diff --git a/src/css/shared/button.css b/src/css/shared/button.css deleted file mode 100644 index 8ac62188f..000000000 --- a/src/css/shared/button.css +++ /dev/null @@ -1,18 +0,0 @@ -.btn { - height: 36px; - min-width: 64px; - padding: 0 16px; - border-radius: 4px; - outline: 0; - border-style: none; - cursor: pointer; -} - -.btn-cyan { - background-color: #00bcd4 !important; - border-color: #00bcd4 !important; -} - -.btn.btn-cyan:hover { - background-color: #018c9e !important; -} diff --git a/src/css/shared/layout.css b/src/css/shared/layout.css deleted file mode 100644 index fd606258c..000000000 --- a/src/css/shared/layout.css +++ /dev/null @@ -1,108 +0,0 @@ -/* Layout - Position */ -.relative { - position: relative; -} - -.absolute { - position: absolute; -} - -.fixed { - position: fixed; -} - -/* Layout - Display */ -.d-flex { - display: flex; -} - -.d-block { - display: block; -} - -.d-inline { - display: inline; -} - -.d-inline-block { - display: inline-block; -} - -/* Layout - Top / Right / Bottom / Left */ - -.mt-2 { - margin-top: 8px; -} - -.mt-3 { - margin-top: 12px; -} - -.mt-4 { - margin-top: 16px; -} - -.mt-5 { - margin-top: 20px; -} - -.mr-2 { - margin-right: 8px; -} - -/* Box Alignment - Justify Content*/ -.justify-start { - justify-content: flex-start; -} -.justify-end { - justify-content: flex-end; -} -.justify-center { - justify-content: center; -} -.justify-between { - justify-content: space-between; -} -.justify-around { - justify-content: space-around; -} -.justify-evenly { - justify-content: space-evenly; -} - -/* Box Alignment - Align Items*/ -.items-start { - align-items: flex-start; -} -.items-end { - align-items: flex-end; -} -.items-center { - align-items: center; -} -.items-baseline { - align-items: baseline; -} -.items-stretch { - align-items: stretch; -} - -/* Box Alignment - Align Content*/ -.content-center { - align-content: center; -} -.content-start { - align-content: flex-start; -} -.content-end { - align-content: flex-end; -} -.content-between { - align-content: space-between; -} -.content-around { - align-content: space-around; -} -.content-evenly { - align-content: space-around; -} diff --git a/src/css/shared/sizing.css b/src/css/shared/sizing.css deleted file mode 100644 index f54111a87..000000000 --- a/src/css/shared/sizing.css +++ /dev/null @@ -1,4 +0,0 @@ -/* Sizing - Width */ -.w-100 { - width: 100%; -} diff --git a/src/css/shared/typhography.css b/src/css/shared/typhography.css deleted file mode 100644 index 2fd678db5..000000000 --- a/src/css/shared/typhography.css +++ /dev/null @@ -1,15 +0,0 @@ -.text-left { - text-align: left; -} - -.text-center { - text-align: center; -} - -.text-right { - text-align: right; -} - -.text-justify { - text-align: justify; -} diff --git a/src/css/ui/spinner.css b/src/css/ui/spinner.css deleted file mode 100644 index f3d4909b2..000000000 --- a/src/css/ui/spinner.css +++ /dev/null @@ -1,29 +0,0 @@ -.spinner-container { - width: 25px; - height: 25px; -} - -.spinner::after { - content: ''; - box-sizing: border-box; - width: 25px; - height: 25px; - left: 0; - top: 0; - position: absolute; - border-radius: 50%; -} - -.spinner.material::after { - border-top: 4px solid rgba(0, 191, 215, 1); - border-left: 4px solid rgba(0, 191, 215, 1); - border-bottom: 4px solid rgba(0, 191, 215, 1); - border-right: 4px solid rgba(0, 191, 215, 0); - animation: spinner 0.6s linear infinite; -} - -@keyframes spinner { - to { - transform: rotate(360deg); - } -} diff --git a/src/js/index.ts b/src/js/index.ts new file mode 100644 index 000000000..ec10f3e9d --- /dev/null +++ b/src/js/index.ts @@ -0,0 +1 @@ +console.log('hi'); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..d0aa8f4af --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,78 @@ +{ + "include": [ + "./src/**/*.ts" + ], + "exclude": [ + "node_modules" + ], + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */ + // "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ + "lib": ["dom","es6", "es2017"], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */ + // "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + "outDir": "./dist", /* Redirect output structure to the directory. */ + "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an 'override' modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Require undeclared properties from index signatures to use element accesses. */ + + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + "types": ["cypress"], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + + /* Advanced Options */ + "skipLibCheck": true, /* Skip type checking of declaration files. */ + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + } +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 000000000..4de0632d8 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,2594 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/helper-validator-identifier@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" + integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== + +"@babel/highlight@^7.10.4": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" + integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.0" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@cypress/listr-verbose-renderer@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@cypress/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#a77492f4b11dcc7c446a34b3e28721afd33c642a" + integrity sha1-p3SS9LEdzHxEajSz4ochr9M8ZCo= + dependencies: + chalk "^1.1.3" + cli-cursor "^1.0.2" + date-fns "^1.27.2" + figures "^1.7.0" + +"@cypress/request@^2.88.5": + version "2.88.5" + resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.5.tgz#8d7ecd17b53a849cfd5ab06d5abe7d84976375d7" + integrity sha512-TzEC1XMi1hJkywWpRfD2clreTa/Z+lOrXDCxxBTBPEcY5azdPi56A6Xw+O4tWJnaJH3iIE7G5aDXZC6JgRZLcA== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +"@cypress/xvfb@^1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a" + integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== + dependencies: + debug "^3.1.0" + lodash.once "^4.1.1" + +"@eslint/eslintrc@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.1.tgz#442763b88cecbe3ee0ec7ca6d6dd6168550cbf14" + integrity sha512-5v7TDE9plVhvxQeWLXDTvFvJBdH6pEsdnl2g/dAptmuFEPedQ4Erq5rsDsX+mvAM610IhNaO2W5V1dOOnDKxkQ== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@nodelib/fs.scandir@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" + integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== + dependencies: + "@nodelib/fs.stat" "2.0.4" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" + integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" + integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== + dependencies: + "@nodelib/fs.scandir" "2.1.4" + fastq "^1.6.0" + +"@samverschueren/stream-to-observable@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz#a21117b19ee9be70c379ec1877537ef2e1c63301" + integrity sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ== + dependencies: + any-observable "^0.3.0" + +"@types/json-schema@^7.0.7": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" + integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + +"@types/node@*": + version "15.6.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.6.1.tgz#32d43390d5c62c5b6ec486a9bc9c59544de39a08" + integrity sha512-7EIraBEyRHEe7CH+Fm1XvgqU6uwZN8Q7jppJGcqjROMT29qhAuuOxYB1uEY5UMYQKEmA5D+5tBnhdaPXSsLONA== + +"@types/node@^14.14.31": + version "14.17.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.1.tgz#5e07e0cb2ff793aa7a1b41deae76221e6166049f" + integrity sha512-/tpUyFD7meeooTRwl3sYlihx2BrJE7q9XF71EguPFIySj9B7qgnRtHsHTho+0AUm4m1SvWGm6uSncrR94q6Vtw== + +"@types/sinonjs__fake-timers@^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.2.tgz#3a84cf5ec3249439015e14049bd3161419bf9eae" + integrity sha512-dIPoZ3g5gcx9zZEszaxLSVTvMReD3xxyyDnQUjA6IYDG9Ba2AV0otMPs+77sG9ojB4Qr2N2Vk5RnKeuA0X/0bg== + +"@types/sizzle@^2.3.2": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef" + integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== + +"@types/yauzl@^2.9.1": + version "2.9.1" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.1.tgz#d10f69f9f522eef3cf98e30afb684a1e1ec923af" + integrity sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA== + dependencies: + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@^4.26.0": + version "4.26.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.26.0.tgz#12bbd6ebd5e7fabd32e48e1e60efa1f3554a3242" + integrity sha512-yA7IWp+5Qqf+TLbd8b35ySFOFzUfL7i+4If50EqvjT6w35X8Lv0eBHb6rATeWmucks37w+zV+tWnOXI9JlG6Eg== + dependencies: + "@typescript-eslint/experimental-utils" "4.26.0" + "@typescript-eslint/scope-manager" "4.26.0" + debug "^4.3.1" + functional-red-black-tree "^1.0.1" + lodash "^4.17.21" + regexpp "^3.1.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@4.26.0": + version "4.26.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.26.0.tgz#ba7848b3f088659cdf71bce22454795fc55be99a" + integrity sha512-TH2FO2rdDm7AWfAVRB5RSlbUhWxGVuxPNzGT7W65zVfl8H/WeXTk1e69IrcEVsBslrQSTDKQSaJD89hwKrhdkw== + dependencies: + "@types/json-schema" "^7.0.7" + "@typescript-eslint/scope-manager" "4.26.0" + "@typescript-eslint/types" "4.26.0" + "@typescript-eslint/typescript-estree" "4.26.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/parser@^4.26.0": + version "4.26.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.26.0.tgz#31b6b732c9454f757b020dab9b6754112aa5eeaf" + integrity sha512-b4jekVJG9FfmjUfmM4VoOItQhPlnt6MPOBUL0AQbiTmm+SSpSdhHYlwayOm4IW9KLI/4/cRKtQCmDl1oE2OlPg== + dependencies: + "@typescript-eslint/scope-manager" "4.26.0" + "@typescript-eslint/types" "4.26.0" + "@typescript-eslint/typescript-estree" "4.26.0" + debug "^4.3.1" + +"@typescript-eslint/scope-manager@4.26.0": + version "4.26.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.26.0.tgz#60d1a71df162404e954b9d1c6343ff3bee496194" + integrity sha512-G6xB6mMo4xVxwMt5lEsNTz3x4qGDt0NSGmTBNBPJxNsrTXJSm21c6raeYroS2OwQsOyIXqKZv266L/Gln1BWqg== + dependencies: + "@typescript-eslint/types" "4.26.0" + "@typescript-eslint/visitor-keys" "4.26.0" + +"@typescript-eslint/types@4.26.0": + version "4.26.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.26.0.tgz#7c6732c0414f0a69595f4f846ebe12616243d546" + integrity sha512-rADNgXl1kS/EKnDr3G+m7fB9yeJNnR9kF7xMiXL6mSIWpr3Wg5MhxyfEXy/IlYthsqwBqHOr22boFbf/u6O88A== + +"@typescript-eslint/typescript-estree@4.26.0": + version "4.26.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.26.0.tgz#aea17a40e62dc31c63d5b1bbe9a75783f2ce7109" + integrity sha512-GHUgahPcm9GfBuy3TzdsizCcPjKOAauG9xkz9TR8kOdssz2Iz9jRCSQm6+aVFa23d5NcSpo1GdHGSQKe0tlcbg== + dependencies: + "@typescript-eslint/types" "4.26.0" + "@typescript-eslint/visitor-keys" "4.26.0" + debug "^4.3.1" + globby "^11.0.3" + is-glob "^4.0.1" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/visitor-keys@4.26.0": + version "4.26.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.26.0.tgz#26d2583169222815be4dcd1da4fe5459bc3bcc23" + integrity sha512-cw4j8lH38V1ycGBbF+aFiLUls9Z0Bw8QschP3mkth50BbWzgFS33ISIgBzUMuQ2IdahoEv/rXstr8Zhlz4B1Zg== + dependencies: + "@typescript-eslint/types" "4.26.0" + eslint-visitor-keys "^2.0.0" + +acorn-jsx@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + +acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.1: + version "8.5.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.5.0.tgz#695528274bcb5afc865446aa275484049a18ae4b" + integrity sha512-Y2l399Tt1AguU3BPRP9Fn4eN+Or+StUGWCUpbnFyXSo8NZ9S4uj+AG2pjs5apK+ZMOwYOz1+a+VKvKH7CudXgQ== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +any-observable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" + integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== + +arch@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +array-includes@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" + integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + get-intrinsic "^1.1.1" + is-string "^1.0.5" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.flat@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" + integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" + integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +blob-util@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" + integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== + +bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + +cachedir@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" + integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@^1.0.0, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" + integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +check-more-types@^2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" + integrity sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA= + +ci-info@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6" + integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== + +cli-cursor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" + integrity sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc= + dependencies: + restore-cursor "^1.0.1" + +cli-cursor@^2.0.0, cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-table3@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.0.tgz#b7b1bc65ca8e7b5cef9124e13dc2b21e2ce4faee" + integrity sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ== + dependencies: + object-assign "^4.1.0" + string-width "^4.2.0" + optionalDependencies: + colors "^1.1.2" + +cli-truncate@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" + integrity sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ= + dependencies: + slice-ansi "0.0.4" + string-width "^1.0.1" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colors@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +common-tags@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" + integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +confusing-browser-globals@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz#30d1e7f3d1b882b25ec4933d1d1adac353d20a59" + integrity sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA== + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cross-spawn@^7.0.0, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cypress@^7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-7.4.0.tgz#679bfe75335b9a4873d44f0d989e9f0367f00665" + integrity sha512-+CmSoT5DS88e92YDfc6aDA3Zf3uCBRKVB92caWsjXMilz0tf6NpByFvIbLLVWXiYOwrhtWV0m/k93+rzodYwRQ== + dependencies: + "@cypress/listr-verbose-renderer" "^0.4.1" + "@cypress/request" "^2.88.5" + "@cypress/xvfb" "^1.2.4" + "@types/node" "^14.14.31" + "@types/sinonjs__fake-timers" "^6.0.2" + "@types/sizzle" "^2.3.2" + arch "^2.2.0" + blob-util "^2.0.2" + bluebird "^3.7.2" + cachedir "^2.3.0" + chalk "^4.1.0" + check-more-types "^2.24.0" + cli-table3 "~0.6.0" + commander "^5.1.0" + common-tags "^1.8.0" + dayjs "^1.10.4" + debug "4.3.2" + eventemitter2 "^6.4.3" + execa "4.1.0" + executable "^4.1.1" + extract-zip "2.0.1" + fs-extra "^9.1.0" + getos "^3.2.1" + is-ci "^3.0.0" + is-installed-globally "~0.4.0" + lazy-ass "^1.6.0" + listr "^0.14.3" + lodash "^4.17.21" + log-symbols "^4.0.0" + minimist "^1.2.5" + ospath "^1.2.2" + pretty-bytes "^5.6.0" + ramda "~0.27.1" + request-progress "^3.0.0" + supports-color "^8.1.1" + tmp "~0.2.1" + untildify "^4.0.0" + url "^0.11.0" + yauzl "^2.10.0" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +date-fns@^1.27.2: + version "1.30.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" + integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== + +dayjs@^1.10.4: + version "1.10.5" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.5.tgz#5600df4548fc2453b3f163ebb2abbe965ccfb986" + integrity sha512-BUFis41ikLz+65iH6LHQCDm4YPMj5r1YFLdupPIyM4SGcXMmtiLQ7U37i+hGS8urIuqe7I/ou3IS1jVc4nbN4g== + +debug@4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + +debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.1.0, debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.0.1, debug@^4.1.1, debug@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + +deep-is@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +elegant-spinner@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" + integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2: + version "1.18.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0" + integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.2" + is-callable "^1.2.3" + is-negative-zero "^2.0.1" + is-regex "^1.1.3" + is-string "^1.0.6" + object-inspect "^1.10.3" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-airbnb-base@^14.2.1: + version "14.2.1" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz#8a2eb38455dc5a312550193b319cdaeef042cd1e" + integrity sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA== + dependencies: + confusing-browser-globals "^1.0.10" + object.assign "^4.1.2" + object.entries "^1.1.2" + +eslint-import-resolver-node@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" + integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== + dependencies: + debug "^2.6.9" + resolve "^1.13.1" + +eslint-module-utils@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz#b51be1e473dd0de1c5ea638e22429c2490ea8233" + integrity sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A== + dependencies: + debug "^3.2.7" + pkg-dir "^2.0.0" + +eslint-plugin-cypress@^2.11.3: + version "2.11.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-cypress/-/eslint-plugin-cypress-2.11.3.tgz#54ee4067aa8192aa62810cd35080eb577e191ab7" + integrity sha512-hOoAid+XNFtpvOzZSNWP5LDrQBEJwbZwjib4XJ1KcRYKjeVj0mAmPmucG4Egli4j/aruv+Ow/acacoloWWCl9Q== + dependencies: + globals "^11.12.0" + +eslint-plugin-import@^2.23.4: + version "2.23.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz#8dceb1ed6b73e46e50ec9a5bb2411b645e7d3d97" + integrity sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ== + dependencies: + array-includes "^3.1.3" + array.prototype.flat "^1.2.4" + debug "^2.6.9" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.4" + eslint-module-utils "^2.6.1" + find-up "^2.0.0" + has "^1.0.3" + is-core-module "^2.4.0" + minimatch "^3.0.4" + object.values "^1.1.3" + pkg-up "^2.0.0" + read-pkg-up "^3.0.0" + resolve "^1.20.0" + tsconfig-paths "^3.9.0" + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint@^7.27.0: + version "7.27.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.27.0.tgz#665a1506d8f95655c9274d84bd78f7166b07e9c7" + integrity sha512-JZuR6La2ZF0UD384lcbnd0Cgg6QJjiCwhMD6eU4h/VGPcVGwawNNzKU41tgokGXnfjOOyI6QIffthhJTPzzuRA== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.1" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + escape-string-regexp "^4.0.0" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^13.6.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.9" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +eventemitter2@^6.4.3: + version "6.4.4" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.4.tgz#aa96e8275c4dbeb017a5d0e03780c65612a1202b" + integrity sha512-HLU3NDY6wARrLCEwyGKRBvuWYyvW6mHYv72SJJAH3iJN3a6eVUvkjFkcxah1bcTgGVBBrFdIopBJPhCQFMLyXw== + +execa@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +executable@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" + integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== + dependencies: + pify "^2.2.0" + +exit-hook@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g= + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extract-zip@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.1.1: + version "3.2.5" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" + integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastq@^1.6.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858" + integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g== + dependencies: + reusify "^1.0.4" + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= + dependencies: + pend "~1.2.0" + +figures@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" + integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-stream@^5.0.0, get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +getos@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" + integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== + dependencies: + async "^3.2.0" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-parent@^5.0.0, glob-parent@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@^7.1.3: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" + integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== + dependencies: + ini "2.0.0" + +globals@^11.12.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + dependencies: + type-fest "^0.8.1" + +globals@^13.6.0: + version "13.9.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.9.0.tgz#4bf2bf635b334a173fb1daf7c5e6b218ecdc06cb" + integrity sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA== + dependencies: + type-fest "^0.20.2" + +globby@^11.0.3: + version "11.0.3" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" + integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-bigint@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" + integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== + +is-boolean-object@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8" + integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng== + dependencies: + call-bind "^1.0.2" + +is-callable@^1.1.4, is-callable@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" + integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== + +is-ci@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.0.tgz#c7e7be3c9d8eef7d0fa144390bd1e4b88dc4c994" + integrity sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ== + dependencies: + ci-info "^3.1.1" + +is-core-module@^2.2.0, is-core-module@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" + integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5" + integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.0, is-glob@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-installed-globally@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-number-object@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb" + integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-observable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" + integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== + dependencies: + symbol-observable "^1.1.0" + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-promise@^2.1.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" + integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== + +is-regex@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" + integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== + dependencies: + call-bind "^1.0.2" + has-symbols "^1.0.2" + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +is-string@^1.0.5, is-string@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" + integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w== + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +lazy-ass@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" + integrity sha1-eZllXoZGwX8In90YfRUNMyTVRRM= + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +listr-silent-renderer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" + integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4= + +listr-update-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" + integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA== + dependencies: + chalk "^1.1.3" + cli-truncate "^0.2.1" + elegant-spinner "^1.0.1" + figures "^1.7.0" + indent-string "^3.0.0" + log-symbols "^1.0.2" + log-update "^2.3.0" + strip-ansi "^3.0.1" + +listr-verbose-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db" + integrity sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw== + dependencies: + chalk "^2.4.1" + cli-cursor "^2.1.0" + date-fns "^1.27.2" + figures "^2.0.0" + +listr@^0.14.3: + version "0.14.3" + resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" + integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA== + dependencies: + "@samverschueren/stream-to-observable" "^0.3.0" + is-observable "^1.1.0" + is-promise "^2.1.0" + is-stream "^1.1.0" + listr-silent-renderer "^1.1.1" + listr-update-renderer "^0.5.0" + listr-verbose-renderer "^0.5.0" + p-map "^2.0.0" + rxjs "^6.3.3" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.once@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + integrity sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg= + dependencies: + chalk "^1.0.0" + +log-symbols@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log-update@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" + integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= + dependencies: + ansi-escapes "^3.0.0" + cli-cursor "^2.0.0" + wrap-ansi "^3.0.1" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.2: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +mime-db@1.48.0: + version "1.48.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" + integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.31" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b" + integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg== + dependencies: + mime-db "1.48.0" + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-inspect@^1.10.3: + version "1.10.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369" + integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw== + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.entries@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.4.tgz#43ccf9a50bc5fd5b649d45ab1a579f24e088cafd" + integrity sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.2" + +object.values@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.4.tgz#0d273762833e816b693a637d30073e7051535b30" + integrity sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.2" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + integrity sha1-ofeDj4MUxRbwXs78vEzP4EtO14k= + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +ospath@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" + integrity sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs= + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picomatch@^2.2.1, picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + +pify@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= + dependencies: + find-up "^2.1.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.0.tgz#b6a5bf1284026ae640f17f7ff5658a7567fc0d18" + integrity sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w== + +pretty-bytes@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +ramda@~0.27.1: + version "0.27.1" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.1.tgz#66fc2df3ef873874ffc2da6aa8984658abacf5c9" + integrity sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw== + +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + dependencies: + find-up "^2.0.0" + read-pkg "^3.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +regexpp@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + +request-progress@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" + integrity sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4= + dependencies: + throttleit "^1.0.0" + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.10.0, resolve@^1.13.1, resolve@^1.20.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +restore-cursor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" + integrity sha1-NGYfRohjJ/7SmRR5FSJS35LapUE= + dependencies: + exit-hook "^1.0.0" + onetime "^1.0.0" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^6.3.3: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.2: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +"semver@2 || 3 || 4 || 5": + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^7.2.1, semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz#8a595135def9592bda69709474f1cbeea7c2467f" + integrity sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +symbol-observable@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== + +table@^6.0.9: + version "6.7.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" + integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== + dependencies: + ajv "^8.0.1" + lodash.clonedeep "^4.5.0" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.0" + strip-ansi "^6.0.0" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +throttleit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" + integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw= + +tmp@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tsconfig-paths@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" + integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + +tslib@^1.8.1, tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +typescript@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.2.tgz#399ab18aac45802d6f2498de5054fcbbe716a805" + integrity sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw== + +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" + integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo= + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" From a155f40f819fe939a0279dc998a054299a982384 Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Wed, 2 Jun 2021 13:54:27 +0900 Subject: [PATCH 02/35] =?UTF-8?q?feat:=20=EB=B2=84=ED=8A=BC=20=EB=88=84?= =?UTF-8?q?=EB=A5=BC=EC=8B=9C=20=EC=9D=B4=EB=A6=84=20=EB=A0=8C=EB=8D=94?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 - dist/css/index.css | 37 + dist/css/shared/button.css | 18 + dist/css/shared/layout.css | 108 +++ dist/css/shared/sizing.css | 4 + dist/css/shared/typhography.css | 15 + dist/css/ui/spinner.css | 29 + dist/js/index.js | 7 + dist/js/modules/Game.js | 17 + dist/js/modules/Race.js | 42 ++ docs/README.md | 17 + index.html | 33 +- package.json | 8 +- src/js/index.ts | 10 +- src/js/modules/Game.ts | 22 + src/js/modules/Race.ts | 46 ++ yarn.lock | 1172 ++++++++++++++++++++++++++++++- 17 files changed, 1534 insertions(+), 52 deletions(-) create mode 100644 dist/css/index.css create mode 100644 dist/css/shared/button.css create mode 100644 dist/css/shared/layout.css create mode 100644 dist/css/shared/sizing.css create mode 100644 dist/css/shared/typhography.css create mode 100644 dist/css/ui/spinner.css create mode 100644 dist/js/index.js create mode 100644 dist/js/modules/Game.js create mode 100644 dist/js/modules/Race.js create mode 100644 src/js/modules/Game.ts create mode 100644 src/js/modules/Race.ts diff --git a/.gitignore b/.gitignore index 882ea6b5d..ded4e8434 100644 --- a/.gitignore +++ b/.gitignore @@ -192,7 +192,6 @@ typings/ # Nuxt.js build / generate output .nuxt -dist # Gatsby files .cache/ diff --git a/dist/css/index.css b/dist/css/index.css new file mode 100644 index 000000000..4b1abf762 --- /dev/null +++ b/dist/css/index.css @@ -0,0 +1,37 @@ +@import './shared/button.css'; +@import './shared/layout.css'; +@import './shared/sizing.css'; +@import './shared/typhography.css'; +@import './ui/spinner.css'; + +html, +body { + margin: 0; + height: 100%; +} + +.car-player { + height: 36px; + min-width: 64px; + padding: 0 16px; + border-radius: 4px; + outline: 0; + border-style: none; + background-color: #f5f5f5; + display: inline-flex; + font-weight: bold; + align-items: center; + justify-content: center; + position: relative; +} + +.forward-icon { + font-size: 32px; + display: flex; + justify-content: center; +} + +fieldset { + border: none; + padding: 0; +} diff --git a/dist/css/shared/button.css b/dist/css/shared/button.css new file mode 100644 index 000000000..8ac62188f --- /dev/null +++ b/dist/css/shared/button.css @@ -0,0 +1,18 @@ +.btn { + height: 36px; + min-width: 64px; + padding: 0 16px; + border-radius: 4px; + outline: 0; + border-style: none; + cursor: pointer; +} + +.btn-cyan { + background-color: #00bcd4 !important; + border-color: #00bcd4 !important; +} + +.btn.btn-cyan:hover { + background-color: #018c9e !important; +} diff --git a/dist/css/shared/layout.css b/dist/css/shared/layout.css new file mode 100644 index 000000000..fd606258c --- /dev/null +++ b/dist/css/shared/layout.css @@ -0,0 +1,108 @@ +/* Layout - Position */ +.relative { + position: relative; +} + +.absolute { + position: absolute; +} + +.fixed { + position: fixed; +} + +/* Layout - Display */ +.d-flex { + display: flex; +} + +.d-block { + display: block; +} + +.d-inline { + display: inline; +} + +.d-inline-block { + display: inline-block; +} + +/* Layout - Top / Right / Bottom / Left */ + +.mt-2 { + margin-top: 8px; +} + +.mt-3 { + margin-top: 12px; +} + +.mt-4 { + margin-top: 16px; +} + +.mt-5 { + margin-top: 20px; +} + +.mr-2 { + margin-right: 8px; +} + +/* Box Alignment - Justify Content*/ +.justify-start { + justify-content: flex-start; +} +.justify-end { + justify-content: flex-end; +} +.justify-center { + justify-content: center; +} +.justify-between { + justify-content: space-between; +} +.justify-around { + justify-content: space-around; +} +.justify-evenly { + justify-content: space-evenly; +} + +/* Box Alignment - Align Items*/ +.items-start { + align-items: flex-start; +} +.items-end { + align-items: flex-end; +} +.items-center { + align-items: center; +} +.items-baseline { + align-items: baseline; +} +.items-stretch { + align-items: stretch; +} + +/* Box Alignment - Align Content*/ +.content-center { + align-content: center; +} +.content-start { + align-content: flex-start; +} +.content-end { + align-content: flex-end; +} +.content-between { + align-content: space-between; +} +.content-around { + align-content: space-around; +} +.content-evenly { + align-content: space-around; +} diff --git a/dist/css/shared/sizing.css b/dist/css/shared/sizing.css new file mode 100644 index 000000000..f54111a87 --- /dev/null +++ b/dist/css/shared/sizing.css @@ -0,0 +1,4 @@ +/* Sizing - Width */ +.w-100 { + width: 100%; +} diff --git a/dist/css/shared/typhography.css b/dist/css/shared/typhography.css new file mode 100644 index 000000000..2fd678db5 --- /dev/null +++ b/dist/css/shared/typhography.css @@ -0,0 +1,15 @@ +.text-left { + text-align: left; +} + +.text-center { + text-align: center; +} + +.text-right { + text-align: right; +} + +.text-justify { + text-align: justify; +} diff --git a/dist/css/ui/spinner.css b/dist/css/ui/spinner.css new file mode 100644 index 000000000..f3d4909b2 --- /dev/null +++ b/dist/css/ui/spinner.css @@ -0,0 +1,29 @@ +.spinner-container { + width: 25px; + height: 25px; +} + +.spinner::after { + content: ''; + box-sizing: border-box; + width: 25px; + height: 25px; + left: 0; + top: 0; + position: absolute; + border-radius: 50%; +} + +.spinner.material::after { + border-top: 4px solid rgba(0, 191, 215, 1); + border-left: 4px solid rgba(0, 191, 215, 1); + border-bottom: 4px solid rgba(0, 191, 215, 1); + border-right: 4px solid rgba(0, 191, 215, 0); + animation: spinner 0.6s linear infinite; +} + +@keyframes spinner { + to { + transform: rotate(360deg); + } +} diff --git a/dist/js/index.js b/dist/js/index.js new file mode 100644 index 000000000..4ef3f3103 --- /dev/null +++ b/dist/js/index.js @@ -0,0 +1,7 @@ +import Game from './modules/Game.js'; +export default function App() { + Game({ + $app: document.querySelector('#app') + }); +} +App(); diff --git a/dist/js/modules/Game.js b/dist/js/modules/Game.js new file mode 100644 index 000000000..c30eed3e9 --- /dev/null +++ b/dist/js/modules/Game.js @@ -0,0 +1,17 @@ +import Race from './Race.js'; +const Game = ({ $app }) => { + const carNameInputEvent = () => { + Race(); + }; + const render = () => { }; + const controller = () => { + const gameButton = document.getElementsByTagName('button'); + gameButton[0].addEventListener('click', () => carNameInputEvent()); + }; + const init = () => { + render(); + controller(); + }; + init(); +}; +export default Game; diff --git a/dist/js/modules/Race.js b/dist/js/modules/Race.js new file mode 100644 index 000000000..c06a81f8b --- /dev/null +++ b/dist/js/modules/Race.js @@ -0,0 +1,42 @@ +const carNamesSection = `
+
+
+
EAST
+
⬇️
+
⬇️️
+
+
+
WEST
+
⬇️️
+
+
+
SOUTH
+
+
+ +
+
+
+
+
NORTH
+
+
+ +
+
+
+
+
`; +const Race = () => { + const render = () => { + const sectionElement = document.getElementById('app'); + if (sectionElement) { + sectionElement.innerHTML += carNamesSection; + } + }; + const init = () => { + render(); + }; + init(); +}; +export default Race; diff --git a/docs/README.md b/docs/README.md index 9d007f823..8d578f60d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1 +1,18 @@ ## κΈ°λŠ₯ κ΅¬ν˜„ + +### 🎯step 1 + +- [ ] μ£Όμ–΄μ§„ 횟수 λ™μ•ˆ nλŒ€μ˜ μžλ™μ°¨λŠ” μ „μ§„ λ˜λŠ” 멈좜 수 μžˆλ‹€. +- [ ] μžλ™μ°¨μ— 이름을 λΆ€μ—¬ν•  수 μžˆλ‹€. μ „μ§„ν•˜λŠ” μžλ™μ°¨λ₯Ό 좜λ ₯ν•  λ•Œ μžλ™μ°¨ 이름을 같이 좜λ ₯ν•œλ‹€. +- [ ] μžλ™μ°¨ 이름은 μ‰Όν‘œ(,)λ₯Ό κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„ν•˜λ©° 이름은 5자 μ΄ν•˜λ§Œ κ°€λŠ₯ν•˜λ‹€. +- [ ] μ‚¬μš©μžλŠ” λͺ‡ 번의 이동을 ν•  것인지λ₯Ό μž…λ ₯ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€. +- [ ] μ „μ§„ν•˜λŠ” 쑰건은 0μ—μ„œ 9 μ‚¬μ΄μ—μ„œ random 값을 κ΅¬ν•œ ν›„ random 값이 4 이상일 경우 μ „μ§„ν•˜κ³ , 3 μ΄ν•˜μ˜ 값이면 λ©ˆμΆ˜λ‹€. +- [ ] μžλ™μ°¨ κ²½μ£Ό κ²Œμž„μ„ μ™„λ£Œν•œ ν›„ λˆ„κ°€ μš°μŠΉν–ˆλŠ”μ§€λ₯Ό μ•Œλ €μ€€λ‹€. μš°μŠΉμžλŠ” ν•œ λͺ… 이상일 수 μžˆλ‹€. +- [ ] μš°μŠΉμžκ°€ μ—¬λŸ¬λͺ…일 경우 ,λ₯Ό μ΄μš©ν•˜μ—¬ κ΅¬λΆ„ν•œλ‹€. + +### 🎯🎯 step 2 + +- [ ] μžλ™μ°¨ κ²½μ£Ό κ²Œμž„μ˜ 턴이 μ§„ν–‰ 될 λ•Œλ§ˆλ‹€ 1초의 ν…€(progressive μž¬μƒ)을 두고 μ§„ν–‰ν•œλ‹€. + - [ ] μ• λ‹ˆλ©”μ΄μ…˜ κ΅¬ν˜„μ„ μœ„ν•΄ setInterval, setTimeout, requestAnimationFrame 을 ν™œμš©ν•œλ‹€. +- [ ] μ •μƒμ μœΌλ‘œ κ²Œμž„μ˜ 턴이 λ‹€ λ™μž‘λœ ν›„μ—λŠ” κ²°κ³Όλ₯Ό 보여주고, 2초 후에 μΆ•ν•˜μ˜ alert λ©”μ„Έμ§€λ₯Ό λ„μš΄λ‹€. +- [ ] μœ„ κΈ°λŠ₯듀이 μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜λŠ”μ§€ Cypressλ₯Ό μ΄μš©ν•΄ ν…ŒμŠ€νŠΈν•œλ‹€. diff --git a/index.html b/index.html index 6533418f3..258532883 100644 --- a/index.html +++ b/index.html @@ -29,43 +29,14 @@

🏎️ μžλ™μ°¨ κ²½μ£Ό κ²Œμž„

-
-
-
-
EAST
-
⬇️️
-
⬇️️
-
-
-
WEST
-
⬇️️
-
-
-
SOUTH
-
-
- -
-
-
-
-
NORTH
-
-
- -
-
-
-
-
-
+ diff --git a/package.json b/package.json index 2a1fff62c..d3b1d9293 100644 --- a/package.json +++ b/package.json @@ -9,10 +9,10 @@ "cypress:open": "./node_modules/.bin/cypress open", "cypress:run": "./node_modules/.bin/cypress run", "tsc": "tsc", - "lint": "eslint ." + "lint": "eslint .", + "server": "./node_modules/.bin/live-server ." }, "devDependencies": { - "prettier": "^2.3.0", "@typescript-eslint/eslint-plugin": "^4.26.0", "@typescript-eslint/parser": "^4.26.0", "cypress": "^7.4.0", @@ -20,6 +20,8 @@ "eslint-config-airbnb-base": "^14.2.1", "eslint-plugin-cypress": "^2.11.3", "eslint-plugin-import": "^2.23.4", - "typescript": "^4.3.2" + "prettier": "^2.3.0", + "typescript": "^4.3.2", + "live-server": "^1.2.1" } } diff --git a/src/js/index.ts b/src/js/index.ts index ec10f3e9d..447529eba 100644 --- a/src/js/index.ts +++ b/src/js/index.ts @@ -1 +1,9 @@ -console.log('hi'); +import Game from './modules/Game.js'; + +export default function App(): void { + Game({ + $app: document.querySelector('#app') + }); +} + +App(); diff --git a/src/js/modules/Game.ts b/src/js/modules/Game.ts new file mode 100644 index 000000000..9eb09f939 --- /dev/null +++ b/src/js/modules/Game.ts @@ -0,0 +1,22 @@ +import Race from './Race.js'; + +const Game = ({ $app }: { $app: HTMLDivElement | null }): void => { + const carNameInputEvent = () => { + Race() + } + + const render = (): void => {}; + const controller = (): void => { + const gameButton: HTMLCollectionOf = document.getElementsByTagName('button'); + gameButton[0].addEventListener('click', ()=>carNameInputEvent()); + }; + + const init = (): void => { + render(); + controller(); + }; + + init(); +}; + +export default Game; diff --git a/src/js/modules/Race.ts b/src/js/modules/Race.ts new file mode 100644 index 000000000..aa21abde6 --- /dev/null +++ b/src/js/modules/Race.ts @@ -0,0 +1,46 @@ +const carNamesSection = `
+
+
+
EAST
+
⬇️
+
⬇️️
+
+
+
WEST
+
⬇️️
+
+
+
SOUTH
+
+
+ +
+
+
+
+
NORTH
+
+
+ +
+
+
+
+
`; + +const Race = (): void => { + const render = (): void => { + const sectionElement = document.getElementById('app'); + if (sectionElement) { + sectionElement.innerHTML += carNamesSection; + } + }; + + const init = (): void => { + render(); + }; + + init(); +}; + +export default Race; diff --git a/yarn.lock b/yarn.lock index 4de0632d8..5eb6b6561 100644 --- a/yarn.lock +++ b/yarn.lock @@ -217,6 +217,14 @@ "@typescript-eslint/types" "4.26.0" eslint-visitor-keys "^2.0.0" +accepts@~1.3.4: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + acorn-jsx@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" @@ -296,6 +304,26 @@ any-observable@^0.3.0: resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +apache-crypt@^1.1.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/apache-crypt/-/apache-crypt-1.2.4.tgz#fc0aacb7877d64d26420cadf923bcd53e79fb34e" + integrity sha512-Icze5ny5W5uv3xgMgl8U+iGmRCC0iIDrb2PVPuRBtL3Zy1Y5TMewXP1Vtc4r5X9eNNBEk7KYPu0Qby9m/PmcHg== + dependencies: + unix-crypt-td-js "^1.1.4" + +apache-md5@^1.0.6: + version "1.1.5" + resolved "https://registry.yarnpkg.com/apache-md5/-/apache-md5-1.1.5.tgz#5d6365ece2ccc32b612f886b2b292e1c96ff3ffb" + integrity sha512-sbLEIMQrkV7RkIruqTPXxeCMkAAycv4yzTkBzRgOR1BrR5UB7qZtupqxkersTJSf0HZ3sbaNRrNV80TnnM7cUw== + arch@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" @@ -308,6 +336,21 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + array-includes@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" @@ -324,6 +367,11 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + array.prototype.flat@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" @@ -345,11 +393,21 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + astral-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + async@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" @@ -365,6 +423,11 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -380,6 +443,31 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +basic-auth@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" + integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== + dependencies: + safe-buffer "5.1.2" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" @@ -387,6 +475,23 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +bcryptjs@^2.3.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" + integrity sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms= + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + blob-util@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" @@ -405,6 +510,22 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + braces@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -417,6 +538,21 @@ buffer-crc32@~0.2.3: resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + cachedir@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" @@ -473,11 +609,40 @@ check-more-types@^2.24.0: resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" integrity sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA= +chokidar@^2.0.4: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + ci-info@^3.1.1: version "3.2.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6" integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + cli-cursor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" @@ -515,6 +680,14 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -539,7 +712,7 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colors@^1.1.2: +colors@^1.1.2, colors@latest: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== @@ -561,6 +734,11 @@ common-tags@^1.8.0: resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -571,11 +749,34 @@ confusing-browser-globals@^1.0.10: resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz#30d1e7f3d1b882b25ec4933d1d1adac353d20a59" integrity sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA== -core-util-is@1.0.2: +connect@^3.6.6: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +cors@latest: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -647,6 +848,13 @@ dayjs@^1.10.4: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.5.tgz#5600df4548fc2453b3f163ebb2abbe965ccfb986" integrity sha512-BUFis41ikLz+65iH6LHQCDm4YPMj5r1YFLdupPIyM4SGcXMmtiLQ7U37i+hGS8urIuqe7I/ou3IS1jVc4nbN4g== +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + debug@4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" @@ -654,13 +862,6 @@ debug@4.3.2: dependencies: ms "2.1.2" -debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - debug@^3.1.0, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -675,6 +876,11 @@ debug@^4.0.1, debug@^4.1.1, debug@^4.3.1: dependencies: ms "2.1.2" +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + deep-is@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" @@ -687,11 +893,48 @@ define-properties@^1.1.3: dependencies: object-keys "^1.0.12" +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +depd@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -713,6 +956,11 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +duplexer@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -721,6 +969,11 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + elegant-spinner@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" @@ -731,6 +984,11 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -783,6 +1041,11 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -966,6 +1229,24 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +event-stream@3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + integrity sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE= + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + eventemitter2@^6.4.3: version "6.4.4" resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.4.tgz#aa96e8275c4dbeb017a5d0e03780c65612a1202b" @@ -998,11 +1279,53 @@ exit-hook@^1.0.0: resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g= +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + extract-zip@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" @@ -1058,6 +1381,13 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +faye-websocket@0.11.x: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" @@ -1087,6 +1417,21 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -1094,6 +1439,19 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +finalhandler@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -1114,6 +1472,11 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -1128,6 +1491,23 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from@~0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + integrity sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4= + fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" @@ -1143,6 +1523,14 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -1169,6 +1557,11 @@ get-stream@^5.0.0, get-stream@^5.1.0: dependencies: pump "^3.0.0" +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + getos@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" @@ -1183,6 +1576,14 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + glob-parent@^5.0.0, glob-parent@^5.1.0: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -1240,7 +1641,7 @@ globby@^11.0.3: merge2 "^1.3.0" slash "^3.0.0" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.6" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== @@ -1285,6 +1686,37 @@ has-symbols@^1.0.1, has-symbols@^1.0.2: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -1297,6 +1729,42 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== +http-auth@3.1.x: + version "3.1.3" + resolved "https://registry.yarnpkg.com/http-auth/-/http-auth-3.1.3.tgz#945cfadd66521eaf8f7c84913d377d7b15f24e31" + integrity sha1-lFz63WZSHq+PfISRPTd9exXyTjE= + dependencies: + apache-crypt "^1.1.2" + apache-md5 "^1.0.6" + bcryptjs "^2.3.0" + uuid "^3.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-parser-js@>=0.5.1: + version "0.5.3" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz#01d2709c79d41698bb01d4decc5e9da4e4a033d9" + integrity sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg== + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -1347,16 +1815,35 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2: +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + ini@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -1367,6 +1854,13 @@ is-bigint@^1.0.1: resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + is-boolean-object@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8" @@ -1374,6 +1868,11 @@ is-boolean-object@^1.1.0: dependencies: call-bind "^1.0.2" +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + is-callable@^1.1.4, is-callable@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" @@ -1393,12 +1892,56 @@ is-core-module@^2.2.0, is-core-module@^2.4.0: dependencies: has "^1.0.3" +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + is-date-object@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5" integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A== -is-extglob@^2.1.1: +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= @@ -1420,6 +1963,13 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + is-glob@^4.0.0, is-glob@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" @@ -1445,6 +1995,13 @@ is-number-object@^1.0.4: resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb" integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw== +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -1462,6 +2019,13 @@ is-path-inside@^3.0.2: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + is-promise@^2.1.0: version "2.2.2" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" @@ -1507,11 +2071,38 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -1591,6 +2182,30 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + lazy-ass@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" @@ -1648,6 +2263,25 @@ listr@^0.14.3: p-map "^2.0.0" rxjs "^6.3.3" +live-server@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/live-server/-/live-server-1.2.1.tgz#670630dd409d22fe9c513ab1c1894686c757153e" + integrity sha512-Yn2XCVjErTkqnM3FfTmM7/kWy3zP7+cEtC7x6u+wUzlQ+1UW3zEYbbyJrc0jNDwiMDZI0m4a0i3dxlGHVyXczw== + dependencies: + chokidar "^2.0.4" + colors latest + connect "^3.6.6" + cors latest + event-stream "3.3.4" + faye-websocket "0.11.x" + http-auth "3.1.x" + morgan "^1.9.1" + object-assign latest + opn latest + proxy-middleware latest + send latest + serve-index "^1.9.1" + load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" @@ -1722,6 +2356,23 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + integrity sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -1732,6 +2383,25 @@ merge2@^1.3.0: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + micromatch@^4.0.2: version "4.0.4" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" @@ -1745,13 +2415,18 @@ mime-db@1.48.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== -mime-types@^2.1.12, mime-types@~2.1.19: +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: version "2.1.31" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b" integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg== dependencies: mime-db "1.48.0" +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" @@ -1774,11 +2449,35 @@ minimist@^1.2.0, minimist@^1.2.5: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +morgan@^1.9.1: + version "1.10.0" + resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" + integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== + dependencies: + basic-auth "~2.0.1" + debug "2.6.9" + depd "~2.0.0" + on-finished "~2.3.0" + on-headers "~1.0.2" + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" @@ -1789,11 +2488,38 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +nan@^2.12.1: + version "2.14.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" + integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + normalize-package-data@^2.3.2: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -1804,6 +2530,18 @@ normalize-package-data@^2.3.2: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + npm-run-path@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -1821,11 +2559,20 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4.1.0: +object-assign@^4, object-assign@^4.1.0, object-assign@latest: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + object-inspect@^1.10.3: version "1.10.3" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369" @@ -1836,6 +2583,13 @@ object-keys@^1.0.12, object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + object.assign@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" @@ -1855,6 +2609,13 @@ object.entries@^1.1.2: define-properties "^1.1.3" es-abstract "^1.18.2" +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + object.values@^1.1.3: version "1.1.4" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.4.tgz#0d273762833e816b693a637d30073e7051535b30" @@ -1864,6 +2625,18 @@ object.values@^1.1.3: define-properties "^1.1.3" es-abstract "^1.18.2" +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -1890,6 +2663,13 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" +opn@latest: + version "6.0.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-6.0.0.tgz#3c5b0db676d5f97da1233d1ed42d182bc5a27d2d" + integrity sha512-I9PKfIZC+e4RXZ/qr1RhgyCnGgYX0UEIlXgWnCOVACIvFgaC9rz6Won7xbdhoHrd8IIhV7YEpHjreNUNkqCGkQ== + dependencies: + is-wsl "^1.1.0" + optionator@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" @@ -1946,6 +2726,21 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -1978,6 +2773,13 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + integrity sha1-/lo0sMvOErWqaitAPuLnO2AvFEU= + dependencies: + through "~2.3" + pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" @@ -2017,6 +2819,11 @@ pkg-up@^2.0.0: dependencies: find-up "^2.1.0" +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -2032,11 +2839,21 @@ pretty-bytes@^5.6.0: resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== +proxy-middleware@latest: + version "0.15.0" + resolved "https://registry.yarnpkg.com/proxy-middleware/-/proxy-middleware-0.15.0.tgz#a3fdf1befb730f951965872ac2f6074c61477a56" + integrity sha1-o/3xvvtzD5UZZYcqwvYHTGFHelY= + psl@^1.1.28: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" @@ -2080,6 +2897,11 @@ ramda@~0.27.1: resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.1.tgz#66fc2df3ef873874ffc2da6aa8984658abacf5c9" integrity sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw== +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" @@ -2097,11 +2919,56 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" +readable-stream@^2.0.2: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + regexpp@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + request-progress@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" @@ -2119,6 +2986,11 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + resolve@^1.10.0, resolve@^1.13.1, resolve@^1.20.0: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" @@ -2143,6 +3015,11 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -2169,11 +3046,23 @@ rxjs@^6.3.3: dependencies: tslib "^1.9.0" -safe-buffer@^5.0.1, safe-buffer@^5.1.2: +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.2: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -2191,6 +3080,58 @@ semver@^7.2.1, semver@^7.3.5: dependencies: lru-cache "^6.0.0" +send@latest: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -2227,6 +3168,57 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + spdx-correct@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" @@ -2253,6 +3245,20 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz#8a595135def9592bda69709474f1cbeea7c2467f" integrity sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ== +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + integrity sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8= + dependencies: + through "2" + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -2273,6 +3279,26 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + integrity sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ= + dependencies: + duplexer "~0.1.1" + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -2315,6 +3341,13 @@ string.prototype.trimstart@^1.0.4: call-bind "^1.0.2" define-properties "^1.1.3" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -2404,6 +3437,11 @@ throttleit@^1.0.0: resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw= +through@2, through@~2.3, through@~2.3.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + tmp@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" @@ -2411,6 +3449,21 @@ tmp@~0.2.1: dependencies: rimraf "^3.0.0" +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -2418,6 +3471,21 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" @@ -2492,16 +3560,49 @@ unbox-primitive@^1.0.1: has-symbols "^1.0.2" which-boxed-primitive "^1.0.2" +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== +unix-crypt-td-js@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/unix-crypt-td-js/-/unix-crypt-td-js-1.1.4.tgz#4912dfad1c8aeb7d20fa0a39e4c31918c1d5d5dd" + integrity sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw== + +unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + untildify@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -2509,6 +3610,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -2517,7 +3623,22 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" -uuid@^3.3.2: +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.0.0, uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== @@ -2535,6 +3656,11 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +vary@^1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -2544,6 +3670,20 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +websocket-driver@>=0.5.1: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" From 5b2e8163dbf14b61a87ab458e1d2c36bb2e3cd7b Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Wed, 2 Jun 2021 15:03:26 +0900 Subject: [PATCH 03/35] =?UTF-8?q?feat:=20=EC=9E=90=EB=8F=99=EC=B0=A8=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=9E=85=EB=A0=A5=EC=8B=9C=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=EC=97=90=20=EC=9D=B4=EB=A6=84=20=EB=A0=8C=EB=8D=94?= =?UTF-8?q?=EB=A7=81=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/js/modules/CarName.js | 74 +++++++++++++++++++++++++++++ dist/js/modules/CarNameComponent.js | 33 +++++++++++++ dist/js/modules/Game.js | 7 ++- dist/js/modules/Race.js | 43 +---------------- src/js/modules/CarNameComponent.ts | 41 ++++++++++++++++ src/js/modules/Game.ts | 7 ++- src/js/modules/Race.ts | 46 ------------------ 7 files changed, 159 insertions(+), 92 deletions(-) create mode 100644 dist/js/modules/CarName.js create mode 100644 dist/js/modules/CarNameComponent.js create mode 100644 src/js/modules/CarNameComponent.ts diff --git a/dist/js/modules/CarName.js b/dist/js/modules/CarName.js new file mode 100644 index 000000000..ce2a1252f --- /dev/null +++ b/dist/js/modules/CarName.js @@ -0,0 +1,74 @@ +const carNamesSection = (carNames) => { + return `
+
+
+
EAST
+
⬇️
+
⬇️️
+
+
+
WEST
+
⬇️️
+
+
+
SOUTH
+
+
+ +
+
+
+
+
NORTH
+
+
+ +
+
+
+
+
EAST
+
⬇️
+
⬇️️
+
+
+
WEST
+
⬇️️
+
+
+
SOUTH
+
+
+ +
+
+
+
+
NORTH
+
+
+ +
+
+
+
+
`; +}; +const carNameDiv = (carName) => `
+
${carName}
+
⬇️
+
⬇️️
+
`; +const CarName = ({ carName }) => { + const render = () => { + const sectionElement = document.getElementById('app'); + if (sectionElement) { + sectionElement.innerHTML += carNamesSection(''); + } + }; + const init = () => { + render(); + }; + init(); +}; +export default CarName; diff --git a/dist/js/modules/CarNameComponent.js b/dist/js/modules/CarNameComponent.js new file mode 100644 index 000000000..e22c7ef90 --- /dev/null +++ b/dist/js/modules/CarNameComponent.js @@ -0,0 +1,33 @@ +const carNamesSection = (carNames) => { + return `
+
+ ${carNames} +
+
`; +}; +const carNameDiv = (carName) => { + return `
+
${carName}
+
`; +}; +const CarNameComponent = ({ carNames }) => { + const checkCarNames = (carNameList) => carNameList.length === carNameList.filter(x => x.length <= 5).length; + const render = (JSX) => { + const sectionElement = document.getElementById('app'); + if (sectionElement) { + sectionElement.innerHTML += JSX; + } + }; + const init = (carNames) => { + const carNameList = carNames.split(',').map(x => x.trim()); + if (checkCarNames(carNameList)) { + render(carNamesSection(carNameList.map(carName => carNameDiv(carName)).join(''))); + } + }; + init(carNames); +}; +export default CarNameComponent; +//
⬇️️
+//
+// +//
diff --git a/dist/js/modules/Game.js b/dist/js/modules/Game.js index c30eed3e9..c85105795 100644 --- a/dist/js/modules/Game.js +++ b/dist/js/modules/Game.js @@ -1,7 +1,10 @@ -import Race from './Race.js'; +import CarNameComponent from './CarNameComponent.js'; const Game = ({ $app }) => { const carNameInputEvent = () => { - Race(); + const carNamesInput = document.querySelector('input[type="text"]'); + if (carNamesInput) { + CarNameComponent({ carNames: carNamesInput.value }); + } }; const render = () => { }; const controller = () => { diff --git a/dist/js/modules/Race.js b/dist/js/modules/Race.js index c06a81f8b..3918c74e4 100644 --- a/dist/js/modules/Race.js +++ b/dist/js/modules/Race.js @@ -1,42 +1 @@ -const carNamesSection = `
-
-
-
EAST
-
⬇️
-
⬇️️
-
-
-
WEST
-
⬇️️
-
-
-
SOUTH
-
-
- -
-
-
-
-
NORTH
-
-
- -
-
-
-
-
`; -const Race = () => { - const render = () => { - const sectionElement = document.getElementById('app'); - if (sectionElement) { - sectionElement.innerHTML += carNamesSection; - } - }; - const init = () => { - render(); - }; - init(); -}; -export default Race; +"use strict"; diff --git a/src/js/modules/CarNameComponent.ts b/src/js/modules/CarNameComponent.ts new file mode 100644 index 000000000..1fefe2dff --- /dev/null +++ b/src/js/modules/CarNameComponent.ts @@ -0,0 +1,41 @@ +const carNamesSection = (carNames: string): string => { + return `
+
+ ${carNames} +
+
`; +}; + +const carNameDiv = (carName: string): string => { + return `
+
${carName}
+
`; +}; + +const CarNameComponent = ({ carNames }: { carNames: string }): void => { + const checkCarNames = (carNameList: string[]) => + carNameList.length === carNameList.filter(x => x.length <= 5).length; + + const render = (JSX: string): void => { + const sectionElement = document.getElementById('app'); + if (sectionElement) { + sectionElement.innerHTML += JSX; + } + }; + + const init = (carNames: string): void => { + const carNameList: string[] = carNames.split(',').map(x=>x.trim()); + if (checkCarNames(carNameList)) { + render(carNamesSection(carNameList.map(carName => carNameDiv(carName)).join(''))); + } + }; + + init(carNames); +}; + +export default CarNameComponent; + +//
⬇️️
+//
+// +//
diff --git a/src/js/modules/Game.ts b/src/js/modules/Game.ts index 9eb09f939..514026c41 100644 --- a/src/js/modules/Game.ts +++ b/src/js/modules/Game.ts @@ -1,8 +1,11 @@ -import Race from './Race.js'; +import CarNameComponent from './CarNameComponent.js'; const Game = ({ $app }: { $app: HTMLDivElement | null }): void => { const carNameInputEvent = () => { - Race() + const carNamesInput = document.querySelector('input[type="text"]') as HTMLInputElement; + if (carNamesInput) { + CarNameComponent({carNames: carNamesInput.value}) + } } const render = (): void => {}; diff --git a/src/js/modules/Race.ts b/src/js/modules/Race.ts index aa21abde6..e69de29bb 100644 --- a/src/js/modules/Race.ts +++ b/src/js/modules/Race.ts @@ -1,46 +0,0 @@ -const carNamesSection = `
-
-
-
EAST
-
⬇️
-
⬇️️
-
-
-
WEST
-
⬇️️
-
-
-
SOUTH
-
-
- -
-
-
-
-
NORTH
-
-
- -
-
-
-
-
`; - -const Race = (): void => { - const render = (): void => { - const sectionElement = document.getElementById('app'); - if (sectionElement) { - sectionElement.innerHTML += carNamesSection; - } - }; - - const init = (): void => { - render(); - }; - - init(); -}; - -export default Race; From 104bb699c2d161d6d0fd47b7392d9c50de30ce09 Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Wed, 2 Jun 2021 15:26:53 +0900 Subject: [PATCH 04/35] =?UTF-8?q?bug:=20button=202=EA=B0=9C=EA=B0=80=20?= =?UTF-8?q?=ED=95=9C=EA=B0=9C=20=EB=88=8C=EB=A6=B0=20=ED=9B=84=20=EC=9E=91?= =?UTF-8?q?=EB=8F=99=EC=9D=84=20=EC=95=88=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/js/modules/CarNameComponent.js | 1 + dist/js/modules/Game.js | 11 +++++++++++ dist/js/modules/Race.js | 15 ++++++++++++++- docs/README.md | 4 ++++ src/js/modules/CarNameComponent.ts | 1 + src/js/modules/Game.ts | 25 ++++++++++++++++++++----- src/js/modules/Race.ts | 17 +++++++++++++++++ 7 files changed, 68 insertions(+), 6 deletions(-) diff --git a/dist/js/modules/CarNameComponent.js b/dist/js/modules/CarNameComponent.js index e22c7ef90..b85368f25 100644 --- a/dist/js/modules/CarNameComponent.js +++ b/dist/js/modules/CarNameComponent.js @@ -17,6 +17,7 @@ const CarNameComponent = ({ carNames }) => { if (sectionElement) { sectionElement.innerHTML += JSX; } + return; }; const init = (carNames) => { const carNameList = carNames.split(',').map(x => x.trim()); diff --git a/dist/js/modules/Game.js b/dist/js/modules/Game.js index c85105795..866b3d5de 100644 --- a/dist/js/modules/Game.js +++ b/dist/js/modules/Game.js @@ -6,10 +6,21 @@ const Game = ({ $app }) => { CarNameComponent({ carNames: carNamesInput.value }); } }; + const raceCountInputEvent = () => { + // const raceCountInput: HTMLInputElement = document.querySelector( + // 'input[type="number"]' + // ) as HTMLInputElement; + // console.log('hi'); + // if (raceCountInput) { + // Race({ count: Number(raceCountInput.value) }); + // } + console.log('hi2'); + }; const render = () => { }; const controller = () => { const gameButton = document.getElementsByTagName('button'); gameButton[0].addEventListener('click', () => carNameInputEvent()); + gameButton[1].addEventListener('click', () => raceCountInputEvent()); }; const init = () => { render(); diff --git a/dist/js/modules/Race.js b/dist/js/modules/Race.js index 3918c74e4..491acdb53 100644 --- a/dist/js/modules/Race.js +++ b/dist/js/modules/Race.js @@ -1 +1,14 @@ -"use strict"; +const Race = ({ count }) => { + const render = (JSX) => { + const sectionElement = document.getElementById('app'); + if (sectionElement) { + sectionElement.innerHTML += JSX; + } + }; + const init = (count) => { + console.log(count); + // render(''); + }; + init(count); +}; +export default Race; diff --git a/docs/README.md b/docs/README.md index 8d578f60d..5d1c6fa9d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,5 +1,9 @@ ## κΈ°λŠ₯ κ΅¬ν˜„ +- [x] μžλ™μ°¨ 이름 μž…λ ₯μ‹œ 화면에 이름 λ Œλ”λ§ + - [x] checkInput + - [x] render car names input + ### 🎯step 1 - [ ] μ£Όμ–΄μ§„ 횟수 λ™μ•ˆ nλŒ€μ˜ μžλ™μ°¨λŠ” μ „μ§„ λ˜λŠ” 멈좜 수 μžˆλ‹€. diff --git a/src/js/modules/CarNameComponent.ts b/src/js/modules/CarNameComponent.ts index 1fefe2dff..cf131d1fc 100644 --- a/src/js/modules/CarNameComponent.ts +++ b/src/js/modules/CarNameComponent.ts @@ -21,6 +21,7 @@ const CarNameComponent = ({ carNames }: { carNames: string }): void => { if (sectionElement) { sectionElement.innerHTML += JSX; } + return ; }; const init = (carNames: string): void => { diff --git a/src/js/modules/Game.ts b/src/js/modules/Game.ts index 514026c41..386f5329c 100644 --- a/src/js/modules/Game.ts +++ b/src/js/modules/Game.ts @@ -1,17 +1,32 @@ import CarNameComponent from './CarNameComponent.js'; +import Race from './Race.js'; const Game = ({ $app }: { $app: HTMLDivElement | null }): void => { const carNameInputEvent = () => { - const carNamesInput = document.querySelector('input[type="text"]') as HTMLInputElement; + const carNamesInput: HTMLInputElement = document.querySelector( + 'input[type="text"]' + ) as HTMLInputElement; if (carNamesInput) { - CarNameComponent({carNames: carNamesInput.value}) + CarNameComponent({ carNames: carNamesInput.value }); } - } + }; + const raceCountInputEvent = () => { + // const raceCountInput: HTMLInputElement = document.querySelector( + // 'input[type="number"]' + // ) as HTMLInputElement; + // console.log('hi'); + // if (raceCountInput) { + // Race({ count: Number(raceCountInput.value) }); + // } + console.log('hi2') + }; const render = (): void => {}; const controller = (): void => { - const gameButton: HTMLCollectionOf = document.getElementsByTagName('button'); - gameButton[0].addEventListener('click', ()=>carNameInputEvent()); + const gameButton: HTMLCollectionOf = + document.getElementsByTagName('button'); + gameButton[0].addEventListener('click', () => carNameInputEvent()); + gameButton[1].addEventListener('click', () => raceCountInputEvent()); }; const init = (): void => { diff --git a/src/js/modules/Race.ts b/src/js/modules/Race.ts index e69de29bb..c1570d5b7 100644 --- a/src/js/modules/Race.ts +++ b/src/js/modules/Race.ts @@ -0,0 +1,17 @@ +const Race = ({ count }: { count: number }): void => { + const render = (JSX: string): void => { + const sectionElement = document.getElementById('app'); + if (sectionElement) { + sectionElement.innerHTML += JSX; + } + }; + + const init = (count: number): void => { + console.log(count); + // render(''); + }; + + init(count); +}; + +export default Race; From 43f0526bebbf6aae093e5f84c0bd14d1b99c5cb1 Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Wed, 2 Jun 2021 17:10:11 +0900 Subject: [PATCH 05/35] fix: cause=> innerHTML destory eventlistener --- dist/js/modules/CarName.js | 74 ----------------------------- dist/js/modules/CarNameComponent.js | 3 +- dist/js/modules/Game.js | 7 +-- index.html | 18 +++++-- src/js/modules/CarNameComponent.ts | 3 +- src/js/modules/Game.ts | 13 ++--- 6 files changed, 29 insertions(+), 89 deletions(-) delete mode 100644 dist/js/modules/CarName.js diff --git a/dist/js/modules/CarName.js b/dist/js/modules/CarName.js deleted file mode 100644 index ce2a1252f..000000000 --- a/dist/js/modules/CarName.js +++ /dev/null @@ -1,74 +0,0 @@ -const carNamesSection = (carNames) => { - return `
-
-
-
EAST
-
⬇️
-
⬇️️
-
-
-
WEST
-
⬇️️
-
-
-
SOUTH
-
-
- -
-
-
-
-
NORTH
-
-
- -
-
-
-
-
EAST
-
⬇️
-
⬇️️
-
-
-
WEST
-
⬇️️
-
-
-
SOUTH
-
-
- -
-
-
-
-
NORTH
-
-
- -
-
-
-
-
`; -}; -const carNameDiv = (carName) => `
-
${carName}
-
⬇️
-
⬇️️
-
`; -const CarName = ({ carName }) => { - const render = () => { - const sectionElement = document.getElementById('app'); - if (sectionElement) { - sectionElement.innerHTML += carNamesSection(''); - } - }; - const init = () => { - render(); - }; - init(); -}; -export default CarName; diff --git a/dist/js/modules/CarNameComponent.js b/dist/js/modules/CarNameComponent.js index b85368f25..d93f054b6 100644 --- a/dist/js/modules/CarNameComponent.js +++ b/dist/js/modules/CarNameComponent.js @@ -15,7 +15,8 @@ const CarNameComponent = ({ carNames }) => { const render = (JSX) => { const sectionElement = document.getElementById('app'); if (sectionElement) { - sectionElement.innerHTML += JSX; + sectionElement.insertAdjacentHTML('beforeend', JSX); + // sectionElement.innerHTML += JSX; } return; }; diff --git a/dist/js/modules/Game.js b/dist/js/modules/Game.js index 866b3d5de..953ee4aa9 100644 --- a/dist/js/modules/Game.js +++ b/dist/js/modules/Game.js @@ -1,10 +1,11 @@ import CarNameComponent from './CarNameComponent.js'; const Game = ({ $app }) => { const carNameInputEvent = () => { - const carNamesInput = document.querySelector('input[type="text"]'); + const carNamesInput = document.getElementById('car-name-input'); if (carNamesInput) { CarNameComponent({ carNames: carNamesInput.value }); } + console.log('hi'); }; const raceCountInputEvent = () => { // const raceCountInput: HTMLInputElement = document.querySelector( @@ -19,8 +20,8 @@ const Game = ({ $app }) => { const render = () => { }; const controller = () => { const gameButton = document.getElementsByTagName('button'); - gameButton[0].addEventListener('click', () => carNameInputEvent()); - gameButton[1].addEventListener('click', () => raceCountInputEvent()); + gameButton[0].onclick = carNameInputEvent; + gameButton[1].onclick = raceCountInputEvent; }; const init = () => { render(); diff --git a/index.html b/index.html index 258532883..46f4f25e4 100644 --- a/index.html +++ b/index.html @@ -16,15 +16,25 @@

🏎️ μžλ™μ°¨ κ²½μ£Ό κ²Œμž„

μ˜ˆμ‹œ) EAST, WEST, SOUTH, NORTH

- - + +

μ‹œλ„ν•  횟수λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.

- - + +
diff --git a/src/js/modules/CarNameComponent.ts b/src/js/modules/CarNameComponent.ts index cf131d1fc..fc53f3c3f 100644 --- a/src/js/modules/CarNameComponent.ts +++ b/src/js/modules/CarNameComponent.ts @@ -19,7 +19,8 @@ const CarNameComponent = ({ carNames }: { carNames: string }): void => { const render = (JSX: string): void => { const sectionElement = document.getElementById('app'); if (sectionElement) { - sectionElement.innerHTML += JSX; + sectionElement.insertAdjacentHTML('beforeend', JSX); + // sectionElement.innerHTML += JSX; } return ; }; diff --git a/src/js/modules/Game.ts b/src/js/modules/Game.ts index 386f5329c..2789fd771 100644 --- a/src/js/modules/Game.ts +++ b/src/js/modules/Game.ts @@ -2,13 +2,14 @@ import CarNameComponent from './CarNameComponent.js'; import Race from './Race.js'; const Game = ({ $app }: { $app: HTMLDivElement | null }): void => { - const carNameInputEvent = () => { - const carNamesInput: HTMLInputElement = document.querySelector( - 'input[type="text"]' + const carNameInputEvent = (): void => { + const carNamesInput: HTMLInputElement = document.getElementById( + 'car-name-input' ) as HTMLInputElement; if (carNamesInput) { CarNameComponent({ carNames: carNamesInput.value }); } + console.log('hi'); }; const raceCountInputEvent = () => { // const raceCountInput: HTMLInputElement = document.querySelector( @@ -18,15 +19,15 @@ const Game = ({ $app }: { $app: HTMLDivElement | null }): void => { // if (raceCountInput) { // Race({ count: Number(raceCountInput.value) }); // } - console.log('hi2') + console.log('hi2'); }; const render = (): void => {}; const controller = (): void => { const gameButton: HTMLCollectionOf = document.getElementsByTagName('button'); - gameButton[0].addEventListener('click', () => carNameInputEvent()); - gameButton[1].addEventListener('click', () => raceCountInputEvent()); + gameButton[0].onclick = carNameInputEvent; + gameButton[1].onclick = raceCountInputEvent; }; const init = (): void => { From c495959ee6bb52425e1764129845d3903352419b Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Wed, 2 Jun 2021 19:50:49 +0900 Subject: [PATCH 06/35] feat: add Winner --- .prettierc.json => .prettierrc | 0 dist/js/modules/CarNameComponent.js | 3 +- dist/js/modules/Game.js | 16 ++++--- dist/js/modules/Race.js | 46 ++++++++++++++++---- dist/js/modules/Winner.js | 34 +++++++++++++++ dist/js/modules/utils.js | 13 ++++++ index.html | 8 ---- src/js/modules/CarNameComponent.ts | 3 +- src/js/modules/Game.ts | 20 ++++----- src/js/modules/Race.ts | 65 +++++++++++++++++++++++++---- src/js/modules/Winner.ts | 41 ++++++++++++++++++ src/js/modules/utils.ts | 19 +++++++++ tsconfig.json | 2 +- 13 files changed, 222 insertions(+), 48 deletions(-) rename .prettierc.json => .prettierrc (100%) create mode 100644 dist/js/modules/Winner.js create mode 100644 dist/js/modules/utils.js create mode 100644 src/js/modules/Winner.ts create mode 100644 src/js/modules/utils.ts diff --git a/.prettierc.json b/.prettierrc similarity index 100% rename from .prettierc.json rename to .prettierrc diff --git a/dist/js/modules/CarNameComponent.js b/dist/js/modules/CarNameComponent.js index d93f054b6..345357040 100644 --- a/dist/js/modules/CarNameComponent.js +++ b/dist/js/modules/CarNameComponent.js @@ -11,12 +11,11 @@ const carNameDiv = (carName) => { `; }; const CarNameComponent = ({ carNames }) => { - const checkCarNames = (carNameList) => carNameList.length === carNameList.filter(x => x.length <= 5).length; + const checkCarNames = (carNameList) => carNameList.length === carNameList.filter(x => x.length <= 5 && x !== '').length; const render = (JSX) => { const sectionElement = document.getElementById('app'); if (sectionElement) { sectionElement.insertAdjacentHTML('beforeend', JSX); - // sectionElement.innerHTML += JSX; } return; }; diff --git a/dist/js/modules/Game.js b/dist/js/modules/Game.js index 953ee4aa9..9a80fd728 100644 --- a/dist/js/modules/Game.js +++ b/dist/js/modules/Game.js @@ -1,21 +1,19 @@ import CarNameComponent from './CarNameComponent.js'; +import Race from './Race.js'; +import Winner from './Winner.js'; const Game = ({ $app }) => { const carNameInputEvent = () => { const carNamesInput = document.getElementById('car-name-input'); if (carNamesInput) { CarNameComponent({ carNames: carNamesInput.value }); } - console.log('hi'); }; const raceCountInputEvent = () => { - // const raceCountInput: HTMLInputElement = document.querySelector( - // 'input[type="number"]' - // ) as HTMLInputElement; - // console.log('hi'); - // if (raceCountInput) { - // Race({ count: Number(raceCountInput.value) }); - // } - console.log('hi2'); + const raceCountInput = document.querySelector('input[type="number"]'); + if (raceCountInput) { + const result = Race({ count: Number(raceCountInput.value) }); + Winner({ cars: result }); + } }; const render = () => { }; const controller = () => { diff --git a/dist/js/modules/Race.js b/dist/js/modules/Race.js index 491acdb53..0080b367e 100644 --- a/dist/js/modules/Race.js +++ b/dist/js/modules/Race.js @@ -1,14 +1,46 @@ +import { Car, getRandomSingleDigit } from './utils.js'; const Race = ({ count }) => { - const render = (JSX) => { - const sectionElement = document.getElementById('app'); - if (sectionElement) { - sectionElement.innerHTML += JSX; + const checkValidCount = (count) => { + return count - Math.floor(count) === 0 && count > 0; + }; + function getInputCarsName() { + const carNameInput = document.getElementById('car-name-input'); + return carNameInput.value.split(',').map((x) => x.trim()); + } + function assignCarsName() { + const cars = []; + const inputCarNames = getInputCarsName(); + inputCarNames.forEach((name) => { + cars.push(new Car(name)); + }); + return cars; + } + const render = ({ cars, count }) => { + const carPlayer = document.getElementsByClassName('car-player'); + let tryCount = count; + while (tryCount > 0) { + for (let i = 0; i < carPlayer.length; i += 1) { + if (getRandomSingleDigit(0, 9) >= 4) { + cars[i].move(); + carPlayer[i].insertAdjacentHTML('afterend', '
⬇️️
'); + } + } + tryCount -= 1; } + return cars; }; const init = (count) => { - console.log(count); - // render(''); + if (!checkValidCount(count)) { + alert(`μœ νš¨ν•˜μ§€ μ•Šμ€ μž…λ ₯μž…λ‹ˆλ‹€. μž¬μž…λ ₯ ν•΄μ£Όμ„Έμš”.`); + const racingCountInput = document.getElementById('racing-count-input'); + racingCountInput.value = ''; + } + return render({ cars: assignCarsName(), count }); }; - init(count); + return init(count); }; export default Race; +//
⬇️️
+//
+// +//
diff --git a/dist/js/modules/Winner.js b/dist/js/modules/Winner.js new file mode 100644 index 000000000..1ccbd0fe8 --- /dev/null +++ b/dist/js/modules/Winner.js @@ -0,0 +1,34 @@ +const winnerSection = (winner) => { + return `
+
+

πŸ† μ΅œμ’… 우승자: ${winner} πŸ†

+
+ +
+
+
`; +}; +const Winner = ({ cars }) => { + const findWinners = (cars) => { + const totalDistances = cars.map((car) => car.distance); + const maxDistance = Math.max(...totalDistances); + return cars + .filter((car) => { + return car.distance === maxDistance; + }) + .map((winner) => winner.name); + }; + const render = ({ result }) => { + const sectionElement = document.getElementById('app'); + if (sectionElement) { + sectionElement.insertAdjacentHTML('beforeend', result); + } + return; + }; + const init = ({ cars }) => { + const result = winnerSection(findWinners(cars).join(', ')); + render({ result }); + }; + return init({ cars }); +}; +export default Winner; diff --git a/dist/js/modules/utils.js b/dist/js/modules/utils.js new file mode 100644 index 000000000..038eb9679 --- /dev/null +++ b/dist/js/modules/utils.js @@ -0,0 +1,13 @@ +class Car { + constructor(name) { + this.name = name; + this.distance = 0; + } + move() { + this.distance += 1; + } +} +const getRandomSingleDigit = (min, max) => { + return Math.floor(Math.random() * (max + 1 - min)) + min; +}; +export { Car, getRandomSingleDigit }; diff --git a/index.html b/index.html index 46f4f25e4..52cdb0005 100644 --- a/index.html +++ b/index.html @@ -39,14 +39,6 @@

🏎️ μžλ™μ°¨ κ²½μ£Ό κ²Œμž„

- diff --git a/src/js/modules/CarNameComponent.ts b/src/js/modules/CarNameComponent.ts index fc53f3c3f..5c2aa3fc4 100644 --- a/src/js/modules/CarNameComponent.ts +++ b/src/js/modules/CarNameComponent.ts @@ -14,13 +14,12 @@ const carNameDiv = (carName: string): string => { const CarNameComponent = ({ carNames }: { carNames: string }): void => { const checkCarNames = (carNameList: string[]) => - carNameList.length === carNameList.filter(x => x.length <= 5).length; + carNameList.length === carNameList.filter(x => x.length <= 5 && x !== '').length; const render = (JSX: string): void => { const sectionElement = document.getElementById('app'); if (sectionElement) { sectionElement.insertAdjacentHTML('beforeend', JSX); - // sectionElement.innerHTML += JSX; } return ; }; diff --git a/src/js/modules/Game.ts b/src/js/modules/Game.ts index 2789fd771..5a7f04681 100644 --- a/src/js/modules/Game.ts +++ b/src/js/modules/Game.ts @@ -1,25 +1,25 @@ import CarNameComponent from './CarNameComponent.js'; import Race from './Race.js'; +import Winner from './Winner.js'; const Game = ({ $app }: { $app: HTMLDivElement | null }): void => { const carNameInputEvent = (): void => { const carNamesInput: HTMLInputElement = document.getElementById( - 'car-name-input' + 'car-name-input', ) as HTMLInputElement; if (carNamesInput) { CarNameComponent({ carNames: carNamesInput.value }); } - console.log('hi'); }; const raceCountInputEvent = () => { - // const raceCountInput: HTMLInputElement = document.querySelector( - // 'input[type="number"]' - // ) as HTMLInputElement; - // console.log('hi'); - // if (raceCountInput) { - // Race({ count: Number(raceCountInput.value) }); - // } - console.log('hi2'); + const raceCountInput: HTMLInputElement = document.querySelector( + 'input[type="number"]', + ) as HTMLInputElement; + + if (raceCountInput) { + const result = Race({ count: Number(raceCountInput.value) }); + Winner({ cars: result }); + } }; const render = (): void => {}; diff --git a/src/js/modules/Race.ts b/src/js/modules/Race.ts index c1570d5b7..a0cfac5d5 100644 --- a/src/js/modules/Race.ts +++ b/src/js/modules/Race.ts @@ -1,17 +1,64 @@ -const Race = ({ count }: { count: number }): void => { - const render = (JSX: string): void => { - const sectionElement = document.getElementById('app'); - if (sectionElement) { - sectionElement.innerHTML += JSX; +import { Car, getRandomSingleDigit } from './utils.js'; + +const Race = ({ count }: { count: number }): Car[] => { + const checkValidCount = (count: number): boolean => { + return count - Math.floor(count) === 0 && count > 0; + }; + function getInputCarsName(): string[] { + const carNameInput = document.getElementById( + 'car-name-input', + ) as HTMLInputElement; + return carNameInput.value.split(',').map((x) => x.trim()); + } + + function assignCarsName(): Car[] { + const cars: Car[] = []; + const inputCarNames = getInputCarsName(); + inputCarNames.forEach((name) => { + cars.push(new Car(name)); + }); + return cars; + } + + const render = ({ cars, count }: { cars: Car[]; count: number }): Car[] => { + const carPlayer: HTMLCollectionOf = + document.getElementsByClassName( + 'car-player', + ) as HTMLCollectionOf; + let tryCount: number = count; + + while (tryCount > 0) { + for (let i = 0; i < carPlayer.length; i += 1) { + if (getRandomSingleDigit(0, 9) >= 4) { + cars[i].move(); + carPlayer[i].insertAdjacentHTML( + 'afterend', + '
⬇️️
', + ); + } + } + tryCount -= 1; } + return cars; }; - const init = (count: number): void => { - console.log(count); - // render(''); + const init = (count: number): Car[] => { + if (!checkValidCount(count)) { + alert(`μœ νš¨ν•˜μ§€ μ•Šμ€ μž…λ ₯μž…λ‹ˆλ‹€. μž¬μž…λ ₯ ν•΄μ£Όμ„Έμš”.`); + const racingCountInput = document.getElementById( + 'racing-count-input', + ) as HTMLInputElement; + racingCountInput.value = ''; + } + return render({ cars: assignCarsName(), count }); }; - init(count); + return init(count); }; export default Race; + +//
⬇️️
+//
+// +//
diff --git a/src/js/modules/Winner.ts b/src/js/modules/Winner.ts new file mode 100644 index 000000000..c6a57fabe --- /dev/null +++ b/src/js/modules/Winner.ts @@ -0,0 +1,41 @@ +import { Car } from './utils.js'; + +const winnerSection = (winner: string): string => { + return `
+
+

πŸ† μ΅œμ’… 우승자: ${winner} πŸ†

+
+ +
+
+
`; +}; + +const Winner = ({ cars }: { cars: Car[] }): void => { + const findWinners = (cars: Car[]): string[] => { + const totalDistances = cars.map((car) => car.distance); + const maxDistance = Math.max(...totalDistances); + return cars + .filter((car) => { + return car.distance === maxDistance; + }) + .map((winner) => winner.name); + }; + + const render = ({ result }: { result: string }): void => { + const sectionElement = document.getElementById('app'); + if (sectionElement) { + sectionElement.insertAdjacentHTML('beforeend', result); + } + return; + }; + + const init = ({ cars }: { cars: Car[] }): void => { + const result: string = winnerSection(findWinners(cars).join(', ')); + render({ result }); + }; + + return init({ cars }); +}; + +export default Winner; diff --git a/src/js/modules/utils.ts b/src/js/modules/utils.ts new file mode 100644 index 000000000..f99ba1996 --- /dev/null +++ b/src/js/modules/utils.ts @@ -0,0 +1,19 @@ +class Car { + name: string; + distance: number; + + constructor(name: string) { + this.name = name; + this.distance = 0; + } + + move(): void { + this.distance += 1; + } +} + +const getRandomSingleDigit = (min: number, max: number): number => { + return Math.floor(Math.random() * (max + 1 - min)) + min; +}; + +export { Car, getRandomSingleDigit }; diff --git a/tsconfig.json b/tsconfig.json index d0aa8f4af..5ea0d92a9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,7 +12,7 @@ // "incremental": true, /* Enable incremental compilation */ "target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */ // "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ - "lib": ["dom","es6", "es2017"], /* Specify library files to be included in the compilation. */ + "lib": ["dom","es6", "es2017","DOM", "DOM.Iterable"], // "allowJs": true, /* Allow javascript files to be compiled. */ // "checkJs": true, /* Report errors in .js files. */ // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */ From 02beb8c1105041ad9a60aa866361927571c5f566 Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Wed, 2 Jun 2021 19:56:29 +0900 Subject: [PATCH 07/35] refactor: to winner and component --- dist/js/modules/CarNameComponent.js | 4 ++-- dist/js/modules/Game.js | 4 ++-- dist/js/modules/Winner.js | 4 ++-- src/js/modules/CarNameComponent.ts | 4 ++-- src/js/modules/Game.ts | 4 ++-- src/js/modules/Winner.ts | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/dist/js/modules/CarNameComponent.js b/dist/js/modules/CarNameComponent.js index 345357040..de0ce2137 100644 --- a/dist/js/modules/CarNameComponent.js +++ b/dist/js/modules/CarNameComponent.js @@ -10,10 +10,10 @@ const carNameDiv = (carName) => {
${carName}
`; }; -const CarNameComponent = ({ carNames }) => { +const CarNameComponent = ({ $app, carNames }) => { const checkCarNames = (carNameList) => carNameList.length === carNameList.filter(x => x.length <= 5 && x !== '').length; const render = (JSX) => { - const sectionElement = document.getElementById('app'); + const sectionElement = $app; if (sectionElement) { sectionElement.insertAdjacentHTML('beforeend', JSX); } diff --git a/dist/js/modules/Game.js b/dist/js/modules/Game.js index 9a80fd728..db60c0f44 100644 --- a/dist/js/modules/Game.js +++ b/dist/js/modules/Game.js @@ -5,14 +5,14 @@ const Game = ({ $app }) => { const carNameInputEvent = () => { const carNamesInput = document.getElementById('car-name-input'); if (carNamesInput) { - CarNameComponent({ carNames: carNamesInput.value }); + CarNameComponent({ $app, carNames: carNamesInput.value }); } }; const raceCountInputEvent = () => { const raceCountInput = document.querySelector('input[type="number"]'); if (raceCountInput) { const result = Race({ count: Number(raceCountInput.value) }); - Winner({ cars: result }); + Winner({ $app, cars: result }); } }; const render = () => { }; diff --git a/dist/js/modules/Winner.js b/dist/js/modules/Winner.js index 1ccbd0fe8..635892ffc 100644 --- a/dist/js/modules/Winner.js +++ b/dist/js/modules/Winner.js @@ -8,7 +8,7 @@ const winnerSection = (winner) => { `; }; -const Winner = ({ cars }) => { +const Winner = ({ $app, cars }) => { const findWinners = (cars) => { const totalDistances = cars.map((car) => car.distance); const maxDistance = Math.max(...totalDistances); @@ -19,7 +19,7 @@ const Winner = ({ cars }) => { .map((winner) => winner.name); }; const render = ({ result }) => { - const sectionElement = document.getElementById('app'); + const sectionElement = $app; if (sectionElement) { sectionElement.insertAdjacentHTML('beforeend', result); } diff --git a/src/js/modules/CarNameComponent.ts b/src/js/modules/CarNameComponent.ts index 5c2aa3fc4..77b0a8f24 100644 --- a/src/js/modules/CarNameComponent.ts +++ b/src/js/modules/CarNameComponent.ts @@ -12,12 +12,12 @@ const carNameDiv = (carName: string): string => { `; }; -const CarNameComponent = ({ carNames }: { carNames: string }): void => { +const CarNameComponent = ({ $app, carNames }: { $app: HTMLDivElement | null, carNames: string }): void => { const checkCarNames = (carNameList: string[]) => carNameList.length === carNameList.filter(x => x.length <= 5 && x !== '').length; const render = (JSX: string): void => { - const sectionElement = document.getElementById('app'); + const sectionElement = $app; if (sectionElement) { sectionElement.insertAdjacentHTML('beforeend', JSX); } diff --git a/src/js/modules/Game.ts b/src/js/modules/Game.ts index 5a7f04681..082f31f65 100644 --- a/src/js/modules/Game.ts +++ b/src/js/modules/Game.ts @@ -8,7 +8,7 @@ const Game = ({ $app }: { $app: HTMLDivElement | null }): void => { 'car-name-input', ) as HTMLInputElement; if (carNamesInput) { - CarNameComponent({ carNames: carNamesInput.value }); + CarNameComponent({ $app, carNames: carNamesInput.value }); } }; const raceCountInputEvent = () => { @@ -18,7 +18,7 @@ const Game = ({ $app }: { $app: HTMLDivElement | null }): void => { if (raceCountInput) { const result = Race({ count: Number(raceCountInput.value) }); - Winner({ cars: result }); + Winner({ $app, cars: result }); } }; diff --git a/src/js/modules/Winner.ts b/src/js/modules/Winner.ts index c6a57fabe..779d3304b 100644 --- a/src/js/modules/Winner.ts +++ b/src/js/modules/Winner.ts @@ -11,7 +11,7 @@ const winnerSection = (winner: string): string => { `; }; -const Winner = ({ cars }: { cars: Car[] }): void => { +const Winner = ({ $app, cars }: { $app: HTMLDivElement | null, cars: Car[] }): void => { const findWinners = (cars: Car[]): string[] => { const totalDistances = cars.map((car) => car.distance); const maxDistance = Math.max(...totalDistances); @@ -23,7 +23,7 @@ const Winner = ({ cars }: { cars: Car[] }): void => { }; const render = ({ result }: { result: string }): void => { - const sectionElement = document.getElementById('app'); + const sectionElement = $app; if (sectionElement) { sectionElement.insertAdjacentHTML('beforeend', result); } From f36b018804cc7405c00e2a339bf6a8642dd3107e Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Wed, 2 Jun 2021 19:58:54 +0900 Subject: [PATCH 08/35] refactor: naming component --- dist/js/modules/CarName.js | 34 +++++++++++++++++++ dist/js/modules/Game.js | 10 +++--- dist/js/modules/Race.js | 4 +-- dist/js/modules/Winner.js | 4 +-- .../{CarNameComponent.ts => CarName.ts} | 0 src/js/modules/Game.ts | 10 +++--- src/js/modules/Race.ts | 4 +-- src/js/modules/Winner.ts | 4 +-- 8 files changed, 52 insertions(+), 18 deletions(-) create mode 100644 dist/js/modules/CarName.js rename src/js/modules/{CarNameComponent.ts => CarName.ts} (100%) diff --git a/dist/js/modules/CarName.js b/dist/js/modules/CarName.js new file mode 100644 index 000000000..de0ce2137 --- /dev/null +++ b/dist/js/modules/CarName.js @@ -0,0 +1,34 @@ +const carNamesSection = (carNames) => { + return `
+
+ ${carNames} +
+
`; +}; +const carNameDiv = (carName) => { + return `
+
${carName}
+
`; +}; +const CarNameComponent = ({ $app, carNames }) => { + const checkCarNames = (carNameList) => carNameList.length === carNameList.filter(x => x.length <= 5 && x !== '').length; + const render = (JSX) => { + const sectionElement = $app; + if (sectionElement) { + sectionElement.insertAdjacentHTML('beforeend', JSX); + } + return; + }; + const init = (carNames) => { + const carNameList = carNames.split(',').map(x => x.trim()); + if (checkCarNames(carNameList)) { + render(carNamesSection(carNameList.map(carName => carNameDiv(carName)).join(''))); + } + }; + init(carNames); +}; +export default CarNameComponent; +//
⬇️️
+//
+// +//
diff --git a/dist/js/modules/Game.js b/dist/js/modules/Game.js index db60c0f44..7881fcdfe 100644 --- a/dist/js/modules/Game.js +++ b/dist/js/modules/Game.js @@ -1,6 +1,6 @@ -import CarNameComponent from './CarNameComponent.js'; -import Race from './Race.js'; -import Winner from './Winner.js'; +import CarNameComponent from './CarName.js'; +import RaceComponent from './Race.js'; +import WinnerComponent from './Winner.js'; const Game = ({ $app }) => { const carNameInputEvent = () => { const carNamesInput = document.getElementById('car-name-input'); @@ -11,8 +11,8 @@ const Game = ({ $app }) => { const raceCountInputEvent = () => { const raceCountInput = document.querySelector('input[type="number"]'); if (raceCountInput) { - const result = Race({ count: Number(raceCountInput.value) }); - Winner({ $app, cars: result }); + const result = RaceComponent({ count: Number(raceCountInput.value) }); + WinnerComponent({ $app, cars: result }); } }; const render = () => { }; diff --git a/dist/js/modules/Race.js b/dist/js/modules/Race.js index 0080b367e..25ae58fc4 100644 --- a/dist/js/modules/Race.js +++ b/dist/js/modules/Race.js @@ -1,5 +1,5 @@ import { Car, getRandomSingleDigit } from './utils.js'; -const Race = ({ count }) => { +const RaceComponent = ({ count }) => { const checkValidCount = (count) => { return count - Math.floor(count) === 0 && count > 0; }; @@ -39,7 +39,7 @@ const Race = ({ count }) => { }; return init(count); }; -export default Race; +export default RaceComponent; //
⬇️️
//
// diff --git a/dist/js/modules/Winner.js b/dist/js/modules/Winner.js index 635892ffc..a34fb3189 100644 --- a/dist/js/modules/Winner.js +++ b/dist/js/modules/Winner.js @@ -8,7 +8,7 @@ const winnerSection = (winner) => {
`; }; -const Winner = ({ $app, cars }) => { +const WinnerComponent = ({ $app, cars }) => { const findWinners = (cars) => { const totalDistances = cars.map((car) => car.distance); const maxDistance = Math.max(...totalDistances); @@ -31,4 +31,4 @@ const Winner = ({ $app, cars }) => { }; return init({ cars }); }; -export default Winner; +export default WinnerComponent; diff --git a/src/js/modules/CarNameComponent.ts b/src/js/modules/CarName.ts similarity index 100% rename from src/js/modules/CarNameComponent.ts rename to src/js/modules/CarName.ts diff --git a/src/js/modules/Game.ts b/src/js/modules/Game.ts index 082f31f65..df2c7880e 100644 --- a/src/js/modules/Game.ts +++ b/src/js/modules/Game.ts @@ -1,6 +1,6 @@ -import CarNameComponent from './CarNameComponent.js'; -import Race from './Race.js'; -import Winner from './Winner.js'; +import CarNameComponent from './CarName.js'; +import RaceComponent from './Race.js'; +import WinnerComponent from './Winner.js'; const Game = ({ $app }: { $app: HTMLDivElement | null }): void => { const carNameInputEvent = (): void => { @@ -17,8 +17,8 @@ const Game = ({ $app }: { $app: HTMLDivElement | null }): void => { ) as HTMLInputElement; if (raceCountInput) { - const result = Race({ count: Number(raceCountInput.value) }); - Winner({ $app, cars: result }); + const result = RaceComponent({ count: Number(raceCountInput.value) }); + WinnerComponent({ $app, cars: result }); } }; diff --git a/src/js/modules/Race.ts b/src/js/modules/Race.ts index a0cfac5d5..f2af5500c 100644 --- a/src/js/modules/Race.ts +++ b/src/js/modules/Race.ts @@ -1,6 +1,6 @@ import { Car, getRandomSingleDigit } from './utils.js'; -const Race = ({ count }: { count: number }): Car[] => { +const RaceComponent = ({ count }: { count: number }): Car[] => { const checkValidCount = (count: number): boolean => { return count - Math.floor(count) === 0 && count > 0; }; @@ -56,7 +56,7 @@ const Race = ({ count }: { count: number }): Car[] => { return init(count); }; -export default Race; +export default RaceComponent; //
⬇️️
//
diff --git a/src/js/modules/Winner.ts b/src/js/modules/Winner.ts index 779d3304b..724e91b25 100644 --- a/src/js/modules/Winner.ts +++ b/src/js/modules/Winner.ts @@ -11,7 +11,7 @@ const winnerSection = (winner: string): string => { `; }; -const Winner = ({ $app, cars }: { $app: HTMLDivElement | null, cars: Car[] }): void => { +const WinnerComponent = ({ $app, cars }: { $app: HTMLDivElement | null, cars: Car[] }): void => { const findWinners = (cars: Car[]): string[] => { const totalDistances = cars.map((car) => car.distance); const maxDistance = Math.max(...totalDistances); @@ -38,4 +38,4 @@ const Winner = ({ $app, cars }: { $app: HTMLDivElement | null, cars: Car[] }): v return init({ cars }); }; -export default Winner; +export default WinnerComponent; From 964800a7709488a7bd3a5e19e46549c21e931ae5 Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Wed, 2 Jun 2021 21:07:05 +0900 Subject: [PATCH 09/35] =?UTF-8?q?feat:=20reset=20button=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/js/modules/Winner.js | 42 ++++++++++++++++++++++++++++- docs/README.md | 6 +++++ src/js/modules/Winner.ts | 57 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 103 insertions(+), 2 deletions(-) diff --git a/dist/js/modules/Winner.js b/dist/js/modules/Winner.js index a34fb3189..effa832d9 100644 --- a/dist/js/modules/Winner.js +++ b/dist/js/modules/Winner.js @@ -1,3 +1,25 @@ +/* React Component κ΅¬μ‘°μ˜€μœΌλ©΄ props둜 ν•¨μˆ˜λ₯Ό λ„˜κ²Όμ„ 것이닀. */ +import CarNameComponent from './CarName.js'; +import RaceComponent from './Race.js'; +const carNameInputEvent = () => { + const carNamesInput = document.getElementById('car-name-input'); + if (carNamesInput) { + CarNameComponent({ $app: document.querySelector('#app'), carNames: carNamesInput.value }); + } +}; +const raceCountInputEvent = () => { + const raceCountInput = document.querySelector('input[type="number"]'); + if (raceCountInput) { + const result = RaceComponent({ count: Number(raceCountInput.value) }); + WinnerComponent({ $app: document.querySelector('#app'), cars: result }); + } +}; +const inputController = () => { + const gameButton = document.getElementsByTagName('button'); + gameButton[0].onclick = carNameInputEvent; + gameButton[1].onclick = raceCountInputEvent; +}; +/*****************************************************/ const winnerSection = (winner) => { return `
@@ -8,7 +30,7 @@ const winnerSection = (winner) => {
`; }; -const WinnerComponent = ({ $app, cars }) => { +const WinnerComponent = ({ $app, cars, }) => { const findWinners = (cars) => { const totalDistances = cars.map((car) => car.distance); const maxDistance = Math.max(...totalDistances); @@ -25,9 +47,27 @@ const WinnerComponent = ({ $app, cars }) => { } return; }; + const retryButtonEvent = (e) => { + var _a; + if ($app) { + $app.children[2].remove(); + $app.children[1].remove(); + $app.innerHTML = $app.children[0].outerHTML; + } + (_a = e.currentTarget) === null || _a === void 0 ? void 0 : _a.removeEventListener('click', retryButtonEvent); + inputController(); + return; + }; + const controller = () => { + const retryButton = document.getElementsByTagName('button')[2]; + if (retryButton) { + retryButton.onclick = retryButtonEvent; + } + }; const init = ({ cars }) => { const result = winnerSection(findWinners(cars).join(', ')); render({ result }); + controller(); }; return init({ cars }); }; diff --git a/docs/README.md b/docs/README.md index 5d1c6fa9d..4ae1f6b81 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,6 +3,10 @@ - [x] μžλ™μ°¨ 이름 μž…λ ₯μ‹œ 화면에 이름 λ Œλ”λ§ - [x] checkInput - [x] render car names input +- [x] 쀑간 κ²½μ£Ό 둜직 λ§Œλ“€κΈ° +- [x] μ‹œλ„ν•  횟수 '확인' λ²„νŠΌ λˆ„λ₯Ό λ•Œ κ²½μ£Ό μ‹œμž‘ + - [ ] λ‹€μ‹œ μ‹œμž‘ν•˜κΈ° λ²„νŠΌ 클릭할 λ•Œ μ΄ˆκΈ°ν™”. + ### 🎯step 1 @@ -20,3 +24,5 @@ - [ ] μ• λ‹ˆλ©”μ΄μ…˜ κ΅¬ν˜„μ„ μœ„ν•΄ setInterval, setTimeout, requestAnimationFrame 을 ν™œμš©ν•œλ‹€. - [ ] μ •μƒμ μœΌλ‘œ κ²Œμž„μ˜ 턴이 λ‹€ λ™μž‘λœ ν›„μ—λŠ” κ²°κ³Όλ₯Ό 보여주고, 2초 후에 μΆ•ν•˜μ˜ alert λ©”μ„Έμ§€λ₯Ό λ„μš΄λ‹€. - [ ] μœ„ κΈ°λŠ₯듀이 μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜λŠ”μ§€ Cypressλ₯Ό μ΄μš©ν•΄ ν…ŒμŠ€νŠΈν•œλ‹€. + +html μš”μ†Œ λ’€μ–΄κΊΌλΆ€ν„° μ‚­μ œν•΄μ•Όν•¨. ν•˜λ‚˜μ”© μ €μ ˆλ‘œ λ°€λ €μ„œ 정렬됨. diff --git a/src/js/modules/Winner.ts b/src/js/modules/Winner.ts index 724e91b25..ed2d7e795 100644 --- a/src/js/modules/Winner.ts +++ b/src/js/modules/Winner.ts @@ -1,5 +1,35 @@ import { Car } from './utils.js'; +/* React Component κ΅¬μ‘°μ˜€μœΌλ©΄ props둜 ν•¨μˆ˜λ₯Ό λ„˜κ²Όμ„ 것이닀. */ +import CarNameComponent from './CarName.js'; +import RaceComponent from './Race.js'; + +const carNameInputEvent = (): void => { + const carNamesInput: HTMLInputElement = document.getElementById( + 'car-name-input', + ) as HTMLInputElement; + if (carNamesInput) { + CarNameComponent({ $app: document.querySelector('#app'), carNames: carNamesInput.value }); + } +}; +const raceCountInputEvent = () => { + const raceCountInput: HTMLInputElement = document.querySelector( + 'input[type="number"]', + ) as HTMLInputElement; + + if (raceCountInput) { + const result = RaceComponent({ count: Number(raceCountInput.value) }); + WinnerComponent({ $app: document.querySelector('#app'), cars: result }); + } +}; +const inputController = (): void => { + const gameButton: HTMLCollectionOf = + document.getElementsByTagName('button'); + gameButton[0].onclick = carNameInputEvent; + gameButton[1].onclick = raceCountInputEvent; +}; +/*****************************************************/ + const winnerSection = (winner: string): string => { return `
@@ -11,7 +41,13 @@ const winnerSection = (winner: string): string => {
`; }; -const WinnerComponent = ({ $app, cars }: { $app: HTMLDivElement | null, cars: Car[] }): void => { +const WinnerComponent = ({ + $app, + cars, +}: { + $app: HTMLDivElement | null; + cars: Car[]; +}): void => { const findWinners = (cars: Car[]): string[] => { const totalDistances = cars.map((car) => car.distance); const maxDistance = Math.max(...totalDistances); @@ -30,9 +66,28 @@ const WinnerComponent = ({ $app, cars }: { $app: HTMLDivElement | null, cars: Ca return; }; + const retryButtonEvent = (e: Event): void => { + if ($app) { + $app.children[2].remove(); + $app.children[1].remove(); + $app.innerHTML = $app.children[0].outerHTML; + } + e.currentTarget?.removeEventListener('click', retryButtonEvent); + inputController(); + return; + }; + + const controller = (): void => { + const retryButton = document.getElementsByTagName('button')[2]; + if (retryButton) { + retryButton.onclick = retryButtonEvent; + } + }; + const init = ({ cars }: { cars: Car[] }): void => { const result: string = winnerSection(findWinners(cars).join(', ')); render({ result }); + controller(); }; return init({ cars }); From fa8319ac468cafea8a3bf27e2ea58aaeb3f2e131 Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Wed, 2 Jun 2021 21:44:02 +0900 Subject: [PATCH 10/35] chore: prettier --- .prettierrc | 3 ++- dist/js/modules/CarName.js | 15 +++++++++++---- dist/js/modules/Game.js | 10 ++++++++-- dist/js/modules/Race.js | 1 + dist/js/modules/Winner.js | 10 ++++++++-- docs/README.md | 18 +++++++++--------- src/js/index.ts | 2 +- src/js/modules/CarName.ts | 20 ++++++++++---------- src/js/modules/Game.ts | 21 +++++++++++---------- src/js/modules/Race.ts | 32 +++++++++++++------------------- src/js/modules/Winner.ts | 30 +++++++++++++----------------- 11 files changed, 87 insertions(+), 75 deletions(-) diff --git a/.prettierrc b/.prettierrc index 0678f27e5..252904a2d 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,5 +1,6 @@ { "parser": "typescript", "singleQuote": true, - "trailingComma": "all" + "trailingComma": "all", + "printWidth": 120, } diff --git a/dist/js/modules/CarName.js b/dist/js/modules/CarName.js index de0ce2137..3fe5330fc 100644 --- a/dist/js/modules/CarName.js +++ b/dist/js/modules/CarName.js @@ -10,8 +10,9 @@ const carNameDiv = (carName) => {
${carName}
`; }; -const CarNameComponent = ({ $app, carNames }) => { - const checkCarNames = (carNameList) => carNameList.length === carNameList.filter(x => x.length <= 5 && x !== '').length; +const CarNameComponent = ({ $app, carNames, }) => { + const checkCarNames = (carNameList) => carNameList.length === + carNameList.filter((x) => x.length <= 5 && x !== '').length; const render = (JSX) => { const sectionElement = $app; if (sectionElement) { @@ -20,9 +21,15 @@ const CarNameComponent = ({ $app, carNames }) => { return; }; const init = (carNames) => { - const carNameList = carNames.split(',').map(x => x.trim()); + const carNameList = carNames.split(',').map((x) => x.trim()); if (checkCarNames(carNameList)) { - render(carNamesSection(carNameList.map(carName => carNameDiv(carName)).join(''))); + render(carNamesSection(carNameList.map((carName) => carNameDiv(carName)).join(''))); + } + else { + alert('μœ νš¨ν•˜μ§€ μ•Šμ€ μž…λ ₯μž…λ‹ˆλ‹€. μž¬μž…λ ₯ ν•΄μ£Όμ„Έμš”.'); + const carNameInput = document.getElementById('car-name-input'); + carNameInput.value = ''; + carNameInput.focus(); } }; init(carNames); diff --git a/dist/js/modules/Game.js b/dist/js/modules/Game.js index 7881fcdfe..f3c681d15 100644 --- a/dist/js/modules/Game.js +++ b/dist/js/modules/Game.js @@ -10,10 +10,16 @@ const Game = ({ $app }) => { }; const raceCountInputEvent = () => { const raceCountInput = document.querySelector('input[type="number"]'); - if (raceCountInput) { - const result = RaceComponent({ count: Number(raceCountInput.value) }); + const carNamesInput = document.querySelector('input[type="text"]'); + if (raceCountInput && carNamesInput.value !== '') { + const result = RaceComponent({ + count: Number(raceCountInput.value), + }); WinnerComponent({ $app, cars: result }); } + else { + alert('μžλ™μ°¨ 이름 λ¨Όμ € μž…λ ₯ν•΄μ£Όμ„Έμš”!'); + } }; const render = () => { }; const controller = () => { diff --git a/dist/js/modules/Race.js b/dist/js/modules/Race.js index 25ae58fc4..a1dd2bff3 100644 --- a/dist/js/modules/Race.js +++ b/dist/js/modules/Race.js @@ -34,6 +34,7 @@ const RaceComponent = ({ count }) => { alert(`μœ νš¨ν•˜μ§€ μ•Šμ€ μž…λ ₯μž…λ‹ˆλ‹€. μž¬μž…λ ₯ ν•΄μ£Όμ„Έμš”.`); const racingCountInput = document.getElementById('racing-count-input'); racingCountInput.value = ''; + racingCountInput.focus(); } return render({ cars: assignCarsName(), count }); }; diff --git a/dist/js/modules/Winner.js b/dist/js/modules/Winner.js index effa832d9..965556304 100644 --- a/dist/js/modules/Winner.js +++ b/dist/js/modules/Winner.js @@ -4,14 +4,20 @@ import RaceComponent from './Race.js'; const carNameInputEvent = () => { const carNamesInput = document.getElementById('car-name-input'); if (carNamesInput) { - CarNameComponent({ $app: document.querySelector('#app'), carNames: carNamesInput.value }); + CarNameComponent({ + $app: document.querySelector('#app'), + carNames: carNamesInput.value, + }); } }; const raceCountInputEvent = () => { const raceCountInput = document.querySelector('input[type="number"]'); if (raceCountInput) { const result = RaceComponent({ count: Number(raceCountInput.value) }); - WinnerComponent({ $app: document.querySelector('#app'), cars: result }); + WinnerComponent({ + $app: document.querySelector('#app'), + cars: result, + }); } }; const inputController = () => { diff --git a/docs/README.md b/docs/README.md index 4ae1f6b81..738d47861 100644 --- a/docs/README.md +++ b/docs/README.md @@ -5,18 +5,18 @@ - [x] render car names input - [x] 쀑간 κ²½μ£Ό 둜직 λ§Œλ“€κΈ° - [x] μ‹œλ„ν•  횟수 '확인' λ²„νŠΌ λˆ„λ₯Ό λ•Œ κ²½μ£Ό μ‹œμž‘ - - [ ] λ‹€μ‹œ μ‹œμž‘ν•˜κΈ° λ²„νŠΌ 클릭할 λ•Œ μ΄ˆκΈ°ν™”. - + - [x] λ‹€μ‹œ μ‹œμž‘ν•˜κΈ° λ²„νŠΌ 클릭할 λ•Œ μ΄ˆκΈ°ν™”. + - [x] μžλ™μ°¨ 이름 λ¨Όμ € μž…λ ₯ν•˜κ²Œ ν•˜κΈ° ### 🎯step 1 -- [ ] μ£Όμ–΄μ§„ 횟수 λ™μ•ˆ nλŒ€μ˜ μžλ™μ°¨λŠ” μ „μ§„ λ˜λŠ” 멈좜 수 μžˆλ‹€. -- [ ] μžλ™μ°¨μ— 이름을 λΆ€μ—¬ν•  수 μžˆλ‹€. μ „μ§„ν•˜λŠ” μžλ™μ°¨λ₯Ό 좜λ ₯ν•  λ•Œ μžλ™μ°¨ 이름을 같이 좜λ ₯ν•œλ‹€. -- [ ] μžλ™μ°¨ 이름은 μ‰Όν‘œ(,)λ₯Ό κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„ν•˜λ©° 이름은 5자 μ΄ν•˜λ§Œ κ°€λŠ₯ν•˜λ‹€. -- [ ] μ‚¬μš©μžλŠ” λͺ‡ 번의 이동을 ν•  것인지λ₯Ό μž…λ ₯ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€. -- [ ] μ „μ§„ν•˜λŠ” 쑰건은 0μ—μ„œ 9 μ‚¬μ΄μ—μ„œ random 값을 κ΅¬ν•œ ν›„ random 값이 4 이상일 경우 μ „μ§„ν•˜κ³ , 3 μ΄ν•˜μ˜ 값이면 λ©ˆμΆ˜λ‹€. -- [ ] μžλ™μ°¨ κ²½μ£Ό κ²Œμž„μ„ μ™„λ£Œν•œ ν›„ λˆ„κ°€ μš°μŠΉν–ˆλŠ”μ§€λ₯Ό μ•Œλ €μ€€λ‹€. μš°μŠΉμžλŠ” ν•œ λͺ… 이상일 수 μžˆλ‹€. -- [ ] μš°μŠΉμžκ°€ μ—¬λŸ¬λͺ…일 경우 ,λ₯Ό μ΄μš©ν•˜μ—¬ κ΅¬λΆ„ν•œλ‹€. +- [x] μ£Όμ–΄μ§„ 횟수 λ™μ•ˆ nλŒ€μ˜ μžλ™μ°¨λŠ” μ „μ§„ λ˜λŠ” 멈좜 수 μžˆλ‹€. +- [x] μžλ™μ°¨μ— 이름을 λΆ€μ—¬ν•  수 μžˆλ‹€. μ „μ§„ν•˜λŠ” μžλ™μ°¨λ₯Ό 좜λ ₯ν•  λ•Œ μžλ™μ°¨ 이름을 같이 좜λ ₯ν•œλ‹€. +- [x] μžλ™μ°¨ 이름은 μ‰Όν‘œ(,)λ₯Ό κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„ν•˜λ©° 이름은 5자 μ΄ν•˜λ§Œ κ°€λŠ₯ν•˜λ‹€. +- [x] μ‚¬μš©μžλŠ” λͺ‡ 번의 이동을 ν•  것인지λ₯Ό μž…λ ₯ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€. +- [x] μ „μ§„ν•˜λŠ” 쑰건은 0μ—μ„œ 9 μ‚¬μ΄μ—μ„œ random 값을 κ΅¬ν•œ ν›„ random 값이 4 이상일 경우 μ „μ§„ν•˜κ³ , 3 μ΄ν•˜μ˜ 값이면 λ©ˆμΆ˜λ‹€. +- [x] μžλ™μ°¨ κ²½μ£Ό κ²Œμž„μ„ μ™„λ£Œν•œ ν›„ λˆ„κ°€ μš°μŠΉν–ˆλŠ”μ§€λ₯Ό μ•Œλ €μ€€λ‹€. μš°μŠΉμžλŠ” ν•œ λͺ… 이상일 수 μžˆλ‹€. +- [x] μš°μŠΉμžκ°€ μ—¬λŸ¬λͺ…일 경우 ,λ₯Ό μ΄μš©ν•˜μ—¬ κ΅¬λΆ„ν•œλ‹€. ### 🎯🎯 step 2 diff --git a/src/js/index.ts b/src/js/index.ts index 447529eba..8c07a8b9c 100644 --- a/src/js/index.ts +++ b/src/js/index.ts @@ -2,7 +2,7 @@ import Game from './modules/Game.js'; export default function App(): void { Game({ - $app: document.querySelector('#app') + $app: document.querySelector('#app'), }); } diff --git a/src/js/modules/CarName.ts b/src/js/modules/CarName.ts index 77b0a8f24..003cc1dad 100644 --- a/src/js/modules/CarName.ts +++ b/src/js/modules/CarName.ts @@ -12,22 +12,27 @@ const carNameDiv = (carName: string): string => { `; }; -const CarNameComponent = ({ $app, carNames }: { $app: HTMLDivElement | null, carNames: string }): void => { +const CarNameComponent = ({ $app, carNames }: { $app: HTMLDivElement | null; carNames: string }): void => { const checkCarNames = (carNameList: string[]) => - carNameList.length === carNameList.filter(x => x.length <= 5 && x !== '').length; + carNameList.length === carNameList.filter((x) => x.length <= 5 && x !== '').length; const render = (JSX: string): void => { const sectionElement = $app; if (sectionElement) { sectionElement.insertAdjacentHTML('beforeend', JSX); } - return ; + return; }; const init = (carNames: string): void => { - const carNameList: string[] = carNames.split(',').map(x=>x.trim()); + const carNameList: string[] = carNames.split(',').map((x) => x.trim()); if (checkCarNames(carNameList)) { - render(carNamesSection(carNameList.map(carName => carNameDiv(carName)).join(''))); + render(carNamesSection(carNameList.map((carName) => carNameDiv(carName)).join(''))); + } else { + alert('μœ νš¨ν•˜μ§€ μ•Šμ€ μž…λ ₯μž…λ‹ˆλ‹€. μž¬μž…λ ₯ ν•΄μ£Όμ„Έμš”.'); + const carNameInput = document.getElementById('car-name-input') as HTMLInputElement; + carNameInput.value = ''; + carNameInput.focus(); } }; @@ -35,8 +40,3 @@ const CarNameComponent = ({ $app, carNames }: { $app: HTMLDivElement | null, car }; export default CarNameComponent; - -//
⬇️️
-//
-// -//
diff --git a/src/js/modules/Game.ts b/src/js/modules/Game.ts index df2c7880e..68fa42e69 100644 --- a/src/js/modules/Game.ts +++ b/src/js/modules/Game.ts @@ -1,31 +1,32 @@ import CarNameComponent from './CarName.js'; import RaceComponent from './Race.js'; import WinnerComponent from './Winner.js'; +import { Car } from './utils.js'; const Game = ({ $app }: { $app: HTMLDivElement | null }): void => { const carNameInputEvent = (): void => { - const carNamesInput: HTMLInputElement = document.getElementById( - 'car-name-input', - ) as HTMLInputElement; + const carNamesInput: HTMLInputElement = document.getElementById('car-name-input') as HTMLInputElement; if (carNamesInput) { CarNameComponent({ $app, carNames: carNamesInput.value }); } }; const raceCountInputEvent = () => { - const raceCountInput: HTMLInputElement = document.querySelector( - 'input[type="number"]', - ) as HTMLInputElement; + const raceCountInput: HTMLInputElement = document.querySelector('input[type="number"]') as HTMLInputElement; + const carNamesInput: HTMLInputElement = document.querySelector('input[type="text"]') as HTMLInputElement; - if (raceCountInput) { - const result = RaceComponent({ count: Number(raceCountInput.value) }); + if (raceCountInput && carNamesInput.value !== '') { + const result: Car[] = RaceComponent({ + count: Number(raceCountInput.value), + }); WinnerComponent({ $app, cars: result }); + } else { + alert('μžλ™μ°¨ 이름 λ¨Όμ € μž…λ ₯ν•΄μ£Όμ„Έμš”!'); } }; const render = (): void => {}; const controller = (): void => { - const gameButton: HTMLCollectionOf = - document.getElementsByTagName('button'); + const gameButton: HTMLCollectionOf = document.getElementsByTagName('button'); gameButton[0].onclick = carNameInputEvent; gameButton[1].onclick = raceCountInputEvent; }; diff --git a/src/js/modules/Race.ts b/src/js/modules/Race.ts index f2af5500c..699227e5b 100644 --- a/src/js/modules/Race.ts +++ b/src/js/modules/Race.ts @@ -1,13 +1,17 @@ import { Car, getRandomSingleDigit } from './utils.js'; +const spinnerDiv = () => { + return `
+ +
`; +}; + const RaceComponent = ({ count }: { count: number }): Car[] => { const checkValidCount = (count: number): boolean => { return count - Math.floor(count) === 0 && count > 0; }; function getInputCarsName(): string[] { - const carNameInput = document.getElementById( - 'car-name-input', - ) as HTMLInputElement; + const carNameInput = document.getElementById('car-name-input') as HTMLInputElement; return carNameInput.value.split(',').map((x) => x.trim()); } @@ -21,20 +25,16 @@ const RaceComponent = ({ count }: { count: number }): Car[] => { } const render = ({ cars, count }: { cars: Car[]; count: number }): Car[] => { - const carPlayer: HTMLCollectionOf = - document.getElementsByClassName( - 'car-player', - ) as HTMLCollectionOf; + const carPlayer: HTMLCollectionOf = document.getElementsByClassName( + 'car-player', + ) as HTMLCollectionOf; let tryCount: number = count; while (tryCount > 0) { for (let i = 0; i < carPlayer.length; i += 1) { if (getRandomSingleDigit(0, 9) >= 4) { cars[i].move(); - carPlayer[i].insertAdjacentHTML( - 'afterend', - '
⬇️️
', - ); + carPlayer[i].insertAdjacentHTML('afterend', '
⬇️️
'); } } tryCount -= 1; @@ -45,10 +45,9 @@ const RaceComponent = ({ count }: { count: number }): Car[] => { const init = (count: number): Car[] => { if (!checkValidCount(count)) { alert(`μœ νš¨ν•˜μ§€ μ•Šμ€ μž…λ ₯μž…λ‹ˆλ‹€. μž¬μž…λ ₯ ν•΄μ£Όμ„Έμš”.`); - const racingCountInput = document.getElementById( - 'racing-count-input', - ) as HTMLInputElement; + const racingCountInput = document.getElementById('racing-count-input') as HTMLInputElement; racingCountInput.value = ''; + racingCountInput.focus(); } return render({ cars: assignCarsName(), count }); }; @@ -57,8 +56,3 @@ const RaceComponent = ({ count }: { count: number }): Car[] => { }; export default RaceComponent; - -//
⬇️️
-//
-// -//
diff --git a/src/js/modules/Winner.ts b/src/js/modules/Winner.ts index ed2d7e795..487efbfd4 100644 --- a/src/js/modules/Winner.ts +++ b/src/js/modules/Winner.ts @@ -5,26 +5,28 @@ import CarNameComponent from './CarName.js'; import RaceComponent from './Race.js'; const carNameInputEvent = (): void => { - const carNamesInput: HTMLInputElement = document.getElementById( - 'car-name-input', - ) as HTMLInputElement; + const carNamesInput: HTMLInputElement = document.getElementById('car-name-input') as HTMLInputElement; + if (carNamesInput) { - CarNameComponent({ $app: document.querySelector('#app'), carNames: carNamesInput.value }); + CarNameComponent({ + $app: document.querySelector('#app'), + carNames: carNamesInput.value, + }); } }; const raceCountInputEvent = () => { - const raceCountInput: HTMLInputElement = document.querySelector( - 'input[type="number"]', - ) as HTMLInputElement; + const raceCountInput: HTMLInputElement = document.querySelector('input[type="number"]') as HTMLInputElement; if (raceCountInput) { const result = RaceComponent({ count: Number(raceCountInput.value) }); - WinnerComponent({ $app: document.querySelector('#app'), cars: result }); + WinnerComponent({ + $app: document.querySelector('#app'), + cars: result, + }); } }; const inputController = (): void => { - const gameButton: HTMLCollectionOf = - document.getElementsByTagName('button'); + const gameButton: HTMLCollectionOf = document.getElementsByTagName('button'); gameButton[0].onclick = carNameInputEvent; gameButton[1].onclick = raceCountInputEvent; }; @@ -41,13 +43,7 @@ const winnerSection = (winner: string): string => { `; }; -const WinnerComponent = ({ - $app, - cars, -}: { - $app: HTMLDivElement | null; - cars: Car[]; -}): void => { +const WinnerComponent = ({ $app, cars }: { $app: HTMLDivElement | null; cars: Car[] }): void => { const findWinners = (cars: Car[]): string[] => { const totalDistances = cars.map((car) => car.distance); const maxDistance = Math.max(...totalDistances); From 65c669922466d2c7f1a55778e0570e219430ba10 Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Wed, 2 Jun 2021 21:48:30 +0900 Subject: [PATCH 11/35] chore: prettier --- .prettierrc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.prettierrc b/.prettierrc index 252904a2d..9db28a2bd 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,6 +1,5 @@ { - "parser": "typescript", "singleQuote": true, "trailingComma": "all", - "printWidth": 120, + "printWidth": 120 } From 691dfacbc9c17a0ca374fd88bb2af6428a469e40 Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Thu, 3 Jun 2021 10:06:47 +0900 Subject: [PATCH 12/35] refactor: func to const val = ()=>{} --- src/js/modules/Race.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/js/modules/Race.ts b/src/js/modules/Race.ts index 699227e5b..1c68fd143 100644 --- a/src/js/modules/Race.ts +++ b/src/js/modules/Race.ts @@ -10,19 +10,19 @@ const RaceComponent = ({ count }: { count: number }): Car[] => { const checkValidCount = (count: number): boolean => { return count - Math.floor(count) === 0 && count > 0; }; - function getInputCarsName(): string[] { + const getInputCarsName = (): string[] => { const carNameInput = document.getElementById('car-name-input') as HTMLInputElement; return carNameInput.value.split(',').map((x) => x.trim()); - } + }; - function assignCarsName(): Car[] { + const assignCarsName = (): Car[] => { const cars: Car[] = []; const inputCarNames = getInputCarsName(); inputCarNames.forEach((name) => { cars.push(new Car(name)); }); return cars; - } + }; const render = ({ cars, count }: { cars: Car[]; count: number }): Car[] => { const carPlayer: HTMLCollectionOf = document.getElementsByClassName( From 471c1569c906b7b314a2385357e9d7b3a553c421 Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Thu, 3 Jun 2021 11:06:30 +0900 Subject: [PATCH 13/35] =?UTF-8?q?feat:=20spinner=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/js/index.js | 2 +- dist/js/modules/CarName.js | 14 +++++++------- dist/js/modules/Race.js | 22 ++++++++++++++-------- dist/js/modules/Winner.js | 2 +- docs/README.md | 3 +++ src/js/modules/CarName.ts | 5 +++++ src/js/modules/Race.ts | 13 +++++++------ 7 files changed, 38 insertions(+), 23 deletions(-) diff --git a/dist/js/index.js b/dist/js/index.js index 4ef3f3103..f62346eb7 100644 --- a/dist/js/index.js +++ b/dist/js/index.js @@ -1,7 +1,7 @@ import Game from './modules/Game.js'; export default function App() { Game({ - $app: document.querySelector('#app') + $app: document.querySelector('#app'), }); } App(); diff --git a/dist/js/modules/CarName.js b/dist/js/modules/CarName.js index 3fe5330fc..76fb34141 100644 --- a/dist/js/modules/CarName.js +++ b/dist/js/modules/CarName.js @@ -8,11 +8,15 @@ const carNamesSection = (carNames) => { const carNameDiv = (carName) => { return `
${carName}
+
+
+ +
+
`; }; -const CarNameComponent = ({ $app, carNames, }) => { - const checkCarNames = (carNameList) => carNameList.length === - carNameList.filter((x) => x.length <= 5 && x !== '').length; +const CarNameComponent = ({ $app, carNames }) => { + const checkCarNames = (carNameList) => carNameList.length === carNameList.filter((x) => x.length <= 5 && x !== '').length; const render = (JSX) => { const sectionElement = $app; if (sectionElement) { @@ -35,7 +39,3 @@ const CarNameComponent = ({ $app, carNames, }) => { init(carNames); }; export default CarNameComponent; -//
⬇️️
-//
-// -//
diff --git a/dist/js/modules/Race.js b/dist/js/modules/Race.js index a1dd2bff3..7b5f7ad4c 100644 --- a/dist/js/modules/Race.js +++ b/dist/js/modules/Race.js @@ -3,18 +3,24 @@ const RaceComponent = ({ count }) => { const checkValidCount = (count) => { return count - Math.floor(count) === 0 && count > 0; }; - function getInputCarsName() { + const getInputCarsName = () => { const carNameInput = document.getElementById('car-name-input'); return carNameInput.value.split(',').map((x) => x.trim()); - } - function assignCarsName() { + }; + const assignCarsName = () => { const cars = []; const inputCarNames = getInputCarsName(); inputCarNames.forEach((name) => { cars.push(new Car(name)); }); return cars; - } + }; + const removeSpinner = (carPlayer) => { + var _a, _b, _c, _d; + if (((_b = (_a = carPlayer.parentNode) === null || _a === void 0 ? void 0 : _a.lastElementChild) === null || _b === void 0 ? void 0 : _b.className) === 'd-flex justify-center mt-3') { + (_d = (_c = carPlayer.parentNode) === null || _c === void 0 ? void 0 : _c.lastElementChild) === null || _d === void 0 ? void 0 : _d.remove(); + } + }; const render = ({ cars, count }) => { const carPlayer = document.getElementsByClassName('car-player'); let tryCount = count; @@ -22,6 +28,10 @@ const RaceComponent = ({ count }) => { for (let i = 0; i < carPlayer.length; i += 1) { if (getRandomSingleDigit(0, 9) >= 4) { cars[i].move(); + removeSpinner(carPlayer[i]); + // if (carPlayer[i].parentNode?.lastElementChild?.className === 'd-flex justify-center mt-3') { + // carPlayer[i].parentNode?.lastElementChild?.remove() + // } carPlayer[i].insertAdjacentHTML('afterend', '
⬇️️
'); } } @@ -41,7 +51,3 @@ const RaceComponent = ({ count }) => { return init(count); }; export default RaceComponent; -//
⬇️️
-//
-// -//
diff --git a/dist/js/modules/Winner.js b/dist/js/modules/Winner.js index 965556304..9f9955ce5 100644 --- a/dist/js/modules/Winner.js +++ b/dist/js/modules/Winner.js @@ -36,7 +36,7 @@ const winnerSection = (winner) => { `; }; -const WinnerComponent = ({ $app, cars, }) => { +const WinnerComponent = ({ $app, cars }) => { const findWinners = (cars) => { const totalDistances = cars.map((car) => car.distance); const maxDistance = Math.max(...totalDistances); diff --git a/docs/README.md b/docs/README.md index 738d47861..e816599e9 100644 --- a/docs/README.md +++ b/docs/README.md @@ -20,6 +20,9 @@ ### 🎯🎯 step 2 +- [x] spinner + - [x] car-name λ²„νŠΌ λˆ„λ₯Ό λ•Œ spinner λ Œλ”λ§ ν•˜κΈ° + - [x] ν•΄λ‹Ή μžλ™μ°¨ κ²½μ£Ό μ‹œμž‘ν•  λ•Œ μ‚­μ œν•˜κΈ° - [ ] μžλ™μ°¨ κ²½μ£Ό κ²Œμž„μ˜ 턴이 μ§„ν–‰ 될 λ•Œλ§ˆλ‹€ 1초의 ν…€(progressive μž¬μƒ)을 두고 μ§„ν–‰ν•œλ‹€. - [ ] μ• λ‹ˆλ©”μ΄μ…˜ κ΅¬ν˜„μ„ μœ„ν•΄ setInterval, setTimeout, requestAnimationFrame 을 ν™œμš©ν•œλ‹€. - [ ] μ •μƒμ μœΌλ‘œ κ²Œμž„μ˜ 턴이 λ‹€ λ™μž‘λœ ν›„μ—λŠ” κ²°κ³Όλ₯Ό 보여주고, 2초 후에 μΆ•ν•˜μ˜ alert λ©”μ„Έμ§€λ₯Ό λ„μš΄λ‹€. diff --git a/src/js/modules/CarName.ts b/src/js/modules/CarName.ts index 003cc1dad..fbe80efc8 100644 --- a/src/js/modules/CarName.ts +++ b/src/js/modules/CarName.ts @@ -9,6 +9,11 @@ const carNamesSection = (carNames: string): string => { const carNameDiv = (carName: string): string => { return `
${carName}
+
+
+ +
+
`; }; diff --git a/src/js/modules/Race.ts b/src/js/modules/Race.ts index 1c68fd143..cf861b856 100644 --- a/src/js/modules/Race.ts +++ b/src/js/modules/Race.ts @@ -1,11 +1,5 @@ import { Car, getRandomSingleDigit } from './utils.js'; -const spinnerDiv = () => { - return `
- -
`; -}; - const RaceComponent = ({ count }: { count: number }): Car[] => { const checkValidCount = (count: number): boolean => { return count - Math.floor(count) === 0 && count > 0; @@ -24,6 +18,12 @@ const RaceComponent = ({ count }: { count: number }): Car[] => { return cars; }; + const removeSpinner = (carPlayer: Element): void => { + if (carPlayer.parentNode?.lastElementChild?.className === 'd-flex justify-center mt-3') { + carPlayer.parentNode?.lastElementChild?.remove(); + } + }; + const render = ({ cars, count }: { cars: Car[]; count: number }): Car[] => { const carPlayer: HTMLCollectionOf = document.getElementsByClassName( 'car-player', @@ -34,6 +34,7 @@ const RaceComponent = ({ count }: { count: number }): Car[] => { for (let i = 0; i < carPlayer.length; i += 1) { if (getRandomSingleDigit(0, 9) >= 4) { cars[i].move(); + removeSpinner(carPlayer[i]); carPlayer[i].insertAdjacentHTML('afterend', '
⬇️️
'); } } From f66feaf3a767ed6e5785cf2268fd37e586b7996e Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Thu, 3 Jun 2021 13:32:06 +0900 Subject: [PATCH 14/35] feat: add race async --- dist/js/modules/Race.js | 28 +++++++++++++++++++--------- src/js/modules/Race.ts | 26 ++++++++++++++++++++------ 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/dist/js/modules/Race.js b/dist/js/modules/Race.js index 7b5f7ad4c..b63a52e03 100644 --- a/dist/js/modules/Race.js +++ b/dist/js/modules/Race.js @@ -1,5 +1,7 @@ import { Car, getRandomSingleDigit } from './utils.js'; const RaceComponent = ({ count }) => { + let _cars; + let _startTime = 0; const checkValidCount = (count) => { return count - Math.floor(count) === 0 && count > 0; }; @@ -21,23 +23,29 @@ const RaceComponent = ({ count }) => { (_d = (_c = carPlayer.parentNode) === null || _c === void 0 ? void 0 : _c.lastElementChild) === null || _d === void 0 ? void 0 : _d.remove(); } }; - const render = ({ cars, count }) => { + const racingAnimationFrame = () => { const carPlayer = document.getElementsByClassName('car-player'); - let tryCount = count; - while (tryCount > 0) { + _startTime += 1; + if (_startTime < 100) { + requestAnimationFrame(racingAnimationFrame); + } + else { for (let i = 0; i < carPlayer.length; i += 1) { if (getRandomSingleDigit(0, 9) >= 4) { - cars[i].move(); + _cars[i].move(); removeSpinner(carPlayer[i]); - // if (carPlayer[i].parentNode?.lastElementChild?.className === 'd-flex justify-center mt-3') { - // carPlayer[i].parentNode?.lastElementChild?.remove() - // } carPlayer[i].insertAdjacentHTML('afterend', '
⬇️️
'); } } + _startTime = 0; + } + }; + const render = ({ count }) => { + let tryCount = count; + while (tryCount > 0) { + requestAnimationFrame(racingAnimationFrame); tryCount -= 1; } - return cars; }; const init = (count) => { if (!checkValidCount(count)) { @@ -46,7 +54,9 @@ const RaceComponent = ({ count }) => { racingCountInput.value = ''; racingCountInput.focus(); } - return render({ cars: assignCarsName(), count }); + _cars = assignCarsName(); + render({ count }); + return _cars; }; return init(count); }; diff --git a/src/js/modules/Race.ts b/src/js/modules/Race.ts index cf861b856..7cd316854 100644 --- a/src/js/modules/Race.ts +++ b/src/js/modules/Race.ts @@ -1,6 +1,9 @@ import { Car, getRandomSingleDigit } from './utils.js'; const RaceComponent = ({ count }: { count: number }): Car[] => { + let _cars: Car[]; + let _startTime: number = 0; + const checkValidCount = (count: number): boolean => { return count - Math.floor(count) === 0 && count > 0; }; @@ -24,23 +27,32 @@ const RaceComponent = ({ count }: { count: number }): Car[] => { } }; - const render = ({ cars, count }: { cars: Car[]; count: number }): Car[] => { + const racingAnimationFrame = (): void => { const carPlayer: HTMLCollectionOf = document.getElementsByClassName( 'car-player', ) as HTMLCollectionOf; - let tryCount: number = count; - while (tryCount > 0) { + _startTime += 1; + if (_startTime < 100) { + requestAnimationFrame(racingAnimationFrame); + } else { for (let i = 0; i < carPlayer.length; i += 1) { if (getRandomSingleDigit(0, 9) >= 4) { - cars[i].move(); + _cars[i].move(); removeSpinner(carPlayer[i]); carPlayer[i].insertAdjacentHTML('afterend', '
⬇️️
'); } } + _startTime = 0; + } + }; + + const render = ({ count }: { count: number }): void => { + let tryCount: number = count; + while (tryCount > 0) { + requestAnimationFrame(racingAnimationFrame); tryCount -= 1; } - return cars; }; const init = (count: number): Car[] => { @@ -50,7 +62,9 @@ const RaceComponent = ({ count }: { count: number }): Car[] => { racingCountInput.value = ''; racingCountInput.focus(); } - return render({ cars: assignCarsName(), count }); + _cars = assignCarsName(); + render({ count }); + return _cars; }; return init(count); From 50e075b7ee3ff12eb5334bcc8d5568ca6bad2b31 Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Thu, 3 Jun 2021 14:17:40 +0900 Subject: [PATCH 15/35] =?UTF-8?q?feat:=20=EA=B0=81=20=ED=9A=9F=EC=88=98=20?= =?UTF-8?q?=EC=82=AC=EC=9D=B4=EC=97=90=20=EC=A7=80=EC=97=B0=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=20=EB=91=90=EA=B8=B0=20async,=20await=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/js/modules/Game.js | 5 ++-- dist/js/modules/Race.js | 63 ++++++++++++++++++++++++++------------- dist/js/modules/Winner.js | 16 +++++----- src/js/modules/Game.ts | 5 ++-- src/js/modules/Race.ts | 54 +++++++++++++++++++++------------ src/js/modules/Winner.ts | 16 +++++----- 6 files changed, 97 insertions(+), 62 deletions(-) diff --git a/dist/js/modules/Game.js b/dist/js/modules/Game.js index f3c681d15..59036dbd4 100644 --- a/dist/js/modules/Game.js +++ b/dist/js/modules/Game.js @@ -1,6 +1,5 @@ import CarNameComponent from './CarName.js'; import RaceComponent from './Race.js'; -import WinnerComponent from './Winner.js'; const Game = ({ $app }) => { const carNameInputEvent = () => { const carNamesInput = document.getElementById('car-name-input'); @@ -12,10 +11,10 @@ const Game = ({ $app }) => { const raceCountInput = document.querySelector('input[type="number"]'); const carNamesInput = document.querySelector('input[type="text"]'); if (raceCountInput && carNamesInput.value !== '') { - const result = RaceComponent({ + RaceComponent({ + $app, count: Number(raceCountInput.value), }); - WinnerComponent({ $app, cars: result }); } else { alert('μžλ™μ°¨ 이름 λ¨Όμ € μž…λ ₯ν•΄μ£Όμ„Έμš”!'); diff --git a/dist/js/modules/Race.js b/dist/js/modules/Race.js index b63a52e03..1fb8c91a1 100644 --- a/dist/js/modules/Race.js +++ b/dist/js/modules/Race.js @@ -1,5 +1,15 @@ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; import { Car, getRandomSingleDigit } from './utils.js'; -const RaceComponent = ({ count }) => { +import WinnerComponent from './Winner.js'; +const RaceComponent = ({ $app, count }) => { let _cars; let _startTime = 0; const checkValidCount = (count) => { @@ -23,13 +33,31 @@ const RaceComponent = ({ count }) => { (_d = (_c = carPlayer.parentNode) === null || _c === void 0 ? void 0 : _c.lastElementChild) === null || _d === void 0 ? void 0 : _d.remove(); } }; - const racingAnimationFrame = () => { + // const racingAnimationFrame = (): void => { + // const carPlayer: HTMLCollectionOf = document.getElementsByClassName( + // 'car-player', + // ) as HTMLCollectionOf; + // _startTime += 1; + // if (_startTime < 100) { + // requestAnimationFrame(racingAnimationFrame); + // } else { + // for (let i = 0; i < carPlayer.length; i += 1) { + // if (getRandomSingleDigit(0, 9) >= 4) { + // _cars[i].move(); + // removeSpinner(carPlayer[i]); + // carPlayer[i].insertAdjacentHTML('afterend', '
⬇️️
'); + // } + // } + // _startTime = 0; + // } + // }; + const wait = (delay) => __awaiter(void 0, void 0, void 0, function* () { + return new Promise((resolve) => setTimeout(resolve, delay)); + }); + const render = ({ count }) => __awaiter(void 0, void 0, void 0, function* () { const carPlayer = document.getElementsByClassName('car-player'); - _startTime += 1; - if (_startTime < 100) { - requestAnimationFrame(racingAnimationFrame); - } - else { + let tryCount = count; + while (tryCount > 0) { for (let i = 0; i < carPlayer.length; i += 1) { if (getRandomSingleDigit(0, 9) >= 4) { _cars[i].move(); @@ -37,17 +65,11 @@ const RaceComponent = ({ count }) => { carPlayer[i].insertAdjacentHTML('afterend', '
⬇️️
'); } } - _startTime = 0; - } - }; - const render = ({ count }) => { - let tryCount = count; - while (tryCount > 0) { - requestAnimationFrame(racingAnimationFrame); tryCount -= 1; + yield wait(1000); } - }; - const init = (count) => { + }); + const init = (count) => __awaiter(void 0, void 0, void 0, function* () { if (!checkValidCount(count)) { alert(`μœ νš¨ν•˜μ§€ μ•Šμ€ μž…λ ₯μž…λ‹ˆλ‹€. μž¬μž…λ ₯ ν•΄μ£Όμ„Έμš”.`); const racingCountInput = document.getElementById('racing-count-input'); @@ -55,9 +77,10 @@ const RaceComponent = ({ count }) => { racingCountInput.focus(); } _cars = assignCarsName(); - render({ count }); - return _cars; - }; - return init(count); + yield render({ count }); + WinnerComponent({ $app, cars: _cars }); + return; + }); + init(count); }; export default RaceComponent; diff --git a/dist/js/modules/Winner.js b/dist/js/modules/Winner.js index 9f9955ce5..0402838d7 100644 --- a/dist/js/modules/Winner.js +++ b/dist/js/modules/Winner.js @@ -4,21 +4,21 @@ import RaceComponent from './Race.js'; const carNameInputEvent = () => { const carNamesInput = document.getElementById('car-name-input'); if (carNamesInput) { - CarNameComponent({ - $app: document.querySelector('#app'), - carNames: carNamesInput.value, - }); + CarNameComponent({ $app: document.querySelector('#app'), carNames: carNamesInput.value }); } }; const raceCountInputEvent = () => { const raceCountInput = document.querySelector('input[type="number"]'); - if (raceCountInput) { - const result = RaceComponent({ count: Number(raceCountInput.value) }); - WinnerComponent({ + const carNamesInput = document.querySelector('input[type="text"]'); + if (raceCountInput && carNamesInput.value !== '') { + RaceComponent({ $app: document.querySelector('#app'), - cars: result, + count: Number(raceCountInput.value), }); } + else { + alert('μžλ™μ°¨ 이름 λ¨Όμ € μž…λ ₯ν•΄μ£Όμ„Έμš”!'); + } }; const inputController = () => { const gameButton = document.getElementsByTagName('button'); diff --git a/src/js/modules/Game.ts b/src/js/modules/Game.ts index 68fa42e69..e442e0950 100644 --- a/src/js/modules/Game.ts +++ b/src/js/modules/Game.ts @@ -1,6 +1,5 @@ import CarNameComponent from './CarName.js'; import RaceComponent from './Race.js'; -import WinnerComponent from './Winner.js'; import { Car } from './utils.js'; const Game = ({ $app }: { $app: HTMLDivElement | null }): void => { @@ -15,10 +14,10 @@ const Game = ({ $app }: { $app: HTMLDivElement | null }): void => { const carNamesInput: HTMLInputElement = document.querySelector('input[type="text"]') as HTMLInputElement; if (raceCountInput && carNamesInput.value !== '') { - const result: Car[] = RaceComponent({ + RaceComponent({ + $app, count: Number(raceCountInput.value), }); - WinnerComponent({ $app, cars: result }); } else { alert('μžλ™μ°¨ 이름 λ¨Όμ € μž…λ ₯ν•΄μ£Όμ„Έμš”!'); } diff --git a/src/js/modules/Race.ts b/src/js/modules/Race.ts index 7cd316854..9f95628d4 100644 --- a/src/js/modules/Race.ts +++ b/src/js/modules/Race.ts @@ -1,6 +1,7 @@ import { Car, getRandomSingleDigit } from './utils.js'; +import WinnerComponent from './Winner.js'; -const RaceComponent = ({ count }: { count: number }): Car[] => { +const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null, count: number }): void => { let _cars: Car[]; let _startTime: number = 0; @@ -27,15 +28,36 @@ const RaceComponent = ({ count }: { count: number }): Car[] => { } }; - const racingAnimationFrame = (): void => { + // const racingAnimationFrame = (): void => { + // const carPlayer: HTMLCollectionOf = document.getElementsByClassName( + // 'car-player', + // ) as HTMLCollectionOf; + + // _startTime += 1; + // if (_startTime < 100) { + // requestAnimationFrame(racingAnimationFrame); + // } else { + // for (let i = 0; i < carPlayer.length; i += 1) { + // if (getRandomSingleDigit(0, 9) >= 4) { + // _cars[i].move(); + // removeSpinner(carPlayer[i]); + // carPlayer[i].insertAdjacentHTML('afterend', '
⬇️️
'); + // } + // } + // _startTime = 0; + // } + // }; + + const wait = async (delay: number): Promise => { + return new Promise((resolve) => setTimeout(resolve, delay)); + }; + + const render = async ({ count }: { count: number }): Promise => { const carPlayer: HTMLCollectionOf = document.getElementsByClassName( 'car-player', ) as HTMLCollectionOf; - - _startTime += 1; - if (_startTime < 100) { - requestAnimationFrame(racingAnimationFrame); - } else { + let tryCount: number = count; + while (tryCount > 0) { for (let i = 0; i < carPlayer.length; i += 1) { if (getRandomSingleDigit(0, 9) >= 4) { _cars[i].move(); @@ -43,19 +65,12 @@ const RaceComponent = ({ count }: { count: number }): Car[] => { carPlayer[i].insertAdjacentHTML('afterend', '
⬇️️
'); } } - _startTime = 0; - } - }; - - const render = ({ count }: { count: number }): void => { - let tryCount: number = count; - while (tryCount > 0) { - requestAnimationFrame(racingAnimationFrame); tryCount -= 1; + await wait(1000); } }; - const init = (count: number): Car[] => { + const init = async (count: number): Promise => { if (!checkValidCount(count)) { alert(`μœ νš¨ν•˜μ§€ μ•Šμ€ μž…λ ₯μž…λ‹ˆλ‹€. μž¬μž…λ ₯ ν•΄μ£Όμ„Έμš”.`); const racingCountInput = document.getElementById('racing-count-input') as HTMLInputElement; @@ -63,11 +78,12 @@ const RaceComponent = ({ count }: { count: number }): Car[] => { racingCountInput.focus(); } _cars = assignCarsName(); - render({ count }); - return _cars; + await render({ count }); + WinnerComponent({ $app, cars: _cars }); + return ; }; - return init(count); + init(count); }; export default RaceComponent; diff --git a/src/js/modules/Winner.ts b/src/js/modules/Winner.ts index 487efbfd4..bd815a45b 100644 --- a/src/js/modules/Winner.ts +++ b/src/js/modules/Winner.ts @@ -6,23 +6,21 @@ import RaceComponent from './Race.js'; const carNameInputEvent = (): void => { const carNamesInput: HTMLInputElement = document.getElementById('car-name-input') as HTMLInputElement; - if (carNamesInput) { - CarNameComponent({ - $app: document.querySelector('#app'), - carNames: carNamesInput.value, - }); + CarNameComponent({ $app: document.querySelector('#app'), carNames: carNamesInput.value }); } }; const raceCountInputEvent = () => { const raceCountInput: HTMLInputElement = document.querySelector('input[type="number"]') as HTMLInputElement; + const carNamesInput: HTMLInputElement = document.querySelector('input[type="text"]') as HTMLInputElement; - if (raceCountInput) { - const result = RaceComponent({ count: Number(raceCountInput.value) }); - WinnerComponent({ + if (raceCountInput && carNamesInput.value !== '') { + RaceComponent({ $app: document.querySelector('#app'), - cars: result, + count: Number(raceCountInput.value), }); + } else { + alert('μžλ™μ°¨ 이름 λ¨Όμ € μž…λ ₯ν•΄μ£Όμ„Έμš”!'); } }; const inputController = (): void => { From af3063505e5b2d8b061d502b676ce032fbc1b622 Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Thu, 3 Jun 2021 14:32:04 +0900 Subject: [PATCH 16/35] =?UTF-8?q?feat:=20=EC=8A=A4=ED=94=BC=EB=84=88=20?= =?UTF-8?q?=EB=A7=88=EC=A7=80=EB=A7=89=20=EC=A7=84=ED=96=89=20=ED=9A=9F?= =?UTF-8?q?=EC=88=98=EA=B0=80=20=EB=81=9D=EB=82=98=EB=A9=B4=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/js/modules/Race.js | 27 ++++----------------------- dist/js/modules/utils.js | 14 +++++++++++++- docs/README.md | 5 +++-- src/js/modules/Race.ts | 34 ++++++---------------------------- src/js/modules/utils.ts | 6 +++++- 5 files changed, 31 insertions(+), 55 deletions(-) diff --git a/dist/js/modules/Race.js b/dist/js/modules/Race.js index 1fb8c91a1..730a241c5 100644 --- a/dist/js/modules/Race.js +++ b/dist/js/modules/Race.js @@ -7,7 +7,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; -import { Car, getRandomSingleDigit } from './utils.js'; +import { Car, getRandomSingleDigit, wait } from './utils.js'; import WinnerComponent from './Winner.js'; const RaceComponent = ({ $app, count }) => { let _cars; @@ -33,27 +33,6 @@ const RaceComponent = ({ $app, count }) => { (_d = (_c = carPlayer.parentNode) === null || _c === void 0 ? void 0 : _c.lastElementChild) === null || _d === void 0 ? void 0 : _d.remove(); } }; - // const racingAnimationFrame = (): void => { - // const carPlayer: HTMLCollectionOf = document.getElementsByClassName( - // 'car-player', - // ) as HTMLCollectionOf; - // _startTime += 1; - // if (_startTime < 100) { - // requestAnimationFrame(racingAnimationFrame); - // } else { - // for (let i = 0; i < carPlayer.length; i += 1) { - // if (getRandomSingleDigit(0, 9) >= 4) { - // _cars[i].move(); - // removeSpinner(carPlayer[i]); - // carPlayer[i].insertAdjacentHTML('afterend', '
⬇️️
'); - // } - // } - // _startTime = 0; - // } - // }; - const wait = (delay) => __awaiter(void 0, void 0, void 0, function* () { - return new Promise((resolve) => setTimeout(resolve, delay)); - }); const render = ({ count }) => __awaiter(void 0, void 0, void 0, function* () { const carPlayer = document.getElementsByClassName('car-player'); let tryCount = count; @@ -61,9 +40,11 @@ const RaceComponent = ({ $app, count }) => { for (let i = 0; i < carPlayer.length; i += 1) { if (getRandomSingleDigit(0, 9) >= 4) { _cars[i].move(); - removeSpinner(carPlayer[i]); carPlayer[i].insertAdjacentHTML('afterend', '
⬇️️
'); } + if (tryCount <= 1) { + removeSpinner(carPlayer[i]); + } } tryCount -= 1; yield wait(1000); diff --git a/dist/js/modules/utils.js b/dist/js/modules/utils.js index 038eb9679..0b5d64474 100644 --- a/dist/js/modules/utils.js +++ b/dist/js/modules/utils.js @@ -1,3 +1,12 @@ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; class Car { constructor(name) { this.name = name; @@ -10,4 +19,7 @@ class Car { const getRandomSingleDigit = (min, max) => { return Math.floor(Math.random() * (max + 1 - min)) + min; }; -export { Car, getRandomSingleDigit }; +const wait = (delay) => __awaiter(void 0, void 0, void 0, function* () { + return new Promise((resolve) => setTimeout(resolve, delay)); +}); +export { Car, getRandomSingleDigit, wait }; diff --git a/docs/README.md b/docs/README.md index e816599e9..f8aab7c23 100644 --- a/docs/README.md +++ b/docs/README.md @@ -23,8 +23,9 @@ - [x] spinner - [x] car-name λ²„νŠΌ λˆ„λ₯Ό λ•Œ spinner λ Œλ”λ§ ν•˜κΈ° - [x] ν•΄λ‹Ή μžλ™μ°¨ κ²½μ£Ό μ‹œμž‘ν•  λ•Œ μ‚­μ œν•˜κΈ° -- [ ] μžλ™μ°¨ κ²½μ£Ό κ²Œμž„μ˜ 턴이 μ§„ν–‰ 될 λ•Œλ§ˆλ‹€ 1초의 ν…€(progressive μž¬μƒ)을 두고 μ§„ν–‰ν•œλ‹€. - - [ ] μ• λ‹ˆλ©”μ΄μ…˜ κ΅¬ν˜„μ„ μœ„ν•΄ setInterval, setTimeout, requestAnimationFrame 을 ν™œμš©ν•œλ‹€. +- [x] μžλ™μ°¨ κ²½μ£Ό κ²Œμž„μ˜ 턴이 μ§„ν–‰ 될 λ•Œλ§ˆλ‹€ 1초의 ν…€(progressive μž¬μƒ)을 두고 μ§„ν–‰ν•œλ‹€. + - [x] μ• λ‹ˆλ©”μ΄μ…˜ κ΅¬ν˜„μ„ μœ„ν•΄ setInterval, setTimeout, requestAnimationFrame 을 ν™œμš©ν•œλ‹€. + - [ ] spinner λ§ˆμ§€λ§‰ λ ˆμ΄μŠ€κ°€ μ™„λ£Œ 됐을 λ•Œ μ—†μ• κΈ°. - [ ] μ •μƒμ μœΌλ‘œ κ²Œμž„μ˜ 턴이 λ‹€ λ™μž‘λœ ν›„μ—λŠ” κ²°κ³Όλ₯Ό 보여주고, 2초 후에 μΆ•ν•˜μ˜ alert λ©”μ„Έμ§€λ₯Ό λ„μš΄λ‹€. - [ ] μœ„ κΈ°λŠ₯듀이 μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜λŠ”μ§€ Cypressλ₯Ό μ΄μš©ν•΄ ν…ŒμŠ€νŠΈν•œλ‹€. diff --git a/src/js/modules/Race.ts b/src/js/modules/Race.ts index 9f95628d4..bde1b544e 100644 --- a/src/js/modules/Race.ts +++ b/src/js/modules/Race.ts @@ -1,7 +1,7 @@ -import { Car, getRandomSingleDigit } from './utils.js'; +import { Car, getRandomSingleDigit, wait } from './utils.js'; import WinnerComponent from './Winner.js'; -const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null, count: number }): void => { +const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: number }): void => { let _cars: Car[]; let _startTime: number = 0; @@ -28,30 +28,6 @@ const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null, count: nu } }; - // const racingAnimationFrame = (): void => { - // const carPlayer: HTMLCollectionOf = document.getElementsByClassName( - // 'car-player', - // ) as HTMLCollectionOf; - - // _startTime += 1; - // if (_startTime < 100) { - // requestAnimationFrame(racingAnimationFrame); - // } else { - // for (let i = 0; i < carPlayer.length; i += 1) { - // if (getRandomSingleDigit(0, 9) >= 4) { - // _cars[i].move(); - // removeSpinner(carPlayer[i]); - // carPlayer[i].insertAdjacentHTML('afterend', '
⬇️️
'); - // } - // } - // _startTime = 0; - // } - // }; - - const wait = async (delay: number): Promise => { - return new Promise((resolve) => setTimeout(resolve, delay)); - }; - const render = async ({ count }: { count: number }): Promise => { const carPlayer: HTMLCollectionOf = document.getElementsByClassName( 'car-player', @@ -61,9 +37,11 @@ const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null, count: nu for (let i = 0; i < carPlayer.length; i += 1) { if (getRandomSingleDigit(0, 9) >= 4) { _cars[i].move(); - removeSpinner(carPlayer[i]); carPlayer[i].insertAdjacentHTML('afterend', '
⬇️️
'); } + if (tryCount <= 1) { + removeSpinner(carPlayer[i]); + } } tryCount -= 1; await wait(1000); @@ -80,7 +58,7 @@ const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null, count: nu _cars = assignCarsName(); await render({ count }); WinnerComponent({ $app, cars: _cars }); - return ; + return; }; init(count); diff --git a/src/js/modules/utils.ts b/src/js/modules/utils.ts index f99ba1996..777b6b810 100644 --- a/src/js/modules/utils.ts +++ b/src/js/modules/utils.ts @@ -16,4 +16,8 @@ const getRandomSingleDigit = (min: number, max: number): number => { return Math.floor(Math.random() * (max + 1 - min)) + min; }; -export { Car, getRandomSingleDigit }; +const wait = async (delay: number): Promise => { + return new Promise((resolve) => setTimeout(resolve, delay)); +}; + +export { Car, getRandomSingleDigit, wait }; From 978394db70bce6da0e7b4d04be8bdc30254cfe0b Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Thu, 3 Jun 2021 14:51:07 +0900 Subject: [PATCH 17/35] =?UTF-8?q?feat:=20=EA=B8=B0=EB=8A=A5=EA=B5=AC?= =?UTF-8?q?=ED=98=84:=20=EC=A0=95=EC=83=81=EC=A0=81=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=EC=9D=98=20=ED=84=B4=EC=9D=B4=20=EB=8B=A4=20?= =?UTF-8?q?=EB=8F=99=EC=9E=91=EB=90=9C=20=ED=9B=84=EC=97=90=EB=8A=94=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=EB=A5=BC=20=EB=B3=B4=EC=97=AC=EC=A3=BC?= =?UTF-8?q?=EA=B3=A0,=202=EC=B4=88=20=ED=9B=84=EC=97=90=20=EC=B6=95?= =?UTF-8?q?=ED=95=98=EC=9D=98=20alert=20=EB=A9=94=EC=84=B8=EC=A7=80?= =?UTF-8?q?=EB=A5=BC=20=EB=9D=84=EC=9A=B4=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/js/modules/Race.js | 2 ++ docs/README.md | 4 ++-- src/js/modules/Race.ts | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/dist/js/modules/Race.js b/dist/js/modules/Race.js index 730a241c5..0d420120b 100644 --- a/dist/js/modules/Race.js +++ b/dist/js/modules/Race.js @@ -60,6 +60,8 @@ const RaceComponent = ({ $app, count }) => { _cars = assignCarsName(); yield render({ count }); WinnerComponent({ $app, cars: _cars }); + yield wait(2000); + alert('πŸ† μΆ•ν•˜ν•©λ‹ˆλ‹€ γ…Žγ…Ž μ΅œμ’… 우승자: EAST, WEST, SOUTH, NORTH πŸ†'); return; }); init(count); diff --git a/docs/README.md b/docs/README.md index f8aab7c23..41ca24bd2 100644 --- a/docs/README.md +++ b/docs/README.md @@ -25,8 +25,8 @@ - [x] ν•΄λ‹Ή μžλ™μ°¨ κ²½μ£Ό μ‹œμž‘ν•  λ•Œ μ‚­μ œν•˜κΈ° - [x] μžλ™μ°¨ κ²½μ£Ό κ²Œμž„μ˜ 턴이 μ§„ν–‰ 될 λ•Œλ§ˆλ‹€ 1초의 ν…€(progressive μž¬μƒ)을 두고 μ§„ν–‰ν•œλ‹€. - [x] μ• λ‹ˆλ©”μ΄μ…˜ κ΅¬ν˜„μ„ μœ„ν•΄ setInterval, setTimeout, requestAnimationFrame 을 ν™œμš©ν•œλ‹€. - - [ ] spinner λ§ˆμ§€λ§‰ λ ˆμ΄μŠ€κ°€ μ™„λ£Œ 됐을 λ•Œ μ—†μ• κΈ°. -- [ ] μ •μƒμ μœΌλ‘œ κ²Œμž„μ˜ 턴이 λ‹€ λ™μž‘λœ ν›„μ—λŠ” κ²°κ³Όλ₯Ό 보여주고, 2초 후에 μΆ•ν•˜μ˜ alert λ©”μ„Έμ§€λ₯Ό λ„μš΄λ‹€. + - [x] spinner λ§ˆμ§€λ§‰ λ ˆμ΄μŠ€κ°€ μ™„λ£Œ 됐을 λ•Œ μ—†μ• κΈ°. +- [x] μ •μƒμ μœΌλ‘œ κ²Œμž„μ˜ 턴이 λ‹€ λ™μž‘λœ ν›„μ—λŠ” κ²°κ³Όλ₯Ό 보여주고, 2초 후에 μΆ•ν•˜μ˜ alert λ©”μ„Έμ§€λ₯Ό λ„μš΄λ‹€. - [ ] μœ„ κΈ°λŠ₯듀이 μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜λŠ”μ§€ Cypressλ₯Ό μ΄μš©ν•΄ ν…ŒμŠ€νŠΈν•œλ‹€. html μš”μ†Œ λ’€μ–΄κΊΌλΆ€ν„° μ‚­μ œν•΄μ•Όν•¨. ν•˜λ‚˜μ”© μ €μ ˆλ‘œ λ°€λ €μ„œ 정렬됨. diff --git a/src/js/modules/Race.ts b/src/js/modules/Race.ts index bde1b544e..7e55e41c9 100644 --- a/src/js/modules/Race.ts +++ b/src/js/modules/Race.ts @@ -58,6 +58,8 @@ const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: nu _cars = assignCarsName(); await render({ count }); WinnerComponent({ $app, cars: _cars }); + await wait(2000); + alert('πŸ† μΆ•ν•˜ν•©λ‹ˆλ‹€ γ…Žγ…Ž μ΅œμ’… 우승자: EAST, WEST, SOUTH, NORTH πŸ†') return; }; From 36e7cb3f0f24062e05724d3407c03faa30761a6d Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Thu, 3 Jun 2021 14:56:12 +0900 Subject: [PATCH 18/35] =?UTF-8?q?refactor:=20@share=20=ED=8F=B4=EB=8D=94?= =?UTF-8?q?=EB=A5=BC=20=EA=B3=B5=EC=9A=A9=EC=9C=BC=EB=A1=9C=20=EB=A7=8C?= =?UTF-8?q?=EB=93=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/js/modules/@share/utils.js | 25 +++++++++++++++++++++++++ dist/js/modules/Race.js | 3 +-- src/js/modules/{ => @share}/utils.ts | 0 src/js/modules/Game.ts | 1 - src/js/modules/Race.ts | 5 ++--- src/js/modules/Winner.ts | 2 +- 6 files changed, 29 insertions(+), 7 deletions(-) create mode 100644 dist/js/modules/@share/utils.js rename src/js/modules/{ => @share}/utils.ts (100%) diff --git a/dist/js/modules/@share/utils.js b/dist/js/modules/@share/utils.js new file mode 100644 index 000000000..0b5d64474 --- /dev/null +++ b/dist/js/modules/@share/utils.js @@ -0,0 +1,25 @@ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +class Car { + constructor(name) { + this.name = name; + this.distance = 0; + } + move() { + this.distance += 1; + } +} +const getRandomSingleDigit = (min, max) => { + return Math.floor(Math.random() * (max + 1 - min)) + min; +}; +const wait = (delay) => __awaiter(void 0, void 0, void 0, function* () { + return new Promise((resolve) => setTimeout(resolve, delay)); +}); +export { Car, getRandomSingleDigit, wait }; diff --git a/dist/js/modules/Race.js b/dist/js/modules/Race.js index 0d420120b..c4d35683f 100644 --- a/dist/js/modules/Race.js +++ b/dist/js/modules/Race.js @@ -7,11 +7,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; -import { Car, getRandomSingleDigit, wait } from './utils.js'; +import { Car, getRandomSingleDigit, wait } from './@share/utils.js'; import WinnerComponent from './Winner.js'; const RaceComponent = ({ $app, count }) => { let _cars; - let _startTime = 0; const checkValidCount = (count) => { return count - Math.floor(count) === 0 && count > 0; }; diff --git a/src/js/modules/utils.ts b/src/js/modules/@share/utils.ts similarity index 100% rename from src/js/modules/utils.ts rename to src/js/modules/@share/utils.ts diff --git a/src/js/modules/Game.ts b/src/js/modules/Game.ts index e442e0950..e66d33e63 100644 --- a/src/js/modules/Game.ts +++ b/src/js/modules/Game.ts @@ -1,6 +1,5 @@ import CarNameComponent from './CarName.js'; import RaceComponent from './Race.js'; -import { Car } from './utils.js'; const Game = ({ $app }: { $app: HTMLDivElement | null }): void => { const carNameInputEvent = (): void => { diff --git a/src/js/modules/Race.ts b/src/js/modules/Race.ts index 7e55e41c9..7ae52b166 100644 --- a/src/js/modules/Race.ts +++ b/src/js/modules/Race.ts @@ -1,9 +1,8 @@ -import { Car, getRandomSingleDigit, wait } from './utils.js'; +import { Car, getRandomSingleDigit, wait } from './@share/utils.js'; import WinnerComponent from './Winner.js'; const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: number }): void => { let _cars: Car[]; - let _startTime: number = 0; const checkValidCount = (count: number): boolean => { return count - Math.floor(count) === 0 && count > 0; @@ -59,7 +58,7 @@ const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: nu await render({ count }); WinnerComponent({ $app, cars: _cars }); await wait(2000); - alert('πŸ† μΆ•ν•˜ν•©λ‹ˆλ‹€ γ…Žγ…Ž μ΅œμ’… 우승자: EAST, WEST, SOUTH, NORTH πŸ†') + alert('πŸ† μΆ•ν•˜ν•©λ‹ˆλ‹€ γ…Žγ…Ž μ΅œμ’… 우승자: EAST, WEST, SOUTH, NORTH πŸ†'); return; }; diff --git a/src/js/modules/Winner.ts b/src/js/modules/Winner.ts index bd815a45b..0d9d28e86 100644 --- a/src/js/modules/Winner.ts +++ b/src/js/modules/Winner.ts @@ -1,4 +1,4 @@ -import { Car } from './utils.js'; +import { Car } from './@share/utils.js'; /* React Component κ΅¬μ‘°μ˜€μœΌλ©΄ props둜 ν•¨μˆ˜λ₯Ό λ„˜κ²Όμ„ 것이닀. */ import CarNameComponent from './CarName.js'; From a31cfe81d5aac4cea2a04e2fd703f0c9698804a7 Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Thu, 3 Jun 2021 15:12:53 +0900 Subject: [PATCH 19/35] =?UTF-8?q?refactor:=20=EA=B3=B5=ED=86=B5=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=BA=BC=EC=88=98=20=EC=9E=88=EB=8A=94=EA=B1=B0=20?= =?UTF-8?q?=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81=20view,=20controller=20?= =?UTF-8?q?=EB=B0=8F=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EB=8B=A4=EB=A5=B8=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/js/modules/@share/controller.js | 27 +++++++++++++++++ dist/js/modules/@share/view.js | 28 ++++++++++++++++++ dist/js/modules/CarName.js | 18 +----------- dist/js/modules/Winner.js | 40 ++------------------------ src/js/modules/@share/controller.ts | 29 +++++++++++++++++++ src/js/modules/@share/message.ts | 9 ++++++ src/js/modules/@share/view.ts | 31 ++++++++++++++++++++ src/js/modules/CarName.ts | 22 ++------------ src/js/modules/Game.ts | 3 +- src/js/modules/Race.ts | 5 ++-- src/js/modules/Winner.ts | 43 ++-------------------------- 11 files changed, 137 insertions(+), 118 deletions(-) create mode 100644 dist/js/modules/@share/controller.js create mode 100644 dist/js/modules/@share/view.js create mode 100644 src/js/modules/@share/controller.ts create mode 100644 src/js/modules/@share/message.ts create mode 100644 src/js/modules/@share/view.ts diff --git a/dist/js/modules/@share/controller.js b/dist/js/modules/@share/controller.js new file mode 100644 index 000000000..332a4da74 --- /dev/null +++ b/dist/js/modules/@share/controller.js @@ -0,0 +1,27 @@ +import CarNameComponent from '../CarName.js'; +import RaceComponent from '../Race.js'; +const carNameInputEvent = () => { + const carNamesInput = document.getElementById('car-name-input'); + if (carNamesInput) { + CarNameComponent({ $app: document.querySelector('#app'), carNames: carNamesInput.value }); + } +}; +const raceCountInputEvent = () => { + const raceCountInput = document.querySelector('input[type="number"]'); + const carNamesInput = document.querySelector('input[type="text"]'); + if (raceCountInput && carNamesInput.value !== '') { + RaceComponent({ + $app: document.querySelector('#app'), + count: Number(raceCountInput.value), + }); + } + else { + alert('μžλ™μ°¨ 이름 λ¨Όμ € μž…λ ₯ν•΄μ£Όμ„Έμš”!'); + } +}; +const inputController = () => { + const gameButton = document.getElementsByTagName('button'); + gameButton[0].onclick = carNameInputEvent; + gameButton[1].onclick = raceCountInputEvent; +}; +export { inputController }; diff --git a/dist/js/modules/@share/view.js b/dist/js/modules/@share/view.js new file mode 100644 index 000000000..1c03e3e92 --- /dev/null +++ b/dist/js/modules/@share/view.js @@ -0,0 +1,28 @@ +const carNamesSection = (carNames) => { + return `
+
+ ${carNames} +
+
`; +}; +const carNameDiv = (carName) => { + return `
+
${carName}
+
+
+ +
+
+
`; +}; +const winnerSection = (winner) => { + return `
+
+

πŸ† μ΅œμ’… 우승자: ${winner} πŸ†

+
+ +
+
+
`; +}; +export { carNamesSection, carNameDiv, winnerSection }; diff --git a/dist/js/modules/CarName.js b/dist/js/modules/CarName.js index 76fb34141..2d5270c48 100644 --- a/dist/js/modules/CarName.js +++ b/dist/js/modules/CarName.js @@ -1,20 +1,4 @@ -const carNamesSection = (carNames) => { - return `
-
- ${carNames} -
-
`; -}; -const carNameDiv = (carName) => { - return `
-
${carName}
-
-
- -
-
-
`; -}; +import { carNamesSection, carNameDiv } from './@share/view.js'; const CarNameComponent = ({ $app, carNames }) => { const checkCarNames = (carNameList) => carNameList.length === carNameList.filter((x) => x.length <= 5 && x !== '').length; const render = (JSX) => { diff --git a/dist/js/modules/Winner.js b/dist/js/modules/Winner.js index 0402838d7..9f95b6c8f 100644 --- a/dist/js/modules/Winner.js +++ b/dist/js/modules/Winner.js @@ -1,41 +1,5 @@ -/* React Component κ΅¬μ‘°μ˜€μœΌλ©΄ props둜 ν•¨μˆ˜λ₯Ό λ„˜κ²Όμ„ 것이닀. */ -import CarNameComponent from './CarName.js'; -import RaceComponent from './Race.js'; -const carNameInputEvent = () => { - const carNamesInput = document.getElementById('car-name-input'); - if (carNamesInput) { - CarNameComponent({ $app: document.querySelector('#app'), carNames: carNamesInput.value }); - } -}; -const raceCountInputEvent = () => { - const raceCountInput = document.querySelector('input[type="number"]'); - const carNamesInput = document.querySelector('input[type="text"]'); - if (raceCountInput && carNamesInput.value !== '') { - RaceComponent({ - $app: document.querySelector('#app'), - count: Number(raceCountInput.value), - }); - } - else { - alert('μžλ™μ°¨ 이름 λ¨Όμ € μž…λ ₯ν•΄μ£Όμ„Έμš”!'); - } -}; -const inputController = () => { - const gameButton = document.getElementsByTagName('button'); - gameButton[0].onclick = carNameInputEvent; - gameButton[1].onclick = raceCountInputEvent; -}; -/*****************************************************/ -const winnerSection = (winner) => { - return `
-
-

πŸ† μ΅œμ’… 우승자: ${winner} πŸ†

-
- -
-
-
`; -}; +import { inputController } from './@share/controller.js'; +import { winnerSection } from './@share/view.js'; const WinnerComponent = ({ $app, cars }) => { const findWinners = (cars) => { const totalDistances = cars.map((car) => car.distance); diff --git a/src/js/modules/@share/controller.ts b/src/js/modules/@share/controller.ts new file mode 100644 index 000000000..a7da117d4 --- /dev/null +++ b/src/js/modules/@share/controller.ts @@ -0,0 +1,29 @@ +import CarNameComponent from '../CarName.js'; +import RaceComponent from '../Race.js'; + +const carNameInputEvent = (): void => { + const carNamesInput: HTMLInputElement = document.getElementById('car-name-input') as HTMLInputElement; + if (carNamesInput) { + CarNameComponent({ $app: document.querySelector('#app'), carNames: carNamesInput.value }); + } +}; +const raceCountInputEvent = () => { + const raceCountInput: HTMLInputElement = document.querySelector('input[type="number"]') as HTMLInputElement; + const carNamesInput: HTMLInputElement = document.querySelector('input[type="text"]') as HTMLInputElement; + + if (raceCountInput && carNamesInput.value !== '') { + RaceComponent({ + $app: document.querySelector('#app'), + count: Number(raceCountInput.value), + }); + } else { + alert('μžλ™μ°¨ 이름 λ¨Όμ € μž…λ ₯ν•΄μ£Όμ„Έμš”!'); + } +}; +const inputController = (): void => { + const gameButton: HTMLCollectionOf = document.getElementsByTagName('button'); + gameButton[0].onclick = carNameInputEvent; + gameButton[1].onclick = raceCountInputEvent; +}; + +export { inputController }; diff --git a/src/js/modules/@share/message.ts b/src/js/modules/@share/message.ts new file mode 100644 index 000000000..6a03ef507 --- /dev/null +++ b/src/js/modules/@share/message.ts @@ -0,0 +1,9 @@ +export const ERROR_MESSAGE = { + INVALID_CAR_NAME_INPUT: 'μœ νš¨ν•˜μ§€ μ•Šμ€ μžλ™μ°¨ μ΄λ¦„μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ ν•΄μ£Όμ„Έμš”.', + INVALID_INPUT_PROCEDURE: 'μžλ™μ°¨ 이름 λ¨Όμ € μž…λ ₯ν•΄μ£Όμ„Έμš”!', + INVALID_COUNT_INPUT: 'μœ νš¨ν•˜μ§€ μ•Šμ€ 횟수 μž…λ ₯μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ ν•΄μ£Όμ„Έμš”.' +}; + +export const MESSAGE = { + CELEBRATE_WINNER: 'πŸ† μΆ•ν•˜ν•©λ‹ˆλ‹€ γ…Žγ…Ž μ΅œμ’… 우승자: EAST, WEST, SOUTH, NORTH πŸ†' +} diff --git a/src/js/modules/@share/view.ts b/src/js/modules/@share/view.ts new file mode 100644 index 000000000..53435c781 --- /dev/null +++ b/src/js/modules/@share/view.ts @@ -0,0 +1,31 @@ +const carNamesSection = (carNames: string): string => { + return `
+
+ ${carNames} +
+
`; +}; + +const carNameDiv = (carName: string): string => { + return `
+
${carName}
+
+
+ +
+
+
`; +}; + +const winnerSection = (winner: string): string => { + return `
+
+

πŸ† μ΅œμ’… 우승자: ${winner} πŸ†

+
+ +
+
+
`; +}; + +export { carNamesSection, carNameDiv, winnerSection }; diff --git a/src/js/modules/CarName.ts b/src/js/modules/CarName.ts index fbe80efc8..954d8c002 100644 --- a/src/js/modules/CarName.ts +++ b/src/js/modules/CarName.ts @@ -1,21 +1,5 @@ -const carNamesSection = (carNames: string): string => { - return `
-
- ${carNames} -
-
`; -}; - -const carNameDiv = (carName: string): string => { - return `
-
${carName}
-
-
- -
-
-
`; -}; +import { carNamesSection, carNameDiv } from './@share/view.js'; +import { ERROR_MESSAGE } from './@share/message.js'; const CarNameComponent = ({ $app, carNames }: { $app: HTMLDivElement | null; carNames: string }): void => { const checkCarNames = (carNameList: string[]) => @@ -34,7 +18,7 @@ const CarNameComponent = ({ $app, carNames }: { $app: HTMLDivElement | null; car if (checkCarNames(carNameList)) { render(carNamesSection(carNameList.map((carName) => carNameDiv(carName)).join(''))); } else { - alert('μœ νš¨ν•˜μ§€ μ•Šμ€ μž…λ ₯μž…λ‹ˆλ‹€. μž¬μž…λ ₯ ν•΄μ£Όμ„Έμš”.'); + alert(ERROR_MESSAGE.INVALID_CAR_NAME_INPUT); const carNameInput = document.getElementById('car-name-input') as HTMLInputElement; carNameInput.value = ''; carNameInput.focus(); diff --git a/src/js/modules/Game.ts b/src/js/modules/Game.ts index e66d33e63..0557199af 100644 --- a/src/js/modules/Game.ts +++ b/src/js/modules/Game.ts @@ -1,5 +1,6 @@ import CarNameComponent from './CarName.js'; import RaceComponent from './Race.js'; +import { ERROR_MESSAGE } from './@share/message.js'; const Game = ({ $app }: { $app: HTMLDivElement | null }): void => { const carNameInputEvent = (): void => { @@ -18,7 +19,7 @@ const Game = ({ $app }: { $app: HTMLDivElement | null }): void => { count: Number(raceCountInput.value), }); } else { - alert('μžλ™μ°¨ 이름 λ¨Όμ € μž…λ ₯ν•΄μ£Όμ„Έμš”!'); + alert(ERROR_MESSAGE.INVALID_INPUT_PROCEDURE); } }; diff --git a/src/js/modules/Race.ts b/src/js/modules/Race.ts index 7ae52b166..749606859 100644 --- a/src/js/modules/Race.ts +++ b/src/js/modules/Race.ts @@ -1,5 +1,6 @@ import { Car, getRandomSingleDigit, wait } from './@share/utils.js'; import WinnerComponent from './Winner.js'; +import { ERROR_MESSAGE, MESSAGE } from './@share/message.js'; const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: number }): void => { let _cars: Car[]; @@ -49,7 +50,7 @@ const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: nu const init = async (count: number): Promise => { if (!checkValidCount(count)) { - alert(`μœ νš¨ν•˜μ§€ μ•Šμ€ μž…λ ₯μž…λ‹ˆλ‹€. μž¬μž…λ ₯ ν•΄μ£Όμ„Έμš”.`); + alert(ERROR_MESSAGE.INVALID_COUNT_INPUT); const racingCountInput = document.getElementById('racing-count-input') as HTMLInputElement; racingCountInput.value = ''; racingCountInput.focus(); @@ -58,7 +59,7 @@ const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: nu await render({ count }); WinnerComponent({ $app, cars: _cars }); await wait(2000); - alert('πŸ† μΆ•ν•˜ν•©λ‹ˆλ‹€ γ…Žγ…Ž μ΅œμ’… 우승자: EAST, WEST, SOUTH, NORTH πŸ†'); + alert(MESSAGE.CELEBRATE_WINNER); return; }; diff --git a/src/js/modules/Winner.ts b/src/js/modules/Winner.ts index 0d9d28e86..c2322349b 100644 --- a/src/js/modules/Winner.ts +++ b/src/js/modules/Winner.ts @@ -1,45 +1,6 @@ import { Car } from './@share/utils.js'; - -/* React Component κ΅¬μ‘°μ˜€μœΌλ©΄ props둜 ν•¨μˆ˜λ₯Ό λ„˜κ²Όμ„ 것이닀. */ -import CarNameComponent from './CarName.js'; -import RaceComponent from './Race.js'; - -const carNameInputEvent = (): void => { - const carNamesInput: HTMLInputElement = document.getElementById('car-name-input') as HTMLInputElement; - if (carNamesInput) { - CarNameComponent({ $app: document.querySelector('#app'), carNames: carNamesInput.value }); - } -}; -const raceCountInputEvent = () => { - const raceCountInput: HTMLInputElement = document.querySelector('input[type="number"]') as HTMLInputElement; - const carNamesInput: HTMLInputElement = document.querySelector('input[type="text"]') as HTMLInputElement; - - if (raceCountInput && carNamesInput.value !== '') { - RaceComponent({ - $app: document.querySelector('#app'), - count: Number(raceCountInput.value), - }); - } else { - alert('μžλ™μ°¨ 이름 λ¨Όμ € μž…λ ₯ν•΄μ£Όμ„Έμš”!'); - } -}; -const inputController = (): void => { - const gameButton: HTMLCollectionOf = document.getElementsByTagName('button'); - gameButton[0].onclick = carNameInputEvent; - gameButton[1].onclick = raceCountInputEvent; -}; -/*****************************************************/ - -const winnerSection = (winner: string): string => { - return `
-
-

πŸ† μ΅œμ’… 우승자: ${winner} πŸ†

-
- -
-
-
`; -}; +import { inputController } from './@share/controller.js'; +import { winnerSection } from './@share/view.js'; const WinnerComponent = ({ $app, cars }: { $app: HTMLDivElement | null; cars: Car[] }): void => { const findWinners = (cars: Car[]): string[] => { From f6e5b5cdba4e1ee5b9b0a19a40a37b4ae8bf94e2 Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Thu, 3 Jun 2021 15:35:47 +0900 Subject: [PATCH 20/35] =?UTF-8?q?refactor:=20index.html=EC=97=90=20div=20t?= =?UTF-8?q?ag=EB=A7=8C=20=EB=82=A8=EA=B8=B0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/js/modules/@share/message.js | 8 +++++++ dist/js/modules/@share/view.js | 34 ++++++++++++++++++++++++++- dist/js/modules/CarName.js | 3 ++- dist/js/modules/Game.js | 36 +++++++--------------------- dist/js/modules/Race.js | 5 ++-- docs/README.md | 7 ++++++ index.html | 35 +-------------------------- src/js/modules/@share/view.ts | 36 +++++++++++++++++++++++++++- src/js/modules/Game.ts | 39 +++++++------------------------ 9 files changed, 107 insertions(+), 96 deletions(-) create mode 100644 dist/js/modules/@share/message.js diff --git a/dist/js/modules/@share/message.js b/dist/js/modules/@share/message.js new file mode 100644 index 000000000..86e699fa7 --- /dev/null +++ b/dist/js/modules/@share/message.js @@ -0,0 +1,8 @@ +export const ERROR_MESSAGE = { + INVALID_CAR_NAME_INPUT: 'μœ νš¨ν•˜μ§€ μ•Šμ€ μžλ™μ°¨ μ΄λ¦„μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ ν•΄μ£Όμ„Έμš”.', + INVALID_INPUT_PROCEDURE: 'μžλ™μ°¨ 이름 λ¨Όμ € μž…λ ₯ν•΄μ£Όμ„Έμš”!', + INVALID_COUNT_INPUT: 'μœ νš¨ν•˜μ§€ μ•Šμ€ 횟수 μž…λ ₯μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ ν•΄μ£Όμ„Έμš”.' +}; +export const MESSAGE = { + CELEBRATE_WINNER: 'πŸ† μΆ•ν•˜ν•©λ‹ˆλ‹€ γ…Žγ…Ž μ΅œμ’… 우승자: EAST, WEST, SOUTH, NORTH πŸ†' +}; diff --git a/dist/js/modules/@share/view.js b/dist/js/modules/@share/view.js index 1c03e3e92..66ce4b239 100644 --- a/dist/js/modules/@share/view.js +++ b/dist/js/modules/@share/view.js @@ -1,3 +1,35 @@ +const startSection = `
+
+
+

🏎️ μžλ™μ°¨ κ²½μ£Ό κ²Œμž„

+

+ 5자 μ΄ν•˜μ˜ μžλ™μ°¨ 이름을 콀마둜 κ΅¬λΆ„ν•˜μ—¬ μž…λ ₯ν•΄μ£Όμ„Έμš”.
+ μ˜ˆμ‹œ) EAST, WEST, SOUTH, NORTH +

+
+ + +
+
+
+

μ‹œλ„ν•  횟수λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.

+
+ + +
+
+
+
`; const carNamesSection = (carNames) => { return `
@@ -25,4 +57,4 @@ const winnerSection = (winner) => {
`; }; -export { carNamesSection, carNameDiv, winnerSection }; +export { startSection, carNamesSection, carNameDiv, winnerSection }; diff --git a/dist/js/modules/CarName.js b/dist/js/modules/CarName.js index 2d5270c48..6b174ff6a 100644 --- a/dist/js/modules/CarName.js +++ b/dist/js/modules/CarName.js @@ -1,4 +1,5 @@ import { carNamesSection, carNameDiv } from './@share/view.js'; +import { ERROR_MESSAGE } from './@share/message.js'; const CarNameComponent = ({ $app, carNames }) => { const checkCarNames = (carNameList) => carNameList.length === carNameList.filter((x) => x.length <= 5 && x !== '').length; const render = (JSX) => { @@ -14,7 +15,7 @@ const CarNameComponent = ({ $app, carNames }) => { render(carNamesSection(carNameList.map((carName) => carNameDiv(carName)).join(''))); } else { - alert('μœ νš¨ν•˜μ§€ μ•Šμ€ μž…λ ₯μž…λ‹ˆλ‹€. μž¬μž…λ ₯ ν•΄μ£Όμ„Έμš”.'); + alert(ERROR_MESSAGE.INVALID_CAR_NAME_INPUT); const carNameInput = document.getElementById('car-name-input'); carNameInput.value = ''; carNameInput.focus(); diff --git a/dist/js/modules/Game.js b/dist/js/modules/Game.js index 59036dbd4..34c50384b 100644 --- a/dist/js/modules/Game.js +++ b/dist/js/modules/Game.js @@ -1,34 +1,16 @@ -import CarNameComponent from './CarName.js'; -import RaceComponent from './Race.js'; +import { inputController } from './@share/controller.js'; +import { startSection } from './@share/view.js'; const Game = ({ $app }) => { - const carNameInputEvent = () => { - const carNamesInput = document.getElementById('car-name-input'); - if (carNamesInput) { - CarNameComponent({ $app, carNames: carNamesInput.value }); + const render = (JSX) => { + const sectionElement = $app; + if (sectionElement) { + sectionElement.insertAdjacentHTML('beforeend', JSX); } - }; - const raceCountInputEvent = () => { - const raceCountInput = document.querySelector('input[type="number"]'); - const carNamesInput = document.querySelector('input[type="text"]'); - if (raceCountInput && carNamesInput.value !== '') { - RaceComponent({ - $app, - count: Number(raceCountInput.value), - }); - } - else { - alert('μžλ™μ°¨ 이름 λ¨Όμ € μž…λ ₯ν•΄μ£Όμ„Έμš”!'); - } - }; - const render = () => { }; - const controller = () => { - const gameButton = document.getElementsByTagName('button'); - gameButton[0].onclick = carNameInputEvent; - gameButton[1].onclick = raceCountInputEvent; + return; }; const init = () => { - render(); - controller(); + render(startSection); + inputController(); }; init(); }; diff --git a/dist/js/modules/Race.js b/dist/js/modules/Race.js index c4d35683f..224294e49 100644 --- a/dist/js/modules/Race.js +++ b/dist/js/modules/Race.js @@ -9,6 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }; import { Car, getRandomSingleDigit, wait } from './@share/utils.js'; import WinnerComponent from './Winner.js'; +import { ERROR_MESSAGE, MESSAGE } from './@share/message.js'; const RaceComponent = ({ $app, count }) => { let _cars; const checkValidCount = (count) => { @@ -51,7 +52,7 @@ const RaceComponent = ({ $app, count }) => { }); const init = (count) => __awaiter(void 0, void 0, void 0, function* () { if (!checkValidCount(count)) { - alert(`μœ νš¨ν•˜μ§€ μ•Šμ€ μž…λ ₯μž…λ‹ˆλ‹€. μž¬μž…λ ₯ ν•΄μ£Όμ„Έμš”.`); + alert(ERROR_MESSAGE.INVALID_COUNT_INPUT); const racingCountInput = document.getElementById('racing-count-input'); racingCountInput.value = ''; racingCountInput.focus(); @@ -60,7 +61,7 @@ const RaceComponent = ({ $app, count }) => { yield render({ count }); WinnerComponent({ $app, cars: _cars }); yield wait(2000); - alert('πŸ† μΆ•ν•˜ν•©λ‹ˆλ‹€ γ…Žγ…Ž μ΅œμ’… 우승자: EAST, WEST, SOUTH, NORTH πŸ†'); + alert(MESSAGE.CELEBRATE_WINNER); return; }); init(count); diff --git a/docs/README.md b/docs/README.md index 41ca24bd2..e38f2d38a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -29,4 +29,11 @@ - [x] μ •μƒμ μœΌλ‘œ κ²Œμž„μ˜ 턴이 λ‹€ λ™μž‘λœ ν›„μ—λŠ” κ²°κ³Όλ₯Ό 보여주고, 2초 후에 μΆ•ν•˜μ˜ alert λ©”μ„Έμ§€λ₯Ό λ„μš΄λ‹€. - [ ] μœ„ κΈ°λŠ₯듀이 μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜λŠ”μ§€ Cypressλ₯Ό μ΄μš©ν•΄ ν…ŒμŠ€νŠΈν•œλ‹€. +### refactoring +- [x] 파일 뢄리 +- [x] index.html에 `
`만 남기기. + +### 버그 μˆ˜μ • +- [ ] input μž…λ ₯ν•œ λ’€ λΉ„ν™œμ„±ν™” ν•˜κΈ°. + html μš”μ†Œ λ’€μ–΄κΊΌλΆ€ν„° μ‚­μ œν•΄μ•Όν•¨. ν•˜λ‚˜μ”© μ €μ ˆλ‘œ λ°€λ €μ„œ 정렬됨. diff --git a/index.html b/index.html index 52cdb0005..4cc03c5ca 100644 --- a/index.html +++ b/index.html @@ -6,40 +6,7 @@ -
-
-
-
-

🏎️ μžλ™μ°¨ κ²½μ£Ό κ²Œμž„

-

- 5자 μ΄ν•˜μ˜ μžλ™μ°¨ 이름을 콀마둜 κ΅¬λΆ„ν•˜μ—¬ μž…λ ₯ν•΄μ£Όμ„Έμš”.
- μ˜ˆμ‹œ) EAST, WEST, SOUTH, NORTH -

-
- - -
-
-
-

μ‹œλ„ν•  횟수λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.

-
- - -
-
-
-
-
+
diff --git a/src/js/modules/@share/view.ts b/src/js/modules/@share/view.ts index 53435c781..6bcb89e28 100644 --- a/src/js/modules/@share/view.ts +++ b/src/js/modules/@share/view.ts @@ -1,3 +1,37 @@ +const startSection = +`
+
+
+

🏎️ μžλ™μ°¨ κ²½μ£Ό κ²Œμž„

+

+ 5자 μ΄ν•˜μ˜ μžλ™μ°¨ 이름을 콀마둜 κ΅¬λΆ„ν•˜μ—¬ μž…λ ₯ν•΄μ£Όμ„Έμš”.
+ μ˜ˆμ‹œ) EAST, WEST, SOUTH, NORTH +

+
+ + +
+
+
+

μ‹œλ„ν•  횟수λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.

+
+ + +
+
+
+
`; + const carNamesSection = (carNames: string): string => { return `
@@ -28,4 +62,4 @@ const winnerSection = (winner: string): string => {
`; }; -export { carNamesSection, carNameDiv, winnerSection }; +export { startSection, carNamesSection, carNameDiv, winnerSection }; diff --git a/src/js/modules/Game.ts b/src/js/modules/Game.ts index 0557199af..f29bfea41 100644 --- a/src/js/modules/Game.ts +++ b/src/js/modules/Game.ts @@ -1,38 +1,17 @@ -import CarNameComponent from './CarName.js'; -import RaceComponent from './Race.js'; -import { ERROR_MESSAGE } from './@share/message.js'; +import { inputController } from './@share/controller.js'; +import { startSection } from './@share/view.js'; const Game = ({ $app }: { $app: HTMLDivElement | null }): void => { - const carNameInputEvent = (): void => { - const carNamesInput: HTMLInputElement = document.getElementById('car-name-input') as HTMLInputElement; - if (carNamesInput) { - CarNameComponent({ $app, carNames: carNamesInput.value }); + const render = (JSX: string): void => { + const sectionElement = $app; + if (sectionElement) { + sectionElement.insertAdjacentHTML('beforeend', JSX); } + return; }; - const raceCountInputEvent = () => { - const raceCountInput: HTMLInputElement = document.querySelector('input[type="number"]') as HTMLInputElement; - const carNamesInput: HTMLInputElement = document.querySelector('input[type="text"]') as HTMLInputElement; - - if (raceCountInput && carNamesInput.value !== '') { - RaceComponent({ - $app, - count: Number(raceCountInput.value), - }); - } else { - alert(ERROR_MESSAGE.INVALID_INPUT_PROCEDURE); - } - }; - - const render = (): void => {}; - const controller = (): void => { - const gameButton: HTMLCollectionOf = document.getElementsByTagName('button'); - gameButton[0].onclick = carNameInputEvent; - gameButton[1].onclick = raceCountInputEvent; - }; - const init = (): void => { - render(); - controller(); + render(startSection); + inputController(); }; init(); From 59c0a7a6531bcbc1db2f3d83ad8a62bdd9847a60 Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Thu, 3 Jun 2021 15:39:36 +0900 Subject: [PATCH 21/35] =?UTF-8?q?refactor:=20=EC=9E=90=EB=8F=99=EC=B0=A8?= =?UTF-8?q?=20=EC=9D=B4=EB=A6=84=20=EC=B4=88=EA=B8=B0=ED=99=94=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/js/modules/CarName.js | 9 ++++++--- src/js/modules/CarName.ts | 10 +++++++--- src/js/modules/Game.ts | 1 + 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/dist/js/modules/CarName.js b/dist/js/modules/CarName.js index 6b174ff6a..033be81d9 100644 --- a/dist/js/modules/CarName.js +++ b/dist/js/modules/CarName.js @@ -2,6 +2,11 @@ import { carNamesSection, carNameDiv } from './@share/view.js'; import { ERROR_MESSAGE } from './@share/message.js'; const CarNameComponent = ({ $app, carNames }) => { const checkCarNames = (carNameList) => carNameList.length === carNameList.filter((x) => x.length <= 5 && x !== '').length; + const carNameInputInit = () => { + const carNameInput = document.getElementById('car-name-input'); + carNameInput.value = ''; + carNameInput.focus(); + }; const render = (JSX) => { const sectionElement = $app; if (sectionElement) { @@ -16,9 +21,7 @@ const CarNameComponent = ({ $app, carNames }) => { } else { alert(ERROR_MESSAGE.INVALID_CAR_NAME_INPUT); - const carNameInput = document.getElementById('car-name-input'); - carNameInput.value = ''; - carNameInput.focus(); + carNameInputInit(); } }; init(carNames); diff --git a/src/js/modules/CarName.ts b/src/js/modules/CarName.ts index 954d8c002..92fde367a 100644 --- a/src/js/modules/CarName.ts +++ b/src/js/modules/CarName.ts @@ -5,6 +5,12 @@ const CarNameComponent = ({ $app, carNames }: { $app: HTMLDivElement | null; car const checkCarNames = (carNameList: string[]) => carNameList.length === carNameList.filter((x) => x.length <= 5 && x !== '').length; + const carNameInputInit = () => { + const carNameInput = document.getElementById('car-name-input') as HTMLInputElement; + carNameInput.value = ''; + carNameInput.focus(); + }; + const render = (JSX: string): void => { const sectionElement = $app; if (sectionElement) { @@ -19,9 +25,7 @@ const CarNameComponent = ({ $app, carNames }: { $app: HTMLDivElement | null; car render(carNamesSection(carNameList.map((carName) => carNameDiv(carName)).join(''))); } else { alert(ERROR_MESSAGE.INVALID_CAR_NAME_INPUT); - const carNameInput = document.getElementById('car-name-input') as HTMLInputElement; - carNameInput.value = ''; - carNameInput.focus(); + carNameInputInit(); } }; diff --git a/src/js/modules/Game.ts b/src/js/modules/Game.ts index f29bfea41..cc03dea1b 100644 --- a/src/js/modules/Game.ts +++ b/src/js/modules/Game.ts @@ -9,6 +9,7 @@ const Game = ({ $app }: { $app: HTMLDivElement | null }): void => { } return; }; + const init = (): void => { render(startSection); inputController(); From d6b60fb9865879a70295743908e6586dd9b0f9b5 Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Thu, 3 Jun 2021 15:47:27 +0900 Subject: [PATCH 22/35] =?UTF-8?q?feat:=20init=20=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=EC=9D=84=20=EB=A7=8C=EB=93=A4=EC=96=B4=EC=84=9C=20=EB=94=B0?= =?UTF-8?q?=EB=A1=9C=20init=EC=97=90=20=EA=B4=80=EB=A0=A8=ED=95=9C=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EB=A1=9C=EC=A7=81=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/js/modules/@share/controller.js | 5 ++++- dist/js/modules/@share/init.js | 11 +++++++++++ dist/js/modules/CarName.js | 6 +----- dist/js/modules/Race.js | 6 +++--- src/js/modules/@share/controller.ts | 5 ++++- src/js/modules/@share/init.ts | 13 +++++++++++++ src/js/modules/CarName.ts | 7 +------ src/js/modules/Race.ts | 6 +++--- 8 files changed, 40 insertions(+), 19 deletions(-) create mode 100644 dist/js/modules/@share/init.js create mode 100644 src/js/modules/@share/init.ts diff --git a/dist/js/modules/@share/controller.js b/dist/js/modules/@share/controller.js index 332a4da74..351b7b3d1 100644 --- a/dist/js/modules/@share/controller.js +++ b/dist/js/modules/@share/controller.js @@ -1,5 +1,7 @@ import CarNameComponent from '../CarName.js'; import RaceComponent from '../Race.js'; +import { ERROR_MESSAGE } from './message.js'; +import { carNameInputInit } from './init.js'; const carNameInputEvent = () => { const carNamesInput = document.getElementById('car-name-input'); if (carNamesInput) { @@ -16,7 +18,8 @@ const raceCountInputEvent = () => { }); } else { - alert('μžλ™μ°¨ 이름 λ¨Όμ € μž…λ ₯ν•΄μ£Όμ„Έμš”!'); + alert(ERROR_MESSAGE.INVALID_INPUT_PROCEDURE); + carNameInputInit(); } }; const inputController = () => { diff --git a/dist/js/modules/@share/init.js b/dist/js/modules/@share/init.js new file mode 100644 index 000000000..05b2776e0 --- /dev/null +++ b/dist/js/modules/@share/init.js @@ -0,0 +1,11 @@ +const carNameInputInit = () => { + const carNameInput = document.getElementById('car-name-input'); + carNameInput.value = ''; + carNameInput.focus(); +}; +const racingCountInputInit = () => { + const racingCountInput = document.getElementById('racing-count-input'); + racingCountInput.value = ''; + racingCountInput.focus(); +}; +export { carNameInputInit, racingCountInputInit }; diff --git a/dist/js/modules/CarName.js b/dist/js/modules/CarName.js index 033be81d9..65b34bbd5 100644 --- a/dist/js/modules/CarName.js +++ b/dist/js/modules/CarName.js @@ -1,12 +1,8 @@ import { carNamesSection, carNameDiv } from './@share/view.js'; import { ERROR_MESSAGE } from './@share/message.js'; +import { carNameInputInit } from './@share/init.js'; const CarNameComponent = ({ $app, carNames }) => { const checkCarNames = (carNameList) => carNameList.length === carNameList.filter((x) => x.length <= 5 && x !== '').length; - const carNameInputInit = () => { - const carNameInput = document.getElementById('car-name-input'); - carNameInput.value = ''; - carNameInput.focus(); - }; const render = (JSX) => { const sectionElement = $app; if (sectionElement) { diff --git a/dist/js/modules/Race.js b/dist/js/modules/Race.js index 224294e49..5c731231b 100644 --- a/dist/js/modules/Race.js +++ b/dist/js/modules/Race.js @@ -10,6 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge import { Car, getRandomSingleDigit, wait } from './@share/utils.js'; import WinnerComponent from './Winner.js'; import { ERROR_MESSAGE, MESSAGE } from './@share/message.js'; +import { racingCountInputInit } from './@share/init.js'; const RaceComponent = ({ $app, count }) => { let _cars; const checkValidCount = (count) => { @@ -53,9 +54,8 @@ const RaceComponent = ({ $app, count }) => { const init = (count) => __awaiter(void 0, void 0, void 0, function* () { if (!checkValidCount(count)) { alert(ERROR_MESSAGE.INVALID_COUNT_INPUT); - const racingCountInput = document.getElementById('racing-count-input'); - racingCountInput.value = ''; - racingCountInput.focus(); + racingCountInputInit(); + return; } _cars = assignCarsName(); yield render({ count }); diff --git a/src/js/modules/@share/controller.ts b/src/js/modules/@share/controller.ts index a7da117d4..ba34a32c9 100644 --- a/src/js/modules/@share/controller.ts +++ b/src/js/modules/@share/controller.ts @@ -1,5 +1,7 @@ import CarNameComponent from '../CarName.js'; import RaceComponent from '../Race.js'; +import { ERROR_MESSAGE } from './message.js'; +import { carNameInputInit } from './init.js'; const carNameInputEvent = (): void => { const carNamesInput: HTMLInputElement = document.getElementById('car-name-input') as HTMLInputElement; @@ -17,7 +19,8 @@ const raceCountInputEvent = () => { count: Number(raceCountInput.value), }); } else { - alert('μžλ™μ°¨ 이름 λ¨Όμ € μž…λ ₯ν•΄μ£Όμ„Έμš”!'); + alert(ERROR_MESSAGE.INVALID_INPUT_PROCEDURE); + carNameInputInit(); } }; const inputController = (): void => { diff --git a/src/js/modules/@share/init.ts b/src/js/modules/@share/init.ts new file mode 100644 index 000000000..5d51a1631 --- /dev/null +++ b/src/js/modules/@share/init.ts @@ -0,0 +1,13 @@ +const carNameInputInit = () => { + const carNameInput = document.getElementById('car-name-input') as HTMLInputElement; + carNameInput.value = ''; + carNameInput.focus(); +}; + +const racingCountInputInit = () => { + const racingCountInput = document.getElementById('racing-count-input') as HTMLInputElement; + racingCountInput.value = ''; + racingCountInput.focus(); +}; + +export { carNameInputInit, racingCountInputInit }; diff --git a/src/js/modules/CarName.ts b/src/js/modules/CarName.ts index 92fde367a..3d33bf8c5 100644 --- a/src/js/modules/CarName.ts +++ b/src/js/modules/CarName.ts @@ -1,16 +1,11 @@ import { carNamesSection, carNameDiv } from './@share/view.js'; import { ERROR_MESSAGE } from './@share/message.js'; +import { carNameInputInit } from './@share/init.js'; const CarNameComponent = ({ $app, carNames }: { $app: HTMLDivElement | null; carNames: string }): void => { const checkCarNames = (carNameList: string[]) => carNameList.length === carNameList.filter((x) => x.length <= 5 && x !== '').length; - const carNameInputInit = () => { - const carNameInput = document.getElementById('car-name-input') as HTMLInputElement; - carNameInput.value = ''; - carNameInput.focus(); - }; - const render = (JSX: string): void => { const sectionElement = $app; if (sectionElement) { diff --git a/src/js/modules/Race.ts b/src/js/modules/Race.ts index 749606859..413077199 100644 --- a/src/js/modules/Race.ts +++ b/src/js/modules/Race.ts @@ -1,6 +1,7 @@ import { Car, getRandomSingleDigit, wait } from './@share/utils.js'; import WinnerComponent from './Winner.js'; import { ERROR_MESSAGE, MESSAGE } from './@share/message.js'; +import { racingCountInputInit } from './@share/init.js'; const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: number }): void => { let _cars: Car[]; @@ -51,9 +52,8 @@ const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: nu const init = async (count: number): Promise => { if (!checkValidCount(count)) { alert(ERROR_MESSAGE.INVALID_COUNT_INPUT); - const racingCountInput = document.getElementById('racing-count-input') as HTMLInputElement; - racingCountInput.value = ''; - racingCountInput.focus(); + racingCountInputInit(); + return; } _cars = assignCarsName(); await render({ count }); From 543afb2b2c5c7ca46f67b76fb4448240eb087452 Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Thu, 3 Jun 2021 15:54:41 +0900 Subject: [PATCH 23/35] =?UTF-8?q?refactor:=20delay=20=EC=8B=9C=EA=B0=84=20?= =?UTF-8?q?=EC=83=81=EC=88=98=EB=A1=9C=20=EB=BA=B4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/js/modules/@share/constants.js | 13 +++++++++++++ dist/js/modules/@share/controller.js | 2 +- dist/js/modules/@share/spinner.js | 7 +++++++ dist/js/modules/CarName.js | 2 +- dist/js/modules/Race.js | 13 ++++--------- docs/README.md | 4 ---- src/js/modules/@share/constants.ts | 16 ++++++++++++++++ src/js/modules/@share/controller.ts | 2 +- src/js/modules/@share/message.ts | 9 --------- src/js/modules/@share/spinner.ts | 7 +++++++ src/js/modules/CarName.ts | 2 +- src/js/modules/Race.ts | 13 ++++--------- 12 files changed, 55 insertions(+), 35 deletions(-) create mode 100644 dist/js/modules/@share/constants.js create mode 100644 dist/js/modules/@share/spinner.js create mode 100644 src/js/modules/@share/constants.ts delete mode 100644 src/js/modules/@share/message.ts create mode 100644 src/js/modules/@share/spinner.ts diff --git a/dist/js/modules/@share/constants.js b/dist/js/modules/@share/constants.js new file mode 100644 index 000000000..9cf420a1b --- /dev/null +++ b/dist/js/modules/@share/constants.js @@ -0,0 +1,13 @@ +const ERROR_MESSAGE = { + INVALID_CAR_NAME_INPUT: 'μœ νš¨ν•˜μ§€ μ•Šμ€ μžλ™μ°¨ μ΄λ¦„μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ ν•΄μ£Όμ„Έμš”.', + INVALID_INPUT_PROCEDURE: 'μžλ™μ°¨ 이름 λ¨Όμ € μž…λ ₯ν•΄μ£Όμ„Έμš”!', + INVALID_COUNT_INPUT: 'μœ νš¨ν•˜μ§€ μ•Šμ€ 횟수 μž…λ ₯μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ ν•΄μ£Όμ„Έμš”.', +}; +const MESSAGE = { + CELEBRATE_WINNER: 'πŸ† μΆ•ν•˜ν•©λ‹ˆλ‹€ γ…Žγ…Ž μ΅œμ’… 우승자: EAST, WEST, SOUTH, NORTH πŸ†', +}; +const DELAY = { + RACE: 1000, + ALERT: 1500, +}; +export { ERROR_MESSAGE, MESSAGE, DELAY }; diff --git a/dist/js/modules/@share/controller.js b/dist/js/modules/@share/controller.js index 351b7b3d1..6dbd17e43 100644 --- a/dist/js/modules/@share/controller.js +++ b/dist/js/modules/@share/controller.js @@ -1,6 +1,6 @@ import CarNameComponent from '../CarName.js'; import RaceComponent from '../Race.js'; -import { ERROR_MESSAGE } from './message.js'; +import { ERROR_MESSAGE } from './constants.js'; import { carNameInputInit } from './init.js'; const carNameInputEvent = () => { const carNamesInput = document.getElementById('car-name-input'); diff --git a/dist/js/modules/@share/spinner.js b/dist/js/modules/@share/spinner.js new file mode 100644 index 000000000..0b42d2409 --- /dev/null +++ b/dist/js/modules/@share/spinner.js @@ -0,0 +1,7 @@ +const removeSpinner = (carPlayer) => { + var _a, _b, _c, _d; + if (((_b = (_a = carPlayer.parentNode) === null || _a === void 0 ? void 0 : _a.lastElementChild) === null || _b === void 0 ? void 0 : _b.className) === 'd-flex justify-center mt-3') { + (_d = (_c = carPlayer.parentNode) === null || _c === void 0 ? void 0 : _c.lastElementChild) === null || _d === void 0 ? void 0 : _d.remove(); + } +}; +export { removeSpinner }; diff --git a/dist/js/modules/CarName.js b/dist/js/modules/CarName.js index 65b34bbd5..47f0db2ff 100644 --- a/dist/js/modules/CarName.js +++ b/dist/js/modules/CarName.js @@ -1,5 +1,5 @@ import { carNamesSection, carNameDiv } from './@share/view.js'; -import { ERROR_MESSAGE } from './@share/message.js'; +import { ERROR_MESSAGE } from './@share/constants.js'; import { carNameInputInit } from './@share/init.js'; const CarNameComponent = ({ $app, carNames }) => { const checkCarNames = (carNameList) => carNameList.length === carNameList.filter((x) => x.length <= 5 && x !== '').length; diff --git a/dist/js/modules/Race.js b/dist/js/modules/Race.js index 5c731231b..8bb8510d5 100644 --- a/dist/js/modules/Race.js +++ b/dist/js/modules/Race.js @@ -9,8 +9,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }; import { Car, getRandomSingleDigit, wait } from './@share/utils.js'; import WinnerComponent from './Winner.js'; -import { ERROR_MESSAGE, MESSAGE } from './@share/message.js'; +import { ERROR_MESSAGE, MESSAGE, DELAY } from './@share/constants.js'; import { racingCountInputInit } from './@share/init.js'; +import { removeSpinner } from './@share/spinner.js'; const RaceComponent = ({ $app, count }) => { let _cars; const checkValidCount = (count) => { @@ -28,12 +29,6 @@ const RaceComponent = ({ $app, count }) => { }); return cars; }; - const removeSpinner = (carPlayer) => { - var _a, _b, _c, _d; - if (((_b = (_a = carPlayer.parentNode) === null || _a === void 0 ? void 0 : _a.lastElementChild) === null || _b === void 0 ? void 0 : _b.className) === 'd-flex justify-center mt-3') { - (_d = (_c = carPlayer.parentNode) === null || _c === void 0 ? void 0 : _c.lastElementChild) === null || _d === void 0 ? void 0 : _d.remove(); - } - }; const render = ({ count }) => __awaiter(void 0, void 0, void 0, function* () { const carPlayer = document.getElementsByClassName('car-player'); let tryCount = count; @@ -48,7 +43,7 @@ const RaceComponent = ({ $app, count }) => { } } tryCount -= 1; - yield wait(1000); + yield wait(DELAY.RACE); } }); const init = (count) => __awaiter(void 0, void 0, void 0, function* () { @@ -60,7 +55,7 @@ const RaceComponent = ({ $app, count }) => { _cars = assignCarsName(); yield render({ count }); WinnerComponent({ $app, cars: _cars }); - yield wait(2000); + yield wait(DELAY.ALERT); alert(MESSAGE.CELEBRATE_WINNER); return; }); diff --git a/docs/README.md b/docs/README.md index e38f2d38a..3b4a9d207 100644 --- a/docs/README.md +++ b/docs/README.md @@ -29,10 +29,6 @@ - [x] μ •μƒμ μœΌλ‘œ κ²Œμž„μ˜ 턴이 λ‹€ λ™μž‘λœ ν›„μ—λŠ” κ²°κ³Όλ₯Ό 보여주고, 2초 후에 μΆ•ν•˜μ˜ alert λ©”μ„Έμ§€λ₯Ό λ„μš΄λ‹€. - [ ] μœ„ κΈ°λŠ₯듀이 μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜λŠ”μ§€ Cypressλ₯Ό μ΄μš©ν•΄ ν…ŒμŠ€νŠΈν•œλ‹€. -### refactoring -- [x] 파일 뢄리 -- [x] index.html에 `
`만 남기기. - ### 버그 μˆ˜μ • - [ ] input μž…λ ₯ν•œ λ’€ λΉ„ν™œμ„±ν™” ν•˜κΈ°. diff --git a/src/js/modules/@share/constants.ts b/src/js/modules/@share/constants.ts new file mode 100644 index 000000000..f89999d37 --- /dev/null +++ b/src/js/modules/@share/constants.ts @@ -0,0 +1,16 @@ +const ERROR_MESSAGE = { + INVALID_CAR_NAME_INPUT: 'μœ νš¨ν•˜μ§€ μ•Šμ€ μžλ™μ°¨ μ΄λ¦„μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ ν•΄μ£Όμ„Έμš”.', + INVALID_INPUT_PROCEDURE: 'μžλ™μ°¨ 이름 λ¨Όμ € μž…λ ₯ν•΄μ£Όμ„Έμš”!', + INVALID_COUNT_INPUT: 'μœ νš¨ν•˜μ§€ μ•Šμ€ 횟수 μž…λ ₯μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ ν•΄μ£Όμ„Έμš”.', +}; + +const MESSAGE = { + CELEBRATE_WINNER: 'πŸ† μΆ•ν•˜ν•©λ‹ˆλ‹€ γ…Žγ…Ž μ΅œμ’… 우승자: EAST, WEST, SOUTH, NORTH πŸ†', +}; + +const DELAY = { + RACE: 1000, + ALERT: 1500, +}; + +export { ERROR_MESSAGE, MESSAGE, DELAY }; diff --git a/src/js/modules/@share/controller.ts b/src/js/modules/@share/controller.ts index ba34a32c9..d169a3439 100644 --- a/src/js/modules/@share/controller.ts +++ b/src/js/modules/@share/controller.ts @@ -1,6 +1,6 @@ import CarNameComponent from '../CarName.js'; import RaceComponent from '../Race.js'; -import { ERROR_MESSAGE } from './message.js'; +import { ERROR_MESSAGE } from './constants.js'; import { carNameInputInit } from './init.js'; const carNameInputEvent = (): void => { diff --git a/src/js/modules/@share/message.ts b/src/js/modules/@share/message.ts deleted file mode 100644 index 6a03ef507..000000000 --- a/src/js/modules/@share/message.ts +++ /dev/null @@ -1,9 +0,0 @@ -export const ERROR_MESSAGE = { - INVALID_CAR_NAME_INPUT: 'μœ νš¨ν•˜μ§€ μ•Šμ€ μžλ™μ°¨ μ΄λ¦„μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ ν•΄μ£Όμ„Έμš”.', - INVALID_INPUT_PROCEDURE: 'μžλ™μ°¨ 이름 λ¨Όμ € μž…λ ₯ν•΄μ£Όμ„Έμš”!', - INVALID_COUNT_INPUT: 'μœ νš¨ν•˜μ§€ μ•Šμ€ 횟수 μž…λ ₯μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ ν•΄μ£Όμ„Έμš”.' -}; - -export const MESSAGE = { - CELEBRATE_WINNER: 'πŸ† μΆ•ν•˜ν•©λ‹ˆλ‹€ γ…Žγ…Ž μ΅œμ’… 우승자: EAST, WEST, SOUTH, NORTH πŸ†' -} diff --git a/src/js/modules/@share/spinner.ts b/src/js/modules/@share/spinner.ts new file mode 100644 index 000000000..9dd78f45a --- /dev/null +++ b/src/js/modules/@share/spinner.ts @@ -0,0 +1,7 @@ +const removeSpinner = (carPlayer: Element): void => { + if (carPlayer.parentNode?.lastElementChild?.className === 'd-flex justify-center mt-3') { + carPlayer.parentNode?.lastElementChild?.remove(); + } +}; + +export { removeSpinner }; diff --git a/src/js/modules/CarName.ts b/src/js/modules/CarName.ts index 3d33bf8c5..8b29383b3 100644 --- a/src/js/modules/CarName.ts +++ b/src/js/modules/CarName.ts @@ -1,5 +1,5 @@ import { carNamesSection, carNameDiv } from './@share/view.js'; -import { ERROR_MESSAGE } from './@share/message.js'; +import { ERROR_MESSAGE } from './@share/constants.js'; import { carNameInputInit } from './@share/init.js'; const CarNameComponent = ({ $app, carNames }: { $app: HTMLDivElement | null; carNames: string }): void => { diff --git a/src/js/modules/Race.ts b/src/js/modules/Race.ts index 413077199..f10e842d8 100644 --- a/src/js/modules/Race.ts +++ b/src/js/modules/Race.ts @@ -1,7 +1,8 @@ import { Car, getRandomSingleDigit, wait } from './@share/utils.js'; import WinnerComponent from './Winner.js'; -import { ERROR_MESSAGE, MESSAGE } from './@share/message.js'; +import { ERROR_MESSAGE, MESSAGE, DELAY } from './@share/constants.js'; import { racingCountInputInit } from './@share/init.js'; +import { removeSpinner } from './@share/spinner.js'; const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: number }): void => { let _cars: Car[]; @@ -23,12 +24,6 @@ const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: nu return cars; }; - const removeSpinner = (carPlayer: Element): void => { - if (carPlayer.parentNode?.lastElementChild?.className === 'd-flex justify-center mt-3') { - carPlayer.parentNode?.lastElementChild?.remove(); - } - }; - const render = async ({ count }: { count: number }): Promise => { const carPlayer: HTMLCollectionOf = document.getElementsByClassName( 'car-player', @@ -45,7 +40,7 @@ const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: nu } } tryCount -= 1; - await wait(1000); + await wait(DELAY.RACE); } }; @@ -58,7 +53,7 @@ const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: nu _cars = assignCarsName(); await render({ count }); WinnerComponent({ $app, cars: _cars }); - await wait(2000); + await wait(DELAY.ALERT); alert(MESSAGE.CELEBRATE_WINNER); return; }; From 6230026519bf069812743aa906171e2027ba2a7c Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Thu, 3 Jun 2021 15:57:16 +0900 Subject: [PATCH 24/35] refactor: space before return --- src/js/modules/CarName.ts | 1 + src/js/modules/Game.ts | 1 + src/js/modules/Race.ts | 6 ++++++ src/js/modules/Winner.ts | 4 ++++ 4 files changed, 12 insertions(+) diff --git a/src/js/modules/CarName.ts b/src/js/modules/CarName.ts index 8b29383b3..3f319699a 100644 --- a/src/js/modules/CarName.ts +++ b/src/js/modules/CarName.ts @@ -11,6 +11,7 @@ const CarNameComponent = ({ $app, carNames }: { $app: HTMLDivElement | null; car if (sectionElement) { sectionElement.insertAdjacentHTML('beforeend', JSX); } + return; }; diff --git a/src/js/modules/Game.ts b/src/js/modules/Game.ts index cc03dea1b..efaf7db36 100644 --- a/src/js/modules/Game.ts +++ b/src/js/modules/Game.ts @@ -7,6 +7,7 @@ const Game = ({ $app }: { $app: HTMLDivElement | null }): void => { if (sectionElement) { sectionElement.insertAdjacentHTML('beforeend', JSX); } + return; }; diff --git a/src/js/modules/Race.ts b/src/js/modules/Race.ts index f10e842d8..cc9744ec6 100644 --- a/src/js/modules/Race.ts +++ b/src/js/modules/Race.ts @@ -8,10 +8,13 @@ const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: nu let _cars: Car[]; const checkValidCount = (count: number): boolean => { + return count - Math.floor(count) === 0 && count > 0; }; + const getInputCarsName = (): string[] => { const carNameInput = document.getElementById('car-name-input') as HTMLInputElement; + return carNameInput.value.split(',').map((x) => x.trim()); }; @@ -21,6 +24,7 @@ const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: nu inputCarNames.forEach((name) => { cars.push(new Car(name)); }); + return cars; }; @@ -29,6 +33,7 @@ const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: nu 'car-player', ) as HTMLCollectionOf; let tryCount: number = count; + while (tryCount > 0) { for (let i = 0; i < carPlayer.length; i += 1) { if (getRandomSingleDigit(0, 9) >= 4) { @@ -55,6 +60,7 @@ const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: nu WinnerComponent({ $app, cars: _cars }); await wait(DELAY.ALERT); alert(MESSAGE.CELEBRATE_WINNER); + return; }; diff --git a/src/js/modules/Winner.ts b/src/js/modules/Winner.ts index c2322349b..cad5a9ba9 100644 --- a/src/js/modules/Winner.ts +++ b/src/js/modules/Winner.ts @@ -6,8 +6,10 @@ const WinnerComponent = ({ $app, cars }: { $app: HTMLDivElement | null; cars: Ca const findWinners = (cars: Car[]): string[] => { const totalDistances = cars.map((car) => car.distance); const maxDistance = Math.max(...totalDistances); + return cars .filter((car) => { + return car.distance === maxDistance; }) .map((winner) => winner.name); @@ -18,6 +20,7 @@ const WinnerComponent = ({ $app, cars }: { $app: HTMLDivElement | null; cars: Ca if (sectionElement) { sectionElement.insertAdjacentHTML('beforeend', result); } + return; }; @@ -29,6 +32,7 @@ const WinnerComponent = ({ $app, cars }: { $app: HTMLDivElement | null; cars: Ca } e.currentTarget?.removeEventListener('click', retryButtonEvent); inputController(); + return; }; From 58c379783b703ab3e3f2642cece91c4398c50b03 Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Thu, 3 Jun 2021 16:08:05 +0900 Subject: [PATCH 25/35] =?UTF-8?q?refactor:=20render=20=ED=95=A8=EC=88=98?= =?UTF-8?q?=20=ED=98=95=EC=8B=9D=20=ED=86=B5=EC=9D=BC=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/js/modules/Winner.js | 7 +++---- src/js/modules/Winner.ts | 9 ++++----- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/dist/js/modules/Winner.js b/dist/js/modules/Winner.js index 9f95b6c8f..3502a8a75 100644 --- a/dist/js/modules/Winner.js +++ b/dist/js/modules/Winner.js @@ -10,10 +10,10 @@ const WinnerComponent = ({ $app, cars }) => { }) .map((winner) => winner.name); }; - const render = ({ result }) => { + const render = (JSX) => { const sectionElement = $app; if (sectionElement) { - sectionElement.insertAdjacentHTML('beforeend', result); + sectionElement.insertAdjacentHTML('beforeend', JSX); } return; }; @@ -35,8 +35,7 @@ const WinnerComponent = ({ $app, cars }) => { } }; const init = ({ cars }) => { - const result = winnerSection(findWinners(cars).join(', ')); - render({ result }); + render(winnerSection(findWinners(cars).join(', '))); controller(); }; return init({ cars }); diff --git a/src/js/modules/Winner.ts b/src/js/modules/Winner.ts index cad5a9ba9..4007ca6df 100644 --- a/src/js/modules/Winner.ts +++ b/src/js/modules/Winner.ts @@ -6,7 +6,7 @@ const WinnerComponent = ({ $app, cars }: { $app: HTMLDivElement | null; cars: Ca const findWinners = (cars: Car[]): string[] => { const totalDistances = cars.map((car) => car.distance); const maxDistance = Math.max(...totalDistances); - + return cars .filter((car) => { @@ -15,10 +15,10 @@ const WinnerComponent = ({ $app, cars }: { $app: HTMLDivElement | null; cars: Ca .map((winner) => winner.name); }; - const render = ({ result }: { result: string }): void => { + const render = (JSX: string): void => { const sectionElement = $app; if (sectionElement) { - sectionElement.insertAdjacentHTML('beforeend', result); + sectionElement.insertAdjacentHTML('beforeend', JSX); } return; @@ -44,8 +44,7 @@ const WinnerComponent = ({ $app, cars }: { $app: HTMLDivElement | null; cars: Ca }; const init = ({ cars }: { cars: Car[] }): void => { - const result: string = winnerSection(findWinners(cars).join(', ')); - render({ result }); + render(winnerSection(findWinners(cars).join(', '))); controller(); }; From 17f51c22ecb9859e335fc18b26be911a6ae5bea2 Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Thu, 3 Jun 2021 16:23:48 +0900 Subject: [PATCH 26/35] =?UTF-8?q?fix:=20car=20name=20input=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=ED=95=9C=20=EB=92=A4=EC=97=90=EB=A7=8C=20count=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=ED=95=A0=20=EC=88=98=20=EC=9E=88=EA=B2=8C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=ED=95=98=EA=B8=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/js/modules/@share/dom-dataset.js | 14 ++++++++++++++ dist/js/modules/CarName.js | 2 ++ dist/js/modules/Race.js | 9 ++++++++- docs/README.md | 3 ++- src/js/modules/@share/dom-dataset.ts | 16 ++++++++++++++++ src/js/modules/CarName.ts | 4 +++- src/js/modules/Race.ts | 15 +++++++++++---- 7 files changed, 56 insertions(+), 7 deletions(-) create mode 100644 dist/js/modules/@share/dom-dataset.js create mode 100644 src/js/modules/@share/dom-dataset.ts diff --git a/dist/js/modules/@share/dom-dataset.js b/dist/js/modules/@share/dom-dataset.js new file mode 100644 index 000000000..3a4bbf0a1 --- /dev/null +++ b/dist/js/modules/@share/dom-dataset.js @@ -0,0 +1,14 @@ +const setCarNameDataset = (data) => { + const carNamesInput = document.querySelector('input[type="text"]'); + if (carNamesInput) { + carNamesInput.dataset.click = data; + } +}; +const checkCarNameDataset = () => { + const carNamesInput = document.querySelector('input[type="text"]'); + if (carNamesInput) { + return carNamesInput.dataset.click === 'click'; + } + return false; +}; +export { setCarNameDataset, checkCarNameDataset }; diff --git a/dist/js/modules/CarName.js b/dist/js/modules/CarName.js index 47f0db2ff..472f5a193 100644 --- a/dist/js/modules/CarName.js +++ b/dist/js/modules/CarName.js @@ -1,6 +1,7 @@ import { carNamesSection, carNameDiv } from './@share/view.js'; import { ERROR_MESSAGE } from './@share/constants.js'; import { carNameInputInit } from './@share/init.js'; +import { setCarNameDataset } from './@share/dom-dataset.js'; const CarNameComponent = ({ $app, carNames }) => { const checkCarNames = (carNameList) => carNameList.length === carNameList.filter((x) => x.length <= 5 && x !== '').length; const render = (JSX) => { @@ -13,6 +14,7 @@ const CarNameComponent = ({ $app, carNames }) => { const init = (carNames) => { const carNameList = carNames.split(',').map((x) => x.trim()); if (checkCarNames(carNameList)) { + setCarNameDataset('click'); render(carNamesSection(carNameList.map((carName) => carNameDiv(carName)).join(''))); } else { diff --git a/dist/js/modules/Race.js b/dist/js/modules/Race.js index 8bb8510d5..81fd473ae 100644 --- a/dist/js/modules/Race.js +++ b/dist/js/modules/Race.js @@ -10,8 +10,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge import { Car, getRandomSingleDigit, wait } from './@share/utils.js'; import WinnerComponent from './Winner.js'; import { ERROR_MESSAGE, MESSAGE, DELAY } from './@share/constants.js'; -import { racingCountInputInit } from './@share/init.js'; +import { racingCountInputInit, carNameInputInit } from './@share/init.js'; import { removeSpinner } from './@share/spinner.js'; +import { checkCarNameDataset } from './@share/dom-dataset.js'; const RaceComponent = ({ $app, count }) => { let _cars; const checkValidCount = (count) => { @@ -47,6 +48,12 @@ const RaceComponent = ({ $app, count }) => { } }); const init = (count) => __awaiter(void 0, void 0, void 0, function* () { + console.log(checkCarNameDataset()); + if (!checkCarNameDataset()) { + alert(ERROR_MESSAGE.INVALID_INPUT_PROCEDURE); + carNameInputInit(); + return; + } if (!checkValidCount(count)) { alert(ERROR_MESSAGE.INVALID_COUNT_INPUT); racingCountInputInit(); diff --git a/docs/README.md b/docs/README.md index 3b4a9d207..0f546121c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -30,6 +30,7 @@ - [ ] μœ„ κΈ°λŠ₯듀이 μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜λŠ”μ§€ Cypressλ₯Ό μ΄μš©ν•΄ ν…ŒμŠ€νŠΈν•œλ‹€. ### 버그 μˆ˜μ • -- [ ] input μž…λ ₯ν•œ λ’€ λΉ„ν™œμ„±ν™” ν•˜κΈ°. +- [x] car name input μž…λ ₯ν•œ λ’€μ—λ§Œ count μž…λ ₯ν•  수 있게 κ΅¬ν˜„ν•˜κΈ°. +- [ ] car name input μž…λ ₯ν•œ λ’€ λΉ„ν™œμ„±ν™” ν•˜κΈ°. html μš”μ†Œ λ’€μ–΄κΊΌλΆ€ν„° μ‚­μ œν•΄μ•Όν•¨. ν•˜λ‚˜μ”© μ €μ ˆλ‘œ λ°€λ €μ„œ 정렬됨. diff --git a/src/js/modules/@share/dom-dataset.ts b/src/js/modules/@share/dom-dataset.ts new file mode 100644 index 000000000..3fc2a8a14 --- /dev/null +++ b/src/js/modules/@share/dom-dataset.ts @@ -0,0 +1,16 @@ +const setCarNameDataset = (data: string): void => { + const carNamesInput: HTMLInputElement = document.querySelector('input[type="text"]') as HTMLInputElement; + if (carNamesInput) { + carNamesInput.dataset.click = data; + } +}; + +const checkCarNameDataset = (): boolean => { + const carNamesInput: HTMLInputElement = document.querySelector('input[type="text"]') as HTMLInputElement; + if (carNamesInput) { + return carNamesInput.dataset.click === 'click'; + } + return false; +}; + +export { setCarNameDataset, checkCarNameDataset }; diff --git a/src/js/modules/CarName.ts b/src/js/modules/CarName.ts index 3f319699a..609114385 100644 --- a/src/js/modules/CarName.ts +++ b/src/js/modules/CarName.ts @@ -1,6 +1,7 @@ import { carNamesSection, carNameDiv } from './@share/view.js'; import { ERROR_MESSAGE } from './@share/constants.js'; import { carNameInputInit } from './@share/init.js'; +import { setCarNameDataset } from './@share/dom-dataset.js'; const CarNameComponent = ({ $app, carNames }: { $app: HTMLDivElement | null; carNames: string }): void => { const checkCarNames = (carNameList: string[]) => @@ -11,13 +12,14 @@ const CarNameComponent = ({ $app, carNames }: { $app: HTMLDivElement | null; car if (sectionElement) { sectionElement.insertAdjacentHTML('beforeend', JSX); } - + return; }; const init = (carNames: string): void => { const carNameList: string[] = carNames.split(',').map((x) => x.trim()); if (checkCarNames(carNameList)) { + setCarNameDataset('click'); render(carNamesSection(carNameList.map((carName) => carNameDiv(carName)).join(''))); } else { alert(ERROR_MESSAGE.INVALID_CAR_NAME_INPUT); diff --git a/src/js/modules/Race.ts b/src/js/modules/Race.ts index cc9744ec6..f849b2833 100644 --- a/src/js/modules/Race.ts +++ b/src/js/modules/Race.ts @@ -1,17 +1,17 @@ import { Car, getRandomSingleDigit, wait } from './@share/utils.js'; import WinnerComponent from './Winner.js'; import { ERROR_MESSAGE, MESSAGE, DELAY } from './@share/constants.js'; -import { racingCountInputInit } from './@share/init.js'; +import { racingCountInputInit, carNameInputInit } from './@share/init.js'; import { removeSpinner } from './@share/spinner.js'; +import { checkCarNameDataset } from './@share/dom-dataset.js'; const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: number }): void => { let _cars: Car[]; const checkValidCount = (count: number): boolean => { - return count - Math.floor(count) === 0 && count > 0; }; - + const getInputCarsName = (): string[] => { const carNameInput = document.getElementById('car-name-input') as HTMLInputElement; @@ -50,9 +50,16 @@ const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: nu }; const init = async (count: number): Promise => { + if (!checkCarNameDataset()) { + alert(ERROR_MESSAGE.INVALID_INPUT_PROCEDURE); + carNameInputInit(); + + return; + } if (!checkValidCount(count)) { alert(ERROR_MESSAGE.INVALID_COUNT_INPUT); racingCountInputInit(); + return; } _cars = assignCarsName(); @@ -60,7 +67,7 @@ const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: nu WinnerComponent({ $app, cars: _cars }); await wait(DELAY.ALERT); alert(MESSAGE.CELEBRATE_WINNER); - + return; }; From 26e8f86e13871ed8d01c1732ee714afd9046b49b Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Thu, 3 Jun 2021 17:08:39 +0900 Subject: [PATCH 27/35] =?UTF-8?q?feat:=20car=20name=20input=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=ED=95=9C=20=EB=92=A4=20=EB=B9=84=ED=99=9C=EC=84=B1?= =?UTF-8?q?=ED=99=94=20=ED=95=98=EA=B8=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/js/modules/@share/controller.js | 8 ++++++++ dist/js/modules/@share/utils.js | 29 ++++++++++++++++++++++++++- dist/js/modules/CarName.js | 2 ++ dist/js/modules/Race.js | 5 +++-- dist/js/modules/Winner.js | 4 ++++ docs/README.md | 3 ++- src/js/modules/@share/controller.ts | 7 +++++++ src/js/modules/@share/utils.ts | 30 +++++++++++++++++++++++++++- src/js/modules/CarName.ts | 2 ++ src/js/modules/Race.ts | 4 +++- src/js/modules/Winner.ts | 7 ++++--- 11 files changed, 92 insertions(+), 9 deletions(-) diff --git a/dist/js/modules/@share/controller.js b/dist/js/modules/@share/controller.js index 6dbd17e43..12a120e8e 100644 --- a/dist/js/modules/@share/controller.js +++ b/dist/js/modules/@share/controller.js @@ -2,15 +2,22 @@ import CarNameComponent from '../CarName.js'; import RaceComponent from '../Race.js'; import { ERROR_MESSAGE } from './constants.js'; import { carNameInputInit } from './init.js'; +import { disable, initEnable } from './utils.js'; const carNameInputEvent = () => { + var _a; const carNamesInput = document.getElementById('car-name-input'); + disable(carNamesInput); + disable((_a = carNamesInput.parentElement) === null || _a === void 0 ? void 0 : _a.children[1]); if (carNamesInput) { CarNameComponent({ $app: document.querySelector('#app'), carNames: carNamesInput.value }); } }; const raceCountInputEvent = () => { + var _a; const raceCountInput = document.querySelector('input[type="number"]'); const carNamesInput = document.querySelector('input[type="text"]'); + disable(raceCountInput); + disable((_a = raceCountInput.parentElement) === null || _a === void 0 ? void 0 : _a.children[1]); if (raceCountInput && carNamesInput.value !== '') { RaceComponent({ $app: document.querySelector('#app'), @@ -20,6 +27,7 @@ const raceCountInputEvent = () => { else { alert(ERROR_MESSAGE.INVALID_INPUT_PROCEDURE); carNameInputInit(); + initEnable(); } }; const inputController = () => { diff --git a/dist/js/modules/@share/utils.js b/dist/js/modules/@share/utils.js index 0b5d64474..08ba81c76 100644 --- a/dist/js/modules/@share/utils.js +++ b/dist/js/modules/@share/utils.js @@ -22,4 +22,31 @@ const getRandomSingleDigit = (min, max) => { const wait = (delay) => __awaiter(void 0, void 0, void 0, function* () { return new Promise((resolve) => setTimeout(resolve, delay)); }); -export { Car, getRandomSingleDigit, wait }; +const disable = (element) => { + element.disabled = true; +}; +const enable = (element) => { + element.disabled = false; +}; +const carNameEnable = () => { + var _a; + const carNamesInput = document.getElementById('car-name-input'); + enable(carNamesInput); + enable((_a = carNamesInput.parentElement) === null || _a === void 0 ? void 0 : _a.children[1]); +}; +const countEnable = () => { + var _a; + const raceCountInput = document.querySelector('input[type="number"]'); + enable(raceCountInput); + enable((_a = raceCountInput.parentElement) === null || _a === void 0 ? void 0 : _a.children[1]); +}; +const initEnable = () => { + var _a, _b; + const carNamesInput = document.getElementById('car-name-input'); + const raceCountInput = document.querySelector('input[type="number"]'); + enable(carNamesInput); + enable((_a = carNamesInput.parentElement) === null || _a === void 0 ? void 0 : _a.children[1]); + enable(raceCountInput); + enable((_b = raceCountInput.parentElement) === null || _b === void 0 ? void 0 : _b.children[1]); +}; +export { Car, getRandomSingleDigit, wait, disable, initEnable, carNameEnable, countEnable }; diff --git a/dist/js/modules/CarName.js b/dist/js/modules/CarName.js index 472f5a193..b036724ee 100644 --- a/dist/js/modules/CarName.js +++ b/dist/js/modules/CarName.js @@ -2,6 +2,7 @@ import { carNamesSection, carNameDiv } from './@share/view.js'; import { ERROR_MESSAGE } from './@share/constants.js'; import { carNameInputInit } from './@share/init.js'; import { setCarNameDataset } from './@share/dom-dataset.js'; +import { initEnable } from './@share/utils.js'; const CarNameComponent = ({ $app, carNames }) => { const checkCarNames = (carNameList) => carNameList.length === carNameList.filter((x) => x.length <= 5 && x !== '').length; const render = (JSX) => { @@ -20,6 +21,7 @@ const CarNameComponent = ({ $app, carNames }) => { else { alert(ERROR_MESSAGE.INVALID_CAR_NAME_INPUT); carNameInputInit(); + initEnable(); } }; init(carNames); diff --git a/dist/js/modules/Race.js b/dist/js/modules/Race.js index 81fd473ae..ab7948f1f 100644 --- a/dist/js/modules/Race.js +++ b/dist/js/modules/Race.js @@ -7,7 +7,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; -import { Car, getRandomSingleDigit, wait } from './@share/utils.js'; +import { Car, getRandomSingleDigit, wait, initEnable, countEnable } from './@share/utils.js'; import WinnerComponent from './Winner.js'; import { ERROR_MESSAGE, MESSAGE, DELAY } from './@share/constants.js'; import { racingCountInputInit, carNameInputInit } from './@share/init.js'; @@ -48,15 +48,16 @@ const RaceComponent = ({ $app, count }) => { } }); const init = (count) => __awaiter(void 0, void 0, void 0, function* () { - console.log(checkCarNameDataset()); if (!checkCarNameDataset()) { alert(ERROR_MESSAGE.INVALID_INPUT_PROCEDURE); carNameInputInit(); + initEnable(); return; } if (!checkValidCount(count)) { alert(ERROR_MESSAGE.INVALID_COUNT_INPUT); racingCountInputInit(); + countEnable(); return; } _cars = assignCarsName(); diff --git a/dist/js/modules/Winner.js b/dist/js/modules/Winner.js index 3502a8a75..fd7a2b8c1 100644 --- a/dist/js/modules/Winner.js +++ b/dist/js/modules/Winner.js @@ -1,5 +1,7 @@ +import { initEnable } from './@share/utils.js'; import { inputController } from './@share/controller.js'; import { winnerSection } from './@share/view.js'; +import { setCarNameDataset } from './@share/dom-dataset.js'; const WinnerComponent = ({ $app, cars }) => { const findWinners = (cars) => { const totalDistances = cars.map((car) => car.distance); @@ -26,6 +28,8 @@ const WinnerComponent = ({ $app, cars }) => { } (_a = e.currentTarget) === null || _a === void 0 ? void 0 : _a.removeEventListener('click', retryButtonEvent); inputController(); + initEnable(); + setCarNameDataset(''); return; }; const controller = () => { diff --git a/docs/README.md b/docs/README.md index 0f546121c..828a65beb 100644 --- a/docs/README.md +++ b/docs/README.md @@ -31,6 +31,7 @@ ### 버그 μˆ˜μ • - [x] car name input μž…λ ₯ν•œ λ’€μ—λ§Œ count μž…λ ₯ν•  수 있게 κ΅¬ν˜„ν•˜κΈ°. -- [ ] car name input μž…λ ₯ν•œ λ’€ λΉ„ν™œμ„±ν™” ν•˜κΈ°. +- [x] car name input μž…λ ₯ν•œ λ’€ λΉ„ν™œμ„±ν™” ν•˜κΈ°. + - [x] 각 μ—λŸ¬ 경우 ν›„ ν™œμ„±ν™” ν•˜κΈ°. html μš”μ†Œ λ’€μ–΄κΊΌλΆ€ν„° μ‚­μ œν•΄μ•Όν•¨. ν•˜λ‚˜μ”© μ €μ ˆλ‘œ λ°€λ €μ„œ 정렬됨. diff --git a/src/js/modules/@share/controller.ts b/src/js/modules/@share/controller.ts index d169a3439..a4f5bf941 100644 --- a/src/js/modules/@share/controller.ts +++ b/src/js/modules/@share/controller.ts @@ -2,9 +2,13 @@ import CarNameComponent from '../CarName.js'; import RaceComponent from '../Race.js'; import { ERROR_MESSAGE } from './constants.js'; import { carNameInputInit } from './init.js'; +import { disable, initEnable } from './utils.js'; const carNameInputEvent = (): void => { const carNamesInput: HTMLInputElement = document.getElementById('car-name-input') as HTMLInputElement; + + disable(carNamesInput); + disable(carNamesInput.parentElement?.children[1]); if (carNamesInput) { CarNameComponent({ $app: document.querySelector('#app'), carNames: carNamesInput.value }); } @@ -13,6 +17,8 @@ const raceCountInputEvent = () => { const raceCountInput: HTMLInputElement = document.querySelector('input[type="number"]') as HTMLInputElement; const carNamesInput: HTMLInputElement = document.querySelector('input[type="text"]') as HTMLInputElement; + disable(raceCountInput); + disable(raceCountInput.parentElement?.children[1]); if (raceCountInput && carNamesInput.value !== '') { RaceComponent({ $app: document.querySelector('#app'), @@ -21,6 +27,7 @@ const raceCountInputEvent = () => { } else { alert(ERROR_MESSAGE.INVALID_INPUT_PROCEDURE); carNameInputInit(); + initEnable(); } }; const inputController = (): void => { diff --git a/src/js/modules/@share/utils.ts b/src/js/modules/@share/utils.ts index 777b6b810..59c576657 100644 --- a/src/js/modules/@share/utils.ts +++ b/src/js/modules/@share/utils.ts @@ -20,4 +20,32 @@ const wait = async (delay: number): Promise => { return new Promise((resolve) => setTimeout(resolve, delay)); }; -export { Car, getRandomSingleDigit, wait }; +const disable = (element: HTMLButtonElement | HTMLInputElement) => { + element.disabled = true; +} +const enable = (element: HTMLButtonElement | HTMLInputElement) => { + element.disabled = false; +} + +const carNameEnable = () => { + const carNamesInput: HTMLInputElement = document.getElementById('car-name-input') as HTMLInputElement; + enable(carNamesInput); + enable(carNamesInput.parentElement?.children[1]); +} + +const countEnable = () => { + const raceCountInput: HTMLInputElement = document.querySelector('input[type="number"]') as HTMLInputElement; + enable(raceCountInput); + enable(raceCountInput.parentElement?.children[1]); +} + +const initEnable = () => { + const carNamesInput: HTMLInputElement = document.getElementById('car-name-input') as HTMLInputElement; + const raceCountInput: HTMLInputElement = document.querySelector('input[type="number"]') as HTMLInputElement; + enable(carNamesInput); + enable(carNamesInput.parentElement?.children[1]); + enable(raceCountInput); + enable(raceCountInput.parentElement?.children[1]); +} + +export { Car, getRandomSingleDigit, wait, disable, initEnable, carNameEnable, countEnable }; diff --git a/src/js/modules/CarName.ts b/src/js/modules/CarName.ts index 609114385..6486a3852 100644 --- a/src/js/modules/CarName.ts +++ b/src/js/modules/CarName.ts @@ -2,6 +2,7 @@ import { carNamesSection, carNameDiv } from './@share/view.js'; import { ERROR_MESSAGE } from './@share/constants.js'; import { carNameInputInit } from './@share/init.js'; import { setCarNameDataset } from './@share/dom-dataset.js'; +import { initEnable } from './@share/utils.js'; const CarNameComponent = ({ $app, carNames }: { $app: HTMLDivElement | null; carNames: string }): void => { const checkCarNames = (carNameList: string[]) => @@ -24,6 +25,7 @@ const CarNameComponent = ({ $app, carNames }: { $app: HTMLDivElement | null; car } else { alert(ERROR_MESSAGE.INVALID_CAR_NAME_INPUT); carNameInputInit(); + initEnable(); } }; diff --git a/src/js/modules/Race.ts b/src/js/modules/Race.ts index f849b2833..dc1064019 100644 --- a/src/js/modules/Race.ts +++ b/src/js/modules/Race.ts @@ -1,4 +1,4 @@ -import { Car, getRandomSingleDigit, wait } from './@share/utils.js'; +import { Car, getRandomSingleDigit, wait, initEnable, countEnable } from './@share/utils.js'; import WinnerComponent from './Winner.js'; import { ERROR_MESSAGE, MESSAGE, DELAY } from './@share/constants.js'; import { racingCountInputInit, carNameInputInit } from './@share/init.js'; @@ -53,12 +53,14 @@ const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: nu if (!checkCarNameDataset()) { alert(ERROR_MESSAGE.INVALID_INPUT_PROCEDURE); carNameInputInit(); + initEnable(); return; } if (!checkValidCount(count)) { alert(ERROR_MESSAGE.INVALID_COUNT_INPUT); racingCountInputInit(); + countEnable(); return; } diff --git a/src/js/modules/Winner.ts b/src/js/modules/Winner.ts index 4007ca6df..a90989098 100644 --- a/src/js/modules/Winner.ts +++ b/src/js/modules/Winner.ts @@ -1,6 +1,7 @@ -import { Car } from './@share/utils.js'; +import { Car, initEnable } from './@share/utils.js'; import { inputController } from './@share/controller.js'; import { winnerSection } from './@share/view.js'; +import { setCarNameDataset } from './@share/dom-dataset.js'; const WinnerComponent = ({ $app, cars }: { $app: HTMLDivElement | null; cars: Car[] }): void => { const findWinners = (cars: Car[]): string[] => { @@ -9,7 +10,6 @@ const WinnerComponent = ({ $app, cars }: { $app: HTMLDivElement | null; cars: Ca return cars .filter((car) => { - return car.distance === maxDistance; }) .map((winner) => winner.name); @@ -32,7 +32,8 @@ const WinnerComponent = ({ $app, cars }: { $app: HTMLDivElement | null; cars: Ca } e.currentTarget?.removeEventListener('click', retryButtonEvent); inputController(); - + initEnable(); + setCarNameDataset(''); return; }; From 08476fdf680d6717658f21a63302d8d53335089a Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Thu, 3 Jun 2021 17:09:02 +0900 Subject: [PATCH 28/35] =?UTF-8?q?feat:=20car=20name=20input=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=ED=95=9C=20=EB=92=A4=20=EB=B9=84=ED=99=9C=EC=84=B1?= =?UTF-8?q?=ED=99=94=20=ED=95=98=EA=B8=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 828a65beb..8ae74df23 100644 --- a/docs/README.md +++ b/docs/README.md @@ -31,7 +31,7 @@ ### 버그 μˆ˜μ • - [x] car name input μž…λ ₯ν•œ λ’€μ—λ§Œ count μž…λ ₯ν•  수 있게 κ΅¬ν˜„ν•˜κΈ°. -- [x] car name input μž…λ ₯ν•œ λ’€ λΉ„ν™œμ„±ν™” ν•˜κΈ°. +- [x] input μž…λ ₯ν•œ λ’€ λΉ„ν™œμ„±ν™” ν•˜κΈ°. - [x] 각 μ—λŸ¬ 경우 ν›„ ν™œμ„±ν™” ν•˜κΈ°. html μš”μ†Œ λ’€μ–΄κΊΌλΆ€ν„° μ‚­μ œν•΄μ•Όν•¨. ν•˜λ‚˜μ”© μ €μ ˆλ‘œ λ°€λ €μ„œ 정렬됨. From e9c8da2931cc443b178609791771b455dd2ce2bc Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Thu, 3 Jun 2021 19:58:31 +0900 Subject: [PATCH 29/35] =?UTF-8?q?refactor:=20forwardIconDiv=20=EB=A5=BC=20?= =?UTF-8?q?view=EB=A1=9C=20=EB=82=98=EB=88=84=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cypress/integration/racingcar.spec.js | 80 +++++++++++++++++++++++---- docs/README.md | 2 - src/js/modules/@share/view.ts | 7 ++- src/js/modules/Race.ts | 3 +- 4 files changed, 76 insertions(+), 16 deletions(-) diff --git a/cypress/integration/racingcar.spec.js b/cypress/integration/racingcar.spec.js index e8f7b3680..668e6e4b5 100644 --- a/cypress/integration/racingcar.spec.js +++ b/cypress/integration/racingcar.spec.js @@ -1,12 +1,72 @@ -describe('initial value', () => { - beforeEach(() => { - cy.visit('/javascript-racingcar/'); - }); - it('total value', () => { - cy.get('.w-100[type=text]').type('holee') - cy.get('.w-100[type=text]').should('have.value', 'holee'); - cy.get('.w-100[type=number]').type(1) - cy.get('.w-100[type=number]').should('have.value', 1); +const typeAndCheckInput = (location, content, result) => { + cy.get(location).type(content); + cy.get(location).should('have.value', result); +}; + +const typeAndClickCarNameSubmit = (content) => { + typeAndCheckInput('.w-100[type=text]', content, content); + cy.get('#car-name-submit').click(); + cy.get('#car-name-submit').should('be.disabled'); + cy.get('.w-100[type=text]').should('be.disabled'); +}; + +const typeAndClickCountSubmit = (count) => { + typeAndCheckInput('.w-100[type=number]', count, count); + cy.get('#car-count-submit').click(); + cy.get('#car-count-submit').should('be.disabled'); + cy.get('.w-100[type=number]').should('be.disabled'); +}; + +const checkSpinnerCount = (length) => { + cy.get('.spinner-container').should('exist'); + cy.get('.mr-2').find('.spinner').should('have.length', length); +}; + +describe('initial page behavior', () => { + beforeEach(() => { + cy.visit('/javascript-racingcar/'); + }); + it('inputκ°’ μž…λ ₯ν–ˆμ„λ•Œ 잘 λ“€μ–΄κ°€λŠ”μ§€ 확인', () => { + cy.get('.w-100[type=text]').type('holee'); + cy.get('.w-100[type=text]').should('have.value', 'holee'); + cy.get('.w-100[type=number]').type(1); + cy.get('.w-100[type=number]').should('have.value', 1); + }); +}); + +describe('racing-game base behavior', () => { + beforeEach(() => { + cy.visit('/javascript-racingcar/'); + }); + const basicInput = 'EAST, WEST, SOUTH, NORTH'; + const basicCount = 2; + + it('μžλ™μ°¨ 이름 μž…λ ₯ ν–ˆμ„ λ•Œ, car name input/button λΉ„ν™œμ„±ν™”', () => { + typeAndClickCarNameSubmit(basicInput); + }); + it('μžλ™μ°¨ 이름 μž…λ ₯ ν–ˆμ„ λ•Œ, 이름에 λ§žλŠ” μžλ™μ°¨/μŠ€ν”Όλ„ˆ 생성', () => { + typeAndClickCarNameSubmit(basicInput); + basicInput.split(', ').map((x, i) => { + cy.get('.car-player').eq(i).should('have.text', x); }); + checkSpinnerCount(basicInput.split(', ').length); + }); + it('μ‹œλ„ 횟수 μž…λ ₯ ν–ˆμ„ λ•Œ, count input/button λΉ„ν™œμ„±ν™”', () => { + typeAndClickCarNameSubmit(basicInput); + typeAndClickCountSubmit(basicCount); + }); + it('μ‹œλ„ 횟수 μž…λ ₯ ν–ˆμ„ λ•Œ, μ•Œλ§žμ€ ⬇️️ 생성', () => { + typeAndClickCarNameSubmit(basicInput); + typeAndClickCountSubmit(basicCount); + // cy.get('.car-player') }); - \ No newline at end of file + // it("μ‹œλ„ 횟수 μž…λ ₯ ν–ˆμ„ λ•Œ, κ²°κ³Ό ν™”λ©΄ 좜λ ₯", () => { + // ; + // }); + // it("μ‹œλ„ 횟수 μž…λ ₯ ν–ˆμ„ λ•Œ, μ•Œλ§žμ€ alert 생성", () => { + // ; + // }); + // it("λ‹€μ‹œ μ‹œμž‘ν•˜κΈ° λ²„νŠΌ λΆˆλ €μ„ λ•Œ, html μ΄ˆκΈ°ν™” 확인", () => { + // ; + // }); +}); diff --git a/docs/README.md b/docs/README.md index 8ae74df23..e1b0ec1d3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -33,5 +33,3 @@ - [x] car name input μž…λ ₯ν•œ λ’€μ—λ§Œ count μž…λ ₯ν•  수 있게 κ΅¬ν˜„ν•˜κΈ°. - [x] input μž…λ ₯ν•œ λ’€ λΉ„ν™œμ„±ν™” ν•˜κΈ°. - [x] 각 μ—λŸ¬ 경우 ν›„ ν™œμ„±ν™” ν•˜κΈ°. - -html μš”μ†Œ λ’€μ–΄κΊΌλΆ€ν„° μ‚­μ œν•΄μ•Όν•¨. ν•˜λ‚˜μ”© μ €μ ˆλ‘œ λ°€λ €μ„œ 정렬됨. diff --git a/src/js/modules/@share/view.ts b/src/js/modules/@share/view.ts index 6bcb89e28..aab6795d8 100644 --- a/src/js/modules/@share/view.ts +++ b/src/js/modules/@share/view.ts @@ -1,5 +1,4 @@ -const startSection = -`
+const startSection = `

🏎️ μžλ™μ°¨ κ²½μ£Ό κ²Œμž„

@@ -62,4 +61,6 @@ const winnerSection = (winner: string): string => {
`; }; -export { startSection, carNamesSection, carNameDiv, winnerSection }; +const forwardIconDiv = `
⬇️️
`; + +export { startSection, carNamesSection, carNameDiv, winnerSection, forwardIconDiv }; diff --git a/src/js/modules/Race.ts b/src/js/modules/Race.ts index dc1064019..425769c90 100644 --- a/src/js/modules/Race.ts +++ b/src/js/modules/Race.ts @@ -4,6 +4,7 @@ import { ERROR_MESSAGE, MESSAGE, DELAY } from './@share/constants.js'; import { racingCountInputInit, carNameInputInit } from './@share/init.js'; import { removeSpinner } from './@share/spinner.js'; import { checkCarNameDataset } from './@share/dom-dataset.js'; +import { forwardIconDiv } from './@share/view.js'; const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: number }): void => { let _cars: Car[]; @@ -38,7 +39,7 @@ const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: nu for (let i = 0; i < carPlayer.length; i += 1) { if (getRandomSingleDigit(0, 9) >= 4) { _cars[i].move(); - carPlayer[i].insertAdjacentHTML('afterend', '
⬇️️
'); + carPlayer[i].insertAdjacentHTML('afterend', forwardIconDiv); } if (tryCount <= 1) { removeSpinner(carPlayer[i]); From 0a5bc30f1a97cf89a5f51a028f61b640c30d33d2 Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Thu, 3 Jun 2021 20:00:29 +0900 Subject: [PATCH 30/35] =?UTF-8?q?refactor:=20import=20=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=EB=93=A4=20=EC=88=9C=EC=84=9C=20=EB=A6=AC=ED=8E=99=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/modules/@share/controller.ts | 3 ++- src/js/modules/CarName.ts | 2 +- src/js/modules/Race.ts | 7 ++++--- src/js/modules/Winner.ts | 4 ++-- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/js/modules/@share/controller.ts b/src/js/modules/@share/controller.ts index a4f5bf941..90942edb9 100644 --- a/src/js/modules/@share/controller.ts +++ b/src/js/modules/@share/controller.ts @@ -1,8 +1,9 @@ import CarNameComponent from '../CarName.js'; import RaceComponent from '../Race.js'; + +import { disable, initEnable } from './utils.js'; import { ERROR_MESSAGE } from './constants.js'; import { carNameInputInit } from './init.js'; -import { disable, initEnable } from './utils.js'; const carNameInputEvent = (): void => { const carNamesInput: HTMLInputElement = document.getElementById('car-name-input') as HTMLInputElement; diff --git a/src/js/modules/CarName.ts b/src/js/modules/CarName.ts index 6486a3852..c80f351b2 100644 --- a/src/js/modules/CarName.ts +++ b/src/js/modules/CarName.ts @@ -1,7 +1,7 @@ import { carNamesSection, carNameDiv } from './@share/view.js'; +import { setCarNameDataset } from './@share/dom-dataset.js'; import { ERROR_MESSAGE } from './@share/constants.js'; import { carNameInputInit } from './@share/init.js'; -import { setCarNameDataset } from './@share/dom-dataset.js'; import { initEnable } from './@share/utils.js'; const CarNameComponent = ({ $app, carNames }: { $app: HTMLDivElement | null; carNames: string }): void => { diff --git a/src/js/modules/Race.ts b/src/js/modules/Race.ts index 425769c90..f07452e81 100644 --- a/src/js/modules/Race.ts +++ b/src/js/modules/Race.ts @@ -1,9 +1,10 @@ -import { Car, getRandomSingleDigit, wait, initEnable, countEnable } from './@share/utils.js'; import WinnerComponent from './Winner.js'; -import { ERROR_MESSAGE, MESSAGE, DELAY } from './@share/constants.js'; + +import { Car, getRandomSingleDigit, wait, initEnable, countEnable } from './@share/utils.js'; import { racingCountInputInit, carNameInputInit } from './@share/init.js'; -import { removeSpinner } from './@share/spinner.js'; +import { ERROR_MESSAGE, MESSAGE, DELAY } from './@share/constants.js'; import { checkCarNameDataset } from './@share/dom-dataset.js'; +import { removeSpinner } from './@share/spinner.js'; import { forwardIconDiv } from './@share/view.js'; const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: number }): void => { diff --git a/src/js/modules/Winner.ts b/src/js/modules/Winner.ts index a90989098..5665dd62a 100644 --- a/src/js/modules/Winner.ts +++ b/src/js/modules/Winner.ts @@ -1,7 +1,7 @@ -import { Car, initEnable } from './@share/utils.js'; +import { setCarNameDataset } from './@share/dom-dataset.js'; import { inputController } from './@share/controller.js'; +import { Car, initEnable } from './@share/utils.js'; import { winnerSection } from './@share/view.js'; -import { setCarNameDataset } from './@share/dom-dataset.js'; const WinnerComponent = ({ $app, cars }: { $app: HTMLDivElement | null; cars: Car[] }): void => { const findWinners = (cars: Car[]): string[] => { From f2449fdd95f476c8ff721fe06c527d0ce10096b7 Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Thu, 3 Jun 2021 20:59:48 +0900 Subject: [PATCH 31/35] test: add cypress testcase initial page behavior racing-game base behavior racing-game exception behavior --- cypress/integration/racingcar.spec.js | 86 +++++++++++++++++++++++---- dist/js/modules/@share/constants.js | 2 +- dist/js/modules/@share/controller.js | 2 +- dist/js/modules/@share/view.js | 17 +++--- dist/js/modules/CarName.js | 2 +- dist/js/modules/Race.js | 9 +-- dist/js/modules/Winner.js | 4 +- src/js/modules/@share/constants.ts | 2 +- src/js/modules/@share/view.ts | 14 ++--- 9 files changed, 101 insertions(+), 37 deletions(-) diff --git a/cypress/integration/racingcar.spec.js b/cypress/integration/racingcar.spec.js index 668e6e4b5..2c85353f2 100644 --- a/cypress/integration/racingcar.spec.js +++ b/cypress/integration/racingcar.spec.js @@ -26,7 +26,7 @@ describe('initial page behavior', () => { beforeEach(() => { cy.visit('/javascript-racingcar/'); }); - it('inputκ°’ μž…λ ₯ν–ˆμ„λ•Œ 잘 λ“€μ–΄κ°€λŠ”μ§€ 확인', () => { + it('inputκ°’ μž…λ ₯ ν–ˆμ„λ•Œ 잘 λ“€μ–΄κ°€λŠ”μ§€ 확인', () => { cy.get('.w-100[type=text]').type('holee'); cy.get('.w-100[type=text]').should('have.value', 'holee'); cy.get('.w-100[type=number]').type(1); @@ -55,18 +55,80 @@ describe('racing-game base behavior', () => { typeAndClickCarNameSubmit(basicInput); typeAndClickCountSubmit(basicCount); }); - it('μ‹œλ„ 횟수 μž…λ ₯ ν–ˆμ„ λ•Œ, μ•Œλ§žμ€ ⬇️️ 생성', () => { + it('μ‹œλ„ 횟수 μž…λ ₯ ν–ˆμ„ λ•Œ, μ•Œλ§žμ€ ⬇️️ 생성 및 spinner μ‚­μ œ', () => { typeAndClickCarNameSubmit(basicInput); typeAndClickCountSubmit(basicCount); - // cy.get('.car-player') + cy.clock(); + checkSpinnerCount(basicInput.split(', ').length); + cy.tick(2000); + cy.get('.forward-icon').should('exist'); + checkSpinnerCount(0); + }); + it('μ‹œλ„ 횟수 μž…λ ₯ ν–ˆμ„ λ•Œ, κ²°κ³Ό ν™”λ©΄ 좜λ ₯', () => { + typeAndClickCarNameSubmit(basicInput); + typeAndClickCountSubmit(basicCount); + cy.wait(2000); + cy.get('section').eq(2).should('exist'); + }); + it('μ‹œλ„ 횟수 μž…λ ₯ ν–ˆμ„ λ•Œ, μ•Œλ§žμ€ alert 생성', () => { + typeAndClickCarNameSubmit(basicInput); + typeAndClickCountSubmit(basicCount); + cy.wait(2000); + cy.get('section').eq(2).should('exist'); + cy.wait(1500); + cy.on('window:alert', (txt) => { + expect(txt).to.contains('πŸ† 우승 μΆ•ν•˜ν•©λ‹ˆλ‹€ γ…Žγ…Ž πŸ†'); + }); + }); + it('λ‹€μ‹œ μ‹œμž‘ν•˜κΈ° λ²„νŠΌ λΆˆλ €μ„ λ•Œ, html μ΄ˆκΈ°ν™” 확인', () => { + typeAndClickCarNameSubmit(basicInput); + typeAndClickCountSubmit(basicCount); + cy.wait(3500); + cy.get('button').eq(2).click(); + cy.get('section').eq(1).should('not.exist'); + cy.get('section').eq(2).should('not.exist'); + cy.get('#car-name-submit').should('not.disabled'); + cy.get('.w-100[type=text]').should('not.disabled'); + cy.get('#car-count-submit').should('not.disabled'); + cy.get('.w-100[type=number]').should('not.disabled'); + }); +}); + +const checkValidInit = () => { + cy.get('#car-count-submit').should('not.disabled'); + cy.get('.w-100[type=number]').should('not.disabled'); + cy.get('section').eq(1).should('not.exist'); + cy.get('section').eq(2).should('not.exist'); + cy.get('.w-100[type=text]').focus(); +}; + +describe('racing-game exception behavior', () => { + beforeEach(() => { + cy.visit('/javascript-racingcar/'); + }); + const basicInput = 'EAST, WEST, SOUTH, NORTH'; + const basicCount = 2; + + it('μžλ™μ°¨ 이름을 μž…λ ₯ν•˜μ§€ μ•Šμ•˜μ„ λ•Œ, μ‹œλ„ν•  횟수 λ²„νŠΌ 클릭', () => { + cy.get('#car-name-submit').click(); + cy.get('#car-count-submit').click(); + checkValidInit(); + }); + it('μžλ™μ°¨ 이름을 μž…λ ₯ν•˜μ§€ μ•Šμ•˜μ„ λ•Œ, μ‹œλ„ν•  횟수 μž…λ ₯ ν›„ λ²„νŠΌ 클릭', () => { + typeAndCheckInput('.w-100[type=number]', basicCount, basicCount); + cy.get('#car-name-submit').click(); + cy.get('#car-count-submit').click(); + checkValidInit(); + }); + it('μžλ™μ°¨ 이름을 μž…λ ₯ν•œ ν›„ 확인 λ²„νŠΌμ„ λˆ„λ₯΄μ§€μ•Šμ•˜μ„ λ•Œ, μ‹œλ„ν•  횟수 λ²„νŠΌ 클릭', () => { + typeAndCheckInput('.w-100[type=text]', basicInput, basicInput); + cy.get('#car-count-submit').click(); + checkValidInit(); + }); + it('μžλ™μ°¨ 이름을 μž…λ ₯ν•œ ν›„ 확인 λ²„νŠΌμ„ λˆ„λ₯΄μ§€μ•Šμ•˜μ„ λ•Œ, μ‹œλ„ν•  횟수 μž…λ ₯ ν›„ λ²„νŠΌ 클릭', () => { + typeAndCheckInput('.w-100[type=text]', basicInput, basicInput); + typeAndCheckInput('.w-100[type=number]', basicCount, basicCount); + cy.get('#car-count-submit').click(); + checkValidInit(); }); - // it("μ‹œλ„ 횟수 μž…λ ₯ ν–ˆμ„ λ•Œ, κ²°κ³Ό ν™”λ©΄ 좜λ ₯", () => { - // ; - // }); - // it("μ‹œλ„ 횟수 μž…λ ₯ ν–ˆμ„ λ•Œ, μ•Œλ§žμ€ alert 생성", () => { - // ; - // }); - // it("λ‹€μ‹œ μ‹œμž‘ν•˜κΈ° λ²„νŠΌ λΆˆλ €μ„ λ•Œ, html μ΄ˆκΈ°ν™” 확인", () => { - // ; - // }); }); diff --git a/dist/js/modules/@share/constants.js b/dist/js/modules/@share/constants.js index 9cf420a1b..501dc12cb 100644 --- a/dist/js/modules/@share/constants.js +++ b/dist/js/modules/@share/constants.js @@ -4,7 +4,7 @@ const ERROR_MESSAGE = { INVALID_COUNT_INPUT: 'μœ νš¨ν•˜μ§€ μ•Šμ€ 횟수 μž…λ ₯μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ ν•΄μ£Όμ„Έμš”.', }; const MESSAGE = { - CELEBRATE_WINNER: 'πŸ† μΆ•ν•˜ν•©λ‹ˆλ‹€ γ…Žγ…Ž μ΅œμ’… 우승자: EAST, WEST, SOUTH, NORTH πŸ†', + CELEBRATE_WINNER: 'πŸ† 우승 μΆ•ν•˜ν•©λ‹ˆλ‹€ γ…Žγ…Ž πŸ†', }; const DELAY = { RACE: 1000, diff --git a/dist/js/modules/@share/controller.js b/dist/js/modules/@share/controller.js index 12a120e8e..a7693eb12 100644 --- a/dist/js/modules/@share/controller.js +++ b/dist/js/modules/@share/controller.js @@ -1,8 +1,8 @@ import CarNameComponent from '../CarName.js'; import RaceComponent from '../Race.js'; +import { disable, initEnable } from './utils.js'; import { ERROR_MESSAGE } from './constants.js'; import { carNameInputInit } from './init.js'; -import { disable, initEnable } from './utils.js'; const carNameInputEvent = () => { var _a; const carNamesInput = document.getElementById('car-name-input'); diff --git a/dist/js/modules/@share/view.js b/dist/js/modules/@share/view.js index 66ce4b239..2706647c2 100644 --- a/dist/js/modules/@share/view.js +++ b/dist/js/modules/@share/view.js @@ -49,12 +49,13 @@ const carNameDiv = (carName) => { }; const winnerSection = (winner) => { return `
-
-

πŸ† μ΅œμ’… 우승자: ${winner} πŸ†

-
- -
-
-
`; +
+

πŸ† μ΅œμ’… 우승자: ${winner} πŸ†

+
+ +
+
+
`; }; -export { startSection, carNamesSection, carNameDiv, winnerSection }; +const forwardIconDiv = `
⬇️️
`; +export { startSection, carNamesSection, carNameDiv, winnerSection, forwardIconDiv }; diff --git a/dist/js/modules/CarName.js b/dist/js/modules/CarName.js index b036724ee..f187a9355 100644 --- a/dist/js/modules/CarName.js +++ b/dist/js/modules/CarName.js @@ -1,7 +1,7 @@ import { carNamesSection, carNameDiv } from './@share/view.js'; +import { setCarNameDataset } from './@share/dom-dataset.js'; import { ERROR_MESSAGE } from './@share/constants.js'; import { carNameInputInit } from './@share/init.js'; -import { setCarNameDataset } from './@share/dom-dataset.js'; import { initEnable } from './@share/utils.js'; const CarNameComponent = ({ $app, carNames }) => { const checkCarNames = (carNameList) => carNameList.length === carNameList.filter((x) => x.length <= 5 && x !== '').length; diff --git a/dist/js/modules/Race.js b/dist/js/modules/Race.js index ab7948f1f..0ab65da01 100644 --- a/dist/js/modules/Race.js +++ b/dist/js/modules/Race.js @@ -7,12 +7,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; -import { Car, getRandomSingleDigit, wait, initEnable, countEnable } from './@share/utils.js'; import WinnerComponent from './Winner.js'; -import { ERROR_MESSAGE, MESSAGE, DELAY } from './@share/constants.js'; +import { Car, getRandomSingleDigit, wait, initEnable, countEnable } from './@share/utils.js'; import { racingCountInputInit, carNameInputInit } from './@share/init.js'; -import { removeSpinner } from './@share/spinner.js'; +import { ERROR_MESSAGE, MESSAGE, DELAY } from './@share/constants.js'; import { checkCarNameDataset } from './@share/dom-dataset.js'; +import { removeSpinner } from './@share/spinner.js'; +import { forwardIconDiv } from './@share/view.js'; const RaceComponent = ({ $app, count }) => { let _cars; const checkValidCount = (count) => { @@ -37,7 +38,7 @@ const RaceComponent = ({ $app, count }) => { for (let i = 0; i < carPlayer.length; i += 1) { if (getRandomSingleDigit(0, 9) >= 4) { _cars[i].move(); - carPlayer[i].insertAdjacentHTML('afterend', '
⬇️️
'); + carPlayer[i].insertAdjacentHTML('afterend', forwardIconDiv); } if (tryCount <= 1) { removeSpinner(carPlayer[i]); diff --git a/dist/js/modules/Winner.js b/dist/js/modules/Winner.js index fd7a2b8c1..45ac644d7 100644 --- a/dist/js/modules/Winner.js +++ b/dist/js/modules/Winner.js @@ -1,7 +1,7 @@ -import { initEnable } from './@share/utils.js'; +import { setCarNameDataset } from './@share/dom-dataset.js'; import { inputController } from './@share/controller.js'; +import { initEnable } from './@share/utils.js'; import { winnerSection } from './@share/view.js'; -import { setCarNameDataset } from './@share/dom-dataset.js'; const WinnerComponent = ({ $app, cars }) => { const findWinners = (cars) => { const totalDistances = cars.map((car) => car.distance); diff --git a/src/js/modules/@share/constants.ts b/src/js/modules/@share/constants.ts index f89999d37..98eb06cc9 100644 --- a/src/js/modules/@share/constants.ts +++ b/src/js/modules/@share/constants.ts @@ -5,7 +5,7 @@ const ERROR_MESSAGE = { }; const MESSAGE = { - CELEBRATE_WINNER: 'πŸ† μΆ•ν•˜ν•©λ‹ˆλ‹€ γ…Žγ…Ž μ΅œμ’… 우승자: EAST, WEST, SOUTH, NORTH πŸ†', + CELEBRATE_WINNER: 'πŸ† 우승 μΆ•ν•˜ν•©λ‹ˆλ‹€ γ…Žγ…Ž πŸ†', }; const DELAY = { diff --git a/src/js/modules/@share/view.ts b/src/js/modules/@share/view.ts index aab6795d8..1f62466af 100644 --- a/src/js/modules/@share/view.ts +++ b/src/js/modules/@share/view.ts @@ -52,13 +52,13 @@ const carNameDiv = (carName: string): string => { const winnerSection = (winner: string): string => { return `
-
-

πŸ† μ΅œμ’… 우승자: ${winner} πŸ†

-
- -
-
-
`; +
+

πŸ† μ΅œμ’… 우승자: ${winner} πŸ†

+
+ +
+
+ `; }; const forwardIconDiv = `
⬇️️
`; From a2c7c10d5d09b644f7cbe5b037d1b0917007844e Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Fri, 4 Jun 2021 09:53:16 +0900 Subject: [PATCH 32/35] =?UTF-8?q?style:=20=ED=95=A8=EC=88=98=EC=82=AC?= =?UTF-8?q?=EC=9D=B4=EC=97=90=20=EA=B0=9C=ED=96=89=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/js/modules/@share/controller.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/js/modules/@share/controller.ts b/src/js/modules/@share/controller.ts index 90942edb9..778968399 100644 --- a/src/js/modules/@share/controller.ts +++ b/src/js/modules/@share/controller.ts @@ -14,6 +14,7 @@ const carNameInputEvent = (): void => { CarNameComponent({ $app: document.querySelector('#app'), carNames: carNamesInput.value }); } }; + const raceCountInputEvent = () => { const raceCountInput: HTMLInputElement = document.querySelector('input[type="number"]') as HTMLInputElement; const carNamesInput: HTMLInputElement = document.querySelector('input[type="text"]') as HTMLInputElement; @@ -31,6 +32,7 @@ const raceCountInputEvent = () => { initEnable(); } }; + const inputController = (): void => { const gameButton: HTMLCollectionOf = document.getElementsByTagName('button'); gameButton[0].onclick = carNameInputEvent; From 710237bf74f3f780260947c3380d1b410b4efd0f Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Fri, 4 Jun 2021 14:31:38 +0900 Subject: [PATCH 33/35] =?UTF-8?q?refactor:=20dom=20=ED=95=A8=EC=88=98=20qu?= =?UTF-8?q?eryselector=EB=A1=9C=20=ED=86=B5=EC=9D=BC=ED=99=94=20=EB=B0=8F?= =?UTF-8?q?=20$,=209620=EB=A1=9C=20=EA=B0=80=EB=8F=85=EC=84=B1=20=EC=A2=8B?= =?UTF-8?q?=EA=B2=8C=20=EB=B0=94=EA=BF=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/js/modules/@share/controller.js | 14 +++++++------- dist/js/modules/@share/dom-dataset.js | 5 +++-- dist/js/modules/@share/init.js | 5 +++-- dist/js/modules/@share/utils.js | 12 +++++++----- dist/js/modules/Race.js | 6 +++--- dist/js/modules/Winner.js | 4 ++-- src/js/modules/@share/controller.ts | 14 +++++++------- src/js/modules/@share/dom-dataset.ts | 6 ++++-- src/js/modules/@share/init.ts | 6 ++++-- src/js/modules/@share/utils.ts | 24 ++++++++++++++---------- src/js/modules/CarName.ts | 2 +- src/js/modules/Game.ts | 6 +++--- src/js/modules/Race.ts | 8 +++----- src/js/modules/Winner.ts | 10 +++++----- 14 files changed, 66 insertions(+), 56 deletions(-) diff --git a/dist/js/modules/@share/controller.js b/dist/js/modules/@share/controller.js index a7693eb12..4ad0ad09d 100644 --- a/dist/js/modules/@share/controller.js +++ b/dist/js/modules/@share/controller.js @@ -1,26 +1,26 @@ import CarNameComponent from '../CarName.js'; import RaceComponent from '../Race.js'; -import { disable, initEnable } from './utils.js'; +import { $, $$, disable, initEnable } from './utils.js'; import { ERROR_MESSAGE } from './constants.js'; import { carNameInputInit } from './init.js'; const carNameInputEvent = () => { var _a; - const carNamesInput = document.getElementById('car-name-input'); + const carNamesInput = $('#car-name-input'); disable(carNamesInput); disable((_a = carNamesInput.parentElement) === null || _a === void 0 ? void 0 : _a.children[1]); if (carNamesInput) { - CarNameComponent({ $app: document.querySelector('#app'), carNames: carNamesInput.value }); + CarNameComponent({ $app: $('#app'), carNames: carNamesInput.value }); } }; const raceCountInputEvent = () => { var _a; - const raceCountInput = document.querySelector('input[type="number"]'); - const carNamesInput = document.querySelector('input[type="text"]'); + const raceCountInput = $('input[type="number"]'); + const carNamesInput = $('input[type="text"]'); disable(raceCountInput); disable((_a = raceCountInput.parentElement) === null || _a === void 0 ? void 0 : _a.children[1]); if (raceCountInput && carNamesInput.value !== '') { RaceComponent({ - $app: document.querySelector('#app'), + $app: $('#app'), count: Number(raceCountInput.value), }); } @@ -31,7 +31,7 @@ const raceCountInputEvent = () => { } }; const inputController = () => { - const gameButton = document.getElementsByTagName('button'); + const gameButton = $$('button'); gameButton[0].onclick = carNameInputEvent; gameButton[1].onclick = raceCountInputEvent; }; diff --git a/dist/js/modules/@share/dom-dataset.js b/dist/js/modules/@share/dom-dataset.js index 3a4bbf0a1..3c4df00fb 100644 --- a/dist/js/modules/@share/dom-dataset.js +++ b/dist/js/modules/@share/dom-dataset.js @@ -1,11 +1,12 @@ +import { $ } from './utils.js'; const setCarNameDataset = (data) => { - const carNamesInput = document.querySelector('input[type="text"]'); + const carNamesInput = $('input[type="text"]'); if (carNamesInput) { carNamesInput.dataset.click = data; } }; const checkCarNameDataset = () => { - const carNamesInput = document.querySelector('input[type="text"]'); + const carNamesInput = $('input[type="text"]'); if (carNamesInput) { return carNamesInput.dataset.click === 'click'; } diff --git a/dist/js/modules/@share/init.js b/dist/js/modules/@share/init.js index 05b2776e0..1ccdac612 100644 --- a/dist/js/modules/@share/init.js +++ b/dist/js/modules/@share/init.js @@ -1,10 +1,11 @@ +import { $ } from './utils.js'; const carNameInputInit = () => { - const carNameInput = document.getElementById('car-name-input'); + const carNameInput = $('#car-name-input'); carNameInput.value = ''; carNameInput.focus(); }; const racingCountInputInit = () => { - const racingCountInput = document.getElementById('racing-count-input'); + const racingCountInput = $('#racing-count-input'); racingCountInput.value = ''; racingCountInput.focus(); }; diff --git a/dist/js/modules/@share/utils.js b/dist/js/modules/@share/utils.js index 08ba81c76..b8f4c7e90 100644 --- a/dist/js/modules/@share/utils.js +++ b/dist/js/modules/@share/utils.js @@ -22,6 +22,8 @@ const getRandomSingleDigit = (min, max) => { const wait = (delay) => __awaiter(void 0, void 0, void 0, function* () { return new Promise((resolve) => setTimeout(resolve, delay)); }); +const $ = (selector) => document.querySelector(selector); +const $$ = (selector) => document.querySelectorAll(selector); const disable = (element) => { element.disabled = true; }; @@ -30,23 +32,23 @@ const enable = (element) => { }; const carNameEnable = () => { var _a; - const carNamesInput = document.getElementById('car-name-input'); + const carNamesInput = $('#car-name-input'); enable(carNamesInput); enable((_a = carNamesInput.parentElement) === null || _a === void 0 ? void 0 : _a.children[1]); }; const countEnable = () => { var _a; - const raceCountInput = document.querySelector('input[type="number"]'); + const raceCountInput = $('input[type="number"]'); enable(raceCountInput); enable((_a = raceCountInput.parentElement) === null || _a === void 0 ? void 0 : _a.children[1]); }; const initEnable = () => { var _a, _b; - const carNamesInput = document.getElementById('car-name-input'); - const raceCountInput = document.querySelector('input[type="number"]'); + const carNamesInput = $('#car-name-input'); + const raceCountInput = $('input[type="number"]'); enable(carNamesInput); enable((_a = carNamesInput.parentElement) === null || _a === void 0 ? void 0 : _a.children[1]); enable(raceCountInput); enable((_b = raceCountInput.parentElement) === null || _b === void 0 ? void 0 : _b.children[1]); }; -export { Car, getRandomSingleDigit, wait, disable, initEnable, carNameEnable, countEnable }; +export { Car, getRandomSingleDigit, wait, $, $$, disable, initEnable, carNameEnable, countEnable }; diff --git a/dist/js/modules/Race.js b/dist/js/modules/Race.js index 0ab65da01..058848a1d 100644 --- a/dist/js/modules/Race.js +++ b/dist/js/modules/Race.js @@ -8,7 +8,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }); }; import WinnerComponent from './Winner.js'; -import { Car, getRandomSingleDigit, wait, initEnable, countEnable } from './@share/utils.js'; +import { $, $$, Car, getRandomSingleDigit, wait, initEnable, countEnable } from './@share/utils.js'; import { racingCountInputInit, carNameInputInit } from './@share/init.js'; import { ERROR_MESSAGE, MESSAGE, DELAY } from './@share/constants.js'; import { checkCarNameDataset } from './@share/dom-dataset.js'; @@ -20,7 +20,7 @@ const RaceComponent = ({ $app, count }) => { return count - Math.floor(count) === 0 && count > 0; }; const getInputCarsName = () => { - const carNameInput = document.getElementById('car-name-input'); + const carNameInput = $('#car-name-input'); return carNameInput.value.split(',').map((x) => x.trim()); }; const assignCarsName = () => { @@ -32,7 +32,7 @@ const RaceComponent = ({ $app, count }) => { return cars; }; const render = ({ count }) => __awaiter(void 0, void 0, void 0, function* () { - const carPlayer = document.getElementsByClassName('car-player'); + const carPlayer = $$('.car-player'); let tryCount = count; while (tryCount > 0) { for (let i = 0; i < carPlayer.length; i += 1) { diff --git a/dist/js/modules/Winner.js b/dist/js/modules/Winner.js index 45ac644d7..b21e5b322 100644 --- a/dist/js/modules/Winner.js +++ b/dist/js/modules/Winner.js @@ -1,6 +1,6 @@ import { setCarNameDataset } from './@share/dom-dataset.js'; import { inputController } from './@share/controller.js'; -import { initEnable } from './@share/utils.js'; +import { $$, initEnable } from './@share/utils.js'; import { winnerSection } from './@share/view.js'; const WinnerComponent = ({ $app, cars }) => { const findWinners = (cars) => { @@ -33,7 +33,7 @@ const WinnerComponent = ({ $app, cars }) => { return; }; const controller = () => { - const retryButton = document.getElementsByTagName('button')[2]; + const retryButton = $$('button')[2]; if (retryButton) { retryButton.onclick = retryButtonEvent; } diff --git a/src/js/modules/@share/controller.ts b/src/js/modules/@share/controller.ts index 778968399..7402d8a41 100644 --- a/src/js/modules/@share/controller.ts +++ b/src/js/modules/@share/controller.ts @@ -1,29 +1,29 @@ import CarNameComponent from '../CarName.js'; import RaceComponent from '../Race.js'; -import { disable, initEnable } from './utils.js'; +import { $, $$, disable, initEnable } from './utils.js'; import { ERROR_MESSAGE } from './constants.js'; import { carNameInputInit } from './init.js'; const carNameInputEvent = (): void => { - const carNamesInput: HTMLInputElement = document.getElementById('car-name-input') as HTMLInputElement; + const carNamesInput: HTMLInputElement = $('#car-name-input') as HTMLInputElement; disable(carNamesInput); disable(carNamesInput.parentElement?.children[1]); if (carNamesInput) { - CarNameComponent({ $app: document.querySelector('#app'), carNames: carNamesInput.value }); + CarNameComponent({ $app: $('#app'), carNames: carNamesInput.value }); } }; const raceCountInputEvent = () => { - const raceCountInput: HTMLInputElement = document.querySelector('input[type="number"]') as HTMLInputElement; - const carNamesInput: HTMLInputElement = document.querySelector('input[type="text"]') as HTMLInputElement; + const raceCountInput: HTMLInputElement = $('input[type="number"]') as HTMLInputElement; + const carNamesInput: HTMLInputElement = $('input[type="text"]') as HTMLInputElement; disable(raceCountInput); disable(raceCountInput.parentElement?.children[1]); if (raceCountInput && carNamesInput.value !== '') { RaceComponent({ - $app: document.querySelector('#app'), + $app: $('#app'), count: Number(raceCountInput.value), }); } else { @@ -34,7 +34,7 @@ const raceCountInputEvent = () => { }; const inputController = (): void => { - const gameButton: HTMLCollectionOf = document.getElementsByTagName('button'); + const gameButton: NodeListOf = >$$('button'); gameButton[0].onclick = carNameInputEvent; gameButton[1].onclick = raceCountInputEvent; }; diff --git a/src/js/modules/@share/dom-dataset.ts b/src/js/modules/@share/dom-dataset.ts index 3fc2a8a14..4b2f77146 100644 --- a/src/js/modules/@share/dom-dataset.ts +++ b/src/js/modules/@share/dom-dataset.ts @@ -1,12 +1,14 @@ +import { $ } from './utils.js'; + const setCarNameDataset = (data: string): void => { - const carNamesInput: HTMLInputElement = document.querySelector('input[type="text"]') as HTMLInputElement; + const carNamesInput: HTMLInputElement = $('input[type="text"]') as HTMLInputElement; if (carNamesInput) { carNamesInput.dataset.click = data; } }; const checkCarNameDataset = (): boolean => { - const carNamesInput: HTMLInputElement = document.querySelector('input[type="text"]') as HTMLInputElement; + const carNamesInput: HTMLInputElement = $('input[type="text"]') as HTMLInputElement; if (carNamesInput) { return carNamesInput.dataset.click === 'click'; } diff --git a/src/js/modules/@share/init.ts b/src/js/modules/@share/init.ts index 5d51a1631..3f8b772b5 100644 --- a/src/js/modules/@share/init.ts +++ b/src/js/modules/@share/init.ts @@ -1,11 +1,13 @@ +import { $ } from './utils.js'; + const carNameInputInit = () => { - const carNameInput = document.getElementById('car-name-input') as HTMLInputElement; + const carNameInput = $('#car-name-input') as HTMLInputElement; carNameInput.value = ''; carNameInput.focus(); }; const racingCountInputInit = () => { - const racingCountInput = document.getElementById('racing-count-input') as HTMLInputElement; + const racingCountInput = $('#racing-count-input') as HTMLInputElement; racingCountInput.value = ''; racingCountInput.focus(); }; diff --git a/src/js/modules/@share/utils.ts b/src/js/modules/@share/utils.ts index 59c576657..8b55dd841 100644 --- a/src/js/modules/@share/utils.ts +++ b/src/js/modules/@share/utils.ts @@ -20,32 +20,36 @@ const wait = async (delay: number): Promise => { return new Promise((resolve) => setTimeout(resolve, delay)); }; +const $ = (selector: string): Element | null => document.querySelector(selector); + +const $$ = (selector: string): NodeListOf => document.querySelectorAll(selector); + const disable = (element: HTMLButtonElement | HTMLInputElement) => { element.disabled = true; -} +}; const enable = (element: HTMLButtonElement | HTMLInputElement) => { element.disabled = false; -} +}; const carNameEnable = () => { - const carNamesInput: HTMLInputElement = document.getElementById('car-name-input') as HTMLInputElement; + const carNamesInput: HTMLInputElement = $('#car-name-input') as HTMLInputElement; enable(carNamesInput); enable(carNamesInput.parentElement?.children[1]); -} +}; const countEnable = () => { - const raceCountInput: HTMLInputElement = document.querySelector('input[type="number"]') as HTMLInputElement; + const raceCountInput: HTMLInputElement = $('input[type="number"]') as HTMLInputElement; enable(raceCountInput); enable(raceCountInput.parentElement?.children[1]); -} +}; const initEnable = () => { - const carNamesInput: HTMLInputElement = document.getElementById('car-name-input') as HTMLInputElement; - const raceCountInput: HTMLInputElement = document.querySelector('input[type="number"]') as HTMLInputElement; + const carNamesInput: HTMLInputElement = $('#car-name-input') as HTMLInputElement; + const raceCountInput: HTMLInputElement = $('input[type="number"]') as HTMLInputElement; enable(carNamesInput); enable(carNamesInput.parentElement?.children[1]); enable(raceCountInput); enable(raceCountInput.parentElement?.children[1]); -} +}; -export { Car, getRandomSingleDigit, wait, disable, initEnable, carNameEnable, countEnable }; +export { Car, getRandomSingleDigit, wait, $, $$, disable, initEnable, carNameEnable, countEnable }; diff --git a/src/js/modules/CarName.ts b/src/js/modules/CarName.ts index c80f351b2..b6e0e574c 100644 --- a/src/js/modules/CarName.ts +++ b/src/js/modules/CarName.ts @@ -9,7 +9,7 @@ const CarNameComponent = ({ $app, carNames }: { $app: HTMLDivElement | null; car carNameList.length === carNameList.filter((x) => x.length <= 5 && x !== '').length; const render = (JSX: string): void => { - const sectionElement = $app; + const sectionElement: HTMLDivElement | null = $app; if (sectionElement) { sectionElement.insertAdjacentHTML('beforeend', JSX); } diff --git a/src/js/modules/Game.ts b/src/js/modules/Game.ts index efaf7db36..3a04a02b3 100644 --- a/src/js/modules/Game.ts +++ b/src/js/modules/Game.ts @@ -3,14 +3,14 @@ import { startSection } from './@share/view.js'; const Game = ({ $app }: { $app: HTMLDivElement | null }): void => { const render = (JSX: string): void => { - const sectionElement = $app; + const sectionElement: HTMLDivElement | null = $app; if (sectionElement) { sectionElement.insertAdjacentHTML('beforeend', JSX); } - + return; }; - + const init = (): void => { render(startSection); inputController(); diff --git a/src/js/modules/Race.ts b/src/js/modules/Race.ts index f07452e81..f3429ef7e 100644 --- a/src/js/modules/Race.ts +++ b/src/js/modules/Race.ts @@ -1,6 +1,6 @@ import WinnerComponent from './Winner.js'; -import { Car, getRandomSingleDigit, wait, initEnable, countEnable } from './@share/utils.js'; +import { $, $$, Car, getRandomSingleDigit, wait, initEnable, countEnable } from './@share/utils.js'; import { racingCountInputInit, carNameInputInit } from './@share/init.js'; import { ERROR_MESSAGE, MESSAGE, DELAY } from './@share/constants.js'; import { checkCarNameDataset } from './@share/dom-dataset.js'; @@ -15,7 +15,7 @@ const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: nu }; const getInputCarsName = (): string[] => { - const carNameInput = document.getElementById('car-name-input') as HTMLInputElement; + const carNameInput: HTMLInputElement = $('#car-name-input') as HTMLInputElement; return carNameInput.value.split(',').map((x) => x.trim()); }; @@ -31,9 +31,7 @@ const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: nu }; const render = async ({ count }: { count: number }): Promise => { - const carPlayer: HTMLCollectionOf = document.getElementsByClassName( - 'car-player', - ) as HTMLCollectionOf; + const carPlayer: NodeListOf = $$('.car-player') as NodeListOf; let tryCount: number = count; while (tryCount > 0) { diff --git a/src/js/modules/Winner.ts b/src/js/modules/Winner.ts index 5665dd62a..f94fbf33a 100644 --- a/src/js/modules/Winner.ts +++ b/src/js/modules/Winner.ts @@ -1,12 +1,12 @@ import { setCarNameDataset } from './@share/dom-dataset.js'; import { inputController } from './@share/controller.js'; -import { Car, initEnable } from './@share/utils.js'; +import { $$, Car, initEnable } from './@share/utils.js'; import { winnerSection } from './@share/view.js'; const WinnerComponent = ({ $app, cars }: { $app: HTMLDivElement | null; cars: Car[] }): void => { const findWinners = (cars: Car[]): string[] => { - const totalDistances = cars.map((car) => car.distance); - const maxDistance = Math.max(...totalDistances); + const totalDistances: number[] = cars.map((car) => car.distance); + const maxDistance: number = Math.max(...totalDistances); return cars .filter((car) => { @@ -16,7 +16,7 @@ const WinnerComponent = ({ $app, cars }: { $app: HTMLDivElement | null; cars: Ca }; const render = (JSX: string): void => { - const sectionElement = $app; + const sectionElement: HTMLDivElement | null = $app; if (sectionElement) { sectionElement.insertAdjacentHTML('beforeend', JSX); } @@ -38,7 +38,7 @@ const WinnerComponent = ({ $app, cars }: { $app: HTMLDivElement | null; cars: Ca }; const controller = (): void => { - const retryButton = document.getElementsByTagName('button')[2]; + const retryButton: HTMLButtonElement = $$('button')[2] as HTMLButtonElement; if (retryButton) { retryButton.onclick = retryButtonEvent; } From 581f5e6c6b2c7cdd5e649ee60ea20e4a2333a5ad Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Fri, 4 Jun 2021 17:48:17 +0900 Subject: [PATCH 34/35] =?UTF-8?q?refactor:=20return=20=ED=95=9C=EC=A4=84?= =?UTF-8?q?=EC=9C=84=20=EA=B0=9C=ED=96=89=EA=B3=BC=20=EC=84=A0=EC=96=B8?= =?UTF-8?q?=EB=B6=80=EC=99=80=20=EB=A1=9C=EC=A7=81=20=EA=B0=9C=ED=96=89?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EA=B5=AC=EB=B6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/js/modules/Winner.js | 6 +----- src/js/modules/@share/dom-dataset.ts | 4 ++++ src/js/modules/@share/init.ts | 2 ++ src/js/modules/@share/utils.ts | 3 +++ src/js/modules/CarName.ts | 2 ++ src/js/modules/Game.ts | 1 + src/js/modules/Race.ts | 2 ++ src/js/modules/Winner.ts | 9 ++++----- 8 files changed, 19 insertions(+), 10 deletions(-) diff --git a/dist/js/modules/Winner.js b/dist/js/modules/Winner.js index b21e5b322..1c69d3173 100644 --- a/dist/js/modules/Winner.js +++ b/dist/js/modules/Winner.js @@ -6,11 +6,7 @@ const WinnerComponent = ({ $app, cars }) => { const findWinners = (cars) => { const totalDistances = cars.map((car) => car.distance); const maxDistance = Math.max(...totalDistances); - return cars - .filter((car) => { - return car.distance === maxDistance; - }) - .map((winner) => winner.name); + return cars.filter((car) => car.distance === maxDistance).map((winner) => winner.name); }; const render = (JSX) => { const sectionElement = $app; diff --git a/src/js/modules/@share/dom-dataset.ts b/src/js/modules/@share/dom-dataset.ts index 4b2f77146..b8c846c44 100644 --- a/src/js/modules/@share/dom-dataset.ts +++ b/src/js/modules/@share/dom-dataset.ts @@ -2,6 +2,7 @@ import { $ } from './utils.js'; const setCarNameDataset = (data: string): void => { const carNamesInput: HTMLInputElement = $('input[type="text"]') as HTMLInputElement; + if (carNamesInput) { carNamesInput.dataset.click = data; } @@ -9,9 +10,12 @@ const setCarNameDataset = (data: string): void => { const checkCarNameDataset = (): boolean => { const carNamesInput: HTMLInputElement = $('input[type="text"]') as HTMLInputElement; + if (carNamesInput) { + return carNamesInput.dataset.click === 'click'; } + return false; }; diff --git a/src/js/modules/@share/init.ts b/src/js/modules/@share/init.ts index 3f8b772b5..be1be6580 100644 --- a/src/js/modules/@share/init.ts +++ b/src/js/modules/@share/init.ts @@ -2,12 +2,14 @@ import { $ } from './utils.js'; const carNameInputInit = () => { const carNameInput = $('#car-name-input') as HTMLInputElement; + carNameInput.value = ''; carNameInput.focus(); }; const racingCountInputInit = () => { const racingCountInput = $('#racing-count-input') as HTMLInputElement; + racingCountInput.value = ''; racingCountInput.focus(); }; diff --git a/src/js/modules/@share/utils.ts b/src/js/modules/@share/utils.ts index 8b55dd841..4e4459223 100644 --- a/src/js/modules/@share/utils.ts +++ b/src/js/modules/@share/utils.ts @@ -33,12 +33,14 @@ const enable = (element: HTMLButtonElement | HTMLInputElement) => { const carNameEnable = () => { const carNamesInput: HTMLInputElement = $('#car-name-input') as HTMLInputElement; + enable(carNamesInput); enable(carNamesInput.parentElement?.children[1]); }; const countEnable = () => { const raceCountInput: HTMLInputElement = $('input[type="number"]') as HTMLInputElement; + enable(raceCountInput); enable(raceCountInput.parentElement?.children[1]); }; @@ -46,6 +48,7 @@ const countEnable = () => { const initEnable = () => { const carNamesInput: HTMLInputElement = $('#car-name-input') as HTMLInputElement; const raceCountInput: HTMLInputElement = $('input[type="number"]') as HTMLInputElement; + enable(carNamesInput); enable(carNamesInput.parentElement?.children[1]); enable(raceCountInput); diff --git a/src/js/modules/CarName.ts b/src/js/modules/CarName.ts index b6e0e574c..380e990f5 100644 --- a/src/js/modules/CarName.ts +++ b/src/js/modules/CarName.ts @@ -10,6 +10,7 @@ const CarNameComponent = ({ $app, carNames }: { $app: HTMLDivElement | null; car const render = (JSX: string): void => { const sectionElement: HTMLDivElement | null = $app; + if (sectionElement) { sectionElement.insertAdjacentHTML('beforeend', JSX); } @@ -19,6 +20,7 @@ const CarNameComponent = ({ $app, carNames }: { $app: HTMLDivElement | null; car const init = (carNames: string): void => { const carNameList: string[] = carNames.split(',').map((x) => x.trim()); + if (checkCarNames(carNameList)) { setCarNameDataset('click'); render(carNamesSection(carNameList.map((carName) => carNameDiv(carName)).join(''))); diff --git a/src/js/modules/Game.ts b/src/js/modules/Game.ts index 3a04a02b3..04566aece 100644 --- a/src/js/modules/Game.ts +++ b/src/js/modules/Game.ts @@ -4,6 +4,7 @@ import { startSection } from './@share/view.js'; const Game = ({ $app }: { $app: HTMLDivElement | null }): void => { const render = (JSX: string): void => { const sectionElement: HTMLDivElement | null = $app; + if (sectionElement) { sectionElement.insertAdjacentHTML('beforeend', JSX); } diff --git a/src/js/modules/Race.ts b/src/js/modules/Race.ts index f3429ef7e..2220f4e14 100644 --- a/src/js/modules/Race.ts +++ b/src/js/modules/Race.ts @@ -11,6 +11,7 @@ const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: nu let _cars: Car[]; const checkValidCount = (count: number): boolean => { + return count - Math.floor(count) === 0 && count > 0; }; @@ -23,6 +24,7 @@ const RaceComponent = ({ $app, count }: { $app: HTMLDivElement | null; count: nu const assignCarsName = (): Car[] => { const cars: Car[] = []; const inputCarNames = getInputCarsName(); + inputCarNames.forEach((name) => { cars.push(new Car(name)); }); diff --git a/src/js/modules/Winner.ts b/src/js/modules/Winner.ts index f94fbf33a..2c4d69594 100644 --- a/src/js/modules/Winner.ts +++ b/src/js/modules/Winner.ts @@ -8,15 +8,12 @@ const WinnerComponent = ({ $app, cars }: { $app: HTMLDivElement | null; cars: Ca const totalDistances: number[] = cars.map((car) => car.distance); const maxDistance: number = Math.max(...totalDistances); - return cars - .filter((car) => { - return car.distance === maxDistance; - }) - .map((winner) => winner.name); + return cars.filter((car) => car.distance === maxDistance).map((winner) => winner.name); }; const render = (JSX: string): void => { const sectionElement: HTMLDivElement | null = $app; + if (sectionElement) { sectionElement.insertAdjacentHTML('beforeend', JSX); } @@ -34,11 +31,13 @@ const WinnerComponent = ({ $app, cars }: { $app: HTMLDivElement | null; cars: Ca inputController(); initEnable(); setCarNameDataset(''); + return; }; const controller = (): void => { const retryButton: HTMLButtonElement = $$('button')[2] as HTMLButtonElement; + if (retryButton) { retryButton.onclick = retryButtonEvent; } From 9419e43238f573f11a97cafdef078328d01a1027 Mon Sep 17 00:00:00 2001 From: hochan Lee Date: Mon, 7 Jun 2021 09:27:59 +0900 Subject: [PATCH 35/35] =?UTF-8?q?docs:=20=EC=9C=84=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=EB=93=A4=EC=9D=B4=20=EC=A0=95=EC=83=81=EC=A0=81=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=8F=99=EC=9E=91=ED=95=98=EB=8A=94=EC=A7=80=20Cyp?= =?UTF-8?q?ress=EB=A5=BC=20=EC=9D=B4=EC=9A=A9=ED=95=B4=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=ED=95=9C=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index e1b0ec1d3..c065c0d2d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -27,7 +27,7 @@ - [x] μ• λ‹ˆλ©”μ΄μ…˜ κ΅¬ν˜„μ„ μœ„ν•΄ setInterval, setTimeout, requestAnimationFrame 을 ν™œμš©ν•œλ‹€. - [x] spinner λ§ˆμ§€λ§‰ λ ˆμ΄μŠ€κ°€ μ™„λ£Œ 됐을 λ•Œ μ—†μ• κΈ°. - [x] μ •μƒμ μœΌλ‘œ κ²Œμž„μ˜ 턴이 λ‹€ λ™μž‘λœ ν›„μ—λŠ” κ²°κ³Όλ₯Ό 보여주고, 2초 후에 μΆ•ν•˜μ˜ alert λ©”μ„Έμ§€λ₯Ό λ„μš΄λ‹€. -- [ ] μœ„ κΈ°λŠ₯듀이 μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜λŠ”μ§€ Cypressλ₯Ό μ΄μš©ν•΄ ν…ŒμŠ€νŠΈν•œλ‹€. +- [x] μœ„ κΈ°λŠ₯듀이 μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜λŠ”μ§€ Cypressλ₯Ό μ΄μš©ν•΄ ν…ŒμŠ€νŠΈν•œλ‹€. ### 버그 μˆ˜μ • - [x] car name input μž…λ ₯ν•œ λ’€μ—λ§Œ count μž…λ ₯ν•  수 있게 κ΅¬ν˜„ν•˜κΈ°.