@commonpub/server 2.14.0 → 2.16.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 (38) hide show
  1. package/README.md +9 -5
  2. package/dist/federation/federation.d.ts.map +1 -1
  3. package/dist/federation/federation.js +4 -0
  4. package/dist/federation/federation.js.map +1 -1
  5. package/dist/federation/hubFederation.d.ts.map +1 -1
  6. package/dist/federation/hubFederation.js +29 -1
  7. package/dist/federation/hubFederation.js.map +1 -1
  8. package/dist/federation/hubMirroring.d.ts +15 -2
  9. package/dist/federation/hubMirroring.d.ts.map +1 -1
  10. package/dist/federation/hubMirroring.js +60 -5
  11. package/dist/federation/hubMirroring.js.map +1 -1
  12. package/dist/federation/inboxHandlers.d.ts.map +1 -1
  13. package/dist/federation/inboxHandlers.js +13 -4
  14. package/dist/federation/inboxHandlers.js.map +1 -1
  15. package/dist/federation/index.d.ts +1 -1
  16. package/dist/federation/index.d.ts.map +1 -1
  17. package/dist/federation/index.js +1 -1
  18. package/dist/federation/index.js.map +1 -1
  19. package/dist/federation/messaging.d.ts.map +1 -1
  20. package/dist/federation/messaging.js +1 -0
  21. package/dist/federation/messaging.js.map +1 -1
  22. package/dist/index.d.ts +2 -2
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +2 -2
  25. package/dist/index.js.map +1 -1
  26. package/dist/messaging/messaging.d.ts +2 -1
  27. package/dist/messaging/messaging.d.ts.map +1 -1
  28. package/dist/messaging/messaging.js +56 -27
  29. package/dist/messaging/messaging.js.map +1 -1
  30. package/dist/notification/index.d.ts +1 -1
  31. package/dist/notification/index.d.ts.map +1 -1
  32. package/dist/notification/index.js +1 -1
  33. package/dist/notification/index.js.map +1 -1
  34. package/dist/notification/notification.d.ts +20 -0
  35. package/dist/notification/notification.d.ts.map +1 -1
  36. package/dist/notification/notification.js +58 -1
  37. package/dist/notification/notification.js.map +1 -1
  38. package/package.json +6 -6
@@ -1,5 +1,12 @@
1
1
  import { eq, and, desc, sql, isNull, inArray } from 'drizzle-orm';
2
2
  import { conversations, messages, users } from '@commonpub/schema';
3
+ /** Truncate a string at a Unicode-safe boundary (never splits surrogate pairs or grapheme clusters). */
4
+ function truncateUnicode(str, maxChars) {
5
+ const chars = [...str];
6
+ if (chars.length <= maxChars)
7
+ return str;
8
+ return chars.slice(0, maxChars).join('') + '...';
9
+ }
3
10
  export async function listConversations(db, userId, opts = {}) {
4
11
  const limit = Math.min(opts.limit ?? 50, 100);
5
12
  const offset = opts.offset ?? 0;
@@ -73,18 +80,20 @@ export async function createConversation(db, participants) {
73
80
  createdAt: row.createdAt,
74
81
  };
75
82
  }
76
- /** Find an existing conversation with exactly the given participants, or create one. */
83
+ /** Find an existing conversation with exactly the given participants, or create one.
84
+ * Uses a transaction with retry to prevent duplicate conversations from concurrent requests. */
77
85
  export async function findOrCreateConversation(db, participants) {
78
86
  // Sort for deterministic matching
79
87
  const sorted = [...participants].sort();
80
- // Find a conversation that contains all participants and has the same count.
81
- // jsonb @> checks containment; we also verify the array length matches to get exact match.
82
- const existing = await db
83
- .select()
84
- .from(conversations)
85
- .where(and(sql `${conversations.participants} @> ${JSON.stringify(sorted)}::jsonb`, sql `jsonb_array_length(${conversations.participants}) = ${sorted.length}`))
86
- .limit(1);
87
- if (existing.length > 0) {
88
+ // Helper: find exact participant match
89
+ async function findExisting(d) {
90
+ const existing = await d
91
+ .select()
92
+ .from(conversations)
93
+ .where(and(sql `${conversations.participants} @> ${JSON.stringify(sorted)}::jsonb`, sql `jsonb_array_length(${conversations.participants}) = ${sorted.length}`))
94
+ .limit(1);
95
+ if (existing.length === 0)
96
+ return null;
88
97
  const row = existing[0];
89
98
  return {
90
99
  id: row.id,
@@ -94,7 +103,22 @@ export async function findOrCreateConversation(db, participants) {
94
103
  createdAt: row.createdAt,
95
104
  };
96
105
  }
97
- return createConversation(db, sorted);
106
+ // Check outside transaction first (fast path, no lock)
107
+ const found = await findExisting(db);
108
+ if (found)
109
+ return found;
110
+ // If not found, use transaction with advisory lock to serialize creation.
111
+ // Advisory lock keyed on a hash of the sorted participant list prevents
112
+ // concurrent transactions from both inserting the same conversation.
113
+ const lockKey = sorted.join(',');
114
+ return await db.transaction(async (tx) => {
115
+ // pg_advisory_xact_lock is released automatically when the transaction ends
116
+ await tx.execute(sql `SELECT pg_advisory_xact_lock(hashtext(${lockKey}))`);
117
+ const existingInTx = await findExisting(tx);
118
+ if (existingInTx)
119
+ return existingInTx;
120
+ return createConversation(tx, sorted);
121
+ });
98
122
  }
99
123
  export async function sendMessage(db, conversationId, senderId, body) {
100
124
  // Verify sender is a participant in this conversation
@@ -106,23 +130,28 @@ export async function sendMessage(db, conversationId, senderId, body) {
106
130
  if (conv.length === 0) {
107
131
  throw new Error('Not a participant in this conversation');
108
132
  }
109
- const [row] = await db
110
- .insert(messages)
111
- .values({
112
- conversationId,
113
- senderId,
114
- body,
115
- })
116
- .returning();
117
- // Update conversation's last message
118
- await db
119
- .update(conversations)
120
- .set({
121
- lastMessageAt: new Date(),
122
- lastMessage: body.length > 200 ? body.slice(0, 200) + '...' : body,
123
- })
124
- .where(eq(conversations.id, conversationId));
125
- // Resolve sender info
133
+ // Truncate lastMessage safely (preserve multi-byte characters)
134
+ const truncated = truncateUnicode(body, 200);
135
+ // Insert message + update conversation atomically
136
+ const [row] = await db.transaction(async (tx) => {
137
+ const [msgRow] = await tx
138
+ .insert(messages)
139
+ .values({
140
+ conversationId,
141
+ senderId,
142
+ body,
143
+ })
144
+ .returning();
145
+ await tx
146
+ .update(conversations)
147
+ .set({
148
+ lastMessageAt: new Date(),
149
+ lastMessage: truncated,
150
+ })
151
+ .where(eq(conversations.id, conversationId));
152
+ return [msgRow];
153
+ });
154
+ // Resolve sender info (outside transaction — read-only, non-critical)
126
155
  const [sender] = await db.select({ displayName: users.displayName, username: users.username, avatarUrl: users.avatarUrl })
127
156
  .from(users).where(eq(users.id, senderId)).limit(1);
128
157
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"messaging.js","sourceRoot":"","sources":["../../src/messaging/messaging.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messaging.js","sourceRoot":"","sources":["../../src/messaging/messaging.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- export { listNotifications, getUnreadCount, markNotificationRead, markAllNotificationsRead, deleteNotification, createNotification, } from './notification.js';
1
+ export { listNotifications, getUnreadCount, markNotificationRead, markAllNotificationsRead, deleteNotification, createNotification, shouldEmailNotification, getNotificationEmailTarget, setNotificationEmailSender, } from './notification.js';
2
2
  export type { NotificationItem, NotificationFilters, NotificationType } from './notification.js';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/notification/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,oBAAoB,EACpB,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/notification/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,oBAAoB,EACpB,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -1,2 +1,2 @@
1
- export { listNotifications, getUnreadCount, markNotificationRead, markAllNotificationsRead, deleteNotification, createNotification, } from './notification.js';
1
+ export { listNotifications, getUnreadCount, markNotificationRead, markAllNotificationsRead, deleteNotification, createNotification, shouldEmailNotification, getNotificationEmailTarget, setNotificationEmailSender, } from './notification.js';
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/notification/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,oBAAoB,EACpB,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/notification/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,oBAAoB,EACpB,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,mBAAmB,CAAC"}
@@ -13,6 +13,25 @@ export interface NotificationItem {
13
13
  createdAt: Date;
14
14
  }
15
15
  export type NotificationType = 'like' | 'comment' | 'follow' | 'mention' | 'contest' | 'certificate' | 'hub' | 'system' | 'fork' | 'build';
16
+ /**
17
+ * Check whether a user should receive an instant email for a notification type.
18
+ * Returns false if the user has no preferences set, the type has no toggle, or the user disabled it.
19
+ * Also returns false if the user chose digest mode (daily/weekly) — those are batched separately.
20
+ */
21
+ export declare function shouldEmailNotification(db: DB, userId: string, type: NotificationType): Promise<boolean>;
22
+ /**
23
+ * Get user email and username for sending notification emails.
24
+ */
25
+ export declare function getNotificationEmailTarget(db: DB, userId: string): Promise<{
26
+ email: string;
27
+ username: string;
28
+ } | null>;
29
+ type NotificationEmailSender = (db: DB, notification: NotificationItem) => Promise<void>;
30
+ /**
31
+ * Register a callback that sends notification emails. Called once by the Nitro plugin at startup.
32
+ * The callback handles shouldEmailNotification checks, template rendering, and actual sending.
33
+ */
34
+ export declare function setNotificationEmailSender(sender: NotificationEmailSender): void;
16
35
  export interface NotificationFilters {
17
36
  userId: string;
18
37
  type?: NotificationType;
@@ -36,4 +55,5 @@ export declare function createNotification(db: DB, input: {
36
55
  link?: string;
37
56
  actorId?: string;
38
57
  }): Promise<NotificationItem>;
58
+ export {};
39
59
  //# sourceMappingURL=notification.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"notification.d.ts","sourceRoot":"","sources":["../../src/notification/notification.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3I,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC;IAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CA+CvD;AAED,wBAAsB,cAAc,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO5E;AAED,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,EAAE,EACN,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,EAAE,EACN,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,EAAE,EACN,KAAK,EAAE;IACL,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GACA,OAAO,CAAC,gBAAgB,CAAC,CA0B3B"}
1
+ {"version":3,"file":"notification.d.ts","sourceRoot":"","sources":["../../src/notification/notification.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAoB3I;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CASrD;AAID,KAAK,uBAAuB,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAGzF;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI,CAEhF;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC;IAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CA+CvD;AAED,wBAAsB,cAAc,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO5E;AAED,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,EAAE,EACN,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,EAAE,EACN,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,EAAE,EACN,KAAK,EAAE;IACL,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GACA,OAAO,CAAC,gBAAgB,CAAC,CAmC3B"}
@@ -1,6 +1,56 @@
1
1
  import { eq, and, desc, sql } from 'drizzle-orm';
2
2
  import { notifications, users } from '@commonpub/schema';
3
3
  import { normalizePagination, countRows } from '../query.js';
4
+ /** Map notification types to their preference key (only types that have a user-facing toggle) */
5
+ const TYPE_TO_PREF = {
6
+ like: 'likes',
7
+ comment: 'comments',
8
+ follow: 'follows',
9
+ mention: 'mentions',
10
+ };
11
+ /**
12
+ * Check whether a user should receive an instant email for a notification type.
13
+ * Returns false if the user has no preferences set, the type has no toggle, or the user disabled it.
14
+ * Also returns false if the user chose digest mode (daily/weekly) — those are batched separately.
15
+ */
16
+ export async function shouldEmailNotification(db, userId, type) {
17
+ const prefKey = TYPE_TO_PREF[type];
18
+ if (!prefKey)
19
+ return false; // types without a toggle never trigger instant email
20
+ const [row] = await db
21
+ .select({ emailNotifications: users.emailNotifications })
22
+ .from(users)
23
+ .where(eq(users.id, userId))
24
+ .limit(1);
25
+ if (!row?.emailNotifications)
26
+ return false;
27
+ const prefs = row.emailNotifications;
28
+ // If digest mode is daily or weekly, instant emails are suppressed — digest plugin handles them
29
+ if (prefs.digest === 'daily' || prefs.digest === 'weekly')
30
+ return false;
31
+ return prefs[prefKey] === true;
32
+ }
33
+ /**
34
+ * Get user email and username for sending notification emails.
35
+ */
36
+ export async function getNotificationEmailTarget(db, userId) {
37
+ const [row] = await db
38
+ .select({ email: users.email, username: users.username, emailVerified: users.emailVerified })
39
+ .from(users)
40
+ .where(eq(users.id, userId))
41
+ .limit(1);
42
+ if (!row || !row.emailVerified)
43
+ return null;
44
+ return { email: row.email, username: row.username };
45
+ }
46
+ let registeredEmailSender = null;
47
+ /**
48
+ * Register a callback that sends notification emails. Called once by the Nitro plugin at startup.
49
+ * The callback handles shouldEmailNotification checks, template rendering, and actual sending.
50
+ */
51
+ export function setNotificationEmailSender(sender) {
52
+ registeredEmailSender = sender;
53
+ }
4
54
  export async function listNotifications(db, filters) {
5
55
  const conditions = [eq(notifications.userId, filters.userId)];
6
56
  if (filters.type) {
@@ -78,7 +128,7 @@ export async function createNotification(db, input) {
78
128
  actorId: input.actorId ?? null,
79
129
  })
80
130
  .returning();
81
- return {
131
+ const notification = {
82
132
  id: row.id,
83
133
  userId: row.userId,
84
134
  type: row.type,
@@ -91,5 +141,12 @@ export async function createNotification(db, input) {
91
141
  read: row.read,
92
142
  createdAt: row.createdAt,
93
143
  };
144
+ // Fire-and-forget email sending (don't block notification creation)
145
+ if (registeredEmailSender) {
146
+ registeredEmailSender(db, notification).catch((err) => {
147
+ console.error('[notification-email] Failed to send:', err instanceof Error ? err.message : err);
148
+ });
149
+ }
150
+ return notification;
94
151
  }
95
152
  //# sourceMappingURL=notification.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"notification.js","sourceRoot":"","sources":["../../src/notification/notification.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"notification.js","sourceRoot":"","sources":["../../src/notification/notification.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@commonpub/server",
3
- "version": "2.14.0",
3
+ "version": "2.16.0",
4
4
  "type": "module",
5
5
  "description": "Framework-agnostic business logic for CommonPub instances",
6
6
  "license": "AGPL-3.0-or-later",
@@ -100,13 +100,13 @@
100
100
  ],
101
101
  "dependencies": {
102
102
  "isomorphic-dompurify": "^3.3.0",
103
- "@commonpub/auth": "0.5.0",
104
- "@commonpub/config": "0.7.0",
105
- "@commonpub/infra": "0.5.0",
106
103
  "@commonpub/docs": "0.5.2",
104
+ "@commonpub/config": "0.7.1",
105
+ "@commonpub/infra": "0.5.1",
107
106
  "@commonpub/learning": "0.5.0",
108
- "@commonpub/schema": "0.8.12",
109
- "@commonpub/protocol": "0.9.4"
107
+ "@commonpub/protocol": "0.9.5",
108
+ "@commonpub/schema": "0.8.13",
109
+ "@commonpub/auth": "0.5.0"
110
110
  },
111
111
  "peerDependencies": {
112
112
  "drizzle-orm": "^0.45.1"