reddy-api-srm 1.0.12 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/dist/src/auth/login.d.ts +14 -0
  2. package/dist/src/auth/login.d.ts.map +1 -0
  3. package/dist/src/auth/login.js +96 -0
  4. package/dist/src/auth/login.js.map +1 -0
  5. package/dist/src/auth/sessionSeed.d.ts +7 -0
  6. package/dist/src/auth/sessionSeed.d.ts.map +1 -0
  7. package/dist/src/auth/sessionSeed.js +40 -0
  8. package/dist/src/auth/sessionSeed.js.map +1 -0
  9. package/dist/src/auth/terminateSessions.d.ts +9 -24
  10. package/dist/src/auth/terminateSessions.d.ts.map +1 -0
  11. package/dist/src/auth/terminateSessions.js +99 -96
  12. package/dist/src/auth/terminateSessions.js.map +1 -0
  13. package/dist/src/auth/validatePassword.d.ts +1 -1
  14. package/dist/src/auth/validatePassword.d.ts.map +1 -1
  15. package/dist/src/auth/validatePassword.js +138 -87
  16. package/dist/src/auth/validatePassword.js.map +1 -1
  17. package/dist/src/auth/validateUser.d.ts +1 -1
  18. package/dist/src/auth/validateUser.d.ts.map +1 -1
  19. package/dist/src/auth/validateUser.js +14 -40
  20. package/dist/src/auth/validateUser.js.map +1 -1
  21. package/dist/src/fetch/fetchAttendance.d.ts +5 -1
  22. package/dist/src/fetch/fetchAttendance.d.ts.map +1 -1
  23. package/dist/src/fetch/fetchAttendance.js +3 -33
  24. package/dist/src/fetch/fetchAttendance.js.map +1 -1
  25. package/dist/src/fetch/fetchCalender.d.ts +5 -1
  26. package/dist/src/fetch/fetchCalender.d.ts.map +1 -1
  27. package/dist/src/fetch/fetchCalender.js +4 -37
  28. package/dist/src/fetch/fetchCalender.js.map +1 -1
  29. package/dist/src/fetch/fetchCourseDetails.d.ts +5 -1
  30. package/dist/src/fetch/fetchCourseDetails.d.ts.map +1 -1
  31. package/dist/src/fetch/fetchCourseDetails.js +5 -40
  32. package/dist/src/fetch/fetchCourseDetails.js.map +1 -1
  33. package/dist/src/fetch/fetchDayOrder.d.ts +5 -1
  34. package/dist/src/fetch/fetchDayOrder.d.ts.map +1 -1
  35. package/dist/src/fetch/fetchDayOrder.js +3 -33
  36. package/dist/src/fetch/fetchDayOrder.js.map +1 -1
  37. package/dist/src/fetch/fetchLogout.d.ts +2 -4
  38. package/dist/src/fetch/fetchLogout.d.ts.map +1 -1
  39. package/dist/src/fetch/fetchLogout.js +15 -9
  40. package/dist/src/fetch/fetchLogout.js.map +1 -1
  41. package/dist/src/fetch/fetchMarks.d.ts +5 -1
  42. package/dist/src/fetch/fetchMarks.d.ts.map +1 -1
  43. package/dist/src/fetch/fetchMarks.js +4 -33
  44. package/dist/src/fetch/fetchMarks.js.map +1 -1
  45. package/dist/src/fetch/fetchPage.d.ts +6 -0
  46. package/dist/src/fetch/fetchPage.d.ts.map +1 -0
  47. package/dist/src/fetch/fetchPage.js +58 -0
  48. package/dist/src/fetch/fetchPage.js.map +1 -0
  49. package/dist/src/fetch/fetchTimetable.d.ts +5 -1
  50. package/dist/src/fetch/fetchTimetable.d.ts.map +1 -1
  51. package/dist/src/fetch/fetchTimetable.js +5 -40
  52. package/dist/src/fetch/fetchTimetable.js.map +1 -1
  53. package/dist/src/fetch/fetchUserInfo.d.ts +5 -1
  54. package/dist/src/fetch/fetchUserInfo.d.ts.map +1 -1
  55. package/dist/src/fetch/fetchUserInfo.js +6 -35
  56. package/dist/src/fetch/fetchUserInfo.js.map +1 -1
  57. package/dist/src/index.d.ts +39 -5
  58. package/dist/src/index.d.ts.map +1 -1
  59. package/dist/src/index.js +86 -33
  60. package/dist/src/index.js.map +1 -1
  61. package/dist/src/parser/decodeHtml.d.ts +6 -0
  62. package/dist/src/parser/decodeHtml.d.ts.map +1 -0
  63. package/dist/src/parser/decodeHtml.js +18 -0
  64. package/dist/src/parser/decodeHtml.js.map +1 -0
  65. package/dist/src/parser/parseAttendance.d.ts +2 -2
  66. package/dist/src/parser/parseAttendance.d.ts.map +1 -1
  67. package/dist/src/parser/parseAttendance.js +68 -16
  68. package/dist/src/parser/parseAttendance.js.map +1 -1
  69. package/dist/src/parser/parseCalender.d.ts +2 -2
  70. package/dist/src/parser/parseCalender.d.ts.map +1 -1
  71. package/dist/src/parser/parseCalender.js +125 -43
  72. package/dist/src/parser/parseCalender.js.map +1 -1
  73. package/dist/src/parser/parseCourse.d.ts +2 -2
  74. package/dist/src/parser/parseCourse.d.ts.map +1 -1
  75. package/dist/src/parser/parseCourse.js +19 -8
  76. package/dist/src/parser/parseCourse.js.map +1 -1
  77. package/dist/src/parser/parseDayOrder.d.ts +2 -2
  78. package/dist/src/parser/parseDayOrder.d.ts.map +1 -1
  79. package/dist/src/parser/parseDayOrder.js +31 -12
  80. package/dist/src/parser/parseDayOrder.js.map +1 -1
  81. package/dist/src/parser/parseMarks.d.ts +2 -2
  82. package/dist/src/parser/parseMarks.d.ts.map +1 -1
  83. package/dist/src/parser/parseMarks.js +23 -11
  84. package/dist/src/parser/parseMarks.js.map +1 -1
  85. package/dist/src/parser/parseTimetable.d.ts +2 -2
  86. package/dist/src/parser/parseTimetable.d.ts.map +1 -1
  87. package/dist/src/parser/parseTimetable.js +51 -27
  88. package/dist/src/parser/parseTimetable.js.map +1 -1
  89. package/dist/src/parser/parseUserInfo.d.ts +2 -2
  90. package/dist/src/parser/parseUserInfo.d.ts.map +1 -1
  91. package/dist/src/parser/parseUserInfo.js +57 -25
  92. package/dist/src/parser/parseUserInfo.js.map +1 -1
  93. package/dist/src/type/attendance.d.ts +5 -5
  94. package/dist/src/type/attendance.d.ts.map +1 -1
  95. package/dist/src/type/auth.d.ts +33 -5
  96. package/dist/src/type/auth.d.ts.map +1 -1
  97. package/dist/src/type/calendar.d.ts.map +1 -1
  98. package/dist/src/type/common.d.ts.map +1 -1
  99. package/dist/src/type/course.d.ts.map +1 -1
  100. package/dist/src/type/dayOrder.d.ts.map +1 -1
  101. package/dist/src/type/index.d.ts +0 -1
  102. package/dist/src/type/index.d.ts.map +1 -1
  103. package/dist/src/type/index.js +0 -1
  104. package/dist/src/type/index.js.map +1 -1
  105. package/dist/src/type/marks.d.ts.map +1 -1
  106. package/dist/src/type/timetable.d.ts.map +1 -1
  107. package/dist/src/type/user.d.ts +1 -0
  108. package/dist/src/type/user.d.ts.map +1 -1
  109. package/dist/src/utils/attendanceStatus.d.ts +8 -0
  110. package/dist/src/utils/attendanceStatus.d.ts.map +1 -0
  111. package/dist/src/utils/attendanceStatus.js +20 -0
  112. package/dist/src/utils/attendanceStatus.js.map +1 -0
  113. package/dist/src/utils/data.d.ts +11 -0
  114. package/dist/src/utils/data.d.ts.map +1 -0
  115. package/dist/src/utils/data.js +36 -0
  116. package/dist/src/utils/data.js.map +1 -0
  117. package/dist/src/utils/dynamicUrl.d.ts +14 -0
  118. package/dist/src/utils/dynamicUrl.d.ts.map +1 -0
  119. package/dist/src/utils/dynamicUrl.js +105 -0
  120. package/dist/src/utils/dynamicUrl.js.map +1 -0
  121. package/package.json +2 -2
package/dist/src/index.js CHANGED
@@ -1,5 +1,8 @@
1
1
  "use strict";
2
+ // ─── Type exports ────────────────────────────────────────────────────────────
2
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.resetUrlCache = void 0;
5
+ exports.login = login;
3
6
  exports.verifyUser = verifyUser;
4
7
  exports.verifyPassword = verifyPassword;
5
8
  exports.logoutUser = logoutUser;
@@ -11,108 +14,158 @@ exports.getUserInfo = getUserInfo;
11
14
  exports.getCalendar = getCalendar;
12
15
  exports.getDayOrder = getDayOrder;
13
16
  exports.getCourse = getCourse;
14
- const validatePassword_1 = require("./auth/validatePassword");
17
+ exports.getAllData = getAllData;
18
+ // ─── Auth imports ────────────────────────────────────────────────────────────
15
19
  const validateUser_1 = require("./auth/validateUser");
20
+ const validatePassword_1 = require("./auth/validatePassword");
16
21
  const terminateSessions_1 = require("./auth/terminateSessions");
22
+ const login_1 = require("./auth/login");
23
+ // ─── Fetch imports ───────────────────────────────────────────────────────────
24
+ const fetchTimetable_1 = require("./fetch/fetchTimetable");
17
25
  const fetchAttendance_1 = require("./fetch/fetchAttendance");
18
- const fetchCourseDetails_1 = require("./fetch/fetchCourseDetails");
19
26
  const fetchMarks_1 = require("./fetch/fetchMarks");
20
27
  const fetchUserInfo_1 = require("./fetch/fetchUserInfo");
21
- const fetchLogout_1 = require("./fetch/fetchLogout");
28
+ const fetchCalender_1 = require("./fetch/fetchCalender");
29
+ const fetchCourseDetails_1 = require("./fetch/fetchCourseDetails");
22
30
  const fetchDayOrder_1 = require("./fetch/fetchDayOrder");
31
+ const fetchLogout_1 = require("./fetch/fetchLogout");
32
+ // ─── Parser imports ──────────────────────────────────────────────────────────
33
+ const parseTimetable_1 = require("./parser/parseTimetable");
23
34
  const parseAttendance_1 = require("./parser/parseAttendance");
35
+ const parseMarks_1 = require("./parser/parseMarks");
24
36
  const parseCalender_1 = require("./parser/parseCalender");
25
37
  const parseCourse_1 = require("./parser/parseCourse");
26
- const parseMarks_1 = require("./parser/parseMarks");
27
- const parseTimetable_1 = require("./parser/parseTimetable");
28
38
  const parseUserInfo_1 = require("./parser/parseUserInfo");
29
39
  const parseDayOrder_1 = require("./parser/parseDayOrder");
30
- const fetchTimetable_1 = require("./fetch/fetchTimetable");
31
- const fetchCalender_1 = require("./fetch/fetchCalender");
32
- // Verify-user
40
+ // ─── Utils ───────────────────────────────────────────────────────────────────
41
+ const dynamicUrl_1 = require("./utils/dynamicUrl");
42
+ Object.defineProperty(exports, "resetUrlCache", { enumerable: true, get: function () { return dynamicUrl_1.resetUrlCache; } });
43
+ // ═══════════════════════════════════════════════════════════════════════════════
44
+ // Public API
45
+ // ═══════════════════════════════════════════════════════════════════════════════
46
+ /**
47
+ * One-call login: verifyUser → verifyPassword → auto-terminate if needed → re-login.
48
+ * Returns cookies or error.
49
+ */
50
+ async function login(email, password, maxRetries) {
51
+ return (0, login_1.login)(email, password, maxRetries);
52
+ }
53
+ /** Verify a user exists by their email/username */
33
54
  async function verifyUser(username) {
34
- return await (0, validateUser_1.validateUser)(username);
55
+ return (0, validateUser_1.validateUser)(username);
35
56
  }
36
- // Verify-password
57
+ /** Verify password after verifyUser */
37
58
  async function verifyPassword({ identifier, digest, password, }) {
38
- return await (0, validatePassword_1.validatePassword)({ identifier, digest, password });
59
+ return (0, validatePassword_1.validatePassword)({ identifier, digest, password });
39
60
  }
40
- // Logout
61
+ /** Logout user */
41
62
  async function logoutUser(cookie) {
42
- return await (0, fetchLogout_1.fetchLogout)(cookie);
63
+ return (0, fetchLogout_1.fetchLogout)(cookie);
43
64
  }
44
- // Terminate concurrent sessions (2-device limit bypass)
45
- async function terminateSessions({ flowId, identifier, digest, csrfToken, sessionCookie }) {
46
- return await (0, terminateSessions_1.terminateSessions)({ flowId, identifier, digest, csrfToken, sessionCookie });
65
+ /** Terminate concurrent sessions (2-device limit bypass) */
66
+ async function terminateSessions(params) {
67
+ return (0, terminateSessions_1.terminateSessions)(params);
47
68
  }
48
- // Get TimeTable
69
+ /** Get timetable data */
49
70
  async function getTimetable(cookie) {
50
71
  const fetch = await (0, fetchTimetable_1.fetchTimetable)(cookie);
51
72
  if (fetch.error)
52
73
  return { error: fetch.error, status: fetch.status };
53
- const parse = await (0, parseTimetable_1.parseTimetable)(fetch);
74
+ const parse = await (0, parseTimetable_1.parseTimetable)(fetch.data);
54
75
  if (parse.error)
55
76
  return { error: parse.error, status: parse.status };
56
77
  return parse;
57
78
  }
58
- // Get Attendance
79
+ /** Get attendance data */
59
80
  async function getAttendance(cookie) {
60
81
  const fetch = await (0, fetchAttendance_1.fetchAttendance)(cookie);
61
82
  if (fetch.error)
62
83
  return { error: fetch.error, status: fetch.status };
63
- const parse = await (0, parseAttendance_1.parseAttendance)(fetch);
84
+ const parse = await (0, parseAttendance_1.parseAttendance)(fetch.data);
64
85
  if (parse.error)
65
86
  return { error: parse.error, status: parse.status };
66
87
  return parse;
67
88
  }
68
- // Get Marks
89
+ /** Get marks data */
69
90
  async function getMarks(cookie) {
70
91
  const fetch = await (0, fetchMarks_1.fetchMarks)(cookie);
71
92
  if (fetch.error)
72
93
  return { error: fetch.error, status: fetch.status };
73
- const parse = await (0, parseMarks_1.parseMarks)(fetch);
94
+ const parse = await (0, parseMarks_1.parseMarks)(fetch.data);
74
95
  if (parse.error)
75
96
  return { error: parse.error, status: parse.status };
76
97
  return parse;
77
98
  }
78
- // Get UserInfo
99
+ /** Get user information */
79
100
  async function getUserInfo(cookie) {
101
+ // Try timetable page first (has user info)
80
102
  const fetch = await (0, fetchUserInfo_1.fetchUserInfo)(cookie);
81
- if (fetch.error)
82
- return { error: fetch.error, status: fetch.status };
83
- const parse = await (0, parseUserInfo_1.parseUserInfo)(fetch);
103
+ if (fetch.error) {
104
+ // Fallback: try attendance page (also has user info)
105
+ const attFetch = await (0, fetchAttendance_1.fetchAttendance)(cookie);
106
+ if (attFetch.error)
107
+ return { error: attFetch.error, status: attFetch.status };
108
+ const parse = await (0, parseUserInfo_1.parseUserInfo)(attFetch.data);
109
+ if (parse.error)
110
+ return { error: parse.error, status: parse.status };
111
+ return parse;
112
+ }
113
+ const parse = await (0, parseUserInfo_1.parseUserInfo)(fetch.data);
84
114
  if (parse.error)
85
115
  return { error: parse.error, status: parse.status };
86
116
  return parse;
87
117
  }
88
- // Get Calendar
118
+ /** Get academic calendar */
89
119
  async function getCalendar(cookie) {
90
120
  const fetch = await (0, fetchCalender_1.fetchCalendar)(cookie);
91
121
  if (fetch.error)
92
122
  return { error: fetch.error, status: fetch.status };
93
- const parse = await (0, parseCalender_1.parseCalendar)(fetch);
123
+ const parse = await (0, parseCalender_1.parseCalendar)(fetch.data);
94
124
  if (parse.error)
95
125
  return { error: parse.error, status: parse.status };
96
126
  return parse;
97
127
  }
98
- // Get Day Order
128
+ /** Get current day order */
99
129
  async function getDayOrder(cookie) {
100
130
  const fetch = await (0, fetchDayOrder_1.fetchDayOrder)(cookie);
101
131
  if (fetch.error)
102
132
  return { error: fetch.error, status: fetch.status };
103
- const parse = await (0, parseDayOrder_1.parseDayOrder)(fetch);
133
+ const parse = await (0, parseDayOrder_1.parseDayOrder)(fetch.data);
104
134
  if (parse.error)
105
135
  return { error: parse.error, status: parse.status };
106
136
  return parse;
107
137
  }
108
- // Get Course
138
+ /** Get course details */
109
139
  async function getCourse(cookie) {
110
140
  const fetch = await (0, fetchCourseDetails_1.fetchCourseDetails)(cookie);
111
141
  if (fetch.error)
112
142
  return { error: fetch.error, status: fetch.status };
113
- const parse = await (0, parseCourse_1.parseCourseDetails)(fetch);
143
+ const parse = await (0, parseCourse_1.parseCourseDetails)(fetch.data);
114
144
  if (parse.error)
115
145
  return { error: parse.error, status: parse.status };
116
146
  return parse;
117
147
  }
118
- //# sourceMappingURL=index.js.map
148
+ /** Fetch all data in parallel (attendance, marks, timetable, calendar, userInfo, dayOrder, course) */
149
+ async function getAllData(cookie) {
150
+ const [att, mrk, tt, cal, ui, dord, crs] = await Promise.allSettled([
151
+ getAttendance(cookie),
152
+ getMarks(cookie),
153
+ getTimetable(cookie),
154
+ getCalendar(cookie),
155
+ getUserInfo(cookie),
156
+ getDayOrder(cookie),
157
+ getCourse(cookie),
158
+ ]);
159
+ return {
160
+ attendance: att.status === "fulfilled" ? att.value : { error: "Failed", status: 500 },
161
+ marks: mrk.status === "fulfilled" ? mrk.value : { error: "Failed", status: 500 },
162
+ timetable: tt.status === "fulfilled" ? tt.value : { error: "Failed", status: 500 },
163
+ calendar: cal.status === "fulfilled" ? cal.value : { error: "Failed", status: 500 },
164
+ userInfo: ui.status === "fulfilled" ? ui.value : { error: "Failed", status: 500 },
165
+ dayOrder: dord.status === "fulfilled"
166
+ ? dord.value
167
+ : { error: "Failed", status: 500 },
168
+ course: crs.status === "fulfilled" ? crs.value : { error: "Failed", status: 500 },
169
+ };
170
+ }
171
+ //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Decodes SRM's escaped HTML from the pageSanitizer.sanitize() wrapper.
3
+ * Returns null if the pattern is not found.
4
+ */
5
+ export declare function decodePageSanitizer(response: unknown): string | null;
6
+ //# sourceMappingURL=decodeHtml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decodeHtml.d.ts","sourceRoot":"","sources":["../../../src/parser/decodeHtml.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,OAAO,GAChB,MAAM,GAAG,IAAI,CAcf"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.decodePageSanitizer = decodePageSanitizer;
4
+ /**
5
+ * Decodes SRM's escaped HTML from the pageSanitizer.sanitize() wrapper.
6
+ * Returns null if the pattern is not found.
7
+ */
8
+ function decodePageSanitizer(response) {
9
+ const text = typeof response === "string" ? response : JSON.stringify(response);
10
+ const match = text.match(/pageSanitizer\.sanitize\s*\(\s*'(.*?)'\s*\)/s);
11
+ if (!match || !match[1])
12
+ return null;
13
+ return match[1]
14
+ .replace(/\\x([0-9A-Fa-f]{2})/g, (_, hex) => String.fromCharCode(parseInt(hex, 16)))
15
+ .replace(/\\\\/g, "")
16
+ .replace(/\\'/g, "'");
17
+ }
18
+ //# sourceMappingURL=decodeHtml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decodeHtml.js","sourceRoot":"","sources":["../../../src/parser/decodeHtml.ts"],"names":[],"mappings":";;AAIA,kDAgBC;AApBD;;;GAGG;AACH,SAAgB,mBAAmB,CACjC,QAAiB;IAEjB,MAAM,IAAI,GACR,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAErE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAEzE,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,OAAO,KAAK,CAAC,CAAC,CAAC;SACZ,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC,EAAE,GAAW,EAAE,EAAE,CAClD,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CACvC;SACA,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC1B,CAAC"}
@@ -1,3 +1,3 @@
1
- import { AttendanceResponse } from "../type/attendance";
2
- export declare function parseAttendance(response: string): Promise<AttendanceResponse>;
1
+ import type { AttendanceResponse } from "../type/attendance";
2
+ export declare function parseAttendance(response: unknown): Promise<AttendanceResponse>;
3
3
  //# sourceMappingURL=parseAttendance.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseAttendance.d.ts","sourceRoot":"","sources":["../../../src/parser/parseAttendance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAoB,MAAM,oBAAoB,CAAC;AAE1E,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,kBAAkB,CAAC,CAsD7B"}
1
+ {"version":3,"file":"parseAttendance.d.ts","sourceRoot":"","sources":["../../../src/parser/parseAttendance.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAI7D,wBAAsB,eAAe,CACnC,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC,kBAAkB,CAAC,CA2H7B"}
@@ -35,24 +35,71 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.parseAttendance = parseAttendance;
37
37
  const cheerio = __importStar(require("cheerio"));
38
- const attendanceStatus_1 = require("../../utils/attendanceStatus");
38
+ const attendanceStatus_1 = require("../utils/attendanceStatus");
39
+ const decodeHtml_1 = require("./decodeHtml");
39
40
  async function parseAttendance(response) {
40
41
  try {
41
- const match = response.match(/pageSanitizer\.sanitize\('(.*)'\);/s);
42
- if (!match || !match[1]) {
42
+ const decodedHtml = (0, decodeHtml_1.decodePageSanitizer)(response);
43
+ if (!decodedHtml) {
43
44
  return { error: "Failed to extract attendance data", status: 404 };
44
45
  }
45
- const encodedHtml = match[1];
46
- const decodedHtml = encodedHtml
47
- .replace(/\\x([0-9A-Fa-f]{2})/g, (_, hex) => String.fromCharCode(parseInt(hex, 16)))
48
- .replace(/\\\\/g, "")
49
- .replace(/\\'/g, "'");
50
46
  const $ = cheerio.load(decodedHtml);
51
- const table = $('table[style*="font-size :16px;"][bgcolor="#FAFAD2"]');
47
+ // Strategy 1: Old format - table with bgcolor="#FAFAD2"
48
+ let table = $('table[style*="font-size :16px;"][bgcolor="#FAFAD2"]');
49
+ // Strategy 2: Find table by header content
50
+ if (!table.length) {
51
+ $("table").each((_, el) => {
52
+ const headerRow = $(el).find("tr").first();
53
+ const headerText = headerRow.text().toLowerCase();
54
+ if (headerText.includes("course code") &&
55
+ headerText.includes("conducted") &&
56
+ headerText.includes("absent")) {
57
+ table = $(el);
58
+ return false; // break
59
+ }
60
+ });
61
+ }
62
+ // Strategy 3: Find the largest data table with numeric columns
63
+ if (!table.length) {
64
+ let bestTable = null;
65
+ let bestScore = 0;
66
+ $("table").each((_, el) => {
67
+ const $el = $(el);
68
+ const rows = $el.find("tr");
69
+ if (rows.length < 2)
70
+ return; // need header + at least 1 data row
71
+ // Check if rows have numeric-looking columns (conducted/absent)
72
+ const dataRow = rows.eq(1);
73
+ const cells = dataRow.find("td");
74
+ let numericCells = 0;
75
+ cells.each((__, cell) => {
76
+ const text = $(cell).text().trim();
77
+ if (/^\d+$/.test(text))
78
+ numericCells++;
79
+ });
80
+ const score = rows.length * numericCells;
81
+ if (score > bestScore && cells.length >= 7) {
82
+ bestScore = score;
83
+ bestTable = $el;
84
+ }
85
+ });
86
+ if (bestTable && bestScore > 0) {
87
+ table = bestTable;
88
+ }
89
+ }
90
+ if (!table.length) {
91
+ // No attendance table found — could be semester break
92
+ return { attendance: [], status: 200 };
93
+ }
52
94
  const rows = table.find("tr").slice(1).toArray();
95
+ if (rows.length === 0) {
96
+ return { attendance: [], status: 200 };
97
+ }
53
98
  const attendanceDetails = await Promise.all(rows.map(async (row) => {
54
99
  const cols = $(row).find("td");
55
100
  const get = (idx) => cols[idx] ? $(cols[idx]).text().trim() : "";
101
+ const courseConducted = get(6) ? Number(get(6)) : 0;
102
+ const courseAbsent = get(7) ? Number(get(7)) : 0;
56
103
  const data = {
57
104
  courseCode: cols[0]
58
105
  ? $(cols[0]).contents().first().text().trim()
@@ -61,21 +108,26 @@ async function parseAttendance(response) {
61
108
  courseCategory: get(2),
62
109
  courseFaculty: get(3).split("(")[0].trim(),
63
110
  courseSlot: get(4),
64
- courseConducted: get(6) ? Number(get(6)) : 0,
65
- courseAbsent: get(7) ? Number(get(7)) : 0,
111
+ courseConducted,
112
+ courseAbsent,
66
113
  courseAttendanceStatus: await (0, attendanceStatus_1.attendanceStatus)({
67
- conducted: Number(get(6)),
68
- absent: Number(get(7)),
114
+ conducted: courseConducted,
115
+ absent: courseAbsent,
69
116
  }),
70
117
  };
71
- const courseAttendance = Number(((data.courseConducted - data.courseAbsent) / data.courseConducted) *
72
- 100).toFixed(2);
118
+ const courseAttendance = data.courseConducted > 0
119
+ ? Number((((data.courseConducted - data.courseAbsent) /
120
+ data.courseConducted) *
121
+ 100).toFixed(2)).toFixed(2)
122
+ : "0.00";
73
123
  return {
74
124
  ...data,
75
125
  courseAttendance,
76
126
  };
77
127
  }));
78
- return { attendance: attendanceDetails, status: 200 };
128
+ // Filter out rows with empty course codes (header-like rows)
129
+ const validAttendance = attendanceDetails.filter((a) => a.courseCode.length > 0);
130
+ return { attendance: validAttendance, status: 200 };
79
131
  }
80
132
  catch (error) {
81
133
  console.error("Error parsing attendance:", error);
@@ -1 +1 @@
1
- {"version":3,"file":"parseAttendance.js","sourceRoot":"","sources":["../../../src/parser/parseAttendance.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,0CAwDC;AA3DD,iDAAmC;AAEnC,mEAAgE;AACzD,KAAK,UAAU,eAAe,CACnC,QAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACpE,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,KAAK,EAAE,mCAAmC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QACrE,CAAC;QACD,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,WAAW,GAAG,WAAW;aAC5B,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAS,EAAE,GAAW,EAAE,EAAE,CAC1D,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CACvC;aACA,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;aACpB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAExB,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,CAAC,CAAC,qDAAqD,CAAC,CAAC;QAEvE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACjD,MAAM,iBAAiB,GAAuB,MAAM,OAAO,CAAC,GAAG,CAC7D,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACrB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,EAAE,CAC1B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,GAAG;gBACX,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;oBACjB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE;oBAC7C,CAAC,CAAC,EAAE;gBACN,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;gBACnB,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC;gBACtB,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;gBAC1C,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;gBAClB,eAAe,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5C,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzC,sBAAsB,EAAE,MAAM,IAAA,mCAAgB,EAAC;oBAC7C,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBACzB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iBACvB,CAAC;aACH,CAAC;YACF,MAAM,gBAAgB,GAAG,MAAM,CAC7B,CAAC,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC;gBACjE,GAAG,CACN,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACb,OAAO;gBACL,GAAG,IAAI;gBACP,gBAAgB;aACjB,CAAC;QACJ,CAAC,CAAC,CACH,CAAC;QAEF,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACxD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QAClD,OAAO,EAAE,KAAK,EAAE,4BAA4B,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAC9D,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"parseAttendance.js","sourceRoot":"","sources":["../../../src/parser/parseAttendance.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { CalendarResponse } from "../type/calendar";
2
- export declare function parseCalendar(response: string): Promise<CalendarResponse>;
1
+ import type { CalendarResponse } from "../type/calendar";
2
+ export declare function parseCalendar(response: unknown): Promise<CalendarResponse>;
3
3
  //# sourceMappingURL=parseCalender.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseCalender.d.ts","sourceRoot":"","sources":["../../../src/parser/parseCalender.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAS,MAAM,kBAAkB,CAAC;AAE3D,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,CAAC,CA6D3B"}
1
+ {"version":3,"file":"parseCalender.d.ts","sourceRoot":"","sources":["../../../src/parser/parseCalender.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAyBzD,wBAAsB,aAAa,CACjC,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC,gBAAgB,CAAC,CAgO3B"}