@fragmentsx/fragments-client 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +45 -0
  2. package/dist/$area/index.d.ts +69 -0
  3. package/dist/$area/index.d.ts.map +1 -0
  4. package/dist/$area/index.test.d.ts +12 -0
  5. package/dist/$area/index.test.d.ts.map +1 -0
  6. package/dist/$cssChunks/index.d.ts +27 -0
  7. package/dist/$cssChunks/index.d.ts.map +1 -0
  8. package/dist/$cssChunks/index.test.d.ts +2 -0
  9. package/dist/$cssChunks/index.test.d.ts.map +1 -0
  10. package/dist/$fragments/index.d.ts +113 -0
  11. package/dist/$fragments/index.d.ts.map +1 -0
  12. package/dist/$fragments/index.test.d.ts +7 -0
  13. package/dist/$fragments/index.test.d.ts.map +1 -0
  14. package/dist/createFragmentsClient.d.ts +36 -0
  15. package/dist/createFragmentsClient.d.ts.map +1 -0
  16. package/dist/createFragmentsClient.test.d.ts +13 -0
  17. package/dist/createFragmentsClient.test.d.ts.map +1 -0
  18. package/dist/errors/index.d.ts +38 -0
  19. package/dist/errors/index.d.ts.map +1 -0
  20. package/dist/errors/index.test.d.ts +2 -0
  21. package/dist/errors/index.test.d.ts.map +1 -0
  22. package/dist/fetch/__tests__/beacon.test.d.ts +16 -0
  23. package/dist/fetch/__tests__/beacon.test.d.ts.map +1 -0
  24. package/dist/fetch/beacon.d.ts +22 -0
  25. package/dist/fetch/beacon.d.ts.map +1 -0
  26. package/dist/fetch/index.d.ts +3 -0
  27. package/dist/fetch/index.d.ts.map +1 -0
  28. package/dist/fetch/restFetcher.d.ts +48 -0
  29. package/dist/fetch/restFetcher.d.ts.map +1 -0
  30. package/dist/index.cjs.js +1 -0
  31. package/dist/index.d.ts +20 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.es.js +1767 -0
  34. package/dist/metrics/__tests__/globalMetrics.test.d.ts +16 -0
  35. package/dist/metrics/__tests__/globalMetrics.test.d.ts.map +1 -0
  36. package/dist/metrics/globalMetrics.d.ts +18 -0
  37. package/dist/metrics/globalMetrics.d.ts.map +1 -0
  38. package/dist/metrics/trackAdPixel.d.ts +31 -0
  39. package/dist/metrics/trackAdPixel.d.ts.map +1 -0
  40. package/dist/types.d.ts +109 -0
  41. package/dist/types.d.ts.map +1 -0
  42. package/dist/utils/createConstants.d.ts +10 -0
  43. package/dist/utils/createConstants.d.ts.map +1 -0
  44. package/dist/utils/isBrowser.d.ts +11 -0
  45. package/dist/utils/isBrowser.d.ts.map +1 -0
  46. package/package.json +46 -0
package/README.md ADDED
@@ -0,0 +1,45 @@
1
+ # @fragmentsx/fragments-client
2
+
3
+ Клиентское ядро Fragments: загрузка и кеширование областей (area), фрагментов
4
+ и css-чанков, метрики. Транспортный слой, на котором строится
5
+ `@fragmentsx/runtime-react` — сам по себе фреймворк-агностичен и не зависит
6
+ от React.
7
+
8
+ ## Что это решает
9
+
10
+ Публичный API площадки (Fragments) отдаёт документ области и связанные с ней
11
+ ресурсы по сети. `fragments-client` инкапсулирует:
12
+
13
+ - разрешение области (`areaPlugin`) с версионированием формата ответа;
14
+ - кеширование фрагментов (`fragmentsCachePlugin`) и css-чанков
15
+ (`createCssChunksCachePlugin`) поверх `@graph-state/core`;
16
+ - отправку метрик (`globalMetricsPlugin`);
17
+ - типизированные ошибки (`FragmentsAreaError`, `FragmentsApiVersionError`,
18
+ `FragmentsLoadError`) для явной обработки сбоев сети/версии на стороне
19
+ потребителя.
20
+
21
+ ## Установка
22
+
23
+ ```bash
24
+ pnpm add @fragmentsx/fragments-client
25
+ ```
26
+
27
+ ## Использование
28
+
29
+ ```ts
30
+ import { createFragmentsClient } from '@fragmentsx/fragments-client';
31
+
32
+ const client = createFragmentsClient({
33
+ apiUrl: 'https://api.fragments.example.com',
34
+ projectId: 'my-project',
35
+ });
36
+
37
+ const area = await client.$area.resolve('home');
38
+ ```
39
+
40
+ ## Пара с runtime-react
41
+
42
+ `@fragmentsx/runtime-react` — React-обвязка над этим пакетом
43
+ (`FragmentsProvider`, `Area`, хуки `useFragmentComponent`, `useArea` и
44
+ другие). `fragments-client` используется напрямую только при интеграции с
45
+ другим UI-слоем или для написания собственного рантайма.
@@ -0,0 +1,69 @@
1
+ import { Plugin } from '@graph-state/core';
2
+ import { ResolvedValue } from '../types';
3
+ /**
4
+ * Тип resolved value из $area.resolve — subset manifest без fragment refs.
5
+ * useArea (Plan 07) потребляет именно этот контракт.
6
+ */
7
+ export interface AreaResolveResult {
8
+ rootFragmentId: number;
9
+ /**
10
+ * Phase 73, B-02/B-06: готовые значения props корневого артефакта — привязки
11
+ * `{$ref:{scope,name}}` из `Variant.props` уже разрешены сервером. Автоподстановки
12
+ * по имени (`_id`-канал) больше нет — B-13. Всегда объект: редукция нормализует
13
+ * отсутствие поля у backend'а в `{}`, а не в `undefined`, чтобы потребитель
14
+ * (useArea) не делал двойную optional-проверку.
15
+ */
16
+ props: Record<string, ResolvedValue>;
17
+ /**
18
+ * Phase 72 D-72-01/D-72-02: словарь project-переменных площадки (ключ — `name`,
19
+ * значение — голое). Значение всегда объект: редукция ниже нормализует
20
+ * отсутствие поля у backend'а в `{}`, поэтому потребитель (useArea) не делает
21
+ * повторную optional-проверку — тот же приём, что применён к полю `props` выше.
22
+ */
23
+ projectProperties: Record<string, ResolvedValue>;
24
+ /**
25
+ * URL к глобальному baseline reset CSS (см. AreaResolveResponse.globalCssUrl).
26
+ * `null` — backend не отдаёт global reset.
27
+ */
28
+ globalCssUrl: string | null;
29
+ }
30
+ /**
31
+ * Публичный тип $area namespace.
32
+ */
33
+ export interface AreaNamespace {
34
+ /**
35
+ * Resolves area по коду: HTTP GET /api/area/<code>/compiled → populate caches.
36
+ *
37
+ * - Cache hit → возвращает sync (Promise resolved immediately).
38
+ * - Miss → вызывает state.$fetch.get(), populate side-effects.
39
+ * - Concurrent calls для того же code → dedup через in-flight Map.
40
+ *
41
+ * @param code - area code
42
+ * @param opts.timeout - таймаут в мс (AbortSignal.timeout — через fetchPlugin)
43
+ */
44
+ resolve: (code: string, opts?: {
45
+ timeout?: number;
46
+ }) => Promise<AreaResolveResult>;
47
+ /**
48
+ * Synchronous Suspense-throw protocol:
49
+ * - cache hit → sync return
50
+ * - pending in-flight → throw Promise
51
+ * - miss → throw FragmentsAreaError("AREA_NOT_RESOLVED")
52
+ */
53
+ read: (code: string) => AreaResolveResult;
54
+ /**
55
+ * Проверяет наличие terminal entry в кэше (resolved ИЛИ rejected).
56
+ * Не учитывает in-flight — для in-flight используйте `$area.resolve`, который
57
+ * dedup'ит через inflightMap. Семантика «has terminal state» нужна для
58
+ * auto-resolve хелперов: они не должны перезапускать fetch на rejected,
59
+ * иначе образуется retry-storm (см. runtime-react useArea.ts).
60
+ */
61
+ has: (code: string) => boolean;
62
+ }
63
+ /**
64
+ * areaPlugin — подключает $area namespace к GraphState.
65
+ *
66
+ * Все cache Map'ы per-state (closure-scoped) → per-request SSR isolation natural (D-13).
67
+ */
68
+ export declare const areaPlugin: Plugin;
69
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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;AAYnE;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;;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;;;;;;;;;OASG;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;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,MAmIxB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Тесты для areaPlugin — $area namespace.
3
+ *
4
+ * Адаптированы для fragments-client: $area.resolve идёт через state.$fetch.get
5
+ * (compiled fetchPlugin), а не через direct globalThis.fetch (как в client-core аналоге).
6
+ *
7
+ * Проверяет D-03 HTTP path, typed errors (Req #6), populate side-effects (Req #2),
8
+ * cache hit dedup, и Phase 73 форму поля `props` (B-02/B-06) — готовые значения,
9
+ * разрешённые сервером, без автоподстановки по имени.
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/$area/index.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,27 @@
1
+ import { Plugin } from '@graph-state/core';
2
+ /**
3
+ * Тип функции injection — принимает URL и ключ, возвращает cleanup callback.
4
+ * Реализуется через `injectStylesheet` из `@fragmentsx/runtime-react`.
5
+ * В SSR (isBrowser = false) — injectStylesheet сам возвращает noop.
6
+ */
7
+ type InjectFn = (href: string, key: string) => () => void;
8
+ /**
9
+ * Опции factory.
10
+ */
11
+ interface CreateCssChunksCachePluginOptions {
12
+ /**
13
+ * Функция DOM injection — `injectStylesheet` из `@fragmentsx/runtime-react`.
14
+ * В SSR сам возвращает noop (isBrowser guard внутри).
15
+ * В тестах может быть заменён spy-функцией.
16
+ */
17
+ inject: InjectFn;
18
+ }
19
+ /**
20
+ * Factory function — создаёт Plugin для cache namespace `$cssChunks`.
21
+ *
22
+ * @param opts.inject - DOM injector callback (factory injection, BLOCKER-4)
23
+ * @returns Plugin function для передачи в createState plugins array
24
+ */
25
+ export declare function createCssChunksCachePlugin(opts: CreateCssChunksCachePluginOptions): Plugin;
26
+ export {};
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/$cssChunks/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD;;;;GAIG;AACH,KAAK,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,IAAI,CAAC;AAE1D;;GAEG;AACH,UAAU,iCAAiC;IACzC;;;;OAIG;IACH,MAAM,EAAE,QAAQ,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,iCAAiC,GAAG,MAAM,CAwB1F"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/$cssChunks/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,113 @@
1
+ import { Plugin } from '@graph-state/core';
2
+ import { FragmentRef } from '../types';
3
+ /**
4
+ * DI importer seam — signature для production и тестового importer'а.
5
+ * Default: `(url) => import(url)` (native dynamic import).
6
+ * Test: `vi.fn().mockResolvedValue({ default: TestComponent })`.
7
+ *
8
+ * Index signature допускает произвольные named exports модуля (Phase 68 D-10) —
9
+ * в частности `schema` рукописного TSX-артефакта — без приведения через `any`
10
+ * в месте использования.
11
+ */
12
+ type Importer = (moduleUrl: string) => Promise<{
13
+ default: unknown;
14
+ [key: string]: unknown;
15
+ }>;
16
+ /**
17
+ * Опции фабрики плагина.
18
+ */
19
+ export interface CreateFragmentsCachePluginOpts {
20
+ /**
21
+ * Optional importer DI seam.
22
+ * Default — native dynamic `import(url)` (production).
23
+ * Передайте `vi.fn()` mock в тестах (WARNING-2 resolution).
24
+ */
25
+ importer?: Importer;
26
+ }
27
+ /**
28
+ * Публичный тип $fragments namespace — используется downstream (runtime-react).
29
+ * Typed augmentation GraphState.$fragments в src/declarations.d.ts (D-05).
30
+ */
31
+ export interface FragmentsCacheNamespace {
32
+ /** Проверяет наличие id в кэше (любой status). */
33
+ has: (id: number) => boolean;
34
+ /**
35
+ * Suspense protocol read:
36
+ * - cache hit "success" → sync ComponentType
37
+ * - "pending" → throws inflight Promise
38
+ * - "error" → throws FragmentsLoadError
39
+ * - id отсутствует → throws FragmentsLoadError("not populated")
40
+ */
41
+ read: (id: number) => unknown;
42
+ /**
43
+ * Populate кэша параллельными `import(moduleUrl)` вызовами.
44
+ * Idempotent: уже cached id → skip.
45
+ * Cross-area dedup natural — один import() per unique id.
46
+ */
47
+ populate: (refs: Record<number, FragmentRef>) => void;
48
+ /**
49
+ * Sync getter для FragmentRef metadata (cssUrl, fontsUrl и т.д.).
50
+ * Используется Area composition для FragmentStylesheet preamble injection
51
+ * (BLOCKER-1 resolution — SPEC AC #11/#12).
52
+ *
53
+ * @param id - fragment id
54
+ * @returns FragmentRef если id populate'ен, undefined если нет
55
+ */
56
+ getRef: (id: number) => FragmentRef | undefined;
57
+ /**
58
+ * Sync getter для named export `schema` уже загруженного модуля.
59
+ *
60
+ * D-10: артефакт — единственный источник истины. `schema` не сериализуется
61
+ * отдельно в манифест (это завело бы второй источник истины) — единственное
62
+ * место, где она реально известна, это уже загруженный JS-модуль, то есть
63
+ * этот кэш.
64
+ *
65
+ * @param id - fragment id
66
+ * @returns schema если модуль populate'ен, загружен успешно и содержит named
67
+ * export `schema`; undefined во всех остальных случаях (id не в кэше,
68
+ * status "pending"/"error", либо модуль без `schema`)
69
+ */
70
+ getSchema: (id: number) => unknown | undefined;
71
+ /**
72
+ * Sync getter для named export `scopeClass` уже загруженного модуля
73
+ * (quick-260830-kyg, задача 2) — зеркально `getSchema`.
74
+ *
75
+ * Артефакт — единственный источник истины: класс дописывает компилятор
76
+ * (`appendScopeClassExport`, `@fragmentsx/fragment-compiler`), поле не
77
+ * сериализуется в манифест — это завело бы второй источник истины и класс
78
+ * ошибок «поле есть, путь его не наполняет» (quick-260828-khw).
79
+ *
80
+ * @param id - fragment id
81
+ * @returns scopeClass если модуль populate'ен, загружен успешно и содержит
82
+ * named export `scopeClass` строкового типа; undefined во всех остальных
83
+ * случаях (id не в кэше, status "pending"/"error", модуль без
84
+ * `scopeClass` либо экспорт не-строкой)
85
+ */
86
+ getScopeClass: (id: number) => string | undefined;
87
+ }
88
+ /**
89
+ * Фабрика плагина `client.$fragments`.
90
+ *
91
+ * Принимает optional importer DI seam для тестирования (WARNING-2 resolution).
92
+ * Default value = native dynamic import wrapper.
93
+ *
94
+ * @example
95
+ * // Production (createFragmentsClient):
96
+ * createFragmentsClient({ plugins: [createFragmentsCachePlugin()] })
97
+ *
98
+ * // В тестах:
99
+ * const spy = vi.fn().mockResolvedValue({ default: TestComponent });
100
+ * const plugin = createFragmentsCachePlugin({ importer: spy });
101
+ */
102
+ export declare function createFragmentsCachePlugin(opts?: CreateFragmentsCachePluginOpts): Plugin;
103
+ /**
104
+ * Pre-baked instance с default native importer.
105
+ * Backwards-compat export для callers которые не нуждаются в DI.
106
+ *
107
+ * @example
108
+ * // Простое использование без DI:
109
+ * createFragmentsClient({ plugins: [fragmentsCachePlugin] })
110
+ */
111
+ export declare const fragmentsCachePlugin: Plugin;
112
+ export {};
113
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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;AAE5C;;;;;;;;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;CACrB;AAgCD;;;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;;;;OAIG;IACH,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,KAAK,IAAI,CAAC;IACtD;;;;;;;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,CA8GR;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAqC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Тесты для $fragments cache namespace (Req #10 + D-08).
3
+ * Verifies Suspense protocol, idempotency, cross-area dedup через DI importer (WARNING-2 resolution).
4
+ * Test 8 — real-import smoke без DI для validation factory wiring.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/$fragments/index.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,36 @@
1
+ import { Plugin } from '@graph-state/core';
2
+ /**
3
+ * Тип inject функции — DOM injection callback.
4
+ * Production: `injectStylesheet` из `@fragmentsx/runtime-react`.
5
+ * Default: noop (для SSR и node/test environments).
6
+ */
7
+ type InjectFn = (href: string, key: string) => () => void;
8
+ /**
9
+ * Options для createFragmentsClient.
10
+ *
11
+ * Поле inject для BLOCKER-4 wiring — пробрасывается в createCssChunksCachePlugin.
12
+ */
13
+ export interface Options {
14
+ apiToken: string;
15
+ projectId?: number;
16
+ referer?: string;
17
+ backendEndpoint?: string;
18
+ timeout?: number;
19
+ plugins?: Plugin[];
20
+ /**
21
+ * DOM injection callback (BLOCKER-4 wiring).
22
+ * Default — noop: `() => () => {}` (no-op для SSR/test).
23
+ * Production: `inject = injectStylesheet` из `@fragmentsx/runtime-react`.
24
+ */
25
+ inject?: InjectFn;
26
+ }
27
+ /**
28
+ * Создаёт compiled-only GraphState client.
29
+ *
30
+ * @example
31
+ * import { createFragmentsClient } from '@fragmentsx/fragments-client';
32
+ * const client = createFragmentsClient({ apiToken: 'your-token' });
33
+ */
34
+ export declare const createFragmentsClient: (options: Options) => import('@graph-state/core').GraphState<import('@graph-state/core').SystemFields, "GlobalManager">;
35
+ export {};
36
+ //# sourceMappingURL=createFragmentsClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createFragmentsClient.d.ts","sourceRoot":"","sources":["../src/createFragmentsClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAe,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAkB7D;;;;GAIG;AACH,KAAK,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,IAAI,CAAC;AAE1D;;;;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;CACnB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GAAI,SAAS,OAAO,sGA4CrD,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Тесты для createFragmentsClient factory.
3
+ *
4
+ * Проверяет:
5
+ * - Наличие всех namespace'ов: $fetch, $metrics, $area, $fragments, $cssChunks
6
+ * - Отсутствие legacy JIT plugins: $fonts, $properties, $globalStylesheet (Req #1)
7
+ * - BLOCKER-4: opts.inject пробрасывается в createCssChunksCachePlugin
8
+ * - Default noop inject — не крашит на populate
9
+ * - backendEndpoint default
10
+ * - $project при projectId
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=createFragmentsClient.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createFragmentsClient.test.d.ts","sourceRoot":"","sources":["../src/createFragmentsClient.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Typed error classes для compiled fragments клиентского слоя.
3
+ *
4
+ * Каждый класс вызывает setPrototypeOf(this, X.prototype) после super() —
5
+ * критично для корректного instanceof в ESM build (Vite + TypeScript).
6
+ *
7
+ * Ref: Req #6 / D-04 (05.2-SPEC.md)
8
+ */
9
+ /**
10
+ * Обёртка над backend `AreaResolveError` JSON shape.
11
+ * Бросается при HTTP error responses от `/api/area/<code>/compiled` endpoint.
12
+ */
13
+ export declare class FragmentsAreaError extends Error {
14
+ code: string;
15
+ details?: unknown | undefined;
16
+ status?: number | undefined;
17
+ constructor(code: string, message: string, details?: unknown | undefined, status?: number | undefined);
18
+ }
19
+ /**
20
+ * Бросается при несовпадении manifest `apiVersion` с ожидаемой клиентом версией.
21
+ * Forward-incompat strict equality (D-14).
22
+ */
23
+ export declare class FragmentsApiVersionError extends Error {
24
+ expected: number;
25
+ received: number;
26
+ constructor(expected: number, received: number);
27
+ }
28
+ /**
29
+ * Бросается когда `import(moduleUrl)` reject'ится (CDN 404, network, parse error).
30
+ * Или когда фрагмент не был populate'ен перед вызовом read().
31
+ */
32
+ export declare class FragmentsLoadError extends Error {
33
+ fragmentId: number;
34
+ moduleUrl: string;
35
+ cause: unknown;
36
+ constructor(fragmentId: number, moduleUrl: string, cause: unknown);
37
+ }
38
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAElC,IAAI,EAAE,MAAM;IAEZ,OAAO,CAAC,EAAE,OAAO;IACjB,MAAM,CAAC,EAAE,MAAM;gBAHf,IAAI,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACR,OAAO,CAAC,EAAE,OAAO,YAAA,EACjB,MAAM,CAAC,EAAE,MAAM,YAAA;CAMzB;AAED;;;GAGG;AACH,qBAAa,wBAAyB,SAAQ,KAAK;IAExC,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,MAAM;gBADhB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM;CAQ1B;AAED;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAElC,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,MAAM;IACjB,KAAK,EAAE,OAAO;gBAFd,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO;CAMxB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/errors/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Регрессионные тесты для fetchBeacon (beacon.ts).
3
+ *
4
+ * CR-01 fix: sendBeacon пропускает url+body в navigator.sendBeacon напрямую,
5
+ * hardcoded "/graphql" устранён.
6
+ *
7
+ * Тесты:
8
+ * 1. sendBeacon(url) → navigator.sendBeacon вызван с [url, undefined], не с ["/graphql", "test"]
9
+ * 2. sendBeacon(url, body) → navigator.sendBeacon вызван с [url, body]
10
+ * 3. нет navigator (non-browser env) → возвращает false без throw
11
+ * 4. Пустая строка url → возвращает false, navigator.sendBeacon не вызван
12
+ * 5. navigator.sendBeacon throws → catch, console.error, return false (не null)
13
+ * 6. При absolute pixelUrl baseUrl параметр fetchBeacon(baseUrl) НЕ префиксуется
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=beacon.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"beacon.test.d.ts","sourceRoot":"","sources":["../../../src/fetch/__tests__/beacon.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * fetchBeacon — sendBeacon transport для ad pixel / метрик.
3
+ *
4
+ * CR-01 fix: sendBeacon пропускает абсолютный pixelUrl напрямую в navigator.sendBeacon.
5
+ * Старая реализация hardcode'ила sender("/graphql", "test") — паразитный запрос устранён.
6
+ *
7
+ * Сигнатура: sendBeacon(url: string, body?: BodyInit | null) => boolean
8
+ * - В браузере (typeof navigator?.sendBeacon === "function"): делегирует в navigator.sendBeacon.
9
+ * Проверяется в момент вызова (не при создании замыкания), чтобы правильно работать в тест-среде.
10
+ * - В non-browser env (SSR/Node): всегда возвращает false без исключений.
11
+ *
12
+ * Параметр _baseUrl у fetchBeacon(_baseUrl) сохранён для совместимости с callsite в fetch/index.ts:
13
+ * const beaconFetcher = fetchBeacon(url)
14
+ * Но НЕ применяется к url пикселя — ad pixel приходит абсолютным URL из trackAdPixel.
15
+ * Зарезервирован для будущих relative-URL сценариев.
16
+ *
17
+ * D-03 / CR-01 / T-35-04-01
18
+ */
19
+ export declare const fetchBeacon: (_baseUrl: string) => {
20
+ sendBeacon: (url: string, body?: BodyInit | null) => boolean;
21
+ };
22
+ //# sourceMappingURL=beacon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"beacon.d.ts","sourceRoot":"","sources":["../../src/fetch/beacon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,eAAO,MAAM,WAAW,GAEtB,UAAU,MAAM;sBAaS,MAAM,SAAS,QAAQ,GAAG,IAAI,KAAG,OAAO;CAuBlE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Plugin } from '@graph-state/core';
2
+ export declare const fetchPlugin: Plugin;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fetch/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAIhD,eAAO,MAAM,WAAW,EAAE,MAgEzB,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * createRestFetcher — HTTP GET транспорт для compiled fetchPlugin.
3
+ *
4
+ * Расширен относительно аналога packages/client-core/src/plugins/fetch/restFetcher.ts:
5
+ * - get<T>() возвращает { ok, data, errorBody, status } вместо raw Promise<T> —
6
+ * это позволяет $area.resolve строить typed-error mapping (FragmentsAreaError/
7
+ * FragmentsApiVersionError) с доступом к response body при HTTP ошибке.
8
+ * - legacy restFetcher бросал plain Error на not-ok без тела (строки :51-54) —
9
+ * это лишало $area доступа к body.error.{code,message,details}.
10
+ *
11
+ * Сохранены verbatim:
12
+ * - in-flight dedup через Map (предотвращает дублирующие запросы при concurrent read)
13
+ * - AbortSignal.timeout — T-35-05 mitigation (DoS через hung request)
14
+ * - BASE_HEADERS: Content-Type: application/json
15
+ *
16
+ * D-03 / D-04 / T-35-05
17
+ */
18
+ export interface FetcherOptions {
19
+ /** Таймаут в миллисекундах. Если не задан — запрос без AbortSignal. */
20
+ timeout?: number;
21
+ }
22
+ /** Поддержка статичных headers или ленивой функции, вычисляемой на каждый запрос. */
23
+ export type DefaultHeaders = HeadersInit | (() => HeadersInit);
24
+ /**
25
+ * Результат get() — discriminated union для typed-error mapping в $area.
26
+ * ok: true → data содержит ответ
27
+ * ok: false → errorBody и status позволяют построить FragmentsAreaError
28
+ */
29
+ export type RestResult<T, E = {
30
+ error?: {
31
+ code?: string;
32
+ message?: string;
33
+ details?: unknown;
34
+ };
35
+ }> = {
36
+ ok: true;
37
+ data: T;
38
+ status: number;
39
+ } | {
40
+ ok: false;
41
+ errorBody: E;
42
+ status: number;
43
+ };
44
+ export declare const createRestFetcher: (baseUrl: string, defaultHeaders?: DefaultHeaders, options?: FetcherOptions) => {
45
+ get: <T>(url: string, opts?: FetcherOptions) => Promise<RestResult<T>>;
46
+ getAbsolute: (url: string) => void;
47
+ };
48
+ //# sourceMappingURL=restFetcher.d.ts.map
@@ -0,0 +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;uBAiErD,MAAM,KAAG,IAAI;CAYxC,CAAC"}
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const Ze=require("@graph-state/core"),et=require("@graph-state/checkers");class q extends Error{constructor(r,t,a,u){super(t),this.code=r,this.details=a,this.status=u,this.name="FragmentsAreaError",Object.setPrototypeOf(this,q.prototype)}}class X 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,X.prototype)}}class W extends Error{constructor(r,t,a){super(`Failed to load fragment ${r} from ${t}`),this.fragmentId=r,this.moduleUrl=t,this.cause=a,this.name="FragmentsLoadError",Object.setPrototypeOf(this,W.prototype)}}const j=(...e)=>e.reduce((r,t)=>(r[t]=t,r),{}),O=j("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"),H=j("auto","fill"),ne=j("None","Solid","Dashed","Dotted"),tt=j("_blank","none"),ae=j("None","Solid","LinearGradient","RadialGradient","ConicGradient","Image"),le=j("Auto","Contain","Cover"),rt=j("Min","Center","Max","Stretch","Scale"),ie=j("absolute","relative"),V=j("Fixed","Hug","Fill","Relative"),se=j("none","flex"),oe=j("vertical","horizontal"),ce=j("start","center","end"),ue=j("start","center","end","space-between","space-around"),Ee=j("none","uppercase","lowercase","capitalize"),J=j("none","underline","line-through"),nt=j("loop","appear","hover","tap"),at=j("fade","slide","bounce","wiggle","increase"),g=j("Event","String","Link","Boolean","Array","Color","ComponentInstance","Date","Enum","Number","Image","Object","Goal"),fe=j("normal","nowrap","pre","pre-wrap","pre-line","break-spaces"),pe=j("visible","hidden","scroll"),lt=j("convert","exists","equals","startWith","endWith","contains","dateBefore","dateAfter","dateBetween","feature","notFeature","gt","gte","lt","lte","convertFromBoolean","negative"),it=j("canvas","document"),st=j("viewport","parent","fixed"),Ce=j("click","mouseover","appear"),he=j("goal","mutate","callback","tracker"),ot=j("AreaScope","InstanceScope","FragmentScope","CollectionScope","CollectionItemScope"),ct=j("Global","Fragment"),Oe=3,ut=Object.freeze(Object.defineProperty({__proto__:null,MAX_SCHEMA_DEPTH:Oe,borderType:ne,constrain:rt,createConstants:j,cssChunkScopeTypes:ct,effectName:at,effectType:nt,eventMode:he,fragmentGrowingMode:H,imagePaintScaleModes:le,interactions:Ce,layerAlign:ce,layerDirection:oe,layerDistribute:ue,layerMode:se,linkTarget:tt,nodes:O,overflow:pe,paintMode:ae,positionType:ie,renderMode:st,renderTarget:it,scopeTypes:ot,sizing:V,textDecorations:J,textTransform:Ee,variableTransforms:lt,variableType:g,whiteSpace:fe},Symbol.toStringTag,{value:"Module"}));function ft(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 pt(e,r){var t;return(t=void 0)==null?void 0:t.get(r)}function L(e){var r,t;const a=typeof e;return a==="string"?`"${e}"`:a==="number"||a==="bigint"||a==="boolean"?`${e}`:a==="object"||a==="function"?(e&&((t=(r=Object.getPrototypeOf(e))==null?void 0:r.constructor)==null?void 0:t.name))??"null":a}function w(e,r,t,a,u){const c=u&&"input"in u?u.input:t.value,o=(u==null?void 0:u.expected)??e.expects??null,i=(u==null?void 0:u.received)??L(c),f={kind:e.kind,type:e.type,input:c,expected:o,received:i,message:`Invalid ${r}: ${o?`Expected ${o} but r`:"R"}eceived ${i}`,requirement:e.requirement,path:u==null?void 0:u.path,issues:u==null?void 0:u.issues,lang:a.lang,abortEarly:a.abortEarly,abortPipeEarly:a.abortPipeEarly},m=e.kind==="schema",p=(u==null?void 0:u.message)??e.message??pt(e.reference,f.lang)??(m?(f.lang,void 0):null)??a.message??(f.lang,void 0);p!==void 0&&(f.message=typeof p=="function"?p(f):p),m&&(t.typed=!1),t.issues?t.issues.push(f):t.issues=[f]}function P(e){return{version:1,vendor:"valibot",validate(r){return e["~run"]({value:r},ft())}}}function Te(e,r){return Object.hasOwn(e,r)&&r!=="__proto__"&&r!=="prototype"&&r!=="constructor"}function K(e,r){const t=[...new Set(e)];return t.length>1?`(${t.join(` ${r} `)})`:t[0]??"never"}function we(e,r){return{kind:"validation",type:"check",reference:we,async:!1,expects:null,requirement:e,message:r,"~run"(t,a){return t.typed&&!this.requirement(t.value)&&w(this,"input",t,a),t}}}function be(e,r){return{kind:"validation",type:"max_value",reference:be,async:!1,expects:`<=${e instanceof Date?e.toJSON():L(e)}`,requirement:e,message:r,"~run"(t,a){return t.typed&&!(t.value<=this.requirement)&&w(this,"value",t,a,{received:t.value instanceof Date?t.value.toJSON():L(t.value)}),t}}}function Pe(e){return{kind:"metadata",type:"metadata",reference:Pe,metadata:e}}function B(e,r){return{kind:"validation",type:"min_value",reference:B,async:!1,expects:`>=${e instanceof Date?e.toJSON():L(e)}`,requirement:e,message:r,"~run"(t,a){return t.typed&&!(t.value>=this.requirement)&&w(this,"value",t,a,{received:t.value instanceof Date?t.value.toJSON():L(t.value)}),t}}}function Fe(e){return{kind:"transformation",type:"transform",reference:Fe,async:!1,operation:e,"~run"(r){return r.value=this.operation(r.value),r}}}function Ie(e,r,t){return typeof e.fallback=="function"?e.fallback(r,t):e.fallback}function U(e,r,t){return typeof e.default=="function"?e.default(r,t):e.default}function ye(){return{kind:"schema",type:"any",reference:ye,expects:"any",async:!1,get"~standard"(){return P(this)},"~run"(e){return e.typed=!0,e}}}function M(e,r){return{kind:"schema",type:"array",reference:M,expects:"Array",async:!1,item:e,message:r,get"~standard"(){return P(this)},"~run"(t,a){var u;const c=t.value;if(Array.isArray(c)){t.typed=!0,t.value=[];for(let o=0;o<c.length;o++){const i=c[o],f=this.item["~run"]({value:i},a);if(f.issues){const m={type:"array",origin:"value",input:c,key:o,value:i};for(const p of f.issues)p.path?p.path.unshift(m):p.path=[m],(u=t.issues)==null||u.push(p);if(t.issues||(t.issues=f.issues),a.abortEarly){t.typed=!1;break}}f.typed||(t.typed=!1),t.value.push(f.value)}}else w(this,"type",t,a);return t}}}function v(e){return{kind:"schema",type:"boolean",reference:v,expects:"boolean",async:!1,message:e,get"~standard"(){return P(this)},"~run"(r,t){return typeof r.value=="boolean"?r.typed=!0:w(this,"type",r,t),r}}}function R(e,r){const t=[];for(const a in e)(`${+a}`!==a||typeof e[a]!="string"||!Object.is(e[e[a]],+a))&&t.push(e[a]);return{kind:"schema",type:"enum",reference:R,expects:K(t.map(L),"|"),async:!1,enum:e,options:t,message:r,get"~standard"(){return P(this)},"~run"(a,u){return this.options.includes(a.value)?a.typed=!0:w(this,"type",a,u),a}}}function Y(e){return{kind:"schema",type:"lazy",reference:Y,expects:"unknown",async:!1,getter:e,get"~standard"(){return P(this)},"~run"(r,t){return this.getter(r.value)["~run"](r,t)}}}function F(e,r){return{kind:"schema",type:"literal",reference:F,expects:L(e),async:!1,literal:e,message:r,get"~standard"(){return P(this)},"~run"(t,a){return t.value===this.literal?t.typed=!0:w(this,"type",t,a),t}}}function de(e,r){return{kind:"schema",type:"loose_object",reference:de,expects:"Object",async:!1,entries:e,message:r,get"~standard"(){return P(this)},"~run"(t,a){var u;const c=t.value;if(c&&typeof c=="object"){t.typed=!0,t.value={};for(const o in this.entries){const i=this.entries[o];if(o in c||(i.type==="exact_optional"||i.type==="optional"||i.type==="nullish")&&i.default!==void 0){const f=o in c?c[o]:U(i),m=i["~run"]({value:f},a);if(m.issues){const p={type:"object",origin:"value",input:c,key:o,value:f};for(const h of m.issues)h.path?h.path.unshift(p):h.path=[p],(u=t.issues)==null||u.push(h);if(t.issues||(t.issues=m.issues),a.abortEarly){t.typed=!1;break}}m.typed||(t.typed=!1),t.value[o]=m.value}else if(i.fallback!==void 0)t.value[o]=Ie(i);else if(i.type!=="exact_optional"&&i.type!=="optional"&&i.type!=="nullish"&&(w(this,"key",t,a,{input:void 0,expected:`"${o}"`,path:[{type:"object",origin:"key",input:c,key:o,value:c[o]}]}),a.abortEarly))break}if(!t.issues||!a.abortEarly)for(const o in c)Te(c,o)&&!(o in this.entries)&&(t.value[o]=c[o])}else w(this,"type",t,a);return t}}}function Ae(e){return{kind:"schema",type:"never",reference:Ae,expects:"never",async:!1,message:e,get"~standard"(){return P(this)},"~run"(r,t){return w(this,"type",r,t),r}}}function S(e,r){return{kind:"schema",type:"nullable",reference:S,expects:`(${e.expects} | null)`,async:!1,wrapped:e,default:r,get"~standard"(){return P(this)},"~run"(t,a){return t.value===null&&(this.default!==void 0&&(t.value=U(this,t,a)),t.value===null)?(t.typed=!0,t):this.wrapped["~run"](t,a)}}}function y(e){return{kind:"schema",type:"number",reference:y,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:w(this,"type",r,t),r}}}function b(e,r){return{kind:"schema",type:"object",reference:b,expects:"Object",async:!1,entries:e,message:r,get"~standard"(){return P(this)},"~run"(t,a){var u;const c=t.value;if(c&&typeof c=="object"){t.typed=!0,t.value={};for(const o in this.entries){const i=this.entries[o];if(o in c||(i.type==="exact_optional"||i.type==="optional"||i.type==="nullish")&&i.default!==void 0){const f=o in c?c[o]:U(i),m=i["~run"]({value:f},a);if(m.issues){const p={type:"object",origin:"value",input:c,key:o,value:f};for(const h of m.issues)h.path?h.path.unshift(p):h.path=[p],(u=t.issues)==null||u.push(h);if(t.issues||(t.issues=m.issues),a.abortEarly){t.typed=!1;break}}m.typed||(t.typed=!1),t.value[o]=m.value}else if(i.fallback!==void 0)t.value[o]=Ie(i);else if(i.type!=="exact_optional"&&i.type!=="optional"&&i.type!=="nullish"&&(w(this,"key",t,a,{input:void 0,expected:`"${o}"`,path:[{type:"object",origin:"key",input:c,key:o,value:c[o]}]}),a.abortEarly))break}}else w(this,"type",t,a);return t}}}function s(e,r){return{kind:"schema",type:"optional",reference:s,expects:`(${e.expects} | undefined)`,async:!1,wrapped:e,default:r,get"~standard"(){return P(this)},"~run"(t,a){return t.value===void 0&&(this.default!==void 0&&(t.value=U(this,t,a)),t.value===void 0)?(t.typed=!0,t):this.wrapped["~run"](t,a)}}}function T(e,r){return{kind:"schema",type:"picklist",reference:T,expects:K(e.map(L),"|"),async:!1,options:e,message:r,get"~standard"(){return P(this)},"~run"(t,a){return this.options.includes(t.value)?t.typed=!0:w(this,"type",t,a),t}}}function z(e,r,t){return{kind:"schema",type:"record",reference:z,expects:"Object",async:!1,key:e,value:r,message:t,get"~standard"(){return P(this)},"~run"(a,u){var c,o;const i=a.value;if(i&&typeof i=="object"){a.typed=!0,a.value={};for(const f in i)if(Te(i,f)){const m=i[f],p=this.key["~run"]({value:f},u);if(p.issues){const d={type:"object",origin:"key",input:i,key:f,value:m};for(const k of p.issues)k.path=[d],(c=a.issues)==null||c.push(k);if(a.issues||(a.issues=p.issues),u.abortEarly){a.typed=!1;break}}const h=this.value["~run"]({value:m},u);if(h.issues){const d={type:"object",origin:"value",input:i,key:f,value:m};for(const k of h.issues)k.path?k.path.unshift(d):k.path=[d],(o=a.issues)==null||o.push(k);if(a.issues||(a.issues=h.issues),u.abortEarly){a.typed=!1;break}}(!p.typed||!h.typed)&&(a.typed=!1),p.typed&&(a.value[p.value]=h.value)}}else w(this,"type",a,u);return a}}}function l(e){return{kind:"schema",type:"string",reference:l,expects:"string",async:!1,message:e,get"~standard"(){return P(this)},"~run"(r,t){return typeof r.value=="string"?r.typed=!0:w(this,"type",r,t),r}}}function Se(e){let r;if(e)for(const t of e)r?r.push(...t.issues):r=t.issues;return r}function $(e,r){return{kind:"schema",type:"union",reference:$,expects:K(e.map(t=>t.expects),"|"),async:!1,options:e,message:r,get"~standard"(){return P(this)},"~run"(t,a){let u,c,o;for(const i of this.options){const f=i["~run"]({value:t.value},a);if(f.typed)if(f.issues)c?c.push(f):c=[f];else{u=f;break}else o?o.push(f):o=[f]}if(u)return u;if(c){if(c.length===1)return c[0];w(this,"type",t,a,{issues:Se(c)}),t.typed=!0}else{if((o==null?void 0:o.length)===1)return o[0];w(this,"type",t,a,{issues:Se(o)})}return t}}}function Q(){return{kind:"schema",type:"unknown",reference:Q,expects:"unknown",async:!1,get"~standard"(){return P(this)},"~run"(e){return e.typed=!0,e}}}function Me(e,r,t){return{kind:"schema",type:"variant",reference:Me,expects:"Object",async:!1,key:e,options:r,message:t,get"~standard"(){return P(this)},"~run"(a,u){const c=a.value;if(c&&typeof c=="object"){let o,i=0,f=this.key,m=[];const p=(h,d)=>{for(const k of h.options){if(k.type==="variant")p(k,new Set(d).add(k.key));else{let E=!0,A=0;for(const x of d){const G=k.entries[x];if(x in c?G["~run"]({typed:!1,value:c[x]},u).issues:G.type!=="exact_optional"&&G.type!=="optional"&&G.type!=="nullish"){E=!1,f!==x&&(i<A||i===A&&x in c&&!(f in c))&&(i=A,f=x,m=[]),f===x&&m.push(k.entries[x].expects);break}A++}if(E){const x=k["~run"]({value:c},u);(!o||!o.typed&&x.typed)&&(o=x)}}if(o&&!o.issues)break}};if(p(this,new Set([this.key])),o)return o;w(this,"type",a,u,{input:c[f],expected:K(m,"|"),path:[{type:"object",origin:"value",input:c,key:f,value:c[f]}]})}else w(this,"type",a,u);return a}}}function _(...e){return{...e[0],pipe:e,get"~standard"(){return P(this)},"~run"(r,t){for(const a of e)if(a.kind!=="metadata"){if(r.issues&&(a.kind==="schema"||a.kind==="transformation")){r.typed=!1;break}(!r.issues||!t.abortEarly&&!t.abortPipeEarly)&&(r=a["~run"](r,t))}return r}}}const _e=we(e=>e.split(":").length===2),me=e=>{const r=t=>typeof t=="number"?`${t}px`:t;return n($([y(),l()]),{...e,fallback:e==null?void 0:e.fallback,transform:r})},C=_(l(),_e),n=(e,r)=>{const t=(r==null?void 0:r.overridable)??!0,a=(r==null?void 0:r.variable)??!1,u=[e];return a&&u.push(_(l(),_e)),t&&u.push(ye()),_(s($(u)),Fe((r==null?void 0:r.transform)??(c=>c)),Pe(r??{}))},ve=b({children:n(M(l()),{fallback:[],overridable:!1})}),I=b({_id:$([l(),y()]),_type:T(Object.keys(O))}),D=b({overrides:n(M(l()),{overridable:!1}),overrideFrom:n(S(l()),{overridable:!1})}),Z=b({position:n(R(Object.keys(ie)),{fallback:ie.absolute}),top:n(S(y()),{fallback:null,transform:e=>typeof e=="number"?Math.ceil(e):e}),left:n(S(y()),{fallback:null,transform:e=>typeof e=="number"?Math.ceil(e):e}),right:n(S(y()),{fallback:null,transform:e=>typeof e=="number"?Math.ceil(e):e}),bottom:n(S(y()),{fallback:null,transform:e=>typeof e=="number"?Math.ceil(e):e}),centerAnchorX:n(y(),{fallback:.5}),centerAnchorY:n(y(),{fallback:.5})}),ee=b({opacity:n(_(y(),B(0),be(1)),{fallback:1,variable:!0}),visible:n(v(),{fallback:!0,variable:!0}),rotate:n(y(),{fallback:null}),zIndex:n(y(),{fallback:null}),classnames:n(M(C),{fallback:[]})}),te=b({widthType:n(T(Object.keys(V)),{fallback:V.Fixed}),heightType:n(T(Object.keys(V)),{fallback:V.Fixed}),width:n(_(y(),B(0)),{fallback:0,transform:Math.ceil}),height:n(_(y(),B(0)),{fallback:0,transform:Math.ceil}),aspectRatio:n(y(),{fallback:-1}),minWidth:n(S(_(y(),B(-1))),{fallback:-1,transform:Math.ceil}),minWidthType:n(T(Object.keys(V)),{fallback:V.Fixed}),maxWidth:n(S(_(y(),B(-1))),{fallback:-1,transform:Math.ceil}),maxWidthType:n(T(Object.keys(V)),{fallback:V.Fixed}),minHeight:n(S(_(y(),B(-1))),{fallback:-1,transform:Math.ceil}),minHeightType:n(T(Object.keys(V)),{fallback:V.Fixed}),maxHeight:n(S(_(y(),B(-1))),{fallback:-1,transform:Math.ceil}),maxHeightType:n(T(Object.keys(V)),{fallback:V.Fixed})}),$e=b({layerMode:n(T(Object.keys(se)),{fallback:se.none}),layerAlign:n(T(Object.keys(ce)),{fallback:ce.start}),layerDirection:n(T(Object.keys(oe)),{fallback:oe.horizontal}),layerDistribute:n(T(Object.keys(ue)),{fallback:ue.start}),layerWrap:n(v(),{fallback:!1}),layerGap:n(_(y(),B(0)),{fallback:0}),padding:me({fallback:"0px"})}),ht=n(T(Object.keys(pe)),{fallback:pe.hidden}),bt=me({fallback:"0px"}),re=b({interactions:n(M(C),{fallback:[]})}),ke=b({cssOverride:n(l(),{fallback:""})}),yt=_(b({name:n(l(),{fallback:"Frame",overridable:!1}),isBreakpoint:n(v(),{fallback:!1,overridable:!1}),isPrimary:n(v(),{fallback:!1,overridable:!1}),border:n(C),paint:n(C),link:n(C),...ve.entries,...I.entries,...D.entries,parent:n(S(l()),{overridable:!1}),...Z.entries,...ee.entries,...te.entries,...$e.entries,...re.entries,...ke.entries,overflow:ht,borderRadius:bt})),dt=b({type:F("text"),text:l(),marks:s(M(b({rangeKey:l()})))}),mt=b({type:F("mention"),ref:l(),fallback:s(l())}),vt=b({type:F("hardBreak")}),kt=$([dt,mt,vt]),gt=b({type:F("paragraph"),content:M(kt)}),St=b({type:F("doc"),content:M(gt)}),xt=b({name:n(l(),{fallback:"Text",overridable:!1}),content:n(l(),{fallback:""}),doc:n(St,{fallback:{type:"doc",content:[]}}),styleRanges:n(M(C),{fallback:[]}),whiteSpace:n(R(Object.keys(fe)),{fallback:fe.pre}),textAlign:n(l(),{fallback:"left"}),fontSize:n(y(),{fallback:null,variable:!0}),fontWeight:n($([l(),y()]),{fallback:null,variable:!0}),fontFamily:n(l(),{fallback:null,variable:!0}),color:n(l(),{fallback:null,variable:!0}),lineHeight:n(y(),{fallback:null,variable:!0}),letterSpacing:n(y(),{fallback:null,variable:!0}),textDecoration:n(T(Object.keys(J)),{fallback:null}),textTransform:n(T(Object.keys(Ee)),{fallback:null}),parent:n(S(l()),{overridable:!1}),link:n(C),highlight:n(C),contentBinding:n(C),...I.entries,...D.entries,...ke.entries,...Z.entries,...ee.entries,...te.entries,...re.entries}),jt=b({name:n(l(),{fallback:"Fragment",overridable:!1}),parent:n(S(l()),{overridable:!1}),horizontalGrow:n(R(Object.keys(H)),{fallback:H.fill,overridable:!1}),verticalGrow:n(R(Object.keys(H)),{fallback:H.auto,overridable:!1}),properties:n(M(l()),{fallback:[],overridable:!1}),propsObject:n(S(C),{fallback:null,overridable:!1}),cssChunks:n(M(C),{fallback:[],overridable:!1}),...I.entries,...ve.entries}),Et=b({name:n(l(),{fallback:"Instance",overridable:!1}),fragment:n(y()),parent:n(S(l()),{overridable:!1}),props:n($([C,z(l(),$([l(),y(),v(),b({code:l(),name:l()})]))]),{fallback:{}}),link:n(C),...I.entries,...D.entries,...Z.entries,...te.entries,...ee.entries,...re.entries}),Ct=_(b({name:n(l(),{fallback:"Collection",overridable:!1}),parent:n(S(l()),{overridable:!1}),source:n(C,{}),border:n(C),paint:n(C),link:n(C),...ve.entries,...I.entries,...D.entries,...Z.entries,...ee.entries,...te.entries,...$e.entries,...re.entries,...ke.entries})),Ot=b({...D.entries,parent:n(S(l()),{overridable:!1}),position:n(_(y(),be(1),B(0)),{fallback:0}),value:n(l(),{fallback:"#000",variable:!0}),...I.entries}),Tt=b({...D.entries,parent:n(S(l()),{overridable:!1}),angle:n(y(),{fallback:0}),stops:n(M(C),{fallback:[]}),...I.entries}),wt=b({parent:n(S(l()),{overridable:!1}),chunkId:n(y()),enabled:n(v(),{fallback:!0,variable:!0}),...I.entries}),Pt=b({...D.entries,parent:n(S(l()),{overridable:!1}),type:n(T(Object.keys(ne)),{fallback:ne.None}),width:me({fallback:"1px"}),paint:n(C),...I.entries}),Ft=b({...D.entries,parent:n(S(l()),{overridable:!1}),type:n(T(Object.keys(ae)),{fallback:ae.None}),solid:n(l(),{fallback:"#fff"}),linearGradient:n(C),image:n(C),...I.entries}),It=b({...I.entries,...D.entries,parent:n(S(l()),{overridable:!1}),src:n(l()),scale:n(T(Object.keys(le)),{fallback:le.Auto})}),At=b({...D.entries,...I.entries,parent:n(S(l()),{overridable:!1}),href:n(l(),{fallback:null}),isNewTab:n(v(),{fallback:!0})}),Mt=b({parent:n(S(l()),{overridable:!1}),...I.entries,on:R(Object.keys(Ce)),event:n(C)}),_t=b({parent:n(S(l()),{overridable:!1}),value:n(l(),{fallback:""}),enabled:n(v(),{fallback:!0,variable:!0}),...I.entries}),$t=b({parent:n(S(l()),{overridable:!1}),goalId:n(y(),{overridable:!1}),...I.entries}),Vt=b({parent:n(S(l()),{overridable:!1}),target:n(C),value:n(ye()),...I.entries}),Dt=b({color:n(l(),{fallback:null}),lineHeight:n(y(),{fallback:null}),fontSize:n(y(),{fallback:null}),fontWeight:n($([l(),y()]),{fallback:400}),fontFamily:n(l(),{fallback:null}),textDecoration:n(T(Object.keys(J)),{fallback:null}),parent:n(S(l()),{overridable:!1}),...I.entries}),Gt=b({...D.entries,parent:n(S(l()),{overridable:!1}),color:n(l(),{fallback:null,variable:!0}),fontSize:n(y(),{fallback:null,variable:!0}),fontWeight:n($([l(),y()]),{fallback:400,variable:!0}),fontFamily:n(l(),{fallback:null,variable:!0}),lineHeight:n(y(),{fallback:null,variable:!0}),letterSpacing:n(y(),{fallback:null,variable:!0}),textDecoration:n(T(Object.keys(J)),{fallback:null,variable:!0}),...I.entries}),Ve=b({name:s(l(),"Number"),type:s(F(g.Number),g.Number),defaultValue:s(y(),0),required:s(v(),!1),editable:s(v(),!0),min:s(y(),1),max:s(y(),100),step:s(y(),1),displayStepper:s(v(),!0)}),De=b({name:s(l(),"Boolean"),type:s(F(g.Boolean),g.Boolean),defaultValue:s(v(),!1),required:s(v(),!1),editable:s(v(),!0)}),Ge=b({name:s(l(),"String"),type:s(F(g.String),g.String),defaultValue:s(l(),""),required:s(v(),!1),editable:s(v(),!0),placeholder:s(l(),""),isTextarea:s(v(),!1),isRich:s(v(),!1)}),Be=b({name:s(l(),"String"),type:s(F(g.Color),g.Color),defaultValue:s(l(),"#000"),required:s(v(),!1),editable:s(v(),!0)}),Bt=b({name:s(l(),"Event"),type:s(F(g.Event),g.Event),mode:s(T(Object.keys(he)),he.callback),defaultValue:s(Q(),null),required:s(v(),!1),editable:s(v(),!0)}),Ne=b({name:s(l(),"Link"),type:s(F(g.Link),g.Link),defaultValue:s(l(),""),required:s(v(),!1),editable:s(v(),!0)}),Le=b({name:s(l(),"Option"),type:s(F(g.Enum),g.Enum),defaultValue:s(l(),""),required:s(v(),!1),editable:s(v(),!0),cases:s(M(b({id:l(),name:l()})),[])}),Re=b({name:s(l(),"Image"),type:s(F(g.Image),g.Image),defaultValue:s(S(l()),null),required:s(v(),!1),editable:s(v(),!0)});function He(e){return b({name:s(l(),"Object"),type:s(F(g.Object),g.Object),defaultValue:s(z(l(),Q()),{}),fields:s(z(l(),Y(()=>We(e+1))),{}),required:s(v(),!1),editable:s(v(),!0)})}function qe(e){return b({name:s(l(),"Collection"),type:s(F(g.Array),g.Array),defaultValue:s(M(Q()),[]),definition:s(S(Y(()=>We(e+1))),null),required:s(v(),!1),editable:s(v(),!0)})}function We(e){return e>Oe?Ae():Me("type",[Ge,Ve,De,Be,Le,Ne,Re,He(e),qe(e)])}const Nt=He(0),Lt=qe(0),Rt=b({name:s(l(),"Goal"),type:s(F(g.Goal),g.Goal),defaultValue:s(S(y()),null),required:s(v(),!1),editable:s(v(),!0)});g.Number+"",g.Boolean+"",g.String+"",g.Color+"",g.Event+"",g.Link+"",g.Enum+"",g.Object+"",g.Image+"",g.Array+"",g.Goal+"";O.Frame+"",O.Text+"",O.Fragment+"",O.Instance+"",O.Collection+"",O.StopColor+"",O.LinearGradient+"",O.CssChunk+"",O.Border+"",O.Paint+"",O.ImagePaint+"",O.Link+"",O.Interaction+"",O.Classname+"",O.GoalEvent+"",O.MutateEvent+"",O.TextHighlight+"",O.TextStyleMark+"";const ze=Y(()=>de({_type:l(),_id:$([l(),y()]),children:s(M($([l(),ze])))}));O.Fragment;const Xe=(...e)=>e.reduce((r,t)=>(r[t]=t,r),{}),Ht={"Content-Type":"application/json"},qt=(e,r={},t={})=>{const{timeout:a}=t,u=new Map;return{get:(i,f={})=>{const m=`${e}${i}`;if(u.has(m))return u.get(m);const p=f.timeout??a,h=p!=null?AbortSignal.timeout(p):void 0,d=typeof r=="function"?r():r,k=fetch(m,{method:"GET",headers:{...Ht,...d},signal:h}).then(async E=>{if(!E.ok){let x={};try{x=await E.json()}catch{x={error:{code:"UNKNOWN",message:E.statusText}}}return{ok:!1,errorBody:x,status:E.status}}let A;try{A=await E.json()}catch{A=null}return{ok:!0,data:A,status:E.status}}).finally(()=>{u.delete(m)});return u.set(m,k),k},getAbsolute:i=>{fetch(i,{method:"GET",mode:"no-cors",credentials:"omit",keepalive:!0}).catch(f=>{console.error(f)})}}},Wt=e=>({sendBeacon:(t,a)=>{if(!t||typeof navigator>"u"||typeof(navigator==null?void 0:navigator.sendBeacon)!="function")return!1;try{return navigator.sendBeacon.bind(navigator)(t,a)}catch(u){return console.error(u),!1}}}),zt=e=>{var f,m,p,h;const r=(f=e==null?void 0:e.env)==null?void 0:f.backendEndpoint,t=(m=e==null?void 0:e.env)==null?void 0:m.apiToken,a=(p=e==null?void 0:e.env)==null?void 0:p.referer;if(!r)return;const u=()=>{var E,A,x;const d=(E=e==null?void 0:e.env)==null?void 0:E.filterOverrides,k={};return t&&(k["X-Api-Key"]=t),a&&(k.Referer=a),d!=null&&d.deviceType&&(k["X-Filter-Device-Type"]=d.deviceType),d!=null&&d.osType&&(k["X-Filter-OS-Type"]=d.osType),d!=null&&d.page&&(k["X-Filter-Page"]=d.page),(A=d==null?void 0:d.geo)!=null&&A.code?k["X-Filter-Geo"]=d.geo.code:d!=null&&d.ip&&(k["X-Filter-IP"]=d.ip),(x=e==null?void 0:e.env)!=null&&x.debug&&(k["X-Debug"]="true"),k},c=(h=e==null?void 0:e.env)==null?void 0:h.timeout,o=qt(r,u,{timeout:c}),i=Wt();e.$fetch={get:o.get,sendBeacon:i.sendBeacon,getAbsolute:o.getAbsolute}},Xt=typeof window<"u",xe=new Set,Jt=e=>{try{const r=new Image;r.referrerPolicy="no-referrer";const t=()=>{r.removeEventListener("load",t),r.removeEventListener("error",t),xe.delete(r)};r.addEventListener("load",t,{once:!0}),r.addEventListener("error",t,{once:!0}),xe.add(r),r.src=e}catch{}},Kt=(e,r)=>{if(typeof r!="function")return!1;try{return r(e),!0}catch{return!1}},Ut=e=>{if(typeof navigator>"u"||typeof navigator.sendBeacon!="function")return!1;try{return navigator.sendBeacon(e)}catch{return!1}},Yt=(e,r,t)=>{if(!Xt)return;const a=e==null?void 0:e.trim();if(a){if(typeof r=="function")try{if(r(a)===!0)return}catch{}Ut(a)||Kt(a,t)||Jt(a)}},je=Xe("INIT_SESSION","RELEASE_SESSION","REACH_PROJECT_GOAL"),Je=e=>{const r=(u,c)=>{var i;if(u!==je.REACH_PROJECT_GOAL||!c)return;const o=new URLSearchParams({goal_id:String(c.goalId),variant_id:String(c.variantId),area_id:String(c.areaId),campaign_id:String(c.campaignId)});(i=e.$fetch)==null||i.get(`/api/metric/goal?${o}`).catch(()=>{})},t=u=>{r(je.REACH_PROJECT_GOAL,u)},a=u=>{var o,i;const c=((o=e.$fetch)==null?void 0:o.getAbsolute)!=null?f=>e.$fetch.getAbsolute(f):void 0;Yt(u,(i=e==null?void 0:e.$fetch)==null?void 0:i.sendBeacon,c)};e.$metrics={reachGoal:t,trackAdPixel:a}},Ke=e=>{const r=new Map,t=new Map,a=new Map,u=(i,f)=>{if(r.has(i))return Promise.resolve(r.get(i));if(t.has(i))return t.get(i);a.delete(i);const m=`/api/area/${i}/compiled`,p=(async()=>{var E,A,x,G,ge;const h=await e.$fetch.get(m);if(!h.ok){const N=h.errorBody;throw new q(((E=N==null?void 0:N.error)==null?void 0:E.code)??"UNKNOWN",((A=N==null?void 0:N.error)==null?void 0:A.message)??String(h.status),(x=N==null?void 0:N.error)==null?void 0:x.details,h.status)}const d=h.data;if(d.apiVersion!==1)throw new X(1,d.apiVersion);(G=e.$fragments)==null||G.populate(d.fragments??{}),(ge=e.$cssChunks)==null||ge.populate(d.cssChunks??{});const k={rootFragmentId:d.rootFragmentId,props:d.props??{},projectProperties:d.projectProperties??{},globalCssUrl:d.globalCssUrl??null};return r.set(i,k),k})();return t.set(i,p),p.catch(h=>{a.set(i,h)}).finally(()=>{t.delete(i)}),p},c=i=>{if(r.has(i))return r.get(i);throw t.has(i)?t.get(i):a.has(i)?a.get(i):new q("AREA_NOT_RESOLVED",`Area ${i} not resolved — call $area.resolve(code) before read()`)},o=i=>r.has(i)||a.has(i);e.$area={resolve:u,read:c,has:o}};function Ue(e){const r=(e==null?void 0:e.importer)??(t=>import(t));return t=>{const a=new Map,u=p=>a.has(p),c=p=>{var h;return(h=a.get(p))==null?void 0:h.ref},o=p=>{var h;return(h=a.get(p))==null?void 0:h.schema},i=p=>{var h;return(h=a.get(p))==null?void 0:h.scopeClass},f=p=>{const h=a.get(p);if(h===void 0)throw new W(p,"",new Error(`Fragment ${p} not populated — call populate() before read()`));if(h.status==="pending")throw h.promise;if(h.status==="error")throw h.error;return h.component},m=p=>{Object.entries(p).forEach(([h,d])=>{const k=Number(h);if(a.has(k))return;const E={status:"pending",promise:Promise.resolve(),ref:d},A=r(d.moduleUrl).then(x=>(E.status="success",E.component=x.default,E.schema=x.schema,E.scopeClass=typeof x.scopeClass=="string"?x.scopeClass:void 0,x.default),x=>{const G=new W(k,d.moduleUrl,x);throw E.status="error",E.error=G,G});E.promise=A,a.set(k,E),A.catch(()=>{})})};t.$fragments={has:u,read:f,populate:m,getRef:c,getSchema:o,getScopeClass:i}}}const Ye=Ue();function Qe(e){return r=>{const t=new Map;r.$cssChunks={has:a=>t.has(a),populate:a=>{for(const[u,c]of Object.entries(a)){const o=Number(u);if(t.has(o))continue;const i=e.inject(c.cssUrl,`chunk:${o}`);t.set(o,{ref:c,cleanup:i})}}}}}const Qt=Xe("GlobalManager"),Zt=e=>{const r=()=>()=>{};return Ze.createState({_type:"GlobalManager",initialState:{},skip:[et.allowTypes([...Object.keys(ut.nodes),...Object.keys(Qt)])],plugins:[t=>{t.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}},t=>{(e==null?void 0:e.projectId)!=null&&(t.$project={projectId:e.projectId})},...(e==null?void 0:e.plugins)??[],zt,Je,Ke,Ye,Qe({inject:(e==null?void 0:e.inject)??r})]})};exports.FragmentsApiVersionError=X;exports.FragmentsAreaError=q;exports.FragmentsLoadError=W;exports.areaPlugin=Ke;exports.createCssChunksCachePlugin=Qe;exports.createFragmentsCachePlugin=Ue;exports.createFragmentsClient=Zt;exports.fragmentsCachePlugin=Ye;exports.globalMetricsPlugin=Je;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Public barrel @fragmentsx/fragments-client — полный public API (Plan 02).
3
+ *
4
+ * Экспортирует: types, errors, createFragmentsClient, $area, $fragments, $cssChunks, metrics.
5
+ *
6
+ * Трёхслэшевая директива гарантирует, что declarations.d.ts (ambient module augmentation
7
+ * GraphState) попадает в граф компиляции при любом импорте через path-mapping из внешних
8
+ * пакетов (runtime-react, playgrounds и т.д.).
9
+ */
10
+ export type { AreaResolveResponse, FragmentRef, CssChunkRef, ResolvedValue, FieldId, } from './types';
11
+ export { FragmentsAreaError, FragmentsApiVersionError, FragmentsLoadError, } from './errors';
12
+ export { createFragmentsClient } from './createFragmentsClient';
13
+ export type { Options as CreateFragmentsClientOptions } from './createFragmentsClient';
14
+ export { fragmentsCachePlugin, createFragmentsCachePlugin } from './$fragments';
15
+ export type { FragmentsCacheNamespace, CreateFragmentsCachePluginOpts } from './$fragments';
16
+ export { createCssChunksCachePlugin } from './$cssChunks';
17
+ export { areaPlugin } from './$area';
18
+ export type { AreaResolveResult } from './$area';
19
+ export { globalMetricsPlugin } from './metrics/globalMetrics';
20
+ //# sourceMappingURL=index.d.ts.map