@fragmentsx/fragments-client 0.2.0-dev-20260910143938 → 0.2.0-dev-20260922090625

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import { Plugin } from '@graph-state/core';
2
- import { ResolvedValue } from '../types';
2
+ import { ResolvedValue, ResolvedSlotPosition } from '../types';
3
3
  import { InjectFn } from '../stylesheet';
4
4
  /**
5
5
  * Тип resolved value из $area.resolve — subset manifest без fragment refs.
@@ -37,6 +37,19 @@ export interface AreaResolveResult {
37
37
  * `null` — backend не отдаёт global reset.
38
38
  */
39
39
  globalCssUrl: string | null;
40
+ /**
41
+ * Phase 105 план 105-05 (D-105-11): конус — список id (root + reachable),
42
+ * корень первым. Всегда массив: редукция нормализует отсутствие поля у
43
+ * backend'а в `[]`, тот же приём, что у `props`/`projectProperties` выше.
44
+ */
45
+ fragments: number[];
46
+ /**
47
+ * Phase 106 (D-106-01/SLOT-04/план 05): дырки шаблона, заполненные данными
48
+ * варианта — одиночная либо список (`ResolvedSlotPosition`). Всегда
49
+ * объект: редукция нормализует отсутствие поля у backend'а в `{}`, тот же
50
+ * приём, что у `props` выше.
51
+ */
52
+ slots: Record<string, ResolvedSlotPosition>;
40
53
  }
41
54
  /**
42
55
  * Публичный тип $area namespace.
@@ -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,EAAuB,aAAa,EAAE,MAAM,UAAU,CAAC;AACnE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAe9C;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;;;;OAQG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;;;;OAMG;IACH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACrC;;;;;OAKG;IACH,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACjD;;;OAGG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;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,CA2JnE;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,MAAqD,CAAC"}
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,EAAuB,aAAa,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACzF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AA+D9C;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;;;;OAQG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;;;;OAMG;IACH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACrC;;;;;OAKG;IACH,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACjD;;;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;CAC7C;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,CA0KnE;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,MAAqD,CAAC"}
@@ -1,16 +1,70 @@
1
1
  import { Plugin } from '@graph-state/core';
2
- import { FragmentRef } from '../types';
3
2
  import { InjectFn } from '../stylesheet';
3
+ /**
4
+ * Строит module-спецификатор для нативного `import()` из `fragmentId`
5
+ * (Phase 105 D-105-14). ЕДИНСТВЕННЫЙ источник формы на стороне рантайма —
6
+ * зеркалит `toWireFragmentSpecifier` из `@fragmentsx/fragment-compiler`
7
+ * (пакет сборки, эмит) побайтово; расхождение дало бы два разных URL на
8
+ * один и тот же `id` — браузер создал бы ДВА экземпляра модуля молча
9
+ * (дедуп `$fragments` идёт по `id`, дедуп браузера — по разрешённому URL,
10
+ * это разные уровни). `fragments-client` — рантаймовый пакет и намеренно НЕ
11
+ * зависит от `@fragmentsx/fragment-compiler` (сборочный, тяжёлый babel/TS) —
12
+ * поэтому источник формы не общий модуль, а тест побайтового равенства
13
+ * (`wireFormParity.test.ts`), сверяющий обе функции на представительных id.
14
+ *
15
+ * Корень грузится ТЕМ ЖЕ путём, что и вложенный (D-105-14): карта импорта
16
+ * площадки обязательна для исполнения артефакта в любом случае — тело
17
+ * артефакта несёт голый `import { jsx } from "react/jsx-runtime"`, поэтому
18
+ * без карты корень скачается, но не выполнится. Зависимость от карты — не
19
+ * цена этого решения, она уже была уплачена.
20
+ */
21
+ export declare function toModuleSpecifier(id: number): string;
22
+ /**
23
+ * Спецификатор собственных стилей фрагмента — тот же префикс карты, что у
24
+ * модуля, другой хвост. Адрес стилей выведен из адреса модуля САМИМ браузером
25
+ * (см. `resolveStylesHref`), поэтому разъехаться они не могут: синхронизировать
26
+ * нечего, в отличие от прежнего `ref.cssUrl`, который надо было не забыть
27
+ * положить в манифест (обход конуса вложенных его не видел вовсе — исходная
28
+ * причина, по которой вложенный фрагмент приезжал без стилей).
29
+ */
30
+ export declare function toStylesSpecifier(id: number): string;
31
+ /**
32
+ * Формула имени scope-класса фрагмента от его id (D-105-16) — третья формула
33
+ * рядом с `toModuleSpecifier`/`toStylesSpecifier`. Рендер (`FragmentRenderer`,
34
+ * `@fragmentsx/runtime-react`) зовёт её для КАЖДОГО id конуса, собирая список
35
+ * классов одной обёртки — независимого вычисления в дереве больше не два
36
+ * (рантайм vs компилятор), а одно, продублированное побайт-равным тестом.
37
+ */
38
+ export declare function toScopeClassName(id: number): string;
39
+ /**
40
+ * DI seam для резолва спецификатора в абсолютный URL — сейм, ставший
41
+ * необходимым Phase 105 планом 105-05: перевод адреса стилей на формулу
42
+ * (Phase 105 D-105-15) оставил тесты пакета красными под `vitest` — там нет
43
+ * карты импорта площадки, `import.meta.resolve` не существует, и реализация
44
+ * "поверх штатного резолва" без DI была бы непроверяемой. Производственная
45
+ * сборка получает реальный резолв (default), тест передаёт подставную.
46
+ */
47
+ export type SpecifierResolveFn = (specifier: string) => string | null;
48
+ /**
49
+ * Публичный резолвер адреса стилей — БЕЗ DI, реальный резолв всегда. Вызывает
50
+ * рендер (`FragmentRenderer`, `@fragmentsx/runtime-react`) напрямую, минуя
51
+ * `state.$fragments` — преамбула стилей строит адрес для каждого id конуса
52
+ * тем же способом, каким его строит ранняя инъекция ниже.
53
+ */
54
+ export declare function resolveStylesHref(id: number): string | null;
4
55
  /**
5
56
  * DI importer seam — signature для production и тестового importer'а.
6
- * Default: `(url) => import(url)` (native dynamic import).
57
+ * Принимает module-СПЕЦИФИКАТОР (`toModuleSpecifier(id)`) — с D-105-14
58
+ * загрузка идёт по специфкатору, который резолвит карта импорта площадки.
59
+ * Default: `(specifier) => import(specifier)` (native dynamic import) —
60
+ * сам импортёр не изменился, изменилось только то, ЧТО ему передают.
7
61
  * Test: `vi.fn().mockResolvedValue({ default: TestComponent })`.
8
62
  *
9
63
  * Index signature допускает произвольные named exports модуля (Phase 68 D-10) —
10
64
  * в частности `schema` рукописного TSX-артефакта — без приведения через `any`
11
65
  * в месте использования.
12
66
  */
13
- type Importer = (moduleUrl: string) => Promise<{
67
+ export type SpecifierImporter = (specifier: string) => Promise<{
14
68
  default: unknown;
15
69
  [key: string]: unknown;
16
70
  }>;
@@ -20,16 +74,30 @@ type Importer = (moduleUrl: string) => Promise<{
20
74
  export interface CreateFragmentsCachePluginOpts {
21
75
  /**
22
76
  * Optional importer DI seam.
23
- * Default — native dynamic `import(url)` (production).
77
+ * Default — native dynamic `import(specifier)` (production), специфкатор
78
+ * строит `toModuleSpecifier(id)` (D-105-14).
24
79
  * Передайте `vi.fn()` mock в тестах (WARNING-2 resolution).
25
80
  */
26
- importer?: Importer;
81
+ importer?: SpecifierImporter;
27
82
  /**
28
83
  * DI seam для ранней DOM-инъекции собственного CSS фрагмента (quick-260831-etq,
29
- * D-5): вызывается ровно один раз на новый id с непустым `ref.cssUrl`.
84
+ * D-5): вызывается ровно один раз на новый id конуса.
30
85
  * Default — no-op cleanup без канала готовности (SSR/test).
31
86
  */
32
87
  inject?: InjectFn;
88
+ /**
89
+ * DI seam для резолва спецификатора в URL (Phase 105 план 105-05) —
90
+ * условие проверяемости формулы адреса. Default — реальный резолв
91
+ * (`import.meta.resolve`), тест передаёт подставную.
92
+ */
93
+ resolveSpecifier?: SpecifierResolveFn;
94
+ /**
95
+ * DI seam для предзагрузки модулей вложенных элементов конуса (COMP-08).
96
+ * Default — реальная `<link rel="modulepreload">` инъекция, а не no-op:
97
+ * в отличие от CSS (где реализацию поставляет `runtime-react` ради канала
98
+ * `loaded`), предзагрузке координация не нужна.
99
+ */
100
+ preloadModule?: (href: string, key: string) => () => void;
33
101
  }
34
102
  /**
35
103
  * Публичный тип $fragments namespace — используется downstream (runtime-react).
@@ -39,35 +107,50 @@ export interface FragmentsCacheNamespace {
39
107
  /** Проверяет наличие id в кэше (любой status). */
40
108
  has: (id: number) => boolean;
41
109
  /**
42
- * Suspense protocol read:
110
+ * Suspense protocol read — ТОЛЬКО для id с реально запущенным `import()`
111
+ * (роль «корень» текущей или прошлой области НА ЭТОЙ СТРАНИЦЕ, либо роль
112
+ * «узел слота», Phase 106, D-106-01 — третья роль рядом с «корнем»):
43
113
  * - cache hit "success" → sync ComponentType
44
114
  * - "pending" → throws inflight Promise
45
115
  * - "error" → throws FragmentsLoadError
46
116
  * - id отсутствует → throws FragmentsLoadError("not populated")
117
+ * - id есть в кэше, но только как вложенный элемент КОДА (импорт не
118
+ * стартовал) → throws FragmentsLoadError с отдельным сообщением: модуль
119
+ * такого вложенного резолвится статическим импортом из кода
120
+ * артефакта-потребителя, не через этот реестр.
47
121
  */
48
122
  read: (id: number) => unknown;
49
123
  /**
50
- * Populate кэша параллельными `import(moduleUrl)` вызовами.
51
- * Idempotent: уже cached id → skip.
52
- * Cross-area dedup natural — один import() per unique id.
124
+ * Populate кэша конусом (Phase 105 план 105-05): список id (root + все
125
+ * достижимые) плюс id корня. Корень импортируется реальным `import()`;
126
+ * остальные элементы конуса браузер тянет сам статическим импортом изнутри
127
+ * модуля-потребителя — реестр только предзагружает их (`modulepreload`,
128
+ * COMP-08) и инжектирует CSS. Idempotent на уровне id, а не роли: id,
129
+ * пришедший вложенным в одной области и корневым в другой на той же
130
+ * странице (D-105-11), получает импорт РОВНО один раз — на первый раз,
131
+ * когда он пришёл корнем (в любом порядке).
53
132
  *
54
133
  * quick-260831-etq (D-2/D-3/D-5): возвращает `Promise<void>`, который
55
134
  * settles, когда settled все промисы импорта модулей и все `assetsLoaded`
56
- * (готовность собственного CSS и шрифтов) по ВСЕМ id из `refs` — включая
57
- * id, уже закэшированные ранее (cross-area dedup). Отклонённый импорт/CSS
135
+ * (готовность собственного CSS) по ВСЕМ id из `cone` — включая id, уже
136
+ * закэшированные ранее (cross-area dedup). Отклонённый импорт/CSS
58
137
  * не отвергает возвращённый промис (`allSettled`) — потребители,
59
138
  * игнорирующие возврат, продолжают работать как раньше.
60
- */
61
- populate: (refs: Record<number, FragmentRef>) => Promise<void>;
62
- /**
63
- * Sync getter для FragmentRef metadata (cssUrl, fontsUrl и т.д.).
64
- * Используется Area composition для FragmentStylesheet preamble injection
65
- * (BLOCKER-1 resolution — SPEC AC #11/#12).
66
139
  *
67
- * @param id - fragment id
68
- * @returns FragmentRef если id populate'ен, undefined если нет
140
+ * Phase 106 (D-106-01/D-106-07): третий необязательный аргумент `slotIds` —
141
+ * множество id, для которых реестр обязан запустить настоящий `import()`
142
+ * так же, как для корня. Модуль фрагмента, попавшего в слот, НЕ
143
+ * импортируется статически ни одним артефактом конуса (его выбрал
144
+ * менеджер данными) — обычная ветка «вложенный, только предзагрузка»
145
+ * оставила бы его недостижимым для `read()`. Id, пришедший сначала
146
+ * вложенным по коду, а потом слотом (в любом порядке populate), получает
147
+ * импорт ровно один раз — та же промоция, что у роли «корень» (D-105-11).
148
+ *
149
+ * @param cone - список id конуса, корень первым (форма манифеста, план 105-05)
150
+ * @param rootFragmentId - id корневого фрагмента текущей области
151
+ * @param slotIds - id узлов слотов (Phase 106) — тоже получают реальный import()
69
152
  */
70
- getRef: (id: number) => FragmentRef | undefined;
153
+ populate: (cone: number[], rootFragmentId: number, slotIds?: Iterable<number>) => Promise<void>;
71
154
  /**
72
155
  * Sync getter для named export `schema` уже загруженного модуля.
73
156
  *
@@ -79,7 +162,7 @@ export interface FragmentsCacheNamespace {
79
162
  * @param id - fragment id
80
163
  * @returns schema если модуль populate'ен, загружен успешно и содержит named
81
164
  * export `schema`; undefined во всех остальных случаях (id не в кэше,
82
- * status "pending"/"error", либо модуль без `schema`)
165
+ * status "pending"/"error", импорт не стартован, либо модуль без `schema`)
83
166
  */
84
167
  getSchema: (id: number) => unknown | undefined;
85
168
  /**
@@ -91,6 +174,12 @@ export interface FragmentsCacheNamespace {
91
174
  * сериализуется в манифест — это завело бы второй источник истины и класс
92
175
  * ошибок «поле есть, путь его не наполняет» (quick-260828-khw).
93
176
  *
177
+ * С плана 105-05 обёртка рантайма (`FragmentRenderer`) НЕ читает этот
178
+ * геттер для класса конуса — она строит список классов формулой
179
+ * (`toScopeClassName`) по id, потому что вложенные элементы конуса не
180
+ * загружаются через этот реестр вовсе и их named export ему недоступен.
181
+ * Геттер остаётся публичным API кэша (диагностика/иные потребители).
182
+ *
94
183
  * @param id - fragment id
95
184
  * @returns scopeClass если модуль populate'ен, загружен успешно и содержит
96
185
  * named export `scopeClass` строкового типа; undefined во всех остальных
@@ -107,7 +196,7 @@ export interface FragmentsCacheNamespace {
107
196
  *
108
197
  * @example
109
198
  * // Production (createFragmentsClient):
110
- * createFragmentsClient({ plugins: [createFragmentsCachePlugin()] })
199
+ * createFragmentsCachePlugin({ inject })
111
200
  *
112
201
  * // В тестах:
113
202
  * const spy = vi.fn().mockResolvedValue({ default: TestComponent });
@@ -123,5 +212,4 @@ export declare function createFragmentsCachePlugin(opts?: CreateFragmentsCachePl
123
212
  * createFragmentsClient({ plugins: [fragmentsCachePlugin] })
124
213
  */
125
214
  export declare const fragmentsCachePlugin: Plugin;
126
- export {};
127
215
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/$fragments/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAG9C;;;;;;;;GAQG;AACH,KAAK,QAAQ,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC,CAAC;AAE7F;;GAEG;AACH,MAAM,WAAW,8BAA8B;IAC7C;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB;;;;OAIG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAC;CACnB;AA6CD;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,kDAAkD;IAClD,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IAC7B;;;;;;OAMG;IACH,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9B;;;;;;;;;;;OAWG;IACH,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D;;;;;;;OAOG;IACH,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,WAAW,GAAG,SAAS,CAAC;IAChD;;;;;;;;;;;;OAYG;IACH,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,GAAG,SAAS,CAAC;IAC/C;;;;;;;;;;;;;;OAcG;IACH,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CACnD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,CAAC,EAAE,8BAA8B,GACpC,MAAM,CAuJR;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAqC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/$fragments/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAI9C;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEpD;AA2BD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;AAyBtE;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE3D;AA8BD;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC,CAAC;AAE7G;;GAEG;AACH,MAAM,WAAW,8BAA8B;IAC7C;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B;;;;OAIG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,kBAAkB,CAAC;IACtC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,IAAI,CAAC;CAC3D;AAoDD;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,kDAAkD;IAClD,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IAC7B;;;;;;;;;;;;OAYG;IACH,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,QAAQ,EAAE,CACR,IAAI,EAAE,MAAM,EAAE,EACd,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,KACvB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB;;;;;;;;;;;;OAYG;IACH,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,GAAG,SAAS,CAAC;IAC/C;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CACnD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,CAAC,EAAE,8BAA8B,GACpC,MAAM,CAmMR;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAqC,CAAC"}
@@ -3,8 +3,11 @@
3
3
  * Verifies Suspense protocol, idempotency, cross-area dedup через DI importer (WARNING-2 resolution).
4
4
  * Test 8 — real-import smoke без DI для validation factory wiring.
5
5
  *
6
- * quick-260831-etq: гейт BLOCKER-4 на канале ранней DOM-инъекции CSS/шрифтов —
7
- * см. describe-блок в конце файла.
6
+ * Phase 105 план 105-05 (D-105-15/16): манифест схлопнут до списка id конуса —
7
+ * `populate(cone, rootFragmentId)` заменил `populate(refs: Record<id, FragmentRef>)`.
8
+ * Корень импортируется реальным `import()`, вложенные элементы конуса получают
9
+ * только предзагрузку (`modulepreload`, COMP-08) и CSS — их модуль тянет
10
+ * браузер сам статическим импортом изнутри кода потребителя.
8
11
  */
9
12
  export {};
10
13
  //# sourceMappingURL=index.test.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/$fragments/index.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/$fragments/index.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scopeClassParity.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scopeClassParity.test.d.ts","sourceRoot":"","sources":["../../src/$fragments/scopeClassParity.test.ts"],"names":[],"mappings":""}
@@ -1,6 +1,7 @@
1
1
  import { Plugin } from '@graph-state/core';
2
2
  import { FilterOverrides } from './namespaces';
3
3
  import { InjectFn } from './stylesheet';
4
+ import { SpecifierImporter, SpecifierResolveFn } from './$fragments';
4
5
  /**
5
6
  * Options для createFragmentsClient.
6
7
  *
@@ -19,6 +20,23 @@ export interface Options {
19
20
  * Production: `inject = injectStylesheet` из `@fragmentsx/runtime-react`.
20
21
  */
21
22
  inject?: InjectFn;
23
+ /**
24
+ * Phase 105 план 105-05 (D-105-15): DI seam для резолва спецификатора в
25
+ * URL — сейм, ставший необходимым переводом адреса стилей/предзагрузки
26
+ * модуля на формулу (`import.meta.resolve`). Default (не заданo) — реальный
27
+ * резолв внутри `createFragmentsCachePlugin`; проброс сюда существует
28
+ * ТОЛЬКО ради тестов factory (`createFragmentsClient.test.ts`) — под
29
+ * vitest карты импорта нет, и без DI-passthrough end-to-end проверка
30
+ * формулы адреса через полную фабрику была бы недостижима.
31
+ */
32
+ resolveSpecifier?: SpecifierResolveFn;
33
+ /**
34
+ * DI seam для загрузки модуля по спецификатору.
35
+ * Default (не задан) — нативный динамический import внутри
36
+ * `createFragmentsCachePlugin`; проброс существует ради проверяемости
37
+ * factory в среде без карты импорта. Production-вызовы его не передают.
38
+ */
39
+ importer?: SpecifierImporter;
22
40
  /**
23
41
  * quick 260830-rvp, INT-07: значения таргетинга (гео/ip/устройство/страница),
24
42
  * уходящие в заголовки `X-Filter-*` при каждом запросе (fetchPlugin читает их
@@ -1 +1 @@
1
- {"version":3,"file":"createFragmentsClient.d.ts","sourceRoot":"","sources":["../src/createFragmentsClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;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;AAe7C;;;;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,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB;;;;OAIG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB;;;;;OAKG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GAAI,SAAS,OAAO,sGAmErD,CAAC"}
1
+ {"version":3,"file":"createFragmentsClient.d.ts","sourceRoot":"","sources":["../src/createFragmentsClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;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;AAe1E;;;;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,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;CACjB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GAAI,SAAS,OAAO,sGAuErD,CAAC"}
package/dist/index.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const ke=require("@graph-state/core"),Se=require("@graph-state/checkers");class $ extends Error{constructor(r,t,n,s){super(t),this.code=r,this.details=n,this.status=s,this.name="FragmentsAreaError",Object.setPrototypeOf(this,$.prototype)}}class L 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,L.prototype)}}class V 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,V.prototype)}}const m=(...e)=>e.reduce((r,t)=>(r[t]=t,r),{}),Ee=m("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"),Ce=m("auto","fill"),Pe=m("None","Solid","Dashed","Dotted"),je=m("_blank","none"),Ae=m("None","Solid","LinearGradient","RadialGradient","ConicGradient","Image"),we=m("Auto","Contain","Cover"),Oe=m("Min","Center","Max","Stretch","Scale"),_e=m("absolute","relative"),xe=m("Fixed","Hug","Fill","Relative"),Ie=m("none","flex"),Te=m("vertical","horizontal"),$e=m("start","center","end"),Ve=m("start","center","end","space-between","space-around"),Fe=m("none","uppercase","lowercase","capitalize"),Le=m("none","underline","line-through"),Me=m("loop","appear","hover","tap"),Be=m("fade","slide","bounce","wiggle","increase"),f=m("Event","String","Link","Boolean","Array","Color","ComponentInstance","Date","Enum","Number","Image","Object","Goal"),Ge=m("normal","nowrap","pre","pre-wrap","pre-line","break-spaces"),Ne=m("visible","hidden","scroll"),Re=m("convert","exists","equals","startWith","endWith","contains","dateBefore","dateAfter","dateBetween","feature","notFeature","gt","gte","lt","lte","convertFromBoolean","negative"),De=m("canvas","document"),qe=m("viewport","parent","fixed"),Ke=m("click","mouseover","appear"),G=m("goal","mutate","callback","tracker"),Ue=m("AreaScope","InstanceScope","FragmentScope","CollectionScope","CollectionItemScope"),He=m("Global","Fragment"),J=3,Xe=Object.freeze(Object.defineProperty({__proto__:null,MAX_SCHEMA_DEPTH:J,borderType:Pe,constrain:Oe,createConstants:m,cssChunkScopeTypes:He,effectName:Be,effectType:Me,eventMode:G,fragmentGrowingMode:Ce,imagePaintScaleModes:we,interactions:Ke,layerAlign:$e,layerDirection:Te,layerDistribute:Ve,layerMode:Ie,linkTarget:je,nodes:Ee,overflow:Ne,paintMode:Ae,positionType:_e,renderMode:qe,renderTarget:De,scopeTypes:Ue,sizing:xe,textDecorations:Le,textTransform:Fe,variableTransforms:Re,variableType:f,whiteSpace:Ge},Symbol.toStringTag,{value:"Module"}));function We(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 ze(e,r){var t;return(t=void 0)==null?void 0:t.get(r)}function R(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 A(e,r,t,n,s){const u=s&&"input"in s?s.input:t.value,c=(s==null?void 0:s.expected)??e.expects??null,l=(s==null?void 0:s.received)??R(u),i={kind:e.kind,type:e.type,input:u,expected:c,received:l,message:`Invalid ${r}: ${c?`Expected ${c} but r`:"R"}eceived ${l}`,requirement:e.requirement,path:s==null?void 0:s.path,issues:s==null?void 0:s.issues,lang:n.lang,abortEarly:n.abortEarly,abortPipeEarly:n.abortPipeEarly},h=e.kind==="schema",y=(s==null?void 0:s.message)??e.message??ze(e.reference,i.lang)??(h?(i.lang,void 0):null)??n.message??(i.lang,void 0);y!==void 0&&(i.message=typeof y=="function"?y(i):y),h&&(t.typed=!1),t.issues?t.issues.push(i):t.issues=[i]}function P(e){return{version:1,vendor:"valibot",validate(r){return e["~run"]({value:r},We())}}}function Je(e,r){return Object.hasOwn(e,r)&&r!=="__proto__"&&r!=="prototype"&&r!=="constructor"}function Y(e,r){const t=[...new Set(e)];return t.length>1?`(${t.join(` ${r} `)})`:t[0]??"never"}function Ye(e,r,t){return typeof e.fallback=="function"?e.fallback(r,t):e.fallback}function D(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 P(this)},"~run"(t,n){var s;const u=t.value;if(Array.isArray(u)){t.typed=!0,t.value=[];for(let c=0;c<u.length;c++){const l=u[c],i=this.item["~run"]({value:l},n);if(i.issues){const h={type:"array",origin:"value",input:u,key:c,value:l};for(const y of i.issues)y.path?y.path.unshift(h):y.path=[h],(s=t.issues)==null||s.push(y);if(t.issues||(t.issues=i.issues),n.abortEarly){t.typed=!1;break}}i.typed||(t.typed=!1),t.value.push(i.value)}}else A(this,"type",t,n);return t}}}function g(e){return{kind:"schema",type:"boolean",reference:g,expects:"boolean",async:!1,message:e,get"~standard"(){return P(this)},"~run"(r,t){return typeof r.value=="boolean"?r.typed=!0:A(this,"type",r,t),r}}}function K(e){return{kind:"schema",type:"lazy",reference:K,expects:"unknown",async:!1,getter:e,get"~standard"(){return P(this)},"~run"(r,t){return this.getter(r.value)["~run"](r,t)}}}function w(e,r){return{kind:"schema",type:"literal",reference:w,expects:R(e),async:!1,literal:e,message:r,get"~standard"(){return P(this)},"~run"(t,n){return t.value===this.literal?t.typed=!0:A(this,"type",t,n),t}}}function Q(e){return{kind:"schema",type:"never",reference:Q,expects:"never",async:!1,message:e,get"~standard"(){return P(this)},"~run"(r,t){return A(this,"type",r,t),r}}}function M(e,r){return{kind:"schema",type:"nullable",reference:M,expects:`(${e.expects} | null)`,async:!1,wrapped:e,default:r,get"~standard"(){return P(this)},"~run"(t,n){return t.value===null&&(this.default!==void 0&&(t.value=D(this,t,n)),t.value===null)?(t.typed=!0,t):this.wrapped["~run"](t,n)}}}function x(e){return{kind:"schema",type:"number",reference:x,expects:"number",async:!1,message:e,get"~standard"(){return P(this)},"~run"(r,t){return typeof r.value=="number"&&!isNaN(r.value)?r.typed=!0:A(this,"type",r,t),r}}}function j(e,r){return{kind:"schema",type:"object",reference:j,expects:"Object",async:!1,entries:e,message:r,get"~standard"(){return P(this)},"~run"(t,n){var s;const u=t.value;if(u&&typeof u=="object"){t.typed=!0,t.value={};for(const c in this.entries){const l=this.entries[c];if(c in u||(l.type==="exact_optional"||l.type==="optional"||l.type==="nullish")&&l.default!==void 0){const i=c in u?u[c]:D(l),h=l["~run"]({value:i},n);if(h.issues){const y={type:"object",origin:"value",input:u,key:c,value:i};for(const d of h.issues)d.path?d.path.unshift(y):d.path=[y],(s=t.issues)==null||s.push(d);if(t.issues||(t.issues=h.issues),n.abortEarly){t.typed=!1;break}}h.typed||(t.typed=!1),t.value[c]=h.value}else if(l.fallback!==void 0)t.value[c]=Ye(l);else if(l.type!=="exact_optional"&&l.type!=="optional"&&l.type!=="nullish"&&(A(this,"key",t,n,{input:void 0,expected:`"${c}"`,path:[{type:"object",origin:"key",input:u,key:c,value:u[c]}]}),n.abortEarly))break}}else A(this,"type",t,n);return t}}}function a(e,r){return{kind:"schema",type:"optional",reference:a,expects:`(${e.expects} | undefined)`,async:!1,wrapped:e,default:r,get"~standard"(){return P(this)},"~run"(t,n){return t.value===void 0&&(this.default!==void 0&&(t.value=D(this,t,n)),t.value===void 0)?(t.typed=!0,t):this.wrapped["~run"](t,n)}}}function Z(e,r){return{kind:"schema",type:"picklist",reference:Z,expects:Y(e.map(R),"|"),async:!1,options:e,message:r,get"~standard"(){return P(this)},"~run"(t,n){return this.options.includes(t.value)?t.typed=!0:A(this,"type",t,n),t}}}function N(e,r,t){return{kind:"schema",type:"record",reference:N,expects:"Object",async:!1,key:e,value:r,message:t,get"~standard"(){return P(this)},"~run"(n,s){var u,c;const l=n.value;if(l&&typeof l=="object"){n.typed=!0,n.value={};for(const i in l)if(Je(l,i)){const h=l[i],y=this.key["~run"]({value:i},s);if(y.issues){const o={type:"object",origin:"key",input:l,key:i,value:h};for(const p of y.issues)p.path=[o],(u=n.issues)==null||u.push(p);if(n.issues||(n.issues=y.issues),s.abortEarly){n.typed=!1;break}}const d=this.value["~run"]({value:h},s);if(d.issues){const o={type:"object",origin:"value",input:l,key:i,value:h};for(const p of d.issues)p.path?p.path.unshift(o):p.path=[o],(c=n.issues)==null||c.push(p);if(n.issues||(n.issues=d.issues),s.abortEarly){n.typed=!1;break}}(!y.typed||!d.typed)&&(n.typed=!1),y.typed&&(n.value[y.value]=d.value)}}else A(this,"type",n,s);return n}}}function k(e){return{kind:"schema",type:"string",reference:k,expects:"string",async:!1,message:e,get"~standard"(){return P(this)},"~run"(r,t){return typeof r.value=="string"?r.typed=!0:A(this,"type",r,t),r}}}function B(){return{kind:"schema",type:"unknown",reference:B,expects:"unknown",async:!1,get"~standard"(){return P(this)},"~run"(e){return e.typed=!0,e}}}function ee(e,r,t){return{kind:"schema",type:"variant",reference:ee,expects:"Object",async:!1,key:e,options:r,message:t,get"~standard"(){return P(this)},"~run"(n,s){const u=n.value;if(u&&typeof u=="object"){let c,l=0,i=this.key,h=[];const y=(d,o)=>{for(const p of d.options){if(p.type==="variant")y(p,new Set(o).add(p.key));else{let v=!0,S=0;for(const b of o){const E=p.entries[b];if(b in u?E["~run"]({typed:!1,value:u[b]},s).issues:E.type!=="exact_optional"&&E.type!=="optional"&&E.type!=="nullish"){v=!1,i!==b&&(l<S||l===S&&b in u&&!(i in u))&&(l=S,i=b,h=[]),i===b&&h.push(p.entries[b].expects);break}S++}if(v){const b=p["~run"]({value:u},s);(!c||!c.typed&&b.typed)&&(c=b)}}if(c&&!c.issues)break}};if(y(this,new Set([this.key])),c)return c;A(this,"type",n,s,{input:u[i],expected:Y(h,"|"),path:[{type:"object",origin:"value",input:u,key:i,value:u[i]}]})}else A(this,"type",n,s);return n}}}const te=j({name:a(k(),"String"),type:a(w(f.String),f.String),defaultValue:a(k(),""),required:a(g(),!1),editable:a(g(),!0),placeholder:a(k(),""),isTextarea:a(g(),!1),isRich:a(g(),!1)}),re=j({name:a(k(),"Number"),type:a(w(f.Number),f.Number),defaultValue:a(x(),0),required:a(g(),!1),editable:a(g(),!0),min:a(x(),1),max:a(x(),100),step:a(x(),1),displayStepper:a(g(),!0)}),ne=j({name:a(k(),"Boolean"),type:a(w(f.Boolean),f.Boolean),defaultValue:a(g(),!1),required:a(g(),!1),editable:a(g(),!0)}),se=j({name:a(k(),"String"),type:a(w(f.Color),f.Color),defaultValue:a(k(),"#000"),required:a(g(),!1),editable:a(g(),!0)}),ae=j({name:a(k(),"Option"),type:a(w(f.Enum),f.Enum),defaultValue:a(k(),""),required:a(g(),!1),editable:a(g(),!0),cases:a(q(j({id:k(),name:k()})),[])}),ie=j({name:a(k(),"Link"),type:a(w(f.Link),f.Link),defaultValue:a(k(),""),required:a(g(),!1),editable:a(g(),!0)}),oe=j({name:a(k(),"Image"),type:a(w(f.Image),f.Image),defaultValue:a(M(k()),null),required:a(g(),!1),editable:a(g(),!0)});function le(e){return j({name:a(k(),"Object"),type:a(w(f.Object),f.Object),defaultValue:a(N(k(),B()),{}),fields:a(N(k(),K(()=>ce(e+1))),{}),required:a(g(),!1),editable:a(g(),!0)})}function ue(e){return j({name:a(k(),"Collection"),type:a(w(f.Array),f.Array),defaultValue:a(q(B()),[]),definition:a(M(K(()=>ce(e+1))),null),required:a(g(),!1),editable:a(g(),!0)})}function ce(e){return e>J?Q():ee("type",[te,re,ne,se,ae,ie,oe,le(e),ue(e)])}const Qe=j({name:a(k(),"Event"),type:a(w(f.Event),f.Event),mode:a(Z(Object.keys(G)),G.callback),defaultValue:a(B(),null),required:a(g(),!1),editable:a(g(),!0)}),Ze=le(0),et=ue(0),tt=j({name:a(k(),"Goal"),type:a(w(f.Goal),f.Goal),defaultValue:a(M(x()),null),required:a(g(),!1),editable:a(g(),!0)});f.Number+"",f.Boolean+"",f.String+"",f.Color+"",f.Event+"",f.Link+"",f.Enum+"",f.Object+"",f.Image+"",f.Array+"",f.Goal+"";f.String+"",f.Link+"",f.Color+"",f.Image+"",f.Date+"",f.Number+"",f.Boolean+"",f.Enum+"",f.Object+"",f.Array+"",f.Event+"",f.Goal+"",f.ComponentInstance+"";const fe=(...e)=>e.reduce((r,t)=>(r[t]=t,r),{}),rt={"Content-Type":"application/json"},nt=(e,r={},t={})=>{const{timeout:n}=t,s=new Map;return{get:(l,i={})=>{const h=`${e}${l}`;if(s.has(h))return s.get(h);const y=i.timeout??n,d=y!=null?AbortSignal.timeout(y):void 0,o=typeof r=="function"?r():r,p=fetch(h,{method:"GET",headers:{...rt,...o},signal:d}).then(async v=>{if(!v.ok){let b={};try{b=await v.json()}catch{b={error:{code:"UNKNOWN",message:v.statusText}}}return{ok:!1,errorBody:b,status:v.status}}let S;try{S=await v.json()}catch{S=null}return{ok:!0,data:S,status:v.status}}).finally(()=>{s.delete(h)});return s.set(h,p),p},getAbsolute:l=>{fetch(l,{method:"GET",mode:"no-cors",credentials:"omit",keepalive:!0}).catch(i=>{console.error(i)})}}},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(s){return console.error(s),!1}}}),at=e=>{var i,h,y,d;const r=(i=e==null?void 0:e.env)==null?void 0:i.backendEndpoint,t=(h=e==null?void 0:e.env)==null?void 0:h.apiToken,n=(y=e==null?void 0:e.env)==null?void 0:y.referer;if(!r)return;const s=()=>{var v,S,b;const o=(v=e==null?void 0:e.env)==null?void 0:v.filterOverrides,p={};return t&&(p["X-Api-Key"]=t),n&&(p.Referer=n),o!=null&&o.deviceType&&(p["X-Filter-Device-Type"]=o.deviceType),o!=null&&o.osType&&(p["X-Filter-OS-Type"]=o.osType),o!=null&&o.page&&(p["X-Filter-Page"]=o.page),(S=o==null?void 0:o.geo)!=null&&S.code?p["X-Filter-Geo"]=o.geo.code:o!=null&&o.ip&&(p["X-Filter-IP"]=o.ip),(b=e==null?void 0:e.env)!=null&&b.debug&&(p["X-Debug"]="true"),p},u=(d=e==null?void 0:e.env)==null?void 0:d.timeout,c=nt(r,s,{timeout:u}),l=st();e.$fetch={get:c.get,sendBeacon:l.sendBeacon,getAbsolute:c.getAbsolute}},pe=typeof window<"u",W=new Set,it=e=>{try{const r=new Image;r.referrerPolicy="no-referrer";const t=()=>{r.removeEventListener("load",t),r.removeEventListener("error",t),W.delete(r)};r.addEventListener("load",t,{once:!0}),r.addEventListener("error",t,{once:!0}),W.add(r),r.src=e}catch{}},ot=(e,r)=>{if(typeof r!="function")return!1;try{return r(e),!0}catch{return!1}},lt=e=>{if(typeof navigator>"u"||typeof navigator.sendBeacon!="function")return!1;try{return navigator.sendBeacon(e)}catch{return!1}},ut=(e,r,t)=>{if(!pe)return;const n=e==null?void 0:e.trim();if(n){if(typeof r=="function")try{if(r(n)===!0)return}catch{}lt(n)||ot(n,t)||it(n)}},z=fe("INIT_SESSION","RELEASE_SESSION","REACH_PROJECT_GOAL"),de=e=>{const r=(s,u)=>{var l;if(s!==z.REACH_PROJECT_GOAL||!u)return;const c=new URLSearchParams({goal_id:String(u.goalId),variant_id:String(u.variantId),area_id:String(u.areaId),campaign_id:String(u.campaignId)});(l=e.$fetch)==null||l.get(`/api/metric/goal?${c}`).catch(()=>{})},t=s=>{r(z.REACH_PROJECT_GOAL,s)},n=s=>{var c,l;const u=((c=e.$fetch)==null?void 0:c.getAbsolute)!=null?i=>e.$fetch.getAbsolute(i):void 0;ut(s,(l=e==null?void 0:e.$fetch)==null?void 0:l.sendBeacon,u)};e.$metrics={reachGoal:t,trackAdPixel:n}},F=e=>(e==null?void 0:e.loaded)??Promise.resolve(),ye=e=>`fragment:${e}:css`,he=e=>`fragment:${e}:fonts`,me=e=>`chunk:${e}`,ge="global";function ve(e){return r=>{const t=new Map,n=new Map,s=new Map,u=(i,h)=>{if(t.has(i))return Promise.resolve(t.get(i));if(n.has(i))return n.get(i);s.delete(i);const y=`/api/area/${i}/compiled`,d=(async()=>{var _,C,T,H,X;const o=await r.$fetch.get(y);if(!o.ok){const O=o.errorBody;throw new $(((_=O==null?void 0:O.error)==null?void 0:_.code)??"UNKNOWN",((C=O==null?void 0:O.error)==null?void 0:C.message)??String(o.status),(T=O==null?void 0:O.error)==null?void 0:T.details,o.status)}const p=o.data;if(p.apiVersion!==1)throw new L(1,p.apiVersion);const v=p.globalCssUrl??null,S=v?F(e.inject(v,ge)):Promise.resolve(),b=(H=r.$fragments)==null?void 0:H.populate(p.fragments??{}),E=(X=r.$cssChunks)==null?void 0:X.populate(p.cssChunks??{});pe&&await Promise.allSettled([b,E,S]);const I={rootFragmentId:p.rootFragmentId,variantId:p.variantId??null,props:p.props??{},projectProperties:p.projectProperties??{},globalCssUrl:v};return t.set(i,I),I})();return n.set(i,d),d.catch(o=>{s.set(i,o)}).finally(()=>{n.delete(i)}),d},c=i=>{if(t.has(i))return t.get(i);throw n.has(i)?n.get(i):s.has(i)?s.get(i):new $("AREA_NOT_RESOLVED",`Area ${i} not resolved — call $area.resolve(code) before read()`)},l=i=>t.has(i)||s.has(i);r.$area={resolve:u,read:c,has:l}}}const ct=ve({inject:()=>()=>{}});function U(e){const r=(e==null?void 0:e.importer)??(n=>import(n)),t=(e==null?void 0:e.inject)??(()=>()=>{});return n=>{const s=new Map,u=d=>s.has(d),c=d=>{var o;return(o=s.get(d))==null?void 0:o.ref},l=d=>{var o;return(o=s.get(d))==null?void 0:o.schema},i=d=>{var o;return(o=s.get(d))==null?void 0:o.scopeClass},h=d=>{const o=s.get(d);if(o===void 0)throw new V(d,"",new Error(`Fragment ${d} not populated — call populate() before read()`));if(o.status==="pending")throw o.promise;if(o.status==="error")throw o.error;return o.component},y=d=>{const o=[];return Object.entries(d).forEach(([p,v])=>{const S=Number(p);if(!s.has(S)){const E={status:"pending",promise:Promise.resolve(),ref:v,assetsLoaded:Promise.resolve(),cssCleanups:[]},I=r(v.moduleUrl).then(C=>(E.status="success",E.component=C.default,E.schema=C.schema,E.scopeClass=typeof C.scopeClass=="string"?C.scopeClass:void 0,C.default),C=>{const T=new V(S,v.moduleUrl,C);throw E.status="error",E.error=T,T});E.promise=I;const _=[];if(v.cssUrl){const C=t(v.cssUrl,ye(S));E.cssCleanups.push(C),_.push(F(C))}if(v.fontsUrl){const C=t(v.fontsUrl,he(S));E.cssCleanups.push(C),_.push(F(C))}_.length>0&&(E.assetsLoaded=Promise.allSettled(_).then(()=>{})),s.set(S,E),I.catch(()=>{})}const b=s.get(S);o.push(b.promise,b.assetsLoaded)}),Promise.allSettled(o).then(()=>{})};n.$fragments={has:u,read:h,populate:y,getRef:c,getSchema:l,getScopeClass:i}}}const ft=U();function be(e){return r=>{const t=new Map;r.$cssChunks={has:n=>t.has(n),populate:n=>{const s=[];for(const[u,c]of Object.entries(n)){const l=Number(u);if(!t.has(l))if(c.cssUrl){const i=e.inject(c.cssUrl,me(l));t.set(l,{ref:c,cleanup:i,loaded:F(i)})}else t.set(l,{ref:c,cleanup:()=>{},loaded:Promise.resolve()});s.push(t.get(l).loaded)}return Promise.allSettled(s).then(()=>{})}}}}const pt=fe("GlobalManager"),dt=e=>{const r=()=>()=>{},t=(e==null?void 0:e.inject)??r;return ke.createState({_type:"GlobalManager",initialState:{},skip:[Se.allowTypes([...Object.keys(Xe.nodes),...Object.keys(pt)])],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.setFilters=s=>{var u;n.env={...n.env,filterOverrides:{...(u=n.env)==null?void 0:u.filterOverrides,...s}}}},n=>{(e==null?void 0:e.projectId)!=null&&(n.$project={projectId:e.projectId})},...(e==null?void 0:e.plugins)??[],at,de,ve({inject:t}),U({inject:t}),be({inject:t})]})};exports.AREA_GLOBAL_CSS_KEY=ge;exports.FragmentsApiVersionError=L;exports.FragmentsAreaError=$;exports.FragmentsLoadError=V;exports.areaPlugin=ct;exports.createCssChunksCachePlugin=be;exports.createFragmentsCachePlugin=U;exports.createFragmentsClient=dt;exports.cssChunkKey=me;exports.fragmentCssKey=ye;exports.fragmentFontsKey=he;exports.fragmentsCachePlugin=ft;exports.globalMetricsPlugin=de;exports.readyOf=F;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const Ce=require("@graph-state/core"),Pe=require("@graph-state/checkers");class V extends Error{constructor(t,r,n,s){super(r),this.code=t,this.details=n,this.status=s,this.name="FragmentsAreaError",Object.setPrototypeOf(this,V.prototype)}}class L extends Error{constructor(t,r){super(`Manifest apiVersion mismatch: expected ${t}, received ${r}`),this.expected=t,this.received=r,this.name="FragmentsApiVersionError",Object.setPrototypeOf(this,L.prototype)}}class F extends Error{constructor(t,r,n){super(`Failed to load fragment ${t} from ${r}`),this.fragmentId=t,this.moduleUrl=r,this.cause=n,this.name="FragmentsLoadError",Object.setPrototypeOf(this,F.prototype)}}const y=(...e)=>e.reduce((t,r)=>(t[r]=r,t),{}),je=y("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"),we=y("auto","fill"),Ae=y("None","Solid","Dashed","Dotted"),Ie=y("_blank","none"),Oe=y("None","Solid","LinearGradient","RadialGradient","ConicGradient","Image"),_e=y("Auto","Contain","Cover"),$e=y("Min","Center","Max","Stretch","Scale"),xe=y("absolute","relative"),Fe=y("Fixed","Hug","Fill","Relative"),Te=y("none","flex"),Ve=y("vertical","horizontal"),Me=y("start","center","end"),Le=y("start","center","end","space-between","space-around"),Be=y("none","uppercase","lowercase","capitalize"),Ge=y("none","underline","line-through"),Ne=y("loop","appear","hover","tap"),Re=y("fade","slide","bounce","wiggle","increase"),f=y("Event","String","Link","Boolean","Array","Color","ComponentInstance","Date","Enum","Number","Image","Object","Goal"),De=y("normal","nowrap","pre","pre-wrap","pre-line","break-spaces"),qe=y("visible","hidden","scroll"),Ke=y("convert","exists","equals","startWith","endWith","contains","dateBefore","dateAfter","dateBetween","feature","notFeature","gt","gte","lt","lte","convertFromBoolean","negative"),He=y("canvas","document"),Xe=y("viewport","parent","fixed"),We=y("click","mouseover","appear"),R=y("goal","mutate","callback","tracker"),ze=y("AreaScope","InstanceScope","FragmentScope","CollectionScope","CollectionItemScope"),Ue=y("Global","Fragment"),Z=3,Je=Object.freeze(Object.defineProperty({__proto__:null,MAX_SCHEMA_DEPTH:Z,borderType:Ae,constrain:$e,createConstants:y,cssChunkScopeTypes:Ue,effectName:Re,effectType:Ne,eventMode:R,fragmentGrowingMode:we,imagePaintScaleModes:_e,interactions:We,layerAlign:Me,layerDirection:Ve,layerDistribute:Le,layerMode:Te,linkTarget:Ie,nodes:je,overflow:qe,paintMode:Oe,positionType:xe,renderMode:Xe,renderTarget:He,scopeTypes:ze,sizing:Fe,textDecorations:Ge,textTransform:Be,variableTransforms:Ke,variableType:f,whiteSpace:De},Symbol.toStringTag,{value:"Module"}));function Ye(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 Qe(e,t){var r;return(r=void 0)==null?void 0:r.get(t)}function q(e){var t,r;const n=typeof e;return n==="string"?`"${e}"`:n==="number"||n==="bigint"||n==="boolean"?`${e}`:n==="object"||n==="function"?(e&&((r=(t=Object.getPrototypeOf(e))==null?void 0:t.constructor)==null?void 0:r.name))??"null":n}function A(e,t,r,n,s){const l=s&&"input"in s?s.input:r.value,c=(s==null?void 0:s.expected)??e.expects??null,u=(s==null?void 0:s.received)??q(l),i={kind:e.kind,type:e.type,input:l,expected:c,received:u,message:`Invalid ${t}: ${c?`Expected ${c} but r`:"R"}eceived ${u}`,requirement:e.requirement,path:s==null?void 0:s.path,issues:s==null?void 0:s.issues,lang:n.lang,abortEarly:n.abortEarly,abortPipeEarly:n.abortPipeEarly},h=e.kind==="schema",m=(s==null?void 0:s.message)??e.message??Qe(e.reference,i.lang)??(h?(i.lang,void 0):null)??n.message??(i.lang,void 0);m!==void 0&&(i.message=typeof m=="function"?m(i):m),h&&(r.typed=!1),r.issues?r.issues.push(i):r.issues=[i]}function j(e){return{version:1,vendor:"valibot",validate(t){return e["~run"]({value:t},Ye())}}}function Ze(e,t){return Object.hasOwn(e,t)&&t!=="__proto__"&&t!=="prototype"&&t!=="constructor"}function ee(e,t){const r=[...new Set(e)];return r.length>1?`(${r.join(` ${t} `)})`:r[0]??"never"}function er(e,t,r){return typeof e.fallback=="function"?e.fallback(t,r):e.fallback}function K(e,t,r){return typeof e.default=="function"?e.default(t,r):e.default}function H(e,t){return{kind:"schema",type:"array",reference:H,expects:"Array",async:!1,item:e,message:t,get"~standard"(){return j(this)},"~run"(r,n){var s;const l=r.value;if(Array.isArray(l)){r.typed=!0,r.value=[];for(let c=0;c<l.length;c++){const u=l[c],i=this.item["~run"]({value:u},n);if(i.issues){const h={type:"array",origin:"value",input:l,key:c,value:u};for(const m of i.issues)m.path?m.path.unshift(h):m.path=[h],(s=r.issues)==null||s.push(m);if(r.issues||(r.issues=i.issues),n.abortEarly){r.typed=!1;break}}i.typed||(r.typed=!1),r.value.push(i.value)}}else A(this,"type",r,n);return r}}}function g(e){return{kind:"schema",type:"boolean",reference:g,expects:"boolean",async:!1,message:e,get"~standard"(){return j(this)},"~run"(t,r){return typeof t.value=="boolean"?t.typed=!0:A(this,"type",t,r),t}}}function X(e){return{kind:"schema",type:"lazy",reference:X,expects:"unknown",async:!1,getter:e,get"~standard"(){return j(this)},"~run"(t,r){return this.getter(t.value)["~run"](t,r)}}}function I(e,t){return{kind:"schema",type:"literal",reference:I,expects:q(e),async:!1,literal:e,message:t,get"~standard"(){return j(this)},"~run"(r,n){return r.value===this.literal?r.typed=!0:A(this,"type",r,n),r}}}function re(e){return{kind:"schema",type:"never",reference:re,expects:"never",async:!1,message:e,get"~standard"(){return j(this)},"~run"(t,r){return A(this,"type",t,r),t}}}function B(e,t){return{kind:"schema",type:"nullable",reference:B,expects:`(${e.expects} | null)`,async:!1,wrapped:e,default:t,get"~standard"(){return j(this)},"~run"(r,n){return r.value===null&&(this.default!==void 0&&(r.value=K(this,r,n)),r.value===null)?(r.typed=!0,r):this.wrapped["~run"](r,n)}}}function x(e){return{kind:"schema",type:"number",reference:x,expects:"number",async:!1,message:e,get"~standard"(){return j(this)},"~run"(t,r){return typeof t.value=="number"&&!isNaN(t.value)?t.typed=!0:A(this,"type",t,r),t}}}function w(e,t){return{kind:"schema",type:"object",reference:w,expects:"Object",async:!1,entries:e,message:t,get"~standard"(){return j(this)},"~run"(r,n){var s;const l=r.value;if(l&&typeof l=="object"){r.typed=!0,r.value={};for(const c in this.entries){const u=this.entries[c];if(c in l||(u.type==="exact_optional"||u.type==="optional"||u.type==="nullish")&&u.default!==void 0){const i=c in l?l[c]:K(u),h=u["~run"]({value:i},n);if(h.issues){const m={type:"object",origin:"value",input:l,key:c,value:i};for(const b of h.issues)b.path?b.path.unshift(m):b.path=[m],(s=r.issues)==null||s.push(b);if(r.issues||(r.issues=h.issues),n.abortEarly){r.typed=!1;break}}h.typed||(r.typed=!1),r.value[c]=h.value}else if(u.fallback!==void 0)r.value[c]=er(u);else if(u.type!=="exact_optional"&&u.type!=="optional"&&u.type!=="nullish"&&(A(this,"key",r,n,{input:void 0,expected:`"${c}"`,path:[{type:"object",origin:"key",input:l,key:c,value:l[c]}]}),n.abortEarly))break}}else A(this,"type",r,n);return r}}}function a(e,t){return{kind:"schema",type:"optional",reference:a,expects:`(${e.expects} | undefined)`,async:!1,wrapped:e,default:t,get"~standard"(){return j(this)},"~run"(r,n){return r.value===void 0&&(this.default!==void 0&&(r.value=K(this,r,n)),r.value===void 0)?(r.typed=!0,r):this.wrapped["~run"](r,n)}}}function te(e,t){return{kind:"schema",type:"picklist",reference:te,expects:ee(e.map(q),"|"),async:!1,options:e,message:t,get"~standard"(){return j(this)},"~run"(r,n){return this.options.includes(r.value)?r.typed=!0:A(this,"type",r,n),r}}}function D(e,t,r){return{kind:"schema",type:"record",reference:D,expects:"Object",async:!1,key:e,value:t,message:r,get"~standard"(){return j(this)},"~run"(n,s){var l,c;const u=n.value;if(u&&typeof u=="object"){n.typed=!0,n.value={};for(const i in u)if(Ze(u,i)){const h=u[i],m=this.key["~run"]({value:i},s);if(m.issues){const d={type:"object",origin:"key",input:u,key:i,value:h};for(const o of m.issues)o.path=[d],(l=n.issues)==null||l.push(o);if(n.issues||(n.issues=m.issues),s.abortEarly){n.typed=!1;break}}const b=this.value["~run"]({value:h},s);if(b.issues){const d={type:"object",origin:"value",input:u,key:i,value:h};for(const o of b.issues)o.path?o.path.unshift(d):o.path=[d],(c=n.issues)==null||c.push(o);if(n.issues||(n.issues=b.issues),s.abortEarly){n.typed=!1;break}}(!m.typed||!b.typed)&&(n.typed=!1),m.typed&&(n.value[m.value]=b.value)}}else A(this,"type",n,s);return n}}}function k(e){return{kind:"schema",type:"string",reference:k,expects:"string",async:!1,message:e,get"~standard"(){return j(this)},"~run"(t,r){return typeof t.value=="string"?t.typed=!0:A(this,"type",t,r),t}}}function G(){return{kind:"schema",type:"unknown",reference:G,expects:"unknown",async:!1,get"~standard"(){return j(this)},"~run"(e){return e.typed=!0,e}}}function ne(e,t,r){return{kind:"schema",type:"variant",reference:ne,expects:"Object",async:!1,key:e,options:t,message:r,get"~standard"(){return j(this)},"~run"(n,s){const l=n.value;if(l&&typeof l=="object"){let c,u=0,i=this.key,h=[];const m=(b,d)=>{for(const o of b.options){if(o.type==="variant")m(o,new Set(d).add(o.key));else{let p=!0,S=0;for(const v of d){const E=o.entries[v];if(v in l?E["~run"]({typed:!1,value:l[v]},s).issues:E.type!=="exact_optional"&&E.type!=="optional"&&E.type!=="nullish"){p=!1,i!==v&&(u<S||u===S&&v in l&&!(i in l))&&(u=S,i=v,h=[]),i===v&&h.push(o.entries[v].expects);break}S++}if(p){const v=o["~run"]({value:l},s);(!c||!c.typed&&v.typed)&&(c=v)}}if(c&&!c.issues)break}};if(m(this,new Set([this.key])),c)return c;A(this,"type",n,s,{input:l[i],expected:ee(h,"|"),path:[{type:"object",origin:"value",input:l,key:i,value:l[i]}]})}else A(this,"type",n,s);return n}}}const se=w({name:a(k(),"String"),type:a(I(f.String),f.String),defaultValue:a(k(),""),required:a(g(),!1),editable:a(g(),!0),placeholder:a(k(),""),isTextarea:a(g(),!1),isRich:a(g(),!1)}),ae=w({name:a(k(),"Number"),type:a(I(f.Number),f.Number),defaultValue:a(x(),0),required:a(g(),!1),editable:a(g(),!0),min:a(x(),1),max:a(x(),100),step:a(x(),1),displayStepper:a(g(),!0)}),ie=w({name:a(k(),"Boolean"),type:a(I(f.Boolean),f.Boolean),defaultValue:a(g(),!1),required:a(g(),!1),editable:a(g(),!0)}),oe=w({name:a(k(),"String"),type:a(I(f.Color),f.Color),defaultValue:a(k(),"#000"),required:a(g(),!1),editable:a(g(),!0)}),le=w({name:a(k(),"Option"),type:a(I(f.Enum),f.Enum),defaultValue:a(k(),""),required:a(g(),!1),editable:a(g(),!0),cases:a(H(w({id:k(),name:k()})),[])}),ce=w({name:a(k(),"Link"),type:a(I(f.Link),f.Link),defaultValue:a(k(),""),required:a(g(),!1),editable:a(g(),!0)}),ue=w({name:a(k(),"Image"),type:a(I(f.Image),f.Image),defaultValue:a(B(k()),null),required:a(g(),!1),editable:a(g(),!0)});function fe(e){return w({name:a(k(),"Object"),type:a(I(f.Object),f.Object),defaultValue:a(D(k(),G()),{}),fields:a(D(k(),X(()=>de(e+1))),{}),required:a(g(),!1),editable:a(g(),!0)})}function pe(e){return w({name:a(k(),"Collection"),type:a(I(f.Array),f.Array),defaultValue:a(H(G()),[]),definition:a(B(X(()=>de(e+1))),null),required:a(g(),!1),editable:a(g(),!0)})}function de(e){return e>Z?re():ne("type",[se,ae,ie,oe,le,ce,ue,fe(e),pe(e)])}const rr=w({name:a(k(),"Event"),type:a(I(f.Event),f.Event),mode:a(te(Object.keys(R)),R.callback),defaultValue:a(G(),null),required:a(g(),!1),editable:a(g(),!0)}),tr=fe(0),nr=pe(0),sr=w({name:a(k(),"Goal"),type:a(I(f.Goal),f.Goal),defaultValue:a(B(x()),null),required:a(g(),!1),editable:a(g(),!0)});f.Number+"",f.Boolean+"",f.String+"",f.Color+"",f.Event+"",f.Link+"",f.Enum+"",f.Object+"",f.Image+"",f.Array+"",f.Goal+"";f.String+"",f.Link+"",f.Color+"",f.Image+"",f.Date+"",f.Number+"",f.Boolean+"",f.Enum+"",f.Object+"",f.Array+"",f.Event+"",f.Goal+"",f.ComponentInstance+"";const me=(...e)=>e.reduce((t,r)=>(t[r]=r,t),{}),ar={"Content-Type":"application/json"},ir=(e,t={},r={})=>{const{timeout:n}=r,s=new Map;return{get:(u,i={})=>{const h=`${e}${u}`;if(s.has(h))return s.get(h);const m=i.timeout??n,b=m!=null?AbortSignal.timeout(m):void 0,d=typeof t=="function"?t():t,o=fetch(h,{method:"GET",headers:{...ar,...d},signal:b}).then(async p=>{if(!p.ok){let v={};try{v=await p.json()}catch{v={error:{code:"UNKNOWN",message:p.statusText}}}return{ok:!1,errorBody:v,status:p.status}}let S;try{S=await p.json()}catch{S=null}return{ok:!0,data:S,status:p.status}}).finally(()=>{s.delete(h)});return s.set(h,o),o},getAbsolute:u=>{fetch(u,{method:"GET",mode:"no-cors",credentials:"omit",keepalive:!0}).catch(i=>{console.error(i)})}}},or=e=>({sendBeacon:(r,n)=>{if(!r||typeof navigator>"u"||typeof(navigator==null?void 0:navigator.sendBeacon)!="function")return!1;try{return navigator.sendBeacon.bind(navigator)(r,n)}catch(s){return console.error(s),!1}}}),lr=e=>{var i,h,m,b;const t=(i=e==null?void 0:e.env)==null?void 0:i.backendEndpoint,r=(h=e==null?void 0:e.env)==null?void 0:h.apiToken,n=(m=e==null?void 0:e.env)==null?void 0:m.referer;if(!t)return;const s=()=>{var p,S,v;const d=(p=e==null?void 0:e.env)==null?void 0:p.filterOverrides,o={};return r&&(o["X-Api-Key"]=r),n&&(o.Referer=n),d!=null&&d.deviceType&&(o["X-Filter-Device-Type"]=d.deviceType),d!=null&&d.osType&&(o["X-Filter-OS-Type"]=d.osType),d!=null&&d.page&&(o["X-Filter-Page"]=d.page),(S=d==null?void 0:d.geo)!=null&&S.code?o["X-Filter-Geo"]=d.geo.code:d!=null&&d.ip&&(o["X-Filter-IP"]=d.ip),(v=e==null?void 0:e.env)!=null&&v.debug&&(o["X-Debug"]="true"),o},l=(b=e==null?void 0:e.env)==null?void 0:b.timeout,c=ir(t,s,{timeout:l}),u=or();e.$fetch={get:c.get,sendBeacon:u.sendBeacon,getAbsolute:c.getAbsolute}},W=typeof window<"u",J=new Set,cr=e=>{try{const t=new Image;t.referrerPolicy="no-referrer";const r=()=>{t.removeEventListener("load",r),t.removeEventListener("error",r),J.delete(t)};t.addEventListener("load",r,{once:!0}),t.addEventListener("error",r,{once:!0}),J.add(t),t.src=e}catch{}},ur=(e,t)=>{if(typeof t!="function")return!1;try{return t(e),!0}catch{return!1}},fr=e=>{if(typeof navigator>"u"||typeof navigator.sendBeacon!="function")return!1;try{return navigator.sendBeacon(e)}catch{return!1}},pr=(e,t,r)=>{if(!W)return;const n=e==null?void 0:e.trim();if(n){if(typeof t=="function")try{if(t(n)===!0)return}catch{}fr(n)||ur(n,r)||cr(n)}},Y=me("INIT_SESSION","RELEASE_SESSION","REACH_PROJECT_GOAL"),he=e=>{const t=(s,l)=>{var u;if(s!==Y.REACH_PROJECT_GOAL||!l)return;const c=new URLSearchParams({goal_id:String(l.goalId),variant_id:String(l.variantId),area_id:String(l.areaId),campaign_id:String(l.campaignId)});(u=e.$fetch)==null||u.get(`/api/metric/goal?${c}`).catch(()=>{})},r=s=>{t(Y.REACH_PROJECT_GOAL,s)},n=s=>{var c,u;const l=((c=e.$fetch)==null?void 0:c.getAbsolute)!=null?i=>e.$fetch.getAbsolute(i):void 0;pr(s,(u=e==null?void 0:e.$fetch)==null?void 0:u.sendBeacon,l)};e.$metrics={reachGoal:r,trackAdPixel:n}},N=e=>(e==null?void 0:e.loaded)??Promise.resolve(),ye=e=>`fragment:${e}:css`,dr=e=>`fragment:${e}:fonts`,ge=e=>`chunk:${e}`,ve="global";function mr(e){if(!e)return[];const t=[];function r(s){if(s!==null){if(Array.isArray(s)){for(const l of s)r(l);return}t.push(s.fragmentId),s.slots&&n(s.slots)}}function n(s){for(const l of Object.keys(s))r(s[l])}return n(e),t}function be(e){return t=>{const r=new Map,n=new Map,s=new Map,l=(i,h)=>{if(r.has(i))return Promise.resolve(r.get(i));if(n.has(i))return n.get(i);s.delete(i);const m=`/api/area/${i}/compiled`,b=(async()=>{var P,T,_,M,U;const d=await t.$fetch.get(m);if(!d.ok){const O=d.errorBody;throw new V(((P=O==null?void 0:O.error)==null?void 0:P.code)??"UNKNOWN",((T=O==null?void 0:O.error)==null?void 0:T.message)??String(d.status),(_=O==null?void 0:O.error)==null?void 0:_.details,d.status)}const o=d.data;if(o.apiVersion!==2)throw new L(2,o.apiVersion);const p=o.globalCssUrl??null,S=p?N(e.inject(p,ve)):Promise.resolve(),v=mr(o.slots),E=(M=t.$fragments)==null?void 0:M.populate(o.fragments??[],o.rootFragmentId,v),$=(U=t.$cssChunks)==null?void 0:U.populate(o.cssChunks??{});W&&await Promise.allSettled([E,$,S]);const C={rootFragmentId:o.rootFragmentId,variantId:o.variantId??null,props:o.props??{},projectProperties:o.projectProperties??{},globalCssUrl:p,fragments:o.fragments??[],slots:o.slots??{}};return r.set(i,C),C})();return n.set(i,b),b.catch(d=>{s.set(i,d)}).finally(()=>{n.delete(i)}),b},c=i=>{if(r.has(i))return r.get(i);throw n.has(i)?n.get(i):s.has(i)?s.get(i):new V("AREA_NOT_RESOLVED",`Area ${i} not resolved — call $area.resolve(code) before read()`)},u=i=>r.has(i)||s.has(i);t.$area={resolve:l,read:c,has:u}}}const hr=be({inject:()=>()=>{}});function Q(e){return`fragment/${e}/index.js`}function ke(e){return`fragment/${e}/styles.css`}function yr(e){if(!e.length)return e;let t=0;for(let n=0;n<e.length;n++)t=(t<<5)-t+e.charCodeAt(n),t|=0;const r=Math.abs(t).toString(36);return/^[0-9]/.test(r)?`h${r}`:r}function gr(e){return`fx-${yr(String(e))}`}const Se=e=>{return null;try{return(void 0)(e)}catch{return null}};function vr(e){return Se(ke(e))}const br=e=>`fragment:${e}:preload`;function kr(e,t){if(!W)return()=>{};const r=document.createElement("link");return r.rel="modulepreload",r.href=e,r.setAttribute("data-fragment-key",t),document.head.appendChild(r),()=>r.remove()}function z(e){const t=(e==null?void 0:e.importer)??(l=>import(l)),r=(e==null?void 0:e.inject)??(()=>()=>{}),n=(e==null?void 0:e.resolveSpecifier)??Se,s=(e==null?void 0:e.preloadModule)??kr;return l=>{const c=new Map,u=o=>c.has(o),i=o=>{var p;return(p=c.get(o))==null?void 0:p.schema},h=o=>{var p;return(p=c.get(o))==null?void 0:p.scopeClass},m=o=>{const p=c.get(o);if(p===void 0)throw new F(o,"",new Error(`Fragment ${o} not populated — call populate() before read()`));if(!p.imported)throw new F(o,"",new Error(`Fragment ${o} 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(p.status==="pending")throw p.promise;if(p.status==="error")throw p.error;return p.component},b=(o,p)=>{const S=Q(o);p.imported=!0;const v=t(S).then(E=>(p.status="success",p.component=E.default,p.schema=E.schema,p.scopeClass=typeof E.scopeClass=="string"?E.scopeClass:void 0,E.default),E=>{const $=new F(o,S,E);throw p.status="error",p.error=$,$});p.promise=v,v.catch(()=>{})},d=(o,p,S)=>{const v=[],E=S?new Set(S):void 0,$=C=>C===p||((E==null?void 0:E.has(C))??!1);return o.forEach(C=>{let P=c.get(C);if(P===void 0){P={status:"pending",promise:Promise.resolve(),imported:!1,assetsLoaded:Promise.resolve(),cssCleanups:[]},c.set(C,P);const T=n(ke(C));if(T){const _=r(T,ye(C));P.cssCleanups.push(_),P.assetsLoaded=N(_)}if($(C))b(C,P);else{const _=n(Q(C));if(_){const M=s(_,br(C));P.cssCleanups.push(M)}}}else $(C)&&!P.imported&&b(C,P);v.push(P.promise,P.assetsLoaded)}),Promise.allSettled(v).then(()=>{})};l.$fragments={has:u,read:m,populate:d,getSchema:i,getScopeClass:h}}}const Sr=z();function Ee(e){return t=>{const r=new Map;t.$cssChunks={has:n=>r.has(n),populate:n=>{const s=[];for(const[l,c]of Object.entries(n)){const u=Number(l);if(!r.has(u))if(c.cssUrl){const i=e.inject(c.cssUrl,ge(u));r.set(u,{ref:c,cleanup:i,loaded:N(i)})}else r.set(u,{ref:c,cleanup:()=>{},loaded:Promise.resolve()});s.push(r.get(u).loaded)}return Promise.allSettled(s).then(()=>{})}}}}const Er=me("GlobalManager"),Cr=e=>{const t=()=>()=>{},r=(e==null?void 0:e.inject)??t;return Ce.createState({_type:"GlobalManager",initialState:{},skip:[Pe.allowTypes([...Object.keys(Je.nodes),...Object.keys(Er)])],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.setFilters=s=>{var l;n.env={...n.env,filterOverrides:{...(l=n.env)==null?void 0:l.filterOverrides,...s}}}},n=>{(e==null?void 0:e.projectId)!=null&&(n.$project={projectId:e.projectId})},...(e==null?void 0:e.plugins)??[],lr,he,be({inject:r}),z({inject:r,resolveSpecifier:e==null?void 0:e.resolveSpecifier,importer:e==null?void 0:e.importer}),Ee({inject:r})]})};exports.AREA_GLOBAL_CSS_KEY=ve;exports.FragmentsApiVersionError=L;exports.FragmentsAreaError=V;exports.FragmentsLoadError=F;exports.areaPlugin=hr;exports.createCssChunksCachePlugin=Ee;exports.createFragmentsCachePlugin=z;exports.createFragmentsClient=Cr;exports.cssChunkKey=ge;exports.fragmentCssKey=ye;exports.fragmentFontsKey=dr;exports.fragmentsCachePlugin=Sr;exports.globalMetricsPlugin=he;exports.readyOf=N;exports.resolveStylesHref=vr;exports.toScopeClassName=gr;
package/dist/index.d.ts CHANGED
@@ -12,13 +12,14 @@
12
12
  * оттуда — потребитель (runtime-react, playgrounds) получает аугментацию вместе
13
13
  * с пакетом. Гейт на факт сборки — `src/dist-declarations.test.ts`.
14
14
  */
15
- export type { AreaResolveResponse, FragmentRef, CssChunkRef, ResolvedValue, FieldId, } from './types';
15
+ export type { AreaResolveResponse, 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';
19
19
  export type { Options as CreateFragmentsClientOptions } from './createFragmentsClient';
20
20
  export { fragmentsCachePlugin, createFragmentsCachePlugin } from './$fragments';
21
21
  export type { FragmentsCacheNamespace, CreateFragmentsCachePluginOpts } from './$fragments';
22
+ export { resolveStylesHref, toScopeClassName } from './$fragments';
22
23
  export { createCssChunksCachePlugin } from './$cssChunks';
23
24
  export { areaPlugin } from './$area';
24
25
  export type { AreaResolveResult } from './$area';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,YAAY,EACV,mBAAmB,EACnB,WAAW,EACX,WAAW,EACX,aAAa,EACb,OAAO,GACR,MAAM,SAAS,CAAC;AAEjB,YAAY,EACV,YAAY,EACZ,eAAe,EACf,aAAa,EACb,cAAc,EACd,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EAAE,OAAO,IAAI,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AAEvF,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAChF,YAAY,EAAE,uBAAuB,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAC;AAE5F,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAK9D,OAAO,EACL,OAAO,EACP,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,YAAY,EACV,mBAAmB,EACnB,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,OAAO,GACR,MAAM,SAAS,CAAC;AAEjB,YAAY,EACV,YAAY,EACZ,eAAe,EACf,aAAa,EACb,cAAc,EACd,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EAAE,OAAO,IAAI,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AAEvF,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAChF,YAAY,EAAE,uBAAuB,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAC;AAI5F,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAK9D,OAAO,EACL,OAAO,EACP,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC"}