@swarm.ing/pieui 2.1.7 → 2.2.1

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 (75) hide show
  1. package/dist/components/index.esm.js +1 -1
  2. package/dist/components/index.js +1 -1
  3. package/dist/index.d.ts +2 -2
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.esm.js +2 -2
  6. package/dist/index.js +2 -2
  7. package/dist/max/index.esm.js +1 -1
  8. package/dist/max/index.js +1 -1
  9. package/dist/native/index.esm.js +2 -2
  10. package/dist/native/index.js +2 -2
  11. package/dist/providers/CentrifugeIOInitProvider.d.ts.map +1 -1
  12. package/dist/providers/SocketIOInitProvider.d.ts.map +1 -1
  13. package/dist/server/card.d.ts +28 -0
  14. package/dist/server/card.d.ts.map +1 -0
  15. package/dist/server/cards/AjaxGroupCard.d.ts +8 -0
  16. package/dist/server/cards/AjaxGroupCard.d.ts.map +1 -0
  17. package/dist/server/cards/HTMLEmbedCard.d.ts +6 -0
  18. package/dist/server/cards/HTMLEmbedCard.d.ts.map +1 -0
  19. package/dist/server/cards/HiddenCard.d.ts +6 -0
  20. package/dist/server/cards/HiddenCard.d.ts.map +1 -0
  21. package/dist/server/cards/OneOfCard.d.ts +8 -0
  22. package/dist/server/cards/OneOfCard.d.ts.map +1 -0
  23. package/dist/server/cards/UnionCard.d.ts +8 -0
  24. package/dist/server/cards/UnionCard.d.ts.map +1 -0
  25. package/dist/server/cards/index.d.ts +6 -0
  26. package/dist/server/cards/index.d.ts.map +1 -0
  27. package/dist/server/form.d.ts +5 -0
  28. package/dist/server/form.d.ts.map +1 -0
  29. package/dist/server/index.d.ts +9 -0
  30. package/dist/server/index.d.ts.map +1 -0
  31. package/dist/server/index.esm.js +382 -0
  32. package/dist/server/index.js +427 -0
  33. package/dist/server/page.d.ts +26 -0
  34. package/dist/server/page.d.ts.map +1 -0
  35. package/dist/server/realtime.d.ts +13 -0
  36. package/dist/server/realtime.d.ts.map +1 -0
  37. package/dist/server/types.d.ts +28 -0
  38. package/dist/server/types.d.ts.map +1 -0
  39. package/dist/server/web.d.ts +23 -0
  40. package/dist/server/web.d.ts.map +1 -0
  41. package/dist/telegram/index.esm.js +1 -1
  42. package/dist/telegram/index.js +1 -1
  43. package/dist/tests/linkStatus.test.d.ts +2 -0
  44. package/dist/tests/linkStatus.test.d.ts.map +1 -0
  45. package/dist/tests/server/card-fill.test.d.ts +2 -0
  46. package/dist/tests/server/card-fill.test.d.ts.map +1 -0
  47. package/dist/tests/server/card-generate.test.d.ts +2 -0
  48. package/dist/tests/server/card-generate.test.d.ts.map +1 -0
  49. package/dist/tests/server/cards.test.d.ts +2 -0
  50. package/dist/tests/server/cards.test.d.ts.map +1 -0
  51. package/dist/tests/server/e2e.test.d.ts +2 -0
  52. package/dist/tests/server/e2e.test.d.ts.map +1 -0
  53. package/dist/tests/server/entry.test.d.ts +2 -0
  54. package/dist/tests/server/entry.test.d.ts.map +1 -0
  55. package/dist/tests/server/form.test.d.ts +2 -0
  56. package/dist/tests/server/form.test.d.ts.map +1 -0
  57. package/dist/tests/server/page.test.d.ts +2 -0
  58. package/dist/tests/server/page.test.d.ts.map +1 -0
  59. package/dist/tests/server/realtime.test.d.ts +2 -0
  60. package/dist/tests/server/realtime.test.d.ts.map +1 -0
  61. package/dist/tests/server/web-ajax.test.d.ts +2 -0
  62. package/dist/tests/server/web-ajax.test.d.ts.map +1 -0
  63. package/dist/tests/server/web-content.test.d.ts +2 -0
  64. package/dist/tests/server/web-content.test.d.ts.map +1 -0
  65. package/dist/tests/server/web-process.test.d.ts +2 -0
  66. package/dist/tests/server/web-process.test.d.ts.map +1 -0
  67. package/dist/tests/server/web-token.test.d.ts +2 -0
  68. package/dist/tests/server/web-token.test.d.ts.map +1 -0
  69. package/dist/types/index.d.ts +15 -0
  70. package/dist/types/index.d.ts.map +1 -1
  71. package/dist/util/linkStatus.d.ts +33 -0
  72. package/dist/util/linkStatus.d.ts.map +1 -0
  73. package/dist/util/pieConfig.d.ts +11 -0
  74. package/dist/util/pieConfig.d.ts.map +1 -1
  75. package/package.json +28 -3
@@ -0,0 +1,427 @@
1
+ var __create = Object.create;
2
+ var __getProtoOf = Object.getPrototypeOf;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __toESM = (mod, isNodeMode, target) => {
8
+ target = mod != null ? __create(__getProtoOf(mod)) : {};
9
+ const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
10
+ for (let key of __getOwnPropNames(mod))
11
+ if (!__hasOwnProp.call(to, key))
12
+ __defProp(to, key, {
13
+ get: () => mod[key],
14
+ enumerable: true
15
+ });
16
+ return to;
17
+ };
18
+ var __moduleCache = /* @__PURE__ */ new WeakMap;
19
+ var __toCommonJS = (from) => {
20
+ var entry = __moduleCache.get(from), desc;
21
+ if (entry)
22
+ return entry;
23
+ entry = __defProp({}, "__esModule", { value: true });
24
+ if (from && typeof from === "object" || typeof from === "function")
25
+ __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
26
+ get: () => from[key],
27
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
28
+ }));
29
+ __moduleCache.set(from, entry);
30
+ return entry;
31
+ };
32
+ var __export = (target, all) => {
33
+ for (var name in all)
34
+ __defProp(target, name, {
35
+ get: all[name],
36
+ enumerable: true,
37
+ configurable: true,
38
+ set: (newValue) => all[name] = () => newValue
39
+ });
40
+ };
41
+
42
+ // src/server/index.ts
43
+ var exports_server = {};
44
+ __export(exports_server, {
45
+ publishToCentrifuge: () => publishToCentrifuge,
46
+ form2dict: () => form2dict,
47
+ aggregate: () => aggregate,
48
+ Web: () => Web,
49
+ UnionCard: () => UnionCard,
50
+ OneOfCard: () => OneOfCard,
51
+ InputCard: () => InputCard,
52
+ HiddenCard: () => HiddenCard,
53
+ HTMLEmbedCard: () => HTMLEmbedCard,
54
+ Card: () => Card,
55
+ AsyncPage: () => AsyncPage,
56
+ AjaxGroupCard: () => AjaxGroupCard
57
+ });
58
+ module.exports = __toCommonJS(exports_server);
59
+
60
+ // src/server/card.ts
61
+ function isCardRecord(v) {
62
+ if (typeof v !== "object" || v === null || Array.isArray(v))
63
+ return false;
64
+ const vals = Object.values(v);
65
+ return vals.length > 0 && vals.every((x) => x instanceof Card);
66
+ }
67
+
68
+ class Card {
69
+ card = this.constructor.name;
70
+ constructor(props) {
71
+ if (props)
72
+ Object.assign(this, props);
73
+ }
74
+ generate() {
75
+ const data = {};
76
+ const children = {};
77
+ for (const key of Object.keys(this)) {
78
+ if (key === "card")
79
+ continue;
80
+ const value = this[key];
81
+ if (value instanceof Card) {
82
+ children[key] = value.generate();
83
+ } else if (Array.isArray(value) && value.length > 0 && value.every((v) => v instanceof Card)) {
84
+ children[key] = value.map((v) => v.generate());
85
+ } else if (isCardRecord(value)) {
86
+ children[key] = Object.fromEntries(Object.entries(value).map(([k, v]) => [
87
+ k,
88
+ v.generate()
89
+ ]));
90
+ } else {
91
+ data[key] = value;
92
+ }
93
+ }
94
+ return { ...children, card: this.card, data };
95
+ }
96
+ inputChildLoc() {
97
+ const acc = {};
98
+ const visit = (card) => {
99
+ const name = card.name;
100
+ if (card instanceof InputCard && typeof name === "string") {
101
+ acc[name] = card;
102
+ }
103
+ for (const key of Object.keys(card)) {
104
+ const v = card[key];
105
+ if (v instanceof Card)
106
+ visit(v);
107
+ else if (Array.isArray(v))
108
+ v.forEach((x) => x instanceof Card && visit(x));
109
+ else if (v && typeof v === "object")
110
+ Object.values(v).forEach((x) => x instanceof Card && visit(x));
111
+ }
112
+ };
113
+ visit(this);
114
+ return acc;
115
+ }
116
+ fill(data) {
117
+ const loc = this.inputChildLoc();
118
+ for (const [name, card] of Object.entries(loc)) {
119
+ if (name in data) {
120
+ card.value = data[name];
121
+ }
122
+ }
123
+ return this.generate();
124
+ }
125
+ createEvent(method, data = {}) {
126
+ const name = this.name;
127
+ if (typeof name !== "string") {
128
+ throw new Error("Card.createEvent requires a string `name`");
129
+ }
130
+ const self = this;
131
+ const io = self.useSocketioSupport || self.useCentrifugeSupport || self.useMittSupport;
132
+ if (!io) {
133
+ throw new Error("Card.createEvent requires an IO support flag enabled");
134
+ }
135
+ return { name: `pie${method}_${name}`, data };
136
+ }
137
+ }
138
+
139
+ class InputCard extends Card {
140
+ parse(raw) {
141
+ return raw;
142
+ }
143
+ }
144
+ // src/server/page.ts
145
+ class AsyncPage {
146
+ fields;
147
+ isTyped;
148
+ ajaxPost = {};
149
+ ajaxGet = {};
150
+ publisher;
151
+ constructor(isTyped = false) {
152
+ this.isTyped = isTyped;
153
+ }
154
+ async getContent(_ctx = {}) {
155
+ if (this.fields)
156
+ return this.fields.fill({});
157
+ throw new Error("getContent not implemented and no `fields` set");
158
+ }
159
+ async process(_data) {
160
+ throw new Error("process not implemented");
161
+ }
162
+ registerAjax(pathname, fn, method = "POST") {
163
+ if (method === "POST")
164
+ this.ajaxPost[pathname] = fn;
165
+ else
166
+ this.ajaxGet[pathname] = fn;
167
+ }
168
+ setPublisher(p) {
169
+ this.publisher = p;
170
+ }
171
+ async emit(event, to) {
172
+ if (!this.publisher) {
173
+ throw new Error("no publisher configured (Web must call setPublisher)");
174
+ }
175
+ const events = Array.isArray(event) ? event : [event];
176
+ for (const ev of events)
177
+ await this.publisher(ev, to);
178
+ }
179
+ }
180
+ // src/server/web.ts
181
+ var import_express = __toESM(require("express"));
182
+ var import_cookie_parser = __toESM(require("cookie-parser"));
183
+ var import_jsonwebtoken = __toESM(require("jsonwebtoken"));
184
+ var import_node_crypto = require("node:crypto");
185
+
186
+ // src/server/form.ts
187
+ function form2dict(body) {
188
+ const out = {};
189
+ for (const [k, v] of Object.entries(body ?? {})) {
190
+ out[k] = Array.isArray(v) && v.length === 1 ? v[0] : v;
191
+ }
192
+ return out;
193
+ }
194
+ function aggregate(data, rule) {
195
+ if (rule !== "by_underscore")
196
+ return data;
197
+ const out = {};
198
+ for (const [k, v] of Object.entries(data)) {
199
+ const idx = k.indexOf("__");
200
+ if (idx === -1) {
201
+ out[k] = v;
202
+ } else {
203
+ const parent = k.slice(0, idx);
204
+ const child = k.slice(idx + 2);
205
+ const bucket = out[parent] ??= {};
206
+ bucket[child] = v;
207
+ }
208
+ }
209
+ return out;
210
+ }
211
+
212
+ // src/server/realtime.ts
213
+ async function publishToCentrifuge(opts, fetchFn = fetch) {
214
+ const res = await fetchFn(`${opts.url.replace(/\/$/, "")}/api/publish`, {
215
+ method: "POST",
216
+ headers: {
217
+ "Content-Type": "application/json",
218
+ "X-API-Key": opts.apiKey
219
+ },
220
+ body: JSON.stringify({ channel: opts.channel, data: opts.data })
221
+ });
222
+ if (!res.ok) {
223
+ throw new Error(`centrifuge publish failed: ${res.status}`);
224
+ }
225
+ }
226
+
227
+ // src/server/web.ts
228
+ function escapeRegExp(s) {
229
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
230
+ }
231
+
232
+ class Web {
233
+ pages;
234
+ opts;
235
+ constructor(pages, opts = {}) {
236
+ this.pages = pages;
237
+ const adminSubdomain = opts.adminSubdomain ?? "/";
238
+ if (!adminSubdomain.startsWith("/") || !adminSubdomain.endsWith("/")) {
239
+ throw new Error('adminSubdomain must start and end with "/"');
240
+ }
241
+ this.opts = { ...opts, adminSubdomain };
242
+ this.wirePublishers();
243
+ }
244
+ wirePublishers() {
245
+ if (!this.opts.useCentrifugeSupport || !this.opts.centrifugeUrl || !this.opts.centrifugeApiKey) {
246
+ return;
247
+ }
248
+ for (const entry of Object.values(this.pages)) {
249
+ if (typeof entry === "string")
250
+ continue;
251
+ entry.setPublisher(async (ev, to) => {
252
+ const channel = to ? `${ev.name}_${to}` : ev.name;
253
+ await publishToCentrifuge({
254
+ url: this.opts.centrifugeUrl,
255
+ apiKey: this.opts.centrifugeApiKey,
256
+ channel,
257
+ data: ev.data
258
+ });
259
+ });
260
+ }
261
+ }
262
+ resolvePage(pathname) {
263
+ let key = pathname.replace(/^\/+/, "");
264
+ let hops = 0;
265
+ while (hops++ < 10) {
266
+ const entry = this.pages[key];
267
+ if (entry === undefined)
268
+ return null;
269
+ if (typeof entry === "string") {
270
+ key = entry;
271
+ continue;
272
+ }
273
+ return entry;
274
+ }
275
+ return null;
276
+ }
277
+ contextFromRequest(req) {
278
+ const ctx = {};
279
+ for (const k of this.opts.cookieKeys ?? []) {
280
+ const c = req.cookies?.[k];
281
+ if (c !== undefined)
282
+ ctx[k] = c;
283
+ }
284
+ Object.assign(ctx, req.query);
285
+ return ctx;
286
+ }
287
+ collectAjax(kind) {
288
+ const map = {};
289
+ for (const entry of Object.values(this.pages)) {
290
+ if (typeof entry === "string")
291
+ continue;
292
+ Object.assign(map, entry[kind]);
293
+ }
294
+ return map;
295
+ }
296
+ getApp() {
297
+ const app = import_express.default();
298
+ app.use(import_express.default.urlencoded({ extended: true }));
299
+ app.use(import_express.default.json());
300
+ app.use(import_cookie_parser.default());
301
+ if (this.opts.enableCors)
302
+ app.use(this.corsMiddleware());
303
+ const sub = this.opts.adminSubdomain;
304
+ const contentPrefix = `${sub}api/content/`;
305
+ const processPrefix = `${sub}api/process/`;
306
+ const ajaxPrefix = `${sub}api/ajax_content/`;
307
+ app.get(new RegExp("^" + escapeRegExp(contentPrefix)), async (req, res) => {
308
+ const pathname = decodeURIComponent(req.path.slice(contentPrefix.length));
309
+ const page = this.resolvePage(pathname);
310
+ if (!page) {
311
+ res.status(404).json({ error: "page not found" });
312
+ return;
313
+ }
314
+ try {
315
+ res.json(await page.getContent(this.contextFromRequest(req)));
316
+ } catch (e) {
317
+ res.status(500).json({ error: String(e) });
318
+ }
319
+ });
320
+ app.post(new RegExp("^" + escapeRegExp(processPrefix)), async (req, res) => {
321
+ const pathname = decodeURIComponent(req.path.slice(processPrefix.length));
322
+ const page = this.resolvePage(pathname);
323
+ if (!page) {
324
+ res.status(404).json({ error: "page not found" });
325
+ return;
326
+ }
327
+ const data = aggregate(form2dict(req.body), this.opts.aggregationRule);
328
+ try {
329
+ const result = await page.process(data);
330
+ if (typeof result !== "string") {
331
+ if (!res.headersSent)
332
+ res.status(204).end();
333
+ return;
334
+ }
335
+ let url = result;
336
+ if (url.startsWith("/")) {
337
+ url = sub + url.slice(1);
338
+ if (this.opts.disableServing && this.opts.servingUrl) {
339
+ url = this.opts.servingUrl + url;
340
+ }
341
+ }
342
+ res.redirect(303, url);
343
+ } catch (e) {
344
+ res.status(500).json({ error: String(e) });
345
+ }
346
+ });
347
+ const postAjax = this.collectAjax("ajaxPost");
348
+ const getAjax = this.collectAjax("ajaxGet");
349
+ app.post(new RegExp("^" + escapeRegExp(ajaxPrefix)), async (req, res) => {
350
+ const pathname = "/" + req.path.slice(ajaxPrefix.length);
351
+ const fn = postAjax[pathname];
352
+ if (!fn) {
353
+ res.status(404).json({ error: "ajax handler not found" });
354
+ return;
355
+ }
356
+ const data = aggregate(form2dict(req.body), this.opts.aggregationRule);
357
+ res.json(await fn(data));
358
+ });
359
+ app.get(new RegExp("^" + escapeRegExp(ajaxPrefix)), async (req, res) => {
360
+ const pathname = "/" + req.path.slice(ajaxPrefix.length);
361
+ const fn = getAjax[pathname];
362
+ if (!fn) {
363
+ res.status(404).json({ error: "ajax handler not found" });
364
+ return;
365
+ }
366
+ const data = aggregate({ ...req.query }, this.opts.aggregationRule);
367
+ res.json(await fn(data));
368
+ });
369
+ app.get(`${sub}api/support/:name`, (req, res) => {
370
+ const name = req.params.name;
371
+ const supported = name === "socketio" ? !!this.opts.useSocketioSupport : name === "centrifuge" ? !!this.opts.useCentrifugeSupport : false;
372
+ res.json(supported);
373
+ });
374
+ app.get("/api/centrifuge/gen_token", (req, res) => {
375
+ const secret = this.opts.centrifugeHmacSecret;
376
+ if (!secret) {
377
+ res.status(403).json({ error: "no centrifuge secret" });
378
+ return;
379
+ }
380
+ const cookies = {};
381
+ for (const k of this.opts.cookieKeys ?? []) {
382
+ const v = req.cookies?.[k];
383
+ if (typeof v === "string")
384
+ cookies[k] = v;
385
+ }
386
+ const subId = this.opts.centrifugeSubFn?.(cookies) ?? import_node_crypto.createHash("sha256").update(JSON.stringify(cookies)).digest("hex");
387
+ const now = Math.floor(Date.now() / 1000);
388
+ const token = import_jsonwebtoken.default.sign({ sub: subId, iat: now, exp: now + 3600 }, secret, { algorithm: "HS256" });
389
+ res.json({ token });
390
+ });
391
+ return app;
392
+ }
393
+ corsMiddleware() {
394
+ const origins = this.opts.corsOrigins;
395
+ return (req, res, next) => {
396
+ const origin = req.headers.origin;
397
+ if (!origins || origin && origins.includes(origin)) {
398
+ res.setHeader("Access-Control-Allow-Origin", origin ?? "*");
399
+ }
400
+ res.setHeader("Access-Control-Allow-Credentials", "true");
401
+ res.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS");
402
+ res.setHeader("Vary", "Origin");
403
+ const reqHeaders = req.headers["access-control-request-headers"];
404
+ res.setHeader("Access-Control-Allow-Headers", (Array.isArray(reqHeaders) ? reqHeaders.join(",") : reqHeaders) || "Content-Type");
405
+ if (req.method === "OPTIONS") {
406
+ res.sendStatus(204);
407
+ return;
408
+ }
409
+ next();
410
+ };
411
+ }
412
+ }
413
+ // src/server/cards/HiddenCard.ts
414
+ class HiddenCard extends InputCard {
415
+ }
416
+ // src/server/cards/UnionCard.ts
417
+ class UnionCard extends Card {
418
+ }
419
+ // src/server/cards/AjaxGroupCard.ts
420
+ class AjaxGroupCard extends Card {
421
+ }
422
+ // src/server/cards/OneOfCard.ts
423
+ class OneOfCard extends Card {
424
+ }
425
+ // src/server/cards/HTMLEmbedCard.ts
426
+ class HTMLEmbedCard extends Card {
427
+ }
@@ -0,0 +1,26 @@
1
+ import { Card } from './card';
2
+ import type { SocketIOEvent } from './types';
3
+ import type { Publisher } from './realtime';
4
+ type AjaxFn = (data: Record<string, unknown>) => Promise<unknown>;
5
+ /**
6
+ * Base page. Mirrors pie's AsyncPage: holds a `fields` card tree and exposes
7
+ * `getContent`/`process`/`registerAjax`/`emit`.
8
+ */
9
+ export declare class AsyncPage {
10
+ fields?: Card;
11
+ isTyped: boolean;
12
+ ajaxPost: Record<string, AjaxFn>;
13
+ ajaxGet: Record<string, AjaxFn>;
14
+ private publisher?;
15
+ constructor(isTyped?: boolean);
16
+ /** Return the filled UIConfig. Default fills `fields` with `{}`; override to use ctx. */
17
+ getContent(_ctx?: Record<string, unknown>): Promise<Record<string, unknown>>;
18
+ /** Handle a form submission. Return a string URL (→303 redirect). */
19
+ process(_data: Record<string, unknown>): Promise<string | unknown>;
20
+ registerAjax(pathname: string, fn: AjaxFn, method?: 'POST' | 'GET'): void;
21
+ /** Injected by Web to route emitted events to the configured transport. */
22
+ setPublisher(p: Publisher): void;
23
+ emit(event: SocketIOEvent | SocketIOEvent[], to?: string): Promise<void>;
24
+ }
25
+ export {};
26
+ //# sourceMappingURL=page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/server/page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;AAEjE;;;GAGG;AACH,qBAAa,SAAS;IAClB,MAAM,CAAC,EAAE,IAAI,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAK;IACrC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAK;IACpC,OAAO,CAAC,SAAS,CAAC,CAAW;gBAEjB,OAAO,UAAQ;IAI3B,yFAAyF;IACnF,UAAU,CACZ,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACnC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAKnC,qEAAqE;IAC/D,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC;IAIxE,YAAY,CACR,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,EACV,MAAM,GAAE,MAAM,GAAG,KAAc,GAChC,IAAI;IAKP,2EAA2E;IAC3E,YAAY,CAAC,CAAC,EAAE,SAAS,GAAG,IAAI;IAI1B,IAAI,CACN,KAAK,EAAE,aAAa,GAAG,aAAa,EAAE,EACtC,EAAE,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC;CAOnB"}
@@ -0,0 +1,13 @@
1
+ import type { SocketIOEvent } from './types';
2
+ type FetchFn = typeof fetch;
3
+ /** Publish a payload to a Centrifugo channel via its HTTP API. Mirrors pie publish. */
4
+ export declare function publishToCentrifuge(opts: {
5
+ url: string;
6
+ apiKey: string;
7
+ channel: string;
8
+ data: unknown;
9
+ }, fetchFn?: FetchFn): Promise<void>;
10
+ /** Publishes a single event, optionally scoped to a subscriber id `to`. */
11
+ export type Publisher = (event: SocketIOEvent, to?: string) => Promise<void>;
12
+ export {};
13
+ //# sourceMappingURL=realtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../../src/server/realtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE5C,KAAK,OAAO,GAAG,OAAO,KAAK,CAAA;AAE3B,uFAAuF;AACvF,wBAAsB,mBAAmB,CACrC,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,EACrE,OAAO,GAAE,OAAe,GACzB,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,2EAA2E;AAC3E,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA"}
@@ -0,0 +1,28 @@
1
+ import type { UIConfigType } from '../types';
2
+ export type { UIConfigType };
3
+ /** A realtime event: name `pie{method}_{cardName}` + payload. Mirrors pie's SocketIOEvent. */
4
+ export interface SocketIOEvent {
5
+ name: string;
6
+ data: Record<string, unknown>;
7
+ }
8
+ /** Subset of request context handed to page methods (cookies + query + body merged). */
9
+ export type PageContext = Record<string, unknown>;
10
+ export interface WebOptions {
11
+ cookieKeys?: string[];
12
+ cookieOptions?: Record<string, unknown>;
13
+ enableCors?: boolean;
14
+ corsOrigins?: string[];
15
+ /** Route prefix; must start and end with "/". Default "/". Mirrors pie admin_subdomain. */
16
+ adminSubdomain?: string;
17
+ disableServing?: boolean;
18
+ servingUrl?: string;
19
+ assetsPath?: string;
20
+ aggregationRule?: 'by_underscore';
21
+ useSocketioSupport?: boolean;
22
+ useCentrifugeSupport?: boolean;
23
+ centrifugeUrl?: string;
24
+ centrifugeApiKey?: string;
25
+ centrifugeHmacSecret?: string;
26
+ centrifugeSubFn?: (cookies: Record<string, string>) => string;
27
+ }
28
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAE5C,YAAY,EAAE,YAAY,EAAE,CAAA;AAE5B,8FAA8F;AAC9F,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAChC;AAED,wFAAwF;AACxF,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEjD,MAAM,WAAW,UAAU;IACvB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACvC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,2FAA2F;IAC3F,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,CAAA;CAChE"}
@@ -0,0 +1,23 @@
1
+ import { type Express } from 'express';
2
+ import { AsyncPage } from './page';
3
+ import type { WebOptions } from './types';
4
+ /**
5
+ * Assembles an Express app mirroring the pie FastAPI runtime: routes for
6
+ * content, process, ajax, support, and centrifuge token, plus realtime
7
+ * publishing wired into every page.
8
+ */
9
+ export declare class Web {
10
+ pages: Record<string, AsyncPage | string>;
11
+ opts: WebOptions & {
12
+ adminSubdomain: string;
13
+ };
14
+ constructor(pages: Record<string, AsyncPage | string>, opts?: WebOptions);
15
+ private wirePublishers;
16
+ /** Resolve a pathname to a page, following string aliases. */
17
+ resolvePage(pathname: string): AsyncPage | null;
18
+ private contextFromRequest;
19
+ private collectAjax;
20
+ getApp(): Express;
21
+ private corsMiddleware;
22
+ }
23
+ //# sourceMappingURL=web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/server/web.ts"],"names":[],"mappings":"AAAA,OAAgB,EACZ,KAAK,OAAO,EAIf,MAAM,SAAS,CAAA;AAIhB,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAGlC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAMzC;;;;GAIG;AACH,qBAAa,GAAG;IACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC,CAAA;IACzC,IAAI,EAAE,UAAU,GAAG;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,CAAA;gBAEjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC,EAAE,IAAI,GAAE,UAAe;IAU5E,OAAO,CAAC,cAAc;IAsBtB,8DAA8D;IAC9D,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAe/C,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,WAAW;IAYnB,MAAM,IAAI,OAAO;IAkJjB,OAAO,CAAC,cAAc;CAyBzB"}
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{useMemo as C}from"react";import{QueryClient as C$,QueryClientProvider as y$,useQuery as f$}from"@tanstack/react-query";import SU from"mitt";import{createContext as mU,useCallback as UI,useContext as $I}from"react";var o=globalThis,_=(U,$)=>{let I=Symbol.for(U);if(!(I in o))o[I]=$();return o[I]};function $U(){return _("@swarm.ing/pieui:mitt-emitter",()=>SU())}var gU=_("@swarm.ing/pieui:context:mitt",()=>mU(null));var f=gU;import{io as hU}from"socket.io-client";import{createContext as pU}from"react";var IU=_("@swarm.ing/pieui:socket-cache",()=>new Map),JU=(U)=>{let $=IU.get(U);if($)return $;let I=hU(U,{autoConnect:!1,transports:["websocket"]});return IU.set(U,I),I},dU=_("@swarm.ing/pieui:context:socket",()=>pU(null)),R=dU;import{createContext as lU}from"react";import{Centrifuge as ZU}from"centrifuge";var XU=_("@swarm.ing/pieui:centrifuge-cache",()=>new Map),YU=(U,$)=>{if(!$)return null;let I=`${U}::${$}`,Z=XU.get(I);if(Z)return Z;async function X(){let Y=await fetch(U+"api/centrifuge/gen_token",{credentials:"include"});if(!Y.ok){if(Y.status===401||Y.status===403)throw new ZU.UnauthorizedError("Backend is not answering");throw Error(`Unexpected status code ${Y.status}`)}return(await Y.json()).token}let J=new ZU($,{getToken:X});return XU.set(I,J),J},cU=_("@swarm.ing/pieui:context:centrifuge",()=>lU(null)),j=cU;import{useContext as I$,useEffect as J$}from"react";import{useEffect as uU,useState as oU}from"react";var b=new Map,v=new Map;function S(U,$){let I=`${U}::${$}`,Z=U?b.get(I):void 0,[X,J]=oU(Z??null);return uU(()=>{if(!U)return;if(b.has(I)){J(b.get(I));return}let Y=v.get(I);if(!Y)Y=fetch(U+`api/support/${$}`,{method:"GET"}).then((G)=>G.json()).then((G)=>{return b.set(I,G),v.delete(I),G}).catch((G)=>{throw v.delete(I),G}),v.set(I,Y);let H=!1;return Y.then((G)=>{if(!H)J(G)}).catch(()=>{}),()=>{H=!0}},[U,$,I]),X}import{createContext as sU,useContext as nU}from"react";var s=_("@swarm.ing/pieui:context:pieConfig",()=>sU(null)),m=()=>{let U=nU(s);if(!U)throw Error("usePieConfig must be used within PieConfigProvider");return U},n=()=>{let{apiServer:U}=m();return U},g=n,zU=()=>{let{centrifugeServer:U}=m();return U};var A=()=>{let{enableRenderingLog:U}=m();return U},GU=A,BU=()=>{let{pageProcessor:U}=m();return U};var iU=(U)=>{let $=document.cookie?document.cookie.split(";"):[];for(let I of $){let Z=I.indexOf("=");if((Z===-1?I:I.slice(0,Z)).trim()===U){let J=Z===-1?"":I.slice(Z+1).trim();try{return decodeURIComponent(J)}catch{return J}}}return null},rU={isClient(){return typeof window<"u"&&typeof document<"u"},readSid(){return typeof window>"u"?void 0:window.sid},setSid(U){if(typeof window<"u")window.sid=U},readWebStorage(U,$){return(U==="local"?window.localStorage:window.sessionStorage).getItem($)},readCookie:iU,readUrlParams(U){return new URLSearchParams(window.location.search).getAll(U)},readDomInput(U){let $=document.getElementsByName(U);if(!$.length)return null;let I=$[0];if(I instanceof HTMLInputElement){if(I.type==="file"&&I.files)return Array.from(I.files);return[I.value]}if(I instanceof HTMLTextAreaElement)return[I.value];return[]},submitGlobalForm(){if(typeof document>"u")return;let U=document.getElementById("piedata_global_form");U&&U.submit()}},HU=rU;var aU={};function E(){return aU}var QU=new Map;var _U=(U)=>{return QU.has(U)?QU.get(U):null};var DU,tU={isClient(){return!0},readSid(){return DU},setSid(U){DU=U},readWebStorage(U,$){let I=E(),Z=U==="local"?I.storage:I.sessionStorage;return Z?Z.getItem($):null},async readWebStorageAsync(U,$){let I=E(),Z=U==="local"?I.asyncStorage:I.asyncSessionStorage;if(Z)return Z.getItem($);let X=U==="local"?I.storage:I.sessionStorage;return X?X.getItem($):null},readCookie(U){let $=E();return $.getCookie?$.getCookie(U):null},readUrlParams(U){let $=E();return $.getRouteParams?$.getRouteParams(U):[]},readDomInput(U){let $=E();return $.getInput?$.getInput(U):_U(U)},submitGlobalForm(){E().submitForm?.()}},FU=tU;var eU=typeof navigator<"u"&&navigator.product==="ReactNative",U$=eU?FU:HU,h=U$;var $$=_("@swarm.ing/pieui:sid-state",()=>({promise:null,resolve:null}));function TU(){$$.resolve?.()}var Z$=({children:U})=>{let $=I$(R),I=g(),Z=S(I,"socketIO"),X=(J)=>{if(h.isClient())h.setSid(J.sid),TU(),console.log(`SocketIO initialized: ${h.readSid()}`)};return J$(()=>{if(!$)return;let J=()=>{console.log("SocketIO connected")},Y=(H)=>{console.log(`SocketIO disconnected: ${H}`),$.connect()};if(Z)$.on("pieinit",X),$.on("connect",J),$.on("disconnect",Y),$.connect();return()=>{if(Z)$.off("pieinit",X),$.off("connect",J),$.off("disconnect",Y),$.disconnect()}},[$,Z]),U},KU=Z$;import{useContext as X$,useEffect as Y$}from"react";var z$=({children:U})=>{let $=X$(j),I=g(),Z=S(I,"centrifuge");return Y$(()=>{if(!$)return;let X=()=>{console.log("Centrifuge connected")},J=(Y)=>{console.log("Centrifuge disconnected:",Y)};if(Z)$.on("connected",X),$.on("disconnected",J),$.connect();return()=>{if(Z)$.disconnect()}},[$,Z]),U},LU=z$;import{createContext as G$}from"react";import{jsx as Q$,Fragment as H$}from"react/jsx-runtime";var B$=_("@swarm.ing/pieui:context:fallback",()=>G$(Q$(H$,{}))),P=B$;import{createContext as _$}from"react";var D$=_("@swarm.ing/pieui:context:lazyError",()=>_$(void 0)),N=D$;import{lazy as F$}from"react";var k=new Map;function T$(U,$){return $.catch(()=>{if(k.get(U)===$)k.delete(U)}),k.set(U,$),$}function qU(U,$){return F$(()=>{if(k.has($))return k.get($);return T$($,U().then((I)=>I))})}var WU=_("@swarm.ing/pieui:component-registry",()=>new Map),K$=(U)=>{if(!U.name)throw Error("Component registration requires a name");if(!U.component&&!U.loader)throw Error(`Component "${U.name}" requires component or loader`);let $={name:U.name,component:U.component,loader:U.loader,metadata:U.metadata,fallback:U.fallback,isLazy:!1};if(!$.component&&$.loader)$.component=qU($.loader,U.name),$.isLazy=!0;return $};function p(U){let $=K$(U);return WU.set($.name,$),$.component}var d=(U)=>{return WU.get(U)};import{useContext as OU,memo as M$}from"react";import{Component as L$,Suspense as q$}from"react";import{jsx as V$}from"react/jsx-runtime";var W$=2,O$=400;class w extends L${state={failed:!1,attempt:0};timer;static getDerivedStateFromError(){return{failed:!0}}componentDidCatch(U){if(this.props.onError?.(U),this.state.attempt<W$){let $=O$*(this.state.attempt+1);this.timer=setTimeout(()=>{this.setState((I)=>({failed:!1,attempt:I.attempt+1}))},$)}}componentDidUpdate(U){if(U.name!==this.props.name&&this.state.attempt!==0)this.setState({failed:!1,attempt:0})}componentWillUnmount(){if(this.timer)clearTimeout(this.timer)}render(){if(this.state.failed)return this.props.fallback;return V$(q$,{fallback:this.props.fallback,children:this.props.children},`${this.props.name}:${this.state.attempt}`)}}import{jsx as i}from"react/jsx-runtime";function A$({uiConfig:U,setUiAjaxConfiguration:$}){let I=OU(P),Z=OU(N),X=A();if(X)console.log("[UI] Rendering component:",U.card),console.log("[UI] Component data:",U.data),console.log("[UI] Component content:",U.content),console.log("[UI] Has setUiAjaxConfiguration:",!!$);let J=d(U.card);if(!J?.component){if(X)console.warn(`[UI] Component not found in registry: ${U.card}`),console.log("[UI] Returning fallback component");return I}if(X)console.log("[UI] Found component in registry:",{name:J.name,isLazy:J.isLazy,hasMetadata:!!J.metadata});let Y=J.component,H=i(Y,{data:U.data,content:U.content,setUiAjaxConfiguration:$});if(J.isLazy){if(X)console.log("[UI] Rendering lazy component with Suspense:",J.name);return i(w,{name:J.name,fallback:J.fallback?i(J.fallback,{}):I,onError:Z,children:H})}if(X)console.log("[UI] Rendering component directly:",J.name);return H}var r=M$(A$);import{createAxiosDateTransformer as b$}from"axios-date-transformer";import{useEffect as E$,useState as R$}from"react";var l=({onError:U}={})=>{let[$,I]=R$(null),Z=BU();return E$(()=>{if(typeof window>"u")return;let X=window.Telegram?.WebApp;if(!X)return;try{X.ready?.()}catch(J){U?.()}if(Z==="telegram_expanded"&&(X.platform==="ios"||X.platform==="android"))X.expand();I(X)},[]),$},j$=()=>{let U=l();return[U?.initDataUnsafe,U?.initData]};import{createContext as P$}from"react";var N$=_("@swarm.ing/pieui:context:navigate",()=>P$(void 0)),VU=N$;import{useContext as AU}from"react";import{createContext as w$}from"react";var x$=_("@swarm.ing/pieui:context:uiRenderer",()=>w$(null)),MU=x$;import{jsx as c}from"react/jsx-runtime";function EU({uiConfig:U,setUiAjaxConfiguration:$}){let I=AU(P),Z=AU(N),X=A();if(X)console.log("[UILoading] Rendering fallback for:",U.card),console.log("[UILoading] Component data:",U.data),console.log("[UILoading] Component content:",U.content),console.log("[UILoading] Has setUiAjaxConfiguration:",!!$);let J=d(U.card);if(!J?.component){if(X)console.warn(`[UILoading] Component not found in registry: ${U.card}`),console.log("[UILoading] Returning fallback component");return I}if(X)console.log("[UILoading] Found component in registry:",{name:J.name,isLazy:J.isLazy,hasMetadata:!!J.metadata,hasFallback:!!J.fallback});if(J.fallback){if(X)console.log("[UILoading] Rendering fallback for:",J.name);let G=J.fallback;return c(G,{})}if(X)console.log("[UILoading] No fallback, rendering full component:",J.name);let Y=J.component,H=c(MU.Provider,{value:EU,children:c(Y,{data:U.data,content:U.content,setUiAjaxConfiguration:$})});if(J.isLazy)return c(w,{name:J.name,fallback:I,onError:Z,children:H});return H}var RU=EU;import{jsx as k$}from"react/jsx-runtime";function jU(U,$,I){if(!$)return I;let Z=U.replace(/^\//,""),X=$[Z];if(!X)return I;return k$(RU,{uiConfig:X})}import{jsx as F,Fragment as m$}from"react/jsx-runtime";var v$=({location:U,fallback:$,piecache:I,onError:Z,queryOptions:X,disableGlobalForm:J})=>{let Y=n(),H=zU(),G=A(),K=C(()=>b$({baseURL:Y}),[Y]),z=C(()=>$U(),[]),T=C(()=>Y?JU(Y):null,[Y]),y=C(()=>Y?YU(Y,H):null,[Y,H]),q=l({onError:Z}),{data:L,isLoading:V,error:W}=f$({queryKey:["uiConfig",U.pathname+U.search,q?.initData],enabled:!!q?.initData,queryFn:async()=>{let B=new URLSearchParams(U.search);if(B.set("__pieroot","telegram"),q?.initData)B.set("initData",q.initData);let Q="/api/content"+U.pathname+"?"+B.toString();if(G)console.log("[PieRoot] Fetching UI configuration from:",Q);let D=await K.get(Q,{headers:{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET,PUT,POST,DELETE,PATCH,OPTIONS","Content-type":"application/json"},withCredentials:!0});if(G)console.log("[PieRoot] Received UI configuration:",D.data);return D.data},staleTime:1/0,gcTime:1/0,refetchOnWindowFocus:!1,refetchOnMount:!1,refetchOnReconnect:!1,retry:!0,retryDelay:(B)=>Math.min(1000*2**B,30000),...X}),O=jU(U.pathname,I,$);if(!Y)throw Error("Set PIE_API_SERVER and PIE_CENTRIFUGE_SERVER");if(W&&G)return console.error("[PieRoot] Error fetching UI configuration:",W),console.error("[PieRoot] Error details:",{message:W.message,status:W.response?.status,data:W.response?.data}),Z?.(W),O;if(V||!L){if(G)console.log("[PieRoot] Loading state:",{isLoading:V,hasUiConfiguration:!!L});return O}if(G)console.log("[PieRoot] UI configuration loaded successfully:",L),console.log("[PieRoot] Rendering UI with configuration");return F(f.Provider,{value:z,children:F(R.Provider,{value:T,children:F(j.Provider,{value:y,children:F(P.Provider,{value:$??F(m$,{}),children:F(KU,{children:F(LU,{children:J?F(r,{uiConfig:L}):F("form",{id:"piedata_global_form",action:Y+"api/process"+U.pathname,method:"post",encType:"multipart/form-data",children:F(r,{uiConfig:L})})})})})})})})},S$=(U)=>{let $=C(()=>new C$,[]),I=U.queryClient??$;return F(VU.Provider,{value:U.onNavigate,children:F(s.Provider,{value:U.config,children:F(N.Provider,{value:U.onError,children:F(y$,{client:I,children:F(v$,{...U})})})})})},g$=S$;import{useEffect as kU,useState as c$}from"react";import{useContext as a,useEffect as t,useRef as xU}from"react";function PU(U){return U.wasRecovering===!0&&U.recovered===!1}function NU(U){return U.recoverable===!1}function wU(U,$,I){let Z=U.getSubscription($);if(Z)return{subscription:Z,createdHere:!1};return{subscription:U.newSubscription($,I),createdHere:!0}}import{jsx as d$,jsxs as l$,Fragment as p$}from"react/jsx-runtime";var h$=({card:U,data:$,children:I,useSocketioSupport:Z=!1,useCentrifugeSupport:X=!1,useMittSupport:J=!1,centrifugeChannel:Y=void 0,methods:H=void 0,stored:G=void 0,onResync:K=void 0})=>{let z=GU(),T=xU(H);T.current=H;let y=xU(K);if(y.current=K,z)console.log("[PieCard] Rendering card:",U),console.log("[PieCard] Card data:",$),console.log("[PieCard] Component name:",$?.name),console.log("[PieCard] Real-time support:",{socketio:Z,centrifuge:X,mitt:J,centrifugeChannel:Y}),console.log("[PieCard] Methods:",H?Object.keys(H):"none"),console.log("[PieCard] Has children:",!!I);let q=a(R),L=a(j),V=a(f);if(t(()=>{if(!q||!Z||!T.current||!$.name){if(z&&Z)console.log("[PieCard] Socket.IO setup skipped:",{hasSocket:!!q,useSocketioSupport:Z,hasMethods:!!T.current,hasDataName:!!$?.name});return}let O=Object.keys(T.current??{}).map((B)=>{let Q=`pie${B}_${$.name}`;if(z)console.log(`[PieCard] Socket.IO registering event: ${Q}`);let D=(M)=>{T.current?.[B]?.(M)};return q.on(Q,D),[Q,D]});return()=>{O.forEach(([B,Q])=>{if(z)console.log(`[PieCard] Socket.IO unregistering event: ${B}`);q.off(B,Q)})}},[q,$.name,Z]),t(()=>{if(!L||!X||!Y||!$.name){if(z&&X)console.log("[PieCard] Centrifuge setup skipped:",{hasCentrifuge:!!L,useCentrifugeSupport:X,hasCentrifugeChannel:!!Y,hasMethods:!!T.current,hasDataName:!!$?.name});return}let O=Object.keys(T.current??{}).map((B)=>{let Q=`pie${B}_${$.name}_${Y}`;if(z)console.log(`[PieCard] Centrifuge subscribing to channel: ${Q}`);let{subscription:D,createdHere:M}=wU(L,Q,{recoverable:!0,positioned:!0}),e=(x)=>{if(z)console.log(`[PieCard] Centrifuge received data on ${Q}:`,x.data);T.current?.[B]?.(x.data)},UU=(x)=>{if(NU(x))console.warn(`[PieCard] Centrifuge channel ${Q} is not `+"recoverable — enable history on the server "+"namespace for exact replay; relying on resync fallback only.");if(PU(x)){if(z)console.log(`[PieCard] Centrifuge recovery gap on ${Q}; requesting resync`);y.current?.({channel:Q,reason:"gap"})}};return D.on("publication",e),D.on("subscribed",UU),D.subscribe(),{subscription:D,createdHere:M,onPublication:e,onSubscribed:UU}});return()=>{O.forEach(({subscription:B,createdHere:Q,onPublication:D,onSubscribed:M})=>{if(z)console.log("[PieCard] Centrifuge unsubscribing from channel");if(B.off("publication",D),B.off("subscribed",M),Q)B.unsubscribe(),L.removeSubscription(B)})}},[L,Y,$.name,X]),t(()=>{if(!V||!J||!$.name){if(z&&J)console.log("[PieCard] Mitt setup skipped:",{hasMitt:!!V,useMittSupport:J,hasMethods:!!T.current,hasDataName:!!$?.name});return}let W=Object.keys(T.current??{}),O={};return W.forEach((B)=>{let Q=`pie${B}_${$.name}`,D=(M)=>{if(z)console.log(`[PieCard] Mitt registering event: ${Q}`);T.current?.[B]?.(M)};O[Q]=D,V.on(Q,D)}),()=>{Object.entries(O).forEach(([B,Q])=>{if(z)console.log(`[PieCard] Mitt unregistering event: ${B}`);V.off(B,Q)})}},[V,$.name,J]),z)console.log("[PieCard] Rendering complete, returning children");if(G!==void 0)return l$(p$,{children:[d$("input",{type:"hidden",name:$.name,value:JSON.stringify(G)}),I]});return I},u=h$;import{jsx as CU}from"react/jsx-runtime";var u$=({data:U})=>{let{name:$,key:I,value:Z,useSocketioSupport:X,useCentrifugeSupport:J,useMittSupport:Y,centrifugeChannel:H}=U,[G,K]=c$(Z);return kU(()=>{K(Z)},[Z]),kU(()=>{if(typeof window>"u")return;let z=window.Telegram?.WebApp?.CloudStorage;if(!z)return;z.setItem(I,G)},[I,G]),CU(u,{card:"CloudStorageCard",data:U,useSocketioSupport:X,useCentrifugeSupport:J,useMittSupport:Y,centrifugeChannel:H,methods:{update:({value:z})=>{K(z)},remove:()=>{let z=window.Telegram?.WebApp?.CloudStorage;if(z)z.removeItem(I);K("")}},children:CU("input",{type:"hidden",id:$,name:$,value:G})})},yU=u$;var o$=p({name:"CloudStorageCard",component:yU,metadata:{author:"PieData"}});import{useEffect as fU,useState as s$}from"react";import{jsx as bU}from"react/jsx-runtime";var n$=({data:U})=>{let{name:$,key:I,value:Z,useSocketioSupport:X,useCentrifugeSupport:J,useMittSupport:Y,centrifugeChannel:H}=U,[G,K]=s$(Z);return fU(()=>{K(Z)},[Z]),fU(()=>{if(typeof window>"u")return;let z=window.Telegram?.WebApp?.SecureStorage;if(!z)return;z.setItem(I,G)},[I,G]),bU(u,{card:"SecureStorageCard",data:U,useSocketioSupport:X,useCentrifugeSupport:J,useMittSupport:Y,centrifugeChannel:H,methods:{update:({value:z})=>{K(z)},remove:()=>{let z=window.Telegram?.WebApp?.SecureStorage;if(z)z.removeItem(I);K("")}},children:bU("input",{type:"hidden",id:$,name:$,value:G})})},vU=n$;var i$=p({name:"SecureStorageCard",component:vU,metadata:{author:"PieData"}});export{l as useWebApp,j$ as useInitData,i$ as SecureStorageCard,g$ as PieTelegramRoot,o$ as CloudStorageCard};
2
+ import{useMemo as v}from"react";import{QueryClient as f$,QueryClientProvider as m$,useQuery as g$}from"@tanstack/react-query";import dU from"mitt";import{createContext as lU,useCallback as YJ,useContext as GJ}from"react";var a=globalThis,F=(U,$)=>{let J=Symbol.for(U);if(!(J in a))a[J]=$();return a[J]};function GU(){return F("@swarm.ing/pieui:mitt-emitter",()=>dU())}var uU=F("@swarm.ing/pieui:context:mitt",()=>lU(null));var S=uU;import{io as cU}from"socket.io-client";import{createContext as oU}from"react";var zU=F("@swarm.ing/pieui:socket-cache",()=>new Map),BU=(U)=>{let $=zU.get(U);if($)return $;let J=cU(U,{autoConnect:!1,transports:["websocket"]});return zU.set(U,J),J},sU=F("@swarm.ing/pieui:context:socket",()=>oU(null)),P=sU;import{createContext as iU}from"react";import{Centrifuge as HU}from"centrifuge";var QU=F("@swarm.ing/pieui:centrifuge-cache",()=>new Map),_U=(U,$)=>{if(!$)return null;let J=`${U}::${$}`,X=QU.get(J);if(X)return X;async function Y(){let G=await fetch(U+"api/centrifuge/gen_token",{credentials:"include"});if(!G.ok){if(G.status===401||G.status===403)throw new HU.UnauthorizedError("Backend is not answering");throw Error(`Unexpected status code ${G.status}`)}return(await G.json()).token}let Z=new HU($,{getToken:Y});return QU.set(J,Z),Z},aU=F("@swarm.ing/pieui:context:centrifuge",()=>iU(null)),N=aU;import{useContext as z$,useEffect as B$,useRef as t}from"react";import{useEffect as rU,useState as nU}from"react";var f=new Map,m=new Map;function g(U,$){let J=`${U}::${$}`,X=U?f.get(J):void 0,[Y,Z]=nU(X??null);return rU(()=>{if(!U)return;if(f.has(J)){Z(f.get(J));return}let G=m.get(J);if(!G)G=fetch(U+`api/support/${$}`,{method:"GET"}).then((B)=>B.json()).then((B)=>{return f.set(J,B),m.delete(J),B}).catch((B)=>{throw m.delete(J),B}),m.set(J,G);let H=!1;return G.then((B)=>{if(!H)Z(B)}).catch(()=>{}),()=>{H=!0}},[U,$,J]),Y}import{createContext as tU,useContext as eU}from"react";var r=F("@swarm.ing/pieui:context:pieConfig",()=>tU(null)),R=()=>{let U=eU(r);if(!U)throw Error("usePieConfig must be used within PieConfigProvider");return U},n=()=>{let{apiServer:U}=R();return U},h=n,FU=()=>{let{centrifugeServer:U}=R();return U};var L=()=>{let{enableRenderingLog:U}=R();return U},TU=L,KU=()=>{let{pageProcessor:U}=R();return U};var p=()=>{let{onLinkLost:U}=R();return U},d=()=>{let{onLinkRestored:U}=R();return U};var U$=(U)=>{let $=document.cookie?document.cookie.split(";"):[];for(let J of $){let X=J.indexOf("=");if((X===-1?J:J.slice(0,X)).trim()===U){let Z=X===-1?"":J.slice(X+1).trim();try{return decodeURIComponent(Z)}catch{return Z}}}return null},$$={isClient(){return typeof window<"u"&&typeof document<"u"},readSid(){return typeof window>"u"?void 0:window.sid},setSid(U){if(typeof window<"u")window.sid=U},readWebStorage(U,$){return(U==="local"?window.localStorage:window.sessionStorage).getItem($)},readCookie:U$,readUrlParams(U){return new URLSearchParams(window.location.search).getAll(U)},readDomInput(U){let $=document.getElementsByName(U);if(!$.length)return null;let J=$[0];if(J instanceof HTMLInputElement){if(J.type==="file"&&J.files)return Array.from(J.files);return[J.value]}if(J instanceof HTMLTextAreaElement)return[J.value];return[]},submitGlobalForm(){if(typeof document>"u")return;let U=document.getElementById("piedata_global_form");U&&U.submit()}},qU=$$;var J$={};function E(){return J$}var WU=new Map;var DU=(U)=>{return WU.has(U)?WU.get(U):null};var VU,Z$={isClient(){return!0},readSid(){return VU},setSid(U){VU=U},readWebStorage(U,$){let J=E(),X=U==="local"?J.storage:J.sessionStorage;return X?X.getItem($):null},async readWebStorageAsync(U,$){let J=E(),X=U==="local"?J.asyncStorage:J.asyncSessionStorage;if(X)return X.getItem($);let Y=U==="local"?J.storage:J.sessionStorage;return Y?Y.getItem($):null},readCookie(U){let $=E();return $.getCookie?$.getCookie(U):null},readUrlParams(U){let $=E();return $.getRouteParams?$.getRouteParams(U):[]},readDomInput(U){let $=E();return $.getInput?$.getInput(U):DU(U)},submitGlobalForm(){E().submitForm?.()}},MU=Z$;var X$=typeof navigator<"u"&&navigator.product==="ReactNative",Y$=X$?MU:qU,l=Y$;var G$=F("@swarm.ing/pieui:sid-state",()=>({promise:null,resolve:null}));function IU(){G$.resolve?.()}function w(U,$){if($==="up")return{state:"up",signal:U==="down"?"restored":null};return{state:"down",signal:U==="up"?"lost":null}}var H$=({children:U})=>{let $=z$(P),J=h(),X=g(J,"socketIO"),Y=p(),Z=d(),G=t(Y);G.current=Y;let H=t(Z);H.current=Z;let B=t("initial"),T=(z)=>{if(l.isClient())l.setSid(z.sid),IU(),console.log(`SocketIO initialized: ${l.readSid()}`)};return B$(()=>{if(!$||!X)return;let z=()=>{let{state:W,signal:q}=w(B.current,"up");if(B.current=W,q==="restored")H.current?.("socketio");console.log("SocketIO connected")},K=(W)=>{if(console.log(`SocketIO disconnected: ${W}`),$.connect(),W==="io client disconnect")return;let{state:q,signal:D}=w(B.current,"down");if(B.current=q,D==="lost")G.current?.("socketio",W)};return $.on("pieinit",T),$.on("connect",z),$.on("disconnect",K),$.connect(),()=>{$.off("pieinit",T),$.off("connect",z),$.off("disconnect",K),$.disconnect()}},[$,X]),U},OU=H$;import{useContext as Q$,useEffect as _$,useRef as e}from"react";var F$=({children:U})=>{let $=Q$(N),J=h(),X=g(J,"centrifuge"),Y=p(),Z=d(),G=e(Y);G.current=Y;let H=e(Z);H.current=Z;let B=e("initial");return _$(()=>{if(!$||!X)return;let T=(W)=>{let{state:q,signal:D}=w(B.current,"down");if(B.current=q,D==="lost")G.current?.("centrifuge",W)},z=()=>{let{state:W,signal:q}=w(B.current,"up");if(B.current=W,q==="restored")H.current?.("centrifuge");console.log("Centrifuge connected")},K=(W)=>{console.log("Centrifuge disconnected:",W),T(W)};return $.on("connecting",T),$.on("connected",z),$.on("disconnected",K),$.connect(),()=>{$.off("connecting",T),$.off("connected",z),$.off("disconnected",K),$.disconnect()}},[$,X]),U},AU=F$;import{createContext as T$}from"react";import{jsx as W$,Fragment as q$}from"react/jsx-runtime";var K$=F("@swarm.ing/pieui:context:fallback",()=>T$(W$(q$,{}))),x=K$;import{createContext as D$}from"react";var V$=F("@swarm.ing/pieui:context:lazyError",()=>D$(void 0)),y=V$;import{lazy as M$}from"react";var k=new Map;function I$(U,$){return $.catch(()=>{if(k.get(U)===$)k.delete(U)}),k.set(U,$),$}function jU(U,$){return M$(()=>{if(k.has($))return k.get($);return I$($,U().then((J)=>J))})}var LU=F("@swarm.ing/pieui:component-registry",()=>new Map),O$=(U)=>{if(!U.name)throw Error("Component registration requires a name");if(!U.component&&!U.loader)throw Error(`Component "${U.name}" requires component or loader`);let $={name:U.name,component:U.component,loader:U.loader,metadata:U.metadata,fallback:U.fallback,isLazy:!1};if(!$.component&&$.loader)$.component=jU($.loader,U.name),$.isLazy=!0;return $};function u(U){let $=O$(U);return LU.set($.name,$),$.component}var c=(U)=>{return LU.get(U)};import{useContext as EU,memo as N$}from"react";import{Component as A$,Suspense as j$}from"react";import{jsx as P$}from"react/jsx-runtime";var L$=2,E$=400;class b extends A${state={failed:!1,attempt:0};timer;static getDerivedStateFromError(){return{failed:!0}}componentDidCatch(U){if(this.props.onError?.(U),this.state.attempt<L$){let $=E$*(this.state.attempt+1);this.timer=setTimeout(()=>{this.setState((J)=>({failed:!1,attempt:J.attempt+1}))},$)}}componentDidUpdate(U){if(U.name!==this.props.name&&this.state.attempt!==0)this.setState({failed:!1,attempt:0})}componentWillUnmount(){if(this.timer)clearTimeout(this.timer)}render(){if(this.state.failed)return this.props.fallback;return P$(j$,{fallback:this.props.fallback,children:this.props.children},`${this.props.name}:${this.state.attempt}`)}}import{jsx as UU}from"react/jsx-runtime";function R$({uiConfig:U,setUiAjaxConfiguration:$}){let J=EU(x),X=EU(y),Y=L();if(Y)console.log("[UI] Rendering component:",U.card),console.log("[UI] Component data:",U.data),console.log("[UI] Component content:",U.content),console.log("[UI] Has setUiAjaxConfiguration:",!!$);let Z=c(U.card);if(!Z?.component){if(Y)console.warn(`[UI] Component not found in registry: ${U.card}`),console.log("[UI] Returning fallback component");return J}if(Y)console.log("[UI] Found component in registry:",{name:Z.name,isLazy:Z.isLazy,hasMetadata:!!Z.metadata});let G=Z.component,H=UU(G,{data:U.data,content:U.content,setUiAjaxConfiguration:$});if(Z.isLazy){if(Y)console.log("[UI] Rendering lazy component with Suspense:",Z.name);return UU(b,{name:Z.name,fallback:Z.fallback?UU(Z.fallback,{}):J,onError:X,children:H})}if(Y)console.log("[UI] Rendering component directly:",Z.name);return H}var $U=N$(R$);import{createAxiosDateTransformer as h$}from"axios-date-transformer";import{useEffect as w$,useState as x$}from"react";var o=({onError:U}={})=>{let[$,J]=x$(null),X=KU();return w$(()=>{if(typeof window>"u")return;let Y=window.Telegram?.WebApp;if(!Y)return;try{Y.ready?.()}catch(Z){U?.()}if(X==="telegram_expanded"&&(Y.platform==="ios"||Y.platform==="android"))Y.expand();J(Y)},[]),$},y$=()=>{let U=o();return[U?.initDataUnsafe,U?.initData]};import{createContext as b$}from"react";var C$=F("@swarm.ing/pieui:context:navigate",()=>b$(void 0)),PU=C$;import{useContext as RU}from"react";import{createContext as k$}from"react";var v$=F("@swarm.ing/pieui:context:uiRenderer",()=>k$(null)),NU=v$;import{jsx as s}from"react/jsx-runtime";function wU({uiConfig:U,setUiAjaxConfiguration:$}){let J=RU(x),X=RU(y),Y=L();if(Y)console.log("[UILoading] Rendering fallback for:",U.card),console.log("[UILoading] Component data:",U.data),console.log("[UILoading] Component content:",U.content),console.log("[UILoading] Has setUiAjaxConfiguration:",!!$);let Z=c(U.card);if(!Z?.component){if(Y)console.warn(`[UILoading] Component not found in registry: ${U.card}`),console.log("[UILoading] Returning fallback component");return J}if(Y)console.log("[UILoading] Found component in registry:",{name:Z.name,isLazy:Z.isLazy,hasMetadata:!!Z.metadata,hasFallback:!!Z.fallback});if(Z.fallback){if(Y)console.log("[UILoading] Rendering fallback for:",Z.name);let B=Z.fallback;return s(B,{})}if(Y)console.log("[UILoading] No fallback, rendering full component:",Z.name);let G=Z.component,H=s(NU.Provider,{value:wU,children:s(G,{data:U.data,content:U.content,setUiAjaxConfiguration:$})});if(Z.isLazy)return s(b,{name:Z.name,fallback:J,onError:X,children:H});return H}var xU=wU;import{jsx as S$}from"react/jsx-runtime";function yU(U,$,J){if(!$)return J;let X=U.replace(/^\//,""),Y=$[X];if(!Y)return J;return S$(xU,{uiConfig:Y})}import{jsx as M,Fragment as l$}from"react/jsx-runtime";var p$=({location:U,fallback:$,piecache:J,onError:X,queryOptions:Y,disableGlobalForm:Z})=>{let G=n(),H=FU(),B=L(),T=v(()=>h$({baseURL:G}),[G]),z=v(()=>GU(),[]),K=v(()=>G?BU(G):null,[G]),W=v(()=>G?_U(G,H):null,[G,H]),q=o({onError:X}),{data:D,isLoading:A,error:I}=g$({queryKey:["uiConfig",U.pathname+U.search,q?.initData],enabled:!!q?.initData,queryFn:async()=>{let Q=new URLSearchParams(U.search);if(Q.set("__pieroot","telegram"),q?.initData)Q.set("initData",q.initData);let _="/api/content"+U.pathname+"?"+Q.toString();if(B)console.log("[PieRoot] Fetching UI configuration from:",_);let V=await T.get(_,{headers:{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET,PUT,POST,DELETE,PATCH,OPTIONS","Content-type":"application/json"},withCredentials:!0});if(B)console.log("[PieRoot] Received UI configuration:",V.data);return V.data},staleTime:1/0,gcTime:1/0,refetchOnWindowFocus:!1,refetchOnMount:!1,refetchOnReconnect:!1,retry:!0,retryDelay:(Q)=>Math.min(1000*2**Q,30000),...Y}),O=yU(U.pathname,J,$);if(!G)throw Error("Set PIE_API_SERVER and PIE_CENTRIFUGE_SERVER");if(I&&B)return console.error("[PieRoot] Error fetching UI configuration:",I),console.error("[PieRoot] Error details:",{message:I.message,status:I.response?.status,data:I.response?.data}),X?.(I),O;if(A||!D){if(B)console.log("[PieRoot] Loading state:",{isLoading:A,hasUiConfiguration:!!D});return O}if(B)console.log("[PieRoot] UI configuration loaded successfully:",D),console.log("[PieRoot] Rendering UI with configuration");return M(S.Provider,{value:z,children:M(P.Provider,{value:K,children:M(N.Provider,{value:W,children:M(x.Provider,{value:$??M(l$,{}),children:M(OU,{children:M(AU,{children:Z?M($U,{uiConfig:D}):M("form",{id:"piedata_global_form",action:G+"api/process"+U.pathname,method:"post",encType:"multipart/form-data",children:M($U,{uiConfig:D})})})})})})})})},d$=(U)=>{let $=v(()=>new f$,[]),J=U.queryClient??$;return M(PU.Provider,{value:U.onNavigate,children:M(r.Provider,{value:U.config,children:M(y.Provider,{value:U.onError,children:M(m$,{client:J,children:M(p$,{...U})})})})})},u$=d$;import{useEffect as SU,useState as a$}from"react";import{useContext as JU,useEffect as ZU,useRef as vU}from"react";function bU(U){return U.wasRecovering===!0&&U.recovered===!1}function CU(U){return U.recoverable===!1}function kU(U,$,J){let X=U.getSubscription($);if(X)return{subscription:X,createdHere:!1};return{subscription:U.newSubscription($,J),createdHere:!0}}import{jsx as s$,jsxs as i$,Fragment as o$}from"react/jsx-runtime";var c$=({card:U,data:$,children:J,useSocketioSupport:X=!1,useCentrifugeSupport:Y=!1,useMittSupport:Z=!1,centrifugeChannel:G=void 0,methods:H=void 0,stored:B=void 0,onResync:T=void 0})=>{let z=TU(),K=vU(H);K.current=H;let W=vU(T);if(W.current=T,z)console.log("[PieCard] Rendering card:",U),console.log("[PieCard] Card data:",$),console.log("[PieCard] Component name:",$?.name),console.log("[PieCard] Real-time support:",{socketio:X,centrifuge:Y,mitt:Z,centrifugeChannel:G}),console.log("[PieCard] Methods:",H?Object.keys(H):"none"),console.log("[PieCard] Has children:",!!J);let q=JU(P),D=JU(N),A=JU(S);if(ZU(()=>{if(!q||!X||!K.current||!$.name){if(z&&X)console.log("[PieCard] Socket.IO setup skipped:",{hasSocket:!!q,useSocketioSupport:X,hasMethods:!!K.current,hasDataName:!!$?.name});return}let O=Object.keys(K.current??{}).map((Q)=>{let _=`pie${Q}_${$.name}`;if(z)console.log(`[PieCard] Socket.IO registering event: ${_}`);let V=(j)=>{K.current?.[Q]?.(j)};return q.on(_,V),[_,V]});return()=>{O.forEach(([Q,_])=>{if(z)console.log(`[PieCard] Socket.IO unregistering event: ${Q}`);q.off(Q,_)})}},[q,$.name,X]),ZU(()=>{if(!D||!Y||!G||!$.name){if(z&&Y)console.log("[PieCard] Centrifuge setup skipped:",{hasCentrifuge:!!D,useCentrifugeSupport:Y,hasCentrifugeChannel:!!G,hasMethods:!!K.current,hasDataName:!!$?.name});return}let O=Object.keys(K.current??{}).map((Q)=>{let _=`pie${Q}_${$.name}_${G}`;if(z)console.log(`[PieCard] Centrifuge subscribing to channel: ${_}`);let{subscription:V,createdHere:j}=kU(D,_,{recoverable:!0,positioned:!0}),XU=(C)=>{if(z)console.log(`[PieCard] Centrifuge received data on ${_}:`,C.data);K.current?.[Q]?.(C.data)},YU=(C)=>{if(CU(C))console.warn(`[PieCard] Centrifuge channel ${_} is not `+"recoverable — enable history on the server "+"namespace for exact replay; relying on resync fallback only.");if(bU(C)){if(z)console.log(`[PieCard] Centrifuge recovery gap on ${_}; requesting resync`);W.current?.({channel:_,reason:"gap"})}};return V.on("publication",XU),V.on("subscribed",YU),V.subscribe(),{subscription:V,createdHere:j,onPublication:XU,onSubscribed:YU}});return()=>{O.forEach(({subscription:Q,createdHere:_,onPublication:V,onSubscribed:j})=>{if(z)console.log("[PieCard] Centrifuge unsubscribing from channel");if(Q.off("publication",V),Q.off("subscribed",j),_)Q.unsubscribe(),D.removeSubscription(Q)})}},[D,G,$.name,Y]),ZU(()=>{if(!A||!Z||!$.name){if(z&&Z)console.log("[PieCard] Mitt setup skipped:",{hasMitt:!!A,useMittSupport:Z,hasMethods:!!K.current,hasDataName:!!$?.name});return}let I=Object.keys(K.current??{}),O={};return I.forEach((Q)=>{let _=`pie${Q}_${$.name}`,V=(j)=>{if(z)console.log(`[PieCard] Mitt registering event: ${_}`);K.current?.[Q]?.(j)};O[_]=V,A.on(_,V)}),()=>{Object.entries(O).forEach(([Q,_])=>{if(z)console.log(`[PieCard] Mitt unregistering event: ${Q}`);A.off(Q,_)})}},[A,$.name,Z]),z)console.log("[PieCard] Rendering complete, returning children");if(B!==void 0)return i$(o$,{children:[s$("input",{type:"hidden",name:$.name,value:JSON.stringify(B)}),J]});return J},i=c$;import{jsx as fU}from"react/jsx-runtime";var r$=({data:U})=>{let{name:$,key:J,value:X,useSocketioSupport:Y,useCentrifugeSupport:Z,useMittSupport:G,centrifugeChannel:H}=U,[B,T]=a$(X);return SU(()=>{T(X)},[X]),SU(()=>{if(typeof window>"u")return;let z=window.Telegram?.WebApp?.CloudStorage;if(!z)return;z.setItem(J,B)},[J,B]),fU(i,{card:"CloudStorageCard",data:U,useSocketioSupport:Y,useCentrifugeSupport:Z,useMittSupport:G,centrifugeChannel:H,methods:{update:({value:z})=>{T(z)},remove:()=>{let z=window.Telegram?.WebApp?.CloudStorage;if(z)z.removeItem(J);T("")}},children:fU("input",{type:"hidden",id:$,name:$,value:B})})},mU=r$;var n$=u({name:"CloudStorageCard",component:mU,metadata:{author:"PieData"}});import{useEffect as gU,useState as t$}from"react";import{jsx as hU}from"react/jsx-runtime";var e$=({data:U})=>{let{name:$,key:J,value:X,useSocketioSupport:Y,useCentrifugeSupport:Z,useMittSupport:G,centrifugeChannel:H}=U,[B,T]=t$(X);return gU(()=>{T(X)},[X]),gU(()=>{if(typeof window>"u")return;let z=window.Telegram?.WebApp?.SecureStorage;if(!z)return;z.setItem(J,B)},[J,B]),hU(i,{card:"SecureStorageCard",data:U,useSocketioSupport:Y,useCentrifugeSupport:Z,useMittSupport:G,centrifugeChannel:H,methods:{update:({value:z})=>{T(z)},remove:()=>{let z=window.Telegram?.WebApp?.SecureStorage;if(z)z.removeItem(J);T("")}},children:hU("input",{type:"hidden",id:$,name:$,value:B})})},pU=e$;var UJ=u({name:"SecureStorageCard",component:pU,metadata:{author:"PieData"}});export{o as useWebApp,y$ as useInitData,UJ as SecureStorageCard,u$ as PieTelegramRoot,n$ as CloudStorageCard};