@fragmentsx/fragments-client 0.1.0 → 0.2.0-dev-20260901074721

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.
@@ -0,0 +1,92 @@
1
+ import { FragmentsCacheNamespace } from './$fragments/index';
2
+ import { AreaNamespace } from './$area/index';
3
+ import { CssChunkRef } from './types';
4
+ import { RestResult } from './fetch/restFetcher';
5
+ export type { AreaNamespace } from './$area/index';
6
+ /**
7
+ * FilterOverrides — форма значений таргетинга, читаемых compiled fetch-транспортом
8
+ * при построении заголовков `X-Filter-*` (quick 260830-rvp, INT-07: вынесена в
9
+ * именованный тип, раньше была анонимно вложена в `FragmentsEnv`).
10
+ */
11
+ export interface FilterOverrides {
12
+ deviceType?: string;
13
+ osType?: string;
14
+ page?: string;
15
+ geo?: {
16
+ code?: string;
17
+ };
18
+ ip?: string;
19
+ }
20
+ /**
21
+ * FragmentsEnv — типизированная форма `state.env`, которую читает compiled chain.
22
+ * Зеркалирует inline buildHeaders(env: {...}) из legacy compiled/$area/index.ts:82-127.
23
+ * D-05: убирает зависимость от широкого union'а Scalar в state.env.* доступах.
24
+ */
25
+ export interface FragmentsEnv {
26
+ backendEndpoint?: string;
27
+ apiToken?: string;
28
+ referer?: string;
29
+ debug?: boolean;
30
+ timeout?: number;
31
+ filterOverrides?: FilterOverrides;
32
+ }
33
+ /**
34
+ * FetchNamespace — низкоуровневый транспорт с тремя capabilities.
35
+ * Реализуется fetchPlugin (packages/fragments-client/src/fetch/index.ts).
36
+ *
37
+ * - get: baseUrl-relative GET с typed-error mapping (D-04, используется $area.resolve)
38
+ * - sendBeacon: пропускает url+body в navigator.sendBeacon напрямую (CR-01 fix)
39
+ * сигнатура (url, body?) => boolean честно отражает реализацию
40
+ * - getAbsolute: cross-origin fire-and-forget GET без baseUrl prefix (CR-02 fix)
41
+ * для ad pixel / third-party tracker URL; mode: no-cors, credentials: omit
42
+ */
43
+ export interface FetchNamespace {
44
+ get: <T = unknown>(path: string) => Promise<RestResult<T>>;
45
+ sendBeacon: (url: string, body?: BodyInit | null) => boolean;
46
+ getAbsolute?: (url: string) => void;
47
+ }
48
+ /**
49
+ * CssChunksNamespace — кэш CSS chunk'ов с DOM injection.
50
+ * Idempotent populate — повторный вызов с тем же id игнорируется.
51
+ *
52
+ * quick-260831-etq: `populate` возвращает `Promise<void>` готовности
53
+ * (settles по `loaded` всех чанков, включая уже закэшированные).
54
+ */
55
+ export interface CssChunksNamespace {
56
+ has: (id: number) => boolean;
57
+ populate: (refs: Record<number, CssChunkRef>) => Promise<void>;
58
+ }
59
+ declare module "@graph-state/core" {
60
+ interface GraphState {
61
+ /**
62
+ * Conditional env shape для compiled-flow.
63
+ * Не пересекается с widegate Scalar — даёт точные типы при `state.env.filterOverrides.deviceType` и пр.
64
+ */
65
+ env?: FragmentsEnv;
66
+ /**
67
+ * Namespace resolve compiled area.
68
+ */
69
+ $area?: AreaNamespace;
70
+ /**
71
+ * Кэш загруженных compiled fragment ComponentType'ов.
72
+ * Suspense protocol: read() бросает Promise (pending) или Error (error).
73
+ */
74
+ $fragments?: FragmentsCacheNamespace;
75
+ /**
76
+ * Кэш CSS chunk'ов с DOM injection.
77
+ */
78
+ $cssChunks?: CssChunksNamespace;
79
+ /**
80
+ * Fetch namespace — низкоуровневый транспорт.
81
+ */
82
+ $fetch?: FetchNamespace;
83
+ /**
84
+ * quick 260830-rvp, INT-07: живая смена таргетинга. Мержит переданные
85
+ * overrides поверх текущих на верхнем уровне (`geo` заменяется целиком) —
86
+ * монтируется createFragmentsClient, потребляется fetchPlugin (buildHeaders
87
+ * читает `state.env.filterOverrides` лениво, на каждый запрос).
88
+ */
89
+ setFilters?: (overrides: Partial<FilterOverrides>) => void;
90
+ }
91
+ }
92
+ //# sourceMappingURL=namespaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namespaces.d.ts","sourceRoot":"","sources":["../src/namespaces.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,KAAK,OAAO,CAAC;IAC7D,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IAC7B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAChE;AAED,OAAO,QAAQ,mBAAmB,CAAC;IACjC,UAAU,UAAU;QAClB;;;WAGG;QACH,GAAG,CAAC,EAAE,YAAY,CAAC;QACnB;;WAEG;QACH,KAAK,CAAC,EAAE,aAAa,CAAC;QACtB;;;WAGG;QACH,UAAU,CAAC,EAAE,uBAAuB,CAAC;QACrC;;WAEG;QACH,UAAU,CAAC,EAAE,kBAAkB,CAAC;QAChC;;WAEG;QACH,MAAM,CAAC,EAAE,cAAc,CAAC;QACxB;;;;;WAKG;QACH,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC;KAC5D;CACF"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Единственный источник истины по seam'у DOM-инъекции CSS/шрифтов и по
3
+ * построителям ключей `<link>` (BLOCKER-4, key parity — quick-260831-etq).
4
+ *
5
+ * Три плагина ($fragments, $cssChunks, $area) и рендер (`FragmentRenderer` в
6
+ * `@fragmentsx/runtime-react`) обязаны строить ключ ОДНИМ и тем же построителем
7
+ * — иначе ранний инжект (эта задача) и `<FragmentStylesheet>` в рендере дадут
8
+ * два `<link>` на один href вместо ref-count дедупа.
9
+ *
10
+ * `loaded` в `StylesheetHandle` опционален: граница `fragments-client` не
11
+ * вправе требовать DOM-возможностей от инжектора — `readyOf` трактует их
12
+ * отсутствие как «ждать нечего», а не как сбой.
13
+ */
14
+ /** Handle DOM-инъекции стиля — совместим с `injectStylesheet` из `@fragmentsx/runtime-react`. */
15
+ export type StylesheetHandle = (() => void) & {
16
+ loaded?: Promise<void>;
17
+ };
18
+ /** DI seam для DOM-инъекции — реализуется `injectStylesheet` (runtime-react). */
19
+ export type InjectFn = (href: string, key: string) => StylesheetHandle;
20
+ /**
21
+ * Готовность CSS у уже инжектированного handle. Отсутствие канала готовности
22
+ * (легаси-инжектор/мок без `loaded`) означает «ждать нечего», а не сбой.
23
+ */
24
+ export declare const readyOf: (handle: StylesheetHandle | undefined) => Promise<void>;
25
+ /** Ключ `<link>` для собственного CSS фрагмента `id`. */
26
+ export declare const fragmentCssKey: (id: number) => string;
27
+ /** Ключ `<link>` для `@font-face` CSS фрагмента `id`. */
28
+ export declare const fragmentFontsKey: (id: number) => string;
29
+ /** Ключ `<link>` для CSS chunk'а `id` — формат, уже используемый `$cssChunks`. */
30
+ export declare const cssChunkKey: (id: number) => string;
31
+ /** Ключ `<link>` для глобального baseline reset CSS области. */
32
+ export declare const AREA_GLOBAL_CSS_KEY = "global";
33
+ //# sourceMappingURL=stylesheet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stylesheet.d.ts","sourceRoot":"","sources":["../src/stylesheet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,iGAAiG;AACjG,MAAM,MAAM,gBAAgB,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC;AAEzE,iFAAiF;AACjF,MAAM,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,gBAAgB,CAAC;AAEvE;;;GAGG;AACH,eAAO,MAAM,OAAO,GAAI,QAAQ,gBAAgB,GAAG,SAAS,KAAG,OAAO,CAAC,IAAI,CACtC,CAAC;AAEtC,yDAAyD;AACzD,eAAO,MAAM,cAAc,GAAI,IAAI,MAAM,KAAG,MAA8B,CAAC;AAE3E,yDAAyD;AACzD,eAAO,MAAM,gBAAgB,GAAI,IAAI,MAAM,KAAG,MAAgC,CAAC;AAE/E,kFAAkF;AAClF,eAAO,MAAM,WAAW,GAAI,IAAI,MAAM,KAAG,MAAuB,CAAC;AAEjE,gEAAgE;AAChE,eAAO,MAAM,mBAAmB,WAAW,CAAC"}
package/dist/types.d.ts CHANGED
@@ -66,6 +66,15 @@ export interface AreaResolveResponse {
66
66
  areaCode: string;
67
67
  /** Идентификатор root фрагмента — ключ в `fragments` map. */
68
68
  rootFragmentId: number;
69
+ /**
70
+ * Quick 260831-dor (INT-10): id выбранного варианта — вход для атрибуции
71
+ * на стороне площадки-потребителя.
72
+ *
73
+ * Поле аддитивное и опциональное на границе HTTP: старый сервер (до этой
74
+ * правки) его не отдаёт. Тот же приём, что применён к `props`/`projectProperties`
75
+ * ниже в этом же интерфейсе.
76
+ */
77
+ variantId?: number;
69
78
  /** Flat map всех reachable фрагментов (root + все nested). Keyed by fragment id. */
70
79
  fragments: Record<number, FragmentRef>;
71
80
  /** Flat map CSS chunks. Keyed by chunk id. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAE7B;;;GAGG;AACH,KAAK,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GACrB,cAAc,GACd;IAAE,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CAAA;CAAE,GACjC,KAAK,CAAC;IAAE,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CAAA;CAAE,CAAC,CAAC;AAE7C;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,mBAAmB;IAClC,mEAAmE;IACnE,UAAU,EAAE,CAAC,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,cAAc,EAAE,MAAM,CAAC;IACvB,oFAAoF;IACpF,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACvC,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACvC;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACtC;;;;;;;;;;;;;;;OAeG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAClD;;;;;OAKG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAE7B;;;GAGG;AACH,KAAK,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GACrB,cAAc,GACd;IAAE,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CAAA;CAAE,GACjC,KAAK,CAAC;IAAE,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CAAA;CAAE,CAAC,CAAC;AAE7C;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,mBAAmB;IAClC,mEAAmE;IACnE,UAAU,EAAE,CAAC,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACvC,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACvC;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACtC;;;;;;;;;;;;;;;OAeG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAClD;;;;;OAKG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fragmentsx/fragments-client",
3
3
  "private": false,
4
- "version": "0.1.0",
4
+ "version": "0.2.0-dev-20260901074721",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",