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