diff --git a/README.md b/README.md
index f1e987f..e2abfb4 100644
--- a/README.md
+++ b/README.md
@@ -32,11 +32,16 @@ This goal of this project is to help you get better at Angular and NgRx by resol
+
+
+
+
diff --git a/apps/declarative-to-reactive/.eslintrc.json b/apps/declarative-to-reactive/.eslintrc.json
new file mode 100644
index 0000000..c34c7dd
--- /dev/null
+++ b/apps/declarative-to-reactive/.eslintrc.json
@@ -0,0 +1,36 @@
+{
+ "extends": ["../../.eslintrc.json"],
+ "ignorePatterns": ["!**/*"],
+ "overrides": [
+ {
+ "files": ["*.ts"],
+ "rules": {
+ "@angular-eslint/directive-selector": [
+ "error",
+ {
+ "type": "attribute",
+ "prefix": "app",
+ "style": "camelCase"
+ }
+ ],
+ "@angular-eslint/component-selector": [
+ "error",
+ {
+ "type": "element",
+ "prefix": "app",
+ "style": "kebab-case"
+ }
+ ]
+ },
+ "extends": [
+ "plugin:@nrwl/nx/angular",
+ "plugin:@angular-eslint/template/process-inline-templates"
+ ]
+ },
+ {
+ "files": ["*.html"],
+ "extends": ["plugin:@nrwl/nx/angular-template"],
+ "rules": {}
+ }
+ ]
+}
diff --git a/apps/declarative-to-reactive/README.md b/apps/declarative-to-reactive/README.md
new file mode 100644
index 0000000..0a58b02
--- /dev/null
+++ b/apps/declarative-to-reactive/README.md
@@ -0,0 +1,33 @@
+
Declarative Programming to Reactive Programming
+
+> Author: Thomas Laforge
+
+
+
+### Information
+
+### Statement
+
+### Step 1
+
+### Step 2
+
+### Constraints:
+
+### Submitting your work
+
+1. Fork the project
+2. clone it
+3. npm install
+4. **nx serve declarative-to-reactive**
+5. _...work on it_
+6. Commit your work
+7. Submit a PR with a title beginning with **Answer:13** that I will review and other dev can review.
+
+
+
+
+
+
+_You can ask any question on_
diff --git a/apps/declarative-to-reactive/jest.config.ts b/apps/declarative-to-reactive/jest.config.ts
new file mode 100644
index 0000000..70be4a5
--- /dev/null
+++ b/apps/declarative-to-reactive/jest.config.ts
@@ -0,0 +1,22 @@
+/* eslint-disable */
+export default {
+ displayName: 'declarative-to-reactive',
+ preset: '../../jest.preset.js',
+ setupFilesAfterEnv: ['/src/test-setup.ts'],
+ globals: {
+ 'ts-jest': {
+ tsconfig: '/tsconfig.spec.json',
+ stringifyContentPathRegex: '\\.(html|svg)$',
+ },
+ },
+ coverageDirectory: '../../coverage/apps/declarative-to-reactive',
+ transform: {
+ '^.+\\.(ts|mjs|js|html)$': 'jest-preset-angular',
+ },
+ transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'],
+ snapshotSerializers: [
+ 'jest-preset-angular/build/serializers/no-ng-attributes',
+ 'jest-preset-angular/build/serializers/ng-snapshot',
+ 'jest-preset-angular/build/serializers/html-comment',
+ ],
+};
diff --git a/apps/declarative-to-reactive/project.json b/apps/declarative-to-reactive/project.json
new file mode 100644
index 0000000..ded9c7a
--- /dev/null
+++ b/apps/declarative-to-reactive/project.json
@@ -0,0 +1,90 @@
+{
+ "name": "declarative-to-reactive",
+ "$schema": "../../node_modules/nx/schemas/project-schema.json",
+ "projectType": "application",
+ "sourceRoot": "apps/declarative-to-reactive/src",
+ "prefix": "app",
+ "targets": {
+ "build": {
+ "executor": "@angular-devkit/build-angular:browser",
+ "outputs": ["{options.outputPath}"],
+ "options": {
+ "outputPath": "dist/apps/declarative-to-reactive",
+ "index": "apps/declarative-to-reactive/src/index.html",
+ "main": "apps/declarative-to-reactive/src/main.ts",
+ "polyfills": ["zone.js"],
+ "tsConfig": "apps/declarative-to-reactive/tsconfig.app.json",
+ "inlineStyleLanguage": "scss",
+ "assets": [
+ "apps/declarative-to-reactive/src/favicon.ico",
+ "apps/declarative-to-reactive/src/assets"
+ ],
+ "styles": ["apps/declarative-to-reactive/src/styles.scss"],
+ "scripts": []
+ },
+ "configurations": {
+ "production": {
+ "budgets": [
+ {
+ "type": "initial",
+ "maximumWarning": "500kb",
+ "maximumError": "1mb"
+ },
+ {
+ "type": "anyComponentStyle",
+ "maximumWarning": "2kb",
+ "maximumError": "4kb"
+ }
+ ],
+ "outputHashing": "all"
+ },
+ "development": {
+ "buildOptimizer": false,
+ "optimization": false,
+ "vendorChunk": true,
+ "extractLicenses": false,
+ "sourceMap": true,
+ "namedChunks": true
+ }
+ },
+ "defaultConfiguration": "production"
+ },
+ "serve": {
+ "executor": "@angular-devkit/build-angular:dev-server",
+ "configurations": {
+ "production": {
+ "browserTarget": "declarative-to-reactive:build:production"
+ },
+ "development": {
+ "browserTarget": "declarative-to-reactive:build:development"
+ }
+ },
+ "defaultConfiguration": "development"
+ },
+ "extract-i18n": {
+ "executor": "@angular-devkit/build-angular:extract-i18n",
+ "options": {
+ "browserTarget": "declarative-to-reactive:build"
+ }
+ },
+ "lint": {
+ "executor": "@nrwl/linter:eslint",
+ "outputs": ["{options.outputFile}"],
+ "options": {
+ "lintFilePatterns": [
+ "apps/declarative-to-reactive/**/*.ts",
+ "apps/declarative-to-reactive/**/*.html"
+ ]
+ }
+ },
+ "test": {
+ "executor": "@nrwl/jest:jest",
+ "outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
+ "options": {
+ "jestConfig": "apps/declarative-to-reactive/jest.config.ts",
+ "passWithNoTests": true
+ }
+ }
+ },
+ "tags": []
+}
diff --git a/apps/declarative-to-reactive/src/app/app.component.ts b/apps/declarative-to-reactive/src/app/app.component.ts
new file mode 100644
index 0000000..d782ae8
--- /dev/null
+++ b/apps/declarative-to-reactive/src/app/app.component.ts
@@ -0,0 +1,13 @@
+import { NxWelcomeComponent } from './nx-welcome.component';
+import { Component } from '@angular/core';
+
+@Component({
+ standalone: true,
+ imports: [NxWelcomeComponent],
+ selector: 'app-root',
+ template: ` `,
+ styles: [],
+})
+export class AppComponent {
+ title = 'declarative-to-reactive';
+}
diff --git a/apps/declarative-to-reactive/src/app/nx-welcome.component.ts b/apps/declarative-to-reactive/src/app/nx-welcome.component.ts
new file mode 100644
index 0000000..7f0b50f
--- /dev/null
+++ b/apps/declarative-to-reactive/src/app/nx-welcome.component.ts
@@ -0,0 +1,801 @@
+import { Component, ViewEncapsulation } from '@angular/core';
+import { CommonModule } from '@angular/common';
+
+/* eslint-disable */
+
+@Component({
+ selector: 'app-nx-welcome',
+ standalone: true,
+ imports: [CommonModule],
+ template: `
+
+
+
+
+
+
+
+ Hello there,
+ Welcome declarative-to-reactive 👋
+
+
+
+
+
+
+
+
+
+
+
+
Next steps
+
Here are some things you can do with Nx:
+
+
+
+
+
+ Add UI library
+
+ # Generate UI lib
+nx g @nrwl/angular:lib ui
+
+# Add a component
+nx g @nrwl/angular:component button --project ui
+
+
+
+
+
+
+ View interactive project graph
+
+ nx graph
+
+
+
+
+
+
+ Run affected commands
+
+ # see what's been affected by changes
+nx affected:graph
+
+# run tests for current changes
+nx affected:test
+
+# run e2e tests for current changes
+nx affected:e2e
+
+
+
+
+ Carefully crafted with
+
+
+
+
+
+
+ `,
+ styles: [],
+ encapsulation: ViewEncapsulation.None,
+})
+export class NxWelcomeComponent {}
diff --git a/apps/declarative-to-reactive/src/assets/.gitkeep b/apps/declarative-to-reactive/src/assets/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/apps/declarative-to-reactive/src/favicon.ico b/apps/declarative-to-reactive/src/favicon.ico
new file mode 100644
index 0000000..317ebcb
Binary files /dev/null and b/apps/declarative-to-reactive/src/favicon.ico differ
diff --git a/apps/declarative-to-reactive/src/index.html b/apps/declarative-to-reactive/src/index.html
new file mode 100644
index 0000000..8edb389
--- /dev/null
+++ b/apps/declarative-to-reactive/src/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+ DeclarativeToReactive
+
+
+
+
+
+
+
+
diff --git a/apps/declarative-to-reactive/src/main.ts b/apps/declarative-to-reactive/src/main.ts
new file mode 100644
index 0000000..31c5da4
--- /dev/null
+++ b/apps/declarative-to-reactive/src/main.ts
@@ -0,0 +1,4 @@
+import { bootstrapApplication } from '@angular/platform-browser';
+import { AppComponent } from './app/app.component';
+
+bootstrapApplication(AppComponent).catch((err) => console.error(err));
diff --git a/apps/declarative-to-reactive/src/styles.scss b/apps/declarative-to-reactive/src/styles.scss
new file mode 100644
index 0000000..90d4ee0
--- /dev/null
+++ b/apps/declarative-to-reactive/src/styles.scss
@@ -0,0 +1 @@
+/* You can add global styles to this file, and also import other style files */
diff --git a/apps/declarative-to-reactive/src/test-setup.ts b/apps/declarative-to-reactive/src/test-setup.ts
new file mode 100644
index 0000000..1100b3e
--- /dev/null
+++ b/apps/declarative-to-reactive/src/test-setup.ts
@@ -0,0 +1 @@
+import 'jest-preset-angular/setup-jest';
diff --git a/apps/declarative-to-reactive/tsconfig.app.json b/apps/declarative-to-reactive/tsconfig.app.json
new file mode 100644
index 0000000..fff4a41
--- /dev/null
+++ b/apps/declarative-to-reactive/tsconfig.app.json
@@ -0,0 +1,10 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../../dist/out-tsc",
+ "types": []
+ },
+ "files": ["src/main.ts"],
+ "include": ["src/**/*.d.ts"],
+ "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"]
+}
diff --git a/apps/declarative-to-reactive/tsconfig.editor.json b/apps/declarative-to-reactive/tsconfig.editor.json
new file mode 100644
index 0000000..8ae117d
--- /dev/null
+++ b/apps/declarative-to-reactive/tsconfig.editor.json
@@ -0,0 +1,7 @@
+{
+ "extends": "./tsconfig.json",
+ "include": ["src/**/*.ts"],
+ "compilerOptions": {
+ "types": ["jest", "node"]
+ }
+}
diff --git a/apps/declarative-to-reactive/tsconfig.json b/apps/declarative-to-reactive/tsconfig.json
new file mode 100644
index 0000000..e01cf19
--- /dev/null
+++ b/apps/declarative-to-reactive/tsconfig.json
@@ -0,0 +1,32 @@
+{
+ "compilerOptions": {
+ "target": "es2022",
+ "useDefineForClassFields": false,
+ "forceConsistentCasingInFileNames": true,
+ "strict": true,
+ "noImplicitOverride": true,
+ "noPropertyAccessFromIndexSignature": true,
+ "noImplicitReturns": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "files": [],
+ "include": [],
+ "references": [
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.spec.json"
+ },
+ {
+ "path": "./tsconfig.editor.json"
+ }
+ ],
+ "extends": "../../tsconfig.base.json",
+ "angularCompilerOptions": {
+ "enableI18nLegacyMessageIdFormat": false,
+ "strictInjectionParameters": true,
+ "strictInputAccessModifiers": true,
+ "strictTemplates": true
+ }
+}
diff --git a/apps/declarative-to-reactive/tsconfig.spec.json b/apps/declarative-to-reactive/tsconfig.spec.json
new file mode 100644
index 0000000..f6a7d97
--- /dev/null
+++ b/apps/declarative-to-reactive/tsconfig.spec.json
@@ -0,0 +1,15 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../../dist/out-tsc",
+ "module": "commonjs",
+ "types": ["jest", "node"]
+ },
+ "files": ["src/test-setup.ts"],
+ "include": [
+ "jest.config.ts",
+ "src/**/*.test.ts",
+ "src/**/*.spec.ts",
+ "src/**/*.d.ts"
+ ]
+}
diff --git a/apps/rxjs-race-condition/.eslintrc.json b/apps/rxjs-race-condition/.eslintrc.json
new file mode 100644
index 0000000..c34c7dd
--- /dev/null
+++ b/apps/rxjs-race-condition/.eslintrc.json
@@ -0,0 +1,36 @@
+{
+ "extends": ["../../.eslintrc.json"],
+ "ignorePatterns": ["!**/*"],
+ "overrides": [
+ {
+ "files": ["*.ts"],
+ "rules": {
+ "@angular-eslint/directive-selector": [
+ "error",
+ {
+ "type": "attribute",
+ "prefix": "app",
+ "style": "camelCase"
+ }
+ ],
+ "@angular-eslint/component-selector": [
+ "error",
+ {
+ "type": "element",
+ "prefix": "app",
+ "style": "kebab-case"
+ }
+ ]
+ },
+ "extends": [
+ "plugin:@nrwl/nx/angular",
+ "plugin:@angular-eslint/template/process-inline-templates"
+ ]
+ },
+ {
+ "files": ["*.html"],
+ "extends": ["plugin:@nrwl/nx/angular-template"],
+ "rules": {}
+ }
+ ]
+}
diff --git a/apps/rxjs-race-condition/README.md b/apps/rxjs-race-condition/README.md
new file mode 100644
index 0000000..2436d74
--- /dev/null
+++ b/apps/rxjs-race-condition/README.md
@@ -0,0 +1,35 @@
+RxJs race condition
+
+> Author: Thomas Laforge
+
+
+
+### Information
+
+### Statement
+
+### Step 1
+
+### Step 2
+
+### Constraints:
+
+### Submitting your work
+
+1. Fork the project
+2. clone it
+3. npm install
+4. **nx serve rxjs-race-condition**
+5. _...work on it_
+6. Commit your work
+7. Submit a PR with a title beginning with **Answer:12** that I will review and other dev can review.
+
+
+
+
+
+
+
+
+_You can ask any question on_
diff --git a/apps/rxjs-race-condition/jest.config.ts b/apps/rxjs-race-condition/jest.config.ts
new file mode 100644
index 0000000..f7ed099
--- /dev/null
+++ b/apps/rxjs-race-condition/jest.config.ts
@@ -0,0 +1,22 @@
+/* eslint-disable */
+export default {
+ displayName: 'rxjs-race-condition',
+ preset: '../../jest.preset.js',
+ setupFilesAfterEnv: ['/src/test-setup.ts'],
+ globals: {
+ 'ts-jest': {
+ tsconfig: '/tsconfig.spec.json',
+ stringifyContentPathRegex: '\\.(html|svg)$',
+ },
+ },
+ coverageDirectory: '../../coverage/apps/rxjs-race-condition',
+ transform: {
+ '^.+\\.(ts|mjs|js|html)$': 'jest-preset-angular',
+ },
+ transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'],
+ snapshotSerializers: [
+ 'jest-preset-angular/build/serializers/no-ng-attributes',
+ 'jest-preset-angular/build/serializers/ng-snapshot',
+ 'jest-preset-angular/build/serializers/html-comment',
+ ],
+};
diff --git a/apps/rxjs-race-condition/project.json b/apps/rxjs-race-condition/project.json
new file mode 100644
index 0000000..37ae73d
--- /dev/null
+++ b/apps/rxjs-race-condition/project.json
@@ -0,0 +1,90 @@
+{
+ "name": "rxjs-race-condition",
+ "$schema": "../../node_modules/nx/schemas/project-schema.json",
+ "projectType": "application",
+ "sourceRoot": "apps/rxjs-race-condition/src",
+ "prefix": "app",
+ "targets": {
+ "build": {
+ "executor": "@angular-devkit/build-angular:browser",
+ "outputs": ["{options.outputPath}"],
+ "options": {
+ "outputPath": "dist/apps/rxjs-race-condition",
+ "index": "apps/rxjs-race-condition/src/index.html",
+ "main": "apps/rxjs-race-condition/src/main.ts",
+ "polyfills": ["zone.js"],
+ "tsConfig": "apps/rxjs-race-condition/tsconfig.app.json",
+ "inlineStyleLanguage": "scss",
+ "assets": [
+ "apps/rxjs-race-condition/src/favicon.ico",
+ "apps/rxjs-race-condition/src/assets"
+ ],
+ "styles": ["apps/rxjs-race-condition/src/styles.scss"],
+ "scripts": []
+ },
+ "configurations": {
+ "production": {
+ "budgets": [
+ {
+ "type": "initial",
+ "maximumWarning": "500kb",
+ "maximumError": "1mb"
+ },
+ {
+ "type": "anyComponentStyle",
+ "maximumWarning": "2kb",
+ "maximumError": "4kb"
+ }
+ ],
+ "outputHashing": "all"
+ },
+ "development": {
+ "buildOptimizer": false,
+ "optimization": false,
+ "vendorChunk": true,
+ "extractLicenses": false,
+ "sourceMap": true,
+ "namedChunks": true
+ }
+ },
+ "defaultConfiguration": "production"
+ },
+ "serve": {
+ "executor": "@angular-devkit/build-angular:dev-server",
+ "configurations": {
+ "production": {
+ "browserTarget": "rxjs-race-condition:build:production"
+ },
+ "development": {
+ "browserTarget": "rxjs-race-condition:build:development"
+ }
+ },
+ "defaultConfiguration": "development"
+ },
+ "extract-i18n": {
+ "executor": "@angular-devkit/build-angular:extract-i18n",
+ "options": {
+ "browserTarget": "rxjs-race-condition:build"
+ }
+ },
+ "lint": {
+ "executor": "@nrwl/linter:eslint",
+ "outputs": ["{options.outputFile}"],
+ "options": {
+ "lintFilePatterns": [
+ "apps/rxjs-race-condition/**/*.ts",
+ "apps/rxjs-race-condition/**/*.html"
+ ]
+ }
+ },
+ "test": {
+ "executor": "@nrwl/jest:jest",
+ "outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
+ "options": {
+ "jestConfig": "apps/rxjs-race-condition/jest.config.ts",
+ "passWithNoTests": true
+ }
+ }
+ },
+ "tags": []
+}
diff --git a/apps/rxjs-race-condition/src/app/app.component.ts b/apps/rxjs-race-condition/src/app/app.component.ts
new file mode 100644
index 0000000..4214104
--- /dev/null
+++ b/apps/rxjs-race-condition/src/app/app.component.ts
@@ -0,0 +1,13 @@
+import { NxWelcomeComponent } from './nx-welcome.component';
+import { Component } from '@angular/core';
+
+@Component({
+ standalone: true,
+ imports: [NxWelcomeComponent],
+ selector: 'app-root',
+ template: ` `,
+ styles: [],
+})
+export class AppComponent {
+ title = 'rxjs-race-condition';
+}
diff --git a/apps/rxjs-race-condition/src/app/nx-welcome.component.ts b/apps/rxjs-race-condition/src/app/nx-welcome.component.ts
new file mode 100644
index 0000000..1e6ab14
--- /dev/null
+++ b/apps/rxjs-race-condition/src/app/nx-welcome.component.ts
@@ -0,0 +1,801 @@
+import { Component, ViewEncapsulation } from '@angular/core';
+import { CommonModule } from '@angular/common';
+
+/* eslint-disable */
+
+@Component({
+ selector: 'app-nx-welcome',
+ standalone: true,
+ imports: [CommonModule],
+ template: `
+
+
+
+
+
+
+
+ Hello there,
+ Welcome rxjs-race-condition 👋
+
+
+
+
+
+
+
+
+
+
+
+
Next steps
+
Here are some things you can do with Nx:
+
+
+
+
+
+ Add UI library
+
+ # Generate UI lib
+nx g @nrwl/angular:lib ui
+
+# Add a component
+nx g @nrwl/angular:component button --project ui
+
+
+
+
+
+
+ View interactive project graph
+
+ nx graph
+
+
+
+
+
+
+ Run affected commands
+
+ # see what's been affected by changes
+nx affected:graph
+
+# run tests for current changes
+nx affected:test
+
+# run e2e tests for current changes
+nx affected:e2e
+
+
+
+
+ Carefully crafted with
+
+
+
+
+
+
+ `,
+ styles: [],
+ encapsulation: ViewEncapsulation.None,
+})
+export class NxWelcomeComponent {}
diff --git a/apps/rxjs-race-condition/src/assets/.gitkeep b/apps/rxjs-race-condition/src/assets/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/apps/rxjs-race-condition/src/favicon.ico b/apps/rxjs-race-condition/src/favicon.ico
new file mode 100644
index 0000000..317ebcb
Binary files /dev/null and b/apps/rxjs-race-condition/src/favicon.ico differ
diff --git a/apps/rxjs-race-condition/src/index.html b/apps/rxjs-race-condition/src/index.html
new file mode 100644
index 0000000..4160653
--- /dev/null
+++ b/apps/rxjs-race-condition/src/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+ RxjsRaceCondition
+
+
+
+
+
+
+
+
diff --git a/apps/rxjs-race-condition/src/main.ts b/apps/rxjs-race-condition/src/main.ts
new file mode 100644
index 0000000..31c5da4
--- /dev/null
+++ b/apps/rxjs-race-condition/src/main.ts
@@ -0,0 +1,4 @@
+import { bootstrapApplication } from '@angular/platform-browser';
+import { AppComponent } from './app/app.component';
+
+bootstrapApplication(AppComponent).catch((err) => console.error(err));
diff --git a/apps/rxjs-race-condition/src/styles.scss b/apps/rxjs-race-condition/src/styles.scss
new file mode 100644
index 0000000..90d4ee0
--- /dev/null
+++ b/apps/rxjs-race-condition/src/styles.scss
@@ -0,0 +1 @@
+/* You can add global styles to this file, and also import other style files */
diff --git a/apps/rxjs-race-condition/src/test-setup.ts b/apps/rxjs-race-condition/src/test-setup.ts
new file mode 100644
index 0000000..1100b3e
--- /dev/null
+++ b/apps/rxjs-race-condition/src/test-setup.ts
@@ -0,0 +1 @@
+import 'jest-preset-angular/setup-jest';
diff --git a/apps/rxjs-race-condition/tsconfig.app.json b/apps/rxjs-race-condition/tsconfig.app.json
new file mode 100644
index 0000000..fff4a41
--- /dev/null
+++ b/apps/rxjs-race-condition/tsconfig.app.json
@@ -0,0 +1,10 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../../dist/out-tsc",
+ "types": []
+ },
+ "files": ["src/main.ts"],
+ "include": ["src/**/*.d.ts"],
+ "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"]
+}
diff --git a/apps/rxjs-race-condition/tsconfig.editor.json b/apps/rxjs-race-condition/tsconfig.editor.json
new file mode 100644
index 0000000..8ae117d
--- /dev/null
+++ b/apps/rxjs-race-condition/tsconfig.editor.json
@@ -0,0 +1,7 @@
+{
+ "extends": "./tsconfig.json",
+ "include": ["src/**/*.ts"],
+ "compilerOptions": {
+ "types": ["jest", "node"]
+ }
+}
diff --git a/apps/rxjs-race-condition/tsconfig.json b/apps/rxjs-race-condition/tsconfig.json
new file mode 100644
index 0000000..e01cf19
--- /dev/null
+++ b/apps/rxjs-race-condition/tsconfig.json
@@ -0,0 +1,32 @@
+{
+ "compilerOptions": {
+ "target": "es2022",
+ "useDefineForClassFields": false,
+ "forceConsistentCasingInFileNames": true,
+ "strict": true,
+ "noImplicitOverride": true,
+ "noPropertyAccessFromIndexSignature": true,
+ "noImplicitReturns": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "files": [],
+ "include": [],
+ "references": [
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.spec.json"
+ },
+ {
+ "path": "./tsconfig.editor.json"
+ }
+ ],
+ "extends": "../../tsconfig.base.json",
+ "angularCompilerOptions": {
+ "enableI18nLegacyMessageIdFormat": false,
+ "strictInjectionParameters": true,
+ "strictInputAccessModifiers": true,
+ "strictTemplates": true
+ }
+}
diff --git a/apps/rxjs-race-condition/tsconfig.spec.json b/apps/rxjs-race-condition/tsconfig.spec.json
new file mode 100644
index 0000000..f6a7d97
--- /dev/null
+++ b/apps/rxjs-race-condition/tsconfig.spec.json
@@ -0,0 +1,15 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../../dist/out-tsc",
+ "module": "commonjs",
+ "types": ["jest", "node"]
+ },
+ "files": ["src/test-setup.ts"],
+ "include": [
+ "jest.config.ts",
+ "src/**/*.test.ts",
+ "src/**/*.spec.ts",
+ "src/**/*.d.ts"
+ ]
+}
diff --git a/apps/scroll-cd/.eslintrc.json b/apps/scroll-cd/.eslintrc.json
new file mode 100644
index 0000000..c34c7dd
--- /dev/null
+++ b/apps/scroll-cd/.eslintrc.json
@@ -0,0 +1,36 @@
+{
+ "extends": ["../../.eslintrc.json"],
+ "ignorePatterns": ["!**/*"],
+ "overrides": [
+ {
+ "files": ["*.ts"],
+ "rules": {
+ "@angular-eslint/directive-selector": [
+ "error",
+ {
+ "type": "attribute",
+ "prefix": "app",
+ "style": "camelCase"
+ }
+ ],
+ "@angular-eslint/component-selector": [
+ "error",
+ {
+ "type": "element",
+ "prefix": "app",
+ "style": "kebab-case"
+ }
+ ]
+ },
+ "extends": [
+ "plugin:@nrwl/nx/angular",
+ "plugin:@angular-eslint/template/process-inline-templates"
+ ]
+ },
+ {
+ "files": ["*.html"],
+ "extends": ["plugin:@nrwl/nx/angular-template"],
+ "rules": {}
+ }
+ ]
+}
diff --git a/apps/scroll-cd/README.md b/apps/scroll-cd/README.md
new file mode 100644
index 0000000..f5e5622
--- /dev/null
+++ b/apps/scroll-cd/README.md
@@ -0,0 +1,33 @@
+Mastering Change Detection cycle with a scroll example
+
+> Author: Thomas Laforge
+
+
+
+### Information
+
+### Statement
+
+### Step 1
+
+### Step 2
+
+### Constraints:
+
+### Submitting your work
+
+1. Fork the project
+2. clone it
+3. npm install
+4. **nx serve scroll-cd**
+5. _...work on it_
+6. Commit your work
+7. Submit a PR with a title beginning with **Answer:14** that I will review and other dev can review.
+
+
+
+
+
+
+_You can ask any question on_
diff --git a/apps/scroll-cd/jest.config.ts b/apps/scroll-cd/jest.config.ts
new file mode 100644
index 0000000..771b739
--- /dev/null
+++ b/apps/scroll-cd/jest.config.ts
@@ -0,0 +1,22 @@
+/* eslint-disable */
+export default {
+ displayName: 'scroll-cd',
+ preset: '../../jest.preset.js',
+ setupFilesAfterEnv: ['/src/test-setup.ts'],
+ globals: {
+ 'ts-jest': {
+ tsconfig: '/tsconfig.spec.json',
+ stringifyContentPathRegex: '\\.(html|svg)$',
+ },
+ },
+ coverageDirectory: '../../coverage/apps/scroll-cd',
+ transform: {
+ '^.+\\.(ts|mjs|js|html)$': 'jest-preset-angular',
+ },
+ transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'],
+ snapshotSerializers: [
+ 'jest-preset-angular/build/serializers/no-ng-attributes',
+ 'jest-preset-angular/build/serializers/ng-snapshot',
+ 'jest-preset-angular/build/serializers/html-comment',
+ ],
+};
diff --git a/apps/scroll-cd/project.json b/apps/scroll-cd/project.json
new file mode 100644
index 0000000..b72e751
--- /dev/null
+++ b/apps/scroll-cd/project.json
@@ -0,0 +1,90 @@
+{
+ "name": "scroll-cd",
+ "$schema": "../../node_modules/nx/schemas/project-schema.json",
+ "projectType": "application",
+ "sourceRoot": "apps/scroll-cd/src",
+ "prefix": "app",
+ "targets": {
+ "build": {
+ "executor": "@angular-devkit/build-angular:browser",
+ "outputs": ["{options.outputPath}"],
+ "options": {
+ "outputPath": "dist/apps/scroll-cd",
+ "index": "apps/scroll-cd/src/index.html",
+ "main": "apps/scroll-cd/src/main.ts",
+ "polyfills": ["zone.js"],
+ "tsConfig": "apps/scroll-cd/tsconfig.app.json",
+ "inlineStyleLanguage": "scss",
+ "assets": [
+ "apps/scroll-cd/src/favicon.ico",
+ "apps/scroll-cd/src/assets"
+ ],
+ "styles": ["apps/scroll-cd/src/styles.scss"],
+ "scripts": []
+ },
+ "configurations": {
+ "production": {
+ "budgets": [
+ {
+ "type": "initial",
+ "maximumWarning": "500kb",
+ "maximumError": "1mb"
+ },
+ {
+ "type": "anyComponentStyle",
+ "maximumWarning": "2kb",
+ "maximumError": "4kb"
+ }
+ ],
+ "outputHashing": "all"
+ },
+ "development": {
+ "buildOptimizer": false,
+ "optimization": false,
+ "vendorChunk": true,
+ "extractLicenses": false,
+ "sourceMap": true,
+ "namedChunks": true
+ }
+ },
+ "defaultConfiguration": "production"
+ },
+ "serve": {
+ "executor": "@angular-devkit/build-angular:dev-server",
+ "configurations": {
+ "production": {
+ "browserTarget": "scroll-cd:build:production"
+ },
+ "development": {
+ "browserTarget": "scroll-cd:build:development"
+ }
+ },
+ "defaultConfiguration": "development"
+ },
+ "extract-i18n": {
+ "executor": "@angular-devkit/build-angular:extract-i18n",
+ "options": {
+ "browserTarget": "scroll-cd:build"
+ }
+ },
+ "lint": {
+ "executor": "@nrwl/linter:eslint",
+ "outputs": ["{options.outputFile}"],
+ "options": {
+ "lintFilePatterns": [
+ "apps/scroll-cd/**/*.ts",
+ "apps/scroll-cd/**/*.html"
+ ]
+ }
+ },
+ "test": {
+ "executor": "@nrwl/jest:jest",
+ "outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
+ "options": {
+ "jestConfig": "apps/scroll-cd/jest.config.ts",
+ "passWithNoTests": true
+ }
+ }
+ },
+ "tags": []
+}
diff --git a/apps/scroll-cd/src/app/app.component.ts b/apps/scroll-cd/src/app/app.component.ts
new file mode 100644
index 0000000..3beed29
--- /dev/null
+++ b/apps/scroll-cd/src/app/app.component.ts
@@ -0,0 +1,13 @@
+import { NxWelcomeComponent } from './nx-welcome.component';
+import { Component } from '@angular/core';
+
+@Component({
+ standalone: true,
+ imports: [NxWelcomeComponent],
+ selector: 'app-root',
+ template: ` `,
+ styles: [],
+})
+export class AppComponent {
+ title = 'scroll-cd';
+}
diff --git a/apps/scroll-cd/src/app/nx-welcome.component.ts b/apps/scroll-cd/src/app/nx-welcome.component.ts
new file mode 100644
index 0000000..546d81f
--- /dev/null
+++ b/apps/scroll-cd/src/app/nx-welcome.component.ts
@@ -0,0 +1,801 @@
+import { Component, ViewEncapsulation } from '@angular/core';
+import { CommonModule } from '@angular/common';
+
+/* eslint-disable */
+
+@Component({
+ selector: 'app-nx-welcome',
+ standalone: true,
+ imports: [CommonModule],
+ template: `
+
+
+
+
+
+
+
+ Hello there,
+ Welcome scroll-cd 👋
+
+
+
+
+
+
+
+
+
+
+
+
Next steps
+
Here are some things you can do with Nx:
+
+
+
+
+
+ Add UI library
+
+ # Generate UI lib
+nx g @nrwl/angular:lib ui
+
+# Add a component
+nx g @nrwl/angular:component button --project ui
+
+
+
+
+
+
+ View interactive project graph
+
+ nx graph
+
+
+
+
+
+
+ Run affected commands
+
+ # see what's been affected by changes
+nx affected:graph
+
+# run tests for current changes
+nx affected:test
+
+# run e2e tests for current changes
+nx affected:e2e
+
+
+
+
+ Carefully crafted with
+
+
+
+
+
+
+ `,
+ styles: [],
+ encapsulation: ViewEncapsulation.None,
+})
+export class NxWelcomeComponent {}
diff --git a/apps/scroll-cd/src/assets/.gitkeep b/apps/scroll-cd/src/assets/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/apps/scroll-cd/src/favicon.ico b/apps/scroll-cd/src/favicon.ico
new file mode 100644
index 0000000..317ebcb
Binary files /dev/null and b/apps/scroll-cd/src/favicon.ico differ
diff --git a/apps/scroll-cd/src/index.html b/apps/scroll-cd/src/index.html
new file mode 100644
index 0000000..5a26734
--- /dev/null
+++ b/apps/scroll-cd/src/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+ ScrollCd
+
+
+
+
+
+
+
+
diff --git a/apps/scroll-cd/src/main.ts b/apps/scroll-cd/src/main.ts
new file mode 100644
index 0000000..31c5da4
--- /dev/null
+++ b/apps/scroll-cd/src/main.ts
@@ -0,0 +1,4 @@
+import { bootstrapApplication } from '@angular/platform-browser';
+import { AppComponent } from './app/app.component';
+
+bootstrapApplication(AppComponent).catch((err) => console.error(err));
diff --git a/apps/scroll-cd/src/styles.scss b/apps/scroll-cd/src/styles.scss
new file mode 100644
index 0000000..90d4ee0
--- /dev/null
+++ b/apps/scroll-cd/src/styles.scss
@@ -0,0 +1 @@
+/* You can add global styles to this file, and also import other style files */
diff --git a/apps/scroll-cd/src/test-setup.ts b/apps/scroll-cd/src/test-setup.ts
new file mode 100644
index 0000000..1100b3e
--- /dev/null
+++ b/apps/scroll-cd/src/test-setup.ts
@@ -0,0 +1 @@
+import 'jest-preset-angular/setup-jest';
diff --git a/apps/scroll-cd/tsconfig.app.json b/apps/scroll-cd/tsconfig.app.json
new file mode 100644
index 0000000..fff4a41
--- /dev/null
+++ b/apps/scroll-cd/tsconfig.app.json
@@ -0,0 +1,10 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../../dist/out-tsc",
+ "types": []
+ },
+ "files": ["src/main.ts"],
+ "include": ["src/**/*.d.ts"],
+ "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"]
+}
diff --git a/apps/scroll-cd/tsconfig.editor.json b/apps/scroll-cd/tsconfig.editor.json
new file mode 100644
index 0000000..8ae117d
--- /dev/null
+++ b/apps/scroll-cd/tsconfig.editor.json
@@ -0,0 +1,7 @@
+{
+ "extends": "./tsconfig.json",
+ "include": ["src/**/*.ts"],
+ "compilerOptions": {
+ "types": ["jest", "node"]
+ }
+}
diff --git a/apps/scroll-cd/tsconfig.json b/apps/scroll-cd/tsconfig.json
new file mode 100644
index 0000000..e01cf19
--- /dev/null
+++ b/apps/scroll-cd/tsconfig.json
@@ -0,0 +1,32 @@
+{
+ "compilerOptions": {
+ "target": "es2022",
+ "useDefineForClassFields": false,
+ "forceConsistentCasingInFileNames": true,
+ "strict": true,
+ "noImplicitOverride": true,
+ "noPropertyAccessFromIndexSignature": true,
+ "noImplicitReturns": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "files": [],
+ "include": [],
+ "references": [
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.spec.json"
+ },
+ {
+ "path": "./tsconfig.editor.json"
+ }
+ ],
+ "extends": "../../tsconfig.base.json",
+ "angularCompilerOptions": {
+ "enableI18nLegacyMessageIdFormat": false,
+ "strictInjectionParameters": true,
+ "strictInputAccessModifiers": true,
+ "strictTemplates": true
+ }
+}
diff --git a/apps/scroll-cd/tsconfig.spec.json b/apps/scroll-cd/tsconfig.spec.json
new file mode 100644
index 0000000..f6a7d97
--- /dev/null
+++ b/apps/scroll-cd/tsconfig.spec.json
@@ -0,0 +1,15 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../../dist/out-tsc",
+ "module": "commonjs",
+ "types": ["jest", "node"]
+ },
+ "files": ["src/test-setup.ts"],
+ "include": [
+ "jest.config.ts",
+ "src/**/*.test.ts",
+ "src/**/*.spec.ts",
+ "src/**/*.d.ts"
+ ]
+}