founder-schema 0.17.0 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +125 -17
- package/dist/access/access.d.ts +1 -1
- package/dist/access/access.d.ts.map +1 -1
- package/dist/access/access.js +4 -1
- package/dist/access/access.js.map +1 -1
- package/dist/access/permissions.d.ts +27 -29
- package/dist/access/permissions.d.ts.map +1 -1
- package/dist/access/permissions.js +39 -3
- package/dist/access/permissions.js.map +1 -1
- package/dist/core/common.d.ts +47 -10
- package/dist/core/common.d.ts.map +1 -1
- package/dist/core/common.js +42 -13
- package/dist/core/common.js.map +1 -1
- package/dist/core/errors.d.ts +7 -5
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +17 -11
- package/dist/core/errors.js.map +1 -1
- package/dist/core/limits.d.ts +48 -17
- package/dist/core/limits.d.ts.map +1 -1
- package/dist/core/limits.js +52 -22
- package/dist/core/limits.js.map +1 -1
- package/dist/core/money.d.ts +33 -0
- package/dist/core/money.d.ts.map +1 -0
- package/dist/core/money.js +36 -0
- package/dist/core/money.js.map +1 -0
- package/dist/core/responses.d.ts +14 -4
- package/dist/core/responses.d.ts.map +1 -1
- package/dist/core/responses.js.map +1 -1
- package/dist/core/validation.d.ts +6 -2
- package/dist/core/validation.d.ts.map +1 -1
- package/dist/core/validation.js +6 -2
- package/dist/core/validation.js.map +1 -1
- package/dist/domains/billing/billing.d.ts +61 -8
- package/dist/domains/billing/billing.d.ts.map +1 -1
- package/dist/domains/billing/billing.js +58 -22
- package/dist/domains/billing/billing.js.map +1 -1
- package/dist/domains/billing/gst.d.ts.map +1 -1
- package/dist/domains/billing/gst.js +4 -3
- package/dist/domains/billing/gst.js.map +1 -1
- package/dist/domains/chat/chat.d.ts +0 -21
- package/dist/domains/chat/chat.d.ts.map +1 -1
- package/dist/domains/chat/chat.js +0 -20
- package/dist/domains/chat/chat.js.map +1 -1
- package/dist/domains/communities/communities.d.ts +30 -12
- package/dist/domains/communities/communities.d.ts.map +1 -1
- package/dist/domains/communities/communities.js +43 -15
- package/dist/domains/communities/communities.js.map +1 -1
- package/dist/domains/contributions/contributions.d.ts +1 -1
- package/dist/domains/contributions/contributions.js +1 -1
- package/dist/domains/contributions/contributions.js.map +1 -1
- package/dist/domains/dashboard/dashboard.d.ts +3 -1
- package/dist/domains/dashboard/dashboard.d.ts.map +1 -1
- package/dist/domains/dashboard/dashboard.js +23 -7
- package/dist/domains/dashboard/dashboard.js.map +1 -1
- package/dist/domains/discover/discover.d.ts +8 -8
- package/dist/domains/feed/feed.d.ts +55 -153
- package/dist/domains/feed/feed.d.ts.map +1 -1
- package/dist/domains/feed/feed.js +53 -58
- package/dist/domains/feed/feed.js.map +1 -1
- package/dist/domains/location/india.d.ts +14 -4
- package/dist/domains/location/india.d.ts.map +1 -1
- package/dist/domains/location/india.js +36 -8
- package/dist/domains/location/india.js.map +1 -1
- package/dist/domains/members/members.d.ts +2 -2
- package/dist/domains/membership/membership.d.ts +26 -0
- package/dist/domains/membership/membership.d.ts.map +1 -1
- package/dist/domains/membership/membership.js +55 -1
- package/dist/domains/membership/membership.js.map +1 -1
- package/dist/domains/moderation/moderation.d.ts +2 -2
- package/dist/domains/moderation/moderation.js +3 -3
- package/dist/domains/moderation/moderation.js.map +1 -1
- package/dist/domains/notifications/notifications.d.ts +1 -10
- package/dist/domains/notifications/notifications.d.ts.map +1 -1
- package/dist/domains/notifications/notifications.js +2 -3
- package/dist/domains/notifications/notifications.js.map +1 -1
- package/dist/domains/onboarding/onboarding-answers.d.ts +33 -2
- package/dist/domains/onboarding/onboarding-answers.d.ts.map +1 -1
- package/dist/domains/onboarding/onboarding-answers.js +38 -15
- package/dist/domains/onboarding/onboarding-answers.js.map +1 -1
- package/dist/domains/onboarding/onboarding.d.ts +229 -57
- package/dist/domains/onboarding/onboarding.d.ts.map +1 -1
- package/dist/domains/onboarding/onboarding.js +34 -41
- package/dist/domains/onboarding/onboarding.js.map +1 -1
- package/dist/domains/products/products.d.ts +43 -8
- package/dist/domains/products/products.d.ts.map +1 -1
- package/dist/domains/products/products.js +57 -11
- package/dist/domains/products/products.js.map +1 -1
- package/dist/domains/profile/founder-profile.d.ts +68 -104
- package/dist/domains/profile/founder-profile.d.ts.map +1 -1
- package/dist/domains/profile/founder-profile.js +66 -32
- package/dist/domains/profile/founder-profile.js.map +1 -1
- package/dist/domains/profile/my-profile.d.ts +3 -3
- package/dist/domains/reviews/reviews.d.ts +1 -1
- package/dist/domains/reviews/reviews.d.ts.map +1 -1
- package/dist/domains/reviews/reviews.js +2 -2
- package/dist/domains/reviews/reviews.js.map +1 -1
- package/dist/domains/support/support.d.ts +22 -3
- package/dist/domains/support/support.d.ts.map +1 -1
- package/dist/domains/support/support.js +19 -5
- package/dist/domains/support/support.js.map +1 -1
- package/dist/domains/team/team.d.ts.map +1 -1
- package/dist/domains/team/team.js +3 -6
- package/dist/domains/team/team.js.map +1 -1
- package/dist/domains/uploads/uploads.d.ts +7 -22
- package/dist/domains/uploads/uploads.d.ts.map +1 -1
- package/dist/domains/uploads/uploads.js +7 -21
- package/dist/domains/uploads/uploads.js.map +1 -1
- package/dist/env.d.ts +26 -13
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +58 -23
- package/dist/env.js.map +1 -1
- package/dist/index.d.ts +18 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -16
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -243,21 +243,14 @@ export declare const feedImageSchema: z.ZodObject<{
|
|
|
243
243
|
alt: z.ZodOptional<z.ZodString>;
|
|
244
244
|
}, z.core.$strip>;
|
|
245
245
|
export type FeedImage = z.infer<typeof feedImageSchema>;
|
|
246
|
-
export declare const feedVideoSchema: z.ZodObject<{
|
|
247
|
-
kind: z.ZodLiteral<"video">;
|
|
248
|
-
url: z.ZodURL;
|
|
249
|
-
thumbnailUrl: z.ZodURL;
|
|
250
|
-
width: z.ZodNumber;
|
|
251
|
-
height: z.ZodNumber;
|
|
252
|
-
duration: z.ZodNumber;
|
|
253
|
-
}, z.core.$strip>;
|
|
254
|
-
export type FeedVideo = z.infer<typeof feedVideoSchema>;
|
|
255
246
|
/**
|
|
256
|
-
*
|
|
257
|
-
*
|
|
258
|
-
*
|
|
247
|
+
* What a post carries, in the order it was attached. IMAGES ONLY (0.18.0):
|
|
248
|
+
* video is shared as a link in the post text (the user's decision,
|
|
249
|
+
* 2026-09-21), and the uploaded-video shape this used to admit described a
|
|
250
|
+
* server-made poster frame no server makes. `kind` stays, so a stored item
|
|
251
|
+
* says what it is.
|
|
259
252
|
*/
|
|
260
|
-
export declare const feedMediaSchema: z.
|
|
253
|
+
export declare const feedMediaSchema: z.ZodObject<{
|
|
261
254
|
id: z.ZodString;
|
|
262
255
|
url: z.ZodURL;
|
|
263
256
|
width: z.ZodNumber;
|
|
@@ -271,35 +264,8 @@ export declare const feedMediaSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
271
264
|
kind: z.ZodLiteral<"image">;
|
|
272
265
|
thumbnailUrl: z.ZodOptional<z.ZodURL>;
|
|
273
266
|
alt: z.ZodOptional<z.ZodString>;
|
|
274
|
-
}, z.core.$strip>, z.ZodObject<{
|
|
275
|
-
kind: z.ZodLiteral<"video">;
|
|
276
|
-
url: z.ZodURL;
|
|
277
|
-
thumbnailUrl: z.ZodURL;
|
|
278
|
-
width: z.ZodNumber;
|
|
279
|
-
height: z.ZodNumber;
|
|
280
|
-
duration: z.ZodNumber;
|
|
281
|
-
}, z.core.$strip>], "kind">;
|
|
282
|
-
export type FeedMedia = z.infer<typeof feedMediaSchema>;
|
|
283
|
-
/**
|
|
284
|
-
* Preview for the first link in a post body. Server-derived at write time and
|
|
285
|
-
* stored, never re-fetched at render: a card that fetches a third-party page
|
|
286
|
-
* per scroll leaks every reader's address to that site and blocks the feed on
|
|
287
|
-
* somebody else's latency.
|
|
288
|
-
*
|
|
289
|
-
* Both URLs take `safeUrlSchema`: the scheme and host rules, WITHOUT the
|
|
290
|
-
* typed-URL cap. `url` came out of a post body, which is already capped as a
|
|
291
|
-
* whole, and `imageUrl` is whatever the remote page advertised; a long CDN URL
|
|
292
|
-
* is ordinary, and one over `LINK_URL_MAX` would otherwise fail the whole feed
|
|
293
|
-
* page it sits on. Neither is ours, so a consumer still treats both as
|
|
294
|
-
* untrusted at render.
|
|
295
|
-
*/
|
|
296
|
-
export declare const linkPreviewSchema: z.ZodObject<{
|
|
297
|
-
url: z.ZodURL;
|
|
298
|
-
title: z.ZodOptional<z.ZodString>;
|
|
299
|
-
description: z.ZodOptional<z.ZodString>;
|
|
300
|
-
imageUrl: z.ZodOptional<z.ZodURL>;
|
|
301
267
|
}, z.core.$strip>;
|
|
302
|
-
export type
|
|
268
|
+
export type FeedMedia = z.infer<typeof feedMediaSchema>;
|
|
303
269
|
/**
|
|
304
270
|
* What THIS viewer has done to this item, computed per request.
|
|
305
271
|
*
|
|
@@ -373,7 +339,7 @@ export declare const repostedSourceSchema: z.ZodDiscriminatedUnion<[z.ZodObject<
|
|
|
373
339
|
headline: z.ZodOptional<z.ZodString>;
|
|
374
340
|
}, z.core.$strip>;
|
|
375
341
|
text: z.ZodString;
|
|
376
|
-
media: z.ZodOptional<z.
|
|
342
|
+
media: z.ZodOptional<z.ZodObject<{
|
|
377
343
|
id: z.ZodString;
|
|
378
344
|
url: z.ZodURL;
|
|
379
345
|
width: z.ZodNumber;
|
|
@@ -387,14 +353,7 @@ export declare const repostedSourceSchema: z.ZodDiscriminatedUnion<[z.ZodObject<
|
|
|
387
353
|
kind: z.ZodLiteral<"image">;
|
|
388
354
|
thumbnailUrl: z.ZodOptional<z.ZodURL>;
|
|
389
355
|
alt: z.ZodOptional<z.ZodString>;
|
|
390
|
-
}, z.core.$strip
|
|
391
|
-
kind: z.ZodLiteral<"video">;
|
|
392
|
-
url: z.ZodURL;
|
|
393
|
-
thumbnailUrl: z.ZodURL;
|
|
394
|
-
width: z.ZodNumber;
|
|
395
|
-
height: z.ZodNumber;
|
|
396
|
-
duration: z.ZodNumber;
|
|
397
|
-
}, z.core.$strip>], "kind">>;
|
|
356
|
+
}, z.core.$strip>>;
|
|
398
357
|
product: z.ZodOptional<z.ZodObject<{
|
|
399
358
|
id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
|
|
400
359
|
slug: z.ZodString;
|
|
@@ -433,7 +392,7 @@ export declare const feedPostSchema: z.ZodObject<{
|
|
|
433
392
|
headline: z.ZodOptional<z.ZodString>;
|
|
434
393
|
}, z.core.$strip>;
|
|
435
394
|
text: z.ZodString;
|
|
436
|
-
media: z.ZodArray<z.
|
|
395
|
+
media: z.ZodArray<z.ZodObject<{
|
|
437
396
|
id: z.ZodString;
|
|
438
397
|
url: z.ZodURL;
|
|
439
398
|
width: z.ZodNumber;
|
|
@@ -447,19 +406,6 @@ export declare const feedPostSchema: z.ZodObject<{
|
|
|
447
406
|
kind: z.ZodLiteral<"image">;
|
|
448
407
|
thumbnailUrl: z.ZodOptional<z.ZodURL>;
|
|
449
408
|
alt: z.ZodOptional<z.ZodString>;
|
|
450
|
-
}, z.core.$strip>, z.ZodObject<{
|
|
451
|
-
kind: z.ZodLiteral<"video">;
|
|
452
|
-
url: z.ZodURL;
|
|
453
|
-
thumbnailUrl: z.ZodURL;
|
|
454
|
-
width: z.ZodNumber;
|
|
455
|
-
height: z.ZodNumber;
|
|
456
|
-
duration: z.ZodNumber;
|
|
457
|
-
}, z.core.$strip>], "kind">>;
|
|
458
|
-
linkPreview: z.ZodOptional<z.ZodObject<{
|
|
459
|
-
url: z.ZodURL;
|
|
460
|
-
title: z.ZodOptional<z.ZodString>;
|
|
461
|
-
description: z.ZodOptional<z.ZodString>;
|
|
462
|
-
imageUrl: z.ZodOptional<z.ZodURL>;
|
|
463
409
|
}, z.core.$strip>>;
|
|
464
410
|
topics: z.ZodArray<z.ZodEnum<{
|
|
465
411
|
ai_ml: "ai_ml";
|
|
@@ -573,7 +519,7 @@ export declare const feedPostSchema: z.ZodObject<{
|
|
|
573
519
|
headline: z.ZodOptional<z.ZodString>;
|
|
574
520
|
}, z.core.$strip>;
|
|
575
521
|
text: z.ZodString;
|
|
576
|
-
media: z.ZodOptional<z.
|
|
522
|
+
media: z.ZodOptional<z.ZodObject<{
|
|
577
523
|
id: z.ZodString;
|
|
578
524
|
url: z.ZodURL;
|
|
579
525
|
width: z.ZodNumber;
|
|
@@ -587,14 +533,7 @@ export declare const feedPostSchema: z.ZodObject<{
|
|
|
587
533
|
kind: z.ZodLiteral<"image">;
|
|
588
534
|
thumbnailUrl: z.ZodOptional<z.ZodURL>;
|
|
589
535
|
alt: z.ZodOptional<z.ZodString>;
|
|
590
|
-
}, z.core.$strip
|
|
591
|
-
kind: z.ZodLiteral<"video">;
|
|
592
|
-
url: z.ZodURL;
|
|
593
|
-
thumbnailUrl: z.ZodURL;
|
|
594
|
-
width: z.ZodNumber;
|
|
595
|
-
height: z.ZodNumber;
|
|
596
|
-
duration: z.ZodNumber;
|
|
597
|
-
}, z.core.$strip>], "kind">>;
|
|
536
|
+
}, z.core.$strip>>;
|
|
598
537
|
product: z.ZodOptional<z.ZodObject<{
|
|
599
538
|
id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
|
|
600
539
|
slug: z.ZodString;
|
|
@@ -660,8 +599,8 @@ export type PollOption = z.infer<typeof pollOptionSchema>;
|
|
|
660
599
|
* own records keyed by (poll, voter) and a post has nothing equivalent.
|
|
661
600
|
*
|
|
662
601
|
* Polls are not editable. Changing a question or an option after a vote has
|
|
663
|
-
* been cast silently re-purposes that vote.
|
|
664
|
-
* is
|
|
602
|
+
* been cast silently re-purposes that vote. A poll closes at its `closesAt`;
|
|
603
|
+
* there is no closing it early.
|
|
665
604
|
*/
|
|
666
605
|
export declare const feedPollSchema: z.ZodObject<{
|
|
667
606
|
id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
|
|
@@ -831,7 +770,7 @@ export declare const feedItemSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
831
770
|
headline: z.ZodOptional<z.ZodString>;
|
|
832
771
|
}, z.core.$strip>;
|
|
833
772
|
text: z.ZodString;
|
|
834
|
-
media: z.ZodArray<z.
|
|
773
|
+
media: z.ZodArray<z.ZodObject<{
|
|
835
774
|
id: z.ZodString;
|
|
836
775
|
url: z.ZodURL;
|
|
837
776
|
width: z.ZodNumber;
|
|
@@ -845,19 +784,6 @@ export declare const feedItemSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
845
784
|
kind: z.ZodLiteral<"image">;
|
|
846
785
|
thumbnailUrl: z.ZodOptional<z.ZodURL>;
|
|
847
786
|
alt: z.ZodOptional<z.ZodString>;
|
|
848
|
-
}, z.core.$strip>, z.ZodObject<{
|
|
849
|
-
kind: z.ZodLiteral<"video">;
|
|
850
|
-
url: z.ZodURL;
|
|
851
|
-
thumbnailUrl: z.ZodURL;
|
|
852
|
-
width: z.ZodNumber;
|
|
853
|
-
height: z.ZodNumber;
|
|
854
|
-
duration: z.ZodNumber;
|
|
855
|
-
}, z.core.$strip>], "kind">>;
|
|
856
|
-
linkPreview: z.ZodOptional<z.ZodObject<{
|
|
857
|
-
url: z.ZodURL;
|
|
858
|
-
title: z.ZodOptional<z.ZodString>;
|
|
859
|
-
description: z.ZodOptional<z.ZodString>;
|
|
860
|
-
imageUrl: z.ZodOptional<z.ZodURL>;
|
|
861
787
|
}, z.core.$strip>>;
|
|
862
788
|
topics: z.ZodArray<z.ZodEnum<{
|
|
863
789
|
ai_ml: "ai_ml";
|
|
@@ -971,7 +897,7 @@ export declare const feedItemSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
971
897
|
headline: z.ZodOptional<z.ZodString>;
|
|
972
898
|
}, z.core.$strip>;
|
|
973
899
|
text: z.ZodString;
|
|
974
|
-
media: z.ZodOptional<z.
|
|
900
|
+
media: z.ZodOptional<z.ZodObject<{
|
|
975
901
|
id: z.ZodString;
|
|
976
902
|
url: z.ZodURL;
|
|
977
903
|
width: z.ZodNumber;
|
|
@@ -985,14 +911,7 @@ export declare const feedItemSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
985
911
|
kind: z.ZodLiteral<"image">;
|
|
986
912
|
thumbnailUrl: z.ZodOptional<z.ZodURL>;
|
|
987
913
|
alt: z.ZodOptional<z.ZodString>;
|
|
988
|
-
}, z.core.$strip
|
|
989
|
-
kind: z.ZodLiteral<"video">;
|
|
990
|
-
url: z.ZodURL;
|
|
991
|
-
thumbnailUrl: z.ZodURL;
|
|
992
|
-
width: z.ZodNumber;
|
|
993
|
-
height: z.ZodNumber;
|
|
994
|
-
duration: z.ZodNumber;
|
|
995
|
-
}, z.core.$strip>], "kind">>;
|
|
914
|
+
}, z.core.$strip>>;
|
|
996
915
|
product: z.ZodOptional<z.ZodObject<{
|
|
997
916
|
id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
|
|
998
917
|
slug: z.ZodString;
|
|
@@ -1259,7 +1178,7 @@ export type FeedComment = z.infer<typeof feedCommentSchema>;
|
|
|
1259
1178
|
*/
|
|
1260
1179
|
export declare const feedQuerySchema: z.ZodObject<{
|
|
1261
1180
|
limit: z.ZodPreprocess<z.ZodDefault<z.ZodCoercedNumber<unknown>>, unknown>;
|
|
1262
|
-
cursor: z.ZodOptional<z.ZodString>;
|
|
1181
|
+
cursor: z.ZodPreprocess<z.ZodOptional<z.ZodString>, unknown>;
|
|
1263
1182
|
sort: z.ZodPreprocess<z.ZodDefault<z.ZodEnum<{
|
|
1264
1183
|
new: "new";
|
|
1265
1184
|
top: "top";
|
|
@@ -1271,7 +1190,7 @@ export type FeedQueryInput = z.input<typeof feedQuerySchema>;
|
|
|
1271
1190
|
/** `GET /api/v1/feed/:contentKind/:contentId/comments`. */
|
|
1272
1191
|
export declare const commentsQuerySchema: z.ZodObject<{
|
|
1273
1192
|
limit: z.ZodPreprocess<z.ZodDefault<z.ZodCoercedNumber<unknown>>, unknown>;
|
|
1274
|
-
cursor: z.ZodOptional<z.ZodString>;
|
|
1193
|
+
cursor: z.ZodPreprocess<z.ZodOptional<z.ZodString>, unknown>;
|
|
1275
1194
|
parentCommentId: z.ZodPreprocess<z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>, unknown>;
|
|
1276
1195
|
}, z.core.$strip>;
|
|
1277
1196
|
export type CommentsQuery = z.infer<typeof commentsQuerySchema>;
|
|
@@ -1283,7 +1202,7 @@ export type CommentsQueryInput = z.input<typeof commentsQuerySchema>;
|
|
|
1283
1202
|
*/
|
|
1284
1203
|
export declare const reactionsQuerySchema: z.ZodObject<{
|
|
1285
1204
|
limit: z.ZodPreprocess<z.ZodDefault<z.ZodCoercedNumber<unknown>>, unknown>;
|
|
1286
|
-
cursor: z.ZodOptional<z.ZodString>;
|
|
1205
|
+
cursor: z.ZodPreprocess<z.ZodOptional<z.ZodString>, unknown>;
|
|
1287
1206
|
type: z.ZodPreprocess<z.ZodOptional<z.ZodEnum<{
|
|
1288
1207
|
support: "support";
|
|
1289
1208
|
like: "like";
|
|
@@ -1363,7 +1282,7 @@ export declare const feedPageSchema: z.ZodObject<{
|
|
|
1363
1282
|
headline: z.ZodOptional<z.ZodString>;
|
|
1364
1283
|
}, z.core.$strip>;
|
|
1365
1284
|
text: z.ZodString;
|
|
1366
|
-
media: z.ZodArray<z.
|
|
1285
|
+
media: z.ZodArray<z.ZodObject<{
|
|
1367
1286
|
id: z.ZodString;
|
|
1368
1287
|
url: z.ZodURL;
|
|
1369
1288
|
width: z.ZodNumber;
|
|
@@ -1377,19 +1296,6 @@ export declare const feedPageSchema: z.ZodObject<{
|
|
|
1377
1296
|
kind: z.ZodLiteral<"image">;
|
|
1378
1297
|
thumbnailUrl: z.ZodOptional<z.ZodURL>;
|
|
1379
1298
|
alt: z.ZodOptional<z.ZodString>;
|
|
1380
|
-
}, z.core.$strip>, z.ZodObject<{
|
|
1381
|
-
kind: z.ZodLiteral<"video">;
|
|
1382
|
-
url: z.ZodURL;
|
|
1383
|
-
thumbnailUrl: z.ZodURL;
|
|
1384
|
-
width: z.ZodNumber;
|
|
1385
|
-
height: z.ZodNumber;
|
|
1386
|
-
duration: z.ZodNumber;
|
|
1387
|
-
}, z.core.$strip>], "kind">>;
|
|
1388
|
-
linkPreview: z.ZodOptional<z.ZodObject<{
|
|
1389
|
-
url: z.ZodURL;
|
|
1390
|
-
title: z.ZodOptional<z.ZodString>;
|
|
1391
|
-
description: z.ZodOptional<z.ZodString>;
|
|
1392
|
-
imageUrl: z.ZodOptional<z.ZodURL>;
|
|
1393
1299
|
}, z.core.$strip>>;
|
|
1394
1300
|
topics: z.ZodArray<z.ZodEnum<{
|
|
1395
1301
|
ai_ml: "ai_ml";
|
|
@@ -1503,7 +1409,7 @@ export declare const feedPageSchema: z.ZodObject<{
|
|
|
1503
1409
|
headline: z.ZodOptional<z.ZodString>;
|
|
1504
1410
|
}, z.core.$strip>;
|
|
1505
1411
|
text: z.ZodString;
|
|
1506
|
-
media: z.ZodOptional<z.
|
|
1412
|
+
media: z.ZodOptional<z.ZodObject<{
|
|
1507
1413
|
id: z.ZodString;
|
|
1508
1414
|
url: z.ZodURL;
|
|
1509
1415
|
width: z.ZodNumber;
|
|
@@ -1517,14 +1423,7 @@ export declare const feedPageSchema: z.ZodObject<{
|
|
|
1517
1423
|
kind: z.ZodLiteral<"image">;
|
|
1518
1424
|
thumbnailUrl: z.ZodOptional<z.ZodURL>;
|
|
1519
1425
|
alt: z.ZodOptional<z.ZodString>;
|
|
1520
|
-
}, z.core.$strip
|
|
1521
|
-
kind: z.ZodLiteral<"video">;
|
|
1522
|
-
url: z.ZodURL;
|
|
1523
|
-
thumbnailUrl: z.ZodURL;
|
|
1524
|
-
width: z.ZodNumber;
|
|
1525
|
-
height: z.ZodNumber;
|
|
1526
|
-
duration: z.ZodNumber;
|
|
1527
|
-
}, z.core.$strip>], "kind">>;
|
|
1426
|
+
}, z.core.$strip>>;
|
|
1528
1427
|
product: z.ZodOptional<z.ZodObject<{
|
|
1529
1428
|
id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
|
|
1530
1429
|
slug: z.ZodString;
|
|
@@ -1742,7 +1641,7 @@ export declare const pinnedItemsSchema: z.ZodObject<{
|
|
|
1742
1641
|
headline: z.ZodOptional<z.ZodString>;
|
|
1743
1642
|
}, z.core.$strip>;
|
|
1744
1643
|
text: z.ZodString;
|
|
1745
|
-
media: z.ZodArray<z.
|
|
1644
|
+
media: z.ZodArray<z.ZodObject<{
|
|
1746
1645
|
id: z.ZodString;
|
|
1747
1646
|
url: z.ZodURL;
|
|
1748
1647
|
width: z.ZodNumber;
|
|
@@ -1756,19 +1655,6 @@ export declare const pinnedItemsSchema: z.ZodObject<{
|
|
|
1756
1655
|
kind: z.ZodLiteral<"image">;
|
|
1757
1656
|
thumbnailUrl: z.ZodOptional<z.ZodURL>;
|
|
1758
1657
|
alt: z.ZodOptional<z.ZodString>;
|
|
1759
|
-
}, z.core.$strip>, z.ZodObject<{
|
|
1760
|
-
kind: z.ZodLiteral<"video">;
|
|
1761
|
-
url: z.ZodURL;
|
|
1762
|
-
thumbnailUrl: z.ZodURL;
|
|
1763
|
-
width: z.ZodNumber;
|
|
1764
|
-
height: z.ZodNumber;
|
|
1765
|
-
duration: z.ZodNumber;
|
|
1766
|
-
}, z.core.$strip>], "kind">>;
|
|
1767
|
-
linkPreview: z.ZodOptional<z.ZodObject<{
|
|
1768
|
-
url: z.ZodURL;
|
|
1769
|
-
title: z.ZodOptional<z.ZodString>;
|
|
1770
|
-
description: z.ZodOptional<z.ZodString>;
|
|
1771
|
-
imageUrl: z.ZodOptional<z.ZodURL>;
|
|
1772
1658
|
}, z.core.$strip>>;
|
|
1773
1659
|
topics: z.ZodArray<z.ZodEnum<{
|
|
1774
1660
|
ai_ml: "ai_ml";
|
|
@@ -1882,7 +1768,7 @@ export declare const pinnedItemsSchema: z.ZodObject<{
|
|
|
1882
1768
|
headline: z.ZodOptional<z.ZodString>;
|
|
1883
1769
|
}, z.core.$strip>;
|
|
1884
1770
|
text: z.ZodString;
|
|
1885
|
-
media: z.ZodOptional<z.
|
|
1771
|
+
media: z.ZodOptional<z.ZodObject<{
|
|
1886
1772
|
id: z.ZodString;
|
|
1887
1773
|
url: z.ZodURL;
|
|
1888
1774
|
width: z.ZodNumber;
|
|
@@ -1896,14 +1782,7 @@ export declare const pinnedItemsSchema: z.ZodObject<{
|
|
|
1896
1782
|
kind: z.ZodLiteral<"image">;
|
|
1897
1783
|
thumbnailUrl: z.ZodOptional<z.ZodURL>;
|
|
1898
1784
|
alt: z.ZodOptional<z.ZodString>;
|
|
1899
|
-
}, z.core.$strip
|
|
1900
|
-
kind: z.ZodLiteral<"video">;
|
|
1901
|
-
url: z.ZodURL;
|
|
1902
|
-
thumbnailUrl: z.ZodURL;
|
|
1903
|
-
width: z.ZodNumber;
|
|
1904
|
-
height: z.ZodNumber;
|
|
1905
|
-
duration: z.ZodNumber;
|
|
1906
|
-
}, z.core.$strip>], "kind">>;
|
|
1785
|
+
}, z.core.$strip>>;
|
|
1907
1786
|
product: z.ZodOptional<z.ZodObject<{
|
|
1908
1787
|
id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
|
|
1909
1788
|
slug: z.ZodString;
|
|
@@ -2348,9 +2227,18 @@ export declare const attachedMediaSchema: z.ZodObject<{
|
|
|
2348
2227
|
}, z.core.$strip>;
|
|
2349
2228
|
export type AttachedMedia = z.infer<typeof attachedMediaSchema>;
|
|
2350
2229
|
/**
|
|
2351
|
-
* A post must carry something
|
|
2352
|
-
*
|
|
2230
|
+
* A post must carry something: text, media, or (a repost) the item it
|
|
2231
|
+
* reposts. ONE rule for writing and editing (0.18.0): an edit may clear the
|
|
2232
|
+
* text of a post that keeps its photos or its repost, and only a post that
|
|
2233
|
+
* would be left with nothing is refused (`postEmpty`, on `text`). The create
|
|
2234
|
+
* body checks it here; an edit can only be checked where the stored post is
|
|
2235
|
+
* known, so the server applies this same function there.
|
|
2353
2236
|
*/
|
|
2237
|
+
export declare function postHasContent(post: {
|
|
2238
|
+
text?: string | null;
|
|
2239
|
+
mediaCount: number;
|
|
2240
|
+
isRepost: boolean;
|
|
2241
|
+
}): boolean;
|
|
2354
2242
|
export declare const createPostBodySchema: z.ZodObject<{
|
|
2355
2243
|
communityId: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
|
|
2356
2244
|
productId: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
|
|
@@ -2439,8 +2327,12 @@ export declare const createPostBodySchema: z.ZodObject<{
|
|
|
2439
2327
|
}>>>;
|
|
2440
2328
|
}, z.core.$strip>;
|
|
2441
2329
|
export type CreatePostBody = z.infer<typeof createPostBodySchema>;
|
|
2442
|
-
/**
|
|
2443
|
-
*
|
|
2330
|
+
/**
|
|
2331
|
+
* Only the text is editable. Changing media after the fact makes every
|
|
2332
|
+
* earlier reply look like a reply to something else. Empty text is allowed
|
|
2333
|
+
* here and refused by the server only when the post would carry nothing
|
|
2334
|
+
* (`postHasContent`): a photo's caption can be cleared, a text post's cannot.
|
|
2335
|
+
*/
|
|
2444
2336
|
export declare const updatePostBodySchema: z.ZodObject<{
|
|
2445
2337
|
text: z.ZodString;
|
|
2446
2338
|
}, z.core.$strip>;
|
|
@@ -2534,8 +2426,11 @@ export declare const createPollBodySchema: z.ZodObject<{
|
|
|
2534
2426
|
}>>>;
|
|
2535
2427
|
}, z.core.$strip>;
|
|
2536
2428
|
export type CreatePollBody = z.infer<typeof createPollBodySchema>;
|
|
2537
|
-
/**
|
|
2538
|
-
*
|
|
2429
|
+
/**
|
|
2430
|
+
* Cast or change a vote. The server upserts on (poll, voter), so voting twice
|
|
2431
|
+
* replaces rather than doubles. Each option once (0.18.0: `[0, 0]` was taken
|
|
2432
|
+
* and silently cut to `[0]`).
|
|
2433
|
+
*/
|
|
2539
2434
|
export declare const castVoteBodySchema: z.ZodObject<{
|
|
2540
2435
|
optionIndices: z.ZodArray<z.ZodNumber>;
|
|
2541
2436
|
}, z.core.$strip>;
|
|
@@ -2622,6 +2517,13 @@ export declare const setReactionResponseSchema: z.ZodObject<{
|
|
|
2622
2517
|
}> & z.core.$partial, z.ZodNumber>;
|
|
2623
2518
|
}, z.core.$strip>;
|
|
2624
2519
|
export type SetReactionResponse = z.infer<typeof setReactionResponseSchema>;
|
|
2520
|
+
/**
|
|
2521
|
+
* Where a report stands (0.18.0: named here; the backend's model kept its own
|
|
2522
|
+
* list, and the permission rule that only an open report is decided checked a
|
|
2523
|
+
* plain string). Staff-only on the wire. Stored: append only.
|
|
2524
|
+
*/
|
|
2525
|
+
export declare const REPORT_STATUS_VALUES: readonly ["open", "actioned", "dismissed"];
|
|
2526
|
+
export type ReportStatus = (typeof REPORT_STATUS_VALUES)[number];
|
|
2625
2527
|
/**
|
|
2626
2528
|
* Why a member reported something.
|
|
2627
2529
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feed.d.ts","sourceRoot":"","sources":["../../../src/domains/feed/feed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"feed.d.ts","sourceRoot":"","sources":["../../../src/domains/feed/feed.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
* @module founder-schema/domains/feed
|
|
31
31
|
*/
|
|
32
32
|
import { z } from 'zod';
|
|
33
|
-
import { emptyStringToUndefined, objectIdSchema, paginationQuerySchema,
|
|
34
|
-
import {
|
|
33
|
+
import { eachOnce, emptyStringToUndefined, objectIdSchema, paginationQuerySchema, } from '../../core/common.js';
|
|
34
|
+
import { DAY_MS, MEDIA_ALT_MAX, REPORT_NOTE_MAX } from '../../core/limits.js';
|
|
35
35
|
import { paginatedSchema } from '../../core/responses.js';
|
|
36
36
|
import { VALIDATION_MESSAGE } from '../../core/validation.js';
|
|
37
37
|
import { communityChipSchema } from '../communities/communities.js';
|
|
@@ -72,7 +72,7 @@ export const POLL_MAX_OPTIONS = 6;
|
|
|
72
72
|
/** 5 minutes. Below this a poll closes before anyone sees it. */
|
|
73
73
|
export const POLL_MIN_DURATION_MS = 5 * 60 * 1000;
|
|
74
74
|
/** 30 days. */
|
|
75
|
-
export const POLL_MAX_DURATION_MS = 30 *
|
|
75
|
+
export const POLL_MAX_DURATION_MS = 30 * DAY_MS;
|
|
76
76
|
/**
|
|
77
77
|
* How long after writing it the author may still edit a post or a comment.
|
|
78
78
|
*
|
|
@@ -212,43 +212,14 @@ export const feedImageSchema = mediaImageSchema.extend({
|
|
|
212
212
|
/** Author-supplied alt text. Optional, and worth asking for. */
|
|
213
213
|
alt: z.string().max(MEDIA_ALT_MAX).optional(),
|
|
214
214
|
});
|
|
215
|
-
export const feedVideoSchema = z.object({
|
|
216
|
-
kind: z.literal('video'),
|
|
217
|
-
url: z.url(),
|
|
218
|
-
/** Poster frame, server-extracted. Required: a video with no poster is a
|
|
219
|
-
* black rectangle in the feed. */
|
|
220
|
-
thumbnailUrl: z.url(),
|
|
221
|
-
width: z.number().int().positive(),
|
|
222
|
-
height: z.number().int().positive(),
|
|
223
|
-
/** Seconds. */
|
|
224
|
-
duration: z.number().positive(),
|
|
225
|
-
});
|
|
226
215
|
/**
|
|
227
|
-
*
|
|
228
|
-
*
|
|
229
|
-
*
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
* Preview for the first link in a post body. Server-derived at write time and
|
|
235
|
-
* stored, never re-fetched at render: a card that fetches a third-party page
|
|
236
|
-
* per scroll leaks every reader's address to that site and blocks the feed on
|
|
237
|
-
* somebody else's latency.
|
|
238
|
-
*
|
|
239
|
-
* Both URLs take `safeUrlSchema`: the scheme and host rules, WITHOUT the
|
|
240
|
-
* typed-URL cap. `url` came out of a post body, which is already capped as a
|
|
241
|
-
* whole, and `imageUrl` is whatever the remote page advertised; a long CDN URL
|
|
242
|
-
* is ordinary, and one over `LINK_URL_MAX` would otherwise fail the whole feed
|
|
243
|
-
* page it sits on. Neither is ours, so a consumer still treats both as
|
|
244
|
-
* untrusted at render.
|
|
245
|
-
*/
|
|
246
|
-
export const linkPreviewSchema = z.object({
|
|
247
|
-
url: safeUrlSchema,
|
|
248
|
-
title: z.string().max(LINK_PREVIEW_TITLE_MAX).optional(),
|
|
249
|
-
description: z.string().max(LINK_PREVIEW_DESCRIPTION_MAX).optional(),
|
|
250
|
-
imageUrl: safeUrlSchema.optional(),
|
|
251
|
-
});
|
|
216
|
+
* What a post carries, in the order it was attached. IMAGES ONLY (0.18.0):
|
|
217
|
+
* video is shared as a link in the post text (the user's decision,
|
|
218
|
+
* 2026-09-21), and the uploaded-video shape this used to admit described a
|
|
219
|
+
* server-made poster frame no server makes. `kind` stays, so a stored item
|
|
220
|
+
* says what it is.
|
|
221
|
+
*/
|
|
222
|
+
export const feedMediaSchema = feedImageSchema;
|
|
252
223
|
// ─── Viewer state ────────────────────────────────────────────────────────────
|
|
253
224
|
/**
|
|
254
225
|
* What THIS viewer has done to this item, computed per request.
|
|
@@ -301,11 +272,16 @@ export const contentViewerStateSchema = viewerStateSchema.extend({
|
|
|
301
272
|
canRepost: z.boolean(),
|
|
302
273
|
/**
|
|
303
274
|
* On content inside a community only (0.9.0): whether this viewer may take
|
|
304
|
-
* part in it now (react, comment, vote, save,
|
|
305
|
-
*
|
|
306
|
-
*
|
|
307
|
-
*
|
|
308
|
-
*
|
|
275
|
+
* part in it now (react, comment, vote, save, edit): an active member of a
|
|
276
|
+
* community that is not archived. False for someone who can read it but has
|
|
277
|
+
* not joined (a public community's reader, staff): offer Join instead of
|
|
278
|
+
* the controls. `canEdit` is false too whenever this is.
|
|
279
|
+
*
|
|
280
|
+
* TAKING BACK needs only read access (0.18.0, the server's rule since
|
|
281
|
+
* 0.9.0): someone who left, or a community since archived, may still remove
|
|
282
|
+
* their reaction, their vote or their save, so a client gates only SETTING
|
|
283
|
+
* one on this. Reporting is safety, open to any signed-in reader who did not
|
|
284
|
+
* write it (`canReport`, 0.13.0), joined or not.
|
|
309
285
|
*/
|
|
310
286
|
canTakePart: z.boolean().optional(),
|
|
311
287
|
});
|
|
@@ -367,8 +343,6 @@ export const feedPostSchema = z.object({
|
|
|
367
343
|
text: z.string().max(POST_MAX_BODY_CHARS),
|
|
368
344
|
/** Ordered as the author attached them. */
|
|
369
345
|
media: z.array(feedMediaSchema).max(POST_MAX_MEDIA),
|
|
370
|
-
/** Present only when the body had an embeddable link. */
|
|
371
|
-
linkPreview: linkPreviewSchema.optional(),
|
|
372
346
|
/**
|
|
373
347
|
* What this post is ABOUT, from the same vocabulary a member picks as their
|
|
374
348
|
* interests. This is the whole mechanism behind a relevant feed: matching is
|
|
@@ -433,8 +407,8 @@ export const pollOptionSchema = z.object({
|
|
|
433
407
|
* own records keyed by (poll, voter) and a post has nothing equivalent.
|
|
434
408
|
*
|
|
435
409
|
* Polls are not editable. Changing a question or an option after a vote has
|
|
436
|
-
* been cast silently re-purposes that vote.
|
|
437
|
-
* is
|
|
410
|
+
* been cast silently re-purposes that vote. A poll closes at its `closesAt`;
|
|
411
|
+
* there is no closing it early.
|
|
438
412
|
*/
|
|
439
413
|
export const feedPollSchema = z.object({
|
|
440
414
|
id: objectIdSchema,
|
|
@@ -683,9 +657,16 @@ const askNeedsProduct = (b) => b.ask === undefined || b.productId !== undefined;
|
|
|
683
657
|
const inACommunity = { communityId: objectIdSchema.optional() };
|
|
684
658
|
const communityWithoutProduct = (b) => b.communityId === undefined || (b.productId === undefined && b.ask === undefined);
|
|
685
659
|
/**
|
|
686
|
-
* A post must carry something
|
|
687
|
-
*
|
|
660
|
+
* A post must carry something: text, media, or (a repost) the item it
|
|
661
|
+
* reposts. ONE rule for writing and editing (0.18.0): an edit may clear the
|
|
662
|
+
* text of a post that keeps its photos or its repost, and only a post that
|
|
663
|
+
* would be left with nothing is refused (`postEmpty`, on `text`). The create
|
|
664
|
+
* body checks it here; an edit can only be checked where the stored post is
|
|
665
|
+
* known, so the server applies this same function there.
|
|
688
666
|
*/
|
|
667
|
+
export function postHasContent(post) {
|
|
668
|
+
return Boolean(post.text?.trim().length) || post.mediaCount > 0 || post.isRepost;
|
|
669
|
+
}
|
|
689
670
|
export const createPostBodySchema = z
|
|
690
671
|
.object({
|
|
691
672
|
text: z.string().trim().max(POST_MAX_BODY_CHARS).optional(),
|
|
@@ -696,11 +677,11 @@ export const createPostBodySchema = z
|
|
|
696
677
|
...aboutAProduct,
|
|
697
678
|
...inACommunity,
|
|
698
679
|
})
|
|
699
|
-
.refine((b) =>
|
|
680
|
+
.refine((b) => postHasContent({ text: b.text, mediaCount: b.media?.length ?? 0, isRepost: false }), {
|
|
700
681
|
error: VALIDATION_MESSAGE.postEmpty,
|
|
701
682
|
path: ['text'],
|
|
702
683
|
})
|
|
703
|
-
.refine((b) =>
|
|
684
|
+
.refine((b) => eachOnce(b.media?.map((m) => m.mediaId) ?? []), {
|
|
704
685
|
error: VALIDATION_MESSAGE.mediaDuplicate,
|
|
705
686
|
path: ['media'],
|
|
706
687
|
})
|
|
@@ -709,10 +690,14 @@ export const createPostBodySchema = z
|
|
|
709
690
|
error: VALIDATION_MESSAGE.communityWithProduct,
|
|
710
691
|
path: ['communityId'],
|
|
711
692
|
});
|
|
712
|
-
/**
|
|
713
|
-
*
|
|
693
|
+
/**
|
|
694
|
+
* Only the text is editable. Changing media after the fact makes every
|
|
695
|
+
* earlier reply look like a reply to something else. Empty text is allowed
|
|
696
|
+
* here and refused by the server only when the post would carry nothing
|
|
697
|
+
* (`postHasContent`): a photo's caption can be cleared, a text post's cannot.
|
|
698
|
+
*/
|
|
714
699
|
export const updatePostBodySchema = z.object({
|
|
715
|
-
text: z.string().trim().
|
|
700
|
+
text: z.string().trim().max(POST_MAX_BODY_CHARS),
|
|
716
701
|
});
|
|
717
702
|
export const createPollBodySchema = z
|
|
718
703
|
.object({
|
|
@@ -747,8 +732,11 @@ export const createPollBodySchema = z
|
|
|
747
732
|
}
|
|
748
733
|
return true;
|
|
749
734
|
}, { error: VALIDATION_MESSAGE.pollOptionsDuplicate, path: ['options'] });
|
|
750
|
-
/**
|
|
751
|
-
*
|
|
735
|
+
/**
|
|
736
|
+
* Cast or change a vote. The server upserts on (poll, voter), so voting twice
|
|
737
|
+
* replaces rather than doubles. Each option once (0.18.0: `[0, 0]` was taken
|
|
738
|
+
* and silently cut to `[0]`).
|
|
739
|
+
*/
|
|
752
740
|
export const castVoteBodySchema = z.object({
|
|
753
741
|
optionIndices: z
|
|
754
742
|
.array(z
|
|
@@ -757,7 +745,8 @@ export const castVoteBodySchema = z.object({
|
|
|
757
745
|
.min(0)
|
|
758
746
|
.max(POLL_MAX_OPTIONS - 1))
|
|
759
747
|
.min(1)
|
|
760
|
-
.max(POLL_MAX_OPTIONS)
|
|
748
|
+
.max(POLL_MAX_OPTIONS)
|
|
749
|
+
.refine(eachOnce, { error: VALIDATION_MESSAGE.pollVoteDuplicate }),
|
|
761
750
|
});
|
|
762
751
|
export const createCommentBodySchema = z.object({
|
|
763
752
|
text: z.string().trim().min(1).max(COMMENT_MAX_BODY_CHARS),
|
|
@@ -810,6 +799,12 @@ export const setReactionResponseSchema = z.object({
|
|
|
810
799
|
reactionCounts: reactionCountsSchema,
|
|
811
800
|
});
|
|
812
801
|
// ─── Reporting ───────────────────────────────────────────────────────────────
|
|
802
|
+
/**
|
|
803
|
+
* Where a report stands (0.18.0: named here; the backend's model kept its own
|
|
804
|
+
* list, and the permission rule that only an open report is decided checked a
|
|
805
|
+
* plain string). Staff-only on the wire. Stored: append only.
|
|
806
|
+
*/
|
|
807
|
+
export const REPORT_STATUS_VALUES = ['open', 'actioned', 'dismissed'];
|
|
813
808
|
/**
|
|
814
809
|
* Why a member reported something.
|
|
815
810
|
*
|