@communecter/cocolight-api-client 1.0.163 → 1.0.166

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.
Files changed (48) hide show
  1. package/dist/1494.cocolight-api-client.browser.js +1 -1
  2. package/dist/1494.cocolight-api-client.cjs +1 -1
  3. package/dist/1641.cocolight-api-client.browser.js +1 -1
  4. package/dist/1641.cocolight-api-client.cjs +1 -1
  5. package/dist/2041.cocolight-api-client.browser.js +1 -1
  6. package/dist/2041.cocolight-api-client.cjs +1 -1
  7. package/dist/2302.cocolight-api-client.browser.js +1 -1
  8. package/dist/2302.cocolight-api-client.cjs +1 -1
  9. package/dist/2313.cocolight-api-client.browser.js +1 -1
  10. package/dist/2313.cocolight-api-client.cjs +1 -1
  11. package/dist/2594.cocolight-api-client.browser.js +1 -1
  12. package/dist/2594.cocolight-api-client.cjs +1 -1
  13. package/dist/2766.cocolight-api-client.browser.js +1 -1
  14. package/dist/2766.cocolight-api-client.cjs +1 -1
  15. package/dist/3330.cocolight-api-client.browser.js +1 -1
  16. package/dist/3330.cocolight-api-client.cjs +1 -1
  17. package/dist/3764.cocolight-api-client.browser.js +1 -1
  18. package/dist/3764.cocolight-api-client.cjs +1 -1
  19. package/dist/3873.cocolight-api-client.browser.js +1 -1
  20. package/dist/3873.cocolight-api-client.cjs +1 -1
  21. package/dist/4031.cocolight-api-client.browser.js +1 -1
  22. package/dist/4031.cocolight-api-client.cjs +1 -1
  23. package/dist/5286.cocolight-api-client.browser.js +1 -1
  24. package/dist/5286.cocolight-api-client.cjs +1 -1
  25. package/dist/5541.cocolight-api-client.browser.js +1 -1
  26. package/dist/5541.cocolight-api-client.cjs +1 -1
  27. package/dist/601.cocolight-api-client.browser.js +1 -1
  28. package/dist/601.cocolight-api-client.cjs +1 -1
  29. package/dist/6369.cocolight-api-client.browser.js +1 -1
  30. package/dist/6369.cocolight-api-client.cjs +1 -1
  31. package/dist/7009.cocolight-api-client.browser.js +1 -1
  32. package/dist/7009.cocolight-api-client.cjs +1 -1
  33. package/dist/8300.cocolight-api-client.browser.js +1 -1
  34. package/dist/8300.cocolight-api-client.cjs +1 -1
  35. package/dist/8894.cocolight-api-client.browser.js +1 -1
  36. package/dist/8894.cocolight-api-client.cjs +1 -1
  37. package/dist/cocolight-api-client.browser.js +6 -6
  38. package/dist/cocolight-api-client.cjs +1 -1
  39. package/dist/cocolight-api-client.vite.mjs.js +1 -1
  40. package/dist/cocolight-api-client.vite.mjs.js.map +1 -1
  41. package/package.json +1 -1
  42. package/types/api/BaseEntity.d.ts +28 -6
  43. package/types/api/User.d.ts +15 -4
  44. package/types/costum/liveDigest.d.ts +85 -0
  45. package/types/costum/runtime-map.d.ts +12 -2
  46. package/types/costum/runtime.d.ts +43 -8
  47. package/types/costum/types.d.ts +13 -0
  48. package/types/index.d.ts +1 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@communecter/cocolight-api-client",
3
- "version": "1.0.163",
3
+ "version": "1.0.166",
4
4
  "description": "Client Axios simplifié pour l'API cocolight",
5
5
  "repository": {
6
6
  "type": "git",
@@ -742,6 +742,20 @@ export declare class BaseEntity<TServerData = any> {
742
742
  * @protected
743
743
  */
744
744
  protected _markDeletedLocally(): void;
745
+ /** Droit d'ADMIN DE COSTUM pré-résolu par l'appelant (ex. site-json /admin via `me.isCostumAdmin(slug)`). */
746
+ protected _costumAdminAuthorized: boolean;
747
+ /**
748
+ * Marque cette instance comme éditable/supprimable au titre du droit-parapluie COSTUM. À poser par
749
+ * l'appelant qui a DÉJÀ résolu `me.isCostumAdmin(slug)` (async) — les gardes client d'édition (`_update`)
750
+ * et de suppression (`_deleteViaElement`) le respectent alors. Le backend reste la source de vérité
751
+ * (canEditItem/canDeleteElement portent isCostumAdmin), ceci n'ouvre QUE le pré-check client.
752
+ */
753
+ setCostumAdminAuthorized(v?: boolean): this;
754
+ /**
755
+ * Droit de gestion « élevé » côté client : super-admin (via userContext) OU admin de costum pré-résolu.
756
+ * Utilisé par les gardes `_update`/`_deleteViaElement` pour ne pas bloquer une action que le backend autorise.
757
+ */
758
+ protected _hasElevatedManageRight(): boolean;
745
759
  /**
746
760
  * Suppression générique d'un élément via `DELETE_ELEMENT`
747
761
  * (`/co2/element/delete/type/{type}/id/{id}`).
@@ -1746,12 +1760,12 @@ export declare class BaseEntity<TServerData = any> {
1746
1760
  * donc aucun `_costumCtx`) aux méthodes qui l'exigent (`_requireCostumCtx` : `previewImport`,
1747
1761
  * `importElements`, `exportElements`, `addReference`…).
1748
1762
  *
1749
- * Résolution :
1750
- * 1. le REGISTRE bundlé d'abord (`resolveCostumCtxFromSource` — costum connu : identité + overlay
1751
- * de champs, source de vérité interne) ;
1752
- * 2. sinon un contexte NU construit depuis `opts` (costum de config/déploiement hors registre) —
1753
- * même forme que le fallback interne (schema vide, fields:[]) ;
1754
- * 3. sinon throw (identité costum introuvable).
1763
+ * Résolution (`resolveCostumCtxFromSource`, LIVE-FIRST) :
1764
+ * 1. cache costum LIVE frais (via un `prefetchCostums`/`loadCostumScope` préalable) — champs inclus ;
1765
+ * 2. sinon le REGISTRE bundlé (warm-start) ;
1766
+ * 3. sinon un contexte NU construit depuis `opts` (costum hors cache/registre — schema vide, fields:[]) ;
1767
+ * 4. sinon throw (identité costum introuvable). NB : pour un costum hors registre AVEC ses champs,
1768
+ * préférer `loadCostumScope(slug)` (async) qui fetche `getcostumjson`.
1755
1769
  *
1756
1770
  * Remplace la mutation externe de `_costumCtx` pratiquée par les fronts (champ INTERNE non
1757
1771
  * contractuel) — cf. site-json `ensureCostumScope`, à migrer sur cette méthode.
@@ -1764,6 +1778,14 @@ export declare class BaseEntity<TServerData = any> {
1764
1778
  costumId?: string;
1765
1779
  costumType?: string;
1766
1780
  }): void;
1781
+ /**
1782
+ * Charge EN LIVE (via `getcostumjson`) le scope costum d'un slug HORS registre bundlé et pose le
1783
+ * contexte COMPLET (champs/presets/hidden) sur cette entité — pour l'ÉDITER avec ses champs costum
1784
+ * sans re-publier la lib (RFC fil C / option 3bis, comble l'édition vide). Contrairement à
1785
+ * `setCostumScope` (sync, registre/ctx nu), digère le typeObj du costum. No-op si le costum ne
1786
+ * couvre pas la collection de l'entité. Idempotent (cache session par slug).
1787
+ */
1788
+ loadCostumScope(slug: string): Promise<boolean>;
1767
1789
  /**
1768
1790
  * Contexte costum de CETTE entité (résolu de son `source.key`) — requis par l'import/export admin.
1769
1791
  * @throws {ApiError} si l'entité n'est pas rattachée à un costum.
@@ -70,15 +70,26 @@ export declare class User extends BaseEntity<UserItemNormalized> {
70
70
  */
71
71
  isSuperAdmin(): boolean;
72
72
  /**
73
- * Admin de plateforme (`roles.adminPlatform === true`). NB : rôle hors-legacy (absent du PHP) mais
74
- * HONORÉ par le backend comme super-admin (cf. isUserSuperAdmin/deleteElement) ; posé en base, pas par le code.
73
+ * Admin de plateforme (`roles.adminPlatform === true`). Rôle hors-legacy (absent du PHP), posé en base.
74
+ * NB : le backend NE le traite PLUS comme super-admin (retiré de `isUserSuperAdmin` pour byte-fidélité) —
75
+ * ne l'utiliser que pour des features plateforme dédiées, pas pour gater une action que le backend refusera.
75
76
  */
76
77
  isAdminPlatform(): boolean;
77
78
  /**
78
- * Accès admin plateforme large : `superAdmin || adminPlatform` (= `isUserSuperAdmin` backend général,
79
- * celui de la suppression). Pour gater l'UI ; l'export reste sur `isSuperAdmin()` strict.
79
+ * Accès admin plateforme large : `superAdmin || adminPlatform`. Pour gater l'UI d'outils plateforme.
80
+ * ⚠ Le backend n'accorde l'édition/suppression qu'au `superAdmin` strict (+ droits costum) — un
81
+ * `adminPlatform` pur verra l'UI mais sera refusé au save/delete.
80
82
  */
81
83
  canPlatformAdmin(): boolean;
84
+ /**
85
+ * L'utilisateur connecté est-il ADMIN DU COSTUM `slug` (droit-parapluie back-office) ? = admin (lien
86
+ * `isAdmin` validé) de l'élément HÔTE du costum. Pendant client de `Authorisation::isCostumAdmin` :
87
+ * résout le host via `getElementsKey` (slug → contextId/contextType) puis lit
88
+ * `me.links.<memberOf|projects|events>[hostId].isAdmin`.
89
+ * ⚠ ASYNC (1 requête) : à résoudre UNE fois par contexte /admin, PAS par ligne de liste.
90
+ * NB : ne couvre pas le fallback `costum.admins` (rare) — seul le chemin admin-du-host est vérifié client-side.
91
+ */
92
+ isCostumAdmin(slug: string): Promise<boolean>;
82
93
  /**
83
94
  * Récupère le profil complet de l'utilisateur.
84
95
  * Si l'utilisateur est connecté, on appelle le endpoint ME_INFO_URL,
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Digestion RUNTIME d'un costum servi par `getcostumjson` (format legacy brut) en
3
+ * `CostumRuntimeContext` par collection — permet de résoudre un costum HORS du registre bundlé sans
4
+ * re-publication (RFC doc/31 fil C, option 3bis). Port fidèle de `tools/parity/scripts/costum-fields.mjs`
5
+ * (backend), SANS l'inférence de type par valeurs stockées (pas d'accès base côté client ; en pratique
6
+ * inutile — `setType` BSON natif ne concerne aucun costum déployé). Le type reste DÉCLARÉ (inputType/
7
+ * rules), l'enum vient de `lists`, la multiplicité de la config.
8
+ */
9
+ import type { CostumRuntimeContext } from "./runtime.js";
10
+ import type { Collection } from "./types.js";
11
+ /** Sous-objet `costum` renvoyé par `getcostumjson` (data). Champs utiles à la digestion. */
12
+ export interface CostumJsonData {
13
+ slug?: string;
14
+ typeObj?: Record<string, TypeObjNode>;
15
+ lists?: Record<string, unknown>;
16
+ }
17
+ interface TypeObjNode {
18
+ sameAs?: string;
19
+ add?: boolean;
20
+ createLabel?: string;
21
+ dynFormCostum?: {
22
+ beforeBuild?: {
23
+ properties?: Record<string, FieldDef>;
24
+ };
25
+ onload?: {
26
+ actions?: OnloadActions;
27
+ };
28
+ onLoads?: {
29
+ onload?: {
30
+ actions?: OnloadActions;
31
+ };
32
+ };
33
+ };
34
+ }
35
+ interface OnloadActions {
36
+ presetValue?: Record<string, unknown>;
37
+ hide?: Record<string, unknown>;
38
+ }
39
+ interface FieldDef {
40
+ inputType?: string;
41
+ label?: string;
42
+ multiple?: boolean;
43
+ select2?: {
44
+ multiple?: boolean;
45
+ };
46
+ maximumSelectionLength?: number | string;
47
+ rules?: {
48
+ number?: unknown;
49
+ };
50
+ list?: string;
51
+ tagsList?: string;
52
+ savePath?: string;
53
+ }
54
+ /**
55
+ * Digère `getcostumjson` → `CostumRuntimeContext` pour UNE collection (null si le costum ne couvre pas
56
+ * cette collection). `meta` = identité de l'élément porteur (costumId/costumType, résolue par slug/getinfo).
57
+ */
58
+ /** Contexte digéré + capacités de création (add/createLabel) + clé `typeObj` (sous-type) du node. */
59
+ export type DigestedCostum = CostumRuntimeContext & {
60
+ add: boolean;
61
+ createLabel: string | null;
62
+ typeKey: string;
63
+ };
64
+ /**
65
+ * Énumère les FORMULAIRES d'un costum (une entrée par clé `typeObj` portant un `dynFormCostum`) — permet à
66
+ * l'assistant de générer un CostumFormSchema PAR SOUS-TYPE (ex. poi → `recoveryCenter` ET `article`), là où
67
+ * `digestCostumJson(collection)` n'en renvoie qu'un. `discriminator` = valeur de `presetValue.type` (le type
68
+ * estampillé au save qui distingue le sous-type), sinon la clé elle-même.
69
+ */
70
+ export declare function listCostumFormNodes(data: CostumJsonData): Array<{
71
+ typeKey: string;
72
+ collection: string;
73
+ add: boolean;
74
+ createLabel: string | null;
75
+ discriminator?: string;
76
+ }>;
77
+ export declare function digestCostumJson(data: CostumJsonData, collection: Collection, meta: {
78
+ costumId: string;
79
+ costumType: string;
80
+ slug?: string;
81
+ baseFieldNames?: string[];
82
+ }, opts?: {
83
+ typeKey?: string;
84
+ }): DigestedCostum | null;
85
+ export {};
@@ -1,3 +1,13 @@
1
- import type { Collection, CostumCollectionExt } from "./types.js";
2
- export type CostumRuntimeEntry = Pick<CostumCollectionExt, "schema" | "fields" | "presets" | "hidden">;
1
+ import type { Collection, CostumCollectionExt, CostumExtensionField } from "./types.js";
2
+ /** Variante runtime SYNC (subtype-aware) : sélectionnée par `discriminator` (= serverData.type). */
3
+ export interface CostumRuntimeVariant {
4
+ discriminator: string | null;
5
+ schema: object;
6
+ fields: CostumExtensionField[];
7
+ presets: Record<string, unknown>;
8
+ hidden: string[];
9
+ }
10
+ export type CostumRuntimeEntry = Pick<CostumCollectionExt, "schema" | "fields" | "presets" | "hidden"> & {
11
+ variants?: CostumRuntimeVariant[];
12
+ };
3
13
  export declare const COSTUM_RUNTIME: Record<string, Partial<Record<Collection, CostumRuntimeEntry>>>;
@@ -1,5 +1,23 @@
1
1
  import type { CostumExtensionModule, CostumExtensionField, KnownCostumSlug, Collection } from "./types.js";
2
2
  import type { BaseEntity } from "../api/BaseEntity.js";
3
+ /**
4
+ * Invalide le cache costum live — d'UN slug (ex. après avoir modifié ce costum en base), ou de TOUT
5
+ * (`invalidateCostumCache()`). Le prochain accès refetchera `getcostumjson` (C2e). Sans effet sur le bundle.
6
+ */
7
+ export declare function invalidateCostumCache(slug?: string): void;
8
+ /**
9
+ * Énumère TOUS les formulaires costum d'un slug (UN descripteur PAR SOUS-TYPE = clé `typeObj`) via
10
+ * getcostumjson — pour l'assistant config (génération multi-form + routage `editModalMatch`). Distinct de
11
+ * `CostumScope.describeForm(collection)` qui n'en renvoie qu'UN par collection. Seuls les sous-types dont la
12
+ * collection de base est gérée par les fabriques (poi/organizations/projects/events) sont retournés.
13
+ */
14
+ export declare function describeCostumForms(user: BaseEntity, slug: string): Promise<CostumFormDescriptor[]>;
15
+ /**
16
+ * Pré-charge EN BATCH les costums (par slug) manquants/périmés du cache live, AVANT un revive synchrone
17
+ * (finalizer de `searchCostum`, `get()`, `entitySlug`). Dédup + TTL : un slug déjà frais est ignoré.
18
+ * Chaque fetch qui échoue est avalé (offline → le revive retombera sur le bundle). Concurrence bornée.
19
+ */
20
+ export declare function prefetchCostums(user: BaseEntity, sourceKeys: (string | null | undefined)[]): Promise<void>;
3
21
  /**
4
22
  * Contexte costum résolu, attaché à une instance d'entité via `config.costumCtx`.
5
23
  * Porté tel quel par `BaseEntity._costumCtx` et consommé par les 3 couches de filtrage.
@@ -56,6 +74,10 @@ export interface CostumFormDescriptor {
56
74
  * Le consommateur les exclut du formulaire (les champs costum portent aussi `hidden` par champ). */
57
75
  hidden: string[];
58
76
  fields: CostumFieldDescriptor[];
77
+ /** Clé `typeObj` (sous-type) d'où vient ce form — présent quand issu de `describeCostumForms` (énumération). */
78
+ typeKey?: string;
79
+ /** Valeur de `type` estampillée au save qui distingue le sous-type (= presetValue.type, sinon typeKey). */
80
+ discriminator?: string;
59
81
  }
60
82
  /**
61
83
  * Scope costum : fabrique des entités liées à un costum. Réutilise le `user` (parent, deps, auth)
@@ -68,8 +90,12 @@ export declare class CostumScope {
68
90
  private readonly costumId;
69
91
  private readonly costumType;
70
92
  constructor(user: BaseEntity, slug: KnownCostumSlug | (string & {}), module: CostumExtensionModule, costumId: string, costumType: string);
71
- /** Construit le `CostumRuntimeContext` pour une collection donnée (null si le costum ne la couvre pas). */
72
- contextFor(collection: Collection): CostumRuntimeContext | null;
93
+ /**
94
+ * Construit le `CostumRuntimeContext` pour une collection (null si non couverte). `type` (optionnel) = le
95
+ * sous-type voulu (= `presetValue.type` de la variante) : sélectionne l'overlay de CE sous-type, sinon la
96
+ * racine=union. Indispensable au CREATE d'un sous-type précis (bon `type`/presets/champs — cf. P0 write-safety).
97
+ */
98
+ contextFor(collection: Collection, type?: string | null): CostumRuntimeContext | null;
73
99
  /** Crée une entité de `collection` sous ce costum (presets appliqués, surchargeables par `data`). */
74
100
  private create;
75
101
  poi(data?: Record<string, unknown>): Promise<import("../index.js").Poi>;
@@ -85,13 +111,15 @@ export declare class CostumScope {
85
111
  describeForm(collection: Collection): CostumFormDescriptor | null;
86
112
  }
87
113
  /**
88
- * Dérive un `CostumRuntimeContext` SYNCHRONE depuis le `source.key` d'un élément CHARGÉ + sa collection
89
- * (inc2). Permet aux entités revifiées hors scope (`fromServerData` des résultats `searchCostum`,
90
- * `me.poi({id})`) de retrouver leurs champs costum (writable + dispatch) sans `me.costum(slug)`.
91
- * Utilise la map bundlée `COSTUM_RUNTIME` (sync) + `COSTUM_META`. Renvoie null si le costum/collection est
92
- * inconnu (costum hors registry → résolution live = inc2b).
114
+ * Dérive un `CostumRuntimeContext` SYNCHRONE depuis le `source.key` d'un élément CHARGÉ + sa collection.
115
+ * Permet aux entités revifiées (`fromServerData` des résultats `searchCostum`, `me.poi({id})`) de retrouver
116
+ * leurs champs costum (writable + dispatch) sans `me.costum(slug)`.
117
+ *
118
+ * **LIVE-FIRST** (RFC fil C / cadrage C2) : le cache live FRAIS prime (un costum modifié en base est reflété
119
+ * sans republier), sinon la map bundlée `COSTUM_RUNTIME` (warm-start / offline), sinon ctx nu / null. Le
120
+ * cache est peuplé par `prefetchCostums` (async, AVANT le revive) ou `me.costum`/`loadCostumScope`.
93
121
  */
94
- export declare function resolveCostumCtxFromSource(sourceKey: string | undefined | null, collection: Collection): CostumRuntimeContext | null;
122
+ export declare function resolveCostumCtxFromSource(sourceKey: string | undefined | null, collection: Collection, type?: string | null): CostumRuntimeContext | null;
95
123
  /**
96
124
  * Ouvre un scope costum FIELDLESS depuis une entité DÉJÀ CHARGÉE (zéro fetch) : `costumSlug` = slug de
97
125
  * l'entité (= `source.key` posé par le backend), `costumId/costumType` = l'entité porteuse. Pendant runtime
@@ -106,3 +134,10 @@ export declare function costumScopeFromEntity(user: BaseEntity, entity: BaseEnti
106
134
  * - slug HORS registry → résolution LIVE via `slug/getinfo` (contextId/contextType) → scope nu (tier 3b).
107
135
  */
108
136
  export declare function resolveCostumScope(user: BaseEntity, slug: KnownCostumSlug | (string & {})): Promise<CostumScope>;
137
+ /**
138
+ * Charge EN LIVE le scope costum d'un slug hors registre (getcostumjson) et pose le `CostumRuntimeContext`
139
+ * de la collection donnée sur l'entité — pour ÉDITER un élément d'un costum non bundlé avec ses champs
140
+ * (comble l'édition vide L4). Idempotent : ne refetch pas si le cache live couvre déjà (slug, collection).
141
+ * No-op si le costum ne résout pas / ne couvre pas la collection (l'entité reste en scope d'identité).
142
+ */
143
+ export declare function loadCostumContext(user: BaseEntity, slug: string, collection: Collection): Promise<CostumRuntimeContext | null>;
@@ -11,6 +11,17 @@ export interface CostumExtensionField {
11
11
  enum?: string[];
12
12
  multiple?: boolean;
13
13
  }
14
+ /** Sous-type (subtype-aware) d'une collection : overlay create/édition résolu par `discriminator` (= presetValue.type). */
15
+ export interface CostumCollectionVariant {
16
+ typeKey: string;
17
+ discriminator: string | null;
18
+ add: boolean;
19
+ createLabel: string | null;
20
+ presets: Record<string, unknown>;
21
+ hidden: string[];
22
+ schema: object;
23
+ fields: CostumExtensionField[];
24
+ }
14
25
  export interface CostumCollectionExt {
15
26
  schema: object;
16
27
  fields: CostumExtensionField[];
@@ -18,6 +29,8 @@ export interface CostumCollectionExt {
18
29
  hidden: string[];
19
30
  add: boolean;
20
31
  createLabel: string | null;
32
+ /** Sous-types : émis SSI >1 form/collection. La racine (schema/fields) reste l'UNION pour la LECTURE. */
33
+ variants?: CostumCollectionVariant[];
21
34
  }
22
35
  export interface CostumExtensionModule {
23
36
  slug: string;
package/types/index.d.ts CHANGED
@@ -86,6 +86,7 @@ export type { PaginatorPage, PaginatorState, FundingEnvelopeResult, FundingEnvel
86
86
  export { UPDATE_PATH_MAGIC } from "./api/BaseEntity.js";
87
87
  export type { CostumScope, CostumRuntimeContext, CostumFormDescriptor, CostumFieldDescriptor, CostumFieldType, } from "./costum/runtime.js";
88
88
  export type { Collection, KnownCostumSlug } from "./costum/types.js";
89
+ export { describeCostumForms } from "./costum/runtime.js";
89
90
  export { describeEntityForm } from "./forms/entityForm.js";
90
91
  export type { EntityFormDescriptor, BaseFieldDescriptor, EntityFieldType, EntityFieldFormat } from "./forms/entityForm.js";
91
92
  export type { AllStepsData, PendingUploadValue, PendingUpload, ProcessUploadsOptions, AnswerGetOptions, UploadAnswerFileOptions, UploadAnswerFileResult, GetFilesOptions, AnswerFileItem, } from "./api/Answer.js";