@timardex/cluemart-shared 1.2.34 → 1.2.36

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 (48) hide show
  1. package/dist/{ad-CiYcsJB7.d.mts → ad-Bv5fLkN0.d.mts} +1 -1
  2. package/dist/{ad-BZylIpez.d.ts → ad-DDPNpx02.d.ts} +1 -1
  3. package/dist/{auth-DDtMJHZw.d.mts → auth-BVGs-5Vm.d.mts} +1 -1
  4. package/dist/{auth-CmaB99NK.d.ts → auth-BhUIvvZ2.d.ts} +1 -1
  5. package/dist/formFields/index.d.mts +1 -3
  6. package/dist/formFields/index.d.ts +1 -3
  7. package/dist/{global-DVYSZ6LR.d.ts → global-BA84KF8J.d.ts} +2 -148
  8. package/dist/{global-ExJZRDGR.d.mts → global-BEqzo5Z2.d.mts} +2 -148
  9. package/dist/graphql/index.d.mts +3 -5
  10. package/dist/graphql/index.d.ts +3 -5
  11. package/dist/hooks/index.d.mts +3 -5
  12. package/dist/hooks/index.d.ts +3 -5
  13. package/dist/hooks/index.mjs +5 -5
  14. package/dist/index.cjs +17 -1124
  15. package/dist/index.cjs.map +1 -1
  16. package/dist/index.d.mts +311 -821
  17. package/dist/index.d.ts +311 -821
  18. package/dist/index.mjs +17 -1096
  19. package/dist/index.mjs.map +1 -1
  20. package/dist/resourceActivities-0CdofGJp.d.mts +96 -0
  21. package/dist/resourceActivities-BjgH9TFc.d.ts +96 -0
  22. package/dist/types/index.cjs +2 -26
  23. package/dist/types/index.cjs.map +1 -1
  24. package/dist/types/index.d.mts +4 -6
  25. package/dist/types/index.d.ts +4 -6
  26. package/dist/types/index.mjs +11 -8
  27. package/dist/types/index.mjs.map +1 -1
  28. package/dist/utils/index.d.mts +1 -3
  29. package/dist/utils/index.d.ts +1 -3
  30. package/package.json +1 -1
  31. package/dist/chunk-4OLDTZXH.mjs +0 -26
  32. package/dist/chunk-4OLDTZXH.mjs.map +0 -1
  33. package/dist/chunk-NPHPFWQH.mjs +0 -63
  34. package/dist/chunk-NPHPFWQH.mjs.map +0 -1
  35. package/dist/mongoose/index.cjs +0 -1085
  36. package/dist/mongoose/index.cjs.map +0 -1
  37. package/dist/mongoose/index.d.mts +0 -415
  38. package/dist/mongoose/index.d.ts +0 -415
  39. package/dist/mongoose/index.mjs +0 -862
  40. package/dist/mongoose/index.mjs.map +0 -1
  41. package/dist/resourceActivities-B4roVKtQ.d.ts +0 -34
  42. package/dist/resourceActivities-BIjtlOGp.d.mts +0 -34
  43. package/dist/service/index.cjs +0 -308
  44. package/dist/service/index.cjs.map +0 -1
  45. package/dist/service/index.d.mts +0 -27
  46. package/dist/service/index.d.ts +0 -27
  47. package/dist/service/index.mjs +0 -190
  48. package/dist/service/index.mjs.map +0 -1
@@ -1,190 +0,0 @@
1
- import {
2
- NotificationModel,
3
- PushTokenModel
4
- } from "../chunk-NPHPFWQH.mjs";
5
- import "../chunk-NNS747QT.mjs";
6
-
7
- // src/service/database.ts
8
- import mongoose from "mongoose";
9
-
10
- // src/service/timezonePlugin.ts
11
- import dayjs from "dayjs";
12
- import timezone from "dayjs/plugin/timezone";
13
- import utc from "dayjs/plugin/utc";
14
- dayjs.extend(utc);
15
- dayjs.extend(timezone);
16
- function timezonePlugin(schema) {
17
- if (!schema.get("timestamps")) return;
18
- const transform = (_doc, ret) => {
19
- if (ret.createdAt)
20
- ret.createdAt = dayjs(ret.createdAt).tz("Pacific/Auckland").format();
21
- if (ret.updatedAt)
22
- ret.updatedAt = dayjs(ret.updatedAt).tz("Pacific/Auckland").format();
23
- return ret;
24
- };
25
- schema.set("toJSON", { transform });
26
- schema.set("toObject", { transform });
27
- }
28
-
29
- // src/service/database.ts
30
- mongoose.plugin(timezonePlugin);
31
- var connectToDatabase = async ({
32
- appName,
33
- dbName,
34
- dbPassword,
35
- dbUser,
36
- mongodbUri
37
- }) => {
38
- try {
39
- const mongoUri = mongodbUri ? mongodbUri : (
40
- // Fallback to MongoDB Atlas connection string
41
- `mongodb+srv://${dbUser}:${dbPassword}@${dbName}.mongodb.net/?retryWrites=true&w=majority&appName=${appName}`
42
- );
43
- await mongoose.connect(mongoUri);
44
- const connectionType = mongodbUri ? "Local MongoDB" : "MongoDB Atlas";
45
- console.log(
46
- `${connectionType} connected from server/src/service/database.ts`
47
- );
48
- } catch (err) {
49
- console.error("Error connecting to MongoDB:", err);
50
- throw err;
51
- }
52
- };
53
-
54
- // src/service/saveNotificationsInDb.ts
55
- async function saveNotificationsInDb(payload) {
56
- const { data, message, title, type, userIds } = payload;
57
- try {
58
- const notifications = userIds.map((userId) => ({
59
- data,
60
- isRead: false,
61
- message,
62
- title,
63
- type,
64
- userId
65
- }));
66
- await NotificationModel.insertMany(notifications);
67
- console.log(
68
- `Created ${notifications.length} notifications for ${userIds.length} users`
69
- );
70
- return [...new Set(userIds)];
71
- } catch (error) {
72
- console.error("Failed to create notifications:", error);
73
- return [];
74
- }
75
- }
76
-
77
- // src/service/sendPushNotifications.ts
78
- import { Expo } from "expo-server-sdk";
79
- var expo = new Expo();
80
- function extractTokensFromMessage(message) {
81
- return Array.isArray(message.to) ? message.to : [message.to];
82
- }
83
- function createPushMessages({
84
- tokens,
85
- message,
86
- title,
87
- data
88
- }) {
89
- const messages = [];
90
- const invalidTokens = [];
91
- for (const token of tokens) {
92
- if (!Expo.isExpoPushToken(token)) {
93
- invalidTokens.push(token);
94
- continue;
95
- }
96
- messages.push({
97
- body: message,
98
- data: { ...data },
99
- sound: "default",
100
- title,
101
- to: token
102
- });
103
- }
104
- return { invalidTokens, messages };
105
- }
106
- function processChunkResults(tickets, chunk) {
107
- let successCount = 0;
108
- const failedTokens = [];
109
- for (const [ticketIndex, ticket] of tickets.entries()) {
110
- if (ticket.status === "error") {
111
- const message = chunk[ticketIndex];
112
- if (message) {
113
- const tokens = extractTokensFromMessage(message);
114
- if (ticket.details?.error === "DeviceNotRegistered") {
115
- failedTokens.push(...tokens);
116
- }
117
- console.log("Push notification error", {
118
- error: ticket.details?.error,
119
- tokens
120
- });
121
- }
122
- } else {
123
- successCount++;
124
- }
125
- }
126
- return { failedTokens, successCount };
127
- }
128
- async function sendChunk(chunk, chunkIndex) {
129
- try {
130
- const tickets = await expo.sendPushNotificationsAsync(chunk);
131
- const { successCount, failedTokens } = processChunkResults(tickets, chunk);
132
- console.log(
133
- `Chunk ${chunkIndex + 1}: Sent ${successCount}/${chunk.length} notifications successfully`
134
- );
135
- return { failedTokens, successCount };
136
- } catch (error) {
137
- console.log("Error sending Expo push notification chunk", {
138
- chunkIndex,
139
- chunkSize: chunk.length,
140
- error: error instanceof Error ? error.message : String(error)
141
- });
142
- return { failedTokens: [], successCount: 0 };
143
- }
144
- }
145
- async function sendPushNotifications({
146
- data,
147
- message,
148
- title,
149
- userIds
150
- }) {
151
- const pushTokens = await PushTokenModel.find({ userId: { $in: userIds } });
152
- const expoTokens = pushTokens.map((token) => token.token);
153
- if (!data) return;
154
- const { messages, invalidTokens } = createPushMessages({
155
- data,
156
- message,
157
- title,
158
- tokens: expoTokens
159
- });
160
- if (invalidTokens.length > 0) {
161
- console.log(`Found ${invalidTokens.length} invalid push tokens`);
162
- }
163
- if (messages.length === 0) {
164
- console.log("No valid messages to send after filtering tokens");
165
- return;
166
- }
167
- const chunks = expo.chunkPushNotifications(messages);
168
- let totalSuccessCount = 0;
169
- const allFailedTokens = [];
170
- for (const [chunkIndex, chunk] of chunks.entries()) {
171
- const { successCount, failedTokens } = await sendChunk(
172
- chunk,
173
- chunkIndex + 1
174
- );
175
- totalSuccessCount += successCount;
176
- allFailedTokens.push(...failedTokens);
177
- }
178
- console.log(
179
- `Sent push notification to ${totalSuccessCount}/${messages.length} tokens across ${chunks.length} chunks`
180
- );
181
- if (allFailedTokens.length > 0) {
182
- console.log(`Found ${allFailedTokens.length} failed push tokens`);
183
- }
184
- }
185
- export {
186
- connectToDatabase,
187
- saveNotificationsInDb,
188
- sendPushNotifications
189
- };
190
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/service/database.ts","../../src/service/timezonePlugin.ts","../../src/service/saveNotificationsInDb.ts","../../src/service/sendPushNotifications.ts"],"sourcesContent":["import mongoose from \"mongoose\";\n\nimport { timezonePlugin } from \"./timezonePlugin\";\n\nmongoose.plugin(timezonePlugin); // applies to all schemas\n\n/**\n * Connect to MongoDB using Mongoose.\n * Supports both local MongoDB (via MONGODB_URI) and MongoDB Atlas (via individual env vars).\n */\nexport const connectToDatabase = async ({\n appName,\n dbName,\n dbPassword,\n dbUser,\n mongodbUri,\n}: {\n appName: string;\n dbName: string;\n dbPassword: string;\n dbUser: string;\n mongodbUri: string;\n}) => {\n try {\n // Check if MONGODB_URI is provided (for local Docker MongoDB)\n const mongoUri = mongodbUri\n ? mongodbUri\n : // Fallback to MongoDB Atlas connection string\n `mongodb+srv://${dbUser}:${dbPassword}@${dbName}.mongodb.net/?retryWrites=true&w=majority&appName=${appName}`;\n\n await mongoose.connect(mongoUri);\n\n const connectionType = mongodbUri ? \"Local MongoDB\" : \"MongoDB Atlas\";\n console.log(\n `${connectionType} connected from server/src/service/database.ts`,\n );\n } catch (err) {\n console.error(\"Error connecting to MongoDB:\", err);\n throw err; // You can throw the error if you want to stop the server in case of connection failure\n }\n};\n","import dayjs from \"dayjs\";\nimport timezone from \"dayjs/plugin/timezone\";\nimport utc from \"dayjs/plugin/utc\";\nimport { Schema } from \"mongoose\";\n\ndayjs.extend(utc);\ndayjs.extend(timezone);\n\nexport function timezonePlugin(schema: Schema) {\n if (!schema.get(\"timestamps\")) return;\n\n const transform = (_doc: any, ret: any) => {\n if (ret.createdAt)\n ret.createdAt = dayjs(ret.createdAt).tz(\"Pacific/Auckland\").format(); // ISO with +13:00 or +12:00 offset\n if (ret.updatedAt)\n ret.updatedAt = dayjs(ret.updatedAt).tz(\"Pacific/Auckland\").format();\n return ret;\n };\n\n schema.set(\"toJSON\", { transform });\n schema.set(\"toObject\", { transform });\n}\n","import {\n SchemaCreateBulkNotificationInput,\n NotificationModel,\n} from \"src/mongoose/Notification\";\nimport { ObjectId } from \"src/types\";\n\n/**\n * Create notifications in the database for multiple users\n * This is typically called when sending push notifications\n */\nexport async function saveNotificationsInDb(\n payload: SchemaCreateBulkNotificationInput,\n): Promise<ObjectId[]> {\n const { data, message, title, type, userIds } = payload;\n try {\n const notifications = userIds.map((userId) => ({\n data,\n isRead: false,\n message,\n title,\n type,\n userId,\n }));\n\n // Save notifications to database\n await NotificationModel.insertMany(notifications);\n console.log(\n `Created ${notifications.length} notifications for ${userIds.length} users`,\n );\n\n return [...new Set(userIds)];\n } catch (error) {\n console.error(\"Failed to create notifications:\", error);\n return [];\n //throw new Error(`Failed to create notifications: ${error}`);\n }\n}\n","import { Expo, ExpoPushMessage, ExpoPushTicket } from \"expo-server-sdk\";\n\nimport { SchemaCreateBulkNotificationInput } from \"src/mongoose/Notification\";\nimport { PushTokenModel } from \"src/mongoose/PushToken\";\nimport { NotificationDataType, ObjectId } from \"src/types\";\n\nconst expo = new Expo();\n\n/**\n * Safely extract tokens from ExpoPushMessage handling both string and array cases\n */\nfunction extractTokensFromMessage(message: ExpoPushMessage): string[] {\n return Array.isArray(message.to) ? message.to : [message.to];\n}\n\ninterface CreatePushMessagesOptions {\n tokens: string[];\n message: string;\n title: string;\n data: NotificationDataType;\n}\n\n/**\n * Create push messages from valid tokens\n */\nfunction createPushMessages({\n tokens,\n message,\n title,\n data,\n}: CreatePushMessagesOptions): {\n messages: ExpoPushMessage[];\n invalidTokens: string[];\n} {\n const messages: ExpoPushMessage[] = [];\n const invalidTokens: string[] = [];\n\n for (const token of tokens) {\n if (!Expo.isExpoPushToken(token)) {\n invalidTokens.push(token);\n continue;\n }\n\n messages.push({\n body: message,\n data: { ...data },\n sound: \"default\",\n title,\n to: token,\n });\n }\n\n return { invalidTokens, messages };\n}\n\n/**\n * Process chunk results and extract failed tokens\n */\nfunction processChunkResults(\n tickets: ExpoPushTicket[],\n chunk: ExpoPushMessage[],\n): { successCount: number; failedTokens: string[] } {\n let successCount = 0;\n const failedTokens: string[] = [];\n\n for (const [ticketIndex, ticket] of tickets.entries()) {\n if (ticket.status === \"error\") {\n const message = chunk[ticketIndex];\n if (message) {\n const tokens = extractTokensFromMessage(message);\n if (ticket.details?.error === \"DeviceNotRegistered\") {\n failedTokens.push(...tokens);\n }\n console.log(\"Push notification error\", {\n error: ticket.details?.error,\n tokens,\n });\n }\n } else {\n successCount++;\n }\n }\n\n return { failedTokens, successCount };\n}\n\n/**\n * Send a single chunk of push notifications\n */\nasync function sendChunk(\n chunk: ExpoPushMessage[],\n chunkIndex: number,\n): Promise<{ successCount: number; failedTokens: string[] }> {\n try {\n const tickets = await expo.sendPushNotificationsAsync(chunk);\n const { successCount, failedTokens } = processChunkResults(tickets, chunk);\n\n console.log(\n `Chunk ${chunkIndex + 1}: Sent ${successCount}/${chunk.length} notifications successfully`,\n );\n\n return { failedTokens, successCount };\n } catch (error) {\n console.log(\"Error sending Expo push notification chunk\", {\n chunkIndex,\n chunkSize: chunk.length,\n error: error instanceof Error ? error.message : String(error),\n });\n return { failedTokens: [], successCount: 0 };\n }\n}\n\nexport async function sendPushNotifications({\n data,\n message,\n title,\n userIds,\n}: SchemaCreateBulkNotificationInput) {\n const pushTokens = await PushTokenModel.find({ userId: { $in: userIds } });\n const expoTokens = pushTokens.map((token) => token.token);\n\n if (!data) return;\n\n const { messages, invalidTokens } = createPushMessages({\n data,\n message,\n title,\n tokens: expoTokens,\n });\n\n // Log invalid tokens\n if (invalidTokens.length > 0) {\n console.log(`Found ${invalidTokens.length} invalid push tokens`);\n }\n\n if (messages.length === 0) {\n console.log(\"No valid messages to send after filtering tokens\");\n return;\n }\n\n // Send notifications in chunks\n const chunks = expo.chunkPushNotifications(messages);\n let totalSuccessCount = 0;\n const allFailedTokens: string[] = [];\n\n for (const [chunkIndex, chunk] of chunks.entries()) {\n const { successCount, failedTokens } = await sendChunk(\n chunk,\n chunkIndex + 1,\n );\n totalSuccessCount += successCount;\n allFailedTokens.push(...failedTokens);\n }\n\n // Log final results\n console.log(\n `Sent push notification to ${totalSuccessCount}/${messages.length} tokens across ${chunks.length} chunks`,\n );\n\n if (allFailedTokens.length > 0) {\n console.log(`Found ${allFailedTokens.length} failed push tokens`);\n }\n}\n"],"mappings":"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","names":[]}