@fragmentsx/fragments-client 0.2.0-dev-20261011155313 → 0.2.0-dev-20261023085404
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/README.md +51 -3
- package/dist/$area/index.d.ts +7 -1
- package/dist/$area/index.d.ts.map +1 -1
- package/dist/createFragmentsClient.d.ts +16 -0
- package/dist/createFragmentsClient.d.ts.map +1 -1
- package/dist/createFragmentsClient.test.d.ts +2 -1
- package/dist/createFragmentsClient.test.d.ts.map +1 -1
- package/dist/events/__tests__/eventQueue.test.d.ts +2 -0
- package/dist/events/__tests__/eventQueue.test.d.ts.map +1 -0
- package/dist/events/__tests__/experimentEvents.test.d.ts +2 -0
- package/dist/events/__tests__/experimentEvents.test.d.ts.map +1 -0
- package/dist/events/__tests__/outbox.test.d.ts +2 -0
- package/dist/events/__tests__/outbox.test.d.ts.map +1 -0
- package/dist/events/__tests__/transport.test.d.ts +2 -0
- package/dist/events/__tests__/transport.test.d.ts.map +1 -0
- package/dist/events/__tests__/wireParity.test.d.ts +2 -0
- package/dist/events/__tests__/wireParity.test.d.ts.map +1 -0
- package/dist/events/eventQueue.d.ts +25 -0
- package/dist/events/eventQueue.d.ts.map +1 -0
- package/dist/events/experimentEvents.d.ts +46 -0
- package/dist/events/experimentEvents.d.ts.map +1 -0
- package/dist/events/index.d.ts +19 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/outbox.d.ts +31 -0
- package/dist/events/outbox.d.ts.map +1 -0
- package/dist/events/transport.d.ts +23 -0
- package/dist/events/transport.d.ts.map +1 -0
- package/dist/fetch/index.d.ts.map +1 -1
- package/dist/fetch/restFetcher.d.ts +0 -1
- package/dist/fetch/restFetcher.d.ts.map +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.es.js +1038 -727
- package/dist/namespaces.d.ts +8 -7
- package/dist/namespaces.d.ts.map +1 -1
- package/dist/types.d.ts +21 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/isBrowser.d.ts +2 -1
- package/dist/utils/isBrowser.d.ts.map +1 -1
- package/dist/utils/uuid.d.ts +3 -0
- package/dist/utils/uuid.d.ts.map +1 -0
- package/dist/visitor/visitorKey.d.ts +15 -0
- package/dist/visitor/visitorKey.d.ts.map +1 -0
- package/dist/visitor/visitorKey.test.d.ts +2 -0
- package/dist/visitor/visitorKey.test.d.ts.map +1 -0
- package/package.json +1 -1
- package/dist/fetch/__tests__/beacon.test.d.ts +0 -16
- package/dist/fetch/__tests__/beacon.test.d.ts.map +0 -1
- package/dist/fetch/beacon.d.ts +0 -22
- package/dist/fetch/beacon.d.ts.map +0 -1
- package/dist/metrics/__tests__/globalMetrics.test.d.ts +0 -16
- package/dist/metrics/__tests__/globalMetrics.test.d.ts.map +0 -1
- package/dist/metrics/globalMetrics.d.ts +0 -18
- package/dist/metrics/globalMetrics.d.ts.map +0 -1
- package/dist/metrics/trackAdPixel.d.ts +0 -31
- package/dist/metrics/trackAdPixel.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# @fragmentsx/fragments-client
|
|
2
2
|
|
|
3
3
|
Клиентское ядро Fragments: загрузка и кеширование областей (area), фрагментов
|
|
4
|
-
и css-чанков,
|
|
4
|
+
и css-чанков, события измерения. Транспортный слой, на котором строится
|
|
5
5
|
`@fragmentsx/runtime-react` — сам по себе фреймворк-агностичен и не зависит
|
|
6
6
|
от React.
|
|
7
7
|
|
|
@@ -13,7 +13,9 @@
|
|
|
13
13
|
- разрешение области (`areaPlugin`) с версионированием формата ответа;
|
|
14
14
|
- кеширование фрагментов (`fragmentsCachePlugin`) и css-чанков
|
|
15
15
|
(`createCssChunksCachePlugin`) поверх `@graph-state/core`;
|
|
16
|
-
-
|
|
16
|
+
- события измерения (`experimentEventsPlugin`): очередь, повторы и досылка
|
|
17
|
+
при следующей загрузке страницы; цели меряются через `useGoal` из
|
|
18
|
+
`@fragmentsx/runtime-react`;
|
|
17
19
|
- типизированные ошибки (`FragmentsAreaError`, `FragmentsApiVersionError`,
|
|
18
20
|
`FragmentsLoadError`) для явной обработки сбоев сети/версии на стороне
|
|
19
21
|
потребителя.
|
|
@@ -39,13 +41,59 @@ const area = await client.$area.resolve('home');
|
|
|
39
41
|
|
|
40
42
|
`apiToken` обязателен. Остальные опции — `backendEndpoint` (источник
|
|
41
43
|
манифеста; по умолчанию `window.location.origin`), `projectId?: number`,
|
|
42
|
-
`referer?`, `timeout?`, `
|
|
44
|
+
`referer?`, `timeout?`, `visitorId?`, `persistVisitorId?` (ключ посетителя —
|
|
45
|
+
в разделе ниже), `plugins?`, `inject?` (callback монтирования CSS в
|
|
43
46
|
DOM; в браузере передайте `injectStylesheet` из `@fragmentsx/runtime-react`
|
|
44
47
|
или используйте готовый `createBrowserClient` оттуда же), `sourceCache?` и
|
|
45
48
|
`sources?`.
|
|
46
49
|
|
|
47
50
|
Результат `$area.resolve` дополнительно несёт `projectBindings`: след привязок props корневого фрагмента к свойствам проекта. У каждого узла `slots` есть собственный след. Значения в `props` остаются значениями студии; `@fragmentsx/runtime-react` применяет значение сайта. Старый сервер без поля нормализуется клиентом в `{}`.
|
|
48
51
|
|
|
52
|
+
## Ключ посетителя и площадки без прокси
|
|
53
|
+
|
|
54
|
+
Эксперименты считают людей по ключу посетителя — куке `fx_uid`. Откуда она
|
|
55
|
+
берётся, зависит от того, как площадка подключена.
|
|
56
|
+
|
|
57
|
+
**С прокси площадки** (манифест и события идут через путь на домене самой
|
|
58
|
+
площадки) ключ серверный и первой стороны: куку ставит наш сервер доставки,
|
|
59
|
+
SDK её только читает и ничего не пишет.
|
|
60
|
+
|
|
61
|
+
**Без прокси** (манифест идёт на чужой origin) SDK сам заводит `fx_uid` на
|
|
62
|
+
домене площадки и шлёт его заголовком `X-Client-Id` вместе с каждым запросом
|
|
63
|
+
манифеста; сервер доставки принимает ключ, если он проходит проверку
|
|
64
|
+
`^[A-Za-z0-9_-]{16,64}$`. Две области одной страницы и повторный визит получают
|
|
65
|
+
один и тот же ключ.
|
|
66
|
+
|
|
67
|
+
У такого ключа есть граница, о которой стоит предупредить владельца площадки:
|
|
68
|
+
|
|
69
|
+
- Safari стирает записанный скриптом ключ после 7 дней без взаимодействия
|
|
70
|
+
человека с площадкой — вернувшийся через неделю считается новым посетителем;
|
|
71
|
+
- в режиме инкогнито каждый сеанс — новый человек;
|
|
72
|
+
- с прокси ключ серверный и первой стороны, и этих ограничений нет.
|
|
73
|
+
|
|
74
|
+
Площадка со своей системой согласия управляет ключом опциями клиента:
|
|
75
|
+
|
|
76
|
+
```ts
|
|
77
|
+
createFragmentsClient({
|
|
78
|
+
apiToken,
|
|
79
|
+
// свой ключ: 16–64 символа A-Za-z0-9_-; невалидный игнорируется
|
|
80
|
+
// (с debug: true — с предупреждением в консоль)
|
|
81
|
+
visitorId: consent.userKey,
|
|
82
|
+
// не писать fx_uid в куку: ключ живёт в памяти страницы,
|
|
83
|
+
// после перезагрузки это уже новый посетитель
|
|
84
|
+
persistVisitorId: false,
|
|
85
|
+
});
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
При `persistVisitorId: false` очередь недоставленных событий тоже не пишется в `localStorage`: события живут в памяти страницы и теряются при её закрытии.
|
|
89
|
+
|
|
90
|
+
События измерения уходят на `${backendEndpoint}/v1/events` — тот же адрес, что
|
|
91
|
+
и манифест. Поэтому прокси площадки обязан пересылать весь префикс, включая
|
|
92
|
+
`/v1/events`, и выставлять `X-Forwarded-For` с настоящим адресом человека:
|
|
93
|
+
иначе сервер увидит адрес прокси. Событие, которое не удалось отправить при
|
|
94
|
+
уходе со страницы, сохраняется на устройстве и досылается при следующей
|
|
95
|
+
загрузке.
|
|
96
|
+
|
|
49
97
|
## Кэш источников и слот фетчера
|
|
50
98
|
|
|
51
99
|
`useSource` из `@fragmentsx/runtime-react` держит ответы источников в кэше
|
package/dist/$area/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Plugin } from '@graph-state/core';
|
|
2
|
-
import { AreaSourceTransport, ResolvedValue, ResolvedSlotPosition } from '../types';
|
|
2
|
+
import { AreaSourceTransport, AreaExperiment, ResolvedValue, ResolvedSlotPosition } from '../types';
|
|
3
3
|
import { InjectFn } from '../stylesheet';
|
|
4
4
|
/**
|
|
5
5
|
* Тип resolved value из $area.resolve — subset manifest без fragment refs.
|
|
@@ -17,6 +17,12 @@ export interface AreaResolveResult {
|
|
|
17
17
|
* честное «сервер не сообщил».
|
|
18
18
|
*/
|
|
19
19
|
variantId: number | null;
|
|
20
|
+
/**
|
|
21
|
+
* Phase 128 (D-11, EVT-01): блок эксперимента для трассера аналитики.
|
|
22
|
+
* Обязательное и nullable — по образцу variantId. null — сервер не сообщил (старый
|
|
23
|
+
* манифест, кампания не активна, превью).
|
|
24
|
+
*/
|
|
25
|
+
experiment: AreaExperiment | null;
|
|
20
26
|
/**
|
|
21
27
|
* Phase 73, B-02/B-06: готовые значения props корневого артефакта — привязки
|
|
22
28
|
* `{$ref:{scope,name}}` из `Variant.props` уже разрешены сервером. Автоподстановки
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/$area/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/$area/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAEV,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,oBAAoB,EACrB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAkE9C;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;;;;OAQG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;;OAIG;IACH,UAAU,EAAE,cAAc,GAAG,IAAI,CAAC;IAClC;;;;;;OAMG;IACH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACrC;;;;;OAKG;IACH,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACjD,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC;;;OAGG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B;;;;OAIG;IACH,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB;;;;;OAKG;IACH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAC5C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACnF;;;;;OAKG;IACH,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,iBAAiB,CAAC;IAC1C;;;;;;OAMG;IACH,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CAChC;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE,GAAG,MAAM,CAiLnE;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,MAAqD,CAAC"}
|
|
@@ -58,6 +58,22 @@ export interface Options {
|
|
|
58
58
|
* (T-rvp-02): флаг нельзя поднять из пользовательского ввода на лету.
|
|
59
59
|
*/
|
|
60
60
|
debug?: boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Свой ключ посетителя площадки — для площадки со своей системой согласия,
|
|
63
|
+
* которая сама решает, кто есть кто (ответ на EXP-33). Допустимы 16–64 символа
|
|
64
|
+
* `A-Za-z0-9_-`; невалидное значение игнорируется (с `debug: true` —
|
|
65
|
+
* с предупреждением в консоль), ключ заводится обычным путём. Уходит в `X-Client-Id`
|
|
66
|
+
* и в записанную куку не превращается.
|
|
67
|
+
* Reversibility: costly — публичная опция клиента, меняется только версией.
|
|
68
|
+
*/
|
|
69
|
+
visitorId?: string;
|
|
70
|
+
/**
|
|
71
|
+
* `false` — SDK не пишет ключ посетителя в куку `fx_uid`: ключ живёт в памяти
|
|
72
|
+
* страницы, и после перезагрузки это уже новый посетитель. По умолчанию `true`.
|
|
73
|
+
* Нужна площадке, где запись в куки без согласия запрещена.
|
|
74
|
+
* Reversibility: costly — публичная опция клиента, меняется только версией.
|
|
75
|
+
*/
|
|
76
|
+
persistVisitorId?: boolean;
|
|
61
77
|
/**
|
|
62
78
|
* Phase 115 (D-115-04): кэш источников. По умолчанию у каждого клиента
|
|
63
79
|
* свой — хост может создать `createSourceCache()` сам и передать, чтобы
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createFragmentsClient.d.ts","sourceRoot":"","sources":["../src/createFragmentsClient.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"createFragmentsClient.d.ts","sourceRoot":"","sources":["../src/createFragmentsClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAe,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAI7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAElF,OAAO,EAAiD,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAevG;;;;GAIG;AACH,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB;;;;OAIG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB;;;;;;;;OAQG;IACH,gBAAgB,CAAC,EAAE,kBAAkB,CAAC;IACtC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B;;;;;OAKG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACtC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GAAI,SAAS,OAAO,sGAsFrD,CAAC"}
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* Тесты для createFragmentsClient factory.
|
|
3
3
|
*
|
|
4
4
|
* Проверяет:
|
|
5
|
-
* - Наличие всех namespace'ов: $fetch, $
|
|
5
|
+
* - Наличие всех namespace'ов: $fetch, $area, $fragments, $cssChunks
|
|
6
|
+
* - Отсутствие снятого пути целей: namespace метрик, а у $fetch нет маяка и абсолютных GET/POST (GOAL-08, К131-03)
|
|
6
7
|
* - Отсутствие legacy JIT plugins: $fonts, $properties, $globalStylesheet (Req #1)
|
|
7
8
|
* - BLOCKER-4: opts.inject пробрасывается в createCssChunksCachePlugin
|
|
8
9
|
* - Default noop inject — не крашит на populate
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createFragmentsClient.test.d.ts","sourceRoot":"","sources":["../src/createFragmentsClient.test.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"createFragmentsClient.test.d.ts","sourceRoot":"","sources":["../src/createFragmentsClient.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventQueue.test.d.ts","sourceRoot":"","sources":["../../../src/events/__tests__/eventQueue.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"experimentEvents.test.d.ts","sourceRoot":"","sources":["../../../src/events/__tests__/experimentEvents.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox.test.d.ts","sourceRoot":"","sources":["../../../src/events/__tests__/outbox.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.test.d.ts","sourceRoot":"","sources":["../../../src/events/__tests__/transport.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wireParity.test.d.ts","sourceRoot":"","sources":["../../../src/events/__tests__/wireParity.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ExperimentEvent } from './experimentEvents';
|
|
2
|
+
import { EventTransport } from './transport';
|
|
3
|
+
import { Outbox } from './outbox';
|
|
4
|
+
export declare const EVENT_QUEUE_MAX_BATCH = 20;
|
|
5
|
+
export declare const EVENT_QUEUE_FLUSH_MS = 5000;
|
|
6
|
+
export interface EventQueueTarget {
|
|
7
|
+
url: string;
|
|
8
|
+
key: string;
|
|
9
|
+
}
|
|
10
|
+
export interface EventQueueOptions {
|
|
11
|
+
transport?: EventTransport;
|
|
12
|
+
outbox?: Outbox;
|
|
13
|
+
resolveTarget?: () => EventQueueTarget | null;
|
|
14
|
+
send?: (events: ExperimentEvent[]) => void;
|
|
15
|
+
maxBatch?: number;
|
|
16
|
+
flushIntervalMs?: number;
|
|
17
|
+
now?: () => number;
|
|
18
|
+
random?: () => number;
|
|
19
|
+
}
|
|
20
|
+
export interface EventQueue {
|
|
21
|
+
enqueue: (event: ExperimentEvent) => void;
|
|
22
|
+
flush: () => void;
|
|
23
|
+
}
|
|
24
|
+
export declare function createEventQueue(options?: EventQueueOptions): EventQueue;
|
|
25
|
+
//# sourceMappingURL=eventQueue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventQueue.d.ts","sourceRoot":"","sources":["../../src/events/eventQueue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAuB,MAAM,oBAAoB,CAAC;AAQ/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,UAAU,CAAC;AAGpD,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAEzC,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,gBAAgB,GAAG,IAAI,CAAC;IAC9C,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC1C,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAyCD,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,iBAAsB,GAAG,UAAU,CA0Q5E"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { AreaExperiment } from '../types';
|
|
2
|
+
export declare const INGEST_BATCH_LIMIT = 50;
|
|
3
|
+
export declare const EVENTS_MAX_BATCH_BYTES = 24576;
|
|
4
|
+
export interface ExperimentEvent {
|
|
5
|
+
type: "request" | "impression" | "goal";
|
|
6
|
+
experiment: AreaExperiment;
|
|
7
|
+
viewId?: string;
|
|
8
|
+
goalKey?: string;
|
|
9
|
+
/** Идентификатор события: ставится один раз при постановке в очередь и не меняется при повторах. */
|
|
10
|
+
eventId?: string;
|
|
11
|
+
/** Флаг автоматизации/тестирования (webdriver) */
|
|
12
|
+
wd?: 1;
|
|
13
|
+
}
|
|
14
|
+
export interface WireExperimentEvent {
|
|
15
|
+
t: "request" | "impression" | "goal";
|
|
16
|
+
a: number;
|
|
17
|
+
c: number;
|
|
18
|
+
vr: number;
|
|
19
|
+
l: string;
|
|
20
|
+
u: string;
|
|
21
|
+
i: string;
|
|
22
|
+
s?: NonNullable<AreaExperiment["uidSource"]>;
|
|
23
|
+
w?: string;
|
|
24
|
+
g?: string;
|
|
25
|
+
co: string;
|
|
26
|
+
dv: number;
|
|
27
|
+
os: number;
|
|
28
|
+
br: string;
|
|
29
|
+
wd?: 1;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Преобразует внутреннее событие клиента в проводной формат для приёмника.
|
|
33
|
+
*
|
|
34
|
+
* - у `request` нет полей `w` и `g`
|
|
35
|
+
* - у `impression` есть `w`, но нет `g`
|
|
36
|
+
* - у `goal` есть `w` и `g`
|
|
37
|
+
* - при наличии webdriver выставляется `wd: 1`
|
|
38
|
+
* - при отсутствии `seg` fallback: `co: ""`, `dv: 0`, `os: 0`, `br: ""`
|
|
39
|
+
*/
|
|
40
|
+
export declare function toWireEvent(event: ExperimentEvent): WireExperimentEvent;
|
|
41
|
+
/**
|
|
42
|
+
* Собирает JSON-тело пачки событий с версией 1 и публичным ключом проекта.
|
|
43
|
+
* Принимает как исходные ExperimentEvent, так и уже преобразованные WireExperimentEvent.
|
|
44
|
+
*/
|
|
45
|
+
export declare function buildExperimentBatchBody(key: string, events: (ExperimentEvent | WireExperimentEvent)[]): string;
|
|
46
|
+
//# sourceMappingURL=experimentEvents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"experimentEvents.d.ts","sourceRoot":"","sources":["../../src/events/experimentEvents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG/C,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAGrC,eAAO,MAAM,sBAAsB,QAAQ,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,MAAM,CAAC;IACxC,UAAU,EAAE,cAAc,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oGAAoG;IACpG,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,EAAE,CAAC,EAAE,CAAC,CAAC;CACR;AAED,MAAM,WAAW,mBAAmB;IAClC,CAAC,EAAE,SAAS,GAAG,YAAY,GAAG,MAAM,CAAC;IACrC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,CAAC,EAAE,WAAW,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,CAAC,EAAE,CAAC,CAAC;CACR;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,mBAAmB,CAkCvE;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,CAAC,eAAe,GAAG,mBAAmB,CAAC,EAAE,GAChD,MAAM,CAMR"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Plugin } from '@graph-state/core';
|
|
2
|
+
import { ExperimentEvent } from './experimentEvents';
|
|
3
|
+
export { createEventQueue, EVENT_QUEUE_MAX_BATCH, EVENT_QUEUE_FLUSH_MS } from './eventQueue';
|
|
4
|
+
export { toWireEvent, buildExperimentBatchBody, INGEST_BATCH_LIMIT, EVENTS_MAX_BATCH_BYTES, } from './experimentEvents';
|
|
5
|
+
export type { ExperimentEvent, WireExperimentEvent } from './experimentEvents';
|
|
6
|
+
export { createEventTransport, KEEPALIVE_BUDGET_BYTES } from './transport';
|
|
7
|
+
export type { SendOutcome, EventTransport } from './transport';
|
|
8
|
+
export { createOutbox, OUTBOX_STORAGE_KEY, OUTBOX_MAX_ENTRIES, OUTBOX_MAX_BYTES, OUTBOX_MAX_AGE_MS, } from './outbox';
|
|
9
|
+
export type { OutboxEntry, Outbox } from './outbox';
|
|
10
|
+
declare module "@graph-state/core" {
|
|
11
|
+
interface GraphState {
|
|
12
|
+
$events?: {
|
|
13
|
+
emit: (event: ExperimentEvent) => void;
|
|
14
|
+
flush: () => void;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export declare const experimentEventsPlugin: Plugin;
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAK1D,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC7F,OAAO,EACL,WAAW,EACX,wBAAwB,EACxB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC3E,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEpD,OAAO,QAAQ,mBAAmB,CAAC;IACjC,UAAU,UAAU;QAClB,OAAO,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;YACvC,KAAK,EAAE,MAAM,IAAI,CAAC;SACnB,CAAC;KACH;CACF;AAED,eAAO,MAAM,sBAAsB,EAAE,MAsCpC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { WireExperimentEvent } from './experimentEvents';
|
|
2
|
+
export declare const OUTBOX_STORAGE_KEY = "fx_events_outbox_v1";
|
|
3
|
+
export declare const OUTBOX_MAX_ENTRIES = 200;
|
|
4
|
+
export declare const OUTBOX_MAX_BYTES: number;
|
|
5
|
+
export declare const OUTBOX_MAX_AGE_MS = 86400000;
|
|
6
|
+
export interface OutboxEntry {
|
|
7
|
+
id: string;
|
|
8
|
+
key: string;
|
|
9
|
+
event: WireExperimentEvent;
|
|
10
|
+
createdAt: number;
|
|
11
|
+
attempts: number;
|
|
12
|
+
}
|
|
13
|
+
export interface OutboxPayload {
|
|
14
|
+
v: 1;
|
|
15
|
+
entries: OutboxEntry[];
|
|
16
|
+
}
|
|
17
|
+
export interface OutboxOptions {
|
|
18
|
+
storage?: Storage | null;
|
|
19
|
+
now?: () => number;
|
|
20
|
+
}
|
|
21
|
+
export interface Outbox {
|
|
22
|
+
append: (entries: OutboxEntry[] | OutboxEntry) => void;
|
|
23
|
+
pending: () => OutboxEntry[];
|
|
24
|
+
remove: (ids: string[]) => void;
|
|
25
|
+
bumpAttempts: (ids: string[]) => void;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Создаёт outbox для write-ahead сохранения событий в localStorage с fallback в память.
|
|
29
|
+
*/
|
|
30
|
+
export declare function createOutbox(options?: OutboxOptions): Outbox;
|
|
31
|
+
//# sourceMappingURL=outbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox.d.ts","sourceRoot":"","sources":["../../src/events/outbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,eAAO,MAAM,kBAAkB,wBAAwB,CAAC;AACxD,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC,eAAO,MAAM,gBAAgB,QAAa,CAAC;AAC3C,eAAO,MAAM,iBAAiB,WAAW,CAAC;AAI1C,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,mBAAmB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,CAAC,EAAE,CAAC,CAAC;IACL,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,WAAW,KAAK,IAAI,CAAC;IACvD,OAAO,EAAE,MAAM,WAAW,EAAE,CAAC;IAC7B,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAChC,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CACvC;AA0DD;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG,MAAM,CA0IhE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare const KEEPALIVE_BUDGET_BYTES: number;
|
|
2
|
+
export type SendOutcome = {
|
|
3
|
+
outcome: "ok";
|
|
4
|
+
status: number;
|
|
5
|
+
} | {
|
|
6
|
+
outcome: "drop";
|
|
7
|
+
status: number;
|
|
8
|
+
} | {
|
|
9
|
+
outcome: "retry";
|
|
10
|
+
status?: number;
|
|
11
|
+
retryAfterMs?: number;
|
|
12
|
+
};
|
|
13
|
+
export interface EventTransportOptions {
|
|
14
|
+
fetchImpl?: typeof fetch;
|
|
15
|
+
}
|
|
16
|
+
export interface EventTransport {
|
|
17
|
+
send: (url: string, body: string) => Promise<SendOutcome>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Создаёт транспорт отправки пачки событий с учётом квоты keepalive и чтением ответа.
|
|
21
|
+
*/
|
|
22
|
+
export declare function createEventTransport(options?: EventTransportOptions): EventTransport;
|
|
23
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/events/transport.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,QAAY,CAAC;AAEhD,MAAM,MAAM,WAAW,GACnB;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjE,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;CAC3D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B,GAAG,cAAc,CAiExF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fetch/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fetch/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAIhD,eAAO,MAAM,WAAW,EAAE,MA+DzB,CAAC"}
|
|
@@ -43,6 +43,5 @@ export type RestResult<T, E = {
|
|
|
43
43
|
};
|
|
44
44
|
export declare const createRestFetcher: (baseUrl: string, defaultHeaders?: DefaultHeaders, options?: FetcherOptions) => {
|
|
45
45
|
get: <T>(url: string, opts?: FetcherOptions) => Promise<RestResult<T>>;
|
|
46
|
-
getAbsolute: (url: string) => void;
|
|
47
46
|
};
|
|
48
47
|
//# sourceMappingURL=restFetcher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"restFetcher.d.ts","sourceRoot":"","sources":["../../src/fetch/restFetcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAQH,MAAM,WAAW,cAAc;IAC7B,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qFAAqF;AACrF,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,CAAC,MAAM,WAAW,CAAC,CAAC;AAE/D;;;;GAIG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;CAAE,IAC5F;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,SAAS,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhD,eAAO,MAAM,iBAAiB,GAC5B,SAAS,MAAM,EACf,iBAAgB,cAAmB,EACnC,UAAS,cAAmB;UAYf,CAAC,OAAO,MAAM,SAAQ,cAAc,KAAQ,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"restFetcher.d.ts","sourceRoot":"","sources":["../../src/fetch/restFetcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAQH,MAAM,WAAW,cAAc;IAC7B,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qFAAqF;AACrF,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,CAAC,MAAM,WAAW,CAAC,CAAC;AAE/D;;;;GAIG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;CAAE,IAC5F;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,SAAS,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhD,eAAO,MAAM,iBAAiB,GAC5B,SAAS,MAAM,EACf,iBAAgB,cAAmB,EACnC,UAAS,cAAmB;UAYf,CAAC,OAAO,MAAM,SAAQ,cAAc,KAAQ,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;CAoDhF,CAAC"}
|
package/dist/index.cjs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const _e=require("@graph-state/core"),Fe=require("@graph-state/checkers");class R extends Error{constructor(r,t,n,i){super(t),this.code=r,this.details=n,this.status=i,this.name="FragmentsAreaError",Object.setPrototypeOf(this,R.prototype)}}class D extends Error{constructor(r,t){super(`Manifest apiVersion mismatch: expected ${r}, received ${t}`),this.expected=r,this.received=t,this.name="FragmentsApiVersionError",Object.setPrototypeOf(this,D.prototype)}}class M extends Error{constructor(r,t,n){super(`Failed to load fragment ${r} from ${t}`),this.fragmentId=r,this.moduleUrl=t,this.cause=n,this.name="FragmentsLoadError",Object.setPrototypeOf(this,M.prototype)}}const b=(...e)=>e.reduce((r,t)=>(r[t]=t,r),{}),Me=b("Fragment","FragmentInstance","Instance","Collection","ArrayItem","Breakpoint","Frame","Image","Text","SolidPaintStyle","CssLink","Variable","ComputedValue","TransformValue","StopColor","LinearGradient","CssChunk","Border","Paint","Link","Interaction","Classname","GoalEvent","MutateEvent","TextHighlight","TextStyleMark","ImagePaint"),Ve=b("auto","fill"),xe=b("None","Solid","Dashed","Dotted"),Re=b("_blank","none"),Le=b("None","Solid","LinearGradient","RadialGradient","ConicGradient","Image"),Be=b("Auto","Contain","Cover"),Ne=b("Min","Center","Max","Stretch","Scale"),De=b("absolute","relative"),Ge=b("Fixed","Hug","Fill","Relative"),qe=b("none","flex"),Ke=b("vertical","horizontal"),Ue=b("start","center","end"),He=b("start","center","end","space-between","space-around"),We=b("none","uppercase","lowercase","capitalize"),Xe=b("none","underline","line-through"),Je=b("loop","appear","hover","tap"),Ye=b("fade","slide","bounce","wiggle","increase"),m=b("Event","String","Link","Boolean","Array","Color","ComponentInstance","Date","Enum","Number","Image","Object","Goal"),Qe=b("normal","nowrap","pre","pre-wrap","pre-line","break-spaces"),Ze=b("visible","hidden","scroll"),ze=b("convert","exists","equals","startWith","endWith","contains","dateBefore","dateAfter","dateBetween","feature","notFeature","gt","gte","lt","lte","convertFromBoolean","negative"),et=b("canvas","document"),tt=b("viewport","parent","fixed"),rt=b("click","mouseover","appear"),H=b("goal","mutate","callback","tracker"),nt=b("AreaScope","InstanceScope","FragmentScope","CollectionScope","CollectionItemScope"),st=b("Global","Fragment"),oe=3,it=Object.freeze(Object.defineProperty({__proto__:null,MAX_SCHEMA_DEPTH:oe,borderType:xe,constrain:Ne,createConstants:b,cssChunkScopeTypes:st,effectName:Ye,effectType:Je,eventMode:H,fragmentGrowingMode:Ve,imagePaintScaleModes:Be,interactions:rt,layerAlign:Ue,layerDirection:Ke,layerDistribute:He,layerMode:qe,linkTarget:Re,nodes:Me,overflow:Ze,paintMode:Le,positionType:De,renderMode:tt,renderTarget:et,scopeTypes:nt,sizing:Ge,textDecorations:Xe,textTransform:We,variableTransforms:ze,variableType:m,whiteSpace:Qe},Symbol.toStringTag,{value:"Module"}));function at(e){return{lang:(e==null?void 0:e.lang)??void 0,message:e==null?void 0:e.message,abortEarly:(e==null?void 0:e.abortEarly)??void 0,abortPipeEarly:(e==null?void 0:e.abortPipeEarly)??void 0}}function ot(e,r){var t;return(t=void 0)==null?void 0:t.get(r)}function J(e){var r,t;const n=typeof e;return n==="string"?`"${e}"`:n==="number"||n==="bigint"||n==="boolean"?`${e}`:n==="object"||n==="function"?(e&&((t=(r=Object.getPrototypeOf(e))==null?void 0:r.constructor)==null?void 0:t.name))??"null":n}function P(e,r,t,n,i){const u=i&&"input"in i?i.input:t.value,s=(i==null?void 0:i.expected)??e.expects??null,o=(i==null?void 0:i.received)??J(u),a={kind:e.kind,type:e.type,input:u,expected:s,received:o,message:`Invalid ${r}: ${s?`Expected ${s} but r`:"R"}eceived ${o}`,requirement:e.requirement,path:i==null?void 0:i.path,issues:i==null?void 0:i.issues,lang:n.lang,abortEarly:n.abortEarly,abortPipeEarly:n.abortPipeEarly},d=e.kind==="schema",h=(i==null?void 0:i.message)??e.message??ot(e.reference,a.lang)??(d?(a.lang,void 0):null)??n.message??(a.lang,void 0);h!==void 0&&(a.message=typeof h=="function"?h(a):h),d&&(t.typed=!1),t.issues?t.issues.push(a):t.issues=[a]}function $(e){return{version:1,vendor:"valibot",validate(r){return e["~run"]({value:r},at())}}}function ut(e,r){return Object.hasOwn(e,r)&&r!=="__proto__"&&r!=="prototype"&&r!=="constructor"}function ue(e,r){const t=[...new Set(e)];return t.length>1?`(${t.join(` ${r} `)})`:t[0]??"never"}function ct(e,r,t){return typeof e.fallback=="function"?e.fallback(r,t):e.fallback}function Y(e,r,t){return typeof e.default=="function"?e.default(r,t):e.default}function Q(e,r){return{kind:"schema",type:"array",reference:Q,expects:"Array",async:!1,item:e,message:r,get"~standard"(){return $(this)},"~run"(t,n){var i;const u=t.value;if(Array.isArray(u)){t.typed=!0,t.value=[];for(let s=0;s<u.length;s++){const o=u[s],a=this.item["~run"]({value:o},n);if(a.issues){const d={type:"array",origin:"value",input:u,key:s,value:o};for(const h of a.issues)h.path?h.path.unshift(d):h.path=[d],(i=t.issues)==null||i.push(h);if(t.issues||(t.issues=a.issues),n.abortEarly){t.typed=!1;break}}a.typed||(t.typed=!1),t.value.push(a.value)}}else P(this,"type",t,n);return t}}}function k(e){return{kind:"schema",type:"boolean",reference:k,expects:"boolean",async:!1,message:e,get"~standard"(){return $(this)},"~run"(r,t){return typeof r.value=="boolean"?r.typed=!0:P(this,"type",r,t),r}}}function Z(e){return{kind:"schema",type:"lazy",reference:Z,expects:"unknown",async:!1,getter:e,get"~standard"(){return $(this)},"~run"(r,t){return this.getter(r.value)["~run"](r,t)}}}function O(e,r){return{kind:"schema",type:"literal",reference:O,expects:J(e),async:!1,literal:e,message:r,get"~standard"(){return $(this)},"~run"(t,n){return t.value===this.literal?t.typed=!0:P(this,"type",t,n),t}}}function ce(e){return{kind:"schema",type:"never",reference:ce,expects:"never",async:!1,message:e,get"~standard"(){return $(this)},"~run"(r,t){return P(this,"type",r,t),r}}}function G(e,r){return{kind:"schema",type:"nullable",reference:G,expects:`(${e.expects} | null)`,async:!1,wrapped:e,default:r,get"~standard"(){return $(this)},"~run"(t,n){return t.value===null&&(this.default!==void 0&&(t.value=Y(this,t,n)),t.value===null)?(t.typed=!0,t):this.wrapped["~run"](t,n)}}}function F(e){return{kind:"schema",type:"number",reference:F,expects:"number",async:!1,message:e,get"~standard"(){return $(this)},"~run"(r,t){return typeof r.value=="number"&&!isNaN(r.value)?r.typed=!0:P(this,"type",r,t),r}}}function w(e,r){return{kind:"schema",type:"object",reference:w,expects:"Object",async:!1,entries:e,message:r,get"~standard"(){return $(this)},"~run"(t,n){var i;const u=t.value;if(u&&typeof u=="object"){t.typed=!0,t.value={};for(const s in this.entries){const o=this.entries[s];if(s in u||(o.type==="exact_optional"||o.type==="optional"||o.type==="nullish")&&o.default!==void 0){const a=s in u?u[s]:Y(o),d=o["~run"]({value:a},n);if(d.issues){const h={type:"object",origin:"value",input:u,key:s,value:a};for(const f of d.issues)f.path?f.path.unshift(h):f.path=[h],(i=t.issues)==null||i.push(f);if(t.issues||(t.issues=d.issues),n.abortEarly){t.typed=!1;break}}d.typed||(t.typed=!1),t.value[s]=d.value}else if(o.fallback!==void 0)t.value[s]=ct(o);else if(o.type!=="exact_optional"&&o.type!=="optional"&&o.type!=="nullish"&&(P(this,"key",t,n,{input:void 0,expected:`"${s}"`,path:[{type:"object",origin:"key",input:u,key:s,value:u[s]}]}),n.abortEarly))break}}else P(this,"type",t,n);return t}}}function l(e,r){return{kind:"schema",type:"optional",reference:l,expects:`(${e.expects} | undefined)`,async:!1,wrapped:e,default:r,get"~standard"(){return $(this)},"~run"(t,n){return t.value===void 0&&(this.default!==void 0&&(t.value=Y(this,t,n)),t.value===void 0)?(t.typed=!0,t):this.wrapped["~run"](t,n)}}}function le(e,r){return{kind:"schema",type:"picklist",reference:le,expects:ue(e.map(J),"|"),async:!1,options:e,message:r,get"~standard"(){return $(this)},"~run"(t,n){return this.options.includes(t.value)?t.typed=!0:P(this,"type",t,n),t}}}function W(e,r,t){return{kind:"schema",type:"record",reference:W,expects:"Object",async:!1,key:e,value:r,message:t,get"~standard"(){return $(this)},"~run"(n,i){var u,s;const o=n.value;if(o&&typeof o=="object"){n.typed=!0,n.value={};for(const a in o)if(ut(o,a)){const d=o[a],h=this.key["~run"]({value:a},i);if(h.issues){const p={type:"object",origin:"key",input:o,key:a,value:d};for(const c of h.issues)c.path=[p],(u=n.issues)==null||u.push(c);if(n.issues||(n.issues=h.issues),i.abortEarly){n.typed=!1;break}}const f=this.value["~run"]({value:d},i);if(f.issues){const p={type:"object",origin:"value",input:o,key:a,value:d};for(const c of f.issues)c.path?c.path.unshift(p):c.path=[p],(s=n.issues)==null||s.push(c);if(n.issues||(n.issues=f.issues),i.abortEarly){n.typed=!1;break}}(!h.typed||!f.typed)&&(n.typed=!1),h.typed&&(n.value[h.value]=f.value)}}else P(this,"type",n,i);return n}}}function j(e){return{kind:"schema",type:"string",reference:j,expects:"string",async:!1,message:e,get"~standard"(){return $(this)},"~run"(r,t){return typeof r.value=="string"?r.typed=!0:P(this,"type",r,t),r}}}function q(){return{kind:"schema",type:"unknown",reference:q,expects:"unknown",async:!1,get"~standard"(){return $(this)},"~run"(e){return e.typed=!0,e}}}function fe(e,r,t){return{kind:"schema",type:"variant",reference:fe,expects:"Object",async:!1,key:e,options:r,message:t,get"~standard"(){return $(this)},"~run"(n,i){const u=n.value;if(u&&typeof u=="object"){let s,o=0,a=this.key,d=[];const h=(f,p)=>{for(const c of f.options){if(c.type==="variant")h(c,new Set(p).add(c.key));else{let y=!0,S=0;for(const g of p){const v=c.entries[g];if(g in u?v["~run"]({typed:!1,value:u[g]},i).issues:v.type!=="exact_optional"&&v.type!=="optional"&&v.type!=="nullish"){y=!1,a!==g&&(o<S||o===S&&g in u&&!(a in u))&&(o=S,a=g,d=[]),a===g&&d.push(c.entries[g].expects);break}S++}if(y){const g=c["~run"]({value:u},i);(!s||!s.typed&&g.typed)&&(s=g)}}if(s&&!s.issues)break}};if(h(this,new Set([this.key])),s)return s;P(this,"type",n,i,{input:u[a],expected:ue(d,"|"),path:[{type:"object",origin:"value",input:u,key:a,value:u[a]}]})}else P(this,"type",n,i);return n}}}const pe=w({name:l(j(),"String"),type:l(O(m.String),m.String),defaultValue:l(j(),""),required:l(k(),!1),editable:l(k(),!0),placeholder:l(j(),""),isTextarea:l(k(),!1),isRich:l(k(),!1)}),de=w({name:l(j(),"Number"),type:l(O(m.Number),m.Number),defaultValue:l(F(),0),required:l(k(),!1),editable:l(k(),!0),min:l(F(),1),max:l(F(),100),step:l(F(),1),displayStepper:l(k(),!0)}),he=w({name:l(j(),"Boolean"),type:l(O(m.Boolean),m.Boolean),defaultValue:l(k(),!1),required:l(k(),!1),editable:l(k(),!0)}),me=w({name:l(j(),"String"),type:l(O(m.Color),m.Color),defaultValue:l(j(),"#000"),required:l(k(),!1),editable:l(k(),!0)}),ye=w({name:l(j(),"Option"),type:l(O(m.Enum),m.Enum),defaultValue:l(j(),""),required:l(k(),!1),editable:l(k(),!0),cases:l(Q(w({id:j(),name:j()})),[])}),ge=w({name:l(j(),"Link"),type:l(O(m.Link),m.Link),defaultValue:l(j(),""),required:l(k(),!1),editable:l(k(),!0)}),ve=w({name:l(j(),"Image"),type:l(O(m.Image),m.Image),defaultValue:l(G(j()),null),required:l(k(),!1),editable:l(k(),!0)});function be(e){return w({name:l(j(),"Object"),type:l(O(m.Object),m.Object),defaultValue:l(W(j(),q()),{}),fields:l(W(j(),Z(()=>Se(e+1))),{}),required:l(k(),!1),editable:l(k(),!0)})}function ke(e){return w({name:l(j(),"Collection"),type:l(O(m.Array),m.Array),defaultValue:l(Q(q()),[]),definition:l(G(Z(()=>Se(e+1))),null),required:l(k(),!1),editable:l(k(),!0)})}function Se(e){return e>oe?ce():fe("type",[pe,de,he,me,ye,ge,ve,be(e),ke(e)])}const lt=w({name:l(j(),"Event"),type:l(O(m.Event),m.Event),mode:l(le(Object.keys(H)),H.callback),defaultValue:l(q(),null),required:l(k(),!1),editable:l(k(),!0)}),ft=be(0),pt=ke(0),dt=w({name:l(j(),"Goal"),type:l(O(m.Goal),m.Goal),defaultValue:l(G(F()),null),required:l(k(),!1),editable:l(k(),!0)});m.Number+"",m.Boolean+"",m.String+"",m.Color+"",m.Event+"",m.Link+"",m.Enum+"",m.Object+"",m.Image+"",m.Array+"",m.Goal+"";m.String+"",m.Link+"",m.Color+"",m.Image+"",m.Date+"",m.Number+"",m.Boolean+"",m.Enum+"",m.Object+"",m.Array+"",m.Event+"",m.Goal+"",m.ComponentInstance+"";const je=(...e)=>e.reduce((r,t)=>(r[t]=t,r),{});function N(e){return e===""||e===null||e===void 0||Array.isArray(e)&&e.length===0}const _=Symbol("sourceCallKey:empty");function X(e){if(N(e))return _;if(Array.isArray(e)){const r=e.map(X).filter(t=>t!==_);return r.length===0?_:["a",r]}if(typeof e=="object"&&e!==null){const r=Object.keys(e).sort().map(t=>[t,X(e[t])]).filter(([,t])=>t!==_);return r.length===0?_:["o",r]}return e}function x(e){const r=X(e.params??{});return JSON.stringify([e.source,e.target,r===_?["o",[]]:r])}function Ee(){const e=new Map,r=new Map,t=new Map;function n(a){var d;(d=r.get(a))==null||d.forEach(h=>h())}return{get:a=>e.get(x(a)),set:(a,d)=>{const h=x(a);e.set(h,Object.freeze({status:"ready",data:d,origin:"host-set"})),n(h)},load:(a,d,h="host-fetch")=>{const f=x(a),p=e.get(f);if((p==null?void 0:p.status)==="ready")return Promise.resolve(p);const c=t.get(f);if(c)return c;const y=Object.freeze({status:"pending"});e.set(f,y),n(f);const S=new Promise(g=>g(d())).then(g=>{if(e.get(f)===y){const A=Object.freeze({status:"ready",data:g,origin:h});return e.set(f,A),n(f),A}const v=e.get(f);return(v==null?void 0:v.status)==="ready"?v:void 0}).catch(g=>{if(console.warn(`[sourceCache] ${a.source}:${a.target}: ${g instanceof Error?g.message:String(g)}`),e.get(f)===y){e.delete(f),n(f);return}const v=e.get(f);return(v==null?void 0:v.status)==="ready"?v:void 0}).finally(()=>{t.delete(f)});return t.set(f,S),S},subscribe:(a,d)=>{const h=x(a);let f=r.get(h);return f||(f=new Set,r.set(h,f)),f.add(d),()=>{f.delete(d),f.size===0&&r.delete(h)}}}}const ht=1e4;function mt(e){if(typeof e!="object"||e===null)return!1;const r=e;return typeof r.ok=="boolean"&&typeof r.status=="number"&&typeof r.json=="function"}function re(e){if(!mt(e))throw new Error("not-a-response");if(!e.ok)throw new Error(`http-${e.status}`);return e.status===204?Promise.resolve(void 0):Promise.resolve().then(()=>e.json()).then(r=>r===null?void 0:r).catch(()=>{throw new Error("invalid-json")})}function yt(e,r){const{url:t,init:n}=e,i=r==null?void 0:r.fetcher;if(i)return Promise.resolve().then(()=>i(t,n)).then(re);const u=new AbortController,s=(r==null?void 0:r.timeout)??ht,o={...n,credentials:"same-origin",signal:u.signal},a=Promise.resolve().then(()=>fetch(t,o)).then(re);return new Promise((d,h)=>{let f=!1;const p=setTimeout(()=>{f||(f=!0,u.abort(),h(new Error("timeout")))},s);a.then(c=>{f||(f=!0,clearTimeout(p),d(c))},c=>{f||(f=!0,clearTimeout(p),h(c))})})}function gt(e){const r=Object.create(null);if(!e)return Object.freeze(r);for(const t of Object.keys(e)){const n=e[t];typeof(n==null?void 0:n.fetch)=="function"?r[t]=n.fetch:((n==null?void 0:n.fetch)!==void 0||(n==null?void 0:n.baseUrl)===void 0)&&console.warn(`[fragments-client] sources.${t}: нет функции fetch — источник пойдёт нашим фетчером`)}return Object.freeze(r)}function vt(e){var t;const r=Object.create(null);if(!e)return Object.freeze(r);for(const n of Object.keys(e)){const i=(t=e[n])==null?void 0:t.baseUrl;i!==void 0&&(r[n]=String(i))}return Object.freeze(r)}const bt={"Content-Type":"application/json"},kt=(e,r={},t={})=>{const{timeout:n}=t,i=new Map;return{get:(o,a={})=>{const d=`${e}${o}`;if(i.has(d))return i.get(d);const h=a.timeout??n,f=h!=null?AbortSignal.timeout(h):void 0,p=typeof r=="function"?r():r,c=fetch(d,{method:"GET",headers:{...bt,...p},signal:f}).then(async y=>{if(!y.ok){let g={};try{g=await y.json()}catch{g={error:{code:"UNKNOWN",message:y.statusText}}}return{ok:!1,errorBody:g,status:y.status}}let S;try{S=await y.json()}catch{S=null}return{ok:!0,data:S,status:y.status}}).finally(()=>{i.delete(d)});return i.set(d,c),c},getAbsolute:o=>{fetch(o,{method:"GET",mode:"no-cors",credentials:"omit",keepalive:!0}).catch(a=>{console.error(a)})}}},St=e=>({sendBeacon:(t,n)=>{if(!t||typeof navigator>"u"||typeof(navigator==null?void 0:navigator.sendBeacon)!="function")return!1;try{return navigator.sendBeacon.bind(navigator)(t,n)}catch(i){return console.error(i),!1}}}),jt=e=>{var a,d,h,f;const r=(a=e==null?void 0:e.env)==null?void 0:a.backendEndpoint,t=(d=e==null?void 0:e.env)==null?void 0:d.apiToken,n=(h=e==null?void 0:e.env)==null?void 0:h.referer;if(!r)return;const i=()=>{var y,S,g;const p=(y=e==null?void 0:e.env)==null?void 0:y.filterOverrides,c={};return t&&(c["X-Api-Key"]=t),n&&(c.Referer=n),p!=null&&p.deviceType&&(c["X-Filter-Device-Type"]=p.deviceType),p!=null&&p.osType&&(c["X-Filter-OS-Type"]=p.osType),p!=null&&p.page&&(c["X-Filter-Page"]=p.page),(S=p==null?void 0:p.geo)!=null&&S.code?c["X-Filter-Geo"]=p.geo.code:p!=null&&p.ip&&(c["X-Filter-IP"]=p.ip),(g=e==null?void 0:e.env)!=null&&g.debug&&(c["X-Debug"]="true"),c},u=(f=e==null?void 0:e.env)==null?void 0:f.timeout,s=kt(r,i,{timeout:u}),o=St();e.$fetch={get:s.get,sendBeacon:o.sendBeacon,getAbsolute:s.getAbsolute}},z=typeof window<"u",ne=new Set,Et=e=>{try{const r=new Image;r.referrerPolicy="no-referrer";const t=()=>{r.removeEventListener("load",t),r.removeEventListener("error",t),ne.delete(r)};r.addEventListener("load",t,{once:!0}),r.addEventListener("error",t,{once:!0}),ne.add(r),r.src=e}catch{}},Ct=(e,r)=>{if(typeof r!="function")return!1;try{return r(e),!0}catch{return!1}},$t=e=>{if(typeof navigator>"u"||typeof navigator.sendBeacon!="function")return!1;try{return navigator.sendBeacon(e)}catch{return!1}},wt=(e,r,t)=>{if(!z)return;const n=e==null?void 0:e.trim();if(n){if(typeof r=="function")try{if(r(n)===!0)return}catch{}$t(n)||Ct(n,t)||Et(n)}},se=je("INIT_SESSION","RELEASE_SESSION","REACH_PROJECT_GOAL"),Ce=e=>{const r=(i,u)=>{var o;if(i!==se.REACH_PROJECT_GOAL||!u)return;const s=new URLSearchParams({goal_id:String(u.goalId),variant_id:String(u.variantId),area_id:String(u.areaId),campaign_id:String(u.campaignId)});(o=e.$fetch)==null||o.get(`/api/metric/goal?${s}`).catch(()=>{})},t=i=>{r(se.REACH_PROJECT_GOAL,i)},n=i=>{var s,o;const u=((s=e.$fetch)==null?void 0:s.getAbsolute)!=null?a=>e.$fetch.getAbsolute(a):void 0;wt(i,(o=e==null?void 0:e.$fetch)==null?void 0:o.sendBeacon,u)};e.$metrics={reachGoal:t,trackAdPixel:n}},K=e=>(e==null?void 0:e.loaded)??Promise.resolve(),$e=e=>`fragment:${e}:css`,Pt=e=>`fragment:${e}:fonts`,we=e=>`chunk:${e}`,Pe="global";function Ot(e){if(!e)return[];const r=[];function t(i){if(i!==null){if(Array.isArray(i)){for(const u of i)t(u);return}r.push(i.fragmentId),i.slots&&n(i.slots)}}function n(i){for(const u of Object.keys(i))t(i[u])}return n(e),r}function Oe(e){return r=>{const t=new Map,n=new Map,i=new Map,u=(a,d)=>{if(t.has(a))return Promise.resolve(t.get(a));if(n.has(a))return n.get(a);i.delete(a);const h=`/api/area/${a}/compiled`,f=(async()=>{var C,V,T,L,te;const p=await r.$fetch.get(h);if(!p.ok){const I=p.errorBody;throw new R(((C=I==null?void 0:I.error)==null?void 0:C.code)??"UNKNOWN",((V=I==null?void 0:I.error)==null?void 0:V.message)??String(p.status),(T=I==null?void 0:I.error)==null?void 0:T.details,p.status)}const c=p.data;if(c.apiVersion!==2)throw new D(2,c.apiVersion);const y=c.globalCssUrl??null,S=y?K(e.inject(y,Pe)):Promise.resolve(),g=Ot(c.slots),v=(L=r.$fragments)==null?void 0:L.populate(c.fragments??[],c.rootFragmentId,g),A=(te=r.$cssChunks)==null?void 0:te.populate(c.cssChunks??{});z&&await Promise.allSettled([v,A,S]);const E={rootFragmentId:c.rootFragmentId,variantId:c.variantId??null,props:c.props??{},projectProperties:c.projectProperties??{},projectBindings:c.projectBindings??{},globalCssUrl:y,fragments:c.fragments??[],slots:c.slots??{},sources:c.sources??{}};return t.set(a,E),E})();return n.set(a,f),f.catch(p=>{i.set(a,p)}).finally(()=>{n.delete(a)}),f},s=a=>{if(t.has(a))return t.get(a);throw n.has(a)?n.get(a):i.has(a)?i.get(a):new R("AREA_NOT_RESOLVED",`Area ${a} not resolved — call $area.resolve(code) before read()`)},o=a=>t.has(a)||i.has(a);r.$area={resolve:u,read:s,has:o}}}const At=Oe({inject:()=>()=>{}});function ie(e){return`fragment/${e}/index.js`}function Ae(e){return`fragment/${e}/styles.css`}function It(e){if(!e.length)return e;let r=0;for(let n=0;n<e.length;n++)r=(r<<5)-r+e.charCodeAt(n),r|=0;const t=Math.abs(r).toString(36);return/^[0-9]/.test(t)?`h${t}`:t}function Tt(e){return`fx-${It(String(e))}`}const Ie=e=>{return null;try{return(void 0)(e)}catch{return null}};function _t(e){return Ie(Ae(e))}const Ft=e=>`fragment:${e}:preload`;function Mt(e,r){if(!z)return()=>{};const t=document.createElement("link");return t.rel="modulepreload",t.href=e,t.setAttribute("data-fragment-key",r),document.head.appendChild(t),()=>t.remove()}function ee(e){const r=(e==null?void 0:e.importer)??(u=>import(u)),t=(e==null?void 0:e.inject)??(()=>()=>{}),n=(e==null?void 0:e.resolveSpecifier)??Ie,i=(e==null?void 0:e.preloadModule)??Mt;return u=>{const s=new Map,o=c=>s.has(c),a=c=>{var y;return(y=s.get(c))==null?void 0:y.schema},d=c=>{var y;return(y=s.get(c))==null?void 0:y.scopeClass},h=c=>{const y=s.get(c);if(y===void 0)throw new M(c,"",new Error(`Fragment ${c} not populated — call populate() before read()`));if(!y.imported)throw new M(c,"",new Error(`Fragment ${c} is a nested element of the cone, not the root — its module resolves via a static import inside the consumer's code, not via $fragments.read()`));if(y.status==="pending")throw y.promise;if(y.status==="error")throw y.error;return y.component},f=(c,y)=>{const S=ie(c);y.imported=!0;const g=r(S).then(v=>(y.status="success",y.component=v.default,y.schema=v.schema,y.scopeClass=typeof v.scopeClass=="string"?v.scopeClass:void 0,v.default),v=>{const A=new M(c,S,v);throw y.status="error",y.error=A,A});y.promise=g,g.catch(()=>{})},p=(c,y,S)=>{const g=[],v=S?new Set(S):void 0,A=E=>E===y||((v==null?void 0:v.has(E))??!1);return c.forEach(E=>{let C=s.get(E);if(C===void 0){C={status:"pending",promise:Promise.resolve(),imported:!1,assetsLoaded:Promise.resolve(),cssCleanups:[]},s.set(E,C);const V=n(Ae(E));if(V){const T=t(V,$e(E));C.cssCleanups.push(T),C.assetsLoaded=K(T)}if(A(E))f(E,C);else{const T=n(ie(E));if(T){const L=i(T,Ft(E));C.cssCleanups.push(L)}}}else A(E)&&!C.imported&&f(E,C);g.push(C.promise,C.assetsLoaded)}),Promise.allSettled(g).then(()=>{})};u.$fragments={has:o,read:h,populate:p,getSchema:a,getScopeClass:d}}}const Vt=ee();function Te(e){return r=>{const t=new Map;r.$cssChunks={has:n=>t.has(n),populate:n=>{const i=[];for(const[u,s]of Object.entries(n)){const o=Number(u);if(!t.has(o))if(s.cssUrl){const a=e.inject(s.cssUrl,we(o));t.set(o,{ref:s,cleanup:a,loaded:K(a)})}else t.set(o,{ref:s,cleanup:()=>{},loaded:Promise.resolve()});i.push(t.get(o).loaded)}return Promise.allSettled(i).then(()=>{})}}}}const xt=je("GlobalManager"),Rt=e=>{const r=()=>()=>{},t=(e==null?void 0:e.inject)??r;return _e.createState({_type:"GlobalManager",initialState:{},skip:[Fe.allowTypes([...Object.keys(it.nodes),...Object.keys(xt)])],plugins:[n=>{n.env={backendEndpoint:(e==null?void 0:e.backendEndpoint)??"https://client-api.fragmentsx.com",apiToken:e==null?void 0:e.apiToken,referer:e==null?void 0:e.referer,timeout:e==null?void 0:e.timeout,filterOverrides:e==null?void 0:e.filterOverrides,debug:e==null?void 0:e.debug}},n=>{n.sourceCache=(e==null?void 0:e.sourceCache)??Ee()},n=>{n.sourceFetchers=gt(e==null?void 0:e.sources),n.sourceBaseUrls=vt(e==null?void 0:e.sources)},n=>{n.setFilters=i=>{var u;n.env={...n.env,filterOverrides:{...(u=n.env)==null?void 0:u.filterOverrides,...i}}}},n=>{(e==null?void 0:e.projectId)!=null&&(n.$project={projectId:e.projectId})},...(e==null?void 0:e.plugins)??[],jt,Ce,Oe({inject:t}),ee({inject:t,resolveSpecifier:e==null?void 0:e.resolveSpecifier,importer:e==null?void 0:e.importer}),Te({inject:t})]})},U=e=>typeof e=="string"||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e),Lt=(e,r)=>`${e}:${r}`;function Bt(e,r){if(!(!e||!Object.prototype.hasOwnProperty.call(e,r)))return e[r]}function B(e){if(N(e))return{kind:"empty"};if(Array.isArray(e)){const r=[];for(const t of e)if(!N(t)){if(!U(t))return{kind:"invalid"};r.push(t)}return r.length===0?{kind:"empty"}:{kind:"array",items:r}}if(typeof e=="object"&&e!==null){const r=[];for(const t of Object.keys(e)){const n=e[t];if(!N(n)){if(!U(n))return{kind:"invalid"};r.push([t,n])}}return r.length===0?{kind:"empty"}:{kind:"object",entries:r}}return U(e)?{kind:"scalar",value:e}:{kind:"invalid"}}function Nt(e,r,t,n){const i=s=>encodeURIComponent(String(s));if(n.kind==="invalid")return null;if(r==="deepObject")return t?n.kind==="empty"?[]:n.kind!=="object"?null:n.entries.map(([s,o])=>({name:`${i(e)}[${i(s)}]`,value:i(o)})):null;const u=r==="form"?",":r==="spaceDelimited"?"%20":r==="pipeDelimited"?"|":null;return u===null?null:n.kind==="empty"?[]:n.kind==="scalar"?[{name:e,value:i(n.value)}]:n.kind==="array"?t?n.items.map(s=>({name:e,value:i(s)})):r==="spaceDelimited"&&n.items.some(s=>/\s/.test(String(s)))?null:[{name:e,value:n.items.map(i).join(u)}]:r!=="form"?null:t?n.entries.map(([s,o])=>({name:s,value:i(o)})):[{name:e,value:n.entries.flatMap(([s,o])=>[i(s),i(o)]).join(u)}]}const Dt=new Set([".","..","%2e",".%2e","%2e.","%2e%2e"]);function Gt(e){return Dt.has(e.toLowerCase())}function qt(e,r,t,n){if(r!=="simple"&&r!=="label"&&r!=="matrix"||n.kind==="invalid"||n.kind==="empty")return null;const i=s=>{const o=String(s);if(Gt(o))return null;let a=encodeURIComponent(o);return r==="label"&&(a=a.replace(/\./g,"%2E")),a};if(n.kind==="scalar"){const s=i(n.value);return s===null?null:r==="simple"?s:r==="label"?`.${s}`:`;${e}=${s}`}if(n.kind==="array"){const s=[];for(const o of n.items){const a=i(o);if(a===null)return null;s.push(a)}return r==="simple"?s.join(","):r==="label"?t?s.map(o=>`.${o}`).join(""):`.${s.join(",")}`:t?s.map(o=>`;${e}=${o}`).join(""):`;${e}=${s.join(",")}`}const u=[];for(const[s,o]of n.entries){const a=i(s),d=i(o);if(a===null||d===null)return null;u.push([a,d])}return r==="simple"?t?u.map(([s,o])=>`${s}=${o}`).join(","):u.flatMap(([s,o])=>[s,o]).join(","):r==="label"?t?u.map(([s,o])=>`.${s}=${o}`).join(""):`.${u.flatMap(([s,o])=>[s,o]).join(",")}`:t?u.map(([s,o])=>`;${s}=${o}`).join(""):`;${e}=${u.flatMap(([s,o])=>[s,o]).join(",")}`}function Kt(e,r,t){if(t.kind==="invalid"||e!=="simple")return null;if(t.kind==="empty")return{present:!1};const n=u=>encodeURIComponent(String(u));let i;return t.kind==="scalar"?i=String(t.value):t.kind==="array"?i=t.items.map(n).join(","):i=r?t.entries.map(([u,s])=>`${n(u)}=${n(s)}`).join(","):t.entries.flatMap(([u,s])=>[n(u),n(s)]).join(","),/[\r\n\0]/.test(i)?null:{present:!0,value:i}}function Ut(e){if(!e||typeof e!="object")return null;const r=e;if(typeof r.method!="string"||!/^[A-Z]+$/.test(r.method)||typeof r.path!="string"||!r.path.startsWith("/")||!r.params||typeof r.params!="object"||Array.isArray(r.params))return null;for(const t of Object.values(r.params)){if(!t||typeof t!="object")return null;const n=t;if(!["path","query","header","cookie"].includes(n.in)||typeof n.style!="string"||typeof n.explode!="boolean")return null}return r}function ae(e){try{return["http:","https:"].includes(new URL(e).protocol)}catch{return!1}}function Ht(e,r,t){let n=r.path;const i={},u=[];let s;try{if(s=new URL(e),!["http:","https:"].includes(s.protocol))return null}catch{return null}for(const a of Object.keys(r.params).sort()){const d=r.params[a],h=Bt(t,a);if(d.in==="query"){const f=B(h);if(f.kind==="invalid")return null;const p=Nt(a,d.style,d.explode,f);if(p===null)return null;for(const c of p)u.push(`${c.name}=${c.value}`)}else if(d.in==="path"){const f=B(h),p=qt(a,d.style,d.explode,f);if(p===null)return null;n=n.split(`{${a}}`).join(p)}else if(d.in==="header"){const f=B(h),p=Kt(d.style,d.explode,f);if(p===null)return null;p.present&&(i[a]=p.value)}else{const f=B(h);if(f.kind==="invalid"||f.kind!=="empty")return null}}if(/\{[^}]+\}/.test(n))return null;if(s.pathname=`${s.pathname.replace(/\/$/,"")}/${n.replace(/^\//,"")}`,u.length>0){const a=s.search?s.search.slice(1):"";s.search=a?`${a}&${u.join("&")}`:u.join("&")}const o={method:r.method,credentials:"same-origin",headers:i};return{url:s.toString(),init:o}}function Wt(e,r,t){if(!e)return{ok:!1,reason:"missing"};if(e.kind!=="openapi")return{ok:!1,reason:"unsupported-kind"};const n=Ut(e.transport);if(!n)return{ok:!1,reason:"invalid-transport"};if(t!==void 0){if(!ae(t))return{ok:!1,reason:"invalid-base-url"}}else if(!ae(e.baseUrl))return{ok:!1,reason:"invalid-transport"};const i=Ht(t??e.baseUrl,n,r);return i?{ok:!0,...i}:{ok:!1,reason:"unsupported-params"}}exports.AREA_GLOBAL_CSS_KEY=Pe;exports.FragmentsApiVersionError=D;exports.FragmentsAreaError=R;exports.FragmentsLoadError=M;exports.areaPlugin=At;exports.createCssChunksCachePlugin=Te;exports.createFragmentsCachePlugin=ee;exports.createFragmentsClient=Rt;exports.createSourceCache=Ee;exports.cssChunkKey=we;exports.fragmentCssKey=$e;exports.fragmentFontsKey=Pt;exports.fragmentsCachePlugin=Vt;exports.globalMetricsPlugin=Ce;exports.readyOf=K;exports.resolveSourceRequest=Wt;exports.resolveStylesHref=_t;exports.runSourceFetch=yt;exports.sourceCallKey=x;exports.sourceTransportKey=Lt;exports.toScopeClassName=Tt;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const tt=require("@graph-state/core"),rt=require("@graph-state/checkers");class H extends Error{constructor(r,t,n,o){super(t),this.code=r,this.details=n,this.status=o,this.name="FragmentsAreaError",Object.setPrototypeOf(this,H.prototype)}}class J extends Error{constructor(r,t){super(`Manifest apiVersion mismatch: expected ${r}, received ${t}`),this.expected=r,this.received=t,this.name="FragmentsApiVersionError",Object.setPrototypeOf(this,J.prototype)}}class G extends Error{constructor(r,t,n){super(`Failed to load fragment ${r} from ${t}`),this.fragmentId=r,this.moduleUrl=t,this.cause=n,this.name="FragmentsLoadError",Object.setPrototypeOf(this,G.prototype)}}const S=(...e)=>e.reduce((r,t)=>(r[t]=t,r),{}),nt=S("Fragment","FragmentInstance","Instance","Collection","ArrayItem","Breakpoint","Frame","Image","Text","SolidPaintStyle","CssLink","Variable","ComputedValue","TransformValue","StopColor","LinearGradient","CssChunk","Border","Paint","Link","Interaction","Classname","GoalEvent","MutateEvent","TextHighlight","TextStyleMark","ImagePaint"),st=S("auto","fill"),it=S("None","Solid","Dashed","Dotted"),ot=S("_blank","none"),at=S("None","Solid","LinearGradient","RadialGradient","ConicGradient","Image"),ut=S("Auto","Contain","Cover"),ct=S("Min","Center","Max","Stretch","Scale"),lt=S("absolute","relative"),ft=S("Fixed","Hug","Fill","Relative"),dt=S("none","flex"),pt=S("vertical","horizontal"),mt=S("start","center","end"),yt=S("start","center","end","space-between","space-around"),ht=S("none","uppercase","lowercase","capitalize"),gt=S("none","underline","line-through"),vt=S("loop","appear","hover","tap"),bt=S("fade","slide","bounce","wiggle","increase"),h=S("Event","String","Link","Boolean","Array","Color","ComponentInstance","Date","Enum","Number","Image","Object","Goal"),kt=S("normal","nowrap","pre","pre-wrap","pre-line","break-spaces"),St=S("visible","hidden","scroll"),Et=S("convert","exists","equals","startWith","endWith","contains","dateBefore","dateAfter","dateBetween","feature","notFeature","gt","gte","lt","lte","convertFromBoolean","negative"),wt=S("canvas","document"),jt=S("viewport","parent","fixed"),xt=S("click","mouseover","appear"),se=S("goal","mutate","callback","tracker"),Tt=S("AreaScope","InstanceScope","FragmentScope","CollectionScope","CollectionItemScope"),Ct=S("Global","Fragment"),Se=3,At=Object.freeze(Object.defineProperty({__proto__:null,MAX_SCHEMA_DEPTH:Se,borderType:it,constrain:ct,createConstants:S,cssChunkScopeTypes:Ct,effectName:bt,effectType:vt,eventMode:se,fragmentGrowingMode:st,imagePaintScaleModes:ut,interactions:xt,layerAlign:mt,layerDirection:pt,layerDistribute:yt,layerMode:dt,linkTarget:ot,nodes:nt,overflow:St,paintMode:at,positionType:lt,renderMode:jt,renderTarget:wt,scopeTypes:Tt,sizing:ft,textDecorations:gt,textTransform:ht,variableTransforms:Et,variableType:h,whiteSpace:kt},Symbol.toStringTag,{value:"Module"}));function It(e){return{lang:(e==null?void 0:e.lang)??void 0,message:e==null?void 0:e.message,abortEarly:(e==null?void 0:e.abortEarly)??void 0,abortPipeEarly:(e==null?void 0:e.abortPipeEarly)??void 0}}function $t(e,r){var t;return(t=void 0)==null?void 0:t.get(r)}function ue(e){var r,t;const n=typeof e;return n==="string"?`"${e}"`:n==="number"||n==="bigint"||n==="boolean"?`${e}`:n==="object"||n==="function"?(e&&((t=(r=Object.getPrototypeOf(e))==null?void 0:r.constructor)==null?void 0:t.name))??"null":n}function M(e,r,t,n,o){const l=o&&"input"in o?o.input:t.value,s=(o==null?void 0:o.expected)??e.expects??null,u=(o==null?void 0:o.received)??ue(l),i={kind:e.kind,type:e.type,input:l,expected:s,received:u,message:`Invalid ${r}: ${s?`Expected ${s} but r`:"R"}eceived ${u}`,requirement:e.requirement,path:o==null?void 0:o.path,issues:o==null?void 0:o.issues,lang:n.lang,abortEarly:n.abortEarly,abortPipeEarly:n.abortPipeEarly},p=e.kind==="schema",d=(o==null?void 0:o.message)??e.message??$t(e.reference,i.lang)??(p?(i.lang,void 0):null)??n.message??(i.lang,void 0);d!==void 0&&(i.message=typeof d=="function"?d(i):d),p&&(t.typed=!1),t.issues?t.issues.push(i):t.issues=[i]}function O(e){return{version:1,vendor:"valibot",validate(r){return e["~run"]({value:r},It())}}}function _t(e,r){return Object.hasOwn(e,r)&&r!=="__proto__"&&r!=="prototype"&&r!=="constructor"}function Ee(e,r){const t=[...new Set(e)];return t.length>1?`(${t.join(` ${r} `)})`:t[0]??"never"}function Ot(e,r,t){return typeof e.fallback=="function"?e.fallback(r,t):e.fallback}function ce(e,r,t){return typeof e.default=="function"?e.default(r,t):e.default}function le(e,r){return{kind:"schema",type:"array",reference:le,expects:"Array",async:!1,item:e,message:r,get"~standard"(){return O(this)},"~run"(t,n){var o;const l=t.value;if(Array.isArray(l)){t.typed=!0,t.value=[];for(let s=0;s<l.length;s++){const u=l[s],i=this.item["~run"]({value:u},n);if(i.issues){const p={type:"array",origin:"value",input:l,key:s,value:u};for(const d of i.issues)d.path?d.path.unshift(p):d.path=[p],(o=t.issues)==null||o.push(d);if(t.issues||(t.issues=i.issues),n.abortEarly){t.typed=!1;break}}i.typed||(t.typed=!1),t.value.push(i.value)}}else M(this,"type",t,n);return t}}}function E(e){return{kind:"schema",type:"boolean",reference:E,expects:"boolean",async:!1,message:e,get"~standard"(){return O(this)},"~run"(r,t){return typeof r.value=="boolean"?r.typed=!0:M(this,"type",r,t),r}}}function fe(e){return{kind:"schema",type:"lazy",reference:fe,expects:"unknown",async:!1,getter:e,get"~standard"(){return O(this)},"~run"(r,t){return this.getter(r.value)["~run"](r,t)}}}function V(e,r){return{kind:"schema",type:"literal",reference:V,expects:ue(e),async:!1,literal:e,message:r,get"~standard"(){return O(this)},"~run"(t,n){return t.value===this.literal?t.typed=!0:M(this,"type",t,n),t}}}function we(e){return{kind:"schema",type:"never",reference:we,expects:"never",async:!1,message:e,get"~standard"(){return O(this)},"~run"(r,t){return M(this,"type",r,t),r}}}function Z(e,r){return{kind:"schema",type:"nullable",reference:Z,expects:`(${e.expects} | null)`,async:!1,wrapped:e,default:r,get"~standard"(){return O(this)},"~run"(t,n){return t.value===null&&(this.default!==void 0&&(t.value=ce(this,t,n)),t.value===null)?(t.typed=!0,t):this.wrapped["~run"](t,n)}}}function D(e){return{kind:"schema",type:"number",reference:D,expects:"number",async:!1,message:e,get"~standard"(){return O(this)},"~run"(r,t){return typeof r.value=="number"&&!isNaN(r.value)?r.typed=!0:M(this,"type",r,t),r}}}function P(e,r){return{kind:"schema",type:"object",reference:P,expects:"Object",async:!1,entries:e,message:r,get"~standard"(){return O(this)},"~run"(t,n){var o;const l=t.value;if(l&&typeof l=="object"){t.typed=!0,t.value={};for(const s in this.entries){const u=this.entries[s];if(s in l||(u.type==="exact_optional"||u.type==="optional"||u.type==="nullish")&&u.default!==void 0){const i=s in l?l[s]:ce(u),p=u["~run"]({value:i},n);if(p.issues){const d={type:"object",origin:"value",input:l,key:s,value:i};for(const a of p.issues)a.path?a.path.unshift(d):a.path=[d],(o=t.issues)==null||o.push(a);if(t.issues||(t.issues=p.issues),n.abortEarly){t.typed=!1;break}}p.typed||(t.typed=!1),t.value[s]=p.value}else if(u.fallback!==void 0)t.value[s]=Ot(u);else if(u.type!=="exact_optional"&&u.type!=="optional"&&u.type!=="nullish"&&(M(this,"key",t,n,{input:void 0,expected:`"${s}"`,path:[{type:"object",origin:"key",input:l,key:s,value:l[s]}]}),n.abortEarly))break}}else M(this,"type",t,n);return t}}}function m(e,r){return{kind:"schema",type:"optional",reference:m,expects:`(${e.expects} | undefined)`,async:!1,wrapped:e,default:r,get"~standard"(){return O(this)},"~run"(t,n){return t.value===void 0&&(this.default!==void 0&&(t.value=ce(this,t,n)),t.value===void 0)?(t.typed=!0,t):this.wrapped["~run"](t,n)}}}function je(e,r){return{kind:"schema",type:"picklist",reference:je,expects:Ee(e.map(ue),"|"),async:!1,options:e,message:r,get"~standard"(){return O(this)},"~run"(t,n){return this.options.includes(t.value)?t.typed=!0:M(this,"type",t,n),t}}}function ie(e,r,t){return{kind:"schema",type:"record",reference:ie,expects:"Object",async:!1,key:e,value:r,message:t,get"~standard"(){return O(this)},"~run"(n,o){var l,s;const u=n.value;if(u&&typeof u=="object"){n.typed=!0,n.value={};for(const i in u)if(_t(u,i)){const p=u[i],d=this.key["~run"]({value:i},o);if(d.issues){const f={type:"object",origin:"key",input:u,key:i,value:p};for(const c of d.issues)c.path=[f],(l=n.issues)==null||l.push(c);if(n.issues||(n.issues=d.issues),o.abortEarly){n.typed=!1;break}}const a=this.value["~run"]({value:p},o);if(a.issues){const f={type:"object",origin:"value",input:u,key:i,value:p};for(const c of a.issues)c.path?c.path.unshift(f):c.path=[f],(s=n.issues)==null||s.push(c);if(n.issues||(n.issues=a.issues),o.abortEarly){n.typed=!1;break}}(!d.typed||!a.typed)&&(n.typed=!1),d.typed&&(n.value[d.value]=a.value)}}else M(this,"type",n,o);return n}}}function x(e){return{kind:"schema",type:"string",reference:x,expects:"string",async:!1,message:e,get"~standard"(){return O(this)},"~run"(r,t){return typeof r.value=="string"?r.typed=!0:M(this,"type",r,t),r}}}function z(){return{kind:"schema",type:"unknown",reference:z,expects:"unknown",async:!1,get"~standard"(){return O(this)},"~run"(e){return e.typed=!0,e}}}function xe(e,r,t){return{kind:"schema",type:"variant",reference:xe,expects:"Object",async:!1,key:e,options:r,message:t,get"~standard"(){return O(this)},"~run"(n,o){const l=n.value;if(l&&typeof l=="object"){let s,u=0,i=this.key,p=[];const d=(a,f)=>{for(const c of a.options){if(c.type==="variant")d(c,new Set(f).add(c.key));else{let y=!0,b=0;for(const v of f){const g=c.entries[v];if(v in l?g["~run"]({typed:!1,value:l[v]},o).issues:g.type!=="exact_optional"&&g.type!=="optional"&&g.type!=="nullish"){y=!1,i!==v&&(u<b||u===b&&v in l&&!(i in l))&&(u=b,i=v,p=[]),i===v&&p.push(c.entries[v].expects);break}b++}if(y){const v=c["~run"]({value:l},o);(!s||!s.typed&&v.typed)&&(s=v)}}if(s&&!s.issues)break}};if(d(this,new Set([this.key])),s)return s;M(this,"type",n,o,{input:l[i],expected:Ee(p,"|"),path:[{type:"object",origin:"value",input:l,key:i,value:l[i]}]})}else M(this,"type",n,o);return n}}}const Te=P({name:m(x(),"String"),type:m(V(h.String),h.String),defaultValue:m(x(),""),required:m(E(),!1),editable:m(E(),!0),placeholder:m(x(),""),isTextarea:m(E(),!1),isRich:m(E(),!1)}),Ce=P({name:m(x(),"Number"),type:m(V(h.Number),h.Number),defaultValue:m(D(),0),required:m(E(),!1),editable:m(E(),!0),min:m(D(),1),max:m(D(),100),step:m(D(),1),displayStepper:m(E(),!0)}),Ae=P({name:m(x(),"Boolean"),type:m(V(h.Boolean),h.Boolean),defaultValue:m(E(),!1),required:m(E(),!1),editable:m(E(),!0)}),Ie=P({name:m(x(),"String"),type:m(V(h.Color),h.Color),defaultValue:m(x(),"#000"),required:m(E(),!1),editable:m(E(),!0)}),$e=P({name:m(x(),"Option"),type:m(V(h.Enum),h.Enum),defaultValue:m(x(),""),required:m(E(),!1),editable:m(E(),!0),cases:m(le(P({id:x(),name:x()})),[])}),_e=P({name:m(x(),"Link"),type:m(V(h.Link),h.Link),defaultValue:m(x(),""),required:m(E(),!1),editable:m(E(),!0)}),Oe=P({name:m(x(),"Image"),type:m(V(h.Image),h.Image),defaultValue:m(Z(x()),null),required:m(E(),!1),editable:m(E(),!0)});function Pe(e){return P({name:m(x(),"Object"),type:m(V(h.Object),h.Object),defaultValue:m(ie(x(),z()),{}),fields:m(ie(x(),fe(()=>Ve(e+1))),{}),required:m(E(),!1),editable:m(E(),!0)})}function Me(e){return P({name:m(x(),"Collection"),type:m(V(h.Array),h.Array),defaultValue:m(le(z()),[]),definition:m(Z(fe(()=>Ve(e+1))),null),required:m(E(),!1),editable:m(E(),!0)})}function Ve(e){return e>Se?we():xe("type",[Te,Ce,Ae,Ie,$e,_e,Oe,Pe(e),Me(e)])}const Pt=P({name:m(x(),"Event"),type:m(V(h.Event),h.Event),mode:m(je(Object.keys(se)),se.callback),defaultValue:m(z(),null),required:m(E(),!1),editable:m(E(),!0)}),Mt=Pe(0),Vt=Me(0),Ft=P({name:m(x(),"Goal"),type:m(V(h.Goal),h.Goal),defaultValue:m(Z(D()),null),required:m(E(),!1),editable:m(E(),!0)});h.Number+"",h.Boolean+"",h.String+"",h.Color+"",h.Event+"",h.Link+"",h.Enum+"",h.Object+"",h.Image+"",h.Array+"",h.Goal+"";h.String+"",h.Link+"",h.Color+"",h.Image+"",h.Date+"",h.Number+"",h.Boolean+"",h.Enum+"",h.Object+"",h.Array+"",h.Event+"",h.Goal+"",h.ComponentInstance+"";const Nt=(...e)=>e.reduce((r,t)=>(r[t]=t,r),{});function Q(e){return e===""||e===null||e===void 0||Array.isArray(e)&&e.length===0}const R=Symbol("sourceCallKey:empty");function oe(e){if(Q(e))return R;if(Array.isArray(e)){const r=e.map(oe).filter(t=>t!==R);return r.length===0?R:["a",r]}if(typeof e=="object"&&e!==null){const r=Object.keys(e).sort().map(t=>[t,oe(e[t])]).filter(([,t])=>t!==R);return r.length===0?R:["o",r]}return e}function X(e){const r=oe(e.params??{});return JSON.stringify([e.source,e.target,r===R?["o",[]]:r])}function Fe(){const e=new Map,r=new Map,t=new Map;function n(i){var p;(p=r.get(i))==null||p.forEach(d=>d())}return{get:i=>e.get(X(i)),set:(i,p)=>{const d=X(i);e.set(d,Object.freeze({status:"ready",data:p,origin:"host-set"})),n(d)},load:(i,p,d="host-fetch")=>{const a=X(i),f=e.get(a);if((f==null?void 0:f.status)==="ready")return Promise.resolve(f);const c=t.get(a);if(c)return c;const y=Object.freeze({status:"pending"});e.set(a,y),n(a);const b=new Promise(v=>v(p())).then(v=>{if(e.get(a)===y){const $=Object.freeze({status:"ready",data:v,origin:d});return e.set(a,$),n(a),$}const g=e.get(a);return(g==null?void 0:g.status)==="ready"?g:void 0}).catch(v=>{if(console.warn(`[sourceCache] ${i.source}:${i.target}: ${v instanceof Error?v.message:String(v)}`),e.get(a)===y){e.delete(a),n(a);return}const g=e.get(a);return(g==null?void 0:g.status)==="ready"?g:void 0}).finally(()=>{t.delete(a)});return t.set(a,b),b},subscribe:(i,p)=>{const d=X(i);let a=r.get(d);return a||(a=new Set,r.set(d,a)),a.add(p),()=>{a.delete(p),a.size===0&&r.delete(d)}}}}function de(){if(typeof crypto<"u"){if(typeof crypto.randomUUID=="function")return crypto.randomUUID();if(typeof crypto.getRandomValues=="function"){const e=crypto.getRandomValues(new Uint8Array(16));e[6]=e[6]&15|64,e[8]=e[8]&63|128;const r=Array.from(e,t=>t.toString(16).padStart(2,"0")).join("");return`${r.slice(0,8)}-${r.slice(8,12)}-${r.slice(12,16)}-${r.slice(16,20)}-${r.slice(20)}`}}return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{const r=Math.random()*16|0;return(e==="x"?r:r&3|8).toString(16)})}const Ne="fx_uid",Ue=/^[A-Za-z0-9_-]{16,64}$/,Ut=7776e3;function Be(e){return Ue.test(e)}let B=null;function Bt(e){try{return new URL(e,location.href).origin!==location.origin}catch{return!1}}function Lt(){for(const e of document.cookie.split(";")){const[r,...t]=e.trim().split("=");if(r!==Ne)continue;const n=t.join("=");return Ue.test(n)?n:null}return null}function Rt(e){const r=location.protocol==="https:"?"; Secure":"";try{document.cookie=`${Ne}=${e}; Path=/; Max-Age=${Ut}; SameSite=Lax${r}`}catch{}}function Dt(e,r){if(typeof document>"u"||typeof location>"u")return null;if((r==null?void 0:r.visitorId)!==void 0&&Be(r.visitorId))return r.visitorId;if(!Bt(e))return null;if(B!==null)return B;const t=(r==null?void 0:r.persist)===!1?null:Lt();return t!==null?(B=t,B):(B=de(),(r==null?void 0:r.persist)!==!1&&Rt(B),B)}const Gt=1e4;function Kt(e){if(typeof e!="object"||e===null)return!1;const r=e;return typeof r.ok=="boolean"&&typeof r.status=="number"&&typeof r.json=="function"}function he(e){if(!Kt(e))throw new Error("not-a-response");if(!e.ok)throw new Error(`http-${e.status}`);return e.status===204?Promise.resolve(void 0):Promise.resolve().then(()=>e.json()).then(r=>r===null?void 0:r).catch(()=>{throw new Error("invalid-json")})}function qt(e,r){const{url:t,init:n}=e,o=r==null?void 0:r.fetcher;if(o)return Promise.resolve().then(()=>o(t,n)).then(he);const l=new AbortController,s=(r==null?void 0:r.timeout)??Gt,u={...n,credentials:"same-origin",signal:l.signal},i=Promise.resolve().then(()=>fetch(t,u)).then(he);return new Promise((p,d)=>{let a=!1;const f=setTimeout(()=>{a||(a=!0,l.abort(),d(new Error("timeout")))},s);i.then(c=>{a||(a=!0,clearTimeout(f),p(c))},c=>{a||(a=!0,clearTimeout(f),d(c))})})}function Xt(e){const r=Object.create(null);if(!e)return Object.freeze(r);for(const t of Object.keys(e)){const n=e[t];typeof(n==null?void 0:n.fetch)=="function"?r[t]=n.fetch:((n==null?void 0:n.fetch)!==void 0||(n==null?void 0:n.baseUrl)===void 0)&&console.warn(`[fragments-client] sources.${t}: нет функции fetch — источник пойдёт нашим фетчером`)}return Object.freeze(r)}function Ht(e){var t;const r=Object.create(null);if(!e)return Object.freeze(r);for(const n of Object.keys(e)){const o=(t=e[n])==null?void 0:t.baseUrl;o!==void 0&&(r[n]=String(o))}return Object.freeze(r)}const Wt={"Content-Type":"application/json"},Yt=(e,r={},t={})=>{const{timeout:n}=t,o=new Map;return{get:(s,u={})=>{const i=`${e}${s}`;if(o.has(i))return o.get(i);const p=u.timeout??n,d=p!=null?AbortSignal.timeout(p):void 0,a=typeof r=="function"?r():r,f=fetch(i,{method:"GET",headers:{...Wt,...a},signal:d}).then(async c=>{if(!c.ok){let b={};try{b=await c.json()}catch{b={error:{code:"UNKNOWN",message:c.statusText}}}return{ok:!1,errorBody:b,status:c.status}}let y;try{y=await c.json()}catch{y=null}return{ok:!0,data:y,status:c.status}}).finally(()=>{o.delete(i)});return o.set(i,f),f}}},Qt=e=>{var u,i,p,d;const r=(u=e==null?void 0:e.env)==null?void 0:u.backendEndpoint,t=(i=e==null?void 0:e.env)==null?void 0:i.apiToken,n=(p=e==null?void 0:e.env)==null?void 0:p.referer;if(!r)return;const o=()=>{var y,b,v,g,$;const a=(y=e==null?void 0:e.env)==null?void 0:y.filterOverrides,f={};t&&(f["X-Api-Key"]=t);const c=Dt(r,{visitorId:(b=e==null?void 0:e.env)==null?void 0:b.visitorId,persist:(v=e==null?void 0:e.env)==null?void 0:v.persistVisitorId});return c&&(f["X-Client-Id"]=c),n&&(f.Referer=n),a!=null&&a.deviceType&&(f["X-Filter-Device-Type"]=a.deviceType),a!=null&&a.osType&&(f["X-Filter-OS-Type"]=a.osType),a!=null&&a.page&&(f["X-Filter-Page"]=a.page),(g=a==null?void 0:a.geo)!=null&&g.code?f["X-Filter-Geo"]=a.geo.code:a!=null&&a.ip&&(f["X-Filter-IP"]=a.ip),($=e==null?void 0:e.env)!=null&&$.debug&&(f["X-Debug"]="true"),f},l=(d=e==null?void 0:e.env)==null?void 0:d.timeout,s=Yt(r,o,{timeout:l});e.$fetch={get:s.get}},Le=50,Jt=24576;function pe(e){var i,p,d,a;const{type:r,experiment:t,viewId:n,goalKey:o,eventId:l}=e,s={t:r,a:t.areaId,c:t.campaignId,vr:t.variantId,l:t.label,u:t.visitorId,i:l??de(),co:((i=t.seg)==null?void 0:i.country)??"",dv:((p=t.seg)==null?void 0:p.device)??0,os:((d=t.seg)==null?void 0:d.os)??0,br:((a=t.seg)==null?void 0:a.browser)??""};return t.uidSource&&(s.s=t.uidSource),r!=="request"&&n&&(s.w=n),r==="goal"&&o&&(s.g=o),(e.wd===1||typeof navigator<"u"&&navigator.webdriver===!0)&&(s.wd=1),s}function me(e,r){return JSON.stringify({v:1,key:e,events:r.map(t=>"t"in t?t:pe(t))})}const Zt=60*1024;function Re(e={}){let r=0;return{send:async(n,o)=>{var i,p;const l=e.fetchImpl??globalThis.fetch,s=new TextEncoder().encode(o).length,u=r+s<=Zt;u&&(r+=s);try{const d=await l(n,{method:"POST",headers:{"Content-Type":"text/plain;charset=UTF-8"},credentials:"omit",keepalive:u,body:o});try{await d.text()}catch{}if(d.ok)return{outcome:"ok",status:d.status};if(d.status===429||d.status>=500){let a;const f=(p=(i=d.headers)==null?void 0:i.get)==null?void 0:p.call(i,"Retry-After");if(f){const c=Number.parseInt(f,10);Number.isFinite(c)&&c>=0&&(a=c*1e3)}return{outcome:"retry",status:d.status,...a!==void 0?{retryAfterMs:a}:{}}}return{outcome:"drop",status:d.status}}catch(d){return console.error(d),{outcome:"retry"}}finally{u&&(r-=s)}}}}const ge="fx_events_outbox_v1",zt=128*1024,er=864e5,tr=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function rr(){try{if(typeof globalThis<"u"&&globalThis.localStorage)return globalThis.localStorage}catch{}return null}function L(e,r){if(!e||typeof e!="object")return!1;const t=e;return!(typeof t.id!="string"||!t.id||!tr.test(t.id)||typeof t.key!="string"||!t.key||!t.event||typeof t.event!="object"||t.event.i!==t.id||typeof t.createdAt!="number"||!Number.isFinite(t.createdAt)||r-t.createdAt>er||typeof t.attempts!="number"||!Number.isFinite(t.attempts))}function ve(e){let r=e.slice(-200);for(;r.length>0;){const t=JSON.stringify({v:1,entries:r});if(new TextEncoder().encode(t).length<=zt)return r;r=r.slice(1)}return r}function De(e={}){const r=e.storage!==void 0?e.storage:rr(),t=e.now??Date.now;let n=[];const o=()=>{if(!r)return null;try{const a=r.getItem(ge);if(!a)return[];const f=JSON.parse(a);if(!f||f.v!==1||!Array.isArray(f.entries))return[];const c=t();return f.entries.filter(y=>L(y,c))}catch{return[]}},l=a=>{if(r)try{r.setItem(ge,JSON.stringify({v:1,entries:a}))}catch{}},s=o();return s!==null&&(n=s),{append:a=>{const f=Array.isArray(a)?a:[a];if(f.length===0)return;const c=t(),y=o(),b=y!==null?y:n,v=new Map;for(const k of b)L(k,c)&&v.set(k.id,k);for(const k of f){const T={id:k.id,key:k.key,event:k.event,createdAt:k.createdAt??c,attempts:k.attempts??0};L(T,c)&&v.set(T.id,T)}const g=Array.from(v.values()),$=ve(g);n=$,l($)},pending:()=>{const a=t(),f=o();if(f!==null){const c=new Set(f.map(b=>b.id)),y=n.filter(b=>!c.has(b.id)&&L(b,a));return ve([...f,...y])}return n.filter(c=>L(c,a))},remove:a=>{if(a.length===0)return;const f=new Set(a),c=t(),y=o(),v=(y!==null?y:n).filter(g=>!f.has(g.id)&&L(g,c));n=v,l(v)},bumpAttempts:a=>{if(a.length===0)return;const f=new Set(a),c=t(),y=o(),v=(y!==null?y:n).filter(g=>L(g,c)).map(g=>f.has(g.id)?{...g,attempts:g.attempts+1}:g);n=v,l(v)}}}const Ge=20,Ke=5e3;function re(){return typeof document<"u"&&!!document.prerendering}function nr(e,r){const t=[];let n=[];for(const o of r){if(n.length===0){n.push(o);continue}if(n.length>=Le){t.push(n),n=[o];continue}const l=[...n,o],s=me(e,l.map(i=>i.event));new TextEncoder().encode(s).length<=Jt?n.push(o):(t.push(n),n=[o])}return n.length>0&&t.push(n),t}function qe(e={}){const r=e.outbox??De(),t=e.now??Date.now,n=e.random??Math.random,o=e.maxBatch??Ge,l=e.flushIntervalMs??Ke,s=e.transport??(e.send?{send:async(w,A)=>{const I=JSON.parse(A);return e.send(I.events),{outcome:"ok",status:204}}}:Re()),u=e.resolveTarget??(()=>({url:"/v1/events",key:"default-key"}));let i=[],p=[];const d=new Set;let a=null,f=null,c=0,y=0,b=!1,v=!1;const g=w=>{if(w!==void 0&&w>=0)return w;const A=Math.max(0,y-1),I=Math.min(6e4,1e3*Math.pow(2,A)),j=n()*.6-.3;return Math.max(0,Math.round(I*(1+j)))},$=w=>{const A=g(w),I=t()+A;if(f){I<c&&(clearTimeout(f),c=I,f=setTimeout(()=>{f=null,_()},Math.max(0,c-t())));return}c=I,f=setTimeout(()=>{f=null,_()},A)},k=()=>{b||typeof window>"u"||typeof document>"u"||(b=!0,document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&_()}),window.addEventListener("pagehide",()=>{_()}))},T=()=>{if(v||typeof document>"u")return;v=!0;const w=()=>{if(document.removeEventListener("prerenderingchange",w),p.length>0){const A=u(),I=t();for(const C of p){const j={id:C.wire.i,key:(A==null?void 0:A.key)??"",event:C.wire,createdAt:I,attempts:0};i.push(j),j.key&&r.append(j)}p=[]}k(),_()};document.addEventListener("prerenderingchange",w)},_=()=>{if(re())return;a&&(clearTimeout(a),a=null);const w=u();if(!w)return;const A=new Map;for(const j of r.pending())A.set(j.id,j);for(const j of i)A.has(j.id)||(!j.key&&w.key&&(j.key=w.key,r.append(j)),A.set(j.id,j));const I=[];for(const j of A.values())d.has(j.id)||I.push(j);if(I.length===0)return;const C=new Map;for(const j of I){const U=j.key||w.key,K=C.get(U)??[];K.push(j),C.set(U,K)}for(const[j,U]of C.entries()){const K=nr(j,U);for(const W of K){const q=W.map(N=>N.id);for(const N of q)d.add(N);const et=me(j,W.map(N=>N.event));s.send(w.url,et).then(N=>{for(const te of q)d.delete(te);N.outcome==="ok"||N.outcome==="drop"?(r.remove(q),i=i.filter(te=>!q.includes(te.id)),y=0):N.outcome==="retry"&&(r.bumpAttempts(q),y++,$(N.retryAfterMs))})}}},F=w=>{const A=w.wd===1||typeof navigator<"u"&&navigator.webdriver===!0,I=pe({...w,eventId:w.eventId??de(),...A?{wd:1}:{}});if(re()){T(),p.push({event:w,wire:I});return}k();const C=u(),j=t(),U={id:I.i,key:(C==null?void 0:C.key)??"",event:I,createdAt:j,attempts:0};if(i.push(U),U.key&&r.append(U),i.filter(W=>!d.has(W.id)).length>=o){_();return}a||(a=setTimeout(()=>{a=null,_()},l))};return re()?T():r.pending().length>0&&(k(),_()),{enqueue:F,flush:_}}const Xe=e=>{var u;const r=Re(),t=De(((u=e==null?void 0:e.env)==null?void 0:u.persistVisitorId)===!1?{storage:null}:void 0),o=qe({transport:r,outbox:t,resolveTarget:()=>{var d,a;const i=(d=e==null?void 0:e.env)==null?void 0:d.apiToken,p=(a=e==null?void 0:e.env)==null?void 0:a.backendEndpoint;return!i||!p?null:{url:`${p.replace(/\/+$/,"")}/v1/events`,key:i}}}),l=i=>{o.enqueue(i)},s=()=>{o.flush()};e.$events={emit:l,flush:s}},ee=e=>(e==null?void 0:e.loaded)??Promise.resolve(),He=e=>`fragment:${e}:css`,sr=e=>`fragment:${e}:fonts`,We=e=>`chunk:${e}`,Ye="global";let ae=typeof window<"u";function ir(e){if(!e)return[];const r=[];function t(o){if(o!==null){if(Array.isArray(o)){for(const l of o)t(l);return}r.push(o.fragmentId),o.slots&&n(o.slots)}}function n(o){for(const l of Object.keys(o))t(o[l])}return n(e),r}function Qe(e){return r=>{const t=new Map,n=new Map,o=new Map,l=(i,p)=>{if(t.has(i))return Promise.resolve(t.get(i));if(n.has(i))return n.get(i);o.delete(i);const d=`/api/area/${i}/compiled`,a=(async()=>{var T,_,F,w,A,I;const f=await r.$fetch.get(d);if(!f.ok){const C=f.errorBody;throw new H(((T=C==null?void 0:C.error)==null?void 0:T.code)??"UNKNOWN",((_=C==null?void 0:C.error)==null?void 0:_.message)??String(f.status),(F=C==null?void 0:C.error)==null?void 0:F.details,f.status)}const c=f.data;if(c.apiVersion!==2)throw new J(2,c.apiVersion);const y=c.globalCssUrl??null,b=y?ee(e.inject(y,Ye)):Promise.resolve(),v=ir(c.slots),g=(w=r.$fragments)==null?void 0:w.populate(c.fragments??[],c.rootFragmentId,v),$=(A=r.$cssChunks)==null?void 0:A.populate(c.cssChunks??{});ae&&await Promise.allSettled([g,$,b]);const k={rootFragmentId:c.rootFragmentId,variantId:c.variantId??null,experiment:c.experiment??null,props:c.props??{},projectProperties:c.projectProperties??{},projectBindings:c.projectBindings??{},globalCssUrl:y,fragments:c.fragments??[],slots:c.slots??{},sources:c.sources??{}};return t.set(i,k),ae&&k.experiment&&((I=r.$events)==null||I.emit({type:"request",experiment:k.experiment})),k})();return n.set(i,a),a.catch(f=>{o.set(i,f)}).finally(()=>{n.delete(i)}),a},s=i=>{if(t.has(i))return t.get(i);throw n.has(i)?n.get(i):o.has(i)?o.get(i):new H("AREA_NOT_RESOLVED",`Area ${i} not resolved — call $area.resolve(code) before read()`)},u=i=>t.has(i)||o.has(i);r.$area={resolve:l,read:s,has:u}}}const or=Qe({inject:()=>()=>{}});function be(e){return`fragment/${e}/index.js`}function Je(e){return`fragment/${e}/styles.css`}function ar(e){if(!e.length)return e;let r=0;for(let n=0;n<e.length;n++)r=(r<<5)-r+e.charCodeAt(n),r|=0;const t=Math.abs(r).toString(36);return/^[0-9]/.test(t)?`h${t}`:t}function ur(e){return`fx-${ar(String(e))}`}const Ze=e=>{return null;try{return(void 0)(e)}catch{return null}};function cr(e){return Ze(Je(e))}const lr=e=>`fragment:${e}:preload`;function fr(e,r){if(!ae)return()=>{};const t=document.createElement("link");return t.rel="modulepreload",t.href=e,t.setAttribute("data-fragment-key",r),document.head.appendChild(t),()=>t.remove()}function ye(e){const r=(e==null?void 0:e.importer)??(l=>import(l)),t=(e==null?void 0:e.inject)??(()=>()=>{}),n=(e==null?void 0:e.resolveSpecifier)??Ze,o=(e==null?void 0:e.preloadModule)??fr;return l=>{const s=new Map,u=c=>s.has(c),i=c=>{var y;return(y=s.get(c))==null?void 0:y.schema},p=c=>{var y;return(y=s.get(c))==null?void 0:y.scopeClass},d=c=>{const y=s.get(c);if(y===void 0)throw new G(c,"",new Error(`Fragment ${c} not populated — call populate() before read()`));if(!y.imported)throw new G(c,"",new Error(`Fragment ${c} is a nested element of the cone, not the root — its module resolves via a static import inside the consumer's code, not via $fragments.read()`));if(y.status==="pending")throw y.promise;if(y.status==="error")throw y.error;return y.component},a=(c,y)=>{const b=be(c);y.imported=!0;const v=r(b).then(g=>(y.status="success",y.component=g.default,y.schema=g.schema,y.scopeClass=typeof g.scopeClass=="string"?g.scopeClass:void 0,g.default),g=>{const $=new G(c,b,g);throw y.status="error",y.error=$,$});y.promise=v,v.catch(()=>{})},f=(c,y,b)=>{const v=[],g=b?new Set(b):void 0,$=k=>k===y||((g==null?void 0:g.has(k))??!1);return c.forEach(k=>{let T=s.get(k);if(T===void 0){T={status:"pending",promise:Promise.resolve(),imported:!1,assetsLoaded:Promise.resolve(),cssCleanups:[]},s.set(k,T);const _=n(Je(k));if(_){const F=t(_,He(k));T.cssCleanups.push(F),T.assetsLoaded=ee(F)}if($(k))a(k,T);else{const F=n(be(k));if(F){const w=o(F,lr(k));T.cssCleanups.push(w)}}}else $(k)&&!T.imported&&a(k,T);v.push(T.promise,T.assetsLoaded)}),Promise.allSettled(v).then(()=>{})};l.$fragments={has:u,read:d,populate:f,getSchema:i,getScopeClass:p}}}const dr=ye();function ze(e){return r=>{const t=new Map;r.$cssChunks={has:n=>t.has(n),populate:n=>{const o=[];for(const[l,s]of Object.entries(n)){const u=Number(l);if(!t.has(u))if(s.cssUrl){const i=e.inject(s.cssUrl,We(u));t.set(u,{ref:s,cleanup:i,loaded:ee(i)})}else t.set(u,{ref:s,cleanup:()=>{},loaded:Promise.resolve()});o.push(t.get(u).loaded)}return Promise.allSettled(o).then(()=>{})}}}}const pr=Nt("GlobalManager"),mr=e=>{const r=()=>()=>{},t=(e==null?void 0:e.inject)??r;return tt.createState({_type:"GlobalManager",initialState:{},skip:[rt.allowTypes([...Object.keys(At.nodes),...Object.keys(pr)])],plugins:[n=>{e!=null&&e.debug&&e.visitorId!==void 0&&!Be(e.visitorId)&&console.warn("[fragments-client] visitorId проигнорирован: нужны 16–64 символа A-Za-z0-9_-"),n.env={backendEndpoint:(e==null?void 0:e.backendEndpoint)??"https://client-api.fragmentsx.com",apiToken:e==null?void 0:e.apiToken,referer:e==null?void 0:e.referer,timeout:e==null?void 0:e.timeout,filterOverrides:e==null?void 0:e.filterOverrides,debug:e==null?void 0:e.debug,visitorId:e==null?void 0:e.visitorId,persistVisitorId:e==null?void 0:e.persistVisitorId}},n=>{n.sourceCache=(e==null?void 0:e.sourceCache)??Fe()},n=>{n.sourceFetchers=Xt(e==null?void 0:e.sources),n.sourceBaseUrls=Ht(e==null?void 0:e.sources)},n=>{n.setFilters=o=>{var l;n.env={...n.env,filterOverrides:{...(l=n.env)==null?void 0:l.filterOverrides,...o}}}},n=>{(e==null?void 0:e.projectId)!=null&&(n.$project={projectId:e.projectId})},...(e==null?void 0:e.plugins)??[],Qt,Xe,Qe({inject:t}),ye({inject:t,resolveSpecifier:e==null?void 0:e.resolveSpecifier,importer:e==null?void 0:e.importer}),ze({inject:t})]})},ne=e=>typeof e=="string"||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e),yr=(e,r)=>`${e}:${r}`;function hr(e,r){if(!(!e||!Object.prototype.hasOwnProperty.call(e,r)))return e[r]}function Y(e){if(Q(e))return{kind:"empty"};if(Array.isArray(e)){const r=[];for(const t of e)if(!Q(t)){if(!ne(t))return{kind:"invalid"};r.push(t)}return r.length===0?{kind:"empty"}:{kind:"array",items:r}}if(typeof e=="object"&&e!==null){const r=[];for(const t of Object.keys(e)){const n=e[t];if(!Q(n)){if(!ne(n))return{kind:"invalid"};r.push([t,n])}}return r.length===0?{kind:"empty"}:{kind:"object",entries:r}}return ne(e)?{kind:"scalar",value:e}:{kind:"invalid"}}function gr(e,r,t,n){const o=s=>encodeURIComponent(String(s));if(n.kind==="invalid")return null;if(r==="deepObject")return t?n.kind==="empty"?[]:n.kind!=="object"?null:n.entries.map(([s,u])=>({name:`${o(e)}[${o(s)}]`,value:o(u)})):null;const l=r==="form"?",":r==="spaceDelimited"?"%20":r==="pipeDelimited"?"|":null;return l===null?null:n.kind==="empty"?[]:n.kind==="scalar"?[{name:e,value:o(n.value)}]:n.kind==="array"?t?n.items.map(s=>({name:e,value:o(s)})):r==="spaceDelimited"&&n.items.some(s=>/\s/.test(String(s)))?null:[{name:e,value:n.items.map(o).join(l)}]:r!=="form"?null:t?n.entries.map(([s,u])=>({name:s,value:o(u)})):[{name:e,value:n.entries.flatMap(([s,u])=>[o(s),o(u)]).join(l)}]}const vr=new Set([".","..","%2e",".%2e","%2e.","%2e%2e"]);function br(e){return vr.has(e.toLowerCase())}function kr(e,r,t,n){if(r!=="simple"&&r!=="label"&&r!=="matrix"||n.kind==="invalid"||n.kind==="empty")return null;const o=s=>{const u=String(s);if(br(u))return null;let i=encodeURIComponent(u);return r==="label"&&(i=i.replace(/\./g,"%2E")),i};if(n.kind==="scalar"){const s=o(n.value);return s===null?null:r==="simple"?s:r==="label"?`.${s}`:`;${e}=${s}`}if(n.kind==="array"){const s=[];for(const u of n.items){const i=o(u);if(i===null)return null;s.push(i)}return r==="simple"?s.join(","):r==="label"?t?s.map(u=>`.${u}`).join(""):`.${s.join(",")}`:t?s.map(u=>`;${e}=${u}`).join(""):`;${e}=${s.join(",")}`}const l=[];for(const[s,u]of n.entries){const i=o(s),p=o(u);if(i===null||p===null)return null;l.push([i,p])}return r==="simple"?t?l.map(([s,u])=>`${s}=${u}`).join(","):l.flatMap(([s,u])=>[s,u]).join(","):r==="label"?t?l.map(([s,u])=>`.${s}=${u}`).join(""):`.${l.flatMap(([s,u])=>[s,u]).join(",")}`:t?l.map(([s,u])=>`;${s}=${u}`).join(""):`;${e}=${l.flatMap(([s,u])=>[s,u]).join(",")}`}function Sr(e,r,t){if(t.kind==="invalid"||e!=="simple")return null;if(t.kind==="empty")return{present:!1};const n=l=>encodeURIComponent(String(l));let o;return t.kind==="scalar"?o=String(t.value):t.kind==="array"?o=t.items.map(n).join(","):o=r?t.entries.map(([l,s])=>`${n(l)}=${n(s)}`).join(","):t.entries.flatMap(([l,s])=>[n(l),n(s)]).join(","),/[\r\n\0]/.test(o)?null:{present:!0,value:o}}function Er(e){if(!e||typeof e!="object")return null;const r=e;if(typeof r.method!="string"||!/^[A-Z]+$/.test(r.method)||typeof r.path!="string"||!r.path.startsWith("/")||!r.params||typeof r.params!="object"||Array.isArray(r.params))return null;for(const t of Object.values(r.params)){if(!t||typeof t!="object")return null;const n=t;if(!["path","query","header","cookie"].includes(n.in)||typeof n.style!="string"||typeof n.explode!="boolean")return null}return r}function ke(e){try{return["http:","https:"].includes(new URL(e).protocol)}catch{return!1}}function wr(e,r,t){let n=r.path;const o={},l=[];let s;try{if(s=new URL(e),!["http:","https:"].includes(s.protocol))return null}catch{return null}for(const i of Object.keys(r.params).sort()){const p=r.params[i],d=hr(t,i);if(p.in==="query"){const a=Y(d);if(a.kind==="invalid")return null;const f=gr(i,p.style,p.explode,a);if(f===null)return null;for(const c of f)l.push(`${c.name}=${c.value}`)}else if(p.in==="path"){const a=Y(d),f=kr(i,p.style,p.explode,a);if(f===null)return null;n=n.split(`{${i}}`).join(f)}else if(p.in==="header"){const a=Y(d),f=Sr(p.style,p.explode,a);if(f===null)return null;f.present&&(o[i]=f.value)}else{const a=Y(d);if(a.kind==="invalid"||a.kind!=="empty")return null}}if(/\{[^}]+\}/.test(n))return null;if(s.pathname=`${s.pathname.replace(/\/$/,"")}/${n.replace(/^\//,"")}`,l.length>0){const i=s.search?s.search.slice(1):"";s.search=i?`${i}&${l.join("&")}`:l.join("&")}const u={method:r.method,credentials:"same-origin",headers:o};return{url:s.toString(),init:u}}function jr(e,r,t){if(!e)return{ok:!1,reason:"missing"};if(e.kind!=="openapi")return{ok:!1,reason:"unsupported-kind"};const n=Er(e.transport);if(!n)return{ok:!1,reason:"invalid-transport"};if(t!==void 0){if(!ke(t))return{ok:!1,reason:"invalid-base-url"}}else if(!ke(e.baseUrl))return{ok:!1,reason:"invalid-transport"};const o=wr(t??e.baseUrl,n,r);return o?{ok:!0,...o}:{ok:!1,reason:"unsupported-params"}}exports.AREA_GLOBAL_CSS_KEY=Ye;exports.EVENT_QUEUE_FLUSH_MS=Ke;exports.EVENT_QUEUE_MAX_BATCH=Ge;exports.FragmentsApiVersionError=J;exports.FragmentsAreaError=H;exports.FragmentsLoadError=G;exports.INGEST_BATCH_LIMIT=Le;exports.areaPlugin=or;exports.buildExperimentBatchBody=me;exports.createCssChunksCachePlugin=ze;exports.createEventQueue=qe;exports.createFragmentsCachePlugin=ye;exports.createFragmentsClient=mr;exports.createSourceCache=Fe;exports.cssChunkKey=We;exports.experimentEventsPlugin=Xe;exports.fragmentCssKey=He;exports.fragmentFontsKey=sr;exports.fragmentsCachePlugin=dr;exports.readyOf=ee;exports.resolveSourceRequest=jr;exports.resolveStylesHref=cr;exports.runSourceFetch=qt;exports.sourceCallKey=X;exports.sourceTransportKey=yr;exports.toScopeClassName=ur;exports.toWireEvent=pe;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Public barrel @fragmentsx/fragments-client — полный public API (Plan 02).
|
|
3
3
|
*
|
|
4
|
-
* Экспортирует: types, errors, createFragmentsClient, $area, $fragments, $cssChunks,
|
|
4
|
+
* Экспортирует: types, errors, createFragmentsClient, $area, $fragments, $cssChunks, events.
|
|
5
5
|
*
|
|
6
6
|
* quick 260830-rvp (INT-08): тип-реэкспорт из `./namespaces` (обычный модуль, не
|
|
7
7
|
* `.d.ts`) вместо трёхслэшевой директивы на `declarations.d.ts` — та гарантировала
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* оттуда — потребитель (runtime-react, playgrounds) получает аугментацию вместе
|
|
13
13
|
* с пакетом. Гейт на факт сборки — `src/dist-declarations.test.ts`.
|
|
14
14
|
*/
|
|
15
|
-
export type { AreaResolveResponse, AreaSourceTransport, CssChunkRef, ResolvedValue, ResolvedSlotValue, ResolvedSlotPosition, FieldId, } from './types';
|
|
15
|
+
export type { AreaResolveResponse, AreaSourceTransport, AreaExperiment, AreaExperimentSeg, CssChunkRef, ResolvedValue, ResolvedSlotValue, ResolvedSlotPosition, FieldId, } from './types';
|
|
16
16
|
export type { FragmentsEnv, FilterOverrides, AreaNamespace, FetchNamespace, CssChunksNamespace, } from './namespaces';
|
|
17
17
|
export { FragmentsAreaError, FragmentsApiVersionError, FragmentsLoadError, } from './errors';
|
|
18
18
|
export { createFragmentsClient } from './createFragmentsClient';
|
|
@@ -23,7 +23,8 @@ export { resolveStylesHref, toScopeClassName } from './$fragments';
|
|
|
23
23
|
export { createCssChunksCachePlugin } from './$cssChunks';
|
|
24
24
|
export { areaPlugin } from './$area';
|
|
25
25
|
export type { AreaResolveResult } from './$area';
|
|
26
|
-
export {
|
|
26
|
+
export { experimentEventsPlugin, createEventQueue, EVENT_QUEUE_MAX_BATCH, EVENT_QUEUE_FLUSH_MS, toWireEvent, buildExperimentBatchBody, INGEST_BATCH_LIMIT, } from './events';
|
|
27
|
+
export type { ExperimentEvent, WireExperimentEvent } from './events';
|
|
27
28
|
export { readyOf, fragmentCssKey, fragmentFontsKey, cssChunkKey, AREA_GLOBAL_CSS_KEY, } from './stylesheet';
|
|
28
29
|
export type { StylesheetHandle, InjectFn } from './stylesheet';
|
|
29
30
|
export { createSourceCache } from './sources/createSourceCache';
|