@tappify/extension-sdk 2.0.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/LICENSE +21 -0
- package/dist/chunk-2DBSVKAU.cjs +65 -0
- package/dist/chunk-2DBSVKAU.cjs.map +1 -0
- package/dist/chunk-3YWVYA42.cjs +142 -0
- package/dist/chunk-3YWVYA42.cjs.map +1 -0
- package/dist/chunk-4C5Z3CIK.mjs +26 -0
- package/dist/chunk-4C5Z3CIK.mjs.map +1 -0
- package/dist/chunk-5AAPD5WV.cjs +250 -0
- package/dist/chunk-5AAPD5WV.cjs.map +1 -0
- package/dist/chunk-7KIKOH5H.cjs +26 -0
- package/dist/chunk-7KIKOH5H.cjs.map +1 -0
- package/dist/chunk-BDCX6LRQ.mjs +250 -0
- package/dist/chunk-BDCX6LRQ.mjs.map +1 -0
- package/dist/chunk-CSTYBKZC.mjs +65 -0
- package/dist/chunk-CSTYBKZC.mjs.map +1 -0
- package/dist/chunk-IGK2AP6J.mjs +142 -0
- package/dist/chunk-IGK2AP6J.mjs.map +1 -0
- package/dist/chunk-MNDVYPEP.mjs +302 -0
- package/dist/chunk-MNDVYPEP.mjs.map +1 -0
- package/dist/chunk-OPPYEA7F.cjs +33 -0
- package/dist/chunk-OPPYEA7F.cjs.map +1 -0
- package/dist/chunk-PYJMJF44.cjs +302 -0
- package/dist/chunk-PYJMJF44.cjs.map +1 -0
- package/dist/chunk-QHM7XNRK.mjs +33 -0
- package/dist/chunk-QHM7XNRK.mjs.map +1 -0
- package/dist/chunk-RMUWRESK.cjs +365 -0
- package/dist/chunk-RMUWRESK.cjs.map +1 -0
- package/dist/chunk-ZT35X7KL.mjs +365 -0
- package/dist/chunk-ZT35X7KL.mjs.map +1 -0
- package/dist/codegen.cjs +300 -0
- package/dist/codegen.cjs.map +1 -0
- package/dist/codegen.d.cts +432 -0
- package/dist/codegen.d.ts +432 -0
- package/dist/codegen.mjs +272 -0
- package/dist/codegen.mjs.map +1 -0
- package/dist/constants-DJ_KgZpN.d.cts +449 -0
- package/dist/constants-DJ_KgZpN.d.ts +449 -0
- package/dist/context-Dt6xh_5t.d.cts +30 -0
- package/dist/context-Ml7k_V14.d.ts +30 -0
- package/dist/errors-COsBh7kd.d.cts +88 -0
- package/dist/errors-COsBh7kd.d.ts +88 -0
- package/dist/handler-CZIlZ5vu.d.ts +227 -0
- package/dist/handler-kU9Jf36K.d.cts +227 -0
- package/dist/host.cjs +24 -0
- package/dist/host.cjs.map +1 -0
- package/dist/host.d.cts +24 -0
- package/dist/host.d.ts +24 -0
- package/dist/host.mjs +24 -0
- package/dist/host.mjs.map +1 -0
- package/dist/index.cjs +698 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1016 -0
- package/dist/index.d.ts +1016 -0
- package/dist/index.mjs +698 -0
- package/dist/index.mjs.map +1 -0
- package/dist/manifest.cjs +872 -0
- package/dist/manifest.cjs.map +1 -0
- package/dist/manifest.d.cts +432 -0
- package/dist/manifest.d.ts +432 -0
- package/dist/manifest.mjs +872 -0
- package/dist/manifest.mjs.map +1 -0
- package/dist/matchers-Cz93AK1n.d.cts +74 -0
- package/dist/matchers-Cz93AK1n.d.ts +74 -0
- package/dist/server.cjs +210 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.cts +243 -0
- package/dist/server.d.ts +243 -0
- package/dist/server.mjs +210 -0
- package/dist/server.mjs.map +1 -0
- package/dist/styles.css +367 -0
- package/dist/testing/index.cjs +887 -0
- package/dist/testing/index.cjs.map +1 -0
- package/dist/testing/index.d.cts +512 -0
- package/dist/testing/index.d.ts +512 -0
- package/dist/testing/index.mjs +887 -0
- package/dist/testing/index.mjs.map +1 -0
- package/dist/testing/jest.cjs +17 -0
- package/dist/testing/jest.cjs.map +1 -0
- package/dist/testing/jest.d.cts +12 -0
- package/dist/testing/jest.d.ts +12 -0
- package/dist/testing/jest.mjs +17 -0
- package/dist/testing/jest.mjs.map +1 -0
- package/dist/testing/vitest.cjs +15 -0
- package/dist/testing/vitest.cjs.map +1 -0
- package/dist/testing/vitest.d.cts +10 -0
- package/dist/testing/vitest.d.ts +10 -0
- package/dist/testing/vitest.mjs +15 -0
- package/dist/testing/vitest.mjs.map +1 -0
- package/dist/types-DDAGLpov.d.ts +715 -0
- package/dist/types-DrpQSv_2.d.cts +715 -0
- package/dist/vite.cjs +1344 -0
- package/dist/vite.cjs.map +1 -0
- package/dist/vite.d.cts +434 -0
- package/dist/vite.d.ts +434 -0
- package/dist/vite.mjs +1314 -0
- package/dist/vite.mjs.map +1 -0
- package/package.json +268 -0
- package/schema/extension-v2.json +1500 -0
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
// src/manifest/constants.ts
|
|
2
|
+
var SCOPES = [
|
|
3
|
+
{
|
|
4
|
+
key: "ui:render",
|
|
5
|
+
label: "Render UI",
|
|
6
|
+
description: "Render the declared pages, tabs, widgets, row actions and settings panel, and open chat with a visible prompt",
|
|
7
|
+
requiresSecurityReview: false,
|
|
8
|
+
requiresJustification: false
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
key: "projects:read",
|
|
12
|
+
label: "Read the project",
|
|
13
|
+
description: "Project name, platforms and store identity",
|
|
14
|
+
requiresSecurityReview: false,
|
|
15
|
+
requiresJustification: false
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
key: "analytics:read",
|
|
19
|
+
label: "Read analytics",
|
|
20
|
+
description: "Downloads, impressions, page views and conversion series",
|
|
21
|
+
requiresSecurityReview: false,
|
|
22
|
+
requiresJustification: false
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
key: "store.metadata:read",
|
|
26
|
+
label: "Read store metadata",
|
|
27
|
+
description: "Listing metadata, keyword set and keyword positions",
|
|
28
|
+
requiresSecurityReview: false,
|
|
29
|
+
requiresJustification: false
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
key: "reviews:read",
|
|
33
|
+
label: "Read store reviews",
|
|
34
|
+
description: "Review text, ratings and replies",
|
|
35
|
+
requiresSecurityReview: false,
|
|
36
|
+
requiresJustification: false
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
key: "crashes:read",
|
|
40
|
+
label: "Read crash data",
|
|
41
|
+
description: "Crash-free rate and issue counts",
|
|
42
|
+
requiresSecurityReview: false,
|
|
43
|
+
requiresJustification: false
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
key: "revenue:read",
|
|
47
|
+
label: "Read revenue",
|
|
48
|
+
description: "MRR, revenue series and refund counts",
|
|
49
|
+
requiresSecurityReview: false,
|
|
50
|
+
requiresJustification: true
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
key: "metrics:write",
|
|
54
|
+
label: "Write connector metrics",
|
|
55
|
+
description: "Write the metrics this extension declares into the metrics store",
|
|
56
|
+
requiresSecurityReview: false,
|
|
57
|
+
requiresJustification: false
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
key: "alerts:write",
|
|
61
|
+
label: "Raise alerts and banners",
|
|
62
|
+
description: "Turn declared webhooks into alerts and banners, at most three a day per project",
|
|
63
|
+
requiresSecurityReview: false,
|
|
64
|
+
requiresJustification: true
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
key: "insights:write",
|
|
68
|
+
label: "Post insights",
|
|
69
|
+
description: "Post insights to Home and to chat",
|
|
70
|
+
requiresSecurityReview: false,
|
|
71
|
+
requiresJustification: true
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
key: "ai:tools",
|
|
75
|
+
label: "Add assistant tools",
|
|
76
|
+
description: "Offer tools and mentions to the assistant",
|
|
77
|
+
requiresSecurityReview: false,
|
|
78
|
+
requiresJustification: false
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
key: "ai:actions",
|
|
82
|
+
label: "Run assistant actions",
|
|
83
|
+
description: "Run declared actions, each behind the approval card",
|
|
84
|
+
requiresSecurityReview: true,
|
|
85
|
+
requiresJustification: true
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
key: "store.metadata:write",
|
|
89
|
+
label: "Propose store metadata changes",
|
|
90
|
+
description: "Propose listing changes through a Tappify approval",
|
|
91
|
+
requiresSecurityReview: true,
|
|
92
|
+
requiresJustification: true
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
key: "autopilot:trigger",
|
|
96
|
+
label: "Trigger automated store actions",
|
|
97
|
+
description: "Start automated store actions on the owner\u2019s behalf",
|
|
98
|
+
requiresSecurityReview: true,
|
|
99
|
+
requiresJustification: true
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
key: "work:create",
|
|
103
|
+
label: "Create work items",
|
|
104
|
+
description: "Create issues, pages or messages in the vendor\u2019s system",
|
|
105
|
+
requiresSecurityReview: false,
|
|
106
|
+
requiresJustification: true
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
key: "work:sync",
|
|
110
|
+
label: "Sync work items",
|
|
111
|
+
description: "Two-way comments and status on created work items",
|
|
112
|
+
requiresSecurityReview: false,
|
|
113
|
+
requiresJustification: true
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
key: "storage:write",
|
|
117
|
+
label: "Use hosted storage",
|
|
118
|
+
description: "Read and write this extension\u2019s own hosted storage collections",
|
|
119
|
+
requiresSecurityReview: false,
|
|
120
|
+
requiresJustification: false
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
key: "messaging:send",
|
|
124
|
+
label: "Send messages to end users",
|
|
125
|
+
description: "Send messages or push notifications to the owner\u2019s end users through owner-supplied credentials",
|
|
126
|
+
requiresSecurityReview: true,
|
|
127
|
+
requiresJustification: true
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
key: "ai:skills",
|
|
131
|
+
label: "Shape the assistant",
|
|
132
|
+
description: "Add skills, prompt templates and context providers that shape the assistant\u2019s behaviour",
|
|
133
|
+
requiresSecurityReview: false,
|
|
134
|
+
requiresJustification: true
|
|
135
|
+
}
|
|
136
|
+
];
|
|
137
|
+
var SCOPE_KEYS = SCOPES.map((scope) => scope.key);
|
|
138
|
+
var SLOTS = [
|
|
139
|
+
"kpi-row",
|
|
140
|
+
"insights",
|
|
141
|
+
"sidebar",
|
|
142
|
+
"below-chart",
|
|
143
|
+
"below-list"
|
|
144
|
+
];
|
|
145
|
+
var CHARTS = [
|
|
146
|
+
"installs-activity",
|
|
147
|
+
"conversion",
|
|
148
|
+
"release-cadence"
|
|
149
|
+
];
|
|
150
|
+
var PAGES = [
|
|
151
|
+
{
|
|
152
|
+
key: "overview",
|
|
153
|
+
label: "Home",
|
|
154
|
+
route: "/projects/:id/overview",
|
|
155
|
+
slots: ["kpi-row", "insights", "sidebar"],
|
|
156
|
+
charts: ["installs-activity"],
|
|
157
|
+
tabs: true,
|
|
158
|
+
banners: true
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
key: "analytics",
|
|
162
|
+
label: "Analytics",
|
|
163
|
+
route: "/projects/:id/analytics",
|
|
164
|
+
slots: ["kpi-row", "below-chart", "sidebar"],
|
|
165
|
+
charts: ["installs-activity", "conversion"],
|
|
166
|
+
tabs: true,
|
|
167
|
+
banners: true
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
key: "deployments",
|
|
171
|
+
label: "Deployments",
|
|
172
|
+
route: "/projects/:id/deployments",
|
|
173
|
+
slots: ["sidebar", "below-list"],
|
|
174
|
+
charts: ["release-cadence"],
|
|
175
|
+
tabs: true,
|
|
176
|
+
banners: false
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
key: "ai_chat",
|
|
180
|
+
label: "Assistant",
|
|
181
|
+
route: "chat",
|
|
182
|
+
slots: [],
|
|
183
|
+
charts: [],
|
|
184
|
+
tabs: false,
|
|
185
|
+
banners: false
|
|
186
|
+
}
|
|
187
|
+
];
|
|
188
|
+
var PAGE_KEYS = PAGES.map((page) => page.key);
|
|
189
|
+
var TABLES = [
|
|
190
|
+
{ key: "analytics.keywords", label: "Keywords" },
|
|
191
|
+
{ key: "analytics.reviews", label: "Reviews" },
|
|
192
|
+
{ key: "deployments.releases", label: "Releases" },
|
|
193
|
+
{ key: "deployments.builds", label: "Builds" }
|
|
194
|
+
];
|
|
195
|
+
var TABLE_KEYS = TABLES.map((table) => table.key);
|
|
196
|
+
var KINDS = [
|
|
197
|
+
"page",
|
|
198
|
+
"tab",
|
|
199
|
+
"widget",
|
|
200
|
+
"series",
|
|
201
|
+
"banner",
|
|
202
|
+
"rowAction",
|
|
203
|
+
"marker",
|
|
204
|
+
"settings",
|
|
205
|
+
"storage",
|
|
206
|
+
"connector",
|
|
207
|
+
"webhook",
|
|
208
|
+
"tool",
|
|
209
|
+
"mention",
|
|
210
|
+
"action",
|
|
211
|
+
"knowledge",
|
|
212
|
+
"skill",
|
|
213
|
+
"prompt",
|
|
214
|
+
"context",
|
|
215
|
+
"work"
|
|
216
|
+
];
|
|
217
|
+
var CATEGORIES = [
|
|
218
|
+
"market_data",
|
|
219
|
+
"subscriptions",
|
|
220
|
+
"product_analytics",
|
|
221
|
+
"crashes",
|
|
222
|
+
"attribution",
|
|
223
|
+
"experiments",
|
|
224
|
+
"messaging",
|
|
225
|
+
"session_replay",
|
|
226
|
+
"localization",
|
|
227
|
+
"design",
|
|
228
|
+
"ci_cd",
|
|
229
|
+
"trackers",
|
|
230
|
+
"support",
|
|
231
|
+
"chat",
|
|
232
|
+
"ad_monetization",
|
|
233
|
+
"warehouse",
|
|
234
|
+
"compliance",
|
|
235
|
+
"additional_stores"
|
|
236
|
+
];
|
|
237
|
+
var EVENTS = [
|
|
238
|
+
"release.shipped",
|
|
239
|
+
"metadata.changed",
|
|
240
|
+
"keyword.set_changed",
|
|
241
|
+
"screenshots.updated",
|
|
242
|
+
"price.changed",
|
|
243
|
+
"featuring.started",
|
|
244
|
+
"score.changed",
|
|
245
|
+
"incident.opened",
|
|
246
|
+
"incident.resolved",
|
|
247
|
+
"playbook.step_approved",
|
|
248
|
+
"review.thread_opened",
|
|
249
|
+
"review.thread_resolved",
|
|
250
|
+
"approval.requested",
|
|
251
|
+
"digest.sent",
|
|
252
|
+
"install.created",
|
|
253
|
+
"install.paused",
|
|
254
|
+
"install.resumed",
|
|
255
|
+
"install.revoked",
|
|
256
|
+
"install.token_rotated",
|
|
257
|
+
"scopes.changed",
|
|
258
|
+
"settings.changed"
|
|
259
|
+
];
|
|
260
|
+
var SERVED_SDK_MAJORS = [2];
|
|
261
|
+
var QUERY_SCOPES = {
|
|
262
|
+
project: "projects:read",
|
|
263
|
+
series: "analytics:read",
|
|
264
|
+
keywords: "store.metadata:read",
|
|
265
|
+
listing: "store.metadata:read",
|
|
266
|
+
reviews: "reviews:read",
|
|
267
|
+
crashes: "crashes:read",
|
|
268
|
+
revenue: "revenue:read"
|
|
269
|
+
};
|
|
270
|
+
var CARD_KEYS = {
|
|
271
|
+
value: ["label", "value"],
|
|
272
|
+
series: ["label", "points"],
|
|
273
|
+
table: ["columns", "rows"],
|
|
274
|
+
list: ["items"],
|
|
275
|
+
comparison: ["label", "left", "right"]
|
|
276
|
+
};
|
|
277
|
+
var findScope = (key) => SCOPES.find((scope) => scope.key === key);
|
|
278
|
+
var findPage = (key) => PAGES.find((page) => page.key === key);
|
|
279
|
+
var findTable = (key) => TABLES.find((table) => table.key === key);
|
|
280
|
+
var slotsForPage = (page) => findPage(page)?.slots ?? [];
|
|
281
|
+
|
|
282
|
+
export {
|
|
283
|
+
SCOPES,
|
|
284
|
+
SCOPE_KEYS,
|
|
285
|
+
SLOTS,
|
|
286
|
+
CHARTS,
|
|
287
|
+
PAGES,
|
|
288
|
+
PAGE_KEYS,
|
|
289
|
+
TABLES,
|
|
290
|
+
TABLE_KEYS,
|
|
291
|
+
KINDS,
|
|
292
|
+
CATEGORIES,
|
|
293
|
+
EVENTS,
|
|
294
|
+
SERVED_SDK_MAJORS,
|
|
295
|
+
QUERY_SCOPES,
|
|
296
|
+
CARD_KEYS,
|
|
297
|
+
findScope,
|
|
298
|
+
findPage,
|
|
299
|
+
findTable,
|
|
300
|
+
slotsForPage
|
|
301
|
+
};
|
|
302
|
+
//# sourceMappingURL=chunk-MNDVYPEP.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/manifest/constants.ts"],"sourcesContent":["import type { ToolDeclaration } from './types';\n\nexport const SCOPES = [\n {\n key: 'ui:render',\n label: 'Render UI',\n description:\n 'Render the declared pages, tabs, widgets, row actions and settings panel, and open chat with a visible prompt',\n requiresSecurityReview: false,\n requiresJustification: false,\n },\n {\n key: 'projects:read',\n label: 'Read the project',\n description: 'Project name, platforms and store identity',\n requiresSecurityReview: false,\n requiresJustification: false,\n },\n {\n key: 'analytics:read',\n label: 'Read analytics',\n description: 'Downloads, impressions, page views and conversion series',\n requiresSecurityReview: false,\n requiresJustification: false,\n },\n {\n key: 'store.metadata:read',\n label: 'Read store metadata',\n description: 'Listing metadata, keyword set and keyword positions',\n requiresSecurityReview: false,\n requiresJustification: false,\n },\n {\n key: 'reviews:read',\n label: 'Read store reviews',\n description: 'Review text, ratings and replies',\n requiresSecurityReview: false,\n requiresJustification: false,\n },\n {\n key: 'crashes:read',\n label: 'Read crash data',\n description: 'Crash-free rate and issue counts',\n requiresSecurityReview: false,\n requiresJustification: false,\n },\n {\n key: 'revenue:read',\n label: 'Read revenue',\n description: 'MRR, revenue series and refund counts',\n requiresSecurityReview: false,\n requiresJustification: true,\n },\n {\n key: 'metrics:write',\n label: 'Write connector metrics',\n description:\n 'Write the metrics this extension declares into the metrics store',\n requiresSecurityReview: false,\n requiresJustification: false,\n },\n {\n key: 'alerts:write',\n label: 'Raise alerts and banners',\n description:\n 'Turn declared webhooks into alerts and banners, at most three a day per project',\n requiresSecurityReview: false,\n requiresJustification: true,\n },\n {\n key: 'insights:write',\n label: 'Post insights',\n description: 'Post insights to Home and to chat',\n requiresSecurityReview: false,\n requiresJustification: true,\n },\n {\n key: 'ai:tools',\n label: 'Add assistant tools',\n description: 'Offer tools and mentions to the assistant',\n requiresSecurityReview: false,\n requiresJustification: false,\n },\n {\n key: 'ai:actions',\n label: 'Run assistant actions',\n description: 'Run declared actions, each behind the approval card',\n requiresSecurityReview: true,\n requiresJustification: true,\n },\n {\n key: 'store.metadata:write',\n label: 'Propose store metadata changes',\n description: 'Propose listing changes through a Tappify approval',\n requiresSecurityReview: true,\n requiresJustification: true,\n },\n {\n key: 'autopilot:trigger',\n label: 'Trigger automated store actions',\n description: 'Start automated store actions on the owner’s behalf',\n requiresSecurityReview: true,\n requiresJustification: true,\n },\n {\n key: 'work:create',\n label: 'Create work items',\n description: 'Create issues, pages or messages in the vendor’s system',\n requiresSecurityReview: false,\n requiresJustification: true,\n },\n {\n key: 'work:sync',\n label: 'Sync work items',\n description: 'Two-way comments and status on created work items',\n requiresSecurityReview: false,\n requiresJustification: true,\n },\n {\n key: 'storage:write',\n label: 'Use hosted storage',\n description:\n 'Read and write this extension’s own hosted storage collections',\n requiresSecurityReview: false,\n requiresJustification: false,\n },\n {\n key: 'messaging:send',\n label: 'Send messages to end users',\n description:\n 'Send messages or push notifications to the owner’s end users through owner-supplied credentials',\n requiresSecurityReview: true,\n requiresJustification: true,\n },\n {\n key: 'ai:skills',\n label: 'Shape the assistant',\n description:\n 'Add skills, prompt templates and context providers that shape the assistant’s behaviour',\n requiresSecurityReview: false,\n requiresJustification: true,\n },\n] as const;\n\nexport type ScopeDefinition = (typeof SCOPES)[number];\n/** Every scope an extension can ask for under `scopes` in its manifest. */\nexport type ScopeKey = ScopeDefinition['key'];\n\nexport const SCOPE_KEYS: readonly ScopeKey[] = SCOPES.map(scope => scope.key);\n\nexport const SLOTS = [\n 'kpi-row',\n 'insights',\n 'sidebar',\n 'below-chart',\n 'below-list',\n] as const;\n/** The anchors on a host page a widget can be declared at. */\nexport type SlotId = (typeof SLOTS)[number];\n\nexport const CHARTS = [\n 'installs-activity',\n 'conversion',\n 'release-cadence',\n] as const;\nexport type HostChart = (typeof CHARTS)[number];\n\nexport const PAGES = [\n {\n key: 'overview',\n label: 'Home',\n route: '/projects/:id/overview',\n slots: ['kpi-row', 'insights', 'sidebar'],\n charts: ['installs-activity'],\n tabs: true,\n banners: true,\n },\n {\n key: 'analytics',\n label: 'Analytics',\n route: '/projects/:id/analytics',\n slots: ['kpi-row', 'below-chart', 'sidebar'],\n charts: ['installs-activity', 'conversion'],\n tabs: true,\n banners: true,\n },\n {\n key: 'deployments',\n label: 'Deployments',\n route: '/projects/:id/deployments',\n slots: ['sidebar', 'below-list'],\n charts: ['release-cadence'],\n tabs: true,\n banners: false,\n },\n {\n key: 'ai_chat',\n label: 'Assistant',\n route: 'chat',\n slots: [],\n charts: [],\n tabs: false,\n banners: false,\n },\n] as const;\n\nexport type PageDefinition = (typeof PAGES)[number];\n/** The host pages a contribution can attach a tab, widget or banner to. */\nexport type HostPage = PageDefinition['key'];\n\nexport const PAGE_KEYS: readonly HostPage[] = PAGES.map(page => page.key);\n\nexport const TABLES = [\n { key: 'analytics.keywords', label: 'Keywords' },\n { key: 'analytics.reviews', label: 'Reviews' },\n { key: 'deployments.releases', label: 'Releases' },\n { key: 'deployments.builds', label: 'Builds' },\n] as const;\n\nexport type TableDefinition = (typeof TABLES)[number];\nexport type HostTable = TableDefinition['key'];\n\nexport const TABLE_KEYS: readonly HostTable[] = TABLES.map(table => table.key);\n\nexport const KINDS = [\n 'page',\n 'tab',\n 'widget',\n 'series',\n 'banner',\n 'rowAction',\n 'marker',\n 'settings',\n 'storage',\n 'connector',\n 'webhook',\n 'tool',\n 'mention',\n 'action',\n 'knowledge',\n 'skill',\n 'prompt',\n 'context',\n 'work',\n] as const;\nexport type ContributionKind = (typeof KINDS)[number];\n\nexport const CATEGORIES = [\n 'market_data',\n 'subscriptions',\n 'product_analytics',\n 'crashes',\n 'attribution',\n 'experiments',\n 'messaging',\n 'session_replay',\n 'localization',\n 'design',\n 'ci_cd',\n 'trackers',\n 'support',\n 'chat',\n 'ad_monetization',\n 'warehouse',\n 'compliance',\n 'additional_stores',\n] as const;\nexport type ExtensionCategory = (typeof CATEGORIES)[number];\n\nexport const EVENTS = [\n 'release.shipped',\n 'metadata.changed',\n 'keyword.set_changed',\n 'screenshots.updated',\n 'price.changed',\n 'featuring.started',\n 'score.changed',\n 'incident.opened',\n 'incident.resolved',\n 'playbook.step_approved',\n 'review.thread_opened',\n 'review.thread_resolved',\n 'approval.requested',\n 'digest.sent',\n 'install.created',\n 'install.paused',\n 'install.resumed',\n 'install.revoked',\n 'install.token_rotated',\n 'scopes.changed',\n 'settings.changed',\n] as const;\n/** Every event Tappify emits, which a mount or a server can subscribe to. */\nexport type HostEventName = (typeof EVENTS)[number];\n\nexport const SERVED_SDK_MAJORS: readonly number[] = [2];\n\n/** The `kind` of every read `tap.data.query` accepts, one per scope it needs. */\nexport type DataQueryKind =\n | 'project'\n | 'series'\n | 'keywords'\n | 'listing'\n | 'reviews'\n | 'crashes'\n | 'revenue';\n\nexport const QUERY_SCOPES: Record<DataQueryKind, ScopeKey> = {\n project: 'projects:read',\n series: 'analytics:read',\n keywords: 'store.metadata:read',\n listing: 'store.metadata:read',\n reviews: 'reviews:read',\n crashes: 'crashes:read',\n revenue: 'revenue:read',\n};\n\n/**\n * The keys a tool's answer carries for each `returns` kind it may declare.\n * `validateToolResponse`, `tappify extension doctor` and the host all read\n * this one table, so a wrong body fails the same way wherever it is checked.\n */\nexport const CARD_KEYS: Record<ToolDeclaration['returns'], string[]> = {\n value: ['label', 'value'],\n series: ['label', 'points'],\n table: ['columns', 'rows'],\n list: ['items'],\n comparison: ['label', 'left', 'right'],\n};\n\nexport const findScope = (key: string): ScopeDefinition | undefined =>\n SCOPES.find(scope => scope.key === key);\n\nexport const findPage = (key: string): PageDefinition | undefined =>\n PAGES.find(page => page.key === key);\n\nexport const findTable = (key: string): TableDefinition | undefined =>\n TABLES.find(table => table.key === key);\n\nexport const slotsForPage = (page: string): readonly SlotId[] =>\n findPage(page)?.slots ?? [];\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
var _chunk2DBSVKAUcjs = require('./chunk-2DBSVKAU.cjs');
|
|
4
|
+
|
|
5
|
+
// src/client/context.ts
|
|
6
|
+
var _react = require('react');
|
|
7
|
+
var REGISTRY_KEY = "__tappifyExtensionSdkTapContextV2__";
|
|
8
|
+
var registry = globalThis;
|
|
9
|
+
function resolveContext() {
|
|
10
|
+
const existing = registry[REGISTRY_KEY];
|
|
11
|
+
if (existing) return existing;
|
|
12
|
+
const created = _react.createContext.call(void 0, null);
|
|
13
|
+
created.displayName = "TapContext";
|
|
14
|
+
registry[REGISTRY_KEY] = created;
|
|
15
|
+
return created;
|
|
16
|
+
}
|
|
17
|
+
var TapContext = resolveContext();
|
|
18
|
+
function useTap() {
|
|
19
|
+
const tap = _react.useContext.call(void 0, TapContext);
|
|
20
|
+
if (tap === null) {
|
|
21
|
+
throw new (0, _chunk2DBSVKAUcjs.TapError)(
|
|
22
|
+
"TAP_OUTSIDE_HOST",
|
|
23
|
+
"useTap() ran outside a Tappify mount. Render this component from an entry declared in tappify.extension.json, or wrap it in renderWithTap() from @tappify/extension-sdk/testing."
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
return tap;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
exports.TapContext = TapContext; exports.useTap = useTap;
|
|
33
|
+
//# sourceMappingURL=chunk-OPPYEA7F.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/vulakh/Desktop/Work/Tappify/extension-sdk/dist/chunk-OPPYEA7F.cjs","../src/client/context.ts"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACA;ACJA,8BAAwD;AAIxD,IAAM,aAAA,EAAe,qCAAA;AAMrB,IAAM,SAAA,EAAgD,UAAA;AAEtD,SAAS,cAAA,CAAA,EAAsC;AAC7C,EAAA,MAAM,SAAA,EAAW,QAAA,CAAS,YAAY,CAAA;AACtC,EAAA,GAAA,CAAI,QAAA,EAAU,OAAO,QAAA;AAErB,EAAA,MAAM,QAAA,EAAU,kCAAA,IAA8B,CAAA;AAC9C,EAAA,OAAA,CAAQ,YAAA,EAAc,YAAA;AACtB,EAAA,QAAA,CAAS,YAAY,EAAA,EAAI,OAAA;AACzB,EAAA,OAAO,OAAA;AACT;AAEO,IAAM,WAAA,EAAkC,cAAA,CAAe,CAAA;AAyBvD,SAAS,MAAA,CAAA,EAAc;AAC5B,EAAA,MAAM,IAAA,EAAM,+BAAA,UAAqB,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,IAAQ,IAAA,EAAM;AAChB,IAAA,MAAM,IAAI,+BAAA;AAAA,MACR,kBAAA;AAAA,MACA;AAAA,IACF,CAAA;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AD7BA;AACA;AACE;AACA;AACF,yDAAC","file":"/Users/vulakh/Desktop/Work/Tappify/extension-sdk/dist/chunk-OPPYEA7F.cjs","sourcesContent":[null,"import { createContext, useContext, type Context } from 'react';\nimport { TapError } from './errors';\nimport type { Tap } from './types';\n\nconst REGISTRY_KEY = '__tappifyExtensionSdkTapContextV2__';\n\ninterface ContextRegistry {\n [REGISTRY_KEY]?: Context<Tap | null>;\n}\n\nconst registry: typeof globalThis & ContextRegistry = globalThis;\n\nfunction resolveContext(): Context<Tap | null> {\n const existing = registry[REGISTRY_KEY];\n if (existing) return existing;\n\n const created = createContext<Tap | null>(null);\n created.displayName = 'TapContext';\n registry[REGISTRY_KEY] = created;\n return created;\n}\n\nexport const TapContext: Context<Tap | null> = resolveContext();\n\n/**\n * Returns the whole bridge the host mounted this component with.\n *\n * @remarks\n * Throws `TapError` with code `TAP_OUTSIDE_HOST` when no Tappify mount is above\n * the component. The object it returns does not re-render the component when the\n * host changes a member; read through `useTapFilters`, `useTapTheme` and the\n * other slice hooks where that matters.\n *\n * @example\n * ```tsx\n * import { TapButton, useTap } from '@tappify/extension-sdk';\n *\n * function CopyId() {\n * const tap = useTap();\n * return (\n * <TapButton onClick={() => void tap.ui.copy(tap.project.id)}>\n * Copy project id\n * </TapButton>\n * );\n * }\n * ```\n */\nexport function useTap(): Tap {\n const tap = useContext(TapContext);\n if (tap === null) {\n throw new TapError(\n 'TAP_OUTSIDE_HOST',\n 'useTap() ran outside a Tappify mount. Render this component from an entry declared in tappify.extension.json, or wrap it in renderWithTap() from @tappify/extension-sdk/testing.',\n );\n }\n return tap;\n}\n"]}
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }// src/manifest/constants.ts
|
|
2
|
+
var SCOPES = [
|
|
3
|
+
{
|
|
4
|
+
key: "ui:render",
|
|
5
|
+
label: "Render UI",
|
|
6
|
+
description: "Render the declared pages, tabs, widgets, row actions and settings panel, and open chat with a visible prompt",
|
|
7
|
+
requiresSecurityReview: false,
|
|
8
|
+
requiresJustification: false
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
key: "projects:read",
|
|
12
|
+
label: "Read the project",
|
|
13
|
+
description: "Project name, platforms and store identity",
|
|
14
|
+
requiresSecurityReview: false,
|
|
15
|
+
requiresJustification: false
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
key: "analytics:read",
|
|
19
|
+
label: "Read analytics",
|
|
20
|
+
description: "Downloads, impressions, page views and conversion series",
|
|
21
|
+
requiresSecurityReview: false,
|
|
22
|
+
requiresJustification: false
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
key: "store.metadata:read",
|
|
26
|
+
label: "Read store metadata",
|
|
27
|
+
description: "Listing metadata, keyword set and keyword positions",
|
|
28
|
+
requiresSecurityReview: false,
|
|
29
|
+
requiresJustification: false
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
key: "reviews:read",
|
|
33
|
+
label: "Read store reviews",
|
|
34
|
+
description: "Review text, ratings and replies",
|
|
35
|
+
requiresSecurityReview: false,
|
|
36
|
+
requiresJustification: false
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
key: "crashes:read",
|
|
40
|
+
label: "Read crash data",
|
|
41
|
+
description: "Crash-free rate and issue counts",
|
|
42
|
+
requiresSecurityReview: false,
|
|
43
|
+
requiresJustification: false
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
key: "revenue:read",
|
|
47
|
+
label: "Read revenue",
|
|
48
|
+
description: "MRR, revenue series and refund counts",
|
|
49
|
+
requiresSecurityReview: false,
|
|
50
|
+
requiresJustification: true
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
key: "metrics:write",
|
|
54
|
+
label: "Write connector metrics",
|
|
55
|
+
description: "Write the metrics this extension declares into the metrics store",
|
|
56
|
+
requiresSecurityReview: false,
|
|
57
|
+
requiresJustification: false
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
key: "alerts:write",
|
|
61
|
+
label: "Raise alerts and banners",
|
|
62
|
+
description: "Turn declared webhooks into alerts and banners, at most three a day per project",
|
|
63
|
+
requiresSecurityReview: false,
|
|
64
|
+
requiresJustification: true
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
key: "insights:write",
|
|
68
|
+
label: "Post insights",
|
|
69
|
+
description: "Post insights to Home and to chat",
|
|
70
|
+
requiresSecurityReview: false,
|
|
71
|
+
requiresJustification: true
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
key: "ai:tools",
|
|
75
|
+
label: "Add assistant tools",
|
|
76
|
+
description: "Offer tools and mentions to the assistant",
|
|
77
|
+
requiresSecurityReview: false,
|
|
78
|
+
requiresJustification: false
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
key: "ai:actions",
|
|
82
|
+
label: "Run assistant actions",
|
|
83
|
+
description: "Run declared actions, each behind the approval card",
|
|
84
|
+
requiresSecurityReview: true,
|
|
85
|
+
requiresJustification: true
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
key: "store.metadata:write",
|
|
89
|
+
label: "Propose store metadata changes",
|
|
90
|
+
description: "Propose listing changes through a Tappify approval",
|
|
91
|
+
requiresSecurityReview: true,
|
|
92
|
+
requiresJustification: true
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
key: "autopilot:trigger",
|
|
96
|
+
label: "Trigger automated store actions",
|
|
97
|
+
description: "Start automated store actions on the owner\u2019s behalf",
|
|
98
|
+
requiresSecurityReview: true,
|
|
99
|
+
requiresJustification: true
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
key: "work:create",
|
|
103
|
+
label: "Create work items",
|
|
104
|
+
description: "Create issues, pages or messages in the vendor\u2019s system",
|
|
105
|
+
requiresSecurityReview: false,
|
|
106
|
+
requiresJustification: true
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
key: "work:sync",
|
|
110
|
+
label: "Sync work items",
|
|
111
|
+
description: "Two-way comments and status on created work items",
|
|
112
|
+
requiresSecurityReview: false,
|
|
113
|
+
requiresJustification: true
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
key: "storage:write",
|
|
117
|
+
label: "Use hosted storage",
|
|
118
|
+
description: "Read and write this extension\u2019s own hosted storage collections",
|
|
119
|
+
requiresSecurityReview: false,
|
|
120
|
+
requiresJustification: false
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
key: "messaging:send",
|
|
124
|
+
label: "Send messages to end users",
|
|
125
|
+
description: "Send messages or push notifications to the owner\u2019s end users through owner-supplied credentials",
|
|
126
|
+
requiresSecurityReview: true,
|
|
127
|
+
requiresJustification: true
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
key: "ai:skills",
|
|
131
|
+
label: "Shape the assistant",
|
|
132
|
+
description: "Add skills, prompt templates and context providers that shape the assistant\u2019s behaviour",
|
|
133
|
+
requiresSecurityReview: false,
|
|
134
|
+
requiresJustification: true
|
|
135
|
+
}
|
|
136
|
+
];
|
|
137
|
+
var SCOPE_KEYS = SCOPES.map((scope) => scope.key);
|
|
138
|
+
var SLOTS = [
|
|
139
|
+
"kpi-row",
|
|
140
|
+
"insights",
|
|
141
|
+
"sidebar",
|
|
142
|
+
"below-chart",
|
|
143
|
+
"below-list"
|
|
144
|
+
];
|
|
145
|
+
var CHARTS = [
|
|
146
|
+
"installs-activity",
|
|
147
|
+
"conversion",
|
|
148
|
+
"release-cadence"
|
|
149
|
+
];
|
|
150
|
+
var PAGES = [
|
|
151
|
+
{
|
|
152
|
+
key: "overview",
|
|
153
|
+
label: "Home",
|
|
154
|
+
route: "/projects/:id/overview",
|
|
155
|
+
slots: ["kpi-row", "insights", "sidebar"],
|
|
156
|
+
charts: ["installs-activity"],
|
|
157
|
+
tabs: true,
|
|
158
|
+
banners: true
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
key: "analytics",
|
|
162
|
+
label: "Analytics",
|
|
163
|
+
route: "/projects/:id/analytics",
|
|
164
|
+
slots: ["kpi-row", "below-chart", "sidebar"],
|
|
165
|
+
charts: ["installs-activity", "conversion"],
|
|
166
|
+
tabs: true,
|
|
167
|
+
banners: true
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
key: "deployments",
|
|
171
|
+
label: "Deployments",
|
|
172
|
+
route: "/projects/:id/deployments",
|
|
173
|
+
slots: ["sidebar", "below-list"],
|
|
174
|
+
charts: ["release-cadence"],
|
|
175
|
+
tabs: true,
|
|
176
|
+
banners: false
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
key: "ai_chat",
|
|
180
|
+
label: "Assistant",
|
|
181
|
+
route: "chat",
|
|
182
|
+
slots: [],
|
|
183
|
+
charts: [],
|
|
184
|
+
tabs: false,
|
|
185
|
+
banners: false
|
|
186
|
+
}
|
|
187
|
+
];
|
|
188
|
+
var PAGE_KEYS = PAGES.map((page) => page.key);
|
|
189
|
+
var TABLES = [
|
|
190
|
+
{ key: "analytics.keywords", label: "Keywords" },
|
|
191
|
+
{ key: "analytics.reviews", label: "Reviews" },
|
|
192
|
+
{ key: "deployments.releases", label: "Releases" },
|
|
193
|
+
{ key: "deployments.builds", label: "Builds" }
|
|
194
|
+
];
|
|
195
|
+
var TABLE_KEYS = TABLES.map((table) => table.key);
|
|
196
|
+
var KINDS = [
|
|
197
|
+
"page",
|
|
198
|
+
"tab",
|
|
199
|
+
"widget",
|
|
200
|
+
"series",
|
|
201
|
+
"banner",
|
|
202
|
+
"rowAction",
|
|
203
|
+
"marker",
|
|
204
|
+
"settings",
|
|
205
|
+
"storage",
|
|
206
|
+
"connector",
|
|
207
|
+
"webhook",
|
|
208
|
+
"tool",
|
|
209
|
+
"mention",
|
|
210
|
+
"action",
|
|
211
|
+
"knowledge",
|
|
212
|
+
"skill",
|
|
213
|
+
"prompt",
|
|
214
|
+
"context",
|
|
215
|
+
"work"
|
|
216
|
+
];
|
|
217
|
+
var CATEGORIES = [
|
|
218
|
+
"market_data",
|
|
219
|
+
"subscriptions",
|
|
220
|
+
"product_analytics",
|
|
221
|
+
"crashes",
|
|
222
|
+
"attribution",
|
|
223
|
+
"experiments",
|
|
224
|
+
"messaging",
|
|
225
|
+
"session_replay",
|
|
226
|
+
"localization",
|
|
227
|
+
"design",
|
|
228
|
+
"ci_cd",
|
|
229
|
+
"trackers",
|
|
230
|
+
"support",
|
|
231
|
+
"chat",
|
|
232
|
+
"ad_monetization",
|
|
233
|
+
"warehouse",
|
|
234
|
+
"compliance",
|
|
235
|
+
"additional_stores"
|
|
236
|
+
];
|
|
237
|
+
var EVENTS = [
|
|
238
|
+
"release.shipped",
|
|
239
|
+
"metadata.changed",
|
|
240
|
+
"keyword.set_changed",
|
|
241
|
+
"screenshots.updated",
|
|
242
|
+
"price.changed",
|
|
243
|
+
"featuring.started",
|
|
244
|
+
"score.changed",
|
|
245
|
+
"incident.opened",
|
|
246
|
+
"incident.resolved",
|
|
247
|
+
"playbook.step_approved",
|
|
248
|
+
"review.thread_opened",
|
|
249
|
+
"review.thread_resolved",
|
|
250
|
+
"approval.requested",
|
|
251
|
+
"digest.sent",
|
|
252
|
+
"install.created",
|
|
253
|
+
"install.paused",
|
|
254
|
+
"install.resumed",
|
|
255
|
+
"install.revoked",
|
|
256
|
+
"install.token_rotated",
|
|
257
|
+
"scopes.changed",
|
|
258
|
+
"settings.changed"
|
|
259
|
+
];
|
|
260
|
+
var SERVED_SDK_MAJORS = [2];
|
|
261
|
+
var QUERY_SCOPES = {
|
|
262
|
+
project: "projects:read",
|
|
263
|
+
series: "analytics:read",
|
|
264
|
+
keywords: "store.metadata:read",
|
|
265
|
+
listing: "store.metadata:read",
|
|
266
|
+
reviews: "reviews:read",
|
|
267
|
+
crashes: "crashes:read",
|
|
268
|
+
revenue: "revenue:read"
|
|
269
|
+
};
|
|
270
|
+
var CARD_KEYS = {
|
|
271
|
+
value: ["label", "value"],
|
|
272
|
+
series: ["label", "points"],
|
|
273
|
+
table: ["columns", "rows"],
|
|
274
|
+
list: ["items"],
|
|
275
|
+
comparison: ["label", "left", "right"]
|
|
276
|
+
};
|
|
277
|
+
var findScope = (key) => SCOPES.find((scope) => scope.key === key);
|
|
278
|
+
var findPage = (key) => PAGES.find((page) => page.key === key);
|
|
279
|
+
var findTable = (key) => TABLES.find((table) => table.key === key);
|
|
280
|
+
var slotsForPage = (page) => _nullishCoalesce(_optionalChain([findPage, 'call', _ => _(page), 'optionalAccess', _2 => _2.slots]), () => ( []));
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
exports.SCOPES = SCOPES; exports.SCOPE_KEYS = SCOPE_KEYS; exports.SLOTS = SLOTS; exports.CHARTS = CHARTS; exports.PAGES = PAGES; exports.PAGE_KEYS = PAGE_KEYS; exports.TABLES = TABLES; exports.TABLE_KEYS = TABLE_KEYS; exports.KINDS = KINDS; exports.CATEGORIES = CATEGORIES; exports.EVENTS = EVENTS; exports.SERVED_SDK_MAJORS = SERVED_SDK_MAJORS; exports.QUERY_SCOPES = QUERY_SCOPES; exports.CARD_KEYS = CARD_KEYS; exports.findScope = findScope; exports.findPage = findPage; exports.findTable = findTable; exports.slotsForPage = slotsForPage;
|
|
302
|
+
//# sourceMappingURL=chunk-PYJMJF44.cjs.map
|