├── .editorconfig
├── .gitignore
├── .prettierrc
├── 00-base
├── 00-boilerplate
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .prettierrc
│ ├── config
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── package.json
│ ├── src
│ │ ├── app.tsx
│ │ ├── index.html
│ │ └── index.tsx
│ └── tsconfig.json
├── 01-config
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .prettierrc
│ ├── config
│ │ ├── test
│ │ │ └── jest.json
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── package.json
│ ├── readme.md
│ ├── src
│ │ ├── app.tsx
│ │ ├── dummy.spec.ts
│ │ ├── index.html
│ │ └── index.tsx
│ └── tsconfig.json
├── 02-calculator
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .prettierrc
│ ├── config
│ │ ├── test
│ │ │ └── jest.json
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── package.json
│ ├── readme.md
│ ├── src
│ │ ├── app.tsx
│ │ ├── business.ts
│ │ ├── calculator.spec.ts
│ │ ├── calculator.ts
│ │ ├── index.html
│ │ └── index.tsx
│ └── tsconfig.json
├── 03-debug
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .prettierrc
│ ├── .vscode
│ │ └── launch.json
│ ├── config
│ │ ├── test
│ │ │ └── jest.json
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── package.json
│ ├── readme-resources
│ │ ├── 01-add-launch.json.png
│ │ └── 02-debug.gif
│ ├── readme.md
│ ├── src
│ │ ├── app.tsx
│ │ ├── business.ts
│ │ ├── calculator.spec.ts
│ │ ├── calculator.ts
│ │ ├── index.html
│ │ └── index.tsx
│ └── tsconfig.json
├── 04-tdd
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .prettierrc
│ ├── .vscode
│ │ └── launch.json
│ ├── config
│ │ ├── test
│ │ │ └── jest.json
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── package.json
│ ├── readme.md
│ ├── src
│ │ ├── api-model.ts
│ │ ├── api.ts
│ │ ├── app.tsx
│ │ ├── index.html
│ │ ├── index.tsx
│ │ ├── mapper.spec.ts
│ │ ├── mapper.ts
│ │ └── view-model.ts
│ └── tsconfig.json
└── 05-async
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .prettierrc
│ ├── .vscode
│ └── launch.json
│ ├── config
│ ├── test
│ │ └── jest.json
│ └── webpack
│ │ ├── base.js
│ │ ├── dev.js
│ │ ├── helpers.js
│ │ └── prod.js
│ ├── package.json
│ ├── readme.md
│ ├── src
│ ├── api-model.ts
│ ├── api.spec.ts
│ ├── api.ts
│ ├── app.tsx
│ ├── index.html
│ ├── index.tsx
│ ├── mapper.spec.ts
│ ├── mapper.ts
│ └── view-model.ts
│ └── tsconfig.json
├── 01-components
├── 00-boilerplate
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .prettierrc
│ ├── .vscode
│ │ └── launch.json
│ ├── config
│ │ ├── test
│ │ │ └── jest.json
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── package.json
│ ├── src
│ │ ├── app.tsx
│ │ ├── index.html
│ │ └── index.tsx
│ └── tsconfig.json
├── 01-hello
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .prettierrc
│ ├── .vscode
│ │ └── launch.json
│ ├── config
│ │ ├── test
│ │ │ ├── jest.json
│ │ │ └── setup-after.ts
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── package.json
│ ├── readme.md
│ ├── src
│ │ ├── __snapshots__
│ │ │ └── say-hello.spec.tsx.snap
│ │ ├── app.tsx
│ │ ├── index.html
│ │ ├── index.tsx
│ │ ├── say-hello.spec.tsx
│ │ └── say-hello.tsx
│ └── tsconfig.json
├── 02-name-edit
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .prettierrc
│ ├── .vscode
│ │ └── launch.json
│ ├── config
│ │ ├── test
│ │ │ ├── jest.json
│ │ │ └── setup-after.ts
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── package.json
│ ├── readme.md
│ ├── src
│ │ ├── __snapshots__
│ │ │ └── say-hello.spec.tsx.snap
│ │ ├── app.tsx
│ │ ├── index.html
│ │ ├── index.tsx
│ │ ├── name-edit.spec.tsx
│ │ ├── name-edit.tsx
│ │ ├── say-hello.spec.tsx
│ │ └── say-hello.tsx
│ └── tsconfig.json
├── 03-integration
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .prettierrc
│ ├── .vscode
│ │ └── launch.json
│ ├── config
│ │ ├── test
│ │ │ ├── jest.json
│ │ │ └── setup-after.ts
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── package.json
│ ├── readme.md
│ ├── src
│ │ ├── __snapshots__
│ │ │ └── say-hello.spec.tsx.snap
│ │ ├── app.tsx
│ │ ├── display.tsx
│ │ ├── edit.tsx
│ │ ├── index.html
│ │ ├── index.tsx
│ │ ├── name-edit.spec.tsx
│ │ ├── name-edit.tsx
│ │ ├── say-hello.spec.tsx
│ │ └── say-hello.tsx
│ └── tsconfig.json
├── 04-fetch
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .prettierrc
│ ├── .vscode
│ │ └── launch.json
│ ├── config
│ │ ├── test
│ │ │ ├── jest.json
│ │ │ └── setup-after.ts
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── package.json
│ ├── readme.md
│ ├── src
│ │ ├── __snapshots__
│ │ │ └── say-hello.spec.tsx.snap
│ │ ├── app.tsx
│ │ ├── display.tsx
│ │ ├── edit.tsx
│ │ ├── index.html
│ │ ├── index.tsx
│ │ ├── name-api.ts
│ │ ├── name-collection.spec.tsx
│ │ ├── name-collection.tsx
│ │ ├── name-edit.spec.tsx
│ │ ├── name-edit.tsx
│ │ ├── say-hello.spec.tsx
│ │ └── say-hello.tsx
│ └── tsconfig.json
├── 05-router
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .prettierrc
│ ├── .vscode
│ │ └── launch.json
│ ├── config
│ │ ├── test
│ │ │ ├── jest.json
│ │ │ └── setup-after.ts
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── package.json
│ ├── readme.md
│ ├── src
│ │ ├── __snapshots__
│ │ │ └── say-hello.spec.tsx.snap
│ │ ├── app.tsx
│ │ ├── display.tsx
│ │ ├── edit.tsx
│ │ ├── index.html
│ │ ├── index.tsx
│ │ ├── name-api.ts
│ │ ├── name-collection.spec.tsx
│ │ ├── name-collection.tsx
│ │ ├── name-edit.spec.tsx
│ │ ├── name-edit.tsx
│ │ ├── router.tsx
│ │ ├── say-hello.spec.tsx
│ │ ├── say-hello.tsx
│ │ └── user-edit.tsx
│ └── tsconfig.json
└── 06-material-ui
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .prettierrc
│ ├── .vscode
│ └── launch.json
│ ├── config
│ ├── test
│ │ ├── jest.json
│ │ └── setup-after.ts
│ └── webpack
│ │ ├── base.js
│ │ ├── dev.js
│ │ ├── helpers.js
│ │ └── prod.js
│ ├── package.json
│ ├── readme.md
│ ├── src
│ ├── __snapshots__
│ │ └── say-hello.spec.tsx.snap
│ ├── app.tsx
│ ├── card.spec.tsx
│ ├── card.tsx
│ ├── display.tsx
│ ├── edit.tsx
│ ├── index.html
│ ├── index.tsx
│ ├── name-api.ts
│ ├── name-collection.spec.tsx
│ ├── name-collection.tsx
│ ├── name-edit.spec.tsx
│ ├── name-edit.tsx
│ ├── router.tsx
│ ├── say-hello.spec.tsx
│ ├── say-hello.tsx
│ └── user-edit.tsx
│ └── tsconfig.json
├── 02-hooks
├── 00-boilerplate
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .prettierrc
│ ├── .vscode
│ │ └── launch.json
│ ├── config
│ │ ├── test
│ │ │ ├── jest.json
│ │ │ └── setup-after.ts
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── package.json
│ ├── src
│ │ ├── app.tsx
│ │ ├── index.html
│ │ └── index.tsx
│ └── tsconfig.json
├── 01-use-state
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .prettierrc
│ ├── .vscode
│ │ └── launch.json
│ ├── config
│ │ ├── test
│ │ │ ├── jest.json
│ │ │ └── setup-after.ts
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── package.json
│ ├── readme.md
│ ├── src
│ │ ├── app.tsx
│ │ ├── index.html
│ │ ├── index.tsx
│ │ ├── useName.spec.ts
│ │ └── useName.ts
│ └── tsconfig.json
├── 02-use-state-object
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .prettierrc
│ ├── .vscode
│ │ └── launch.json
│ ├── config
│ │ ├── test
│ │ │ ├── jest.json
│ │ │ └── setup-after.ts
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── package.json
│ ├── readme.md
│ ├── src
│ │ ├── app.tsx
│ │ ├── index.html
│ │ ├── index.tsx
│ │ ├── model.ts
│ │ ├── useName.spec.ts
│ │ ├── useName.ts
│ │ ├── useUser.spec.ts
│ │ └── useUser.ts
│ └── tsconfig.json
├── 03-component-did-mount
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .prettierrc
│ ├── .vscode
│ │ └── launch.json
│ ├── config
│ │ ├── test
│ │ │ ├── jest.json
│ │ │ └── setup-after.ts
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── package.json
│ ├── readme.md
│ ├── src
│ │ ├── app.tsx
│ │ ├── index.html
│ │ ├── index.tsx
│ │ ├── model.ts
│ │ ├── useName.spec.ts
│ │ ├── useName.ts
│ │ ├── useUser.spec.ts
│ │ └── useUser.ts
│ └── tsconfig.json
├── 04-component-did-update
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .prettierrc
│ ├── .vscode
│ │ └── launch.json
│ ├── config
│ │ ├── test
│ │ │ ├── jest.json
│ │ │ └── setup-after.ts
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── package.json
│ ├── readme.md
│ ├── src
│ │ ├── api.ts
│ │ ├── app.tsx
│ │ ├── index.html
│ │ ├── index.tsx
│ │ ├── model.ts
│ │ ├── useFilterUsers.spec.ts
│ │ ├── useFilterUsers.ts
│ │ ├── useName.spec.ts
│ │ ├── useName.ts
│ │ ├── useUser.spec.ts
│ │ └── useUser.ts
│ └── tsconfig.json
├── 05-component-unmount
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .prettierrc
│ ├── .vscode
│ │ └── launch.json
│ ├── config
│ │ ├── test
│ │ │ ├── jest.json
│ │ │ └── setup-after.ts
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── package.json
│ ├── readme.md
│ ├── src
│ │ ├── api.ts
│ │ ├── app.tsx
│ │ ├── index.html
│ │ ├── index.tsx
│ │ ├── model.ts
│ │ ├── useFilterUsers.spec.ts
│ │ ├── useFilterUsers.ts
│ │ ├── useName.spec.ts
│ │ ├── useName.ts
│ │ ├── usePolling.spec.ts
│ │ ├── usePolling.ts
│ │ ├── useUser.spec.ts
│ │ └── useUser.ts
│ └── tsconfig.json
└── 06-use-context
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .prettierrc
│ ├── .vscode
│ └── launch.json
│ ├── config
│ ├── test
│ │ ├── jest.json
│ │ └── setup-after.ts
│ └── webpack
│ │ ├── base.js
│ │ ├── dev.js
│ │ ├── helpers.js
│ │ └── prod.js
│ ├── package.json
│ ├── readme.md
│ ├── src
│ ├── api.ts
│ ├── app.tsx
│ ├── index.html
│ ├── index.tsx
│ ├── languageContext.tsx
│ ├── model.ts
│ ├── useFilterUsers.spec.ts
│ ├── useFilterUsers.ts
│ ├── useLanguage.spec.tsx
│ ├── useLanguage.ts
│ ├── useName.spec.ts
│ ├── useName.ts
│ ├── usePolling.spec.ts
│ ├── usePolling.ts
│ ├── useUser.spec.ts
│ └── useUser.ts
│ └── tsconfig.json
├── 03-redux
├── 00-boilerplate
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .env
│ ├── .prettierrc
│ ├── .vscode
│ │ └── launch.json
│ ├── config
│ │ ├── test
│ │ │ ├── jest.json
│ │ │ └── setup-after.ts
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── package.json
│ ├── src
│ │ ├── app.tsx
│ │ ├── appProvider.tsx
│ │ ├── appRouter.tsx
│ │ ├── common
│ │ │ ├── constants
│ │ │ │ └── routes
│ │ │ │ │ └── index.ts
│ │ │ └── types.ts
│ │ ├── history.ts
│ │ ├── index.html
│ │ ├── index.tsx
│ │ ├── pages
│ │ │ ├── index.ts
│ │ │ ├── members
│ │ │ │ ├── index.ts
│ │ │ │ └── list
│ │ │ │ │ ├── actions
│ │ │ │ │ ├── actionIds.ts
│ │ │ │ │ ├── fetchMembers.ts
│ │ │ │ │ └── index.ts
│ │ │ │ │ ├── components
│ │ │ │ │ ├── body.tsx
│ │ │ │ │ ├── header.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── row.tsx
│ │ │ │ │ └── table.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── mappers.spec.ts
│ │ │ │ │ ├── mappers.ts
│ │ │ │ │ ├── page.tsx
│ │ │ │ │ ├── pageContainer.tsx
│ │ │ │ │ ├── reducers
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── members.ts
│ │ │ │ │ ├── sagas
│ │ │ │ │ ├── fetchMembersSaga.ts
│ │ │ │ │ └── index.ts
│ │ │ │ │ └── viewModel.ts
│ │ │ ├── reducers.ts
│ │ │ └── sagas.ts
│ │ ├── rest-api
│ │ │ ├── api
│ │ │ │ └── member.ts
│ │ │ └── model
│ │ │ │ ├── index.ts
│ │ │ │ └── member.ts
│ │ ├── routes.tsx
│ │ └── store.ts
│ └── tsconfig.json
├── 01-actions
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .env
│ ├── .prettierrc
│ ├── .vscode
│ │ └── launch.json
│ ├── README.md
│ ├── config
│ │ ├── test
│ │ │ ├── jest.json
│ │ │ └── setup-after.ts
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── package.json
│ ├── src
│ │ ├── app.tsx
│ │ ├── appProvider.tsx
│ │ ├── appRouter.tsx
│ │ ├── common
│ │ │ ├── constants
│ │ │ │ └── routes
│ │ │ │ │ └── index.ts
│ │ │ └── types.ts
│ │ ├── history.ts
│ │ ├── index.html
│ │ ├── index.tsx
│ │ ├── pages
│ │ │ ├── index.ts
│ │ │ ├── members
│ │ │ │ ├── index.ts
│ │ │ │ └── list
│ │ │ │ │ ├── actions
│ │ │ │ │ ├── actionIds.ts
│ │ │ │ │ ├── fetchMembers.spec.ts
│ │ │ │ │ ├── fetchMembers.ts
│ │ │ │ │ └── index.ts
│ │ │ │ │ ├── components
│ │ │ │ │ ├── body.tsx
│ │ │ │ │ ├── header.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── row.tsx
│ │ │ │ │ └── table.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── mappers.spec.ts
│ │ │ │ │ ├── mappers.ts
│ │ │ │ │ ├── page.tsx
│ │ │ │ │ ├── pageContainer.tsx
│ │ │ │ │ ├── reducers
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── members.ts
│ │ │ │ │ ├── sagas
│ │ │ │ │ ├── fetchMembersSaga.ts
│ │ │ │ │ └── index.ts
│ │ │ │ │ └── viewModel.ts
│ │ │ ├── reducers.ts
│ │ │ └── sagas.ts
│ │ ├── rest-api
│ │ │ ├── api
│ │ │ │ └── member.ts
│ │ │ └── model
│ │ │ │ ├── index.ts
│ │ │ │ └── member.ts
│ │ ├── routes.tsx
│ │ └── store.ts
│ └── tsconfig.json
├── 02-reducers
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .env
│ ├── .prettierrc
│ ├── .vscode
│ │ └── launch.json
│ ├── README.md
│ ├── config
│ │ ├── test
│ │ │ ├── jest.json
│ │ │ └── setup-after.ts
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── package.json
│ ├── src
│ │ ├── app.tsx
│ │ ├── appProvider.tsx
│ │ ├── appRouter.tsx
│ │ ├── common
│ │ │ ├── constants
│ │ │ │ └── routes
│ │ │ │ │ └── index.ts
│ │ │ └── types.ts
│ │ ├── history.ts
│ │ ├── index.html
│ │ ├── index.tsx
│ │ ├── pages
│ │ │ ├── index.ts
│ │ │ ├── members
│ │ │ │ ├── index.ts
│ │ │ │ └── list
│ │ │ │ │ ├── actions
│ │ │ │ │ ├── actionIds.ts
│ │ │ │ │ ├── fetchMembers.spec.ts
│ │ │ │ │ ├── fetchMembers.ts
│ │ │ │ │ └── index.ts
│ │ │ │ │ ├── components
│ │ │ │ │ ├── body.tsx
│ │ │ │ │ ├── header.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── row.tsx
│ │ │ │ │ └── table.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── mappers.spec.ts
│ │ │ │ │ ├── mappers.ts
│ │ │ │ │ ├── page.tsx
│ │ │ │ │ ├── pageContainer.tsx
│ │ │ │ │ ├── reducers
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── members.spec.ts
│ │ │ │ │ └── members.ts
│ │ │ │ │ ├── sagas
│ │ │ │ │ ├── fetchMembersSaga.ts
│ │ │ │ │ └── index.ts
│ │ │ │ │ └── viewModel.ts
│ │ │ ├── reducers.ts
│ │ │ └── sagas.ts
│ │ ├── rest-api
│ │ │ ├── api
│ │ │ │ └── member.ts
│ │ │ └── model
│ │ │ │ ├── index.ts
│ │ │ │ └── member.ts
│ │ ├── routes.tsx
│ │ └── store.ts
│ └── tsconfig.json
├── 03-sagas
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .env
│ ├── .prettierrc
│ ├── .vscode
│ │ └── launch.json
│ ├── README.md
│ ├── config
│ │ ├── test
│ │ │ ├── jest.json
│ │ │ └── setup-after.ts
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── package.json
│ ├── src
│ │ ├── app.tsx
│ │ ├── appProvider.tsx
│ │ ├── appRouter.tsx
│ │ ├── common
│ │ │ ├── constants
│ │ │ │ └── routes
│ │ │ │ │ └── index.ts
│ │ │ ├── test
│ │ │ │ ├── getDispatchedActionsFromSaga.ts
│ │ │ │ └── index.ts
│ │ │ └── types.ts
│ │ ├── history.ts
│ │ ├── index.html
│ │ ├── index.tsx
│ │ ├── pages
│ │ │ ├── index.ts
│ │ │ ├── members
│ │ │ │ ├── index.ts
│ │ │ │ └── list
│ │ │ │ │ ├── actions
│ │ │ │ │ ├── actionIds.ts
│ │ │ │ │ ├── fetchMembers.spec.ts
│ │ │ │ │ ├── fetchMembers.ts
│ │ │ │ │ └── index.ts
│ │ │ │ │ ├── components
│ │ │ │ │ ├── body.tsx
│ │ │ │ │ ├── header.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── row.tsx
│ │ │ │ │ └── table.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── mappers.spec.ts
│ │ │ │ │ ├── mappers.ts
│ │ │ │ │ ├── page.tsx
│ │ │ │ │ ├── pageContainer.tsx
│ │ │ │ │ ├── reducers
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── members.spec.ts
│ │ │ │ │ └── members.ts
│ │ │ │ │ ├── sagas
│ │ │ │ │ ├── fetchMembersSaga.spec.ts
│ │ │ │ │ ├── fetchMembersSaga.ts
│ │ │ │ │ ├── index.spec.ts
│ │ │ │ │ └── index.ts
│ │ │ │ │ └── viewModel.ts
│ │ │ ├── reducers.ts
│ │ │ ├── sagas.spec.ts
│ │ │ └── sagas.ts
│ │ ├── rest-api
│ │ │ ├── api
│ │ │ │ └── member.ts
│ │ │ └── model
│ │ │ │ ├── index.ts
│ │ │ │ └── member.ts
│ │ ├── routes.tsx
│ │ └── store.ts
│ └── tsconfig.json
├── 04-selectors
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .env
│ ├── .prettierrc
│ ├── .vscode
│ │ └── launch.json
│ ├── README.md
│ ├── config
│ │ ├── test
│ │ │ ├── jest.json
│ │ │ └── setup-after.ts
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── common.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── package.json
│ ├── src
│ │ ├── app.tsx
│ │ ├── appProvider.tsx
│ │ ├── appRouter.tsx
│ │ ├── common
│ │ │ ├── constants
│ │ │ │ └── routes
│ │ │ │ │ └── index.ts
│ │ │ ├── test
│ │ │ │ ├── getDispatchedActionsFromSaga.ts
│ │ │ │ └── index.ts
│ │ │ └── types.ts
│ │ ├── history.ts
│ │ ├── index.html
│ │ ├── index.tsx
│ │ ├── pages
│ │ │ ├── index.ts
│ │ │ ├── members
│ │ │ │ ├── index.ts
│ │ │ │ └── list
│ │ │ │ │ ├── actions
│ │ │ │ │ ├── actionIds.ts
│ │ │ │ │ ├── fetchMembers.spec.ts
│ │ │ │ │ ├── fetchMembers.ts
│ │ │ │ │ └── index.ts
│ │ │ │ │ ├── components
│ │ │ │ │ ├── body.tsx
│ │ │ │ │ ├── header.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── row.tsx
│ │ │ │ │ └── table.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── mappers.spec.ts
│ │ │ │ │ ├── mappers.ts
│ │ │ │ │ ├── page.tsx
│ │ │ │ │ ├── pageContainer.tsx
│ │ │ │ │ ├── reducers
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── members.spec.ts
│ │ │ │ │ └── members.ts
│ │ │ │ │ ├── sagas
│ │ │ │ │ ├── fetchMembersSaga.spec.ts
│ │ │ │ │ ├── fetchMembersSaga.ts
│ │ │ │ │ ├── index.spec.ts
│ │ │ │ │ └── index.ts
│ │ │ │ │ ├── selectors.spec.ts
│ │ │ │ │ ├── selectors.ts
│ │ │ │ │ └── viewModel.ts
│ │ │ ├── reducers.ts
│ │ │ ├── sagas.spec.ts
│ │ │ └── sagas.ts
│ │ ├── rest-api
│ │ │ ├── api
│ │ │ │ └── member.ts
│ │ │ └── model
│ │ │ │ ├── index.ts
│ │ │ │ └── member.ts
│ │ ├── routes.tsx
│ │ └── store.ts
│ └── tsconfig.json
├── 05-containers
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .env
│ ├── .prettierrc
│ ├── .vscode
│ │ └── launch.json
│ ├── README.md
│ ├── config
│ │ ├── test
│ │ │ ├── jest.json
│ │ │ └── setup-after.ts
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── common.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── package.json
│ ├── src
│ │ ├── app.tsx
│ │ ├── appProvider.tsx
│ │ ├── appRouter.tsx
│ │ ├── common
│ │ │ ├── constants
│ │ │ │ └── routes
│ │ │ │ │ └── index.ts
│ │ │ ├── test
│ │ │ │ ├── getDispatchedActionsFromSaga.ts
│ │ │ │ └── index.ts
│ │ │ └── types.ts
│ │ ├── history.ts
│ │ ├── index.html
│ │ ├── index.tsx
│ │ ├── pages
│ │ │ ├── index.ts
│ │ │ ├── members
│ │ │ │ ├── index.ts
│ │ │ │ └── list
│ │ │ │ │ ├── actions
│ │ │ │ │ ├── actionIds.ts
│ │ │ │ │ ├── fetchMembers.spec.ts
│ │ │ │ │ ├── fetchMembers.ts
│ │ │ │ │ └── index.ts
│ │ │ │ │ ├── components
│ │ │ │ │ ├── body.tsx
│ │ │ │ │ ├── header.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── row.tsx
│ │ │ │ │ └── table.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── mappers.spec.ts
│ │ │ │ │ ├── mappers.ts
│ │ │ │ │ ├── page.tsx
│ │ │ │ │ ├── pageContainer.spec.tsx
│ │ │ │ │ ├── pageContainer.tsx
│ │ │ │ │ ├── reducers
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── members.spec.ts
│ │ │ │ │ └── members.ts
│ │ │ │ │ ├── sagas
│ │ │ │ │ ├── fetchMembersSaga.spec.ts
│ │ │ │ │ ├── fetchMembersSaga.ts
│ │ │ │ │ ├── index.spec.ts
│ │ │ │ │ └── index.ts
│ │ │ │ │ ├── selectors.spec.ts
│ │ │ │ │ ├── selectors.ts
│ │ │ │ │ └── viewModel.ts
│ │ │ ├── reducers.ts
│ │ │ ├── sagas.spec.ts
│ │ │ └── sagas.ts
│ │ ├── rest-api
│ │ │ ├── api
│ │ │ │ └── member.ts
│ │ │ └── model
│ │ │ │ ├── index.ts
│ │ │ │ └── member.ts
│ │ ├── routes.tsx
│ │ └── store.ts
│ └── tsconfig.json
└── 06-containers-hooks
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .env
│ ├── .prettierrc
│ ├── .vscode
│ └── launch.json
│ ├── README.md
│ ├── config
│ ├── test
│ │ ├── jest.json
│ │ └── setup-after.ts
│ └── webpack
│ │ ├── base.js
│ │ ├── common.js
│ │ ├── dev.js
│ │ ├── helpers.js
│ │ └── prod.js
│ ├── package.json
│ ├── src
│ ├── app.tsx
│ ├── appProvider.tsx
│ ├── appRouter.tsx
│ ├── common
│ │ ├── constants
│ │ │ └── routes
│ │ │ │ └── index.ts
│ │ ├── test
│ │ │ ├── getDispatchedActionsFromSaga.ts
│ │ │ └── index.ts
│ │ └── types.ts
│ ├── history.ts
│ ├── index.html
│ ├── index.tsx
│ ├── pages
│ │ ├── index.ts
│ │ ├── members
│ │ │ ├── index.ts
│ │ │ └── list
│ │ │ │ ├── actions
│ │ │ │ ├── actionIds.ts
│ │ │ │ ├── fetchMembers.spec.ts
│ │ │ │ ├── fetchMembers.ts
│ │ │ │ └── index.ts
│ │ │ │ ├── components
│ │ │ │ ├── body.tsx
│ │ │ │ ├── header.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── row.tsx
│ │ │ │ └── table.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── mappers.spec.ts
│ │ │ │ ├── mappers.ts
│ │ │ │ ├── page.tsx
│ │ │ │ ├── pageContainer.spec.tsx
│ │ │ │ ├── pageContainer.tsx
│ │ │ │ ├── reducers
│ │ │ │ ├── index.ts
│ │ │ │ ├── members.spec.ts
│ │ │ │ └── members.ts
│ │ │ │ ├── sagas
│ │ │ │ ├── fetchMembersSaga.spec.ts
│ │ │ │ ├── fetchMembersSaga.ts
│ │ │ │ ├── index.spec.ts
│ │ │ │ └── index.ts
│ │ │ │ ├── selectors.spec.ts
│ │ │ │ ├── selectors.ts
│ │ │ │ └── viewModel.ts
│ │ ├── reducers.ts
│ │ ├── sagas.spec.ts
│ │ └── sagas.ts
│ ├── rest-api
│ │ ├── api
│ │ │ └── member.ts
│ │ └── model
│ │ │ ├── index.ts
│ │ │ └── member.ts
│ ├── routes.tsx
│ └── store.ts
│ └── tsconfig.json
├── 04-ci
├── 01-coverage
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .env
│ ├── .prettierrc
│ ├── .vscode
│ │ └── launch.json
│ ├── README.md
│ ├── config
│ │ ├── test
│ │ │ ├── jest.coverage.json
│ │ │ ├── jest.json
│ │ │ └── setup-after.ts
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── common.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── package.json
│ ├── src
│ │ ├── app.tsx
│ │ ├── appProvider.tsx
│ │ ├── appRouter.tsx
│ │ ├── common
│ │ │ ├── constants
│ │ │ │ └── routes
│ │ │ │ │ └── index.ts
│ │ │ ├── test
│ │ │ │ ├── getDispatchedActionsFromSaga.ts
│ │ │ │ └── index.ts
│ │ │ └── types.ts
│ │ ├── history.ts
│ │ ├── index.html
│ │ ├── index.tsx
│ │ ├── pages
│ │ │ ├── index.ts
│ │ │ ├── members
│ │ │ │ ├── index.ts
│ │ │ │ └── list
│ │ │ │ │ ├── actions
│ │ │ │ │ ├── actionIds.ts
│ │ │ │ │ ├── fetchMembers.spec.ts
│ │ │ │ │ ├── fetchMembers.ts
│ │ │ │ │ └── index.ts
│ │ │ │ │ ├── components
│ │ │ │ │ ├── body.tsx
│ │ │ │ │ ├── header.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── row.tsx
│ │ │ │ │ └── table.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── mappers.spec.ts
│ │ │ │ │ ├── mappers.ts
│ │ │ │ │ ├── page.tsx
│ │ │ │ │ ├── pageContainer.spec.tsx
│ │ │ │ │ ├── pageContainer.tsx
│ │ │ │ │ ├── reducers
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── members.spec.ts
│ │ │ │ │ └── members.ts
│ │ │ │ │ ├── sagas
│ │ │ │ │ ├── fetchMembersSaga.spec.ts
│ │ │ │ │ ├── fetchMembersSaga.ts
│ │ │ │ │ ├── index.spec.ts
│ │ │ │ │ └── index.ts
│ │ │ │ │ ├── selectors.spec.ts
│ │ │ │ │ ├── selectors.ts
│ │ │ │ │ └── viewModel.ts
│ │ │ ├── reducers.ts
│ │ │ ├── sagas.spec.ts
│ │ │ └── sagas.ts
│ │ ├── rest-api
│ │ │ ├── api
│ │ │ │ └── member.ts
│ │ │ └── model
│ │ │ │ ├── index.ts
│ │ │ │ └── member.ts
│ │ ├── routes.tsx
│ │ └── store.ts
│ └── tsconfig.json
├── 02-travis-ci
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .env
│ ├── .prettierrc
│ ├── .travis.yml
│ ├── .vscode
│ │ └── launch.json
│ ├── README.md
│ ├── config
│ │ ├── test
│ │ │ ├── jest.coverage.json
│ │ │ ├── jest.json
│ │ │ └── setup-after.ts
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── common.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── package.json
│ ├── src
│ │ ├── app.tsx
│ │ ├── appProvider.tsx
│ │ ├── appRouter.tsx
│ │ ├── common
│ │ │ ├── constants
│ │ │ │ └── routes
│ │ │ │ │ └── index.ts
│ │ │ ├── test
│ │ │ │ ├── getDispatchedActionsFromSaga.ts
│ │ │ │ └── index.ts
│ │ │ └── types.ts
│ │ ├── history.ts
│ │ ├── index.html
│ │ ├── index.tsx
│ │ ├── pages
│ │ │ ├── index.ts
│ │ │ ├── members
│ │ │ │ ├── index.ts
│ │ │ │ └── list
│ │ │ │ │ ├── actions
│ │ │ │ │ ├── actionIds.ts
│ │ │ │ │ ├── fetchMembers.spec.ts
│ │ │ │ │ ├── fetchMembers.ts
│ │ │ │ │ └── index.ts
│ │ │ │ │ ├── components
│ │ │ │ │ ├── body.tsx
│ │ │ │ │ ├── header.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── row.tsx
│ │ │ │ │ └── table.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── mappers.spec.ts
│ │ │ │ │ ├── mappers.ts
│ │ │ │ │ ├── page.tsx
│ │ │ │ │ ├── pageContainer.spec.tsx
│ │ │ │ │ ├── pageContainer.tsx
│ │ │ │ │ ├── reducers
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── members.spec.ts
│ │ │ │ │ └── members.ts
│ │ │ │ │ ├── sagas
│ │ │ │ │ ├── fetchMembersSaga.spec.ts
│ │ │ │ │ ├── fetchMembersSaga.ts
│ │ │ │ │ ├── index.spec.ts
│ │ │ │ │ └── index.ts
│ │ │ │ │ ├── selectors.spec.ts
│ │ │ │ │ ├── selectors.ts
│ │ │ │ │ └── viewModel.ts
│ │ │ ├── reducers.ts
│ │ │ ├── sagas.spec.ts
│ │ │ └── sagas.ts
│ │ ├── rest-api
│ │ │ ├── api
│ │ │ │ └── member.ts
│ │ │ └── model
│ │ │ │ ├── index.ts
│ │ │ │ └── member.ts
│ │ ├── routes.tsx
│ │ └── store.ts
│ └── tsconfig.json
└── 03-circle-ci
│ ├── .babelrc
│ ├── .circleci
│ └── config.yml
│ ├── .editorconfig
│ ├── .env
│ ├── .prettierrc
│ ├── .vscode
│ └── launch.json
│ ├── README.md
│ ├── config
│ ├── test
│ │ ├── jest.coverage.json
│ │ ├── jest.json
│ │ └── setup-after.ts
│ └── webpack
│ │ ├── base.js
│ │ ├── common.js
│ │ ├── dev.js
│ │ ├── helpers.js
│ │ └── prod.js
│ ├── package.json
│ ├── src
│ ├── app.tsx
│ ├── appProvider.tsx
│ ├── appRouter.tsx
│ ├── common
│ │ ├── constants
│ │ │ └── routes
│ │ │ │ └── index.ts
│ │ ├── test
│ │ │ ├── getDispatchedActionsFromSaga.ts
│ │ │ └── index.ts
│ │ └── types.ts
│ ├── history.ts
│ ├── index.html
│ ├── index.tsx
│ ├── pages
│ │ ├── index.ts
│ │ ├── members
│ │ │ ├── index.ts
│ │ │ └── list
│ │ │ │ ├── actions
│ │ │ │ ├── actionIds.ts
│ │ │ │ ├── fetchMembers.spec.ts
│ │ │ │ ├── fetchMembers.ts
│ │ │ │ └── index.ts
│ │ │ │ ├── components
│ │ │ │ ├── body.tsx
│ │ │ │ ├── header.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── row.tsx
│ │ │ │ └── table.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── mappers.spec.ts
│ │ │ │ ├── mappers.ts
│ │ │ │ ├── page.tsx
│ │ │ │ ├── pageContainer.spec.tsx
│ │ │ │ ├── pageContainer.tsx
│ │ │ │ ├── reducers
│ │ │ │ ├── index.ts
│ │ │ │ ├── members.spec.ts
│ │ │ │ └── members.ts
│ │ │ │ ├── sagas
│ │ │ │ ├── fetchMembersSaga.spec.ts
│ │ │ │ ├── fetchMembersSaga.ts
│ │ │ │ ├── index.spec.ts
│ │ │ │ └── index.ts
│ │ │ │ ├── selectors.spec.ts
│ │ │ │ ├── selectors.ts
│ │ │ │ └── viewModel.ts
│ │ ├── reducers.ts
│ │ ├── sagas.spec.ts
│ │ └── sagas.ts
│ ├── rest-api
│ │ ├── api
│ │ │ └── member.ts
│ │ └── model
│ │ │ ├── index.ts
│ │ │ └── member.ts
│ ├── routes.tsx
│ └── store.ts
│ └── tsconfig.json
├── 05-e2e
├── 01-cypress
│ ├── 00-boilerplate
│ │ ├── .babelrc
│ │ ├── .editorconfig
│ │ ├── .gitignore
│ │ ├── .prettierrc
│ │ ├── config
│ │ │ └── webpack
│ │ │ │ ├── base.js
│ │ │ │ ├── dev.js
│ │ │ │ ├── helpers.js
│ │ │ │ └── prod.js
│ │ ├── dev.env
│ │ ├── package.json
│ │ ├── prod.env
│ │ ├── server
│ │ │ ├── config
│ │ │ │ └── routes.json
│ │ │ ├── mock-data
│ │ │ │ └── hotels-data.json
│ │ │ ├── package.json
│ │ │ └── public
│ │ │ │ └── thumbnails
│ │ │ │ ├── 11133_169_t.jpg
│ │ │ │ ├── 16673_260_t.jpg
│ │ │ │ ├── 16950_158_t.jpg
│ │ │ │ ├── 19023_103_t.jpg
│ │ │ │ ├── 25290_88_t.jpg
│ │ │ │ ├── 284304_50_t.jpg
│ │ │ │ ├── 28647_30_t.jpg
│ │ │ │ ├── 3445681_43_t.jpg
│ │ │ │ ├── 50947_264_t.jpg
│ │ │ │ └── 62800_122_t.jpg
│ │ └── src
│ │ │ ├── app.jsx
│ │ │ ├── common
│ │ │ ├── components
│ │ │ │ ├── dropdown.component.jsx
│ │ │ │ ├── form.component.jsx
│ │ │ │ ├── index.js
│ │ │ │ ├── rating.component.jsx
│ │ │ │ ├── text-field.component.jsx
│ │ │ │ └── textarea.component.jsx
│ │ │ ├── hooks
│ │ │ │ ├── index.js
│ │ │ │ └── use-flasher.jsx
│ │ │ └── mappers
│ │ │ │ ├── collection.mapper.js
│ │ │ │ └── index.js
│ │ │ ├── core
│ │ │ ├── context
│ │ │ │ ├── global-state.context.jsx
│ │ │ │ └── index.js
│ │ │ ├── router
│ │ │ │ ├── history.js
│ │ │ │ ├── index.js
│ │ │ │ ├── router.component.jsx
│ │ │ │ └── routes.js
│ │ │ └── store
│ │ │ │ ├── action-types.js
│ │ │ │ ├── actions
│ │ │ │ ├── hotel-collection.actions.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.actions.js
│ │ │ │ ├── index.js
│ │ │ │ ├── reducers
│ │ │ │ ├── hotel-collection.reducer.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.reducer.js
│ │ │ │ ├── root-reducer.jsx
│ │ │ │ └── store.js
│ │ │ ├── index.html
│ │ │ ├── index.jsx
│ │ │ ├── layouts
│ │ │ ├── app.layout.jsx
│ │ │ ├── centered.layout.jsx
│ │ │ ├── centered.layout.styles.js
│ │ │ └── index.js
│ │ │ ├── pods
│ │ │ ├── hotel-collection
│ │ │ │ ├── components
│ │ │ │ │ ├── hotel-card.component.jsx
│ │ │ │ │ ├── hotel-card.component.styles.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-collection.api.js
│ │ │ │ ├── hotel-collection.component.jsx
│ │ │ │ ├── hotel-collection.component.styles.js
│ │ │ │ ├── hotel-collection.container.jsx
│ │ │ │ ├── hotel-collection.mapper.js
│ │ │ │ ├── index.js
│ │ │ │ └── use-hotel-collection.hook.jsx
│ │ │ ├── hotel-edit
│ │ │ │ ├── api
│ │ │ │ │ ├── hotel-edit.api.js
│ │ │ │ │ ├── hotel-edit.mock.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-edit.component.jsx
│ │ │ │ ├── hotel-edit.component.styles.js
│ │ │ │ ├── hotel-edit.container.jsx
│ │ │ │ ├── hotel-edit.validation.js
│ │ │ │ ├── hotel-edit.vm.js
│ │ │ │ └── index.js
│ │ │ └── login
│ │ │ │ ├── api.js
│ │ │ │ ├── index.js
│ │ │ │ ├── login.component.jsx
│ │ │ │ ├── login.component.styles.js
│ │ │ │ ├── login.container.jsx
│ │ │ │ ├── login.validation.js
│ │ │ │ └── login.vm.js
│ │ │ └── scenes
│ │ │ ├── hotel-collection.scene.jsx
│ │ │ ├── hotel-edit.scene.jsx
│ │ │ ├── index.js
│ │ │ └── login.scene.jsx
│ ├── 01-config
│ │ ├── .babelrc
│ │ ├── .editorconfig
│ │ ├── .gitignore
│ │ ├── .prettierrc
│ │ ├── config
│ │ │ └── webpack
│ │ │ │ ├── base.js
│ │ │ │ ├── dev.js
│ │ │ │ ├── helpers.js
│ │ │ │ └── prod.js
│ │ ├── cypress.json
│ │ ├── cypress
│ │ │ ├── fixtures
│ │ │ │ └── example.json
│ │ │ ├── integration
│ │ │ │ └── login.spec.js
│ │ │ ├── plugins
│ │ │ │ └── index.js
│ │ │ └── support
│ │ │ │ ├── commands.js
│ │ │ │ └── index.js
│ │ ├── dev.env
│ │ ├── package.json
│ │ ├── prod.env
│ │ ├── readme.md
│ │ ├── server
│ │ │ ├── config
│ │ │ │ └── routes.json
│ │ │ ├── mock-data
│ │ │ │ └── hotels-data.json
│ │ │ ├── package.json
│ │ │ └── public
│ │ │ │ └── thumbnails
│ │ │ │ ├── 11133_169_t.jpg
│ │ │ │ ├── 16673_260_t.jpg
│ │ │ │ ├── 16950_158_t.jpg
│ │ │ │ ├── 19023_103_t.jpg
│ │ │ │ ├── 25290_88_t.jpg
│ │ │ │ ├── 284304_50_t.jpg
│ │ │ │ ├── 28647_30_t.jpg
│ │ │ │ ├── 3445681_43_t.jpg
│ │ │ │ ├── 50947_264_t.jpg
│ │ │ │ └── 62800_122_t.jpg
│ │ └── src
│ │ │ ├── app.jsx
│ │ │ ├── common
│ │ │ ├── components
│ │ │ │ ├── dropdown.component.jsx
│ │ │ │ ├── form.component.jsx
│ │ │ │ ├── index.js
│ │ │ │ ├── rating.component.jsx
│ │ │ │ ├── text-field.component.jsx
│ │ │ │ └── textarea.component.jsx
│ │ │ ├── hooks
│ │ │ │ ├── index.js
│ │ │ │ └── use-flasher.jsx
│ │ │ └── mappers
│ │ │ │ ├── collection.mapper.js
│ │ │ │ └── index.js
│ │ │ ├── core
│ │ │ ├── context
│ │ │ │ ├── global-state.context.jsx
│ │ │ │ └── index.js
│ │ │ ├── router
│ │ │ │ ├── history.js
│ │ │ │ ├── index.js
│ │ │ │ ├── router.component.jsx
│ │ │ │ └── routes.js
│ │ │ └── store
│ │ │ │ ├── action-types.js
│ │ │ │ ├── actions
│ │ │ │ ├── hotel-collection.actions.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.actions.js
│ │ │ │ ├── index.js
│ │ │ │ ├── reducers
│ │ │ │ ├── hotel-collection.reducer.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.reducer.js
│ │ │ │ ├── root-reducer.jsx
│ │ │ │ └── store.js
│ │ │ ├── index.html
│ │ │ ├── index.jsx
│ │ │ ├── layouts
│ │ │ ├── app.layout.jsx
│ │ │ ├── centered.layout.jsx
│ │ │ ├── centered.layout.styles.js
│ │ │ └── index.js
│ │ │ ├── pods
│ │ │ ├── hotel-collection
│ │ │ │ ├── components
│ │ │ │ │ ├── hotel-card.component.jsx
│ │ │ │ │ ├── hotel-card.component.styles.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-collection.api.js
│ │ │ │ ├── hotel-collection.component.jsx
│ │ │ │ ├── hotel-collection.component.styles.js
│ │ │ │ ├── hotel-collection.container.jsx
│ │ │ │ ├── hotel-collection.mapper.js
│ │ │ │ ├── index.js
│ │ │ │ └── use-hotel-collection.hook.jsx
│ │ │ ├── hotel-edit
│ │ │ │ ├── api
│ │ │ │ │ ├── hotel-edit.api.js
│ │ │ │ │ ├── hotel-edit.mock.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-edit.component.jsx
│ │ │ │ ├── hotel-edit.component.styles.js
│ │ │ │ ├── hotel-edit.container.jsx
│ │ │ │ ├── hotel-edit.validation.js
│ │ │ │ ├── hotel-edit.vm.js
│ │ │ │ └── index.js
│ │ │ └── login
│ │ │ │ ├── api.js
│ │ │ │ ├── index.js
│ │ │ │ ├── login.component.jsx
│ │ │ │ ├── login.component.styles.js
│ │ │ │ ├── login.container.jsx
│ │ │ │ ├── login.validation.js
│ │ │ │ └── login.vm.js
│ │ │ └── scenes
│ │ │ ├── hotel-collection.scene.jsx
│ │ │ ├── hotel-edit.scene.jsx
│ │ │ ├── index.js
│ │ │ └── login.scene.jsx
│ ├── 02-selectors
│ │ ├── .babelrc
│ │ ├── .editorconfig
│ │ ├── .gitignore
│ │ ├── .prettierrc
│ │ ├── config
│ │ │ └── webpack
│ │ │ │ ├── base.js
│ │ │ │ ├── dev.js
│ │ │ │ ├── helpers.js
│ │ │ │ └── prod.js
│ │ ├── cypress.json
│ │ ├── cypress
│ │ │ ├── fixtures
│ │ │ │ └── example.json
│ │ │ ├── integration
│ │ │ │ └── login.spec.js
│ │ │ ├── plugins
│ │ │ │ └── index.js
│ │ │ └── support
│ │ │ │ ├── commands.js
│ │ │ │ └── index.js
│ │ ├── dev.env
│ │ ├── package.json
│ │ ├── prod.env
│ │ ├── readme.md
│ │ ├── server
│ │ │ ├── config
│ │ │ │ └── routes.json
│ │ │ ├── mock-data
│ │ │ │ └── hotels-data.json
│ │ │ ├── package.json
│ │ │ └── public
│ │ │ │ └── thumbnails
│ │ │ │ ├── 11133_169_t.jpg
│ │ │ │ ├── 16673_260_t.jpg
│ │ │ │ ├── 16950_158_t.jpg
│ │ │ │ ├── 19023_103_t.jpg
│ │ │ │ ├── 25290_88_t.jpg
│ │ │ │ ├── 284304_50_t.jpg
│ │ │ │ ├── 28647_30_t.jpg
│ │ │ │ ├── 3445681_43_t.jpg
│ │ │ │ ├── 50947_264_t.jpg
│ │ │ │ └── 62800_122_t.jpg
│ │ └── src
│ │ │ ├── app.jsx
│ │ │ ├── common
│ │ │ ├── components
│ │ │ │ ├── dropdown.component.jsx
│ │ │ │ ├── form.component.jsx
│ │ │ │ ├── index.js
│ │ │ │ ├── rating.component.jsx
│ │ │ │ ├── text-field.component.jsx
│ │ │ │ └── textarea.component.jsx
│ │ │ ├── hooks
│ │ │ │ ├── index.js
│ │ │ │ └── use-flasher.jsx
│ │ │ └── mappers
│ │ │ │ ├── collection.mapper.js
│ │ │ │ └── index.js
│ │ │ ├── core
│ │ │ ├── context
│ │ │ │ ├── global-state.context.jsx
│ │ │ │ └── index.js
│ │ │ ├── router
│ │ │ │ ├── history.js
│ │ │ │ ├── index.js
│ │ │ │ ├── router.component.jsx
│ │ │ │ └── routes.js
│ │ │ └── store
│ │ │ │ ├── action-types.js
│ │ │ │ ├── actions
│ │ │ │ ├── hotel-collection.actions.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.actions.js
│ │ │ │ ├── index.js
│ │ │ │ ├── reducers
│ │ │ │ ├── hotel-collection.reducer.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.reducer.js
│ │ │ │ ├── root-reducer.jsx
│ │ │ │ └── store.js
│ │ │ ├── index.html
│ │ │ ├── index.jsx
│ │ │ ├── layouts
│ │ │ ├── app.layout.jsx
│ │ │ ├── centered.layout.jsx
│ │ │ ├── centered.layout.styles.js
│ │ │ └── index.js
│ │ │ ├── pods
│ │ │ ├── hotel-collection
│ │ │ │ ├── components
│ │ │ │ │ ├── hotel-card.component.jsx
│ │ │ │ │ ├── hotel-card.component.styles.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-collection.api.js
│ │ │ │ ├── hotel-collection.component.jsx
│ │ │ │ ├── hotel-collection.component.styles.js
│ │ │ │ ├── hotel-collection.container.jsx
│ │ │ │ ├── hotel-collection.mapper.js
│ │ │ │ ├── index.js
│ │ │ │ └── use-hotel-collection.hook.jsx
│ │ │ ├── hotel-edit
│ │ │ │ ├── api
│ │ │ │ │ ├── hotel-edit.api.js
│ │ │ │ │ ├── hotel-edit.mock.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-edit.component.jsx
│ │ │ │ ├── hotel-edit.component.styles.js
│ │ │ │ ├── hotel-edit.container.jsx
│ │ │ │ ├── hotel-edit.validation.js
│ │ │ │ ├── hotel-edit.vm.js
│ │ │ │ └── index.js
│ │ │ └── login
│ │ │ │ ├── api.js
│ │ │ │ ├── index.js
│ │ │ │ ├── login.component.jsx
│ │ │ │ ├── login.component.styles.js
│ │ │ │ ├── login.container.jsx
│ │ │ │ ├── login.validation.js
│ │ │ │ └── login.vm.js
│ │ │ └── scenes
│ │ │ ├── hotel-collection.scene.jsx
│ │ │ ├── hotel-edit.scene.jsx
│ │ │ ├── index.js
│ │ │ └── login.scene.jsx
│ ├── 03-stub-requests
│ │ ├── .babelrc
│ │ ├── .editorconfig
│ │ ├── .gitignore
│ │ ├── .prettierrc
│ │ ├── config
│ │ │ └── webpack
│ │ │ │ ├── base.js
│ │ │ │ ├── dev.js
│ │ │ │ ├── helpers.js
│ │ │ │ └── prod.js
│ │ ├── cypress.json
│ │ ├── cypress
│ │ │ ├── fixtures
│ │ │ │ └── hotels.json
│ │ │ ├── integration
│ │ │ │ ├── hotel-collection.spec.js
│ │ │ │ └── login.spec.js
│ │ │ ├── plugins
│ │ │ │ └── index.js
│ │ │ └── support
│ │ │ │ ├── commands.js
│ │ │ │ └── index.js
│ │ ├── dev.env
│ │ ├── package.json
│ │ ├── prod.env
│ │ ├── readme.md
│ │ ├── server
│ │ │ ├── config
│ │ │ │ └── routes.json
│ │ │ ├── mock-data
│ │ │ │ └── hotels-data.json
│ │ │ ├── package.json
│ │ │ └── public
│ │ │ │ └── thumbnails
│ │ │ │ ├── 11133_169_t.jpg
│ │ │ │ ├── 16673_260_t.jpg
│ │ │ │ ├── 16950_158_t.jpg
│ │ │ │ ├── 19023_103_t.jpg
│ │ │ │ ├── 25290_88_t.jpg
│ │ │ │ ├── 284304_50_t.jpg
│ │ │ │ ├── 28647_30_t.jpg
│ │ │ │ ├── 3445681_43_t.jpg
│ │ │ │ ├── 50947_264_t.jpg
│ │ │ │ └── 62800_122_t.jpg
│ │ └── src
│ │ │ ├── app.jsx
│ │ │ ├── common
│ │ │ ├── components
│ │ │ │ ├── dropdown.component.jsx
│ │ │ │ ├── form.component.jsx
│ │ │ │ ├── index.js
│ │ │ │ ├── rating.component.jsx
│ │ │ │ ├── text-field.component.jsx
│ │ │ │ └── textarea.component.jsx
│ │ │ ├── hooks
│ │ │ │ ├── index.js
│ │ │ │ └── use-flasher.jsx
│ │ │ └── mappers
│ │ │ │ ├── collection.mapper.js
│ │ │ │ └── index.js
│ │ │ ├── core
│ │ │ ├── context
│ │ │ │ ├── global-state.context.jsx
│ │ │ │ └── index.js
│ │ │ ├── router
│ │ │ │ ├── history.js
│ │ │ │ ├── index.js
│ │ │ │ ├── router.component.jsx
│ │ │ │ └── routes.js
│ │ │ └── store
│ │ │ │ ├── action-types.js
│ │ │ │ ├── actions
│ │ │ │ ├── hotel-collection.actions.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.actions.js
│ │ │ │ ├── index.js
│ │ │ │ ├── reducers
│ │ │ │ ├── hotel-collection.reducer.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.reducer.js
│ │ │ │ ├── root-reducer.jsx
│ │ │ │ └── store.js
│ │ │ ├── index.html
│ │ │ ├── index.jsx
│ │ │ ├── layouts
│ │ │ ├── app.layout.jsx
│ │ │ ├── centered.layout.jsx
│ │ │ ├── centered.layout.styles.js
│ │ │ └── index.js
│ │ │ ├── pods
│ │ │ ├── hotel-collection
│ │ │ │ ├── components
│ │ │ │ │ ├── hotel-card.component.jsx
│ │ │ │ │ ├── hotel-card.component.styles.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-collection.api.js
│ │ │ │ ├── hotel-collection.component.jsx
│ │ │ │ ├── hotel-collection.component.styles.js
│ │ │ │ ├── hotel-collection.container.jsx
│ │ │ │ ├── hotel-collection.mapper.js
│ │ │ │ ├── index.js
│ │ │ │ └── use-hotel-collection.hook.jsx
│ │ │ ├── hotel-edit
│ │ │ │ ├── api
│ │ │ │ │ ├── hotel-edit.api.js
│ │ │ │ │ ├── hotel-edit.mock.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-edit.component.jsx
│ │ │ │ ├── hotel-edit.component.styles.js
│ │ │ │ ├── hotel-edit.container.jsx
│ │ │ │ ├── hotel-edit.validation.js
│ │ │ │ ├── hotel-edit.vm.js
│ │ │ │ └── index.js
│ │ │ └── login
│ │ │ │ ├── api.js
│ │ │ │ ├── index.js
│ │ │ │ ├── login.component.jsx
│ │ │ │ ├── login.component.styles.js
│ │ │ │ ├── login.container.jsx
│ │ │ │ ├── login.validation.js
│ │ │ │ └── login.vm.js
│ │ │ └── scenes
│ │ │ ├── hotel-collection.scene.jsx
│ │ │ ├── hotel-edit.scene.jsx
│ │ │ ├── index.js
│ │ │ └── login.scene.jsx
│ ├── 04-wait-requests
│ │ ├── .babelrc
│ │ ├── .editorconfig
│ │ ├── .gitignore
│ │ ├── .prettierrc
│ │ ├── config
│ │ │ └── webpack
│ │ │ │ ├── base.js
│ │ │ │ ├── dev.js
│ │ │ │ ├── helpers.js
│ │ │ │ └── prod.js
│ │ ├── cypress.json
│ │ ├── cypress
│ │ │ ├── fixtures
│ │ │ │ └── hotels.json
│ │ │ ├── integration
│ │ │ │ ├── hotel-collection.spec.js
│ │ │ │ └── login.spec.js
│ │ │ ├── plugins
│ │ │ │ └── index.js
│ │ │ └── support
│ │ │ │ ├── commands.js
│ │ │ │ └── index.js
│ │ ├── dev.env
│ │ ├── package.json
│ │ ├── prod.env
│ │ ├── readme.md
│ │ ├── server
│ │ │ ├── config
│ │ │ │ └── routes.json
│ │ │ ├── mock-data
│ │ │ │ └── hotels-data.json
│ │ │ ├── package.json
│ │ │ └── public
│ │ │ │ └── thumbnails
│ │ │ │ ├── 11133_169_t.jpg
│ │ │ │ ├── 16673_260_t.jpg
│ │ │ │ ├── 16950_158_t.jpg
│ │ │ │ ├── 19023_103_t.jpg
│ │ │ │ ├── 25290_88_t.jpg
│ │ │ │ ├── 284304_50_t.jpg
│ │ │ │ ├── 28647_30_t.jpg
│ │ │ │ ├── 3445681_43_t.jpg
│ │ │ │ ├── 50947_264_t.jpg
│ │ │ │ └── 62800_122_t.jpg
│ │ └── src
│ │ │ ├── app.jsx
│ │ │ ├── common
│ │ │ ├── components
│ │ │ │ ├── dropdown.component.jsx
│ │ │ │ ├── form.component.jsx
│ │ │ │ ├── index.js
│ │ │ │ ├── rating.component.jsx
│ │ │ │ ├── text-field.component.jsx
│ │ │ │ └── textarea.component.jsx
│ │ │ ├── hooks
│ │ │ │ ├── index.js
│ │ │ │ └── use-flasher.jsx
│ │ │ └── mappers
│ │ │ │ ├── collection.mapper.js
│ │ │ │ └── index.js
│ │ │ ├── core
│ │ │ ├── context
│ │ │ │ ├── global-state.context.jsx
│ │ │ │ └── index.js
│ │ │ ├── router
│ │ │ │ ├── history.js
│ │ │ │ ├── index.js
│ │ │ │ ├── router.component.jsx
│ │ │ │ └── routes.js
│ │ │ └── store
│ │ │ │ ├── action-types.js
│ │ │ │ ├── actions
│ │ │ │ ├── hotel-collection.actions.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.actions.js
│ │ │ │ ├── index.js
│ │ │ │ ├── reducers
│ │ │ │ ├── hotel-collection.reducer.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.reducer.js
│ │ │ │ ├── root-reducer.jsx
│ │ │ │ └── store.js
│ │ │ ├── index.html
│ │ │ ├── index.jsx
│ │ │ ├── layouts
│ │ │ ├── app.layout.jsx
│ │ │ ├── centered.layout.jsx
│ │ │ ├── centered.layout.styles.js
│ │ │ └── index.js
│ │ │ ├── pods
│ │ │ ├── hotel-collection
│ │ │ │ ├── components
│ │ │ │ │ ├── hotel-card.component.jsx
│ │ │ │ │ ├── hotel-card.component.styles.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-collection.api.js
│ │ │ │ ├── hotel-collection.component.jsx
│ │ │ │ ├── hotel-collection.component.styles.js
│ │ │ │ ├── hotel-collection.container.jsx
│ │ │ │ ├── hotel-collection.mapper.js
│ │ │ │ ├── index.js
│ │ │ │ └── use-hotel-collection.hook.jsx
│ │ │ ├── hotel-edit
│ │ │ │ ├── api
│ │ │ │ │ ├── hotel-edit.api.js
│ │ │ │ │ ├── hotel-edit.mock.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-edit.component.jsx
│ │ │ │ ├── hotel-edit.component.styles.js
│ │ │ │ ├── hotel-edit.container.jsx
│ │ │ │ ├── hotel-edit.validation.js
│ │ │ │ ├── hotel-edit.vm.js
│ │ │ │ └── index.js
│ │ │ └── login
│ │ │ │ ├── api.js
│ │ │ │ ├── index.js
│ │ │ │ ├── login.component.jsx
│ │ │ │ ├── login.component.styles.js
│ │ │ │ ├── login.container.jsx
│ │ │ │ ├── login.validation.js
│ │ │ │ └── login.vm.js
│ │ │ └── scenes
│ │ │ ├── hotel-collection.scene.jsx
│ │ │ ├── hotel-edit.scene.jsx
│ │ │ ├── index.js
│ │ │ └── login.scene.jsx
│ ├── 05-custom-commands
│ │ ├── .babelrc
│ │ ├── .editorconfig
│ │ ├── .gitignore
│ │ ├── .prettierrc
│ │ ├── config
│ │ │ └── webpack
│ │ │ │ ├── base.js
│ │ │ │ ├── dev.js
│ │ │ │ ├── helpers.js
│ │ │ │ └── prod.js
│ │ ├── cypress.json
│ │ ├── cypress
│ │ │ ├── fixtures
│ │ │ │ └── hotels.json
│ │ │ ├── integration
│ │ │ │ ├── hotel-collection.spec.js
│ │ │ │ └── login.spec.js
│ │ │ ├── plugins
│ │ │ │ └── index.js
│ │ │ └── support
│ │ │ │ ├── commands.js
│ │ │ │ └── index.js
│ │ ├── dev.env
│ │ ├── package.json
│ │ ├── prod.env
│ │ ├── readme.md
│ │ ├── server
│ │ │ ├── config
│ │ │ │ └── routes.json
│ │ │ ├── mock-data
│ │ │ │ └── hotels-data.json
│ │ │ ├── package.json
│ │ │ └── public
│ │ │ │ └── thumbnails
│ │ │ │ ├── 11133_169_t.jpg
│ │ │ │ ├── 16673_260_t.jpg
│ │ │ │ ├── 16950_158_t.jpg
│ │ │ │ ├── 19023_103_t.jpg
│ │ │ │ ├── 25290_88_t.jpg
│ │ │ │ ├── 284304_50_t.jpg
│ │ │ │ ├── 28647_30_t.jpg
│ │ │ │ ├── 3445681_43_t.jpg
│ │ │ │ ├── 50947_264_t.jpg
│ │ │ │ └── 62800_122_t.jpg
│ │ └── src
│ │ │ ├── app.jsx
│ │ │ ├── common
│ │ │ ├── components
│ │ │ │ ├── dropdown.component.jsx
│ │ │ │ ├── form.component.jsx
│ │ │ │ ├── index.js
│ │ │ │ ├── rating.component.jsx
│ │ │ │ ├── text-field.component.jsx
│ │ │ │ └── textarea.component.jsx
│ │ │ ├── hooks
│ │ │ │ ├── index.js
│ │ │ │ └── use-flasher.jsx
│ │ │ └── mappers
│ │ │ │ ├── collection.mapper.js
│ │ │ │ └── index.js
│ │ │ ├── core
│ │ │ ├── context
│ │ │ │ ├── global-state.context.jsx
│ │ │ │ └── index.js
│ │ │ ├── router
│ │ │ │ ├── history.js
│ │ │ │ ├── index.js
│ │ │ │ ├── router.component.jsx
│ │ │ │ └── routes.js
│ │ │ └── store
│ │ │ │ ├── action-types.js
│ │ │ │ ├── actions
│ │ │ │ ├── hotel-collection.actions.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.actions.js
│ │ │ │ ├── index.js
│ │ │ │ ├── reducers
│ │ │ │ ├── hotel-collection.reducer.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.reducer.js
│ │ │ │ ├── root-reducer.jsx
│ │ │ │ └── store.js
│ │ │ ├── index.html
│ │ │ ├── index.jsx
│ │ │ ├── layouts
│ │ │ ├── app.layout.jsx
│ │ │ ├── centered.layout.jsx
│ │ │ ├── centered.layout.styles.js
│ │ │ └── index.js
│ │ │ ├── pods
│ │ │ ├── hotel-collection
│ │ │ │ ├── components
│ │ │ │ │ ├── hotel-card.component.jsx
│ │ │ │ │ ├── hotel-card.component.styles.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-collection.api.js
│ │ │ │ ├── hotel-collection.component.jsx
│ │ │ │ ├── hotel-collection.component.styles.js
│ │ │ │ ├── hotel-collection.container.jsx
│ │ │ │ ├── hotel-collection.mapper.js
│ │ │ │ ├── index.js
│ │ │ │ └── use-hotel-collection.hook.jsx
│ │ │ ├── hotel-edit
│ │ │ │ ├── api
│ │ │ │ │ ├── hotel-edit.api.js
│ │ │ │ │ ├── hotel-edit.mock.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-edit.component.jsx
│ │ │ │ ├── hotel-edit.component.styles.js
│ │ │ │ ├── hotel-edit.container.jsx
│ │ │ │ ├── hotel-edit.validation.js
│ │ │ │ ├── hotel-edit.vm.js
│ │ │ │ └── index.js
│ │ │ └── login
│ │ │ │ ├── api.js
│ │ │ │ ├── index.js
│ │ │ │ ├── login.component.jsx
│ │ │ │ ├── login.component.styles.js
│ │ │ │ ├── login.container.jsx
│ │ │ │ ├── login.validation.js
│ │ │ │ └── login.vm.js
│ │ │ └── scenes
│ │ │ ├── hotel-collection.scene.jsx
│ │ │ ├── hotel-edit.scene.jsx
│ │ │ ├── index.js
│ │ │ └── login.scene.jsx
│ ├── 06-edit-hotel
│ │ ├── .babelrc
│ │ ├── .editorconfig
│ │ ├── .gitignore
│ │ ├── .prettierrc
│ │ ├── config
│ │ │ └── webpack
│ │ │ │ ├── base.js
│ │ │ │ ├── dev.js
│ │ │ │ ├── helpers.js
│ │ │ │ └── prod.js
│ │ ├── cypress.json
│ │ ├── cypress
│ │ │ ├── fixtures
│ │ │ │ └── hotels.json
│ │ │ ├── integration
│ │ │ │ ├── hotel-collection.spec.js
│ │ │ │ ├── hotel-edit.spec.js
│ │ │ │ └── login.spec.js
│ │ │ ├── plugins
│ │ │ │ └── index.js
│ │ │ └── support
│ │ │ │ ├── commands.js
│ │ │ │ └── index.js
│ │ ├── dev.env
│ │ ├── package.json
│ │ ├── prod.env
│ │ ├── readme.md
│ │ ├── server
│ │ │ ├── config
│ │ │ │ └── routes.json
│ │ │ ├── mock-data
│ │ │ │ └── hotels-data.json
│ │ │ ├── package.json
│ │ │ └── public
│ │ │ │ └── thumbnails
│ │ │ │ ├── 11133_169_t.jpg
│ │ │ │ ├── 16673_260_t.jpg
│ │ │ │ ├── 16950_158_t.jpg
│ │ │ │ ├── 19023_103_t.jpg
│ │ │ │ ├── 25290_88_t.jpg
│ │ │ │ ├── 284304_50_t.jpg
│ │ │ │ ├── 28647_30_t.jpg
│ │ │ │ ├── 3445681_43_t.jpg
│ │ │ │ ├── 50947_264_t.jpg
│ │ │ │ └── 62800_122_t.jpg
│ │ └── src
│ │ │ ├── app.jsx
│ │ │ ├── common
│ │ │ ├── components
│ │ │ │ ├── dropdown.component.jsx
│ │ │ │ ├── form.component.jsx
│ │ │ │ ├── index.js
│ │ │ │ ├── rating.component.jsx
│ │ │ │ ├── text-field.component.jsx
│ │ │ │ └── textarea.component.jsx
│ │ │ ├── hooks
│ │ │ │ ├── index.js
│ │ │ │ └── use-flasher.jsx
│ │ │ └── mappers
│ │ │ │ ├── collection.mapper.js
│ │ │ │ └── index.js
│ │ │ ├── core
│ │ │ ├── context
│ │ │ │ ├── global-state.context.jsx
│ │ │ │ └── index.js
│ │ │ ├── router
│ │ │ │ ├── history.js
│ │ │ │ ├── index.js
│ │ │ │ ├── router.component.jsx
│ │ │ │ └── routes.js
│ │ │ └── store
│ │ │ │ ├── action-types.js
│ │ │ │ ├── actions
│ │ │ │ ├── hotel-collection.actions.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.actions.js
│ │ │ │ ├── index.js
│ │ │ │ ├── reducers
│ │ │ │ ├── hotel-collection.reducer.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.reducer.js
│ │ │ │ ├── root-reducer.jsx
│ │ │ │ └── store.js
│ │ │ ├── index.html
│ │ │ ├── index.jsx
│ │ │ ├── layouts
│ │ │ ├── app.layout.jsx
│ │ │ ├── centered.layout.jsx
│ │ │ ├── centered.layout.styles.js
│ │ │ └── index.js
│ │ │ ├── pods
│ │ │ ├── hotel-collection
│ │ │ │ ├── components
│ │ │ │ │ ├── hotel-card.component.jsx
│ │ │ │ │ ├── hotel-card.component.styles.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-collection.api.js
│ │ │ │ ├── hotel-collection.component.jsx
│ │ │ │ ├── hotel-collection.component.styles.js
│ │ │ │ ├── hotel-collection.container.jsx
│ │ │ │ ├── hotel-collection.mapper.js
│ │ │ │ ├── index.js
│ │ │ │ └── use-hotel-collection.hook.jsx
│ │ │ ├── hotel-edit
│ │ │ │ ├── api
│ │ │ │ │ ├── hotel-edit.api.js
│ │ │ │ │ ├── hotel-edit.mock.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-edit.component.jsx
│ │ │ │ ├── hotel-edit.component.styles.js
│ │ │ │ ├── hotel-edit.container.jsx
│ │ │ │ ├── hotel-edit.validation.js
│ │ │ │ ├── hotel-edit.vm.js
│ │ │ │ └── index.js
│ │ │ └── login
│ │ │ │ ├── api.js
│ │ │ │ ├── index.js
│ │ │ │ ├── login.component.jsx
│ │ │ │ ├── login.component.styles.js
│ │ │ │ ├── login.container.jsx
│ │ │ │ ├── login.validation.js
│ │ │ │ └── login.vm.js
│ │ │ └── scenes
│ │ │ ├── hotel-collection.scene.jsx
│ │ │ ├── hotel-edit.scene.jsx
│ │ │ ├── index.js
│ │ │ └── login.scene.jsx
│ ├── 07-ci
│ │ ├── .babelrc
│ │ ├── .circleci
│ │ │ └── config.yml
│ │ ├── .editorconfig
│ │ ├── .gitignore
│ │ ├── .prettierrc
│ │ ├── config
│ │ │ └── webpack
│ │ │ │ ├── base.js
│ │ │ │ ├── dev.js
│ │ │ │ ├── helpers.js
│ │ │ │ └── prod.js
│ │ ├── cypress.json
│ │ ├── cypress
│ │ │ ├── fixtures
│ │ │ │ └── hotels.json
│ │ │ ├── integration
│ │ │ │ ├── hotel-collection.spec.js
│ │ │ │ ├── hotel-edit.spec.js
│ │ │ │ └── login.spec.js
│ │ │ ├── plugins
│ │ │ │ └── index.js
│ │ │ └── support
│ │ │ │ ├── commands.js
│ │ │ │ └── index.js
│ │ ├── dev.env
│ │ ├── package.json
│ │ ├── prod.env
│ │ ├── readme.md
│ │ ├── server
│ │ │ ├── config
│ │ │ │ └── routes.json
│ │ │ ├── mock-data
│ │ │ │ └── hotels-data.json
│ │ │ ├── package.json
│ │ │ └── public
│ │ │ │ └── thumbnails
│ │ │ │ ├── 11133_169_t.jpg
│ │ │ │ ├── 16673_260_t.jpg
│ │ │ │ ├── 16950_158_t.jpg
│ │ │ │ ├── 19023_103_t.jpg
│ │ │ │ ├── 25290_88_t.jpg
│ │ │ │ ├── 284304_50_t.jpg
│ │ │ │ ├── 28647_30_t.jpg
│ │ │ │ ├── 3445681_43_t.jpg
│ │ │ │ ├── 50947_264_t.jpg
│ │ │ │ └── 62800_122_t.jpg
│ │ └── src
│ │ │ ├── app.jsx
│ │ │ ├── common
│ │ │ ├── components
│ │ │ │ ├── dropdown.component.jsx
│ │ │ │ ├── form.component.jsx
│ │ │ │ ├── index.js
│ │ │ │ ├── rating.component.jsx
│ │ │ │ ├── text-field.component.jsx
│ │ │ │ └── textarea.component.jsx
│ │ │ ├── hooks
│ │ │ │ ├── index.js
│ │ │ │ └── use-flasher.jsx
│ │ │ └── mappers
│ │ │ │ ├── collection.mapper.js
│ │ │ │ └── index.js
│ │ │ ├── core
│ │ │ ├── context
│ │ │ │ ├── global-state.context.jsx
│ │ │ │ └── index.js
│ │ │ ├── router
│ │ │ │ ├── history.js
│ │ │ │ ├── index.js
│ │ │ │ ├── router.component.jsx
│ │ │ │ └── routes.js
│ │ │ └── store
│ │ │ │ ├── action-types.js
│ │ │ │ ├── actions
│ │ │ │ ├── hotel-collection.actions.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.actions.js
│ │ │ │ ├── index.js
│ │ │ │ ├── reducers
│ │ │ │ ├── hotel-collection.reducer.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.reducer.js
│ │ │ │ ├── root-reducer.jsx
│ │ │ │ └── store.js
│ │ │ ├── index.html
│ │ │ ├── index.jsx
│ │ │ ├── layouts
│ │ │ ├── app.layout.jsx
│ │ │ ├── centered.layout.jsx
│ │ │ ├── centered.layout.styles.js
│ │ │ └── index.js
│ │ │ ├── pods
│ │ │ ├── hotel-collection
│ │ │ │ ├── components
│ │ │ │ │ ├── hotel-card.component.jsx
│ │ │ │ │ ├── hotel-card.component.styles.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-collection.api.js
│ │ │ │ ├── hotel-collection.component.jsx
│ │ │ │ ├── hotel-collection.component.styles.js
│ │ │ │ ├── hotel-collection.container.jsx
│ │ │ │ ├── hotel-collection.mapper.js
│ │ │ │ ├── index.js
│ │ │ │ └── use-hotel-collection.hook.jsx
│ │ │ ├── hotel-edit
│ │ │ │ ├── api
│ │ │ │ │ ├── hotel-edit.api.js
│ │ │ │ │ ├── hotel-edit.mock.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-edit.component.jsx
│ │ │ │ ├── hotel-edit.component.styles.js
│ │ │ │ ├── hotel-edit.container.jsx
│ │ │ │ ├── hotel-edit.validation.js
│ │ │ │ ├── hotel-edit.vm.js
│ │ │ │ └── index.js
│ │ │ └── login
│ │ │ │ ├── api.js
│ │ │ │ ├── index.js
│ │ │ │ ├── login.component.jsx
│ │ │ │ ├── login.component.styles.js
│ │ │ │ ├── login.container.jsx
│ │ │ │ ├── login.validation.js
│ │ │ │ └── login.vm.js
│ │ │ └── scenes
│ │ │ ├── hotel-collection.scene.jsx
│ │ │ ├── hotel-edit.scene.jsx
│ │ │ ├── index.js
│ │ │ └── login.scene.jsx
│ └── readme.md
└── 02-testcafe
│ ├── 00-boilerplate
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .gitignore
│ ├── .prettierrc
│ ├── config
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── dev.env
│ ├── package.json
│ ├── prod.env
│ ├── server
│ │ ├── config
│ │ │ └── routes.json
│ │ ├── mock-data
│ │ │ └── hotels-data.json
│ │ ├── package.json
│ │ └── public
│ │ │ └── thumbnails
│ │ │ ├── 11133_169_t.jpg
│ │ │ ├── 16673_260_t.jpg
│ │ │ ├── 16950_158_t.jpg
│ │ │ ├── 19023_103_t.jpg
│ │ │ ├── 25290_88_t.jpg
│ │ │ ├── 284304_50_t.jpg
│ │ │ ├── 28647_30_t.jpg
│ │ │ ├── 3445681_43_t.jpg
│ │ │ ├── 50947_264_t.jpg
│ │ │ └── 62800_122_t.jpg
│ └── src
│ │ ├── app.jsx
│ │ ├── common
│ │ ├── components
│ │ │ ├── dropdown.component.jsx
│ │ │ ├── form.component.jsx
│ │ │ ├── index.js
│ │ │ ├── rating.component.jsx
│ │ │ ├── text-field.component.jsx
│ │ │ └── textarea.component.jsx
│ │ ├── hooks
│ │ │ ├── index.js
│ │ │ └── use-flasher.jsx
│ │ └── mappers
│ │ │ ├── collection.mapper.js
│ │ │ └── index.js
│ │ ├── core
│ │ ├── context
│ │ │ ├── global-state.context.jsx
│ │ │ └── index.js
│ │ ├── router
│ │ │ ├── history.js
│ │ │ ├── index.js
│ │ │ ├── router.component.jsx
│ │ │ └── routes.js
│ │ └── store
│ │ │ ├── action-types.js
│ │ │ ├── actions
│ │ │ ├── hotel-collection.actions.js
│ │ │ ├── index.js
│ │ │ └── login.actions.js
│ │ │ ├── index.js
│ │ │ ├── reducers
│ │ │ ├── hotel-collection.reducer.js
│ │ │ ├── index.js
│ │ │ └── login.reducer.js
│ │ │ ├── root-reducer.jsx
│ │ │ └── store.js
│ │ ├── index.html
│ │ ├── index.jsx
│ │ ├── layouts
│ │ ├── app.layout.jsx
│ │ ├── centered.layout.jsx
│ │ ├── centered.layout.styles.js
│ │ └── index.js
│ │ ├── pods
│ │ ├── hotel-collection
│ │ │ ├── components
│ │ │ │ ├── hotel-card.component.jsx
│ │ │ │ ├── hotel-card.component.styles.js
│ │ │ │ └── index.js
│ │ │ ├── hotel-collection.api.js
│ │ │ ├── hotel-collection.component.jsx
│ │ │ ├── hotel-collection.component.styles.js
│ │ │ ├── hotel-collection.container.jsx
│ │ │ ├── hotel-collection.mapper.js
│ │ │ ├── index.js
│ │ │ └── use-hotel-collection.hook.jsx
│ │ ├── hotel-edit
│ │ │ ├── api
│ │ │ │ ├── hotel-edit.api.js
│ │ │ │ ├── hotel-edit.mock.js
│ │ │ │ └── index.js
│ │ │ ├── hotel-edit.component.jsx
│ │ │ ├── hotel-edit.component.styles.js
│ │ │ ├── hotel-edit.container.jsx
│ │ │ ├── hotel-edit.validation.js
│ │ │ ├── hotel-edit.vm.js
│ │ │ └── index.js
│ │ └── login
│ │ │ ├── api.js
│ │ │ ├── index.js
│ │ │ ├── login.component.jsx
│ │ │ ├── login.component.styles.js
│ │ │ ├── login.container.jsx
│ │ │ ├── login.validation.js
│ │ │ └── login.vm.js
│ │ └── scenes
│ │ ├── hotel-collection.scene.jsx
│ │ ├── hotel-edit.scene.jsx
│ │ ├── index.js
│ │ └── login.scene.jsx
│ ├── 01-config
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .gitignore
│ ├── .prettierrc
│ ├── config
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── dev.env
│ ├── package.json
│ ├── prod.env
│ ├── readme.md
│ ├── server
│ │ ├── config
│ │ │ └── routes.json
│ │ ├── mock-data
│ │ │ └── hotels-data.json
│ │ ├── package.json
│ │ └── public
│ │ │ └── thumbnails
│ │ │ ├── 11133_169_t.jpg
│ │ │ ├── 16673_260_t.jpg
│ │ │ ├── 16950_158_t.jpg
│ │ │ ├── 19023_103_t.jpg
│ │ │ ├── 25290_88_t.jpg
│ │ │ ├── 284304_50_t.jpg
│ │ │ ├── 28647_30_t.jpg
│ │ │ ├── 3445681_43_t.jpg
│ │ │ ├── 50947_264_t.jpg
│ │ │ └── 62800_122_t.jpg
│ ├── src
│ │ ├── app.jsx
│ │ ├── common
│ │ │ ├── components
│ │ │ │ ├── dropdown.component.jsx
│ │ │ │ ├── form.component.jsx
│ │ │ │ ├── index.js
│ │ │ │ ├── rating.component.jsx
│ │ │ │ ├── text-field.component.jsx
│ │ │ │ └── textarea.component.jsx
│ │ │ ├── hooks
│ │ │ │ ├── index.js
│ │ │ │ └── use-flasher.jsx
│ │ │ └── mappers
│ │ │ │ ├── collection.mapper.js
│ │ │ │ └── index.js
│ │ ├── core
│ │ │ ├── context
│ │ │ │ ├── global-state.context.jsx
│ │ │ │ └── index.js
│ │ │ ├── router
│ │ │ │ ├── history.js
│ │ │ │ ├── index.js
│ │ │ │ ├── router.component.jsx
│ │ │ │ └── routes.js
│ │ │ └── store
│ │ │ │ ├── action-types.js
│ │ │ │ ├── actions
│ │ │ │ ├── hotel-collection.actions.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.actions.js
│ │ │ │ ├── index.js
│ │ │ │ ├── reducers
│ │ │ │ ├── hotel-collection.reducer.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.reducer.js
│ │ │ │ ├── root-reducer.jsx
│ │ │ │ └── store.js
│ │ ├── index.html
│ │ ├── index.jsx
│ │ ├── layouts
│ │ │ ├── app.layout.jsx
│ │ │ ├── centered.layout.jsx
│ │ │ ├── centered.layout.styles.js
│ │ │ └── index.js
│ │ ├── pods
│ │ │ ├── hotel-collection
│ │ │ │ ├── components
│ │ │ │ │ ├── hotel-card.component.jsx
│ │ │ │ │ ├── hotel-card.component.styles.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-collection.api.js
│ │ │ │ ├── hotel-collection.component.jsx
│ │ │ │ ├── hotel-collection.component.styles.js
│ │ │ │ ├── hotel-collection.container.jsx
│ │ │ │ ├── hotel-collection.mapper.js
│ │ │ │ ├── index.js
│ │ │ │ └── use-hotel-collection.hook.jsx
│ │ │ ├── hotel-edit
│ │ │ │ ├── api
│ │ │ │ │ ├── hotel-edit.api.js
│ │ │ │ │ ├── hotel-edit.mock.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-edit.component.jsx
│ │ │ │ ├── hotel-edit.component.styles.js
│ │ │ │ ├── hotel-edit.container.jsx
│ │ │ │ ├── hotel-edit.validation.js
│ │ │ │ ├── hotel-edit.vm.js
│ │ │ │ └── index.js
│ │ │ └── login
│ │ │ │ ├── api.js
│ │ │ │ ├── index.js
│ │ │ │ ├── login.component.jsx
│ │ │ │ ├── login.component.styles.js
│ │ │ │ ├── login.container.jsx
│ │ │ │ ├── login.validation.js
│ │ │ │ └── login.vm.js
│ │ └── scenes
│ │ │ ├── hotel-collection.scene.jsx
│ │ │ ├── hotel-edit.scene.jsx
│ │ │ ├── index.js
│ │ │ └── login.scene.jsx
│ ├── testcafe.config.js
│ └── tests
│ │ └── login.spec.js
│ ├── 02-selectors
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .gitignore
│ ├── .prettierrc
│ ├── config
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── dev.env
│ ├── package.json
│ ├── prod.env
│ ├── readme.md
│ ├── server
│ │ ├── config
│ │ │ └── routes.json
│ │ ├── mock-data
│ │ │ └── hotels-data.json
│ │ ├── package.json
│ │ └── public
│ │ │ └── thumbnails
│ │ │ ├── 11133_169_t.jpg
│ │ │ ├── 16673_260_t.jpg
│ │ │ ├── 16950_158_t.jpg
│ │ │ ├── 19023_103_t.jpg
│ │ │ ├── 25290_88_t.jpg
│ │ │ ├── 284304_50_t.jpg
│ │ │ ├── 28647_30_t.jpg
│ │ │ ├── 3445681_43_t.jpg
│ │ │ ├── 50947_264_t.jpg
│ │ │ └── 62800_122_t.jpg
│ ├── src
│ │ ├── app.jsx
│ │ ├── common
│ │ │ ├── components
│ │ │ │ ├── dropdown.component.jsx
│ │ │ │ ├── form.component.jsx
│ │ │ │ ├── index.js
│ │ │ │ ├── rating.component.jsx
│ │ │ │ ├── text-field.component.jsx
│ │ │ │ └── textarea.component.jsx
│ │ │ ├── hooks
│ │ │ │ ├── index.js
│ │ │ │ └── use-flasher.jsx
│ │ │ └── mappers
│ │ │ │ ├── collection.mapper.js
│ │ │ │ └── index.js
│ │ ├── core
│ │ │ ├── context
│ │ │ │ ├── global-state.context.jsx
│ │ │ │ └── index.js
│ │ │ ├── router
│ │ │ │ ├── history.js
│ │ │ │ ├── index.js
│ │ │ │ ├── router.component.jsx
│ │ │ │ └── routes.js
│ │ │ └── store
│ │ │ │ ├── action-types.js
│ │ │ │ ├── actions
│ │ │ │ ├── hotel-collection.actions.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.actions.js
│ │ │ │ ├── index.js
│ │ │ │ ├── reducers
│ │ │ │ ├── hotel-collection.reducer.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.reducer.js
│ │ │ │ ├── root-reducer.jsx
│ │ │ │ └── store.js
│ │ ├── index.html
│ │ ├── index.jsx
│ │ ├── layouts
│ │ │ ├── app.layout.jsx
│ │ │ ├── centered.layout.jsx
│ │ │ ├── centered.layout.styles.js
│ │ │ └── index.js
│ │ ├── pods
│ │ │ ├── hotel-collection
│ │ │ │ ├── components
│ │ │ │ │ ├── hotel-card.component.jsx
│ │ │ │ │ ├── hotel-card.component.styles.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-collection.api.js
│ │ │ │ ├── hotel-collection.component.jsx
│ │ │ │ ├── hotel-collection.component.styles.js
│ │ │ │ ├── hotel-collection.container.jsx
│ │ │ │ ├── hotel-collection.mapper.js
│ │ │ │ ├── index.js
│ │ │ │ └── use-hotel-collection.hook.jsx
│ │ │ ├── hotel-edit
│ │ │ │ ├── api
│ │ │ │ │ ├── hotel-edit.api.js
│ │ │ │ │ ├── hotel-edit.mock.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-edit.component.jsx
│ │ │ │ ├── hotel-edit.component.styles.js
│ │ │ │ ├── hotel-edit.container.jsx
│ │ │ │ ├── hotel-edit.validation.js
│ │ │ │ ├── hotel-edit.vm.js
│ │ │ │ └── index.js
│ │ │ └── login
│ │ │ │ ├── api.js
│ │ │ │ ├── index.js
│ │ │ │ ├── login.component.jsx
│ │ │ │ ├── login.component.styles.js
│ │ │ │ ├── login.container.jsx
│ │ │ │ ├── login.validation.js
│ │ │ │ └── login.vm.js
│ │ └── scenes
│ │ │ ├── hotel-collection.scene.jsx
│ │ │ ├── hotel-edit.scene.jsx
│ │ │ ├── index.js
│ │ │ └── login.scene.jsx
│ ├── testcafe.config.js
│ └── tests
│ │ └── login.spec.js
│ ├── 03-debug
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .gitignore
│ ├── .prettierrc
│ ├── .vscode
│ │ └── launch.json
│ ├── config
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── dev.env
│ ├── package.json
│ ├── prod.env
│ ├── readme.md
│ ├── server
│ │ ├── config
│ │ │ └── routes.json
│ │ ├── mock-data
│ │ │ └── hotels-data.json
│ │ ├── package.json
│ │ └── public
│ │ │ └── thumbnails
│ │ │ ├── 11133_169_t.jpg
│ │ │ ├── 16673_260_t.jpg
│ │ │ ├── 16950_158_t.jpg
│ │ │ ├── 19023_103_t.jpg
│ │ │ ├── 25290_88_t.jpg
│ │ │ ├── 284304_50_t.jpg
│ │ │ ├── 28647_30_t.jpg
│ │ │ ├── 3445681_43_t.jpg
│ │ │ ├── 50947_264_t.jpg
│ │ │ └── 62800_122_t.jpg
│ ├── src
│ │ ├── app.jsx
│ │ ├── common
│ │ │ ├── components
│ │ │ │ ├── dropdown.component.jsx
│ │ │ │ ├── form.component.jsx
│ │ │ │ ├── index.js
│ │ │ │ ├── rating.component.jsx
│ │ │ │ ├── text-field.component.jsx
│ │ │ │ └── textarea.component.jsx
│ │ │ ├── hooks
│ │ │ │ ├── index.js
│ │ │ │ └── use-flasher.jsx
│ │ │ └── mappers
│ │ │ │ ├── collection.mapper.js
│ │ │ │ └── index.js
│ │ ├── core
│ │ │ ├── context
│ │ │ │ ├── global-state.context.jsx
│ │ │ │ └── index.js
│ │ │ ├── router
│ │ │ │ ├── history.js
│ │ │ │ ├── index.js
│ │ │ │ ├── router.component.jsx
│ │ │ │ └── routes.js
│ │ │ └── store
│ │ │ │ ├── action-types.js
│ │ │ │ ├── actions
│ │ │ │ ├── hotel-collection.actions.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.actions.js
│ │ │ │ ├── index.js
│ │ │ │ ├── reducers
│ │ │ │ ├── hotel-collection.reducer.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.reducer.js
│ │ │ │ ├── root-reducer.jsx
│ │ │ │ └── store.js
│ │ ├── index.html
│ │ ├── index.jsx
│ │ ├── layouts
│ │ │ ├── app.layout.jsx
│ │ │ ├── centered.layout.jsx
│ │ │ ├── centered.layout.styles.js
│ │ │ └── index.js
│ │ ├── pods
│ │ │ ├── hotel-collection
│ │ │ │ ├── components
│ │ │ │ │ ├── hotel-card.component.jsx
│ │ │ │ │ ├── hotel-card.component.styles.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-collection.api.js
│ │ │ │ ├── hotel-collection.component.jsx
│ │ │ │ ├── hotel-collection.component.styles.js
│ │ │ │ ├── hotel-collection.container.jsx
│ │ │ │ ├── hotel-collection.mapper.js
│ │ │ │ ├── index.js
│ │ │ │ └── use-hotel-collection.hook.jsx
│ │ │ ├── hotel-edit
│ │ │ │ ├── api
│ │ │ │ │ ├── hotel-edit.api.js
│ │ │ │ │ ├── hotel-edit.mock.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-edit.component.jsx
│ │ │ │ ├── hotel-edit.component.styles.js
│ │ │ │ ├── hotel-edit.container.jsx
│ │ │ │ ├── hotel-edit.validation.js
│ │ │ │ ├── hotel-edit.vm.js
│ │ │ │ └── index.js
│ │ │ └── login
│ │ │ │ ├── api.js
│ │ │ │ ├── index.js
│ │ │ │ ├── login.component.jsx
│ │ │ │ ├── login.component.styles.js
│ │ │ │ ├── login.container.jsx
│ │ │ │ ├── login.validation.js
│ │ │ │ └── login.vm.js
│ │ └── scenes
│ │ │ ├── hotel-collection.scene.jsx
│ │ │ ├── hotel-edit.scene.jsx
│ │ │ ├── index.js
│ │ │ └── login.scene.jsx
│ ├── testcafe.config.js
│ └── tests
│ │ └── login.spec.js
│ ├── 04-stub-requests
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .gitignore
│ ├── .prettierrc
│ ├── .vscode
│ │ └── launch.json
│ ├── config
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── dev.env
│ ├── package.json
│ ├── prod.env
│ ├── readme.md
│ ├── server
│ │ ├── config
│ │ │ └── routes.json
│ │ ├── mock-data
│ │ │ └── hotels-data.json
│ │ ├── package.json
│ │ └── public
│ │ │ └── thumbnails
│ │ │ ├── 11133_169_t.jpg
│ │ │ ├── 16673_260_t.jpg
│ │ │ ├── 16950_158_t.jpg
│ │ │ ├── 19023_103_t.jpg
│ │ │ ├── 25290_88_t.jpg
│ │ │ ├── 284304_50_t.jpg
│ │ │ ├── 28647_30_t.jpg
│ │ │ ├── 3445681_43_t.jpg
│ │ │ ├── 50947_264_t.jpg
│ │ │ └── 62800_122_t.jpg
│ ├── src
│ │ ├── app.jsx
│ │ ├── common
│ │ │ ├── components
│ │ │ │ ├── dropdown.component.jsx
│ │ │ │ ├── form.component.jsx
│ │ │ │ ├── index.js
│ │ │ │ ├── rating.component.jsx
│ │ │ │ ├── text-field.component.jsx
│ │ │ │ └── textarea.component.jsx
│ │ │ ├── hooks
│ │ │ │ ├── index.js
│ │ │ │ └── use-flasher.jsx
│ │ │ └── mappers
│ │ │ │ ├── collection.mapper.js
│ │ │ │ └── index.js
│ │ ├── core
│ │ │ ├── context
│ │ │ │ ├── global-state.context.jsx
│ │ │ │ └── index.js
│ │ │ ├── router
│ │ │ │ ├── history.js
│ │ │ │ ├── index.js
│ │ │ │ ├── router.component.jsx
│ │ │ │ └── routes.js
│ │ │ └── store
│ │ │ │ ├── action-types.js
│ │ │ │ ├── actions
│ │ │ │ ├── hotel-collection.actions.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.actions.js
│ │ │ │ ├── index.js
│ │ │ │ ├── reducers
│ │ │ │ ├── hotel-collection.reducer.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.reducer.js
│ │ │ │ ├── root-reducer.jsx
│ │ │ │ └── store.js
│ │ ├── index.html
│ │ ├── index.jsx
│ │ ├── layouts
│ │ │ ├── app.layout.jsx
│ │ │ ├── centered.layout.jsx
│ │ │ ├── centered.layout.styles.js
│ │ │ └── index.js
│ │ ├── pods
│ │ │ ├── hotel-collection
│ │ │ │ ├── components
│ │ │ │ │ ├── hotel-card.component.jsx
│ │ │ │ │ ├── hotel-card.component.styles.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-collection.api.js
│ │ │ │ ├── hotel-collection.component.jsx
│ │ │ │ ├── hotel-collection.component.styles.js
│ │ │ │ ├── hotel-collection.container.jsx
│ │ │ │ ├── hotel-collection.mapper.js
│ │ │ │ ├── index.js
│ │ │ │ └── use-hotel-collection.hook.jsx
│ │ │ ├── hotel-edit
│ │ │ │ ├── api
│ │ │ │ │ ├── hotel-edit.api.js
│ │ │ │ │ ├── hotel-edit.mock.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-edit.component.jsx
│ │ │ │ ├── hotel-edit.component.styles.js
│ │ │ │ ├── hotel-edit.container.jsx
│ │ │ │ ├── hotel-edit.validation.js
│ │ │ │ ├── hotel-edit.vm.js
│ │ │ │ └── index.js
│ │ │ └── login
│ │ │ │ ├── api.js
│ │ │ │ ├── index.js
│ │ │ │ ├── login.component.jsx
│ │ │ │ ├── login.component.styles.js
│ │ │ │ ├── login.container.jsx
│ │ │ │ ├── login.validation.js
│ │ │ │ └── login.vm.js
│ │ └── scenes
│ │ │ ├── hotel-collection.scene.jsx
│ │ │ ├── hotel-edit.scene.jsx
│ │ │ ├── index.js
│ │ │ └── login.scene.jsx
│ ├── testcafe.config.js
│ └── tests
│ │ ├── hotel-collection.spec.js
│ │ ├── login.spec.js
│ │ └── mocks
│ │ ├── hotels.js
│ │ ├── index.js
│ │ └── requests.js
│ ├── 05-wait-requests
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .gitignore
│ ├── .prettierrc
│ ├── .vscode
│ │ └── launch.json
│ ├── config
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── dev.env
│ ├── package.json
│ ├── prod.env
│ ├── readme.md
│ ├── server
│ │ ├── config
│ │ │ └── routes.json
│ │ ├── mock-data
│ │ │ └── hotels-data.json
│ │ ├── package.json
│ │ └── public
│ │ │ └── thumbnails
│ │ │ ├── 11133_169_t.jpg
│ │ │ ├── 16673_260_t.jpg
│ │ │ ├── 16950_158_t.jpg
│ │ │ ├── 19023_103_t.jpg
│ │ │ ├── 25290_88_t.jpg
│ │ │ ├── 284304_50_t.jpg
│ │ │ ├── 28647_30_t.jpg
│ │ │ ├── 3445681_43_t.jpg
│ │ │ ├── 50947_264_t.jpg
│ │ │ └── 62800_122_t.jpg
│ ├── src
│ │ ├── app.jsx
│ │ ├── common
│ │ │ ├── components
│ │ │ │ ├── dropdown.component.jsx
│ │ │ │ ├── form.component.jsx
│ │ │ │ ├── index.js
│ │ │ │ ├── rating.component.jsx
│ │ │ │ ├── text-field.component.jsx
│ │ │ │ └── textarea.component.jsx
│ │ │ ├── hooks
│ │ │ │ ├── index.js
│ │ │ │ └── use-flasher.jsx
│ │ │ └── mappers
│ │ │ │ ├── collection.mapper.js
│ │ │ │ └── index.js
│ │ ├── core
│ │ │ ├── context
│ │ │ │ ├── global-state.context.jsx
│ │ │ │ └── index.js
│ │ │ ├── router
│ │ │ │ ├── history.js
│ │ │ │ ├── index.js
│ │ │ │ ├── router.component.jsx
│ │ │ │ └── routes.js
│ │ │ └── store
│ │ │ │ ├── action-types.js
│ │ │ │ ├── actions
│ │ │ │ ├── hotel-collection.actions.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.actions.js
│ │ │ │ ├── index.js
│ │ │ │ ├── reducers
│ │ │ │ ├── hotel-collection.reducer.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.reducer.js
│ │ │ │ ├── root-reducer.jsx
│ │ │ │ └── store.js
│ │ ├── index.html
│ │ ├── index.jsx
│ │ ├── layouts
│ │ │ ├── app.layout.jsx
│ │ │ ├── centered.layout.jsx
│ │ │ ├── centered.layout.styles.js
│ │ │ └── index.js
│ │ ├── pods
│ │ │ ├── hotel-collection
│ │ │ │ ├── components
│ │ │ │ │ ├── hotel-card.component.jsx
│ │ │ │ │ ├── hotel-card.component.styles.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-collection.api.js
│ │ │ │ ├── hotel-collection.component.jsx
│ │ │ │ ├── hotel-collection.component.styles.js
│ │ │ │ ├── hotel-collection.container.jsx
│ │ │ │ ├── hotel-collection.mapper.js
│ │ │ │ ├── index.js
│ │ │ │ └── use-hotel-collection.hook.jsx
│ │ │ ├── hotel-edit
│ │ │ │ ├── api
│ │ │ │ │ ├── hotel-edit.api.js
│ │ │ │ │ ├── hotel-edit.mock.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-edit.component.jsx
│ │ │ │ ├── hotel-edit.component.styles.js
│ │ │ │ ├── hotel-edit.container.jsx
│ │ │ │ ├── hotel-edit.validation.js
│ │ │ │ ├── hotel-edit.vm.js
│ │ │ │ └── index.js
│ │ │ └── login
│ │ │ │ ├── api.js
│ │ │ │ ├── index.js
│ │ │ │ ├── login.component.jsx
│ │ │ │ ├── login.component.styles.js
│ │ │ │ ├── login.container.jsx
│ │ │ │ ├── login.validation.js
│ │ │ │ └── login.vm.js
│ │ └── scenes
│ │ │ ├── hotel-collection.scene.jsx
│ │ │ ├── hotel-edit.scene.jsx
│ │ │ ├── index.js
│ │ │ └── login.scene.jsx
│ ├── testcafe.config.js
│ └── tests
│ │ ├── hotel-collection.spec.js
│ │ ├── login.spec.js
│ │ └── mocks
│ │ ├── hotels.js
│ │ ├── index.js
│ │ └── requests.js
│ ├── 06-custom-commands
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .gitignore
│ ├── .prettierrc
│ ├── .vscode
│ │ └── launch.json
│ ├── config
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── dev.env
│ ├── package.json
│ ├── prod.env
│ ├── readme.md
│ ├── server
│ │ ├── config
│ │ │ └── routes.json
│ │ ├── mock-data
│ │ │ └── hotels-data.json
│ │ ├── package.json
│ │ └── public
│ │ │ └── thumbnails
│ │ │ ├── 11133_169_t.jpg
│ │ │ ├── 16673_260_t.jpg
│ │ │ ├── 16950_158_t.jpg
│ │ │ ├── 19023_103_t.jpg
│ │ │ ├── 25290_88_t.jpg
│ │ │ ├── 284304_50_t.jpg
│ │ │ ├── 28647_30_t.jpg
│ │ │ ├── 3445681_43_t.jpg
│ │ │ ├── 50947_264_t.jpg
│ │ │ └── 62800_122_t.jpg
│ ├── src
│ │ ├── app.jsx
│ │ ├── common
│ │ │ ├── components
│ │ │ │ ├── dropdown.component.jsx
│ │ │ │ ├── form.component.jsx
│ │ │ │ ├── index.js
│ │ │ │ ├── rating.component.jsx
│ │ │ │ ├── text-field.component.jsx
│ │ │ │ └── textarea.component.jsx
│ │ │ ├── hooks
│ │ │ │ ├── index.js
│ │ │ │ └── use-flasher.jsx
│ │ │ └── mappers
│ │ │ │ ├── collection.mapper.js
│ │ │ │ └── index.js
│ │ ├── core
│ │ │ ├── context
│ │ │ │ ├── global-state.context.jsx
│ │ │ │ └── index.js
│ │ │ ├── router
│ │ │ │ ├── history.js
│ │ │ │ ├── index.js
│ │ │ │ ├── router.component.jsx
│ │ │ │ └── routes.js
│ │ │ └── store
│ │ │ │ ├── action-types.js
│ │ │ │ ├── actions
│ │ │ │ ├── hotel-collection.actions.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.actions.js
│ │ │ │ ├── index.js
│ │ │ │ ├── reducers
│ │ │ │ ├── hotel-collection.reducer.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.reducer.js
│ │ │ │ ├── root-reducer.jsx
│ │ │ │ └── store.js
│ │ ├── index.html
│ │ ├── index.jsx
│ │ ├── layouts
│ │ │ ├── app.layout.jsx
│ │ │ ├── centered.layout.jsx
│ │ │ ├── centered.layout.styles.js
│ │ │ └── index.js
│ │ ├── pods
│ │ │ ├── hotel-collection
│ │ │ │ ├── components
│ │ │ │ │ ├── hotel-card.component.jsx
│ │ │ │ │ ├── hotel-card.component.styles.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-collection.api.js
│ │ │ │ ├── hotel-collection.component.jsx
│ │ │ │ ├── hotel-collection.component.styles.js
│ │ │ │ ├── hotel-collection.container.jsx
│ │ │ │ ├── hotel-collection.mapper.js
│ │ │ │ ├── index.js
│ │ │ │ └── use-hotel-collection.hook.jsx
│ │ │ ├── hotel-edit
│ │ │ │ ├── api
│ │ │ │ │ ├── hotel-edit.api.js
│ │ │ │ │ ├── hotel-edit.mock.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-edit.component.jsx
│ │ │ │ ├── hotel-edit.component.styles.js
│ │ │ │ ├── hotel-edit.container.jsx
│ │ │ │ ├── hotel-edit.validation.js
│ │ │ │ ├── hotel-edit.vm.js
│ │ │ │ └── index.js
│ │ │ └── login
│ │ │ │ ├── api.js
│ │ │ │ ├── index.js
│ │ │ │ ├── login.component.jsx
│ │ │ │ ├── login.component.styles.js
│ │ │ │ ├── login.container.jsx
│ │ │ │ ├── login.validation.js
│ │ │ │ └── login.vm.js
│ │ └── scenes
│ │ │ ├── hotel-collection.scene.jsx
│ │ │ ├── hotel-edit.scene.jsx
│ │ │ ├── index.js
│ │ │ └── login.scene.jsx
│ ├── testcafe.config.js
│ └── tests
│ │ ├── commands
│ │ ├── commands.js
│ │ └── index.js
│ │ ├── hotel-collection.spec.js
│ │ ├── login.spec.js
│ │ └── mocks
│ │ ├── hotels.js
│ │ ├── index.js
│ │ └── requests.js
│ ├── 07-edit-hotel
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .gitignore
│ ├── .prettierrc
│ ├── .vscode
│ │ └── launch.json
│ ├── config
│ │ └── webpack
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── helpers.js
│ │ │ └── prod.js
│ ├── dev.env
│ ├── package.json
│ ├── prod.env
│ ├── readme.md
│ ├── server
│ │ ├── config
│ │ │ └── routes.json
│ │ ├── mock-data
│ │ │ └── hotels-data.json
│ │ ├── package.json
│ │ └── public
│ │ │ └── thumbnails
│ │ │ ├── 11133_169_t.jpg
│ │ │ ├── 16673_260_t.jpg
│ │ │ ├── 16950_158_t.jpg
│ │ │ ├── 19023_103_t.jpg
│ │ │ ├── 25290_88_t.jpg
│ │ │ ├── 284304_50_t.jpg
│ │ │ ├── 28647_30_t.jpg
│ │ │ ├── 3445681_43_t.jpg
│ │ │ ├── 50947_264_t.jpg
│ │ │ └── 62800_122_t.jpg
│ ├── src
│ │ ├── app.jsx
│ │ ├── common
│ │ │ ├── components
│ │ │ │ ├── dropdown.component.jsx
│ │ │ │ ├── form.component.jsx
│ │ │ │ ├── index.js
│ │ │ │ ├── rating.component.jsx
│ │ │ │ ├── text-field.component.jsx
│ │ │ │ └── textarea.component.jsx
│ │ │ ├── hooks
│ │ │ │ ├── index.js
│ │ │ │ └── use-flasher.jsx
│ │ │ └── mappers
│ │ │ │ ├── collection.mapper.js
│ │ │ │ └── index.js
│ │ ├── core
│ │ │ ├── context
│ │ │ │ ├── global-state.context.jsx
│ │ │ │ └── index.js
│ │ │ ├── router
│ │ │ │ ├── history.js
│ │ │ │ ├── index.js
│ │ │ │ ├── router.component.jsx
│ │ │ │ └── routes.js
│ │ │ └── store
│ │ │ │ ├── action-types.js
│ │ │ │ ├── actions
│ │ │ │ ├── hotel-collection.actions.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.actions.js
│ │ │ │ ├── index.js
│ │ │ │ ├── reducers
│ │ │ │ ├── hotel-collection.reducer.js
│ │ │ │ ├── index.js
│ │ │ │ └── login.reducer.js
│ │ │ │ ├── root-reducer.jsx
│ │ │ │ └── store.js
│ │ ├── index.html
│ │ ├── index.jsx
│ │ ├── layouts
│ │ │ ├── app.layout.jsx
│ │ │ ├── centered.layout.jsx
│ │ │ ├── centered.layout.styles.js
│ │ │ └── index.js
│ │ ├── pods
│ │ │ ├── hotel-collection
│ │ │ │ ├── components
│ │ │ │ │ ├── hotel-card.component.jsx
│ │ │ │ │ ├── hotel-card.component.styles.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-collection.api.js
│ │ │ │ ├── hotel-collection.component.jsx
│ │ │ │ ├── hotel-collection.component.styles.js
│ │ │ │ ├── hotel-collection.container.jsx
│ │ │ │ ├── hotel-collection.mapper.js
│ │ │ │ ├── index.js
│ │ │ │ └── use-hotel-collection.hook.jsx
│ │ │ ├── hotel-edit
│ │ │ │ ├── api
│ │ │ │ │ ├── hotel-edit.api.js
│ │ │ │ │ ├── hotel-edit.mock.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── hotel-edit.component.jsx
│ │ │ │ ├── hotel-edit.component.styles.js
│ │ │ │ ├── hotel-edit.container.jsx
│ │ │ │ ├── hotel-edit.validation.js
│ │ │ │ ├── hotel-edit.vm.js
│ │ │ │ └── index.js
│ │ │ └── login
│ │ │ │ ├── api.js
│ │ │ │ ├── index.js
│ │ │ │ ├── login.component.jsx
│ │ │ │ ├── login.component.styles.js
│ │ │ │ ├── login.container.jsx
│ │ │ │ ├── login.validation.js
│ │ │ │ └── login.vm.js
│ │ └── scenes
│ │ │ ├── hotel-collection.scene.jsx
│ │ │ ├── hotel-edit.scene.jsx
│ │ │ ├── index.js
│ │ │ └── login.scene.jsx
│ ├── testcafe.config.js
│ └── tests
│ │ ├── commands
│ │ ├── commands.js
│ │ └── index.js
│ │ ├── hotel-collection.spec.js
│ │ ├── hotel-edit.spec.js
│ │ ├── login.spec.js
│ │ └── mocks
│ │ ├── hotels.js
│ │ ├── index.js
│ │ └── requests.js
│ └── 08-ci
│ ├── .babelrc
│ ├── .circleci
│ └── config.yml
│ ├── .editorconfig
│ ├── .gitignore
│ ├── .prettierrc
│ ├── .vscode
│ └── launch.json
│ ├── config
│ └── webpack
│ │ ├── base.js
│ │ ├── dev.js
│ │ ├── helpers.js
│ │ └── prod.js
│ ├── dev.env
│ ├── package.json
│ ├── prod.env
│ ├── readme.md
│ ├── server
│ ├── config
│ │ └── routes.json
│ ├── mock-data
│ │ └── hotels-data.json
│ ├── package.json
│ └── public
│ │ └── thumbnails
│ │ ├── 11133_169_t.jpg
│ │ ├── 16673_260_t.jpg
│ │ ├── 16950_158_t.jpg
│ │ ├── 19023_103_t.jpg
│ │ ├── 25290_88_t.jpg
│ │ ├── 284304_50_t.jpg
│ │ ├── 28647_30_t.jpg
│ │ ├── 3445681_43_t.jpg
│ │ ├── 50947_264_t.jpg
│ │ └── 62800_122_t.jpg
│ ├── src
│ ├── app.jsx
│ ├── common
│ │ ├── components
│ │ │ ├── dropdown.component.jsx
│ │ │ ├── form.component.jsx
│ │ │ ├── index.js
│ │ │ ├── rating.component.jsx
│ │ │ ├── text-field.component.jsx
│ │ │ └── textarea.component.jsx
│ │ ├── hooks
│ │ │ ├── index.js
│ │ │ └── use-flasher.jsx
│ │ └── mappers
│ │ │ ├── collection.mapper.js
│ │ │ └── index.js
│ ├── core
│ │ ├── context
│ │ │ ├── global-state.context.jsx
│ │ │ └── index.js
│ │ ├── router
│ │ │ ├── history.js
│ │ │ ├── index.js
│ │ │ ├── router.component.jsx
│ │ │ └── routes.js
│ │ └── store
│ │ │ ├── action-types.js
│ │ │ ├── actions
│ │ │ ├── hotel-collection.actions.js
│ │ │ ├── index.js
│ │ │ └── login.actions.js
│ │ │ ├── index.js
│ │ │ ├── reducers
│ │ │ ├── hotel-collection.reducer.js
│ │ │ ├── index.js
│ │ │ └── login.reducer.js
│ │ │ ├── root-reducer.jsx
│ │ │ └── store.js
│ ├── index.html
│ ├── index.jsx
│ ├── layouts
│ │ ├── app.layout.jsx
│ │ ├── centered.layout.jsx
│ │ ├── centered.layout.styles.js
│ │ └── index.js
│ ├── pods
│ │ ├── hotel-collection
│ │ │ ├── components
│ │ │ │ ├── hotel-card.component.jsx
│ │ │ │ ├── hotel-card.component.styles.js
│ │ │ │ └── index.js
│ │ │ ├── hotel-collection.api.js
│ │ │ ├── hotel-collection.component.jsx
│ │ │ ├── hotel-collection.component.styles.js
│ │ │ ├── hotel-collection.container.jsx
│ │ │ ├── hotel-collection.mapper.js
│ │ │ ├── index.js
│ │ │ └── use-hotel-collection.hook.jsx
│ │ ├── hotel-edit
│ │ │ ├── api
│ │ │ │ ├── hotel-edit.api.js
│ │ │ │ ├── hotel-edit.mock.js
│ │ │ │ └── index.js
│ │ │ ├── hotel-edit.component.jsx
│ │ │ ├── hotel-edit.component.styles.js
│ │ │ ├── hotel-edit.container.jsx
│ │ │ ├── hotel-edit.validation.js
│ │ │ ├── hotel-edit.vm.js
│ │ │ └── index.js
│ │ └── login
│ │ │ ├── api.js
│ │ │ ├── index.js
│ │ │ ├── login.component.jsx
│ │ │ ├── login.component.styles.js
│ │ │ ├── login.container.jsx
│ │ │ ├── login.validation.js
│ │ │ └── login.vm.js
│ └── scenes
│ │ ├── hotel-collection.scene.jsx
│ │ ├── hotel-edit.scene.jsx
│ │ ├── index.js
│ │ └── login.scene.jsx
│ ├── testcafe.config.js
│ └── tests
│ ├── commands
│ ├── commands.js
│ └── index.js
│ ├── hotel-collection.spec.js
│ ├── hotel-edit.spec.js
│ ├── login.spec.js
│ └── mocks
│ ├── hotels.js
│ ├── index.js
│ └── requests.js
├── 06-bdd-cucumber
└── 00-boilerplate
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .gitignore
│ ├── .prettierrc
│ ├── config
│ ├── test
│ │ ├── jest.coverage.json
│ │ └── jest.json
│ └── webpack
│ │ ├── base.js
│ │ ├── dev.js
│ │ ├── helpers.js
│ │ └── prod.js
│ ├── dev.env
│ ├── package.json
│ ├── prod.env
│ ├── readme.md
│ ├── src
│ ├── app.tsx
│ ├── core
│ │ ├── router
│ │ │ ├── history.ts
│ │ │ ├── index.ts
│ │ │ ├── router.component.tsx
│ │ │ └── routes.ts
│ │ └── store
│ │ │ ├── index.ts
│ │ │ ├── root-reducer.ts
│ │ │ ├── root-saga.ts
│ │ │ └── store.ts
│ ├── index.html
│ ├── index.tsx
│ ├── layout
│ │ └── index.ts
│ └── scenes
│ │ └── index.ts
│ └── tsconfig.json
├── LICENSE
└── readme.md
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | indent_style = space
5 | indent_size = 2
6 | end_of_line = lf
7 | charset = utf-8
8 | trim_trailing_whitespace = true
9 | insert_final_newline = true
10 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .DS_Store
3 | dist/
4 | typings/
5 | *.orig
6 | .idea/
7 | */src/**/*.js.map
8 | *.log
9 | package-lock.json
10 | coverage/
11 | .awcache/
12 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/00-base/00-boilerplate/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env"]
3 | }
4 |
--------------------------------------------------------------------------------
/00-base/00-boilerplate/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/00-base/00-boilerplate/config/webpack/helpers.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 |
3 | const rootPath = path.resolve(__dirname, '../../');
4 |
5 | exports.resolveFromRootPath = (...args) => path.join(rootPath, ...args);
6 |
--------------------------------------------------------------------------------
/00-base/00-boilerplate/src/app.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 |
3 | export const App: React.FunctionComponent = () => {
4 | return
React testing by sample
;
5 | };
6 |
--------------------------------------------------------------------------------
/00-base/00-boilerplate/src/index.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import * as ReactDOM from 'react-dom';
3 | import { App } from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/00-base/01-config/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env"]
3 | }
4 |
--------------------------------------------------------------------------------
/00-base/01-config/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | indent_style = space
5 | indent_size = 2
6 | end_of_line = lf
7 | charset = utf-8
8 | trim_trailing_whitespace = true
9 | insert_final_newline = true
10 |
--------------------------------------------------------------------------------
/00-base/01-config/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/00-base/01-config/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true
5 | }
6 |
--------------------------------------------------------------------------------
/00-base/01-config/config/webpack/helpers.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 |
3 | const rootPath = path.resolve(__dirname, '../../');
4 |
5 | exports.resolveFromRootPath = (...args) => path.join(rootPath, ...args);
6 |
--------------------------------------------------------------------------------
/00-base/01-config/src/app.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 |
3 | export const App: React.FunctionComponent = () => {
4 | return React testing by sample
;
5 | };
6 |
--------------------------------------------------------------------------------
/00-base/01-config/src/index.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import * as ReactDOM from 'react-dom';
3 | import { App } from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/00-base/02-calculator/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env"]
3 | }
4 |
--------------------------------------------------------------------------------
/00-base/02-calculator/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | indent_style = space
5 | indent_size = 2
6 | end_of_line = lf
7 | charset = utf-8
8 | trim_trailing_whitespace = true
9 | insert_final_newline = true
10 |
--------------------------------------------------------------------------------
/00-base/02-calculator/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/00-base/02-calculator/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true
5 | }
6 |
--------------------------------------------------------------------------------
/00-base/02-calculator/config/webpack/helpers.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 |
3 | const rootPath = path.resolve(__dirname, '../../');
4 |
5 | exports.resolveFromRootPath = (...args) => path.join(rootPath, ...args);
6 |
--------------------------------------------------------------------------------
/00-base/02-calculator/src/app.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 |
3 | export const App: React.FunctionComponent = () => {
4 | return React testing by sample
;
5 | };
6 |
--------------------------------------------------------------------------------
/00-base/02-calculator/src/business.ts:
--------------------------------------------------------------------------------
1 | export const isLowerThan = (value, max) => {
2 | console.log(`The value: ${value} is lower than ${max}`);
3 | };
4 |
5 | export const max = 6;
6 |
--------------------------------------------------------------------------------
/00-base/02-calculator/src/index.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import * as ReactDOM from 'react-dom';
3 | import { App } from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/00-base/03-debug/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env"]
3 | }
4 |
--------------------------------------------------------------------------------
/00-base/03-debug/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | indent_style = space
5 | indent_size = 2
6 | end_of_line = lf
7 | charset = utf-8
8 | trim_trailing_whitespace = true
9 | insert_final_newline = true
10 |
--------------------------------------------------------------------------------
/00-base/03-debug/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/00-base/03-debug/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true
5 | }
6 |
--------------------------------------------------------------------------------
/00-base/03-debug/config/webpack/helpers.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 |
3 | const rootPath = path.resolve(__dirname, '../../');
4 |
5 | exports.resolveFromRootPath = (...args) => path.join(rootPath, ...args);
6 |
--------------------------------------------------------------------------------
/00-base/03-debug/readme-resources/01-add-launch.json.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lemoncode/react-testing-by-example/2a4757b710c530314174b27e46e4f90b95db4d86/00-base/03-debug/readme-resources/01-add-launch.json.png
--------------------------------------------------------------------------------
/00-base/03-debug/readme-resources/02-debug.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lemoncode/react-testing-by-example/2a4757b710c530314174b27e46e4f90b95db4d86/00-base/03-debug/readme-resources/02-debug.gif
--------------------------------------------------------------------------------
/00-base/03-debug/src/app.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 |
3 | export const App: React.FunctionComponent = () => {
4 | return React testing by sample
;
5 | };
6 |
--------------------------------------------------------------------------------
/00-base/03-debug/src/business.ts:
--------------------------------------------------------------------------------
1 | export const isLowerThan = (value, max) => {
2 | console.log(`The value: ${value} is lower than ${max}`);
3 | };
4 |
5 | export const max = 6;
6 |
--------------------------------------------------------------------------------
/00-base/03-debug/src/index.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import * as ReactDOM from 'react-dom';
3 | import { App } from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/00-base/04-tdd/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env"]
3 | }
4 |
--------------------------------------------------------------------------------
/00-base/04-tdd/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | indent_style = space
5 | indent_size = 2
6 | end_of_line = lf
7 | charset = utf-8
8 | trim_trailing_whitespace = true
9 | insert_final_newline = true
10 |
--------------------------------------------------------------------------------
/00-base/04-tdd/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/00-base/04-tdd/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true
5 | }
6 |
--------------------------------------------------------------------------------
/00-base/04-tdd/config/webpack/helpers.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 |
3 | const rootPath = path.resolve(__dirname, '../../');
4 |
5 | exports.resolveFromRootPath = (...args) => path.join(rootPath, ...args);
6 |
--------------------------------------------------------------------------------
/00-base/04-tdd/src/api-model.ts:
--------------------------------------------------------------------------------
1 | export interface Member {
2 | id: number;
3 | login: string;
4 | avatar_url: string;
5 | }
6 |
--------------------------------------------------------------------------------
/00-base/04-tdd/src/index.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import * as ReactDOM from 'react-dom';
3 | import { App } from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/00-base/04-tdd/src/view-model.ts:
--------------------------------------------------------------------------------
1 | export interface Member {
2 | id: string;
3 | login: string;
4 | avatarUrl: string;
5 | }
6 |
--------------------------------------------------------------------------------
/00-base/05-async/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env"]
3 | }
4 |
--------------------------------------------------------------------------------
/00-base/05-async/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | indent_style = space
5 | indent_size = 2
6 | end_of_line = lf
7 | charset = utf-8
8 | trim_trailing_whitespace = true
9 | insert_final_newline = true
10 |
--------------------------------------------------------------------------------
/00-base/05-async/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/00-base/05-async/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true
5 | }
6 |
--------------------------------------------------------------------------------
/00-base/05-async/config/webpack/helpers.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 |
3 | const rootPath = path.resolve(__dirname, '../../');
4 |
5 | exports.resolveFromRootPath = (...args) => path.join(rootPath, ...args);
6 |
--------------------------------------------------------------------------------
/00-base/05-async/src/api-model.ts:
--------------------------------------------------------------------------------
1 | export interface Member {
2 | id: number;
3 | login: string;
4 | avatar_url: string;
5 | }
6 |
--------------------------------------------------------------------------------
/00-base/05-async/src/index.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import * as ReactDOM from 'react-dom';
3 | import { App } from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/00-base/05-async/src/view-model.ts:
--------------------------------------------------------------------------------
1 | export interface Member {
2 | id: string;
3 | login: string;
4 | avatarUrl: string;
5 | }
6 |
--------------------------------------------------------------------------------
/01-components/00-boilerplate/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env"]
3 | }
4 |
--------------------------------------------------------------------------------
/01-components/00-boilerplate/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/01-components/00-boilerplate/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true
5 | }
6 |
--------------------------------------------------------------------------------
/01-components/00-boilerplate/src/app.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 |
3 | export const App: React.FunctionComponent = props => (
4 |
5 |
Hello !
6 |
7 | );
8 |
--------------------------------------------------------------------------------
/01-components/00-boilerplate/src/index.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import * as ReactDOM from 'react-dom';
3 | import { App } from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/01-components/01-hello/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env"]
3 | }
4 |
--------------------------------------------------------------------------------
/01-components/01-hello/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/01-components/01-hello/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true,
5 | "setupFilesAfterEnv": ["/config/test/setup-after.ts"]
6 | }
7 |
--------------------------------------------------------------------------------
/01-components/01-hello/config/test/setup-after.ts:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom';
2 | import '@testing-library/jest-dom/extend-expect';
3 |
--------------------------------------------------------------------------------
/01-components/01-hello/config/webpack/helpers.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 |
3 | const rootPath = path.resolve(__dirname, '../../');
4 |
5 | exports.resolveFromRootPath = (...args) => path.join(rootPath, ...args);
6 |
--------------------------------------------------------------------------------
/01-components/01-hello/src/app.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 |
3 | export const App: React.FunctionComponent = props => (
4 |
5 |
Hello !
6 |
7 | );
8 |
--------------------------------------------------------------------------------
/01-components/01-hello/src/index.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import * as ReactDOM from 'react-dom';
3 | import { App } from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/01-components/02-name-edit/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env"]
3 | }
4 |
--------------------------------------------------------------------------------
/01-components/02-name-edit/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/01-components/02-name-edit/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true,
5 | "setupFilesAfterEnv": ["/config/test/setup-after.ts"]
6 | }
7 |
--------------------------------------------------------------------------------
/01-components/02-name-edit/config/test/setup-after.ts:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom';
2 | import '@testing-library/jest-dom/extend-expect';
3 |
--------------------------------------------------------------------------------
/01-components/02-name-edit/src/index.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import * as ReactDOM from 'react-dom';
3 | import { App } from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/01-components/03-integration/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env"]
3 | }
4 |
--------------------------------------------------------------------------------
/01-components/03-integration/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/01-components/03-integration/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true,
5 | "setupFilesAfterEnv": ["/config/test/setup-after.ts"]
6 | }
7 |
--------------------------------------------------------------------------------
/01-components/03-integration/config/test/setup-after.ts:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom';
2 | import '@testing-library/jest-dom/extend-expect';
3 |
--------------------------------------------------------------------------------
/01-components/03-integration/src/index.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import * as ReactDOM from 'react-dom';
3 | import { App } from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/01-components/04-fetch/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env"]
3 | }
4 |
--------------------------------------------------------------------------------
/01-components/04-fetch/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/01-components/04-fetch/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true,
5 | "setupFilesAfterEnv": ["/config/test/setup-after.ts"]
6 | }
7 |
--------------------------------------------------------------------------------
/01-components/04-fetch/config/test/setup-after.ts:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom';
2 | import '@testing-library/jest-dom/extend-expect';
3 |
--------------------------------------------------------------------------------
/01-components/04-fetch/config/webpack/helpers.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 |
3 | const rootPath = path.resolve(__dirname, '../../');
4 |
5 | exports.resolveFromRootPath = (...args) => path.join(rootPath, ...args);
6 |
--------------------------------------------------------------------------------
/01-components/04-fetch/src/index.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import * as ReactDOM from 'react-dom';
3 | import { App } from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/01-components/05-router/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env"]
3 | }
4 |
--------------------------------------------------------------------------------
/01-components/05-router/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/01-components/05-router/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true,
5 | "setupFilesAfterEnv": ["/config/test/setup-after.ts"]
6 | }
7 |
--------------------------------------------------------------------------------
/01-components/05-router/config/test/setup-after.ts:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom';
2 | import '@testing-library/jest-dom/extend-expect';
3 |
--------------------------------------------------------------------------------
/01-components/05-router/src/index.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import * as ReactDOM from 'react-dom';
3 | import { App } from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/01-components/06-material-ui/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env"]
3 | }
4 |
--------------------------------------------------------------------------------
/01-components/06-material-ui/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/01-components/06-material-ui/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true,
5 | "setupFilesAfterEnv": ["/config/test/setup-after.ts"]
6 | }
7 |
--------------------------------------------------------------------------------
/01-components/06-material-ui/config/test/setup-after.ts:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom';
2 | import '@testing-library/jest-dom/extend-expect';
3 |
--------------------------------------------------------------------------------
/01-components/06-material-ui/src/index.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import * as ReactDOM from 'react-dom';
3 | import { App } from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/02-hooks/00-boilerplate/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env"]
3 | }
4 |
--------------------------------------------------------------------------------
/02-hooks/00-boilerplate/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/02-hooks/00-boilerplate/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true,
5 | "setupFilesAfterEnv": ["/config/test/setup-after.ts"]
6 | }
7 |
--------------------------------------------------------------------------------
/02-hooks/00-boilerplate/config/test/setup-after.ts:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom';
2 | import '@testing-library/jest-dom/extend-expect';
3 |
--------------------------------------------------------------------------------
/02-hooks/00-boilerplate/src/index.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import * as ReactDOM from 'react-dom';
3 | import { App } from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/02-hooks/01-use-state/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env"]
3 | }
4 |
--------------------------------------------------------------------------------
/02-hooks/01-use-state/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/02-hooks/01-use-state/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true,
5 | "setupFilesAfterEnv": ["/config/test/setup-after.ts"]
6 | }
7 |
--------------------------------------------------------------------------------
/02-hooks/01-use-state/config/test/setup-after.ts:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom';
2 | import '@testing-library/jest-dom/extend-expect';
3 |
--------------------------------------------------------------------------------
/02-hooks/01-use-state/src/index.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import * as ReactDOM from 'react-dom';
3 | import { App } from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/02-hooks/02-use-state-object/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env"]
3 | }
4 |
--------------------------------------------------------------------------------
/02-hooks/02-use-state-object/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/02-hooks/02-use-state-object/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true,
5 | "setupFilesAfterEnv": ["/config/test/setup-after.ts"]
6 | }
7 |
--------------------------------------------------------------------------------
/02-hooks/02-use-state-object/config/test/setup-after.ts:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom';
2 | import '@testing-library/jest-dom/extend-expect';
3 |
--------------------------------------------------------------------------------
/02-hooks/02-use-state-object/src/index.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import * as ReactDOM from 'react-dom';
3 | import { App } from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/02-hooks/02-use-state-object/src/model.ts:
--------------------------------------------------------------------------------
1 | export interface User {
2 | name: string;
3 | surname: string;
4 | }
5 |
--------------------------------------------------------------------------------
/02-hooks/03-component-did-mount/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env"]
3 | }
4 |
--------------------------------------------------------------------------------
/02-hooks/03-component-did-mount/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/02-hooks/03-component-did-mount/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true,
5 | "setupFilesAfterEnv": ["/config/test/setup-after.ts"]
6 | }
7 |
--------------------------------------------------------------------------------
/02-hooks/03-component-did-mount/config/test/setup-after.ts:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom';
2 | import '@testing-library/jest-dom/extend-expect';
3 |
--------------------------------------------------------------------------------
/02-hooks/03-component-did-mount/src/model.ts:
--------------------------------------------------------------------------------
1 | export interface User {
2 | name: string;
3 | surname: string;
4 | }
5 |
--------------------------------------------------------------------------------
/02-hooks/04-component-did-update/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env"]
3 | }
4 |
--------------------------------------------------------------------------------
/02-hooks/04-component-did-update/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/02-hooks/04-component-did-update/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true,
5 | "setupFilesAfterEnv": ["/config/test/setup-after.ts"]
6 | }
7 |
--------------------------------------------------------------------------------
/02-hooks/04-component-did-update/config/test/setup-after.ts:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom';
2 | import '@testing-library/jest-dom/extend-expect';
3 |
--------------------------------------------------------------------------------
/02-hooks/04-component-did-update/src/model.ts:
--------------------------------------------------------------------------------
1 | export interface User {
2 | name: string;
3 | surname: string;
4 | }
5 |
--------------------------------------------------------------------------------
/02-hooks/05-component-unmount/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env"]
3 | }
4 |
--------------------------------------------------------------------------------
/02-hooks/05-component-unmount/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/02-hooks/05-component-unmount/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true,
5 | "setupFilesAfterEnv": ["/config/test/setup-after.ts"]
6 | }
7 |
--------------------------------------------------------------------------------
/02-hooks/05-component-unmount/config/test/setup-after.ts:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom';
2 | import '@testing-library/jest-dom/extend-expect';
3 |
--------------------------------------------------------------------------------
/02-hooks/05-component-unmount/src/index.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import * as ReactDOM from 'react-dom';
3 | import { App } from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/02-hooks/05-component-unmount/src/model.ts:
--------------------------------------------------------------------------------
1 | export interface User {
2 | name: string;
3 | surname: string;
4 | }
5 |
--------------------------------------------------------------------------------
/02-hooks/06-use-context/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env"]
3 | }
4 |
--------------------------------------------------------------------------------
/02-hooks/06-use-context/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/02-hooks/06-use-context/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true,
5 | "setupFilesAfterEnv": ["/config/test/setup-after.ts"]
6 | }
7 |
--------------------------------------------------------------------------------
/02-hooks/06-use-context/config/test/setup-after.ts:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom';
2 | import '@testing-library/jest-dom/extend-expect';
3 |
--------------------------------------------------------------------------------
/02-hooks/06-use-context/src/index.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import * as ReactDOM from 'react-dom';
3 | import { App } from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/02-hooks/06-use-context/src/model.ts:
--------------------------------------------------------------------------------
1 | export interface User {
2 | name: string;
3 | surname: string;
4 | }
5 |
--------------------------------------------------------------------------------
/03-redux/00-boilerplate/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | "@babel/preset-env"
4 | ],
5 | "plugins": [
6 | "react-hot-loader/babel"
7 | ]
8 | }
9 |
--------------------------------------------------------------------------------
/03-redux/00-boilerplate/.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 |
--------------------------------------------------------------------------------
/03-redux/00-boilerplate/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/03-redux/00-boilerplate/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true,
5 | "setupFilesAfterEnv": ["/config/test/setup-after.ts"]
6 | }
7 |
--------------------------------------------------------------------------------
/03-redux/00-boilerplate/config/test/setup-after.ts:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom';
2 | import '@testing-library/jest-dom/extend-expect';
3 |
--------------------------------------------------------------------------------
/03-redux/00-boilerplate/src/app.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 |
3 | export const App: React.FunctionComponent = (props) => (
4 | {props.children}
5 | );
6 |
--------------------------------------------------------------------------------
/03-redux/00-boilerplate/src/common/constants/routes/index.ts:
--------------------------------------------------------------------------------
1 | export const routes = {
2 | default: '/',
3 | };
4 |
--------------------------------------------------------------------------------
/03-redux/00-boilerplate/src/common/types.ts:
--------------------------------------------------------------------------------
1 | import { Action } from 'redux';
2 |
3 | export interface BaseAction extends Action {
4 | payload: P;
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/00-boilerplate/src/history.ts:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/03-redux/00-boilerplate/src/pages/index.ts:
--------------------------------------------------------------------------------
1 | export * from './members';
2 | export * from './reducers';
3 | export * from './sagas';
4 |
--------------------------------------------------------------------------------
/03-redux/00-boilerplate/src/pages/members/index.ts:
--------------------------------------------------------------------------------
1 | export * from './list';
2 |
--------------------------------------------------------------------------------
/03-redux/00-boilerplate/src/pages/members/list/components/index.ts:
--------------------------------------------------------------------------------
1 | export * from './table';
2 |
--------------------------------------------------------------------------------
/03-redux/00-boilerplate/src/pages/members/list/index.ts:
--------------------------------------------------------------------------------
1 | export * from './pageContainer';
2 | export * from './reducers';
3 | export * from './sagas';
4 |
--------------------------------------------------------------------------------
/03-redux/00-boilerplate/src/pages/members/list/reducers/index.ts:
--------------------------------------------------------------------------------
1 | export * from './members';
2 |
--------------------------------------------------------------------------------
/03-redux/00-boilerplate/src/pages/members/list/viewModel.ts:
--------------------------------------------------------------------------------
1 | export interface Member {
2 | id: number;
3 | name: string;
4 | avatarUrl: string;
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/00-boilerplate/src/rest-api/model/index.ts:
--------------------------------------------------------------------------------
1 | export * from './member';
2 |
--------------------------------------------------------------------------------
/03-redux/00-boilerplate/src/rest-api/model/member.ts:
--------------------------------------------------------------------------------
1 | export interface Member {
2 | id: number;
3 | login: string;
4 | avatar_url: string;
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/01-actions/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | "@babel/preset-env"
4 | ],
5 | "plugins": [
6 | "react-hot-loader/babel"
7 | ]
8 | }
9 |
--------------------------------------------------------------------------------
/03-redux/01-actions/.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 |
--------------------------------------------------------------------------------
/03-redux/01-actions/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/03-redux/01-actions/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true,
5 | "setupFilesAfterEnv": ["/config/test/setup-after.ts"]
6 | }
7 |
--------------------------------------------------------------------------------
/03-redux/01-actions/config/test/setup-after.ts:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom';
2 | import '@testing-library/jest-dom/extend-expect';
3 |
--------------------------------------------------------------------------------
/03-redux/01-actions/config/webpack/helpers.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 |
3 | const rootPath = path.resolve(__dirname, '../../');
4 |
5 | exports.resolveFromRootPath = (...args) => path.join(rootPath, ...args);
6 |
--------------------------------------------------------------------------------
/03-redux/01-actions/src/app.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 |
3 | export const App: React.FunctionComponent = (props) => (
4 | {props.children}
5 | );
6 |
--------------------------------------------------------------------------------
/03-redux/01-actions/src/common/constants/routes/index.ts:
--------------------------------------------------------------------------------
1 | export const routes = {
2 | default: '/',
3 | };
4 |
--------------------------------------------------------------------------------
/03-redux/01-actions/src/common/types.ts:
--------------------------------------------------------------------------------
1 | import { Action } from 'redux';
2 |
3 | export interface BaseAction extends Action {
4 | payload: P;
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/01-actions/src/history.ts:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/03-redux/01-actions/src/pages/index.ts:
--------------------------------------------------------------------------------
1 | export * from './members';
2 | export * from './reducers';
3 | export * from './sagas';
4 |
--------------------------------------------------------------------------------
/03-redux/01-actions/src/pages/members/index.ts:
--------------------------------------------------------------------------------
1 | export * from './list';
2 |
--------------------------------------------------------------------------------
/03-redux/01-actions/src/pages/members/list/components/index.ts:
--------------------------------------------------------------------------------
1 | export * from './table';
2 |
--------------------------------------------------------------------------------
/03-redux/01-actions/src/pages/members/list/index.ts:
--------------------------------------------------------------------------------
1 | export * from './pageContainer';
2 | export * from './reducers';
3 | export * from './sagas';
4 |
--------------------------------------------------------------------------------
/03-redux/01-actions/src/pages/members/list/reducers/index.ts:
--------------------------------------------------------------------------------
1 | export * from './members';
2 |
--------------------------------------------------------------------------------
/03-redux/01-actions/src/pages/members/list/sagas/index.ts:
--------------------------------------------------------------------------------
1 | import { watchFetchMembersRequest } from './fetchMembersSaga';
2 |
3 | export function* membersRootSaga() {
4 | yield watchFetchMembersRequest();
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/01-actions/src/pages/members/list/viewModel.ts:
--------------------------------------------------------------------------------
1 | export interface Member {
2 | id: number;
3 | name: string;
4 | avatarUrl: string;
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/01-actions/src/pages/sagas.ts:
--------------------------------------------------------------------------------
1 | import { all } from 'redux-saga/effects';
2 | import { membersRootSaga } from './members';
3 |
4 | export function* rootSaga() {
5 | yield all([membersRootSaga()]);
6 | }
7 |
--------------------------------------------------------------------------------
/03-redux/01-actions/src/rest-api/model/index.ts:
--------------------------------------------------------------------------------
1 | export * from './member';
2 |
--------------------------------------------------------------------------------
/03-redux/01-actions/src/rest-api/model/member.ts:
--------------------------------------------------------------------------------
1 | export interface Member {
2 | id: number;
3 | login: string;
4 | avatar_url: string;
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/02-reducers/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | "@babel/preset-env"
4 | ],
5 | "plugins": [
6 | "react-hot-loader/babel"
7 | ]
8 | }
9 |
--------------------------------------------------------------------------------
/03-redux/02-reducers/.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 |
--------------------------------------------------------------------------------
/03-redux/02-reducers/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/03-redux/02-reducers/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true,
5 | "setupFilesAfterEnv": ["/config/test/setup-after.ts"]
6 | }
7 |
--------------------------------------------------------------------------------
/03-redux/02-reducers/config/test/setup-after.ts:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom';
2 | import '@testing-library/jest-dom/extend-expect';
3 |
--------------------------------------------------------------------------------
/03-redux/02-reducers/config/webpack/helpers.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 |
3 | const rootPath = path.resolve(__dirname, '../../');
4 |
5 | exports.resolveFromRootPath = (...args) => path.join(rootPath, ...args);
6 |
--------------------------------------------------------------------------------
/03-redux/02-reducers/src/app.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 |
3 | export const App: React.FunctionComponent = (props) => (
4 | {props.children}
5 | );
6 |
--------------------------------------------------------------------------------
/03-redux/02-reducers/src/common/constants/routes/index.ts:
--------------------------------------------------------------------------------
1 | export const routes = {
2 | default: '/',
3 | };
4 |
--------------------------------------------------------------------------------
/03-redux/02-reducers/src/common/types.ts:
--------------------------------------------------------------------------------
1 | import { Action } from 'redux';
2 |
3 | export interface BaseAction extends Action {
4 | payload: P;
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/02-reducers/src/history.ts:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/03-redux/02-reducers/src/pages/index.ts:
--------------------------------------------------------------------------------
1 | export * from './members';
2 | export * from './reducers';
3 | export * from './sagas';
4 |
--------------------------------------------------------------------------------
/03-redux/02-reducers/src/pages/members/index.ts:
--------------------------------------------------------------------------------
1 | export * from './list';
2 |
--------------------------------------------------------------------------------
/03-redux/02-reducers/src/pages/members/list/components/index.ts:
--------------------------------------------------------------------------------
1 | export * from './table';
2 |
--------------------------------------------------------------------------------
/03-redux/02-reducers/src/pages/members/list/index.ts:
--------------------------------------------------------------------------------
1 | export * from './pageContainer';
2 | export * from './reducers';
3 | export * from './sagas';
4 |
--------------------------------------------------------------------------------
/03-redux/02-reducers/src/pages/members/list/reducers/index.ts:
--------------------------------------------------------------------------------
1 | export * from './members';
2 |
--------------------------------------------------------------------------------
/03-redux/02-reducers/src/pages/members/list/sagas/index.ts:
--------------------------------------------------------------------------------
1 | import { watchFetchMembersRequest } from './fetchMembersSaga';
2 |
3 | export function* membersRootSaga() {
4 | yield watchFetchMembersRequest();
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/02-reducers/src/pages/members/list/viewModel.ts:
--------------------------------------------------------------------------------
1 | export interface Member {
2 | id: number;
3 | name: string;
4 | avatarUrl: string;
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/02-reducers/src/pages/sagas.ts:
--------------------------------------------------------------------------------
1 | import { all } from 'redux-saga/effects';
2 | import { membersRootSaga } from './members';
3 |
4 | export function* rootSaga() {
5 | yield all([membersRootSaga()]);
6 | }
7 |
--------------------------------------------------------------------------------
/03-redux/02-reducers/src/rest-api/model/index.ts:
--------------------------------------------------------------------------------
1 | export * from './member';
2 |
--------------------------------------------------------------------------------
/03-redux/02-reducers/src/rest-api/model/member.ts:
--------------------------------------------------------------------------------
1 | export interface Member {
2 | id: number;
3 | login: string;
4 | avatar_url: string;
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/03-sagas/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | "@babel/preset-env"
4 | ],
5 | "plugins": [
6 | "react-hot-loader/babel"
7 | ]
8 | }
9 |
--------------------------------------------------------------------------------
/03-redux/03-sagas/.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 |
--------------------------------------------------------------------------------
/03-redux/03-sagas/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/03-redux/03-sagas/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true,
5 | "setupFilesAfterEnv": ["/config/test/setup-after.ts"]
6 | }
7 |
--------------------------------------------------------------------------------
/03-redux/03-sagas/config/test/setup-after.ts:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom';
2 | import '@testing-library/jest-dom/extend-expect';
3 |
--------------------------------------------------------------------------------
/03-redux/03-sagas/config/webpack/helpers.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 |
3 | const rootPath = path.resolve(__dirname, '../../');
4 |
5 | exports.resolveFromRootPath = (...args) => path.join(rootPath, ...args);
6 |
--------------------------------------------------------------------------------
/03-redux/03-sagas/src/app.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 |
3 | export const App: React.FunctionComponent = (props) => (
4 | {props.children}
5 | );
6 |
--------------------------------------------------------------------------------
/03-redux/03-sagas/src/common/constants/routes/index.ts:
--------------------------------------------------------------------------------
1 | export const routes = {
2 | default: '/',
3 | };
4 |
--------------------------------------------------------------------------------
/03-redux/03-sagas/src/common/test/index.ts:
--------------------------------------------------------------------------------
1 | export { getDispatchedActionsFromSaga } from './getDispatchedActionsFromSaga';
2 |
--------------------------------------------------------------------------------
/03-redux/03-sagas/src/common/types.ts:
--------------------------------------------------------------------------------
1 | import { Action } from 'redux';
2 |
3 | export interface BaseAction extends Action {
4 | payload: P;
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/03-sagas/src/history.ts:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/03-redux/03-sagas/src/pages/index.ts:
--------------------------------------------------------------------------------
1 | export * from './members';
2 | export * from './reducers';
3 | export * from './sagas';
4 |
--------------------------------------------------------------------------------
/03-redux/03-sagas/src/pages/members/index.ts:
--------------------------------------------------------------------------------
1 | export * from './list';
2 |
--------------------------------------------------------------------------------
/03-redux/03-sagas/src/pages/members/list/components/index.ts:
--------------------------------------------------------------------------------
1 | export * from './table';
2 |
--------------------------------------------------------------------------------
/03-redux/03-sagas/src/pages/members/list/index.ts:
--------------------------------------------------------------------------------
1 | export * from './pageContainer';
2 | export * from './reducers';
3 | export * from './sagas';
4 |
--------------------------------------------------------------------------------
/03-redux/03-sagas/src/pages/members/list/reducers/index.ts:
--------------------------------------------------------------------------------
1 | export * from './members';
2 |
--------------------------------------------------------------------------------
/03-redux/03-sagas/src/pages/members/list/sagas/index.ts:
--------------------------------------------------------------------------------
1 | import { watchFetchMembersRequest } from './fetchMembersSaga';
2 |
3 | export function* membersRootSaga() {
4 | yield watchFetchMembersRequest();
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/03-sagas/src/pages/members/list/viewModel.ts:
--------------------------------------------------------------------------------
1 | export interface Member {
2 | id: number;
3 | name: string;
4 | avatarUrl: string;
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/03-sagas/src/pages/sagas.ts:
--------------------------------------------------------------------------------
1 | import { membersRootSaga } from './members';
2 |
3 | export function* rootSaga() {
4 | yield membersRootSaga();
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/03-sagas/src/rest-api/model/index.ts:
--------------------------------------------------------------------------------
1 | export * from './member';
2 |
--------------------------------------------------------------------------------
/03-redux/03-sagas/src/rest-api/model/member.ts:
--------------------------------------------------------------------------------
1 | export interface Member {
2 | id: number;
3 | login: string;
4 | avatar_url: string;
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/04-selectors/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | "@babel/preset-env"
4 | ],
5 | "plugins": [
6 | "react-hot-loader/babel"
7 | ]
8 | }
9 |
--------------------------------------------------------------------------------
/03-redux/04-selectors/.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 |
--------------------------------------------------------------------------------
/03-redux/04-selectors/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/03-redux/04-selectors/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true,
5 | "setupFilesAfterEnv": ["/config/test/setup-after.ts"]
6 | }
7 |
--------------------------------------------------------------------------------
/03-redux/04-selectors/config/test/setup-after.ts:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom';
2 | import '@testing-library/jest-dom/extend-expect';
3 |
--------------------------------------------------------------------------------
/03-redux/04-selectors/src/app.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 |
3 | export const App: React.FunctionComponent = (props) => (
4 | {props.children}
5 | );
6 |
--------------------------------------------------------------------------------
/03-redux/04-selectors/src/common/constants/routes/index.ts:
--------------------------------------------------------------------------------
1 | export const routes = {
2 | default: '/',
3 | };
4 |
--------------------------------------------------------------------------------
/03-redux/04-selectors/src/common/test/index.ts:
--------------------------------------------------------------------------------
1 | export { getDispatchedActionsFromSaga } from './getDispatchedActionsFromSaga';
2 |
--------------------------------------------------------------------------------
/03-redux/04-selectors/src/common/types.ts:
--------------------------------------------------------------------------------
1 | import { Action } from 'redux';
2 |
3 | export interface BaseAction extends Action {
4 | payload: P;
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/04-selectors/src/history.ts:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/03-redux/04-selectors/src/pages/index.ts:
--------------------------------------------------------------------------------
1 | export * from './members';
2 | export * from './reducers';
3 | export * from './sagas';
4 |
--------------------------------------------------------------------------------
/03-redux/04-selectors/src/pages/members/index.ts:
--------------------------------------------------------------------------------
1 | export * from './list';
2 |
--------------------------------------------------------------------------------
/03-redux/04-selectors/src/pages/members/list/components/index.ts:
--------------------------------------------------------------------------------
1 | export * from './table';
2 |
--------------------------------------------------------------------------------
/03-redux/04-selectors/src/pages/members/list/index.ts:
--------------------------------------------------------------------------------
1 | export * from './pageContainer';
2 | export * from './reducers';
3 | export * from './sagas';
4 |
--------------------------------------------------------------------------------
/03-redux/04-selectors/src/pages/members/list/reducers/index.ts:
--------------------------------------------------------------------------------
1 | export * from './members';
2 |
--------------------------------------------------------------------------------
/03-redux/04-selectors/src/pages/members/list/sagas/index.ts:
--------------------------------------------------------------------------------
1 | import { watchFetchMembersRequest } from './fetchMembersSaga';
2 |
3 | export function* membersRootSaga() {
4 | yield watchFetchMembersRequest();
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/04-selectors/src/pages/members/list/viewModel.ts:
--------------------------------------------------------------------------------
1 | export interface Member {
2 | id: number;
3 | name: string;
4 | avatarUrl: string;
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/04-selectors/src/pages/sagas.ts:
--------------------------------------------------------------------------------
1 | import { membersRootSaga } from './members';
2 |
3 | export function* rootSaga() {
4 | yield membersRootSaga();
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/04-selectors/src/rest-api/model/index.ts:
--------------------------------------------------------------------------------
1 | export * from './member';
2 |
--------------------------------------------------------------------------------
/03-redux/04-selectors/src/rest-api/model/member.ts:
--------------------------------------------------------------------------------
1 | export interface Member {
2 | id: number;
3 | login: string;
4 | avatar_url: string;
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/05-containers/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | "@babel/preset-env"
4 | ],
5 | "plugins": [
6 | "react-hot-loader/babel"
7 | ]
8 | }
9 |
--------------------------------------------------------------------------------
/03-redux/05-containers/.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 |
--------------------------------------------------------------------------------
/03-redux/05-containers/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/03-redux/05-containers/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true,
5 | "setupFilesAfterEnv": ["/config/test/setup-after.ts"]
6 | }
7 |
--------------------------------------------------------------------------------
/03-redux/05-containers/config/test/setup-after.ts:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom';
2 | import '@testing-library/jest-dom/extend-expect';
3 |
--------------------------------------------------------------------------------
/03-redux/05-containers/src/app.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 |
3 | export const App: React.FunctionComponent = (props) => (
4 | {props.children}
5 | );
6 |
--------------------------------------------------------------------------------
/03-redux/05-containers/src/common/constants/routes/index.ts:
--------------------------------------------------------------------------------
1 | export const routes = {
2 | default: '/',
3 | };
4 |
--------------------------------------------------------------------------------
/03-redux/05-containers/src/common/test/index.ts:
--------------------------------------------------------------------------------
1 | export { getDispatchedActionsFromSaga } from './getDispatchedActionsFromSaga';
2 |
--------------------------------------------------------------------------------
/03-redux/05-containers/src/common/types.ts:
--------------------------------------------------------------------------------
1 | import { Action } from 'redux';
2 |
3 | export interface BaseAction extends Action {
4 | payload: P;
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/05-containers/src/history.ts:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/03-redux/05-containers/src/pages/index.ts:
--------------------------------------------------------------------------------
1 | export * from './members';
2 | export * from './reducers';
3 | export * from './sagas';
4 |
--------------------------------------------------------------------------------
/03-redux/05-containers/src/pages/members/index.ts:
--------------------------------------------------------------------------------
1 | export * from './list';
2 |
--------------------------------------------------------------------------------
/03-redux/05-containers/src/pages/members/list/components/index.ts:
--------------------------------------------------------------------------------
1 | export * from './table';
2 |
--------------------------------------------------------------------------------
/03-redux/05-containers/src/pages/members/list/index.ts:
--------------------------------------------------------------------------------
1 | export * from './pageContainer';
2 | export * from './reducers';
3 | export * from './sagas';
4 |
--------------------------------------------------------------------------------
/03-redux/05-containers/src/pages/members/list/reducers/index.ts:
--------------------------------------------------------------------------------
1 | export * from './members';
2 |
--------------------------------------------------------------------------------
/03-redux/05-containers/src/pages/members/list/viewModel.ts:
--------------------------------------------------------------------------------
1 | export interface Member {
2 | id: number;
3 | name: string;
4 | avatarUrl: string;
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/05-containers/src/pages/sagas.ts:
--------------------------------------------------------------------------------
1 | import { membersRootSaga } from './members';
2 |
3 | export function* rootSaga() {
4 | yield membersRootSaga();
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/05-containers/src/rest-api/model/index.ts:
--------------------------------------------------------------------------------
1 | export * from './member';
2 |
--------------------------------------------------------------------------------
/03-redux/05-containers/src/rest-api/model/member.ts:
--------------------------------------------------------------------------------
1 | export interface Member {
2 | id: number;
3 | login: string;
4 | avatar_url: string;
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/06-containers-hooks/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | "@babel/preset-env"
4 | ],
5 | "plugins": [
6 | "react-hot-loader/babel"
7 | ]
8 | }
9 |
--------------------------------------------------------------------------------
/03-redux/06-containers-hooks/.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 |
--------------------------------------------------------------------------------
/03-redux/06-containers-hooks/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/03-redux/06-containers-hooks/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true,
5 | "setupFilesAfterEnv": ["/config/test/setup-after.ts"]
6 | }
7 |
--------------------------------------------------------------------------------
/03-redux/06-containers-hooks/config/test/setup-after.ts:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom';
2 | import '@testing-library/jest-dom/extend-expect';
3 |
--------------------------------------------------------------------------------
/03-redux/06-containers-hooks/src/app.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 |
3 | export const App: React.FunctionComponent = (props) => (
4 | {props.children}
5 | );
6 |
--------------------------------------------------------------------------------
/03-redux/06-containers-hooks/src/common/constants/routes/index.ts:
--------------------------------------------------------------------------------
1 | export const routes = {
2 | default: '/',
3 | };
4 |
--------------------------------------------------------------------------------
/03-redux/06-containers-hooks/src/common/test/index.ts:
--------------------------------------------------------------------------------
1 | export { getDispatchedActionsFromSaga } from './getDispatchedActionsFromSaga';
2 |
--------------------------------------------------------------------------------
/03-redux/06-containers-hooks/src/common/types.ts:
--------------------------------------------------------------------------------
1 | import { Action } from 'redux';
2 |
3 | export interface BaseAction extends Action {
4 | payload: P;
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/06-containers-hooks/src/history.ts:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/03-redux/06-containers-hooks/src/pages/index.ts:
--------------------------------------------------------------------------------
1 | export * from './members';
2 | export * from './reducers';
3 | export * from './sagas';
4 |
--------------------------------------------------------------------------------
/03-redux/06-containers-hooks/src/pages/members/index.ts:
--------------------------------------------------------------------------------
1 | export * from './list';
2 |
--------------------------------------------------------------------------------
/03-redux/06-containers-hooks/src/pages/members/list/components/index.ts:
--------------------------------------------------------------------------------
1 | export * from './table';
2 |
--------------------------------------------------------------------------------
/03-redux/06-containers-hooks/src/pages/members/list/index.ts:
--------------------------------------------------------------------------------
1 | export * from './pageContainer';
2 | export * from './reducers';
3 | export * from './sagas';
4 |
--------------------------------------------------------------------------------
/03-redux/06-containers-hooks/src/pages/members/list/reducers/index.ts:
--------------------------------------------------------------------------------
1 | export * from './members';
2 |
--------------------------------------------------------------------------------
/03-redux/06-containers-hooks/src/pages/members/list/viewModel.ts:
--------------------------------------------------------------------------------
1 | export interface Member {
2 | id: number;
3 | name: string;
4 | avatarUrl: string;
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/06-containers-hooks/src/pages/sagas.ts:
--------------------------------------------------------------------------------
1 | import { membersRootSaga } from './members';
2 |
3 | export function* rootSaga() {
4 | yield membersRootSaga();
5 | }
6 |
--------------------------------------------------------------------------------
/03-redux/06-containers-hooks/src/rest-api/model/index.ts:
--------------------------------------------------------------------------------
1 | export * from './member';
2 |
--------------------------------------------------------------------------------
/03-redux/06-containers-hooks/src/rest-api/model/member.ts:
--------------------------------------------------------------------------------
1 | export interface Member {
2 | id: number;
3 | login: string;
4 | avatar_url: string;
5 | }
6 |
--------------------------------------------------------------------------------
/04-ci/01-coverage/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | "@babel/preset-env"
4 | ],
5 | "plugins": [
6 | "react-hot-loader/babel"
7 | ]
8 | }
9 |
--------------------------------------------------------------------------------
/04-ci/01-coverage/.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 |
--------------------------------------------------------------------------------
/04-ci/01-coverage/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/04-ci/01-coverage/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true,
5 | "setupFilesAfterEnv": ["/config/test/setup-after.ts"]
6 | }
7 |
--------------------------------------------------------------------------------
/04-ci/01-coverage/config/test/setup-after.ts:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom';
2 | import '@testing-library/jest-dom/extend-expect';
3 |
--------------------------------------------------------------------------------
/04-ci/01-coverage/config/webpack/helpers.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 |
3 | const rootPath = path.resolve(__dirname, '../../');
4 |
5 | exports.resolveFromRootPath = (...args) => path.join(rootPath, ...args);
6 |
--------------------------------------------------------------------------------
/04-ci/01-coverage/src/app.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 |
3 | export const App: React.FunctionComponent = (props) => (
4 | {props.children}
5 | );
6 |
--------------------------------------------------------------------------------
/04-ci/01-coverage/src/common/constants/routes/index.ts:
--------------------------------------------------------------------------------
1 | export const routes = {
2 | default: '/',
3 | };
4 |
--------------------------------------------------------------------------------
/04-ci/01-coverage/src/common/test/index.ts:
--------------------------------------------------------------------------------
1 | export { getDispatchedActionsFromSaga } from './getDispatchedActionsFromSaga';
2 |
--------------------------------------------------------------------------------
/04-ci/01-coverage/src/common/types.ts:
--------------------------------------------------------------------------------
1 | import { Action } from 'redux';
2 |
3 | export interface BaseAction extends Action {
4 | payload: P;
5 | }
6 |
--------------------------------------------------------------------------------
/04-ci/01-coverage/src/history.ts:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/04-ci/01-coverage/src/pages/index.ts:
--------------------------------------------------------------------------------
1 | export * from './members';
2 | export * from './reducers';
3 | export * from './sagas';
4 |
--------------------------------------------------------------------------------
/04-ci/01-coverage/src/pages/members/index.ts:
--------------------------------------------------------------------------------
1 | export * from './list';
2 |
--------------------------------------------------------------------------------
/04-ci/01-coverage/src/pages/members/list/components/index.ts:
--------------------------------------------------------------------------------
1 | export * from './table';
2 |
--------------------------------------------------------------------------------
/04-ci/01-coverage/src/pages/members/list/index.ts:
--------------------------------------------------------------------------------
1 | export * from './pageContainer';
2 | export * from './reducers';
3 | export * from './sagas';
4 |
--------------------------------------------------------------------------------
/04-ci/01-coverage/src/pages/members/list/reducers/index.ts:
--------------------------------------------------------------------------------
1 | export * from './members';
2 |
--------------------------------------------------------------------------------
/04-ci/01-coverage/src/pages/members/list/sagas/index.ts:
--------------------------------------------------------------------------------
1 | import { watchFetchMembersRequest } from './fetchMembersSaga';
2 |
3 | export function* membersRootSaga() {
4 | yield watchFetchMembersRequest();
5 | }
6 |
--------------------------------------------------------------------------------
/04-ci/01-coverage/src/pages/members/list/viewModel.ts:
--------------------------------------------------------------------------------
1 | export interface Member {
2 | id: number;
3 | name: string;
4 | avatarUrl: string;
5 | }
6 |
--------------------------------------------------------------------------------
/04-ci/01-coverage/src/pages/sagas.ts:
--------------------------------------------------------------------------------
1 | import { membersRootSaga } from './members';
2 |
3 | export function* rootSaga() {
4 | yield membersRootSaga();
5 | }
6 |
--------------------------------------------------------------------------------
/04-ci/01-coverage/src/rest-api/model/index.ts:
--------------------------------------------------------------------------------
1 | export * from './member';
2 |
--------------------------------------------------------------------------------
/04-ci/01-coverage/src/rest-api/model/member.ts:
--------------------------------------------------------------------------------
1 | export interface Member {
2 | id: number;
3 | login: string;
4 | avatar_url: string;
5 | }
6 |
--------------------------------------------------------------------------------
/04-ci/02-travis-ci/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | "@babel/preset-env"
4 | ],
5 | "plugins": [
6 | "react-hot-loader/babel"
7 | ]
8 | }
9 |
--------------------------------------------------------------------------------
/04-ci/02-travis-ci/.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 |
--------------------------------------------------------------------------------
/04-ci/02-travis-ci/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/04-ci/02-travis-ci/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | node_js:
3 | - "10"
4 | install:
5 | - npm install
6 | script:
7 | - npm test
8 |
--------------------------------------------------------------------------------
/04-ci/02-travis-ci/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true,
5 | "setupFilesAfterEnv": ["/config/test/setup-after.ts"]
6 | }
7 |
--------------------------------------------------------------------------------
/04-ci/02-travis-ci/config/test/setup-after.ts:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom';
2 | import '@testing-library/jest-dom/extend-expect';
3 |
--------------------------------------------------------------------------------
/04-ci/02-travis-ci/config/webpack/helpers.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 |
3 | const rootPath = path.resolve(__dirname, '../../');
4 |
5 | exports.resolveFromRootPath = (...args) => path.join(rootPath, ...args);
6 |
--------------------------------------------------------------------------------
/04-ci/02-travis-ci/src/app.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 |
3 | export const App: React.FunctionComponent = (props) => (
4 | {props.children}
5 | );
6 |
--------------------------------------------------------------------------------
/04-ci/02-travis-ci/src/common/constants/routes/index.ts:
--------------------------------------------------------------------------------
1 | export const routes = {
2 | default: '/',
3 | };
4 |
--------------------------------------------------------------------------------
/04-ci/02-travis-ci/src/common/test/index.ts:
--------------------------------------------------------------------------------
1 | export { getDispatchedActionsFromSaga } from './getDispatchedActionsFromSaga';
2 |
--------------------------------------------------------------------------------
/04-ci/02-travis-ci/src/common/types.ts:
--------------------------------------------------------------------------------
1 | import { Action } from 'redux';
2 |
3 | export interface BaseAction extends Action {
4 | payload: P;
5 | }
6 |
--------------------------------------------------------------------------------
/04-ci/02-travis-ci/src/history.ts:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/04-ci/02-travis-ci/src/pages/index.ts:
--------------------------------------------------------------------------------
1 | export * from './members';
2 | export * from './reducers';
3 | export * from './sagas';
4 |
--------------------------------------------------------------------------------
/04-ci/02-travis-ci/src/pages/members/index.ts:
--------------------------------------------------------------------------------
1 | export * from './list';
2 |
--------------------------------------------------------------------------------
/04-ci/02-travis-ci/src/pages/members/list/components/index.ts:
--------------------------------------------------------------------------------
1 | export * from './table';
2 |
--------------------------------------------------------------------------------
/04-ci/02-travis-ci/src/pages/members/list/index.ts:
--------------------------------------------------------------------------------
1 | export * from './pageContainer';
2 | export * from './reducers';
3 | export * from './sagas';
4 |
--------------------------------------------------------------------------------
/04-ci/02-travis-ci/src/pages/members/list/reducers/index.ts:
--------------------------------------------------------------------------------
1 | export * from './members';
2 |
--------------------------------------------------------------------------------
/04-ci/02-travis-ci/src/pages/members/list/sagas/index.ts:
--------------------------------------------------------------------------------
1 | import { watchFetchMembersRequest } from './fetchMembersSaga';
2 |
3 | export function* membersRootSaga() {
4 | yield watchFetchMembersRequest();
5 | }
6 |
--------------------------------------------------------------------------------
/04-ci/02-travis-ci/src/pages/members/list/viewModel.ts:
--------------------------------------------------------------------------------
1 | export interface Member {
2 | id: number;
3 | name: string;
4 | avatarUrl: string;
5 | }
6 |
--------------------------------------------------------------------------------
/04-ci/02-travis-ci/src/pages/sagas.ts:
--------------------------------------------------------------------------------
1 | import { membersRootSaga } from './members';
2 |
3 | export function* rootSaga() {
4 | yield membersRootSaga();
5 | }
6 |
--------------------------------------------------------------------------------
/04-ci/02-travis-ci/src/rest-api/model/index.ts:
--------------------------------------------------------------------------------
1 | export * from './member';
2 |
--------------------------------------------------------------------------------
/04-ci/02-travis-ci/src/rest-api/model/member.ts:
--------------------------------------------------------------------------------
1 | export interface Member {
2 | id: number;
3 | login: string;
4 | avatar_url: string;
5 | }
6 |
--------------------------------------------------------------------------------
/04-ci/03-circle-ci/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | "@babel/preset-env"
4 | ],
5 | "plugins": [
6 | "react-hot-loader/babel"
7 | ]
8 | }
9 |
--------------------------------------------------------------------------------
/04-ci/03-circle-ci/.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 |
--------------------------------------------------------------------------------
/04-ci/03-circle-ci/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/04-ci/03-circle-ci/config/test/jest.json:
--------------------------------------------------------------------------------
1 | {
2 | "rootDir": "../../",
3 | "preset": "ts-jest",
4 | "restoreMocks": true,
5 | "setupFilesAfterEnv": ["/config/test/setup-after.ts"]
6 | }
7 |
--------------------------------------------------------------------------------
/04-ci/03-circle-ci/config/test/setup-after.ts:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom';
2 | import '@testing-library/jest-dom/extend-expect';
3 |
--------------------------------------------------------------------------------
/04-ci/03-circle-ci/config/webpack/helpers.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 |
3 | const rootPath = path.resolve(__dirname, '../../');
4 |
5 | exports.resolveFromRootPath = (...args) => path.join(rootPath, ...args);
6 |
--------------------------------------------------------------------------------
/04-ci/03-circle-ci/src/app.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 |
3 | export const App: React.FunctionComponent = (props) => (
4 | {props.children}
5 | );
6 |
--------------------------------------------------------------------------------
/04-ci/03-circle-ci/src/common/constants/routes/index.ts:
--------------------------------------------------------------------------------
1 | export const routes = {
2 | default: '/',
3 | };
4 |
--------------------------------------------------------------------------------
/04-ci/03-circle-ci/src/common/test/index.ts:
--------------------------------------------------------------------------------
1 | export { getDispatchedActionsFromSaga } from './getDispatchedActionsFromSaga';
2 |
--------------------------------------------------------------------------------
/04-ci/03-circle-ci/src/common/types.ts:
--------------------------------------------------------------------------------
1 | import { Action } from 'redux';
2 |
3 | export interface BaseAction extends Action {
4 | payload: P;
5 | }
6 |
--------------------------------------------------------------------------------
/04-ci/03-circle-ci/src/history.ts:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/04-ci/03-circle-ci/src/pages/index.ts:
--------------------------------------------------------------------------------
1 | export * from './members';
2 | export * from './reducers';
3 | export * from './sagas';
4 |
--------------------------------------------------------------------------------
/04-ci/03-circle-ci/src/pages/members/index.ts:
--------------------------------------------------------------------------------
1 | export * from './list';
2 |
--------------------------------------------------------------------------------
/04-ci/03-circle-ci/src/pages/members/list/components/index.ts:
--------------------------------------------------------------------------------
1 | export * from './table';
2 |
--------------------------------------------------------------------------------
/04-ci/03-circle-ci/src/pages/members/list/index.ts:
--------------------------------------------------------------------------------
1 | export * from './pageContainer';
2 | export * from './reducers';
3 | export * from './sagas';
4 |
--------------------------------------------------------------------------------
/04-ci/03-circle-ci/src/pages/members/list/reducers/index.ts:
--------------------------------------------------------------------------------
1 | export * from './members';
2 |
--------------------------------------------------------------------------------
/04-ci/03-circle-ci/src/pages/members/list/sagas/index.ts:
--------------------------------------------------------------------------------
1 | import { watchFetchMembersRequest } from './fetchMembersSaga';
2 |
3 | export function* membersRootSaga() {
4 | yield watchFetchMembersRequest();
5 | }
6 |
--------------------------------------------------------------------------------
/04-ci/03-circle-ci/src/pages/members/list/viewModel.ts:
--------------------------------------------------------------------------------
1 | export interface Member {
2 | id: number;
3 | name: string;
4 | avatarUrl: string;
5 | }
6 |
--------------------------------------------------------------------------------
/04-ci/03-circle-ci/src/pages/sagas.ts:
--------------------------------------------------------------------------------
1 | import { membersRootSaga } from './members';
2 |
3 | export function* rootSaga() {
4 | yield membersRootSaga();
5 | }
6 |
--------------------------------------------------------------------------------
/04-ci/03-circle-ci/src/rest-api/model/index.ts:
--------------------------------------------------------------------------------
1 | export * from './member';
2 |
--------------------------------------------------------------------------------
/04-ci/03-circle-ci/src/rest-api/model/member.ts:
--------------------------------------------------------------------------------
1 | export interface Member {
2 | id: number;
3 | login: string;
4 | avatar_url: string;
5 | }
6 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/00-boilerplate/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env", "@babel/preset-react"],
3 | "plugins": ["react-hot-loader/babel"]
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/00-boilerplate/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 | coverage
4 | .awcache
5 | test-report.*
6 | junit.xml
7 | *.log
8 | *.orig
9 | package-lock.json
10 | yarn.lock
11 | .awcache
12 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/00-boilerplate/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/00-boilerplate/dev.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/00-boilerplate/prod.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=production
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/00-boilerplate/server/config/routes.json:
--------------------------------------------------------------------------------
1 | {
2 | "/api/*": "/$1"
3 | }
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/00-boilerplate/src/common/hooks/index.js:
--------------------------------------------------------------------------------
1 | export * from './use-flasher';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/00-boilerplate/src/common/mappers/collection.mapper.js:
--------------------------------------------------------------------------------
1 | export const mapCollection = (collection, mapFn) =>
2 | Array.isArray(collection) ? collection.map(mapFn) : [];
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/00-boilerplate/src/common/mappers/index.js:
--------------------------------------------------------------------------------
1 | export * from './collection.mapper';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/00-boilerplate/src/core/context/index.js:
--------------------------------------------------------------------------------
1 | export * from './global-state.context';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/00-boilerplate/src/core/router/history.js:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/00-boilerplate/src/core/router/index.js:
--------------------------------------------------------------------------------
1 | export * from './history';
2 | export * from './router.component';
3 | export * from './routes';
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/00-boilerplate/src/core/store/actions/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.actions';
2 | export * from './hotel-collection.actions';
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/00-boilerplate/src/core/store/index.js:
--------------------------------------------------------------------------------
1 | import * as coreActions from './actions';
2 | export { coreActions };
3 |
4 | export * from './store';
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/00-boilerplate/src/index.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/00-boilerplate/src/layouts/index.js:
--------------------------------------------------------------------------------
1 | export * from './centered.layout';
2 | export * from './app.layout';
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/00-boilerplate/src/pods/hotel-collection/components/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-card.component';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/00-boilerplate/src/pods/hotel-collection/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-collection.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/00-boilerplate/src/pods/hotel-edit/api/hotel-edit.api.js:
--------------------------------------------------------------------------------
1 | import { mockCities } from './hotel-edit.mock';
2 |
3 | export const getCities = () => Promise.resolve(mockCities);
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/00-boilerplate/src/pods/hotel-edit/api/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.api';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/00-boilerplate/src/pods/hotel-edit/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/00-boilerplate/src/pods/login/api.js:
--------------------------------------------------------------------------------
1 | export const validateCredentials = (user, password) =>
2 | new Promise(resolve => setTimeout(() => resolve(password === 'test'), 500));
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/00-boilerplate/src/pods/login/index.js:
--------------------------------------------------------------------------------
1 | export { LoginContainer } from './login.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/00-boilerplate/src/scenes/hotel-edit.scene.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { HotelEditContainer } from 'pods/hotel-edit';
3 |
4 | export const HotelEditScene = () => ;
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/00-boilerplate/src/scenes/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.scene';
2 | export * from './hotel-collection.scene';
3 | export * from './hotel-edit.scene';
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/01-config/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env", "@babel/preset-react"],
3 | "plugins": ["react-hot-loader/babel"]
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/01-config/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 | coverage
4 | .awcache
5 | test-report.*
6 | junit.xml
7 | *.log
8 | *.orig
9 | package-lock.json
10 | yarn.lock
11 | .awcache
12 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/01-config/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/01-config/cypress.json:
--------------------------------------------------------------------------------
1 | {
2 | "baseUrl": "http://localhost:8080"
3 | }
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/01-config/cypress/integration/login.spec.js:
--------------------------------------------------------------------------------
1 | describe('Login specs', () => {
2 | it('visit the login page', () => {
3 | cy.visit('/');
4 | });
5 | });
6 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/01-config/dev.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/01-config/prod.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=production
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/01-config/server/config/routes.json:
--------------------------------------------------------------------------------
1 | {
2 | "/api/*": "/$1"
3 | }
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/01-config/src/common/hooks/index.js:
--------------------------------------------------------------------------------
1 | export * from './use-flasher';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/01-config/src/common/mappers/collection.mapper.js:
--------------------------------------------------------------------------------
1 | export const mapCollection = (collection, mapFn) =>
2 | Array.isArray(collection) ? collection.map(mapFn) : [];
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/01-config/src/common/mappers/index.js:
--------------------------------------------------------------------------------
1 | export * from './collection.mapper';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/01-config/src/core/context/index.js:
--------------------------------------------------------------------------------
1 | export * from './global-state.context';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/01-config/src/core/router/history.js:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/01-config/src/core/router/index.js:
--------------------------------------------------------------------------------
1 | export * from './history';
2 | export * from './router.component';
3 | export * from './routes';
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/01-config/src/core/store/actions/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.actions';
2 | export * from './hotel-collection.actions';
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/01-config/src/core/store/index.js:
--------------------------------------------------------------------------------
1 | import * as coreActions from './actions';
2 | export { coreActions };
3 |
4 | export * from './store';
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/01-config/src/index.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/01-config/src/layouts/index.js:
--------------------------------------------------------------------------------
1 | export * from './centered.layout';
2 | export * from './app.layout';
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/01-config/src/pods/hotel-collection/components/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-card.component';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/01-config/src/pods/hotel-collection/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-collection.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/01-config/src/pods/hotel-edit/api/hotel-edit.api.js:
--------------------------------------------------------------------------------
1 | import { mockCities } from './hotel-edit.mock';
2 |
3 | export const getCities = () => Promise.resolve(mockCities);
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/01-config/src/pods/hotel-edit/api/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.api';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/01-config/src/pods/hotel-edit/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/01-config/src/pods/login/api.js:
--------------------------------------------------------------------------------
1 | export const validateCredentials = (user, password) =>
2 | new Promise(resolve => setTimeout(() => resolve(password === 'test'), 500));
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/01-config/src/pods/login/index.js:
--------------------------------------------------------------------------------
1 | export { LoginContainer } from './login.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/01-config/src/scenes/hotel-edit.scene.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { HotelEditContainer } from 'pods/hotel-edit';
3 |
4 | export const HotelEditScene = () => ;
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/01-config/src/scenes/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.scene';
2 | export * from './hotel-collection.scene';
3 | export * from './hotel-edit.scene';
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/02-selectors/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env", "@babel/preset-react"],
3 | "plugins": ["react-hot-loader/babel"]
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/02-selectors/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 | coverage
4 | .awcache
5 | test-report.*
6 | junit.xml
7 | *.log
8 | *.orig
9 | package-lock.json
10 | yarn.lock
11 | .awcache
12 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/02-selectors/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/02-selectors/cypress.json:
--------------------------------------------------------------------------------
1 | {
2 | "baseUrl": "http://localhost:8080"
3 | }
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/02-selectors/dev.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/02-selectors/prod.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=production
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/02-selectors/server/config/routes.json:
--------------------------------------------------------------------------------
1 | {
2 | "/api/*": "/$1"
3 | }
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/02-selectors/src/common/hooks/index.js:
--------------------------------------------------------------------------------
1 | export * from './use-flasher';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/02-selectors/src/common/mappers/collection.mapper.js:
--------------------------------------------------------------------------------
1 | export const mapCollection = (collection, mapFn) =>
2 | Array.isArray(collection) ? collection.map(mapFn) : [];
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/02-selectors/src/common/mappers/index.js:
--------------------------------------------------------------------------------
1 | export * from './collection.mapper';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/02-selectors/src/core/context/index.js:
--------------------------------------------------------------------------------
1 | export * from './global-state.context';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/02-selectors/src/core/router/history.js:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/02-selectors/src/core/router/index.js:
--------------------------------------------------------------------------------
1 | export * from './history';
2 | export * from './router.component';
3 | export * from './routes';
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/02-selectors/src/core/store/actions/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.actions';
2 | export * from './hotel-collection.actions';
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/02-selectors/src/core/store/index.js:
--------------------------------------------------------------------------------
1 | import * as coreActions from './actions';
2 | export { coreActions };
3 |
4 | export * from './store';
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/02-selectors/src/index.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/02-selectors/src/layouts/index.js:
--------------------------------------------------------------------------------
1 | export * from './centered.layout';
2 | export * from './app.layout';
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/02-selectors/src/pods/hotel-collection/components/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-card.component';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/02-selectors/src/pods/hotel-collection/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-collection.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/02-selectors/src/pods/hotel-edit/api/hotel-edit.api.js:
--------------------------------------------------------------------------------
1 | import { mockCities } from './hotel-edit.mock';
2 |
3 | export const getCities = () => Promise.resolve(mockCities);
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/02-selectors/src/pods/hotel-edit/api/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.api';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/02-selectors/src/pods/hotel-edit/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/02-selectors/src/pods/login/api.js:
--------------------------------------------------------------------------------
1 | export const validateCredentials = (user, password) =>
2 | new Promise(resolve => setTimeout(() => resolve(password === 'test'), 500));
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/02-selectors/src/pods/login/index.js:
--------------------------------------------------------------------------------
1 | export { LoginContainer } from './login.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/02-selectors/src/scenes/hotel-edit.scene.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { HotelEditContainer } from 'pods/hotel-edit';
3 |
4 | export const HotelEditScene = () => ;
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/02-selectors/src/scenes/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.scene';
2 | export * from './hotel-collection.scene';
3 | export * from './hotel-edit.scene';
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/03-stub-requests/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env", "@babel/preset-react"],
3 | "plugins": ["react-hot-loader/babel"]
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/03-stub-requests/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 | coverage
4 | .awcache
5 | test-report.*
6 | junit.xml
7 | *.log
8 | *.orig
9 | package-lock.json
10 | yarn.lock
11 | .awcache
12 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/03-stub-requests/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/03-stub-requests/cypress.json:
--------------------------------------------------------------------------------
1 | {
2 | "baseUrl": "http://localhost:8080"
3 | }
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/03-stub-requests/dev.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/03-stub-requests/prod.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=production
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/03-stub-requests/server/config/routes.json:
--------------------------------------------------------------------------------
1 | {
2 | "/api/*": "/$1"
3 | }
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/03-stub-requests/src/common/hooks/index.js:
--------------------------------------------------------------------------------
1 | export * from './use-flasher';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/03-stub-requests/src/common/mappers/collection.mapper.js:
--------------------------------------------------------------------------------
1 | export const mapCollection = (collection, mapFn) =>
2 | Array.isArray(collection) ? collection.map(mapFn) : [];
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/03-stub-requests/src/common/mappers/index.js:
--------------------------------------------------------------------------------
1 | export * from './collection.mapper';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/03-stub-requests/src/core/context/index.js:
--------------------------------------------------------------------------------
1 | export * from './global-state.context';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/03-stub-requests/src/core/router/history.js:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/03-stub-requests/src/core/router/index.js:
--------------------------------------------------------------------------------
1 | export * from './history';
2 | export * from './router.component';
3 | export * from './routes';
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/03-stub-requests/src/core/store/actions/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.actions';
2 | export * from './hotel-collection.actions';
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/03-stub-requests/src/core/store/index.js:
--------------------------------------------------------------------------------
1 | import * as coreActions from './actions';
2 | export { coreActions };
3 |
4 | export * from './store';
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/03-stub-requests/src/index.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/03-stub-requests/src/layouts/index.js:
--------------------------------------------------------------------------------
1 | export * from './centered.layout';
2 | export * from './app.layout';
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/03-stub-requests/src/pods/hotel-collection/components/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-card.component';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/03-stub-requests/src/pods/hotel-collection/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-collection.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/03-stub-requests/src/pods/hotel-edit/api/hotel-edit.api.js:
--------------------------------------------------------------------------------
1 | import { mockCities } from './hotel-edit.mock';
2 |
3 | export const getCities = () => Promise.resolve(mockCities);
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/03-stub-requests/src/pods/hotel-edit/api/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.api';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/03-stub-requests/src/pods/hotel-edit/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/03-stub-requests/src/pods/login/api.js:
--------------------------------------------------------------------------------
1 | export const validateCredentials = (user, password) =>
2 | new Promise(resolve => setTimeout(() => resolve(password === 'test'), 500));
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/03-stub-requests/src/pods/login/index.js:
--------------------------------------------------------------------------------
1 | export { LoginContainer } from './login.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/03-stub-requests/src/scenes/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.scene';
2 | export * from './hotel-collection.scene';
3 | export * from './hotel-edit.scene';
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/04-wait-requests/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env", "@babel/preset-react"],
3 | "plugins": ["react-hot-loader/babel"]
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/04-wait-requests/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 | coverage
4 | .awcache
5 | test-report.*
6 | junit.xml
7 | *.log
8 | *.orig
9 | package-lock.json
10 | yarn.lock
11 | .awcache
12 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/04-wait-requests/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/04-wait-requests/cypress.json:
--------------------------------------------------------------------------------
1 | {
2 | "baseUrl": "http://localhost:8080"
3 | }
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/04-wait-requests/dev.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/04-wait-requests/prod.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=production
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/04-wait-requests/server/config/routes.json:
--------------------------------------------------------------------------------
1 | {
2 | "/api/*": "/$1"
3 | }
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/04-wait-requests/src/common/hooks/index.js:
--------------------------------------------------------------------------------
1 | export * from './use-flasher';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/04-wait-requests/src/common/mappers/collection.mapper.js:
--------------------------------------------------------------------------------
1 | export const mapCollection = (collection, mapFn) =>
2 | Array.isArray(collection) ? collection.map(mapFn) : [];
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/04-wait-requests/src/common/mappers/index.js:
--------------------------------------------------------------------------------
1 | export * from './collection.mapper';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/04-wait-requests/src/core/context/index.js:
--------------------------------------------------------------------------------
1 | export * from './global-state.context';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/04-wait-requests/src/core/router/history.js:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/04-wait-requests/src/core/router/index.js:
--------------------------------------------------------------------------------
1 | export * from './history';
2 | export * from './router.component';
3 | export * from './routes';
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/04-wait-requests/src/core/store/actions/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.actions';
2 | export * from './hotel-collection.actions';
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/04-wait-requests/src/core/store/index.js:
--------------------------------------------------------------------------------
1 | import * as coreActions from './actions';
2 | export { coreActions };
3 |
4 | export * from './store';
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/04-wait-requests/src/index.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/04-wait-requests/src/layouts/index.js:
--------------------------------------------------------------------------------
1 | export * from './centered.layout';
2 | export * from './app.layout';
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/04-wait-requests/src/pods/hotel-collection/components/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-card.component';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/04-wait-requests/src/pods/hotel-collection/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-collection.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/04-wait-requests/src/pods/hotel-edit/api/hotel-edit.api.js:
--------------------------------------------------------------------------------
1 | import { mockCities } from './hotel-edit.mock';
2 |
3 | export const getCities = () => Promise.resolve(mockCities);
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/04-wait-requests/src/pods/hotel-edit/api/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.api';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/04-wait-requests/src/pods/hotel-edit/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/04-wait-requests/src/pods/login/api.js:
--------------------------------------------------------------------------------
1 | export const validateCredentials = (user, password) =>
2 | new Promise(resolve => setTimeout(() => resolve(password === 'test'), 500));
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/04-wait-requests/src/pods/login/index.js:
--------------------------------------------------------------------------------
1 | export { LoginContainer } from './login.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/04-wait-requests/src/scenes/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.scene';
2 | export * from './hotel-collection.scene';
3 | export * from './hotel-edit.scene';
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/05-custom-commands/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env", "@babel/preset-react"],
3 | "plugins": ["react-hot-loader/babel"]
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/05-custom-commands/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 | coverage
4 | .awcache
5 | test-report.*
6 | junit.xml
7 | *.log
8 | *.orig
9 | package-lock.json
10 | yarn.lock
11 | .awcache
12 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/05-custom-commands/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/05-custom-commands/cypress.json:
--------------------------------------------------------------------------------
1 | {
2 | "baseUrl": "http://localhost:8080"
3 | }
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/05-custom-commands/cypress/support/index.js:
--------------------------------------------------------------------------------
1 | import './commands';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/05-custom-commands/dev.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/05-custom-commands/prod.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=production
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/05-custom-commands/server/config/routes.json:
--------------------------------------------------------------------------------
1 | {
2 | "/api/*": "/$1"
3 | }
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/05-custom-commands/src/common/hooks/index.js:
--------------------------------------------------------------------------------
1 | export * from './use-flasher';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/05-custom-commands/src/common/mappers/collection.mapper.js:
--------------------------------------------------------------------------------
1 | export const mapCollection = (collection, mapFn) =>
2 | Array.isArray(collection) ? collection.map(mapFn) : [];
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/05-custom-commands/src/common/mappers/index.js:
--------------------------------------------------------------------------------
1 | export * from './collection.mapper';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/05-custom-commands/src/core/context/index.js:
--------------------------------------------------------------------------------
1 | export * from './global-state.context';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/05-custom-commands/src/core/router/history.js:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/05-custom-commands/src/core/router/index.js:
--------------------------------------------------------------------------------
1 | export * from './history';
2 | export * from './router.component';
3 | export * from './routes';
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/05-custom-commands/src/core/store/actions/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.actions';
2 | export * from './hotel-collection.actions';
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/05-custom-commands/src/core/store/index.js:
--------------------------------------------------------------------------------
1 | import * as coreActions from './actions';
2 | export { coreActions };
3 |
4 | export * from './store';
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/05-custom-commands/src/index.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/05-custom-commands/src/layouts/index.js:
--------------------------------------------------------------------------------
1 | export * from './centered.layout';
2 | export * from './app.layout';
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/05-custom-commands/src/pods/hotel-collection/components/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-card.component';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/05-custom-commands/src/pods/hotel-collection/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-collection.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/05-custom-commands/src/pods/hotel-edit/api/hotel-edit.api.js:
--------------------------------------------------------------------------------
1 | import { mockCities } from './hotel-edit.mock';
2 |
3 | export const getCities = () => Promise.resolve(mockCities);
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/05-custom-commands/src/pods/hotel-edit/api/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.api';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/05-custom-commands/src/pods/hotel-edit/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/05-custom-commands/src/pods/login/api.js:
--------------------------------------------------------------------------------
1 | export const validateCredentials = (user, password) =>
2 | new Promise(resolve => setTimeout(() => resolve(password === 'test'), 500));
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/05-custom-commands/src/pods/login/index.js:
--------------------------------------------------------------------------------
1 | export { LoginContainer } from './login.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/05-custom-commands/src/scenes/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.scene';
2 | export * from './hotel-collection.scene';
3 | export * from './hotel-edit.scene';
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/06-edit-hotel/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env", "@babel/preset-react"],
3 | "plugins": ["react-hot-loader/babel"]
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/06-edit-hotel/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 | coverage
4 | .awcache
5 | test-report.*
6 | junit.xml
7 | *.log
8 | *.orig
9 | package-lock.json
10 | yarn.lock
11 | .awcache
12 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/06-edit-hotel/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/06-edit-hotel/cypress.json:
--------------------------------------------------------------------------------
1 | {
2 | "baseUrl": "http://localhost:8080"
3 | }
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/06-edit-hotel/cypress/support/index.js:
--------------------------------------------------------------------------------
1 | import './commands';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/06-edit-hotel/dev.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/06-edit-hotel/prod.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=production
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/06-edit-hotel/server/config/routes.json:
--------------------------------------------------------------------------------
1 | {
2 | "/api/*": "/$1"
3 | }
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/06-edit-hotel/src/common/hooks/index.js:
--------------------------------------------------------------------------------
1 | export * from './use-flasher';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/06-edit-hotel/src/common/mappers/collection.mapper.js:
--------------------------------------------------------------------------------
1 | export const mapCollection = (collection, mapFn) =>
2 | Array.isArray(collection) ? collection.map(mapFn) : [];
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/06-edit-hotel/src/common/mappers/index.js:
--------------------------------------------------------------------------------
1 | export * from './collection.mapper';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/06-edit-hotel/src/core/context/index.js:
--------------------------------------------------------------------------------
1 | export * from './global-state.context';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/06-edit-hotel/src/core/router/history.js:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/06-edit-hotel/src/core/router/index.js:
--------------------------------------------------------------------------------
1 | export * from './history';
2 | export * from './router.component';
3 | export * from './routes';
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/06-edit-hotel/src/core/store/actions/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.actions';
2 | export * from './hotel-collection.actions';
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/06-edit-hotel/src/core/store/index.js:
--------------------------------------------------------------------------------
1 | import * as coreActions from './actions';
2 | export { coreActions };
3 |
4 | export * from './store';
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/06-edit-hotel/src/index.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/06-edit-hotel/src/layouts/index.js:
--------------------------------------------------------------------------------
1 | export * from './centered.layout';
2 | export * from './app.layout';
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/06-edit-hotel/src/pods/hotel-collection/components/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-card.component';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/06-edit-hotel/src/pods/hotel-collection/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-collection.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/06-edit-hotel/src/pods/hotel-edit/api/hotel-edit.api.js:
--------------------------------------------------------------------------------
1 | import { mockCities } from './hotel-edit.mock';
2 |
3 | export const getCities = () => Promise.resolve(mockCities);
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/06-edit-hotel/src/pods/hotel-edit/api/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.api';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/06-edit-hotel/src/pods/hotel-edit/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/06-edit-hotel/src/pods/login/api.js:
--------------------------------------------------------------------------------
1 | export const validateCredentials = (user, password) =>
2 | new Promise(resolve => setTimeout(() => resolve(password === 'test'), 500));
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/06-edit-hotel/src/pods/login/index.js:
--------------------------------------------------------------------------------
1 | export { LoginContainer } from './login.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/06-edit-hotel/src/scenes/hotel-edit.scene.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { HotelEditContainer } from 'pods/hotel-edit';
3 |
4 | export const HotelEditScene = () => ;
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/06-edit-hotel/src/scenes/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.scene';
2 | export * from './hotel-collection.scene';
3 | export * from './hotel-edit.scene';
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/07-ci/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env", "@babel/preset-react"],
3 | "plugins": ["react-hot-loader/babel"]
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/07-ci/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/07-ci/cypress.json:
--------------------------------------------------------------------------------
1 | {
2 | "baseUrl": "http://localhost:8080"
3 | }
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/07-ci/cypress/support/index.js:
--------------------------------------------------------------------------------
1 | import './commands';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/07-ci/dev.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/07-ci/prod.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=production
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/07-ci/server/config/routes.json:
--------------------------------------------------------------------------------
1 | {
2 | "/api/*": "/$1"
3 | }
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/07-ci/src/common/hooks/index.js:
--------------------------------------------------------------------------------
1 | export * from './use-flasher';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/07-ci/src/common/mappers/collection.mapper.js:
--------------------------------------------------------------------------------
1 | export const mapCollection = (collection, mapFn) =>
2 | Array.isArray(collection) ? collection.map(mapFn) : [];
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/07-ci/src/common/mappers/index.js:
--------------------------------------------------------------------------------
1 | export * from './collection.mapper';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/07-ci/src/core/context/index.js:
--------------------------------------------------------------------------------
1 | export * from './global-state.context';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/07-ci/src/core/router/history.js:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/07-ci/src/core/router/index.js:
--------------------------------------------------------------------------------
1 | export * from './history';
2 | export * from './router.component';
3 | export * from './routes';
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/07-ci/src/core/store/action-types.js:
--------------------------------------------------------------------------------
1 | export const actionTypes = {
2 | ON_UPDATE_LOGIN: 'CORE [1]: ON_UPDATE_LOGIN',
3 | ON_UPDATE_HOTEL_COLLECTION: 'CORE [2]: ON_UPDATE_HOTEL_COLLECTION',
4 | };
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/07-ci/src/core/store/actions/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.actions';
2 | export * from './hotel-collection.actions';
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/07-ci/src/core/store/index.js:
--------------------------------------------------------------------------------
1 | import * as coreActions from './actions';
2 | export { coreActions };
3 |
4 | export * from './store';
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/07-ci/src/index.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/07-ci/src/layouts/index.js:
--------------------------------------------------------------------------------
1 | export * from './centered.layout';
2 | export * from './app.layout';
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/07-ci/src/pods/hotel-collection/components/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-card.component';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/07-ci/src/pods/hotel-collection/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-collection.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/07-ci/src/pods/hotel-edit/api/hotel-edit.api.js:
--------------------------------------------------------------------------------
1 | import { mockCities } from './hotel-edit.mock';
2 |
3 | export const getCities = () => Promise.resolve(mockCities);
4 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/07-ci/src/pods/hotel-edit/api/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.api';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/07-ci/src/pods/hotel-edit/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/07-ci/src/pods/login/api.js:
--------------------------------------------------------------------------------
1 | export const validateCredentials = (user, password) =>
2 | new Promise(resolve => setTimeout(() => resolve(password === 'test'), 500));
3 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/07-ci/src/pods/login/index.js:
--------------------------------------------------------------------------------
1 | export { LoginContainer } from './login.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/07-ci/src/scenes/hotel-edit.scene.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { HotelEditContainer } from 'pods/hotel-edit';
3 |
4 | export const HotelEditScene = () => ;
5 |
--------------------------------------------------------------------------------
/05-e2e/01-cypress/07-ci/src/scenes/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.scene';
2 | export * from './hotel-collection.scene';
3 | export * from './hotel-edit.scene';
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/00-boilerplate/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env", "@babel/preset-react"],
3 | "plugins": ["react-hot-loader/babel"]
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/00-boilerplate/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 | coverage
4 | .awcache
5 | test-report.*
6 | junit.xml
7 | *.log
8 | *.orig
9 | package-lock.json
10 | yarn.lock
11 | .awcache
12 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/00-boilerplate/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/00-boilerplate/dev.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/00-boilerplate/prod.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=production
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/00-boilerplate/server/config/routes.json:
--------------------------------------------------------------------------------
1 | {
2 | "/api/*": "/$1"
3 | }
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/00-boilerplate/src/common/hooks/index.js:
--------------------------------------------------------------------------------
1 | export * from './use-flasher';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/00-boilerplate/src/common/mappers/collection.mapper.js:
--------------------------------------------------------------------------------
1 | export const mapCollection = (collection, mapFn) =>
2 | Array.isArray(collection) ? collection.map(mapFn) : [];
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/00-boilerplate/src/common/mappers/index.js:
--------------------------------------------------------------------------------
1 | export * from './collection.mapper';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/00-boilerplate/src/core/context/index.js:
--------------------------------------------------------------------------------
1 | export * from './global-state.context';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/00-boilerplate/src/core/router/history.js:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/00-boilerplate/src/core/router/index.js:
--------------------------------------------------------------------------------
1 | export * from './history';
2 | export * from './router.component';
3 | export * from './routes';
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/00-boilerplate/src/core/store/actions/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.actions';
2 | export * from './hotel-collection.actions';
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/00-boilerplate/src/core/store/index.js:
--------------------------------------------------------------------------------
1 | import * as coreActions from './actions';
2 | export { coreActions };
3 |
4 | export * from './store';
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/00-boilerplate/src/index.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/00-boilerplate/src/layouts/index.js:
--------------------------------------------------------------------------------
1 | export * from './centered.layout';
2 | export * from './app.layout';
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/00-boilerplate/src/pods/hotel-collection/components/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-card.component';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/00-boilerplate/src/pods/hotel-collection/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-collection.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/00-boilerplate/src/pods/hotel-edit/api/hotel-edit.api.js:
--------------------------------------------------------------------------------
1 | import { mockCities } from './hotel-edit.mock';
2 |
3 | export const getCities = () => Promise.resolve(mockCities);
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/00-boilerplate/src/pods/hotel-edit/api/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.api';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/00-boilerplate/src/pods/hotel-edit/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/00-boilerplate/src/pods/login/api.js:
--------------------------------------------------------------------------------
1 | export const validateCredentials = (user, password) =>
2 | new Promise(resolve => setTimeout(() => resolve(password === 'test'), 500));
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/00-boilerplate/src/pods/login/index.js:
--------------------------------------------------------------------------------
1 | export { LoginContainer } from './login.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/00-boilerplate/src/scenes/hotel-edit.scene.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { HotelEditContainer } from 'pods/hotel-edit';
3 |
4 | export const HotelEditScene = () => ;
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/00-boilerplate/src/scenes/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.scene';
2 | export * from './hotel-collection.scene';
3 | export * from './hotel-edit.scene';
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/01-config/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env", "@babel/preset-react"],
3 | "plugins": ["react-hot-loader/babel"]
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/01-config/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 | coverage
4 | .awcache
5 | test-report.*
6 | junit.xml
7 | *.log
8 | *.orig
9 | package-lock.json
10 | yarn.lock
11 | .awcache
12 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/01-config/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/01-config/dev.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/01-config/prod.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=production
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/01-config/server/config/routes.json:
--------------------------------------------------------------------------------
1 | {
2 | "/api/*": "/$1"
3 | }
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/01-config/src/common/hooks/index.js:
--------------------------------------------------------------------------------
1 | export * from './use-flasher';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/01-config/src/common/mappers/collection.mapper.js:
--------------------------------------------------------------------------------
1 | export const mapCollection = (collection, mapFn) =>
2 | Array.isArray(collection) ? collection.map(mapFn) : [];
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/01-config/src/common/mappers/index.js:
--------------------------------------------------------------------------------
1 | export * from './collection.mapper';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/01-config/src/core/context/index.js:
--------------------------------------------------------------------------------
1 | export * from './global-state.context';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/01-config/src/core/router/history.js:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/01-config/src/core/router/index.js:
--------------------------------------------------------------------------------
1 | export * from './history';
2 | export * from './router.component';
3 | export * from './routes';
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/01-config/src/core/store/actions/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.actions';
2 | export * from './hotel-collection.actions';
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/01-config/src/core/store/index.js:
--------------------------------------------------------------------------------
1 | import * as coreActions from './actions';
2 | export { coreActions };
3 |
4 | export * from './store';
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/01-config/src/index.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/01-config/src/layouts/index.js:
--------------------------------------------------------------------------------
1 | export * from './centered.layout';
2 | export * from './app.layout';
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/01-config/src/pods/hotel-collection/components/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-card.component';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/01-config/src/pods/hotel-collection/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-collection.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/01-config/src/pods/hotel-edit/api/hotel-edit.api.js:
--------------------------------------------------------------------------------
1 | import { mockCities } from './hotel-edit.mock';
2 |
3 | export const getCities = () => Promise.resolve(mockCities);
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/01-config/src/pods/hotel-edit/api/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.api';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/01-config/src/pods/hotel-edit/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/01-config/src/pods/login/api.js:
--------------------------------------------------------------------------------
1 | export const validateCredentials = (user, password) =>
2 | new Promise(resolve => setTimeout(() => resolve(password === 'test'), 500));
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/01-config/src/pods/login/index.js:
--------------------------------------------------------------------------------
1 | export { LoginContainer } from './login.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/01-config/src/scenes/hotel-edit.scene.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { HotelEditContainer } from 'pods/hotel-edit';
3 |
4 | export const HotelEditScene = () => ;
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/01-config/src/scenes/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.scene';
2 | export * from './hotel-collection.scene';
3 | export * from './hotel-edit.scene';
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/01-config/testcafe.config.js:
--------------------------------------------------------------------------------
1 | const config = {
2 | baseUrl: 'http://localhost:8080',
3 | };
4 |
5 | export { config };
6 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/01-config/tests/login.spec.js:
--------------------------------------------------------------------------------
1 | import { config } from '../testcafe.config';
2 |
3 | fixture('Login specs').page(config.baseUrl);
4 |
5 | test('visit the login page', async t => {});
6 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/02-selectors/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env", "@babel/preset-react"],
3 | "plugins": ["react-hot-loader/babel"]
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/02-selectors/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 | coverage
4 | .awcache
5 | test-report.*
6 | junit.xml
7 | *.log
8 | *.orig
9 | package-lock.json
10 | yarn.lock
11 | .awcache
12 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/02-selectors/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/02-selectors/dev.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/02-selectors/prod.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=production
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/02-selectors/server/config/routes.json:
--------------------------------------------------------------------------------
1 | {
2 | "/api/*": "/$1"
3 | }
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/02-selectors/src/common/hooks/index.js:
--------------------------------------------------------------------------------
1 | export * from './use-flasher';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/02-selectors/src/common/mappers/collection.mapper.js:
--------------------------------------------------------------------------------
1 | export const mapCollection = (collection, mapFn) =>
2 | Array.isArray(collection) ? collection.map(mapFn) : [];
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/02-selectors/src/common/mappers/index.js:
--------------------------------------------------------------------------------
1 | export * from './collection.mapper';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/02-selectors/src/core/context/index.js:
--------------------------------------------------------------------------------
1 | export * from './global-state.context';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/02-selectors/src/core/router/history.js:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/02-selectors/src/core/router/index.js:
--------------------------------------------------------------------------------
1 | export * from './history';
2 | export * from './router.component';
3 | export * from './routes';
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/02-selectors/src/core/store/actions/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.actions';
2 | export * from './hotel-collection.actions';
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/02-selectors/src/core/store/index.js:
--------------------------------------------------------------------------------
1 | import * as coreActions from './actions';
2 | export { coreActions };
3 |
4 | export * from './store';
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/02-selectors/src/index.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/02-selectors/src/layouts/index.js:
--------------------------------------------------------------------------------
1 | export * from './centered.layout';
2 | export * from './app.layout';
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/02-selectors/src/pods/hotel-collection/components/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-card.component';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/02-selectors/src/pods/hotel-collection/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-collection.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/02-selectors/src/pods/hotel-edit/api/hotel-edit.api.js:
--------------------------------------------------------------------------------
1 | import { mockCities } from './hotel-edit.mock';
2 |
3 | export const getCities = () => Promise.resolve(mockCities);
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/02-selectors/src/pods/hotel-edit/api/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.api';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/02-selectors/src/pods/hotel-edit/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/02-selectors/src/pods/login/api.js:
--------------------------------------------------------------------------------
1 | export const validateCredentials = (user, password) =>
2 | new Promise(resolve => setTimeout(() => resolve(password === 'test'), 500));
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/02-selectors/src/pods/login/index.js:
--------------------------------------------------------------------------------
1 | export { LoginContainer } from './login.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/02-selectors/src/scenes/hotel-edit.scene.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { HotelEditContainer } from 'pods/hotel-edit';
3 |
4 | export const HotelEditScene = () => ;
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/02-selectors/src/scenes/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.scene';
2 | export * from './hotel-collection.scene';
3 | export * from './hotel-edit.scene';
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/02-selectors/testcafe.config.js:
--------------------------------------------------------------------------------
1 | const config = {
2 | baseUrl: 'http://localhost:8080',
3 | };
4 |
5 | export { config };
6 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/03-debug/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env", "@babel/preset-react"],
3 | "plugins": ["react-hot-loader/babel"]
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/03-debug/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 | coverage
4 | .awcache
5 | test-report.*
6 | junit.xml
7 | *.log
8 | *.orig
9 | package-lock.json
10 | yarn.lock
11 | .awcache
12 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/03-debug/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/03-debug/dev.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/03-debug/prod.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=production
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/03-debug/server/config/routes.json:
--------------------------------------------------------------------------------
1 | {
2 | "/api/*": "/$1"
3 | }
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/03-debug/src/common/hooks/index.js:
--------------------------------------------------------------------------------
1 | export * from './use-flasher';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/03-debug/src/common/mappers/collection.mapper.js:
--------------------------------------------------------------------------------
1 | export const mapCollection = (collection, mapFn) =>
2 | Array.isArray(collection) ? collection.map(mapFn) : [];
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/03-debug/src/common/mappers/index.js:
--------------------------------------------------------------------------------
1 | export * from './collection.mapper';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/03-debug/src/core/context/index.js:
--------------------------------------------------------------------------------
1 | export * from './global-state.context';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/03-debug/src/core/router/history.js:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/03-debug/src/core/router/index.js:
--------------------------------------------------------------------------------
1 | export * from './history';
2 | export * from './router.component';
3 | export * from './routes';
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/03-debug/src/core/store/actions/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.actions';
2 | export * from './hotel-collection.actions';
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/03-debug/src/core/store/index.js:
--------------------------------------------------------------------------------
1 | import * as coreActions from './actions';
2 | export { coreActions };
3 |
4 | export * from './store';
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/03-debug/src/index.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/03-debug/src/layouts/index.js:
--------------------------------------------------------------------------------
1 | export * from './centered.layout';
2 | export * from './app.layout';
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/03-debug/src/pods/hotel-collection/components/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-card.component';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/03-debug/src/pods/hotel-collection/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-collection.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/03-debug/src/pods/hotel-edit/api/hotel-edit.api.js:
--------------------------------------------------------------------------------
1 | import { mockCities } from './hotel-edit.mock';
2 |
3 | export const getCities = () => Promise.resolve(mockCities);
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/03-debug/src/pods/hotel-edit/api/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.api';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/03-debug/src/pods/hotel-edit/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/03-debug/src/pods/login/api.js:
--------------------------------------------------------------------------------
1 | export const validateCredentials = (user, password) =>
2 | new Promise(resolve => setTimeout(() => resolve(password === 'test'), 500));
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/03-debug/src/pods/login/index.js:
--------------------------------------------------------------------------------
1 | export { LoginContainer } from './login.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/03-debug/src/scenes/hotel-edit.scene.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { HotelEditContainer } from 'pods/hotel-edit';
3 |
4 | export const HotelEditScene = () => ;
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/03-debug/src/scenes/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.scene';
2 | export * from './hotel-collection.scene';
3 | export * from './hotel-edit.scene';
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/03-debug/testcafe.config.js:
--------------------------------------------------------------------------------
1 | const config = {
2 | baseUrl: 'http://localhost:8080',
3 | };
4 |
5 | export { config };
6 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/04-stub-requests/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env", "@babel/preset-react"],
3 | "plugins": ["react-hot-loader/babel"]
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/04-stub-requests/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 | coverage
4 | .awcache
5 | test-report.*
6 | junit.xml
7 | *.log
8 | *.orig
9 | package-lock.json
10 | yarn.lock
11 | .awcache
12 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/04-stub-requests/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/04-stub-requests/dev.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/04-stub-requests/prod.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=production
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/04-stub-requests/server/config/routes.json:
--------------------------------------------------------------------------------
1 | {
2 | "/api/*": "/$1"
3 | }
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/04-stub-requests/src/common/hooks/index.js:
--------------------------------------------------------------------------------
1 | export * from './use-flasher';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/04-stub-requests/src/common/mappers/collection.mapper.js:
--------------------------------------------------------------------------------
1 | export const mapCollection = (collection, mapFn) =>
2 | Array.isArray(collection) ? collection.map(mapFn) : [];
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/04-stub-requests/src/common/mappers/index.js:
--------------------------------------------------------------------------------
1 | export * from './collection.mapper';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/04-stub-requests/src/core/context/index.js:
--------------------------------------------------------------------------------
1 | export * from './global-state.context';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/04-stub-requests/src/core/router/history.js:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/04-stub-requests/src/core/router/index.js:
--------------------------------------------------------------------------------
1 | export * from './history';
2 | export * from './router.component';
3 | export * from './routes';
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/04-stub-requests/src/core/store/actions/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.actions';
2 | export * from './hotel-collection.actions';
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/04-stub-requests/src/core/store/index.js:
--------------------------------------------------------------------------------
1 | import * as coreActions from './actions';
2 | export { coreActions };
3 |
4 | export * from './store';
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/04-stub-requests/src/index.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/04-stub-requests/src/layouts/index.js:
--------------------------------------------------------------------------------
1 | export * from './centered.layout';
2 | export * from './app.layout';
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/04-stub-requests/src/pods/hotel-collection/components/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-card.component';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/04-stub-requests/src/pods/hotel-collection/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-collection.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/04-stub-requests/src/pods/hotel-edit/api/hotel-edit.api.js:
--------------------------------------------------------------------------------
1 | import { mockCities } from './hotel-edit.mock';
2 |
3 | export const getCities = () => Promise.resolve(mockCities);
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/04-stub-requests/src/pods/hotel-edit/api/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.api';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/04-stub-requests/src/pods/hotel-edit/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/04-stub-requests/src/pods/login/api.js:
--------------------------------------------------------------------------------
1 | export const validateCredentials = (user, password) =>
2 | new Promise(resolve => setTimeout(() => resolve(password === 'test'), 500));
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/04-stub-requests/src/pods/login/index.js:
--------------------------------------------------------------------------------
1 | export { LoginContainer } from './login.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/04-stub-requests/src/scenes/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.scene';
2 | export * from './hotel-collection.scene';
3 | export * from './hotel-edit.scene';
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/04-stub-requests/testcafe.config.js:
--------------------------------------------------------------------------------
1 | const config = {
2 | baseUrl: 'http://localhost:8080',
3 | };
4 |
5 | export { config };
6 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/04-stub-requests/tests/mocks/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotels';
2 | export * from './requests';
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/05-wait-requests/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env", "@babel/preset-react"],
3 | "plugins": ["react-hot-loader/babel"]
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/05-wait-requests/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 | coverage
4 | .awcache
5 | test-report.*
6 | junit.xml
7 | *.log
8 | *.orig
9 | package-lock.json
10 | yarn.lock
11 | .awcache
12 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/05-wait-requests/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/05-wait-requests/dev.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/05-wait-requests/prod.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=production
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/05-wait-requests/server/config/routes.json:
--------------------------------------------------------------------------------
1 | {
2 | "/api/*": "/$1"
3 | }
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/05-wait-requests/src/common/hooks/index.js:
--------------------------------------------------------------------------------
1 | export * from './use-flasher';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/05-wait-requests/src/common/mappers/collection.mapper.js:
--------------------------------------------------------------------------------
1 | export const mapCollection = (collection, mapFn) =>
2 | Array.isArray(collection) ? collection.map(mapFn) : [];
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/05-wait-requests/src/common/mappers/index.js:
--------------------------------------------------------------------------------
1 | export * from './collection.mapper';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/05-wait-requests/src/core/context/index.js:
--------------------------------------------------------------------------------
1 | export * from './global-state.context';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/05-wait-requests/src/core/router/history.js:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/05-wait-requests/src/core/router/index.js:
--------------------------------------------------------------------------------
1 | export * from './history';
2 | export * from './router.component';
3 | export * from './routes';
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/05-wait-requests/src/core/store/actions/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.actions';
2 | export * from './hotel-collection.actions';
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/05-wait-requests/src/core/store/index.js:
--------------------------------------------------------------------------------
1 | import * as coreActions from './actions';
2 | export { coreActions };
3 |
4 | export * from './store';
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/05-wait-requests/src/index.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/05-wait-requests/src/layouts/index.js:
--------------------------------------------------------------------------------
1 | export * from './centered.layout';
2 | export * from './app.layout';
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/05-wait-requests/src/pods/hotel-collection/components/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-card.component';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/05-wait-requests/src/pods/hotel-collection/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-collection.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/05-wait-requests/src/pods/hotel-edit/api/hotel-edit.api.js:
--------------------------------------------------------------------------------
1 | import { mockCities } from './hotel-edit.mock';
2 |
3 | export const getCities = () => Promise.resolve(mockCities);
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/05-wait-requests/src/pods/hotel-edit/api/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.api';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/05-wait-requests/src/pods/hotel-edit/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/05-wait-requests/src/pods/login/api.js:
--------------------------------------------------------------------------------
1 | export const validateCredentials = (user, password) =>
2 | new Promise(resolve => setTimeout(() => resolve(password === 'test'), 500));
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/05-wait-requests/src/pods/login/index.js:
--------------------------------------------------------------------------------
1 | export { LoginContainer } from './login.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/05-wait-requests/src/scenes/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.scene';
2 | export * from './hotel-collection.scene';
3 | export * from './hotel-edit.scene';
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/05-wait-requests/testcafe.config.js:
--------------------------------------------------------------------------------
1 | const config = {
2 | baseUrl: 'http://localhost:8080',
3 | };
4 |
5 | export { config };
6 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/05-wait-requests/tests/mocks/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotels';
2 | export * from './requests';
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/06-custom-commands/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env", "@babel/preset-react"],
3 | "plugins": ["react-hot-loader/babel"]
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/06-custom-commands/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 | coverage
4 | .awcache
5 | test-report.*
6 | junit.xml
7 | *.log
8 | *.orig
9 | package-lock.json
10 | yarn.lock
11 | .awcache
12 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/06-custom-commands/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/06-custom-commands/dev.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/06-custom-commands/prod.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=production
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/06-custom-commands/server/config/routes.json:
--------------------------------------------------------------------------------
1 | {
2 | "/api/*": "/$1"
3 | }
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/06-custom-commands/src/common/hooks/index.js:
--------------------------------------------------------------------------------
1 | export * from './use-flasher';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/06-custom-commands/src/common/mappers/collection.mapper.js:
--------------------------------------------------------------------------------
1 | export const mapCollection = (collection, mapFn) =>
2 | Array.isArray(collection) ? collection.map(mapFn) : [];
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/06-custom-commands/src/common/mappers/index.js:
--------------------------------------------------------------------------------
1 | export * from './collection.mapper';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/06-custom-commands/src/core/context/index.js:
--------------------------------------------------------------------------------
1 | export * from './global-state.context';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/06-custom-commands/src/core/router/history.js:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/06-custom-commands/src/core/router/index.js:
--------------------------------------------------------------------------------
1 | export * from './history';
2 | export * from './router.component';
3 | export * from './routes';
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/06-custom-commands/src/core/store/actions/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.actions';
2 | export * from './hotel-collection.actions';
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/06-custom-commands/src/core/store/index.js:
--------------------------------------------------------------------------------
1 | import * as coreActions from './actions';
2 | export { coreActions };
3 |
4 | export * from './store';
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/06-custom-commands/src/index.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/06-custom-commands/src/layouts/index.js:
--------------------------------------------------------------------------------
1 | export * from './centered.layout';
2 | export * from './app.layout';
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/06-custom-commands/src/pods/hotel-collection/components/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-card.component';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/06-custom-commands/src/pods/hotel-collection/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-collection.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/06-custom-commands/src/pods/hotel-edit/api/hotel-edit.api.js:
--------------------------------------------------------------------------------
1 | import { mockCities } from './hotel-edit.mock';
2 |
3 | export const getCities = () => Promise.resolve(mockCities);
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/06-custom-commands/src/pods/hotel-edit/api/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.api';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/06-custom-commands/src/pods/hotel-edit/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/06-custom-commands/src/pods/login/api.js:
--------------------------------------------------------------------------------
1 | export const validateCredentials = (user, password) =>
2 | new Promise(resolve => setTimeout(() => resolve(password === 'test'), 500));
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/06-custom-commands/src/pods/login/index.js:
--------------------------------------------------------------------------------
1 | export { LoginContainer } from './login.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/06-custom-commands/src/scenes/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.scene';
2 | export * from './hotel-collection.scene';
3 | export * from './hotel-edit.scene';
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/06-custom-commands/testcafe.config.js:
--------------------------------------------------------------------------------
1 | const config = {
2 | baseUrl: 'http://localhost:8080',
3 | };
4 |
5 | export { config };
6 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/06-custom-commands/tests/commands/index.js:
--------------------------------------------------------------------------------
1 | export * from './commands';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/06-custom-commands/tests/mocks/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotels';
2 | export * from './requests';
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env", "@babel/preset-react"],
3 | "plugins": ["react-hot-loader/babel"]
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 | coverage
4 | .awcache
5 | test-report.*
6 | junit.xml
7 | *.log
8 | *.orig
9 | package-lock.json
10 | yarn.lock
11 | .awcache
12 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/dev.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/prod.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=production
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/server/config/routes.json:
--------------------------------------------------------------------------------
1 | {
2 | "/api/*": "/$1"
3 | }
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/src/common/hooks/index.js:
--------------------------------------------------------------------------------
1 | export * from './use-flasher';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/src/common/mappers/collection.mapper.js:
--------------------------------------------------------------------------------
1 | export const mapCollection = (collection, mapFn) =>
2 | Array.isArray(collection) ? collection.map(mapFn) : [];
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/src/common/mappers/index.js:
--------------------------------------------------------------------------------
1 | export * from './collection.mapper';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/src/core/context/index.js:
--------------------------------------------------------------------------------
1 | export * from './global-state.context';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/src/core/router/history.js:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/src/core/router/index.js:
--------------------------------------------------------------------------------
1 | export * from './history';
2 | export * from './router.component';
3 | export * from './routes';
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/src/core/store/actions/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.actions';
2 | export * from './hotel-collection.actions';
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/src/core/store/index.js:
--------------------------------------------------------------------------------
1 | import * as coreActions from './actions';
2 | export { coreActions };
3 |
4 | export * from './store';
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/src/index.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/src/layouts/index.js:
--------------------------------------------------------------------------------
1 | export * from './centered.layout';
2 | export * from './app.layout';
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/src/pods/hotel-collection/components/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-card.component';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/src/pods/hotel-collection/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-collection.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/src/pods/hotel-edit/api/hotel-edit.api.js:
--------------------------------------------------------------------------------
1 | import { mockCities } from './hotel-edit.mock';
2 |
3 | export const getCities = () => Promise.resolve(mockCities);
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/src/pods/hotel-edit/api/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.api';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/src/pods/hotel-edit/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/src/pods/login/api.js:
--------------------------------------------------------------------------------
1 | export const validateCredentials = (user, password) =>
2 | new Promise(resolve => setTimeout(() => resolve(password === 'test'), 500));
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/src/pods/login/index.js:
--------------------------------------------------------------------------------
1 | export { LoginContainer } from './login.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/src/scenes/hotel-edit.scene.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { HotelEditContainer } from 'pods/hotel-edit';
3 |
4 | export const HotelEditScene = () => ;
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/src/scenes/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.scene';
2 | export * from './hotel-collection.scene';
3 | export * from './hotel-edit.scene';
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/testcafe.config.js:
--------------------------------------------------------------------------------
1 | const config = {
2 | baseUrl: 'http://localhost:8080',
3 | };
4 |
5 | export { config };
6 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/tests/commands/index.js:
--------------------------------------------------------------------------------
1 | export * from './commands';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/07-edit-hotel/tests/mocks/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotels';
2 | export * from './requests';
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env", "@babel/preset-react"],
3 | "plugins": ["react-hot-loader/babel"]
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 | coverage
4 | .awcache
5 | test-report.*
6 | junit.xml
7 | *.log
8 | *.orig
9 | package-lock.json
10 | yarn.lock
11 | .awcache
12 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/dev.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/prod.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=production
2 | BASE_PICTURES_URL=http://localhost:3000
3 | BASE_API_URL=http://localhost:3000
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/server/config/routes.json:
--------------------------------------------------------------------------------
1 | {
2 | "/api/*": "/$1"
3 | }
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/src/common/hooks/index.js:
--------------------------------------------------------------------------------
1 | export * from './use-flasher';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/src/common/mappers/collection.mapper.js:
--------------------------------------------------------------------------------
1 | export const mapCollection = (collection, mapFn) =>
2 | Array.isArray(collection) ? collection.map(mapFn) : [];
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/src/common/mappers/index.js:
--------------------------------------------------------------------------------
1 | export * from './collection.mapper';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/src/core/context/index.js:
--------------------------------------------------------------------------------
1 | export * from './global-state.context';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/src/core/router/history.js:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/src/core/router/index.js:
--------------------------------------------------------------------------------
1 | export * from './history';
2 | export * from './router.component';
3 | export * from './routes';
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/src/core/store/action-types.js:
--------------------------------------------------------------------------------
1 | export const actionTypes = {
2 | ON_UPDATE_LOGIN: 'CORE [1]: ON_UPDATE_LOGIN',
3 | ON_UPDATE_HOTEL_COLLECTION: 'CORE [2]: ON_UPDATE_HOTEL_COLLECTION',
4 | };
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/src/core/store/actions/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.actions';
2 | export * from './hotel-collection.actions';
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/src/core/store/index.js:
--------------------------------------------------------------------------------
1 | import * as coreActions from './actions';
2 | export { coreActions };
3 |
4 | export * from './store';
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/src/index.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/src/layouts/index.js:
--------------------------------------------------------------------------------
1 | export * from './centered.layout';
2 | export * from './app.layout';
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/src/pods/hotel-collection/components/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-card.component';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/src/pods/hotel-collection/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-collection.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/src/pods/hotel-edit/api/hotel-edit.api.js:
--------------------------------------------------------------------------------
1 | import { mockCities } from './hotel-edit.mock';
2 |
3 | export const getCities = () => Promise.resolve(mockCities);
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/src/pods/hotel-edit/api/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.api';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/src/pods/hotel-edit/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotel-edit.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/src/pods/login/api.js:
--------------------------------------------------------------------------------
1 | export const validateCredentials = (user, password) =>
2 | new Promise(resolve => setTimeout(() => resolve(password === 'test'), 500));
3 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/src/pods/login/index.js:
--------------------------------------------------------------------------------
1 | export { LoginContainer } from './login.container';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/src/scenes/hotel-edit.scene.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { HotelEditContainer } from 'pods/hotel-edit';
3 |
4 | export const HotelEditScene = () => ;
5 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/src/scenes/index.js:
--------------------------------------------------------------------------------
1 | export * from './login.scene';
2 | export * from './hotel-collection.scene';
3 | export * from './hotel-edit.scene';
4 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/testcafe.config.js:
--------------------------------------------------------------------------------
1 | const config = {
2 | baseUrl: 'http://localhost:8080',
3 | };
4 |
5 | export { config };
6 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/tests/commands/index.js:
--------------------------------------------------------------------------------
1 | export * from './commands';
2 |
--------------------------------------------------------------------------------
/05-e2e/02-testcafe/08-ci/tests/mocks/index.js:
--------------------------------------------------------------------------------
1 | export * from './hotels';
2 | export * from './requests';
3 |
--------------------------------------------------------------------------------
/06-bdd-cucumber/00-boilerplate/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["@babel/preset-env"],
3 | "plugins": ["react-hot-loader/babel"]
4 | }
5 |
--------------------------------------------------------------------------------
/06-bdd-cucumber/00-boilerplate/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 | coverage
4 | .awcache
5 | test-report.*
6 | junit.xml
7 | *.log
8 | *.orig
9 | package-lock.json
10 | yarn.lock
11 | .awcache
12 | public
--------------------------------------------------------------------------------
/06-bdd-cucumber/00-boilerplate/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "es5"
4 | }
5 |
--------------------------------------------------------------------------------
/06-bdd-cucumber/00-boilerplate/dev.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 |
--------------------------------------------------------------------------------
/06-bdd-cucumber/00-boilerplate/prod.env:
--------------------------------------------------------------------------------
1 | NODE_ENV=production
2 |
--------------------------------------------------------------------------------
/06-bdd-cucumber/00-boilerplate/src/core/router/history.ts:
--------------------------------------------------------------------------------
1 | import { createHashHistory } from 'history';
2 |
3 | export const history = createHashHistory();
4 |
--------------------------------------------------------------------------------
/06-bdd-cucumber/00-boilerplate/src/core/router/index.ts:
--------------------------------------------------------------------------------
1 | export * from './history';
2 | export * from './router.component';
3 | export * from './routes';
4 |
--------------------------------------------------------------------------------
/06-bdd-cucumber/00-boilerplate/src/core/store/index.ts:
--------------------------------------------------------------------------------
1 | export * from './store';
2 |
--------------------------------------------------------------------------------
/06-bdd-cucumber/00-boilerplate/src/core/store/root-saga.ts:
--------------------------------------------------------------------------------
1 | import { all, fork } from 'redux-saga/effects';
2 |
3 | export function* rootSaga() {
4 | yield all([
5 | // fork();
6 | ]);
7 | }
8 |
--------------------------------------------------------------------------------
/06-bdd-cucumber/00-boilerplate/src/index.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import * as ReactDOM from 'react-dom';
3 | import App from './app';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/06-bdd-cucumber/00-boilerplate/src/layout/index.ts:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lemoncode/react-testing-by-example/2a4757b710c530314174b27e46e4f90b95db4d86/06-bdd-cucumber/00-boilerplate/src/layout/index.ts
--------------------------------------------------------------------------------
/06-bdd-cucumber/00-boilerplate/src/scenes/index.ts:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lemoncode/react-testing-by-example/2a4757b710c530314174b27e46e4f90b95db4d86/06-bdd-cucumber/00-boilerplate/src/scenes/index.ts
--------------------------------------------------------------------------------