convex-feedback 0.1.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 (86) hide show
  1. package/README.md +183 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/client/api.d.ts +72 -0
  4. package/dist/client/api.d.ts.map +1 -0
  5. package/dist/client/api.js +2 -0
  6. package/dist/client/api.js.map +1 -0
  7. package/dist/client/config.d.ts +37 -0
  8. package/dist/client/config.d.ts.map +1 -0
  9. package/dist/client/config.js +36 -0
  10. package/dist/client/config.js.map +1 -0
  11. package/dist/client/index.d.ts +186 -0
  12. package/dist/client/index.d.ts.map +1 -0
  13. package/dist/client/index.js +248 -0
  14. package/dist/client/index.js.map +1 -0
  15. package/dist/component/_generated/api.d.ts +42 -0
  16. package/dist/component/_generated/api.d.ts.map +1 -0
  17. package/dist/component/_generated/api.js +31 -0
  18. package/dist/component/_generated/api.js.map +1 -0
  19. package/dist/component/_generated/component.d.ts +233 -0
  20. package/dist/component/_generated/component.d.ts.map +1 -0
  21. package/dist/component/_generated/component.js +11 -0
  22. package/dist/component/_generated/component.js.map +1 -0
  23. package/dist/component/_generated/dataModel.d.ts +46 -0
  24. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  25. package/dist/component/_generated/dataModel.js +11 -0
  26. package/dist/component/_generated/dataModel.js.map +1 -0
  27. package/dist/component/_generated/server.d.ts +133 -0
  28. package/dist/component/_generated/server.d.ts.map +1 -0
  29. package/dist/component/_generated/server.js +80 -0
  30. package/dist/component/_generated/server.js.map +1 -0
  31. package/dist/component/comments.d.ts +68 -0
  32. package/dist/component/comments.d.ts.map +1 -0
  33. package/dist/component/comments.js +206 -0
  34. package/dist/component/comments.js.map +1 -0
  35. package/dist/component/convex.config.d.ts +3 -0
  36. package/dist/component/convex.config.d.ts.map +1 -0
  37. package/dist/component/convex.config.js +3 -0
  38. package/dist/component/convex.config.js.map +1 -0
  39. package/dist/component/entries.d.ts +140 -0
  40. package/dist/component/entries.d.ts.map +1 -0
  41. package/dist/component/entries.js +302 -0
  42. package/dist/component/entries.js.map +1 -0
  43. package/dist/component/helpers.d.ts +10 -0
  44. package/dist/component/helpers.d.ts.map +1 -0
  45. package/dist/component/helpers.js +74 -0
  46. package/dist/component/helpers.js.map +1 -0
  47. package/dist/component/model.d.ts +176 -0
  48. package/dist/component/model.d.ts.map +1 -0
  49. package/dist/component/model.js +41 -0
  50. package/dist/component/model.js.map +1 -0
  51. package/dist/component/schema.d.ts +78 -0
  52. package/dist/component/schema.d.ts.map +1 -0
  53. package/dist/component/schema.js +56 -0
  54. package/dist/component/schema.js.map +1 -0
  55. package/dist/component/types.d.ts +5 -0
  56. package/dist/component/types.d.ts.map +1 -0
  57. package/dist/component/types.js +2 -0
  58. package/dist/component/types.js.map +1 -0
  59. package/dist/react/index.d.ts +169 -0
  60. package/dist/react/index.d.ts.map +1 -0
  61. package/dist/react/index.js +68 -0
  62. package/dist/react/index.js.map +1 -0
  63. package/dist/test.d.ts +88 -0
  64. package/dist/test.d.ts.map +1 -0
  65. package/dist/test.js +9 -0
  66. package/dist/test.js.map +1 -0
  67. package/package.json +63 -0
  68. package/src/client/README.md +11 -0
  69. package/src/client/api.ts +126 -0
  70. package/src/client/config.ts +80 -0
  71. package/src/client/index.ts +338 -0
  72. package/src/component/README.md +13 -0
  73. package/src/component/_generated/api.ts +58 -0
  74. package/src/component/_generated/component.ts +339 -0
  75. package/src/component/_generated/dataModel.ts +60 -0
  76. package/src/component/_generated/server.ts +169 -0
  77. package/src/component/comments.ts +258 -0
  78. package/src/component/convex.config.ts +3 -0
  79. package/src/component/entries.ts +385 -0
  80. package/src/component/helpers.ts +105 -0
  81. package/src/component/model.ts +76 -0
  82. package/src/component/schema.ts +60 -0
  83. package/src/component/types.ts +6 -0
  84. package/src/react/README.md +7 -0
  85. package/src/react/index.ts +140 -0
  86. package/src/test.ts +18 -0
@@ -0,0 +1,302 @@
1
+ import { paginator } from "convex-helpers/server/pagination";
2
+ import { paginationOptsValidator, paginationResultValidator, } from "convex/server";
3
+ import { ConvexError, v } from "convex/values";
4
+ import { mutation, query } from "./_generated/server.js";
5
+ import { assertActorId, normalizeRequiredText, normalizeTitle, serializeEntry, } from "./helpers.js";
6
+ import { actorValidator, entryKindValidator, entrySortValidator, entryStatusValidator, publicEntryValidator, similarEntriesValidator, } from "./model.js";
7
+ import schema from "./schema.js";
8
+ export const list = query({
9
+ args: {
10
+ paginationOpts: paginationOptsValidator,
11
+ kind: v.optional(entryKindValidator),
12
+ status: v.optional(entryStatusValidator),
13
+ sort: entrySortValidator,
14
+ viewerActorId: v.optional(v.string()),
15
+ },
16
+ returns: paginationResultValidator(publicEntryValidator),
17
+ handler: async (ctx, args) => {
18
+ const db = paginator(ctx.db, schema);
19
+ const { kind, status } = args;
20
+ const result = args.sort === "top"
21
+ ? kind !== undefined && status !== undefined
22
+ ? await db
23
+ .query("entries")
24
+ .withIndex("by_kind_status_upvotes", (q) => q.eq("kind", kind).eq("status", status))
25
+ .order("desc")
26
+ .paginate(args.paginationOpts)
27
+ : kind !== undefined
28
+ ? await db
29
+ .query("entries")
30
+ .withIndex("by_kind_upvotes", (q) => q.eq("kind", kind))
31
+ .order("desc")
32
+ .paginate(args.paginationOpts)
33
+ : status !== undefined
34
+ ? await db
35
+ .query("entries")
36
+ .withIndex("by_status_upvotes", (q) => q.eq("status", status))
37
+ .order("desc")
38
+ .paginate(args.paginationOpts)
39
+ : await db
40
+ .query("entries")
41
+ .withIndex("by_upvotes")
42
+ .order("desc")
43
+ .paginate(args.paginationOpts)
44
+ : kind !== undefined && status !== undefined
45
+ ? await db
46
+ .query("entries")
47
+ .withIndex("by_kind_status", (q) => q.eq("kind", kind).eq("status", status))
48
+ .order("desc")
49
+ .paginate(args.paginationOpts)
50
+ : kind !== undefined
51
+ ? await db
52
+ .query("entries")
53
+ .withIndex("by_kind", (q) => q.eq("kind", kind))
54
+ .order("desc")
55
+ .paginate(args.paginationOpts)
56
+ : status !== undefined
57
+ ? await db
58
+ .query("entries")
59
+ .withIndex("by_status", (q) => q.eq("status", status))
60
+ .order("desc")
61
+ .paginate(args.paginationOpts)
62
+ : await db
63
+ .query("entries")
64
+ .order("desc")
65
+ .paginate(args.paginationOpts);
66
+ return {
67
+ ...result,
68
+ page: await Promise.all(result.page.map((entry) => serializeEntry(ctx, entry, args.viewerActorId))),
69
+ };
70
+ },
71
+ });
72
+ export const get = query({
73
+ args: {
74
+ entryId: v.string(),
75
+ viewerActorId: v.optional(v.string()),
76
+ },
77
+ returns: v.union(publicEntryValidator, v.null()),
78
+ handler: async (ctx, args) => {
79
+ const entryId = ctx.db.normalizeId("entries", args.entryId);
80
+ if (entryId === null)
81
+ return null;
82
+ const entry = await ctx.db.get("entries", entryId);
83
+ return entry === null
84
+ ? null
85
+ : serializeEntry(ctx, entry, args.viewerActorId);
86
+ },
87
+ });
88
+ export const search = query({
89
+ args: {
90
+ searchQuery: v.string(),
91
+ kind: v.optional(entryKindValidator),
92
+ status: v.optional(entryStatusValidator),
93
+ limit: v.number(),
94
+ viewerActorId: v.optional(v.string()),
95
+ },
96
+ returns: v.array(publicEntryValidator),
97
+ handler: async (ctx, args) => {
98
+ const searchQuery = args.searchQuery.trim();
99
+ if (searchQuery.length === 0 || args.limit <= 0)
100
+ return [];
101
+ const { kind, status } = args;
102
+ const entries = kind !== undefined && status !== undefined
103
+ ? await ctx.db
104
+ .query("entries")
105
+ .withSearchIndex("search", (q) => q
106
+ .search("searchText", searchQuery)
107
+ .eq("kind", kind)
108
+ .eq("status", status))
109
+ .take(args.limit)
110
+ : kind !== undefined
111
+ ? await ctx.db
112
+ .query("entries")
113
+ .withSearchIndex("search", (q) => q.search("searchText", searchQuery).eq("kind", kind))
114
+ .take(args.limit)
115
+ : status !== undefined
116
+ ? await ctx.db
117
+ .query("entries")
118
+ .withSearchIndex("search", (q) => q.search("searchText", searchQuery).eq("status", status))
119
+ .take(args.limit)
120
+ : await ctx.db
121
+ .query("entries")
122
+ .withSearchIndex("search", (q) => q.search("searchText", searchQuery))
123
+ .take(args.limit);
124
+ return Promise.all(entries.map((entry) => serializeEntry(ctx, entry, args.viewerActorId)));
125
+ },
126
+ });
127
+ export const similar = query({
128
+ args: {
129
+ title: v.string(),
130
+ body: v.string(),
131
+ kind: v.optional(entryKindValidator),
132
+ limit: v.number(),
133
+ viewerActorId: v.optional(v.string()),
134
+ },
135
+ returns: similarEntriesValidator,
136
+ handler: async (ctx, args) => {
137
+ if (args.limit <= 0)
138
+ return { exact: [], similar: [] };
139
+ const title = args.title.trim();
140
+ const body = args.body.trim();
141
+ const { kind } = args;
142
+ if (title.length === 0 && body.length === 0) {
143
+ return { exact: [], similar: [] };
144
+ }
145
+ const normalizedTitle = normalizeTitle(title);
146
+ const exactDocs = title.length === 0
147
+ ? []
148
+ : kind === undefined
149
+ ? await ctx.db
150
+ .query("entries")
151
+ .withIndex("by_normalized_title", (q) => q.eq("normalizedTitle", normalizedTitle))
152
+ .take(args.limit)
153
+ : await ctx.db
154
+ .query("entries")
155
+ .withIndex("by_kind_normalized_title", (q) => q.eq("kind", kind).eq("normalizedTitle", normalizedTitle))
156
+ .take(args.limit);
157
+ const exactIds = new Set(exactDocs.map((entry) => entry._id));
158
+ const searchText = `${title}\n${body}`.trim();
159
+ const similarDocs = searchText.length === 0
160
+ ? []
161
+ : kind === undefined
162
+ ? await ctx.db
163
+ .query("entries")
164
+ .withSearchIndex("search", (q) => q.search("searchText", searchText))
165
+ .take(args.limit + exactIds.size)
166
+ : await ctx.db
167
+ .query("entries")
168
+ .withSearchIndex("search", (q) => q.search("searchText", searchText).eq("kind", kind))
169
+ .take(args.limit + exactIds.size);
170
+ const similarFiltered = similarDocs
171
+ .filter((entry) => !exactIds.has(entry._id))
172
+ .slice(0, args.limit);
173
+ return {
174
+ exact: await Promise.all(exactDocs.map((entry) => serializeEntry(ctx, entry, args.viewerActorId))),
175
+ similar: await Promise.all(similarFiltered.map((entry) => serializeEntry(ctx, entry, args.viewerActorId))),
176
+ };
177
+ },
178
+ });
179
+ export const create = mutation({
180
+ args: {
181
+ actorId: v.string(),
182
+ kind: entryKindValidator,
183
+ title: v.string(),
184
+ body: v.string(),
185
+ defaultStatus: entryStatusValidator,
186
+ enabledKinds: v.array(entryKindValidator),
187
+ maxTitleLength: v.number(),
188
+ maxBodyLength: v.number(),
189
+ },
190
+ returns: v.string(),
191
+ handler: async (ctx, args) => {
192
+ assertActorId(args.actorId);
193
+ if (!args.enabledKinds.includes(args.kind)) {
194
+ throw new ConvexError(`Entry kind '${args.kind}' is disabled.`);
195
+ }
196
+ const title = normalizeRequiredText(args.title, "Title", args.maxTitleLength);
197
+ const body = normalizeRequiredText(args.body, "Body", args.maxBodyLength);
198
+ return await ctx.db.insert("entries", {
199
+ actorId: args.actorId,
200
+ kind: args.kind,
201
+ status: args.defaultStatus,
202
+ title,
203
+ body,
204
+ normalizedTitle: normalizeTitle(title),
205
+ searchText: `${title}\n${body}`,
206
+ upvoteCount: 0,
207
+ commentCount: 0,
208
+ });
209
+ },
210
+ });
211
+ export const update = mutation({
212
+ args: {
213
+ actor: actorValidator,
214
+ entryId: v.string(),
215
+ title: v.string(),
216
+ body: v.string(),
217
+ editableByAuthor: v.boolean(),
218
+ maxTitleLength: v.number(),
219
+ maxBodyLength: v.number(),
220
+ },
221
+ returns: v.null(),
222
+ handler: async (ctx, args) => {
223
+ assertActorId(args.actor.id);
224
+ const entryId = ctx.db.normalizeId("entries", args.entryId);
225
+ if (entryId === null)
226
+ throw new ConvexError("Entry not found.");
227
+ const entry = await ctx.db.get("entries", entryId);
228
+ if (entry === null)
229
+ throw new ConvexError("Entry not found.");
230
+ const canEdit = args.actor.isModerator ||
231
+ (args.editableByAuthor && entry.actorId === args.actor.id);
232
+ if (!canEdit)
233
+ throw new ConvexError("Not authorized to edit this entry.");
234
+ const title = normalizeRequiredText(args.title, "Title", args.maxTitleLength);
235
+ const body = normalizeRequiredText(args.body, "Body", args.maxBodyLength);
236
+ await ctx.db.patch("entries", entryId, {
237
+ title,
238
+ body,
239
+ normalizedTitle: normalizeTitle(title),
240
+ searchText: `${title}\n${body}`,
241
+ updatedAt: Date.now(),
242
+ });
243
+ return null;
244
+ },
245
+ });
246
+ export const setStatus = mutation({
247
+ args: {
248
+ actor: actorValidator,
249
+ entryId: v.string(),
250
+ status: entryStatusValidator,
251
+ },
252
+ returns: v.null(),
253
+ handler: async (ctx, args) => {
254
+ if (!args.actor.isModerator) {
255
+ throw new ConvexError("Moderator access is required to change status.");
256
+ }
257
+ const entryId = ctx.db.normalizeId("entries", args.entryId);
258
+ if (entryId === null || (await ctx.db.get("entries", entryId)) === null) {
259
+ throw new ConvexError("Entry not found.");
260
+ }
261
+ await ctx.db.patch("entries", entryId, {
262
+ status: args.status,
263
+ updatedAt: Date.now(),
264
+ });
265
+ return null;
266
+ },
267
+ });
268
+ export const setUpvote = mutation({
269
+ args: {
270
+ actorId: v.string(),
271
+ entryId: v.string(),
272
+ desiredState: v.boolean(),
273
+ },
274
+ returns: v.object({ active: v.boolean(), upvoteCount: v.number() }),
275
+ handler: async (ctx, args) => {
276
+ assertActorId(args.actorId);
277
+ const entryId = ctx.db.normalizeId("entries", args.entryId);
278
+ if (entryId === null)
279
+ throw new ConvexError("Entry not found.");
280
+ const entry = await ctx.db.get("entries", entryId);
281
+ if (entry === null)
282
+ throw new ConvexError("Entry not found.");
283
+ const existing = await ctx.db
284
+ .query("reactions")
285
+ .withIndex("by_entry_actor", (q) => q.eq("entryId", entryId).eq("actorId", args.actorId))
286
+ .unique();
287
+ if (args.desiredState && existing === null) {
288
+ await ctx.db.insert("reactions", { actorId: args.actorId, entryId });
289
+ const upvoteCount = entry.upvoteCount + 1;
290
+ await ctx.db.patch("entries", entryId, { upvoteCount });
291
+ return { active: true, upvoteCount };
292
+ }
293
+ if (!args.desiredState && existing !== null) {
294
+ await ctx.db.delete("reactions", existing._id);
295
+ const upvoteCount = Math.max(0, entry.upvoteCount - 1);
296
+ await ctx.db.patch("entries", entryId, { upvoteCount });
297
+ return { active: false, upvoteCount };
298
+ }
299
+ return { active: args.desiredState, upvoteCount: entry.upvoteCount };
300
+ },
301
+ });
302
+ //# sourceMappingURL=entries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entries.js","sourceRoot":"","sources":["../../src/component/entries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { DataModel } from "./_generated/dataModel.js";
2
+ import type { QueryCtx } from "./types.js";
3
+ import type { FeedbackComment, FeedbackEntry } from "./model.js";
4
+ export declare function normalizeTitle(value: string): string;
5
+ export declare function normalizeRequiredText(value: string, field: string, maximumLength: number): string;
6
+ export declare function assertPositiveInteger(value: number, field: string): void;
7
+ export declare function assertActorId(actorId: string): void;
8
+ export declare function serializeEntry(ctx: QueryCtx, entry: DataModel["entries"]["document"], viewerActorId: string | undefined): Promise<FeedbackEntry>;
9
+ export declare function serializeComment(ctx: QueryCtx, comment: DataModel["comments"]["document"], viewerActorId: string | undefined): Promise<FeedbackComment>;
10
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/component/helpers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEjE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,GACpB,MAAM,CAWR;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIxE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAInD;AAED,wBAAsB,cAAc,CAClC,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,EACvC,aAAa,EAAE,MAAM,GAAG,SAAS,GAChC,OAAO,CAAC,aAAa,CAAC,CAwBxB;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,QAAQ,EACb,OAAO,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,EAC1C,aAAa,EAAE,MAAM,GAAG,SAAS,GAChC,OAAO,CAAC,eAAe,CAAC,CA+B1B"}
@@ -0,0 +1,74 @@
1
+ import { ConvexError } from "convex/values";
2
+ export function normalizeTitle(value) {
3
+ return value.trim().replace(/\s+/g, " ").toLocaleLowerCase("en-US");
4
+ }
5
+ export function normalizeRequiredText(value, field, maximumLength) {
6
+ const normalized = value.trim();
7
+ if (normalized.length === 0) {
8
+ throw new ConvexError(`${field} is required.`);
9
+ }
10
+ if (normalized.length > maximumLength) {
11
+ throw new ConvexError(`${field} must be ${maximumLength} characters or fewer.`);
12
+ }
13
+ return normalized;
14
+ }
15
+ export function assertPositiveInteger(value, field) {
16
+ if (!Number.isInteger(value) || value <= 0) {
17
+ throw new ConvexError(`${field} must be a positive integer.`);
18
+ }
19
+ }
20
+ export function assertActorId(actorId) {
21
+ if (actorId.trim().length === 0) {
22
+ throw new ConvexError("Actor id must not be empty.");
23
+ }
24
+ }
25
+ export async function serializeEntry(ctx, entry, viewerActorId) {
26
+ const reaction = viewerActorId !== undefined
27
+ ? await ctx.db
28
+ .query("reactions")
29
+ .withIndex("by_entry_actor", (q) => q.eq("entryId", entry._id).eq("actorId", viewerActorId))
30
+ .unique()
31
+ : null;
32
+ return {
33
+ id: entry._id,
34
+ creationTime: entry._creationTime,
35
+ actorId: entry.actorId,
36
+ kind: entry.kind,
37
+ status: entry.status,
38
+ title: entry.title,
39
+ body: entry.body,
40
+ upvoteCount: entry.upvoteCount,
41
+ commentCount: entry.commentCount,
42
+ ...(entry.updatedAt === undefined ? {} : { updatedAt: entry.updatedAt }),
43
+ viewerHasUpvoted: reaction !== null,
44
+ };
45
+ }
46
+ export async function serializeComment(ctx, comment, viewerActorId) {
47
+ const reaction = viewerActorId !== undefined
48
+ ? await ctx.db
49
+ .query("reactions")
50
+ .withIndex("by_comment_actor", (q) => q.eq("commentId", comment._id).eq("actorId", viewerActorId))
51
+ .unique()
52
+ : null;
53
+ return {
54
+ id: comment._id,
55
+ creationTime: comment._creationTime,
56
+ entryId: comment.entryId,
57
+ ...(comment.parentCommentId === undefined
58
+ ? {}
59
+ : { parentCommentId: comment.parentCommentId }),
60
+ actorId: comment.actorId,
61
+ depth: comment.depth,
62
+ body: comment.deletedAt === undefined ? comment.body : null,
63
+ likeCount: comment.likeCount,
64
+ replyCount: comment.replyCount,
65
+ ...(comment.updatedAt === undefined
66
+ ? {}
67
+ : { updatedAt: comment.updatedAt }),
68
+ ...(comment.deletedAt === undefined
69
+ ? {}
70
+ : { deletedAt: comment.deletedAt }),
71
+ viewerHasLiked: reaction !== null,
72
+ };
73
+ }
74
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/component/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,176 @@
1
+ import type { Infer } from "convex/values";
2
+ export declare const entryKindValidator: import("convex/values").VUnion<"feedback" | "feature_request" | "bug_report", [import("convex/values").VLiteral<"feedback", "required">, import("convex/values").VLiteral<"feature_request", "required">, import("convex/values").VLiteral<"bug_report", "required">], "required", never>;
3
+ export declare const entryStatusValidator: import("convex/values").VUnion<"open" | "under_review" | "planned" | "in_progress" | "completed" | "closed", [import("convex/values").VLiteral<"open", "required">, import("convex/values").VLiteral<"under_review", "required">, import("convex/values").VLiteral<"planned", "required">, import("convex/values").VLiteral<"in_progress", "required">, import("convex/values").VLiteral<"completed", "required">, import("convex/values").VLiteral<"closed", "required">], "required", never>;
4
+ export declare const entrySortValidator: import("convex/values").VUnion<"top" | "newest", [import("convex/values").VLiteral<"top", "required">, import("convex/values").VLiteral<"newest", "required">], "required", never>;
5
+ export declare const commentSortValidator: import("convex/values").VUnion<"top" | "newest" | "oldest", [import("convex/values").VLiteral<"top", "required">, import("convex/values").VLiteral<"newest", "required">, import("convex/values").VLiteral<"oldest", "required">], "required", never>;
6
+ export declare const actorValidator: import("convex/values").VObject<{
7
+ id: string;
8
+ isModerator: boolean;
9
+ }, {
10
+ id: import("convex/values").VString<string, "required">;
11
+ isModerator: import("convex/values").VBoolean<boolean, "required">;
12
+ }, "required", "id" | "isModerator">;
13
+ export declare const publicEntryValidator: import("convex/values").VObject<{
14
+ updatedAt?: number | undefined;
15
+ id: string;
16
+ creationTime: number;
17
+ actorId: string;
18
+ kind: "feedback" | "feature_request" | "bug_report";
19
+ status: "open" | "under_review" | "planned" | "in_progress" | "completed" | "closed";
20
+ title: string;
21
+ body: string;
22
+ upvoteCount: number;
23
+ commentCount: number;
24
+ viewerHasUpvoted: boolean;
25
+ }, {
26
+ id: import("convex/values").VString<string, "required">;
27
+ creationTime: import("convex/values").VFloat64<number, "required">;
28
+ actorId: import("convex/values").VString<string, "required">;
29
+ kind: import("convex/values").VUnion<"feedback" | "feature_request" | "bug_report", [import("convex/values").VLiteral<"feedback", "required">, import("convex/values").VLiteral<"feature_request", "required">, import("convex/values").VLiteral<"bug_report", "required">], "required", never>;
30
+ status: import("convex/values").VUnion<"open" | "under_review" | "planned" | "in_progress" | "completed" | "closed", [import("convex/values").VLiteral<"open", "required">, import("convex/values").VLiteral<"under_review", "required">, import("convex/values").VLiteral<"planned", "required">, import("convex/values").VLiteral<"in_progress", "required">, import("convex/values").VLiteral<"completed", "required">, import("convex/values").VLiteral<"closed", "required">], "required", never>;
31
+ title: import("convex/values").VString<string, "required">;
32
+ body: import("convex/values").VString<string, "required">;
33
+ upvoteCount: import("convex/values").VFloat64<number, "required">;
34
+ commentCount: import("convex/values").VFloat64<number, "required">;
35
+ updatedAt: import("convex/values").VFloat64<number | undefined, "optional">;
36
+ viewerHasUpvoted: import("convex/values").VBoolean<boolean, "required">;
37
+ }, "required", "id" | "creationTime" | "actorId" | "kind" | "status" | "title" | "body" | "upvoteCount" | "commentCount" | "updatedAt" | "viewerHasUpvoted">;
38
+ export declare const publicCommentValidator: import("convex/values").VObject<{
39
+ updatedAt?: number | undefined;
40
+ parentCommentId?: string | undefined;
41
+ deletedAt?: number | undefined;
42
+ id: string;
43
+ creationTime: number;
44
+ actorId: string;
45
+ body: string | null;
46
+ entryId: string;
47
+ depth: number;
48
+ likeCount: number;
49
+ replyCount: number;
50
+ viewerHasLiked: boolean;
51
+ }, {
52
+ id: import("convex/values").VString<string, "required">;
53
+ creationTime: import("convex/values").VFloat64<number, "required">;
54
+ entryId: import("convex/values").VString<string, "required">;
55
+ parentCommentId: import("convex/values").VString<string | undefined, "optional">;
56
+ actorId: import("convex/values").VString<string, "required">;
57
+ depth: import("convex/values").VFloat64<number, "required">;
58
+ body: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
59
+ likeCount: import("convex/values").VFloat64<number, "required">;
60
+ replyCount: import("convex/values").VFloat64<number, "required">;
61
+ updatedAt: import("convex/values").VFloat64<number | undefined, "optional">;
62
+ deletedAt: import("convex/values").VFloat64<number | undefined, "optional">;
63
+ viewerHasLiked: import("convex/values").VBoolean<boolean, "required">;
64
+ }, "required", "id" | "creationTime" | "actorId" | "body" | "updatedAt" | "entryId" | "parentCommentId" | "depth" | "likeCount" | "replyCount" | "deletedAt" | "viewerHasLiked">;
65
+ export declare const similarEntriesValidator: import("convex/values").VObject<{
66
+ exact: {
67
+ updatedAt?: number | undefined;
68
+ id: string;
69
+ creationTime: number;
70
+ actorId: string;
71
+ kind: "feedback" | "feature_request" | "bug_report";
72
+ status: "open" | "under_review" | "planned" | "in_progress" | "completed" | "closed";
73
+ title: string;
74
+ body: string;
75
+ upvoteCount: number;
76
+ commentCount: number;
77
+ viewerHasUpvoted: boolean;
78
+ }[];
79
+ similar: {
80
+ updatedAt?: number | undefined;
81
+ id: string;
82
+ creationTime: number;
83
+ actorId: string;
84
+ kind: "feedback" | "feature_request" | "bug_report";
85
+ status: "open" | "under_review" | "planned" | "in_progress" | "completed" | "closed";
86
+ title: string;
87
+ body: string;
88
+ upvoteCount: number;
89
+ commentCount: number;
90
+ viewerHasUpvoted: boolean;
91
+ }[];
92
+ }, {
93
+ exact: import("convex/values").VArray<{
94
+ updatedAt?: number | undefined;
95
+ id: string;
96
+ creationTime: number;
97
+ actorId: string;
98
+ kind: "feedback" | "feature_request" | "bug_report";
99
+ status: "open" | "under_review" | "planned" | "in_progress" | "completed" | "closed";
100
+ title: string;
101
+ body: string;
102
+ upvoteCount: number;
103
+ commentCount: number;
104
+ viewerHasUpvoted: boolean;
105
+ }[], import("convex/values").VObject<{
106
+ updatedAt?: number | undefined;
107
+ id: string;
108
+ creationTime: number;
109
+ actorId: string;
110
+ kind: "feedback" | "feature_request" | "bug_report";
111
+ status: "open" | "under_review" | "planned" | "in_progress" | "completed" | "closed";
112
+ title: string;
113
+ body: string;
114
+ upvoteCount: number;
115
+ commentCount: number;
116
+ viewerHasUpvoted: boolean;
117
+ }, {
118
+ id: import("convex/values").VString<string, "required">;
119
+ creationTime: import("convex/values").VFloat64<number, "required">;
120
+ actorId: import("convex/values").VString<string, "required">;
121
+ kind: import("convex/values").VUnion<"feedback" | "feature_request" | "bug_report", [import("convex/values").VLiteral<"feedback", "required">, import("convex/values").VLiteral<"feature_request", "required">, import("convex/values").VLiteral<"bug_report", "required">], "required", never>;
122
+ status: import("convex/values").VUnion<"open" | "under_review" | "planned" | "in_progress" | "completed" | "closed", [import("convex/values").VLiteral<"open", "required">, import("convex/values").VLiteral<"under_review", "required">, import("convex/values").VLiteral<"planned", "required">, import("convex/values").VLiteral<"in_progress", "required">, import("convex/values").VLiteral<"completed", "required">, import("convex/values").VLiteral<"closed", "required">], "required", never>;
123
+ title: import("convex/values").VString<string, "required">;
124
+ body: import("convex/values").VString<string, "required">;
125
+ upvoteCount: import("convex/values").VFloat64<number, "required">;
126
+ commentCount: import("convex/values").VFloat64<number, "required">;
127
+ updatedAt: import("convex/values").VFloat64<number | undefined, "optional">;
128
+ viewerHasUpvoted: import("convex/values").VBoolean<boolean, "required">;
129
+ }, "required", "id" | "creationTime" | "actorId" | "kind" | "status" | "title" | "body" | "upvoteCount" | "commentCount" | "updatedAt" | "viewerHasUpvoted">, "required">;
130
+ similar: import("convex/values").VArray<{
131
+ updatedAt?: number | undefined;
132
+ id: string;
133
+ creationTime: number;
134
+ actorId: string;
135
+ kind: "feedback" | "feature_request" | "bug_report";
136
+ status: "open" | "under_review" | "planned" | "in_progress" | "completed" | "closed";
137
+ title: string;
138
+ body: string;
139
+ upvoteCount: number;
140
+ commentCount: number;
141
+ viewerHasUpvoted: boolean;
142
+ }[], import("convex/values").VObject<{
143
+ updatedAt?: number | undefined;
144
+ id: string;
145
+ creationTime: number;
146
+ actorId: string;
147
+ kind: "feedback" | "feature_request" | "bug_report";
148
+ status: "open" | "under_review" | "planned" | "in_progress" | "completed" | "closed";
149
+ title: string;
150
+ body: string;
151
+ upvoteCount: number;
152
+ commentCount: number;
153
+ viewerHasUpvoted: boolean;
154
+ }, {
155
+ id: import("convex/values").VString<string, "required">;
156
+ creationTime: import("convex/values").VFloat64<number, "required">;
157
+ actorId: import("convex/values").VString<string, "required">;
158
+ kind: import("convex/values").VUnion<"feedback" | "feature_request" | "bug_report", [import("convex/values").VLiteral<"feedback", "required">, import("convex/values").VLiteral<"feature_request", "required">, import("convex/values").VLiteral<"bug_report", "required">], "required", never>;
159
+ status: import("convex/values").VUnion<"open" | "under_review" | "planned" | "in_progress" | "completed" | "closed", [import("convex/values").VLiteral<"open", "required">, import("convex/values").VLiteral<"under_review", "required">, import("convex/values").VLiteral<"planned", "required">, import("convex/values").VLiteral<"in_progress", "required">, import("convex/values").VLiteral<"completed", "required">, import("convex/values").VLiteral<"closed", "required">], "required", never>;
160
+ title: import("convex/values").VString<string, "required">;
161
+ body: import("convex/values").VString<string, "required">;
162
+ upvoteCount: import("convex/values").VFloat64<number, "required">;
163
+ commentCount: import("convex/values").VFloat64<number, "required">;
164
+ updatedAt: import("convex/values").VFloat64<number | undefined, "optional">;
165
+ viewerHasUpvoted: import("convex/values").VBoolean<boolean, "required">;
166
+ }, "required", "id" | "creationTime" | "actorId" | "kind" | "status" | "title" | "body" | "upvoteCount" | "commentCount" | "updatedAt" | "viewerHasUpvoted">, "required">;
167
+ }, "required", "exact" | "similar">;
168
+ export type EntryKind = Infer<typeof entryKindValidator>;
169
+ export type EntryStatus = Infer<typeof entryStatusValidator>;
170
+ export type EntrySort = Infer<typeof entrySortValidator>;
171
+ export type CommentSort = Infer<typeof commentSortValidator>;
172
+ export type FeedbackActor = Infer<typeof actorValidator>;
173
+ export type FeedbackEntry = Infer<typeof publicEntryValidator>;
174
+ export type FeedbackComment = Infer<typeof publicCommentValidator>;
175
+ export type SimilarEntriesResult = Infer<typeof similarEntriesValidator>;
176
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/component/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAG3C,eAAO,MAAM,kBAAkB,2RAI9B,CAAC;AAEF,eAAO,MAAM,oBAAoB,geAOhC,CAAC;AAEF,eAAO,MAAM,kBAAkB,oLAG9B,CAAC;AAEF,eAAO,MAAM,oBAAoB,uPAIhC,CAAC;AAEF,eAAO,MAAM,cAAc;;;;;;oCAGzB,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;4JAY/B,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;gLAajC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCAGlC,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AACzD,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAC7D,MAAM,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AACzD,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAC7D,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACzD,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAC/D,MAAM,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACnE,MAAM,MAAM,oBAAoB,GAAG,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC"}