convex-feedback 0.2.0-beta.9 → 0.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 (81) hide show
  1. package/README.md +398 -7
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/client/api.d.ts +49 -9
  4. package/dist/client/api.d.ts.map +1 -1
  5. package/dist/client/config.d.ts +1 -3
  6. package/dist/client/config.d.ts.map +1 -1
  7. package/dist/client/config.js.map +1 -1
  8. package/dist/client/index.d.ts +707 -15
  9. package/dist/client/index.d.ts.map +1 -1
  10. package/dist/client/index.js +243 -12
  11. package/dist/client/index.js.map +1 -1
  12. package/dist/component/_generated/api.d.ts +2 -0
  13. package/dist/component/_generated/api.d.ts.map +1 -1
  14. package/dist/component/_generated/api.js.map +1 -1
  15. package/dist/component/_generated/component.d.ts +222 -4
  16. package/dist/component/_generated/component.d.ts.map +1 -1
  17. package/dist/component/admin.d.ts +5 -90
  18. package/dist/component/admin.d.ts.map +1 -1
  19. package/dist/component/admin.js +59 -29
  20. package/dist/component/admin.js.map +1 -1
  21. package/dist/component/comments.d.ts +107 -15
  22. package/dist/component/comments.d.ts.map +1 -1
  23. package/dist/component/comments.js +342 -28
  24. package/dist/component/comments.js.map +1 -1
  25. package/dist/component/crons.d.ts.map +1 -1
  26. package/dist/component/crons.js +4 -0
  27. package/dist/component/crons.js.map +1 -1
  28. package/dist/component/entries.d.ts +119 -91
  29. package/dist/component/entries.d.ts.map +1 -1
  30. package/dist/component/entries.js +348 -29
  31. package/dist/component/entries.js.map +1 -1
  32. package/dist/component/helpers.d.ts +32 -1
  33. package/dist/component/helpers.d.ts.map +1 -1
  34. package/dist/component/helpers.js +121 -4
  35. package/dist/component/helpers.js.map +1 -1
  36. package/dist/component/migrations.d.ts +24 -0
  37. package/dist/component/migrations.d.ts.map +1 -1
  38. package/dist/component/migrations.js +318 -0
  39. package/dist/component/migrations.js.map +1 -1
  40. package/dist/component/model.d.ts +455 -120
  41. package/dist/component/model.d.ts.map +1 -1
  42. package/dist/component/model.js +70 -2
  43. package/dist/component/model.js.map +1 -1
  44. package/dist/component/reactions.d.ts +37 -0
  45. package/dist/component/reactions.d.ts.map +1 -0
  46. package/dist/component/reactions.js +52 -0
  47. package/dist/component/reactions.js.map +1 -0
  48. package/dist/component/roadmap.d.ts +10 -46
  49. package/dist/component/roadmap.d.ts.map +1 -1
  50. package/dist/component/roadmap.js +239 -21
  51. package/dist/component/roadmap.js.map +1 -1
  52. package/dist/component/schema.d.ts +33 -5
  53. package/dist/component/schema.d.ts.map +1 -1
  54. package/dist/component/schema.js +40 -4
  55. package/dist/component/schema.js.map +1 -1
  56. package/dist/react/index.d.ts +26 -238
  57. package/dist/react/index.d.ts.map +1 -1
  58. package/dist/react/index.js +65 -2
  59. package/dist/react/index.js.map +1 -1
  60. package/dist/test.d.ts +23 -5
  61. package/dist/test.d.ts.map +1 -1
  62. package/package.json +1 -1
  63. package/src/client/README.md +6 -1
  64. package/src/client/api.ts +89 -7
  65. package/src/client/config.ts +1 -3
  66. package/src/client/index.ts +1237 -34
  67. package/src/component/README.md +32 -4
  68. package/src/component/_generated/api.ts +2 -0
  69. package/src/component/_generated/component.ts +290 -8
  70. package/src/component/admin.ts +88 -30
  71. package/src/component/comments.ts +405 -26
  72. package/src/component/crons.ts +10 -0
  73. package/src/component/entries.ts +388 -27
  74. package/src/component/helpers.ts +163 -4
  75. package/src/component/migrations.ts +415 -0
  76. package/src/component/model.ts +381 -117
  77. package/src/component/reactions.ts +60 -0
  78. package/src/component/roadmap.ts +357 -35
  79. package/src/component/schema.ts +40 -4
  80. package/src/react/README.md +5 -0
  81. package/src/react/index.ts +90 -3
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/component/model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/component/model.ts"],"names":[],"mappings":"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"}
@@ -61,13 +61,81 @@ export const publicCommentValidator = v.object({
61
61
  parentCommentId: v.optional(v.string()),
62
62
  actorId: v.string(),
63
63
  depth: v.number(),
64
- body: v.union(v.string(), v.null()),
64
+ body: v.string(),
65
65
  likeCount: v.number(),
66
66
  replyCount: v.number(),
67
67
  updatedAt: v.optional(v.number()),
68
- deletedAt: v.optional(v.number()),
69
68
  viewerHasLiked: v.boolean(),
70
69
  });
70
+ /**
71
+ * Entry activity returned by actor-scoped queries.
72
+ *
73
+ * Unlike the ordinary public entry shape, activity entries do not contain
74
+ * viewer-relative reaction state. The actor is already the subject of the
75
+ * query.
76
+ */
77
+ export const activityEntryValidator = v.object({
78
+ id: v.string(),
79
+ creationTime: v.number(),
80
+ actorId: v.string(),
81
+ kind: entryKindValidator,
82
+ status: entryStatusValidator,
83
+ title: v.string(),
84
+ body: v.string(),
85
+ upvoteCount: v.number(),
86
+ commentCount: v.number(),
87
+ updatedAt: v.optional(v.number()),
88
+ });
89
+ /**
90
+ * Component-level activity entry shape with retained diagnostic and triage
91
+ * context. The host wrapper deliberately strips these optional fields from
92
+ * its normal actor-facing API.
93
+ */
94
+ export const activityEntryWithContextValidator = activityEntryValidator.extend({
95
+ metadata: v.optional(feedbackMetadataValidator),
96
+ priority: v.optional(entryPriorityValidator),
97
+ roadmap: v.optional(roadmapItemValidator),
98
+ });
99
+ /** Comment activity with the basic entry context needed by an activity UI. */
100
+ export const activityCommentValidator = v.object({
101
+ id: v.string(),
102
+ creationTime: v.number(),
103
+ entryId: v.string(),
104
+ entryTitle: v.string(),
105
+ parentCommentId: v.optional(v.string()),
106
+ actorId: v.string(),
107
+ depth: v.number(),
108
+ body: v.string(),
109
+ likeCount: v.number(),
110
+ replyCount: v.number(),
111
+ updatedAt: v.optional(v.number()),
112
+ });
113
+ /** Resolved target context for an entry-upvote activity record. */
114
+ export const entryReactionTargetValidator = v.object({
115
+ id: v.string(),
116
+ title: v.string(),
117
+ kind: entryKindValidator,
118
+ status: entryStatusValidator,
119
+ });
120
+ /** Resolved target context for a comment-like activity record. */
121
+ export const commentReactionTargetValidator = v.object({
122
+ id: v.string(),
123
+ body: v.string(),
124
+ entryId: v.string(),
125
+ entryTitle: v.string(),
126
+ });
127
+ /** A reaction activity record with a live, resolved target. */
128
+ export const feedbackReactionValidator = v.union(v.object({
129
+ type: v.literal("entry_upvote"),
130
+ id: v.string(),
131
+ creationTime: v.number(),
132
+ entry: entryReactionTargetValidator,
133
+ }), v.object({
134
+ type: v.literal("comment_like"),
135
+ id: v.string(),
136
+ creationTime: v.number(),
137
+ comment: commentReactionTargetValidator,
138
+ }));
71
139
  export const similarEntriesValidator = v.object({
72
140
  exact: v.array(publicEntryValidator),
73
141
  similar: v.array(publicEntryValidator),
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/component/model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/component/model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * List reactions created by a known actor. Target documents are loaded once
3
+ * by the stream mapper and reused by serialization. Reactions whose target or
4
+ * owning entry is missing or pending deletion are omitted.
5
+ */
6
+ export declare const listByActor: import("convex/server").RegisteredQuery<"public", {
7
+ actorId: string;
8
+ paginationOpts: {
9
+ id?: number;
10
+ endCursor?: string | null;
11
+ maximumRowsRead?: number;
12
+ maximumBytesRead?: number;
13
+ numItems: number;
14
+ cursor: string | null;
15
+ };
16
+ }, Promise<import("convex/server").PaginationResult<{
17
+ type: "entry_upvote";
18
+ id: string;
19
+ creationTime: number;
20
+ entry: {
21
+ id: string;
22
+ title: string;
23
+ status: "open" | "under_review" | "planned" | "in_progress" | "completed" | "closed";
24
+ kind: "feedback" | "feature_request" | "bug_report";
25
+ };
26
+ } | {
27
+ type: "comment_like";
28
+ id: string;
29
+ creationTime: number;
30
+ comment: {
31
+ id: string;
32
+ body: string;
33
+ entryId: string;
34
+ entryTitle: string;
35
+ };
36
+ }>>>;
37
+ //# sourceMappingURL=reactions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactions.d.ts","sourceRoot":"","sources":["../../src/component/reactions.ts"],"names":[],"mappings":"AAgBA;;;;GAIG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAsCtB,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { stream } from "convex-helpers/server/stream";
2
+ import { paginationOptsValidator, paginationResultValidator, } from "convex/server";
3
+ import { v } from "convex/values";
4
+ import { assertActorId, commentIsLive, serializeActivityReaction, } from "./helpers.js";
5
+ import { feedbackReactionValidator } from "./model.js";
6
+ import { query } from "./_generated/server.js";
7
+ import schema from "./schema.js";
8
+ /**
9
+ * List reactions created by a known actor. Target documents are loaded once
10
+ * by the stream mapper and reused by serialization. Reactions whose target or
11
+ * owning entry is missing or pending deletion are omitted.
12
+ */
13
+ export const listByActor = query({
14
+ args: {
15
+ paginationOpts: paginationOptsValidator,
16
+ actorId: v.string(),
17
+ },
18
+ returns: paginationResultValidator(feedbackReactionValidator),
19
+ handler: async (ctx, args) => {
20
+ assertActorId(args.actorId);
21
+ const result = await stream(ctx.db, schema)
22
+ .query("reactions")
23
+ .withIndex("by_actor", (q) => q.eq("actorId", args.actorId))
24
+ .order("desc")
25
+ .map(async (reaction) => {
26
+ if (reaction.entryId !== undefined) {
27
+ const entry = await ctx.db.get("entries", reaction.entryId);
28
+ if (entry === null || entry.deletingAt !== undefined)
29
+ return null;
30
+ return serializeActivityReaction(reaction, { type: "entry", entry });
31
+ }
32
+ if (reaction.commentId !== undefined) {
33
+ const comment = await ctx.db.get("comments", reaction.commentId);
34
+ if (comment === null || !(await commentIsLive(ctx, comment))) {
35
+ return null;
36
+ }
37
+ const entry = await ctx.db.get("entries", comment.entryId);
38
+ if (entry === null || entry.deletingAt !== undefined)
39
+ return null;
40
+ return serializeActivityReaction(reaction, {
41
+ type: "comment",
42
+ comment,
43
+ entry,
44
+ });
45
+ }
46
+ return null;
47
+ })
48
+ .paginate(args.paginationOpts);
49
+ return result;
50
+ },
51
+ });
52
+ //# sourceMappingURL=reactions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactions.js","sourceRoot":"","sources":["../../src/component/reactions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AACtD,OAAO,EACL,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAElC,OAAO,EACL,aAAa,EACb,aAAa,EACb,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;IAC/B,IAAI,EAAE;QACJ,cAAc,EAAE,uBAAuB;QACvC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;KACpB;IACD,OAAO,EAAE,yBAAyB,CAAC,yBAAyB,CAAC;IAC7D,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE5B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC;aACxC,KAAK,CAAC,WAAW,CAAC;aAClB,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;aAC3D,KAAK,CAAC,MAAM,CAAC;aACb,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YACtB,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBACnC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC5D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS;oBAAE,OAAO,IAAI,CAAC;gBAClE,OAAO,yBAAyB,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACvE,CAAC;YACD,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACrC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACjE,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;oBAC7D,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC3D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS;oBAAE,OAAO,IAAI,CAAC;gBAClE,OAAO,yBAAyB,CAAC,QAAQ,EAAE;oBACzC,IAAI,EAAE,SAAS;oBACf,OAAO;oBACP,KAAK;iBACN,CAAC,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;aACD,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAEjC,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC,CAAC"}
@@ -1,3 +1,9 @@
1
+ import { type PaginationResult } from "convex/server";
2
+ import { serializeRoadmapItem } from "./helpers.js";
3
+ type RoadmapItemPage = PaginationResult<ReturnType<typeof serializeRoadmapItem>>;
4
+ export declare const get: import("convex/server").RegisteredQuery<"public", {
5
+ roadmapId: import("convex/values").GenericId<"roadmap">;
6
+ }, Promise<import("./model.js").RoadmapItem | null>>;
1
7
  export declare const list: import("convex/server").RegisteredQuery<"public", {
2
8
  status?: "planned" | "in_progress" | "shipped" | undefined;
3
9
  paginationOpts: {
@@ -8,37 +14,11 @@ export declare const list: import("convex/server").RegisteredQuery<"public", {
8
14
  numItems: number;
9
15
  cursor: string | null;
10
16
  };
11
- }, Promise<{
12
- page: {
13
- description?: string | undefined;
14
- id: string;
15
- creationTime: number;
16
- title: string;
17
- status: "planned" | "in_progress" | "shipped";
18
- position: number;
19
- createdAt: number;
20
- updatedAt: number;
21
- feedbackCount: number;
22
- }[];
23
- isDone: boolean;
24
- continueCursor: import("convex/server").Cursor;
25
- splitCursor?: import("convex/server").Cursor | null;
26
- pageStatus?: "SplitRecommended" | "SplitRequired" | null;
27
- }>>;
17
+ }, Promise<RoadmapItemPage>>;
28
18
  export declare const search: import("convex/server").RegisteredQuery<"public", {
29
19
  searchQuery: string;
30
20
  limit: number;
31
- }, Promise<{
32
- description?: string | undefined;
33
- id: string;
34
- creationTime: number;
35
- title: string;
36
- status: "planned" | "in_progress" | "shipped";
37
- position: number;
38
- createdAt: number;
39
- updatedAt: number;
40
- feedbackCount: number;
41
- }[]>>;
21
+ }, Promise<import("./model.js").RoadmapItem[]>>;
42
22
  export declare const create: import("convex/server").RegisteredMutation<"public", {
43
23
  description?: string | undefined;
44
24
  title: string;
@@ -141,27 +121,11 @@ export declare const listFeedback: import("convex/server").RegisteredQuery<"publ
141
121
  cursor: string | null;
142
122
  };
143
123
  }, Promise<{
144
- page: {
145
- updatedAt?: number | undefined;
146
- viewerIsAuthor?: boolean | undefined;
147
- metadata?: {
148
- standard?: Record<string, string | number | boolean> | undefined;
149
- additional?: Record<string, string | number | boolean> | undefined;
150
- } | undefined;
151
- id: string;
152
- creationTime: number;
153
- title: string;
154
- status: "open" | "under_review" | "planned" | "in_progress" | "completed" | "closed";
155
- actorId: string;
156
- kind: "feedback" | "feature_request" | "bug_report";
157
- body: string;
158
- upvoteCount: number;
159
- commentCount: number;
160
- viewerHasUpvoted: boolean;
161
- }[];
124
+ page: import("./model.js").FeedbackEntry[];
162
125
  isDone: boolean;
163
126
  continueCursor: import("convex/server").Cursor;
164
127
  splitCursor?: import("convex/server").Cursor | null;
165
128
  pageStatus?: "SplitRecommended" | "SplitRequired" | null;
166
129
  }>>;
130
+ export {};
167
131
  //# sourceMappingURL=roadmap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"roadmap.d.ts","sourceRoot":"","sources":["../../src/component/roadmap.ts"],"names":[],"mappings":"AA6HA,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;GA4Cf,CAAC;AAEH,eAAO,MAAM,MAAM;;;;;;;;;;;;;KAcjB,CAAC;AAuBH,eAAO,MAAM,MAAM;;;;;;;;;yDAYjB,CAAC;AAEH,eAAO,MAAM,MAAM;;;;;;;;;iBAwBjB,CAAC;AAEH,eAAO,MAAM,IAAI;;;;;;;;;;mBAyFf,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;;iBAgHzB,CAAC;AAEH,eAAO,MAAM,MAAM;;;;;;;iBAgBjB,CAAC;AAEH,eAAO,MAAM,WAAW;;;;;GAkCtB,CAAC;AAEH,eAAO,MAAM,eAAe;;iBAS1B,CAAC;AAsCH,eAAO,MAAM,cAAc;;;;;;;;iBAYzB,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;yDAezB,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;iBAqBzB,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuBvB,CAAC"}
1
+ {"version":3,"file":"roadmap.d.ts","sourceRoot":"","sources":["../../src/component/roadmap.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAC;AAMvB,OAAO,EAGL,oBAAoB,EACrB,MAAM,cAAc,CAAC;AAqBtB,KAAK,eAAe,GAAG,gBAAgB,CACrC,UAAU,CAAC,OAAO,oBAAoB,CAAC,CACxC,CAAC;AAyZF,eAAO,MAAM,GAAG;;oDAed,CAAC;AAEH,eAAO,MAAM,IAAI;;;;;;;;;;4BAuBf,CAAC;AAEH,eAAO,MAAM,MAAM;;;+CAcjB,CAAC;AAuBH,eAAO,MAAM,MAAM;;;;;;;;;yDAYjB,CAAC;AAEH,eAAO,MAAM,MAAM;;;;;;;;;iBAwBjB,CAAC;AAEH,eAAO,MAAM,IAAI;;;;;;;;;;mBAyFf,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;;iBAgHzB,CAAC;AAEH,eAAO,MAAM,MAAM;;;;;;;iBAgBjB,CAAC;AAEH,eAAO,MAAM,WAAW;;;;;GAkCtB,CAAC;AAEH,eAAO,MAAM,eAAe;;iBAS1B,CAAC;AAyCH,eAAO,MAAM,cAAc;;;;;;;;iBAYzB,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;yDAezB,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;iBAqBzB,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;GAwBvB,CAAC"}
@@ -10,6 +10,7 @@ const POSITION_STEP = 1_000_000;
10
10
  const REBALANCE_GAP_THRESHOLD = 10;
11
11
  const rebalanceBatchSize = 100;
12
12
  const deletionBatchSize = 100;
13
+ const roadmapStatuses = ["planned", "in_progress", "shipped"];
13
14
  function assertAdmin(actor) {
14
15
  if (!actorIsAdmin(actor))
15
16
  throw new ConvexError("Admin access is required.");
@@ -76,6 +77,233 @@ async function scheduleRebalance(ctx, status) {
76
77
  offset: 0,
77
78
  });
78
79
  }
80
+ function newRoadmapListStreamState(generation = null) {
81
+ return { cursor: null, offset: 0, done: false, generation };
82
+ }
83
+ function initialRoadmapListCursor() {
84
+ return {
85
+ version: 1,
86
+ streams: roadmapStatuses.map(() => newRoadmapListStreamState()),
87
+ };
88
+ }
89
+ function isRecord(value) {
90
+ return typeof value === "object" && value !== null && !Array.isArray(value);
91
+ }
92
+ function isRoadmapListStreamState(value) {
93
+ if (!isRecord(value))
94
+ return false;
95
+ return ((value.cursor === null || typeof value.cursor === "string") &&
96
+ typeof value.offset === "number" &&
97
+ Number.isInteger(value.offset) &&
98
+ value.offset >= 0 &&
99
+ typeof value.done === "boolean" &&
100
+ (value.generation === null || typeof value.generation === "string"));
101
+ }
102
+ function decodeRoadmapListCursor(cursor) {
103
+ if (cursor === null)
104
+ return initialRoadmapListCursor();
105
+ let value;
106
+ try {
107
+ value = JSON.parse(cursor);
108
+ }
109
+ catch {
110
+ throw new ConvexError("InvalidCursor");
111
+ }
112
+ if (!isRecord(value) ||
113
+ value.version !== 1 ||
114
+ !Array.isArray(value.streams) ||
115
+ value.streams.length !== roadmapStatuses.length ||
116
+ !value.streams.every(isRoadmapListStreamState)) {
117
+ throw new ConvexError("InvalidCursor");
118
+ }
119
+ return {
120
+ version: 1,
121
+ streams: value.streams.map((stream) => ({ ...stream })),
122
+ };
123
+ }
124
+ function encodeRoadmapListCursor(cursor) {
125
+ return JSON.stringify(cursor);
126
+ }
127
+ async function paginateRoadmapStatus(ctx, db, status, paginationOpts) {
128
+ const state = await getRebalanceState(ctx, status);
129
+ const generation = state?.visibleGeneration ?? null;
130
+ const roadmapQuery = generation === null
131
+ ? db
132
+ .query("roadmap")
133
+ .withIndex("by_status_deleting_at_position", (q) => q.eq("status", status).eq("deletingAt", undefined))
134
+ : db
135
+ .query("roadmap")
136
+ .withIndex("by_status_deleting_at_rebalance_id_position", (q) => q
137
+ .eq("status", status)
138
+ .eq("deletingAt", undefined)
139
+ .eq("rebalanceId", generation));
140
+ const result = await roadmapQuery.paginate(paginationOpts);
141
+ return {
142
+ ...result,
143
+ generation,
144
+ page: result.page.map((item) => serializeRoadmapItem(item, generation === null ? undefined : item.rebalancePosition)),
145
+ };
146
+ }
147
+ function compareRoadmapItems(left, right) {
148
+ if (left.position !== right.position) {
149
+ return left.position - right.position;
150
+ }
151
+ if (left.creationTime !== right.creationTime) {
152
+ return left.creationTime - right.creationTime;
153
+ }
154
+ return left.id < right.id ? -1 : left.id > right.id ? 1 : 0;
155
+ }
156
+ function mergeRoadmapPages(pages, offsets, limit) {
157
+ const page = [];
158
+ while (page.length < limit) {
159
+ let selectedIndex = -1;
160
+ for (const [index, value] of pages.entries()) {
161
+ if (value === null)
162
+ continue;
163
+ const item = value.result.page[offsets[index]];
164
+ if (item === undefined)
165
+ continue;
166
+ const selected = selectedIndex < 0
167
+ ? undefined
168
+ : pages[selectedIndex].result.page[offsets[selectedIndex]];
169
+ if (selected === undefined || compareRoadmapItems(item, selected) < 0) {
170
+ selectedIndex = index;
171
+ }
172
+ }
173
+ if (selectedIndex < 0)
174
+ break;
175
+ page.push(pages[selectedIndex].result.page[offsets[selectedIndex]]);
176
+ offsets[selectedIndex] += 1;
177
+ }
178
+ return page;
179
+ }
180
+ async function paginateUnfilteredRoadmapRange(ctx, db, paginationOpts, startCursor, endCursor) {
181
+ const generations = await Promise.all(roadmapStatuses.map(async (status) => {
182
+ const state = await getRebalanceState(ctx, status);
183
+ return state?.visibleGeneration ?? null;
184
+ }));
185
+ if (startCursor.streams.some((stream, index) => stream.generation !== generations[index] ||
186
+ endCursor.streams[index].generation !== generations[index])) {
187
+ throw new ConvexError("InvalidCursor");
188
+ }
189
+ const pages = await Promise.all(roadmapStatuses.map(async (status, index) => {
190
+ const start = startCursor.streams[index];
191
+ const end = endCursor.streams[index];
192
+ if (start.generation !== end.generation) {
193
+ throw new ConvexError("InvalidCursor");
194
+ }
195
+ if (start.done)
196
+ return null;
197
+ if (start.cursor === end.cursor) {
198
+ if (end.offset <= start.offset)
199
+ return null;
200
+ const result = await paginateRoadmapStatus(ctx, db, status, {
201
+ cursor: start.cursor,
202
+ numItems: end.offset,
203
+ });
204
+ return { stream: start, result };
205
+ }
206
+ if (end.cursor === null) {
207
+ throw new ConvexError("InvalidCursor");
208
+ }
209
+ const result = await paginateRoadmapStatus(ctx, db, status, {
210
+ cursor: start.cursor,
211
+ endCursor: end.cursor,
212
+ numItems: paginationOpts.numItems,
213
+ });
214
+ return { stream: start, result };
215
+ }));
216
+ const offsets = pages.map((page) => page?.stream.offset ?? 0);
217
+ return {
218
+ page: mergeRoadmapPages(pages, offsets, Number.POSITIVE_INFINITY),
219
+ isDone: endCursor.streams.every((stream) => stream.done),
220
+ continueCursor: encodeRoadmapListCursor(endCursor),
221
+ };
222
+ }
223
+ /**
224
+ * Unfiltered reads merge one stable stream per status. Each stream is pinned
225
+ * to the generation visible in the query snapshot, so promotion batches can
226
+ * never leak a mixture of live and replacement positions.
227
+ */
228
+ async function paginateUnfilteredRoadmap(ctx, db, paginationOpts) {
229
+ const cursor = decodeRoadmapListCursor(paginationOpts.cursor);
230
+ if (paginationOpts.endCursor !== undefined &&
231
+ paginationOpts.endCursor !== null) {
232
+ return await paginateUnfilteredRoadmapRange(ctx, db, paginationOpts, cursor, decodeRoadmapListCursor(paginationOpts.endCursor));
233
+ }
234
+ const generations = await Promise.all(roadmapStatuses.map(async (status) => {
235
+ const state = await getRebalanceState(ctx, status);
236
+ return state?.visibleGeneration ?? null;
237
+ }));
238
+ const streams = cursor.streams.map((stream, index) => stream.generation === generations[index]
239
+ ? stream
240
+ : newRoadmapListStreamState(generations[index]));
241
+ const pages = await Promise.all(roadmapStatuses.map(async (status, index) => {
242
+ const stream = streams[index];
243
+ if (stream.done)
244
+ return null;
245
+ const result = await paginateRoadmapStatus(ctx, db, status, {
246
+ ...paginationOpts,
247
+ cursor: stream.cursor,
248
+ endCursor: undefined,
249
+ numItems: Math.max(paginationOpts.numItems, stream.offset + paginationOpts.numItems),
250
+ });
251
+ return { stream, result };
252
+ }));
253
+ const nextStreams = streams.map((stream) => ({ ...stream }));
254
+ const offsets = pages.map((page) => page?.stream.offset ?? 0);
255
+ const page = mergeRoadmapPages(pages, offsets, paginationOpts.numItems);
256
+ for (const [index, value] of pages.entries()) {
257
+ if (value === null)
258
+ continue;
259
+ const stream = nextStreams[index];
260
+ const result = value.result;
261
+ const consumed = offsets[index] - value.stream.offset;
262
+ const pageExhausted = offsets[index] >= result.page.length;
263
+ stream.generation = result.generation;
264
+ if (pageExhausted) {
265
+ stream.done = result.isDone;
266
+ if (result.isDone) {
267
+ // Keep the source page boundary even when the paginator uses "[]" as
268
+ // its terminal cursor, so a bound previous-page query can reproduce
269
+ // exactly the same range.
270
+ stream.cursor = value.stream.cursor;
271
+ stream.offset = result.page.length;
272
+ }
273
+ else {
274
+ stream.cursor = result.continueCursor;
275
+ stream.offset = 0;
276
+ }
277
+ }
278
+ else {
279
+ stream.done = false;
280
+ stream.cursor = value.stream.cursor;
281
+ stream.offset = value.stream.offset + consumed;
282
+ }
283
+ }
284
+ const nextCursor = {
285
+ version: 1,
286
+ streams: nextStreams,
287
+ };
288
+ return {
289
+ page,
290
+ isDone: nextStreams.every((stream) => stream.done),
291
+ continueCursor: encodeRoadmapListCursor(nextCursor),
292
+ };
293
+ }
294
+ export const get = query({
295
+ args: { roadmapId: v.id("roadmap") },
296
+ returns: v.union(roadmapItemValidator, v.null()),
297
+ handler: async (ctx, args) => {
298
+ const item = await ctx.db.get("roadmap", args.roadmapId);
299
+ if (item === null || item.deletingAt !== undefined)
300
+ return null;
301
+ const state = await getRebalanceState(ctx, item.status);
302
+ return serializeRoadmapItem(item, state?.visibleGeneration === undefined
303
+ ? undefined
304
+ : item.rebalancePosition);
305
+ },
306
+ });
79
307
  export const list = query({
80
308
  args: {
81
309
  paginationOpts: paginationOptsValidator,
@@ -85,27 +313,13 @@ export const list = query({
85
313
  handler: async (ctx, args) => {
86
314
  const db = paginator(ctx.db, schema);
87
315
  const status = args.status;
88
- const state = status === undefined ? null : await getRebalanceState(ctx, status);
89
- const visibleGeneration = state?.visibleGeneration;
90
- const roadmapQuery = status !== undefined && visibleGeneration !== undefined
91
- ? db
92
- .query("roadmap")
93
- .withIndex("by_status_deleting_at_rebalance_id_position", (q) => q
94
- .eq("status", status)
95
- .eq("deletingAt", undefined)
96
- .eq("rebalanceId", visibleGeneration))
97
- : status === undefined
98
- ? db
99
- .query("roadmap")
100
- .withIndex("by_deleting_at_and_position", (q) => q.eq("deletingAt", undefined))
101
- : db
102
- .query("roadmap")
103
- .withIndex("by_status_deleting_at_position", (q) => q.eq("status", status).eq("deletingAt", undefined));
104
- const result = await roadmapQuery.paginate(args.paginationOpts);
105
- return {
106
- ...result,
107
- page: result.page.map((item) => serializeRoadmapItem(item, visibleGeneration === undefined ? undefined : item.rebalancePosition)),
108
- };
316
+ if (status === undefined) {
317
+ return await paginateUnfilteredRoadmap(ctx, db, args.paginationOpts);
318
+ }
319
+ const result = await paginateRoadmapStatus(ctx, db, status, args.paginationOpts);
320
+ const { generation: _generation, ...publicResult } = result;
321
+ void _generation;
322
+ return publicResult;
109
323
  },
110
324
  });
111
325
  export const search = query({
@@ -442,6 +656,9 @@ async function attachFeedbackRecord(ctx, roadmapId, entryId) {
442
656
  }
443
657
  if (entry === null)
444
658
  throw new ConvexError("Entry not found.");
659
+ if (entry.deletingAt !== undefined) {
660
+ throw new ConvexError("Entry is being deleted.");
661
+ }
445
662
  if (entry.roadmapId === roadmapId)
446
663
  return;
447
664
  const now = Date.now();
@@ -529,6 +746,7 @@ export const listFeedback = query({
529
746
  .query("entries")
530
747
  .withIndex("by_roadmap_id", (q) => q.eq("roadmapId", args.roadmapId))
531
748
  .order("desc")
749
+ .filterWith((entry) => Promise.resolve(entry.deletingAt === undefined))
532
750
  .paginate(args.paginationOpts);
533
751
  return {
534
752
  ...result,