@managesome/knotr-toolkit 0.1.1 → 0.8.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 (300) hide show
  1. package/dist/backend/config.d.ts +43 -0
  2. package/dist/backend/config.d.ts.map +1 -0
  3. package/dist/backend/config.js +82 -0
  4. package/dist/backend/config.js.map +1 -0
  5. package/dist/backend/database.d.ts +28 -0
  6. package/dist/backend/database.d.ts.map +1 -0
  7. package/dist/backend/database.js +112 -0
  8. package/dist/backend/database.js.map +1 -0
  9. package/dist/backend/firebase.d.ts +68 -0
  10. package/dist/backend/firebase.d.ts.map +1 -0
  11. package/dist/backend/firebase.js +233 -0
  12. package/dist/backend/firebase.js.map +1 -0
  13. package/dist/backend/index.d.ts +8 -0
  14. package/dist/backend/index.d.ts.map +1 -0
  15. package/dist/backend/index.js +19 -0
  16. package/dist/backend/index.js.map +1 -0
  17. package/dist/backend/logger.d.ts +23 -0
  18. package/dist/backend/logger.d.ts.map +1 -0
  19. package/dist/backend/logger.js +107 -0
  20. package/dist/backend/logger.js.map +1 -0
  21. package/dist/backend/redis.d.ts +59 -0
  22. package/dist/backend/redis.d.ts.map +1 -0
  23. package/dist/backend/redis.js +169 -0
  24. package/dist/backend/redis.js.map +1 -0
  25. package/dist/backend/socket.d.ts +81 -0
  26. package/dist/backend/socket.d.ts.map +1 -0
  27. package/dist/backend/socket.js +132 -0
  28. package/dist/backend/socket.js.map +1 -0
  29. package/dist/backend/worker-queue.d.ts +40 -0
  30. package/dist/backend/worker-queue.d.ts.map +1 -0
  31. package/dist/backend/worker-queue.js +140 -0
  32. package/dist/backend/worker-queue.js.map +1 -0
  33. package/dist/client/api-client.d.ts +101 -0
  34. package/dist/client/api-client.d.ts.map +1 -0
  35. package/dist/client/api-client.js +261 -0
  36. package/dist/client/api-client.js.map +1 -0
  37. package/dist/client/api-error.d.ts +100 -0
  38. package/dist/client/api-error.d.ts.map +1 -0
  39. package/dist/client/api-error.js +111 -0
  40. package/dist/client/api-error.js.map +1 -0
  41. package/dist/client/endpoints.d.ts +510 -0
  42. package/dist/client/endpoints.d.ts.map +1 -0
  43. package/dist/client/endpoints.js +306 -0
  44. package/dist/client/endpoints.js.map +1 -0
  45. package/dist/client/index.d.ts +4 -0
  46. package/dist/client/index.d.ts.map +1 -0
  47. package/dist/client/index.js +7 -0
  48. package/dist/client/index.js.map +1 -0
  49. package/dist/constants/index.d.ts +2 -1
  50. package/dist/constants/index.d.ts.map +1 -1
  51. package/dist/constants/index.js +2 -1
  52. package/dist/constants/index.js.map +1 -1
  53. package/dist/constants/socket.d.ts +165 -0
  54. package/dist/constants/socket.d.ts.map +1 -0
  55. package/dist/constants/socket.js +204 -0
  56. package/dist/constants/socket.js.map +1 -0
  57. package/dist/helpers/ApiError.d.ts +74 -0
  58. package/dist/helpers/ApiError.d.ts.map +1 -0
  59. package/dist/helpers/ApiError.js +105 -0
  60. package/dist/helpers/ApiError.js.map +1 -0
  61. package/dist/helpers/asyncHandler.d.ts +42 -0
  62. package/dist/helpers/asyncHandler.d.ts.map +1 -0
  63. package/dist/helpers/asyncHandler.js +47 -0
  64. package/dist/helpers/asyncHandler.js.map +1 -0
  65. package/dist/helpers/id-generator.d.ts +98 -0
  66. package/dist/helpers/id-generator.d.ts.map +1 -0
  67. package/dist/helpers/id-generator.js +128 -0
  68. package/dist/helpers/id-generator.js.map +1 -0
  69. package/dist/helpers/index.d.ts +5 -0
  70. package/dist/helpers/index.d.ts.map +1 -0
  71. package/dist/helpers/index.js +8 -0
  72. package/dist/helpers/index.js.map +1 -0
  73. package/dist/helpers/response-timing.d.ts +91 -0
  74. package/dist/helpers/response-timing.d.ts.map +1 -0
  75. package/dist/helpers/response-timing.js +176 -0
  76. package/dist/helpers/response-timing.js.map +1 -0
  77. package/dist/index.d.ts +7 -3
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +21 -3
  80. package/dist/index.js.map +1 -1
  81. package/dist/schemas/account.schema.d.ts +4500 -0
  82. package/dist/schemas/account.schema.d.ts.map +1 -0
  83. package/dist/schemas/account.schema.js +123 -0
  84. package/dist/schemas/account.schema.js.map +1 -0
  85. package/dist/schemas/chat.schema.d.ts +4796 -0
  86. package/dist/schemas/chat.schema.d.ts.map +1 -0
  87. package/dist/schemas/chat.schema.js +107 -0
  88. package/dist/schemas/chat.schema.js.map +1 -0
  89. package/dist/schemas/collaboration-request.schema.d.ts +3960 -0
  90. package/dist/schemas/collaboration-request.schema.d.ts.map +1 -0
  91. package/dist/schemas/collaboration-request.schema.js +92 -0
  92. package/dist/schemas/collaboration-request.schema.js.map +1 -0
  93. package/dist/schemas/company-review.schema.d.ts +3465 -0
  94. package/dist/schemas/company-review.schema.d.ts.map +1 -0
  95. package/dist/schemas/company-review.schema.js +73 -0
  96. package/dist/schemas/company-review.schema.js.map +1 -0
  97. package/dist/schemas/company.schema.d.ts +6152 -0
  98. package/dist/schemas/company.schema.d.ts.map +1 -0
  99. package/dist/schemas/company.schema.js +192 -0
  100. package/dist/schemas/company.schema.js.map +1 -0
  101. package/dist/schemas/contract.schema.d.ts +5286 -0
  102. package/dist/schemas/contract.schema.d.ts.map +1 -0
  103. package/dist/schemas/contract.schema.js +115 -0
  104. package/dist/schemas/contract.schema.js.map +1 -0
  105. package/dist/schemas/dispute-evidence.schema.d.ts +3788 -0
  106. package/dist/schemas/dispute-evidence.schema.d.ts.map +1 -0
  107. package/dist/schemas/dispute-evidence.schema.js +71 -0
  108. package/dist/schemas/dispute-evidence.schema.js.map +1 -0
  109. package/dist/schemas/dispute.schema.d.ts +4970 -0
  110. package/dist/schemas/dispute.schema.d.ts.map +1 -0
  111. package/dist/schemas/dispute.schema.js +152 -0
  112. package/dist/schemas/dispute.schema.js.map +1 -0
  113. package/dist/schemas/donation.schema.d.ts +3594 -0
  114. package/dist/schemas/donation.schema.d.ts.map +1 -0
  115. package/dist/schemas/donation.schema.js +95 -0
  116. package/dist/schemas/donation.schema.js.map +1 -0
  117. package/dist/schemas/escrow.schema.d.ts +4322 -0
  118. package/dist/schemas/escrow.schema.d.ts.map +1 -0
  119. package/dist/schemas/escrow.schema.js +93 -0
  120. package/dist/schemas/escrow.schema.js.map +1 -0
  121. package/dist/schemas/flag.schema.d.ts +4375 -0
  122. package/dist/schemas/flag.schema.d.ts.map +1 -0
  123. package/dist/schemas/flag.schema.js +133 -0
  124. package/dist/schemas/flag.schema.js.map +1 -0
  125. package/dist/schemas/index.d.ts +33 -0
  126. package/dist/schemas/index.d.ts.map +1 -0
  127. package/dist/schemas/index.js +39 -0
  128. package/dist/schemas/index.js.map +1 -0
  129. package/dist/schemas/interest.schema.d.ts +3804 -0
  130. package/dist/schemas/interest.schema.d.ts.map +1 -0
  131. package/dist/schemas/interest.schema.js +107 -0
  132. package/dist/schemas/interest.schema.js.map +1 -0
  133. package/dist/schemas/match.schema.d.ts +4013 -0
  134. package/dist/schemas/match.schema.d.ts.map +1 -0
  135. package/dist/schemas/match.schema.js +118 -0
  136. package/dist/schemas/match.schema.js.map +1 -0
  137. package/dist/schemas/message.schema.d.ts +4213 -0
  138. package/dist/schemas/message.schema.d.ts.map +1 -0
  139. package/dist/schemas/message.schema.js +134 -0
  140. package/dist/schemas/message.schema.js.map +1 -0
  141. package/dist/schemas/milestone.schema.d.ts +4310 -0
  142. package/dist/schemas/milestone.schema.d.ts.map +1 -0
  143. package/dist/schemas/milestone.schema.js +99 -0
  144. package/dist/schemas/milestone.schema.js.map +1 -0
  145. package/dist/schemas/notification.schema.d.ts +4641 -0
  146. package/dist/schemas/notification.schema.d.ts.map +1 -0
  147. package/dist/schemas/notification.schema.js +139 -0
  148. package/dist/schemas/notification.schema.js.map +1 -0
  149. package/dist/schemas/profile.schema.d.ts +9589 -0
  150. package/dist/schemas/profile.schema.d.ts.map +1 -0
  151. package/dist/schemas/profile.schema.js +360 -0
  152. package/dist/schemas/profile.schema.js.map +1 -0
  153. package/dist/schemas/profit-share-agreement.schema.d.ts +3789 -0
  154. package/dist/schemas/profit-share-agreement.schema.d.ts.map +1 -0
  155. package/dist/schemas/profit-share-agreement.schema.js +76 -0
  156. package/dist/schemas/profit-share-agreement.schema.js.map +1 -0
  157. package/dist/schemas/profit-share.schema.d.ts +4051 -0
  158. package/dist/schemas/profit-share.schema.d.ts.map +1 -0
  159. package/dist/schemas/profit-share.schema.js +96 -0
  160. package/dist/schemas/profit-share.schema.js.map +1 -0
  161. package/dist/schemas/promo-code.schema.d.ts +3924 -0
  162. package/dist/schemas/promo-code.schema.d.ts.map +1 -0
  163. package/dist/schemas/promo-code.schema.js +112 -0
  164. package/dist/schemas/promo-code.schema.js.map +1 -0
  165. package/dist/schemas/proposal.schema.d.ts +5182 -0
  166. package/dist/schemas/proposal.schema.d.ts.map +1 -0
  167. package/dist/schemas/proposal.schema.js +114 -0
  168. package/dist/schemas/proposal.schema.js.map +1 -0
  169. package/dist/schemas/purchase.schema.d.ts +3724 -0
  170. package/dist/schemas/purchase.schema.d.ts.map +1 -0
  171. package/dist/schemas/purchase.schema.js +89 -0
  172. package/dist/schemas/purchase.schema.js.map +1 -0
  173. package/dist/schemas/requirement-post.schema.d.ts +6315 -0
  174. package/dist/schemas/requirement-post.schema.d.ts.map +1 -0
  175. package/dist/schemas/requirement-post.schema.js +153 -0
  176. package/dist/schemas/requirement-post.schema.js.map +1 -0
  177. package/dist/schemas/review.schema.d.ts +4512 -0
  178. package/dist/schemas/review.schema.d.ts.map +1 -0
  179. package/dist/schemas/review.schema.js +121 -0
  180. package/dist/schemas/review.schema.js.map +1 -0
  181. package/dist/schemas/service-listing.schema.d.ts +5152 -0
  182. package/dist/schemas/service-listing.schema.d.ts.map +1 -0
  183. package/dist/schemas/service-listing.schema.js +137 -0
  184. package/dist/schemas/service-listing.schema.js.map +1 -0
  185. package/dist/schemas/subscription.schema.d.ts +3985 -0
  186. package/dist/schemas/subscription.schema.d.ts.map +1 -0
  187. package/dist/schemas/subscription.schema.js +94 -0
  188. package/dist/schemas/subscription.schema.js.map +1 -0
  189. package/dist/schemas/tmc-application.schema.d.ts +4357 -0
  190. package/dist/schemas/tmc-application.schema.d.ts.map +1 -0
  191. package/dist/schemas/tmc-application.schema.js +96 -0
  192. package/dist/schemas/tmc-application.schema.js.map +1 -0
  193. package/dist/schemas/tmc-membership.schema.d.ts +3985 -0
  194. package/dist/schemas/tmc-membership.schema.d.ts.map +1 -0
  195. package/dist/schemas/tmc-membership.schema.js +84 -0
  196. package/dist/schemas/tmc-membership.schema.js.map +1 -0
  197. package/dist/schemas/trust-badge.schema.d.ts +3919 -0
  198. package/dist/schemas/trust-badge.schema.d.ts.map +1 -0
  199. package/dist/schemas/trust-badge.schema.js +83 -0
  200. package/dist/schemas/trust-badge.schema.js.map +1 -0
  201. package/dist/schemas/verification.schema.d.ts +4606 -0
  202. package/dist/schemas/verification.schema.d.ts.map +1 -0
  203. package/dist/schemas/verification.schema.js +114 -0
  204. package/dist/schemas/verification.schema.js.map +1 -0
  205. package/dist/schemas/webhook-event.schema.d.ts +3534 -0
  206. package/dist/schemas/webhook-event.schema.d.ts.map +1 -0
  207. package/dist/schemas/webhook-event.schema.js +83 -0
  208. package/dist/schemas/webhook-event.schema.js.map +1 -0
  209. package/dist/types/account.d.ts +30 -7
  210. package/dist/types/account.d.ts.map +1 -1
  211. package/dist/types/account.js +3 -1
  212. package/dist/types/account.js.map +1 -1
  213. package/dist/types/admin.d.ts +20 -10
  214. package/dist/types/admin.d.ts.map +1 -1
  215. package/dist/types/admin.js +3 -1
  216. package/dist/types/admin.js.map +1 -1
  217. package/dist/types/api.d.ts +184 -109
  218. package/dist/types/api.d.ts.map +1 -1
  219. package/dist/types/api.js +2 -1
  220. package/dist/types/api.js.map +1 -1
  221. package/dist/types/chat.d.ts +38 -20
  222. package/dist/types/chat.d.ts.map +1 -1
  223. package/dist/types/chat.js +3 -1
  224. package/dist/types/chat.js.map +1 -1
  225. package/dist/types/common.d.ts +39 -12
  226. package/dist/types/common.d.ts.map +1 -1
  227. package/dist/types/common.js +4 -1
  228. package/dist/types/common.js.map +1 -1
  229. package/dist/types/company.d.ts +61 -44
  230. package/dist/types/company.d.ts.map +1 -1
  231. package/dist/types/company.js +3 -1
  232. package/dist/types/company.js.map +1 -1
  233. package/dist/types/flag.d.ts +19 -8
  234. package/dist/types/flag.d.ts.map +1 -1
  235. package/dist/types/flag.js +3 -1
  236. package/dist/types/flag.js.map +1 -1
  237. package/dist/types/forms.d.ts +334 -0
  238. package/dist/types/forms.d.ts.map +1 -0
  239. package/dist/types/forms.js +5 -0
  240. package/dist/types/forms.js.map +1 -0
  241. package/dist/types/index.d.ts +18 -13
  242. package/dist/types/index.d.ts.map +1 -1
  243. package/dist/types/index.js +18 -13
  244. package/dist/types/index.js.map +1 -1
  245. package/dist/types/marketplace.d.ts +174 -104
  246. package/dist/types/marketplace.d.ts.map +1 -1
  247. package/dist/types/marketplace.js +2 -0
  248. package/dist/types/marketplace.js.map +1 -1
  249. package/dist/types/match.d.ts +36 -19
  250. package/dist/types/match.d.ts.map +1 -1
  251. package/dist/types/match.js +3 -1
  252. package/dist/types/match.js.map +1 -1
  253. package/dist/types/navigation.d.ts +305 -0
  254. package/dist/types/navigation.d.ts.map +1 -0
  255. package/dist/types/navigation.js +18 -0
  256. package/dist/types/navigation.js.map +1 -0
  257. package/dist/types/notification.d.ts +92 -0
  258. package/dist/types/notification.d.ts.map +1 -0
  259. package/dist/types/notification.js +5 -0
  260. package/dist/types/notification.js.map +1 -0
  261. package/dist/types/payment.d.ts +70 -38
  262. package/dist/types/payment.d.ts.map +1 -1
  263. package/dist/types/payment.js +3 -1
  264. package/dist/types/payment.js.map +1 -1
  265. package/dist/types/policy.d.ts +173 -80
  266. package/dist/types/policy.d.ts.map +1 -1
  267. package/dist/types/policy.js.map +1 -1
  268. package/dist/types/profile.d.ts +48 -37
  269. package/dist/types/profile.d.ts.map +1 -1
  270. package/dist/types/profile.js +3 -1
  271. package/dist/types/profile.js.map +1 -1
  272. package/dist/types/socket.d.ts +431 -0
  273. package/dist/types/socket.d.ts.map +1 -0
  274. package/dist/types/socket.js +5 -0
  275. package/dist/types/socket.js.map +1 -0
  276. package/dist/types/verification.d.ts +18 -9
  277. package/dist/types/verification.d.ts.map +1 -1
  278. package/dist/types/verification.js +3 -1
  279. package/dist/types/verification.js.map +1 -1
  280. package/dist/types/worker.d.ts +452 -0
  281. package/dist/types/worker.d.ts.map +1 -0
  282. package/dist/types/worker.js +5 -0
  283. package/dist/types/worker.js.map +1 -0
  284. package/dist/validation/index.d.ts +5 -0
  285. package/dist/validation/index.d.ts.map +1 -0
  286. package/dist/validation/index.js +9 -0
  287. package/dist/validation/index.js.map +1 -0
  288. package/dist/validation/messages.d.ts +124 -0
  289. package/dist/validation/messages.d.ts.map +1 -0
  290. package/dist/validation/messages.js +160 -0
  291. package/dist/validation/messages.js.map +1 -0
  292. package/dist/validation/schemas.d.ts +1127 -0
  293. package/dist/validation/schemas.d.ts.map +1 -0
  294. package/dist/validation/schemas.js +376 -0
  295. package/dist/validation/schemas.js.map +1 -0
  296. package/dist/validation/validators.d.ts +229 -0
  297. package/dist/validation/validators.d.ts.map +1 -0
  298. package/dist/validation/validators.js +307 -0
  299. package/dist/validation/validators.js.map +1 -0
  300. package/package.json +37 -3
@@ -0,0 +1,140 @@
1
+ // ============================================
2
+ // Worker Queue Utilities
3
+ // Backend-only Cloud Tasks / job queue integration
4
+ // ============================================
5
+ import { getConfig, isConfigInitialized } from './config.js';
6
+ import { logger } from './logger.js';
7
+ // Store Cloud Tasks client instance
8
+ let cloudTasksClient = null;
9
+ /**
10
+ * Set the Cloud Tasks client instance
11
+ */
12
+ export function setCloudTasksClient(client) {
13
+ cloudTasksClient = client;
14
+ }
15
+ /**
16
+ * Post a request to the workers service via Cloud Tasks
17
+ * Falls back to HTTP POST in development mode
18
+ *
19
+ * @param endpoint - The worker endpoint (e.g., "process-matching")
20
+ * @param payload - The request payload
21
+ * @param options - Optional scheduling options
22
+ */
23
+ export async function postWorkerRequest(endpoint, payload, options) {
24
+ const config = isConfigInitialized() ? getConfig() : null;
25
+ const workersUrl = config?.workersServiceUrl || process.env.WORKERS_SERVICE_URL;
26
+ // In development, make direct HTTP calls
27
+ if (config?.nodeEnv === 'development' || !cloudTasksClient) {
28
+ await postWorkerRequestDirect(endpoint, payload, workersUrl);
29
+ return;
30
+ }
31
+ // In production, use Cloud Tasks
32
+ await postWorkerRequestCloudTasks(endpoint, payload, options);
33
+ }
34
+ /**
35
+ * Direct HTTP POST to workers service (development mode)
36
+ */
37
+ async function postWorkerRequestDirect(endpoint, payload, workersUrl) {
38
+ const baseUrl = workersUrl || 'http://localhost:3002';
39
+ const url = `${baseUrl}/${endpoint}`;
40
+ try {
41
+ const response = await fetch(url, {
42
+ method: 'POST',
43
+ headers: {
44
+ 'Content-Type': 'application/json',
45
+ },
46
+ body: JSON.stringify(payload),
47
+ });
48
+ if (!response.ok) {
49
+ throw new Error(`Worker request failed: ${response.status} ${response.statusText}`);
50
+ }
51
+ logger.debug('Worker request sent (direct)', { endpoint, type: payload.type });
52
+ }
53
+ catch (error) {
54
+ logger.error('Failed to send worker request (direct)', {
55
+ endpoint,
56
+ type: payload.type,
57
+ error: error instanceof Error ? error.message : String(error),
58
+ });
59
+ // Don't throw in development - just log the error
60
+ if (process.env.NODE_ENV === 'production') {
61
+ throw error;
62
+ }
63
+ }
64
+ }
65
+ /**
66
+ * Post to workers service via Google Cloud Tasks
67
+ */
68
+ async function postWorkerRequestCloudTasks(endpoint, payload, options) {
69
+ const config = getConfig();
70
+ const workersUrl = config.workersServiceUrl;
71
+ if (!workersUrl) {
72
+ throw new Error('WORKERS_SERVICE_URL not configured');
73
+ }
74
+ if (!cloudTasksClient) {
75
+ throw new Error('Cloud Tasks client not initialized. Call setCloudTasksClient() first.');
76
+ }
77
+ const project = config.cloudTasksProject;
78
+ const location = config.cloudTasksLocation;
79
+ const queue = options?.queue || config.cloudTasksQueue || 'workers-queue';
80
+ if (!project || !location) {
81
+ throw new Error('Cloud Tasks project and location must be configured');
82
+ }
83
+ try {
84
+ const parent = `projects/${project}/locations/${location}/queues/${queue}`;
85
+ const url = `${workersUrl}/${endpoint}`;
86
+ const taskConfig = {
87
+ httpRequest: {
88
+ httpMethod: 'POST',
89
+ url,
90
+ headers: {
91
+ 'Content-Type': 'application/json',
92
+ },
93
+ body: Buffer.from(JSON.stringify(payload)).toString('base64'),
94
+ },
95
+ };
96
+ // Add scheduling if specified
97
+ if (options?.delaySeconds) {
98
+ taskConfig.scheduleTime = {
99
+ seconds: Math.floor(Date.now() / 1000) + options.delaySeconds,
100
+ };
101
+ }
102
+ else if (options?.scheduleTime) {
103
+ taskConfig.scheduleTime = {
104
+ seconds: options.scheduleTime,
105
+ };
106
+ }
107
+ // Use the Cloud Tasks client (type assertion since we don't have the types)
108
+ const client = cloudTasksClient;
109
+ await client.createTask({ parent, task: taskConfig });
110
+ logger.debug('Worker request queued (Cloud Tasks)', {
111
+ endpoint,
112
+ type: payload.type,
113
+ queue,
114
+ scheduled: !!options?.delaySeconds || !!options?.scheduleTime,
115
+ });
116
+ }
117
+ catch (error) {
118
+ logger.error('Failed to queue worker request', {
119
+ endpoint,
120
+ type: payload.type,
121
+ error: error instanceof Error ? error.message : String(error),
122
+ });
123
+ throw error;
124
+ }
125
+ }
126
+ /**
127
+ * Convenience function for scheduling a delayed worker request
128
+ */
129
+ export async function scheduleWorkerRequest(endpoint, payload, delaySeconds) {
130
+ return postWorkerRequest(endpoint, payload, { delaySeconds });
131
+ }
132
+ /**
133
+ * Convenience function for scheduling a worker request at a specific time
134
+ */
135
+ export async function scheduleWorkerRequestAt(endpoint, payload, scheduledTime) {
136
+ return postWorkerRequest(endpoint, payload, {
137
+ scheduleTime: Math.floor(scheduledTime.getTime() / 1000),
138
+ });
139
+ }
140
+ //# sourceMappingURL=worker-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-queue.js","sourceRoot":"","sources":["../../src/backend/worker-queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ import { ClientApiError } from './api-error.js';
2
+ /**
3
+ * Credentials mode for fetch requests
4
+ */
5
+ export type FetchCredentials = 'omit' | 'same-origin' | 'include';
6
+ /**
7
+ * Request configuration options
8
+ */
9
+ export interface RequestConfig {
10
+ /** Request headers */
11
+ headers?: Record<string, string>;
12
+ /** Request timeout in ms */
13
+ timeout?: number;
14
+ /** Number of retries */
15
+ retries?: number;
16
+ /** Retry delay in ms */
17
+ retryDelay?: number;
18
+ /** Signal for request cancellation */
19
+ signal?: AbortSignal;
20
+ /** Whether to include credentials */
21
+ credentials?: FetchCredentials;
22
+ }
23
+ /**
24
+ * API client configuration
25
+ */
26
+ export interface ApiClientConfig {
27
+ /** Base URL for API requests */
28
+ baseUrl: string;
29
+ /** Default request timeout */
30
+ timeout?: number;
31
+ /** Get current auth token */
32
+ getToken?: () => string | null | Promise<string | null>;
33
+ /** Called when token refresh is needed */
34
+ onTokenRefresh?: () => Promise<string | null>;
35
+ /** Called when auth fails (401/403) */
36
+ onAuthError?: (error: ClientApiError) => void;
37
+ /** Default headers for all requests */
38
+ defaultHeaders?: Record<string, string>;
39
+ }
40
+ /**
41
+ * Create a typed API client for frontend applications.
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * const api = createApiClient({
46
+ * baseUrl: 'https://api.qalbmatch.com',
47
+ * getToken: () => authStore.getToken(),
48
+ * onAuthError: () => authStore.logout(),
49
+ * });
50
+ *
51
+ * // GET request
52
+ * const profile = await api.get<Profile>('/profiles/me');
53
+ *
54
+ * // POST request with body
55
+ * const interest = await api.post<Interest>('/interests', {
56
+ * targetProfileId: 'prf_123',
57
+ * message: 'Assalamu Alaikum...',
58
+ * });
59
+ *
60
+ * // PUT request
61
+ * await api.put('/profiles/me', { about: 'Updated bio' });
62
+ *
63
+ * // DELETE request
64
+ * await api.delete('/profiles/me/photos/abc123');
65
+ * ```
66
+ */
67
+ export declare function createApiClient(config: ApiClientConfig): {
68
+ /**
69
+ * GET request
70
+ */
71
+ get<T>(path: string, config?: RequestConfig): Promise<T>;
72
+ /**
73
+ * POST request
74
+ */
75
+ post<T>(path: string, body?: unknown, config?: RequestConfig): Promise<T>;
76
+ /**
77
+ * PUT request
78
+ */
79
+ put<T>(path: string, body?: unknown, config?: RequestConfig): Promise<T>;
80
+ /**
81
+ * PATCH request
82
+ */
83
+ patch<T>(path: string, body?: unknown, config?: RequestConfig): Promise<T>;
84
+ /**
85
+ * DELETE request
86
+ */
87
+ delete<T>(path: string, config?: RequestConfig): Promise<T>;
88
+ /**
89
+ * Upload file with multipart/form-data
90
+ */
91
+ upload<T>(path: string, file: File | Blob, fieldName?: string, additionalData?: Record<string, string>, config?: RequestConfig): Promise<T>;
92
+ /**
93
+ * Get the configured base URL
94
+ */
95
+ getBaseUrl(): string;
96
+ };
97
+ /**
98
+ * Type for the API client
99
+ */
100
+ export type ApiClient = ReturnType<typeof createApiClient>;
101
+ //# sourceMappingURL=api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/client/api-client.ts"],"names":[],"mappings":"AAIA,OAAO,EAAoB,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGlE;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;AAElE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,sBAAsB;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,4BAA4B;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,qCAAqC;IACrC,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACxD,0CAA0C;IAC1C,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9C,uCAAuC;IACvC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAC9C,uCAAuC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe;IAqLnD;;OAEG;QACC,CAAC,QAAQ,MAAM,WAAW,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAIxD;;OAEG;SACE,CAAC,QAAQ,MAAM,SAAS,OAAO,WAAW,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAIzE;;OAEG;QACC,CAAC,QAAQ,MAAM,SAAS,OAAO,WAAW,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAIxE;;OAEG;UACG,CAAC,QAAQ,MAAM,SAAS,OAAO,WAAW,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAI1E;;OAEG;WACI,CAAC,QAAQ,MAAM,WAAW,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAI3D;;OAEG;WACU,CAAC,QACN,MAAM,QACN,IAAI,GAAG,IAAI,cACN,MAAM,mBACA,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,WAC9B,aAAa,GACrB,OAAO,CAAC,CAAC,CAAC;IAyBb;;OAEG;kBACW,MAAM;EAIvB;AAED;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC"}
@@ -0,0 +1,261 @@
1
+ // ============================================
2
+ // API Client - Typed fetch wrapper for frontend apps
3
+ // ============================================
4
+ import { ClientApiError } from './api-error.js';
5
+ import { API_CONFIG, buildApiUrl } from './endpoints.js';
6
+ /**
7
+ * Create a typed API client for frontend applications.
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * const api = createApiClient({
12
+ * baseUrl: 'https://api.qalbmatch.com',
13
+ * getToken: () => authStore.getToken(),
14
+ * onAuthError: () => authStore.logout(),
15
+ * });
16
+ *
17
+ * // GET request
18
+ * const profile = await api.get<Profile>('/profiles/me');
19
+ *
20
+ * // POST request with body
21
+ * const interest = await api.post<Interest>('/interests', {
22
+ * targetProfileId: 'prf_123',
23
+ * message: 'Assalamu Alaikum...',
24
+ * });
25
+ *
26
+ * // PUT request
27
+ * await api.put('/profiles/me', { about: 'Updated bio' });
28
+ *
29
+ * // DELETE request
30
+ * await api.delete('/profiles/me/photos/abc123');
31
+ * ```
32
+ */
33
+ export function createApiClient(config) {
34
+ const { baseUrl, timeout = API_CONFIG.DEFAULT_TIMEOUT, getToken, onTokenRefresh, onAuthError, defaultHeaders = {}, } = config;
35
+ /**
36
+ * Build headers for request
37
+ */
38
+ async function buildHeaders(customHeaders) {
39
+ const headers = new Headers({
40
+ 'Content-Type': 'application/json',
41
+ Accept: 'application/json',
42
+ ...defaultHeaders,
43
+ ...customHeaders,
44
+ });
45
+ if (getToken) {
46
+ const token = await getToken();
47
+ if (token) {
48
+ headers.set('Authorization', `Bearer ${token}`);
49
+ }
50
+ }
51
+ return headers;
52
+ }
53
+ /**
54
+ * Handle response and parse JSON
55
+ */
56
+ async function handleResponse(response) {
57
+ // No content response
58
+ if (response.status === 204) {
59
+ return undefined;
60
+ }
61
+ const contentType = response.headers.get('content-type');
62
+ const isJson = contentType?.includes('application/json');
63
+ if (!response.ok) {
64
+ if (isJson) {
65
+ const errorBody = (await response.json());
66
+ throw ClientApiError.fromResponse(response.status, errorBody);
67
+ }
68
+ else {
69
+ throw new ClientApiError(response.status, response.statusText || 'Request failed', response.status === 401
70
+ ? 'UNAUTHORIZED'
71
+ : response.status === 403
72
+ ? 'FORBIDDEN'
73
+ : response.status === 404
74
+ ? 'NOT_FOUND'
75
+ : response.status === 429
76
+ ? 'RATE_LIMIT_EXCEEDED'
77
+ : response.status >= 500
78
+ ? 'INTERNAL_ERROR'
79
+ : 'UNKNOWN_ERROR');
80
+ }
81
+ }
82
+ if (isJson) {
83
+ const data = await response.json();
84
+ // Handle wrapped response { success: true, data: ... }
85
+ if (data && typeof data === 'object' && 'success' in data && 'data' in data) {
86
+ return data.data;
87
+ }
88
+ return data;
89
+ }
90
+ return undefined;
91
+ }
92
+ /**
93
+ * Execute request with retry logic
94
+ */
95
+ async function executeRequest(url, options, requestConfig) {
96
+ const { retries = 0, retryDelay = API_CONFIG.RETRY_DELAY } = requestConfig;
97
+ let lastError;
98
+ for (let attempt = 0; attempt <= retries; attempt++) {
99
+ try {
100
+ // Create timeout abort controller
101
+ const timeoutController = new AbortController();
102
+ const timeoutId = setTimeout(() => {
103
+ timeoutController.abort();
104
+ }, requestConfig.timeout || timeout);
105
+ // Merge signals if external signal provided
106
+ const signal = requestConfig.signal
107
+ ? anySignal([requestConfig.signal, timeoutController.signal])
108
+ : timeoutController.signal;
109
+ const response = await fetch(url, {
110
+ ...options,
111
+ signal,
112
+ credentials: requestConfig.credentials || 'include',
113
+ });
114
+ clearTimeout(timeoutId);
115
+ // Handle 401 with token refresh
116
+ if (response.status === 401 && onTokenRefresh && attempt === 0) {
117
+ const newToken = await onTokenRefresh();
118
+ if (newToken) {
119
+ // Retry with new token
120
+ const headers = options.headers;
121
+ headers.set('Authorization', `Bearer ${newToken}`);
122
+ continue;
123
+ }
124
+ }
125
+ const result = await handleResponse(response);
126
+ return result;
127
+ }
128
+ catch (error) {
129
+ if (error instanceof ClientApiError) {
130
+ lastError = error;
131
+ // Handle auth errors
132
+ if (error.isAuthError() && onAuthError) {
133
+ onAuthError(error);
134
+ throw error;
135
+ }
136
+ // Only retry on retryable errors
137
+ if (!error.isRetryable() || attempt >= retries) {
138
+ throw error;
139
+ }
140
+ }
141
+ else if (error instanceof Error) {
142
+ if (error.name === 'AbortError') {
143
+ lastError = ClientApiError.timeout();
144
+ }
145
+ else {
146
+ lastError = ClientApiError.networkError(error.message);
147
+ }
148
+ if (attempt >= retries) {
149
+ throw lastError;
150
+ }
151
+ }
152
+ // Wait before retry
153
+ if (attempt < retries) {
154
+ await sleep(retryDelay * Math.pow(2, attempt)); // Exponential backoff
155
+ }
156
+ }
157
+ }
158
+ throw lastError || ClientApiError.networkError();
159
+ }
160
+ /**
161
+ * Make request helper
162
+ */
163
+ async function request(method, path, body, requestConfig = {}) {
164
+ const url = buildApiUrl(baseUrl, path);
165
+ const headers = await buildHeaders(requestConfig.headers);
166
+ const options = {
167
+ method,
168
+ headers,
169
+ };
170
+ if (body !== undefined) {
171
+ options.body = JSON.stringify(body);
172
+ }
173
+ return executeRequest(url, options, requestConfig);
174
+ }
175
+ return {
176
+ /**
177
+ * GET request
178
+ */
179
+ get(path, config) {
180
+ return request('GET', path, undefined, config);
181
+ },
182
+ /**
183
+ * POST request
184
+ */
185
+ post(path, body, config) {
186
+ return request('POST', path, body, config);
187
+ },
188
+ /**
189
+ * PUT request
190
+ */
191
+ put(path, body, config) {
192
+ return request('PUT', path, body, config);
193
+ },
194
+ /**
195
+ * PATCH request
196
+ */
197
+ patch(path, body, config) {
198
+ return request('PATCH', path, body, config);
199
+ },
200
+ /**
201
+ * DELETE request
202
+ */
203
+ delete(path, config) {
204
+ return request('DELETE', path, undefined, config);
205
+ },
206
+ /**
207
+ * Upload file with multipart/form-data
208
+ */
209
+ async upload(path, file, fieldName = 'file', additionalData, config) {
210
+ const url = buildApiUrl(baseUrl, path);
211
+ const headers = await buildHeaders(config?.headers);
212
+ // Remove Content-Type to let browser set it with boundary
213
+ headers.delete('Content-Type');
214
+ const formData = new FormData();
215
+ formData.append(fieldName, file);
216
+ if (additionalData) {
217
+ Object.entries(additionalData).forEach(([key, value]) => {
218
+ formData.append(key, value);
219
+ });
220
+ }
221
+ const options = {
222
+ method: 'POST',
223
+ headers,
224
+ body: formData,
225
+ };
226
+ return executeRequest(url, options, config || {});
227
+ },
228
+ /**
229
+ * Get the configured base URL
230
+ */
231
+ getBaseUrl() {
232
+ return baseUrl;
233
+ },
234
+ };
235
+ }
236
+ // ============================================
237
+ // Utility Functions
238
+ // ============================================
239
+ /**
240
+ * Sleep for specified milliseconds
241
+ */
242
+ function sleep(ms) {
243
+ return new Promise((resolve) => setTimeout(resolve, ms));
244
+ }
245
+ /**
246
+ * Combine multiple abort signals into one
247
+ */
248
+ function anySignal(signals) {
249
+ const controller = new AbortController();
250
+ for (const signal of signals) {
251
+ if (signal.aborted) {
252
+ controller.abort(signal.reason);
253
+ return controller.signal;
254
+ }
255
+ signal.addEventListener('abort', () => controller.abort(signal.reason), {
256
+ signal: controller.signal,
257
+ });
258
+ }
259
+ return controller.signal;
260
+ }
261
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/client/api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Error codes returned from the API
3
+ */
4
+ export type ClientApiErrorCode = 'BAD_REQUEST' | 'UNAUTHORIZED' | 'FORBIDDEN' | 'NOT_FOUND' | 'CONFLICT' | 'VALIDATION_ERROR' | 'RATE_LIMIT_EXCEEDED' | 'INTERNAL_ERROR' | 'SERVICE_UNAVAILABLE' | 'TIMEOUT' | 'PAYMENT_REQUIRED' | 'UNPROCESSABLE_ENTITY' | 'NETWORK_ERROR' | 'UNKNOWN_ERROR';
5
+ /**
6
+ * Validation error detail from API
7
+ */
8
+ export interface ClientValidationError {
9
+ field: string;
10
+ message: string;
11
+ code?: string;
12
+ }
13
+ /**
14
+ * Error response structure from API
15
+ */
16
+ export interface ApiErrorResponse {
17
+ success: false;
18
+ error: {
19
+ code: ClientApiErrorCode;
20
+ message: string;
21
+ details?: ClientValidationError[];
22
+ timestamp: string;
23
+ };
24
+ }
25
+ /**
26
+ * Client-side API error class.
27
+ * Used in mobile apps and admin panels to handle API errors.
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * try {
32
+ * const user = await apiClient.get('/users/me');
33
+ * } catch (error) {
34
+ * if (error instanceof ClientApiError) {
35
+ * if (error.code === 'UNAUTHORIZED') {
36
+ * // Redirect to login
37
+ * } else if (error.code === 'VALIDATION_ERROR') {
38
+ * // Show field errors
39
+ * error.details?.forEach(d => setFieldError(d.field, d.message));
40
+ * }
41
+ * }
42
+ * }
43
+ * ```
44
+ */
45
+ export declare class ClientApiError extends Error {
46
+ /**
47
+ * HTTP status code (e.g., 400, 401, 404, 500)
48
+ */
49
+ readonly statusCode: number;
50
+ /**
51
+ * Machine-readable error code
52
+ */
53
+ readonly code: ClientApiErrorCode;
54
+ /**
55
+ * Validation error details
56
+ */
57
+ readonly details?: ClientValidationError[];
58
+ /**
59
+ * Original response body
60
+ */
61
+ readonly response?: ApiErrorResponse;
62
+ /**
63
+ * Whether this is a network error (no response from server)
64
+ */
65
+ readonly isNetworkError: boolean;
66
+ constructor(statusCode: number, message: string, code?: ClientApiErrorCode, details?: ClientValidationError[], response?: ApiErrorResponse, isNetworkError?: boolean);
67
+ /**
68
+ * Create from API error response
69
+ */
70
+ static fromResponse(statusCode: number, response: ApiErrorResponse): ClientApiError;
71
+ /**
72
+ * Create from network error (no response)
73
+ */
74
+ static networkError(message?: string): ClientApiError;
75
+ /**
76
+ * Create from timeout
77
+ */
78
+ static timeout(message?: string): ClientApiError;
79
+ /**
80
+ * Check if error is a specific code
81
+ */
82
+ is(code: ClientApiErrorCode): boolean;
83
+ /**
84
+ * Check if error is authentication related
85
+ */
86
+ isAuthError(): boolean;
87
+ /**
88
+ * Check if error is recoverable (can retry)
89
+ */
90
+ isRetryable(): boolean;
91
+ /**
92
+ * Get error message for a specific field
93
+ */
94
+ getFieldError(field: string): string | undefined;
95
+ /**
96
+ * Get all field errors as a map
97
+ */
98
+ getFieldErrors(): Record<string, string>;
99
+ }
100
+ //# sourceMappingURL=api-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-error.d.ts","sourceRoot":"","sources":["../../src/client/api-error.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAC1B,aAAa,GACb,cAAc,GACd,WAAW,GACX,WAAW,GACX,UAAU,GACV,kBAAkB,GAClB,qBAAqB,GACrB,gBAAgB,GAChB,qBAAqB,GACrB,SAAS,GACT,kBAAkB,GAClB,sBAAsB,GACtB,eAAe,GACf,eAAe,CAAC;AAEpB;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE;QACL,IAAI,EAAE,kBAAkB,CAAC;QACzB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,qBAAqB,EAAE,CAAC;QAClC,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,cAAe,SAAQ,KAAK;IACvC;;OAEG;IACH,SAAgB,UAAU,EAAE,MAAM,CAAC;IAEnC;;OAEG;IACH,SAAgB,IAAI,EAAE,kBAAkB,CAAC;IAEzC;;OAEG;IACH,SAAgB,OAAO,CAAC,EAAE,qBAAqB,EAAE,CAAC;IAElD;;OAEG;IACH,SAAgB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAE5C;;OAEG;IACH,SAAgB,cAAc,EAAE,OAAO,CAAC;gBAGtC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,kBAAoC,EAC1C,OAAO,CAAC,EAAE,qBAAqB,EAAE,EACjC,QAAQ,CAAC,EAAE,gBAAgB,EAC3B,cAAc,GAAE,OAAe;IAYjC;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,GAAG,cAAc;IAUnF;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,OAAO,GAAE,MAAwB,GAAG,cAAc;IAItE;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,GAAE,MAA4B,GAAG,cAAc;IAIrE;;OAEG;IACH,EAAE,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO;IAIrC;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,WAAW,IAAI,OAAO;IAStB;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIhD;;OAEG;IACH,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAOzC"}