@swarm.ing/pieui 2.1.6 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/dist/components/PieCard/index.d.ts.map +1 -1
  2. package/dist/components/index.esm.js +1 -1
  3. package/dist/components/index.js +1 -1
  4. package/dist/index.esm.js +2 -2
  5. package/dist/index.js +2 -2
  6. package/dist/native/index.esm.js +2 -2
  7. package/dist/native/index.js +2 -2
  8. package/dist/server/card.d.ts +28 -0
  9. package/dist/server/card.d.ts.map +1 -0
  10. package/dist/server/cards/AjaxGroupCard.d.ts +8 -0
  11. package/dist/server/cards/AjaxGroupCard.d.ts.map +1 -0
  12. package/dist/server/cards/HTMLEmbedCard.d.ts +6 -0
  13. package/dist/server/cards/HTMLEmbedCard.d.ts.map +1 -0
  14. package/dist/server/cards/HiddenCard.d.ts +6 -0
  15. package/dist/server/cards/HiddenCard.d.ts.map +1 -0
  16. package/dist/server/cards/OneOfCard.d.ts +8 -0
  17. package/dist/server/cards/OneOfCard.d.ts.map +1 -0
  18. package/dist/server/cards/UnionCard.d.ts +8 -0
  19. package/dist/server/cards/UnionCard.d.ts.map +1 -0
  20. package/dist/server/cards/index.d.ts +6 -0
  21. package/dist/server/cards/index.d.ts.map +1 -0
  22. package/dist/server/form.d.ts +5 -0
  23. package/dist/server/form.d.ts.map +1 -0
  24. package/dist/server/index.d.ts +9 -0
  25. package/dist/server/index.d.ts.map +1 -0
  26. package/dist/server/index.esm.js +382 -0
  27. package/dist/server/index.js +427 -0
  28. package/dist/server/page.d.ts +26 -0
  29. package/dist/server/page.d.ts.map +1 -0
  30. package/dist/server/realtime.d.ts +13 -0
  31. package/dist/server/realtime.d.ts.map +1 -0
  32. package/dist/server/types.d.ts +28 -0
  33. package/dist/server/types.d.ts.map +1 -0
  34. package/dist/server/web.d.ts +23 -0
  35. package/dist/server/web.d.ts.map +1 -0
  36. package/dist/telegram/index.esm.js +1 -1
  37. package/dist/telegram/index.js +1 -1
  38. package/dist/tests/centrifugeSubscription.test.d.ts +2 -0
  39. package/dist/tests/centrifugeSubscription.test.d.ts.map +1 -0
  40. package/dist/tests/server/card-fill.test.d.ts +2 -0
  41. package/dist/tests/server/card-fill.test.d.ts.map +1 -0
  42. package/dist/tests/server/card-generate.test.d.ts +2 -0
  43. package/dist/tests/server/card-generate.test.d.ts.map +1 -0
  44. package/dist/tests/server/cards.test.d.ts +2 -0
  45. package/dist/tests/server/cards.test.d.ts.map +1 -0
  46. package/dist/tests/server/e2e.test.d.ts +2 -0
  47. package/dist/tests/server/e2e.test.d.ts.map +1 -0
  48. package/dist/tests/server/entry.test.d.ts +2 -0
  49. package/dist/tests/server/entry.test.d.ts.map +1 -0
  50. package/dist/tests/server/form.test.d.ts +2 -0
  51. package/dist/tests/server/form.test.d.ts.map +1 -0
  52. package/dist/tests/server/page.test.d.ts +2 -0
  53. package/dist/tests/server/page.test.d.ts.map +1 -0
  54. package/dist/tests/server/realtime.test.d.ts +2 -0
  55. package/dist/tests/server/realtime.test.d.ts.map +1 -0
  56. package/dist/tests/server/web-ajax.test.d.ts +2 -0
  57. package/dist/tests/server/web-ajax.test.d.ts.map +1 -0
  58. package/dist/tests/server/web-content.test.d.ts +2 -0
  59. package/dist/tests/server/web-content.test.d.ts.map +1 -0
  60. package/dist/tests/server/web-process.test.d.ts +2 -0
  61. package/dist/tests/server/web-process.test.d.ts.map +1 -0
  62. package/dist/tests/server/web-token.test.d.ts +2 -0
  63. package/dist/tests/server/web-token.test.d.ts.map +1 -0
  64. package/dist/util/centrifugeSubscription.d.ts +18 -0
  65. package/dist/util/centrifugeSubscription.d.ts.map +1 -0
  66. 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 k}from"react";import{QueryClient as N$,QueryClientProvider as w$,useQuery as x$}from"@tanstack/react-query";import fU from"mitt";import{createContext as yU,useCallback as r$,useContext as a$}from"react";var u=globalThis,Q=(U,$)=>{let H=Symbol.for(U);if(!(H in u))u[H]=$();return u[H]};function t(){return Q("@swarm.ing/pieui:mitt-emitter",()=>fU())}var CU=Q("@swarm.ing/pieui:context:mitt",()=>yU(null));var f=CU;import{io as vU}from"socket.io-client";import{createContext as SU}from"react";var e=Q("@swarm.ing/pieui:socket-cache",()=>new Map),UU=(U)=>{let $=e.get(U);if($)return $;let H=vU(U,{autoConnect:!1,transports:["websocket"]});return e.set(U,H),H},mU=Q("@swarm.ing/pieui:context:socket",()=>SU(null)),R=mU;import{createContext as gU}from"react";import{Centrifuge as $U}from"centrifuge";var HU=Q("@swarm.ing/pieui:centrifuge-cache",()=>new Map),IU=(U,$)=>{if(!$)return null;let H=`${U}::${$}`,J=HU.get(H);if(J)return J;async function Z(){let X=await fetch(U+"api/centrifuge/gen_token",{credentials:"include"});if(!X.ok){if(X.status===401||X.status===403)throw new $U.UnauthorizedError("Backend is not answering");throw Error(`Unexpected status code ${X.status}`)}return(await X.json()).token}let I=new $U($,{getToken:Z});return HU.set(H,I),I},hU=Q("@swarm.ing/pieui:context:centrifuge",()=>gU(null)),P=hU;import{useContext as tU,useEffect as eU}from"react";import{useEffect as pU,useState as dU}from"react";var y=new Map,C=new Map;function v(U,$){let H=`${U}::${$}`,J=U?y.get(H):void 0,[Z,I]=dU(J??null);return pU(()=>{if(!U)return;if(y.has(H)){I(y.get(H));return}let X=C.get(H);if(!X)X=fetch(U+`api/support/${$}`,{method:"GET"}).then((z)=>z.json()).then((z)=>{return y.set(H,z),C.delete(H),z}).catch((z)=>{throw C.delete(H),z}),C.set(H,X);let G=!1;return X.then((z)=>{if(!G)I(z)}).catch(()=>{}),()=>{G=!0}},[U,$,H]),Z}import{createContext as cU,useContext as lU}from"react";var o=Q("@swarm.ing/pieui:context:pieConfig",()=>cU(null)),S=()=>{let U=lU(o);if(!U)throw Error("usePieConfig must be used within PieConfigProvider");return U},s=()=>{let{apiServer:U}=S();return U},m=s,JU=()=>{let{centrifugeServer:U}=S();return U};var A=()=>{let{enableRenderingLog:U}=S();return U},ZU=A,XU=()=>{let{pageProcessor:U}=S();return U};var uU=(U)=>{let $=document.cookie?document.cookie.split(";"):[];for(let H of $){let J=H.indexOf("=");if((J===-1?H:H.slice(0,J)).trim()===U){let I=J===-1?"":H.slice(J+1).trim();try{return decodeURIComponent(I)}catch{return I}}}return null},oU={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:uU,readUrlParams(U){return new URLSearchParams(window.location.search).getAll(U)},readDomInput(U){let $=document.getElementsByName(U);if(!$.length)return null;let H=$[0];if(H instanceof HTMLInputElement){if(H.type==="file"&&H.files)return Array.from(H.files);return[H.value]}if(H instanceof HTMLTextAreaElement)return[H.value];return[]},submitGlobalForm(){if(typeof document>"u")return;let U=document.getElementById("piedata_global_form");U&&U.submit()}},YU=oU;var sU={};function E(){return sU}var zU=new Map;var GU=(U)=>{return zU.has(U)?zU.get(U):null};var BU,nU={isClient(){return!0},readSid(){return BU},setSid(U){BU=U},readWebStorage(U,$){let H=E(),J=U==="local"?H.storage:H.sessionStorage;return J?J.getItem($):null},async readWebStorageAsync(U,$){let H=E(),J=U==="local"?H.asyncStorage:H.asyncSessionStorage;if(J)return J.getItem($);let Z=U==="local"?H.storage:H.sessionStorage;return Z?Z.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):GU(U)},submitGlobalForm(){E().submitForm?.()}},QU=nU;var iU=typeof navigator<"u"&&navigator.product==="ReactNative",rU=iU?QU:YU,g=rU;var aU=Q("@swarm.ing/pieui:sid-state",()=>({promise:null,resolve:null}));function _U(){aU.resolve?.()}var U$=({children:U})=>{let $=tU(R),H=m(),J=v(H,"socketIO"),Z=(I)=>{if(g.isClient())g.setSid(I.sid),_U(),console.log(`SocketIO initialized: ${g.readSid()}`)};return eU(()=>{if(!$)return;let I=()=>{console.log("SocketIO connected")},X=(G)=>{console.log(`SocketIO disconnected: ${G}`),$.connect()};if(J)$.on("pieinit",Z),$.on("connect",I),$.on("disconnect",X),$.connect();return()=>{if(J)$.off("pieinit",Z),$.off("connect",I),$.off("disconnect",X),$.disconnect()}},[$,J]),U},DU=U$;import{useContext as $$,useEffect as H$}from"react";var I$=({children:U})=>{let $=$$(P),H=m(),J=v(H,"centrifuge");return H$(()=>{if(!$)return;let Z=()=>{console.log("Centrifuge connected")},I=(X)=>{console.log("Centrifuge disconnected:",X)};if(J)$.on("connected",Z),$.on("disconnected",I),$.connect();return()=>{if(J)$.disconnect()}},[$,J]),U},FU=I$;import{createContext as J$}from"react";import{jsx as Y$,Fragment as X$}from"react/jsx-runtime";var Z$=Q("@swarm.ing/pieui:context:fallback",()=>J$(Y$(X$,{}))),j=Z$;import{createContext as z$}from"react";var G$=Q("@swarm.ing/pieui:context:lazyError",()=>z$(void 0)),N=G$;import{lazy as B$}from"react";var x=new Map;function Q$(U,$){return $.catch(()=>{if(x.get(U)===$)x.delete(U)}),x.set(U,$),$}function TU(U,$){return B$(()=>{if(x.has($))return x.get($);return Q$($,U().then((H)=>H))})}var KU=Q("@swarm.ing/pieui:component-registry",()=>new Map),_$=(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=TU($.loader,U.name),$.isLazy=!0;return $};function h(U){let $=_$(U);return KU.set($.name,$),$.component}var p=(U)=>{return KU.get(U)};import{useContext as LU,memo as q$}from"react";import{Component as D$,Suspense as F$}from"react";import{jsx as L$}from"react/jsx-runtime";var T$=2,K$=400;class w extends D${state={failed:!1,attempt:0};timer;static getDerivedStateFromError(){return{failed:!0}}componentDidCatch(U){if(this.props.onError?.(U),this.state.attempt<T$){let $=K$*(this.state.attempt+1);this.timer=setTimeout(()=>{this.setState((H)=>({failed:!1,attempt:H.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 L$(F$,{fallback:this.props.fallback,children:this.props.children},`${this.props.name}:${this.state.attempt}`)}}import{jsx as n}from"react/jsx-runtime";function O$({uiConfig:U,setUiAjaxConfiguration:$}){let H=LU(j),J=LU(N),Z=A();if(Z)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 I=p(U.card);if(!I?.component){if(Z)console.warn(`[UI] Component not found in registry: ${U.card}`),console.log("[UI] Returning fallback component");return H}if(Z)console.log("[UI] Found component in registry:",{name:I.name,isLazy:I.isLazy,hasMetadata:!!I.metadata});let X=I.component,G=n(X,{data:U.data,content:U.content,setUiAjaxConfiguration:$});if(I.isLazy){if(Z)console.log("[UI] Rendering lazy component with Suspense:",I.name);return n(w,{name:I.name,fallback:I.fallback?n(I.fallback,{}):H,onError:J,children:G})}if(Z)console.log("[UI] Rendering component directly:",I.name);return G}var i=q$(O$);import{createAxiosDateTransformer as k$}from"axios-date-transformer";import{useEffect as W$,useState as V$}from"react";var d=({onError:U}={})=>{let[$,H]=V$(null),J=XU();return W$(()=>{if(typeof window>"u")return;let Z=window.Telegram?.WebApp;if(!Z)return;try{Z.ready?.()}catch(I){U?.()}if(J==="telegram_expanded"&&(Z.platform==="ios"||Z.platform==="android"))Z.expand();H(Z)},[]),$},M$=()=>{let U=d();return[U?.initDataUnsafe,U?.initData]};import{createContext as A$}from"react";var E$=Q("@swarm.ing/pieui:context:navigate",()=>A$(void 0)),qU=E$;import{useContext as WU}from"react";import{createContext as R$}from"react";var P$=Q("@swarm.ing/pieui:context:uiRenderer",()=>R$(null)),OU=P$;import{jsx as c}from"react/jsx-runtime";function VU({uiConfig:U,setUiAjaxConfiguration:$}){let H=WU(j),J=WU(N),Z=A();if(Z)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 I=p(U.card);if(!I?.component){if(Z)console.warn(`[UILoading] Component not found in registry: ${U.card}`),console.log("[UILoading] Returning fallback component");return H}if(Z)console.log("[UILoading] Found component in registry:",{name:I.name,isLazy:I.isLazy,hasMetadata:!!I.metadata,hasFallback:!!I.fallback});if(I.fallback){if(Z)console.log("[UILoading] Rendering fallback for:",I.name);let z=I.fallback;return c(z,{})}if(Z)console.log("[UILoading] No fallback, rendering full component:",I.name);let X=I.component,G=c(OU.Provider,{value:VU,children:c(X,{data:U.data,content:U.content,setUiAjaxConfiguration:$})});if(I.isLazy)return c(w,{name:I.name,fallback:H,onError:J,children:G});return G}var MU=VU;import{jsx as j$}from"react/jsx-runtime";function AU(U,$,H){if(!$)return H;let J=U.replace(/^\//,""),Z=$[J];if(!Z)return H;return j$(MU,{uiConfig:Z})}import{jsx as D,Fragment as y$}from"react/jsx-runtime";var b$=({location:U,fallback:$,piecache:H,onError:J,queryOptions:Z,disableGlobalForm:I})=>{let X=s(),G=JU(),z=A(),K=k(()=>k$({baseURL:X}),[X]),Y=k(()=>t(),[]),F=k(()=>X?UU(X):null,[X]),b=k(()=>X?IU(X,G):null,[X,G]),q=d({onError:J}),{data:L,isLoading:M,error:O}=x$({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 _="/api/content"+U.pathname+"?"+B.toString();if(z)console.log("[PieRoot] Fetching UI configuration from:",_);let T=await K.get(_,{headers:{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET,PUT,POST,DELETE,PATCH,OPTIONS","Content-type":"application/json"},withCredentials:!0});if(z)console.log("[PieRoot] Received UI configuration:",T.data);return T.data},staleTime:1/0,gcTime:1/0,refetchOnWindowFocus:!1,refetchOnMount:!1,refetchOnReconnect:!1,retry:!0,retryDelay:(B)=>Math.min(1000*2**B,30000),...Z}),W=AU(U.pathname,H,$);if(!X)throw Error("Set PIE_API_SERVER and PIE_CENTRIFUGE_SERVER");if(O&&z)return console.error("[PieRoot] Error fetching UI configuration:",O),console.error("[PieRoot] Error details:",{message:O.message,status:O.response?.status,data:O.response?.data}),J?.(O),W;if(M||!L){if(z)console.log("[PieRoot] Loading state:",{isLoading:M,hasUiConfiguration:!!L});return W}if(z)console.log("[PieRoot] UI configuration loaded successfully:",L),console.log("[PieRoot] Rendering UI with configuration");return D(f.Provider,{value:Y,children:D(R.Provider,{value:F,children:D(P.Provider,{value:b,children:D(j.Provider,{value:$??D(y$,{}),children:D(DU,{children:D(FU,{children:I?D(i,{uiConfig:L}):D("form",{id:"piedata_global_form",action:X+"api/process"+U.pathname,method:"post",encType:"multipart/form-data",children:D(i,{uiConfig:L})})})})})})})})},f$=(U)=>{let $=k(()=>new N$,[]),H=U.queryClient??$;return D(qU.Provider,{value:U.onNavigate,children:D(o.Provider,{value:U.config,children:D(N.Provider,{value:U.onError,children:D(w$,{client:H,children:D(b$,{...U})})})})})},C$=f$;import{useEffect as jU,useState as h$}from"react";import{useContext as r,useEffect as a,useRef as PU}from"react";function EU(U){return U.wasRecovering===!0&&U.recovered===!1}function RU(U){return U.recoverable===!1}import{jsx as m$,jsxs as g$,Fragment as S$}from"react/jsx-runtime";var v$=({card:U,data:$,children:H,useSocketioSupport:J=!1,useCentrifugeSupport:Z=!1,useMittSupport:I=!1,centrifugeChannel:X=void 0,methods:G=void 0,stored:z=void 0,onResync:K=void 0})=>{let Y=ZU(),F=PU(G);F.current=G;let b=PU(K);if(b.current=K,Y)console.log("[PieCard] Rendering card:",U),console.log("[PieCard] Card data:",$),console.log("[PieCard] Component name:",$?.name),console.log("[PieCard] Real-time support:",{socketio:J,centrifuge:Z,mitt:I,centrifugeChannel:X}),console.log("[PieCard] Methods:",G?Object.keys(G):"none"),console.log("[PieCard] Has children:",!!H);let q=r(R),L=r(P),M=r(f);if(a(()=>{if(!q||!J||!F.current||!$.name){if(Y&&J)console.log("[PieCard] Socket.IO setup skipped:",{hasSocket:!!q,useSocketioSupport:J,hasMethods:!!F.current,hasDataName:!!$?.name});return}let W=Object.keys(F.current??{}).map((B)=>{let _=`pie${B}_${$.name}`;if(Y)console.log(`[PieCard] Socket.IO registering event: ${_}`);let T=(V)=>{F.current?.[B]?.(V)};return q.on(_,T),[_,T]});return()=>{W.forEach(([B,_])=>{if(Y)console.log(`[PieCard] Socket.IO unregistering event: ${B}`);q.off(B,_)})}},[q,$.name,J]),a(()=>{if(!L||!Z||!X||!$.name){if(Y&&Z)console.log("[PieCard] Centrifuge setup skipped:",{hasCentrifuge:!!L,useCentrifugeSupport:Z,hasCentrifugeChannel:!!X,hasMethods:!!F.current,hasDataName:!!$?.name});return}let W=Object.keys(F.current??{}).map((B)=>{let _=`pie${B}_${$.name}_${X}`;if(Y)console.log(`[PieCard] Centrifuge subscribing to channel: ${_}`);let T=L.newSubscription(_,{recoverable:!0,positioned:!0});return T.on("publication",(V)=>{if(Y)console.log(`[PieCard] Centrifuge received data on ${_}:`,V.data);F.current?.[B]?.(V.data)}),T.on("subscribed",(V)=>{if(RU(V))console.warn(`[PieCard] Centrifuge channel ${_} is not `+"recoverable — enable history on the server "+"namespace for exact replay; relying on resync fallback only.");if(EU(V)){if(Y)console.log(`[PieCard] Centrifuge recovery gap on ${_}; requesting resync`);b.current?.({channel:_,reason:"gap"})}}),T.subscribe(),T});return()=>{W.forEach((B)=>{if(Y)console.log("[PieCard] Centrifuge unsubscribing from channel");B.unsubscribe(),L.removeSubscription(B)})}},[L,X,$.name,Z]),a(()=>{if(!M||!I||!$.name){if(Y&&I)console.log("[PieCard] Mitt setup skipped:",{hasMitt:!!M,useMittSupport:I,hasMethods:!!F.current,hasDataName:!!$?.name});return}let O=Object.keys(F.current??{}),W={};return O.forEach((B)=>{let _=`pie${B}_${$.name}`,T=(V)=>{if(Y)console.log(`[PieCard] Mitt registering event: ${_}`);F.current?.[B]?.(V)};W[_]=T,M.on(_,T)}),()=>{Object.entries(W).forEach(([B,_])=>{if(Y)console.log(`[PieCard] Mitt unregistering event: ${B}`);M.off(B,_)})}},[M,$.name,I]),Y)console.log("[PieCard] Rendering complete, returning children");if(z!==void 0)return g$(S$,{children:[m$("input",{type:"hidden",name:$.name,value:JSON.stringify(z)}),H]});return H},l=v$;import{jsx as NU}from"react/jsx-runtime";var p$=({data:U})=>{let{name:$,key:H,value:J,useSocketioSupport:Z,useCentrifugeSupport:I,useMittSupport:X,centrifugeChannel:G}=U,[z,K]=h$(J);return jU(()=>{K(J)},[J]),jU(()=>{if(typeof window>"u")return;let Y=window.Telegram?.WebApp?.CloudStorage;if(!Y)return;Y.setItem(H,z)},[H,z]),NU(l,{card:"CloudStorageCard",data:U,useSocketioSupport:Z,useCentrifugeSupport:I,useMittSupport:X,centrifugeChannel:G,methods:{update:({value:Y})=>{K(Y)},remove:()=>{let Y=window.Telegram?.WebApp?.CloudStorage;if(Y)Y.removeItem(H);K("")}},children:NU("input",{type:"hidden",id:$,name:$,value:z})})},wU=p$;var d$=h({name:"CloudStorageCard",component:wU,metadata:{author:"PieData"}});import{useEffect as xU,useState as c$}from"react";import{jsx as kU}from"react/jsx-runtime";var l$=({data:U})=>{let{name:$,key:H,value:J,useSocketioSupport:Z,useCentrifugeSupport:I,useMittSupport:X,centrifugeChannel:G}=U,[z,K]=c$(J);return xU(()=>{K(J)},[J]),xU(()=>{if(typeof window>"u")return;let Y=window.Telegram?.WebApp?.SecureStorage;if(!Y)return;Y.setItem(H,z)},[H,z]),kU(l,{card:"SecureStorageCard",data:U,useSocketioSupport:Z,useCentrifugeSupport:I,useMittSupport:X,centrifugeChannel:G,methods:{update:({value:Y})=>{K(Y)},remove:()=>{let Y=window.Telegram?.WebApp?.SecureStorage;if(Y)Y.removeItem(H);K("")}},children:kU("input",{type:"hidden",id:$,name:$,value:z})})},bU=l$;var u$=h({name:"SecureStorageCard",component:bU,metadata:{author:"PieData"}});export{d as useWebApp,M$ as useInitData,u$ as SecureStorageCard,C$ as PieTelegramRoot,d$ as CloudStorageCard};
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};