@dealcrawl/sdk 2.0.2 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/README.md +47 -2
  2. package/dist/{sdk/src/client.d.ts → client.d.ts} +6 -6
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/{sdk/src/client.js → client.js} +8 -8
  5. package/dist/client.js.map +1 -0
  6. package/dist/{sdk/src/error.d.ts → error.d.ts} +3 -2
  7. package/dist/error.d.ts.map +1 -0
  8. package/dist/{sdk/src/error.js → error.js} +15 -2
  9. package/dist/error.js.map +1 -0
  10. package/dist/{sdk/src/index.d.ts → index.d.ts} +3 -3
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/resources/account.d.ts.map +1 -0
  14. package/dist/resources/account.js.map +1 -0
  15. package/dist/{sdk/src/resources → resources}/crawl.d.ts +19 -5
  16. package/dist/resources/crawl.d.ts.map +1 -0
  17. package/dist/{sdk/src/resources → resources}/crawl.js +44 -15
  18. package/dist/resources/crawl.js.map +1 -0
  19. package/dist/{sdk/src/resources → resources}/data.d.ts +2 -2
  20. package/dist/resources/data.d.ts.map +1 -0
  21. package/dist/{sdk/src/resources → resources}/data.js +6 -0
  22. package/dist/resources/data.js.map +1 -0
  23. package/dist/resources/dork.d.ts.map +1 -0
  24. package/dist/{sdk/src/resources → resources}/dork.js +6 -6
  25. package/dist/resources/dork.js.map +1 -0
  26. package/dist/resources/extract.d.ts.map +1 -0
  27. package/dist/resources/extract.js.map +1 -0
  28. package/dist/resources/index.d.ts.map +1 -0
  29. package/dist/resources/index.js.map +1 -0
  30. package/dist/{sdk/src/resources → resources}/keys.d.ts +1 -1
  31. package/dist/resources/keys.d.ts.map +1 -0
  32. package/dist/{sdk/src/resources → resources}/keys.js +1 -1
  33. package/dist/resources/keys.js.map +1 -0
  34. package/dist/resources/scrape.d.ts.map +1 -0
  35. package/dist/resources/scrape.js.map +1 -0
  36. package/dist/resources/status.d.ts.map +1 -0
  37. package/dist/resources/status.js.map +1 -0
  38. package/dist/resources/webhooks.d.ts.map +1 -0
  39. package/dist/resources/webhooks.js.map +1 -0
  40. package/dist/{sdk/src/types → types}/config.d.ts +1 -1
  41. package/dist/types/config.d.ts.map +1 -0
  42. package/dist/types/config.js.map +1 -0
  43. package/dist/types/index.d.ts.map +1 -0
  44. package/dist/types/index.js.map +1 -0
  45. package/dist/{sdk/src/types → types}/options.d.ts +45 -3
  46. package/dist/types/options.d.ts.map +1 -0
  47. package/dist/types/options.js.map +1 -0
  48. package/dist/{sdk/src/types → types}/responses.d.ts +38 -1
  49. package/dist/types/responses.d.ts.map +1 -0
  50. package/dist/types/responses.js.map +1 -0
  51. package/dist/types/shared.d.ts +234 -0
  52. package/dist/types/shared.d.ts.map +1 -0
  53. package/dist/{shared/src/constants/errors.js → types/shared.js} +8 -10
  54. package/dist/types/shared.js.map +1 -0
  55. package/dist/utils/polling.d.ts.map +1 -0
  56. package/dist/utils/polling.js.map +1 -0
  57. package/dist/{sdk/src/utils → utils}/request.d.ts +1 -1
  58. package/dist/utils/request.d.ts.map +1 -0
  59. package/dist/{sdk/src/utils → utils}/request.js +39 -8
  60. package/dist/utils/request.js.map +1 -0
  61. package/package.json +6 -6
  62. package/dist/sdk/src/client.d.ts.map +0 -1
  63. package/dist/sdk/src/client.js.map +0 -1
  64. package/dist/sdk/src/error.d.ts.map +0 -1
  65. package/dist/sdk/src/error.js.map +0 -1
  66. package/dist/sdk/src/index.d.ts.map +0 -1
  67. package/dist/sdk/src/index.js.map +0 -1
  68. package/dist/sdk/src/resources/account.d.ts.map +0 -1
  69. package/dist/sdk/src/resources/account.js.map +0 -1
  70. package/dist/sdk/src/resources/crawl.d.ts.map +0 -1
  71. package/dist/sdk/src/resources/crawl.js.map +0 -1
  72. package/dist/sdk/src/resources/data.d.ts.map +0 -1
  73. package/dist/sdk/src/resources/data.js.map +0 -1
  74. package/dist/sdk/src/resources/dork.d.ts.map +0 -1
  75. package/dist/sdk/src/resources/dork.js.map +0 -1
  76. package/dist/sdk/src/resources/extract.d.ts.map +0 -1
  77. package/dist/sdk/src/resources/extract.js.map +0 -1
  78. package/dist/sdk/src/resources/index.d.ts.map +0 -1
  79. package/dist/sdk/src/resources/index.js.map +0 -1
  80. package/dist/sdk/src/resources/keys.d.ts.map +0 -1
  81. package/dist/sdk/src/resources/keys.js.map +0 -1
  82. package/dist/sdk/src/resources/scrape.d.ts.map +0 -1
  83. package/dist/sdk/src/resources/scrape.js.map +0 -1
  84. package/dist/sdk/src/resources/status.d.ts.map +0 -1
  85. package/dist/sdk/src/resources/status.js.map +0 -1
  86. package/dist/sdk/src/resources/webhooks.d.ts.map +0 -1
  87. package/dist/sdk/src/resources/webhooks.js.map +0 -1
  88. package/dist/sdk/src/types/config.d.ts.map +0 -1
  89. package/dist/sdk/src/types/config.js.map +0 -1
  90. package/dist/sdk/src/types/index.d.ts.map +0 -1
  91. package/dist/sdk/src/types/index.js.map +0 -1
  92. package/dist/sdk/src/types/options.d.ts.map +0 -1
  93. package/dist/sdk/src/types/options.js.map +0 -1
  94. package/dist/sdk/src/types/responses.d.ts.map +0 -1
  95. package/dist/sdk/src/types/responses.js.map +0 -1
  96. package/dist/sdk/src/utils/polling.d.ts.map +0 -1
  97. package/dist/sdk/src/utils/polling.js.map +0 -1
  98. package/dist/sdk/src/utils/request.d.ts.map +0 -1
  99. package/dist/sdk/src/utils/request.js.map +0 -1
  100. package/dist/shared/src/constants/errors.d.ts +0 -26
  101. package/dist/shared/src/constants/errors.d.ts.map +0 -1
  102. package/dist/shared/src/constants/errors.js.map +0 -1
  103. package/dist/shared/src/constants/http.d.ts +0 -26
  104. package/dist/shared/src/constants/http.d.ts.map +0 -1
  105. package/dist/shared/src/constants/http.js +0 -26
  106. package/dist/shared/src/constants/http.js.map +0 -1
  107. package/dist/shared/src/constants/index.d.ts +0 -4
  108. package/dist/shared/src/constants/index.d.ts.map +0 -1
  109. package/dist/shared/src/constants/index.js +0 -5
  110. package/dist/shared/src/constants/index.js.map +0 -1
  111. package/dist/shared/src/constants/limits.d.ts +0 -52
  112. package/dist/shared/src/constants/limits.d.ts.map +0 -1
  113. package/dist/shared/src/constants/limits.js +0 -43
  114. package/dist/shared/src/constants/limits.js.map +0 -1
  115. package/dist/shared/src/index.d.ts +0 -5
  116. package/dist/shared/src/index.d.ts.map +0 -1
  117. package/dist/shared/src/index.js +0 -11
  118. package/dist/shared/src/index.js.map +0 -1
  119. package/dist/shared/src/lib/index.d.ts +0 -2
  120. package/dist/shared/src/lib/index.d.ts.map +0 -1
  121. package/dist/shared/src/lib/index.js +0 -2
  122. package/dist/shared/src/lib/index.js.map +0 -1
  123. package/dist/shared/src/lib/redis.d.ts +0 -14
  124. package/dist/shared/src/lib/redis.d.ts.map +0 -1
  125. package/dist/shared/src/lib/redis.js +0 -60
  126. package/dist/shared/src/lib/redis.js.map +0 -1
  127. package/dist/shared/src/types/api-key.types.d.ts +0 -94
  128. package/dist/shared/src/types/api-key.types.d.ts.map +0 -1
  129. package/dist/shared/src/types/api-key.types.js +0 -30
  130. package/dist/shared/src/types/api-key.types.js.map +0 -1
  131. package/dist/shared/src/types/api.types.d.ts +0 -38
  132. package/dist/shared/src/types/api.types.d.ts.map +0 -1
  133. package/dist/shared/src/types/api.types.js +0 -2
  134. package/dist/shared/src/types/api.types.js.map +0 -1
  135. package/dist/shared/src/types/client.types.d.ts +0 -73
  136. package/dist/shared/src/types/client.types.d.ts.map +0 -1
  137. package/dist/shared/src/types/client.types.js +0 -9
  138. package/dist/shared/src/types/client.types.js.map +0 -1
  139. package/dist/shared/src/types/crawl.types.d.ts +0 -65
  140. package/dist/shared/src/types/crawl.types.d.ts.map +0 -1
  141. package/dist/shared/src/types/crawl.types.js +0 -2
  142. package/dist/shared/src/types/crawl.types.js.map +0 -1
  143. package/dist/shared/src/types/deal.types.d.ts +0 -210
  144. package/dist/shared/src/types/deal.types.d.ts.map +0 -1
  145. package/dist/shared/src/types/deal.types.js +0 -6
  146. package/dist/shared/src/types/deal.types.js.map +0 -1
  147. package/dist/shared/src/types/dork.types.d.ts +0 -29
  148. package/dist/shared/src/types/dork.types.d.ts.map +0 -1
  149. package/dist/shared/src/types/dork.types.js +0 -2
  150. package/dist/shared/src/types/dork.types.js.map +0 -1
  151. package/dist/shared/src/types/index.d.ts +0 -8
  152. package/dist/shared/src/types/index.d.ts.map +0 -1
  153. package/dist/shared/src/types/index.js +0 -9
  154. package/dist/shared/src/types/index.js.map +0 -1
  155. package/dist/shared/src/types/scrape.types.d.ts +0 -151
  156. package/dist/shared/src/types/scrape.types.d.ts.map +0 -1
  157. package/dist/shared/src/types/scrape.types.js +0 -2
  158. package/dist/shared/src/types/scrape.types.js.map +0 -1
  159. package/dist/shared/src/utils/date.d.ts +0 -7
  160. package/dist/shared/src/utils/date.d.ts.map +0 -1
  161. package/dist/shared/src/utils/date.js +0 -25
  162. package/dist/shared/src/utils/date.js.map +0 -1
  163. package/dist/shared/src/utils/hash.d.ts +0 -4
  164. package/dist/shared/src/utils/hash.d.ts.map +0 -1
  165. package/dist/shared/src/utils/hash.js +0 -21
  166. package/dist/shared/src/utils/hash.js.map +0 -1
  167. package/dist/shared/src/utils/index.d.ts +0 -7
  168. package/dist/shared/src/utils/index.d.ts.map +0 -1
  169. package/dist/shared/src/utils/index.js +0 -8
  170. package/dist/shared/src/utils/index.js.map +0 -1
  171. package/dist/shared/src/utils/logger.d.ts +0 -66
  172. package/dist/shared/src/utils/logger.d.ts.map +0 -1
  173. package/dist/shared/src/utils/logger.js +0 -268
  174. package/dist/shared/src/utils/logger.js.map +0 -1
  175. package/dist/shared/src/utils/retry.d.ts +0 -11
  176. package/dist/shared/src/utils/retry.d.ts.map +0 -1
  177. package/dist/shared/src/utils/retry.js +0 -36
  178. package/dist/shared/src/utils/retry.js.map +0 -1
  179. package/dist/shared/src/utils/url-validator.d.ts +0 -37
  180. package/dist/shared/src/utils/url-validator.d.ts.map +0 -1
  181. package/dist/shared/src/utils/url-validator.js +0 -179
  182. package/dist/shared/src/utils/url-validator.js.map +0 -1
  183. package/dist/shared/src/utils/url.d.ts +0 -6
  184. package/dist/shared/src/utils/url.d.ts.map +0 -1
  185. package/dist/shared/src/utils/url.js +0 -56
  186. package/dist/shared/src/utils/url.js.map +0 -1
  187. /package/dist/{sdk/src/index.js → index.js} +0 -0
  188. /package/dist/{sdk/src/resources → resources}/account.d.ts +0 -0
  189. /package/dist/{sdk/src/resources → resources}/account.js +0 -0
  190. /package/dist/{sdk/src/resources → resources}/dork.d.ts +0 -0
  191. /package/dist/{sdk/src/resources → resources}/extract.d.ts +0 -0
  192. /package/dist/{sdk/src/resources → resources}/extract.js +0 -0
  193. /package/dist/{sdk/src/resources → resources}/index.d.ts +0 -0
  194. /package/dist/{sdk/src/resources → resources}/index.js +0 -0
  195. /package/dist/{sdk/src/resources → resources}/scrape.d.ts +0 -0
  196. /package/dist/{sdk/src/resources → resources}/scrape.js +0 -0
  197. /package/dist/{sdk/src/resources → resources}/status.d.ts +0 -0
  198. /package/dist/{sdk/src/resources → resources}/status.js +0 -0
  199. /package/dist/{sdk/src/resources → resources}/webhooks.d.ts +0 -0
  200. /package/dist/{sdk/src/resources → resources}/webhooks.js +0 -0
  201. /package/dist/{sdk/src/types → types}/config.js +0 -0
  202. /package/dist/{sdk/src/types → types}/index.d.ts +0 -0
  203. /package/dist/{sdk/src/types → types}/index.js +0 -0
  204. /package/dist/{sdk/src/types → types}/options.js +0 -0
  205. /package/dist/{sdk/src/types → types}/responses.js +0 -0
  206. /package/dist/{sdk/src/utils → utils}/polling.d.ts +0 -0
  207. /package/dist/{sdk/src/utils → utils}/polling.js +0 -0
@@ -1,268 +0,0 @@
1
- /**
2
- * Professional structured logger for DealCrawl
3
- * - Environment-aware (verbose in dev, minimal in prod)
4
- * - Structured JSON output in production
5
- * - Colored console output in development
6
- * - Correlation ID support for request tracing
7
- */
8
- // ANSI color codes for terminal
9
- const colors = {
10
- reset: "\x1b[0m",
11
- bright: "\x1b[1m",
12
- dim: "\x1b[2m",
13
- // Foreground
14
- red: "\x1b[31m",
15
- green: "\x1b[32m",
16
- yellow: "\x1b[33m",
17
- blue: "\x1b[34m",
18
- magenta: "\x1b[35m",
19
- cyan: "\x1b[36m",
20
- white: "\x1b[37m",
21
- gray: "\x1b[90m",
22
- // Background
23
- bgRed: "\x1b[41m",
24
- bgYellow: "\x1b[43m",
25
- };
26
- const levelColors = {
27
- debug: colors.gray,
28
- info: colors.cyan,
29
- warn: colors.yellow,
30
- error: colors.red,
31
- };
32
- const levelIcons = {
33
- debug: "🔍",
34
- info: "ℹ️ ",
35
- warn: "⚠️ ",
36
- error: "❌",
37
- };
38
- // Log level priority (lower = more verbose)
39
- const levelPriority = {
40
- debug: 0,
41
- info: 1,
42
- warn: 2,
43
- error: 3,
44
- };
45
- function getMinLevel() {
46
- const env = process.env.NODE_ENV || "development";
47
- const logLevel = process.env.LOG_LEVEL;
48
- if (logLevel && levelPriority[logLevel] !== undefined) {
49
- return logLevel;
50
- }
51
- // Default: debug in dev, info in prod
52
- return env === "production" ? "info" : "debug";
53
- }
54
- function shouldLog(level) {
55
- const minLevel = getMinLevel();
56
- return levelPriority[level] >= levelPriority[minLevel];
57
- }
58
- function isDev() {
59
- return process.env.NODE_ENV !== "production";
60
- }
61
- function formatTimestamp() {
62
- const now = new Date();
63
- if (isDev()) {
64
- // Shorter format for dev: HH:MM:SS.mmm
65
- return now.toISOString().slice(11, 23);
66
- }
67
- return now.toISOString();
68
- }
69
- function formatContextForDev(context) {
70
- if (!context || Object.keys(context).length === 0)
71
- return "";
72
- const parts = [];
73
- // Priority fields first
74
- if (context.requestId)
75
- parts.push(`${colors.magenta}req:${context.requestId.slice(0, 8)}${colors.reset}`);
76
- if (context.jobId)
77
- parts.push(`${colors.blue}job:${context.jobId.slice(0, 8)}${colors.reset}`);
78
- if (context.clientId)
79
- parts.push(`${colors.green}client:${context.clientId.slice(0, 8)}${colors.reset}`);
80
- if (context.operation)
81
- parts.push(`${colors.cyan}op:${context.operation}${colors.reset}`);
82
- if (context.durationMs !== undefined)
83
- parts.push(`${colors.yellow}${context.durationMs}ms${colors.reset}`);
84
- // Other fields
85
- const skipFields = [
86
- "requestId",
87
- "jobId",
88
- "clientId",
89
- "operation",
90
- "durationMs",
91
- ];
92
- const otherFields = Object.entries(context)
93
- .filter(([key]) => !skipFields.includes(key))
94
- .map(([key, value]) => {
95
- const displayValue = typeof value === "object" ? JSON.stringify(value) : String(value);
96
- return `${colors.gray}${key}=${displayValue}${colors.reset}`;
97
- });
98
- parts.push(...otherFields);
99
- return parts.length > 0
100
- ? ` ${colors.dim}[${parts.join(" ")}]${colors.reset}`
101
- : "";
102
- }
103
- function formatError(error) {
104
- return {
105
- message: error.message,
106
- stack: isDev() ? error.stack : undefined,
107
- code: error.code,
108
- };
109
- }
110
- class Logger {
111
- service;
112
- defaultContext;
113
- constructor(service, defaultContext = {}) {
114
- this.service = service;
115
- this.defaultContext = defaultContext;
116
- }
117
- /**
118
- * Create a child logger with additional default context
119
- */
120
- child(context) {
121
- return new Logger(this.service, { ...this.defaultContext, ...context });
122
- }
123
- /**
124
- * Create a logger for a specific request/job
125
- */
126
- forRequest(requestId) {
127
- return this.child({ requestId });
128
- }
129
- forJob(jobId, clientId) {
130
- return this.child({ jobId, clientId });
131
- }
132
- log(level, message, context, error) {
133
- if (!shouldLog(level))
134
- return;
135
- const mergedContext = { ...this.defaultContext, ...context };
136
- const entry = {
137
- timestamp: formatTimestamp(),
138
- level,
139
- service: this.service,
140
- message,
141
- context: Object.keys(mergedContext).length > 0 ? mergedContext : undefined,
142
- error: error ? formatError(error) : undefined,
143
- };
144
- if (isDev()) {
145
- this.logDev(entry);
146
- }
147
- else {
148
- this.logProd(entry);
149
- }
150
- }
151
- logDev(entry) {
152
- const color = levelColors[entry.level];
153
- const icon = levelIcons[entry.level];
154
- const contextStr = formatContextForDev(entry.context);
155
- const prefix = `${colors.dim}${entry.timestamp}${colors.reset} ${icon} ${color}${entry.level.toUpperCase().padEnd(5)}${colors.reset}`;
156
- const serviceTag = `${colors.bright}[${this.service}]${colors.reset}`;
157
- let output = `${prefix} ${serviceTag} ${entry.message}${contextStr}`;
158
- if (entry.error) {
159
- output += `\n${colors.red} └─ Error: ${entry.error.message}${colors.reset}`;
160
- if (entry.error.stack) {
161
- const stackLines = entry.error.stack.split("\n").slice(1, 4);
162
- output += `\n${colors.dim}${stackLines.map((l) => " " + l.trim()).join("\n")}${colors.reset}`;
163
- }
164
- }
165
- const logFn = entry.level === "error"
166
- ? console.error
167
- : entry.level === "warn"
168
- ? console.warn
169
- : console.log;
170
- logFn(output);
171
- }
172
- logProd(entry) {
173
- // Structured JSON for production (easy to parse by log aggregators)
174
- const logFn = entry.level === "error"
175
- ? console.error
176
- : entry.level === "warn"
177
- ? console.warn
178
- : console.log;
179
- logFn(JSON.stringify(entry));
180
- }
181
- // Log level methods
182
- debug(message, context) {
183
- this.log("debug", message, context);
184
- }
185
- info(message, context) {
186
- this.log("info", message, context);
187
- }
188
- warn(message, context, error) {
189
- this.log("warn", message, context, error);
190
- }
191
- error(message, error, context) {
192
- this.log("error", message, context, error);
193
- }
194
- // Convenience methods
195
- /**
196
- * Log the start of an operation (returns a function to log completion with duration)
197
- */
198
- startOperation(operation, context) {
199
- const startTime = Date.now();
200
- this.debug(`Starting ${operation}`, { ...context, operation });
201
- return () => {
202
- const durationMs = Date.now() - startTime;
203
- this.info(`Completed ${operation}`, {
204
- ...context,
205
- operation,
206
- durationMs,
207
- });
208
- };
209
- }
210
- /**
211
- * Measure and log an async operation
212
- */
213
- async measure(operation, fn, context) {
214
- const startTime = Date.now();
215
- this.debug(`Starting ${operation}`, { ...context, operation });
216
- try {
217
- const result = await fn();
218
- const durationMs = Date.now() - startTime;
219
- this.info(`Completed ${operation}`, {
220
- ...context,
221
- operation,
222
- durationMs,
223
- });
224
- return result;
225
- }
226
- catch (error) {
227
- const durationMs = Date.now() - startTime;
228
- this.error(`Failed ${operation}`, error, {
229
- ...context,
230
- operation,
231
- durationMs,
232
- });
233
- throw error;
234
- }
235
- }
236
- /**
237
- * Log HTTP request (for API middleware)
238
- */
239
- request(method, path, statusCode, durationMs, context) {
240
- const level = statusCode >= 500 ? "error" : statusCode >= 400 ? "warn" : "info";
241
- this.log(level, `${method} ${path} ${statusCode}`, {
242
- ...context,
243
- durationMs,
244
- statusCode,
245
- });
246
- }
247
- /**
248
- * Log job progress
249
- */
250
- jobProgress(progress, step, context) {
251
- this.debug(`Job progress: ${progress}% - ${step}`, {
252
- ...context,
253
- progress,
254
- });
255
- }
256
- }
257
- // Pre-configured loggers for each service
258
- export const apiLogger = new Logger("api");
259
- export const workerLogger = new Logger("worker");
260
- export const coreLogger = new Logger("core");
261
- export const aiLogger = new Logger("ai");
262
- // Factory function for custom loggers
263
- export function createLogger(service, defaultContext) {
264
- return new Logger(service, defaultContext);
265
- }
266
- // Export the class for type usage
267
- export { Logger };
268
- //# sourceMappingURL=logger.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../../../shared/src/utils/logger.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- export interface RetryOptions {
2
- maxRetries?: number;
3
- initialDelayMs?: number;
4
- maxDelayMs?: number;
5
- backoffMultiplier?: number;
6
- shouldRetry?: (error: Error, attempt: number) => boolean;
7
- }
8
- export declare function retry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
9
- export declare function sleep(ms: number): Promise<void>;
10
- export declare function withTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T>;
11
- //# sourceMappingURL=retry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../../../../shared/src/utils/retry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;CAC1D;AAUD,wBAAsB,KAAK,CAAC,CAAC,EAC3B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,CAAC,CAAC,CAqBZ;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED,wBAAsB,WAAW,CAAC,CAAC,EACjC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,CAAC,CAAC,CAMZ"}
@@ -1,36 +0,0 @@
1
- const defaultOptions = {
2
- maxRetries: 3,
3
- initialDelayMs: 1000,
4
- maxDelayMs: 30000,
5
- backoffMultiplier: 2,
6
- shouldRetry: () => true,
7
- };
8
- export async function retry(fn, options) {
9
- const opts = { ...defaultOptions, ...options };
10
- let lastError = null;
11
- let delay = opts.initialDelayMs;
12
- for (let attempt = 1; attempt <= opts.maxRetries; attempt++) {
13
- try {
14
- return await fn();
15
- }
16
- catch (error) {
17
- lastError = error instanceof Error ? error : new Error(String(error));
18
- if (attempt === opts.maxRetries || !opts.shouldRetry(lastError, attempt)) {
19
- throw lastError;
20
- }
21
- await sleep(delay);
22
- delay = Math.min(delay * opts.backoffMultiplier, opts.maxDelayMs);
23
- }
24
- }
25
- throw lastError;
26
- }
27
- export function sleep(ms) {
28
- return new Promise((resolve) => setTimeout(resolve, ms));
29
- }
30
- export async function withTimeout(promise, timeoutMs) {
31
- const timeout = new Promise((_, reject) => {
32
- setTimeout(() => reject(new Error("Operation timed out")), timeoutMs);
33
- });
34
- return Promise.race([promise, timeout]);
35
- }
36
- //# sourceMappingURL=retry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../../../shared/src/utils/retry.ts"],"names":[],"mappings":"AAQA,MAAM,cAAc,GAA2B;IAC7C,UAAU,EAAE,CAAC;IACb,cAAc,EAAE,IAAI;IACpB,UAAU,EAAE,KAAK;IACjB,iBAAiB,EAAE,CAAC;IACpB,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI;CACxB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,KAAK,CACzB,EAAoB,EACpB,OAAsB;IAEtB,MAAM,IAAI,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,EAAE,CAAC;IAC/C,IAAI,SAAS,GAAiB,IAAI,CAAC;IACnC,IAAI,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC;IAEhC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QAC5D,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAEtE,IAAI,OAAO,KAAK,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC;gBACzE,MAAM,SAAS,CAAC;YAClB,CAAC;YAED,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;YACnB,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAmB,EACnB,SAAiB;IAEjB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAC/C,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAC1C,CAAC"}
@@ -1,37 +0,0 @@
1
- /**
2
- * URL Validator with SSRF Protection
3
- *
4
- * Prevents Server-Side Request Forgery (SSRF) attacks by blocking:
5
- * - Private IP ranges (127.0.0.1, 192.168.x.x, 10.x.x.x, etc.)
6
- * - Local/Link-local addresses
7
- * - File:// and other dangerous protocols
8
- * - Localhost and internal domains
9
- */
10
- export declare class URLValidationError extends Error {
11
- readonly code: "INVALID_URL" | "BLOCKED_PROTOCOL" | "BLOCKED_HOSTNAME" | "PRIVATE_IP" | "SSRF_RISK";
12
- constructor(message: string, code: "INVALID_URL" | "BLOCKED_PROTOCOL" | "BLOCKED_HOSTNAME" | "PRIVATE_IP" | "SSRF_RISK");
13
- }
14
- /**
15
- * Validate URL for SSRF protection
16
- *
17
- * @throws {URLValidationError} If URL is invalid or poses SSRF risk
18
- */
19
- export declare function validateURL(urlString: string): URL;
20
- /**
21
- * Validate URL and return boolean (no throw)
22
- */
23
- export declare function isValidURL(urlString: string): boolean;
24
- /**
25
- * Validate multiple URLs
26
- * @returns Array of validation results
27
- */
28
- export declare function validateURLs(urls: string[]): Array<{
29
- url: string;
30
- valid: boolean;
31
- error?: string;
32
- }>;
33
- /**
34
- * Sanitize URL by removing dangerous components
35
- */
36
- export declare function sanitizeURL(urlString: string): string | null;
37
- //# sourceMappingURL=url-validator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"url-validator.d.ts","sourceRoot":"","sources":["../../../../../shared/src/utils/url-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA4CH,qBAAa,kBAAmB,SAAQ,KAAK;aAGzB,IAAI,EAChB,aAAa,GACb,kBAAkB,GAClB,kBAAkB,GAClB,YAAY,GACZ,WAAW;gBANf,OAAO,EAAE,MAAM,EACC,IAAI,EAChB,aAAa,GACb,kBAAkB,GAClB,kBAAkB,GAClB,YAAY,GACZ,WAAW;CAKlB;AAkDD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,GAAG,CA4DlD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAOrD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EAAE,GACb,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAaxD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAe5D"}
@@ -1,179 +0,0 @@
1
- /**
2
- * URL Validator with SSRF Protection
3
- *
4
- * Prevents Server-Side Request Forgery (SSRF) attacks by blocking:
5
- * - Private IP ranges (127.0.0.1, 192.168.x.x, 10.x.x.x, etc.)
6
- * - Local/Link-local addresses
7
- * - File:// and other dangerous protocols
8
- * - Localhost and internal domains
9
- */
10
- // ============================================
11
- // PRIVATE IP RANGES (RFC 1918 + others)
12
- // ============================================
13
- const PRIVATE_IP_PATTERNS = [
14
- // IPv4 Loopback
15
- /^127\./,
16
- // IPv4 Private ranges
17
- /^10\./,
18
- /^172\.(1[6-9]|2[0-9]|3[0-1])\./,
19
- /^192\.168\./,
20
- // Link-local
21
- /^169\.254\./,
22
- // IPv4 Broadcast
23
- /^255\.255\.255\.255$/,
24
- // IPv6 Loopback
25
- /^::1$/,
26
- /^::ffff:127\./,
27
- // IPv6 Link-local
28
- /^fe80:/i,
29
- // IPv6 Unique local
30
- /^fc00:/i,
31
- /^fd00:/i,
32
- ];
33
- const BLOCKED_HOSTNAMES = [
34
- "localhost",
35
- "0.0.0.0",
36
- "[::]",
37
- "[::1]",
38
- "metadata.google.internal", // GCP metadata
39
- "169.254.169.254", // AWS/Azure metadata
40
- ];
41
- const DANGEROUS_PROTOCOLS = ["file:", "ftp:", "gopher:", "jar:", "data:"];
42
- const ALLOWED_PROTOCOLS = ["http:", "https:"];
43
- // ============================================
44
- // VALIDATION ERROR TYPES
45
- // ============================================
46
- export class URLValidationError extends Error {
47
- code;
48
- constructor(message, code) {
49
- super(message);
50
- this.code = code;
51
- this.name = "URLValidationError";
52
- }
53
- }
54
- // ============================================
55
- // VALIDATION FUNCTIONS
56
- // ============================================
57
- /**
58
- * Check if hostname is a private/internal IP
59
- */
60
- function isPrivateIP(hostname) {
61
- // Remove brackets from IPv6
62
- const cleaned = hostname.replace(/^\[|\]$/g, "");
63
- for (const pattern of PRIVATE_IP_PATTERNS) {
64
- if (pattern.test(cleaned)) {
65
- return true;
66
- }
67
- }
68
- return false;
69
- }
70
- /**
71
- * Check if hostname is blocked
72
- */
73
- function isBlockedHostname(hostname) {
74
- const lower = hostname.toLowerCase();
75
- // Check exact matches
76
- if (BLOCKED_HOSTNAMES.includes(lower)) {
77
- return true;
78
- }
79
- // Check if ends with .local (mDNS)
80
- if (lower.endsWith(".local")) {
81
- return true;
82
- }
83
- // Check if is an internal domain
84
- if (lower.endsWith(".internal") ||
85
- lower.endsWith(".localhost") ||
86
- lower === "localhost") {
87
- return true;
88
- }
89
- return false;
90
- }
91
- /**
92
- * Validate URL for SSRF protection
93
- *
94
- * @throws {URLValidationError} If URL is invalid or poses SSRF risk
95
- */
96
- export function validateURL(urlString) {
97
- // Parse URL
98
- let url;
99
- try {
100
- url = new URL(urlString);
101
- }
102
- catch {
103
- throw new URLValidationError(`Invalid URL format: "${urlString}"`, "INVALID_URL");
104
- }
105
- // Check protocol
106
- if (!ALLOWED_PROTOCOLS.includes(url.protocol)) {
107
- if (DANGEROUS_PROTOCOLS.includes(url.protocol)) {
108
- throw new URLValidationError(`Dangerous protocol blocked: ${url.protocol}`, "BLOCKED_PROTOCOL");
109
- }
110
- throw new URLValidationError(`Protocol not allowed: ${url.protocol} (only HTTP/HTTPS allowed)`, "BLOCKED_PROTOCOL");
111
- }
112
- // Check for blocked hostnames
113
- if (isBlockedHostname(url.hostname)) {
114
- throw new URLValidationError(`Access to internal/localhost addresses is blocked: ${url.hostname}`, "BLOCKED_HOSTNAME");
115
- }
116
- // Check for private IPs
117
- if (isPrivateIP(url.hostname)) {
118
- throw new URLValidationError(`Access to private IP addresses is blocked: ${url.hostname}`, "PRIVATE_IP");
119
- }
120
- // Check for suspicious patterns
121
- // Username/password in URL can be used for SSRF
122
- if (url.username || url.password) {
123
- throw new URLValidationError("URLs with credentials are not allowed", "SSRF_RISK");
124
- }
125
- // Check for URL redirections via @ symbol
126
- if (url.href.includes("@")) {
127
- throw new URLValidationError("URLs with @ symbol are not allowed (potential SSRF via redirect)", "SSRF_RISK");
128
- }
129
- return url;
130
- }
131
- /**
132
- * Validate URL and return boolean (no throw)
133
- */
134
- export function isValidURL(urlString) {
135
- try {
136
- validateURL(urlString);
137
- return true;
138
- }
139
- catch {
140
- return false;
141
- }
142
- }
143
- /**
144
- * Validate multiple URLs
145
- * @returns Array of validation results
146
- */
147
- export function validateURLs(urls) {
148
- return urls.map((url) => {
149
- try {
150
- validateURL(url);
151
- return { url, valid: true };
152
- }
153
- catch (error) {
154
- return {
155
- url,
156
- valid: false,
157
- error: error instanceof Error ? error.message : "Unknown error",
158
- };
159
- }
160
- });
161
- }
162
- /**
163
- * Sanitize URL by removing dangerous components
164
- */
165
- export function sanitizeURL(urlString) {
166
- try {
167
- const url = new URL(urlString);
168
- // Force HTTPS for security
169
- url.protocol = "https:";
170
- // Remove credentials
171
- url.username = "";
172
- url.password = "";
173
- return url.href;
174
- }
175
- catch {
176
- return null;
177
- }
178
- }
179
- //# sourceMappingURL=url-validator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"url-validator.js","sourceRoot":"","sources":["../../../../../shared/src/utils/url-validator.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- export declare function normalizeUrl(url: string): string;
2
- export declare function getDomain(url: string): string;
3
- export declare function isValidUrl(url: string): boolean;
4
- export declare function isSameDomain(url1: string, url2: string): boolean;
5
- export declare function joinUrl(base: string, path: string): string;
6
- //# sourceMappingURL=url.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../../../../shared/src/utils/url.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA0BhD;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM7C;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAO/C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAM1D"}
@@ -1,56 +0,0 @@
1
- export function normalizeUrl(url) {
2
- try {
3
- const parsed = new URL(url);
4
- parsed.hash = "";
5
- // Remove common tracking params
6
- const trackingParams = [
7
- "utm_source",
8
- "utm_medium",
9
- "utm_campaign",
10
- "utm_content",
11
- "utm_term",
12
- "ref",
13
- "fbclid",
14
- "gclid",
15
- ];
16
- trackingParams.forEach((param) => parsed.searchParams.delete(param));
17
- let normalized = parsed.href;
18
- // Remove trailing slash
19
- if (normalized.endsWith("/") && parsed.pathname !== "/") {
20
- normalized = normalized.slice(0, -1);
21
- }
22
- return normalized;
23
- }
24
- catch {
25
- return url;
26
- }
27
- }
28
- export function getDomain(url) {
29
- try {
30
- return new URL(url).hostname;
31
- }
32
- catch {
33
- return "";
34
- }
35
- }
36
- export function isValidUrl(url) {
37
- try {
38
- const parsed = new URL(url);
39
- return ["http:", "https:"].includes(parsed.protocol);
40
- }
41
- catch {
42
- return false;
43
- }
44
- }
45
- export function isSameDomain(url1, url2) {
46
- return getDomain(url1) === getDomain(url2);
47
- }
48
- export function joinUrl(base, path) {
49
- try {
50
- return new URL(path, base).href;
51
- }
52
- catch {
53
- return path;
54
- }
55
- }
56
- //# sourceMappingURL=url.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"url.js","sourceRoot":"","sources":["../../../../../shared/src/utils/url.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACjB,gCAAgC;QAChC,MAAM,cAAc,GAAG;YACrB,YAAY;YACZ,YAAY;YACZ,cAAc;YACd,aAAa;YACb,UAAU;YACV,KAAK;YACL,QAAQ;YACR,OAAO;SACR,CAAC;QACF,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAErE,IAAI,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;QAC7B,wBAAwB;QACxB,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;YACxD,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,IAAY;IACrD,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,IAAY;IAChD,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
File without changes
File without changes
File without changes
File without changes