|
1 | 1 | {
|
2 |
| - "courses": [ |
3 |
| - { |
4 |
| - "id": "1", |
5 |
| - "description": "Angular for Beginners", |
6 |
| - "iconUrl": "https://angular-academy.s3.amazonaws.com/thumbnails/angular2-for-beginners-small-v2.png", |
| 2 | + "courses": { |
| 3 | + "01": { |
| 4 | + "id": "01", |
| 5 | + "description": "Angular Universal Course", |
| 6 | + "iconUrl": "https://s3-us-west-1.amazonaws.com/angular-university/course-images/angular-universal-small.png", |
7 | 7 | "courseListIcon": "https://angular-academy.s3.amazonaws.com/main-logo/main-page-logo-small-hat.png",
|
8 |
| - "longDescription": "Establish a solid layer of fundamentals, learn what's under the hood of Angular", |
| 8 | + "longDescription": "Use Angular on the server too! Learn Angular Server-Side Rendering.", |
9 | 9 | "category": "BEGINNER",
|
10 | 10 | "lessonsCount": 10
|
11 | 11 | },
|
12 |
| - { |
13 |
| - "id": "2", |
| 12 | + "02": { |
| 13 | + "id": "02", |
14 | 14 | "description": "Angular Security Course - Web Security Fundamentals",
|
15 | 15 | "longDescription": "Learn Web Security Fundamentals and apply them to defend an Angular / Node Application from multiple types of attacks.",
|
16 | 16 | "iconUrl": "https://s3-us-west-1.amazonaws.com/angular-university/course-images/security-cover-small-v2.png",
|
17 | 17 | "courseListIcon": "https://s3-us-west-1.amazonaws.com/angular-university/course-images/lock-v2.png",
|
18 | 18 | "category": "ADVANCED",
|
19 | 19 | "lessonsCount": 11
|
20 | 20 | },
|
21 |
| - { |
22 |
| - "id": "3", |
| 21 | + "03": { |
| 22 | + "id": "03", |
23 | 23 | "description": "Angular PWA - Progressive Web Apps Course",
|
24 |
| - "longDescription": "<p class='course-description'>Learn Angular Progressive Web Applications, build the future of the Web Today.", |
| 24 | + "longDescription": "Learn Angular Progressive Web Applications, build the future of the Web Today.", |
25 | 25 | "iconUrl": "https://s3-us-west-1.amazonaws.com/angular-university/course-images/angular-pwa-course.png",
|
26 | 26 | "courseListIcon": "https://s3-us-west-1.amazonaws.com/angular-university/course-images/alien.png",
|
27 | 27 | "category": "ADVANCED",
|
28 | 28 | "lessonsCount": 8
|
29 |
| - }, |
30 |
| - { |
31 |
| - "id": "4", |
32 |
| - "description": "Angular NgRx Store Reactive Extensions Architecture Course", |
33 |
| - "longDescription": "Learn how to the Angular NgRx Reactive Extensions and its Tooling to build a complete application.", |
34 |
| - "iconUrl": "https://angular-academy.s3.amazonaws.com/thumbnails/ngrx-angular.png", |
35 |
| - "courseListIcon": "https://angular-academy.s3.amazonaws.com/thumbnails/ngrx-small.png", |
36 |
| - "category": "ADVANCED" |
37 |
| - }, |
38 |
| - { |
39 |
| - "id": "5", |
40 |
| - "description": "Angular Advanced Library Laboratory: Build Your Own Library", |
41 |
| - "longDescription": "Learn Advanced Angular functionality typically used in Library Development. Advanced Components, Directives, Testing, Npm", |
42 |
| - "iconUrl": "https://angular-academy.s3.amazonaws.com/thumbnails/advanced_angular-small-v3.png", |
43 |
| - "courseListIcon": "https://angular-academy.s3.amazonaws.com/thumbnails/angular-advanced-lesson-icon.png", |
44 |
| - "category": "ADVANCED" |
45 |
| - }, |
46 |
| - { |
47 |
| - "id": "6", |
48 |
| - "description": "The Complete Typescript Course", |
49 |
| - "longDescription": "Complete Guide to Typescript From Scratch: Learn the language in-depth and use it to build a Node REST API.", |
50 |
| - "iconUrl": "https://angular-academy.s3.amazonaws.com/thumbnails/typescript-2-small.png", |
51 |
| - "courseListIcon": "https://angular-academy.s3.amazonaws.com/thumbnails/typescript-2-lesson.png", |
52 |
| - "category": "BEGINNER" |
53 |
| - }, |
54 |
| - { |
55 |
| - "id": "7", |
56 |
| - "description": "Rxjs and Reactive Patterns Angular Architecture Course", |
57 |
| - "longDescription": "Learn the core RxJs Observable Pattern as well and many other Design Patterns for building Reactive Angular Applications.", |
58 |
| - "iconUrl": "https://s3-us-west-1.amazonaws.com/angular-academy/blog/images/rxjs-reactive-patterns-small.png", |
59 |
| - "courseListIcon": "https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png", |
60 |
| - "category": "BEGINNER" |
61 |
| - }, |
62 |
| - { |
63 |
| - "id": "8", |
64 |
| - "description": "Angular Material Course", |
65 |
| - "iconUrl": "https://s3-us-west-1.amazonaws.com/angular-university/course-images/material_design.png", |
66 |
| - "longDescription": "Build Applications with the official Angular Widget Library", |
67 |
| - "category": "ADVANCED" |
68 | 29 | }
|
69 |
| - ], |
| 30 | + }, |
70 | 31 | "lessons": {
|
71 |
| - "1": [ |
| 32 | + "01": [ |
72 | 33 | {
|
73 | 34 | "id": "01",
|
74 | 35 | "description": "Angular Tutorial For Beginners - Build Your First App - Hello World Step By Step",
|
|
80 | 41 | "id": "02",
|
81 | 42 | "description": "Building Your First Component - Component Composition",
|
82 | 43 | "duration": "2:07",
|
83 |
| - "seqNo": 2, |
84 |
| - "courseId": "1" |
| 44 | + "seqNo": 2 |
85 | 45 | },
|
86 | 46 | {
|
87 | 47 | "id": "03",
|
88 | 48 | "description": "Component @Input - How To Pass Input Data To an Component",
|
89 | 49 | "duration": "2:33",
|
90 |
| - "seqNo": 3, |
91 |
| - "courseId": "1" |
| 50 | + "seqNo": 3 |
92 | 51 | },
|
93 | 52 | {
|
94 | 53 | "id": "04",
|
95 | 54 | "description": " Component Events - Using @Output to create custom events",
|
96 | 55 | "duration": "4:44",
|
97 |
| - "seqNo": 4, |
98 |
| - "courseId": "1" |
| 56 | + "seqNo": 4 |
99 | 57 | },
|
100 | 58 | {
|
101 | 59 | "id": "05",
|
102 | 60 | "description": " Component Templates - Inline Vs External",
|
103 | 61 | "duration": "2:55",
|
104 |
| - "seqNo": 5, |
105 |
| - "courseId": "1" |
| 62 | + "seqNo": 5 |
106 | 63 | },
|
107 | 64 | {
|
108 | 65 | "id": "06",
|
109 | 66 | "description": "Styling Components - Learn About Component Style Isolation",
|
110 | 67 | "duration": "3:27",
|
111 |
| - "seqNo": 6, |
112 |
| - "courseId": "1" |
| 68 | + "seqNo": 6 |
113 | 69 | },
|
114 | 70 | {
|
115 | 71 | "id": "07",
|
116 | 72 | "description": " Component Interaction - Extended Components Example",
|
117 | 73 | "duration": "9:22",
|
118 |
| - "seqNo": 7, |
119 |
| - "courseId": "1" |
| 74 | + "seqNo": 7 |
120 | 75 | },
|
121 | 76 | {
|
122 | 77 | "id": "08",
|
123 | 78 | "description": " Components Tutorial For Beginners - Components Exercise !",
|
124 | 79 | "duration": "1:26",
|
125 |
| - "seqNo": 8, |
126 |
| - "courseId": "1" |
| 80 | + "seqNo": 8 |
127 | 81 | },
|
128 | 82 | {
|
129 | 83 | "id": "09",
|
130 | 84 | "description": " Components Tutorial For Beginners - Components Exercise Solution Inside",
|
131 | 85 | "duration": "2:08",
|
132 |
| - "seqNo": 9, |
133 |
| - "courseId": "1" |
| 86 | + "seqNo": 9 |
134 | 87 | },
|
135 | 88 | {
|
136 | 89 | "id": "10",
|
137 | 90 | "description": " Directives - Inputs, Output Event Emitters and How To Export Template References",
|
138 | 91 | "duration": "4:01",
|
139 |
| - "seqNo": 10, |
140 |
| - "courseId": "1" |
| 92 | + "seqNo": 10 |
141 | 93 | }
|
142 | 94 | ],
|
143 |
| - "2": [ |
| 95 | + "02": [ |
144 | 96 | {
|
145 | 97 | "id": "11",
|
146 | 98 | "description": "Course Helicopter View",
|
147 | 99 | "duration": "08:19",
|
148 |
| - "seqNo": 1, |
149 |
| - "courseId": "2" |
| 100 | + "seqNo": 1 |
150 | 101 | },
|
151 | 102 | {
|
152 | 103 | "id": "12",
|
153 | 104 | "description": "Installing Git, Node, NPM and Choosing an IDE",
|
154 | 105 | "duration": "04:17",
|
155 |
| - "seqNo": 2, |
156 |
| - "courseId": "2" |
| 106 | + "seqNo": 2 |
157 | 107 | },
|
158 | 108 | {
|
159 | 109 | "id": "13",
|
160 | 110 | "description": "Installing The Lessons Code - Learn Why Its Essential To Use NPM 5",
|
161 | 111 | "duration": "06:05",
|
162 |
| - "seqNo": 3, |
163 |
| - "courseId": "2" |
| 112 | + "seqNo": 3 |
164 | 113 | },
|
165 | 114 | {
|
166 | 115 | "id": "14",
|
167 | 116 | "description": "How To Run Node In TypeScript With Hot Reloading",
|
168 | 117 | "duration": "03:57",
|
169 |
| - "seqNo": 4, |
170 |
| - "courseId": "2" |
| 118 | + "seqNo": 4 |
171 | 119 | },
|
172 | 120 | {
|
173 | 121 | "id": "15",
|
174 | 122 | "description": "Guided Tour Of The Sample Application",
|
175 | 123 | "duration": "06:00",
|
176 |
| - "seqNo": 5, |
177 |
| - "courseId": "2" |
| 124 | + "seqNo": 5 |
178 | 125 | },
|
179 | 126 | {
|
180 | 127 | "id": "16",
|
181 | 128 | "description": "Client Side Authentication Service - API Design",
|
182 | 129 | "duration": "04:53",
|
183 |
| - "seqNo": 6, |
184 |
| - "courseId": "2" |
| 130 | + "seqNo": 6 |
185 | 131 | },
|
186 | 132 | {
|
187 | 133 | "id": "17",
|
188 | 134 | "description": "Client Authentication Service - Design and Implementation",
|
189 | 135 | "duration": "09:14",
|
190 |
| - "seqNo": 7, |
191 |
| - "courseId": "2" |
| 136 | + "seqNo": 7 |
192 | 137 | },
|
193 | 138 | {
|
194 | 139 | "id": "18",
|
195 | 140 | "description": "The New Angular HTTP Client - Doing a POST Call To The Server",
|
196 | 141 | "duration": "06:08",
|
197 |
| - "seqNo": 8, |
198 |
| - "courseId": "2" |
| 142 | + "seqNo": 8 |
199 | 143 | },
|
200 | 144 | {
|
201 | 145 | "id": "19",
|
202 | 146 | "description": "User Sign Up Server-Side Implementation in Express",
|
203 | 147 | "duration": "08:50",
|
204 |
| - "seqNo": 9, |
205 |
| - "courseId": "2" |
| 148 | + "seqNo": 9 |
206 | 149 | },
|
207 | 150 | {
|
208 | 151 | "id": "20",
|
209 | 152 | "description": "Introduction To Cryptographic Hashes - A Running Demo",
|
210 | 153 | "duration": "05:46",
|
211 |
| - "seqNo": 10, |
212 |
| - "courseId": "2" |
| 154 | + "seqNo": 10 |
213 | 155 | },
|
214 | 156 | {
|
215 | 157 | "id": "21",
|
216 | 158 | "description": "Some Interesting Properties Of Hashing Functions - Validating Passwords",
|
217 | 159 | "duration": "06:31",
|
218 |
| - "seqNo": 11, |
219 |
| - "courseId": "2" |
| 160 | + "seqNo": 11 |
220 | 161 | }
|
221 | 162 | ],
|
222 |
| - "3": [ |
| 163 | + "03": [ |
223 | 164 | {
|
224 | 165 | "id": "22",
|
225 | 166 | "description": "Course Kick-Off - Install Node, NPM, IDE And Service Workers Section Code",
|
226 | 167 | "duration": "07:19",
|
227 |
| - "seqNo": 1, |
228 |
| - "courseId": "3" |
| 168 | + "seqNo": 1 |
229 | 169 | },
|
230 | 170 | {
|
231 | 171 | "id": "23",
|
232 | 172 | "description": "Service Workers In a Nutshell - Service Worker Registration",
|
233 | 173 | "duration": "6:59",
|
234 |
| - "seqNo": 2, |
235 |
| - "courseId": "3" |
| 174 | + "seqNo": 2 |
236 | 175 | },
|
237 | 176 | {
|
238 | 177 | "id": "24",
|
239 | 178 | "description": "Service Workers Hello World - Lifecycle Part 1 and PWA Chrome Dev Tools",
|
240 | 179 | "duration": "7:28",
|
241 |
| - "seqNo": 3, |
242 |
| - "courseId": "3" |
| 180 | + "seqNo": 3 |
243 | 181 | },
|
244 | 182 | {
|
245 | 183 | "id": "25",
|
246 | 184 | "description": "Service Workers and Application Versioning - Install & Activate Lifecycle Phases",
|
247 | 185 | "duration": "10:17",
|
248 |
| - "seqNo": 4, |
249 |
| - "courseId": "3" |
| 186 | + "seqNo": 4 |
250 | 187 | },
|
251 | 188 | {
|
252 | 189 | "id": "26",
|
253 | 190 | "description": "Downloading The Offline Page - The Service Worker Installation Phase",
|
254 | 191 | "duration": "09:50",
|
255 |
| - "seqNo": 5, |
256 |
| - "courseId": "3" |
| 192 | + "seqNo": 5 |
257 | 193 | },
|
258 | 194 | {
|
259 | 195 | "id": "27",
|
260 | 196 | "description": "Introduction to the Cache Storage PWA API",
|
261 | 197 | "duration": "04:44",
|
262 |
| - "seqNo": 6, |
263 |
| - "courseId": "3" |
| 198 | + "seqNo": 6 |
264 | 199 | },
|
265 | 200 | {
|
266 | 201 | "id": "28",
|
267 | 202 | "description": "View Service Workers HTTP Interception Features In Action",
|
268 | 203 | "duration": "06:07",
|
269 |
| - "seqNo": 7, |
270 |
| - "courseId": "3" |
| 204 | + "seqNo": 7 |
271 | 205 | },
|
272 | 206 | {
|
273 | 207 | "id": "29",
|
274 | 208 | "description": "Service Workers Error Handling - Serving The Offline Page",
|
275 | 209 | "duration": "5:38",
|
276 |
| - "seqNo": 8, |
277 |
| - "courseId": "3" |
| 210 | + "seqNo": 8 |
278 | 211 | }
|
279 | 212 | ]
|
280 | 213 | }
|
|
0 commit comments