@juki-team/commons 0.1.31

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 (235) hide show
  1. package/README.md +3 -0
  2. package/biome.shared.json +102 -0
  3. package/dist/constants/commons.d.ts +62 -0
  4. package/dist/constants/commons.js +658 -0
  5. package/dist/constants/company.d.ts +9 -0
  6. package/dist/constants/company.js +24 -0
  7. package/dist/constants/contest.d.ts +15 -0
  8. package/dist/constants/contest.js +29 -0
  9. package/dist/constants/course.d.ts +8 -0
  10. package/dist/constants/course.js +12 -0
  11. package/dist/constants/date.d.ts +9 -0
  12. package/dist/constants/date.js +23 -0
  13. package/dist/constants/email.d.ts +2 -0
  14. package/dist/constants/email.js +34 -0
  15. package/dist/constants/entity.d.ts +3 -0
  16. package/dist/constants/entity.js +18 -0
  17. package/dist/constants/file.d.ts +28 -0
  18. package/dist/constants/file.js +46 -0
  19. package/dist/constants/index.d.ts +18 -0
  20. package/dist/constants/index.js +18 -0
  21. package/dist/constants/judge.d.ts +37 -0
  22. package/dist/constants/judge.js +221 -0
  23. package/dist/constants/problem.d.ts +37 -0
  24. package/dist/constants/problem.js +72 -0
  25. package/dist/constants/routing.d.ts +7 -0
  26. package/dist/constants/routing.js +7 -0
  27. package/dist/constants/services.d.ts +5 -0
  28. package/dist/constants/services.js +131 -0
  29. package/dist/constants/system.d.ts +8 -0
  30. package/dist/constants/system.js +9 -0
  31. package/dist/constants/teams.d.ts +15 -0
  32. package/dist/constants/teams.js +18 -0
  33. package/dist/constants/time.d.ts +9 -0
  34. package/dist/constants/time.js +9 -0
  35. package/dist/constants/user.d.ts +10 -0
  36. package/dist/constants/user.js +35 -0
  37. package/dist/constants/websocket.d.ts +6 -0
  38. package/dist/constants/websocket.js +5 -0
  39. package/dist/constants/worksheet.d.ts +11 -0
  40. package/dist/constants/worksheet.js +66 -0
  41. package/dist/dto/class.d.ts +115 -0
  42. package/dist/dto/class.js +1 -0
  43. package/dist/dto/code.d.ts +13 -0
  44. package/dist/dto/code.js +1 -0
  45. package/dist/dto/comments.d.ts +21 -0
  46. package/dist/dto/comments.js +1 -0
  47. package/dist/dto/contest.d.ts +95 -0
  48. package/dist/dto/contest.js +7 -0
  49. package/dist/dto/course.d.ts +34 -0
  50. package/dist/dto/course.js +1 -0
  51. package/dist/dto/entity.d.ts +92 -0
  52. package/dist/dto/entity.js +5 -0
  53. package/dist/dto/excalidraw.d.ts +12 -0
  54. package/dist/dto/excalidraw.js +1 -0
  55. package/dist/dto/file.d.ts +34 -0
  56. package/dist/dto/file.js +1 -0
  57. package/dist/dto/image.d.ts +6 -0
  58. package/dist/dto/image.js +1 -0
  59. package/dist/dto/index.d.ts +24 -0
  60. package/dist/dto/index.js +24 -0
  61. package/dist/dto/judge.d.ts +16 -0
  62. package/dist/dto/judge.js +1 -0
  63. package/dist/dto/markdown.d.ts +12 -0
  64. package/dist/dto/markdown.js +1 -0
  65. package/dist/dto/mermaid.d.ts +12 -0
  66. package/dist/dto/mermaid.js +1 -0
  67. package/dist/dto/organization.d.ts +102 -0
  68. package/dist/dto/organization.js +1 -0
  69. package/dist/dto/problem.d.ts +67 -0
  70. package/dist/dto/problem.js +1 -0
  71. package/dist/dto/scoreboard.d.ts +35 -0
  72. package/dist/dto/scoreboard.js +1 -0
  73. package/dist/dto/session.d.ts +15 -0
  74. package/dist/dto/session.js +1 -0
  75. package/dist/dto/socket.d.ts +257 -0
  76. package/dist/dto/socket.js +1 -0
  77. package/dist/dto/statistics.d.ts +43 -0
  78. package/dist/dto/statistics.js +1 -0
  79. package/dist/dto/submission.d.ts +95 -0
  80. package/dist/dto/submission.js +1 -0
  81. package/dist/dto/system.d.ts +91 -0
  82. package/dist/dto/system.js +1 -0
  83. package/dist/dto/url.d.ts +8 -0
  84. package/dist/dto/url.js +1 -0
  85. package/dist/dto/user.d.ts +109 -0
  86. package/dist/dto/user.js +1 -0
  87. package/dist/dto/virtual-user.d.ts +39 -0
  88. package/dist/dto/virtual-user.js +1 -0
  89. package/dist/dto/worksheet-submissions.d.ts +64 -0
  90. package/dist/dto/worksheet-submissions.js +1 -0
  91. package/dist/dto/worksheet.d.ts +39 -0
  92. package/dist/dto/worksheet.js +1 -0
  93. package/dist/helpers/class.d.ts +4 -0
  94. package/dist/helpers/class.js +10 -0
  95. package/dist/helpers/comments.d.ts +4 -0
  96. package/dist/helpers/comments.js +4 -0
  97. package/dist/helpers/commons.d.ts +33 -0
  98. package/dist/helpers/commons.js +191 -0
  99. package/dist/helpers/contest.d.ts +5 -0
  100. package/dist/helpers/contest.js +21 -0
  101. package/dist/helpers/document.d.ts +14 -0
  102. package/dist/helpers/document.js +38 -0
  103. package/dist/helpers/file.d.ts +1 -0
  104. package/dist/helpers/file.js +4 -0
  105. package/dist/helpers/index.d.ts +14 -0
  106. package/dist/helpers/index.js +14 -0
  107. package/dist/helpers/interval.d.ts +2 -0
  108. package/dist/helpers/interval.js +22 -0
  109. package/dist/helpers/judging.d.ts +25 -0
  110. package/dist/helpers/judging.js +107 -0
  111. package/dist/helpers/object.d.ts +1 -0
  112. package/dist/helpers/object.js +32 -0
  113. package/dist/helpers/responses.d.ts +8 -0
  114. package/dist/helpers/responses.js +78 -0
  115. package/dist/helpers/socket.d.ts +45 -0
  116. package/dist/helpers/socket.js +238 -0
  117. package/dist/helpers/time.d.ts +13 -0
  118. package/dist/helpers/time.js +101 -0
  119. package/dist/helpers/user.d.ts +11 -0
  120. package/dist/helpers/user.js +14 -0
  121. package/dist/helpers/worksheet.d.ts +10 -0
  122. package/dist/helpers/worksheet.js +131 -0
  123. package/dist/index.d.ts +6 -0
  124. package/dist/index.js +6 -0
  125. package/dist/prisma/enums/AssignmentClassType.d.ts +7 -0
  126. package/dist/prisma/enums/AssignmentClassType.js +6 -0
  127. package/dist/prisma/enums/ContestEventAction.d.ts +10 -0
  128. package/dist/prisma/enums/ContestEventAction.js +9 -0
  129. package/dist/prisma/enums/ContestProblemPrerequisiteType.d.ts +5 -0
  130. package/dist/prisma/enums/ContestProblemPrerequisiteType.js +4 -0
  131. package/dist/prisma/enums/ContestRole.d.ts +11 -0
  132. package/dist/prisma/enums/ContestRole.js +10 -0
  133. package/dist/prisma/enums/ContestStatus.d.ts +6 -0
  134. package/dist/prisma/enums/ContestStatus.js +5 -0
  135. package/dist/prisma/enums/CourseRole.d.ts +12 -0
  136. package/dist/prisma/enums/CourseRole.js +11 -0
  137. package/dist/prisma/enums/EntityObjectType.d.ts +13 -0
  138. package/dist/prisma/enums/EntityObjectType.js +12 -0
  139. package/dist/prisma/enums/EntityRole.d.ts +8 -0
  140. package/dist/prisma/enums/EntityRole.js +7 -0
  141. package/dist/prisma/enums/EntitySubjectType.d.ts +7 -0
  142. package/dist/prisma/enums/EntitySubjectType.js +6 -0
  143. package/dist/prisma/enums/FileRole.d.ts +9 -0
  144. package/dist/prisma/enums/FileRole.js +8 -0
  145. package/dist/prisma/enums/FileType.d.ts +5 -0
  146. package/dist/prisma/enums/FileType.js +4 -0
  147. package/dist/prisma/enums/GroupType.d.ts +5 -0
  148. package/dist/prisma/enums/GroupType.js +4 -0
  149. package/dist/prisma/enums/JudgeType.d.ts +12 -0
  150. package/dist/prisma/enums/JudgeType.js +11 -0
  151. package/dist/prisma/enums/OrganizationPlan.d.ts +7 -0
  152. package/dist/prisma/enums/OrganizationPlan.js +6 -0
  153. package/dist/prisma/enums/ProblemRole.d.ts +11 -0
  154. package/dist/prisma/enums/ProblemRole.js +10 -0
  155. package/dist/prisma/enums/ProblemScoringMode.d.ts +6 -0
  156. package/dist/prisma/enums/ProblemScoringMode.js +5 -0
  157. package/dist/prisma/enums/ProblemType.d.ts +6 -0
  158. package/dist/prisma/enums/ProblemType.js +5 -0
  159. package/dist/prisma/enums/ProblemVerdict.d.ts +14 -0
  160. package/dist/prisma/enums/ProblemVerdict.js +13 -0
  161. package/dist/prisma/enums/ShareLinkVisibility.d.ts +5 -0
  162. package/dist/prisma/enums/ShareLinkVisibility.js +4 -0
  163. package/dist/prisma/enums/SubmissionRunStatus.d.ts +18 -0
  164. package/dist/prisma/enums/SubmissionRunStatus.js +17 -0
  165. package/dist/prisma/enums/SystemRole.d.ts +9 -0
  166. package/dist/prisma/enums/SystemRole.js +8 -0
  167. package/dist/prisma/enums/TeamRole.d.ts +9 -0
  168. package/dist/prisma/enums/TeamRole.js +8 -0
  169. package/dist/prisma/enums/TelemetryType.d.ts +9 -0
  170. package/dist/prisma/enums/TelemetryType.js +8 -0
  171. package/dist/prisma/enums/UserRole.d.ts +10 -0
  172. package/dist/prisma/enums/UserRole.js +9 -0
  173. package/dist/prisma/enums/WorkingIn.d.ts +8 -0
  174. package/dist/prisma/enums/WorkingIn.js +7 -0
  175. package/dist/prisma/enums/WorksheetContentType.d.ts +10 -0
  176. package/dist/prisma/enums/WorksheetContentType.js +9 -0
  177. package/dist/prisma/enums/index.d.ts +26 -0
  178. package/dist/prisma/enums/index.js +26 -0
  179. package/dist/prototypes/Date.d.ts +62 -0
  180. package/dist/prototypes/Date.js +218 -0
  181. package/dist/prototypes/Error.d.ts +10 -0
  182. package/dist/prototypes/Error.js +17 -0
  183. package/dist/prototypes/Number.d.ts +7 -0
  184. package/dist/prototypes/Number.js +8 -0
  185. package/dist/prototypes/index.d.ts +3 -0
  186. package/dist/prototypes/index.js +3 -0
  187. package/dist/types/account.d.ts +9 -0
  188. package/dist/types/account.js +10 -0
  189. package/dist/types/class.d.ts +67 -0
  190. package/dist/types/class.js +7 -0
  191. package/dist/types/comments.d.ts +17 -0
  192. package/dist/types/comments.js +1 -0
  193. package/dist/types/commons.d.ts +84 -0
  194. package/dist/types/commons.js +69 -0
  195. package/dist/types/company.d.ts +6 -0
  196. package/dist/types/company.js +7 -0
  197. package/dist/types/contest.d.ts +144 -0
  198. package/dist/types/contest.js +6 -0
  199. package/dist/types/course.d.ts +13 -0
  200. package/dist/types/course.js +1 -0
  201. package/dist/types/entity.d.ts +116 -0
  202. package/dist/types/entity.js +50 -0
  203. package/dist/types/excalidraw.d.ts +9 -0
  204. package/dist/types/excalidraw.js +1 -0
  205. package/dist/types/file.d.ts +22 -0
  206. package/dist/types/file.js +13 -0
  207. package/dist/types/group.d.ts +9 -0
  208. package/dist/types/group.js +1 -0
  209. package/dist/types/index.d.ts +23 -0
  210. package/dist/types/index.js +23 -0
  211. package/dist/types/judge.d.ts +46 -0
  212. package/dist/types/judge.js +17 -0
  213. package/dist/types/markdown.d.ts +8 -0
  214. package/dist/types/markdown.js +1 -0
  215. package/dist/types/mermaid.d.ts +8 -0
  216. package/dist/types/mermaid.js +1 -0
  217. package/dist/types/notification.d.ts +7 -0
  218. package/dist/types/notification.js +8 -0
  219. package/dist/types/problems.d.ts +93 -0
  220. package/dist/types/problems.js +16 -0
  221. package/dist/types/services.d.ts +214 -0
  222. package/dist/types/services.js +147 -0
  223. package/dist/types/sheet.d.ts +104 -0
  224. package/dist/types/sheet.js +16 -0
  225. package/dist/types/socket.d.ts +49 -0
  226. package/dist/types/socket.js +49 -0
  227. package/dist/types/submission.d.ts +5 -0
  228. package/dist/types/submission.js +1 -0
  229. package/dist/types/teams.d.ts +96 -0
  230. package/dist/types/teams.js +28 -0
  231. package/dist/types/users.d.ts +65 -0
  232. package/dist/types/users.js +33 -0
  233. package/dist/types/worksheet.d.ts +42 -0
  234. package/dist/types/worksheet.js +11 -0
  235. package/package.json +42 -0
@@ -0,0 +1,64 @@
1
+ import { type CodeEditorSheet, type CodeLanguage, type JkmdSheet, type QuizOptionsSheet, type QuizProblemSheet, type QuizTextSheet, type UserBasic, WorksheetType } from '../types/index.js';
2
+ import type { SubmissionSummaryListResponseDTO } from './submission.js';
3
+ import type { UserOrganizationBasicInfoResponseDTO } from './user.js';
4
+ export type WorksheetResponseBasicInfoProcessed = {
5
+ submittedAt: number;
6
+ points: number;
7
+ isCompleted: boolean;
8
+ };
9
+ export interface QuizProblemSubmissionDTO extends Pick<QuizProblemSheet, 'id' | 'type'> {
10
+ language: CodeLanguage;
11
+ source: string;
12
+ }
13
+ export interface QuizProblemSubmissionResponseDTO extends WorksheetResponseBasicInfoProcessed, Omit<QuizProblemSubmissionDTO, 'source' | 'language'> {
14
+ submissionResult: SubmissionSummaryListResponseDTO;
15
+ }
16
+ export interface JkmdSubmissionDTO extends Pick<JkmdSheet, 'id' | 'type'> {
17
+ read: boolean;
18
+ }
19
+ export interface JkmdSubmissionResponseDTO extends WorksheetResponseBasicInfoProcessed, JkmdSubmissionDTO {
20
+ }
21
+ export interface CodeEditorSubmissionDTO extends Pick<CodeEditorSheet, 'id' | 'type' | 'files' | 'testCases'> {
22
+ }
23
+ export interface CodeEditorSubmissionResponseDTO extends WorksheetResponseBasicInfoProcessed, CodeEditorSubmissionDTO {
24
+ }
25
+ export interface QuizOptionsSubmissionDTO extends Pick<QuizOptionsSheet, 'id' | 'type'> {
26
+ checkedOptions: string[];
27
+ }
28
+ export interface QuizOptionsSubmissionResponseDTO extends WorksheetResponseBasicInfoProcessed, QuizOptionsSubmissionDTO {
29
+ }
30
+ export interface QuizTextSubmissionDTO extends Pick<QuizTextSheet, 'id' | 'type'> {
31
+ response: string;
32
+ }
33
+ export interface QuizTextSubmissionResponseDTO extends WorksheetResponseBasicInfoProcessed, QuizTextSubmissionDTO {
34
+ }
35
+ export type WorkSheetSubmissions = {
36
+ [WorksheetType.JK_MD]: {
37
+ [key: string]: JkmdSubmissionResponseDTO[];
38
+ };
39
+ [WorksheetType.CODE_EDITOR]: {
40
+ [key: string]: CodeEditorSubmissionResponseDTO[];
41
+ };
42
+ [WorksheetType.QUIZ_PROBLEM]: {
43
+ [key: string]: QuizProblemSubmissionResponseDTO[];
44
+ };
45
+ [WorksheetType.QUIZ_OPTIONS]: {
46
+ [key: string]: QuizOptionsSubmissionResponseDTO[];
47
+ };
48
+ [WorksheetType.QUIZ_TEXT]: {
49
+ [key: string]: QuizTextSubmissionResponseDTO[];
50
+ };
51
+ };
52
+ export interface WorksheetSubmissionsResponseDTO {
53
+ [key: string]: {
54
+ submissions: WorkSheetSubmissions;
55
+ user: UserBasic;
56
+ };
57
+ }
58
+ export interface WorksheetSubmissionsUsersResponseDTO {
59
+ [key: string]: UserOrganizationBasicInfoResponseDTO;
60
+ }
61
+ export interface WorksheetUserSubmissionsResponseDTO {
62
+ submissions: WorkSheetSubmissions;
63
+ user: UserBasic;
64
+ }
@@ -0,0 +1 @@
1
+ import { WorksheetType, } from '../types/index.js';
@@ -0,0 +1,39 @@
1
+ import type { BodyWorksheet, SummaryWorksheetsInPages, WorksheetBaseDocument } from '../types/index.js';
2
+ import type { EntityMembersDTO, EntityMembersResponseDTO } from './entity.js';
3
+ import type { UserOrganizationBasicInfoResponseDTO } from './user.js';
4
+ export interface WorksheetUserResponseDTO {
5
+ isOwner: boolean;
6
+ isManager: boolean;
7
+ isSpectator: boolean;
8
+ }
9
+ export interface WorksheetSummaryListResponseDTO extends Pick<WorksheetBaseDocument, 'key' | 'name' | 'description'> {
10
+ updatedAt: Date;
11
+ content: SummaryWorksheetsInPages;
12
+ user: WorksheetUserResponseDTO;
13
+ owner: UserOrganizationBasicInfoResponseDTO;
14
+ }
15
+ export interface WorksheetDataResponseDTO extends Omit<WorksheetSummaryListResponseDTO, 'content'> {
16
+ folderId: string;
17
+ content: BodyWorksheet[];
18
+ members: EntityMembersResponseDTO;
19
+ quiz: WorksheetBaseDocument['quiz'];
20
+ slides: WorksheetBaseDocument['slides'];
21
+ }
22
+ export interface UpsertWorksheetDTO extends Omit<WorksheetBaseDocument, 'members' | 'key' | 'state'> {
23
+ members: EntityMembersDTO;
24
+ }
25
+ export interface WorksheetsProgressByUsersResponseDTO {
26
+ [key: string]: {
27
+ [key: string]: {
28
+ pages: {
29
+ totalPoints: number;
30
+ points: number;
31
+ percent: number;
32
+ worksheetPercent: number;
33
+ }[];
34
+ percent: number;
35
+ points: number;
36
+ totalPoints: number;
37
+ };
38
+ };
39
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ import type { AssignmentSessionCycleClassDataResponseDTO, ContestAssignmentSessionCycleClassDataResponseDTO, CourseAssignmentSessionCycleClassDataResponseDTO, WorksheetAssignmentSessionCycleClassDataResponseDTO } from '../dto/index.js';
2
+ export declare const isWorksheetAssignment: (assignment: AssignmentSessionCycleClassDataResponseDTO) => assignment is WorksheetAssignmentSessionCycleClassDataResponseDTO;
3
+ export declare const isCourseAssignment: (assignment: AssignmentSessionCycleClassDataResponseDTO) => assignment is CourseAssignmentSessionCycleClassDataResponseDTO;
4
+ export declare const isContestAssignment: (assignment: AssignmentSessionCycleClassDataResponseDTO) => assignment is ContestAssignmentSessionCycleClassDataResponseDTO;
@@ -0,0 +1,10 @@
1
+ import { AssignmentClass } from '../types/index.js';
2
+ export const isWorksheetAssignment = (assignment) => {
3
+ return assignment.type === AssignmentClass.WORKSHEET;
4
+ };
5
+ export const isCourseAssignment = (assignment) => {
6
+ return assignment.type === AssignmentClass.COURSE;
7
+ };
8
+ export const isContestAssignment = (assignment) => {
9
+ return assignment.type === AssignmentClass.CONTEST;
10
+ };
@@ -0,0 +1,4 @@
1
+ export declare const getAssignmentCommentKey: (classKey: string, cycleKey: string, sessionKey: string, assignmentKey: string) => string;
2
+ export declare const getAssignmentUserCommentKey: (classKey: string, cycleKey: string, sessionKey: string, assignmentKey: string, userNickname: string, userCompany: string) => string;
3
+ export declare const getProblemCommentKey: (problemKey: string) => string;
4
+ export declare const getContestCommentKey: (contestKey: string) => string;
@@ -0,0 +1,4 @@
1
+ export const getAssignmentCommentKey = (classKey, cycleKey, sessionKey, assignmentKey) => `class:${classKey}|cycle:${cycleKey}|session:${sessionKey}|assignment:${assignmentKey}`;
2
+ export const getAssignmentUserCommentKey = (classKey, cycleKey, sessionKey, assignmentKey, userNickname, userCompany) => `class:${classKey}|cycle:${cycleKey}|session:${sessionKey}|assignment:${assignmentKey}|user_nickname:${userNickname}|user_company:${userCompany}`;
3
+ export const getProblemCommentKey = (problemKey) => `problem:${problemKey}`;
4
+ export const getContestCommentKey = (contestKey) => `contest:${contestKey}`;
@@ -0,0 +1,33 @@
1
+ import type { Judge } from '../types/index.js';
2
+ export declare function isStringJson(str: unknown): str is string;
3
+ export declare function safeJsonParse(str: unknown): unknown;
4
+ export declare function isObjectJson(obj: unknown): boolean;
5
+ export declare function mex(array: number[]): number;
6
+ export declare function range(start: number, end: number): number[];
7
+ export declare function getPlainText(url: string): Promise<string>;
8
+ export declare function objectUpdate(base: unknown, update: unknown): unknown;
9
+ export declare function objectsUpdate(base: Record<string, unknown>, ...objects: Record<string, unknown>[]): Record<string, unknown>;
10
+ export declare function consoleWarn(...warn: unknown[]): void;
11
+ export declare function consoleInfo(...info: unknown[]): void;
12
+ export declare function consoleError(...error: unknown[]): void;
13
+ export declare function indexToLetters(index: number): string;
14
+ export declare function lettersToIndex(index: string): number;
15
+ export declare function getProblemJudgeKey(judge: Judge, key: string): string;
16
+ /**
17
+ * https://stackoverflow.com/questions/10420352/converting-file-size-in-bytes-to-human-readable-string
18
+ * Format bytes as human-readable text.
19
+ *
20
+ * @param bytes Number of bytes.
21
+ * @param si True to use metric (SI) units, aka powers of 1000. False to use
22
+ * binary (IEC), aka powers of 1024.
23
+ * @param dp Number of decimal places to display.
24
+ *
25
+ * @return Formatted string.
26
+ */
27
+ export declare function humanFileSize(bytes: number, si?: boolean, dp?: number): string;
28
+ export declare function stringToArrayBuffer(str: string): ArrayBuffer;
29
+ export declare function chunkString(str: string, size: number): string[];
30
+ export declare function getRandomString(length: number): string;
31
+ export declare function join(array: (string | null | Date)[]): string;
32
+ export declare function split(text: string): string[];
33
+ export declare const areArraysDifferent: <T>(a: T[], b: T[]) => boolean;
@@ -0,0 +1,191 @@
1
+ import { SEPARATOR_TOKEN, UPPERCASE_LETTERS } from '../constants/commons.js';
2
+ export function isStringJson(str) {
3
+ try {
4
+ if (typeof str === 'string') {
5
+ JSON.parse(str);
6
+ return true;
7
+ }
8
+ }
9
+ catch {
10
+ return false;
11
+ }
12
+ return false;
13
+ }
14
+ export function safeJsonParse(str) {
15
+ try {
16
+ if (typeof str === 'string') {
17
+ return JSON.parse(str);
18
+ }
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ return null;
24
+ }
25
+ export function isObjectJson(obj) {
26
+ try {
27
+ return typeof JSON.stringify(obj) === 'string';
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ }
33
+ export function mex(array) {
34
+ let i = 0;
35
+ while (array.indexOf(i) !== -1) {
36
+ i++;
37
+ }
38
+ return i;
39
+ }
40
+ export function range(start, end) {
41
+ const result = [];
42
+ for (let i = start; i < end; i++) {
43
+ result.push(i);
44
+ }
45
+ return result;
46
+ }
47
+ export async function getPlainText(url) {
48
+ return await fetch(url)
49
+ .then((data) => data.text())
50
+ .catch((error) => {
51
+ console.error('ERROR:', error);
52
+ return '';
53
+ });
54
+ }
55
+ function mergeRecords(b, u) {
56
+ const mergeKeys = new Set([...Object.keys(b), ...Object.keys(u)]);
57
+ for (const key of mergeKeys) {
58
+ if (u[key] !== null && u[key] !== undefined && b[key] !== u[key]) {
59
+ b[key] = objectUpdate(b[key], u[key]);
60
+ }
61
+ }
62
+ return b;
63
+ }
64
+ export function objectUpdate(base, update) {
65
+ if (JSON.stringify(base) === JSON.stringify(update)) {
66
+ return base;
67
+ }
68
+ if (base !== null && update !== null && !Array.isArray(base) && typeof base === 'object' && typeof update === 'object') {
69
+ return mergeRecords(base, update);
70
+ }
71
+ if (update !== null && update !== undefined) {
72
+ return update;
73
+ }
74
+ return base;
75
+ }
76
+ export function objectsUpdate(base, ...objects) {
77
+ let newObject = { ...base };
78
+ for (const update of objects) {
79
+ newObject = objectUpdate(newObject, update);
80
+ }
81
+ return newObject;
82
+ }
83
+ export function consoleWarn(...warn) {
84
+ console.warn(new Date().toLocaleString(), ...warn);
85
+ }
86
+ export function consoleInfo(...info) {
87
+ console.info(new Date().toLocaleString(), ...info);
88
+ }
89
+ export function consoleError(...error) {
90
+ console.error(new Date().toLocaleString(), ...error);
91
+ }
92
+ export function indexToLetters(index) {
93
+ const d = Math.ceil(index / 26);
94
+ if (d === 1) {
95
+ return UPPERCASE_LETTERS.charAt(index - 1);
96
+ }
97
+ return UPPERCASE_LETTERS.charAt(d - 2) + UPPERCASE_LETTERS.charAt(index - 26 * (d - 1) - 1);
98
+ }
99
+ export function lettersToIndex(index) {
100
+ if (index.length) {
101
+ if (index.length === 1) {
102
+ const d = UPPERCASE_LETTERS.indexOf(index);
103
+ if (d !== -1) {
104
+ return d + 1;
105
+ }
106
+ }
107
+ else if (index.length === 2) {
108
+ const a = index.charAt(0);
109
+ const b = index.charAt(1);
110
+ const numA = lettersToIndex(a);
111
+ const numB = lettersToIndex(b);
112
+ return numA * 26 + numB;
113
+ }
114
+ }
115
+ return 0;
116
+ }
117
+ export function getProblemJudgeKey(judge, key) {
118
+ return `${judge}-${key}`;
119
+ }
120
+ /**
121
+ * https://stackoverflow.com/questions/10420352/converting-file-size-in-bytes-to-human-readable-string
122
+ * Format bytes as human-readable text.
123
+ *
124
+ * @param bytes Number of bytes.
125
+ * @param si True to use metric (SI) units, aka powers of 1000. False to use
126
+ * binary (IEC), aka powers of 1024.
127
+ * @param dp Number of decimal places to display.
128
+ *
129
+ * @return Formatted string.
130
+ */
131
+ export function humanFileSize(bytes, si = false, dp = 1) {
132
+ const thresh = si ? 1000 : 1024;
133
+ if (Math.abs(bytes) < thresh) {
134
+ return `${bytes} B`;
135
+ }
136
+ const units = si
137
+ ? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
138
+ : ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];
139
+ let u = -1;
140
+ let value = bytes;
141
+ const r = 10 ** dp;
142
+ do {
143
+ value /= thresh;
144
+ ++u;
145
+ } while (Math.round(Math.abs(value) * r) / r >= thresh && u < units.length - 1);
146
+ return `${value.toFixed(dp)} ${units[u]}`;
147
+ }
148
+ export function stringToArrayBuffer(str) {
149
+ const buf = new ArrayBuffer(str.length); //convert str to arrayBuffer
150
+ const view = new Uint8Array(buf); //create Uint8Array as viewer
151
+ for (let i = 0; i < str.length; i++) {
152
+ view[i] = str.charCodeAt(i) & 0xff; //convert to octet
153
+ }
154
+ return buf;
155
+ }
156
+ export function chunkString(str, size) {
157
+ const numChunks = Math.ceil(str.length / size);
158
+ const chunks = new Array(numChunks);
159
+ for (let i = 0, o = 0; i < numChunks; ++i, o += size) {
160
+ chunks[i] = str.substr(o, size);
161
+ }
162
+ return chunks;
163
+ }
164
+ export function getRandomString(length) {
165
+ const charset = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; // 62
166
+ let retVal = '';
167
+ for (let i = 0; i < length; ++i) {
168
+ retVal += charset.charAt(Math.floor(Math.random() * charset.length));
169
+ }
170
+ return retVal;
171
+ }
172
+ export function join(array) {
173
+ return array.join(SEPARATOR_TOKEN);
174
+ }
175
+ export function split(text) {
176
+ return text.split(SEPARATOR_TOKEN);
177
+ }
178
+ export const areArraysDifferent = (a, b) => {
179
+ if (a === b) {
180
+ return false;
181
+ }
182
+ if (a.length !== b.length) {
183
+ return true;
184
+ }
185
+ for (let i = 0; i < b.length; i += 1) {
186
+ if (b[i] !== a[i]) {
187
+ return true;
188
+ }
189
+ }
190
+ return false;
191
+ };
@@ -0,0 +1,5 @@
1
+ import type { ContestSettings } from '../types/index.js';
2
+ export declare const isEndlessContest: (settings: Pick<ContestSettings, "startTimestamp" | "frozenTimestamp" | "quietTimestamp" | "endTimestamp" | "penalty"> | undefined) => boolean;
3
+ export declare const isGlobalContest: (settings: Pick<ContestSettings, "startTimestamp" | "frozenTimestamp" | "quietTimestamp" | "endTimestamp" | "penalty"> | undefined) => boolean;
4
+ export declare const isPastContest: (settings: Pick<ContestSettings, "endTimestamp"> | undefined) => boolean;
5
+ export declare const isFutureContest: (settings: Pick<ContestSettings, "startTimestamp"> | undefined) => boolean;
@@ -0,0 +1,21 @@
1
+ import { MAX_DATE, MIN_DATE } from '../constants/index.js';
2
+ export const isEndlessContest = (settings) => {
3
+ return (settings?.startTimestamp === MIN_DATE.getTime() &&
4
+ settings?.frozenTimestamp === MAX_DATE.getTime() &&
5
+ settings?.quietTimestamp === MAX_DATE.getTime() &&
6
+ settings?.endTimestamp === MAX_DATE.getTime() &&
7
+ settings?.penalty === 0);
8
+ };
9
+ export const isGlobalContest = (settings) => {
10
+ return (settings?.startTimestamp === 0 &&
11
+ settings?.frozenTimestamp === 0 &&
12
+ settings?.quietTimestamp === 0 &&
13
+ settings?.endTimestamp === 0 &&
14
+ settings?.penalty === 0);
15
+ };
16
+ export const isPastContest = (settings) => {
17
+ return Date.now() > (settings?.endTimestamp ?? 0);
18
+ };
19
+ export const isFutureContest = (settings) => {
20
+ return (settings?.startTimestamp ?? 0) > Date.now();
21
+ };
@@ -0,0 +1,14 @@
1
+ import type { EntityMembersDTO, EntityMembersResponseDTO } from '../dto/index.js';
2
+ import { EntityAccess, type EntityMembers, type EntityTeamsMemberUserData, type EntityUsersMemberUserData } from '../types/index.js';
3
+ export declare const getDocumentAccess: (document: {
4
+ members: Pick<EntityMembers, "rankAdministrators" | "rankManagers" | "rankGuests" | "rankSpectators" | "rankParticipants">;
5
+ } | undefined) => EntityAccess;
6
+ export declare const isUserMember: (member: {
7
+ userId?: string;
8
+ teamId?: string;
9
+ }) => member is EntityUsersMemberUserData;
10
+ export declare const isTeamMember: (member: {
11
+ userId?: string;
12
+ teamId?: string;
13
+ }) => member is EntityTeamsMemberUserData;
14
+ export declare const toEntityMembersDTO: (members: EntityMembersResponseDTO) => EntityMembersDTO;
@@ -0,0 +1,38 @@
1
+ import { EntityAccess, EntityMembersRank, } from '../types/index.js';
2
+ export const getDocumentAccess = (document) => {
3
+ const members = document?.members;
4
+ const adminRank = members?.rankAdministrators;
5
+ const adminClosed = adminRank === EntityMembersRank.NONE || adminRank === EntityMembersRank.CLOSE;
6
+ if (!adminClosed)
7
+ return EntityAccess.PRIVATE;
8
+ const spectatorsOpen = members?.rankSpectators === EntityMembersRank.OPEN;
9
+ const managersOpen = members?.rankManagers === EntityMembersRank.OPEN;
10
+ const managersClose = members?.rankManagers === EntityMembersRank.CLOSE;
11
+ if (spectatorsOpen && managersOpen)
12
+ return EntityAccess.EXPOSED;
13
+ if (spectatorsOpen && managersClose)
14
+ return EntityAccess.PUBLIC;
15
+ if (managersClose)
16
+ return EntityAccess.RESTRICTED;
17
+ return EntityAccess.PRIVATE;
18
+ };
19
+ export const isUserMember = (member) => {
20
+ return typeof member.userId === 'string';
21
+ };
22
+ export const isTeamMember = (member) => {
23
+ return typeof member.teamId === 'string';
24
+ };
25
+ export const toEntityMembersDTO = (members) => {
26
+ return {
27
+ rankAdministrators: members.rankAdministrators,
28
+ administrators: Object.keys(members.administrators),
29
+ rankManagers: members.rankManagers,
30
+ managers: Object.keys(members.managers),
31
+ rankParticipants: members.rankParticipants,
32
+ participants: Object.keys(members.participants),
33
+ rankGuests: members.rankGuests,
34
+ guests: Object.keys(members.guests),
35
+ rankSpectators: members.rankSpectators,
36
+ spectators: Object.keys(members.spectators),
37
+ };
38
+ };
@@ -0,0 +1 @@
1
+ export declare function removeExtension(fileName: string): string;
@@ -0,0 +1,4 @@
1
+ export function removeExtension(fileName) {
2
+ const i = fileName.lastIndexOf('.');
3
+ return i !== -1 ? fileName.substring(0, i) : fileName;
4
+ }
@@ -0,0 +1,14 @@
1
+ export * from './class.js';
2
+ export * from './comments.js';
3
+ export * from './commons.js';
4
+ export * from './contest.js';
5
+ export * from './document.js';
6
+ export * from './file.js';
7
+ export * from './interval.js';
8
+ export * from './judging.js';
9
+ export * from './object.js';
10
+ export * from './responses.js';
11
+ export * from './socket.js';
12
+ export * from './time.js';
13
+ export * from './user.js';
14
+ export * from './worksheet.js';
@@ -0,0 +1,14 @@
1
+ export * from './class.js';
2
+ export * from './comments.js';
3
+ export * from './commons.js';
4
+ export * from './contest.js';
5
+ export * from './document.js';
6
+ export * from './file.js';
7
+ export * from './interval.js';
8
+ export * from './judging.js';
9
+ export * from './object.js';
10
+ export * from './responses.js';
11
+ export * from './socket.js';
12
+ export * from './time.js';
13
+ export * from './user.js';
14
+ export * from './worksheet.js';
@@ -0,0 +1,2 @@
1
+ export declare const setAsyncInterval: (cb: () => Promise<void> | void, interval: number) => number;
2
+ export declare const clearAsyncInterval: (intervalIndex: number) => void;
@@ -0,0 +1,22 @@
1
+ // https://dev.to/jsmccrumb/asynchronous-setinterval-4j69
2
+ const asyncIntervals = [];
3
+ const runAsyncInterval = async (cb, interval, intervalIndex) => {
4
+ await cb();
5
+ if (asyncIntervals[intervalIndex]) {
6
+ setTimeout(() => runAsyncInterval(cb, interval, intervalIndex), interval);
7
+ }
8
+ };
9
+ export const setAsyncInterval = (cb, interval) => {
10
+ if (cb) {
11
+ const intervalIndex = asyncIntervals.length;
12
+ asyncIntervals.push(true);
13
+ void runAsyncInterval(cb, interval, intervalIndex);
14
+ return intervalIndex;
15
+ }
16
+ throw new Error('Callback must be a function');
17
+ };
18
+ export const clearAsyncInterval = (intervalIndex) => {
19
+ if (asyncIntervals[intervalIndex]) {
20
+ asyncIntervals[intervalIndex] = false;
21
+ }
22
+ };
@@ -0,0 +1,25 @@
1
+ import { ProblemVerdict } from '../prisma/enums/index.js';
2
+ import type { CodeEditorTestCase, DataLog, SubmissionTestCase, TestCaseVerdict } from '../types/index.js';
3
+ export declare const getDataOfTestCase: (testCase: SubmissionTestCase, timeLimit: number, memoryLimit: number) => {
4
+ compilationError: boolean;
5
+ timeUsed: number;
6
+ timeLimitExceeded: boolean;
7
+ memoryUsed: number;
8
+ memoryLimitExceeded: boolean;
9
+ exitCode: number;
10
+ runtimeError: boolean;
11
+ failed: boolean;
12
+ };
13
+ export declare const getVerdictFromTestCase: (testCaseValue: CodeEditorTestCase, timeLimit: number, memoryLimit: number) => {
14
+ verdict: ProblemVerdict;
15
+ timeUsed: number;
16
+ memoryUsed: number;
17
+ exitCode: number;
18
+ };
19
+ export declare const mergeVerdicts: (first: TestCaseVerdict, second: TestCaseVerdict) => {
20
+ timeUsed: number;
21
+ memoryUsed: number;
22
+ exitCode: number;
23
+ verdict: ProblemVerdict;
24
+ };
25
+ export declare const getDataLog: (log: unknown) => DataLog;
@@ -0,0 +1,107 @@
1
+ import { ProblemVerdict, SubmissionRunStatus } from '../prisma/enums/index.js';
2
+ export const getDataOfTestCase = (testCase, timeLimit, memoryLimit) => {
3
+ const { timeUsed, memoryUsed, exitCode } = getDataLog(testCase?.log);
4
+ const timeLimitExceeded = timeUsed > timeLimit;
5
+ const memoryLimitExceeded = memoryUsed > memoryLimit;
6
+ const runtimeError = exitCode !== 0;
7
+ const compilationError = testCase?.status === SubmissionRunStatus.COMPILATION_ERROR;
8
+ return {
9
+ compilationError,
10
+ timeUsed,
11
+ timeLimitExceeded: timeLimitExceeded,
12
+ memoryUsed,
13
+ memoryLimitExceeded: memoryLimitExceeded,
14
+ exitCode,
15
+ runtimeError,
16
+ failed: !!testCase?.log && (timeLimitExceeded || memoryLimitExceeded || runtimeError),
17
+ };
18
+ };
19
+ function classifyOutput(testCaseValue) {
20
+ if (testCaseValue.out === testCaseValue.testOut)
21
+ return ProblemVerdict.AC;
22
+ const normalize = (s) => s.replaceAll(' ', '').replaceAll('\n', '');
23
+ if (normalize(testCaseValue.out) === normalize(testCaseValue.testOut)) {
24
+ return testCaseValue.withPE ? ProblemVerdict.PE : ProblemVerdict.AC;
25
+ }
26
+ return ProblemVerdict.WA;
27
+ }
28
+ function determineVerdict(testCaseValue, compilationError, timeLimitExceeded, memoryLimitExceeded, runtimeError) {
29
+ if (compilationError)
30
+ return ProblemVerdict.CE;
31
+ if (timeLimitExceeded)
32
+ return ProblemVerdict.TLE;
33
+ if (memoryLimitExceeded)
34
+ return ProblemVerdict.MLE;
35
+ if (runtimeError)
36
+ return ProblemVerdict.RE;
37
+ return classifyOutput(testCaseValue);
38
+ }
39
+ export const getVerdictFromTestCase = (testCaseValue, timeLimit, memoryLimit) => {
40
+ const { compilationError, timeLimitExceeded, memoryLimitExceeded, runtimeError, timeUsed, memoryUsed, exitCode } = getDataOfTestCase(testCaseValue, timeLimit, memoryLimit);
41
+ return {
42
+ verdict: determineVerdict(testCaseValue, compilationError, timeLimitExceeded, memoryLimitExceeded, runtimeError),
43
+ timeUsed,
44
+ memoryUsed,
45
+ exitCode,
46
+ };
47
+ };
48
+ const VERDICT_PRIORITY = [
49
+ ProblemVerdict.RE,
50
+ ProblemVerdict.TLE,
51
+ ProblemVerdict.MLE,
52
+ ProblemVerdict.WA,
53
+ ProblemVerdict.PE,
54
+ ProblemVerdict.PA,
55
+ ProblemVerdict.AC,
56
+ ];
57
+ export const mergeVerdicts = (first, second) => {
58
+ const firstRank = VERDICT_PRIORITY.indexOf(first.verdict);
59
+ const secondRank = VERDICT_PRIORITY.indexOf(second.verdict);
60
+ const verdict = secondRank !== -1 && (firstRank === -1 || secondRank < firstRank) ? second.verdict : first.verdict;
61
+ return {
62
+ timeUsed: Math.max(first.timeUsed, second.timeUsed),
63
+ memoryUsed: Math.max(first.memoryUsed, second.memoryUsed),
64
+ exitCode: first.exitCode || second.exitCode,
65
+ verdict,
66
+ };
67
+ };
68
+ function parseLineValue(line, prefix) {
69
+ return parseInt(line.slice(prefix.length + 1), 10);
70
+ }
71
+ function parseStructuredLog(lines) {
72
+ let timeUsed = 0;
73
+ let memoryUsed = 0;
74
+ let exitCode = -1;
75
+ for (const line of lines) {
76
+ if (line.startsWith('time:')) {
77
+ timeUsed = (Number.isNaN(+line.split(':')[1]) ? 0 : +line.split(':')[1]) * 1000;
78
+ }
79
+ else if (line.startsWith('max-rss:')) {
80
+ memoryUsed = parseLineValue(line, 'max-rss');
81
+ }
82
+ else if (line.startsWith('exitcode:')) {
83
+ exitCode = parseLineValue(line, 'exitcode');
84
+ }
85
+ }
86
+ return { timeUsed, memoryUsed, exitCode };
87
+ }
88
+ function parseLegacyLog(lines) {
89
+ return {
90
+ timeUsed: +lines[0],
91
+ memoryUsed: +lines[1],
92
+ exitCode: +lines[2],
93
+ };
94
+ }
95
+ export const getDataLog = (log) => {
96
+ const lines = log?.split?.('\n') ?? [];
97
+ const raw = lines.length > 4
98
+ ? parseStructuredLog(lines)
99
+ : lines.length >= 3
100
+ ? parseLegacyLog(lines)
101
+ : { timeUsed: 0, memoryUsed: 0, exitCode: -1 };
102
+ return {
103
+ timeUsed: Number.isNaN(raw.timeUsed) ? 0 : raw.timeUsed,
104
+ memoryUsed: Number.isNaN(raw.memoryUsed) ? 0 : raw.memoryUsed,
105
+ exitCode: Number.isNaN(raw.exitCode) ? -1 : raw.exitCode,
106
+ };
107
+ };
@@ -0,0 +1 @@
1
+ export declare function memorySizeOf(obj: unknown): number;