convex-feedback 0.1.5 → 0.2.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +70 -27
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/client/api.d.ts +76 -1
  4. package/dist/client/api.d.ts.map +1 -1
  5. package/dist/client/config.d.ts +1 -1
  6. package/dist/client/index.d.ts +9 -5
  7. package/dist/client/index.d.ts.map +1 -1
  8. package/dist/client/index.js +253 -8
  9. package/dist/client/index.js.map +1 -1
  10. package/dist/component/_generated/api.d.ts +4 -0
  11. package/dist/component/_generated/api.d.ts.map +1 -1
  12. package/dist/component/_generated/api.js.map +1 -1
  13. package/dist/component/_generated/component.d.ts +293 -5
  14. package/dist/component/_generated/component.d.ts.map +1 -1
  15. package/dist/component/admin.d.ts +130 -0
  16. package/dist/component/admin.d.ts.map +1 -0
  17. package/dist/component/admin.js +125 -0
  18. package/dist/component/admin.js.map +1 -0
  19. package/dist/component/comments.d.ts +7 -5
  20. package/dist/component/comments.d.ts.map +1 -1
  21. package/dist/component/comments.js +3 -3
  22. package/dist/component/comments.js.map +1 -1
  23. package/dist/component/entries.d.ts +29 -18
  24. package/dist/component/entries.d.ts.map +1 -1
  25. package/dist/component/entries.js +27 -6
  26. package/dist/component/entries.js.map +1 -1
  27. package/dist/component/helpers.d.ts +3 -1
  28. package/dist/component/helpers.d.ts.map +1 -1
  29. package/dist/component/helpers.js +28 -0
  30. package/dist/component/helpers.js.map +1 -1
  31. package/dist/component/model.d.ts +140 -24
  32. package/dist/component/model.d.ts.map +1 -1
  33. package/dist/component/model.js +30 -1
  34. package/dist/component/model.js.map +1 -1
  35. package/dist/component/roadmap.d.ts +166 -0
  36. package/dist/component/roadmap.d.ts.map +1 -0
  37. package/dist/component/roadmap.js +534 -0
  38. package/dist/component/roadmap.js.map +1 -0
  39. package/dist/component/schema.d.ts +61 -5
  40. package/dist/component/schema.d.ts.map +1 -1
  41. package/dist/component/schema.js +48 -2
  42. package/dist/component/schema.js.map +1 -1
  43. package/dist/react/index.d.ts +169 -12
  44. package/dist/react/index.d.ts.map +1 -1
  45. package/dist/react/index.js +72 -1
  46. package/dist/react/index.js.map +1 -1
  47. package/dist/test.d.ts +61 -5
  48. package/dist/test.d.ts.map +1 -1
  49. package/package.json +3 -2
  50. package/src/client/README.md +1 -1
  51. package/src/client/api.ts +176 -0
  52. package/src/client/config.ts +1 -1
  53. package/src/client/index.ts +330 -13
  54. package/src/component/README.md +1 -1
  55. package/src/component/_generated/api.ts +4 -0
  56. package/src/component/_generated/component.ts +371 -9
  57. package/src/component/admin.ts +180 -0
  58. package/src/component/comments.ts +3 -2
  59. package/src/component/entries.ts +29 -5
  60. package/src/component/helpers.ts +44 -1
  61. package/src/component/model.ts +65 -4
  62. package/src/component/roadmap.ts +627 -0
  63. package/src/component/schema.ts +51 -1
  64. package/src/react/README.md +2 -2
  65. package/src/react/index.ts +139 -4
package/dist/test.d.ts CHANGED
@@ -13,11 +13,13 @@ declare const _default: {
13
13
  standard?: Record<string, string | number | boolean> | undefined;
14
14
  additional?: Record<string, string | number | boolean> | undefined;
15
15
  } | undefined;
16
+ priority?: "low" | "medium" | "high" | undefined;
16
17
  statusFilter?: "open" | "closed" | undefined;
18
+ roadmapId?: import("convex/values").GenericId<"roadmap"> | undefined;
19
+ title: string;
20
+ status: "open" | "under_review" | "planned" | "in_progress" | "completed" | "closed";
17
21
  actorId: string;
18
22
  kind: "feedback" | "feature_request" | "bug_report";
19
- status: "open" | "under_review" | "planned" | "in_progress" | "completed" | "closed";
20
- title: string;
21
23
  body: string;
22
24
  upvoteCount: number;
23
25
  commentCount: number;
@@ -42,7 +44,9 @@ declare const _default: {
42
44
  standard: import("convex/values").VRecord<Record<string, string | number | boolean> | undefined, import("convex/values").VString<string, "required">, import("convex/values").VUnion<string | number | boolean, [import("convex/values").VString<string, "required">, import("convex/values").VFloat64<number, "required">, import("convex/values").VBoolean<boolean, "required">], "required", never>, "optional", string>;
43
45
  additional: import("convex/values").VRecord<Record<string, string | number | boolean> | undefined, import("convex/values").VString<string, "required">, import("convex/values").VUnion<string | number | boolean, [import("convex/values").VString<string, "required">, import("convex/values").VFloat64<number, "required">, import("convex/values").VBoolean<boolean, "required">], "required", never>, "optional", string>;
44
46
  }, "optional", "standard" | "additional" | `standard.${string}` | `additional.${string}`>;
45
- }, "required", "actorId" | "kind" | "status" | "title" | "body" | "upvoteCount" | "commentCount" | "updatedAt" | "metadata" | "metadata.standard" | "metadata.additional" | `metadata.standard.${string}` | `metadata.additional.${string}` | "statusFilter" | "normalizedTitle" | "searchText">, {
47
+ priority: import("convex/values").VUnion<"low" | "medium" | "high" | undefined, [import("convex/values").VLiteral<"low", "required">, import("convex/values").VLiteral<"medium", "required">, import("convex/values").VLiteral<"high", "required">], "optional", never>;
48
+ roadmapId: import("convex/values").VId<import("convex/values").GenericId<"roadmap"> | undefined, "optional">;
49
+ }, "required", "title" | "status" | "updatedAt" | "actorId" | "kind" | "body" | "upvoteCount" | "commentCount" | "metadata" | "metadata.standard" | "metadata.additional" | `metadata.standard.${string}` | `metadata.additional.${string}` | "priority" | "statusFilter" | "normalizedTitle" | "searchText" | "roadmapId">, {
46
50
  by_kind: ["kind", "_creationTime"];
47
51
  by_status: ["status", "_creationTime"];
48
52
  by_kind_status: ["kind", "status", "_creationTime"];
@@ -56,12 +60,64 @@ declare const _default: {
56
60
  by_kind_status_filter_upvotes: ["kind", "statusFilter", "upvoteCount", "_creationTime"];
57
61
  by_normalized_title: ["normalizedTitle", "_creationTime"];
58
62
  by_kind_normalized_title: ["kind", "normalizedTitle", "_creationTime"];
63
+ by_priority: ["priority", "_creationTime"];
64
+ by_roadmap_id: ["roadmapId", "_creationTime"];
59
65
  }, {
60
66
  search: {
61
67
  searchField: "searchText";
62
- filterFields: "kind" | "status" | "statusFilter";
68
+ filterFields: "status" | "kind" | "priority" | "statusFilter";
63
69
  };
64
70
  }, {}>;
71
+ roadmap: import("convex/server").TableDefinition<import("convex/values").VObject<{
72
+ description?: string | undefined;
73
+ deletingAt?: number | undefined;
74
+ rebalanceId?: string | undefined;
75
+ rebalanceRank?: number | undefined;
76
+ rebalancePosition?: number | undefined;
77
+ title: string;
78
+ status: "planned" | "in_progress" | "shipped";
79
+ position: number;
80
+ createdAt: number;
81
+ updatedAt: number;
82
+ feedbackCount: number;
83
+ }, {
84
+ title: import("convex/values").VString<string, "required">;
85
+ description: import("convex/values").VString<string | undefined, "optional">;
86
+ status: import("convex/values").VUnion<"planned" | "in_progress" | "shipped", [import("convex/values").VLiteral<"planned", "required">, import("convex/values").VLiteral<"in_progress", "required">, import("convex/values").VLiteral<"shipped", "required">], "required", never>;
87
+ position: import("convex/values").VFloat64<number, "required">;
88
+ feedbackCount: import("convex/values").VFloat64<number, "required">;
89
+ createdAt: import("convex/values").VFloat64<number, "required">;
90
+ updatedAt: import("convex/values").VFloat64<number, "required">;
91
+ deletingAt: import("convex/values").VFloat64<number | undefined, "optional">;
92
+ rebalanceId: import("convex/values").VString<string | undefined, "optional">;
93
+ rebalanceRank: import("convex/values").VFloat64<number | undefined, "optional">;
94
+ rebalancePosition: import("convex/values").VFloat64<number | undefined, "optional">;
95
+ }, "required", "title" | "description" | "status" | "position" | "createdAt" | "updatedAt" | "feedbackCount" | "deletingAt" | "rebalanceId" | "rebalanceRank" | "rebalancePosition">, {
96
+ by_status_and_position: ["status", "position", "_creationTime"];
97
+ by_status_deleting_at_position: ["status", "deletingAt", "position", "_creationTime"];
98
+ by_deleting_at_and_position: ["deletingAt", "position", "_creationTime"];
99
+ by_status_rebalance_rank: ["status", "rebalanceId", "rebalanceRank", "_creationTime"];
100
+ by_status_deleting_at_rebalance_id_position: ["status", "deletingAt", "rebalanceId", "rebalancePosition", "_creationTime"];
101
+ by_position: ["position", "_creationTime"];
102
+ }, {
103
+ search_title: {
104
+ searchField: "title";
105
+ filterFields: "status" | "deletingAt";
106
+ };
107
+ }, {}>;
108
+ roadmapRebalances: import("convex/server").TableDefinition<import("convex/values").VObject<{
109
+ visibleGeneration?: string | undefined;
110
+ activeGeneration?: string | undefined;
111
+ status: "planned" | "in_progress" | "shipped";
112
+ nextGeneration: number;
113
+ }, {
114
+ status: import("convex/values").VUnion<"planned" | "in_progress" | "shipped", [import("convex/values").VLiteral<"planned", "required">, import("convex/values").VLiteral<"in_progress", "required">, import("convex/values").VLiteral<"shipped", "required">], "required", never>;
115
+ nextGeneration: import("convex/values").VFloat64<number, "required">;
116
+ visibleGeneration: import("convex/values").VString<string | undefined, "optional">;
117
+ activeGeneration: import("convex/values").VString<string | undefined, "optional">;
118
+ }, "required", "status" | "nextGeneration" | "visibleGeneration" | "activeGeneration">, {
119
+ by_status: ["status", "_creationTime"];
120
+ }, {}, {}>;
65
121
  comments: import("convex/server").TableDefinition<import("convex/values").VObject<{
66
122
  updatedAt?: number | undefined;
67
123
  parentCommentId?: import("convex/values").GenericId<"comments"> | undefined;
@@ -82,7 +138,7 @@ declare const _default: {
82
138
  replyCount: import("convex/values").VFloat64<number, "required">;
83
139
  updatedAt: import("convex/values").VFloat64<number | undefined, "optional">;
84
140
  deletedAt: import("convex/values").VFloat64<number | undefined, "optional">;
85
- }, "required", "actorId" | "body" | "updatedAt" | "entryId" | "parentCommentId" | "depth" | "likeCount" | "replyCount" | "deletedAt">, {
141
+ }, "required", "updatedAt" | "actorId" | "body" | "entryId" | "parentCommentId" | "depth" | "likeCount" | "replyCount" | "deletedAt">, {
86
142
  by_entry_parent: ["entryId", "parentCommentId", "_creationTime"];
87
143
  by_entry_parent_likes: ["entryId", "parentCommentId", "likeCount", "_creationTime"];
88
144
  }, {}, {}>;
@@ -1 +1 @@
1
- {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAErE,OAAO,MAAM,MAAM,uBAAuB,CAAC;AAE3C,QAAA,MAAM,OAAO,wCAA0C,CAAC;AAExD,wBAAgB,QAAQ,CACtB,IAAI,EAAE,UAAU,CAAC,gBAAgB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,EAC1D,IAAI,SAAa,GAChB,IAAI,CAEN;AAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAC3B,wBAA6C"}
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAErE,OAAO,MAAM,MAAM,uBAAuB,CAAC;AAE3C,QAAA,MAAM,OAAO,wCAA0C,CAAC;AAExD,wBAAgB,QAAQ,CACtB,IAAI,EAAE,UAAU,CAAC,gBAAgB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,EAC1D,IAAI,SAAa,GAChB,IAAI,CAEN;AAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAC3B,wBAA6C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "convex-feedback",
3
- "version": "0.1.5",
3
+ "version": "0.2.0-beta.1",
4
4
  "description": "Type-safe Convex component for feedback, feature requests, bug reports, voting, comments, and duplicate search.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -41,7 +41,8 @@
41
41
  },
42
42
  "scripts": {
43
43
  "codegen": "npx convex codegen --component-dir ./src/component",
44
- "build": "tsc -p tsconfig.build.json",
44
+ "clean": "node scripts/clean-dist.js",
45
+ "build": "npm run clean && tsc -p tsconfig.build.json",
45
46
  "build:codegen": "npm run codegen && npm run build",
46
47
  "typecheck": "tsc --noEmit -p tsconfig.json",
47
48
  "lint": "eslint src test",
@@ -3,7 +3,7 @@
3
3
  This layer is the supported server-side integration boundary between a host Convex app and the component.
4
4
 
5
5
  - Construct the client with `createFeedback(...)` and the generated component reference.
6
- - Resolve authentication and moderation in the host app. Components do not own host authentication.
6
+ - Resolve authentication and admin authorization in the host app. Components do not own host authentication.
7
7
  - Keep `actor.id` stable. It is the identity used for authorship, entry upvotes, and comment likes.
8
8
  - Configuration is static code configuration; there is no configuration table.
9
9
  - Call the returned methods from host queries/mutations instead of exposing component internals directly.
package/src/client/api.ts CHANGED
@@ -13,6 +13,10 @@ import type {
13
13
  FeedbackComment,
14
14
  FeedbackEntry,
15
15
  FeedbackMetadata,
16
+ AdminFeedbackEntry,
17
+ EntryPriority,
18
+ RoadmapItem,
19
+ RoadmapStatus,
16
20
  SimilarEntriesResult,
17
21
  } from "../component/model.js";
18
22
 
@@ -172,6 +176,60 @@ export type SetEntryStatusArgs = {
172
176
  status: EntryStatus;
173
177
  };
174
178
 
179
+ export type AdminListEntriesArgs = {
180
+ /** Convex cursor-pagination options. */
181
+ paginationOpts: PaginationOptions;
182
+ kinds?: EntryKind[];
183
+ status?: EntryStatus;
184
+ priority?: EntryPriority;
185
+ };
186
+
187
+ export type AdminSearchEntriesArgs = AdminListEntriesArgs & {
188
+ searchQuery: string;
189
+ };
190
+
191
+ export type SetEntryPriorityArgs = {
192
+ entryId: string;
193
+ priority: EntryPriority | null;
194
+ };
195
+
196
+ export type ListRoadmapArgs = {
197
+ /** Convex cursor-pagination options. */
198
+ paginationOpts: PaginationOptions;
199
+ status?: RoadmapStatus;
200
+ };
201
+ export type SearchRoadmapArgs = { searchQuery: string; limit?: number };
202
+ export type CreateRoadmapArgs = {
203
+ title: string;
204
+ description?: string;
205
+ status: RoadmapStatus;
206
+ };
207
+ export type CreateRoadmapForEntryArgs = CreateRoadmapArgs & {
208
+ entryId: string;
209
+ };
210
+ export type UpdateRoadmapArgs = {
211
+ roadmapId: string;
212
+ title: string;
213
+ description?: string;
214
+ };
215
+ export type DeleteRoadmapArgs = { roadmapId: string };
216
+ export type MoveRoadmapArgs = {
217
+ roadmapId: string;
218
+ status: RoadmapStatus;
219
+ previousItemId?: string;
220
+ nextItemId?: string;
221
+ };
222
+ export type AttachFeedbackToRoadmapArgs = {
223
+ roadmapId: string;
224
+ entryId: string;
225
+ };
226
+ export type DetachFeedbackFromRoadmapArgs = { entryId: string };
227
+ export type ListRoadmapFeedbackArgs = {
228
+ /** Convex cursor-pagination options. */
229
+ paginationOpts: PaginationOptions;
230
+ roadmapId: string;
231
+ };
232
+
175
233
  /**
176
234
  * Arguments for setting the current actor's entry-upvote state.
177
235
  */
@@ -308,6 +366,24 @@ export interface FeedbackPublicApi<
308
366
  Name extends string | undefined = string | undefined,
309
367
  RateLimitResult = never,
310
368
  > {
369
+ /** Returns whether the host actor has admin permissions. */
370
+ isAdmin: FunctionReference<
371
+ "query",
372
+ "public",
373
+ Record<string, never>,
374
+ boolean,
375
+ Name
376
+ >;
377
+
378
+ /** Returns whether the current request has an authenticated host actor. */
379
+ isAuthenticated: FunctionReference<
380
+ "query",
381
+ "public",
382
+ Record<string, never>,
383
+ boolean,
384
+ Name
385
+ >;
386
+
311
387
  /** Returns a cursor-paginated entry list. */
312
388
  listEntries: FunctionReference<
313
389
  "query",
@@ -371,6 +447,106 @@ export interface FeedbackPublicApi<
371
447
  Name
372
448
  >;
373
449
 
450
+ adminListEntries: FunctionReference<
451
+ "query",
452
+ "public",
453
+ AdminListEntriesArgs,
454
+ PaginationResult<AdminFeedbackEntry>,
455
+ Name
456
+ >;
457
+ adminGetEntry: FunctionReference<
458
+ "query",
459
+ "public",
460
+ GetEntryArgs,
461
+ AdminFeedbackEntry | null,
462
+ Name
463
+ >;
464
+ adminSearchEntries: FunctionReference<
465
+ "query",
466
+ "public",
467
+ AdminSearchEntriesArgs,
468
+ PaginationResult<AdminFeedbackEntry>,
469
+ Name
470
+ >;
471
+ setEntryPriority: FunctionReference<
472
+ "mutation",
473
+ "public",
474
+ SetEntryPriorityArgs,
475
+ null | RateLimitResult,
476
+ Name
477
+ >;
478
+
479
+ listRoadmap: FunctionReference<
480
+ "query",
481
+ "public",
482
+ ListRoadmapArgs,
483
+ PaginationResult<RoadmapItem>,
484
+ Name
485
+ >;
486
+ searchRoadmap: FunctionReference<
487
+ "query",
488
+ "public",
489
+ SearchRoadmapArgs,
490
+ RoadmapItem[],
491
+ Name
492
+ >;
493
+ createRoadmap: FunctionReference<
494
+ "mutation",
495
+ "public",
496
+ CreateRoadmapArgs,
497
+ string | RateLimitResult,
498
+ Name
499
+ >;
500
+ createRoadmapForEntry: FunctionReference<
501
+ "mutation",
502
+ "public",
503
+ CreateRoadmapForEntryArgs,
504
+ string | RateLimitResult,
505
+ Name
506
+ >;
507
+ updateRoadmap: FunctionReference<
508
+ "mutation",
509
+ "public",
510
+ UpdateRoadmapArgs,
511
+ null | RateLimitResult,
512
+ Name
513
+ >;
514
+ deleteRoadmap: FunctionReference<
515
+ "mutation",
516
+ "public",
517
+ DeleteRoadmapArgs,
518
+ null | RateLimitResult,
519
+ Name
520
+ >;
521
+ moveRoadmapItem: FunctionReference<
522
+ "mutation",
523
+ "public",
524
+ MoveRoadmapArgs,
525
+ number | RateLimitResult,
526
+ Name
527
+ >;
528
+ attachFeedbackToRoadmap: FunctionReference<
529
+ "mutation",
530
+ "public",
531
+ AttachFeedbackToRoadmapArgs,
532
+ null | RateLimitResult,
533
+ Name
534
+ >;
535
+ detachFeedbackFromRoadmap: FunctionReference<
536
+ "mutation",
537
+ "public",
538
+ DetachFeedbackFromRoadmapArgs,
539
+ null | RateLimitResult,
540
+ Name
541
+ >;
542
+ listRoadmapFeedback: FunctionReference<
543
+ "query",
544
+ "public",
545
+ ListRoadmapFeedbackArgs,
546
+ PaginationResult<FeedbackEntry>,
547
+ Name
548
+ >;
549
+
374
550
  /** Sets entry-upvote state, or returns a configured rate-limit rejection. */
375
551
  setEntryUpvote: FunctionReference<
376
552
  "mutation",
@@ -42,7 +42,7 @@ export interface FeedbackEntriesConfig {
42
42
  /**
43
43
  * Whether entry authors may edit their own title and body.
44
44
  *
45
- * Moderators are governed separately by the resolved actor permissions.
45
+ * Admins are governed separately by the resolved actor permissions.
46
46
  *
47
47
  * @default true
48
48
  */