├── .all-contributorsrc ├── .editorconfig ├── .eslintignore ├── .eslintrc.json ├── .github ├── funding.yml ├── github-action │ ├── action.yml │ ├── contributors.js │ └── index.js └── workflows │ ├── close-inactive-pr.yml │ ├── label-issue-update.yml │ └── label-issue.yml ├── .gitignore ├── .husky ├── commit-msg └── pre-commit ├── .prettierignore ├── .prettierrc ├── .vscode ├── extensions.json └── settings.json ├── CONTRIBUTING.md ├── README.md ├── apps ├── .gitkeep ├── angular │ ├── 1-projection │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ ├── component │ │ │ │ │ ├── city-card │ │ │ │ │ │ └── city-card.component.ts │ │ │ │ │ ├── student-card │ │ │ │ │ │ └── student-card.component.ts │ │ │ │ │ └── teacher-card │ │ │ │ │ │ └── teacher-card.component.ts │ │ │ │ ├── data-access │ │ │ │ │ ├── city.store.ts │ │ │ │ │ ├── fake-http.service.ts │ │ │ │ │ ├── student.store.ts │ │ │ │ │ └── teacher.store.ts │ │ │ │ ├── model │ │ │ │ │ ├── card.model.ts │ │ │ │ │ ├── city.model.ts │ │ │ │ │ ├── student.model.ts │ │ │ │ │ └── teacher.model.ts │ │ │ │ └── ui │ │ │ │ │ ├── card │ │ │ │ │ └── card.component.ts │ │ │ │ │ └── list-item │ │ │ │ │ └── list-item.component.ts │ │ │ ├── assets │ │ │ │ ├── .gitkeep │ │ │ │ ├── img │ │ │ │ │ ├── city.png │ │ │ │ │ ├── student.webp │ │ │ │ │ └── teacher.png │ │ │ │ └── svg │ │ │ │ │ └── trash.svg │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ ├── polyfills.ts │ │ │ ├── styles.scss │ │ │ └── test-setup.ts │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json │ ├── 10-utility-wrapper-pipe │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ └── person.utils.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ ├── polyfills.ts │ │ │ └── styles.scss │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ └── tsconfig.json │ ├── 13-highly-customizable-css │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── page.component.ts │ │ │ │ ├── static-text.component.ts │ │ │ │ └── text.component.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ └── styles.scss │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ └── tsconfig.json │ ├── 16-master-dependency-injection │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ ├── currency.pipe.ts │ │ │ │ ├── currency.service.ts │ │ │ │ └── product.model.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ └── styles.scss │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ └── tsconfig.json │ ├── 21-anchor-navigation │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.config.ts │ │ │ │ ├── app.routes.ts │ │ │ │ ├── foo.component.ts │ │ │ │ ├── home.component.ts │ │ │ │ └── nav-button.component.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ ├── styles.scss │ │ │ └── test-setup.ts │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json │ ├── 22-router-input │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.config.ts │ │ │ │ ├── app.routes.ts │ │ │ │ ├── home.component.ts │ │ │ │ └── test.component.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ └── styles.scss │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ └── tsconfig.json │ ├── 31-module-to-standalone │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ └── app.module.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ └── styles.scss │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ └── tsconfig.json │ ├── 32-change-detection-bug │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.config.ts │ │ │ │ ├── bar.component.ts │ │ │ │ ├── fake.service.ts │ │ │ │ ├── foo.component.ts │ │ │ │ └── main-navigation.component.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ ├── styles.scss │ │ │ └── test-setup.ts │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json │ ├── 33-decoupling-components │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ └── app.component.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ └── styles.scss │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ └── tsconfig.json │ ├── 39-injection-token │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.config.ts │ │ │ │ ├── data.ts │ │ │ │ ├── phone.component.ts │ │ │ │ ├── timer-container.component.ts │ │ │ │ ├── timer.component.ts │ │ │ │ └── video.component.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ ├── styles.scss │ │ │ └── test-setup.ts │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json │ ├── 4-typed-context-outlet │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ ├── list.component.ts │ │ │ │ └── person.component.ts │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ ├── polyfills.ts │ │ │ └── styles.scss │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ └── tsconfig.json │ ├── 44-view-transition │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.config.ts │ │ │ │ ├── blog │ │ │ │ │ ├── blog.component.ts │ │ │ │ │ ├── thumbnail-header.component.ts │ │ │ │ │ └── thumbnail.component.ts │ │ │ │ ├── data.ts │ │ │ │ ├── post.model.ts │ │ │ │ └── post │ │ │ │ │ ├── post-header.component.ts │ │ │ │ │ └── post.component.ts │ │ │ ├── assets │ │ │ │ ├── .gitkeep │ │ │ │ ├── angular.webp │ │ │ │ ├── guard.full.webp │ │ │ │ ├── highly-custom.full.webp │ │ │ │ ├── profil.webp │ │ │ │ └── signal-cd.full.webp │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ └── styles.scss │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ └── tsconfig.json │ ├── 45-react-in-angular │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.config.ts │ │ │ │ └── react │ │ │ │ │ ├── ReactPost.tsx │ │ │ │ │ └── post.component.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ ├── styles.scss │ │ │ └── test-setup.ts │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json │ ├── 46-simple-animations │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ └── app.config.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ ├── styles.scss │ │ │ └── test-setup.ts │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json │ ├── 5-crud-application │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ └── app.config.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ ├── polyfills.ts │ │ │ ├── styles.scss │ │ │ └── test-setup.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json │ ├── 52-lazy-load-component │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.module.ts │ │ │ │ ├── placeholder.component.ts │ │ │ │ └── top.component.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ ├── styles.scss │ │ │ └── test-setup.ts │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json │ ├── 55-back-button-navigation │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.html │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.config.ts │ │ │ │ ├── app.routes.ts │ │ │ │ ├── dialog │ │ │ │ │ ├── dialog.component.html │ │ │ │ │ └── dialog.component.ts │ │ │ │ ├── home │ │ │ │ │ ├── home.component.html │ │ │ │ │ └── home.component.ts │ │ │ │ ├── sensitive-action │ │ │ │ │ ├── sensitive-action.component.html │ │ │ │ │ └── sensitive-action.component.ts │ │ │ │ └── simple-action │ │ │ │ │ ├── simple-action.component.html │ │ │ │ │ └── simple-action.component.ts │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ ├── styles.scss │ │ │ └── test-setup.ts │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json │ ├── 57-content-projection-default │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── public │ │ │ └── favicon.ico │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.config.ts │ │ │ │ └── card.component.ts │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ └── styles.scss │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ └── tsconfig.json │ ├── 58-content-projection-condition │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── public │ │ │ └── favicon.ico │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.config.ts │ │ │ │ └── card.component.ts │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ └── styles.scss │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ └── tsconfig.json │ ├── 59-content-projection-defer │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── public │ │ │ └── favicon.ico │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.config.ts │ │ │ │ ├── app.routes.ts │ │ │ │ ├── expandable-card.ts │ │ │ │ ├── page-1.ts │ │ │ │ └── page-2.ts │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ └── styles.scss │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ └── tsconfig.json │ ├── 6-structural-directive │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.config.ts │ │ │ │ ├── button.component.ts │ │ │ │ ├── dashboard │ │ │ │ │ ├── admin.component.ts │ │ │ │ │ └── manager.component.ts │ │ │ │ ├── information.component.ts │ │ │ │ ├── login.component.ts │ │ │ │ ├── routes.ts │ │ │ │ ├── user.model.ts │ │ │ │ └── user.store.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ ├── polyfills.ts │ │ │ └── styles.scss │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ └── tsconfig.json │ ├── 8-pure-pipe │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ └── app.component.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ ├── polyfills.ts │ │ │ └── styles.scss │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ └── tsconfig.json │ └── 9-wrap-function-pipe │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── src │ │ ├── app │ │ │ └── app.component.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ ├── polyfills.ts │ │ └── styles.scss │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ └── tsconfig.json ├── forms │ ├── 41-control-value-accessor │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ ├── feedback-form │ │ │ │ │ ├── feedback-form.component.html │ │ │ │ │ ├── feedback-form.component.scss │ │ │ │ │ └── feedback-form.component.ts │ │ │ │ └── rating-control │ │ │ │ │ ├── rating-control.component.html │ │ │ │ │ ├── rating-control.component.scss │ │ │ │ │ └── rating-control.component.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ ├── styles.scss │ │ │ └── test-setup.ts │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json │ └── 48-avoid-losing-form-data │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── src │ │ ├── app │ │ │ ├── app.component.ts │ │ │ ├── app.config.ts │ │ │ ├── app.routes.ts │ │ │ ├── pages │ │ │ │ ├── join.component.ts │ │ │ │ └── page.component.ts │ │ │ └── ui │ │ │ │ ├── dialog.component.ts │ │ │ │ ├── form.component.ts │ │ │ │ └── nav.component.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ └── styles.scss │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ └── tsconfig.json ├── nx │ └── 42-static-vs-dynamic-import │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── src │ │ ├── app │ │ │ ├── app.component.ts │ │ │ └── app.config.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ └── styles.scss │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ └── tsconfig.json ├── performance │ ├── 12-optimize-change-detection │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ └── app.component.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ ├── styles.scss │ │ │ └── test-setup.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json │ ├── 34-default-vs-onpush │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.config.ts │ │ │ │ ├── person-list.component.ts │ │ │ │ └── random.component.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ └── styles.scss │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ └── tsconfig.json │ ├── 35-memoization │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.config.ts │ │ │ │ ├── generateList.ts │ │ │ │ ├── person-list.component.ts │ │ │ │ └── person.model.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ └── styles.scss │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ └── tsconfig.json │ ├── 36-ngfor-optimization │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.config.ts │ │ │ │ ├── generateList.ts │ │ │ │ ├── list.service.ts │ │ │ │ ├── person-list.component.ts │ │ │ │ └── person.model.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ ├── styles.scss │ │ │ └── test-setup.ts │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json │ ├── 37-optimize-big-list │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.config.ts │ │ │ │ ├── generateList.ts │ │ │ │ ├── list.service.ts │ │ │ │ ├── person-list.component.ts │ │ │ │ └── person.model.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ └── styles.scss │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ └── tsconfig.json │ └── 40-web-workers │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── src │ │ ├── app │ │ │ ├── app.component.ts │ │ │ ├── heavy-calculation.service.ts │ │ │ └── unknown-person │ │ │ │ ├── unknown-person.component.css │ │ │ │ └── unknown-person.component.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ └── styles.scss │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ └── tsconfig.json ├── rxjs │ ├── 11-high-order-operator-bug │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.service.ts │ │ │ │ └── localDB.service.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ └── styles.scss │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ └── tsconfig.json │ ├── 14-race-condition │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── cypress.config.ts │ │ ├── cypress │ │ │ ├── fixtures │ │ │ │ └── example.json │ │ │ ├── support │ │ │ │ ├── commands.ts │ │ │ │ ├── component-index.html │ │ │ │ └── component.ts │ │ │ └── tsconfig.json │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.cy.ts │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.config.ts │ │ │ │ ├── topic-dialog.component.ts │ │ │ │ └── topic.service.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ ├── styles.scss │ │ │ └── test-setup.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json │ ├── 38-catch-error │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.css │ │ │ │ ├── app.component.spec.ts │ │ │ │ ├── app.component.ts │ │ │ │ └── app.config.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ ├── styles.scss │ │ │ └── test-setup.ts │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json │ └── 49-hold-to-save-button │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ ├── app │ │ │ ├── app.component.ts │ │ │ └── app.config.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ ├── styles.scss │ │ └── test-setup.ts │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json ├── signal │ ├── 30-interop-rxjs-signal │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.config.ts │ │ │ │ ├── detail │ │ │ │ │ └── detail.component.ts │ │ │ │ ├── list │ │ │ │ │ ├── photos.component.ts │ │ │ │ │ └── photos.store.ts │ │ │ │ ├── photo.model.ts │ │ │ │ └── photos.service.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ ├── styles.scss │ │ │ └── test-setup.ts │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json │ ├── 43-signal-input │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.config.ts │ │ │ │ └── user.component.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ └── styles.scss │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ └── tsconfig.json │ ├── 50-bug-in-effect │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ └── app.config.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ └── styles.scss │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ └── tsconfig.json │ ├── 51-function-call-effect │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── action.component.ts │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.config.ts │ │ │ │ └── user.service.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ └── styles.scss │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ └── tsconfig.json │ ├── 53-big-signal-performance │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── address.component.ts │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.config.ts │ │ │ │ ├── job.component.ts │ │ │ │ ├── name.component.ts │ │ │ │ ├── note.component.ts │ │ │ │ ├── user-form.component.ts │ │ │ │ └── user.service.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ └── styles.scss │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ └── tsconfig.json │ ├── 54-pipe-observable-to-signal │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ ├── currency.pipe.ts │ │ │ │ ├── currency.service.ts │ │ │ │ ├── product-row.component.ts │ │ │ │ └── product.model.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ └── styles.scss │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ └── tsconfig.json │ └── 56-forms-and-signal │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── public │ │ └── favicon.ico │ │ ├── src │ │ ├── app │ │ │ ├── app.component.ts │ │ │ ├── app.config.ts │ │ │ ├── app.routes.ts │ │ │ ├── checkout.component.ts │ │ │ ├── dashboard.component.ts │ │ │ ├── order.component.ts │ │ │ ├── payment.component.ts │ │ │ └── products.ts │ │ ├── index.html │ │ ├── main.ts │ │ └── styles.scss │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ └── tsconfig.json ├── testing │ ├── 17-router │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── cypress.config.ts │ │ ├── cypress │ │ │ ├── fixtures │ │ │ │ └── example.json │ │ │ ├── support │ │ │ │ ├── commands.ts │ │ │ │ ├── component-index.html │ │ │ │ └── component.ts │ │ │ └── tsconfig.json │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.cy.ts │ │ │ │ ├── app.component.spec.ts │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.config.ts │ │ │ │ ├── app.routes.ts │ │ │ │ ├── book.guard.ts │ │ │ │ ├── book.model.ts │ │ │ │ ├── no-book-search.component.ts │ │ │ │ ├── search.component.ts │ │ │ │ └── shelf.component.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ ├── styles.scss │ │ │ └── test-setup.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json │ ├── 18-nested-components │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── cypress.config.ts │ │ ├── cypress │ │ │ ├── fixtures │ │ │ │ └── example.json │ │ │ ├── support │ │ │ │ ├── commands.ts │ │ │ │ ├── component-index.html │ │ │ │ └── component.ts │ │ │ └── tsconfig.json │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ ├── child.component.cy.ts │ │ │ │ ├── child.component.spec.ts │ │ │ │ ├── child.component.ts │ │ │ │ └── http.service.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ ├── styles.scss │ │ │ └── test-setup.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json │ ├── 19-input-output │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── cypress.config.ts │ │ ├── cypress │ │ │ ├── fixtures │ │ │ │ └── example.json │ │ │ ├── support │ │ │ │ ├── commands.ts │ │ │ │ ├── component-index.html │ │ │ │ └── component.ts │ │ │ └── tsconfig.json │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ ├── counter.component.cy.ts │ │ │ │ ├── counter.component.spec.ts │ │ │ │ └── counter.component.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ ├── styles.scss │ │ │ └── test-setup.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json │ ├── 20-modal │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── cypress.config.ts │ │ ├── cypress │ │ │ ├── fixtures │ │ │ │ └── example.json │ │ │ ├── support │ │ │ │ ├── commands.ts │ │ │ │ ├── component-index.html │ │ │ │ └── component.ts │ │ │ └── tsconfig.json │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.cy.ts │ │ │ │ ├── app.component.spec.ts │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.config.ts │ │ │ │ ├── error.dialog.ts │ │ │ │ └── profil-confirmation.dialog.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ ├── styles.scss │ │ │ └── test-setup.ts │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json │ ├── 23-harness │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.config.ts │ │ │ │ ├── child.component.spec.ts │ │ │ │ └── child.component.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ ├── styles.scss │ │ │ └── test-setup.ts │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json │ ├── 24-harness-creation │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.spec.ts │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.config.ts │ │ │ │ ├── slider.component.ts │ │ │ │ └── slider.harness.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ ├── styles.scss │ │ │ └── test-setup.ts │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json │ ├── 28-checkbox │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.component.spec.ts │ │ │ │ └── app.component.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── main.ts │ │ │ ├── styles.scss │ │ │ └── test-setup.ts │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json │ └── 29-real-life-application │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── cypress.config.ts │ │ ├── cypress │ │ ├── fixtures │ │ │ └── example.json │ │ ├── support │ │ │ ├── commands.ts │ │ │ ├── component-index.html │ │ │ └── component.ts │ │ └── tsconfig.json │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ ├── app │ │ │ ├── app.component.ts │ │ │ ├── app.config.ts │ │ │ ├── app.route.ts │ │ │ ├── backend.service.ts │ │ │ ├── detail │ │ │ │ ├── detail.component.ts │ │ │ │ └── detail.store.ts │ │ │ └── list │ │ │ │ ├── list.component.spec.ts │ │ │ │ ├── list.component.ts │ │ │ │ ├── ticket.store.spec.ts │ │ │ │ ├── ticket.store.ts │ │ │ │ └── ui │ │ │ │ ├── add.component.ts │ │ │ │ ├── row.component.spec.ts │ │ │ │ └── row.component.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ ├── styles.scss │ │ └── test-setup.ts │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.editor.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json └── typescript │ ├── 15-function-overload │ ├── .eslintrc.json │ ├── README.md │ ├── project.json │ ├── src │ │ ├── app │ │ │ ├── app.component.ts │ │ │ └── vehicle.utils.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ └── styles.scss │ ├── tsconfig.app.json │ ├── tsconfig.editor.json │ └── tsconfig.json │ └── 47-enums-vs-union-types │ ├── .eslintrc.json │ ├── README.md │ ├── project.json │ ├── src │ ├── app │ │ ├── app.component.ts │ │ └── app.config.ts │ ├── assets │ │ └── .gitkeep │ ├── favicon.ico │ ├── index.html │ ├── main.ts │ └── styles.scss │ ├── tailwind.config.js │ ├── tsconfig.app.json │ ├── tsconfig.editor.json │ └── tsconfig.json ├── challenge-number.json ├── commitlint.config.js ├── docs ├── .gitignore ├── .vscode │ ├── extensions.json │ ├── launch.json │ └── settings.json ├── README.md ├── astro.config.mjs ├── package-lock.json ├── package.json ├── public │ ├── angular-challenge.ico │ └── angular-challenge.webp ├── src │ ├── assets │ │ ├── 4 │ │ │ ├── unknown-person.png │ │ │ └── unknown-student.png │ │ ├── PR-code-btn-modal.png │ │ ├── PR-header.png │ │ ├── angular-challenge.webp │ │ ├── codespaces.png │ │ ├── fork-sync.png │ │ ├── header-github.png │ │ ├── new-pull-request.png │ │ ├── performance │ │ │ ├── 34 │ │ │ │ └── profiler-record.png │ │ │ ├── 35 │ │ │ │ └── memoize-profiler.png │ │ │ └── profiler-tab.png │ │ ├── rxjs │ │ │ └── 49 │ │ │ │ └── prototype.gif │ │ └── sync-fork-update.png │ ├── components │ │ ├── ActionButtonFooter.astro │ │ ├── Author.astro │ │ ├── ChallengeFooter.astro │ │ ├── ClipboardCopy.astro │ │ ├── CommentSection.astro │ │ ├── Content.astro │ │ ├── ContributorsFooter.astro │ │ ├── Hero.astro │ │ ├── MobileMenuFooter.astro │ │ ├── MyIcon.astro │ │ ├── PageTitle.astro │ │ ├── SiteTitle.astro │ │ ├── SubscriptionForm.astro │ │ ├── TableOfContents.astro │ │ ├── VideoButton.astro │ │ ├── github │ │ │ ├── AnswerNumber.svelte │ │ │ ├── AnsweredUser.svelte │ │ │ ├── GitHubStats.svelte │ │ │ ├── SignUp.svelte │ │ │ ├── SponsorUser.svelte │ │ │ ├── github-store.ts │ │ │ └── tooltip.js │ │ ├── icons.ts │ │ └── leaderboard │ │ │ ├── LeaderboardAnswer.svelte │ │ │ ├── LeaderboardChallenge.svelte │ │ │ ├── LeaderboardCommit.svelte │ │ │ ├── Spinner.svelte │ │ │ └── UserBox.svelte │ ├── content │ │ ├── authors │ │ │ ├── Ioannis-Tsironis.json │ │ │ ├── devesh-chaudhari.json │ │ │ ├── lance-finney.json │ │ │ ├── stanislav-gavrilov.json │ │ │ ├── sven-brodny.json │ │ │ ├── thomas-laforge.json │ │ │ ├── timothy-alcaide.json │ │ │ └── wandrille-guesdon.json │ │ ├── config.ts │ │ ├── docs │ │ │ ├── challenges │ │ │ │ ├── angular │ │ │ │ │ ├── 1-projection.md │ │ │ │ │ ├── 10-utility-wrapper-pipe.md │ │ │ │ │ ├── 13-highly-customizable-css.md │ │ │ │ │ ├── 16-master-dependency-injection.md │ │ │ │ │ ├── 21-anchor-navigation.md │ │ │ │ │ ├── 22-router-input.md │ │ │ │ │ ├── 31-module-to-standalone.md │ │ │ │ │ ├── 32-change-detection-bug.md │ │ │ │ │ ├── 33-decoupling-components.md │ │ │ │ │ ├── 39-injection-token.md │ │ │ │ │ ├── 4-typed-context-outlet.md │ │ │ │ │ ├── 44-view-transition.md │ │ │ │ │ ├── 45-react-in-angular.md │ │ │ │ │ ├── 46-simple-animations.md │ │ │ │ │ ├── 5-crud-application.md │ │ │ │ │ ├── 52-lazy-load-component.md │ │ │ │ │ ├── 55-back-button-navigation.md │ │ │ │ │ ├── 57-content-projection-default.md │ │ │ │ │ ├── 58-content-projection-condition.md │ │ │ │ │ ├── 59-content-projection-defer.md │ │ │ │ │ ├── 6-structural-directive.md │ │ │ │ │ ├── 8-pure-pipe.md │ │ │ │ │ └── 9-wrap-function-pipe.md │ │ │ │ ├── forms │ │ │ │ │ ├── 41-control-value-accessor.md │ │ │ │ │ └── 48-avoid-losing-form-data.md │ │ │ │ ├── nx │ │ │ │ │ ├── 25-generator-lib-ext.md │ │ │ │ │ ├── 26-generator-comp.md │ │ │ │ │ ├── 27-forbid-enum-rule.md │ │ │ │ │ └── 42-static-vs-dynamic-import.md │ │ │ │ ├── performance │ │ │ │ │ ├── 12-optimize-change-detection.md │ │ │ │ │ ├── 34-default-vs-onpush.md │ │ │ │ │ ├── 35-memoization.md │ │ │ │ │ ├── 36-ngfor-optimization.md │ │ │ │ │ ├── 37-optimize-big-list.md │ │ │ │ │ ├── 40-web-worker.md │ │ │ │ │ └── index.mdx │ │ │ │ ├── rxjs │ │ │ │ │ ├── 11-high-order-operator-bug.md │ │ │ │ │ ├── 14-race-condition.md │ │ │ │ │ ├── 38-rxjs-catch-error.md │ │ │ │ │ └── 49-hold-to-save-button.md │ │ │ │ ├── signal │ │ │ │ │ ├── 30-interop-rxjs-signal.md │ │ │ │ │ ├── 43-signal-input.md │ │ │ │ │ ├── 50-bug-effect-signal.md │ │ │ │ │ ├── 51-function-call-effect.md │ │ │ │ │ ├── 53-big-signal-performance.md │ │ │ │ │ ├── 54-pipe-observable-to-signal.md │ │ │ │ │ └── 56-forms-and-signal.md │ │ │ │ ├── testing │ │ │ │ │ ├── 17-router.md │ │ │ │ │ ├── 18-nested-components.md │ │ │ │ │ ├── 19-input-output.md │ │ │ │ │ ├── 20-modal.md │ │ │ │ │ ├── 23-harness.md │ │ │ │ │ ├── 24-harness-creation.md │ │ │ │ │ ├── 28-checkbox.md │ │ │ │ │ ├── 29-real-life-application.md │ │ │ │ │ └── index.mdx │ │ │ │ └── typescript │ │ │ │ │ ├── 15-function-overload.md │ │ │ │ │ └── 47-enums-vs-union-types.md │ │ │ ├── es │ │ │ │ ├── challenges │ │ │ │ │ ├── angular │ │ │ │ │ │ ├── 1-projection.md │ │ │ │ │ │ ├── 10-utility-wrapper-pipe.md │ │ │ │ │ │ ├── 13-highly-customizable-css.md │ │ │ │ │ │ ├── 16-master-dependency-injection.md │ │ │ │ │ │ ├── 21-anchor-navigation.md │ │ │ │ │ │ ├── 22-router-input.md │ │ │ │ │ │ ├── 3-directive-enhancement.md │ │ │ │ │ │ ├── 31-module-to-standalone.md │ │ │ │ │ │ ├── 32-change-detection-bug.md │ │ │ │ │ │ ├── 33-decoupling-components.md │ │ │ │ │ │ ├── 39-injection-token.md │ │ │ │ │ │ ├── 4-typed-context-outlet.md │ │ │ │ │ │ ├── 5-crud-application.md │ │ │ │ │ │ ├── 6-structural-directive.md │ │ │ │ │ │ ├── 8-pure-pipe.md │ │ │ │ │ │ └── 9-wrap-function-pipe.md │ │ │ │ │ ├── performance │ │ │ │ │ │ ├── 12-optimize-change-detection.md │ │ │ │ │ │ ├── 34-default-vs-onpush.md │ │ │ │ │ │ ├── 35-memoization.md │ │ │ │ │ │ ├── 36-ngfor-optimization.md │ │ │ │ │ │ ├── 37-optimize-big-list.md │ │ │ │ │ │ └── index.mdx │ │ │ │ │ └── signal │ │ │ │ │ │ └── 30-interop-rxjs-signal.md │ │ │ │ ├── guides │ │ │ │ │ ├── checkout-answer.md │ │ │ │ │ ├── contribute.md │ │ │ │ │ ├── create-challenge.md │ │ │ │ │ ├── faq.md │ │ │ │ │ ├── getting-started.md │ │ │ │ │ ├── rebase.md │ │ │ │ │ └── resolve-challenge.md │ │ │ │ └── index.mdx │ │ │ ├── fr │ │ │ │ ├── challenges │ │ │ │ │ └── angular │ │ │ │ │ │ ├── 1-projection.md │ │ │ │ │ │ ├── 21-anchor-navigation.md │ │ │ │ │ │ ├── 22-router-input.md │ │ │ │ │ │ ├── 31-module-to-standalone.md │ │ │ │ │ │ ├── 46-simple-animations.md │ │ │ │ │ │ ├── 5-crud-application.md │ │ │ │ │ │ └── 8-pure-pipe.md │ │ │ │ ├── guides │ │ │ │ │ ├── checkout-answer.md │ │ │ │ │ ├── contribute.md │ │ │ │ │ ├── create-challenge.md │ │ │ │ │ ├── faq.md │ │ │ │ │ ├── getting-started.md │ │ │ │ │ ├── rebase.md │ │ │ │ │ └── resolve-challenge.md │ │ │ │ └── index.mdx │ │ │ ├── guides │ │ │ │ ├── checkout-answer.md │ │ │ │ ├── contribute.md │ │ │ │ ├── create-challenge.md │ │ │ │ ├── faq.md │ │ │ │ ├── getting-started.md │ │ │ │ ├── rebase.md │ │ │ │ └── resolve-challenge.md │ │ │ ├── index.mdx │ │ │ ├── leaderboard │ │ │ │ ├── answers.mdx │ │ │ │ ├── challenges.mdx │ │ │ │ └── commit.mdx │ │ │ ├── pt │ │ │ │ ├── challenges │ │ │ │ │ ├── angular │ │ │ │ │ │ ├── 1-projection.md │ │ │ │ │ │ ├── 10-utility-wrapper-pipe.md │ │ │ │ │ │ ├── 13-highly-customizable-css.md │ │ │ │ │ │ ├── 16-master-dependency-injection.md │ │ │ │ │ │ ├── 21-anchor-navigation.md │ │ │ │ │ │ ├── 22-router-input.md │ │ │ │ │ │ ├── 3-directive-enhancement.md │ │ │ │ │ │ ├── 31-module-to-standalone.md │ │ │ │ │ │ ├── 32-change-detection-bug.md │ │ │ │ │ │ ├── 39-injection-token.md │ │ │ │ │ │ ├── 4-typed-context-outlet.md │ │ │ │ │ │ ├── 44-view-transition.md │ │ │ │ │ │ ├── 45-react-in-angular.md │ │ │ │ │ │ ├── 46-simple-animations.md │ │ │ │ │ │ ├── 5-crud-application.md │ │ │ │ │ │ ├── 6-structural-directive.md │ │ │ │ │ │ ├── 8-pure-pipe.md │ │ │ │ │ │ └── 9-wrap-function-pipe.md │ │ │ │ │ ├── forms │ │ │ │ │ │ └── 41-control-value-accessor.md │ │ │ │ │ ├── rxjs │ │ │ │ │ │ └── 38-rxjs-catch-error.md │ │ │ │ │ └── signal │ │ │ │ │ │ ├── 30-interop-rxjs-signal.md │ │ │ │ │ │ └── 43-signal-input.md │ │ │ │ ├── guides │ │ │ │ │ ├── checkout-answer.md │ │ │ │ │ ├── contribute.md │ │ │ │ │ ├── create-challenge.md │ │ │ │ │ ├── faq.md │ │ │ │ │ ├── getting-started.md │ │ │ │ │ ├── rebase.md │ │ │ │ │ └── resolve-challenge.md │ │ │ │ ├── index.mdx │ │ │ │ └── leaderboard │ │ │ │ │ ├── answers.mdx │ │ │ │ │ ├── challenges.mdx │ │ │ │ │ └── commit.mdx │ │ │ ├── ru │ │ │ │ ├── challenges │ │ │ │ │ ├── angular │ │ │ │ │ │ ├── 1-projection.md │ │ │ │ │ │ ├── 21-anchor-navigation.md │ │ │ │ │ │ ├── 22-router-input.md │ │ │ │ │ │ ├── 31-module-to-standalone.md │ │ │ │ │ │ ├── 4-typed-context-outlet.md │ │ │ │ │ │ ├── 46-simple-animations.md │ │ │ │ │ │ ├── 5-crud-application.md │ │ │ │ │ │ ├── 52-lazy-load-component.md │ │ │ │ │ │ └── 8-pure-pipe.md │ │ │ │ │ ├── forms │ │ │ │ │ │ └── 41-control-value-accessor.md │ │ │ │ │ ├── performance │ │ │ │ │ │ ├── 12-optimize-change-detection.md │ │ │ │ │ │ ├── 34-default-vs-onpush.md │ │ │ │ │ │ ├── 35-memoization.md │ │ │ │ │ │ ├── 36-ngfor-optimization.md │ │ │ │ │ │ ├── 37-optimize-big-list.md │ │ │ │ │ │ ├── 40-web-worker.md │ │ │ │ │ │ └── index.mdx │ │ │ │ │ ├── rxjs │ │ │ │ │ │ ├── 11-high-order-operator-bug.md │ │ │ │ │ │ ├── 14-race-condition.md │ │ │ │ │ │ └── 38-rxjs-catch-error.md │ │ │ │ │ ├── signal │ │ │ │ │ │ └── 43-signal-input.md │ │ │ │ │ └── testing │ │ │ │ │ │ ├── 17-router.md │ │ │ │ │ │ ├── 18-nested-components.md │ │ │ │ │ │ ├── 19-input-output.md │ │ │ │ │ │ ├── 20-modal.md │ │ │ │ │ │ ├── 23-harness.md │ │ │ │ │ │ ├── 24-harness-creation.md │ │ │ │ │ │ ├── 28-checkbox.md │ │ │ │ │ │ ├── 29-real-life-application.md │ │ │ │ │ │ └── index.mdx │ │ │ │ ├── guides │ │ │ │ │ ├── checkout-answer.md │ │ │ │ │ ├── contribute.md │ │ │ │ │ ├── create-challenge.md │ │ │ │ │ ├── faq.md │ │ │ │ │ ├── getting-started.md │ │ │ │ │ ├── rebase.md │ │ │ │ │ └── resolve-challenge.md │ │ │ │ └── index.mdx │ │ │ ├── subscription │ │ │ │ └── index.mdx │ │ │ └── zh-cn │ │ │ │ ├── challenges │ │ │ │ └── angular │ │ │ │ │ └── 1-projection.md │ │ │ │ ├── guides │ │ │ │ ├── checkout-answer.md │ │ │ │ ├── contribute.md │ │ │ │ ├── create-challenge.md │ │ │ │ ├── faq.md │ │ │ │ ├── getting-started.md │ │ │ │ ├── rebase.md │ │ │ │ └── resolve-challenge.md │ │ │ │ ├── index.mdx │ │ │ │ ├── leaderboard │ │ │ │ ├── answers.mdx │ │ │ │ ├── challenges.mdx │ │ │ │ └── commit.mdx │ │ │ │ └── subscription │ │ │ │ └── index.mdx │ │ └── i18n │ │ │ ├── en.json │ │ │ ├── es.json │ │ │ ├── fr.json │ │ │ ├── pt.json │ │ │ ├── ru.json │ │ │ └── zh-CN.json │ ├── env.d.ts │ ├── pages │ │ └── auth │ │ │ ├── authorize.js │ │ │ ├── authorized.js │ │ │ └── refresh.js │ ├── styles │ │ └── custom-css.css │ └── utils │ │ └── encrypt.ts ├── svelte.config.js └── tsconfig.json ├── jest.config.ts ├── jest.preset.js ├── libs ├── .gitkeep ├── cli │ ├── .eslintrc.json │ ├── README.md │ ├── generators.json │ ├── package.json │ ├── project.json │ ├── src │ │ ├── generators │ │ │ ├── challenge │ │ │ │ ├── files │ │ │ │ │ ├── app │ │ │ │ │ │ └── src │ │ │ │ │ │ │ └── app │ │ │ │ │ │ │ └── app.component.ts__tmpl__ │ │ │ │ │ ├── author │ │ │ │ │ │ └── __authorName__.json__tmpl__ │ │ │ │ │ ├── docs │ │ │ │ │ │ └── __challengeNumber__-__projectName__.md__tmpl__ │ │ │ │ │ ├── lang-mapper.ts │ │ │ │ │ ├── readme │ │ │ │ │ │ └── README.md__tmpl__ │ │ │ │ │ └── test │ │ │ │ │ │ ├── src │ │ │ │ │ │ ├── app │ │ │ │ │ │ │ └── app.component.spec.ts__tmpl__ │ │ │ │ │ │ └── test-setup.ts__tmpl__ │ │ │ │ │ │ └── tsconfig.spec.json__tmpl__ │ │ │ │ ├── generator.ts │ │ │ │ ├── schema.d.ts │ │ │ │ └── schema.json │ │ │ └── readme │ │ │ │ ├── generator.ts │ │ │ │ └── schema.json │ │ ├── index.ts │ │ └── utils │ │ │ └── normalize.ts │ ├── tsconfig.json │ └── tsconfig.lib.json ├── custom-plugin │ ├── .eslintrc.json │ ├── README.md │ ├── generators.json │ ├── jest.config.ts │ ├── package.json │ ├── project.json │ ├── src │ │ ├── generators │ │ │ ├── custom-library │ │ │ │ ├── README.md │ │ │ │ ├── files │ │ │ │ │ └── src │ │ │ │ │ │ └── index.ts.template │ │ │ │ ├── generator.spec.ts │ │ │ │ ├── generator.ts │ │ │ │ ├── schema.d.ts │ │ │ │ └── schema.json │ │ │ └── feature-component │ │ │ │ ├── README.md │ │ │ │ ├── generator.ts │ │ │ │ ├── schema.d.ts │ │ │ │ └── schema.json │ │ └── index.ts │ ├── tsconfig.json │ ├── tsconfig.lib.json │ └── tsconfig.spec.json ├── decoupling │ ├── .eslintrc.json │ ├── brain │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── ng-package.json │ │ ├── package.json │ │ ├── project.json │ │ ├── src │ │ │ ├── index.ts │ │ │ ├── lib │ │ │ │ └── button-disabled.directive.ts │ │ │ └── test-setup.ts │ │ ├── tsconfig.json │ │ ├── tsconfig.lib.json │ │ ├── tsconfig.lib.prod.json │ │ └── tsconfig.spec.json │ ├── core │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── ng-package.json │ │ ├── package.json │ │ ├── project.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── test-setup.ts │ │ ├── tsconfig.json │ │ ├── tsconfig.lib.json │ │ ├── tsconfig.lib.prod.json │ │ └── tsconfig.spec.json │ └── helmet │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── ng-package.json │ │ ├── package.json │ │ ├── project.json │ │ ├── src │ │ ├── index.ts │ │ ├── lib │ │ │ └── btn-style.directive.ts │ │ └── test-setup.ts │ │ ├── tsconfig.json │ │ ├── tsconfig.lib.json │ │ ├── tsconfig.lib.prod.json │ │ └── tsconfig.spec.json ├── fake-utils │ ├── .eslintrc.json │ ├── README.md │ ├── ng-package.json │ ├── package.json │ ├── project.json │ ├── src │ │ ├── index.ts │ │ └── lib │ │ │ └── base-url.token.ts │ ├── tsconfig.json │ ├── tsconfig.lib.json │ └── tsconfig.lib.prod.json ├── module-to-standalone │ ├── admin │ │ ├── feature │ │ │ ├── .eslintrc.json │ │ │ ├── README.md │ │ │ ├── jest.config.ts │ │ │ ├── project.json │ │ │ ├── src │ │ │ │ ├── index.ts │ │ │ │ ├── lib │ │ │ │ │ ├── admin-feature.module.ts │ │ │ │ │ ├── create-user │ │ │ │ │ │ └── create-user.component.ts │ │ │ │ │ └── dashboard │ │ │ │ │ │ └── dashboard.component.ts │ │ │ │ └── test-setup.ts │ │ │ ├── tsconfig.json │ │ │ ├── tsconfig.lib.json │ │ │ └── tsconfig.spec.json │ │ └── shared │ │ │ ├── .eslintrc.json │ │ │ ├── README.md │ │ │ ├── jest.config.ts │ │ │ ├── project.json │ │ │ ├── src │ │ │ ├── index.ts │ │ │ ├── lib │ │ │ │ └── authorized.guard.ts │ │ │ └── test-setup.ts │ │ │ ├── tsconfig.json │ │ │ ├── tsconfig.lib.json │ │ │ └── tsconfig.spec.json │ ├── core │ │ ├── providers │ │ │ ├── .eslintrc.json │ │ │ ├── README.md │ │ │ ├── jest.config.ts │ │ │ ├── ng-package.json │ │ │ ├── package.json │ │ │ ├── project.json │ │ │ ├── src │ │ │ │ ├── index.ts │ │ │ │ ├── lib │ │ │ │ │ └── token.provider.ts │ │ │ │ └── test-setup.ts │ │ │ ├── tsconfig.json │ │ │ ├── tsconfig.lib.json │ │ │ ├── tsconfig.lib.prod.json │ │ │ └── tsconfig.spec.json │ │ └── service │ │ │ ├── .eslintrc.json │ │ │ ├── README.md │ │ │ ├── jest.config.ts │ │ │ ├── project.json │ │ │ ├── src │ │ │ ├── index.ts │ │ │ ├── lib │ │ │ │ └── authorization.service.ts │ │ │ └── test-setup.ts │ │ │ ├── tsconfig.json │ │ │ ├── tsconfig.lib.json │ │ │ └── tsconfig.spec.json │ ├── forbidden │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ │ ├── index.ts │ │ │ ├── lib │ │ │ │ ├── forbidden.component.ts │ │ │ │ └── forbidden.module.ts │ │ │ └── test-setup.ts │ │ ├── tsconfig.json │ │ ├── tsconfig.lib.json │ │ └── tsconfig.spec.json │ ├── home │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ │ ├── index.ts │ │ │ ├── lib │ │ │ │ ├── home.component.ts │ │ │ │ └── home.module.ts │ │ │ └── test-setup.ts │ │ ├── tsconfig.json │ │ ├── tsconfig.lib.json │ │ └── tsconfig.spec.json │ ├── shell │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ │ ├── index.ts │ │ │ ├── lib │ │ │ │ ├── main-shell.module.ts │ │ │ │ └── main-shell.routes.ts │ │ │ └── test-setup.ts │ │ ├── tsconfig.json │ │ ├── tsconfig.lib.json │ │ └── tsconfig.spec.json │ └── user │ │ ├── contact │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── ng-package.json │ │ ├── package.json │ │ ├── project.json │ │ ├── src │ │ │ ├── index.ts │ │ │ ├── lib │ │ │ │ ├── contact-feature.module.ts │ │ │ │ ├── create-contact │ │ │ │ │ └── create-contact.component.ts │ │ │ │ └── dashboard │ │ │ │ │ └── dashboard.component.ts │ │ │ └── test-setup.ts │ │ ├── tsconfig.json │ │ ├── tsconfig.lib.json │ │ ├── tsconfig.lib.prod.json │ │ └── tsconfig.spec.json │ │ ├── home │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── ng-package.json │ │ ├── package.json │ │ ├── project.json │ │ ├── src │ │ │ ├── index.ts │ │ │ ├── lib │ │ │ │ ├── home.component.ts │ │ │ │ └── home.module.ts │ │ │ └── test-setup.ts │ │ ├── tsconfig.json │ │ ├── tsconfig.lib.json │ │ ├── tsconfig.lib.prod.json │ │ └── tsconfig.spec.json │ │ └── shell │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── ng-package.json │ │ ├── package.json │ │ ├── project.json │ │ ├── src │ │ ├── index.ts │ │ ├── lib │ │ │ ├── user-shell.component.ts │ │ │ ├── user-shell.module.ts │ │ │ └── user-shell.routes.ts │ │ └── test-setup.ts │ │ ├── tsconfig.json │ │ ├── tsconfig.lib.json │ │ ├── tsconfig.lib.prod.json │ │ └── tsconfig.spec.json ├── shared │ ├── directives │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── ng-package.json │ │ ├── package.json │ │ ├── project.json │ │ ├── src │ │ │ ├── index.ts │ │ │ ├── lib │ │ │ │ ├── cd-flashing.directive.ts │ │ │ │ └── track-by.directive.ts │ │ │ └── test-setup.ts │ │ ├── tsconfig.json │ │ ├── tsconfig.lib.json │ │ ├── tsconfig.lib.prod.json │ │ └── tsconfig.spec.json │ ├── ui │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ │ └── table.component.ts │ │ ├── tsconfig.json │ │ └── tsconfig.lib.json │ └── utils │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.ts │ │ ├── project.json │ │ ├── src │ │ ├── index.ts │ │ ├── lib │ │ │ ├── destroy-service.service.ts │ │ │ └── random-http-error.utils.ts │ │ └── test-setup.ts │ │ ├── tsconfig.json │ │ ├── tsconfig.lib.json │ │ └── tsconfig.spec.json ├── static-dynamic-import │ └── users │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── project.json │ │ ├── src │ │ ├── index.ts │ │ └── lib │ │ │ ├── user.component.ts │ │ │ ├── user.model.ts │ │ │ └── users.component.ts │ │ ├── tsconfig.json │ │ └── tsconfig.lib.json └── testing-table │ ├── backend │ ├── .eslintrc.json │ ├── README.md │ ├── project.json │ ├── src │ │ ├── index.ts │ │ └── lib │ │ │ └── fake-backend.service.ts │ ├── tsconfig.json │ └── tsconfig.lib.json │ └── model │ ├── README.md │ ├── project.json │ ├── src │ └── index.ts │ ├── tsconfig.json │ └── tsconfig.lib.json ├── logo ├── angular-challenge.png ├── angular.svg └── twitter.svg ├── migrations.json ├── nx.json ├── package-lock.json ├── package.json ├── pull_request_template.md ├── tools ├── eslint-rules │ ├── index.ts │ ├── jest.config.ts │ ├── project.json │ ├── rules │ │ ├── forbidden-enum.README.md │ │ ├── forbidden-enum.spec.ts │ │ └── forbidden-enum.ts │ ├── tsconfig.json │ ├── tsconfig.lint.json │ └── tsconfig.spec.json └── tsconfig.tools.json └── tsconfig.base.json /.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /.github/funding.yml: -------------------------------------------------------------------------------- 1 | github: [tomalaforge] 2 | -------------------------------------------------------------------------------- /.husky/commit-msg: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | npx --no -- commitlint --edit ${1} 5 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | npx lint-staged 5 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | # Add files here to ignore them from prettier formatting 2 | 3 | /dist 4 | /coverage 5 | 6 | .angular 7 | 8 | /.nx/cache 9 | /.nx/workspace-data -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "bracketSameLine": true, 4 | "htmlWhitespaceSensitivity": "ignore", 5 | "plugins": ["prettier-plugin-organize-imports", "prettier-plugin-tailwindcss"] 6 | } 7 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "angular.ng-template", 4 | "nrwl.angular-console", 5 | "esbenp.prettier-vscode", 6 | "firsttris.vscode-jest-runner", 7 | "dbaeumer.vscode-eslint" 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "eslint.validate": [ 3 | "json" 4 | ], 5 | "cSpell.language": "en,es-ES" 6 | } 7 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | Learn how to contribute [here](https://angular-challenges.vercel.app/guides/contribute/) 4 | -------------------------------------------------------------------------------- /apps/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/.gitkeep -------------------------------------------------------------------------------- /apps/angular/1-projection/README.md: -------------------------------------------------------------------------------- 1 | # Projection 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve angular-projection 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/angular/1-projection/). 14 | -------------------------------------------------------------------------------- /apps/angular/1-projection/src/app/component/city-card/city-card.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-city-card', 5 | template: 'TODO City', 6 | imports: [], 7 | changeDetection: ChangeDetectionStrategy.OnPush, 8 | }) 9 | export class CityCardComponent {} 10 | -------------------------------------------------------------------------------- /apps/angular/1-projection/src/app/model/card.model.ts: -------------------------------------------------------------------------------- 1 | export enum CardType { 2 | TEACHER, 3 | STUDENT, 4 | CITY, 5 | } 6 | -------------------------------------------------------------------------------- /apps/angular/1-projection/src/app/model/city.model.ts: -------------------------------------------------------------------------------- 1 | export interface City { 2 | id: number; 3 | name: string; 4 | country: string; 5 | } 6 | -------------------------------------------------------------------------------- /apps/angular/1-projection/src/app/model/student.model.ts: -------------------------------------------------------------------------------- 1 | import { Teacher } from './teacher.model'; 2 | 3 | export interface Student { 4 | id: number; 5 | firstName: string; 6 | lastName: string; 7 | mainTeacher: Teacher; 8 | school: string; 9 | } 10 | -------------------------------------------------------------------------------- /apps/angular/1-projection/src/app/model/teacher.model.ts: -------------------------------------------------------------------------------- 1 | export const subject = [ 2 | 'Sciences', 3 | 'History', 4 | 'English', 5 | 'Maths', 6 | 'Sport', 7 | ] as const; 8 | export type Subject = (typeof subject)[number]; 9 | 10 | export interface Teacher { 11 | id: number; 12 | firstName: string; 13 | lastName: string; 14 | subject: Subject; 15 | } 16 | -------------------------------------------------------------------------------- /apps/angular/1-projection/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/1-projection/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/angular/1-projection/src/assets/img/city.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/1-projection/src/assets/img/city.png -------------------------------------------------------------------------------- /apps/angular/1-projection/src/assets/img/student.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/1-projection/src/assets/img/student.webp -------------------------------------------------------------------------------- /apps/angular/1-projection/src/assets/img/teacher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/1-projection/src/assets/img/teacher.png -------------------------------------------------------------------------------- /apps/angular/1-projection/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/1-projection/src/favicon.ico -------------------------------------------------------------------------------- /apps/angular/1-projection/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | 4 | bootstrapApplication(AppComponent).catch((err) => console.error(err)); 5 | -------------------------------------------------------------------------------- /apps/angular/1-projection/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | -------------------------------------------------------------------------------- /apps/angular/1-projection/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import 'jest-preset-angular/setup-jest'; 2 | -------------------------------------------------------------------------------- /apps/angular/1-projection/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["**/*.ts"], 4 | "compilerOptions": { 5 | "types": ["jest", "node"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/angular/1-projection/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "module": "commonjs", 6 | "types": ["jest", "node"] 7 | }, 8 | "files": ["src/test-setup.ts"], 9 | "include": ["jest.config.ts", "**/*.test.ts", "**/*.spec.ts", "**/*.d.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/angular/10-utility-wrapper-pipe/README.md: -------------------------------------------------------------------------------- 1 | # Utility Wrapper Pipe 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve angular-utility-wrapper-pipe 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/angular/10-pipe-utility/). 14 | -------------------------------------------------------------------------------- /apps/angular/10-utility-wrapper-pipe/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/10-utility-wrapper-pipe/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/angular/10-utility-wrapper-pipe/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/10-utility-wrapper-pipe/src/favicon.ico -------------------------------------------------------------------------------- /apps/angular/10-utility-wrapper-pipe/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | 4 | bootstrapApplication(AppComponent).catch((err) => console.error(err)); 5 | -------------------------------------------------------------------------------- /apps/angular/10-utility-wrapper-pipe/src/styles.scss: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | -------------------------------------------------------------------------------- /apps/angular/10-utility-wrapper-pipe/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["**/*.ts"], 4 | "compilerOptions": { 5 | "types": [] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/angular/13-highly-customizable-css/README.md: -------------------------------------------------------------------------------- 1 | # Highly Customizable CSS 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve angular-highly-customizable-css 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/angular/13-styling/). 14 | -------------------------------------------------------------------------------- /apps/angular/13-highly-customizable-css/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/13-highly-customizable-css/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/angular/13-highly-customizable-css/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/13-highly-customizable-css/src/favicon.ico -------------------------------------------------------------------------------- /apps/angular/13-highly-customizable-css/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { PageComponent } from './app/page.component'; 3 | 4 | bootstrapApplication(PageComponent).catch((err) => console.error(err)); 5 | -------------------------------------------------------------------------------- /apps/angular/13-highly-customizable-css/src/styles.scss: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | -------------------------------------------------------------------------------- /apps/angular/13-highly-customizable-css/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/angular/13-highly-customizable-css/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": [] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/angular/16-master-dependency-injection/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/16-master-dependency-injection/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/angular/16-master-dependency-injection/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/16-master-dependency-injection/src/favicon.ico -------------------------------------------------------------------------------- /apps/angular/16-master-dependency-injection/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | 4 | bootstrapApplication(AppComponent).catch((err) => console.error(err)); 5 | -------------------------------------------------------------------------------- /apps/angular/16-master-dependency-injection/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/angular/16-master-dependency-injection/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": [] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/angular/21-anchor-navigation/README.md: -------------------------------------------------------------------------------- 1 | # Anchor Navigation 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve angular-anchor-navigation 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/angular/21-achor-scrolling/). 14 | -------------------------------------------------------------------------------- /apps/angular/21-anchor-navigation/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { RouterOutlet } from '@angular/router'; 3 | 4 | @Component({ 5 | imports: [RouterOutlet], 6 | selector: 'app-root', 7 | template: ` 8 | 9 | `, 10 | }) 11 | export class AppComponent {} 12 | -------------------------------------------------------------------------------- /apps/angular/21-anchor-navigation/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig } from '@angular/core'; 2 | import { provideRouter } from '@angular/router'; 3 | import { appRoutes } from './app.routes'; 4 | export const appConfig: ApplicationConfig = { 5 | providers: [provideRouter(appRoutes)], 6 | }; 7 | -------------------------------------------------------------------------------- /apps/angular/21-anchor-navigation/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/21-anchor-navigation/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/angular/21-anchor-navigation/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/21-anchor-navigation/src/favicon.ico -------------------------------------------------------------------------------- /apps/angular/21-anchor-navigation/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { appConfig } from './app/app.config'; 3 | 4 | import { AppComponent } from './app/app.component'; 5 | 6 | bootstrapApplication(AppComponent, appConfig).catch((err) => 7 | console.error(err), 8 | ); 9 | -------------------------------------------------------------------------------- /apps/angular/21-anchor-navigation/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/angular/21-anchor-navigation/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import 'jest-preset-angular/setup-jest'; 2 | -------------------------------------------------------------------------------- /apps/angular/21-anchor-navigation/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/angular/21-anchor-navigation/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": ["jest", "node"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/angular/22-router-input/README.md: -------------------------------------------------------------------------------- 1 | # @RouterInput() 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve angular-router-input 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/angular/22-router-input/). 14 | -------------------------------------------------------------------------------- /apps/angular/22-router-input/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig } from '@angular/core'; 2 | import { provideRouter } from '@angular/router'; 3 | import { appRoutes } from './app.routes'; 4 | 5 | export const appConfig: ApplicationConfig = { 6 | providers: [provideRouter(appRoutes)], 7 | }; 8 | -------------------------------------------------------------------------------- /apps/angular/22-router-input/src/app/home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | @Component({ 3 | selector: 'app-home', 4 | imports: [], 5 | template: ` 6 |
Home
7 | `, 8 | }) 9 | export default class HomeComponent {} 10 | -------------------------------------------------------------------------------- /apps/angular/22-router-input/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/22-router-input/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/angular/22-router-input/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/22-router-input/src/favicon.ico -------------------------------------------------------------------------------- /apps/angular/22-router-input/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => 6 | console.error(err), 7 | ); 8 | -------------------------------------------------------------------------------- /apps/angular/22-router-input/src/styles.scss: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | -------------------------------------------------------------------------------- /apps/angular/22-router-input/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/angular/22-router-input/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": [] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/angular/31-module-to-standalone/README.md: -------------------------------------------------------------------------------- 1 | # Module to Standalone 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve angular-module-to-standalone 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/angular/31-module-to-standalone/). 14 | -------------------------------------------------------------------------------- /apps/angular/31-module-to-standalone/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/31-module-to-standalone/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/angular/31-module-to-standalone/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/31-module-to-standalone/src/favicon.ico -------------------------------------------------------------------------------- /apps/angular/31-module-to-standalone/src/main.ts: -------------------------------------------------------------------------------- 1 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 2 | import { AppModule } from './app/app.module'; 3 | 4 | platformBrowserDynamic() 5 | .bootstrapModule(AppModule) 6 | .catch((err) => console.error(err)); 7 | -------------------------------------------------------------------------------- /apps/angular/31-module-to-standalone/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/angular/31-module-to-standalone/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/angular/31-module-to-standalone/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": [ 4 | "src/**/*.ts", 5 | "../../../libs/module-to-standalone/shell/src/lib/main-shell.routes.ts", 6 | "../../../libs/module-to-standalone/shell/src/lib/main-shell.component.ts" 7 | ], 8 | "compilerOptions": { 9 | "types": [] 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /apps/angular/32-change-detection-bug/README.md: -------------------------------------------------------------------------------- 1 | # Change Detection Bug 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve angular-change-detection-bug 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/performance/32-bug-cd/). 14 | -------------------------------------------------------------------------------- /apps/angular/32-change-detection-bug/src/app/bar.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | @Component({ 3 | selector: 'app-bar', 4 | standalone: true, 5 | template: ` 6 | BarComponent 7 | `, 8 | }) 9 | export class BarComponent {} 10 | -------------------------------------------------------------------------------- /apps/angular/32-change-detection-bug/src/app/fake.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { delay, of } from 'rxjs'; 3 | 4 | @Injectable({ providedIn: 'root' }) 5 | export class FakeServiceService { 6 | getInfoFromBackend = () => of('Client app').pipe(delay(500)); 7 | } 8 | -------------------------------------------------------------------------------- /apps/angular/32-change-detection-bug/src/app/foo.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | @Component({ 3 | selector: 'app-foo', 4 | standalone: true, 5 | template: ` 6 | Foo Component 7 | `, 8 | }) 9 | export class FooComponent {} 10 | -------------------------------------------------------------------------------- /apps/angular/32-change-detection-bug/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/32-change-detection-bug/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/angular/32-change-detection-bug/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/32-change-detection-bug/src/favicon.ico -------------------------------------------------------------------------------- /apps/angular/32-change-detection-bug/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => 6 | console.error(err), 7 | ); 8 | -------------------------------------------------------------------------------- /apps/angular/32-change-detection-bug/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/angular/32-change-detection-bug/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom'; 2 | import 'jest-preset-angular/setup-jest'; 3 | -------------------------------------------------------------------------------- /apps/angular/32-change-detection-bug/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/angular/32-change-detection-bug/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": ["jest", "node"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/angular/33-decoupling-components/README.md: -------------------------------------------------------------------------------- 1 | # Decoupling Components 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve angular-decoupling-components 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/angular/33-decoupling/). 14 | -------------------------------------------------------------------------------- /apps/angular/33-decoupling-components/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/33-decoupling-components/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/angular/33-decoupling-components/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/33-decoupling-components/src/favicon.ico -------------------------------------------------------------------------------- /apps/angular/33-decoupling-components/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | 4 | bootstrapApplication(AppComponent).catch((err) => console.error(err)); 5 | -------------------------------------------------------------------------------- /apps/angular/33-decoupling-components/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/angular/33-decoupling-components/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/angular/33-decoupling-components/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": [ 4 | "src/**/*.ts", 5 | "../../../libs/decoupling/brain/src/lib/button-disabled.directive.ts", 6 | "../../../libs/decoupling/helmet/src/lib/btn-style.directive.ts" 7 | ], 8 | "compilerOptions": { 9 | "types": [] 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /apps/angular/39-injection-token/README.md: -------------------------------------------------------------------------------- 1 | # InjectionToken 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve angular-injection-token 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/angular/39-injection-token/). 14 | -------------------------------------------------------------------------------- /apps/angular/39-injection-token/src/app/data.ts: -------------------------------------------------------------------------------- 1 | export const DEFAULT_TIMER = 1000; 2 | -------------------------------------------------------------------------------- /apps/angular/39-injection-token/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/39-injection-token/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/angular/39-injection-token/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/39-injection-token/src/favicon.ico -------------------------------------------------------------------------------- /apps/angular/39-injection-token/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => 6 | console.error(err), 7 | ); 8 | -------------------------------------------------------------------------------- /apps/angular/39-injection-token/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/angular/39-injection-token/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom'; 2 | import 'jest-preset-angular/setup-jest'; 3 | -------------------------------------------------------------------------------- /apps/angular/39-injection-token/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/angular/39-injection-token/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": ["jest", "node"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/angular/4-typed-context-outlet/README.md: -------------------------------------------------------------------------------- 1 | # Typed ContextOutlet 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve angular-typed-context-outlet 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/angular/4-context-outlet-typed/). 14 | -------------------------------------------------------------------------------- /apps/angular/4-typed-context-outlet/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/4-typed-context-outlet/src/favicon.ico -------------------------------------------------------------------------------- /apps/angular/4-typed-context-outlet/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | 4 | bootstrapApplication(AppComponent).catch((err) => console.error(err)); 5 | -------------------------------------------------------------------------------- /apps/angular/4-typed-context-outlet/src/styles.scss: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | -------------------------------------------------------------------------------- /apps/angular/4-typed-context-outlet/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["**/*.ts"], 4 | "compilerOptions": { 5 | "types": [] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/angular/44-view-transition/README.md: -------------------------------------------------------------------------------- 1 | # View Transition 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve angular-view-transition 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/angular/44-view-transition/). 14 | -------------------------------------------------------------------------------- /apps/angular/44-view-transition/src/app/post.model.ts: -------------------------------------------------------------------------------- 1 | export interface Post { 2 | id: string; 3 | title: string; 4 | description: string; 5 | image: string; 6 | date: string; 7 | readingTime: number; 8 | } 9 | -------------------------------------------------------------------------------- /apps/angular/44-view-transition/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/44-view-transition/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/angular/44-view-transition/src/assets/angular.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/44-view-transition/src/assets/angular.webp -------------------------------------------------------------------------------- /apps/angular/44-view-transition/src/assets/guard.full.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/44-view-transition/src/assets/guard.full.webp -------------------------------------------------------------------------------- /apps/angular/44-view-transition/src/assets/highly-custom.full.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/44-view-transition/src/assets/highly-custom.full.webp -------------------------------------------------------------------------------- /apps/angular/44-view-transition/src/assets/profil.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/44-view-transition/src/assets/profil.webp -------------------------------------------------------------------------------- /apps/angular/44-view-transition/src/assets/signal-cd.full.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/44-view-transition/src/assets/signal-cd.full.webp -------------------------------------------------------------------------------- /apps/angular/44-view-transition/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/44-view-transition/src/favicon.ico -------------------------------------------------------------------------------- /apps/angular/44-view-transition/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => 6 | console.error(err), 7 | ); 8 | -------------------------------------------------------------------------------- /apps/angular/44-view-transition/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | -------------------------------------------------------------------------------- /apps/angular/44-view-transition/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/angular/44-view-transition/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": [] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/angular/45-react-in-angular/README.md: -------------------------------------------------------------------------------- 1 | # React in angular 2 | 3 | > author: wandrille-guesdon 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve angular-react-in-angular 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/angular/45-react-in-angular/). 14 | -------------------------------------------------------------------------------- /apps/angular/45-react-in-angular/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig } from '@angular/core'; 2 | 3 | export const appConfig: ApplicationConfig = { 4 | providers: [], 5 | }; 6 | -------------------------------------------------------------------------------- /apps/angular/45-react-in-angular/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/45-react-in-angular/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/angular/45-react-in-angular/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/45-react-in-angular/src/favicon.ico -------------------------------------------------------------------------------- /apps/angular/45-react-in-angular/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => 6 | console.error(err), 7 | ); 8 | -------------------------------------------------------------------------------- /apps/angular/45-react-in-angular/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/angular/45-react-in-angular/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom'; 2 | import 'jest-preset-angular/setup-jest'; 3 | -------------------------------------------------------------------------------- /apps/angular/45-react-in-angular/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/angular/45-react-in-angular/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": ["jest", "node"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/angular/46-simple-animations/README.md: -------------------------------------------------------------------------------- 1 | # Simple Animations 2 | 3 | > author: sven-brodny 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve angular-simple-animations 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/angular/46-simple-animations/). 14 | -------------------------------------------------------------------------------- /apps/angular/46-simple-animations/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig } from '@angular/core'; 2 | 3 | export const appConfig: ApplicationConfig = { 4 | providers: [], 5 | }; 6 | -------------------------------------------------------------------------------- /apps/angular/46-simple-animations/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/46-simple-animations/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/angular/46-simple-animations/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/46-simple-animations/src/favicon.ico -------------------------------------------------------------------------------- /apps/angular/46-simple-animations/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => 6 | console.error(err), 7 | ); 8 | -------------------------------------------------------------------------------- /apps/angular/46-simple-animations/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/angular/46-simple-animations/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom'; 2 | import 'jest-preset-angular/setup-jest'; 3 | -------------------------------------------------------------------------------- /apps/angular/46-simple-animations/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/angular/46-simple-animations/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": ["jest", "node"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/angular/5-crud-application/README.md: -------------------------------------------------------------------------------- 1 | # Crud application 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve angular-crud-application 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/angular/5-crud/). 14 | -------------------------------------------------------------------------------- /apps/angular/5-crud-application/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { provideHttpClient } from '@angular/common/http'; 2 | import { ApplicationConfig } from '@angular/core'; 3 | 4 | export const appConfig: ApplicationConfig = { 5 | providers: [provideHttpClient()], 6 | }; 7 | -------------------------------------------------------------------------------- /apps/angular/5-crud-application/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/5-crud-application/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/angular/5-crud-application/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/5-crud-application/src/favicon.ico -------------------------------------------------------------------------------- /apps/angular/5-crud-application/src/main.ts: -------------------------------------------------------------------------------- 1 | import { appConfig } from './app/app.config'; 2 | 3 | import { bootstrapApplication } from '@angular/platform-browser'; 4 | import { AppComponent } from './app/app.component'; 5 | 6 | bootstrapApplication(AppComponent, appConfig).catch((err) => 7 | console.error(err), 8 | ); 9 | -------------------------------------------------------------------------------- /apps/angular/5-crud-application/src/styles.scss: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | html, 3 | body { 4 | height: 100%; 5 | } 6 | 7 | body { 8 | margin: 0; 9 | font-family: Roboto, 'Helvetica Neue', sans-serif; 10 | } 11 | -------------------------------------------------------------------------------- /apps/angular/5-crud-application/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom'; 2 | import 'jest-preset-angular/setup-jest'; 3 | -------------------------------------------------------------------------------- /apps/angular/5-crud-application/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["**/*.ts"], 4 | "compilerOptions": { 5 | "types": [] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/angular/52-lazy-load-component/README.md: -------------------------------------------------------------------------------- 1 | # lazy-load-component 2 | 3 | > author: lance-finney 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve angular-lazy-load-component 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/angular/52-lazy-load-component/). 14 | -------------------------------------------------------------------------------- /apps/angular/52-lazy-load-component/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/52-lazy-load-component/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/angular/52-lazy-load-component/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/52-lazy-load-component/src/favicon.ico -------------------------------------------------------------------------------- /apps/angular/52-lazy-load-component/src/main.ts: -------------------------------------------------------------------------------- 1 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 2 | import { AppModule } from './app/app.module'; 3 | 4 | platformBrowserDynamic() 5 | .bootstrapModule(AppModule) 6 | .catch((err) => console.error(err)); 7 | -------------------------------------------------------------------------------- /apps/angular/52-lazy-load-component/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/angular/52-lazy-load-component/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom'; 2 | import 'jest-preset-angular/setup-jest'; 3 | -------------------------------------------------------------------------------- /apps/angular/52-lazy-load-component/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/angular/52-lazy-load-component/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": {}, 5 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 6 | } 7 | -------------------------------------------------------------------------------- /apps/angular/55-back-button-navigation/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /apps/angular/55-back-button-navigation/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { RouterLink, RouterOutlet } from '@angular/router'; 3 | 4 | @Component({ 5 | imports: [RouterOutlet, RouterLink], 6 | selector: 'app-root', 7 | templateUrl: './app.component.html', 8 | }) 9 | export class AppComponent {} 10 | -------------------------------------------------------------------------------- /apps/angular/55-back-button-navigation/src/app/dialog/dialog.component.html: -------------------------------------------------------------------------------- 1 |

Delete file

2 | Would you like to delete cat.jpeg? 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /apps/angular/55-back-button-navigation/src/app/home/home.component.html: -------------------------------------------------------------------------------- 1 | 2 | Go to simple dialog action page 3 | 4 | 5 | 6 | Go to sensitive dialog action page 7 | 8 | -------------------------------------------------------------------------------- /apps/angular/55-back-button-navigation/src/app/sensitive-action/sensitive-action.component.html: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /apps/angular/55-back-button-navigation/src/app/simple-action/simple-action.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /apps/angular/55-back-button-navigation/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => 6 | console.error(err), 7 | ); 8 | -------------------------------------------------------------------------------- /apps/angular/55-back-button-navigation/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom'; 2 | import 'jest-preset-angular/setup-jest'; 3 | -------------------------------------------------------------------------------- /apps/angular/55-back-button-navigation/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/angular/55-back-button-navigation/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": {}, 5 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 6 | } 7 | -------------------------------------------------------------------------------- /apps/angular/57-content-projection-default/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/57-content-projection-default/public/favicon.ico -------------------------------------------------------------------------------- /apps/angular/57-content-projection-default/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; 2 | 3 | export const appConfig: ApplicationConfig = { 4 | providers: [provideZoneChangeDetection({ eventCoalescing: true })], 5 | }; 6 | -------------------------------------------------------------------------------- /apps/angular/57-content-projection-default/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => 6 | console.error(err), 7 | ); 8 | -------------------------------------------------------------------------------- /apps/angular/57-content-projection-default/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/angular/57-content-projection-default/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/angular/57-content-projection-default/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": {}, 5 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 6 | } 7 | -------------------------------------------------------------------------------- /apps/angular/58-content-projection-condition/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/58-content-projection-condition/public/favicon.ico -------------------------------------------------------------------------------- /apps/angular/58-content-projection-condition/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; 2 | 3 | export const appConfig: ApplicationConfig = { 4 | providers: [provideZoneChangeDetection({ eventCoalescing: true })], 5 | }; 6 | -------------------------------------------------------------------------------- /apps/angular/58-content-projection-condition/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => 6 | console.error(err), 7 | ); 8 | -------------------------------------------------------------------------------- /apps/angular/58-content-projection-condition/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/angular/58-content-projection-condition/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/angular/58-content-projection-condition/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": {}, 5 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 6 | } 7 | -------------------------------------------------------------------------------- /apps/angular/59-content-projection-defer/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/59-content-projection-defer/public/favicon.ico -------------------------------------------------------------------------------- /apps/angular/59-content-projection-defer/src/app/page-1.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-page-1', 5 | template: ` 6 | page1 7 | `, 8 | changeDetection: ChangeDetectionStrategy.OnPush, 9 | }) 10 | export class Page1 {} 11 | -------------------------------------------------------------------------------- /apps/angular/59-content-projection-defer/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => 6 | console.error(err), 7 | ); 8 | -------------------------------------------------------------------------------- /apps/angular/59-content-projection-defer/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/angular/59-content-projection-defer/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/angular/59-content-projection-defer/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": {}, 5 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 6 | } 7 | -------------------------------------------------------------------------------- /apps/angular/6-structural-directive/README.md: -------------------------------------------------------------------------------- 1 | # Structural Directive 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve angular-structural-directive 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/angular/6-permissions/). 14 | -------------------------------------------------------------------------------- /apps/angular/6-structural-directive/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { RouterOutlet } from '@angular/router'; 3 | 4 | @Component({ 5 | imports: [RouterOutlet], 6 | selector: 'app-root', 7 | template: ` 8 | 9 | `, 10 | styles: [], 11 | }) 12 | export class AppComponent {} 13 | -------------------------------------------------------------------------------- /apps/angular/6-structural-directive/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig } from '@angular/core'; 2 | import { provideRouter } from '@angular/router'; 3 | import { APP_ROUTES } from './routes'; 4 | export const appConfig: ApplicationConfig = { 5 | providers: [provideRouter(APP_ROUTES)], 6 | }; 7 | -------------------------------------------------------------------------------- /apps/angular/6-structural-directive/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/6-structural-directive/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/angular/6-structural-directive/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/6-structural-directive/src/favicon.ico -------------------------------------------------------------------------------- /apps/angular/6-structural-directive/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { appConfig } from './app/app.config'; 3 | 4 | import { AppComponent } from './app/app.component'; 5 | 6 | bootstrapApplication(AppComponent, appConfig).catch((err) => 7 | console.error(err), 8 | ); 9 | -------------------------------------------------------------------------------- /apps/angular/6-structural-directive/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/angular/6-structural-directive/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["**/*.ts"], 4 | "compilerOptions": { 5 | "types": [] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/angular/8-pure-pipe/README.md: -------------------------------------------------------------------------------- 1 | # Pure Pipe 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve angular-pure-pipe 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/angular/8-pipe-pure/). 14 | -------------------------------------------------------------------------------- /apps/angular/8-pure-pipe/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/8-pure-pipe/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/angular/8-pure-pipe/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/8-pure-pipe/src/favicon.ico -------------------------------------------------------------------------------- /apps/angular/8-pure-pipe/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | 4 | bootstrapApplication(AppComponent).catch((err) => console.error(err)); 5 | -------------------------------------------------------------------------------- /apps/angular/8-pure-pipe/src/styles.scss: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | -------------------------------------------------------------------------------- /apps/angular/8-pure-pipe/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["**/*.ts"], 4 | "compilerOptions": { 5 | "types": [] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/angular/9-wrap-function-pipe/README.md: -------------------------------------------------------------------------------- 1 | # Wrap Function Pipe 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve angular-wrap-function-pipe 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/angular/9-pipe-wrapFn/). 14 | -------------------------------------------------------------------------------- /apps/angular/9-wrap-function-pipe/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/9-wrap-function-pipe/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/angular/9-wrap-function-pipe/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/angular/9-wrap-function-pipe/src/favicon.ico -------------------------------------------------------------------------------- /apps/angular/9-wrap-function-pipe/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | 4 | bootstrapApplication(AppComponent).catch((err) => console.error(err)); 5 | -------------------------------------------------------------------------------- /apps/angular/9-wrap-function-pipe/src/styles.scss: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | -------------------------------------------------------------------------------- /apps/angular/9-wrap-function-pipe/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["**/*.ts"], 4 | "compilerOptions": { 5 | "types": [] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/forms/41-control-value-accessor/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/forms/41-control-value-accessor/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/forms/41-control-value-accessor/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/forms/41-control-value-accessor/src/favicon.ico -------------------------------------------------------------------------------- /apps/forms/41-control-value-accessor/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | 4 | bootstrapApplication(AppComponent).catch((err) => console.error(err)); 5 | -------------------------------------------------------------------------------- /apps/forms/41-control-value-accessor/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/forms/41-control-value-accessor/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom'; 2 | import 'jest-preset-angular/setup-jest'; 3 | -------------------------------------------------------------------------------- /apps/forms/41-control-value-accessor/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/forms/41-control-value-accessor/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": ["jest", "node"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/forms/48-avoid-losing-form-data/README.md: -------------------------------------------------------------------------------- 1 | # Avoid losing form data 2 | 3 | > author: [Timothy Alcaide](https://github.com/alcaidio) 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve forms-avoid-losing-form-data 9 | ``` 10 | 11 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/forms/48-forms-avoid-losing-form-data/). 12 | -------------------------------------------------------------------------------- /apps/forms/48-avoid-losing-form-data/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig } from '@angular/core'; 2 | import { provideRouter, withComponentInputBinding } from '@angular/router'; 3 | import { appRoutes } from './app.routes'; 4 | 5 | export const appConfig: ApplicationConfig = { 6 | providers: [provideRouter(appRoutes, withComponentInputBinding())], 7 | }; 8 | -------------------------------------------------------------------------------- /apps/forms/48-avoid-losing-form-data/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/forms/48-avoid-losing-form-data/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/forms/48-avoid-losing-form-data/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/forms/48-avoid-losing-form-data/src/favicon.ico -------------------------------------------------------------------------------- /apps/forms/48-avoid-losing-form-data/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => 6 | console.error(err), 7 | ); 8 | -------------------------------------------------------------------------------- /apps/forms/48-avoid-losing-form-data/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/forms/48-avoid-losing-form-data/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/forms/48-avoid-losing-form-data/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": {}, 5 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 6 | } 7 | -------------------------------------------------------------------------------- /apps/nx/42-static-vs-dynamic-import/README.md: -------------------------------------------------------------------------------- 1 | # Static vs Dynamic Import 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve nx-static-vs-dynamic-import 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/nx/42-static-dynamic-import/). 14 | -------------------------------------------------------------------------------- /apps/nx/42-static-vs-dynamic-import/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/nx/42-static-vs-dynamic-import/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/nx/42-static-vs-dynamic-import/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/nx/42-static-vs-dynamic-import/src/favicon.ico -------------------------------------------------------------------------------- /apps/nx/42-static-vs-dynamic-import/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => 6 | console.error(err), 7 | ); 8 | -------------------------------------------------------------------------------- /apps/nx/42-static-vs-dynamic-import/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/nx/42-static-vs-dynamic-import/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/nx/42-static-vs-dynamic-import/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": [] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/performance/12-optimize-change-detection/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/performance/12-optimize-change-detection/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/performance/12-optimize-change-detection/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/performance/12-optimize-change-detection/src/favicon.ico -------------------------------------------------------------------------------- /apps/performance/12-optimize-change-detection/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | 4 | bootstrapApplication(AppComponent).catch((err) => console.error(err)); 5 | -------------------------------------------------------------------------------- /apps/performance/12-optimize-change-detection/src/styles.scss: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | -------------------------------------------------------------------------------- /apps/performance/12-optimize-change-detection/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import 'jest-preset-angular/setup-jest'; 2 | -------------------------------------------------------------------------------- /apps/performance/12-optimize-change-detection/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/performance/12-optimize-change-detection/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": ["jest", "node"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/performance/34-default-vs-onpush/README.md: -------------------------------------------------------------------------------- 1 | # Default vs OnPush 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve performance-default-vs-onpush 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/performance/34-default-onpush/). 14 | -------------------------------------------------------------------------------- /apps/performance/34-default-vs-onpush/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig } from '@angular/core'; 2 | import { provideAnimations } from '@angular/platform-browser/animations'; 3 | 4 | export const appConfig: ApplicationConfig = { 5 | providers: [provideAnimations()], 6 | }; 7 | -------------------------------------------------------------------------------- /apps/performance/34-default-vs-onpush/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/performance/34-default-vs-onpush/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/performance/34-default-vs-onpush/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/performance/34-default-vs-onpush/src/favicon.ico -------------------------------------------------------------------------------- /apps/performance/34-default-vs-onpush/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => 6 | console.error(err), 7 | ); 8 | -------------------------------------------------------------------------------- /apps/performance/34-default-vs-onpush/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/performance/34-default-vs-onpush/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/performance/34-default-vs-onpush/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": [ 4 | "src/**/*.ts", 5 | "../../../libs/shared/directives/src/lib/cd-flashing.directive.ts" 6 | ], 7 | "compilerOptions": { 8 | "types": [] 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /apps/performance/35-memoization/README.md: -------------------------------------------------------------------------------- 1 | # Memoization 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve performance-memoization 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/performance/35-memoize/). 14 | -------------------------------------------------------------------------------- /apps/performance/35-memoization/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig } from '@angular/core'; 2 | import { provideAnimations } from '@angular/platform-browser/animations'; 3 | 4 | export const appConfig: ApplicationConfig = { 5 | providers: [provideAnimations()], 6 | }; 7 | -------------------------------------------------------------------------------- /apps/performance/35-memoization/src/app/person.model.ts: -------------------------------------------------------------------------------- 1 | export interface Person { 2 | name: string; 3 | fib: number; 4 | } 5 | -------------------------------------------------------------------------------- /apps/performance/35-memoization/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/performance/35-memoization/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/performance/35-memoization/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/performance/35-memoization/src/favicon.ico -------------------------------------------------------------------------------- /apps/performance/35-memoization/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => 6 | console.error(err), 7 | ); 8 | -------------------------------------------------------------------------------- /apps/performance/35-memoization/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/performance/35-memoization/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/performance/35-memoization/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": [] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/performance/36-ngfor-optimization/README.md: -------------------------------------------------------------------------------- 1 | # NgFor Optimization 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve performance-ngfor-optimization 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/performance/36-ngfor-optimize/). 14 | -------------------------------------------------------------------------------- /apps/performance/36-ngfor-optimization/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig } from '@angular/core'; 2 | import { provideAnimations } from '@angular/platform-browser/animations'; 3 | 4 | export const appConfig: ApplicationConfig = { 5 | providers: [provideAnimations()], 6 | }; 7 | -------------------------------------------------------------------------------- /apps/performance/36-ngfor-optimization/src/app/person.model.ts: -------------------------------------------------------------------------------- 1 | export interface Person { 2 | email: string; 3 | name: string; 4 | } 5 | -------------------------------------------------------------------------------- /apps/performance/36-ngfor-optimization/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/performance/36-ngfor-optimization/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/performance/36-ngfor-optimization/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/performance/36-ngfor-optimization/src/favicon.ico -------------------------------------------------------------------------------- /apps/performance/36-ngfor-optimization/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => 6 | console.error(err), 7 | ); 8 | -------------------------------------------------------------------------------- /apps/performance/36-ngfor-optimization/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/performance/36-ngfor-optimization/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom'; 2 | import 'jest-preset-angular/setup-jest'; 3 | -------------------------------------------------------------------------------- /apps/performance/36-ngfor-optimization/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/performance/36-ngfor-optimization/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": ["jest", "node"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/performance/37-optimize-big-list/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig } from '@angular/core'; 2 | import { provideAnimations } from '@angular/platform-browser/animations'; 3 | 4 | export const appConfig: ApplicationConfig = { 5 | providers: [provideAnimations()], 6 | }; 7 | -------------------------------------------------------------------------------- /apps/performance/37-optimize-big-list/src/app/person.model.ts: -------------------------------------------------------------------------------- 1 | export interface Person { 2 | email: string; 3 | name: string; 4 | } 5 | -------------------------------------------------------------------------------- /apps/performance/37-optimize-big-list/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/performance/37-optimize-big-list/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/performance/37-optimize-big-list/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/performance/37-optimize-big-list/src/favicon.ico -------------------------------------------------------------------------------- /apps/performance/37-optimize-big-list/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => 6 | console.error(err), 7 | ); 8 | -------------------------------------------------------------------------------- /apps/performance/37-optimize-big-list/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/performance/37-optimize-big-list/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/performance/37-optimize-big-list/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": [] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/performance/40-web-workers/README.md: -------------------------------------------------------------------------------- 1 | # Web workers 2 | 3 | > Author: Thomas Laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve performance-web-workers 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/performance/40-christmas-web-worker/). 14 | -------------------------------------------------------------------------------- /apps/performance/40-web-workers/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/performance/40-web-workers/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/performance/40-web-workers/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/performance/40-web-workers/src/favicon.ico -------------------------------------------------------------------------------- /apps/performance/40-web-workers/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | 4 | bootstrapApplication(AppComponent).catch((err) => console.error(err)); 5 | -------------------------------------------------------------------------------- /apps/performance/40-web-workers/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/performance/40-web-workers/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/performance/40-web-workers/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": [] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/rxjs/11-high-order-operator-bug/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/rxjs/11-high-order-operator-bug/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/rxjs/11-high-order-operator-bug/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/rxjs/11-high-order-operator-bug/src/favicon.ico -------------------------------------------------------------------------------- /apps/rxjs/11-high-order-operator-bug/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | 4 | bootstrapApplication(AppComponent).catch((err) => console.error(err)); 5 | -------------------------------------------------------------------------------- /apps/rxjs/11-high-order-operator-bug/src/styles.scss: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | -------------------------------------------------------------------------------- /apps/rxjs/11-high-order-operator-bug/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "**/*.test.ts", "**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/rxjs/11-high-order-operator-bug/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["**/*.ts"], 4 | "compilerOptions": { 5 | "types": [] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/rxjs/14-race-condition/README.md: -------------------------------------------------------------------------------- 1 | # Race Condition 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve rxjs-race-condition 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/rxjs/14-race-condition/). 14 | -------------------------------------------------------------------------------- /apps/rxjs/14-race-condition/cypress.config.ts: -------------------------------------------------------------------------------- 1 | import { nxComponentTestingPreset } from '@nx/angular/plugins/component-testing'; 2 | import { defineConfig } from 'cypress'; 3 | 4 | export default defineConfig({ 5 | component: nxComponentTestingPreset(__filename), 6 | }); 7 | -------------------------------------------------------------------------------- /apps/rxjs/14-race-condition/cypress/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io", 4 | "body": "Fixtures are a great way to mock data for responses to routes" 5 | } 6 | -------------------------------------------------------------------------------- /apps/rxjs/14-race-condition/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig, importProvidersFrom } from '@angular/core'; 2 | import { MatDialogModule } from '@angular/material/dialog'; 3 | export const appConfig: ApplicationConfig = { 4 | providers: [importProvidersFrom(MatDialogModule)], 5 | }; 6 | -------------------------------------------------------------------------------- /apps/rxjs/14-race-condition/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/rxjs/14-race-condition/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/rxjs/14-race-condition/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/rxjs/14-race-condition/src/favicon.ico -------------------------------------------------------------------------------- /apps/rxjs/14-race-condition/src/main.ts: -------------------------------------------------------------------------------- 1 | import { appConfig } from './app/app.config'; 2 | 3 | import { bootstrapApplication } from '@angular/platform-browser'; 4 | import { AppComponent } from './app/app.component'; 5 | 6 | bootstrapApplication(AppComponent, appConfig).catch((err) => 7 | console.error(err), 8 | ); 9 | -------------------------------------------------------------------------------- /apps/rxjs/14-race-condition/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import 'jest-preset-angular/setup-jest'; 2 | -------------------------------------------------------------------------------- /apps/rxjs/14-race-condition/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": ["jest", "node"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/rxjs/38-catch-error/README.md: -------------------------------------------------------------------------------- 1 | # catchError 2 | 3 | > Author: Devesh Chaudhari 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve rxjs-catch-error 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/rxjs/38-catch-error/). 14 | -------------------------------------------------------------------------------- /apps/rxjs/38-catch-error/src/app/app.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { render } from '@testing-library/angular'; 2 | import { AppComponent } from './app.component'; 3 | 4 | describe('AppComponent', () => { 5 | test('...', async () => { 6 | await render(AppComponent); 7 | }); 8 | }); 9 | -------------------------------------------------------------------------------- /apps/rxjs/38-catch-error/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { provideHttpClient } from '@angular/common/http'; 2 | import { ApplicationConfig } from '@angular/core'; 3 | 4 | export const appConfig: ApplicationConfig = { 5 | providers: [provideHttpClient()], 6 | }; 7 | -------------------------------------------------------------------------------- /apps/rxjs/38-catch-error/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/rxjs/38-catch-error/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/rxjs/38-catch-error/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/rxjs/38-catch-error/src/favicon.ico -------------------------------------------------------------------------------- /apps/rxjs/38-catch-error/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => 6 | console.error(err), 7 | ); 8 | -------------------------------------------------------------------------------- /apps/rxjs/38-catch-error/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/rxjs/38-catch-error/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom'; 2 | import 'jest-preset-angular/setup-jest'; 3 | -------------------------------------------------------------------------------- /apps/rxjs/38-catch-error/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/rxjs/38-catch-error/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": ["jest", "node"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/rxjs/49-hold-to-save-button/README.md: -------------------------------------------------------------------------------- 1 | # Hold to send button 2 | 3 | > author: alcaidio 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve rxjs-hold-to-save-button 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/rxjs/49-hold-to-save-btn/). 14 | -------------------------------------------------------------------------------- /apps/rxjs/49-hold-to-save-button/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig } from '@angular/core'; 2 | 3 | export const appConfig: ApplicationConfig = { 4 | providers: [], 5 | }; 6 | -------------------------------------------------------------------------------- /apps/rxjs/49-hold-to-save-button/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/rxjs/49-hold-to-save-button/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/rxjs/49-hold-to-save-button/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/rxjs/49-hold-to-save-button/src/favicon.ico -------------------------------------------------------------------------------- /apps/rxjs/49-hold-to-save-button/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => 6 | console.error(err), 7 | ); 8 | -------------------------------------------------------------------------------- /apps/rxjs/49-hold-to-save-button/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | progress { 6 | @apply h-4 w-full rounded-full bg-gray-200; 7 | } 8 | progress::-webkit-progress-bar { 9 | @apply rounded-full bg-gray-200; 10 | } 11 | 12 | progress::-webkit-progress-value { 13 | @apply rounded-full bg-indigo-600; 14 | } 15 | -------------------------------------------------------------------------------- /apps/rxjs/49-hold-to-save-button/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom'; 2 | import 'jest-preset-angular/setup-jest'; 3 | -------------------------------------------------------------------------------- /apps/rxjs/49-hold-to-save-button/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/rxjs/49-hold-to-save-button/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": {}, 5 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 6 | } 7 | -------------------------------------------------------------------------------- /apps/signal/30-interop-rxjs-signal/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { RouterOutlet } from '@angular/router'; 3 | 4 | @Component({ 5 | imports: [RouterOutlet], 6 | selector: 'app-root', 7 | template: ` 8 | 9 | `, 10 | styles: [''], 11 | }) 12 | export class AppComponent {} 13 | -------------------------------------------------------------------------------- /apps/signal/30-interop-rxjs-signal/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/signal/30-interop-rxjs-signal/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/signal/30-interop-rxjs-signal/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/signal/30-interop-rxjs-signal/src/favicon.ico -------------------------------------------------------------------------------- /apps/signal/30-interop-rxjs-signal/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => 6 | console.error(err), 7 | ); 8 | -------------------------------------------------------------------------------- /apps/signal/30-interop-rxjs-signal/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/signal/30-interop-rxjs-signal/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom'; 2 | import 'jest-preset-angular/setup-jest'; 3 | -------------------------------------------------------------------------------- /apps/signal/30-interop-rxjs-signal/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/signal/30-interop-rxjs-signal/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": ["jest", "node"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/signal/43-signal-input/README.md: -------------------------------------------------------------------------------- 1 | # Signal Input 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve signal-signal-input 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/signal/43-signal-input). 14 | -------------------------------------------------------------------------------- /apps/signal/43-signal-input/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig } from '@angular/core'; 2 | 3 | export const appConfig: ApplicationConfig = { 4 | providers: [], 5 | }; 6 | -------------------------------------------------------------------------------- /apps/signal/43-signal-input/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/signal/43-signal-input/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/signal/43-signal-input/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/signal/43-signal-input/src/favicon.ico -------------------------------------------------------------------------------- /apps/signal/43-signal-input/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => 6 | console.error(err), 7 | ); 8 | -------------------------------------------------------------------------------- /apps/signal/43-signal-input/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/signal/43-signal-input/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/signal/43-signal-input/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": [] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/signal/50-bug-in-effect/README.md: -------------------------------------------------------------------------------- 1 | # Bug in Effect ? 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve signal-bug-in-effect 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/angular/50-bug-effect-signal/). 14 | -------------------------------------------------------------------------------- /apps/signal/50-bug-in-effect/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig } from '@angular/core'; 2 | 3 | export const appConfig: ApplicationConfig = { 4 | providers: [], 5 | }; 6 | -------------------------------------------------------------------------------- /apps/signal/50-bug-in-effect/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/signal/50-bug-in-effect/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/signal/50-bug-in-effect/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/signal/50-bug-in-effect/src/favicon.ico -------------------------------------------------------------------------------- /apps/signal/50-bug-in-effect/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => 6 | console.error(err), 7 | ); 8 | -------------------------------------------------------------------------------- /apps/signal/50-bug-in-effect/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/signal/50-bug-in-effect/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/signal/50-bug-in-effect/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": {}, 5 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 6 | } 7 | -------------------------------------------------------------------------------- /apps/signal/51-function-call-effect/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig } from '@angular/core'; 2 | 3 | export const appConfig: ApplicationConfig = { 4 | providers: [], 5 | }; 6 | -------------------------------------------------------------------------------- /apps/signal/51-function-call-effect/src/app/user.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable, signal } from '@angular/core'; 2 | 3 | @Injectable({ providedIn: 'root' }) 4 | export class UserService { 5 | name = signal('Thomas'); 6 | 7 | log(message: string) { 8 | console.log(`${this.name()}: ${message}`); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /apps/signal/51-function-call-effect/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/signal/51-function-call-effect/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/signal/51-function-call-effect/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/signal/51-function-call-effect/src/favicon.ico -------------------------------------------------------------------------------- /apps/signal/51-function-call-effect/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => 6 | console.error(err), 7 | ); 8 | -------------------------------------------------------------------------------- /apps/signal/51-function-call-effect/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/signal/51-function-call-effect/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/signal/51-function-call-effect/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": {}, 5 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 6 | } 7 | -------------------------------------------------------------------------------- /apps/signal/53-big-signal-performance/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig } from '@angular/core'; 2 | 3 | export const appConfig: ApplicationConfig = { 4 | providers: [], 5 | }; 6 | -------------------------------------------------------------------------------- /apps/signal/53-big-signal-performance/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/signal/53-big-signal-performance/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/signal/53-big-signal-performance/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/signal/53-big-signal-performance/src/favicon.ico -------------------------------------------------------------------------------- /apps/signal/53-big-signal-performance/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => 6 | console.error(err), 7 | ); 8 | -------------------------------------------------------------------------------- /apps/signal/53-big-signal-performance/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/signal/53-big-signal-performance/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/signal/53-big-signal-performance/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": {}, 5 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 6 | } 7 | -------------------------------------------------------------------------------- /apps/signal/54-pipe-observable-to-signal/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/signal/54-pipe-observable-to-signal/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/signal/54-pipe-observable-to-signal/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/signal/54-pipe-observable-to-signal/src/favicon.ico -------------------------------------------------------------------------------- /apps/signal/54-pipe-observable-to-signal/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | 4 | bootstrapApplication(AppComponent).catch((err) => console.error(err)); 5 | -------------------------------------------------------------------------------- /apps/signal/54-pipe-observable-to-signal/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/signal/54-pipe-observable-to-signal/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": {}, 5 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 6 | } 7 | -------------------------------------------------------------------------------- /apps/signal/56-forms-and-signal/README.md: -------------------------------------------------------------------------------- 1 | # forms and signal 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve signal-forms-and-signal 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/signal/56-forms-and-signal/). 14 | -------------------------------------------------------------------------------- /apps/signal/56-forms-and-signal/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/signal/56-forms-and-signal/public/favicon.ico -------------------------------------------------------------------------------- /apps/signal/56-forms-and-signal/src/app/products.ts: -------------------------------------------------------------------------------- 1 | export const products = [ 2 | { 3 | id: '1', 4 | name: 'Computer', 5 | price: 2000, 6 | }, 7 | { 8 | id: '2', 9 | name: 'Mouse', 10 | price: 40, 11 | }, 12 | { 13 | id: '3', 14 | name: 'Keyboard', 15 | price: 80, 16 | }, 17 | ]; 18 | -------------------------------------------------------------------------------- /apps/signal/56-forms-and-signal/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => 6 | console.error(err), 7 | ); 8 | -------------------------------------------------------------------------------- /apps/signal/56-forms-and-signal/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/signal/56-forms-and-signal/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/signal/56-forms-and-signal/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": {}, 5 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 6 | } 7 | -------------------------------------------------------------------------------- /apps/testing/17-router/README.md: -------------------------------------------------------------------------------- 1 | # Router 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve testing-router 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/testing/17-router/). 14 | -------------------------------------------------------------------------------- /apps/testing/17-router/cypress.config.ts: -------------------------------------------------------------------------------- 1 | import { nxComponentTestingPreset } from '@nx/angular/plugins/component-testing'; 2 | import { defineConfig } from 'cypress'; 3 | 4 | export default defineConfig({ 5 | component: nxComponentTestingPreset(__filename), 6 | }); 7 | -------------------------------------------------------------------------------- /apps/testing/17-router/cypress/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io", 4 | "body": "Fixtures are a great way to mock data for responses to routes" 5 | } 6 | -------------------------------------------------------------------------------- /apps/testing/17-router/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig } from '@angular/core'; 2 | import { provideRouter } from '@angular/router'; 3 | import { appRoutes } from './app.routes'; 4 | export const appConfig: ApplicationConfig = { 5 | providers: [provideRouter(appRoutes)], 6 | }; 7 | -------------------------------------------------------------------------------- /apps/testing/17-router/src/app/no-book-search.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | 3 | @Component({ 4 | standalone: true, 5 | template: ` 6 |
No book found for this search
7 | `, 8 | changeDetection: ChangeDetectionStrategy.OnPush, 9 | }) 10 | export default class ShelfComponent {} 11 | -------------------------------------------------------------------------------- /apps/testing/17-router/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/testing/17-router/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/testing/17-router/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/testing/17-router/src/favicon.ico -------------------------------------------------------------------------------- /apps/testing/17-router/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { appConfig } from './app/app.config'; 3 | 4 | import { AppComponent } from './app/app.component'; 5 | 6 | bootstrapApplication(AppComponent, appConfig).catch((err) => 7 | console.error(err), 8 | ); 9 | -------------------------------------------------------------------------------- /apps/testing/17-router/src/styles.scss: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | -------------------------------------------------------------------------------- /apps/testing/17-router/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom'; 2 | import 'jest-preset-angular/setup-jest'; 3 | -------------------------------------------------------------------------------- /apps/testing/17-router/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": ["jest", "node"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/testing/18-nested-components/README.md: -------------------------------------------------------------------------------- 1 | # Nested Components 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve testing-nested-components 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/testing/18-nested-comp/). 14 | -------------------------------------------------------------------------------- /apps/testing/18-nested-components/cypress.config.ts: -------------------------------------------------------------------------------- 1 | import { nxComponentTestingPreset } from '@nx/angular/plugins/component-testing'; 2 | import { defineConfig } from 'cypress'; 3 | 4 | export default defineConfig({ 5 | component: nxComponentTestingPreset(__filename), 6 | }); 7 | -------------------------------------------------------------------------------- /apps/testing/18-nested-components/cypress/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io", 4 | "body": "Fixtures are a great way to mock data for responses to routes" 5 | } 6 | -------------------------------------------------------------------------------- /apps/testing/18-nested-components/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { ChildComponent } from './child.component'; 3 | 4 | @Component({ 5 | imports: [ChildComponent], 6 | selector: 'app-root', 7 | template: ` 8 | 9 | `, 10 | }) 11 | export class AppComponent {} 12 | -------------------------------------------------------------------------------- /apps/testing/18-nested-components/src/app/http.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | 3 | @Injectable({ providedIn: 'root' }) 4 | export class HttpService { 5 | sendTitle(title: string) { 6 | console.log(`${title} has been sent !!!`); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /apps/testing/18-nested-components/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/testing/18-nested-components/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/testing/18-nested-components/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/testing/18-nested-components/src/favicon.ico -------------------------------------------------------------------------------- /apps/testing/18-nested-components/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | 4 | bootstrapApplication(AppComponent).catch((err) => console.error(err)); 5 | -------------------------------------------------------------------------------- /apps/testing/18-nested-components/src/styles.scss: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | -------------------------------------------------------------------------------- /apps/testing/18-nested-components/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom'; 2 | import 'jest-preset-angular/setup-jest'; 3 | -------------------------------------------------------------------------------- /apps/testing/18-nested-components/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": ["jest", "node"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/testing/19-input-output/README.md: -------------------------------------------------------------------------------- 1 | # Input Output 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve testing-input-output 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/testing/19-input-output/). 14 | -------------------------------------------------------------------------------- /apps/testing/19-input-output/cypress.config.ts: -------------------------------------------------------------------------------- 1 | import { nxComponentTestingPreset } from '@nx/angular/plugins/component-testing'; 2 | import { defineConfig } from 'cypress'; 3 | 4 | export default defineConfig({ 5 | component: nxComponentTestingPreset(__filename), 6 | }); 7 | -------------------------------------------------------------------------------- /apps/testing/19-input-output/cypress/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io", 4 | "body": "Fixtures are a great way to mock data for responses to routes" 5 | } 6 | -------------------------------------------------------------------------------- /apps/testing/19-input-output/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/testing/19-input-output/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/testing/19-input-output/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/testing/19-input-output/src/favicon.ico -------------------------------------------------------------------------------- /apps/testing/19-input-output/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | 4 | bootstrapApplication(AppComponent).catch((err) => console.error(err)); 5 | -------------------------------------------------------------------------------- /apps/testing/19-input-output/src/styles.scss: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | -------------------------------------------------------------------------------- /apps/testing/19-input-output/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom'; 2 | import 'jest-preset-angular/setup-jest'; 3 | -------------------------------------------------------------------------------- /apps/testing/19-input-output/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": ["jest", "node"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/testing/20-modal/README.md: -------------------------------------------------------------------------------- 1 | # Modal 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve testing-modal 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/testing/20-modal/). 14 | -------------------------------------------------------------------------------- /apps/testing/20-modal/cypress.config.ts: -------------------------------------------------------------------------------- 1 | import { nxComponentTestingPreset } from '@nx/angular/plugins/component-testing'; 2 | import { defineConfig } from 'cypress'; 3 | 4 | export default defineConfig({ 5 | component: nxComponentTestingPreset(__filename), 6 | }); 7 | -------------------------------------------------------------------------------- /apps/testing/20-modal/cypress/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io", 4 | "body": "Fixtures are a great way to mock data for responses to routes" 5 | } 6 | -------------------------------------------------------------------------------- /apps/testing/20-modal/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig } from '@angular/core'; 2 | import { provideAnimations } from '@angular/platform-browser/animations'; 3 | export const appConfig: ApplicationConfig = { 4 | providers: [provideAnimations()], 5 | }; 6 | -------------------------------------------------------------------------------- /apps/testing/20-modal/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/testing/20-modal/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/testing/20-modal/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/testing/20-modal/src/favicon.ico -------------------------------------------------------------------------------- /apps/testing/20-modal/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { appConfig } from './app/app.config'; 3 | 4 | import { AppComponent } from './app/app.component'; 5 | 6 | bootstrapApplication(AppComponent, appConfig).catch((err) => 7 | console.error(err), 8 | ); 9 | -------------------------------------------------------------------------------- /apps/testing/20-modal/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/testing/20-modal/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom'; 2 | import 'jest-preset-angular/setup-jest'; 3 | -------------------------------------------------------------------------------- /apps/testing/20-modal/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": ["jest", "node"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/testing/23-harness/README.md: -------------------------------------------------------------------------------- 1 | # Harness 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve testing-harness 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/testing/23-harness/). 14 | -------------------------------------------------------------------------------- /apps/testing/23-harness/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { ChildComponent } from './child.component'; 3 | 4 | @Component({ 5 | imports: [ChildComponent], 6 | selector: 'app-root', 7 | template: ` 8 | 9 | `, 10 | styles: [''], 11 | }) 12 | export class AppComponent {} 13 | -------------------------------------------------------------------------------- /apps/testing/23-harness/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig } from '@angular/core'; 2 | import { provideAnimations } from '@angular/platform-browser/animations'; 3 | 4 | export const appConfig: ApplicationConfig = { 5 | providers: [provideAnimations()], 6 | }; 7 | -------------------------------------------------------------------------------- /apps/testing/23-harness/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/testing/23-harness/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/testing/23-harness/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/testing/23-harness/src/favicon.ico -------------------------------------------------------------------------------- /apps/testing/23-harness/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => 6 | console.error(err), 7 | ); 8 | -------------------------------------------------------------------------------- /apps/testing/23-harness/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom'; 2 | import 'jest-preset-angular/setup-jest'; 3 | -------------------------------------------------------------------------------- /apps/testing/23-harness/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/testing/23-harness/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts", "jest.config.ts"], 4 | "compilerOptions": { 5 | "types": [] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/testing/24-harness-creation/README.md: -------------------------------------------------------------------------------- 1 | # Harness Creation 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve testing-harness-creation 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/testing/24-harness-creation/). 14 | -------------------------------------------------------------------------------- /apps/testing/24-harness-creation/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig } from '@angular/core'; 2 | import { provideAnimations } from '@angular/platform-browser/animations'; 3 | 4 | export const appConfig: ApplicationConfig = { 5 | providers: [provideAnimations()], 6 | }; 7 | -------------------------------------------------------------------------------- /apps/testing/24-harness-creation/src/app/slider.harness.ts: -------------------------------------------------------------------------------- 1 | import { ComponentHarness } from '@angular/cdk/testing'; 2 | 3 | export class MySliderHarness extends ComponentHarness { 4 | static hostSelector = 'app-slider'; 5 | } 6 | -------------------------------------------------------------------------------- /apps/testing/24-harness-creation/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/testing/24-harness-creation/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/testing/24-harness-creation/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/testing/24-harness-creation/src/favicon.ico -------------------------------------------------------------------------------- /apps/testing/24-harness-creation/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => 6 | console.error(err), 7 | ); 8 | -------------------------------------------------------------------------------- /apps/testing/24-harness-creation/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom'; 2 | import 'jest-preset-angular/setup-jest'; 3 | -------------------------------------------------------------------------------- /apps/testing/24-harness-creation/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/testing/24-harness-creation/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": [] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/testing/28-checkbox/README.md: -------------------------------------------------------------------------------- 1 | # Checkbox 2 | 3 | > author: thomas-laforge 4 | 5 | ### Run Application 6 | 7 | ```bash 8 | npx nx serve testing-checkbox 9 | ``` 10 | 11 | ### Documentation and Instruction 12 | 13 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/testing/28-checkbox/). 14 | -------------------------------------------------------------------------------- /apps/testing/28-checkbox/src/app/app.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { render } from '@testing-library/angular'; 2 | import { AppComponent } from './app.component'; 3 | 4 | describe('AppComponent', () => { 5 | describe('When checking the checkbox', () => { 6 | it('Then button is enabled', async () => { 7 | await render(AppComponent); 8 | }); 9 | }); 10 | }); 11 | -------------------------------------------------------------------------------- /apps/testing/28-checkbox/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/testing/28-checkbox/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/testing/28-checkbox/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/testing/28-checkbox/src/favicon.ico -------------------------------------------------------------------------------- /apps/testing/28-checkbox/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | 4 | bootstrapApplication(AppComponent).catch((err) => console.error(err)); 5 | -------------------------------------------------------------------------------- /apps/testing/28-checkbox/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/testing/28-checkbox/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom'; 2 | import 'jest-preset-angular/setup-jest'; 3 | -------------------------------------------------------------------------------- /apps/testing/28-checkbox/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/testing/28-checkbox/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": ["jest", "node"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/testing/29-real-life-application/cypress.config.ts: -------------------------------------------------------------------------------- 1 | import { nxComponentTestingPreset } from '@nx/angular/plugins/component-testing'; 2 | import { defineConfig } from 'cypress'; 3 | 4 | export default defineConfig({ 5 | component: nxComponentTestingPreset(__filename), 6 | }); 7 | -------------------------------------------------------------------------------- /apps/testing/29-real-life-application/cypress/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io", 4 | "body": "Fixtures are a great way to mock data for responses to routes" 5 | } 6 | -------------------------------------------------------------------------------- /apps/testing/29-real-life-application/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { RouterOutlet } from '@angular/router'; 3 | 4 | @Component({ 5 | selector: 'app-root', 6 | imports: [RouterOutlet], 7 | template: ` 8 | 9 | `, 10 | }) 11 | export class AppComponent {} 12 | -------------------------------------------------------------------------------- /apps/testing/29-real-life-application/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/testing/29-real-life-application/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/testing/29-real-life-application/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/testing/29-real-life-application/src/favicon.ico -------------------------------------------------------------------------------- /apps/testing/29-real-life-application/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { appConfig } from './app/app.config'; 3 | 4 | import { AppComponent } from './app/app.component'; 5 | 6 | bootstrapApplication(AppComponent, appConfig).catch((err) => 7 | console.error(err), 8 | ); 9 | -------------------------------------------------------------------------------- /apps/testing/29-real-life-application/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | html, 7 | body { 8 | height: 100%; 9 | } 10 | body { 11 | margin: 0; 12 | font-family: Roboto, 'Helvetica Neue', sans-serif; 13 | } 14 | -------------------------------------------------------------------------------- /apps/testing/29-real-life-application/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom'; 2 | import 'jest-preset-angular/setup-jest'; 3 | -------------------------------------------------------------------------------- /apps/testing/29-real-life-application/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": ["jest", "node"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/typescript/15-function-overload/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/typescript/15-function-overload/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/typescript/15-function-overload/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/typescript/15-function-overload/src/favicon.ico -------------------------------------------------------------------------------- /apps/typescript/15-function-overload/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | 4 | bootstrapApplication(AppComponent).catch((err) => console.error(err)); 5 | -------------------------------------------------------------------------------- /apps/typescript/15-function-overload/src/styles.scss: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | -------------------------------------------------------------------------------- /apps/typescript/15-function-overload/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/typescript/15-function-overload/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": [] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/typescript/47-enums-vs-union-types/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig } from '@angular/core'; 2 | 3 | export const appConfig: ApplicationConfig = { 4 | providers: [], 5 | }; 6 | -------------------------------------------------------------------------------- /apps/typescript/47-enums-vs-union-types/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/typescript/47-enums-vs-union-types/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/typescript/47-enums-vs-union-types/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/apps/typescript/47-enums-vs-union-types/src/favicon.ico -------------------------------------------------------------------------------- /apps/typescript/47-enums-vs-union-types/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { AppComponent } from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => 6 | console.error(err), 7 | ); 8 | -------------------------------------------------------------------------------- /apps/typescript/47-enums-vs-union-types/src/styles.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You can add global styles to this file, and also import other style files */ 6 | -------------------------------------------------------------------------------- /apps/typescript/47-enums-vs-union-types/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts"], 8 | "include": ["src/**/*.d.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/typescript/47-enums-vs-union-types/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src/**/*.ts"], 4 | "compilerOptions": { 5 | "types": [] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /challenge-number.json: -------------------------------------------------------------------------------- 1 | { 2 | "total": 59, 3 | "🟢": 22, 4 | "🟠": 124, 5 | "🔴": 212 6 | } 7 | -------------------------------------------------------------------------------- /commitlint.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { extends: ['@commitlint/config-conventional'] }; 2 | -------------------------------------------------------------------------------- /docs/.gitignore: -------------------------------------------------------------------------------- 1 | # build output 2 | dist/ 3 | # generated types 4 | .astro/ 5 | 6 | # dependencies 7 | node_modules/ 8 | 9 | # logs 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | pnpm-debug.log* 14 | 15 | 16 | # environment variables 17 | .env 18 | .env.production 19 | 20 | # macOS-specific files 21 | .DS_Store 22 | .vercel 23 | -------------------------------------------------------------------------------- /docs/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["astro-build.astro-vscode"], 3 | "unwantedRecommendations": [] 4 | } 5 | -------------------------------------------------------------------------------- /docs/.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "command": "./node_modules/.bin/astro dev", 6 | "name": "Development server", 7 | "request": "launch", 8 | "type": "node-terminal" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /docs/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.wordWrapColumn": 120 3 | } 4 | -------------------------------------------------------------------------------- /docs/public/angular-challenge.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/docs/public/angular-challenge.ico -------------------------------------------------------------------------------- /docs/public/angular-challenge.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/docs/public/angular-challenge.webp -------------------------------------------------------------------------------- /docs/src/assets/4/unknown-person.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/docs/src/assets/4/unknown-person.png -------------------------------------------------------------------------------- /docs/src/assets/4/unknown-student.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/docs/src/assets/4/unknown-student.png -------------------------------------------------------------------------------- /docs/src/assets/PR-code-btn-modal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/docs/src/assets/PR-code-btn-modal.png -------------------------------------------------------------------------------- /docs/src/assets/PR-header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/docs/src/assets/PR-header.png -------------------------------------------------------------------------------- /docs/src/assets/angular-challenge.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/docs/src/assets/angular-challenge.webp -------------------------------------------------------------------------------- /docs/src/assets/codespaces.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/docs/src/assets/codespaces.png -------------------------------------------------------------------------------- /docs/src/assets/fork-sync.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/docs/src/assets/fork-sync.png -------------------------------------------------------------------------------- /docs/src/assets/header-github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/docs/src/assets/header-github.png -------------------------------------------------------------------------------- /docs/src/assets/new-pull-request.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/docs/src/assets/new-pull-request.png -------------------------------------------------------------------------------- /docs/src/assets/performance/34/profiler-record.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/docs/src/assets/performance/34/profiler-record.png -------------------------------------------------------------------------------- /docs/src/assets/performance/35/memoize-profiler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/docs/src/assets/performance/35/memoize-profiler.png -------------------------------------------------------------------------------- /docs/src/assets/performance/profiler-tab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/docs/src/assets/performance/profiler-tab.png -------------------------------------------------------------------------------- /docs/src/assets/rxjs/49/prototype.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/docs/src/assets/rxjs/49/prototype.gif -------------------------------------------------------------------------------- /docs/src/assets/sync-fork-update.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/docs/src/assets/sync-fork-update.png -------------------------------------------------------------------------------- /docs/src/components/MobileMenuFooter.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Default from '@astrojs/starlight/components/MobileMenuFooter.astro'; 3 | import ActionButtonFooter from './ActionButtonFooter.astro'; 4 | 5 | --- 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/src/components/TableOfContents.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Default from '@astrojs/starlight/components/TableOfContents.astro'; 3 | import ActionButtonFooter from './ActionButtonFooter.astro'; 4 | 5 | --- 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/src/content/authors/Ioannis-Tsironis.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Ioannis Tsironis", 3 | "github": "https://github.com/tsironis13", 4 | "linkedin": "https://www.linkedin.com/in/giannis-tsironis/" 5 | } 6 | -------------------------------------------------------------------------------- /docs/src/content/authors/devesh-chaudhari.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Devesh Chaudhari", 3 | "twitter": "https://twitter.com/DeveshChau" 4 | } 5 | -------------------------------------------------------------------------------- /docs/src/content/authors/lance-finney.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Lance Finney", 3 | "twitter": "https://twitter.com/LMFinneyCoder", 4 | "linkedin": "https://www.linkedin.com/in/lmfinney/", 5 | "github": "https://github.com/LMFinney" 6 | } 7 | -------------------------------------------------------------------------------- /docs/src/content/authors/stanislav-gavrilov.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Stanislav Gavrilov", 3 | "linkedin": "https://www.linkedin.com/in/stgavrilov/", 4 | "github": "https://github.com/stillst" 5 | } 6 | -------------------------------------------------------------------------------- /docs/src/content/authors/sven-brodny.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Sven Brodny", 3 | "linkedin": "https://www.linkedin.com/in/sven-brodny-0ba603237/", 4 | "github": "https://github.com/svenson95" 5 | } 6 | -------------------------------------------------------------------------------- /docs/src/content/authors/thomas-laforge.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Thomas Laforge", 3 | "twitter": "https://twitter.com/laforge_toma", 4 | "linkedin": "https://www.linkedin.com/in/thomas-laforge-2b05a945/", 5 | "github": "https://github.com/tomalaforge" 6 | } 7 | -------------------------------------------------------------------------------- /docs/src/content/authors/timothy-alcaide.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Timothy Alcaide", 3 | "github": "https://github.com/alcaidio", 4 | "youtube": "https://www.youtube.com/@timothyalcaide", 5 | "twitter": "https://twitter.com/alcaidio", 6 | "linkedin": "https://www.linkedin.com/in/timothyalcaide" 7 | } 8 | -------------------------------------------------------------------------------- /docs/src/content/authors/wandrille-guesdon.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Wandrille Guesdon", 3 | "linkedin": "https://www.linkedin.com/in/wandrille-guesdon-53a54684/", 4 | "github": "https://github.com/wandri" 5 | } 6 | -------------------------------------------------------------------------------- /docs/src/content/docs/subscription/index.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Subscription 3 | description: Subscribe to email. 4 | noCommentSection: true 5 | --- 6 | import SubscriptionForm from '../../../components/SubscriptionForm.astro' 7 | 8 |
If you want to be informed of new challenges, you can subscribe to the email form.
9 | 10 | 11 | -------------------------------------------------------------------------------- /docs/src/content/docs/zh-cn/subscription/index.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: 订阅 3 | description: Email订阅 4 | noCommentSection: true 5 | --- 6 | import SubscriptionForm from '../../../../components/SubscriptionForm.astro' 7 | 8 |
如果您想了解新的挑战,可以订阅电子邮件
9 | 10 | 11 | -------------------------------------------------------------------------------- /docs/src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /docs/svelte.config.js: -------------------------------------------------------------------------------- 1 | import { vitePreprocess } from '@astrojs/svelte'; 2 | 3 | export default { 4 | preprocess: vitePreprocess(), 5 | }; 6 | -------------------------------------------------------------------------------- /docs/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "astro/tsconfigs/strict", 3 | "compilerOptions": { 4 | "jsx": "react-jsx", 5 | "jsxImportSource": "react" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /jest.config.ts: -------------------------------------------------------------------------------- 1 | import { getJestProjectsAsync } from '@nx/jest'; 2 | 3 | export default async () => ({ 4 | projects: await getJestProjectsAsync(), 5 | }); 6 | -------------------------------------------------------------------------------- /libs/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/libs/.gitkeep -------------------------------------------------------------------------------- /libs/cli/README.md: -------------------------------------------------------------------------------- 1 | # cli 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | 5 | ## Building 6 | 7 | Run `nx build cli` to build the library. 8 | -------------------------------------------------------------------------------- /libs/cli/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@angular-challenges/cli", 3 | "version": "0.0.1", 4 | "type": "commonjs", 5 | "generators": "./generators.json" 6 | } 7 | -------------------------------------------------------------------------------- /libs/cli/src/generators/challenge/files/app/src/app/app.component.ts__tmpl__: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | imports: [], 5 | selector: 'app-root', 6 | template: ``, 7 | styles: [''], 8 | }) 9 | export class AppComponent {} 10 | -------------------------------------------------------------------------------- /libs/cli/src/generators/challenge/files/author/__authorName__.json__tmpl__: -------------------------------------------------------------------------------- 1 | { 2 | "name": "<%= authorName %>" 3 | } 4 | -------------------------------------------------------------------------------- /libs/cli/src/generators/challenge/files/lang-mapper.ts: -------------------------------------------------------------------------------- 1 | export const langMapper = { 2 | en: 'Challenges', 3 | fr: 'Défis', 4 | es: 'Desafíos', 5 | pt: 'Desafios', 6 | ru: 'Испытания', 7 | }; 8 | -------------------------------------------------------------------------------- /libs/cli/src/generators/challenge/files/test/src/app/app.component.spec.ts__tmpl__: -------------------------------------------------------------------------------- 1 | import { render } from '@testing-library/angular'; 2 | import { AppComponent } from './app.component'; 3 | 4 | describe('AppComponent', () => { 5 | test('...', async () => { 6 | await render(AppComponent); 7 | }); 8 | }); 9 | -------------------------------------------------------------------------------- /libs/cli/src/generators/challenge/files/test/src/test-setup.ts__tmpl__: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom'; 2 | import 'jest-preset-angular/setup-jest'; 3 | -------------------------------------------------------------------------------- /libs/cli/src/generators/challenge/schema.d.ts: -------------------------------------------------------------------------------- 1 | export interface Schema { 2 | title: string; 3 | author: string; 4 | challengeDifficulty: string; 5 | category: string; 6 | addTest?: boolean; 7 | skipPackageJson?: boolean; 8 | rootProject?: boolean; 9 | challengeNumber?: number; 10 | } 11 | -------------------------------------------------------------------------------- /libs/cli/src/generators/readme/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/schema", 3 | "$id": "Readme", 4 | "title": "", 5 | "type": "object", 6 | "properties": {} 7 | } 8 | -------------------------------------------------------------------------------- /libs/cli/src/index.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/libs/cli/src/index.ts -------------------------------------------------------------------------------- /libs/cli/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.base.json", 3 | "compilerOptions": { 4 | "module": "commonjs" 5 | }, 6 | "files": [], 7 | "include": [], 8 | "references": [ 9 | { 10 | "path": "./tsconfig.lib.json" 11 | } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /libs/cli/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "declaration": true, 6 | "types": ["node"] 7 | }, 8 | "include": ["src/**/*.ts", "../../apps/testing-modal/src/test-setup.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /libs/custom-plugin/README.md: -------------------------------------------------------------------------------- 1 | # custom-plugin 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | 5 | ## Building 6 | 7 | Run `nx build custom-plugin` to build the library. 8 | 9 | ## Running unit tests 10 | 11 | Run `nx test custom-plugin` to execute the unit tests via [Jest](https://jestjs.io). 12 | -------------------------------------------------------------------------------- /libs/custom-plugin/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@angular-challenges/custom-plugin", 3 | "version": "0.0.1", 4 | "type": "commonjs", 5 | "generators": "./generators.json" 6 | } 7 | -------------------------------------------------------------------------------- /libs/custom-plugin/src/generators/custom-library/README.md: -------------------------------------------------------------------------------- 1 | # Extend Lib Generator 2 | 3 | > author: thomas-laforge 4 | 5 | ### Documentation and Instruction 6 | 7 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/nx/25-generator-lib-ext/). 8 | -------------------------------------------------------------------------------- /libs/custom-plugin/src/generators/custom-library/files/src/index.ts.template: -------------------------------------------------------------------------------- 1 | const variable = "<%= name %>"; -------------------------------------------------------------------------------- /libs/custom-plugin/src/generators/custom-library/schema.d.ts: -------------------------------------------------------------------------------- 1 | export interface CustomLibraryGeneratorSchema { 2 | name: string; 3 | } 4 | -------------------------------------------------------------------------------- /libs/custom-plugin/src/generators/feature-component/README.md: -------------------------------------------------------------------------------- 1 | # Component Generator 2 | 3 | > author: thomas-laforge 4 | 5 | ### Documentation and Instruction 6 | 7 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/nx/26-generator-comp/). 8 | -------------------------------------------------------------------------------- /libs/custom-plugin/src/generators/feature-component/schema.d.ts: -------------------------------------------------------------------------------- 1 | export interface FeatureComponentGeneratorSchema { 2 | name: string; 3 | } 4 | -------------------------------------------------------------------------------- /libs/custom-plugin/src/index.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/libs/custom-plugin/src/index.ts -------------------------------------------------------------------------------- /libs/custom-plugin/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.base.json", 3 | "compilerOptions": { 4 | "module": "commonjs" 5 | }, 6 | "files": [], 7 | "include": [], 8 | "references": [ 9 | { 10 | "path": "./tsconfig.lib.json" 11 | }, 12 | { 13 | "path": "./tsconfig.spec.json" 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /libs/custom-plugin/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "declaration": true, 6 | "types": ["node"] 7 | }, 8 | "include": ["src/**/*.ts"], 9 | "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /libs/custom-plugin/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "module": "commonjs", 6 | "types": ["jest", "node"] 7 | }, 8 | "include": [ 9 | "jest.config.ts", 10 | "src/**/*.test.ts", 11 | "src/**/*.spec.ts", 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /libs/decoupling/brain/README.md: -------------------------------------------------------------------------------- 1 | # decoupling-brain 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | 5 | ## Running unit tests 6 | 7 | Run `nx test decoupling-brain` to execute the unit tests. 8 | -------------------------------------------------------------------------------- /libs/decoupling/brain/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", 3 | "dest": "../../../dist/libs/decoupling/brain", 4 | "lib": { 5 | "entryFile": "src/index.ts" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /libs/decoupling/brain/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@angular-challenges/decoupling/brain", 3 | "version": "0.0.1", 4 | "peerDependencies": { 5 | "@angular/common": "^16.1.0", 6 | "@angular/core": "^16.1.0" 7 | }, 8 | "dependencies": { 9 | "tslib": "^2.3.0" 10 | }, 11 | "sideEffects": false 12 | } 13 | -------------------------------------------------------------------------------- /libs/decoupling/brain/src/index.ts: -------------------------------------------------------------------------------- 1 | export { 2 | BtnDisabledDirective, 3 | ButtonState, 4 | } from './lib/button-disabled.directive'; 5 | -------------------------------------------------------------------------------- /libs/decoupling/brain/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | // @ts-expect-error https://thymikee.github.io/jest-preset-angular/docs/getting-started/test-environment 2 | globalThis.ngJest = { 3 | testEnvironmentOptions: { 4 | errorOnUnknownElements: true, 5 | errorOnUnknownProperties: true, 6 | }, 7 | }; 8 | import 'jest-preset-angular/setup-jest'; 9 | -------------------------------------------------------------------------------- /libs/decoupling/brain/tsconfig.lib.prod.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.lib.json", 3 | "compilerOptions": { 4 | "declarationMap": false 5 | }, 6 | "angularCompilerOptions": {} 7 | } 8 | -------------------------------------------------------------------------------- /libs/decoupling/core/README.md: -------------------------------------------------------------------------------- 1 | # decoupling-core 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | 5 | ## Running unit tests 6 | 7 | Run `nx test decoupling-core` to execute the unit tests. 8 | -------------------------------------------------------------------------------- /libs/decoupling/core/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", 3 | "dest": "../../../dist/libs/decoupling/core", 4 | "lib": { 5 | "entryFile": "src/index.ts" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /libs/decoupling/core/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@angular-challenges/decoupling/core", 3 | "version": "0.0.1", 4 | "peerDependencies": { 5 | "@angular/common": "^16.1.0", 6 | "@angular/core": "^16.1.0" 7 | }, 8 | "dependencies": { 9 | "tslib": "^2.3.0" 10 | }, 11 | "sideEffects": false 12 | } 13 | -------------------------------------------------------------------------------- /libs/decoupling/core/src/index.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/libs/decoupling/core/src/index.ts -------------------------------------------------------------------------------- /libs/decoupling/core/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | // @ts-expect-error https://thymikee.github.io/jest-preset-angular/docs/getting-started/test-environment 2 | globalThis.ngJest = { 3 | testEnvironmentOptions: { 4 | errorOnUnknownElements: true, 5 | errorOnUnknownProperties: true, 6 | }, 7 | }; 8 | import 'jest-preset-angular/setup-jest'; 9 | -------------------------------------------------------------------------------- /libs/decoupling/core/tsconfig.lib.prod.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.lib.json", 3 | "compilerOptions": { 4 | "declarationMap": false 5 | }, 6 | "angularCompilerOptions": {} 7 | } 8 | -------------------------------------------------------------------------------- /libs/decoupling/helmet/README.md: -------------------------------------------------------------------------------- 1 | # decoupling-helmet 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | 5 | ## Running unit tests 6 | 7 | Run `nx test decoupling-helmet` to execute the unit tests. 8 | -------------------------------------------------------------------------------- /libs/decoupling/helmet/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", 3 | "dest": "../../../dist/libs/decoupling/helmet", 4 | "lib": { 5 | "entryFile": "src/index.ts" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /libs/decoupling/helmet/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@angular-challenges/decoupling/helmet", 3 | "version": "0.0.1", 4 | "peerDependencies": { 5 | "@angular/common": "^16.1.0", 6 | "@angular/core": "^16.1.0" 7 | }, 8 | "dependencies": { 9 | "tslib": "^2.3.0" 10 | }, 11 | "sideEffects": false 12 | } 13 | -------------------------------------------------------------------------------- /libs/decoupling/helmet/src/index.ts: -------------------------------------------------------------------------------- 1 | export { BtnHelmetDirective } from './lib/btn-style.directive'; 2 | -------------------------------------------------------------------------------- /libs/decoupling/helmet/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | // @ts-expect-error https://thymikee.github.io/jest-preset-angular/docs/getting-started/test-environment 2 | globalThis.ngJest = { 3 | testEnvironmentOptions: { 4 | errorOnUnknownElements: true, 5 | errorOnUnknownProperties: true, 6 | }, 7 | }; 8 | import 'jest-preset-angular/setup-jest'; 9 | -------------------------------------------------------------------------------- /libs/decoupling/helmet/tsconfig.lib.prod.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.lib.json", 3 | "compilerOptions": { 4 | "declarationMap": false 5 | }, 6 | "angularCompilerOptions": {} 7 | } 8 | -------------------------------------------------------------------------------- /libs/fake-utils/README.md: -------------------------------------------------------------------------------- 1 | # fake-utils 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | -------------------------------------------------------------------------------- /libs/fake-utils/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", 3 | "dest": "../../dist/libs/fake-utils", 4 | "lib": { 5 | "entryFile": "src/index.ts" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /libs/fake-utils/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@angular-challenges/fake-utils", 3 | "version": "0.0.1", 4 | "peerDependencies": { 5 | "@angular/common": "^16.0.0", 6 | "@angular/core": "^16.0.0" 7 | }, 8 | "dependencies": { 9 | "tslib": "^2.3.0" 10 | }, 11 | "sideEffects": false 12 | } 13 | -------------------------------------------------------------------------------- /libs/fake-utils/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/base-url.token'; 2 | -------------------------------------------------------------------------------- /libs/fake-utils/src/lib/base-url.token.ts: -------------------------------------------------------------------------------- 1 | import { InjectionToken } from '@angular/core'; 2 | 3 | export const BASE_URL = new InjectionToken('base_url'); 4 | -------------------------------------------------------------------------------- /libs/fake-utils/tsconfig.lib.prod.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.lib.json", 3 | "compilerOptions": { 4 | "declarationMap": false 5 | }, 6 | "angularCompilerOptions": {} 7 | } 8 | -------------------------------------------------------------------------------- /libs/module-to-standalone/admin/feature/README.md: -------------------------------------------------------------------------------- 1 | # module-to-standalone-admin-feature 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | 5 | ## Running unit tests 6 | 7 | Run `nx test module-to-standalone-admin-feature` to execute the unit tests. 8 | -------------------------------------------------------------------------------- /libs/module-to-standalone/admin/feature/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/admin-feature.module'; 2 | -------------------------------------------------------------------------------- /libs/module-to-standalone/admin/feature/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | // @ts-expect-error https://thymikee.github.io/jest-preset-angular/docs/getting-started/test-environment 2 | globalThis.ngJest = { 3 | testEnvironmentOptions: { 4 | errorOnUnknownElements: true, 5 | errorOnUnknownProperties: true, 6 | }, 7 | }; 8 | import 'jest-preset-angular/setup-jest'; 9 | -------------------------------------------------------------------------------- /libs/module-to-standalone/admin/shared/README.md: -------------------------------------------------------------------------------- 1 | # module-to-standalone-admin-shared 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | 5 | ## Running unit tests 6 | 7 | Run `nx test module-to-standalone-admin-shared` to execute the unit tests. 8 | -------------------------------------------------------------------------------- /libs/module-to-standalone/admin/shared/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/authorized.guard'; 2 | -------------------------------------------------------------------------------- /libs/module-to-standalone/admin/shared/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | // @ts-expect-error https://thymikee.github.io/jest-preset-angular/docs/getting-started/test-environment 2 | globalThis.ngJest = { 3 | testEnvironmentOptions: { 4 | errorOnUnknownElements: true, 5 | errorOnUnknownProperties: true, 6 | }, 7 | }; 8 | import 'jest-preset-angular/setup-jest'; 9 | -------------------------------------------------------------------------------- /libs/module-to-standalone/core/providers/README.md: -------------------------------------------------------------------------------- 1 | # module-to-standalone-core-providers 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | 5 | ## Running unit tests 6 | 7 | Run `nx test module-to-standalone-core-providers` to execute the unit tests. 8 | -------------------------------------------------------------------------------- /libs/module-to-standalone/core/providers/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "../../../../node_modules/ng-packagr/ng-package.schema.json", 3 | "dest": "../../../../dist/libs/module-to-standalone/core/providers", 4 | "lib": { 5 | "entryFile": "src/index.ts" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /libs/module-to-standalone/core/providers/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@angular-challenges/module-to-standalone/core/providers", 3 | "version": "0.0.1", 4 | "peerDependencies": { 5 | "@angular/common": "^16.0.0", 6 | "@angular/core": "^16.0.0" 7 | }, 8 | "dependencies": { 9 | "tslib": "^2.3.0" 10 | }, 11 | "sideEffects": false 12 | } 13 | -------------------------------------------------------------------------------- /libs/module-to-standalone/core/providers/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/token.provider'; 2 | -------------------------------------------------------------------------------- /libs/module-to-standalone/core/providers/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | // @ts-expect-error https://thymikee.github.io/jest-preset-angular/docs/getting-started/test-environment 2 | globalThis.ngJest = { 3 | testEnvironmentOptions: { 4 | errorOnUnknownElements: true, 5 | errorOnUnknownProperties: true, 6 | }, 7 | }; 8 | import 'jest-preset-angular/setup-jest'; 9 | -------------------------------------------------------------------------------- /libs/module-to-standalone/core/providers/tsconfig.lib.prod.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.lib.json", 3 | "compilerOptions": { 4 | "declarationMap": false 5 | }, 6 | "angularCompilerOptions": {} 7 | } 8 | -------------------------------------------------------------------------------- /libs/module-to-standalone/core/service/README.md: -------------------------------------------------------------------------------- 1 | # module-to-standalone-core-service 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | 5 | ## Running unit tests 6 | 7 | Run `nx test module-to-standalone-core-service` to execute the unit tests. 8 | -------------------------------------------------------------------------------- /libs/module-to-standalone/core/service/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/authorization.service'; 2 | -------------------------------------------------------------------------------- /libs/module-to-standalone/core/service/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | // @ts-expect-error https://thymikee.github.io/jest-preset-angular/docs/getting-started/test-environment 2 | globalThis.ngJest = { 3 | testEnvironmentOptions: { 4 | errorOnUnknownElements: true, 5 | errorOnUnknownProperties: true, 6 | }, 7 | }; 8 | import 'jest-preset-angular/setup-jest'; 9 | -------------------------------------------------------------------------------- /libs/module-to-standalone/forbidden/README.md: -------------------------------------------------------------------------------- 1 | # module-to-standalone-forbidden 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | 5 | ## Running unit tests 6 | 7 | Run `nx test module-to-standalone-forbidden` to execute the unit tests. 8 | -------------------------------------------------------------------------------- /libs/module-to-standalone/forbidden/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/forbidden.module'; 2 | -------------------------------------------------------------------------------- /libs/module-to-standalone/forbidden/src/lib/forbidden.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'lib-home', 5 | template: ` 6 | Forbidden component 7 | `, 8 | standalone: false, 9 | }) 10 | export class ForbiddenComponent {} 11 | -------------------------------------------------------------------------------- /libs/module-to-standalone/forbidden/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | // @ts-expect-error https://thymikee.github.io/jest-preset-angular/docs/getting-started/test-environment 2 | globalThis.ngJest = { 3 | testEnvironmentOptions: { 4 | errorOnUnknownElements: true, 5 | errorOnUnknownProperties: true, 6 | }, 7 | }; 8 | import 'jest-preset-angular/setup-jest'; 9 | -------------------------------------------------------------------------------- /libs/module-to-standalone/home/README.md: -------------------------------------------------------------------------------- 1 | # module-to-standalone-home 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | 5 | ## Running unit tests 6 | 7 | Run `nx test module-to-standalone-home` to execute the unit tests. 8 | -------------------------------------------------------------------------------- /libs/module-to-standalone/home/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/home.module'; 2 | -------------------------------------------------------------------------------- /libs/module-to-standalone/home/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | // @ts-expect-error https://thymikee.github.io/jest-preset-angular/docs/getting-started/test-environment 2 | globalThis.ngJest = { 3 | testEnvironmentOptions: { 4 | errorOnUnknownElements: true, 5 | errorOnUnknownProperties: true, 6 | }, 7 | }; 8 | import 'jest-preset-angular/setup-jest'; 9 | -------------------------------------------------------------------------------- /libs/module-to-standalone/shell/README.md: -------------------------------------------------------------------------------- 1 | # module-to-standalone-shell 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | 5 | ## Running unit tests 6 | 7 | Run `nx test module-to-standalone-shell` to execute the unit tests. 8 | -------------------------------------------------------------------------------- /libs/module-to-standalone/shell/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/main-shell.module'; 2 | -------------------------------------------------------------------------------- /libs/module-to-standalone/shell/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | // @ts-expect-error https://thymikee.github.io/jest-preset-angular/docs/getting-started/test-environment 2 | globalThis.ngJest = { 3 | testEnvironmentOptions: { 4 | errorOnUnknownElements: true, 5 | errorOnUnknownProperties: true, 6 | }, 7 | }; 8 | import 'jest-preset-angular/setup-jest'; 9 | -------------------------------------------------------------------------------- /libs/module-to-standalone/user/contact/README.md: -------------------------------------------------------------------------------- 1 | # module-to-standalone-user-contact 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | 5 | ## Running unit tests 6 | 7 | Run `nx test module-to-standalone-user-contact` to execute the unit tests. 8 | -------------------------------------------------------------------------------- /libs/module-to-standalone/user/contact/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "../../../../node_modules/ng-packagr/ng-package.schema.json", 3 | "dest": "../../../../dist/libs/module-to-standalone/user/contact", 4 | "lib": { 5 | "entryFile": "src/index.ts" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /libs/module-to-standalone/user/contact/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@angular-challenges/module-to-standalone/user/contact", 3 | "version": "0.0.1", 4 | "peerDependencies": { 5 | "@angular/common": "^16.0.0", 6 | "@angular/core": "^16.0.0" 7 | }, 8 | "dependencies": { 9 | "tslib": "^2.3.0" 10 | }, 11 | "sideEffects": false 12 | } 13 | -------------------------------------------------------------------------------- /libs/module-to-standalone/user/contact/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/contact-feature.module'; 2 | -------------------------------------------------------------------------------- /libs/module-to-standalone/user/contact/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | // @ts-expect-error https://thymikee.github.io/jest-preset-angular/docs/getting-started/test-environment 2 | globalThis.ngJest = { 3 | testEnvironmentOptions: { 4 | errorOnUnknownElements: true, 5 | errorOnUnknownProperties: true, 6 | }, 7 | }; 8 | import 'jest-preset-angular/setup-jest'; 9 | -------------------------------------------------------------------------------- /libs/module-to-standalone/user/contact/tsconfig.lib.prod.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.lib.json", 3 | "compilerOptions": { 4 | "declarationMap": false 5 | }, 6 | "angularCompilerOptions": {} 7 | } 8 | -------------------------------------------------------------------------------- /libs/module-to-standalone/user/home/README.md: -------------------------------------------------------------------------------- 1 | # module-to-standalone-user-home 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | 5 | ## Running unit tests 6 | 7 | Run `nx test module-to-standalone-user-home` to execute the unit tests. 8 | -------------------------------------------------------------------------------- /libs/module-to-standalone/user/home/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "../../../../node_modules/ng-packagr/ng-package.schema.json", 3 | "dest": "../../../../dist/libs/module-to-standalone/user/home", 4 | "lib": { 5 | "entryFile": "src/index.ts" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /libs/module-to-standalone/user/home/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@angular-challenges/module-to-standalone/user/home", 3 | "version": "0.0.1", 4 | "peerDependencies": { 5 | "@angular/common": "^16.0.0", 6 | "@angular/core": "^16.0.0" 7 | }, 8 | "dependencies": { 9 | "tslib": "^2.3.0" 10 | }, 11 | "sideEffects": false 12 | } 13 | -------------------------------------------------------------------------------- /libs/module-to-standalone/user/home/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/home.module'; 2 | -------------------------------------------------------------------------------- /libs/module-to-standalone/user/home/src/lib/home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'lib-user-home', 5 | template: ` 6 | User Home component 7 | `, 8 | standalone: false, 9 | }) 10 | export class UserHomeComponent {} 11 | -------------------------------------------------------------------------------- /libs/module-to-standalone/user/home/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | // @ts-expect-error https://thymikee.github.io/jest-preset-angular/docs/getting-started/test-environment 2 | globalThis.ngJest = { 3 | testEnvironmentOptions: { 4 | errorOnUnknownElements: true, 5 | errorOnUnknownProperties: true, 6 | }, 7 | }; 8 | import 'jest-preset-angular/setup-jest'; 9 | -------------------------------------------------------------------------------- /libs/module-to-standalone/user/home/tsconfig.lib.prod.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.lib.json", 3 | "compilerOptions": { 4 | "declarationMap": false 5 | }, 6 | "angularCompilerOptions": {} 7 | } 8 | -------------------------------------------------------------------------------- /libs/module-to-standalone/user/shell/README.md: -------------------------------------------------------------------------------- 1 | # module-to-standalone-user-shell 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | 5 | ## Running unit tests 6 | 7 | Run `nx test module-to-standalone-user-shell` to execute the unit tests. 8 | -------------------------------------------------------------------------------- /libs/module-to-standalone/user/shell/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "../../../../node_modules/ng-packagr/ng-package.schema.json", 3 | "dest": "../../../../dist/libs/module-to-standalone/user/shell", 4 | "lib": { 5 | "entryFile": "src/index.ts" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /libs/module-to-standalone/user/shell/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@angular-challenges/module-to-standalone/user/shell", 3 | "version": "0.0.1", 4 | "peerDependencies": { 5 | "@angular/common": "^16.0.0", 6 | "@angular/core": "^16.0.0" 7 | }, 8 | "dependencies": { 9 | "tslib": "^2.3.0" 10 | }, 11 | "sideEffects": false 12 | } 13 | -------------------------------------------------------------------------------- /libs/module-to-standalone/user/shell/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/user-shell.module'; 2 | -------------------------------------------------------------------------------- /libs/module-to-standalone/user/shell/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | // @ts-expect-error https://thymikee.github.io/jest-preset-angular/docs/getting-started/test-environment 2 | globalThis.ngJest = { 3 | testEnvironmentOptions: { 4 | errorOnUnknownElements: true, 5 | errorOnUnknownProperties: true, 6 | }, 7 | }; 8 | import 'jest-preset-angular/setup-jest'; 9 | -------------------------------------------------------------------------------- /libs/module-to-standalone/user/shell/tsconfig.lib.prod.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.lib.json", 3 | "compilerOptions": { 4 | "declarationMap": false 5 | }, 6 | "angularCompilerOptions": {} 7 | } 8 | -------------------------------------------------------------------------------- /libs/shared/directives/README.md: -------------------------------------------------------------------------------- 1 | # shared-directives 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | 5 | ## Running unit tests 6 | 7 | Run `nx test shared-directives` to execute the unit tests. 8 | -------------------------------------------------------------------------------- /libs/shared/directives/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", 3 | "dest": "../../../dist/libs/shared/directives", 4 | "lib": { 5 | "entryFile": "src/index.ts" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /libs/shared/directives/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@angular-challenges/shared/directives", 3 | "version": "0.0.1", 4 | "peerDependencies": { 5 | "@angular/common": "^16.1.0", 6 | "@angular/core": "^16.1.0" 7 | }, 8 | "dependencies": { 9 | "tslib": "^2.3.0" 10 | }, 11 | "sideEffects": false 12 | } 13 | -------------------------------------------------------------------------------- /libs/shared/directives/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/cd-flashing.directive'; 2 | export { NgForTrackByModule } from './lib/track-by.directive'; 3 | -------------------------------------------------------------------------------- /libs/shared/directives/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | // @ts-expect-error https://thymikee.github.io/jest-preset-angular/docs/getting-started/test-environment 2 | globalThis.ngJest = { 3 | testEnvironmentOptions: { 4 | errorOnUnknownElements: true, 5 | errorOnUnknownProperties: true, 6 | }, 7 | }; 8 | import 'jest-preset-angular/setup-jest'; 9 | -------------------------------------------------------------------------------- /libs/shared/directives/tsconfig.lib.prod.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.lib.json", 3 | "compilerOptions": { 4 | "declarationMap": false 5 | }, 6 | "angularCompilerOptions": {} 7 | } 8 | -------------------------------------------------------------------------------- /libs/shared/ui/README.md: -------------------------------------------------------------------------------- 1 | # ui 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | -------------------------------------------------------------------------------- /libs/shared/ui/project.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ui", 3 | "$schema": "../../../node_modules/nx/schemas/project-schema.json", 4 | "sourceRoot": "libs/shared/ui/src", 5 | "prefix": "lib", 6 | "projectType": "library", 7 | "tags": [], 8 | "targets": { 9 | "lint": { 10 | "inputs": ["{workspaceRoot}/tools/eslint-rules/**/*"] 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /libs/shared/ui/src/index.ts: -------------------------------------------------------------------------------- 1 | export { TableComponent } from './lib/table.component'; 2 | -------------------------------------------------------------------------------- /libs/shared/utils/README.md: -------------------------------------------------------------------------------- 1 | # shared-utils 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | 5 | ## Running unit tests 6 | 7 | Run `nx test shared-utils` to execute the unit tests. 8 | -------------------------------------------------------------------------------- /libs/shared/utils/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/destroy-service.service'; 2 | export * from './lib/random-http-error.utils'; 3 | -------------------------------------------------------------------------------- /libs/shared/utils/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import 'jest-preset-angular/setup-jest'; 2 | -------------------------------------------------------------------------------- /libs/static-dynamic-import/users/README.md: -------------------------------------------------------------------------------- 1 | # users 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | -------------------------------------------------------------------------------- /libs/static-dynamic-import/users/src/index.ts: -------------------------------------------------------------------------------- 1 | export { UserComponent } from './lib/user.component'; 2 | export type { User } from './lib/user.model'; 3 | export { default } from './lib/users.component'; 4 | -------------------------------------------------------------------------------- /libs/static-dynamic-import/users/src/lib/user.model.ts: -------------------------------------------------------------------------------- 1 | export interface User { 2 | name: string; 3 | lastName: string; 4 | country: string; 5 | } 6 | -------------------------------------------------------------------------------- /libs/testing-table/backend/README.md: -------------------------------------------------------------------------------- 1 | # testing-table-backend 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | -------------------------------------------------------------------------------- /libs/testing-table/backend/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/fake-backend.service'; 2 | -------------------------------------------------------------------------------- /libs/testing-table/model/README.md: -------------------------------------------------------------------------------- 1 | # testing-table-model 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | -------------------------------------------------------------------------------- /libs/testing-table/model/project.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "testing-table-model", 3 | "$schema": "../../../node_modules/nx/schemas/project-schema.json", 4 | "sourceRoot": "libs/testing-table/model/src", 5 | "prefix": "lib", 6 | "tags": [], 7 | "projectType": "library", 8 | "targets": {} 9 | } 10 | -------------------------------------------------------------------------------- /libs/testing-table/model/src/index.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/libs/testing-table/model/src/index.ts -------------------------------------------------------------------------------- /logo/angular-challenge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tomalaforge/angular-challenges/8ce54022acfcb773d5d8e4aed5630f00a6ab1797/logo/angular-challenge.png -------------------------------------------------------------------------------- /tools/eslint-rules/index.ts: -------------------------------------------------------------------------------- 1 | import { 2 | rule as forbiddenEnum, 3 | RULE_NAME as forbiddenEnumName, 4 | } from './rules/forbidden-enum'; 5 | 6 | module.exports = { 7 | rules: { [forbiddenEnumName]: forbiddenEnum }, 8 | }; 9 | -------------------------------------------------------------------------------- /tools/eslint-rules/rules/forbidden-enum.README.md: -------------------------------------------------------------------------------- 1 | # Custom ESLint Rule 2 | 3 | > author: thomas-laforge 4 | 5 | ### Documentation and Instruction 6 | 7 | Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/nx/27-forbid-enum-rule/). 8 | -------------------------------------------------------------------------------- /tools/eslint-rules/tsconfig.lint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "types": ["node"] 6 | }, 7 | "exclude": ["**/*.spec.ts"], 8 | "include": ["**/*.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /tools/eslint-rules/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "types": ["jest", "node"] 6 | }, 7 | "include": ["jest.config.ts", "**/*.test.ts", "**/*.spec.ts", "**/*.d.ts"] 8 | } 9 | -------------------------------------------------------------------------------- /tools/tsconfig.tools.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.base.json", 3 | "compilerOptions": { 4 | "outDir": "../dist/out-tsc/tools", 5 | "rootDir": ".", 6 | "module": "commonjs", 7 | "target": "es5", 8 | "types": ["node"], 9 | "importHelpers": false 10 | }, 11 | "include": ["**/*.ts"] 12 | } 13 | --------------------------------------------------------------------------------