@supersoniks/concorde 4.5.0 → 4.5.2

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.
@@ -1,104 +1,189 @@
1
1
  /**
2
- * Enregistre des callbacks sur des propriétés Lit (via `willUpdate`) pour
3
- * réagir aux changements de segments dynamiques `${…}` dans les chemins.
4
- * Chaque décorateur utilise des clés de stockage distinctes pour éviter les collisions.
2
+ * Surveillance des props utilisées dans les chemins dynamiques (`${userIndex}`, etc.).
3
+ *
4
+ * Modèle :
5
+ * - `observeDynamicProperty()` enregistre une prop + un handler à appeler si elle change ;
6
+ * - un seul `requestAnimationFrame` appelle `notifyObservedPropertyChanges()` ;
7
+ * - pour chaque prop observée : `lastValue` vs valeur lue sur le composant ;
8
+ * - plusieurs passes dans la même frame si un handler en modifie une autre ;
9
+ * - garde anti-boucle si une prop ne cesse de changer.
5
10
  */
6
11
 
7
- type InstanceStores = Record<PropertyKey, unknown>;
12
+ import { getValueFromExpression } from "./dynamicPath";
8
13
 
9
- export function registerDynamicPropertyWatcher(
10
- watcherStoreKey: PropertyKey,
11
- hookedStoreKey: PropertyKey,
12
- instance: object,
13
- propertyName: string,
14
- onChange: () => void,
15
- ): () => void {
16
- const inst = instance as InstanceStores;
17
- const key = String(propertyName);
18
- ensureDynamicPropertiesWillUpdate(
19
- watcherStoreKey,
20
- hookedStoreKey,
21
- instance,
22
- );
23
- if (!inst[watcherStoreKey]) {
24
- Object.defineProperty(inst, watcherStoreKey, {
25
- value: new Map<string, Set<() => void>>(),
26
- enumerable: false,
27
- configurable: false,
28
- writable: false,
29
- });
14
+ /** Une prop du composant lue à chaque frame, avec les handlers à déclencher si elle change. */
15
+ type ObservedProperty = {
16
+ /** Dernière valeur vue lors de la dernière notification. */
17
+ lastValue: unknown;
18
+ /** Handlers enregistrés par les décorateurs (@bind, @get, …). */
19
+ onChangeHandlers: Set<() => void>;
20
+ };
21
+
22
+ /** Nom de prop → état d'observation, pour un composant donné. */
23
+ type ObservedProperties = Map<string, ObservedProperty>;
24
+
25
+ const observedPropertiesByComponent = new WeakMap<object, ObservedProperties>();
26
+ /** Composants ayant au moins une prop observée. */
27
+ const componentsBeingPolled = new Set<object>();
28
+
29
+ /** Un seul rAF pour toutes les instances et toutes les props observées. */
30
+ let animationFrameId: number | null = null;
31
+ /** Passes de réconciliation dans une même frame avant alerte boucle infinie. */
32
+ const MAX_NOTIFICATION_PASSES_PER_FRAME = 8;
33
+
34
+ function getObservedProperties(component: object): ObservedProperties {
35
+ let observedProperties = observedPropertiesByComponent.get(component);
36
+ if (!observedProperties) {
37
+ observedProperties = new Map();
38
+ observedPropertiesByComponent.set(component, observedProperties);
30
39
  }
31
- const watcherMap = inst[watcherStoreKey] as Map<string, Set<() => void>>;
32
- if (!watcherMap.has(key)) {
33
- watcherMap.set(key, new Set());
40
+ return observedProperties;
41
+ }
42
+
43
+ /** Compare lastValue à la valeur actuelle ; retourne les handlers à exécuter. */
44
+ function findHandlersForChangedProperties(
45
+ component: object,
46
+ observedProperties: ObservedProperties,
47
+ ): Set<() => void> {
48
+ const handlersToRun = new Set<() => void>();
49
+ for (const [propertyName, observed] of observedProperties) {
50
+ const currentValue = getValueFromExpression(component, propertyName);
51
+ if (!Object.is(observed.lastValue, currentValue)) {
52
+ observed.lastValue = currentValue;
53
+ observed.onChangeHandlers.forEach((handler) => handlersToRun.add(handler));
54
+ }
34
55
  }
35
- const watchers = watcherMap.get(key)!;
36
- watchers.add(onChange);
37
- return () => {
38
- watchers.delete(onChange);
39
- if (watchers.size === 0) {
40
- watcherMap.delete(key);
56
+ return handlersToRun;
57
+ }
58
+
59
+ /** Détecte les props observées qui ont changé et appelle leurs handlers (plusieurs passes si cascade). */
60
+ function notifyObservedPropertyChanges(): void {
61
+ animationFrameId = null;
62
+
63
+ let pass = 0;
64
+ let propertiesChangedThisFrame = true;
65
+
66
+ while (propertiesChangedThisFrame && pass < MAX_NOTIFICATION_PASSES_PER_FRAME) {
67
+ propertiesChangedThisFrame = false;
68
+ pass += 1;
69
+
70
+ for (const component of componentsBeingPolled) {
71
+ const observedProperties = observedPropertiesByComponent.get(component);
72
+ if (!observedProperties || observedProperties.size === 0) continue;
73
+
74
+ const handlersToRun = findHandlersForChangedProperties(
75
+ component,
76
+ observedProperties,
77
+ );
78
+ if (handlersToRun.size === 0) continue;
79
+
80
+ propertiesChangedThisFrame = true;
81
+ handlersToRun.forEach((handler) => handler());
41
82
  }
42
- };
83
+ }
84
+
85
+ if (propertiesChangedThisFrame) {
86
+ console.warn(
87
+ "[concorde] dynamic property watch: limite de passes atteinte, boucle infinie probable",
88
+ );
89
+ }
90
+
91
+ if (componentsBeingPolled.size > 0) {
92
+ scheduleObservedPropertyChanges();
93
+ }
43
94
  }
44
95
 
45
- export function ensureDynamicPropertiesWillUpdate(
46
- watcherStoreKey: PropertyKey,
47
- hookedStoreKey: PropertyKey,
48
- instance: object,
49
- ): void {
50
- const proto = Object.getPrototypeOf(instance);
51
- if (!proto || (proto as InstanceStores)[hookedStoreKey]) return;
52
- const originalWillUpdate = Object.prototype.hasOwnProperty.call(
53
- proto,
54
- "willUpdate",
55
- )
56
- ? (proto as InstanceStores).willUpdate
57
- : (Object.getPrototypeOf(proto) as InstanceStores)?.willUpdate;
58
- (proto as InstanceStores).willUpdate = function (
59
- changedProperties?: Map<unknown, unknown>,
60
- ) {
61
- const handlers = (this as InstanceStores)[watcherStoreKey] as
62
- | Map<string, Set<() => void>>
63
- | undefined;
64
- if (handlers && handlers.size > 0) {
65
- if (changedProperties && changedProperties.size > 0) {
66
- changedProperties.forEach((_value, dependency) => {
67
- const callbacks = handlers.get(String(dependency));
68
- if (callbacks) {
69
- callbacks.forEach((cb) => cb());
70
- }
71
- });
72
- } else {
73
- handlers.forEach((callbacks) => callbacks.forEach((cb) => cb()));
74
- }
96
+ function scheduleObservedPropertyChanges(): void {
97
+ if (animationFrameId !== null) return;
98
+ animationFrameId = requestAnimationFrame(notifyObservedPropertyChanges);
99
+ }
100
+
101
+ function cancelScheduledObservedPropertyChangesIfIdle(): void {
102
+ if (componentsBeingPolled.size === 0 && animationFrameId !== null) {
103
+ cancelAnimationFrame(animationFrameId);
104
+ animationFrameId = null;
105
+ }
106
+ }
107
+
108
+ /**
109
+ * Observe une prop du composant utilisée dans un chemin dynamique.
110
+ * Retourne une fonction de désinscription.
111
+ *
112
+ * Les deux premiers paramètres sont ignorés (legacy API des décorateurs).
113
+ */
114
+ export function observeDynamicProperty(
115
+ _legacyWatcherStoreKey: PropertyKey,
116
+ _legacyHookedStoreKey: PropertyKey,
117
+ component: object,
118
+ dependencyPropertyName: string,
119
+ onDependencyChange: () => void,
120
+ ): () => void {
121
+ const propertyName = String(dependencyPropertyName);
122
+ const observedProperties = getObservedProperties(component);
123
+
124
+ let observed = observedProperties.get(propertyName);
125
+ if (!observed) {
126
+ observed = {
127
+ lastValue: getValueFromExpression(component, propertyName),
128
+ onChangeHandlers: new Set(),
129
+ };
130
+ observedProperties.set(propertyName, observed);
131
+ }
132
+ observed.onChangeHandlers.add(onDependencyChange);
133
+
134
+ componentsBeingPolled.add(component);
135
+ scheduleObservedPropertyChanges();
136
+
137
+ return () => {
138
+ const currentObservedProperties =
139
+ observedPropertiesByComponent.get(component);
140
+ if (!currentObservedProperties) return;
141
+
142
+ const currentObserved = currentObservedProperties.get(propertyName);
143
+ if (!currentObserved) return;
144
+
145
+ currentObserved.onChangeHandlers.delete(onDependencyChange);
146
+ if (currentObserved.onChangeHandlers.size === 0) {
147
+ currentObservedProperties.delete(propertyName);
75
148
  }
76
- if (typeof originalWillUpdate === "function") {
77
- originalWillUpdate.call(this, changedProperties);
149
+
150
+ if (currentObservedProperties.size === 0) {
151
+ observedPropertiesByComponent.delete(component);
152
+ componentsBeingPolled.delete(component);
153
+ cancelScheduledObservedPropertyChangesIfIdle();
78
154
  }
79
155
  };
80
- (proto as InstanceStores)[hookedStoreKey] = true;
81
156
  }
82
157
 
83
- /** Clés utilisées par `@bind`. */
158
+ /** @deprecated Alias conservé pour les décorateurs existants. */
159
+ export const registerDynamicPropertyWatcher = observeDynamicProperty;
160
+
161
+ /** @deprecated No-op conservé pour compatibilité API. */
162
+ export function ensureDynamicPropertiesWillUpdate(
163
+ _watcherStoreKey: PropertyKey,
164
+ _hookedStoreKey: PropertyKey,
165
+ _instance: object,
166
+ ): void {}
167
+
168
+ /** Clés legacy ignorées par `@bind`. */
84
169
  export const bindDynamicWatchKeys = {
85
170
  watcherStore: Symbol("__bindDynamicWatcherStore__"),
86
171
  hooked: Symbol("__bindDynamicWillUpdateHooked__"),
87
172
  } as const;
88
173
 
89
- /** Clés utilisées par `@publish`. */
174
+ /** Clés legacy ignorées par `@publish`. */
90
175
  export const publishDynamicWatchKeys = {
91
176
  watcherStore: "__publishDynamicWatcherStore__",
92
177
  hooked: "__publishDynamicWillUpdateHooked__",
93
178
  } as const;
94
179
 
95
- /** Clés utilisées par `@get`. */
180
+ /** Clés legacy ignorées par `@get`. */
96
181
  export const getDynamicWatchKeys = {
97
182
  watcherStore: "__getDynamicWatcherStore__",
98
183
  hooked: "__getDynamicWillUpdateHooked__",
99
184
  } as const;
100
185
 
101
- /** Clés utilisées par `@onAssign`. */
186
+ /** Clés legacy ignorées par `@onAssign`. */
102
187
  export const onAssignDynamicWatchKeys = {
103
188
  watcherStore: Symbol("__onAssignDynamicWatcherStore__"),
104
189
  hooked: Symbol("__onAssignDynamicWillUpdateHooked__"),
@@ -3,7 +3,7 @@ import { ConnectedComponent, setSubscribable } from "./common";
3
3
  import { extractDynamicDependencies, resolveDynamicPath } from "./dynamicPath";
4
4
  import {
5
5
  onAssignDynamicWatchKeys,
6
- registerDynamicPropertyWatcher,
6
+ observeDynamicProperty,
7
7
  } from "./dynamicPropertyWatch";
8
8
  import { getPublisherFromPath } from "./publisherPath";
9
9
 
@@ -141,7 +141,7 @@ export function onAssign(...values: Array<string>) {
141
141
  for (const conf of confs) {
142
142
  if (conf.pathConfig.isDynamic) {
143
143
  for (const dependency of conf.pathConfig.dynamicDependencies) {
144
- const unsubscribe = registerDynamicPropertyWatcher(
144
+ const unsubscribe = observeDynamicProperty(
145
145
  onAssignDynamicWatchKeys.watcherStore,
146
146
  onAssignDynamicWatchKeys.hooked,
147
147
  component,
@@ -7,7 +7,7 @@ import { ConnectedComponent, setSubscribable } from "./common";
7
7
  import { extractDynamicDependencies, resolveDynamicPath } from "./dynamicPath";
8
8
  import {
9
9
  publishDynamicWatchKeys,
10
- registerDynamicPropertyWatcher,
10
+ observeDynamicProperty,
11
11
  } from "./dynamicPropertyWatch";
12
12
  import { getPublisherFromPath } from "./publisherPath";
13
13
 
@@ -116,7 +116,7 @@ export function publish<T, U = any>(
116
116
  if (dynamicDependencies.length) {
117
117
  for (const dependency of dynamicDependencies) {
118
118
  state.cleanupWatchers.push(
119
- registerDynamicPropertyWatcher(
119
+ observeDynamicProperty(
120
120
  publishDynamicWatchKeys.watcherStore,
121
121
  publishDynamicWatchKeys.hooked,
122
122
  comp,
@@ -92,7 +92,9 @@ export class DemoBindReflect extends LitElement {
92
92
  }
93
93
 
94
94
  type BindReflectDemoData = { count: number };
95
- const bindReflectDemoKey = new DataProviderKey<BindReflectDemoData>("bindReflectDemo");
95
+ const bindReflectDemoKey = new DataProviderKey<BindReflectDemoData>(
96
+ "bindReflectDemo",
97
+ );
96
98
 
97
99
  @customElement("demo-bind-key")
98
100
  export class DemoBindKey extends LitElement {
@@ -110,7 +112,9 @@ export class DemoBindKey extends LitElement {
110
112
  render() {
111
113
  return html`
112
114
  <div class="mb-3">
113
- <p>@bind with DataProviderKey&lt;number&gt; (type-safe): ${this.count}</p>
115
+ <p>
116
+ @bind with DataProviderKey&lt;number&gt; (type-safe): ${this.count}
117
+ </p>
114
118
  </div>
115
119
  <sonic-button @click=${() => this.count++}>Increment</sonic-button>
116
120
  `;
@@ -17,19 +17,19 @@ export const geoApiDemoConfiguration: APIConfiguration = {
17
17
  };
18
18
 
19
19
  const docsDemoGeoApiConfigurationId = "docsDemoGeoApiConfiguration";
20
- PublisherManager.get(docsDemoGeoApiConfigurationId).set(geoApiDemoConfiguration);
21
-
22
- export const docsDemoGeoApiConfigurationKey = new DataProviderKey<APIConfiguration>(
23
- docsDemoGeoApiConfigurationId,
20
+ PublisherManager.get(docsDemoGeoApiConfigurationId).set(
21
+ geoApiDemoConfiguration,
24
22
  );
25
23
 
24
+ export const docsDemoGeoApiConfigurationKey =
25
+ new DataProviderKey<APIConfiguration>(docsDemoGeoApiConfigurationId);
26
+
26
27
  export const geoCommunesApiGetEndpoint = new Endpoint<GeoCommuneRow[]>(
27
28
  "communes?limit=5&fields=nom,code",
28
29
  );
29
30
 
30
- export const docsDemoDynApiConfKeyTemplate = new DataProviderKey<APIConfiguration>(
31
- "docsDemoDynApiConf${configSlot}",
32
- );
31
+ export const docsDemoDynApiConfKeyTemplate =
32
+ new DataProviderKey<APIConfiguration>("docsDemoDynApiConf${configSlot}");
33
33
 
34
34
  PublisherManager.get("docsDemoDynApiConfA").set(geoApiDemoConfiguration);
35
35
  PublisherManager.get("docsDemoDynApiConfB").set({
@@ -41,5 +41,6 @@ export const geoCommunesApiGetEndpointDynamic = new Endpoint<GeoCommuneRow[]>(
41
41
  "communes?limit=${communeLimit}&fields=nom,code",
42
42
  );
43
43
 
44
- export const geoCommunesApiGetPublishKey =
45
- new DataProviderKey<ApiGetResult<GeoCommuneRow[]>>(geoCommunesApiGetEndpoint.path);
44
+ export const geoCommunesApiGetPublishKey = new DataProviderKey<
45
+ ApiGetResult<GeoCommuneRow[]>
46
+ >(geoCommunesApiGetEndpoint.path);
@@ -1,10 +1,6 @@
1
1
  import { html, LitElement } from "lit";
2
2
  import { customElement, property, state } from "lit/decorators.js";
3
- import {
4
- get,
5
- publish,
6
- subscribe,
7
- } from "@supersoniks/concorde/decorators";
3
+ import { get, publish, subscribe } from "@supersoniks/concorde/decorators";
8
4
  import type {
9
5
  APIConfiguration,
10
6
  ApiGetResult,
@@ -443,8 +443,8 @@ export class DemoWaitAncestorsReadySection extends LitElement {
443
443
  return html`
444
444
  <div class="space-y-4">
445
445
  <p class="text-sm text-neutral-600 dark:text-neutral-400">
446
- Parent défini au chargement. Ajout dynamique de l’enfant — initialisation
447
- immédiate si l’ancêtre est prêt.
446
+ Parent défini au chargement. Ajout dynamique de l’enfant —
447
+ initialisation immédiate si l’ancêtre est prêt.
448
448
  </p>
449
449
  <sonic-button ?disabled=${this.childInDom} @click=${this.addChild}>
450
450
  ${this.childInDom ? "Child added" : "Add child dynamically"}
@@ -3469,51 +3469,6 @@
3469
3469
  }
3470
3470
  }
3471
3471
  },
3472
- {
3473
- "search": "const userKey = new DataProviderKey(&quot;demoUser&quot;);\nconst settingsKey = new DataProviderKey(&quot;demoUserSettings&quot;);\n",
3474
- "files": {
3475
- "docs/_decorators/on-assign.md": {
3476
- "title": "@onAssign",
3477
- "hashes": {
3478
- "example-with-dataproviderkey-type-safe": {
3479
- "count": 1,
3480
- "title": "Example with `DataProviderKey` (type-safe)",
3481
- "type": "paragraph"
3482
- }
3483
- }
3484
- }
3485
- }
3486
- },
3487
- {
3488
- "search": "@customElement(&quot;demo-on-assign-typed&quot;)\nexport class DemoOnAssignTyped extends LitElement {\n @state() user: User | null = null;\n @state() settings: Settings | null = null;\n",
3489
- "files": {
3490
- "docs/_decorators/on-assign.md": {
3491
- "title": "@onAssign",
3492
- "hashes": {
3493
- "example-with-dataproviderkey-type-safe": {
3494
- "count": 1,
3495
- "title": "Example with `DataProviderKey` (type-safe)",
3496
- "type": "paragraph"
3497
- }
3498
- }
3499
- }
3500
- }
3501
- },
3502
- {
3503
- "search": " @onAssign(userKey, settingsKey)\n handleReady(user: User, settings: Settings) {\n this.user = user;\n this.settings = settings;\n this.requestUpdate();\n }\n}\n \n\n",
3504
- "files": {
3505
- "docs/_decorators/on-assign.md": {
3506
- "title": "@onAssign",
3507
- "hashes": {
3508
- "example-with-dataproviderkey-type-safe": {
3509
- "count": 1,
3510
- "title": "Example with `DataProviderKey` (type-safe)",
3511
- "type": "paragraph"
3512
- }
3513
- }
3514
- }
3515
- }
3516
- },
3517
3472
  {
3518
3473
  "search": "The path uses dot notation to navigate through the publisher structure:\n",
3519
3474
  "files": {
package/src/tsconfig.json CHANGED
@@ -612,6 +612,15 @@
612
612
  "./ui/modal/modal-title": [
613
613
  "/sites/concorde/src/core/components/ui/modal/modal-title.ts"
614
614
  ],
615
+ "./modal-utils": [
616
+ "/sites/concorde/src/core/components/ui/modal/modal-utils.ts"
617
+ ],
618
+ "./ui/modal-utils": [
619
+ "/sites/concorde/src/core/components/ui/modal/modal-utils.ts"
620
+ ],
621
+ "./ui/modal/modal-utils": [
622
+ "/sites/concorde/src/core/components/ui/modal/modal-utils.ts"
623
+ ],
615
624
  "./modal": [
616
625
  "/sites/concorde/src/core/components/ui/modal/modal.ts"
617
626
  ],
@@ -801,6 +810,9 @@
801
810
  "./decorators/subscriber/dynamicPath": [
802
811
  "/sites/concorde/src/core/decorators/subscriber/dynamicPath.ts"
803
812
  ],
813
+ "./decorators/subscriber/dynamicPropertyWatch.spec": [
814
+ "/sites/concorde/src/core/decorators/subscriber/dynamicPropertyWatch.spec.ts"
815
+ ],
804
816
  "./decorators/subscriber/dynamicPropertyWatch": [
805
817
  "/sites/concorde/src/core/decorators/subscriber/dynamicPropertyWatch.ts"
806
818
  ],
@@ -1 +1 @@
1
- {"root":["./components.ts","./concorde-loaded.ts","./dataprovider.ts","./decorators.ts","./directives.ts","./index.ts","./mixins.ts","./utils.ts","./core/core.ts","./core/_types/endpoint.ts","./core/_types/key.ts","./core/_types/types.ts","./core/components/functional/functional.ts","./core/components/functional/date/date.ts","./core/components/functional/example/example.ts","./core/components/functional/fetch/fetch.ts","./core/components/functional/if/if.test.ts","./core/components/functional/if/if.ts","./core/components/functional/list/list.demo.ts","./core/components/functional/list/list.spec.ts","./core/components/functional/list/list.ts","./core/components/functional/mix/mix.ts","./core/components/functional/queue/queue.demo.ts","./core/components/functional/queue/queue.ts","./core/components/functional/router/redirect.ts","./core/components/functional/router/router.demo.ts","./core/components/functional/router/router.spec.ts","./core/components/functional/router/router.ts","./core/components/functional/sdui/SDUIDescriptorTransformer.ts","./core/components/functional/sdui/sdui-utils.ts","./core/components/functional/sdui/sdui.ts","./core/components/functional/sdui/types.ts","./core/components/functional/sonic-scope/sonic-scope.ts","./core/components/functional/states/states.demo.ts","./core/components/functional/states/states.spec.ts","./core/components/functional/states/states.ts","./core/components/functional/submit/submit.ts","./core/components/functional/subscriber/subscriber.ts","./core/components/functional/translation/translation.ts","./core/components/functional/value/value.ts","./core/components/ui/ui.ts","./core/components/ui/_css/scroll.ts","./core/components/ui/_css/shadow.ts","./core/components/ui/_css/size.ts","./core/components/ui/_css/type.ts","./core/components/ui/alert/alert.ts","./core/components/ui/alert-messages/alert-messages.ts","./core/components/ui/badge/badge.ts","./core/components/ui/button/button.ts","./core/components/ui/captcha/altchaStyles.ts","./core/components/ui/captcha/captcha.ts","./core/components/ui/card/card-footer.ts","./core/components/ui/card/card-header-descripton.ts","./core/components/ui/card/card-header.ts","./core/components/ui/card/card-main.ts","./core/components/ui/card/card.ts","./core/components/ui/divider/divider.ts","./core/components/ui/form/checkbox/checkbox.ts","./core/components/ui/form/css/form-control.ts","./core/components/ui/form/fieldset/fieldset.ts","./core/components/ui/form/fieldset/legend-description.ts","./core/components/ui/form/fieldset/legend.ts","./core/components/ui/form/form-actions/form-actions.ts","./core/components/ui/form/form-layout/form-layout.ts","./core/components/ui/form/input/input.ts","./core/components/ui/form/input/password-helper.ts","./core/components/ui/form/input/same-value-helper.ts","./core/components/ui/form/input-autocomplete/input-autocomplete.ts","./core/components/ui/form/radio/radio.ts","./core/components/ui/form/select/select.ts","./core/components/ui/form/switch/switch.ts","./core/components/ui/form/textarea/textarea.ts","./core/components/ui/group/group.ts","./core/components/ui/icon/icon.stories.ts","./core/components/ui/icon/icon.ts","./core/components/ui/icon/icons.ts","./core/components/ui/image/image.ts","./core/components/ui/link/link.ts","./core/components/ui/loader/loader.stories.ts","./core/components/ui/loader/loader.ts","./core/components/ui/loader/styles/fixed.ts","./core/components/ui/loader/styles/inline.ts","./core/components/ui/menu/menu-item.ts","./core/components/ui/menu/menu.ts","./core/components/ui/modal/modal-actions.ts","./core/components/ui/modal/modal-close.ts","./core/components/ui/modal/modal-content.ts","./core/components/ui/modal/modal-subtitle.ts","./core/components/ui/modal/modal-title.ts","./core/components/ui/modal/modal.ts","./core/components/ui/pop/pop.ts","./core/components/ui/progress/progress.ts","./core/components/ui/table/table-caption.ts","./core/components/ui/table/table-tbody.ts","./core/components/ui/table/table-td.ts","./core/components/ui/table/table-tfoot.ts","./core/components/ui/table/table-th.ts","./core/components/ui/table/table-thead.ts","./core/components/ui/table/table-tr.ts","./core/components/ui/table/table.ts","./core/components/ui/theme/theme.ts","./core/components/ui/theme/theme-collection/core-variables.ts","./core/components/ui/theme/theme-collection/dark.ts","./core/components/ui/theme/theme-collection/light.ts","./core/components/ui/toast/message-subscriber.ts","./core/components/ui/toast/toast-item.ts","./core/components/ui/toast/toast.ts","./core/components/ui/toast/types.ts","./core/components/ui/tooltip/tooltip.ts","./core/decorators/Subscriber.ts","./core/decorators/api.spec.ts","./core/decorators/api.ts","./core/decorators/lifecycle.ts","./core/decorators/subscriber/ancestorAttribute.ts","./core/decorators/subscriber/autoFill.ts","./core/decorators/subscriber/autoSubscribe.ts","./core/decorators/subscriber/bind.ts","./core/decorators/subscriber/common.ts","./core/decorators/subscriber/dynamicPath.ts","./core/decorators/subscriber/dynamicPropertyWatch.ts","./core/decorators/subscriber/onAssign.ts","./core/decorators/subscriber/publish.spec.ts","./core/decorators/subscriber/publish.ts","./core/decorators/subscriber/publisherPath.ts","./core/decorators/subscriber/subscribe.spec.ts","./core/decorators/subscriber/subscribe.ts","./core/directives/DataProvider.ts","./core/directives/Wording.ts","./core/mixins/Fetcher.ts","./core/mixins/FormCheckable.ts","./core/mixins/FormElement.ts","./core/mixins/FormInput.ts","./core/mixins/Subscriber.ts","./core/mixins/TemplatesContainer.ts","./core/mixins/mixins.ts","./core/utils/Arrays.ts","./core/utils/DataBindObserver.ts","./core/utils/Electron.ts","./core/utils/Format.ts","./core/utils/HTML.ts","./core/utils/LocationHandler.ts","./core/utils/Objects.ts","./core/utils/PublisherProxy.ts","./core/utils/Utils.ts","./core/utils/aesCrypto.ts","./core/utils/api.ts","./core/utils/dataProviderKey.spec.ts","./core/utils/dataProviderKey.ts","./core/utils/endpoint.spec.ts","./core/utils/endpoint.ts","./core/utils/route.spec.ts","./core/utils/route.ts","./core/utils/url-pattern.ts","./test-utils/TestUtils.ts"],"version":"5.9.2"}
1
+ {"root":["./components.ts","./concorde-loaded.ts","./dataprovider.ts","./decorators.ts","./directives.ts","./index.ts","./mixins.ts","./utils.ts","./core/core.ts","./core/_types/endpoint.ts","./core/_types/key.ts","./core/_types/types.ts","./core/components/functional/functional.ts","./core/components/functional/date/date.ts","./core/components/functional/example/example.ts","./core/components/functional/fetch/fetch.ts","./core/components/functional/if/if.test.ts","./core/components/functional/if/if.ts","./core/components/functional/list/list.demo.ts","./core/components/functional/list/list.spec.ts","./core/components/functional/list/list.ts","./core/components/functional/mix/mix.ts","./core/components/functional/queue/queue.demo.ts","./core/components/functional/queue/queue.ts","./core/components/functional/router/redirect.ts","./core/components/functional/router/router.demo.ts","./core/components/functional/router/router.spec.ts","./core/components/functional/router/router.ts","./core/components/functional/sdui/SDUIDescriptorTransformer.ts","./core/components/functional/sdui/sdui-utils.ts","./core/components/functional/sdui/sdui.ts","./core/components/functional/sdui/types.ts","./core/components/functional/sonic-scope/sonic-scope.ts","./core/components/functional/states/states.demo.ts","./core/components/functional/states/states.spec.ts","./core/components/functional/states/states.ts","./core/components/functional/submit/submit.ts","./core/components/functional/subscriber/subscriber.ts","./core/components/functional/translation/translation.ts","./core/components/functional/value/value.ts","./core/components/ui/ui.ts","./core/components/ui/_css/scroll.ts","./core/components/ui/_css/shadow.ts","./core/components/ui/_css/size.ts","./core/components/ui/_css/type.ts","./core/components/ui/alert/alert.ts","./core/components/ui/alert-messages/alert-messages.ts","./core/components/ui/badge/badge.ts","./core/components/ui/button/button.ts","./core/components/ui/captcha/altchaStyles.ts","./core/components/ui/captcha/captcha.ts","./core/components/ui/card/card-footer.ts","./core/components/ui/card/card-header-descripton.ts","./core/components/ui/card/card-header.ts","./core/components/ui/card/card-main.ts","./core/components/ui/card/card.ts","./core/components/ui/divider/divider.ts","./core/components/ui/form/checkbox/checkbox.ts","./core/components/ui/form/css/form-control.ts","./core/components/ui/form/fieldset/fieldset.ts","./core/components/ui/form/fieldset/legend-description.ts","./core/components/ui/form/fieldset/legend.ts","./core/components/ui/form/form-actions/form-actions.ts","./core/components/ui/form/form-layout/form-layout.ts","./core/components/ui/form/input/input.ts","./core/components/ui/form/input/password-helper.ts","./core/components/ui/form/input/same-value-helper.ts","./core/components/ui/form/input-autocomplete/input-autocomplete.ts","./core/components/ui/form/radio/radio.ts","./core/components/ui/form/select/select.ts","./core/components/ui/form/switch/switch.ts","./core/components/ui/form/textarea/textarea.ts","./core/components/ui/group/group.ts","./core/components/ui/icon/icon.stories.ts","./core/components/ui/icon/icon.ts","./core/components/ui/icon/icons.ts","./core/components/ui/image/image.ts","./core/components/ui/link/link.ts","./core/components/ui/loader/loader.stories.ts","./core/components/ui/loader/loader.ts","./core/components/ui/loader/styles/fixed.ts","./core/components/ui/loader/styles/inline.ts","./core/components/ui/menu/menu-item.ts","./core/components/ui/menu/menu.ts","./core/components/ui/modal/modal-actions.ts","./core/components/ui/modal/modal-close.ts","./core/components/ui/modal/modal-content.ts","./core/components/ui/modal/modal-subtitle.ts","./core/components/ui/modal/modal-title.ts","./core/components/ui/modal/modal-utils.ts","./core/components/ui/modal/modal.ts","./core/components/ui/pop/pop.ts","./core/components/ui/progress/progress.ts","./core/components/ui/table/table-caption.ts","./core/components/ui/table/table-tbody.ts","./core/components/ui/table/table-td.ts","./core/components/ui/table/table-tfoot.ts","./core/components/ui/table/table-th.ts","./core/components/ui/table/table-thead.ts","./core/components/ui/table/table-tr.ts","./core/components/ui/table/table.ts","./core/components/ui/theme/theme.ts","./core/components/ui/theme/theme-collection/core-variables.ts","./core/components/ui/theme/theme-collection/dark.ts","./core/components/ui/theme/theme-collection/light.ts","./core/components/ui/toast/message-subscriber.ts","./core/components/ui/toast/toast-item.ts","./core/components/ui/toast/toast.ts","./core/components/ui/toast/types.ts","./core/components/ui/tooltip/tooltip.ts","./core/decorators/Subscriber.ts","./core/decorators/api.spec.ts","./core/decorators/api.ts","./core/decorators/lifecycle.ts","./core/decorators/subscriber/ancestorAttribute.ts","./core/decorators/subscriber/autoFill.ts","./core/decorators/subscriber/autoSubscribe.ts","./core/decorators/subscriber/bind.ts","./core/decorators/subscriber/common.ts","./core/decorators/subscriber/dynamicPath.ts","./core/decorators/subscriber/dynamicPropertyWatch.spec.ts","./core/decorators/subscriber/dynamicPropertyWatch.ts","./core/decorators/subscriber/onAssign.ts","./core/decorators/subscriber/publish.spec.ts","./core/decorators/subscriber/publish.ts","./core/decorators/subscriber/publisherPath.ts","./core/decorators/subscriber/subscribe.spec.ts","./core/decorators/subscriber/subscribe.ts","./core/directives/DataProvider.ts","./core/directives/Wording.ts","./core/mixins/Fetcher.ts","./core/mixins/FormCheckable.ts","./core/mixins/FormElement.ts","./core/mixins/FormInput.ts","./core/mixins/Subscriber.ts","./core/mixins/TemplatesContainer.ts","./core/mixins/mixins.ts","./core/utils/Arrays.ts","./core/utils/DataBindObserver.ts","./core/utils/Electron.ts","./core/utils/Format.ts","./core/utils/HTML.ts","./core/utils/LocationHandler.ts","./core/utils/Objects.ts","./core/utils/PublisherProxy.ts","./core/utils/Utils.ts","./core/utils/aesCrypto.ts","./core/utils/api.ts","./core/utils/dataProviderKey.spec.ts","./core/utils/dataProviderKey.ts","./core/utils/endpoint.spec.ts","./core/utils/endpoint.ts","./core/utils/route.spec.ts","./core/utils/route.ts","./core/utils/url-pattern.ts","./test-utils/TestUtils.ts"],"version":"5.9.2"}