@communecter/cocolight-api-client 1.0.77 → 1.0.78
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/dist/cocolight-api-client.browser.js +1 -1
- package/dist/cocolight-api-client.cjs +1 -1
- package/dist/cocolight-api-client.mjs.js +1 -1
- package/dist/cocolight-api-client.vite.mjs.js +1 -1
- package/dist/cocolight-api-client.vite.mjs.js.map +1 -1
- package/package.json +1 -1
- package/src/api/BaseEntity.ts +1 -2
- package/src/api/User.ts +185 -0
- package/types/api/BaseEntity.d.ts +1 -2
- package/types/api/User.d.ts +137 -0
package/package.json
CHANGED
package/src/api/BaseEntity.ts
CHANGED
|
@@ -2231,9 +2231,8 @@ export class BaseEntity<TServerData = any> {
|
|
|
2231
2231
|
* - `connectTypeConnect` : valeur envoyée pour `connect()`
|
|
2232
2232
|
* - `connectTypeDisconnect` : valeur envoyée pour `disconnect()`
|
|
2233
2233
|
* @throws {ApiError} - Si le type d'entité est inconnu.
|
|
2234
|
-
* @protected
|
|
2235
2234
|
*/
|
|
2236
|
-
|
|
2235
|
+
_getLinkMeta(): LinkMeta {
|
|
2237
2236
|
const map = {
|
|
2238
2237
|
organizations: {
|
|
2239
2238
|
linkType: "memberOf",
|
package/src/api/User.ts
CHANGED
|
@@ -888,6 +888,191 @@ export class User extends BaseEntity<UserItemNormalized> {
|
|
|
888
888
|
}
|
|
889
889
|
return super.entityBySlug(slug);
|
|
890
890
|
}
|
|
891
|
+
|
|
892
|
+
/**
|
|
893
|
+
* Valide les préconditions communes pour les méthodes de vérification de rôle.
|
|
894
|
+
* @private
|
|
895
|
+
* @param methodName - Nom de la méthode appelante (pour les messages d'erreur).
|
|
896
|
+
* @param expectedTypes - Types d'entité parent autorisés.
|
|
897
|
+
* @throws {ApiError} 401 - Si l'utilisateur n'est pas connecté.
|
|
898
|
+
* @throws {ApiError} 401 - Si l'utilisateur connecté n'est pas administrateur de l'entité parente.
|
|
899
|
+
* @throws {ApiError} 404 - Si l'utilisateur n'est pas enregistré.
|
|
900
|
+
* @throws {ApiError} 404 - Si l'entité parente n'est pas enregistrée.
|
|
901
|
+
* @throws {ApiError} 400 - Si le type d'entité parent n'est pas valide.
|
|
902
|
+
*/
|
|
903
|
+
private _validateRoleCheckPreconditions(methodName: string, expectedTypes: string[]): void {
|
|
904
|
+
if (!this.userId) {
|
|
905
|
+
throw new ApiError(`Vous devez être connecté pour ${methodName}.`, 401);
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
if(!this.parent?.isAdmin()){
|
|
909
|
+
throw new ApiError("Vous devez être administrateur pour effectuer cette action.", 401);
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
if (!this.id) {
|
|
913
|
+
throw new ApiError(`${this.constructor.name} non enregistrée.`, 404);
|
|
914
|
+
}
|
|
915
|
+
|
|
916
|
+
if(!this.parent?.id){
|
|
917
|
+
throw new ApiError("L'entité parente n'est pas enregistrée.", 404);
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
if (!expectedTypes.includes(this.parent.getEntityType())) {
|
|
921
|
+
throw new ApiError(`L'entité doit être de type : ${expectedTypes.join(", ")}, reçu : ${this.parent.getEntityType()}`, 400);
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
|
|
925
|
+
/**
|
|
926
|
+
* Récupère le lien utilisateur pour l'entité parente.
|
|
927
|
+
* @private
|
|
928
|
+
* @returns Le lien utilisateur ou null.
|
|
929
|
+
*/
|
|
930
|
+
private _getUserLinkForParent(): any {
|
|
931
|
+
const { linkType } = this.parent!._getLinkMeta();
|
|
932
|
+
const parentId = this.parent!.id;
|
|
933
|
+
if (!parentId) return null;
|
|
934
|
+
return this?.serverData?.links?.[linkType]?.[parentId] || null;
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
/**
|
|
938
|
+
* Vérifie si l'utilisateur est administrateur de l'entité parente.
|
|
939
|
+
*
|
|
940
|
+
* Cette méthode permet de vérifier si un utilisateur possède les droits d'administration
|
|
941
|
+
* sur l'organisation ou le projet parent. Elle est particulièrement utile après avoir
|
|
942
|
+
* récupéré des membres via `getMembers()` pour déterminer leur niveau de permissions.
|
|
943
|
+
*
|
|
944
|
+
* @returns `true` si l'utilisateur est administrateur de l'entité parente, `false` sinon.
|
|
945
|
+
*
|
|
946
|
+
* @throws {ApiError} 401 - Si l'utilisateur n'est pas connecté.
|
|
947
|
+
* @throws {ApiError} 401 - Si l'utilisateur connecté n'est pas administrateur de l'entité parente.
|
|
948
|
+
* @throws {ApiError} 404 - Si l'utilisateur n'est pas enregistré (pas d'ID).
|
|
949
|
+
* @throws {ApiError} 404 - Si l'entité parente n'est pas enregistrée (pas d'ID).
|
|
950
|
+
* @throws {ApiError} 400 - Si l'entité parente n'est pas de type "organizations" ou "projects".
|
|
951
|
+
*
|
|
952
|
+
* @example
|
|
953
|
+
* // Vérifier les admins d'une organisation
|
|
954
|
+
* const org = await me.organization({ slug: "openAtlas" });
|
|
955
|
+
* const members = await org.getMembers();
|
|
956
|
+
*
|
|
957
|
+
* for (const member of members.results) {
|
|
958
|
+
* if (member.getEntityType() === "citoyens") {
|
|
959
|
+
* if (member.isAdmin()) {
|
|
960
|
+
* console.log(`${member.data.name} est administrateur`);
|
|
961
|
+
* }
|
|
962
|
+
* }
|
|
963
|
+
* }
|
|
964
|
+
*
|
|
965
|
+
* @example
|
|
966
|
+
* // Récupérer uniquement les membres admins
|
|
967
|
+
* const org = await me.organization({ slug: "myOrg" });
|
|
968
|
+
* const adminMembers = await org.getMembers({}, { isAdmin: true });
|
|
969
|
+
*
|
|
970
|
+
* // Vérifier chaque admin
|
|
971
|
+
* for (const admin of adminMembers.results) {
|
|
972
|
+
* if (admin.getEntityType() === "citoyens" && admin.isAdmin()) {
|
|
973
|
+
* console.log(`${admin.data.name} a les droits admin`);
|
|
974
|
+
* }
|
|
975
|
+
* }
|
|
976
|
+
*/
|
|
977
|
+
override isAdmin(): boolean {
|
|
978
|
+
this._validateRoleCheckPreconditions("isAdmin", ["organizations", "projects"]);
|
|
979
|
+
const userLink = this._getUserLinkForParent();
|
|
980
|
+
return this._validateUserLink(userLink) && userLink?.isAdmin === true && !userLink?.isAdminPending;
|
|
981
|
+
}
|
|
982
|
+
|
|
983
|
+
/**
|
|
984
|
+
* Vérifie si l'utilisateur est membre de l'organisation parente.
|
|
985
|
+
*
|
|
986
|
+
* Cette méthode permet de vérifier si un utilisateur est membre actif d'une organisation.
|
|
987
|
+
* Elle est utile pour déterminer si un utilisateur a accès aux ressources de l'organisation.
|
|
988
|
+
*
|
|
989
|
+
* @returns `true` si l'utilisateur est membre validé de l'organisation parente, `false` sinon.
|
|
990
|
+
*
|
|
991
|
+
* @throws {ApiError} 401 - Si l'utilisateur n'est pas connecté.
|
|
992
|
+
* @throws {ApiError} 401 - Si l'utilisateur connecté n'est pas administrateur de l'entité parente.
|
|
993
|
+
* @throws {ApiError} 404 - Si l'utilisateur n'est pas enregistré (pas d'ID).
|
|
994
|
+
* @throws {ApiError} 404 - Si l'entité parente n'est pas enregistrée (pas d'ID).
|
|
995
|
+
* @throws {ApiError} 400 - Si l'entité parente n'est pas de type "organizations".
|
|
996
|
+
*
|
|
997
|
+
* @example
|
|
998
|
+
* // Vérifier les membres d'une organisation
|
|
999
|
+
* const org = await me.organization({ slug: "myOrg" });
|
|
1000
|
+
* const members = await org.getMembers();
|
|
1001
|
+
*
|
|
1002
|
+
* for (const member of members.results) {
|
|
1003
|
+
* if (member.getEntityType() === "citoyens" && member.isMember()) {
|
|
1004
|
+
* console.log(`${member.data.name} est membre de l'organisation`);
|
|
1005
|
+
* }
|
|
1006
|
+
* }
|
|
1007
|
+
*/
|
|
1008
|
+
override isMember(): boolean {
|
|
1009
|
+
this._validateRoleCheckPreconditions("isMember", ["organizations"]);
|
|
1010
|
+
const userLink = this._getUserLinkForParent();
|
|
1011
|
+
return this._validateUserLink(userLink);
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1014
|
+
/**
|
|
1015
|
+
* Vérifie si l'utilisateur est contributeur du projet parent.
|
|
1016
|
+
*
|
|
1017
|
+
* Cette méthode permet de vérifier si un utilisateur est contributeur actif d'un projet.
|
|
1018
|
+
* Elle est utile pour déterminer si un utilisateur peut participer aux activités du projet.
|
|
1019
|
+
*
|
|
1020
|
+
* @returns `true` si l'utilisateur est contributeur validé du projet parent, `false` sinon.
|
|
1021
|
+
*
|
|
1022
|
+
* @throws {ApiError} 401 - Si l'utilisateur n'est pas connecté.
|
|
1023
|
+
* @throws {ApiError} 401 - Si l'utilisateur connecté n'est pas administrateur de l'entité parente.
|
|
1024
|
+
* @throws {ApiError} 404 - Si l'utilisateur n'est pas enregistré (pas d'ID).
|
|
1025
|
+
* @throws {ApiError} 404 - Si l'entité parente n'est pas enregistrée (pas d'ID).
|
|
1026
|
+
* @throws {ApiError} 400 - Si l'entité parente n'est pas de type "projects".
|
|
1027
|
+
*
|
|
1028
|
+
* @example
|
|
1029
|
+
* // Vérifier les contributeurs d'un projet
|
|
1030
|
+
* const project = await me.project({ slug: "myProject" });
|
|
1031
|
+
* const contributors = await project.getContributors();
|
|
1032
|
+
*
|
|
1033
|
+
* for (const contributor of contributors.results) {
|
|
1034
|
+
* if (contributor.getEntityType() === "citoyens" && contributor.isContributor()) {
|
|
1035
|
+
* console.log(`${contributor.data.name} est contributeur du projet`);
|
|
1036
|
+
* }
|
|
1037
|
+
* }
|
|
1038
|
+
*/
|
|
1039
|
+
override isContributor(): boolean {
|
|
1040
|
+
this._validateRoleCheckPreconditions("isContributor", ["projects"]);
|
|
1041
|
+
const userLink = this._getUserLinkForParent();
|
|
1042
|
+
return this._validateUserLink(userLink);
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1045
|
+
/**
|
|
1046
|
+
* Vérifie si l'utilisateur est participant de l'événement parent.
|
|
1047
|
+
*
|
|
1048
|
+
* Cette méthode permet de vérifier si un utilisateur est inscrit comme participant à un événement.
|
|
1049
|
+
* Elle est utile pour déterminer si un utilisateur a confirmé sa participation à l'événement.
|
|
1050
|
+
*
|
|
1051
|
+
* @returns `true` si l'utilisateur est participant validé de l'événement parent, `false` sinon.
|
|
1052
|
+
*
|
|
1053
|
+
* @throws {ApiError} 401 - Si l'utilisateur n'est pas connecté.
|
|
1054
|
+
* @throws {ApiError} 401 - Si l'utilisateur connecté n'est pas administrateur de l'entité parente.
|
|
1055
|
+
* @throws {ApiError} 404 - Si l'utilisateur n'est pas enregistré (pas d'ID).
|
|
1056
|
+
* @throws {ApiError} 404 - Si l'entité parente n'est pas enregistrée (pas d'ID).
|
|
1057
|
+
* @throws {ApiError} 400 - Si l'entité parente n'est pas de type "events".
|
|
1058
|
+
*
|
|
1059
|
+
* @example
|
|
1060
|
+
* // Vérifier les participants d'un événement
|
|
1061
|
+
* const event = await me.event({ slug: "myEvent" });
|
|
1062
|
+
* const attendees = await event.getAttendees();
|
|
1063
|
+
*
|
|
1064
|
+
* for (const attendee of attendees.results) {
|
|
1065
|
+
* if (attendee.getEntityType() === "citoyens" && attendee.isAttendee()) {
|
|
1066
|
+
* console.log(`${attendee.data.name} participe à l'événement`);
|
|
1067
|
+
* }
|
|
1068
|
+
* }
|
|
1069
|
+
*/
|
|
1070
|
+
override isAttendee(): boolean {
|
|
1071
|
+
this._validateRoleCheckPreconditions("isAttendee", ["events"]);
|
|
1072
|
+
const userLink = this._getUserLinkForParent();
|
|
1073
|
+
return this._validateUserLink(userLink);
|
|
1074
|
+
}
|
|
1075
|
+
|
|
891
1076
|
}
|
|
892
1077
|
|
|
893
1078
|
// Incorporation des mixins dans User
|
|
@@ -803,9 +803,8 @@ export declare class BaseEntity<TServerData = any> {
|
|
|
803
803
|
* - `connectTypeConnect` : valeur envoyée pour `connect()`
|
|
804
804
|
* - `connectTypeDisconnect` : valeur envoyée pour `disconnect()`
|
|
805
805
|
* @throws {ApiError} - Si le type d'entité est inconnu.
|
|
806
|
-
* @protected
|
|
807
806
|
*/
|
|
808
|
-
|
|
807
|
+
_getLinkMeta(): LinkMeta;
|
|
809
808
|
/**
|
|
810
809
|
* Vérifie si l'entité prend en charge les opérations de lien (`connect`, `disconnect`, etc.).
|
|
811
810
|
* Utilise `_getLinkMeta()` comme source unique de vérité.
|
package/types/api/User.d.ts
CHANGED
|
@@ -341,5 +341,142 @@ export declare class User extends BaseEntity<UserItemNormalized> {
|
|
|
341
341
|
* @returns L'entité correspondante au slug.
|
|
342
342
|
*/
|
|
343
343
|
entityBySlug(slug: string): Promise<EntityTypes>;
|
|
344
|
+
/**
|
|
345
|
+
* Valide les préconditions communes pour les méthodes de vérification de rôle.
|
|
346
|
+
* @private
|
|
347
|
+
* @param methodName - Nom de la méthode appelante (pour les messages d'erreur).
|
|
348
|
+
* @param expectedTypes - Types d'entité parent autorisés.
|
|
349
|
+
* @throws {ApiError} 401 - Si l'utilisateur n'est pas connecté.
|
|
350
|
+
* @throws {ApiError} 401 - Si l'utilisateur connecté n'est pas administrateur de l'entité parente.
|
|
351
|
+
* @throws {ApiError} 404 - Si l'utilisateur n'est pas enregistré.
|
|
352
|
+
* @throws {ApiError} 404 - Si l'entité parente n'est pas enregistrée.
|
|
353
|
+
* @throws {ApiError} 400 - Si le type d'entité parent n'est pas valide.
|
|
354
|
+
*/
|
|
355
|
+
private _validateRoleCheckPreconditions;
|
|
356
|
+
/**
|
|
357
|
+
* Récupère le lien utilisateur pour l'entité parente.
|
|
358
|
+
* @private
|
|
359
|
+
* @returns Le lien utilisateur ou null.
|
|
360
|
+
*/
|
|
361
|
+
private _getUserLinkForParent;
|
|
362
|
+
/**
|
|
363
|
+
* Vérifie si l'utilisateur est administrateur de l'entité parente.
|
|
364
|
+
*
|
|
365
|
+
* Cette méthode permet de vérifier si un utilisateur possède les droits d'administration
|
|
366
|
+
* sur l'organisation ou le projet parent. Elle est particulièrement utile après avoir
|
|
367
|
+
* récupéré des membres via `getMembers()` pour déterminer leur niveau de permissions.
|
|
368
|
+
*
|
|
369
|
+
* @returns `true` si l'utilisateur est administrateur de l'entité parente, `false` sinon.
|
|
370
|
+
*
|
|
371
|
+
* @throws {ApiError} 401 - Si l'utilisateur n'est pas connecté.
|
|
372
|
+
* @throws {ApiError} 401 - Si l'utilisateur connecté n'est pas administrateur de l'entité parente.
|
|
373
|
+
* @throws {ApiError} 404 - Si l'utilisateur n'est pas enregistré (pas d'ID).
|
|
374
|
+
* @throws {ApiError} 404 - Si l'entité parente n'est pas enregistrée (pas d'ID).
|
|
375
|
+
* @throws {ApiError} 400 - Si l'entité parente n'est pas de type "organizations" ou "projects".
|
|
376
|
+
*
|
|
377
|
+
* @example
|
|
378
|
+
* // Vérifier les admins d'une organisation
|
|
379
|
+
* const org = await me.organization({ slug: "openAtlas" });
|
|
380
|
+
* const members = await org.getMembers();
|
|
381
|
+
*
|
|
382
|
+
* for (const member of members.results) {
|
|
383
|
+
* if (member.getEntityType() === "citoyens") {
|
|
384
|
+
* if (member.isAdmin()) {
|
|
385
|
+
* console.log(`${member.data.name} est administrateur`);
|
|
386
|
+
* }
|
|
387
|
+
* }
|
|
388
|
+
* }
|
|
389
|
+
*
|
|
390
|
+
* @example
|
|
391
|
+
* // Récupérer uniquement les membres admins
|
|
392
|
+
* const org = await me.organization({ slug: "myOrg" });
|
|
393
|
+
* const adminMembers = await org.getMembers({}, { isAdmin: true });
|
|
394
|
+
*
|
|
395
|
+
* // Vérifier chaque admin
|
|
396
|
+
* for (const admin of adminMembers.results) {
|
|
397
|
+
* if (admin.getEntityType() === "citoyens" && admin.isAdmin()) {
|
|
398
|
+
* console.log(`${admin.data.name} a les droits admin`);
|
|
399
|
+
* }
|
|
400
|
+
* }
|
|
401
|
+
*/
|
|
402
|
+
isAdmin(): boolean;
|
|
403
|
+
/**
|
|
404
|
+
* Vérifie si l'utilisateur est membre de l'organisation parente.
|
|
405
|
+
*
|
|
406
|
+
* Cette méthode permet de vérifier si un utilisateur est membre actif d'une organisation.
|
|
407
|
+
* Elle est utile pour déterminer si un utilisateur a accès aux ressources de l'organisation.
|
|
408
|
+
*
|
|
409
|
+
* @returns `true` si l'utilisateur est membre validé de l'organisation parente, `false` sinon.
|
|
410
|
+
*
|
|
411
|
+
* @throws {ApiError} 401 - Si l'utilisateur n'est pas connecté.
|
|
412
|
+
* @throws {ApiError} 401 - Si l'utilisateur connecté n'est pas administrateur de l'entité parente.
|
|
413
|
+
* @throws {ApiError} 404 - Si l'utilisateur n'est pas enregistré (pas d'ID).
|
|
414
|
+
* @throws {ApiError} 404 - Si l'entité parente n'est pas enregistrée (pas d'ID).
|
|
415
|
+
* @throws {ApiError} 400 - Si l'entité parente n'est pas de type "organizations".
|
|
416
|
+
*
|
|
417
|
+
* @example
|
|
418
|
+
* // Vérifier les membres d'une organisation
|
|
419
|
+
* const org = await me.organization({ slug: "myOrg" });
|
|
420
|
+
* const members = await org.getMembers();
|
|
421
|
+
*
|
|
422
|
+
* for (const member of members.results) {
|
|
423
|
+
* if (member.getEntityType() === "citoyens" && member.isMember()) {
|
|
424
|
+
* console.log(`${member.data.name} est membre de l'organisation`);
|
|
425
|
+
* }
|
|
426
|
+
* }
|
|
427
|
+
*/
|
|
428
|
+
isMember(): boolean;
|
|
429
|
+
/**
|
|
430
|
+
* Vérifie si l'utilisateur est contributeur du projet parent.
|
|
431
|
+
*
|
|
432
|
+
* Cette méthode permet de vérifier si un utilisateur est contributeur actif d'un projet.
|
|
433
|
+
* Elle est utile pour déterminer si un utilisateur peut participer aux activités du projet.
|
|
434
|
+
*
|
|
435
|
+
* @returns `true` si l'utilisateur est contributeur validé du projet parent, `false` sinon.
|
|
436
|
+
*
|
|
437
|
+
* @throws {ApiError} 401 - Si l'utilisateur n'est pas connecté.
|
|
438
|
+
* @throws {ApiError} 401 - Si l'utilisateur connecté n'est pas administrateur de l'entité parente.
|
|
439
|
+
* @throws {ApiError} 404 - Si l'utilisateur n'est pas enregistré (pas d'ID).
|
|
440
|
+
* @throws {ApiError} 404 - Si l'entité parente n'est pas enregistrée (pas d'ID).
|
|
441
|
+
* @throws {ApiError} 400 - Si l'entité parente n'est pas de type "projects".
|
|
442
|
+
*
|
|
443
|
+
* @example
|
|
444
|
+
* // Vérifier les contributeurs d'un projet
|
|
445
|
+
* const project = await me.project({ slug: "myProject" });
|
|
446
|
+
* const contributors = await project.getContributors();
|
|
447
|
+
*
|
|
448
|
+
* for (const contributor of contributors.results) {
|
|
449
|
+
* if (contributor.getEntityType() === "citoyens" && contributor.isContributor()) {
|
|
450
|
+
* console.log(`${contributor.data.name} est contributeur du projet`);
|
|
451
|
+
* }
|
|
452
|
+
* }
|
|
453
|
+
*/
|
|
454
|
+
isContributor(): boolean;
|
|
455
|
+
/**
|
|
456
|
+
* Vérifie si l'utilisateur est participant de l'événement parent.
|
|
457
|
+
*
|
|
458
|
+
* Cette méthode permet de vérifier si un utilisateur est inscrit comme participant à un événement.
|
|
459
|
+
* Elle est utile pour déterminer si un utilisateur a confirmé sa participation à l'événement.
|
|
460
|
+
*
|
|
461
|
+
* @returns `true` si l'utilisateur est participant validé de l'événement parent, `false` sinon.
|
|
462
|
+
*
|
|
463
|
+
* @throws {ApiError} 401 - Si l'utilisateur n'est pas connecté.
|
|
464
|
+
* @throws {ApiError} 401 - Si l'utilisateur connecté n'est pas administrateur de l'entité parente.
|
|
465
|
+
* @throws {ApiError} 404 - Si l'utilisateur n'est pas enregistré (pas d'ID).
|
|
466
|
+
* @throws {ApiError} 404 - Si l'entité parente n'est pas enregistrée (pas d'ID).
|
|
467
|
+
* @throws {ApiError} 400 - Si l'entité parente n'est pas de type "events".
|
|
468
|
+
*
|
|
469
|
+
* @example
|
|
470
|
+
* // Vérifier les participants d'un événement
|
|
471
|
+
* const event = await me.event({ slug: "myEvent" });
|
|
472
|
+
* const attendees = await event.getAttendees();
|
|
473
|
+
*
|
|
474
|
+
* for (const attendee of attendees.results) {
|
|
475
|
+
* if (attendee.getEntityType() === "citoyens" && attendee.isAttendee()) {
|
|
476
|
+
* console.log(`${attendee.data.name} participe à l'événement`);
|
|
477
|
+
* }
|
|
478
|
+
* }
|
|
479
|
+
*/
|
|
480
|
+
isAttendee(): boolean;
|
|
344
481
|
}
|
|
345
482
|
export {};
|