@communecter/cocolight-api-client 1.0.190 → 1.0.191

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@communecter/cocolight-api-client",
3
- "version": "1.0.190",
3
+ "version": "1.0.191",
4
4
  "description": "Client Axios simplifié pour l'API cocolight",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1712,8 +1712,9 @@ export declare class BaseEntity<TServerData = any> {
1712
1712
  * Récupérer les événements d'une entitée : liste des événements de l'entité ou elle est "organizer" ou "attendee".
1713
1713
  * Constant : GET_EVENTS
1714
1714
  * `startDateUTC`/`endDateUTC` acceptent un `Date` ou une string ISO (un `Date` est coercé en ISO).
1715
- * `recurrency` est typé `false` (garde parité, comme `searchEventsCostum`) : omettre (récurrents inclus
1716
- * en mode calendrier) ou passer `false` (exclure) ; jamais `true` (le legacy `=== true` l'exclurait → divergence).
1715
+ * `recurrency` (booléen) : omettre ou `true` = récurrents inclus, `false` = exclus — fiable sur les deux
1716
+ * serveurs depuis le 2026-09-04 (parse booléen legacy + miroir Node). Mode LISTE (sans date) : mêmes
1717
+ * paramètres optionnels `from`/`to`/`order` que `searchEventsCostum` (voir sa doc).
1717
1718
  * @param data - Paramètres (partiels) de recherche/pagination.
1718
1719
  * @returns - Les données de réponse.
1719
1720
  */
@@ -2556,19 +2557,32 @@ export declare class BaseEntity<TServerData = any> {
2556
2557
  * **Deux modes** (endpoint `/co2/search/agenda`), selon que tu passes une date ou non :
2557
2558
  *
2558
2559
  * 1. **CALENDRIER** — déclenché par `startDateUTC` et/ou `endDateUTC` (l'agenda d'une période) :
2559
- * ramène **TOUT** ce qui matche la plage — ponctuels **+ récurrents** (`openingHours`, sauf `recurrency:false`) —
2560
- * trié par **occurrence** (`startDateSort`/`startDateSortFormat` calculés côté serveur), résultat = **tableau**.
2561
- * **Pas de pagination** serveur : une seule page (`next()`/`prev()` sans effet).
2562
- * 2. **LISTE** — déclenché par l'**absence** de date (flux paginé) :
2563
- * **ponctuels uniquement** (récurrents exclus), triés par `startDate` **décroissant** (plus récents d'abord),
2564
- * paginés via `indexMin`/`indexStep` (défaut 30) — `next()`/`prev()` fonctionnent. (Backend : objet keyé `_id`,
2565
- * hydraté en tableau d'`Event` côté lib.)
2560
+ * ramène **TOUT** ce qui matche la plage — ponctuels **+ récurrents** (`openingHours`, sauf `recurrency:false`),
2561
+ * chaque récurrent **déplié en une ligne par occurrence** — trié par **occurrence** (`startDateSort`/
2562
+ * `startDateSortFormat` calculés côté serveur), résultat = **tableau**. **Pas de pagination** serveur :
2563
+ * une seule page (`next()`/`prev()` sans effet). Pour une GRILLE (mois/semaine/jour).
2564
+ * 2. **LISTE** — déclenché par l'**absence** de date (flux paginé, `indexMin`/`indexStep`, `next()`/`prev()`) :
2565
+ * ponctuels **+ récurrents** (depuis le legacy 14c2caa1, **une ligne par récurrent** portant sa PROCHAINE
2566
+ * occurrence dans `startDateSort`/`startDateSortFormat`), résultat = **tableau**. Par défaut trié par
2567
+ * occurrence **décroissant** et **non borné** : la 1re page contient les events les plus LOINTAINS.
2568
+ * Trois paramètres **optionnels** (legacy 2026-09-04, miroir Node) rendent ce mode utilisable pour
2569
+ * « les prochains » :
2570
+ * - `from` (Date ou ISO) : borne basse « pas encore terminé à from » (ponctuel : `endDate ≥ from` sinon
2571
+ * `startDate ≥ from` ; récurrent : prochaine occurrence calculée DEPUIS `from`, un créneau en cours reste
2572
+ * servi). C'est aussi l'**ancre** de la pagination : `next()` rejoue la même valeur, la clé de tri des
2573
+ * récurrents ne bouge pas entre deux pages — passe donc un instant figé, pas `new Date()` à chaque appel.
2574
+ * - `to` (Date ou ISO) : borne haute stricte sur la clé d'occurrence.
2575
+ * - `order` : `"asc"` | `"desc"` (défaut `"desc"`).
2576
+ * Dès qu'un des trois est présent, chaque ligne porte **`endDateSortFormat`** (fin d'occurrence calculée
2577
+ * serveur, dans le fuseau de l'événement ; `null` sans fin connue) — ne PAS la recalculer côté client.
2578
+ * Sans eux, la réponse est strictement celle d'avant (aucune clé nouvelle).
2579
+ * « Les prochains » = `{ from: now, order: "asc" }` · « Les passés » = `{ to: now, order: "desc", recurrency: false }`.
2566
2580
  *
2567
2581
  * Le scope costum (`sourceKey`) s'applique dans les **deux** modes.
2568
2582
  *
2569
- * `recurrency` est typé `false` (garde parité) : **omettre** (mode calendrier → récurrents inclus) ou passer
2570
- * `false` (exclure) ; **jamais `true`** — le legacy fait un test strict `=== true` qui exclurait les récurrents
2571
- * (divergence), valeur donc interdite au type **et** à l'AJV.
2583
+ * `recurrency` (booléen) : omettre ou `true` = récurrents inclus, `false` = exclus (en LISTE, la requête des
2584
+ * récurrents est sautée). Fiable sur les deux serveurs depuis le 2026-09-04 (parse booléen legacy + miroir
2585
+ * Node) — l'ancienne garde `const:false` du contrat est levée.
2572
2586
  *
2573
2587
  * `startDateUTC`/`endDateUTC` acceptent un **`Date` ou une string ISO** : un `Date` est coercé en ISO
2574
2588
  * (`toISOString()`) avant l'envoi (le fil reste `type:string`). Évite le piège de l'ISO partielle
@@ -2579,9 +2593,14 @@ export declare class BaseEntity<TServerData = any> {
2579
2593
  * const page = await org.searchEventsCostum({ startDateUTC: debut, endDateUTC: new Date("2026-06-30T23:59:59Z") });
2580
2594
  * page.results.forEach((e) => console.log(e.serverData.name, e.serverData.startDateSort));
2581
2595
  *
2582
- // Mode LISTE — flux paginé (ponctuels, du plus récent)
2583
- * let p = await org.searchEventsCostum({ indexStep: 20 });
2596
+ // Mode LISTE — les prochains à partir de maintenant (en cours compris), une ligne par récurrent
2597
+ * const now = new Date(); // ancre figée, rejouée par next()
2598
+ * let p = await org.searchEventsCostum({ indexStep: 20, from: now, order: "asc" });
2599
+ * p.results.forEach((e) => console.log(e.serverData.startDateSortFormat, e.serverData.endDateSortFormat));
2584
2600
  * if (p.hasNext) p = await p.next();
2601
+ *
2602
+ // Mode LISTE — les passés, du plus récent, sans récurrent
2603
+ * const passes = await org.searchEventsCostum({ indexStep: 20, to: now, order: "desc", recurrency: false });
2585
2604
  */
2586
2605
  searchEventsCostum(data?: SearchEventsCostumInput, options?: {
2587
2606
  restoredState?: PaginatorState;
@@ -4200,9 +4200,21 @@ export interface GetEventsData {
4200
4200
  countType?: unknown[];
4201
4201
  fediverse: boolean;
4202
4202
  /**
4203
- * GARDE PARITÉ legacy (identique à SEARCH_EVENTS_COSTUM) : seule valeur autorisée `false` (= exclure les récurrents) OU champ omis (= inclure, défaut). NE JAMAIS envoyer `true` — le legacy teste STRICTEMENT $recurrency === true (AgendaAction.php:65) qui échoue sur la string POST → exclut les récurrents, alors que notre backend les inclurait (divergence assumée). En interdisant `true`, omis→inclus et false→exclus se comportent pareil sur les 2 serveurs.
4203
+ * Inclure les événements récurrents (openingHours). Omis = inclure. `false` = exclure : en mode LISTE la requête des récurrents est sautée (comme avant 14c2caa1), en mode CALENDRIER les clauses openingHours.dayOfWeek ne sont pas posées. Depuis le 2026-09-04 le legacy parse la valeur en booléen (filter_var FILTER_VALIDATE_BOOLEAN) et le backend Node fait de même : `true`/`false` sont fiables sur les 2 serveurs (byte-parité prouvée). Historique : `=== true` strict (BUG-L-031, `true` excluait), puis truthy 14c2caa1 (la chaîne "false" INCLUAIT, BUG-L-259).
4204
4204
  */
4205
- recurrency?: false;
4205
+ recurrency?: boolean;
4206
+ /**
4207
+ * Mode LISTE seulement (sans startDateUTC/endDateUTC). Borne basse « pas encore terminé à from » : ponctuels endDate ≥ from (sinon startDate ≥ from, un multi-jours en cours reste servi) ; récurrents : prochaine occurrence calculée DEPUIS from au lieu de maintenant (un créneau en cours reste « la prochaine »). Sert d'ANCRE de pagination : renvoyer la même valeur à chaque page (sinon la clé de tri des récurrents bouge entre deux pages). Dès que `from`, `to` ou `order` est présent, chaque ligne porte `endDateSortFormat`. Envoyer un ISO 8601 AVEC offset (toISOString) : une date nue est lue en Europe/Paris par le legacy et en UTC par le backend Node.
4208
+ */
4209
+ from?: string;
4210
+ /**
4211
+ * Mode LISTE seulement. Borne haute STRICTE sur la clé d'occurrence : ponctuels startDate < to ; récurrents prochaine occurrence < to. Même règle d'offset que `from`. « Les passés » = `to` = maintenant + `order` = desc + `recurrency` = false.
4212
+ */
4213
+ to?: string;
4214
+ /**
4215
+ * Mode LISTE seulement — PAS de default déclaré : la lib injecte les defaults du contrat dans la requête, et la seule présence d'`order` déclenche le mode borné (endDateSortFormat). Défaut serveur : desc. Sens du tri sur la clé d'occurrence (startDateSort), départage _id dans le même sens ; la requête des ponctuels suit le même sens (top-K juste). « Les prochains à partir de maintenant » = `from` = maintenant + `order` = asc. Sans `from`/`to`/`order`, requête ET réponse sont strictement celles d'avant (DESC non borné, aucune clé nouvelle).
4216
+ */
4217
+ order?: "asc" | "desc";
4206
4218
  filters?: {
4207
4219
  $or: {};
4208
4220
  [k: string]: unknown;
@@ -4245,9 +4257,21 @@ export interface SearchEventsCostumData {
4245
4257
  countType?: unknown[];
4246
4258
  fediverse: boolean;
4247
4259
  /**
4248
- * GARDE PARITÉ legacy : seule valeur autorisée `false` (= exclure les récurrents) OU champ omis (= inclure, défaut). NE JAMAIS envoyer `true` — le legacy teste STRICTEMENT $recurrency === true (AgendaAction.php:65) qui échoue sur la string POST → exclut les récurrents, alors que notre backend les inclurait (divergence assumée). En interdisant `true`, omis→inclus et false→exclus se comportent pareil sur les 2 serveurs.
4260
+ * Inclure les événements récurrents (openingHours). Omis = inclure. `false` = exclure : en mode LISTE la requête des récurrents est sautée (comme avant 14c2caa1), en mode CALENDRIER les clauses openingHours.dayOfWeek ne sont pas posées. Depuis le 2026-09-04 le legacy parse la valeur en booléen (filter_var FILTER_VALIDATE_BOOLEAN) et le backend Node fait de même : `true`/`false` sont fiables sur les 2 serveurs (byte-parité prouvée). Historique : `=== true` strict (BUG-L-031, `true` excluait), puis truthy 14c2caa1 (la chaîne "false" INCLUAIT, BUG-L-259).
4261
+ */
4262
+ recurrency?: boolean;
4263
+ /**
4264
+ * Mode LISTE seulement (sans startDateUTC/endDateUTC). Borne basse « pas encore terminé à from » : ponctuels endDate ≥ from (sinon startDate ≥ from, un multi-jours en cours reste servi) ; récurrents : prochaine occurrence calculée DEPUIS from au lieu de maintenant (un créneau en cours reste « la prochaine »). Sert d'ANCRE de pagination : renvoyer la même valeur à chaque page (sinon la clé de tri des récurrents bouge entre deux pages). Dès que `from`, `to` ou `order` est présent, chaque ligne porte `endDateSortFormat`. Envoyer un ISO 8601 AVEC offset (toISOString) : une date nue est lue en Europe/Paris par le legacy et en UTC par le backend Node.
4265
+ */
4266
+ from?: string;
4267
+ /**
4268
+ * Mode LISTE seulement. Borne haute STRICTE sur la clé d'occurrence : ponctuels startDate < to ; récurrents prochaine occurrence < to. Même règle d'offset que `from`. « Les passés » = `to` = maintenant + `order` = desc + `recurrency` = false.
4269
+ */
4270
+ to?: string;
4271
+ /**
4272
+ * Mode LISTE seulement — PAS de default déclaré : la lib injecte les defaults du contrat dans la requête, et la seule présence d'`order` déclenche le mode borné (endDateSortFormat). Défaut serveur : desc. Sens du tri sur la clé d'occurrence (startDateSort), départage _id dans le même sens ; la requête des ponctuels suit le même sens (top-K juste). « Les prochains à partir de maintenant » = `from` = maintenant + `order` = asc. Sans `from`/`to`/`order`, requête ET réponse sont strictement celles d'avant (DESC non borné, aucune clé nouvelle).
4249
4273
  */
4250
- recurrency?: false;
4274
+ order?: "asc" | "desc";
4251
4275
  /**
4252
4276
  * Filtres Mongo additionnels (buildFilters).
4253
4277
  */
@@ -0,0 +1,3 @@
1
+ import type { CostumExtensionModule } from "../types.js";
2
+ declare const mod: CostumExtensionModule;
3
+ export default mod;
@@ -1,4 +1,4 @@
1
- export type KnownCostumSlug = "CercleTravailleursSociauxLiberauxLaPlumeSociale" | "FabEn" | "LaReunionDesTiersLieux" | "LivingLabInnovationSocialeBraspanon" | "RoseLab" | "Santeentransition" | "alfph" | "ambitionTiersLieuxValDeLoire" | "assoKosasa" | "boclLe" | "bretagneTierslieux" | "caDuBassinDeThauTiersLieux" | "caDuBassinDeThauTiersLieux1" | "campagne" | "capTierslieux" | "catalyst" | "ccDesCaussesALaubracTiersLieux" | "chtitube" | "circuitCourt" | "cmcasHB" | "cmcasHauteBretagne" | "coFinancementTierslieux" | "coeurNumerique" | "communLundi" | "consortiumIledefranceTierslieux" | "copHautsdefrance" | "createchFablabDeLaMjcDeSaintjean" | "cressDeLaReunion1" | "cressReunion" | "cressReunionNetwork" | "ctenat" | "cyberReunion" | "daLocu" | "ecocentre" | "ekisphere" | "equipementsSportifs974" | "fabLimagne" | "fabdulys1" | "fablab3dplant" | "fablabChauxdefonds" | "federationDesCae" | "fianarantsoaAlimentation" | "formationGenerique" | "franceTierslieux" | "heraultTiersLieux" | "hinaura" | "hubmayotte" | "hubnouvellecaledonie" | "hubpolynesiefrancaise" | "hubreunion" | "hubterritoires" | "hubwallisetfutuna" | "hva" | "ibv2" | "institutBleu" | "journalInsoumisChambery" | "kpacite" | "laCompagnieDesTierslieux" | "laCooperativeTierslieux" | "laMaisonDesFaiseurs" | "laMinoterie1" | "laMyne" | "laReunionPourUnNumeriqueInclusif" | "laRosee" | "laSemaineDesTierslieux" | "laTresseTierslieu" | "labEnCommuns" | "labboite" | "lakou" | "lapossession" | "lattesTiersLieux" | "leFaugaTiersLieux" | "leTamponTiersLieux" | "lesCommunsDesTierslieux" | "lesImaginationsFertiles" | "lidairesTiersLieux" | "littoralHautsDeFrance" | "lotetgaronneTiersLieux" | "mayottePourUnNumeriqueInclusif" | "meir" | "montpellierMediterraneeMetropoleTiersLieux" | "montpellierTiersLieux" | "navigatorDesTierslieux" | "notragora" | "nouvellecaledoniePourUnNumeriqueInclusif" | "openAtlas" | "parent62" | "polynesieFrancaisePourUnNumeriqueInclusif" | "prdr" | "pyreneesatlantiquesTiersLieux" | "redlab" | "relief" | "reseauDesTierslieuxDeGuyane" | "reseauDesTierslieuxDeMayotte" | "reseauDesTierslieuxDuGrandEst" | "reseauNormandDesTierslieux" | "reseauRegionalDesTierslieuxGuadeloupe" | "reseauRegionalDesTierslieuxMartinique" | "reseauTierslieux" | "rfflabs" | "ries" | "sLieux" | "saintJosephTiersLieux" | "saintbenoitTiersLieux" | "saintbenoitTiersLieux1" | "saintbenoitTiersLieux2" | "saintpaulSport1" | "saintpaulTiersLieux" | "saintpierreTiersLieux" | "savoieTiersLieux" | "siteDuPactePourLaTransition" | "sportSanteBienetre" | "sudTierslieux" | "suppa" | "terramies" | "testeTplFormation" | "tiersLieuxGenerique" | "tierslieuxBfc" | "tierslieuxbelgique" | "tierslieuxorg" | "tierslieuxorg1" | "transiter" | "vhelioPeiTour2025" | "wallisetfutunaPourUnNumeriqueInclusif";
1
+ export type KnownCostumSlug = "CercleTravailleursSociauxLiberauxLaPlumeSociale" | "FabEn" | "LaReunionDesTiersLieux" | "LivingLabInnovationSocialeBraspanon" | "RoseLab" | "Santeentransition" | "alfph" | "ambitionTiersLieuxValDeLoire" | "assoKosasa" | "associationEkilibre" | "boclLe" | "bretagneTierslieux" | "caDuBassinDeThauTiersLieux" | "caDuBassinDeThauTiersLieux1" | "campagne" | "capTierslieux" | "catalyst" | "ccDesCaussesALaubracTiersLieux" | "chtitube" | "circuitCourt" | "cmcasHB" | "cmcasHauteBretagne" | "coFinancementTierslieux" | "coeurNumerique" | "communLundi" | "consortiumIledefranceTierslieux" | "copHautsdefrance" | "createchFablabDeLaMjcDeSaintjean" | "cressDeLaReunion1" | "cressReunion" | "cressReunionNetwork" | "ctenat" | "cyberReunion" | "daLocu" | "ecocentre" | "ekisphere" | "equipementsSportifs974" | "fabLimagne" | "fabdulys1" | "fablab3dplant" | "fablabChauxdefonds" | "federationDesCae" | "fianarantsoaAlimentation" | "formationGenerique" | "franceTierslieux" | "heraultTiersLieux" | "hinaura" | "hubmayotte" | "hubnouvellecaledonie" | "hubpolynesiefrancaise" | "hubreunion" | "hubterritoires" | "hubwallisetfutuna" | "hva" | "ibv2" | "institutBleu" | "journalInsoumisChambery" | "kpacite" | "laCompagnieDesTierslieux" | "laCooperativeTierslieux" | "laMaisonDesFaiseurs" | "laMinoterie1" | "laMyne" | "laReunionPourUnNumeriqueInclusif" | "laRosee" | "laSemaineDesTierslieux" | "laTresseTierslieu" | "labEnCommuns" | "labboite" | "lakou" | "lapossession" | "lattesTiersLieux" | "leFaugaTiersLieux" | "leTamponTiersLieux" | "lesCommunsDesTierslieux" | "lesImaginationsFertiles" | "lidairesTiersLieux" | "littoralHautsDeFrance" | "lotetgaronneTiersLieux" | "mayottePourUnNumeriqueInclusif" | "meir" | "montpellierMediterraneeMetropoleTiersLieux" | "montpellierTiersLieux" | "navigatorDesTierslieux" | "notragora" | "nouvellecaledoniePourUnNumeriqueInclusif" | "openAtlas" | "parent62" | "polynesieFrancaisePourUnNumeriqueInclusif" | "prdr" | "pyreneesatlantiquesTiersLieux" | "redlab" | "relief" | "reseauDesTierslieuxDeGuyane" | "reseauDesTierslieuxDeMayotte" | "reseauDesTierslieuxDuGrandEst" | "reseauNormandDesTierslieux" | "reseauRegionalDesTierslieuxGuadeloupe" | "reseauRegionalDesTierslieuxMartinique" | "reseauTierslieux" | "rfflabs" | "ries" | "sLieux" | "saintJosephTiersLieux" | "saintbenoitTiersLieux" | "saintbenoitTiersLieux1" | "saintbenoitTiersLieux2" | "saintpaulSport1" | "saintpaulTiersLieux" | "saintpierreTiersLieux" | "savoieTiersLieux" | "siteDuPactePourLaTransition" | "sportSanteBienetre" | "sudTierslieux" | "suppa" | "terramies" | "testeTplFormation" | "tiersLieuxGenerique" | "tierslieuxBfc" | "tierslieuxbelgique" | "tierslieuxorg" | "tierslieuxorg1" | "transiter" | "vhelioPeiTour2025" | "wallisetfutunaPourUnNumeriqueInclusif";
2
2
  export type Collection = "addPhoto" | "badges" | "classifieds" | "crowdfunding" | "events" | "organizations" | "person" | "poi" | "projects" | "proposal" | "ressources";
3
3
  export interface CostumExtensionField {
4
4
  name: string;
@@ -143,6 +143,57 @@ export interface CostumFieldMap {
143
143
  image?: string;
144
144
  };
145
145
  };
146
+ associationEkilibre: {
147
+ organizations: {
148
+ affiliate?: string | boolean;
149
+ affiliateTo?: string;
150
+ autreDescription?: string;
151
+ formLocality?: string;
152
+ image?: string;
153
+ infoGeneral?: Record<string, unknown>;
154
+ legalStatus?: string | string[];
155
+ link?: string;
156
+ linkedin?: string;
157
+ location?: string;
158
+ mobile?: string;
159
+ otherPersonInChargeTitle?: string;
160
+ otherRepresentativeTitle?: string;
161
+ personInChargeCivility?: string | string[];
162
+ personInChargeEmail?: string;
163
+ personInChargeFirstName?: string;
164
+ personInChargeName?: string;
165
+ personInChargeTelephone?: string | number;
166
+ personInChargeTitle?: "Président" | "Maire.sse" | "Chef.fe d'entreprise" | "Chef.fe d'établissement" | "Autre...";
167
+ representativeCivility?: string | string[];
168
+ representativeEmail?: string;
169
+ representativeFirstName?: string;
170
+ representativeName?: string;
171
+ representativeTelephone?: string | number;
172
+ representativeTitle?: "Président" | "Maire.sse" | "Chef.fe d'entreprise" | "Chef.fe d'établissement" | "Autre...";
173
+ responsableCivilePro?: Record<string, unknown>;
174
+ responsableSameAsRepresent?: string | boolean;
175
+ sextionInfo?: Record<string, unknown>;
176
+ sextionInfoRepresentant?: Record<string, unknown>;
177
+ sextionInfoResponsable?: Record<string, unknown>;
178
+ sigle?: string;
179
+ similarLink?: Record<string, unknown>;
180
+ siren?: string | number;
181
+ statusActor?: string | string[];
182
+ statusCommunale?: string | string[];
183
+ statusFile?: Record<string, unknown>;
184
+ statusPrimaire?: string | string[];
185
+ statusSecondaire?: string | string[];
186
+ youtube?: string;
187
+ };
188
+ poi: {
189
+ category?: string;
190
+ featured?: string | boolean;
191
+ link?: string;
192
+ publicationDate?: string;
193
+ publicationStatus?: string;
194
+ status?: string | string[];
195
+ };
196
+ };
146
197
  boclLe: {
147
198
  badges: {
148
199
  thematic?: string | string[];