@yaoxiu/marketing-dsl 1.4.0 → 1.5.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.
package/README.md CHANGED
@@ -158,3 +158,45 @@ buildAiPrompt(); // 生成喂给 AI 的提示词
158
158
  章节正文是**数据**(`DocBlock` 数组)不是字符串:调试台按块渲染成页面,`toMarkdown` 导出成 markdown,
159
159
  同一份内容两边永远一致。节点类型 / 动作 / 样式白名单 / 埋点事件名正则等清单一律从解释器常量取,
160
160
  并经 `reconcileRows` 对账——解释器加了东西而文档没跟上,会在文档页面上直接标出来。
161
+
162
+ ---
163
+
164
+ ## 上报契约(`/report` 子路径)
165
+
166
+ 物料的曝光 / 点击 / 关闭要如实上报给后端。**「运行时事件 → 上报载荷」这一步的映射是纯函数,
167
+ 放在这个包的 `/report` 子路径里**,前台(`move-front`)与后台调试台(`moveback-front`)共用同一份:
168
+
169
+ ```ts
170
+ import {
171
+ mapRuntimeEventToReport,
172
+ buildExposureReport,
173
+ } from '@yaoxiu/marketing-dsl/report';
174
+ import type { MarketingReportParams } from '@yaoxiu/marketing-dsl/report';
175
+
176
+ // 宿主把物料画到页面上时主动发(曝光不由运行时事件触发,解释器不知道自己被画出来了)
177
+ buildExposureReport(materialId); // → { id, event: 'exposure' }
178
+
179
+ // runtime 的 emit 事件直接喂进来,返回 null 表示这个事件不产生上报
180
+ mapRuntimeEventToReport(materialId, 'track', {
181
+ event: 'banner_renew_click',
182
+ params: { pos: 1 },
183
+ });
184
+ // → { id, event: 'click', extra: { trigger: 'track', name: 'banner_renew_click', params: { pos: 1 } } }
185
+ mapRuntimeEventToReport(materialId, 'navigate', { url: 'https://a.com' });
186
+ // → { id, event: 'click', extra: { trigger: 'navigate', url: 'https://a.com' } }
187
+ mapRuntimeEventToReport(materialId, 'close', { reason: 'mask' });
188
+ // → { id, event: 'close', reason: 'mask' }
189
+ mapRuntimeEventToReport(materialId, 'call', payload); // → null(call / error / state-change / view-change / ready / open 都不上报)
190
+ ```
191
+
192
+ 上报载荷 `MarketingReportParams` 是**可辨识联合**:`reason` 只属于 `close`、`extra` 只属于 `click`,
193
+ 写错编译不过;不该出现的字段声明成 `?: never` 而非省略,消费方仍可直接读,不必先窄化。
194
+
195
+ **给谁用**:接了后端上报的宿主(前台坑位组件),以及调试台的「上报预览」——
196
+ 预览要展示的就是真实会发给后端的 JSON,映射再写第二份,前台改了口径而调试台没跟上,预览就会骗人。
197
+
198
+ **为什么不在主入口**:主入口的身份是「DSL 解释器」,上报是**可选的附加约定**,
199
+ 只有接了上报的宿主才需要。主入口不 re-export,边界才清楚,只用解释器的消费方也不背这份代码。
200
+ 包根同样有一个物理 `report/` 转发垫片,理由与 `docs/` 一致(webpack 4 不认 `exports`)。
201
+
202
+ 契约字段的完整说明(后端视角)见 `move-front` 仓库的 `docs/marketing/README.md`。
@@ -0,0 +1,41 @@
1
+ 'use strict';
2
+
3
+ // src/report/map.ts
4
+ function buildExposureReport(id) {
5
+ if (!id) return null;
6
+ return { id, event: "exposure" };
7
+ }
8
+ function mapRuntimeEventToReport(id, event, payload) {
9
+ if (!id) return null;
10
+ switch (event) {
11
+ case "track": {
12
+ const data = payload != null ? payload : {};
13
+ return {
14
+ id,
15
+ event: "click",
16
+ extra: { trigger: "track", name: data.event, params: data.params }
17
+ };
18
+ }
19
+ case "navigate": {
20
+ const data = payload != null ? payload : {};
21
+ return {
22
+ id,
23
+ event: "click",
24
+ extra: { trigger: "navigate", url: data.url }
25
+ };
26
+ }
27
+ case "close": {
28
+ const data = payload != null ? payload : {};
29
+ return {
30
+ id,
31
+ event: "close",
32
+ reason: data.reason
33
+ };
34
+ }
35
+ default:
36
+ return null;
37
+ }
38
+ }
39
+
40
+ exports.buildExposureReport = buildExposureReport;
41
+ exports.mapRuntimeEventToReport = mapRuntimeEventToReport;
@@ -0,0 +1,150 @@
1
+ import { E as RuntimeEventName } from '../types-BgUaJUAu.cjs';
2
+
3
+ /**
4
+ * 营销物料上报载荷类型(上报契约的唯一数据源)。
5
+ *
6
+ * 契约正文见仓库 `docs/marketing/README.md` 的「接口契约 · 上报事件」一节,
7
+ * 本文件是它的类型化表达,前台(platform-adapters / ui-vue2)与后台调试台共用同一份。
8
+ *
9
+ * 【为什么在 core 包里】调试台不装 platform-adapters,两边唯一的共同载体就是这个已发布的 npm 包。
10
+ * 但它是**可选的附加约定**,走子路径 `@yaoxiu/marketing-dsl/report` 独立入口,
11
+ * 主入口不 re-export —— 主入口的身份仍然只是「DSL 解释器」,不该知道上报契约的存在。
12
+ */
13
+ /**
14
+ * 上报事件类型:曝光 / 点击 / 关闭
15
+ *
16
+ * 这是**物料生命周期**的固定三值枚举,由前端写死,不受运营配置影响:
17
+ * - `exposure` 曝光:物料渲染到页面时,每条一次
18
+ * - `click` 点击:用户点了物料里任何带动作的元素
19
+ * - `close` 关闭:用户关掉了这条物料
20
+ */
21
+ type MarketingReportEvent = 'exposure' | 'click' | 'close';
22
+ /**
23
+ * 点击上报的附加信息(**只在 `event='click'` 时有值**)
24
+ *
25
+ * 运营在 DSL 里自定义的埋点名 / 参数一律放这里,
26
+ * **不要塞进 `reason`** —— `reason` 的语义被「关闭原因」独占。
27
+ */
28
+ interface MarketingClickExtra {
29
+ /** 点击来源:`track` = 运营配的埋点动作;`navigate` = 跳转动作 */
30
+ trigger: 'track' | 'navigate';
31
+ /** `trigger='track'` 时:运营在配置里写的埋点名 */
32
+ name?: string;
33
+ /** `trigger='navigate'` 时:跳转目标地址 */
34
+ url?: string;
35
+ /** 运营在配置里写的自定义参数,原样透传 */
36
+ params?: Record<string, unknown>;
37
+ }
38
+ /** 曝光上报入参:只有 id */
39
+ interface MarketingExposureReportParams {
40
+ /** 物料 id,取自 `MarketingMaterial.id` */
41
+ id: string;
42
+ /** 事件类型 */
43
+ event: 'exposure';
44
+ /** 曝光事件无关闭原因 */
45
+ reason?: never;
46
+ /** 曝光事件无点击附加信息 */
47
+ extra?: never;
48
+ }
49
+ /** 关闭上报入参:可带关闭原因 */
50
+ interface MarketingCloseReportParams {
51
+ /** 物料 id */
52
+ id: string;
53
+ /** 事件类型 */
54
+ event: 'close';
55
+ /**
56
+ * 关闭原因,取自解释器抛出的 close reason:
57
+ * `close-button`(点 ×)/ `mask`(点遮罩)/ `countdown-end`(倒计时归零自动关)/
58
+ * `action`(配置里 close 动作未写 reason 的默认值)/ 运营自定义值。
59
+ */
60
+ reason?: string;
61
+ /** 关闭事件无点击附加信息 */
62
+ extra?: never;
63
+ }
64
+ /** 点击上报入参:必须带 extra 说明点了什么 */
65
+ interface MarketingClickReportParams {
66
+ /** 物料 id */
67
+ id: string;
68
+ /** 事件类型 */
69
+ event: 'click';
70
+ /** 点击事件不写关闭原因 */
71
+ reason?: never;
72
+ /** 点击详情,见 {@link MarketingClickExtra} */
73
+ extra: MarketingClickExtra;
74
+ }
75
+ /**
76
+ * 上报物料事件的入参(可辨识联合,按 `event` 区分)
77
+ *
78
+ * 用联合而非「三个可选字段」是为了把契约写进类型里:`reason` 只配 `close`、
79
+ * `extra` 只配 `click`,写错直接编译不过。不该出现的字段声明成 `?: never`
80
+ * 而不是省略,这样消费方(formatter / 上报层 / 调试台预览)仍能直接读
81
+ * `params.reason`、`params.extra`,无需先做类型窄化 —— 约束留在调用侧,消费侧照旧好写。
82
+ */
83
+ type MarketingReportParams = MarketingExposureReportParams | MarketingCloseReportParams | MarketingClickReportParams;
84
+
85
+ /**
86
+ * 「DSL 运行时事件 → 上报载荷」的映射(纯函数,无副作用、无框架依赖)。
87
+ *
88
+ * 前台坑位组件与后台调试台的「上报预览」共用这一份:
89
+ * 调试台要展示的就是**真实会发给后端的 JSON**,映射有第二份实现,
90
+ * 前台改了口径而调试台忘了改,调试台就会骗人。
91
+ */
92
+
93
+ /**
94
+ * 会产生上报的运行时事件及其载荷。
95
+ *
96
+ * 字段一律可选:宿主(Vue 组件的 `$event`、调试台的手工构造)拿到的载荷未必齐全,
97
+ * 缺字段是允许的,不该在映射这一步炸掉。
98
+ */
99
+ interface MarketingReportableEventPayloads {
100
+ /** 埋点动作:`event` 是运营配的埋点名,`params` 是自定义参数 */
101
+ track: {
102
+ event?: string;
103
+ params?: Record<string, unknown>;
104
+ };
105
+ /** 跳转动作:`url` 是目标地址(跳转本身由渲染壳完成,这里只记一笔) */
106
+ navigate: {
107
+ url?: string;
108
+ target?: string;
109
+ };
110
+ /** 关闭:`reason` 是关闭原因 */
111
+ close: {
112
+ reason?: string;
113
+ };
114
+ }
115
+ /** 会产生上报的运行时事件名 */
116
+ type MarketingReportableEventName = keyof MarketingReportableEventPayloads;
117
+ /**
118
+ * 事件名 → 载荷类型。
119
+ *
120
+ * 不产生上报的事件(`call` / `error` / `state-change` / `view-change` / `ready` / `open`)
121
+ * 载荷为 `unknown`:调用方照常传,映射返回 `null`。
122
+ */
123
+ type MarketingRuntimeEventPayload<K extends RuntimeEventName> = K extends MarketingReportableEventName ? MarketingReportableEventPayloads[K] : unknown;
124
+ /**
125
+ * 曝光上报载荷。
126
+ *
127
+ * 单独一个函数是因为曝光**不由运行时事件触发** —— 它是宿主把物料渲染到页面上时主动发的,
128
+ * 解释器根本不知道自己被画出来了。
129
+ *
130
+ * @param id 物料 id,为空(未取到物料)时返回 `null`,不产生上报
131
+ * @returns 上报载荷,或 `null`
132
+ */
133
+ declare function buildExposureReport(id: string | undefined | null): MarketingExposureReportParams | null;
134
+ /**
135
+ * 把一个 DSL 运行时事件映射成上报载荷。
136
+ *
137
+ * 口径(与 `docs/marketing/README.md` 的契约一一对应):
138
+ * - `track` → `click`,`extra = { trigger: 'track', name, params }`
139
+ * - `navigate` → `click`,`extra = { trigger: 'navigate', url }`
140
+ * - `close` → `close`,带 `reason`
141
+ * - 其余事件(`call` / `error` / `state-change` / `view-change` / `ready` / `open`)不产生上报
142
+ *
143
+ * @param id 物料 id,为空时返回 `null`(拿不到 id 的上报对后端没有意义)
144
+ * @param event 运行时事件名
145
+ * @param payload 事件载荷,可缺省
146
+ * @returns 上报载荷,或 `null`(该事件不产生上报)
147
+ */
148
+ declare function mapRuntimeEventToReport<K extends RuntimeEventName>(id: string | undefined | null, event: K, payload?: MarketingRuntimeEventPayload<K>): MarketingReportParams | null;
149
+
150
+ export { type MarketingClickExtra, type MarketingClickReportParams, type MarketingCloseReportParams, type MarketingExposureReportParams, type MarketingReportEvent, type MarketingReportParams, type MarketingReportableEventName, type MarketingReportableEventPayloads, type MarketingRuntimeEventPayload, buildExposureReport, mapRuntimeEventToReport };
@@ -0,0 +1,150 @@
1
+ import { E as RuntimeEventName } from '../types-BgUaJUAu.js';
2
+
3
+ /**
4
+ * 营销物料上报载荷类型(上报契约的唯一数据源)。
5
+ *
6
+ * 契约正文见仓库 `docs/marketing/README.md` 的「接口契约 · 上报事件」一节,
7
+ * 本文件是它的类型化表达,前台(platform-adapters / ui-vue2)与后台调试台共用同一份。
8
+ *
9
+ * 【为什么在 core 包里】调试台不装 platform-adapters,两边唯一的共同载体就是这个已发布的 npm 包。
10
+ * 但它是**可选的附加约定**,走子路径 `@yaoxiu/marketing-dsl/report` 独立入口,
11
+ * 主入口不 re-export —— 主入口的身份仍然只是「DSL 解释器」,不该知道上报契约的存在。
12
+ */
13
+ /**
14
+ * 上报事件类型:曝光 / 点击 / 关闭
15
+ *
16
+ * 这是**物料生命周期**的固定三值枚举,由前端写死,不受运营配置影响:
17
+ * - `exposure` 曝光:物料渲染到页面时,每条一次
18
+ * - `click` 点击:用户点了物料里任何带动作的元素
19
+ * - `close` 关闭:用户关掉了这条物料
20
+ */
21
+ type MarketingReportEvent = 'exposure' | 'click' | 'close';
22
+ /**
23
+ * 点击上报的附加信息(**只在 `event='click'` 时有值**)
24
+ *
25
+ * 运营在 DSL 里自定义的埋点名 / 参数一律放这里,
26
+ * **不要塞进 `reason`** —— `reason` 的语义被「关闭原因」独占。
27
+ */
28
+ interface MarketingClickExtra {
29
+ /** 点击来源:`track` = 运营配的埋点动作;`navigate` = 跳转动作 */
30
+ trigger: 'track' | 'navigate';
31
+ /** `trigger='track'` 时:运营在配置里写的埋点名 */
32
+ name?: string;
33
+ /** `trigger='navigate'` 时:跳转目标地址 */
34
+ url?: string;
35
+ /** 运营在配置里写的自定义参数,原样透传 */
36
+ params?: Record<string, unknown>;
37
+ }
38
+ /** 曝光上报入参:只有 id */
39
+ interface MarketingExposureReportParams {
40
+ /** 物料 id,取自 `MarketingMaterial.id` */
41
+ id: string;
42
+ /** 事件类型 */
43
+ event: 'exposure';
44
+ /** 曝光事件无关闭原因 */
45
+ reason?: never;
46
+ /** 曝光事件无点击附加信息 */
47
+ extra?: never;
48
+ }
49
+ /** 关闭上报入参:可带关闭原因 */
50
+ interface MarketingCloseReportParams {
51
+ /** 物料 id */
52
+ id: string;
53
+ /** 事件类型 */
54
+ event: 'close';
55
+ /**
56
+ * 关闭原因,取自解释器抛出的 close reason:
57
+ * `close-button`(点 ×)/ `mask`(点遮罩)/ `countdown-end`(倒计时归零自动关)/
58
+ * `action`(配置里 close 动作未写 reason 的默认值)/ 运营自定义值。
59
+ */
60
+ reason?: string;
61
+ /** 关闭事件无点击附加信息 */
62
+ extra?: never;
63
+ }
64
+ /** 点击上报入参:必须带 extra 说明点了什么 */
65
+ interface MarketingClickReportParams {
66
+ /** 物料 id */
67
+ id: string;
68
+ /** 事件类型 */
69
+ event: 'click';
70
+ /** 点击事件不写关闭原因 */
71
+ reason?: never;
72
+ /** 点击详情,见 {@link MarketingClickExtra} */
73
+ extra: MarketingClickExtra;
74
+ }
75
+ /**
76
+ * 上报物料事件的入参(可辨识联合,按 `event` 区分)
77
+ *
78
+ * 用联合而非「三个可选字段」是为了把契约写进类型里:`reason` 只配 `close`、
79
+ * `extra` 只配 `click`,写错直接编译不过。不该出现的字段声明成 `?: never`
80
+ * 而不是省略,这样消费方(formatter / 上报层 / 调试台预览)仍能直接读
81
+ * `params.reason`、`params.extra`,无需先做类型窄化 —— 约束留在调用侧,消费侧照旧好写。
82
+ */
83
+ type MarketingReportParams = MarketingExposureReportParams | MarketingCloseReportParams | MarketingClickReportParams;
84
+
85
+ /**
86
+ * 「DSL 运行时事件 → 上报载荷」的映射(纯函数,无副作用、无框架依赖)。
87
+ *
88
+ * 前台坑位组件与后台调试台的「上报预览」共用这一份:
89
+ * 调试台要展示的就是**真实会发给后端的 JSON**,映射有第二份实现,
90
+ * 前台改了口径而调试台忘了改,调试台就会骗人。
91
+ */
92
+
93
+ /**
94
+ * 会产生上报的运行时事件及其载荷。
95
+ *
96
+ * 字段一律可选:宿主(Vue 组件的 `$event`、调试台的手工构造)拿到的载荷未必齐全,
97
+ * 缺字段是允许的,不该在映射这一步炸掉。
98
+ */
99
+ interface MarketingReportableEventPayloads {
100
+ /** 埋点动作:`event` 是运营配的埋点名,`params` 是自定义参数 */
101
+ track: {
102
+ event?: string;
103
+ params?: Record<string, unknown>;
104
+ };
105
+ /** 跳转动作:`url` 是目标地址(跳转本身由渲染壳完成,这里只记一笔) */
106
+ navigate: {
107
+ url?: string;
108
+ target?: string;
109
+ };
110
+ /** 关闭:`reason` 是关闭原因 */
111
+ close: {
112
+ reason?: string;
113
+ };
114
+ }
115
+ /** 会产生上报的运行时事件名 */
116
+ type MarketingReportableEventName = keyof MarketingReportableEventPayloads;
117
+ /**
118
+ * 事件名 → 载荷类型。
119
+ *
120
+ * 不产生上报的事件(`call` / `error` / `state-change` / `view-change` / `ready` / `open`)
121
+ * 载荷为 `unknown`:调用方照常传,映射返回 `null`。
122
+ */
123
+ type MarketingRuntimeEventPayload<K extends RuntimeEventName> = K extends MarketingReportableEventName ? MarketingReportableEventPayloads[K] : unknown;
124
+ /**
125
+ * 曝光上报载荷。
126
+ *
127
+ * 单独一个函数是因为曝光**不由运行时事件触发** —— 它是宿主把物料渲染到页面上时主动发的,
128
+ * 解释器根本不知道自己被画出来了。
129
+ *
130
+ * @param id 物料 id,为空(未取到物料)时返回 `null`,不产生上报
131
+ * @returns 上报载荷,或 `null`
132
+ */
133
+ declare function buildExposureReport(id: string | undefined | null): MarketingExposureReportParams | null;
134
+ /**
135
+ * 把一个 DSL 运行时事件映射成上报载荷。
136
+ *
137
+ * 口径(与 `docs/marketing/README.md` 的契约一一对应):
138
+ * - `track` → `click`,`extra = { trigger: 'track', name, params }`
139
+ * - `navigate` → `click`,`extra = { trigger: 'navigate', url }`
140
+ * - `close` → `close`,带 `reason`
141
+ * - 其余事件(`call` / `error` / `state-change` / `view-change` / `ready` / `open`)不产生上报
142
+ *
143
+ * @param id 物料 id,为空时返回 `null`(拿不到 id 的上报对后端没有意义)
144
+ * @param event 运行时事件名
145
+ * @param payload 事件载荷,可缺省
146
+ * @returns 上报载荷,或 `null`(该事件不产生上报)
147
+ */
148
+ declare function mapRuntimeEventToReport<K extends RuntimeEventName>(id: string | undefined | null, event: K, payload?: MarketingRuntimeEventPayload<K>): MarketingReportParams | null;
149
+
150
+ export { type MarketingClickExtra, type MarketingClickReportParams, type MarketingCloseReportParams, type MarketingExposureReportParams, type MarketingReportEvent, type MarketingReportParams, type MarketingReportableEventName, type MarketingReportableEventPayloads, type MarketingRuntimeEventPayload, buildExposureReport, mapRuntimeEventToReport };
@@ -0,0 +1,38 @@
1
+ // src/report/map.ts
2
+ function buildExposureReport(id) {
3
+ if (!id) return null;
4
+ return { id, event: "exposure" };
5
+ }
6
+ function mapRuntimeEventToReport(id, event, payload) {
7
+ if (!id) return null;
8
+ switch (event) {
9
+ case "track": {
10
+ const data = payload != null ? payload : {};
11
+ return {
12
+ id,
13
+ event: "click",
14
+ extra: { trigger: "track", name: data.event, params: data.params }
15
+ };
16
+ }
17
+ case "navigate": {
18
+ const data = payload != null ? payload : {};
19
+ return {
20
+ id,
21
+ event: "click",
22
+ extra: { trigger: "navigate", url: data.url }
23
+ };
24
+ }
25
+ case "close": {
26
+ const data = payload != null ? payload : {};
27
+ return {
28
+ id,
29
+ event: "close",
30
+ reason: data.reason
31
+ };
32
+ }
33
+ default:
34
+ return null;
35
+ }
36
+ }
37
+
38
+ export { buildExposureReport, mapRuntimeEventToReport };
@@ -0,0 +1,7 @@
1
+ {
2
+ "//": "webpack 4 兼容垫片。它用的 enhanced-resolve 4 不认 package.json 的 exports 字段,会把 `@yaoxiu/marketing-dsl/docs` 当成物理路径去找。这个目录就是那个物理路径,靠 main/module/types 把它转发到真正的产物上。消费方(后台 moveback-front)因此可以照常写 `@yaoxiu/marketing-dsl/docs`,不必伸进 dist 里做深路径引入。webpack 5 / Vite / Node 走的仍是根 package.json 的 exports,不经过这里。删掉它之前先确认没有 webpack 4 的消费方。",
3
+ "main": "../dist/docs/index.cjs",
4
+ "module": "../dist/docs/index.js",
5
+ "types": "../dist/docs/index.d.ts",
6
+ "sideEffects": false
7
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yaoxiu/marketing-dsl",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "type": "module",
5
5
  "description": "营销弹窗 DSL 解释器核心,纯逻辑无框架依赖",
6
6
  "license": "MIT",
@@ -21,10 +21,17 @@
21
21
  "types": "./dist/docs/index.d.ts",
22
22
  "import": "./dist/docs/index.js",
23
23
  "require": "./dist/docs/index.cjs"
24
+ },
25
+ "./report": {
26
+ "types": "./dist/report/index.d.ts",
27
+ "import": "./dist/report/index.js",
28
+ "require": "./dist/report/index.cjs"
24
29
  }
25
30
  },
26
31
  "files": [
27
- "dist"
32
+ "dist",
33
+ "docs",
34
+ "report"
28
35
  ],
29
36
  "dependencies": {},
30
37
  "devDependencies": {},
@@ -0,0 +1,7 @@
1
+ {
2
+ "//": "webpack 4 兼容垫片。它用的 enhanced-resolve 4 不认 package.json 的 exports 字段,会把 `@yaoxiu/marketing-dsl/report` 当成物理路径去找。这个目录就是那个物理路径,靠 main/module/types 把它转发到真正的产物上。消费方(后台 moveback-front 的调试台「上报预览」)因此可以照常写 `@yaoxiu/marketing-dsl/report`,不必伸进 dist 里做深路径引入。webpack 5 / Vite / Node 走的仍是根 package.json 的 exports,不经过这里。删掉它之前先确认没有 webpack 4 的消费方。",
3
+ "main": "../dist/report/index.cjs",
4
+ "module": "../dist/report/index.js",
5
+ "types": "../dist/report/index.d.ts",
6
+ "sideEffects": false
7
+ }