@communecter/cocolight-api-client 1.0.171 → 1.0.172

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.171",
3
+ "version": "1.0.172",
4
4
  "description": "Client Axios simplifié pour l'API cocolight",
5
5
  "repository": {
6
6
  "type": "git",
@@ -380,8 +380,22 @@ export declare class BaseEntity<TServerData = any> {
380
380
  _calledFromSave: boolean;
381
381
  _syncReactiveDraft: boolean;
382
382
  _isDeleted: boolean;
383
- /** Contexte costum porté par cette instance (null hors d'un `CostumScope`). Posé au constructeur. */
383
+ /** Contexte costum porté par cette instance (null hors d'un `CostumScope`). Posé au constructeur.
384
+ * Sens A — « quel costum définit le SCHÉMA de cet élément » : dérivé du `source.key` (provenance),
385
+ * ré-affirmé à chaque `_setData`. Gouverne draft/proxy, merge de schémas, héritage aux enfants. */
384
386
  _costumCtx: CostumRuntimeContext | null;
387
+ /**
388
+ * Scope d'ADMINISTRATION costum — sens B : « au NOM de quel costum j'agis » (`validateGroup`,
389
+ * `addReference`/`removeReference`/`removeFromSource`, `previewImport`/`importElements`,
390
+ * `exportElements`). Distinct de `_costumCtx` (sens A, schéma) : l'hôte d'un site peut porter un
391
+ * `source.key` ÉTRANGER (sa provenance — ex. l'org `institutBleu`, créée sous « meir ») ; la
392
+ * provenance gouverne le schéma, PAS l'administration — sans cette séparation, `validateGroup`
393
+ * postait `costumSlug:"meir"` et (dé)posait `preferences.toBeValidated.meir` : validation sans
394
+ * effet (mesuré 2026-08-03, 7 sites de site-json concernés). Posé UNIQUEMENT par
395
+ * `setCostumScope`/`loadCostumScope` (jamais auto-dérivé), jamais touché par `_setData` :
396
+ * il SURVIT aux refresh/hydratations. @private
397
+ */
398
+ private _adminScope;
385
399
  _add?: ((payload: any) => Promise<void | unknown>) | undefined;
386
400
  _update?: ((payload: any) => Promise<boolean>) | undefined;
387
401
  _allowedFieldsCache?: string[];
@@ -1829,6 +1843,11 @@ export declare class BaseEntity<TServerData = any> {
1829
1843
  /**
1830
1844
  * L'entité porte-t-elle un contexte costum COMPLET (slug + costumId + costumType) ?
1831
1845
  * Vrai pour une entité chargée avec un `source.key` connu, ou après `setCostumScope()`.
1846
+ *
1847
+ * ⚠️ Dit seulement s'IL Y A un scope, pas LEQUEL : un hôte dont le `source.key` est la provenance
1848
+ * d'un AUTRE costum répond `true` avec le mauvais slug. Pour administrer AU NOM d'un costum
1849
+ * précis, appeler `setCostumScope(slug, …)` inconditionnellement (idempotent) plutôt que de
1850
+ * court-circuiter sur ce test.
1832
1851
  */
1833
1852
  hasCostumScope(): boolean;
1834
1853
  /**
@@ -1847,6 +1866,12 @@ export declare class BaseEntity<TServerData = any> {
1847
1866
  * Remplace la mutation externe de `_costumCtx` pratiquée par les fronts (champ INTERNE non
1848
1867
  * contractuel) — cf. site-json `ensureCostumScope`, à migrer sur cette méthode.
1849
1868
  *
1869
+ * ÉPINGLE aussi le scope d'ADMINISTRATION (`_adminScope`) : les méthodes admin agissent au nom
1870
+ * de CE slug, même si l'entité porte un `source.key` étranger (sa provenance, qui ne gouverne
1871
+ * que le schéma) — et le scope SURVIT aux refresh/hydratations (`_setData` re-dérive `_costumCtx`
1872
+ * du `source.key` sans toucher `_adminScope`). Poser le scope est donc à faire UNE fois,
1873
+ * inconditionnellement (idempotent), pas derrière un `if (hasCostumScope())`.
1874
+ *
1850
1875
  * @param slug - Slug du costum (ex. `"equipementsSportifs974"`).
1851
1876
  * @param opts.costumId / opts.costumType - Identité de l'élément hôte, requise si le costum
1852
1877
  * n'est pas dans le registre bundlé (résolue par le front via slug/getinfo).
@@ -1855,6 +1880,13 @@ export declare class BaseEntity<TServerData = any> {
1855
1880
  costumId?: string;
1856
1881
  costumType?: string;
1857
1882
  }): void;
1883
+ /**
1884
+ * Épingle le scope d'ADMINISTRATION (sens B) SI l'identité est complète — sinon no-op : les
1885
+ * méthodes admin retombent alors sur `_costumCtx` (comportement historique) et
1886
+ * `_requireCostumCtx` lève sa propre erreur explicite si lui aussi est incomplet.
1887
+ * @private
1888
+ */
1889
+ private _setAdminScope;
1858
1890
  /**
1859
1891
  * Charge EN LIVE (via `getcostumjson`) le scope costum d'un slug HORS registre bundlé et pose le
1860
1892
  * contexte COMPLET (champs/presets/hidden) sur cette entité — pour l'ÉDITER avec ses champs costum
@@ -1864,8 +1896,11 @@ export declare class BaseEntity<TServerData = any> {
1864
1896
  */
1865
1897
  loadCostumScope(slug: string): Promise<boolean>;
1866
1898
  /**
1867
- * Contexte costum de CETTE entité (résolu de son `source.key`) — requis par l'import/export admin.
1868
- * @throws {ApiError} si l'entité n'est pas rattachée à un costum.
1899
+ * Identité costum au nom de laquelle AGIR (admin : validate/reference/import/export).
1900
+ * Priorité au scope EXPLICITE (`_adminScope`, posé par `setCostumScope`/`loadCostumScope` —
1901
+ * il survit aux re-hydratations), sinon fallback sur `_costumCtx` (provenance `source.key`,
1902
+ * comportement historique : un élément administré « chez lui » n'a rien à poser).
1903
+ * @throws {ApiError} si l'entité n'est rattachée à aucun costum.
1869
1904
  * @private
1870
1905
  */
1871
1906
  private _requireCostumCtx;
@@ -1890,7 +1925,8 @@ export declare class BaseEntity<TServerData = any> {
1890
1925
  /**
1891
1926
  * Importe en masse des éléments SOUS le costum de cette entité (IMPORT_ELEMENTS / importData).
1892
1927
  * Méthode de haut niveau à PRÉFÉRER à `endpointApi.importElements`. `costumSlug/costumId/costumType`
1893
- * sont dérivés du `_costumCtx` (source.key) — pas de paramètre costum à fournir. Les lignes sont
1928
+ * viennent du scope costum (explicite via `setCostumScope`, sinon dérivé du `source.key`) —
1929
+ * pas de paramètre costum à fournir. Les lignes sont
1894
1930
  * découpées en lots (`chunkSize`) pour la progression ; `data` est JSON-encodé en interne. Le backend
1895
1931
  * (re)vérifie + déduplique (update si le nom existe déjà) + insère + relie au costum.
1896
1932
  *
@@ -1920,7 +1956,7 @@ export declare class BaseEntity<TServerData = any> {
1920
1956
  private _summarizeImport;
1921
1957
  /**
1922
1958
  * Exporte les éléments du costum de cette entité (EXPORT_ELEMENTS / getCsvAdmin). Méthode haut niveau.
1923
- * Scope automatiquement sur `source.key` = costum de l'entité (`_costumCtx.slug`). RÉSERVÉ aux
1959
+ * Scope = costum de l'entité (explicite via `setCostumScope`, sinon dérivé du `source.key`). RÉSERVÉ aux
1924
1960
  * super-admins côté backend (gater l'UI via `me.isSuperAdmin()`). Renvoie `{ results, fields }` ;
1925
1961
  * utiliser le helper `toCsv(results, fields)` pour produire le CSV téléchargeable.
1926
1962
  *
@@ -1940,7 +1976,8 @@ export declare class BaseEntity<TServerData = any> {
1940
1976
  }>;
1941
1977
  /**
1942
1978
  * (Dé)VALIDE un élément POUR le costum de cette entité (VALIDATE_GROUP / ValidateGroupAction). Méthode
1943
- * haut niveau : `costumSlug` est dérivé du `_costumCtx` (source.key) — pas de paramètre costum à fournir.
1979
+ * haut niveau : `costumSlug` vient du scope costum (explicite via `setCostumScope`, sinon dérivé du
1980
+ * `source.key`) — pas de paramètre costum à fournir.
1944
1981
  * (Dé)pose `preferences.toBeValidated[slug]` sur l'élément AVEC CASCADE sur les enfants liés
1945
1982
  * (`source.keys ∋ slug`, hors citoyens) et les classifieds `parent.<id>`.
1946
1983
  *