@communecter/cocolight-api-client 1.0.194 → 1.0.196
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 +2 -2
- package/dist/cocolight-api-client.cjs +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/types/api/Action.d.ts +11 -2
- package/types/api/Answer.d.ts +226 -8
- package/types/api/EndpointApi.d.ts +60 -1
- package/types/api/EndpointApi.types.d.ts +169 -0
- package/types/api/Event.d.ts +1 -1
- package/types/api/Organization.d.ts +2 -2
- package/types/api/Poi.d.ts +1 -1
- package/types/api/Project.d.ts +2 -2
- package/types/api/User.d.ts +39 -3
- package/types/costum/liveDigest.d.ts +29 -0
- package/types/costum/runtime.d.ts +63 -7
- package/types/costum/widenSchema.d.ts +22 -0
- package/types/endpoints.module.d.ts +7756 -4216
- package/types/index.d.ts +2 -2
package/types/api/User.d.ts
CHANGED
|
@@ -14,7 +14,7 @@ export declare class User extends BaseEntity<UserItemNormalized> {
|
|
|
14
14
|
static entityType: "citoyens";
|
|
15
15
|
static entityTag: string;
|
|
16
16
|
static SCHEMA_CONSTANTS: string[];
|
|
17
|
-
static UPDATE_BLOCKS: Map<"
|
|
17
|
+
static UPDATE_BLOCKS: Map<"UPDATE_BLOCK_SLUG" | "PROFIL_IMAGE" | "UPDATE_BLOCK_DESCRIPTION" | "UPDATE_BLOCK_INFO" | "UPDATE_BLOCK_LOCALITY" | "UPDATE_BLOCK_SOCIAL", "updateImageProfil" | "updateSlug" | "updateDescription" | "updateLocality" | "updateInfo" | "updateSocial">;
|
|
18
18
|
defaultFields: Record<string, any>;
|
|
19
19
|
removeFields: string[];
|
|
20
20
|
transforms: Record<string, (val: any, full: any) => any>;
|
|
@@ -742,6 +742,9 @@ export declare class User extends BaseEntity<UserItemNormalized> {
|
|
|
742
742
|
*
|
|
743
743
|
* @param {Object} [options] - Options de la méthode
|
|
744
744
|
* @param {boolean} [options.admin=false] - Si true, utilise "admin" comme connectType au lieu du type par défaut (connectTypeConnect)
|
|
745
|
+
* @param {string[]} [options.roles] - Rôles à poser sur le lien CRÉÉ (transmis à `CONNECT`, écrits des deux
|
|
746
|
+
* côtés). Omis ou vide → corps inchangé. Ne sert qu'à la création : pour corriger les rôles d'un lien
|
|
747
|
+
* déjà établi, utiliser {@link User.setRoles}.
|
|
745
748
|
* @returns {Promise<unknown>} La réponse de l'API après création de la demande
|
|
746
749
|
* @throws {ApiError} Si l'utilisateur n'est pas connecté, pas admin, ou si le parent n'est pas défini
|
|
747
750
|
* @throws {ApiError} Si l'utilisateur est déjà en attente de validation
|
|
@@ -757,10 +760,14 @@ export declare class User extends BaseEntity<UserItemNormalized> {
|
|
|
757
760
|
*
|
|
758
761
|
* // Avec le type admin explicite
|
|
759
762
|
* await user.sendRequestToJoinParent({ admin: true });
|
|
763
|
+
*
|
|
764
|
+
* // Avec des rôles posés dès l'invitation
|
|
765
|
+
* await user.sendRequestToJoinParent({ roles: ["Coordonnatrice parentalité Arrageois"] });
|
|
760
766
|
* ```
|
|
761
767
|
*/
|
|
762
|
-
sendRequestToJoinParent({ admin }?: {
|
|
763
|
-
admin
|
|
768
|
+
sendRequestToJoinParent({ admin, roles }?: {
|
|
769
|
+
admin?: boolean;
|
|
770
|
+
roles?: string[];
|
|
764
771
|
}): Promise<unknown>;
|
|
765
772
|
/**
|
|
766
773
|
* Valide une demande de membre en attente de validation.
|
|
@@ -845,6 +852,35 @@ export declare class User extends BaseEntity<UserItemNormalized> {
|
|
|
845
852
|
* ```
|
|
846
853
|
*/
|
|
847
854
|
promoteToAdmin(): Promise<unknown>;
|
|
855
|
+
/**
|
|
856
|
+
* Définit les rôles de cet utilisateur sur son lien avec l'entité parente (`LINK_SET_ROLES`).
|
|
857
|
+
*
|
|
858
|
+
* ⚠️ REMPLACEMENT INTÉGRAL, pas un ajout/retrait : le tableau envoyé devient la liste des rôles du lien,
|
|
859
|
+
* des deux côtés (contexte et citoyen). Pour ajouter un rôle, envoyer les rôles actuels + le nouveau ;
|
|
860
|
+
* pour en retirer un, les rôles actuels privés de celui-ci. **`setRoles([])` efface TOUS les rôles**
|
|
861
|
+
* (`$unset` côté backend).
|
|
862
|
+
*
|
|
863
|
+
* Réservé aux admins de l'entité parente (organisation, projet ou événement). Le lien doit exister.
|
|
864
|
+
* Le backend répond HTTP 200 avec `{result:false}` en cas de refus : l'erreur est levée en `ApiResponseError`.
|
|
865
|
+
* Le contexte costum du PARENT est transmis (droit d'admin du costum, comme les autres actions de lien).
|
|
866
|
+
*
|
|
867
|
+
* @param roles - Liste COMPLÈTE des rôles voulus (vide = tout effacer).
|
|
868
|
+
* @returns La réponse de l'API (`{result, msg, memberOfid, memberid, roles}`).
|
|
869
|
+
* @throws {ApiError} Si le parent n'est pas défini, si l'appelant n'en est pas admin, ou si l'utilisateur
|
|
870
|
+
* n'a aucun lien avec le parent.
|
|
871
|
+
* @throws {ApiResponseError} Si le backend refuse (ex. non admin côté serveur).
|
|
872
|
+
*
|
|
873
|
+
* @example
|
|
874
|
+
* ```typescript
|
|
875
|
+
* const org = await me.organization({ slug: "parent62" });
|
|
876
|
+
* const { results } = await org.getMembers();
|
|
877
|
+
* const membre = results[0];
|
|
878
|
+
* // Source fiable des rôles actuels : le lien côté ORGANISATION (links.members.<id>.roles).
|
|
879
|
+
* const actuels = org.serverData.links?.members?.[membre.id!]?.roles ?? [];
|
|
880
|
+
* await membre.setRoles([...actuels, "Coordonnatrice parentalité Arrageois"]);
|
|
881
|
+
* ```
|
|
882
|
+
*/
|
|
883
|
+
setRoles(roles: string[]): Promise<unknown>;
|
|
848
884
|
/**
|
|
849
885
|
* Rétrograde un admin au statut de membre ordinaire.
|
|
850
886
|
*
|
|
@@ -63,6 +63,28 @@ interface FieldDef {
|
|
|
63
63
|
/** Valeur FORCÉE par le costum — cf. collectValuePresets. */
|
|
64
64
|
value?: unknown;
|
|
65
65
|
}
|
|
66
|
+
/** Clé de base d'une collection telle que la déclare un `typeObj` — cf. `findCostumBaseNode`. */
|
|
67
|
+
export interface CostumBaseNode {
|
|
68
|
+
/** Clé `typeObj` retenue (ex. `organizations`, `event`). */
|
|
69
|
+
typeKey: string;
|
|
70
|
+
/** Le nœud déclare-t-il des champs (`beforeBuild.properties`) ? Sinon : variante de base VIDE. */
|
|
71
|
+
hasForm: boolean;
|
|
72
|
+
add: boolean;
|
|
73
|
+
createLabel: string | null;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Trouve la CLÉ DE BASE d'une collection dans le `typeObj` d'un costum — le formulaire que le site
|
|
77
|
+
* applique quand on « ajoute une organisation » sans rien préciser, même quand ce nœud ne déclare AUCUN
|
|
78
|
+
* champ (ex. federationDesCae : `organizations: {add:true}` à côté du sous-type `organizationsTls`).
|
|
79
|
+
*
|
|
80
|
+
* Une base est une clé de `BASE_TYPEKEYS[collection]` dont le nœud est un objet SANS `sameAs`, ou avec un
|
|
81
|
+
* `sameAs` RÉFLEXIF (`event: {sameAs:"event"}` — parent62, institutBleu, navigator) : ce `sameAs` ne
|
|
82
|
+
* rattache le nœud à rien d'autre que lui-même. Deux clés sœurs (`organization` ET `organizations`) : on
|
|
83
|
+
* préfère celle qui porte un formulaire, sinon la première dans l'ordre du `typeObj` — en pratique
|
|
84
|
+
* `costum/co/resolved` n'en livre qu'une (le dernier déclaré gagne à la fusion moteur ⊕ overlay).
|
|
85
|
+
* Null si le costum ne déclare pas de clé de base pour cette collection.
|
|
86
|
+
*/
|
|
87
|
+
export declare function findCostumBaseNode(data: CostumJsonData, collection: string): CostumBaseNode | null;
|
|
66
88
|
/**
|
|
67
89
|
* Digère `getcostumjson` → `CostumRuntimeContext` pour UNE collection (null si le costum ne couvre pas
|
|
68
90
|
* cette collection). `meta` = identité de l'élément porteur (costumId/costumType, résolue par slug/getinfo).
|
|
@@ -86,6 +108,12 @@ export declare function listCostumFormNodes(data: CostumJsonData): Array<{
|
|
|
86
108
|
createLabel: string | null;
|
|
87
109
|
discriminator?: string;
|
|
88
110
|
}>;
|
|
111
|
+
/**
|
|
112
|
+
* `opts.typeKey` : ne digère que cette clé `typeObj` (énumération par sous-type).
|
|
113
|
+
* `opts.allowFormless` (avec `typeKey`) : digère AUSSI ce nœud s'il ne déclare aucun champ — sert à la
|
|
114
|
+
* variante de BASE vide (cf. `findCostumBaseNode`) : schéma vide, `fields` vide, mais `presetValue` et
|
|
115
|
+
* `hide` PROPRES du nœud conservés. Sans cette option, un nœud sans formulaire est ignoré (inchangé).
|
|
116
|
+
*/
|
|
89
117
|
export declare function digestCostumJson(data: CostumJsonData, collection: Collection, meta: {
|
|
90
118
|
costumId: string;
|
|
91
119
|
costumType: string;
|
|
@@ -93,5 +121,6 @@ export declare function digestCostumJson(data: CostumJsonData, collection: Colle
|
|
|
93
121
|
baseFieldNames?: string[];
|
|
94
122
|
}, opts?: {
|
|
95
123
|
typeKey?: string;
|
|
124
|
+
allowFormless?: boolean;
|
|
96
125
|
}): DigestedCostum | null;
|
|
97
126
|
export {};
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import type { CostumExtensionModule, CostumExtensionField, KnownCostumSlug, Collection } from "./types.js";
|
|
2
2
|
import type { BaseEntity } from "../api/BaseEntity.js";
|
|
3
|
+
import type { Event } from "../api/Event.js";
|
|
4
|
+
import type { Organization } from "../api/Organization.js";
|
|
5
|
+
import type { Poi } from "../api/Poi.js";
|
|
6
|
+
import type { Project } from "../api/Project.js";
|
|
3
7
|
/** Active/désactive FORCE-LIVE (cf. `COSTUM_FORCE_LIVE`). */
|
|
4
8
|
export declare function setCostumForceLive(actif: boolean): void;
|
|
5
9
|
/** État courant de FORCE-LIVE. */
|
|
@@ -83,6 +87,33 @@ export interface CostumFormDescriptor {
|
|
|
83
87
|
/** Valeur de `type` estampillée au save qui distingue le sous-type (= presetValue.type, sinon typeKey). */
|
|
84
88
|
discriminator?: string;
|
|
85
89
|
}
|
|
90
|
+
/** Collections couvertes par les fabriques du scope (poi/organization/project/event). Identité entityType↔collection. */
|
|
91
|
+
type ScopeCollection = "poi" | "organizations" | "projects" | "events";
|
|
92
|
+
/** Entité rendue par chaque fabrique — même correspondance que `EntityTypeMap` (BaseEntity), qui n'est pas
|
|
93
|
+
* exporté : `create` étant public, son type de retour doit être nommable dans les `.d.ts`. */
|
|
94
|
+
type ScopeEntityMap = {
|
|
95
|
+
poi: Poi;
|
|
96
|
+
organizations: Organization;
|
|
97
|
+
projects: Project;
|
|
98
|
+
events: Event;
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* Options de création sous un costum (`CostumScope.create` et ses raccourcis). Jamais envoyées au serveur.
|
|
102
|
+
*/
|
|
103
|
+
export interface CostumCreateOptions {
|
|
104
|
+
/**
|
|
105
|
+
* Sous-type CIBLÉ : clé `typeObj` du costum (ex. `"organizationsTls"` pour le formulaire « Créer votre
|
|
106
|
+
* CAE »). Ses presets et champs s'appliquent, quel que soit `data.type`. Sans lui, un sous-type ne
|
|
107
|
+
* s'applique que si `data.type` est son discriminant ; sinon c'est la clé de base de la collection.
|
|
108
|
+
* Inconnu du costum → repli silencieux sur cette règle (trace `debug`).
|
|
109
|
+
*/
|
|
110
|
+
subType?: string;
|
|
111
|
+
}
|
|
112
|
+
/** Options de `CostumScope.contextFor` : celles de la création, plus le mode de sélection. */
|
|
113
|
+
export interface CostumContextOptions extends CostumCreateOptions {
|
|
114
|
+
/** Sélectionner comme une CRÉATION (défaut = clé de base) plutôt que comme une lecture (défaut historique). */
|
|
115
|
+
create?: boolean;
|
|
116
|
+
}
|
|
86
117
|
/**
|
|
87
118
|
* Scope costum : fabrique des entités liées à un costum. Réutilise le `user` (parent, deps, auth)
|
|
88
119
|
* et n'altère jamais l'état partagé — chaque entité reçoit son propre `_costumCtx`.
|
|
@@ -98,14 +129,38 @@ export declare class CostumScope {
|
|
|
98
129
|
* Construit le `CostumRuntimeContext` pour une collection (null si non couverte). `type` (optionnel) = le
|
|
99
130
|
* sous-type voulu (= `presetValue.type` de la variante) : sélectionne l'overlay de CE sous-type, sinon la
|
|
100
131
|
* racine=union. Indispensable au CREATE d'un sous-type précis (bon `type`/presets/champs — cf. P0 write-safety).
|
|
132
|
+
*
|
|
133
|
+
* `opts` (optionnel) : `subType` cible un sous-type par sa clé `typeObj` (prime sur `type`) ; `create`
|
|
134
|
+
* sélectionne comme une création (défaut = clé de base du costum). Sans `opts` : sélection de LECTURE,
|
|
135
|
+
* inchangée (revive/édition).
|
|
136
|
+
*/
|
|
137
|
+
contextFor(collection: Collection, type?: string | null, opts?: CostumContextOptions): CostumRuntimeContext | null;
|
|
138
|
+
/**
|
|
139
|
+
* Crée une entité de `collection` sous ce costum (presets appliqués, surchargeables par `data`).
|
|
140
|
+
*
|
|
141
|
+
* Formulaire costum appliqué (presets + champs) — dans l'ordre :
|
|
142
|
+
* 1. `opts.subType` : le sous-type CIBLÉ par sa clé `typeObj` (ex. `"organizationsTls"`) ;
|
|
143
|
+
* 2. `data.type` : le sous-type dont c'est le discriminant (ex. `poi({ type: "article" })`) ;
|
|
144
|
+
* 3. sinon la CLÉ DE BASE de la collection si le costum en déclare une (ex. `organizations`), MÊME SANS
|
|
145
|
+
* champ : un sous-type n'est jamais appliqué par défaut ; sans clé de base, comportement historique.
|
|
146
|
+
* Un `subType` inconnu retombe sur 2→3 (trace `debug`, aucune exception). `opts` n'est JAMAIS envoyé au
|
|
147
|
+
* serveur. La whitelist d'écriture reste l'union racine ∪ variante (byte-safe).
|
|
148
|
+
*
|
|
149
|
+
* const cae = await tl.organization({ name }, { subType: "organizationsTls" }); // formulaire « CAE »
|
|
150
|
+
* const org = await tl.organization({ name }); // formulaire de base
|
|
151
|
+
*/
|
|
152
|
+
create<T extends ScopeCollection>(collection: T, data?: Record<string, unknown>, opts?: CostumCreateOptions): Promise<ScopeEntityMap[T]>;
|
|
153
|
+
/**
|
|
154
|
+
* Trace (`debug`) un `subType` que ce scope ne sait pas cibler pour `collection` : collection non couverte,
|
|
155
|
+
* ou variantes dont aucune ne porte cette clé `typeObj`. Une collection à formulaire UNIQUE n'a pas de
|
|
156
|
+
* variantes à comparer : rien n'est tracé (la racine EST ce formulaire). Le repli lui-même est fait par
|
|
157
|
+
* `pickCostumOverlay` ; ceci ne fait que le rendre visible.
|
|
101
158
|
*/
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
project(data?: Record<string, unknown>): Promise<import("../index.js").Project>;
|
|
108
|
-
event(data?: Record<string, unknown>): Promise<import("../index.js").Event>;
|
|
159
|
+
private traceUnknownSubType;
|
|
160
|
+
poi(data?: Record<string, unknown>, opts?: CostumCreateOptions): Promise<Poi>;
|
|
161
|
+
organization(data?: Record<string, unknown>, opts?: CostumCreateOptions): Promise<Organization>;
|
|
162
|
+
project(data?: Record<string, unknown>, opts?: CostumCreateOptions): Promise<Project>;
|
|
163
|
+
event(data?: Record<string, unknown>, opts?: CostumCreateOptions): Promise<Event>;
|
|
109
164
|
/**
|
|
110
165
|
* Poste une news sous CE costum, sur le mur de `target` : `source.key` = costum du scope (le SITE,
|
|
111
166
|
* comme poi/org — cf. `News::prepData`), `parent` = `target`. News n'est PAS une collection « élément »
|
|
@@ -159,3 +214,4 @@ export declare function resolveCostumScope(user: BaseEntity, slug: KnownCostumSl
|
|
|
159
214
|
* No-op si le costum ne résout pas / ne couvre pas la collection (l'entité reste en scope d'identité).
|
|
160
215
|
*/
|
|
161
216
|
export declare function loadCostumContext(user: BaseEntity, slug: string, collection: Collection): Promise<CostumRuntimeContext | null>;
|
|
217
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UN COSTUM PEUT ÉLARGIR UN CHAMP NATIF, JAMAIS LE RESTREINDRE.
|
|
3
|
+
*
|
|
4
|
+
* Un costum legacy redéclare des champs que le contrat connaît déjà (`type`, `tags`, `openingHours`,
|
|
5
|
+
* `telephone`…). Son schéma ne vient pas du stockage mais du WIDGET déclaré (digest live, `inferType`)
|
|
6
|
+
* ou d'un préremplissage (`presetProps`, typé chaîne). Il sert à ÉLARGIR un champ contraint — les
|
|
7
|
+
* types d'événement d'institutBleu sont tous hors de l'énumération native, et la production en vit.
|
|
8
|
+
* Mais posé À LA PLACE du schéma natif, il refusait aussi la forme native. Mesuré le 2026-10-01 sur les
|
|
9
|
+
* 21 costums résolus des sites de site-json : 111 champs natifs redéclarés, dont 8 RESTREINTS — horaires
|
|
10
|
+
* en liste refusés (CAE, navigator, relief : création impossible dès qu'on les saisit), téléphone en
|
|
11
|
+
* objet legacy refusé, mots-clés préremplis refusés en liste — pour 27 élargissements légitimes.
|
|
12
|
+
*
|
|
13
|
+
* Règle : pour un champ défini des deux côtés, la requête accepte le natif OU le costum (`anyOf`).
|
|
14
|
+
* Elle est monotone — tout ce qui passait passe encore — et une valeur que les deux refusent reste
|
|
15
|
+
* refusée. Appliquée aux DEUX points de fusion : la création (`ApiClient.callEndpoint`, enveloppe
|
|
16
|
+
* costum) et la modification (`BaseEntity._saveCostumViaElementSave`), qui faisaient l'inverse l'une
|
|
17
|
+
* de l'autre (le costum primait à la création, le natif à la modification).
|
|
18
|
+
*/
|
|
19
|
+
/** Schéma d'un champ défini par le contrat (`natif`) ET par le costum : natif OU costum. */
|
|
20
|
+
export declare function widenSchema(natif: unknown, costum: unknown): unknown;
|
|
21
|
+
/** `widenSchema` clé par clé : chaque propriété du costum élargit celle du natif, les autres restent. */
|
|
22
|
+
export declare function widenProperties(natives: Record<string, unknown>, costum: Record<string, unknown>): Record<string, unknown>;
|