wiggum-cli 0.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 (236) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +341 -0
  3. package/bin/ralph.js +8 -0
  4. package/dist/ai/enhancer.d.ts +100 -0
  5. package/dist/ai/enhancer.d.ts.map +1 -0
  6. package/dist/ai/enhancer.js +233 -0
  7. package/dist/ai/enhancer.js.map +1 -0
  8. package/dist/ai/index.d.ts +8 -0
  9. package/dist/ai/index.d.ts.map +1 -0
  10. package/dist/ai/index.js +11 -0
  11. package/dist/ai/index.js.map +1 -0
  12. package/dist/ai/prompts.d.ts +26 -0
  13. package/dist/ai/prompts.d.ts.map +1 -0
  14. package/dist/ai/prompts.js +201 -0
  15. package/dist/ai/prompts.js.map +1 -0
  16. package/dist/ai/providers.d.ts +35 -0
  17. package/dist/ai/providers.d.ts.map +1 -0
  18. package/dist/ai/providers.js +104 -0
  19. package/dist/ai/providers.js.map +1 -0
  20. package/dist/cli.d.ts +6 -0
  21. package/dist/cli.d.ts.map +1 -0
  22. package/dist/cli.js +196 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/commands/init.d.ts +16 -0
  25. package/dist/commands/init.d.ts.map +1 -0
  26. package/dist/commands/init.js +124 -0
  27. package/dist/commands/init.js.map +1 -0
  28. package/dist/commands/monitor.d.ts +17 -0
  29. package/dist/commands/monitor.d.ts.map +1 -0
  30. package/dist/commands/monitor.js +342 -0
  31. package/dist/commands/monitor.js.map +1 -0
  32. package/dist/commands/new.d.ts +19 -0
  33. package/dist/commands/new.d.ts.map +1 -0
  34. package/dist/commands/new.js +272 -0
  35. package/dist/commands/new.js.map +1 -0
  36. package/dist/commands/run.d.ts +16 -0
  37. package/dist/commands/run.d.ts.map +1 -0
  38. package/dist/commands/run.js +175 -0
  39. package/dist/commands/run.js.map +1 -0
  40. package/dist/generator/config.d.ts +59 -0
  41. package/dist/generator/config.d.ts.map +1 -0
  42. package/dist/generator/config.js +68 -0
  43. package/dist/generator/config.js.map +1 -0
  44. package/dist/generator/index.d.ts +64 -0
  45. package/dist/generator/index.d.ts.map +1 -0
  46. package/dist/generator/index.js +147 -0
  47. package/dist/generator/index.js.map +1 -0
  48. package/dist/generator/templates.d.ts +70 -0
  49. package/dist/generator/templates.d.ts.map +1 -0
  50. package/dist/generator/templates.js +296 -0
  51. package/dist/generator/templates.js.map +1 -0
  52. package/dist/generator/writer.d.ts +93 -0
  53. package/dist/generator/writer.d.ts.map +1 -0
  54. package/dist/generator/writer.js +213 -0
  55. package/dist/generator/writer.js.map +1 -0
  56. package/dist/index.d.ts +12 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +17 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/scanner/detectors/core/framework.d.ts +11 -0
  61. package/dist/scanner/detectors/core/framework.d.ts.map +1 -0
  62. package/dist/scanner/detectors/core/framework.js +275 -0
  63. package/dist/scanner/detectors/core/framework.js.map +1 -0
  64. package/dist/scanner/detectors/core/packageManager.d.ts +11 -0
  65. package/dist/scanner/detectors/core/packageManager.d.ts.map +1 -0
  66. package/dist/scanner/detectors/core/packageManager.js +74 -0
  67. package/dist/scanner/detectors/core/packageManager.js.map +1 -0
  68. package/dist/scanner/detectors/core/styling.d.ts +12 -0
  69. package/dist/scanner/detectors/core/styling.d.ts.map +1 -0
  70. package/dist/scanner/detectors/core/styling.js +230 -0
  71. package/dist/scanner/detectors/core/styling.js.map +1 -0
  72. package/dist/scanner/detectors/core/testing.d.ts +12 -0
  73. package/dist/scanner/detectors/core/testing.d.ts.map +1 -0
  74. package/dist/scanner/detectors/core/testing.js +190 -0
  75. package/dist/scanner/detectors/core/testing.js.map +1 -0
  76. package/dist/scanner/detectors/data/api.d.ts +12 -0
  77. package/dist/scanner/detectors/data/api.d.ts.map +1 -0
  78. package/dist/scanner/detectors/data/api.js +261 -0
  79. package/dist/scanner/detectors/data/api.js.map +1 -0
  80. package/dist/scanner/detectors/data/database.d.ts +12 -0
  81. package/dist/scanner/detectors/data/database.d.ts.map +1 -0
  82. package/dist/scanner/detectors/data/database.js +213 -0
  83. package/dist/scanner/detectors/data/database.js.map +1 -0
  84. package/dist/scanner/detectors/data/orm.d.ts +12 -0
  85. package/dist/scanner/detectors/data/orm.d.ts.map +1 -0
  86. package/dist/scanner/detectors/data/orm.js +160 -0
  87. package/dist/scanner/detectors/data/orm.js.map +1 -0
  88. package/dist/scanner/detectors/frontend/formHandling.d.ts +12 -0
  89. package/dist/scanner/detectors/frontend/formHandling.d.ts.map +1 -0
  90. package/dist/scanner/detectors/frontend/formHandling.js +211 -0
  91. package/dist/scanner/detectors/frontend/formHandling.js.map +1 -0
  92. package/dist/scanner/detectors/frontend/stateManagement.d.ts +12 -0
  93. package/dist/scanner/detectors/frontend/stateManagement.d.ts.map +1 -0
  94. package/dist/scanner/detectors/frontend/stateManagement.js +221 -0
  95. package/dist/scanner/detectors/frontend/stateManagement.js.map +1 -0
  96. package/dist/scanner/detectors/frontend/uiComponents.d.ts +12 -0
  97. package/dist/scanner/detectors/frontend/uiComponents.d.ts.map +1 -0
  98. package/dist/scanner/detectors/frontend/uiComponents.js +285 -0
  99. package/dist/scanner/detectors/frontend/uiComponents.js.map +1 -0
  100. package/dist/scanner/detectors/infra/deployment.d.ts +12 -0
  101. package/dist/scanner/detectors/infra/deployment.d.ts.map +1 -0
  102. package/dist/scanner/detectors/infra/deployment.js +301 -0
  103. package/dist/scanner/detectors/infra/deployment.js.map +1 -0
  104. package/dist/scanner/detectors/infra/monorepo.d.ts +12 -0
  105. package/dist/scanner/detectors/infra/monorepo.d.ts.map +1 -0
  106. package/dist/scanner/detectors/infra/monorepo.js +219 -0
  107. package/dist/scanner/detectors/infra/monorepo.js.map +1 -0
  108. package/dist/scanner/detectors/mcp/mcpProject.d.ts +12 -0
  109. package/dist/scanner/detectors/mcp/mcpProject.d.ts.map +1 -0
  110. package/dist/scanner/detectors/mcp/mcpProject.js +154 -0
  111. package/dist/scanner/detectors/mcp/mcpProject.js.map +1 -0
  112. package/dist/scanner/detectors/mcp/mcpServers.d.ts +17 -0
  113. package/dist/scanner/detectors/mcp/mcpServers.d.ts.map +1 -0
  114. package/dist/scanner/detectors/mcp/mcpServers.js +193 -0
  115. package/dist/scanner/detectors/mcp/mcpServers.js.map +1 -0
  116. package/dist/scanner/detectors/services/analytics.d.ts +12 -0
  117. package/dist/scanner/detectors/services/analytics.d.ts.map +1 -0
  118. package/dist/scanner/detectors/services/analytics.js +236 -0
  119. package/dist/scanner/detectors/services/analytics.js.map +1 -0
  120. package/dist/scanner/detectors/services/auth.d.ts +12 -0
  121. package/dist/scanner/detectors/services/auth.d.ts.map +1 -0
  122. package/dist/scanner/detectors/services/auth.js +217 -0
  123. package/dist/scanner/detectors/services/auth.js.map +1 -0
  124. package/dist/scanner/detectors/services/email.d.ts +12 -0
  125. package/dist/scanner/detectors/services/email.d.ts.map +1 -0
  126. package/dist/scanner/detectors/services/email.js +211 -0
  127. package/dist/scanner/detectors/services/email.js.map +1 -0
  128. package/dist/scanner/detectors/services/payments.d.ts +12 -0
  129. package/dist/scanner/detectors/services/payments.d.ts.map +1 -0
  130. package/dist/scanner/detectors/services/payments.js +185 -0
  131. package/dist/scanner/detectors/services/payments.js.map +1 -0
  132. package/dist/scanner/detectors/utils.d.ts +160 -0
  133. package/dist/scanner/detectors/utils.d.ts.map +1 -0
  134. package/dist/scanner/detectors/utils.js +222 -0
  135. package/dist/scanner/detectors/utils.js.map +1 -0
  136. package/dist/scanner/index.d.ts +42 -0
  137. package/dist/scanner/index.d.ts.map +1 -0
  138. package/dist/scanner/index.js +282 -0
  139. package/dist/scanner/index.js.map +1 -0
  140. package/dist/scanner/registry.d.ts +43 -0
  141. package/dist/scanner/registry.d.ts.map +1 -0
  142. package/dist/scanner/registry.js +243 -0
  143. package/dist/scanner/registry.js.map +1 -0
  144. package/dist/scanner/types.d.ts +112 -0
  145. package/dist/scanner/types.d.ts.map +1 -0
  146. package/dist/scanner/types.js +6 -0
  147. package/dist/scanner/types.js.map +1 -0
  148. package/dist/templates/config/ralph.config.js.tmpl +38 -0
  149. package/dist/templates/guides/AGENTS.md.tmpl +100 -0
  150. package/dist/templates/guides/FRONTEND.md.tmpl +523 -0
  151. package/dist/templates/guides/PERFORMANCE.md.tmpl +264 -0
  152. package/dist/templates/guides/SECURITY.md.tmpl +100 -0
  153. package/dist/templates/prompts/PROMPT.md.tmpl +77 -0
  154. package/dist/templates/prompts/PROMPT_e2e.md.tmpl +234 -0
  155. package/dist/templates/prompts/PROMPT_feature.md.tmpl +83 -0
  156. package/dist/templates/prompts/PROMPT_review.md.tmpl +167 -0
  157. package/dist/templates/prompts/PROMPT_verify.md.tmpl +72 -0
  158. package/dist/templates/root/.gitignore.tmpl +5 -0
  159. package/dist/templates/root/LEARNINGS.md.tmpl +24 -0
  160. package/dist/templates/root/README.md.tmpl +61 -0
  161. package/dist/templates/scripts/feature-loop.sh.tmpl +267 -0
  162. package/dist/templates/scripts/loop.sh.tmpl +59 -0
  163. package/dist/templates/scripts/ralph-monitor.sh.tmpl +244 -0
  164. package/dist/templates/specs/README.md.tmpl +57 -0
  165. package/dist/templates/specs/_example.md.tmpl +71 -0
  166. package/dist/utils/config.d.ts +95 -0
  167. package/dist/utils/config.d.ts.map +1 -0
  168. package/dist/utils/config.js +148 -0
  169. package/dist/utils/config.js.map +1 -0
  170. package/dist/utils/header.d.ts +5 -0
  171. package/dist/utils/header.d.ts.map +1 -0
  172. package/dist/utils/header.js +15 -0
  173. package/dist/utils/header.js.map +1 -0
  174. package/dist/utils/logger.d.ts +11 -0
  175. package/dist/utils/logger.d.ts.map +1 -0
  176. package/dist/utils/logger.js +24 -0
  177. package/dist/utils/logger.js.map +1 -0
  178. package/package.json +44 -0
  179. package/src/ai/enhancer.ts +350 -0
  180. package/src/ai/index.ts +38 -0
  181. package/src/ai/prompts.ts +217 -0
  182. package/src/ai/providers.ts +136 -0
  183. package/src/cli.ts +255 -0
  184. package/src/commands/init.ts +149 -0
  185. package/src/commands/monitor.ts +412 -0
  186. package/src/commands/new.ts +312 -0
  187. package/src/commands/run.ts +214 -0
  188. package/src/generator/config.ts +116 -0
  189. package/src/generator/index.ts +227 -0
  190. package/src/generator/templates.ts +412 -0
  191. package/src/generator/writer.ts +293 -0
  192. package/src/index.ts +41 -0
  193. package/src/scanner/detectors/core/framework.ts +332 -0
  194. package/src/scanner/detectors/core/packageManager.ts +91 -0
  195. package/src/scanner/detectors/core/styling.ts +261 -0
  196. package/src/scanner/detectors/core/testing.ts +221 -0
  197. package/src/scanner/detectors/data/api.ts +303 -0
  198. package/src/scanner/detectors/data/database.ts +245 -0
  199. package/src/scanner/detectors/data/orm.ts +180 -0
  200. package/src/scanner/detectors/frontend/formHandling.ts +244 -0
  201. package/src/scanner/detectors/frontend/stateManagement.ts +261 -0
  202. package/src/scanner/detectors/frontend/uiComponents.ts +328 -0
  203. package/src/scanner/detectors/infra/deployment.ts +343 -0
  204. package/src/scanner/detectors/infra/monorepo.ts +251 -0
  205. package/src/scanner/detectors/mcp/mcpProject.ts +176 -0
  206. package/src/scanner/detectors/mcp/mcpServers.ts +237 -0
  207. package/src/scanner/detectors/services/analytics.ts +273 -0
  208. package/src/scanner/detectors/services/auth.ts +254 -0
  209. package/src/scanner/detectors/services/email.ts +244 -0
  210. package/src/scanner/detectors/services/payments.ts +213 -0
  211. package/src/scanner/detectors/utils.ts +251 -0
  212. package/src/scanner/index.ts +354 -0
  213. package/src/scanner/registry.ts +301 -0
  214. package/src/scanner/types.ts +152 -0
  215. package/src/templates/config/ralph.config.js.tmpl +38 -0
  216. package/src/templates/guides/AGENTS.md.tmpl +100 -0
  217. package/src/templates/guides/FRONTEND.md.tmpl +523 -0
  218. package/src/templates/guides/PERFORMANCE.md.tmpl +264 -0
  219. package/src/templates/guides/SECURITY.md.tmpl +100 -0
  220. package/src/templates/prompts/PROMPT.md.tmpl +77 -0
  221. package/src/templates/prompts/PROMPT_e2e.md.tmpl +234 -0
  222. package/src/templates/prompts/PROMPT_feature.md.tmpl +83 -0
  223. package/src/templates/prompts/PROMPT_review.md.tmpl +167 -0
  224. package/src/templates/prompts/PROMPT_verify.md.tmpl +72 -0
  225. package/src/templates/root/.gitignore.tmpl +5 -0
  226. package/src/templates/root/LEARNINGS.md.tmpl +24 -0
  227. package/src/templates/root/README.md.tmpl +61 -0
  228. package/src/templates/scripts/feature-loop.sh.tmpl +267 -0
  229. package/src/templates/scripts/loop.sh.tmpl +59 -0
  230. package/src/templates/scripts/ralph-monitor.sh.tmpl +244 -0
  231. package/src/templates/specs/README.md.tmpl +57 -0
  232. package/src/templates/specs/_example.md.tmpl +71 -0
  233. package/src/utils/config.ts +221 -0
  234. package/src/utils/header.ts +15 -0
  235. package/src/utils/logger.ts +28 -0
  236. package/tsconfig.json +19 -0
@@ -0,0 +1,211 @@
1
+ /**
2
+ * Email Provider Detector
3
+ * Detects: Resend, SendGrid, Nodemailer
4
+ */
5
+ import { existsSync, readFileSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ /**
8
+ * Read and parse package.json from a directory
9
+ */
10
+ function readPackageJson(projectRoot) {
11
+ const packageJsonPath = join(projectRoot, 'package.json');
12
+ if (!existsSync(packageJsonPath)) {
13
+ return null;
14
+ }
15
+ try {
16
+ const content = readFileSync(packageJsonPath, 'utf-8');
17
+ return JSON.parse(content);
18
+ }
19
+ catch {
20
+ return null;
21
+ }
22
+ }
23
+ /**
24
+ * Get all dependencies from package.json (deps + devDeps)
25
+ */
26
+ function getDependencies(pkg) {
27
+ const deps = pkg.dependencies || {};
28
+ const devDeps = pkg.devDependencies || {};
29
+ return { ...deps, ...devDeps };
30
+ }
31
+ /**
32
+ * Find all matching dependencies by pattern
33
+ */
34
+ function findMatchingDeps(deps, pattern) {
35
+ return Object.keys(deps).filter(name => name.startsWith(pattern));
36
+ }
37
+ /**
38
+ * Detect Resend
39
+ */
40
+ function detectResend(deps) {
41
+ const evidence = [];
42
+ let confidence = 0;
43
+ if (deps.resend) {
44
+ evidence.push(`resend@${deps.resend} in dependencies`);
45
+ confidence += 80;
46
+ }
47
+ // Check for react-email (often used with Resend)
48
+ if (deps['react-email'] || deps['@react-email/components']) {
49
+ evidence.push('React Email detected (commonly paired with Resend)');
50
+ confidence += 10;
51
+ }
52
+ if (confidence === 0)
53
+ return null;
54
+ return {
55
+ name: 'Resend',
56
+ version: deps.resend,
57
+ confidence: Math.min(confidence, 100),
58
+ evidence,
59
+ };
60
+ }
61
+ /**
62
+ * Detect SendGrid
63
+ */
64
+ function detectSendGrid(deps) {
65
+ const evidence = [];
66
+ let confidence = 0;
67
+ // Check for @sendgrid/mail
68
+ if (deps['@sendgrid/mail']) {
69
+ evidence.push(`@sendgrid/mail@${deps['@sendgrid/mail']} in dependencies`);
70
+ confidence += 80;
71
+ }
72
+ // Check for other SendGrid packages
73
+ const sendgridPackages = findMatchingDeps(deps, '@sendgrid/');
74
+ if (sendgridPackages.length > 1) {
75
+ evidence.push(`Multiple SendGrid packages found: ${sendgridPackages.join(', ')}`);
76
+ confidence += 10;
77
+ }
78
+ if (confidence === 0)
79
+ return null;
80
+ return {
81
+ name: 'SendGrid',
82
+ version: deps['@sendgrid/mail'],
83
+ confidence: Math.min(confidence, 100),
84
+ evidence,
85
+ };
86
+ }
87
+ /**
88
+ * Detect Nodemailer
89
+ */
90
+ function detectNodemailer(deps) {
91
+ const evidence = [];
92
+ let confidence = 0;
93
+ if (deps.nodemailer) {
94
+ evidence.push(`nodemailer@${deps.nodemailer} in dependencies`);
95
+ confidence += 80;
96
+ }
97
+ // Check for nodemailer types
98
+ if (deps['@types/nodemailer']) {
99
+ evidence.push('@types/nodemailer found');
100
+ confidence += 10;
101
+ }
102
+ if (confidence === 0)
103
+ return null;
104
+ return {
105
+ name: 'Nodemailer',
106
+ version: deps.nodemailer,
107
+ confidence: Math.min(confidence, 100),
108
+ evidence,
109
+ };
110
+ }
111
+ /**
112
+ * Detect Postmark
113
+ */
114
+ function detectPostmark(deps) {
115
+ const evidence = [];
116
+ let confidence = 0;
117
+ if (deps.postmark) {
118
+ evidence.push(`postmark@${deps.postmark} in dependencies`);
119
+ confidence += 80;
120
+ }
121
+ if (confidence === 0)
122
+ return null;
123
+ return {
124
+ name: 'Postmark',
125
+ version: deps.postmark,
126
+ confidence: Math.min(confidence, 100),
127
+ evidence,
128
+ };
129
+ }
130
+ /**
131
+ * Detect Mailgun
132
+ */
133
+ function detectMailgun(deps) {
134
+ const evidence = [];
135
+ let confidence = 0;
136
+ if (deps['mailgun.js'] || deps['mailgun-js']) {
137
+ const version = deps['mailgun.js'] || deps['mailgun-js'];
138
+ evidence.push(`Mailgun package@${version} in dependencies`);
139
+ confidence += 80;
140
+ }
141
+ if (confidence === 0)
142
+ return null;
143
+ return {
144
+ name: 'Mailgun',
145
+ version: deps['mailgun.js'] || deps['mailgun-js'],
146
+ confidence: Math.min(confidence, 100),
147
+ evidence,
148
+ };
149
+ }
150
+ /**
151
+ * Detect AWS SES
152
+ */
153
+ function detectAWSSES(deps) {
154
+ const evidence = [];
155
+ let confidence = 0;
156
+ // Check for AWS SDK v3 SES client
157
+ if (deps['@aws-sdk/client-ses']) {
158
+ evidence.push(`@aws-sdk/client-ses@${deps['@aws-sdk/client-ses']} in dependencies`);
159
+ confidence += 80;
160
+ }
161
+ // Check for AWS SDK v2 (legacy, but still used)
162
+ if (deps['aws-sdk'] && !deps['@aws-sdk/client-ses']) {
163
+ evidence.push('aws-sdk found (may include SES)');
164
+ confidence += 40; // Lower confidence since we can't confirm SES usage
165
+ }
166
+ if (confidence === 0)
167
+ return null;
168
+ return {
169
+ name: 'AWS SES',
170
+ version: deps['@aws-sdk/client-ses'],
171
+ confidence: Math.min(confidence, 100),
172
+ evidence,
173
+ };
174
+ }
175
+ /**
176
+ * Email provider detector
177
+ * Returns the primary email provider detected
178
+ */
179
+ export const emailDetector = {
180
+ category: 'email',
181
+ name: 'Email Provider Detector',
182
+ async detect(projectRoot) {
183
+ const pkg = readPackageJson(projectRoot);
184
+ if (!pkg) {
185
+ return null;
186
+ }
187
+ const deps = getDependencies(pkg);
188
+ // Priority order based on modern usage patterns
189
+ const detectors = [
190
+ () => detectResend(deps),
191
+ () => detectSendGrid(deps),
192
+ () => detectPostmark(deps),
193
+ () => detectMailgun(deps),
194
+ () => detectAWSSES(deps),
195
+ () => detectNodemailer(deps), // Last as it's often a transport, not a provider
196
+ ];
197
+ // Find the highest confidence result
198
+ let bestResult = null;
199
+ let bestConfidence = 0;
200
+ for (const detector of detectors) {
201
+ const result = detector();
202
+ if (result && result.confidence > bestConfidence) {
203
+ bestResult = result;
204
+ bestConfidence = result.confidence;
205
+ }
206
+ }
207
+ return bestResult && bestResult.confidence >= 40 ? bestResult : null;
208
+ },
209
+ };
210
+ export default emailDetector;
211
+ //# sourceMappingURL=email.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.js","sourceRoot":"","sources":["../../../../src/scanner/detectors/services/email.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Payments Provider Detector
3
+ * Detects: Stripe, Lemon Squeezy, Paddle
4
+ */
5
+ import type { Detector } from '../../types.js';
6
+ /**
7
+ * Payments provider detector
8
+ * Returns the primary payment provider detected
9
+ */
10
+ export declare const paymentsDetector: Detector;
11
+ export default paymentsDetector;
12
+ //# sourceMappingURL=payments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payments.d.ts","sourceRoot":"","sources":["../../../../src/scanner/detectors/services/payments.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,gBAAgB,CAAC;AAqKhE;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAkC9B,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Payments Provider Detector
3
+ * Detects: Stripe, Lemon Squeezy, Paddle
4
+ */
5
+ import { existsSync, readFileSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ /**
8
+ * Read and parse package.json from a directory
9
+ */
10
+ function readPackageJson(projectRoot) {
11
+ const packageJsonPath = join(projectRoot, 'package.json');
12
+ if (!existsSync(packageJsonPath)) {
13
+ return null;
14
+ }
15
+ try {
16
+ const content = readFileSync(packageJsonPath, 'utf-8');
17
+ return JSON.parse(content);
18
+ }
19
+ catch {
20
+ return null;
21
+ }
22
+ }
23
+ /**
24
+ * Get all dependencies from package.json (deps + devDeps)
25
+ */
26
+ function getDependencies(pkg) {
27
+ const deps = pkg.dependencies || {};
28
+ const devDeps = pkg.devDependencies || {};
29
+ return { ...deps, ...devDeps };
30
+ }
31
+ /**
32
+ * Find all matching dependencies by pattern
33
+ */
34
+ function findMatchingDeps(deps, pattern) {
35
+ return Object.keys(deps).filter(name => name.startsWith(pattern));
36
+ }
37
+ /**
38
+ * Detect Stripe
39
+ */
40
+ function detectStripe(deps) {
41
+ const evidence = [];
42
+ let confidence = 0;
43
+ let variant;
44
+ // Check for stripe (Node.js SDK)
45
+ if (deps.stripe) {
46
+ evidence.push(`stripe@${deps.stripe} in dependencies`);
47
+ confidence += 70;
48
+ variant = 'server';
49
+ }
50
+ // Check for @stripe/* packages
51
+ const stripePackages = findMatchingDeps(deps, '@stripe/');
52
+ if (stripePackages.length > 0) {
53
+ evidence.push(`Stripe packages found: ${stripePackages.join(', ')}`);
54
+ confidence += 20;
55
+ if (deps['@stripe/stripe-js']) {
56
+ variant = variant === 'server' ? 'full-stack' : 'client';
57
+ }
58
+ if (deps['@stripe/react-stripe-js']) {
59
+ evidence.push('React Stripe.js integration detected');
60
+ confidence += 10;
61
+ }
62
+ }
63
+ if (confidence === 0)
64
+ return null;
65
+ return {
66
+ name: 'Stripe',
67
+ version: deps.stripe || deps['@stripe/stripe-js'],
68
+ variant,
69
+ confidence: Math.min(confidence, 100),
70
+ evidence,
71
+ };
72
+ }
73
+ /**
74
+ * Detect Lemon Squeezy
75
+ */
76
+ function detectLemonSqueezy(deps) {
77
+ const evidence = [];
78
+ let confidence = 0;
79
+ // Check for @lemonsqueezy/* packages
80
+ const lsPackages = findMatchingDeps(deps, '@lemonsqueezy/');
81
+ if (lsPackages.length > 0) {
82
+ evidence.push(`Lemon Squeezy packages found: ${lsPackages.join(', ')}`);
83
+ confidence += 80;
84
+ }
85
+ // Check for lemonsqueezy.js
86
+ if (deps['lemonsqueezy.js']) {
87
+ evidence.push(`lemonsqueezy.js@${deps['lemonsqueezy.js']} in dependencies`);
88
+ confidence += 80;
89
+ }
90
+ if (confidence === 0)
91
+ return null;
92
+ return {
93
+ name: 'Lemon Squeezy',
94
+ version: deps['@lemonsqueezy/lemonsqueezy.js'] || deps['lemonsqueezy.js'],
95
+ confidence: Math.min(confidence, 100),
96
+ evidence,
97
+ };
98
+ }
99
+ /**
100
+ * Detect Paddle
101
+ */
102
+ function detectPaddle(deps) {
103
+ const evidence = [];
104
+ let confidence = 0;
105
+ // Check for @paddle/* packages
106
+ const paddlePackages = findMatchingDeps(deps, '@paddle/');
107
+ if (paddlePackages.length > 0) {
108
+ evidence.push(`Paddle packages found: ${paddlePackages.join(', ')}`);
109
+ confidence += 80;
110
+ }
111
+ // Check for paddle-sdk
112
+ if (deps['paddle-sdk']) {
113
+ evidence.push(`paddle-sdk@${deps['paddle-sdk']} in dependencies`);
114
+ confidence += 70;
115
+ }
116
+ if (confidence === 0)
117
+ return null;
118
+ return {
119
+ name: 'Paddle',
120
+ version: deps['@paddle/paddle-js'] || deps['paddle-sdk'],
121
+ confidence: Math.min(confidence, 100),
122
+ evidence,
123
+ };
124
+ }
125
+ /**
126
+ * Detect PayPal
127
+ */
128
+ function detectPayPal(deps) {
129
+ const evidence = [];
130
+ let confidence = 0;
131
+ // Check for @paypal/* packages
132
+ const paypalPackages = findMatchingDeps(deps, '@paypal/');
133
+ if (paypalPackages.length > 0) {
134
+ evidence.push(`PayPal packages found: ${paypalPackages.join(', ')}`);
135
+ confidence += 80;
136
+ }
137
+ // Check for paypal-rest-sdk
138
+ if (deps['paypal-rest-sdk']) {
139
+ evidence.push(`paypal-rest-sdk@${deps['paypal-rest-sdk']} in dependencies`);
140
+ confidence += 70;
141
+ }
142
+ if (confidence === 0)
143
+ return null;
144
+ return {
145
+ name: 'PayPal',
146
+ version: deps['@paypal/paypal-js'] || deps['paypal-rest-sdk'],
147
+ confidence: Math.min(confidence, 100),
148
+ evidence,
149
+ };
150
+ }
151
+ /**
152
+ * Payments provider detector
153
+ * Returns the primary payment provider detected
154
+ */
155
+ export const paymentsDetector = {
156
+ category: 'payments',
157
+ name: 'Payments Provider Detector',
158
+ async detect(projectRoot) {
159
+ const pkg = readPackageJson(projectRoot);
160
+ if (!pkg) {
161
+ return null;
162
+ }
163
+ const deps = getDependencies(pkg);
164
+ // Priority order based on popularity
165
+ const detectors = [
166
+ () => detectStripe(deps),
167
+ () => detectLemonSqueezy(deps),
168
+ () => detectPaddle(deps),
169
+ () => detectPayPal(deps),
170
+ ];
171
+ // Find the highest confidence result
172
+ let bestResult = null;
173
+ let bestConfidence = 0;
174
+ for (const detector of detectors) {
175
+ const result = detector();
176
+ if (result && result.confidence > bestConfidence) {
177
+ bestResult = result;
178
+ bestConfidence = result.confidence;
179
+ }
180
+ }
181
+ return bestResult && bestResult.confidence >= 40 ? bestResult : null;
182
+ },
183
+ };
184
+ export default paymentsDetector;
185
+ //# sourceMappingURL=payments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payments.js","sourceRoot":"","sources":["../../../../src/scanner/detectors/services/payments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Shared Utilities for Detectors
3
+ * Common functions used across multiple detector files
4
+ */
5
+ /**
6
+ * Package.json type definition
7
+ */
8
+ export type PackageJson = Record<string, unknown>;
9
+ /**
10
+ * Dependencies map type
11
+ */
12
+ export type DependencyMap = Record<string, string>;
13
+ /**
14
+ * Read and parse package.json from a directory
15
+ *
16
+ * @param projectRoot - The root directory of the project
17
+ * @returns Parsed package.json object or null if not found/invalid
18
+ *
19
+ * @example
20
+ * const pkg = readPackageJson('/path/to/project');
21
+ * if (pkg) {
22
+ * console.log(pkg.name);
23
+ * }
24
+ */
25
+ export declare function readPackageJson(projectRoot: string): PackageJson | null;
26
+ /**
27
+ * Get all dependencies from package.json (deps + devDeps combined)
28
+ *
29
+ * @param pkg - Parsed package.json object
30
+ * @returns Combined dependencies and devDependencies map
31
+ *
32
+ * @example
33
+ * const pkg = readPackageJson(projectRoot);
34
+ * const deps = getDependencies(pkg);
35
+ * if (deps.react) {
36
+ * console.log(`React version: ${deps.react}`);
37
+ * }
38
+ */
39
+ export declare function getDependencies(pkg: PackageJson | null): DependencyMap;
40
+ /**
41
+ * Find a config file with various possible extensions
42
+ *
43
+ * @param projectRoot - The root directory of the project
44
+ * @param baseName - The base name of the config file (e.g., 'next.config')
45
+ * @param extensions - Array of extensions to try (e.g., ['.js', '.ts', '.mjs'])
46
+ * @returns The full filename if found, or null
47
+ *
48
+ * @example
49
+ * const configFile = findConfigFile(projectRoot, 'next.config', ['.js', '.mjs', '.ts']);
50
+ * if (configFile) {
51
+ * console.log(`Found: ${configFile}`);
52
+ * }
53
+ */
54
+ export declare function findConfigFile(projectRoot: string, baseName: string, extensions: string[]): string | null;
55
+ /**
56
+ * Check if a directory exists
57
+ *
58
+ * @param projectRoot - The root directory of the project
59
+ * @param dirName - The directory name to check
60
+ * @returns True if the directory exists
61
+ *
62
+ * @example
63
+ * if (checkDirectoryExists(projectRoot, 'src')) {
64
+ * console.log('Source directory found');
65
+ * }
66
+ */
67
+ export declare function checkDirectoryExists(projectRoot: string, dirName: string): boolean;
68
+ /**
69
+ * Check if a file exists
70
+ *
71
+ * @param projectRoot - The root directory of the project
72
+ * @param fileName - The file name to check
73
+ * @returns True if the file exists
74
+ *
75
+ * @example
76
+ * if (checkFileExists(projectRoot, 'vercel.json')) {
77
+ * console.log('Vercel config found');
78
+ * }
79
+ */
80
+ export declare function checkFileExists(projectRoot: string, fileName: string): boolean;
81
+ /**
82
+ * Find all dependencies matching a prefix pattern
83
+ *
84
+ * @param deps - Dependencies map
85
+ * @param pattern - Prefix pattern to match (e.g., '@supabase/')
86
+ * @returns Array of matching dependency names
87
+ *
88
+ * @example
89
+ * const supabasePackages = findMatchingDeps(deps, '@supabase/');
90
+ * // Returns: ['@supabase/supabase-js', '@supabase/ssr', ...]
91
+ */
92
+ export declare function findMatchingDeps(deps: DependencyMap, pattern: string): string[];
93
+ /**
94
+ * Check if any dependency matches a pattern and return its version
95
+ *
96
+ * @param deps - Dependencies map
97
+ * @param pattern - Prefix pattern to match
98
+ * @returns Version string if found, undefined otherwise
99
+ *
100
+ * @example
101
+ * const version = hasDependencyPattern(deps, '@supabase/');
102
+ * if (version) {
103
+ * console.log(`Found supabase package: ${version}`);
104
+ * }
105
+ */
106
+ export declare function hasDependencyPattern(deps: DependencyMap, pattern: string): string | undefined;
107
+ /**
108
+ * Read file content safely
109
+ *
110
+ * @param filePath - Full path to the file
111
+ * @returns File content as string, or null if read fails
112
+ *
113
+ * @example
114
+ * const content = readFileSafe('/path/to/config.json');
115
+ * if (content) {
116
+ * const config = JSON.parse(content);
117
+ * }
118
+ */
119
+ export declare function readFileSafe(filePath: string): string | null;
120
+ /**
121
+ * Parse JSON file safely
122
+ *
123
+ * @param projectRoot - The root directory of the project
124
+ * @param fileName - The JSON file name
125
+ * @returns Parsed JSON object or null if invalid
126
+ *
127
+ * @example
128
+ * const config = parseJsonFile(projectRoot, 'tsconfig.json');
129
+ * if (config?.compilerOptions) {
130
+ * console.log('TypeScript config found');
131
+ * }
132
+ */
133
+ export declare function parseJsonFile(projectRoot: string, fileName: string): Record<string, unknown> | null;
134
+ /**
135
+ * Common config file extensions
136
+ */
137
+ export declare const CONFIG_EXTENSIONS: {
138
+ /** JavaScript/TypeScript config extensions */
139
+ JS_TS: string[];
140
+ /** JSON/YAML config extensions */
141
+ DATA: string[];
142
+ /** All common config extensions */
143
+ ALL: string[];
144
+ };
145
+ /**
146
+ * Get npm scripts from package.json
147
+ *
148
+ * @param pkg - Parsed package.json object
149
+ * @returns Scripts object or empty object
150
+ */
151
+ export declare function getScripts(pkg: PackageJson | null): Record<string, string>;
152
+ /**
153
+ * Check if a specific npm script exists
154
+ *
155
+ * @param pkg - Parsed package.json object
156
+ * @param scriptName - Name of the script to check
157
+ * @returns True if the script exists
158
+ */
159
+ export declare function hasScript(pkg: PackageJson | null, scriptName: string): boolean;
160
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/scanner/detectors/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEnD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAWvE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,GAAG,aAAa,CAKtE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAAE,GACnB,MAAM,GAAG,IAAI,CAQf;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAElF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE9E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAI/E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,SAAS,CAOpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS5D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAWhC;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB;IAC5B,8CAA8C;;IAE9C,kCAAkC;;IAElC,mCAAmC;;CAEpC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAG1E;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAG9E"}