Skip to content

Commit ed0e42e

Browse files
authored
Moving to Typescript (#228)
* Moving to typescript * Adding typechecking and initial typing * No vars * Fixing extra semicolon * Adding typings * Fixing RUM with typescript * Fixing linting * Fixing RUM
1 parent 89fef83 commit ed0e42e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+413
-297
lines changed

.eslintrc.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
"commonjs": true,
55
"es6": true
66
},
7+
"parser": "@typescript-eslint/parser",
8+
"plugins": [
9+
"@typescript-eslint"
10+
],
711
"extends": [
812
"standard"
913
],
@@ -16,6 +20,7 @@
1620
},
1721
"rules": {
1822
"no-undef": "off",
23+
"no-var": "warn",
1924
"no-unused-vars": "warn",
2025
"no-prototype-builtins": "warn",
2126
"no-redeclare": "warn",

.github/workflows/npm.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,5 @@ jobs:
2323
node-version: ${{ matrix.node-version }}
2424
- run: npm install
2525
- run: npm run lint
26+
- run: npm run typecheck
2627
- run: npm run build

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ package-lock.json
1212

1313
# Ignore built files
1414
assets/prod/*
15+
assets/dist/*
1516
!assets/prod/.gitkeep
1617

1718
# Other files

assets/src/modules/sm/App/controllers/AppController.js renamed to assets/src/modules/sm/App/controllers/AppController.ts

Lines changed: 46 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ angular.module('sm').controller('AppController', function ($scope, localStorage,
6767
}
6868

6969
// Reload the state if it exists
70-
var storedState = localStorage.getItem('state')
70+
const storedState = localStorage.getItem('state')
7171
if (storedState != null) {
7272
// Check if state version exists or is correct
7373
if (storedState.hasOwnProperty('meta') && storedState.meta.stateVersion === $scope.stateVersion) {
@@ -78,7 +78,7 @@ angular.module('sm').controller('AppController', function ($scope, localStorage,
7878

7979
// Initialize new values
8080
if ($scope.state.schedules.length > 0 && $scope.state.schedules[0].length > 0 && !$scope.state.schedules[0][0].hasOwnProperty('initialIndex')) {
81-
for (var count = 0; count < $scope.state.schedules.length; count++) {
81+
for (let count = 0; count < $scope.state.schedules.length; count++) {
8282
$scope.state.schedules[count][0].initialIndex = count
8383
}
8484
}
@@ -105,7 +105,7 @@ angular.module('sm').controller('AppController', function ($scope, localStorage,
105105
// Default, images are supported
106106
$scope.imageSupport = true
107107

108-
var courseNumFilter = $filter('courseNum')
108+
const courseNumFilter = $filter('courseNum')
109109

110110
// Course cart tools for non-generate pages.
111111
$scope.courseCart = {
@@ -123,8 +123,8 @@ angular.module('sm').controller('AppController', function ($scope, localStorage,
123123
* Returns the total number of selected sections in the cart
124124
*/
125125
selectedSections: function () {
126-
var count = 0
127-
for (var i = 0; i < $scope.state.courses.length; i++) {
126+
let count = 0
127+
for (let i = 0; i < $scope.state.courses.length; i++) {
128128
if ($scope.state.courses[i]) {
129129
count += $scope.courseCart.count.course.selectedSections($scope.state.courses[i])
130130
}
@@ -136,8 +136,8 @@ angular.module('sm').controller('AppController', function ($scope, localStorage,
136136
* Returns the total number of courses from the selectCoursesController
137137
*/
138138
coursesFromSelect: function () {
139-
var count = 0
140-
for (var i = 0; i < $scope.state.courses.length; i++) {
139+
let count = 0
140+
for (let i = 0; i < $scope.state.courses.length; i++) {
141141
if ($scope.state.courses[i].fromSelect) {
142142
count++
143143
}
@@ -146,9 +146,9 @@ angular.module('sm').controller('AppController', function ($scope, localStorage,
146146
}
147147
},
148148
course: {
149-
selectedSections: function (course) {
150-
var count = 0
151-
for (var i = 0; i < course.sections.length; i++) {
149+
selectedSections: function (course: Course) {
150+
let count = 0
151+
for (let i = 0; i < course.sections.length; i++) {
152152
if (course.sections[i].selected) count++
153153
}
154154
return count
@@ -162,8 +162,8 @@ angular.module('sm').controller('AppController', function ($scope, localStorage,
162162
* Unselects everything in the cart
163163
*/
164164
unselect: function () {
165-
for (var i = 0; i < $scope.state.courses.length; i++) {
166-
for (var s = 0;
165+
for (let i = 0; i < $scope.state.courses.length; i++) {
166+
for (let s = 0;
167167
s < $scope.state.courses[i].sections.length; s++) {
168168
$scope.state.courses[i].sections[s].selected =
169169
false
@@ -180,7 +180,7 @@ angular.module('sm').controller('AppController', function ($scope, localStorage,
180180
* @param course {Object} The course the section belongs to
181181
* @param section {Object} The section to toggle
182182
*/
183-
toggleByCourse: function (course, section) {
183+
toggleByCourse: function (course: Course, section: Section) {
184184
course = $scope.courseCart.ensure.course(course)
185185

186186
if (course.selected && section.selected) {
@@ -195,7 +195,7 @@ angular.module('sm').controller('AppController', function ($scope, localStorage,
195195
*
196196
* @param section {Object} The section to toggle
197197
*/
198-
toggleByOrphanedSection: function (section) {
198+
toggleByOrphanedSection: function (section: Section) {
199199
section = $scope.courseCart.ensure.section(section)
200200

201201
section.selected = !section.selected
@@ -208,7 +208,7 @@ angular.module('sm').controller('AppController', function ($scope, localStorage,
208208
*
209209
* @param section {Object} The section to toggle
210210
*/
211-
toggle: function (section) {
211+
toggle: function (section: Section) {
212212
section.selected = !section.selected
213213
},
214214

@@ -219,7 +219,7 @@ angular.module('sm').controller('AppController', function ($scope, localStorage,
219219
* @param course {Object} The course the section belongs to
220220
* @param section {Object} The section to toggle
221221
*/
222-
isByCourse: function (course, section) {
222+
isByCourse: function (course: Course, section: Section) {
223223
return $scope.courseCart.contains.course(course) &&
224224
section.selected
225225
}
@@ -228,15 +228,15 @@ angular.module('sm').controller('AppController', function ($scope, localStorage,
228228
/**
229229
* Toggles the current course's sections selcted state
230230
*/
231-
toggle: function (course) {
231+
toggle: function (course: Course) {
232232
// If new this load or not
233-
var Ecourse = $scope.courseCart.ensure.course(course)
233+
const Ecourse = $scope.courseCart.ensure.course(course)
234234

235235
course.selected = !$scope.courseCart.selection.course
236236
.toggleAllSections(Ecourse)
237237
},
238238

239-
is: function (course) {
239+
is: function (course: Course) {
240240
if ($scope.courseCart.contains.course(course)) {
241241
return $scope.courseCart.selection.course
242242
.allSections($scope.courseCart.ensure.course(course))
@@ -250,8 +250,8 @@ angular.module('sm').controller('AppController', function ($scope, localStorage,
250250
*
251251
* Pre-condition: the course exists in the cart
252252
*/
253-
toggleAllSections: function (course) {
254-
var setTo = !$scope.courseCart.selection.course
253+
toggleAllSections: function (course: Course) {
254+
const setTo = !$scope.courseCart.selection.course
255255
.allSections(course)
256256
course.sections.forEach(function (section) {
257257
section.selected = setTo
@@ -263,7 +263,7 @@ angular.module('sm').controller('AppController', function ($scope, localStorage,
263263
/**
264264
* Returns true if all sections are selected
265265
*/
266-
allSections: function (course) {
266+
allSections: function (course: Course) {
267267
return course.sections.reduce(
268268
function (total, section) {
269269
return total && section.selected
@@ -273,7 +273,7 @@ angular.module('sm').controller('AppController', function ($scope, localStorage,
273273
/**
274274
* Unselects all sections
275275
*/
276-
unselect: function (course) {
276+
unselect: function (course :Course) {
277277
course.sections.forEach(function (section) {
278278
section.selected = false
279279
})
@@ -287,8 +287,8 @@ angular.module('sm').controller('AppController', function ($scope, localStorage,
287287
*
288288
* @param course {Object} The course to ensure
289289
*/
290-
course: function (course) {
291-
var ensuredCourse = false
290+
course: function (course: Course) {
291+
let ensuredCourse: Course | boolean = false
292292

293293
if ($scope.state.courses.indexOf(course) === -1) {
294294
// The course object was not found in the cart
@@ -297,7 +297,7 @@ angular.module('sm').controller('AppController', function ($scope, localStorage,
297297
// The course object has been added previously
298298

299299
// Find it by matching ids
300-
for (var i = 0; i < $scope.state.courses.length; i++) {
300+
for (let i = 0; i < $scope.state.courses.length; i++) {
301301
if (course.id === $scope.state.courses[i].id) {
302302
ensuredCourse = $scope.state.courses[i]
303303
break
@@ -322,10 +322,10 @@ angular.module('sm').controller('AppController', function ($scope, localStorage,
322322
return ensuredCourse
323323
},
324324

325-
section: function (section) {
325+
section: function (section: Section) {
326326
if ($scope.courseCart.contains.section(section)) {
327-
var foundCourse = false
328-
for (var i = 0; i < $scope.state.courses.length; i++) {
327+
let foundCourse = false
328+
for (let i = 0; i < $scope.state.courses.length; i++) {
329329
if (section.courseId === $scope.state.courses[i].id) {
330330
foundCourse = $scope.state.courses[i]
331331
break
@@ -348,7 +348,7 @@ angular.module('sm').controller('AppController', function ($scope, localStorage,
348348
* @param course {Object} The course to check
349349
* @returns {Boolean} The course is in the cart?
350350
*/
351-
course: function (course) {
351+
course: function (course: Course) {
352352
return $scope.state.courseMap.hasOwnProperty(course.id)
353353
},
354354

@@ -357,7 +357,7 @@ angular.module('sm').controller('AppController', function ($scope, localStorage,
357357
* @param section {Object} The course to check
358358
* @returns {Boolean} The course is in the cart?
359359
*/
360-
section: function (section) {
360+
section: function (section: Section) {
361361
return $scope.state.courseMap.hasOwnProperty(section.courseId)
362362
}
363363

@@ -368,7 +368,7 @@ angular.module('sm').controller('AppController', function ($scope, localStorage,
368368
* Remove a course completely by index
369369
* @param index The index to remove
370370
*/
371-
byIndex: function (index) {
371+
byIndex: function (index: number) {
372372
$scope.state.courses.splice(index, 1)
373373
}
374374
},
@@ -377,9 +377,9 @@ angular.module('sm').controller('AppController', function ($scope, localStorage,
377377
/**
378378
* Adds a given section to the provided course if it's not there
379379
*/
380-
sectionToCourse: function (section, course) {
381-
var foundSection = false
382-
for (var i = 0; i < course.sections.length; i++) {
380+
sectionToCourse: function (section: Section, course: Course) {
381+
let foundSection = false
382+
for (let i = 0; i < course.sections.length; i++) {
383383
if (section.id === course.sections[i].id) {
384384
course.sections[i] = section
385385
foundSection = true
@@ -398,7 +398,7 @@ angular.module('sm').controller('AppController', function ($scope, localStorage,
398398
* @param course An already formatted course ready for adding
399399
* @returns {Object} The created course
400400
*/
401-
courseToCart: function (course) {
401+
courseToCart: function (course: Course) {
402402
$scope.state.courses.push(course)
403403
$scope.$broadcast('addedCourse')
404404

@@ -424,8 +424,8 @@ angular.module('sm').controller('AppController', function ($scope, localStorage,
424424
* @param course {Object} A course from the database
425425
* @returns {Object} The newly created course
426426
*/
427-
fromExistingCourse: function (course) {
428-
var mockCourse = $scope.courseCart.getBlankCourse(false)
427+
fromExistingCourse: function (course: Course) {
428+
const mockCourse = $scope.courseCart.getBlankCourse(false)
429429

430430
course.fromSelect = false
431431
course.search = courseNumFilter(course)
@@ -437,11 +437,11 @@ angular.module('sm').controller('AppController', function ($scope, localStorage,
437437
/**
438438
* Creates and adds a pre-existing course from a schedule
439439
*
440-
* @param scheduleCourse {Object} A course from the database
441-
* @returns {Object} The newly created course
440+
* @param scheduleCourse A course from the database
441+
* @returns The newly created course
442442
*/
443-
fromExistingScheduleCourse: function (scheduleCourse) {
444-
var course = $scope.courseCart.getBlankCourse(true)
443+
fromExistingScheduleCourse: function (scheduleCourse: Course): Course {
444+
const course = $scope.courseCart.getBlankCourse(true)
445445

446446
course.search = scheduleCourse.courseNum
447447
scheduleCourse.selected = true
@@ -456,11 +456,11 @@ angular.module('sm').controller('AppController', function ($scope, localStorage,
456456
* Creates and adds a pre-existing section from the database to the
457457
* cart
458458
*
459-
* @param existingSection {Object} A section from the database
460-
* @returns {Object} The section now added to the course
459+
* @param existingSection A section from the database
460+
* @returns The section now added to the course
461461
*/
462-
fromExistingSection: function (section) {
463-
var course = $scope.courseCart.getBlankCourse(false)
462+
fromExistingSection: function (section: Section): Section {
463+
const course = $scope.courseCart.getBlankCourse(false)
464464

465465
course.id = section.courseId
466466
course.search = section.courseParentNum

assets/src/modules/sm/App/directives/courseCartDirective.js renamed to assets/src/modules/sm/App/directives/courseCartDirective.ts

File renamed without changes.

assets/src/modules/sm/App/directives/courseDetailPopover.js renamed to assets/src/modules/sm/App/directives/courseDetailPopover.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
angular.module('sm').directive('courseDetailPopover', function ($http, $filter) {
2-
var RMPUrl = $filter('RMPUrl')
3-
var parseTimes = $filter('parseSectionTimes')
4-
var formatTime = $filter('formatTime')
2+
const RMPUrl = $filter('RMPUrl')
3+
const parseTimes = $filter('parseSectionTimes')
4+
const formatTime = $filter('formatTime')
55

66
function getTimesHTML (times) {
77
if (!times) {
88
return ''
99
}
10-
var parsedTimes = parseTimes(times, true)
11-
var HTML = '<div style="font-size: small">'
12-
for (var timeIndex = 0; timeIndex < parsedTimes.length; timeIndex++) {
13-
var time = parsedTimes[timeIndex]
10+
const parsedTimes = parseTimes(times, true)
11+
let HTML = '<div style="font-size: small">'
12+
for (let timeIndex = 0; timeIndex < parsedTimes.length; timeIndex++) {
13+
const time = parsedTimes[timeIndex]
1414
HTML += time.days + ' <span style="white-space: nowrap">' + formatTime(time.start) + '-' + formatTime(time.end) + '</span> <span style="font-style: italic; white-space: nowrap">Location: ' + time.location + '</span>'
1515
if (timeIndex < parsedTimes.length - 1) {
1616
HTML += '<br>'
@@ -28,9 +28,9 @@ angular.module('sm').directive('courseDetailPopover', function ($http, $filter)
2828
},
2929
link: function (scope, elm) {
3030
if (scope.sectionId !== '') {
31-
var loaded = false
32-
var opened = false
33-
var $body = $('body')
31+
let loaded = false
32+
let opened = false
33+
const $body = $('body')
3434

3535
function hidePopoverOnBodyClick () {
3636
setTimeout(function () {

assets/src/modules/sm/App/directives/dowSelectFieldsDirective.js renamed to assets/src/modules/sm/App/directives/dowSelectFieldsDirective.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ angular.module('sm').directive('dowSelectFields', function (uiDayFactory) {
1212
return scope.select.indexOf(day) !== -1
1313
}
1414
scope.toggle = function (day) {
15-
var index = scope.select.indexOf(day)
15+
const index = scope.select.indexOf(day)
1616
if (index === -1) {
1717
scope.select.push(day)
1818
} else {

assets/src/modules/sm/App/directives/loadingButtonDirective.js renamed to assets/src/modules/sm/App/directives/loadingButtonDirective.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
angular.module('sm').directive('loadingButton', function (uiDayFactory) {
2-
var template = '<i class="fa fa-spin fa-refresh" ></i> '
2+
const template = '<i class="fa fa-spin fa-refresh" ></i> '
33

44
return {
55
restrict: 'A',
@@ -8,7 +8,7 @@ angular.module('sm').directive('loadingButton', function (uiDayFactory) {
88
text: '@loadingText'
99
},
1010
link: function (scope, elm) {
11-
var prevHTML = elm.html()
11+
const prevHTML = elm.html()
1212
scope.$watch('status', function (newLoading, prevLoading) {
1313
if (newLoading !== prevLoading) {
1414
if (newLoading === 'L') {

assets/src/modules/sm/App/directives/navCloseOnMobileDirective.js renamed to assets/src/modules/sm/App/directives/navCloseOnMobileDirective.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ angular.module('sm').directive('navCloseOnMobile', function () {
22
return {
33
restrict: 'A',
44
link: function (scope, elm) {
5-
var nav = $(elm)
5+
const nav = $(elm)
66
$(elm).find('li').click(function () {
7-
$('.navbar-collapse.in').collapse('hide')
7+
($('.navbar-collapse.in') as any).collapse('hide')
88
})
99
}
1010
}

assets/src/modules/sm/App/directives/paginationControlsDirective.js renamed to assets/src/modules/sm/App/directives/paginationControlsDirective.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ angular.module('sm').directive('paginationControls', function () {
1212
link: {
1313
pre: function (scope) {
1414
scope.numberOfPages = function () {
15-
var numPages = Math.ceil(scope.totalLength / scope.displayOptions.pageSize)
15+
const numPages = Math.ceil(scope.totalLength / scope.displayOptions.pageSize)
1616
if (scope.displayOptions.currentPage === numPages) {
1717
scope.displayOptions.currentPage = numPages - 1
1818
}

0 commit comments

Comments
 (0)