@aibrains/shared-types 0.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 (158) hide show
  1. package/README.md +170 -0
  2. package/dist/index.d.ts +48 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +74 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/mappers/edfi/calendar.mapper.d.ts +158 -0
  7. package/dist/mappers/edfi/calendar.mapper.d.ts.map +1 -0
  8. package/dist/mappers/edfi/calendar.mapper.js +235 -0
  9. package/dist/mappers/edfi/calendar.mapper.js.map +1 -0
  10. package/dist/mappers/edfi/credential.mapper.d.ts +50 -0
  11. package/dist/mappers/edfi/credential.mapper.d.ts.map +1 -0
  12. package/dist/mappers/edfi/credential.mapper.js +123 -0
  13. package/dist/mappers/edfi/credential.mapper.js.map +1 -0
  14. package/dist/mappers/edfi/index.d.ts +10 -0
  15. package/dist/mappers/edfi/index.d.ts.map +1 -0
  16. package/dist/mappers/edfi/index.js +26 -0
  17. package/dist/mappers/edfi/index.js.map +1 -0
  18. package/dist/mappers/edfi/staff.mapper.d.ts +96 -0
  19. package/dist/mappers/edfi/staff.mapper.d.ts.map +1 -0
  20. package/dist/mappers/edfi/staff.mapper.js +138 -0
  21. package/dist/mappers/edfi/staff.mapper.js.map +1 -0
  22. package/dist/mappers/index.d.ts +7 -0
  23. package/dist/mappers/index.d.ts.map +1 -0
  24. package/dist/mappers/index.js +23 -0
  25. package/dist/mappers/index.js.map +1 -0
  26. package/dist/schemas/academics/assignment.schema.d.ts +1463 -0
  27. package/dist/schemas/academics/assignment.schema.d.ts.map +1 -0
  28. package/dist/schemas/academics/assignment.schema.js +195 -0
  29. package/dist/schemas/academics/assignment.schema.js.map +1 -0
  30. package/dist/schemas/academics/attendance.schema.d.ts +762 -0
  31. package/dist/schemas/academics/attendance.schema.d.ts.map +1 -0
  32. package/dist/schemas/academics/attendance.schema.js +250 -0
  33. package/dist/schemas/academics/attendance.schema.js.map +1 -0
  34. package/dist/schemas/academics/classroom.schema.d.ts +742 -0
  35. package/dist/schemas/academics/classroom.schema.d.ts.map +1 -0
  36. package/dist/schemas/academics/classroom.schema.js +164 -0
  37. package/dist/schemas/academics/classroom.schema.js.map +1 -0
  38. package/dist/schemas/academics/course-section.schema.d.ts +388 -0
  39. package/dist/schemas/academics/course-section.schema.d.ts.map +1 -0
  40. package/dist/schemas/academics/course-section.schema.js +128 -0
  41. package/dist/schemas/academics/course-section.schema.js.map +1 -0
  42. package/dist/schemas/academics/course.schema.d.ts +778 -0
  43. package/dist/schemas/academics/course.schema.d.ts.map +1 -0
  44. package/dist/schemas/academics/course.schema.js +207 -0
  45. package/dist/schemas/academics/course.schema.js.map +1 -0
  46. package/dist/schemas/academics/grade.schema.d.ts +848 -0
  47. package/dist/schemas/academics/grade.schema.d.ts.map +1 -0
  48. package/dist/schemas/academics/grade.schema.js +251 -0
  49. package/dist/schemas/academics/grade.schema.js.map +1 -0
  50. package/dist/schemas/academics/index.d.ts +13 -0
  51. package/dist/schemas/academics/index.d.ts.map +1 -0
  52. package/dist/schemas/academics/index.js +29 -0
  53. package/dist/schemas/academics/index.js.map +1 -0
  54. package/dist/schemas/academics/student.schema.d.ts +2891 -0
  55. package/dist/schemas/academics/student.schema.d.ts.map +1 -0
  56. package/dist/schemas/academics/student.schema.js +249 -0
  57. package/dist/schemas/academics/student.schema.js.map +1 -0
  58. package/dist/schemas/common.d.ts +183 -0
  59. package/dist/schemas/common.d.ts.map +1 -0
  60. package/dist/schemas/common.js +126 -0
  61. package/dist/schemas/common.js.map +1 -0
  62. package/dist/schemas/enrollment/enrollment.schema.d.ts +2799 -0
  63. package/dist/schemas/enrollment/enrollment.schema.d.ts.map +1 -0
  64. package/dist/schemas/enrollment/enrollment.schema.js +435 -0
  65. package/dist/schemas/enrollment/enrollment.schema.js.map +1 -0
  66. package/dist/schemas/enrollment/index.d.ts +7 -0
  67. package/dist/schemas/enrollment/index.d.ts.map +1 -0
  68. package/dist/schemas/enrollment/index.js +23 -0
  69. package/dist/schemas/enrollment/index.js.map +1 -0
  70. package/dist/schemas/identity/academic-year.schema.d.ts +546 -0
  71. package/dist/schemas/identity/academic-year.schema.d.ts.map +1 -0
  72. package/dist/schemas/identity/academic-year.schema.js +137 -0
  73. package/dist/schemas/identity/academic-year.schema.js.map +1 -0
  74. package/dist/schemas/identity/auth.schema.d.ts +670 -0
  75. package/dist/schemas/identity/auth.schema.d.ts.map +1 -0
  76. package/dist/schemas/identity/auth.schema.js +126 -0
  77. package/dist/schemas/identity/auth.schema.js.map +1 -0
  78. package/dist/schemas/identity/bell-schedule.schema.d.ts +630 -0
  79. package/dist/schemas/identity/bell-schedule.schema.d.ts.map +1 -0
  80. package/dist/schemas/identity/bell-schedule.schema.js +143 -0
  81. package/dist/schemas/identity/bell-schedule.schema.js.map +1 -0
  82. package/dist/schemas/identity/calendar-date.schema.d.ts +830 -0
  83. package/dist/schemas/identity/calendar-date.schema.d.ts.map +1 -0
  84. package/dist/schemas/identity/calendar-date.schema.js +208 -0
  85. package/dist/schemas/identity/calendar-date.schema.js.map +1 -0
  86. package/dist/schemas/identity/credential.schema.d.ts +472 -0
  87. package/dist/schemas/identity/credential.schema.d.ts.map +1 -0
  88. package/dist/schemas/identity/credential.schema.js +200 -0
  89. package/dist/schemas/identity/credential.schema.js.map +1 -0
  90. package/dist/schemas/identity/department.schema.d.ts +567 -0
  91. package/dist/schemas/identity/department.schema.d.ts.map +1 -0
  92. package/dist/schemas/identity/department.schema.js +113 -0
  93. package/dist/schemas/identity/department.schema.js.map +1 -0
  94. package/dist/schemas/identity/index.d.ts +21 -0
  95. package/dist/schemas/identity/index.d.ts.map +1 -0
  96. package/dist/schemas/identity/index.js +39 -0
  97. package/dist/schemas/identity/index.js.map +1 -0
  98. package/dist/schemas/identity/leave.schema.d.ts +725 -0
  99. package/dist/schemas/identity/leave.schema.d.ts.map +1 -0
  100. package/dist/schemas/identity/leave.schema.js +204 -0
  101. package/dist/schemas/identity/leave.schema.js.map +1 -0
  102. package/dist/schemas/identity/role.schema.d.ts +356 -0
  103. package/dist/schemas/identity/role.schema.d.ts.map +1 -0
  104. package/dist/schemas/identity/role.schema.js +124 -0
  105. package/dist/schemas/identity/role.schema.js.map +1 -0
  106. package/dist/schemas/identity/school-year.schema.d.ts +303 -0
  107. package/dist/schemas/identity/school-year.schema.d.ts.map +1 -0
  108. package/dist/schemas/identity/school-year.schema.js +59 -0
  109. package/dist/schemas/identity/school-year.schema.js.map +1 -0
  110. package/dist/schemas/identity/school.schema.d.ts +844 -0
  111. package/dist/schemas/identity/school.schema.d.ts.map +1 -0
  112. package/dist/schemas/identity/school.schema.js +139 -0
  113. package/dist/schemas/identity/school.schema.js.map +1 -0
  114. package/dist/schemas/identity/security.schema.d.ts +422 -0
  115. package/dist/schemas/identity/security.schema.d.ts.map +1 -0
  116. package/dist/schemas/identity/security.schema.js +151 -0
  117. package/dist/schemas/identity/security.schema.js.map +1 -0
  118. package/dist/schemas/identity/session.schema.d.ts +193 -0
  119. package/dist/schemas/identity/session.schema.d.ts.map +1 -0
  120. package/dist/schemas/identity/session.schema.js +59 -0
  121. package/dist/schemas/identity/session.schema.js.map +1 -0
  122. package/dist/schemas/identity/staff.schema.d.ts +1037 -0
  123. package/dist/schemas/identity/staff.schema.d.ts.map +1 -0
  124. package/dist/schemas/identity/staff.schema.js +251 -0
  125. package/dist/schemas/identity/staff.schema.js.map +1 -0
  126. package/dist/schemas/identity/tenant.schema.d.ts +313 -0
  127. package/dist/schemas/identity/tenant.schema.d.ts.map +1 -0
  128. package/dist/schemas/identity/tenant.schema.js +81 -0
  129. package/dist/schemas/identity/tenant.schema.js.map +1 -0
  130. package/dist/schemas/identity/user.schema.d.ts +921 -0
  131. package/dist/schemas/identity/user.schema.d.ts.map +1 -0
  132. package/dist/schemas/identity/user.schema.js +201 -0
  133. package/dist/schemas/identity/user.schema.js.map +1 -0
  134. package/dist/schemas/index.d.ts +10 -0
  135. package/dist/schemas/index.d.ts.map +1 -0
  136. package/dist/schemas/index.js +26 -0
  137. package/dist/schemas/index.js.map +1 -0
  138. package/dist/validators/academic-year.d.ts +90 -0
  139. package/dist/validators/academic-year.d.ts.map +1 -0
  140. package/dist/validators/academic-year.js +190 -0
  141. package/dist/validators/academic-year.js.map +1 -0
  142. package/dist/validators/date-range.d.ts +142 -0
  143. package/dist/validators/date-range.d.ts.map +1 -0
  144. package/dist/validators/date-range.js +170 -0
  145. package/dist/validators/date-range.js.map +1 -0
  146. package/dist/validators/grade-level.d.ts +80 -0
  147. package/dist/validators/grade-level.d.ts.map +1 -0
  148. package/dist/validators/grade-level.js +157 -0
  149. package/dist/validators/grade-level.js.map +1 -0
  150. package/dist/validators/index.d.ts +10 -0
  151. package/dist/validators/index.d.ts.map +1 -0
  152. package/dist/validators/index.js +26 -0
  153. package/dist/validators/index.js.map +1 -0
  154. package/dist/validators/password.d.ts +60 -0
  155. package/dist/validators/password.d.ts.map +1 -0
  156. package/dist/validators/password.js +81 -0
  157. package/dist/validators/password.js.map +1 -0
  158. package/package.json +50 -0
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Date Range Validators
3
+ *
4
+ * Zod schemas and utilities for date validation.
5
+ */
6
+ import { z } from 'zod';
7
+ export { dateSchema } from '../schemas/common';
8
+ /**
9
+ * ISO 8601 datetime string (re-export from common as alias)
10
+ */
11
+ export declare const datetimeSchema: z.ZodString;
12
+ export declare const dateRangeSchema: z.ZodEffects<z.ZodObject<{
13
+ startDate: z.ZodEffects<z.ZodString, string, string>;
14
+ endDate: z.ZodEffects<z.ZodString, string, string>;
15
+ }, "strip", z.ZodTypeAny, {
16
+ startDate: string;
17
+ endDate: string;
18
+ }, {
19
+ startDate: string;
20
+ endDate: string;
21
+ }>, {
22
+ startDate: string;
23
+ endDate: string;
24
+ }, {
25
+ startDate: string;
26
+ endDate: string;
27
+ }>;
28
+ export type DateRange = z.infer<typeof dateRangeSchema>;
29
+ /**
30
+ * Academic year must be between 120 and 365 days
31
+ */
32
+ export declare const academicYearDateRangeSchema: z.ZodEffects<z.ZodEffects<z.ZodObject<{
33
+ startDate: z.ZodEffects<z.ZodString, string, string>;
34
+ endDate: z.ZodEffects<z.ZodString, string, string>;
35
+ }, "strip", z.ZodTypeAny, {
36
+ startDate: string;
37
+ endDate: string;
38
+ }, {
39
+ startDate: string;
40
+ endDate: string;
41
+ }>, {
42
+ startDate: string;
43
+ endDate: string;
44
+ }, {
45
+ startDate: string;
46
+ endDate: string;
47
+ }>, {
48
+ startDate: string;
49
+ endDate: string;
50
+ }, {
51
+ startDate: string;
52
+ endDate: string;
53
+ }>;
54
+ export type AcademicYearDateRange = z.infer<typeof academicYearDateRangeSchema>;
55
+ /**
56
+ * Grading period must be between 7 and 180 days
57
+ */
58
+ export declare const gradingPeriodDateRangeSchema: z.ZodEffects<z.ZodEffects<z.ZodObject<{
59
+ startDate: z.ZodEffects<z.ZodString, string, string>;
60
+ endDate: z.ZodEffects<z.ZodString, string, string>;
61
+ }, "strip", z.ZodTypeAny, {
62
+ startDate: string;
63
+ endDate: string;
64
+ }, {
65
+ startDate: string;
66
+ endDate: string;
67
+ }>, {
68
+ startDate: string;
69
+ endDate: string;
70
+ }, {
71
+ startDate: string;
72
+ endDate: string;
73
+ }>, {
74
+ startDate: string;
75
+ endDate: string;
76
+ }, {
77
+ startDate: string;
78
+ endDate: string;
79
+ }>;
80
+ export type GradingPeriodDateRange = z.infer<typeof gradingPeriodDateRangeSchema>;
81
+ /**
82
+ * Parse a YYYY-MM-DD string to a Date object
83
+ */
84
+ export declare function parseDate(dateString: string): Date;
85
+ /**
86
+ * Format a Date object to YYYY-MM-DD string
87
+ */
88
+ export declare function formatDate(date: Date): string;
89
+ /**
90
+ * Calculate the number of days between two dates
91
+ */
92
+ export declare function daysBetween(startDate: string, endDate: string): number;
93
+ /**
94
+ * Check if a date falls within a date range (inclusive)
95
+ */
96
+ export declare function isDateInRange(date: string, range: {
97
+ startDate: string;
98
+ endDate: string;
99
+ }): boolean;
100
+ /**
101
+ * Check if two date ranges overlap
102
+ */
103
+ export declare function doRangesOverlap(range1: {
104
+ startDate: string;
105
+ endDate: string;
106
+ }, range2: {
107
+ startDate: string;
108
+ endDate: string;
109
+ }): boolean;
110
+ /**
111
+ * Get today's date in YYYY-MM-DD format
112
+ */
113
+ export declare function getTodayString(): string;
114
+ /**
115
+ * Check if a date is in the past
116
+ */
117
+ export declare function isDateInPast(dateString: string): boolean;
118
+ /**
119
+ * Check if a date is in the future
120
+ */
121
+ export declare function isDateInFuture(dateString: string): boolean;
122
+ /**
123
+ * Add days to a date string
124
+ */
125
+ export declare function addDays(dateString: string, days: number): string;
126
+ /**
127
+ * Get the start and end dates for an academic year given a start month and year
128
+ */
129
+ export declare function getAcademicYearDates(startYear: number, startMonth?: number, // August by default
130
+ durationMonths?: number): {
131
+ startDate: string;
132
+ endDate: string;
133
+ };
134
+ /**
135
+ * Generate grading period dates for an academic year
136
+ */
137
+ export declare function generateGradingPeriods(academicYearStart: string, academicYearEnd: string, periodsCount: number): Array<{
138
+ startDate: string;
139
+ endDate: string;
140
+ periodNumber: number;
141
+ }>;
142
+ //# sourceMappingURL=date-range.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-range.d.ts","sourceRoot":"","sources":["../../src/validators/date-range.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C;;GAEG;AACH,eAAO,MAAM,cAAc,aAAgB,CAAC;AAM5C,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;EAM3B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAMxD;;GAEG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;EAQvC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAMhF;;GAEG;AACH,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;EAQxC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAMlF;;GAEG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAElD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAE7C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAItE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC5C,OAAO,CAMT;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAC9C,MAAM,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC7C,OAAO,CAOT;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAKxD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAK1D;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAIhE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,UAAU,GAAE,MAAU,EAAE,oBAAoB;AAC5C,cAAc,GAAE,MAAW,GAC1B;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAQxC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,iBAAiB,EAAE,MAAM,EACzB,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,GACnB,KAAK,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAyBrE"}
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ /**
3
+ * Date Range Validators
4
+ *
5
+ * Zod schemas and utilities for date validation.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.gradingPeriodDateRangeSchema = exports.academicYearDateRangeSchema = exports.dateRangeSchema = exports.datetimeSchema = exports.dateSchema = void 0;
9
+ exports.parseDate = parseDate;
10
+ exports.formatDate = formatDate;
11
+ exports.daysBetween = daysBetween;
12
+ exports.isDateInRange = isDateInRange;
13
+ exports.doRangesOverlap = doRangesOverlap;
14
+ exports.getTodayString = getTodayString;
15
+ exports.isDateInPast = isDateInPast;
16
+ exports.isDateInFuture = isDateInFuture;
17
+ exports.addDays = addDays;
18
+ exports.getAcademicYearDates = getAcademicYearDates;
19
+ exports.generateGradingPeriods = generateGradingPeriods;
20
+ const zod_1 = require("zod");
21
+ const common_1 = require("../schemas/common");
22
+ // Re-export dateSchema from common for convenience
23
+ var common_2 = require("../schemas/common");
24
+ Object.defineProperty(exports, "dateSchema", { enumerable: true, get: function () { return common_2.dateSchema; } });
25
+ /**
26
+ * ISO 8601 datetime string (re-export from common as alias)
27
+ */
28
+ exports.datetimeSchema = common_1.isoDateSchema;
29
+ // ============================================
30
+ // Date Range Schema
31
+ // ============================================
32
+ exports.dateRangeSchema = zod_1.z.object({
33
+ startDate: common_1.dateSchema,
34
+ endDate: common_1.dateSchema,
35
+ }).refine(data => new Date(data.endDate) >= new Date(data.startDate), { message: 'End date must be on or after start date' });
36
+ // ============================================
37
+ // Academic Year Date Range Schema
38
+ // ============================================
39
+ /**
40
+ * Academic year must be between 120 and 365 days
41
+ */
42
+ exports.academicYearDateRangeSchema = exports.dateRangeSchema.refine(data => {
43
+ const start = new Date(data.startDate);
44
+ const end = new Date(data.endDate);
45
+ const days = Math.round((end.getTime() - start.getTime()) / (1000 * 60 * 60 * 24));
46
+ return days >= 120 && days <= 365;
47
+ }, { message: 'Academic year must be between 120 and 365 days' });
48
+ // ============================================
49
+ // Grading Period Date Range Schema
50
+ // ============================================
51
+ /**
52
+ * Grading period must be between 7 and 180 days
53
+ */
54
+ exports.gradingPeriodDateRangeSchema = exports.dateRangeSchema.refine(data => {
55
+ const start = new Date(data.startDate);
56
+ const end = new Date(data.endDate);
57
+ const days = Math.round((end.getTime() - start.getTime()) / (1000 * 60 * 60 * 24));
58
+ return days >= 7 && days <= 180;
59
+ }, { message: 'Grading period must be between 7 and 180 days' });
60
+ // ============================================
61
+ // Utility Functions
62
+ // ============================================
63
+ /**
64
+ * Parse a YYYY-MM-DD string to a Date object
65
+ */
66
+ function parseDate(dateString) {
67
+ return new Date(dateString + 'T00:00:00.000Z');
68
+ }
69
+ /**
70
+ * Format a Date object to YYYY-MM-DD string
71
+ */
72
+ function formatDate(date) {
73
+ return date.toISOString().split('T')[0];
74
+ }
75
+ /**
76
+ * Calculate the number of days between two dates
77
+ */
78
+ function daysBetween(startDate, endDate) {
79
+ const start = parseDate(startDate);
80
+ const end = parseDate(endDate);
81
+ return Math.round((end.getTime() - start.getTime()) / (1000 * 60 * 60 * 24));
82
+ }
83
+ /**
84
+ * Check if a date falls within a date range (inclusive)
85
+ */
86
+ function isDateInRange(date, range) {
87
+ const checkDate = parseDate(date);
88
+ const start = parseDate(range.startDate);
89
+ const end = parseDate(range.endDate);
90
+ return checkDate >= start && checkDate <= end;
91
+ }
92
+ /**
93
+ * Check if two date ranges overlap
94
+ */
95
+ function doRangesOverlap(range1, range2) {
96
+ const start1 = parseDate(range1.startDate);
97
+ const end1 = parseDate(range1.endDate);
98
+ const start2 = parseDate(range2.startDate);
99
+ const end2 = parseDate(range2.endDate);
100
+ return start1 <= end2 && end1 >= start2;
101
+ }
102
+ /**
103
+ * Get today's date in YYYY-MM-DD format
104
+ */
105
+ function getTodayString() {
106
+ return formatDate(new Date());
107
+ }
108
+ /**
109
+ * Check if a date is in the past
110
+ */
111
+ function isDateInPast(dateString) {
112
+ const date = parseDate(dateString);
113
+ const today = new Date();
114
+ today.setHours(0, 0, 0, 0);
115
+ return date < today;
116
+ }
117
+ /**
118
+ * Check if a date is in the future
119
+ */
120
+ function isDateInFuture(dateString) {
121
+ const date = parseDate(dateString);
122
+ const today = new Date();
123
+ today.setHours(0, 0, 0, 0);
124
+ return date > today;
125
+ }
126
+ /**
127
+ * Add days to a date string
128
+ */
129
+ function addDays(dateString, days) {
130
+ const date = parseDate(dateString);
131
+ date.setDate(date.getDate() + days);
132
+ return formatDate(date);
133
+ }
134
+ /**
135
+ * Get the start and end dates for an academic year given a start month and year
136
+ */
137
+ function getAcademicYearDates(startYear, startMonth = 8, // August by default
138
+ durationMonths = 10) {
139
+ const startDate = new Date(startYear, startMonth - 1, 1);
140
+ const endDate = new Date(startYear, startMonth - 1 + durationMonths, 0);
141
+ return {
142
+ startDate: formatDate(startDate),
143
+ endDate: formatDate(endDate),
144
+ };
145
+ }
146
+ /**
147
+ * Generate grading period dates for an academic year
148
+ */
149
+ function generateGradingPeriods(academicYearStart, academicYearEnd, periodsCount) {
150
+ const totalDays = daysBetween(academicYearStart, academicYearEnd);
151
+ const daysPerPeriod = Math.floor(totalDays / periodsCount);
152
+ const periods = [];
153
+ let currentStart = academicYearStart;
154
+ for (let i = 0; i < periodsCount; i++) {
155
+ const isLastPeriod = i === periodsCount - 1;
156
+ const endDate = isLastPeriod
157
+ ? academicYearEnd
158
+ : addDays(currentStart, daysPerPeriod - 1);
159
+ periods.push({
160
+ startDate: currentStart,
161
+ endDate: endDate,
162
+ periodNumber: i + 1,
163
+ });
164
+ if (!isLastPeriod) {
165
+ currentStart = addDays(endDate, 1);
166
+ }
167
+ }
168
+ return periods;
169
+ }
170
+ //# sourceMappingURL=date-range.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-range.js","sourceRoot":"","sources":["../../src/validators/date-range.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Grade Level Validators
3
+ *
4
+ * Constants and validation utilities for grade levels.
5
+ */
6
+ import { z } from 'zod';
7
+ export declare const GRADE_LEVELS: readonly ["PK", "K", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"];
8
+ export type GradeLevel = typeof GRADE_LEVELS[number];
9
+ export declare const GRADE_LEVEL_NAMES: Record<GradeLevel, string>;
10
+ export declare const ELEMENTARY_GRADES: GradeLevel[];
11
+ export declare const MIDDLE_GRADES: GradeLevel[];
12
+ export declare const HIGH_GRADES: GradeLevel[];
13
+ export type GradeLevelGroup = 'elementary' | 'middle' | 'high';
14
+ /**
15
+ * Grade level enum schema (PK, K, 1-12)
16
+ * Note: Named with Enum suffix to avoid conflict with identity/department's gradeLevelConfigSchema
17
+ */
18
+ export declare const gradeLevelEnumSchema: z.ZodEnum<["PK", "K", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]>;
19
+ /**
20
+ * Grade level range validator schema
21
+ * Used to validate that start grade is before or equal to end grade
22
+ */
23
+ export declare const gradeLevelRangeValidatorSchema: z.ZodEffects<z.ZodObject<{
24
+ start: z.ZodEnum<["PK", "K", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]>;
25
+ end: z.ZodEnum<["PK", "K", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]>;
26
+ }, "strip", z.ZodTypeAny, {
27
+ start: "PK" | "K" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12";
28
+ end: "PK" | "K" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12";
29
+ }, {
30
+ start: "PK" | "K" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12";
31
+ end: "PK" | "K" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12";
32
+ }>, {
33
+ start: "PK" | "K" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12";
34
+ end: "PK" | "K" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12";
35
+ }, {
36
+ start: "PK" | "K" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12";
37
+ end: "PK" | "K" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12";
38
+ }>;
39
+ export type GradeLevelRange = z.infer<typeof gradeLevelRangeValidatorSchema>;
40
+ /**
41
+ * Get the numeric index of a grade level for comparison
42
+ */
43
+ export declare function getGradeLevelIndex(grade: GradeLevel): number;
44
+ /**
45
+ * Check if a string is a valid grade level
46
+ */
47
+ export declare function isValidGradeLevel(grade: string): grade is GradeLevel;
48
+ /**
49
+ * Get the display name for a grade level
50
+ */
51
+ export declare function getGradeLevelDisplayName(grade: GradeLevel): string;
52
+ /**
53
+ * Get the grade level group (elementary, middle, high)
54
+ */
55
+ export declare function getGradeLevelGroup(grade: GradeLevel): GradeLevelGroup;
56
+ /**
57
+ * Compare two grade levels
58
+ * Returns negative if a < b, positive if a > b, 0 if equal
59
+ */
60
+ export declare function compareGradeLevels(a: GradeLevel, b: GradeLevel): number;
61
+ /**
62
+ * Get all grade levels within a range (inclusive)
63
+ */
64
+ export declare function getGradeLevelsInRange(start: GradeLevel, end: GradeLevel): GradeLevel[];
65
+ /**
66
+ * Check if a grade is within a range
67
+ */
68
+ export declare function isGradeInRange(grade: GradeLevel, range: {
69
+ start: GradeLevel;
70
+ end: GradeLevel;
71
+ }): boolean;
72
+ /**
73
+ * Get the next grade level, or null if already at 12th grade
74
+ */
75
+ export declare function getNextGradeLevel(grade: GradeLevel): GradeLevel | null;
76
+ /**
77
+ * Get the previous grade level, or null if already at PK
78
+ */
79
+ export declare function getPreviousGradeLevel(grade: GradeLevel): GradeLevel | null;
80
+ //# sourceMappingURL=grade-level.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grade-level.d.ts","sourceRoot":"","sources":["../../src/validators/grade-level.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,YAAY,qFAef,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;AAMrD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAexD,CAAC;AAMF,eAAO,MAAM,iBAAiB,EAAE,UAAU,EAAyC,CAAC;AACpF,eAAO,MAAM,aAAa,EAAE,UAAU,EAAoB,CAAC;AAC3D,eAAO,MAAM,WAAW,EAAE,UAAU,EAA4B,CAAC;AAEjE,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,QAAQ,GAAG,MAAM,CAAC;AAM/D;;;GAGG;AACH,eAAO,MAAM,oBAAoB,uFAAuB,CAAC;AAEzD;;;GAGG;AACH,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;EAM1C,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAM7E;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAE5D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,UAAU,CAEpE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAElE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,eAAe,CAIrE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,MAAM,CAEvE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAAG,UAAU,EAAE,CAStF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,UAAU,CAAA;CAAE,GAC5C,OAAO,CAMT;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI,CAMtE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI,CAM1E"}
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ /**
3
+ * Grade Level Validators
4
+ *
5
+ * Constants and validation utilities for grade levels.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.gradeLevelRangeValidatorSchema = exports.gradeLevelEnumSchema = exports.HIGH_GRADES = exports.MIDDLE_GRADES = exports.ELEMENTARY_GRADES = exports.GRADE_LEVEL_NAMES = exports.GRADE_LEVELS = void 0;
9
+ exports.getGradeLevelIndex = getGradeLevelIndex;
10
+ exports.isValidGradeLevel = isValidGradeLevel;
11
+ exports.getGradeLevelDisplayName = getGradeLevelDisplayName;
12
+ exports.getGradeLevelGroup = getGradeLevelGroup;
13
+ exports.compareGradeLevels = compareGradeLevels;
14
+ exports.getGradeLevelsInRange = getGradeLevelsInRange;
15
+ exports.isGradeInRange = isGradeInRange;
16
+ exports.getNextGradeLevel = getNextGradeLevel;
17
+ exports.getPreviousGradeLevel = getPreviousGradeLevel;
18
+ const zod_1 = require("zod");
19
+ // ============================================
20
+ // Grade Level Constants
21
+ // ============================================
22
+ exports.GRADE_LEVELS = [
23
+ 'PK', // Pre-Kindergarten
24
+ 'K', // Kindergarten
25
+ '1',
26
+ '2',
27
+ '3',
28
+ '4',
29
+ '5',
30
+ '6',
31
+ '7',
32
+ '8',
33
+ '9',
34
+ '10',
35
+ '11',
36
+ '12',
37
+ ];
38
+ // ============================================
39
+ // Grade Level Display Names
40
+ // ============================================
41
+ exports.GRADE_LEVEL_NAMES = {
42
+ 'PK': 'Pre-Kindergarten',
43
+ 'K': 'Kindergarten',
44
+ '1': '1st Grade',
45
+ '2': '2nd Grade',
46
+ '3': '3rd Grade',
47
+ '4': '4th Grade',
48
+ '5': '5th Grade',
49
+ '6': '6th Grade',
50
+ '7': '7th Grade',
51
+ '8': '8th Grade',
52
+ '9': '9th Grade (Freshman)',
53
+ '10': '10th Grade (Sophomore)',
54
+ '11': '11th Grade (Junior)',
55
+ '12': '12th Grade (Senior)',
56
+ };
57
+ // ============================================
58
+ // Grade Level Groups
59
+ // ============================================
60
+ exports.ELEMENTARY_GRADES = ['PK', 'K', '1', '2', '3', '4', '5'];
61
+ exports.MIDDLE_GRADES = ['6', '7', '8'];
62
+ exports.HIGH_GRADES = ['9', '10', '11', '12'];
63
+ // ============================================
64
+ // Zod Schemas
65
+ // ============================================
66
+ /**
67
+ * Grade level enum schema (PK, K, 1-12)
68
+ * Note: Named with Enum suffix to avoid conflict with identity/department's gradeLevelConfigSchema
69
+ */
70
+ exports.gradeLevelEnumSchema = zod_1.z.enum(exports.GRADE_LEVELS);
71
+ /**
72
+ * Grade level range validator schema
73
+ * Used to validate that start grade is before or equal to end grade
74
+ */
75
+ exports.gradeLevelRangeValidatorSchema = zod_1.z.object({
76
+ start: exports.gradeLevelEnumSchema,
77
+ end: exports.gradeLevelEnumSchema,
78
+ }).refine(data => getGradeLevelIndex(data.start) <= getGradeLevelIndex(data.end), { message: 'Start grade must be at or before end grade' });
79
+ // ============================================
80
+ // Utility Functions
81
+ // ============================================
82
+ /**
83
+ * Get the numeric index of a grade level for comparison
84
+ */
85
+ function getGradeLevelIndex(grade) {
86
+ return exports.GRADE_LEVELS.indexOf(grade);
87
+ }
88
+ /**
89
+ * Check if a string is a valid grade level
90
+ */
91
+ function isValidGradeLevel(grade) {
92
+ return exports.GRADE_LEVELS.includes(grade);
93
+ }
94
+ /**
95
+ * Get the display name for a grade level
96
+ */
97
+ function getGradeLevelDisplayName(grade) {
98
+ return exports.GRADE_LEVEL_NAMES[grade];
99
+ }
100
+ /**
101
+ * Get the grade level group (elementary, middle, high)
102
+ */
103
+ function getGradeLevelGroup(grade) {
104
+ if (exports.ELEMENTARY_GRADES.includes(grade))
105
+ return 'elementary';
106
+ if (exports.MIDDLE_GRADES.includes(grade))
107
+ return 'middle';
108
+ return 'high';
109
+ }
110
+ /**
111
+ * Compare two grade levels
112
+ * Returns negative if a < b, positive if a > b, 0 if equal
113
+ */
114
+ function compareGradeLevels(a, b) {
115
+ return getGradeLevelIndex(a) - getGradeLevelIndex(b);
116
+ }
117
+ /**
118
+ * Get all grade levels within a range (inclusive)
119
+ */
120
+ function getGradeLevelsInRange(start, end) {
121
+ const startIndex = getGradeLevelIndex(start);
122
+ const endIndex = getGradeLevelIndex(end);
123
+ if (startIndex > endIndex) {
124
+ return [];
125
+ }
126
+ return exports.GRADE_LEVELS.slice(startIndex, endIndex + 1);
127
+ }
128
+ /**
129
+ * Check if a grade is within a range
130
+ */
131
+ function isGradeInRange(grade, range) {
132
+ const gradeIndex = getGradeLevelIndex(grade);
133
+ const startIndex = getGradeLevelIndex(range.start);
134
+ const endIndex = getGradeLevelIndex(range.end);
135
+ return gradeIndex >= startIndex && gradeIndex <= endIndex;
136
+ }
137
+ /**
138
+ * Get the next grade level, or null if already at 12th grade
139
+ */
140
+ function getNextGradeLevel(grade) {
141
+ const index = getGradeLevelIndex(grade);
142
+ if (index >= exports.GRADE_LEVELS.length - 1) {
143
+ return null;
144
+ }
145
+ return exports.GRADE_LEVELS[index + 1];
146
+ }
147
+ /**
148
+ * Get the previous grade level, or null if already at PK
149
+ */
150
+ function getPreviousGradeLevel(grade) {
151
+ const index = getGradeLevelIndex(grade);
152
+ if (index <= 0) {
153
+ return null;
154
+ }
155
+ return exports.GRADE_LEVELS[index - 1];
156
+ }
157
+ //# sourceMappingURL=grade-level.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grade-level.js","sourceRoot":"","sources":["../../src/validators/grade-level.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAyFH,gDAEC;AAKD,8CAEC;AAKD,4DAEC;AAKD,gDAIC;AAMD,gDAEC;AAKD,sDASC;AAKD,wCASC;AAKD,8CAMC;AAKD,sDAMC;AA1KD,6BAAwB;AAExB,+CAA+C;AAC/C,wBAAwB;AACxB,+CAA+C;AAElC,QAAA,YAAY,GAAG;IAC1B,IAAI,EAAG,mBAAmB;IAC1B,GAAG,EAAI,eAAe;IACtB,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,IAAI;CACI,CAAC;AAIX,+CAA+C;AAC/C,4BAA4B;AAC5B,+CAA+C;AAElC,QAAA,iBAAiB,GAA+B;IAC3D,IAAI,EAAE,kBAAkB;IACxB,GAAG,EAAE,cAAc;IACnB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,sBAAsB;IAC3B,IAAI,EAAE,wBAAwB;IAC9B,IAAI,EAAE,qBAAqB;IAC3B,IAAI,EAAE,qBAAqB;CAC5B,CAAC;AAEF,+CAA+C;AAC/C,qBAAqB;AACrB,+CAA+C;AAElC,QAAA,iBAAiB,GAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACvE,QAAA,aAAa,GAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAC9C,QAAA,WAAW,GAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAIjE,+CAA+C;AAC/C,cAAc;AACd,+CAA+C;AAE/C;;;GAGG;AACU,QAAA,oBAAoB,GAAG,OAAC,CAAC,IAAI,CAAC,oBAAY,CAAC,CAAC;AAEzD;;;GAGG;AACU,QAAA,8BAA8B,GAAG,OAAC,CAAC,MAAM,CAAC;IACrD,KAAK,EAAE,4BAAoB;IAC3B,GAAG,EAAE,4BAAoB;CAC1B,CAAC,CAAC,MAAM,CACP,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,EACtE,EAAE,OAAO,EAAE,4CAA4C,EAAE,CAC1D,CAAC;AAIF,+CAA+C;AAC/C,oBAAoB;AACpB,+CAA+C;AAE/C;;GAEG;AACH,SAAgB,kBAAkB,CAAC,KAAiB;IAClD,OAAO,oBAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,KAAa;IAC7C,OAAO,oBAAY,CAAC,QAAQ,CAAC,KAAmB,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,SAAgB,wBAAwB,CAAC,KAAiB;IACxD,OAAO,yBAAiB,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,KAAiB;IAClD,IAAI,yBAAiB,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC;IAC3D,IAAI,qBAAa,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IACnD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAgB,kBAAkB,CAAC,CAAa,EAAE,CAAa;IAC7D,OAAO,kBAAkB,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CAAC,KAAiB,EAAE,GAAe;IACtE,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAEzC,IAAI,UAAU,GAAG,QAAQ,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,oBAAY,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,GAAG,CAAC,CAAiB,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAC5B,KAAiB,EACjB,KAA6C;IAE7C,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE/C,OAAO,UAAU,IAAI,UAAU,IAAI,UAAU,IAAI,QAAQ,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,KAAiB;IACjD,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,KAAK,IAAI,oBAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,oBAAY,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CAAC,KAAiB;IACrD,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,oBAAY,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Validators
3
+ *
4
+ * Reusable validation utilities and schemas
5
+ */
6
+ export * from './password';
7
+ export * from './grade-level';
8
+ export * from './date-range';
9
+ export * from './academic-year';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validators/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ /**
3
+ * Validators
4
+ *
5
+ * Reusable validation utilities and schemas
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
19
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ __exportStar(require("./password"), exports);
23
+ __exportStar(require("./grade-level"), exports);
24
+ __exportStar(require("./date-range"), exports);
25
+ __exportStar(require("./academic-year"), exports);
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validators/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;AAEH,6CAA2B;AAC3B,gDAA8B;AAC9B,+CAA6B;AAC7B,kDAAgC"}