├── .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 --------------------------------------------------------------------------------