@supersoniks/concorde 1.0.7 → 1.0.8

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 (175) hide show
  1. package/README.md +16 -8
  2. package/cli.js +69 -0
  3. package/core/components/functional/date/date.d.ts +34 -0
  4. package/core/components/functional/date/date.js +187 -0
  5. package/core/components/functional/example/example.d.ts +7 -0
  6. package/core/components/functional/example/example.js +25 -0
  7. package/core/components/functional/fetch/fetch.d.ts +49 -0
  8. package/core/components/functional/fetch/fetch.js +38 -0
  9. package/core/components/functional/functional.d.ts +11 -0
  10. package/core/components/functional/functional.js +11 -0
  11. package/core/components/functional/if/if.d.ts +12 -0
  12. package/core/components/functional/if/if.js +43 -0
  13. package/core/components/functional/list/list.d.ts +67 -0
  14. package/core/components/functional/list/list.js +132 -0
  15. package/core/components/functional/queue/queue.d.ts +42 -0
  16. package/core/components/functional/queue/queue.js +184 -0
  17. package/core/components/functional/router/redirect.d.ts +18 -0
  18. package/core/components/functional/router/redirect.js +57 -0
  19. package/core/components/functional/router/router.d.ts +26 -0
  20. package/core/components/functional/router/router.js +104 -0
  21. package/core/components/functional/states/states.d.ts +28 -0
  22. package/core/components/functional/states/states.js +139 -0
  23. package/core/components/functional/submit/submit.d.ts +24 -0
  24. package/core/components/functional/submit/submit.js +108 -0
  25. package/{types/core/components → core/components/functional/subscriber}/subscriber.d.ts +5 -1
  26. package/core/components/functional/subscriber/subscriber.js +30 -0
  27. package/core/components/ui/alert/alert.d.ts +20 -0
  28. package/core/components/ui/alert/alert.js +150 -0
  29. package/core/components/ui/badge/badge.d.ts +24 -0
  30. package/core/components/ui/badge/badge.js +177 -0
  31. package/core/components/ui/button/button.d.ts +125 -0
  32. package/core/components/ui/button/button.js +558 -0
  33. package/core/components/ui/divider/divider.d.ts +11 -0
  34. package/core/components/ui/divider/divider.js +144 -0
  35. package/core/components/ui/form/checkbox/checkbox.d.ts +120 -0
  36. package/core/components/ui/form/checkbox/checkbox.js +203 -0
  37. package/core/components/ui/form/css/form-control.d.ts +1 -0
  38. package/core/components/ui/form/css/form-control.js +219 -0
  39. package/core/components/ui/form/fieldset/fieldset.d.ts +15 -0
  40. package/core/components/ui/form/fieldset/fieldset.js +70 -0
  41. package/core/components/ui/form/fieldset/legend.d.ts +11 -0
  42. package/core/components/ui/form/fieldset/legend.js +92 -0
  43. package/core/components/ui/form/form-layout/form-actions.d.ts +6 -0
  44. package/core/components/ui/form/form-layout/form-actions.js +23 -0
  45. package/core/components/ui/form/form-layout/form-layout.d.ts +9 -0
  46. package/core/components/ui/form/form-layout/form-layout.js +58 -0
  47. package/core/components/ui/form/input/input.d.ts +84 -0
  48. package/core/components/ui/form/input/input.js +180 -0
  49. package/core/components/ui/form/radio/radio.d.ts +12 -0
  50. package/core/components/ui/form/radio/radio.js +55 -0
  51. package/core/components/ui/form/select/select.d.ts +39 -0
  52. package/core/components/ui/form/select/select.js +220 -0
  53. package/core/components/ui/form/textarea/textarea.d.ts +69 -0
  54. package/core/components/ui/form/textarea/textarea.js +150 -0
  55. package/core/components/ui/group/group.d.ts +6 -0
  56. package/core/components/ui/group/group.js +57 -0
  57. package/core/components/ui/icon/icon.d.ts +17 -0
  58. package/core/components/ui/icon/icon.js +93 -0
  59. package/core/components/ui/icon/icons.d.ts +13 -0
  60. package/core/components/ui/icon/icons.js +25 -0
  61. package/core/components/ui/icon/icons.json +1 -0
  62. package/core/components/ui/image/image.d.ts +14 -0
  63. package/core/components/ui/image/image.js +152 -0
  64. package/core/components/ui/link/link.d.ts +16 -0
  65. package/core/components/ui/link/link.js +70 -0
  66. package/core/components/ui/loader/loader.d.ts +20 -0
  67. package/core/components/ui/loader/loader.js +94 -0
  68. package/{types → core}/components/ui/loader/styles/fixed.d.ts +0 -0
  69. package/core/components/ui/loader/styles/fixed.js +57 -0
  70. package/{types → core}/components/ui/loader/styles/inline.d.ts +0 -0
  71. package/core/components/ui/loader/styles/inline.js +71 -0
  72. package/core/components/ui/menu/menu-item.d.ts +5 -0
  73. package/core/components/ui/menu/menu-item.js +37 -0
  74. package/core/components/ui/menu/menu.d.ts +26 -0
  75. package/core/components/ui/menu/menu.js +125 -0
  76. package/core/components/ui/modal/modal-actions.d.ts +7 -0
  77. package/core/components/ui/modal/modal-actions.js +46 -0
  78. package/core/components/ui/modal/modal-close.d.ts +6 -0
  79. package/core/components/ui/modal/modal-close.js +38 -0
  80. package/core/components/ui/modal/modal-content.d.ts +5 -0
  81. package/core/components/ui/modal/modal-content.js +29 -0
  82. package/core/components/ui/modal/modal-subtitle.d.ts +5 -0
  83. package/core/components/ui/modal/modal-subtitle.js +33 -0
  84. package/core/components/ui/modal/modal-title.d.ts +5 -0
  85. package/core/components/ui/modal/modal-title.js +33 -0
  86. package/core/components/ui/modal/modal.d.ts +36 -0
  87. package/core/components/ui/modal/modal.js +325 -0
  88. package/core/components/ui/pop/pop.d.ts +28 -0
  89. package/core/components/ui/pop/pop.js +223 -0
  90. package/core/components/ui/tabs/tab.d.ts +6 -0
  91. package/core/components/ui/tabs/tab.js +46 -0
  92. package/core/components/ui/tabs/tabs.d.ts +14 -0
  93. package/core/components/ui/tabs/tabs.js +127 -0
  94. package/core/components/ui/taxonomy/taxonomy.d.ts +41 -0
  95. package/core/components/ui/taxonomy/taxonomy.js +113 -0
  96. package/core/components/ui/theme/css/tailwind.css +3 -0
  97. package/core/components/ui/theme/css/tailwind.d.ts +2 -0
  98. package/core/components/ui/theme/theme-collection/core-variables.d.ts +1 -0
  99. package/core/components/ui/theme/theme-collection/core-variables.js +50 -0
  100. package/{types/components → core/components/ui}/theme/theme-collection/dark.d.ts +0 -0
  101. package/core/components/ui/theme/theme-collection/dark.js +41 -0
  102. package/{types/components → core/components/ui}/theme/theme-collection/light.d.ts +0 -0
  103. package/core/components/ui/theme/theme-collection/light.js +35 -0
  104. package/core/components/ui/theme/theme.d.ts +11 -0
  105. package/core/components/ui/theme/theme.js +105 -0
  106. package/core/components/ui/toast/message-subscriber.d.ts +17 -0
  107. package/core/components/ui/toast/message-subscriber.js +85 -0
  108. package/{types → core}/components/ui/toast/toast.d.ts +10 -8
  109. package/core/components/ui/toast/toast.js +260 -0
  110. package/core/components/ui/tooltip/tooltip.d.ts +7 -0
  111. package/core/components/ui/tooltip/tooltip.js +68 -0
  112. package/core/components/ui/ui.d.ts +27 -0
  113. package/core/components/ui/ui.js +34 -0
  114. package/core/core.d.ts +3 -0
  115. package/core/core.js +7 -0
  116. package/core/mixins/Fetcher.d.ts +69 -0
  117. package/core/mixins/Fetcher.js +147 -0
  118. package/core/mixins/FormCheckable.d.ts +72 -0
  119. package/core/mixins/FormCheckable.js +144 -0
  120. package/core/mixins/FormElement.d.ts +21 -0
  121. package/core/mixins/FormElement.js +229 -0
  122. package/core/mixins/FormInput.d.ts +49 -0
  123. package/core/mixins/FormInput.js +33 -0
  124. package/core/mixins/Subscriber.d.ts +30 -0
  125. package/core/mixins/Subscriber.js +379 -0
  126. package/core/mixins/TemplatesContainer.d.ts +12 -0
  127. package/core/mixins/TemplatesContainer.js +60 -0
  128. package/core/mixins/mixins.d.ts +6 -0
  129. package/core/mixins/mixins.js +6 -0
  130. package/core/utils/Arrays.d.ts +97 -0
  131. package/core/utils/Arrays.js +136 -0
  132. package/core/utils/DataBindObserver.d.ts +74 -0
  133. package/core/utils/DataBindObserver.js +252 -0
  134. package/core/utils/Format.d.ts +11 -0
  135. package/core/utils/Format.js +22 -0
  136. package/core/utils/HTML.d.ts +13 -0
  137. package/core/utils/HTML.js +26 -0
  138. package/core/utils/LocationHandler.d.ts +44 -0
  139. package/core/utils/LocationHandler.js +96 -0
  140. package/core/utils/Objects.d.ts +23 -0
  141. package/core/utils/Objects.js +63 -0
  142. package/core/utils/PublisherProxy.d.mts +110 -0
  143. package/core/utils/PublisherProxy.mjs +365 -0
  144. package/core/utils/api.d.ts +66 -0
  145. package/core/utils/api.js +145 -0
  146. package/package.json +179 -21
  147. package/LICENSE +0 -43
  148. package/dist/concorde.bundle.js +0 -3620
  149. package/types/components/event/event-card/event-card.d.ts +0 -10
  150. package/types/components/event/event-title/event-title.d.ts +0 -7
  151. package/types/components/event/event.d.ts +0 -8
  152. package/types/components/giftcards/giftcard/giftcard.d.ts +0 -15
  153. package/types/components/illustration/illustration.d.ts +0 -16
  154. package/types/components/product/prices-form/price-button/price-button.d.ts +0 -25
  155. package/types/components/product/prices-form/prices-form.d.ts +0 -23
  156. package/types/components/theme/theme-collection/bootstrap5.d.ts +0 -1
  157. package/types/components/theme/theme-collection/dracula.d.ts +0 -1
  158. package/types/components/theme/theme.d.ts +0 -8
  159. package/types/components/ui/button/button.d.ts +0 -13
  160. package/types/components/ui/loader/loader.d.ts +0 -15
  161. package/types/components/ui/modal/modal.d.ts +0 -17
  162. package/types/components/ui/tooltip/tooltip.d.ts +0 -9
  163. package/types/core/components/fetch.d.ts +0 -6
  164. package/types/core/components/list.d.ts +0 -9
  165. package/types/core/components/queue.d.ts +0 -15
  166. package/types/core/components/taxonomy.d.ts +0 -13
  167. package/types/core/components/text-formatted.d.ts +0 -15
  168. package/types/core/components/text.d.ts +0 -9
  169. package/types/core/core.d.ts +0 -7
  170. package/types/core/mixins/Fetcher.d.ts +0 -9
  171. package/types/core/mixins/Subscriber.d.ts +0 -13
  172. package/types/core/utils/api.d.ts +0 -16
  173. package/types/index.d.ts +0 -12
  174. package/types/styles/button/button.d.ts +0 -1
  175. package/types/styles/prose/prose.d.ts +0 -2
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Gestionnaire d'écoute des modifications sur l'url courante.
3
+ * On peut s'y abonner via la methode statique onChange()
4
+ * Utilisé par sonic-bouton pour lm'affichage de l'état actif et par le router.
5
+ */
6
+ export default class LocationHandler {
7
+ static listen() {
8
+ if (!LocationHandler.listening) {
9
+ return;
10
+ }
11
+ let newURL = document.location.href.replace(document.location.origin, "");
12
+ if (LocationHandler.prevURL && LocationHandler.prevURL != newURL) {
13
+ LocationHandler.prevURL = newURL;
14
+ LocationHandler.listeners.forEach((listener) => {
15
+ listener.location = newURL;
16
+ });
17
+ }
18
+ window.requestAnimationFrame(LocationHandler.listen);
19
+ }
20
+ /**
21
+ * Arrête l'écoute des changements de location pour le listener fournit
22
+ */
23
+ static offChange(listener) {
24
+ let idx = LocationHandler.listeners.indexOf(listener);
25
+ if (idx == -1)
26
+ return;
27
+ LocationHandler.listeners.splice(idx, 1);
28
+ if (LocationHandler.listeners.length == 0)
29
+ LocationHandler.listening = false;
30
+ }
31
+ /**
32
+ * Ecoute les changements de location et l'assigne à la propriété location de chaque listener
33
+ */
34
+ static onChange(listener) {
35
+ if (!LocationHandler.listening) {
36
+ LocationHandler.listening = true;
37
+ LocationHandler.listen();
38
+ }
39
+ LocationHandler.listeners.push(listener);
40
+ }
41
+ /**
42
+ *
43
+ * @param component HTMLElement
44
+ * Recupère la proprité to ou href de l'élément et lance la navigation
45
+ * Si l'attribut pushState est présent la naviguation se fait via un pushState
46
+ * Si l'attribut replaceState est présent la naviguation se fait via un replaceState
47
+ * Voir link et button pour les exemples d'implémentation
48
+ **/
49
+ static changeFromComponent(component) {
50
+ let to = component.getAttribute("to");
51
+ if (!to)
52
+ to = component.href;
53
+ if (!to)
54
+ return;
55
+ if (to.indexOf("#") == 0) {
56
+ document.location.hash = to.substring(1);
57
+ return;
58
+ }
59
+ let url = new URL(to, document.location.href);
60
+ let split = url.pathname.split("/");
61
+ let newPathName = [];
62
+ let prevSp = "";
63
+ for (let sp of split) {
64
+ if (sp != prevSp)
65
+ newPathName.push(sp);
66
+ prevSp = sp;
67
+ }
68
+ to = "/" + newPathName.join("/") + url.search + (url.hash ? +url.hash : "");
69
+ if (component.hasAttribute("pushState")) {
70
+ history.pushState(null, "", to);
71
+ }
72
+ else if (component.hasAttribute("replaceState")) {
73
+ history.replaceState(null, "", to);
74
+ }
75
+ else
76
+ document.location.href = to;
77
+ }
78
+ /**
79
+ *
80
+ * @param component ActivableLink
81
+ * Ajoute l'attribut "active" à l'élément si l'url correspond à la location
82
+ */
83
+ static updateComponentActiveState(component) {
84
+ if (component.href && component.href.indexOf("http") != 0) {
85
+ let url1 = new URL(component.href, document.location.href);
86
+ let url2 = new URL(component.location, document.location.origin);
87
+ if (url1.pathname == url2.pathname && url1.hash == url2.hash && url1.search == url2.search)
88
+ component.setAttribute("active", "true");
89
+ else
90
+ component.removeAttribute("active");
91
+ }
92
+ }
93
+ }
94
+ LocationHandler.listeners = [];
95
+ LocationHandler.listening = false;
96
+ LocationHandler.prevURL = document.location.href.replace(document.location.origin, "");
@@ -0,0 +1,23 @@
1
+ declare class Objects {
2
+ /**
3
+ * Effectue une comparaison d'égalité non profonde entre deux objets.
4
+ */
5
+ static shallowEqual(object1: any, object2: any): boolean;
6
+ /**
7
+ * Effectue une comparaison d'égalité profonde entre deux objets.
8
+ */
9
+ static deepEqual(object1: any, object2: any): boolean;
10
+ /**
11
+ * @returns true si l'objet est un objet ou un tableau (qui est un objet). mais false si null (car sinon typeof null "object")
12
+ */
13
+ static isObject(object: any): boolean;
14
+ /**
15
+ * @returns true si l'argument est null ou undefined
16
+ */
17
+ static isUndefindOrNull(object: any): boolean;
18
+ /**
19
+ * traverse l'objet pour obtenir la valeur a l'adresse donnée via le tableau de clés pathArray.
20
+ */
21
+ static traverse(obj: any, pathArray: string[]): any;
22
+ }
23
+ export default Objects;
@@ -0,0 +1,63 @@
1
+ class Objects {
2
+ /**
3
+ * Effectue une comparaison d'égalité non profonde entre deux objets.
4
+ */
5
+ static shallowEqual(object1, object2) {
6
+ const keys1 = Object.keys(object1);
7
+ const keys2 = Object.keys(object2);
8
+ if (keys1.length !== keys2.length) {
9
+ return false;
10
+ }
11
+ for (let key of keys1) {
12
+ if (object1[key] !== object2[key]) {
13
+ return false;
14
+ }
15
+ }
16
+ return true;
17
+ }
18
+ /**
19
+ * Effectue une comparaison d'égalité profonde entre deux objets.
20
+ */
21
+ static deepEqual(object1, object2) {
22
+ const keys1 = Object.keys(object1);
23
+ const keys2 = Object.keys(object2);
24
+ if (keys1.length !== keys2.length) {
25
+ return false;
26
+ }
27
+ for (const key of keys1) {
28
+ const val1 = object1[key];
29
+ const val2 = object2[key];
30
+ const areObjects = Objects.isObject(val1) && Objects.isObject(val2);
31
+ if ((areObjects && !Objects.deepEqual(val1, val2)) || (!areObjects && val1 !== val2)) {
32
+ return false;
33
+ }
34
+ }
35
+ return true;
36
+ }
37
+ /**
38
+ * @returns true si l'objet est un objet ou un tableau (qui est un objet). mais false si null (car sinon typeof null "object")
39
+ */
40
+ static isObject(object) {
41
+ return object != null && typeof object === "object";
42
+ }
43
+ /**
44
+ * @returns true si l'argument est null ou undefined
45
+ */
46
+ static isUndefindOrNull(object) {
47
+ return object === null || object === undefined;
48
+ }
49
+ /**
50
+ * traverse l'objet pour obtenir la valeur a l'adresse donnée via le tableau de clés pathArray.
51
+ */
52
+ static traverse(obj, pathArray) {
53
+ for (let key of pathArray) {
54
+ let newObj = obj[key];
55
+ if (newObj === undefined) {
56
+ return undefined;
57
+ }
58
+ obj = obj[key];
59
+ }
60
+ return obj;
61
+ }
62
+ }
63
+ export default Objects;
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Custom Proxy contient les méthodes des publishers retournés par PublisherManager.get(publisherId) qui seront utilisées couramment
3
+ */
4
+ export class PublisherProxy {
5
+ constructor(target: any, parentProxPub?: null);
6
+ _proxies_: Map<any, any>;
7
+ _value_: any;
8
+ _assignListeners_: Set<any>;
9
+ _mutationListeners_: Set<any>;
10
+ _fillListeners_: Set<any>;
11
+ _templateFillListeners_: Set<any>;
12
+ _lockInternalMutationPublishing_: boolean;
13
+ parent: any;
14
+ root: any;
15
+ /**
16
+ * Supprime le proxy et ses sous proxy
17
+ * Supprime les écouteurs associés
18
+ */
19
+ delete(): void;
20
+ /**
21
+ * Utile pour savoir si quelque chose est en écoute d'une modification sur le proxy via une des methodes associées
22
+ */
23
+ hasListener(): boolean;
24
+ _publishInternalMutation_(lockInternalMutationsTransmission?: boolean): void;
25
+ _publishAssignement_(lockInternalMutationsTransmission?: boolean): void;
26
+ _publishDynamicFilling_(key: any, value: any): void;
27
+ _publishTemplateFilling_(key: any, value: any): void;
28
+ /**
29
+ * Appel la fonction "handler" (passée en paramettre) lorsque la valeur gérée par le proxy change par assignation
30
+ * hanlder reçois alors la nouvelle valeur interne du proxy en paramètre
31
+ */
32
+ onAssign(handler: any): void;
33
+ /**
34
+ * Stop les appels de la fonction "handler" (passée en paramettre) lorsque la valeur gérée par le proxy change par assignation
35
+ */
36
+ offAssign(handler: any): void;
37
+ /**
38
+ * Appel la fonction "handler" (passée en paramettre) lorsque quelque chose change la valeur gérée par le proxy quelque soit la profondeur de la donnée
39
+ *
40
+ */
41
+ onInternalMutation(handler: any): void;
42
+ /**
43
+ * Stop les Appels de la fonction "handler" (passée en paramettre) lorsque quelque chose change la valeur gérée par le proxy quelque soit la profondeur de la donnée
44
+ */
45
+ offInternalMutation(handler: any): void;
46
+ /**
47
+ * Maintient le remplissage de l'objet / tableau "handler" passé en paramètre avec les valeurs du proxy
48
+ * Remplit uniquement les valeurs déjà présentes dans l'objet / tableau passé en paramètre
49
+ */
50
+ startTemplateFilling(handler: any): void;
51
+ /**
52
+ * Arrête de maintenir le remplissage de l'objet / tableau "handler" passé en paramètre avec les valeurs du proxy
53
+ */
54
+ stopTemplateFilling(handler: any): void;
55
+ /**
56
+ * Maintient le remplissage de l'objet / tableau "handler" passé en paramètre avec les valeurs du proxy
57
+ * Remplit toute valeur qu'elle soit présente ou pas initialement dans l'objet
58
+ */
59
+ startDynamicFilling(handler: any): void;
60
+ stopDynamicFilling(handler: any): void;
61
+ /**
62
+ * Assigne une nouvelle valeur au proxy ce qui déclenche la transmission de la donnée en fonction des "écouteurs" associés
63
+ */
64
+ set(newValue: any, lockInternalMutationsTransmission?: boolean): boolean;
65
+ /**
66
+ * Extraire la valeur actuelle du proxy
67
+ */
68
+ get(): any;
69
+ }
70
+ /**
71
+ * Utilitaires de gestion des Publisher
72
+ * Obtenir, replacer ou supprimer un Publisher
73
+ *
74
+ */
75
+ export class PublisherManager {
76
+ static instance: null;
77
+ /**
78
+ * PublisherManager est un singleton
79
+ */
80
+ static getInstance(): PublisherManager;
81
+ /**
82
+ * shortcut static pour obtenir un publisher vias sont id/adresse sans taper getInstance.
83
+ * Si le publisher n'existe pas, il est créé.
84
+ */
85
+ static get(id: any): any;
86
+ /**
87
+ * shortcut static pour supprimer un publisher de la liste et appel également delete sur le publisher ce qui le supprime, de même que ses sous publishers
88
+ */
89
+ static delete(id: any): false | undefined;
90
+ publishers: Map<any, any>;
91
+ /**
92
+ * Obtenir un publisher vias sont id/adresse
93
+ * Si le publisher n'existe pas, il est créé.
94
+ */
95
+ get(id: any): any;
96
+ /**
97
+ * Remplace un publisher pour l'id fourni par un autre.
98
+ * L'autre publisher n'est pas supprimé.
99
+ */
100
+ set(id: any, publisher: any): void;
101
+ /**
102
+ * supprimer un publisher de la liste et appel également delete sur le publisher ce qui le supprime, de même que ses sous publishers
103
+ */
104
+ delete(id: any): false | undefined;
105
+ }
106
+ /**
107
+ * Le Proxy Javascript
108
+ */
109
+ export default class Publisher extends PublisherProxy {
110
+ }
@@ -0,0 +1,365 @@
1
+ /**
2
+ * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3
+ * Merci de laisser ce fichier sans la moindre dépendance.
4
+ * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
5
+ * **/
6
+ function isComplex(value) {
7
+ return typeof value === "object" && value != null;
8
+ }
9
+ /**
10
+ * Custom Proxy contient les méthodes des publishers retournés par PublisherManager.get(publisherId) qui seront utilisées couramment
11
+ */
12
+ export class PublisherProxy {
13
+ constructor(target, parentProxPub = null) {
14
+ this._proxies_ = new Map();
15
+ this._value_ = target;
16
+ this._assignListeners_ = new Set();
17
+ this._mutationListeners_ = new Set();
18
+ this._fillListeners_ = new Set();
19
+ this._templateFillListeners_ = new Set();
20
+ this._lockInternalMutationPublishing_ = false;
21
+ this.parent = parentProxPub;
22
+ this.root = this;
23
+ while (this.root.parent) {
24
+ this.root = this.root.parent;
25
+ }
26
+ }
27
+ /**
28
+ * Supprime le proxy et ses sous proxy
29
+ * Supprime les écouteurs associés
30
+ */
31
+ delete() {
32
+ for (let proxy of this._proxies_.values()) {
33
+ proxy.delete();
34
+ }
35
+ this._assignListeners_.clear();
36
+ this._mutationListeners_.clear();
37
+ this._fillListeners_.clear();
38
+ this._templateFillListeners_.clear();
39
+ this._proxies_.clear();
40
+ }
41
+ /**
42
+ * Utile pour savoir si quelque chose est en écoute d'une modification sur le proxy via une des methodes associées
43
+ */
44
+ hasListener() {
45
+ return (this._templateFillListeners_.size > 0 ||
46
+ this._assignListeners_.size > 0 ||
47
+ this._mutationListeners_.size > 0 ||
48
+ this._fillListeners_.size > 0);
49
+ }
50
+ _publishInternalMutation_(lockInternalMutationsTransmission = false) {
51
+ this._mutationListeners_.forEach((handler) => handler());
52
+ if (lockInternalMutationsTransmission)
53
+ return;
54
+ if (this.parent) {
55
+ this.parent._publishInternalMutation_();
56
+ }
57
+ }
58
+ _publishAssignement_(lockInternalMutationsTransmission = false) {
59
+ this._assignListeners_.forEach((handler) => handler(this._value_.__value ? this._value_.__value : this._value_));
60
+ this._publishInternalMutation_(lockInternalMutationsTransmission);
61
+ }
62
+ _publishDynamicFilling_(key, value) {
63
+ this._fillListeners_.forEach((handler) => {
64
+ if (handler[key] !== value)
65
+ handler[key] = value;
66
+ });
67
+ this._publishTemplateFilling_(key, value);
68
+ }
69
+ _publishTemplateFilling_(key, value) {
70
+ this._templateFillListeners_.forEach((handler) => {
71
+ if (typeof handler[key] != "undefined" && handler[key] !== value) {
72
+ handler[key] = value;
73
+ }
74
+ });
75
+ }
76
+ /**
77
+ * Appel la fonction "handler" (passée en paramettre) lorsque la valeur gérée par le proxy change par assignation
78
+ * hanlder reçois alors la nouvelle valeur interne du proxy en paramètre
79
+ */
80
+ onAssign(handler) {
81
+ if (typeof handler != "function")
82
+ return;
83
+ this._assignListeners_.add(handler);
84
+ handler(this._value_.__value ? this._value_.__value : this._value_);
85
+ }
86
+ /**
87
+ * Stop les appels de la fonction "handler" (passée en paramettre) lorsque la valeur gérée par le proxy change par assignation
88
+ */
89
+ offAssign(handler) {
90
+ this._assignListeners_.delete(handler);
91
+ }
92
+ /**
93
+ * Appel la fonction "handler" (passée en paramettre) lorsque quelque chose change la valeur gérée par le proxy quelque soit la profondeur de la donnée
94
+ *
95
+ */
96
+ onInternalMutation(handler) {
97
+ if (typeof handler != "function")
98
+ return;
99
+ this._mutationListeners_.add(handler);
100
+ handler();
101
+ }
102
+ /**
103
+ * Stop les Appels de la fonction "handler" (passée en paramettre) lorsque quelque chose change la valeur gérée par le proxy quelque soit la profondeur de la donnée
104
+ */
105
+ offInternalMutation(handler) {
106
+ this._mutationListeners_.delete(handler);
107
+ }
108
+ /**
109
+ * Maintient le remplissage de l'objet / tableau "handler" passé en paramètre avec les valeurs du proxy
110
+ * Remplit uniquement les valeurs déjà présentes dans l'objet / tableau passé en paramètre
111
+ */
112
+ startTemplateFilling(handler) {
113
+ this._templateFillListeners_.add(handler);
114
+ for (var z in this._value_) {
115
+ const value = this._value_[z];
116
+ if (typeof handler[z] != "undefined" && handler[z] !== value) {
117
+ handler[z] = value;
118
+ }
119
+ }
120
+ }
121
+ /**
122
+ * Arrête de maintenir le remplissage de l'objet / tableau "handler" passé en paramètre avec les valeurs du proxy
123
+ */
124
+ stopTemplateFilling(handler) {
125
+ this._templateFillListeners_.delete(handler);
126
+ }
127
+ /**
128
+ * Maintient le remplissage de l'objet / tableau "handler" passé en paramètre avec les valeurs du proxy
129
+ * Remplit toute valeur qu'elle soit présente ou pas initialement dans l'objet
130
+ */
131
+ startDynamicFilling(handler) {
132
+ this._fillListeners_.add(handler);
133
+ for (var z in this._value_) {
134
+ const value = this._value_[z];
135
+ if (handler[z] !== value)
136
+ handler[z] = value;
137
+ }
138
+ }
139
+ /*
140
+ * Arrête de maintenir le remplissage de l'objet / tableau "handler" passé en paramètre avec les valeurs du proxy
141
+ */
142
+ stopDynamicFilling(handler) {
143
+ this._fillListeners_.delete(handler);
144
+ }
145
+ /**
146
+ * Assigne une nouvelle valeur au proxy ce qui déclenche la transmission de la donnée en fonction des "écouteurs" associés
147
+ */
148
+ set(newValue, lockInternalMutationsTransmission = false) {
149
+ if (this._value_ === newValue)
150
+ return true;
151
+ if (this._value_.hasOwnProperty("__value") &&
152
+ newValue.hasOwnProperty("__value") &&
153
+ this._value_.__value === newValue.__value) {
154
+ return true;
155
+ }
156
+ this._value_ = newValue;
157
+ if (this._value_.hasOwnProperty("__value")) {
158
+ this._publishAssignement_(lockInternalMutationsTransmission);
159
+ return true;
160
+ }
161
+ Array.from(this._proxies_.keys()).forEach((key) => {
162
+ // delete this._value_[key];
163
+ if (!this._value_[key] && this._proxies_.has(key) && !this._proxies_.get(key).hasListener()) {
164
+ this._proxies_.delete(key);
165
+ }
166
+ });
167
+ if (isComplex(this._value_)) {
168
+ for (let key in this._value_) {
169
+ let v = newValue[key];
170
+ let isVComplex = isComplex(v);
171
+ let valueV = isVComplex ? v : { __value: v };
172
+ if (!this._proxies_.has(key)) {
173
+ let newPublisher = new Publisher(valueV, this);
174
+ this._proxies_.set(key, newPublisher, true);
175
+ newPublisher._proxies_.set("_parent_", this);
176
+ }
177
+ this._proxies_.get(key).set(valueV, true);
178
+ this._publishDynamicFilling_(key, v);
179
+ }
180
+ }
181
+ this._publishAssignement_();
182
+ return true;
183
+ }
184
+ /**
185
+ * Extraire la valeur actuelle du proxy
186
+ */
187
+ get() {
188
+ if (this._value_.__value)
189
+ return this._value_.__value;
190
+ return this._value_;
191
+ }
192
+ }
193
+ /**
194
+ * Utilitaires de gestion des Publisher
195
+ * Obtenir, replacer ou supprimer un Publisher
196
+ *
197
+ */
198
+ export class PublisherManager {
199
+ constructor() {
200
+ if (PublisherManager.instance != null)
201
+ throw "Singleton / use getInstance";
202
+ PublisherManager.instance = this;
203
+ this.publishers = new Map();
204
+ }
205
+ /**
206
+ * PublisherManager est un singleton
207
+ */
208
+ static getInstance() {
209
+ if (PublisherManager.instance == null)
210
+ return new PublisherManager();
211
+ return PublisherManager.instance;
212
+ }
213
+ /**
214
+ * shortcut static pour obtenir un publisher vias sont id/adresse sans taper getInstance.
215
+ * Si le publisher n'existe pas, il est créé.
216
+ */
217
+ static get(id) {
218
+ return PublisherManager.getInstance().get(id);
219
+ }
220
+ /**
221
+ * shortcut static pour supprimer un publisher de la liste et appel également delete sur le publisher ce qui le supprime, de même que ses sous publishers
222
+ */
223
+ static delete(id) {
224
+ return PublisherManager.getInstance().delete(id);
225
+ }
226
+ /**
227
+ * Obtenir un publisher vias sont id/adresse
228
+ * Si le publisher n'existe pas, il est créé.
229
+ */
230
+ get(id) {
231
+ if (!this.publishers.has(id))
232
+ this.publishers.set(id, new Publisher({}));
233
+ return this.publishers.get(id);
234
+ }
235
+ /**
236
+ * Remplace un publisher pour l'id fourni par un autre.
237
+ * L'autre publisher n'est pas supprimé.
238
+ */
239
+ set(id, publisher) {
240
+ this.publishers.set(id, publisher);
241
+ }
242
+ /**
243
+ * supprimer un publisher de la liste et appel également delete sur le publisher ce qui le supprime, de même que ses sous publishers
244
+ */
245
+ delete(id) {
246
+ if (!this.publishers.has(id))
247
+ return false;
248
+ const publisher = this.publishers.get(id);
249
+ this.publishers.delete(id);
250
+ }
251
+ }
252
+ PublisherManager.instance = null;
253
+ /**
254
+ * Le Proxy Javascript
255
+ */
256
+ export default class Publisher extends PublisherProxy {
257
+ constructor(target, parentProxPub = null) {
258
+ super(target, parentProxPub);
259
+ let that = this;
260
+ let thisProxy = new Proxy(this, {
261
+ /**
262
+ * Lorsque l'on écrit monConteneur = publisher.maClef ou monConteneur = publisher["maClef"] monConteneur contient :
263
+ * Les methodes de PublisherProxy (onAssign... : voir liste dans kle tableaus si dessous), si la clef est une méthode de PublisherProxy,,
264
+ * Sinon un autre proxy qui a comme valeur interne la valeur corespondante à la clef dans l'objet.
265
+ */
266
+ get: function (oTarget, sKey) {
267
+ if ([
268
+ "onAssign",
269
+ "offAssign",
270
+ "startDynamicFilling",
271
+ "stopDynamicFilling",
272
+ "startTemplateFilling",
273
+ "stopTemplateFilling",
274
+ "onInternalMutation",
275
+ "offInternalMutation",
276
+ "set",
277
+ "get",
278
+ "_templateFillListeners_",
279
+ "_fillListeners_",
280
+ "_assignListeners_",
281
+ "_publishInternalMutation_",
282
+ "hasListener",
283
+ "delete",
284
+ "_mutationListeners_",
285
+ "_publishDynamicFilling_",
286
+ "_publishTemplateFilling_",
287
+ "_publishAssignement_",
288
+ "_proxies_",
289
+ "parent",
290
+ "_value_",
291
+ "_lockInternalMutationPublishing_",
292
+ ].includes(sKey))
293
+ return that[sKey];
294
+ if (!that._proxies_.has(sKey)) {
295
+ let vValue = that._value_[sKey];
296
+ let newPublisher = new Publisher(isComplex(vValue) ? vValue : { __value: vValue }, that);
297
+ newPublisher._proxies_.set("_parent_", thisProxy);
298
+ that._proxies_.set(sKey, newPublisher);
299
+ }
300
+ return that._proxies_.get(sKey);
301
+ },
302
+ /**
303
+ * Lorsque l'on écrit publisher.maClef = value ou publisher["maClef"] = value, on assigne la valeur à la clef dans l'objet interne.
304
+ * Les gestionnairs associés sopnt déclenchés en conséquence de manière profonde et remontante si nécessaire.
305
+ */
306
+ set: function (oTarget, sKey, vValue) {
307
+ if (sKey == "_value_") {
308
+ oTarget._value_ = vValue;
309
+ return oTarget._value_;
310
+ }
311
+ const isValueComplex = isComplex(vValue);
312
+ if (!that._proxies_.has(sKey)) {
313
+ let newPublisher = new Publisher(isValueComplex ? vValue : { __value: vValue }, that);
314
+ newPublisher._proxies_.set("_parent_", thisProxy);
315
+ that._proxies_.set(sKey, newPublisher);
316
+ }
317
+ if (that._value_[sKey] === vValue && isValueComplex)
318
+ return vValue;
319
+ const prevValue = that._value_[sKey];
320
+ if (prevValue !== vValue) {
321
+ that._value_[sKey] = vValue;
322
+ that._publishDynamicFilling_(sKey, vValue);
323
+ }
324
+ that._proxies_.get(sKey).set(isComplex(vValue) ? vValue : { __value: vValue });
325
+ return that._proxies_.get(sKey);
326
+ },
327
+ /**
328
+ * Autres propriétés classiques d'un objet implémentées par le proxy
329
+ */
330
+ deleteProperty: function (oTarget, sKey) {
331
+ that._proxies_.get(sKey).set(null);
332
+ that._publishDynamicFilling_(sKey, null);
333
+ that._proxies_.delete(sKey);
334
+ return delete that._value_[sKey];
335
+ },
336
+ enumerate: function (oTarget, sKey) {
337
+ return that._value_.keys();
338
+ },
339
+ has: function (oTarget, sKey) {
340
+ return sKey in that._value_ && sKey != "_lockInternalMutationPublishing_";
341
+ },
342
+ defineProperty: function (oTarget, sKey, oDesc) {
343
+ if (oDesc && "value" in oDesc) {
344
+ that._value_[sKey] = oDesc.value;
345
+ }
346
+ return that._value_;
347
+ },
348
+ getOwnPropertyDescriptor: function (oTarget, sKey) {
349
+ var vValue = that._value_[sKey];
350
+ return {
351
+ enumerable: true,
352
+ configurable: true,
353
+ };
354
+ },
355
+ ownKeys: function (target) {
356
+ if (that._value_.__value)
357
+ return Object.keys(this._value_.__value);
358
+ return Object.keys(that._value_);
359
+ },
360
+ });
361
+ return thisProxy;
362
+ }
363
+ }
364
+ if (typeof module != "undefined")
365
+ module.exports = { Publisher: Publisher, PublisherManager: PublisherManager };