@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
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Регрессионные тесты для globalMetricsPlugin (CR-02).
3
+ *
4
+ * CR-02 fix: fetcher больше не строит double-prefix URL через state.$fetch.get(absolutePixelUrl).
5
+ * Вместо этого использует state.$fetch.getAbsolute(pixelUrl) — без baseUrl concat.
6
+ *
7
+ * Тесты:
8
+ * 1. sendAdPixel(pixelUrl) при наличии state.$fetch.getAbsolute → передаёт fetcher в trackAdPixel
9
+ * 2. restFetcher.getAbsolute не конкатенирует baseUrl (тест на уровне module)
10
+ * 3. getAbsolute — fire-and-forget, не падает при ошибке fetch
11
+ * 4. getAbsolute опции: method GET, mode no-cors, credentials omit, keepalive true
12
+ * 5. state.$fetch mock содержит get, sendBeacon, getAbsolute
13
+ * 6. Regression-guard CR-02: state.$fetch.get НЕ вызван с абсолютным pixelUrl
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=globalMetrics.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"globalMetrics.test.d.ts","sourceRoot":"","sources":["../../../src/metrics/__tests__/globalMetrics.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
@@ -0,0 +1,18 @@
1
+ import { Plugin } from '@graph-state/core';
2
+ declare module "@graph-state/core" {
3
+ interface GraphState {
4
+ $metrics: {
5
+ reachGoal: (goal: GoalInfo) => void;
6
+ trackAdPixel: (pixelUrl: string) => void;
7
+ };
8
+ }
9
+ }
10
+ interface GoalInfo {
11
+ areaId: number;
12
+ campaignId: number;
13
+ goalId: number;
14
+ variantId: number;
15
+ }
16
+ export declare const globalMetricsPlugin: Plugin;
17
+ export {};
18
+ //# sourceMappingURL=globalMetrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"globalMetrics.d.ts","sourceRoot":"","sources":["../../src/metrics/globalMetrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAIhD,OAAO,QAAQ,mBAAmB,CAAC;IACjC,UAAU,UAAU;QAClB,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;YACpC,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;SAC1C,CAAC;KACH;CACF;AAQD,UAAU,QAAQ;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,mBAAmB,EAAE,MAiCjC,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * trackAdPixel — отправка рекламного пикселя через доступный транспорт.
3
+ *
4
+ * Порядок приоритетов (sendBeacon-first):
5
+ * 1. customBeacon — capability переданная из globalMetricsPlugin (state.$fetch.sendBeacon)
6
+ * 2. navigator.sendBeacon — нативный браузерный API
7
+ * 3. fetcher — fetch-capability переданная как параметр (D-04/CCORE-04: без прямого вызова глобального fetch)
8
+ * 4. Image pixel fallback — последний резерв
9
+ *
10
+ * D-04 / CCORE-04: fetch-fallback маршрутизируется через compiled fetchPlugin (Plan 02), без raw globals.
11
+ * Вместо этого принимает fetcher как параметр, маршрутизируемый через
12
+ * compiled fetchPlugin в Plan 02 (zero-fetch target по всему src/).
13
+ *
14
+ * TODO(Plan-02): fetcher параметр заполняется из state.$fetch.get в globalMetricsPlugin.
15
+ */
16
+ type BeaconSender = (url: string) => boolean | void;
17
+ /**
18
+ * Функция-fetcher для fallback — принимается как параметр (НЕ raw fetch).
19
+ * В Plan 02 будет маршрутизироваться через compiled fetchPlugin.get().
20
+ */
21
+ type FetcherFn = (url: string) => void;
22
+ /**
23
+ * Отправляет ad pixel через доступный транспорт.
24
+ *
25
+ * @param pixelUrl - URL рекламного пикселя
26
+ * @param customBeacon - опциональный beacon sender (state.$fetch.sendBeacon из globalMetricsPlugin)
27
+ * @param fetcher - опциональный fetch-capability для fallback (маршрутизируется через fetchPlugin в Plan 02)
28
+ */
29
+ export declare const trackAdPixel: (pixelUrl: string, customBeacon?: BeaconSender, fetcher?: FetcherFn) => void;
30
+ export {};
31
+ //# sourceMappingURL=trackAdPixel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trackAdPixel.d.ts","sourceRoot":"","sources":["../../src/metrics/trackAdPixel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,KAAK,YAAY,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,GAAG,IAAI,CAAC;AAEpD;;;GAGG;AACH,KAAK,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;AAyDvC;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,GACvB,UAAU,MAAM,EAChB,eAAe,YAAY,EAC3B,UAAU,SAAS,SAoCpB,CAAC"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Runtime contract для `/api/area/<code>/compiled` endpoint (D-03).
3
+ *
4
+ * Типы описывают flat manifest ответ backend'а при eager full-graph traversal.
5
+ * Downstream потребители: `$area.resolve`, `$fragments`, `$cssChunks` namespaces,
6
+ * хуки `useArea` / `useFragmentComponent` из `@fragmentsx/runtime-react`.
7
+ *
8
+ * Ref: Req #2 / D-02 namespace shape (05.2-SPEC.md)
9
+ */
10
+ /**
11
+ * Идентификатор поля Object/Array Variable.
12
+ * Используется в nested `ResolvedValue` как ключ record'а.
13
+ */
14
+ export type FieldId = string;
15
+ /**
16
+ * Скалярное resolved значение переменной.
17
+ * @internal
18
+ */
19
+ type ResolvedScalar = string | number | boolean | null;
20
+ /**
21
+ * Resolved значение property уровня — скаляр, объект или массив объектов.
22
+ *
23
+ * - scalar: Color/String/Number/Boolean
24
+ * - Object Variable → Record<FieldId, ResolvedValue> (META-ключи `_type`/`_id`/`parent` отсутствуют)
25
+ * - Array Variable → Array<Record<FieldId, ResolvedValue>> по definition.fields shape
26
+ */
27
+ export type ResolvedValue = ResolvedScalar | {
28
+ [key: FieldId]: ResolvedValue;
29
+ } | Array<{
30
+ [key: FieldId]: ResolvedValue;
31
+ }>;
32
+ /**
33
+ * Ссылка на compiled fragment artifact.
34
+ *
35
+ * Req #2 + Req #11 fontsUrl slot:
36
+ * - `moduleUrl` — CDN URL `.js` ESM bundle скомпилированного фрагмента
37
+ * - `cssUrl` — CDN URL `.css` статического стиля фрагмента
38
+ * - `fontsUrl` — CDN URL `.fonts.css` с `@font-face` правилами;
39
+ * `null` если фрагмент не использует шрифты
40
+ */
41
+ export interface FragmentRef {
42
+ id: number;
43
+ contentHash: string;
44
+ moduleUrl: string;
45
+ cssUrl: string;
46
+ fontsUrl: string | null;
47
+ }
48
+ /**
49
+ * Ссылка на CSS chunk (общий CSS artifact).
50
+ */
51
+ export interface CssChunkRef {
52
+ id: number;
53
+ cssUrl: string;
54
+ }
55
+ /**
56
+ * Flat manifest ответ от `/api/area/<code>/compiled` endpoint.
57
+ *
58
+ * Req #2 / D-02 namespace shape:
59
+ * - `apiVersion: 1` — литеральный тип для forward-incompat strict equality (D-14)
60
+ * - `fragments` — flat map всех reachable фрагментов включая root и nested
61
+ * - `props` — готовые значения props корневого артефакта (Phase 73, B-02)
62
+ */
63
+ export interface AreaResolveResponse {
64
+ /** Версия manifest протокола. Клиент проверяет strict equality. */
65
+ apiVersion: 1;
66
+ areaCode: string;
67
+ /** Идентификатор root фрагмента — ключ в `fragments` map. */
68
+ rootFragmentId: number;
69
+ /** Flat map всех reachable фрагментов (root + все nested). Keyed by fragment id. */
70
+ fragments: Record<number, FragmentRef>;
71
+ /** Flat map CSS chunks. Keyed by chunk id. */
72
+ cssChunks: Record<number, CssChunkRef>;
73
+ /**
74
+ * Phase 73, B-02/B-06: готовые значения props корневого артефакта — привязки
75
+ * `{$ref:{scope,name}}` из `Variant.props` уже разрешены сервером
76
+ * (`resolveVariantProps`, `@fragmentsx/definition`). Автоподстановки по имени
77
+ * (снятый `_id`-канал) больше нет — B-13.
78
+ *
79
+ * Поле аддитивное и опциональное на границе HTTP: старый сервер (до плана
80
+ * 73-05) его не отдаёт.
81
+ */
82
+ props?: Record<string, ResolvedValue>;
83
+ /**
84
+ * Phase 72, D-72-01/D-72-02: словарь переменных ПРОЕКТА (ключ — `name`,
85
+ * значение — голое, без типа/дескриптора переменной) — вход для
86
+ * `useProjectProperty` из `@fragmentsx/runtime-react`.
87
+ *
88
+ * Отдельное поле, а не часть `props`: `props` несёт только резолв конкретных
89
+ * привязок props корневого артефакта, а этот словарь — строго project-only
90
+ * (D-72-05) и доступен `useProjectProperty` в любом узле дерева, не только
91
+ * в props корневого артефакта — одноимённая area-переменная другого типа
92
+ * через общий каскад уронила бы артефакт целиком, и запрет A-14 её не сторожит.
93
+ *
94
+ * Содержимое шейкнуто (D-72-03): в ответ попадают только имена, которые
95
+ * реально читает хотя бы один TSX-артефакт области, а не весь словарь проекта.
96
+ *
97
+ * Поле аддитивное и опциональное: документный путь на него не опирается.
98
+ */
99
+ projectProperties?: Record<string, ResolvedValue>;
100
+ /**
101
+ * URL к глобальному baseline reset CSS ([data-key^="Text"], [data-key^="Fragment"]).
102
+ * Аналог `globalStylesheetPlugin` из JIT pipeline, доставляется backend'ом как
103
+ * статический shared resource (immutable cache).
104
+ * `null` — backend не настроен возвращать global reset (legacy / dev).
105
+ */
106
+ globalCssUrl: string | null;
107
+ }
108
+ export {};
109
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Локальная копия `createConstants` из `@fragmentsx/utils` (quick-260830-kyg,
3
+ * задача 3) — пакет утилит перестаёт быть зависимостью compile-пути.
4
+ *
5
+ * Дженерик переносится дословно, с сигнатурой `<K extends string>` и
6
+ * возвращаемым отображением `{ [P in K]: P }`: упрощение до `string` молча
7
+ * лишило бы потребителей (`PLUGIN_TYPES`) литеральных типов.
8
+ */
9
+ export declare const createConstants: <K extends string>(...constants: K[]) => { [P in K]: P; };
10
+ //# sourceMappingURL=createConstants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createConstants.d.ts","sourceRoot":"","sources":["../../src/utils/createConstants.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAAI,CAAC,SAAS,MAAM,EAAE,GAAG,WAAW,CAAC,EAAE,QACtC,CAAC,YAI7B,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Локальная копия `isBrowser` из `@fragmentsx/utils` (quick-260830-kyg,
3
+ * задача 3) — пакет утилит перестаёт быть зависимостью compile-пути.
4
+ *
5
+ * Собственная копия здесь обязательна: импортировать `isBrowser` из
6
+ * `@fragmentsx/runtime-react` нельзя — тот пакет зависит от этого
7
+ * (`fragments-client`), импорт в обратную сторону дал бы циклическую
8
+ * зависимость.
9
+ */
10
+ export declare const isBrowser: boolean;
11
+ //# sourceMappingURL=isBrowser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isBrowser.d.ts","sourceRoot":"","sources":["../../src/utils/isBrowser.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,eAAO,MAAM,SAAS,SAAgC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@fragmentsx/fragments-client",
3
+ "private": false,
4
+ "version": "0.1.0",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/FireworksX/fragments.git",
9
+ "directory": "packages/fragments-client"
10
+ },
11
+ "type": "module",
12
+ "files": [
13
+ "dist"
14
+ ],
15
+ "publishConfig": {
16
+ "access": "public"
17
+ },
18
+ "types": "./dist/index.d.ts",
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/index.d.ts",
22
+ "import": "./dist/index.es.js",
23
+ "require": "./dist/index.cjs.js",
24
+ "source": "./src/index.ts"
25
+ }
26
+ },
27
+ "dependencies": {
28
+ "@graph-state/checkers": "^0.1.3",
29
+ "@graph-state/core": "^0.13.3"
30
+ },
31
+ "devDependencies": {
32
+ "@graph-state/plugin-logger": "^0.3.0",
33
+ "typescript": "^5.5.4",
34
+ "vite": "^6.1.0",
35
+ "vite-plugin-dts": "^4.5.0",
36
+ "vitest": "^3.1.1",
37
+ "@fragmentsx/definition": "0.2.3"
38
+ },
39
+ "scripts": {
40
+ "clear": "rm -r -f ./dist",
41
+ "build": "vite build",
42
+ "dev": "vite build -w",
43
+ "test": "vitest --run --config ./vitest.config.ts",
44
+ "lint": "eslint . --ext .ts,.tsx --fix"
45
+ }
46
+ }