@taimos/radball-digital-api 0.0.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.
- package/README.md +129 -0
- package/aws.graphql +24 -0
- package/docs/.nojekyll +1 -0
- package/docs/assets/hierarchy.js +1 -0
- package/docs/assets/highlight.css +92 -0
- package/docs/assets/icons.js +18 -0
- package/docs/assets/icons.svg +1 -0
- package/docs/assets/main.js +60 -0
- package/docs/assets/navigation.js +1 -0
- package/docs/assets/search.js +1 -0
- package/docs/assets/style.css +1640 -0
- package/docs/classes/ValidationCheckResult.html +11 -0
- package/docs/enums/PreferenceStatus.html +3 -0
- package/docs/functions/checkAddress.html +1 -0
- package/docs/functions/checkAssociation.html +1 -0
- package/docs/functions/checkClub.html +1 -0
- package/docs/functions/checkGym.html +1 -0
- package/docs/functions/checkLeague.html +1 -0
- package/docs/functions/checkLeagueGroup.html +1 -0
- package/docs/functions/checkPerson.html +1 -0
- package/docs/functions/checkSeason.html +1 -0
- package/docs/functions/checkTeam.html +1 -0
- package/docs/functions/validateAddress.html +1 -0
- package/docs/functions/validateAssociation.html +1 -0
- package/docs/functions/validateClub.html +1 -0
- package/docs/functions/validateGym.html +1 -0
- package/docs/functions/validateLeague.html +1 -0
- package/docs/functions/validateLeagueGroup.html +1 -0
- package/docs/functions/validatePerson.html +1 -0
- package/docs/functions/validateSeason.html +1 -0
- package/docs/functions/validateTeam.html +1 -0
- package/docs/hierarchy.html +1 -0
- package/docs/index.html +65 -0
- package/docs/interfaces/components.html +7 -0
- package/docs/interfaces/operations.html +4 -0
- package/docs/interfaces/paths.html +118 -0
- package/docs/modules.html +1 -0
- package/docs/types/AddGameInput.html +4 -0
- package/docs/types/Address.html +6 -0
- package/docs/types/AddressInput.html +5 -0
- package/docs/types/Association.html +13 -0
- package/docs/types/AuditLogEntry.html +8 -0
- package/docs/types/Club.html +11 -0
- package/docs/types/Exact.html +1 -0
- package/docs/types/Game.html +13 -0
- package/docs/types/Gym.html +7 -0
- package/docs/types/Incremental.html +1 -0
- package/docs/types/InputMaybe.html +1 -0
- package/docs/types/League.html +13 -0
- package/docs/types/LeagueGroup.html +11 -0
- package/docs/types/MakeEmpty.html +1 -0
- package/docs/types/MakeMaybe.html +1 -0
- package/docs/types/MakeOptional.html +1 -0
- package/docs/types/MatchDay.html +15 -0
- package/docs/types/MatchdayTeam.html +6 -0
- package/docs/types/Maybe.html +1 -0
- package/docs/types/ModifyAssociationInput.html +10 -0
- package/docs/types/ModifyClubInput.html +7 -0
- package/docs/types/ModifyGameInput.html +10 -0
- package/docs/types/ModifyGymInput.html +5 -0
- package/docs/types/ModifyLeagueGroupInput.html +7 -0
- package/docs/types/ModifyLeagueInput.html +9 -0
- package/docs/types/ModifyMatchDayInput.html +10 -0
- package/docs/types/ModifyMatchDayTeamInput.html +3 -0
- package/docs/types/ModifyPersonInput.html +12 -0
- package/docs/types/ModifyPreferredMatchdayDateInput.html +6 -0
- package/docs/types/ModifySeasonInput.html +7 -0
- package/docs/types/ModifyTeamInput.html +10 -0
- package/docs/types/Mutation.html +39 -0
- package/docs/types/MutationAddAssociationArgs.html +2 -0
- package/docs/types/MutationAddClubArgs.html +2 -0
- package/docs/types/MutationAddGameToMatchDayArgs.html +4 -0
- package/docs/types/MutationAddGymArgs.html +2 -0
- package/docs/types/MutationAddLeagueArgs.html +2 -0
- package/docs/types/MutationAddLeagueGroupArgs.html +2 -0
- package/docs/types/MutationAddMatchDayArgs.html +2 -0
- package/docs/types/MutationAddMatchDayTeamArgs.html +2 -0
- package/docs/types/MutationAddPersonArgs.html +2 -0
- package/docs/types/MutationAddPreferredDateForLeagueArgs.html +2 -0
- package/docs/types/MutationAddSeasonArgs.html +2 -0
- package/docs/types/MutationAddTeamArgs.html +2 -0
- package/docs/types/MutationModifyAssociationArgs.html +2 -0
- package/docs/types/MutationModifyClubArgs.html +2 -0
- package/docs/types/MutationModifyGameInMatchDayArgs.html +4 -0
- package/docs/types/MutationModifyGymArgs.html +2 -0
- package/docs/types/MutationModifyLeagueArgs.html +2 -0
- package/docs/types/MutationModifyLeagueGroupArgs.html +2 -0
- package/docs/types/MutationModifyMatchDayArgs.html +2 -0
- package/docs/types/MutationModifyMatchDayTeamArgs.html +3 -0
- package/docs/types/MutationModifyPersonArgs.html +2 -0
- package/docs/types/MutationModifyPreferredDateForLeagueArgs.html +2 -0
- package/docs/types/MutationModifySeasonArgs.html +2 -0
- package/docs/types/MutationModifyTeamArgs.html +2 -0
- package/docs/types/MutationRegisterTeamsForSeasonArgs.html +2 -0
- package/docs/types/MutationRemoveAssociationArgs.html +2 -0
- package/docs/types/MutationRemoveClubArgs.html +2 -0
- package/docs/types/MutationRemoveGameFromMatchDayArgs.html +4 -0
- package/docs/types/MutationRemoveGymArgs.html +2 -0
- package/docs/types/MutationRemoveLeagueArgs.html +2 -0
- package/docs/types/MutationRemoveLeagueGroupArgs.html +2 -0
- package/docs/types/MutationRemoveMatchDayArgs.html +2 -0
- package/docs/types/MutationRemoveMatchDayTeamArgs.html +2 -0
- package/docs/types/MutationRemovePersonArgs.html +2 -0
- package/docs/types/MutationRemovePreferredDateForLeagueArgs.html +4 -0
- package/docs/types/MutationRemoveSeasonArgs.html +2 -0
- package/docs/types/MutationRemoveTeamArgs.html +2 -0
- package/docs/types/Person.html +14 -0
- package/docs/types/PersonPermission.html +6 -0
- package/docs/types/PreferredMatchdayDate.html +8 -0
- package/docs/types/Query.html +36 -0
- package/docs/types/QueryGetAllGamesOfTeamInSeasonArgs.html +3 -0
- package/docs/types/QueryGetAllMatchdaysOfTeamInSeasonArgs.html +3 -0
- package/docs/types/QueryGetAllPlayersOfClubInSeasonArgs.html +3 -0
- package/docs/types/QueryGetAllTeamsOfClubInSeasonArgs.html +3 -0
- package/docs/types/QueryGetAssociationByIdArgs.html +2 -0
- package/docs/types/QueryGetAuditLogEntriesForActorArgs.html +4 -0
- package/docs/types/QueryGetAuditLogEntriesForResourceArgs.html +5 -0
- package/docs/types/QueryGetAvailableDatesForSeasonArgs.html +3 -0
- package/docs/types/QueryGetClubByIdArgs.html +2 -0
- package/docs/types/QueryGetGameByIdArgs.html +3 -0
- package/docs/types/QueryGetGymByIdArgs.html +2 -0
- package/docs/types/QueryGetLeagueByIdArgs.html +2 -0
- package/docs/types/QueryGetLeagueGroupByIdArgs.html +2 -0
- package/docs/types/QueryGetListOfClubsByAssociationArgs.html +2 -0
- package/docs/types/QueryGetListOfClubsByLeagueArgs.html +2 -0
- package/docs/types/QueryGetListOfClubsByLeagueGroupArgs.html +2 -0
- package/docs/types/QueryGetListOfGroupsInLeagueArgs.html +2 -0
- package/docs/types/QueryGetListOfGymsArgs.html +2 -0
- package/docs/types/QueryGetListOfLeagueInSeasonArgs.html +2 -0
- package/docs/types/QueryGetListOfMatchdaysArgs.html +4 -0
- package/docs/types/QueryGetListOfMatchdaysInSeasonArgs.html +2 -0
- package/docs/types/QueryGetListOfPeopleArgs.html +2 -0
- package/docs/types/QueryGetListOfSeasonsArgs.html +2 -0
- package/docs/types/QueryGetListOfTeamsForLeagueArgs.html +2 -0
- package/docs/types/QueryGetListOfTeamsForLeagueGroupArgs.html +3 -0
- package/docs/types/QueryGetMatchdayByIdArgs.html +2 -0
- package/docs/types/QueryGetPersonByIdArgs.html +2 -0
- package/docs/types/QueryGetPersonByUciCodeArgs.html +2 -0
- package/docs/types/QueryGetPersonPermissionsArgs.html +2 -0
- package/docs/types/QueryGetPreferredDatesForClubArgs.html +3 -0
- package/docs/types/QueryGetSeasonByIdArgs.html +2 -0
- package/docs/types/QueryGetTeamByIdArgs.html +2 -0
- package/docs/types/RefereeInfo.html +4 -0
- package/docs/types/RefereeInfoInput.html +3 -0
- package/docs/types/RegisterTeamInput.html +8 -0
- package/docs/types/RegisterTeamsForSeasonInput.html +5 -0
- package/docs/types/SaveAssociationInput.html +9 -0
- package/docs/types/SaveClubInput.html +7 -0
- package/docs/types/SaveGymInput.html +5 -0
- package/docs/types/SaveLeagueGroupInput.html +7 -0
- package/docs/types/SaveLeagueInput.html +9 -0
- package/docs/types/SaveMatchDayInput.html +11 -0
- package/docs/types/SaveMatchDayTeamInput.html +4 -0
- package/docs/types/SavePersonInput.html +11 -0
- package/docs/types/SavePreferredMatchdayDateInput.html +6 -0
- package/docs/types/SaveSeasonInput.html +7 -0
- package/docs/types/SaveTeamInput.html +10 -0
- package/docs/types/Scalars.html +18 -0
- package/docs/types/Season.html +10 -0
- package/docs/types/Team.html +12 -0
- package/docs/types/_defs.html +1 -0
- package/docs/types/webhooks.html +1 -0
- package/graphql-codegen.yml +21 -0
- package/lib/generated/graphql.model.generated.d.ts +808 -0
- package/lib/generated/graphql.model.generated.js +9 -0
- package/lib/generated/rest.model.generated.d.ts +333 -0
- package/lib/generated/rest.model.generated.js +7 -0
- package/lib/index.d.ts +3 -0
- package/lib/index.js +20 -0
- package/lib/validation.d.ts +34 -0
- package/lib/validation.js +413 -0
- package/package.json +128 -0
- package/rest.yaml +260 -0
- package/schema.graphql +541 -0
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ValidationCheckResult = void 0;
|
|
4
|
+
exports.checkAddress = checkAddress;
|
|
5
|
+
exports.validateAddress = validateAddress;
|
|
6
|
+
exports.checkLeague = checkLeague;
|
|
7
|
+
exports.validateLeague = validateLeague;
|
|
8
|
+
exports.checkClub = checkClub;
|
|
9
|
+
exports.validateClub = validateClub;
|
|
10
|
+
exports.checkGym = checkGym;
|
|
11
|
+
exports.validateGym = validateGym;
|
|
12
|
+
exports.checkSeason = checkSeason;
|
|
13
|
+
exports.validateSeason = validateSeason;
|
|
14
|
+
exports.checkPerson = checkPerson;
|
|
15
|
+
exports.validatePerson = validatePerson;
|
|
16
|
+
exports.checkAssociation = checkAssociation;
|
|
17
|
+
exports.validateAssociation = validateAssociation;
|
|
18
|
+
exports.checkLeagueGroup = checkLeagueGroup;
|
|
19
|
+
exports.validateLeagueGroup = validateLeagueGroup;
|
|
20
|
+
exports.checkTeam = checkTeam;
|
|
21
|
+
exports.validateTeam = validateTeam;
|
|
22
|
+
class ValidationCheckResult {
|
|
23
|
+
constructor() {
|
|
24
|
+
this.warnings = {};
|
|
25
|
+
this.errors = {};
|
|
26
|
+
}
|
|
27
|
+
addWarning(field, message) {
|
|
28
|
+
if (!this.warnings[field]) {
|
|
29
|
+
this.warnings[field] = [];
|
|
30
|
+
}
|
|
31
|
+
this.warnings[field].push(message);
|
|
32
|
+
}
|
|
33
|
+
addError(field, message) {
|
|
34
|
+
if (!this.errors[field]) {
|
|
35
|
+
this.errors[field] = [];
|
|
36
|
+
}
|
|
37
|
+
this.errors[field].push(message);
|
|
38
|
+
}
|
|
39
|
+
getErrorMessages() {
|
|
40
|
+
return Object.values(this.errors).flat();
|
|
41
|
+
}
|
|
42
|
+
getWarningMessages() {
|
|
43
|
+
return Object.values(this.warnings).flat();
|
|
44
|
+
}
|
|
45
|
+
getErrorMessagesString() {
|
|
46
|
+
return this.getErrorMessages().join('; ');
|
|
47
|
+
}
|
|
48
|
+
getWarningMessagesString() {
|
|
49
|
+
return this.getWarningMessages().join('; ');
|
|
50
|
+
}
|
|
51
|
+
validate() {
|
|
52
|
+
if (Object.keys(this.errors).length > 0) {
|
|
53
|
+
throw new Error(this.getErrorMessagesString());
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
exports.ValidationCheckResult = ValidationCheckResult;
|
|
58
|
+
function checkAddress(address) {
|
|
59
|
+
const result = new ValidationCheckResult();
|
|
60
|
+
if (address?.city?.trim().length === 0) {
|
|
61
|
+
result.addError('city', 'City is required');
|
|
62
|
+
}
|
|
63
|
+
else if (address.city.length > 200) {
|
|
64
|
+
result.addError('city', 'City cannot exceed 200 characters');
|
|
65
|
+
}
|
|
66
|
+
if (address?.country?.trim().length === 0) {
|
|
67
|
+
result.addError('country', 'Country is required');
|
|
68
|
+
}
|
|
69
|
+
else if (address.country.length > 20) {
|
|
70
|
+
result.addError('country', 'Country cannot exceed 20 characters');
|
|
71
|
+
}
|
|
72
|
+
if (address?.street?.trim().length === 0) {
|
|
73
|
+
result.addError('street', 'Street is required');
|
|
74
|
+
}
|
|
75
|
+
else if (address.street.length > 200) {
|
|
76
|
+
result.addError('street', 'Street cannot exceed 200 characters');
|
|
77
|
+
}
|
|
78
|
+
if (address?.zip?.trim().length === 0) {
|
|
79
|
+
result.addError('zip', 'Zip code is required');
|
|
80
|
+
}
|
|
81
|
+
else if (address.zip.length > 20) {
|
|
82
|
+
result.addError('zip', 'Zip code cannot exceed 20 characters');
|
|
83
|
+
}
|
|
84
|
+
return result;
|
|
85
|
+
}
|
|
86
|
+
function validateAddress(address) {
|
|
87
|
+
const result = checkAddress(address);
|
|
88
|
+
result.validate();
|
|
89
|
+
}
|
|
90
|
+
function checkLeague(league) {
|
|
91
|
+
const result = new ValidationCheckResult();
|
|
92
|
+
// Age range validations
|
|
93
|
+
if (league.minAge != undefined && league.maxAge != undefined) {
|
|
94
|
+
if (league.minAge < 0) {
|
|
95
|
+
result.addError('minAge', 'Minimum age cannot be negative');
|
|
96
|
+
}
|
|
97
|
+
if (league.maxAge < 0) {
|
|
98
|
+
result.addError('maxAge', 'Maximum age cannot be negative');
|
|
99
|
+
}
|
|
100
|
+
if (league.maxAge < league.minAge) {
|
|
101
|
+
result.addError('maxAge', 'Maximum age must be greater than or equal to minimum age');
|
|
102
|
+
}
|
|
103
|
+
if (league.maxAge > 100) { // adjust as needed
|
|
104
|
+
result.addError('maxAge', 'Maximum age exceeds reasonable limit');
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Name validations
|
|
108
|
+
if (!league.name || league.name.trim().length === 0) {
|
|
109
|
+
result.addError('name', 'League name is required');
|
|
110
|
+
}
|
|
111
|
+
else if (league.name.length > 100) { // adjust max length as needed
|
|
112
|
+
result.addError('name', 'League name cannot exceed 100 characters');
|
|
113
|
+
}
|
|
114
|
+
// Description validation (if required)
|
|
115
|
+
if (league.description && league.description.length > 500) {
|
|
116
|
+
result.addError('description', 'Description cannot exceed 500 characters');
|
|
117
|
+
}
|
|
118
|
+
// Short name validation
|
|
119
|
+
if (league.shortName) {
|
|
120
|
+
if (league.shortName.length > 10) {
|
|
121
|
+
result.addError('shortName', 'Short name cannot exceed 10 characters');
|
|
122
|
+
}
|
|
123
|
+
if (!/^[A-Za-z0-9]+$/.test(league.shortName)) {
|
|
124
|
+
result.addError('shortName', 'Short name can only contain alphanumeric characters');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return result;
|
|
128
|
+
}
|
|
129
|
+
function validateLeague(league) {
|
|
130
|
+
const result = checkLeague(league);
|
|
131
|
+
result.validate();
|
|
132
|
+
}
|
|
133
|
+
function checkClub(club) {
|
|
134
|
+
const result = new ValidationCheckResult();
|
|
135
|
+
// Full name validations
|
|
136
|
+
if (!club.name || club.name.trim().length === 0) {
|
|
137
|
+
result.addError('name', 'Club name is required');
|
|
138
|
+
}
|
|
139
|
+
else if (club.name.length > 100) {
|
|
140
|
+
result.addError('name', 'Club name cannot exceed 100 characters');
|
|
141
|
+
}
|
|
142
|
+
// Short name validations
|
|
143
|
+
if (club.shortName) {
|
|
144
|
+
if (club.shortName.length > 30) {
|
|
145
|
+
result.addError('shortName', 'Short name cannot exceed 30 characters');
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Website validation
|
|
149
|
+
if (club.website) {
|
|
150
|
+
try {
|
|
151
|
+
new URL(club.website);
|
|
152
|
+
if (!club.website.startsWith('http://') && !club.website.startsWith('https://')) {
|
|
153
|
+
result.addError('website', 'Website must start with http:// or https://');
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
result.addError('website', 'Invalid website URL');
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// Address validation
|
|
161
|
+
if (club.address && (club.address.city || club.address.street || club.address.zip)) {
|
|
162
|
+
const addressResult = checkAddress(club.address);
|
|
163
|
+
// Merge address errors into the main result
|
|
164
|
+
Object.entries(addressResult.errors).forEach(([field, messages]) => {
|
|
165
|
+
messages.forEach(message => result.addError(`address.${field}`, message));
|
|
166
|
+
});
|
|
167
|
+
Object.entries(addressResult.warnings).forEach(([field, messages]) => {
|
|
168
|
+
messages.forEach(message => result.addWarning(`address.${field}`, message));
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
return result;
|
|
172
|
+
}
|
|
173
|
+
function validateClub(club) {
|
|
174
|
+
const result = checkClub(club);
|
|
175
|
+
result.validate();
|
|
176
|
+
}
|
|
177
|
+
function checkGym(gym) {
|
|
178
|
+
const result = new ValidationCheckResult();
|
|
179
|
+
// Name validations
|
|
180
|
+
if (!gym.name || gym.name.trim().length === 0) {
|
|
181
|
+
result.addError('name', 'Gym name is required');
|
|
182
|
+
}
|
|
183
|
+
else if (gym.name.length > 100) {
|
|
184
|
+
result.addError('name', 'Gym name cannot exceed 100 characters');
|
|
185
|
+
}
|
|
186
|
+
// available fields validation
|
|
187
|
+
if (!gym.availableFields || gym.availableFields.trim().length === 0) {
|
|
188
|
+
result.addError('availableFields', 'Available fields are required');
|
|
189
|
+
}
|
|
190
|
+
// Address validations
|
|
191
|
+
const addressResult = checkAddress(gym.address);
|
|
192
|
+
// Merge address errors into the main result
|
|
193
|
+
Object.entries(addressResult.errors).forEach(([field, messages]) => {
|
|
194
|
+
messages.forEach(message => result.addError(`address.${field}`, message));
|
|
195
|
+
});
|
|
196
|
+
Object.entries(addressResult.warnings).forEach(([field, messages]) => {
|
|
197
|
+
messages.forEach(message => result.addWarning(`address.${field}`, message));
|
|
198
|
+
});
|
|
199
|
+
return result;
|
|
200
|
+
}
|
|
201
|
+
function validateGym(gym) {
|
|
202
|
+
const result = checkGym(gym);
|
|
203
|
+
result.validate();
|
|
204
|
+
}
|
|
205
|
+
function checkSeason(season) {
|
|
206
|
+
const result = new ValidationCheckResult();
|
|
207
|
+
// Name validations
|
|
208
|
+
if (!season.name || season.name.trim().length === 0) {
|
|
209
|
+
result.addError('name', 'Season name is required');
|
|
210
|
+
}
|
|
211
|
+
else if (season.name.length > 100) {
|
|
212
|
+
result.addError('name', 'Season name cannot exceed 100 characters');
|
|
213
|
+
}
|
|
214
|
+
// Check for valid dates
|
|
215
|
+
const startDate = new Date(season.startDate);
|
|
216
|
+
const endDate = new Date(season.endDate);
|
|
217
|
+
const registrationEnd = new Date(season.registrationEnd);
|
|
218
|
+
if (isNaN(startDate.getTime()) || isNaN(endDate.getTime()) || isNaN(registrationEnd.getTime())) {
|
|
219
|
+
result.addError('dates', 'Invalid date format');
|
|
220
|
+
}
|
|
221
|
+
if (season.registrationStart) {
|
|
222
|
+
const registrationStart = new Date(season.registrationStart);
|
|
223
|
+
if (isNaN(registrationStart.getTime())) {
|
|
224
|
+
result.addError('registrationStart', 'Invalid date format');
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// Season date validations
|
|
228
|
+
if (endDate <= startDate) {
|
|
229
|
+
result.addError('endDate', 'Season end date must be after start date');
|
|
230
|
+
}
|
|
231
|
+
// Registration period validations
|
|
232
|
+
if (season.registrationStart) {
|
|
233
|
+
const registrationStart = new Date(season.registrationStart);
|
|
234
|
+
if (registrationStart) {
|
|
235
|
+
if (registrationEnd <= registrationStart) {
|
|
236
|
+
result.addError('registrationEnd', 'Registration end date must be after registration start date');
|
|
237
|
+
}
|
|
238
|
+
if (registrationStart >= startDate) {
|
|
239
|
+
result.addError('registrationStart', 'Registration must start before season start date');
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
if (registrationEnd > startDate) {
|
|
244
|
+
result.addError('registrationEnd', 'Registration must end before season start date');
|
|
245
|
+
}
|
|
246
|
+
// Future date validation
|
|
247
|
+
const now = new Date();
|
|
248
|
+
if (startDate < now) {
|
|
249
|
+
result.addError('startDate', 'Season start date cannot be in the past');
|
|
250
|
+
}
|
|
251
|
+
return result;
|
|
252
|
+
}
|
|
253
|
+
function validateSeason(season) {
|
|
254
|
+
const result = checkSeason(season);
|
|
255
|
+
result.validate();
|
|
256
|
+
}
|
|
257
|
+
function checkPerson(person) {
|
|
258
|
+
const result = new ValidationCheckResult();
|
|
259
|
+
// Name validations
|
|
260
|
+
if (!person.firstName?.trim()) {
|
|
261
|
+
result.addError('firstName', 'First name is required');
|
|
262
|
+
}
|
|
263
|
+
if (!person.lastName?.trim()) {
|
|
264
|
+
result.addError('lastName', 'Last name is required');
|
|
265
|
+
}
|
|
266
|
+
// Email validation
|
|
267
|
+
if (person.email && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(person.email)) {
|
|
268
|
+
result.addError('email', 'Invalid email format');
|
|
269
|
+
}
|
|
270
|
+
// Phone number validation
|
|
271
|
+
if (person.phone) {
|
|
272
|
+
// Allow digits, spaces, +, -, and ()
|
|
273
|
+
const phoneRegex = /^[\d\s+()-]{8,20}$/;
|
|
274
|
+
if (!phoneRegex.test(person.phone)) {
|
|
275
|
+
result.addError('phone', 'Invalid phone number format');
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
// Date of birth validation
|
|
279
|
+
if (person.dateOfBirth) {
|
|
280
|
+
const date = new Date(person.dateOfBirth);
|
|
281
|
+
if (isNaN(date.getTime())) {
|
|
282
|
+
result.addError('dateOfBirth', 'Invalid date of birth format');
|
|
283
|
+
}
|
|
284
|
+
// Add age restrictions if needed
|
|
285
|
+
const today = new Date();
|
|
286
|
+
if (date > today) {
|
|
287
|
+
result.addError('dateOfBirth', 'Date of birth cannot be in the future');
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
// Address validation
|
|
291
|
+
if (person.address && (person.address.city || person.address.street || person.address.zip)) {
|
|
292
|
+
const addressResult = checkAddress(person.address);
|
|
293
|
+
// Merge address errors into the main result
|
|
294
|
+
Object.entries(addressResult.errors).forEach(([field, messages]) => {
|
|
295
|
+
messages.forEach(message => result.addError(`address.${field}`, message));
|
|
296
|
+
});
|
|
297
|
+
Object.entries(addressResult.warnings).forEach(([field, messages]) => {
|
|
298
|
+
messages.forEach(message => result.addWarning(`address.${field}`, message));
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
return result;
|
|
302
|
+
}
|
|
303
|
+
function validatePerson(person) {
|
|
304
|
+
const result = checkPerson(person);
|
|
305
|
+
result.validate();
|
|
306
|
+
}
|
|
307
|
+
function checkAssociation(association) {
|
|
308
|
+
const result = new ValidationCheckResult();
|
|
309
|
+
// Name validation
|
|
310
|
+
if (!association.name?.trim()) {
|
|
311
|
+
result.addError('name', 'Association name is required');
|
|
312
|
+
}
|
|
313
|
+
else if (association.name.length > 100) { // adjust max length as needed
|
|
314
|
+
result.addError('name', 'Association name cannot exceed 100 characters');
|
|
315
|
+
}
|
|
316
|
+
// Contact Email validation
|
|
317
|
+
if (!association.contactEmail?.trim()) {
|
|
318
|
+
result.addError('contactEmail', 'Contact email is required');
|
|
319
|
+
}
|
|
320
|
+
else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(association.contactEmail)) {
|
|
321
|
+
result.addError('contactEmail', 'Invalid contact email format');
|
|
322
|
+
}
|
|
323
|
+
// Contact Name validation
|
|
324
|
+
if (!association.contactName?.trim()) {
|
|
325
|
+
result.addError('contactName', 'Contact name is required');
|
|
326
|
+
}
|
|
327
|
+
// Address validation
|
|
328
|
+
const addressResult = checkAddress(association.address);
|
|
329
|
+
// Merge address errors into the main result
|
|
330
|
+
Object.entries(addressResult.errors).forEach(([field, messages]) => {
|
|
331
|
+
messages.forEach(message => result.addError(`address.${field}`, message));
|
|
332
|
+
});
|
|
333
|
+
Object.entries(addressResult.warnings).forEach(([field, messages]) => {
|
|
334
|
+
messages.forEach(message => result.addWarning(`address.${field}`, message));
|
|
335
|
+
});
|
|
336
|
+
return result;
|
|
337
|
+
}
|
|
338
|
+
function validateAssociation(association) {
|
|
339
|
+
const result = checkAssociation(association);
|
|
340
|
+
result.validate();
|
|
341
|
+
}
|
|
342
|
+
function checkLeagueGroup(leagueGroup) {
|
|
343
|
+
const result = new ValidationCheckResult();
|
|
344
|
+
// Name validations
|
|
345
|
+
if (!leagueGroup.name || leagueGroup.name.trim().length === 0) {
|
|
346
|
+
result.addError('name', 'League group name is required');
|
|
347
|
+
}
|
|
348
|
+
else if (leagueGroup.name.length > 100) {
|
|
349
|
+
result.addError('name', 'League group name cannot exceed 100 characters');
|
|
350
|
+
}
|
|
351
|
+
// Number validation
|
|
352
|
+
if (leagueGroup.number < 1) {
|
|
353
|
+
result.addError('number', 'League group number must be positive');
|
|
354
|
+
}
|
|
355
|
+
// Short name validations
|
|
356
|
+
if (!leagueGroup.shortName || leagueGroup.shortName.trim().length === 0) {
|
|
357
|
+
result.addError('shortName', 'League group short name is required');
|
|
358
|
+
}
|
|
359
|
+
else if (leagueGroup.shortName.length > 10) {
|
|
360
|
+
result.addError('shortName', 'League group short name cannot exceed 10 characters');
|
|
361
|
+
}
|
|
362
|
+
else if (!/^[A-Za-z0-9]+$/.test(leagueGroup.shortName)) {
|
|
363
|
+
result.addError('shortName', 'League group short name can only contain alphanumeric characters');
|
|
364
|
+
}
|
|
365
|
+
// Regulation validation
|
|
366
|
+
if (!leagueGroup.regulation || leagueGroup.regulation.trim().length === 0) {
|
|
367
|
+
result.addError('regulation', 'League group regulation is required');
|
|
368
|
+
}
|
|
369
|
+
return result;
|
|
370
|
+
}
|
|
371
|
+
function validateLeagueGroup(leagueGroup) {
|
|
372
|
+
const result = checkLeagueGroup(leagueGroup);
|
|
373
|
+
result.validate();
|
|
374
|
+
}
|
|
375
|
+
function checkTeam(team) {
|
|
376
|
+
const result = new ValidationCheckResult();
|
|
377
|
+
// Name validation
|
|
378
|
+
if ('name' in team && team.name !== undefined) {
|
|
379
|
+
if (team.name.trim().length === 0) {
|
|
380
|
+
result.addError('name', 'Team name cannot be empty');
|
|
381
|
+
}
|
|
382
|
+
else if (team.name.length > 100) {
|
|
383
|
+
result.addError('name', 'Team name cannot exceed 100 characters');
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
else if (!('id' in team)) { // if id is not in team, then it is a new team
|
|
387
|
+
result.addError('name', 'Team name is required');
|
|
388
|
+
}
|
|
389
|
+
// League ID validation
|
|
390
|
+
if ('leagueId' in team && team.leagueId !== undefined) {
|
|
391
|
+
if (team.leagueId.trim().length === 0) {
|
|
392
|
+
result.addError('leagueId', 'League ID cannot be empty');
|
|
393
|
+
}
|
|
394
|
+
else if (team.leagueId.length > 100) {
|
|
395
|
+
result.addError('leagueId', 'League ID cannot exceed 100 characters');
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
else if (!('id' in team)) { // if id is not in team, then it is a new team
|
|
399
|
+
result.addError('leagueId', 'League ID is required');
|
|
400
|
+
}
|
|
401
|
+
// Exemption request validation
|
|
402
|
+
if (team.exemptionRequest) {
|
|
403
|
+
if (team.exemptionRequest.trim().length > 1000) {
|
|
404
|
+
result.addError('exemptionRequest', 'Exemption request cannot exceed 1000 characters');
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
return result;
|
|
408
|
+
}
|
|
409
|
+
function validateTeam(team) {
|
|
410
|
+
const result = checkTeam(team);
|
|
411
|
+
result.validate();
|
|
412
|
+
}
|
|
413
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTRDQSxvQ0E0QkM7QUFFRCwwQ0FHQztBQUVELGtDQTBDQztBQUVELHdDQUdDO0FBRUQsOEJBMENDO0FBRUQsb0NBR0M7QUFFRCw0QkEwQkM7QUFFRCxrQ0FHQztBQUVELGtDQXVEQztBQUVELHdDQUdDO0FBRUQsa0NBb0RDO0FBRUQsd0NBR0M7QUFFRCw0Q0FpQ0M7QUFFRCxrREFHQztBQUVELDRDQThCQztBQUVELGtEQUdDO0FBRUQsOEJBaUNDO0FBRUQsb0NBR0M7QUE1YkQsTUFBYSxxQkFBcUI7SUFBbEM7UUFFa0IsYUFBUSxHQUFrQyxFQUFFLENBQUM7UUFDN0MsV0FBTSxHQUFrQyxFQUFFLENBQUM7SUFxQzdELENBQUM7SUFuQ1EsVUFBVSxDQUFDLEtBQWEsRUFBRSxPQUFlO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDNUIsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTSxRQUFRLENBQUMsS0FBYSxFQUFFLE9BQWU7UUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMxQixDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVNLGdCQUFnQjtRQUNyQixPQUFPLE1BQU0sQ0FBQyxNQUFNLENB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QUFHLEdBQUcsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLHdDQUF3QyxDQUFDLENBQUM7UUFDeEUsQ0FBQztJQUNILENBQUM7U0FBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLDhDQUE4QztRQUMxRSxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMxQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxFQUFFLENBQUM7WUFDL0MsTUFBTSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxpREFBaUQsQ0FBQyxDQUFDO1FBQ3pGLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQWdCLFlBQVksQ0FBQyxJQUF5RDtJQUNwRixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZGRyZXNzLCBNb2RpZnlBc3NvY2lhdGlvbklucHV0LCBNb2RpZnlDbHViSW5wdXQsIE1vZGlmeUd5bUlucHV0LCBNb2RpZnlMZWFndWVJbnB1dCwgTW9kaWZ5UGVyc29uSW5wdXQsIE1vZGlmeVNlYXNvbklucHV0LCBTYXZlQXNzb2NpYXRpb25JbnB1dCwgU2F2ZUNsdWJJbnB1dCwgU2F2ZUd5bUlucHV0LCBTYXZlTGVhZ3VlR3JvdXBJbnB1dCwgU2F2ZUxlYWd1ZUlucHV0LCBTYXZlUGVyc29uSW5wdXQsIFNhdmVTZWFzb25JbnB1dCwgTW9kaWZ5TGVhZ3VlR3JvdXBJbnB1dCwgU2F2ZVRlYW1JbnB1dCwgTW9kaWZ5VGVhbUlucHV0LCBSZWdpc3RlclRlYW1JbnB1dCB9IGZyb20gJ0BnZW5lcmF0ZWQvZ3JhcGhxbC5tb2RlbC5nZW5lcmF0ZWQnO1xuXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvbkNoZWNrUmVzdWx0IHtcblxuICBwdWJsaWMgcmVhZG9ubHkgd2FybmluZ3M6IHsgW2ZpZWxkOiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XG4gIHB1YmxpYyByZWFkb25seSBlcnJvcnM6IHsgW2ZpZWxkOiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XG5cbiAgcHVibGljIGFkZFdhcm5pbmcoZmllbGQ6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLndhcm5pbmdzW2ZpZWxkXSkge1xuICAgICAgdGhpcy53YXJuaW5nc1tmaWVsZF0gPSBbXTtcbiAgICB9XG4gICAgdGhpcy53YXJuaW5nc1tmaWVsZF0ucHVzaChtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRFcnJvcihmaWVsZDogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZXJyb3JzW2ZpZWxkXSkge1xuICAgICAgdGhpcy5lcnJvcnNbZmllbGRdID0gW107XG4gICAgfVxuICAgIHRoaXMuZXJyb3JzW2ZpZWxkXS5wdXNoKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHVibGljIGdldEVycm9yTWVzc2FnZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuZXJyb3JzKS5mbGF0KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0V2FybmluZ01lc3NhZ2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLndhcm5pbmdzKS5mbGF0KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RXJyb3JNZXNzYWdlc1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldEVycm9yTWVzc2FnZXMoKS5qb2luKCc7ICcpO1xuICB9XG5cbiAgcHVibGljIGdldFdhcm5pbmdNZXNzYWdlc1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFdhcm5pbmdNZXNzYWdlcygpLmpvaW4oJzsgJyk7XG4gIH1cblxuICBwdWJsaWMgdmFsaWRhdGUoKTogdm9pZCB7XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuZXJyb3JzKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5nZXRFcnJvck1lc3NhZ2VzU3RyaW5nKCkpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tBZGRyZXNzKGFkZHJlc3M6IEFkZHJlc3MpOiBWYWxpZGF0aW9uQ2hlY2tSZXN1bHQge1xuICBjb25zdCByZXN1bHQgPSBuZXcgVmFsaWRhdGlvbkNoZWNrUmVzdWx0KCk7XG5cbiAgaWYgKGFkZHJlc3M/LmNpdHk/LnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ2NpdHknLCAnQ2l0eSBpcyByZXF1aXJlZCcpO1xuICB9IGVsc2UgaWYgKGFkZHJlc3MuY2l0eSEubGVuZ3RoID4gMjAwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdjaXR5JywgJ0NpdHkgY2Fubm90IGV4Y2VlZCAyMDAgY2hhcmFjdGVycycpO1xuICB9XG5cbiAgaWYgKGFkZHJlc3M/LmNvdW50cnk/LnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ2NvdW50cnknLCAnQ291bnRyeSBpcyByZXF1aXJlZCcpO1xuICB9IGVsc2UgaWYgKGFkZHJlc3MuY291bnRyeSEubGVuZ3RoID4gMjApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ2NvdW50cnknLCAnQ291bnRyeSBjYW5ub3QgZXhjZWVkIDIwIGNoYXJhY3RlcnMnKTtcbiAgfVxuXG4gIGlmIChhZGRyZXNzPy5zdHJlZXQ/LnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ3N0cmVldCcsICdTdHJlZXQgaXMgcmVxdWlyZWQnKTtcbiAgfSBlbHNlIGlmIChhZGRyZXNzLnN0cmVldCEubGVuZ3RoID4gMjAwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdzdHJlZXQnLCAnU3RyZWV0IGNhbm5vdCBleGNlZWQgMjAwIGNoYXJhY3RlcnMnKTtcbiAgfVxuXG4gIGlmIChhZGRyZXNzPy56aXA/LnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ3ppcCcsICdaaXAgY29kZSBpcyByZXF1aXJlZCcpO1xuICB9IGVsc2UgaWYgKGFkZHJlc3MuemlwIS5sZW5ndGggPiAyMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignemlwJywgJ1ppcCBjb2RlIGNhbm5vdCBleGNlZWQgMjAgY2hhcmFjdGVycycpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQWRkcmVzcyhhZGRyZXNzOiBBZGRyZXNzKTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrQWRkcmVzcyhhZGRyZXNzKTtcbiAgcmVzdWx0LnZhbGlkYXRlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0xlYWd1ZShsZWFndWU6IFNhdmVMZWFndWVJbnB1dCB8IE1vZGlmeUxlYWd1ZUlucHV0KTogVmFsaWRhdGlvbkNoZWNrUmVzdWx0IHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25DaGVja1Jlc3VsdCgpO1xuXG4gIC8vIEFnZSByYW5nZSB2YWxpZGF0aW9uc1xuICBpZiAobGVhZ3VlLm1pbkFnZSAhPSB1bmRlZmluZWQgJiYgbGVhZ3VlLm1heEFnZSAhPSB1bmRlZmluZWQpIHtcbiAgICBpZiAobGVhZ3VlLm1pbkFnZSA8IDApIHtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcignbWluQWdlJywgJ01pbmltdW0gYWdlIGNhbm5vdCBiZSBuZWdhdGl2ZScpO1xuICAgIH1cbiAgICBpZiAobGVhZ3VlLm1heEFnZSA8IDApIHtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcignbWF4QWdlJywgJ01heGltdW0gYWdlIGNhbm5vdCBiZSBuZWdhdGl2ZScpO1xuICAgIH1cbiAgICBpZiAobGVhZ3VlLm1heEFnZSA8IGxlYWd1ZS5taW5BZ2UpIHtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcignbWF4QWdlJywgJ01heGltdW0gYWdlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIG1pbmltdW0gYWdlJyk7XG4gICAgfVxuICAgIGlmIChsZWFndWUubWF4QWdlID4gMTAwKSB7IC8vIGFkanVzdCBhcyBuZWVkZWRcbiAgICAgIHJlc3VsdC5hZGRFcnJvcignbWF4QWdlJywgJ01heGltdW0gYWdlIGV4Y2VlZHMgcmVhc29uYWJsZSBsaW1pdCcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5hbWUgdmFsaWRhdGlvbnNcbiAgaWYgKCFsZWFndWUubmFtZSB8fCBsZWFndWUubmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCduYW1lJywgJ0xlYWd1ZSBuYW1lIGlzIHJlcXVpcmVkJyk7XG4gIH0gZWxzZSBpZiAobGVhZ3VlLm5hbWUubGVuZ3RoID4gMTAwKSB7IC8vIGFkanVzdCBtYXggbGVuZ3RoIGFzIG5lZWRlZFxuICAgIHJlc3VsdC5hZGRFcnJvcignbmFtZScsICdMZWFndWUgbmFtZSBjYW5ub3QgZXhjZWVkIDEwMCBjaGFyYWN0ZXJzJyk7XG4gIH1cblxuICAvLyBEZXNjcmlwdGlvbiB2YWxpZGF0aW9uIChpZiByZXF1aXJlZClcbiAgaWYgKGxlYWd1ZS5kZXNjcmlwdGlvbiAmJiBsZWFndWUuZGVzY3JpcHRpb24ubGVuZ3RoID4gNTAwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdkZXNjcmlwdGlvbicsICdEZXNjcmlwdGlvbiBjYW5ub3QgZXhjZWVkIDUwMCBjaGFyYWN0ZXJzJyk7XG4gIH1cblxuICAvLyBTaG9ydCBuYW1lIHZhbGlkYXRpb25cbiAgaWYgKGxlYWd1ZS5zaG9ydE5hbWUpIHtcbiAgICBpZiAobGVhZ3VlLnNob3J0TmFtZS5sZW5ndGggPiAxMCkge1xuICAgICAgcmVzdWx0LmFkZEVycm9yKCdzaG9ydE5hbWUnLCAnU2hvcnQgbmFtZSBjYW5ub3QgZXhjZWVkIDEwIGNoYXJhY3RlcnMnKTtcbiAgICB9XG4gICAgaWYgKCEvXltBLVphLXowLTldKyQvLnRlc3QobGVhZ3VlLnNob3J0TmFtZSkpIHtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcignc2hvcnROYW1lJywgJ1Nob3J0IG5hbWUgY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUxlYWd1ZShsZWFndWU6IFNhdmVMZWFndWVJbnB1dCB8IE1vZGlmeUxlYWd1ZUlucHV0KTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrTGVhZ3VlKGxlYWd1ZSk7XG4gIHJlc3VsdC52YWxpZGF0ZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tDbHViKGNsdWI6IFNhdmVDbHViSW5wdXQgfCBNb2RpZnlDbHViSW5wdXQpOiBWYWxpZGF0aW9uQ2hlY2tSZXN1bHQge1xuICBjb25zdCByZXN1bHQgPSBuZXcgVmFsaWRhdGlvbkNoZWNrUmVzdWx0KCk7XG5cbiAgLy8gRnVsbCBuYW1lIHZhbGlkYXRpb25zXG4gIGlmICghY2x1Yi5uYW1lIHx8IGNsdWIubmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCduYW1lJywgJ0NsdWIgbmFtZSBpcyByZXF1aXJlZCcpO1xuICB9IGVsc2UgaWYgKGNsdWIubmFtZS5sZW5ndGggPiAxMDApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ25hbWUnLCAnQ2x1YiBuYW1lIGNhbm5vdCBleGNlZWQgMTAwIGNoYXJhY3RlcnMnKTtcbiAgfVxuXG4gIC8vIFNob3J0IG5hbWUgdmFsaWRhdGlvbnNcbiAgaWYgKGNsdWIuc2hvcnROYW1lKSB7XG4gICAgaWYgKGNsdWIuc2hvcnROYW1lLmxlbmd0aCA+IDMwKSB7XG4gICAgICByZXN1bHQuYWRkRXJyb3IoJ3Nob3J0TmFtZScsICdTaG9ydCBuYW1lIGNhbm5vdCBleGNlZWQgMzAgY2hhcmFjdGVycycpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdlYnNpdGUgdmFsaWRhdGlvblxuICBpZiAoY2x1Yi53ZWJzaXRlKSB7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBVUkwoY2x1Yi53ZWJzaXRlKTtcbiAgICAgIGlmICghY2x1Yi53ZWJzaXRlLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSAmJiAhY2x1Yi53ZWJzaXRlLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcbiAgICAgICAgcmVzdWx0LmFkZEVycm9yKCd3ZWJzaXRlJywgJ1dlYnNpdGUgbXVzdCBzdGFydCB3aXRoIGh0dHA6Ly8gb3IgaHR0cHM6Ly8nKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcignd2Vic2l0ZScsICdJbnZhbGlkIHdlYnNpdGUgVVJMJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkcmVzcyB2YWxpZGF0aW9uXG4gIGlmIChjbHViLmFkZHJlc3MgJiYgKGNsdWIuYWRkcmVzcy5jaXR5IHx8IGNsdWIuYWRkcmVzcy5zdHJlZXQgfHwgY2x1Yi5hZGRyZXNzLnppcCkpIHtcbiAgICBjb25zdCBhZGRyZXNzUmVzdWx0ID0gY2hlY2tBZGRyZXNzKGNsdWIuYWRkcmVzcyk7XG4gICAgLy8gTWVyZ2UgYWRkcmVzcyBlcnJvcnMgaW50byB0aGUgbWFpbiByZXN1bHRcbiAgICBPYmplY3QuZW50cmllcyhhZGRyZXNzUmVzdWx0LmVycm9ycykuZm9yRWFjaCgoW2ZpZWxkLCBtZXNzYWdlc10pID0+IHtcbiAgICAgIG1lc3NhZ2VzLmZvckVhY2gobWVzc2FnZSA9PiByZXN1bHQuYWRkRXJyb3IoYGFkZHJlc3MuJHtmaWVsZH1gLCBtZXNzYWdlKSk7XG4gICAgfSk7XG4gICAgT2JqZWN0LmVudHJpZXMoYWRkcmVzc1Jlc3VsdC53YXJuaW5ncykuZm9yRWFjaCgoW2ZpZWxkLCBtZXNzYWdlc10pID0+IHtcbiAgICAgIG1lc3NhZ2VzLmZvckVhY2gobWVzc2FnZSA9PiByZXN1bHQuYWRkV2FybmluZyhgYWRkcmVzcy4ke2ZpZWxkfWAsIG1lc3NhZ2UpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNsdWIoY2x1YjogU2F2ZUNsdWJJbnB1dCB8IE1vZGlmeUNsdWJJbnB1dCk6IHZvaWQge1xuICBjb25zdCByZXN1bHQgPSBjaGVja0NsdWIoY2x1Yik7XG4gIHJlc3VsdC52YWxpZGF0ZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tHeW0oZ3ltOiBTYXZlR3ltSW5wdXQgfCBNb2RpZnlHeW1JbnB1dCk6IFZhbGlkYXRpb25DaGVja1Jlc3VsdCB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uQ2hlY2tSZXN1bHQoKTtcblxuICAvLyBOYW1lIHZhbGlkYXRpb25zXG4gIGlmICghZ3ltLm5hbWUgfHwgZ3ltLm5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignbmFtZScsICdHeW0gbmFtZSBpcyByZXF1aXJlZCcpO1xuICB9IGVsc2UgaWYgKGd5bS5uYW1lLmxlbmd0aCA+IDEwMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignbmFtZScsICdHeW0gbmFtZSBjYW5ub3QgZXhjZWVkIDEwMCBjaGFyYWN0ZXJzJyk7XG4gIH1cblxuICAvLyBhdmFpbGFibGUgZmllbGRzIHZhbGlkYXRpb25cbiAgaWYgKCFneW0uYXZhaWxhYmxlRmllbGRzIHx8IGd5bS5hdmFpbGFibGVGaWVsZHMudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignYXZhaWxhYmxlRmllbGRzJywgJ0F2YWlsYWJsZSBmaWVsZHMgYXJlIHJlcXVpcmVkJyk7XG4gIH1cblxuICAvLyBBZGRyZXNzIHZhbGlkYXRpb25zXG4gIGNvbnN0IGFkZHJlc3NSZXN1bHQgPSBjaGVja0FkZHJlc3MoZ3ltLmFkZHJlc3MpO1xuICAvLyBNZXJnZSBhZGRyZXNzIGVycm9ycyBpbnRvIHRoZSBtYWluIHJlc3VsdFxuICBPYmplY3QuZW50cmllcyhhZGRyZXNzUmVzdWx0LmVycm9ycykuZm9yRWFjaCgoW2ZpZWxkLCBtZXNzYWdlc10pID0+IHtcbiAgICBtZXNzYWdlcy5mb3JFYWNoKG1lc3NhZ2UgPT4gcmVzdWx0LmFkZEVycm9yKGBhZGRyZXNzLiR7ZmllbGR9YCwgbWVzc2FnZSkpO1xuICB9KTtcbiAgT2JqZWN0LmVudHJpZXMoYWRkcmVzc1Jlc3VsdC53YXJuaW5ncykuZm9yRWFjaCgoW2ZpZWxkLCBtZXNzYWdlc10pID0+IHtcbiAgICBtZXNzYWdlcy5mb3JFYWNoKG1lc3NhZ2UgPT4gcmVzdWx0LmFkZFdhcm5pbmcoYGFkZHJlc3MuJHtmaWVsZH1gLCBtZXNzYWdlKSk7XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUd5bShneW06IFNhdmVHeW1JbnB1dCB8IE1vZGlmeUd5bUlucHV0KTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrR3ltKGd5bSk7XG4gIHJlc3VsdC52YWxpZGF0ZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tTZWFzb24oc2Vhc29uOiBTYXZlU2Vhc29uSW5wdXQgfCBNb2RpZnlTZWFzb25JbnB1dCk6IFZhbGlkYXRpb25DaGVja1Jlc3VsdCB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uQ2hlY2tSZXN1bHQoKTtcblxuICAvLyBOYW1lIHZhbGlkYXRpb25zXG4gIGlmICghc2Vhc29uLm5hbWUgfHwgc2Vhc29uLm5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignbmFtZScsICdTZWFzb24gbmFtZSBpcyByZXF1aXJlZCcpO1xuICB9IGVsc2UgaWYgKHNlYXNvbi5uYW1lLmxlbmd0aCA+IDEwMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignbmFtZScsICdTZWFzb24gbmFtZSBjYW5ub3QgZXhjZWVkIDEwMCBjaGFyYWN0ZXJzJyk7XG4gIH1cblxuICAvLyBDaGVjayBmb3IgdmFsaWQgZGF0ZXNcbiAgY29uc3Qgc3RhcnREYXRlID0gbmV3IERhdGUoc2Vhc29uLnN0YXJ0RGF0ZSk7XG4gIGNvbnN0IGVuZERhdGUgPSBuZXcgRGF0ZShzZWFzb24uZW5kRGF0ZSk7XG4gIGNvbnN0IHJlZ2lzdHJhdGlvbkVuZCA9IG5ldyBEYXRlKHNlYXNvbi5yZWdpc3RyYXRpb25FbmQpO1xuXG4gIGlmIChpc05hTihzdGFydERhdGUuZ2V0VGltZSgpKSB8fCBpc05hTihlbmREYXRlLmdldFRpbWUoKSkgfHwgaXNOYU4ocmVnaXN0cmF0aW9uRW5kLmdldFRpbWUoKSkpIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ2RhdGVzJywgJ0ludmFsaWQgZGF0ZSBmb3JtYXQnKTtcbiAgfVxuXG4gIGlmIChzZWFzb24ucmVnaXN0cmF0aW9uU3RhcnQpIHtcbiAgICBjb25zdCByZWdpc3RyYXRpb25TdGFydCA9IG5ldyBEYXRlKHNlYXNvbi5yZWdpc3RyYXRpb25TdGFydCk7XG4gICAgaWYgKGlzTmFOKHJlZ2lzdHJhdGlvblN0YXJ0LmdldFRpbWUoKSkpIHtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcigncmVnaXN0cmF0aW9uU3RhcnQnLCAnSW52YWxpZCBkYXRlIGZvcm1hdCcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNlYXNvbiBkYXRlIHZhbGlkYXRpb25zXG4gIGlmIChlbmREYXRlIDw9IHN0YXJ0RGF0ZSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignZW5kRGF0ZScsICdTZWFzb24gZW5kIGRhdGUgbXVzdCBiZSBhZnRlciBzdGFydCBkYXRlJyk7XG4gIH1cblxuICAvLyBSZWdpc3RyYXRpb24gcGVyaW9kIHZhbGlkYXRpb25zXG4gIGlmIChzZWFzb24ucmVnaXN0cmF0aW9uU3RhcnQpIHtcbiAgICBjb25zdCByZWdpc3RyYXRpb25TdGFydCA9IG5ldyBEYXRlKHNlYXNvbi5yZWdpc3RyYXRpb25TdGFydCk7XG4gICAgaWYgKHJlZ2lzdHJhdGlvblN0YXJ0KSB7XG4gICAgICBpZiAocmVnaXN0cmF0aW9uRW5kIDw9IHJlZ2lzdHJhdGlvblN0YXJ0KSB7XG4gICAgICAgIHJlc3VsdC5hZGRFcnJvcigncmVnaXN0cmF0aW9uRW5kJywgJ1JlZ2lzdHJhdGlvbiBlbmQgZGF0ZSBtdXN0IGJlIGFmdGVyIHJlZ2lzdHJhdGlvbiBzdGFydCBkYXRlJyk7XG4gICAgICB9XG4gICAgICBpZiAocmVnaXN0cmF0aW9uU3RhcnQgPj0gc3RhcnREYXRlKSB7XG4gICAgICAgIHJlc3VsdC5hZGRFcnJvcigncmVnaXN0cmF0aW9uU3RhcnQnLCAnUmVnaXN0cmF0aW9uIG11c3Qgc3RhcnQgYmVmb3JlIHNlYXNvbiBzdGFydCBkYXRlJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHJlZ2lzdHJhdGlvbkVuZCA+IHN0YXJ0RGF0ZSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcigncmVnaXN0cmF0aW9uRW5kJywgJ1JlZ2lzdHJhdGlvbiBtdXN0IGVuZCBiZWZvcmUgc2Vhc29uIHN0YXJ0IGRhdGUnKTtcbiAgfVxuXG4gIC8vIEZ1dHVyZSBkYXRlIHZhbGlkYXRpb25cbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgaWYgKHN0YXJ0RGF0ZSA8IG5vdykge1xuICAgIHJlc3VsdC5hZGRFcnJvcignc3RhcnREYXRlJywgJ1NlYXNvbiBzdGFydCBkYXRlIGNhbm5vdCBiZSBpbiB0aGUgcGFzdCcpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2Vhc29uKHNlYXNvbjogU2F2ZVNlYXNvbklucHV0IHwgTW9kaWZ5U2Vhc29uSW5wdXQpOiB2b2lkIHtcbiAgY29uc3QgcmVzdWx0ID0gY2hlY2tTZWFzb24oc2Vhc29uKTtcbiAgcmVzdWx0LnZhbGlkYXRlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1BlcnNvbihwZXJzb246IFNhdmVQZXJzb25JbnB1dCB8IE1vZGlmeVBlcnNvbklucHV0KTogVmFsaWRhdGlvbkNoZWNrUmVzdWx0IHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25DaGVja1Jlc3VsdCgpO1xuXG4gIC8vIE5hbWUgdmFsaWRhdGlvbnNcbiAgaWYgKCFwZXJzb24uZmlyc3ROYW1lPy50cmltKCkpIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ2ZpcnN0TmFtZScsICdGaXJzdCBuYW1lIGlzIHJlcXVpcmVkJyk7XG4gIH1cblxuICBpZiAoIXBlcnNvbi5sYXN0TmFtZT8udHJpbSgpKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdsYXN0TmFtZScsICdMYXN0IG5hbWUgaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIC8vIEVtYWlsIHZhbGlkYXRpb25cbiAgaWYgKHBlcnNvbi5lbWFpbCAmJiAhL15bXlxcc0BdK0BbXlxcc0BdK1xcLlteXFxzQF0rJC8udGVzdChwZXJzb24uZW1haWwpKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdlbWFpbCcsICdJbnZhbGlkIGVtYWlsIGZvcm1hdCcpO1xuICB9XG5cbiAgLy8gUGhvbmUgbnVtYmVyIHZhbGlkYXRpb25cbiAgaWYgKHBlcnNvbi5waG9uZSkge1xuICAgIC8vIEFsbG93IGRpZ2l0cywgc3BhY2VzLCArLCAtLCBhbmQgKClcbiAgICBjb25zdCBwaG9uZVJlZ2V4ID0gL15bXFxkXFxzKygpLV17OCwyMH0kLztcbiAgICBpZiAoIXBob25lUmVnZXgudGVzdChwZXJzb24ucGhvbmUpKSB7XG4gICAgICByZXN1bHQuYWRkRXJyb3IoJ3Bob25lJywgJ0ludmFsaWQgcGhvbmUgbnVtYmVyIGZvcm1hdCcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIERhdGUgb2YgYmlydGggdmFsaWRhdGlvblxuICBpZiAocGVyc29uLmRhdGVPZkJpcnRoKSB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHBlcnNvbi5kYXRlT2ZCaXJ0aCk7XG4gICAgaWYgKGlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuICAgICAgcmVzdWx0LmFkZEVycm9yKCdkYXRlT2ZCaXJ0aCcsICdJbnZhbGlkIGRhdGUgb2YgYmlydGggZm9ybWF0Jyk7XG4gICAgfVxuICAgIC8vIEFkZCBhZ2UgcmVzdHJpY3Rpb25zIGlmIG5lZWRlZFxuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICBpZiAoZGF0ZSA+IHRvZGF5KSB7XG4gICAgICByZXN1bHQuYWRkRXJyb3IoJ2RhdGVPZkJpcnRoJywgJ0RhdGUgb2YgYmlydGggY2Fubm90IGJlIGluIHRoZSBmdXR1cmUnKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGRyZXNzIHZhbGlkYXRpb25cbiAgaWYgKHBlcnNvbi5hZGRyZXNzICYmIChwZXJzb24uYWRkcmVzcy5jaXR5IHx8IHBlcnNvbi5hZGRyZXNzLnN0cmVldCB8fCBwZXJzb24uYWRkcmVzcy56aXApKSB7XG4gICAgY29uc3QgYWRkcmVzc1Jlc3VsdCA9IGNoZWNrQWRkcmVzcyhwZXJzb24uYWRkcmVzcyk7XG4gICAgLy8gTWVyZ2UgYWRkcmVzcyBlcnJvcnMgaW50byB0aGUgbWFpbiByZXN1bHRcbiAgICBPYmplY3QuZW50cmllcyhhZGRyZXNzUmVzdWx0LmVycm9ycykuZm9yRWFjaCgoW2ZpZWxkLCBtZXNzYWdlc10pID0+IHtcbiAgICAgIG1lc3NhZ2VzLmZvckVhY2gobWVzc2FnZSA9PiByZXN1bHQuYWRkRXJyb3IoYGFkZHJlc3MuJHtmaWVsZH1gLCBtZXNzYWdlKSk7XG4gICAgfSk7XG4gICAgT2JqZWN0LmVudHJpZXMoYWRkcmVzc1Jlc3VsdC53YXJuaW5ncykuZm9yRWFjaCgoW2ZpZWxkLCBtZXNzYWdlc10pID0+IHtcbiAgICAgIG1lc3NhZ2VzLmZvckVhY2gobWVzc2FnZSA9PiByZXN1bHQuYWRkV2FybmluZyhgYWRkcmVzcy4ke2ZpZWxkfWAsIG1lc3NhZ2UpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVBlcnNvbihwZXJzb246IFNhdmVQZXJzb25JbnB1dCB8IE1vZGlmeVBlcnNvbklucHV0KTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrUGVyc29uKHBlcnNvbik7XG4gIHJlc3VsdC52YWxpZGF0ZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tBc3NvY2lhdGlvbihhc3NvY2lhdGlvbjogU2F2ZUFzc29jaWF0aW9uSW5wdXQgfCBNb2RpZnlBc3NvY2lhdGlvbklucHV0KTogVmFsaWRhdGlvbkNoZWNrUmVzdWx0IHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25DaGVja1Jlc3VsdCgpO1xuXG4gIC8vIE5hbWUgdmFsaWRhdGlvblxuICBpZiAoIWFzc29jaWF0aW9uLm5hbWU/LnRyaW0oKSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignbmFtZScsICdBc3NvY2lhdGlvbiBuYW1lIGlzIHJlcXVpcmVkJyk7XG4gIH0gZWxzZSBpZiAoYXNzb2NpYXRpb24ubmFtZS5sZW5ndGggPiAxMDApIHsgLy8gYWRqdXN0IG1heCBsZW5ndGggYXMgbmVlZGVkXG4gICAgcmVzdWx0LmFkZEVycm9yKCduYW1lJywgJ0Fzc29jaWF0aW9uIG5hbWUgY2Fubm90IGV4Y2VlZCAxMDAgY2hhcmFjdGVycycpO1xuICB9XG5cbiAgLy8gQ29udGFjdCBFbWFpbCB2YWxpZGF0aW9uXG4gIGlmICghYXNzb2NpYXRpb24uY29udGFjdEVtYWlsPy50cmltKCkpIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ2NvbnRhY3RFbWFpbCcsICdDb250YWN0IGVtYWlsIGlzIHJlcXVpcmVkJyk7XG4gIH0gZWxzZSBpZiAoIS9eW15cXHNAXStAW15cXHNAXStcXC5bXlxcc0BdKyQvLnRlc3QoYXNzb2NpYXRpb24uY29udGFjdEVtYWlsKSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignY29udGFjdEVtYWlsJywgJ0ludmFsaWQgY29udGFjdCBlbWFpbCBmb3JtYXQnKTtcbiAgfVxuXG4gIC8vIENvbnRhY3QgTmFtZSB2YWxpZGF0aW9uXG4gIGlmICghYXNzb2NpYXRpb24uY29udGFjdE5hbWU/LnRyaW0oKSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignY29udGFjdE5hbWUnLCAnQ29udGFjdCBuYW1lIGlzIHJlcXVpcmVkJyk7XG4gIH1cblxuICAvLyBBZGRyZXNzIHZhbGlkYXRpb25cbiAgY29uc3QgYWRkcmVzc1Jlc3VsdCA9IGNoZWNrQWRkcmVzcyhhc3NvY2lhdGlvbi5hZGRyZXNzKTtcbiAgLy8gTWVyZ2UgYWRkcmVzcyBlcnJvcnMgaW50byB0aGUgbWFpbiByZXN1bHRcbiAgT2JqZWN0LmVudHJpZXMoYWRkcmVzc1Jlc3VsdC5lcnJvcnMpLmZvckVhY2goKFtmaWVsZCwgbWVzc2FnZXNdKSA9PiB7XG4gICAgbWVzc2FnZXMuZm9yRWFjaChtZXNzYWdlID0+IHJlc3VsdC5hZGRFcnJvcihgYWRkcmVzcy4ke2ZpZWxkfWAsIG1lc3NhZ2UpKTtcbiAgfSk7XG4gIE9iamVjdC5lbnRyaWVzKGFkZHJlc3NSZXN1bHQud2FybmluZ3MpLmZvckVhY2goKFtmaWVsZCwgbWVzc2FnZXNdKSA9PiB7XG4gICAgbWVzc2FnZXMuZm9yRWFjaChtZXNzYWdlID0+IHJlc3VsdC5hZGRXYXJuaW5nKGBhZGRyZXNzLiR7ZmllbGR9YCwgbWVzc2FnZSkpO1xuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVBc3NvY2lhdGlvbihhc3NvY2lhdGlvbjogU2F2ZUFzc29jaWF0aW9uSW5wdXQgfCBNb2RpZnlBc3NvY2lhdGlvbklucHV0KTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrQXNzb2NpYXRpb24oYXNzb2NpYXRpb24pO1xuICByZXN1bHQudmFsaWRhdGUoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrTGVhZ3VlR3JvdXAobGVhZ3VlR3JvdXA6IFNhdmVMZWFndWVHcm91cElucHV0IHwgTW9kaWZ5TGVhZ3VlR3JvdXBJbnB1dCk6IFZhbGlkYXRpb25DaGVja1Jlc3VsdCB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uQ2hlY2tSZXN1bHQoKTtcblxuICAvLyBOYW1lIHZhbGlkYXRpb25zXG4gIGlmICghbGVhZ3VlR3JvdXAubmFtZSB8fCBsZWFndWVHcm91cC5uYW1lLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ25hbWUnLCAnTGVhZ3VlIGdyb3VwIG5hbWUgaXMgcmVxdWlyZWQnKTtcbiAgfSBlbHNlIGlmIChsZWFndWVHcm91cC5uYW1lLmxlbmd0aCA+IDEwMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignbmFtZScsICdMZWFndWUgZ3JvdXAgbmFtZSBjYW5ub3QgZXhjZWVkIDEwMCBjaGFyYWN0ZXJzJyk7XG4gIH1cblxuICAvLyBOdW1iZXIgdmFsaWRhdGlvblxuICBpZiAobGVhZ3VlR3JvdXAubnVtYmVyIDwgMSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignbnVtYmVyJywgJ0xlYWd1ZSBncm91cCBudW1iZXIgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICB9XG5cbiAgLy8gU2hvcnQgbmFtZSB2YWxpZGF0aW9uc1xuICBpZiAoIWxlYWd1ZUdyb3VwLnNob3J0TmFtZSB8fCBsZWFndWVHcm91cC5zaG9ydE5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignc2hvcnROYW1lJywgJ0xlYWd1ZSBncm91cCBzaG9ydCBuYW1lIGlzIHJlcXVpcmVkJyk7XG4gIH0gZWxzZSBpZiAobGVhZ3VlR3JvdXAuc2hvcnROYW1lLmxlbmd0aCA+IDEwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdzaG9ydE5hbWUnLCAnTGVhZ3VlIGdyb3VwIHNob3J0IG5hbWUgY2Fubm90IGV4Y2VlZCAxMCBjaGFyYWN0ZXJzJyk7XG4gIH0gZWxzZSBpZiAoIS9eW0EtWmEtejAtOV0rJC8udGVzdChsZWFndWVHcm91cC5zaG9ydE5hbWUpKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdzaG9ydE5hbWUnLCAnTGVhZ3VlIGdyb3VwIHNob3J0IG5hbWUgY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycycpO1xuICB9XG5cbiAgLy8gUmVndWxhdGlvbiB2YWxpZGF0aW9uXG4gIGlmICghbGVhZ3VlR3JvdXAucmVndWxhdGlvbiB8fCBsZWFndWVHcm91cC5yZWd1bGF0aW9uLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ3JlZ3VsYXRpb24nLCAnTGVhZ3VlIGdyb3VwIHJlZ3VsYXRpb24gaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUxlYWd1ZUdyb3VwKGxlYWd1ZUdyb3VwOiBTYXZlTGVhZ3VlR3JvdXBJbnB1dCB8IE1vZGlmeUxlYWd1ZUdyb3VwSW5wdXQpOiB2b2lkIHtcbiAgY29uc3QgcmVzdWx0ID0gY2hlY2tMZWFndWVHcm91cChsZWFndWVHcm91cCk7XG4gIHJlc3VsdC52YWxpZGF0ZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tUZWFtKHRlYW06IFNhdmVUZWFtSW5wdXQgfCBNb2RpZnlUZWFtSW5wdXQgfCBSZWdpc3RlclRlYW1JbnB1dCk6IFZhbGlkYXRpb25DaGVja1Jlc3VsdCB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uQ2hlY2tSZXN1bHQoKTtcblxuICAvLyBOYW1lIHZhbGlkYXRpb25cbiAgaWYgKCduYW1lJyBpbiB0ZWFtICYmIHRlYW0ubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRlYW0ubmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXN1bHQuYWRkRXJyb3IoJ25hbWUnLCAnVGVhbSBuYW1lIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgIH0gZWxzZSBpZiAodGVhbS5uYW1lLmxlbmd0aCA+IDEwMCkge1xuICAgICAgcmVzdWx0LmFkZEVycm9yKCduYW1lJywgJ1RlYW0gbmFtZSBjYW5ub3QgZXhjZWVkIDEwMCBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCEoJ2lkJyBpbiB0ZWFtKSkgeyAvLyBpZiBpZCBpcyBub3QgaW4gdGVhbSwgdGhlbiBpdCBpcyBhIG5ldyB0ZWFtXG4gICAgcmVzdWx0LmFkZEVycm9yKCduYW1lJywgJ1RlYW0gbmFtZSBpcyByZXF1aXJlZCcpO1xuICB9XG5cbiAgLy8gTGVhZ3VlIElEIHZhbGlkYXRpb25cbiAgaWYgKCdsZWFndWVJZCcgaW4gdGVhbSAmJiB0ZWFtLmxlYWd1ZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodGVhbS5sZWFndWVJZC50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXN1bHQuYWRkRXJyb3IoJ2xlYWd1ZUlkJywgJ0xlYWd1ZSBJRCBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICB9IGVsc2UgaWYgKHRlYW0ubGVhZ3VlSWQubGVuZ3RoID4gMTAwKSB7XG4gICAgICByZXN1bHQuYWRkRXJyb3IoJ2xlYWd1ZUlkJywgJ0xlYWd1ZSBJRCBjYW5ub3QgZXhjZWVkIDEwMCBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCEoJ2lkJyBpbiB0ZWFtKSkgeyAvLyBpZiBpZCBpcyBub3QgaW4gdGVhbSwgdGhlbiBpdCBpcyBhIG5ldyB0ZWFtXG4gICAgcmVzdWx0LmFkZEVycm9yKCdsZWFndWVJZCcsICdMZWFndWUgSUQgaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIC8vIEV4ZW1wdGlvbiByZXF1ZXN0IHZhbGlkYXRpb25cbiAgaWYgKHRlYW0uZXhlbXB0aW9uUmVxdWVzdCkge1xuICAgIGlmICh0ZWFtLmV4ZW1wdGlvblJlcXVlc3QudHJpbSgpLmxlbmd0aCA+IDEwMDApIHtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcignZXhlbXB0aW9uUmVxdWVzdCcsICdFeGVtcHRpb24gcmVxdWVzdCBjYW5ub3QgZXhjZWVkIDEwMDAgY2hhcmFjdGVycycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVRlYW0odGVhbTogU2F2ZVRlYW1JbnB1dCB8IE1vZGlmeVRlYW1JbnB1dCB8IFJlZ2lzdGVyVGVhbUlucHV0KTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrVGVhbSh0ZWFtKTtcbiAgcmVzdWx0LnZhbGlkYXRlKCk7XG59XG4iXX0=
|
package/package.json
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@taimos/radball-digital-api",
|
|
3
|
+
"description": "Radball Digital API",
|
|
4
|
+
"repository": {
|
|
5
|
+
"type": "git",
|
|
6
|
+
"url": "https://github.com/taimos/radball-digital-api.git"
|
|
7
|
+
},
|
|
8
|
+
"scripts": {
|
|
9
|
+
"build": "npx projen build",
|
|
10
|
+
"bump": "npx projen bump",
|
|
11
|
+
"clobber": "npx projen clobber",
|
|
12
|
+
"compile": "npx projen compile",
|
|
13
|
+
"default": "npx projen default",
|
|
14
|
+
"docgen": "npx projen docgen",
|
|
15
|
+
"eject": "npx projen eject",
|
|
16
|
+
"eslint": "npx projen eslint",
|
|
17
|
+
"generate:api:graphql": "npx projen generate:api:graphql",
|
|
18
|
+
"generate:api:rest": "npx projen generate:api:rest",
|
|
19
|
+
"package": "npx projen package",
|
|
20
|
+
"post-compile": "npx projen post-compile",
|
|
21
|
+
"post-upgrade": "npx projen post-upgrade",
|
|
22
|
+
"pre-compile": "npx projen pre-compile",
|
|
23
|
+
"release": "npx projen release",
|
|
24
|
+
"test": "npx projen test",
|
|
25
|
+
"test:watch": "npx projen test:watch",
|
|
26
|
+
"unbump": "npx projen unbump",
|
|
27
|
+
"upgrade": "npx projen upgrade",
|
|
28
|
+
"watch": "npx projen watch",
|
|
29
|
+
"projen": "npx projen"
|
|
30
|
+
},
|
|
31
|
+
"author": {
|
|
32
|
+
"name": "Taimos GmbH",
|
|
33
|
+
"email": "info@taimos.de",
|
|
34
|
+
"url": "https://taimos.de",
|
|
35
|
+
"organization": true
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@graphql-codegen/cli": "^5.0.7",
|
|
39
|
+
"@graphql-codegen/typescript": "^4.1.6",
|
|
40
|
+
"@stylistic/eslint-plugin": "^2",
|
|
41
|
+
"@taimos/projen": "^0.1.11",
|
|
42
|
+
"@types/jest": "^30.0.0",
|
|
43
|
+
"@types/node": "^24.0.3",
|
|
44
|
+
"@typescript-eslint/eslint-plugin": "^8",
|
|
45
|
+
"@typescript-eslint/parser": "^8",
|
|
46
|
+
"commit-and-tag-version": "^12",
|
|
47
|
+
"constructs": "^10.0.0",
|
|
48
|
+
"eslint": "^9",
|
|
49
|
+
"eslint-import-resolver-typescript": "^4.4.3",
|
|
50
|
+
"eslint-plugin-import": "^2.32.0",
|
|
51
|
+
"jest": "^29.7.0",
|
|
52
|
+
"jest-junit": "^16",
|
|
53
|
+
"projen": "0.91.31",
|
|
54
|
+
"projen-pipelines": "^0.2.10",
|
|
55
|
+
"ts-jest": "^29.4.0",
|
|
56
|
+
"ts-node": "^10.9.2",
|
|
57
|
+
"typedoc": "^0.28.5",
|
|
58
|
+
"typescript": "^5.8.3"
|
|
59
|
+
},
|
|
60
|
+
"dependencies": {
|
|
61
|
+
"date-fns": "^4.1.0",
|
|
62
|
+
"graphql": "^16.11.0",
|
|
63
|
+
"openapi-typescript": "^7.8.0",
|
|
64
|
+
"uuid": "^8.3.2"
|
|
65
|
+
},
|
|
66
|
+
"keywords": [
|
|
67
|
+
"api",
|
|
68
|
+
"digital",
|
|
69
|
+
"radball"
|
|
70
|
+
],
|
|
71
|
+
"main": "lib/index.js",
|
|
72
|
+
"license": "UNLICENSED",
|
|
73
|
+
"publishConfig": {
|
|
74
|
+
"access": "public"
|
|
75
|
+
},
|
|
76
|
+
"version": "0.0.0",
|
|
77
|
+
"jest": {
|
|
78
|
+
"coverageProvider": "v8",
|
|
79
|
+
"moduleNameMapper": {
|
|
80
|
+
"^@generated/(.*)$": "<rootDir>/src/generated/$1",
|
|
81
|
+
"^@util/(.*)$": "<rootDir>/src/util/$1"
|
|
82
|
+
},
|
|
83
|
+
"testMatch": [
|
|
84
|
+
"<rootDir>/@(src|test)/**/*(*.)@(spec|test).ts?(x)",
|
|
85
|
+
"<rootDir>/@(src|test)/**/__tests__/**/*.ts?(x)",
|
|
86
|
+
"<rootDir>/@(projenrc)/**/*(*.)@(spec|test).ts?(x)",
|
|
87
|
+
"<rootDir>/@(projenrc)/**/__tests__/**/*.ts?(x)"
|
|
88
|
+
],
|
|
89
|
+
"clearMocks": true,
|
|
90
|
+
"collectCoverage": true,
|
|
91
|
+
"coverageReporters": [
|
|
92
|
+
"json",
|
|
93
|
+
"lcov",
|
|
94
|
+
"clover",
|
|
95
|
+
"cobertura",
|
|
96
|
+
"text"
|
|
97
|
+
],
|
|
98
|
+
"coverageDirectory": "coverage",
|
|
99
|
+
"coveragePathIgnorePatterns": [
|
|
100
|
+
"/node_modules/"
|
|
101
|
+
],
|
|
102
|
+
"testPathIgnorePatterns": [
|
|
103
|
+
"/node_modules/"
|
|
104
|
+
],
|
|
105
|
+
"watchPathIgnorePatterns": [
|
|
106
|
+
"/node_modules/"
|
|
107
|
+
],
|
|
108
|
+
"reporters": [
|
|
109
|
+
"default",
|
|
110
|
+
[
|
|
111
|
+
"jest-junit",
|
|
112
|
+
{
|
|
113
|
+
"outputDirectory": "test-reports"
|
|
114
|
+
}
|
|
115
|
+
]
|
|
116
|
+
],
|
|
117
|
+
"transform": {
|
|
118
|
+
"^.+\\.[t]sx?$": [
|
|
119
|
+
"ts-jest",
|
|
120
|
+
{
|
|
121
|
+
"tsconfig": "tsconfig.dev.json"
|
|
122
|
+
}
|
|
123
|
+
]
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
"types": "lib/index.d.ts",
|
|
127
|
+
"//": "~~ Generated by projen. To modify, edit .projenrc.ts and run \"npx projen\"."
|
|
128
|
+
}
|