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.
- package/LICENSE +21 -0
- package/README.md +341 -0
- package/bin/ralph.js +8 -0
- package/dist/ai/enhancer.d.ts +100 -0
- package/dist/ai/enhancer.d.ts.map +1 -0
- package/dist/ai/enhancer.js +233 -0
- package/dist/ai/enhancer.js.map +1 -0
- package/dist/ai/index.d.ts +8 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +11 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/prompts.d.ts +26 -0
- package/dist/ai/prompts.d.ts.map +1 -0
- package/dist/ai/prompts.js +201 -0
- package/dist/ai/prompts.js.map +1 -0
- package/dist/ai/providers.d.ts +35 -0
- package/dist/ai/providers.d.ts.map +1 -0
- package/dist/ai/providers.js +104 -0
- package/dist/ai/providers.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +196 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/init.d.ts +16 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +124 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/monitor.d.ts +17 -0
- package/dist/commands/monitor.d.ts.map +1 -0
- package/dist/commands/monitor.js +342 -0
- package/dist/commands/monitor.js.map +1 -0
- package/dist/commands/new.d.ts +19 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +272 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/run.d.ts +16 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +175 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/generator/config.d.ts +59 -0
- package/dist/generator/config.d.ts.map +1 -0
- package/dist/generator/config.js +68 -0
- package/dist/generator/config.js.map +1 -0
- package/dist/generator/index.d.ts +64 -0
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/index.js +147 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/templates.d.ts +70 -0
- package/dist/generator/templates.d.ts.map +1 -0
- package/dist/generator/templates.js +296 -0
- package/dist/generator/templates.js.map +1 -0
- package/dist/generator/writer.d.ts +93 -0
- package/dist/generator/writer.d.ts.map +1 -0
- package/dist/generator/writer.js +213 -0
- package/dist/generator/writer.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/scanner/detectors/core/framework.d.ts +11 -0
- package/dist/scanner/detectors/core/framework.d.ts.map +1 -0
- package/dist/scanner/detectors/core/framework.js +275 -0
- package/dist/scanner/detectors/core/framework.js.map +1 -0
- package/dist/scanner/detectors/core/packageManager.d.ts +11 -0
- package/dist/scanner/detectors/core/packageManager.d.ts.map +1 -0
- package/dist/scanner/detectors/core/packageManager.js +74 -0
- package/dist/scanner/detectors/core/packageManager.js.map +1 -0
- package/dist/scanner/detectors/core/styling.d.ts +12 -0
- package/dist/scanner/detectors/core/styling.d.ts.map +1 -0
- package/dist/scanner/detectors/core/styling.js +230 -0
- package/dist/scanner/detectors/core/styling.js.map +1 -0
- package/dist/scanner/detectors/core/testing.d.ts +12 -0
- package/dist/scanner/detectors/core/testing.d.ts.map +1 -0
- package/dist/scanner/detectors/core/testing.js +190 -0
- package/dist/scanner/detectors/core/testing.js.map +1 -0
- package/dist/scanner/detectors/data/api.d.ts +12 -0
- package/dist/scanner/detectors/data/api.d.ts.map +1 -0
- package/dist/scanner/detectors/data/api.js +261 -0
- package/dist/scanner/detectors/data/api.js.map +1 -0
- package/dist/scanner/detectors/data/database.d.ts +12 -0
- package/dist/scanner/detectors/data/database.d.ts.map +1 -0
- package/dist/scanner/detectors/data/database.js +213 -0
- package/dist/scanner/detectors/data/database.js.map +1 -0
- package/dist/scanner/detectors/data/orm.d.ts +12 -0
- package/dist/scanner/detectors/data/orm.d.ts.map +1 -0
- package/dist/scanner/detectors/data/orm.js +160 -0
- package/dist/scanner/detectors/data/orm.js.map +1 -0
- package/dist/scanner/detectors/frontend/formHandling.d.ts +12 -0
- package/dist/scanner/detectors/frontend/formHandling.d.ts.map +1 -0
- package/dist/scanner/detectors/frontend/formHandling.js +211 -0
- package/dist/scanner/detectors/frontend/formHandling.js.map +1 -0
- package/dist/scanner/detectors/frontend/stateManagement.d.ts +12 -0
- package/dist/scanner/detectors/frontend/stateManagement.d.ts.map +1 -0
- package/dist/scanner/detectors/frontend/stateManagement.js +221 -0
- package/dist/scanner/detectors/frontend/stateManagement.js.map +1 -0
- package/dist/scanner/detectors/frontend/uiComponents.d.ts +12 -0
- package/dist/scanner/detectors/frontend/uiComponents.d.ts.map +1 -0
- package/dist/scanner/detectors/frontend/uiComponents.js +285 -0
- package/dist/scanner/detectors/frontend/uiComponents.js.map +1 -0
- package/dist/scanner/detectors/infra/deployment.d.ts +12 -0
- package/dist/scanner/detectors/infra/deployment.d.ts.map +1 -0
- package/dist/scanner/detectors/infra/deployment.js +301 -0
- package/dist/scanner/detectors/infra/deployment.js.map +1 -0
- package/dist/scanner/detectors/infra/monorepo.d.ts +12 -0
- package/dist/scanner/detectors/infra/monorepo.d.ts.map +1 -0
- package/dist/scanner/detectors/infra/monorepo.js +219 -0
- package/dist/scanner/detectors/infra/monorepo.js.map +1 -0
- package/dist/scanner/detectors/mcp/mcpProject.d.ts +12 -0
- package/dist/scanner/detectors/mcp/mcpProject.d.ts.map +1 -0
- package/dist/scanner/detectors/mcp/mcpProject.js +154 -0
- package/dist/scanner/detectors/mcp/mcpProject.js.map +1 -0
- package/dist/scanner/detectors/mcp/mcpServers.d.ts +17 -0
- package/dist/scanner/detectors/mcp/mcpServers.d.ts.map +1 -0
- package/dist/scanner/detectors/mcp/mcpServers.js +193 -0
- package/dist/scanner/detectors/mcp/mcpServers.js.map +1 -0
- package/dist/scanner/detectors/services/analytics.d.ts +12 -0
- package/dist/scanner/detectors/services/analytics.d.ts.map +1 -0
- package/dist/scanner/detectors/services/analytics.js +236 -0
- package/dist/scanner/detectors/services/analytics.js.map +1 -0
- package/dist/scanner/detectors/services/auth.d.ts +12 -0
- package/dist/scanner/detectors/services/auth.d.ts.map +1 -0
- package/dist/scanner/detectors/services/auth.js +217 -0
- package/dist/scanner/detectors/services/auth.js.map +1 -0
- package/dist/scanner/detectors/services/email.d.ts +12 -0
- package/dist/scanner/detectors/services/email.d.ts.map +1 -0
- package/dist/scanner/detectors/services/email.js +211 -0
- package/dist/scanner/detectors/services/email.js.map +1 -0
- package/dist/scanner/detectors/services/payments.d.ts +12 -0
- package/dist/scanner/detectors/services/payments.d.ts.map +1 -0
- package/dist/scanner/detectors/services/payments.js +185 -0
- package/dist/scanner/detectors/services/payments.js.map +1 -0
- package/dist/scanner/detectors/utils.d.ts +160 -0
- package/dist/scanner/detectors/utils.d.ts.map +1 -0
- package/dist/scanner/detectors/utils.js +222 -0
- package/dist/scanner/detectors/utils.js.map +1 -0
- package/dist/scanner/index.d.ts +42 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +282 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/registry.d.ts +43 -0
- package/dist/scanner/registry.d.ts.map +1 -0
- package/dist/scanner/registry.js +243 -0
- package/dist/scanner/registry.js.map +1 -0
- package/dist/scanner/types.d.ts +112 -0
- package/dist/scanner/types.d.ts.map +1 -0
- package/dist/scanner/types.js +6 -0
- package/dist/scanner/types.js.map +1 -0
- package/dist/templates/config/ralph.config.js.tmpl +38 -0
- package/dist/templates/guides/AGENTS.md.tmpl +100 -0
- package/dist/templates/guides/FRONTEND.md.tmpl +523 -0
- package/dist/templates/guides/PERFORMANCE.md.tmpl +264 -0
- package/dist/templates/guides/SECURITY.md.tmpl +100 -0
- package/dist/templates/prompts/PROMPT.md.tmpl +77 -0
- package/dist/templates/prompts/PROMPT_e2e.md.tmpl +234 -0
- package/dist/templates/prompts/PROMPT_feature.md.tmpl +83 -0
- package/dist/templates/prompts/PROMPT_review.md.tmpl +167 -0
- package/dist/templates/prompts/PROMPT_verify.md.tmpl +72 -0
- package/dist/templates/root/.gitignore.tmpl +5 -0
- package/dist/templates/root/LEARNINGS.md.tmpl +24 -0
- package/dist/templates/root/README.md.tmpl +61 -0
- package/dist/templates/scripts/feature-loop.sh.tmpl +267 -0
- package/dist/templates/scripts/loop.sh.tmpl +59 -0
- package/dist/templates/scripts/ralph-monitor.sh.tmpl +244 -0
- package/dist/templates/specs/README.md.tmpl +57 -0
- package/dist/templates/specs/_example.md.tmpl +71 -0
- package/dist/utils/config.d.ts +95 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +148 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/header.d.ts +5 -0
- package/dist/utils/header.d.ts.map +1 -0
- package/dist/utils/header.js +15 -0
- package/dist/utils/header.js.map +1 -0
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +24 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +44 -0
- package/src/ai/enhancer.ts +350 -0
- package/src/ai/index.ts +38 -0
- package/src/ai/prompts.ts +217 -0
- package/src/ai/providers.ts +136 -0
- package/src/cli.ts +255 -0
- package/src/commands/init.ts +149 -0
- package/src/commands/monitor.ts +412 -0
- package/src/commands/new.ts +312 -0
- package/src/commands/run.ts +214 -0
- package/src/generator/config.ts +116 -0
- package/src/generator/index.ts +227 -0
- package/src/generator/templates.ts +412 -0
- package/src/generator/writer.ts +293 -0
- package/src/index.ts +41 -0
- package/src/scanner/detectors/core/framework.ts +332 -0
- package/src/scanner/detectors/core/packageManager.ts +91 -0
- package/src/scanner/detectors/core/styling.ts +261 -0
- package/src/scanner/detectors/core/testing.ts +221 -0
- package/src/scanner/detectors/data/api.ts +303 -0
- package/src/scanner/detectors/data/database.ts +245 -0
- package/src/scanner/detectors/data/orm.ts +180 -0
- package/src/scanner/detectors/frontend/formHandling.ts +244 -0
- package/src/scanner/detectors/frontend/stateManagement.ts +261 -0
- package/src/scanner/detectors/frontend/uiComponents.ts +328 -0
- package/src/scanner/detectors/infra/deployment.ts +343 -0
- package/src/scanner/detectors/infra/monorepo.ts +251 -0
- package/src/scanner/detectors/mcp/mcpProject.ts +176 -0
- package/src/scanner/detectors/mcp/mcpServers.ts +237 -0
- package/src/scanner/detectors/services/analytics.ts +273 -0
- package/src/scanner/detectors/services/auth.ts +254 -0
- package/src/scanner/detectors/services/email.ts +244 -0
- package/src/scanner/detectors/services/payments.ts +213 -0
- package/src/scanner/detectors/utils.ts +251 -0
- package/src/scanner/index.ts +354 -0
- package/src/scanner/registry.ts +301 -0
- package/src/scanner/types.ts +152 -0
- package/src/templates/config/ralph.config.js.tmpl +38 -0
- package/src/templates/guides/AGENTS.md.tmpl +100 -0
- package/src/templates/guides/FRONTEND.md.tmpl +523 -0
- package/src/templates/guides/PERFORMANCE.md.tmpl +264 -0
- package/src/templates/guides/SECURITY.md.tmpl +100 -0
- package/src/templates/prompts/PROMPT.md.tmpl +77 -0
- package/src/templates/prompts/PROMPT_e2e.md.tmpl +234 -0
- package/src/templates/prompts/PROMPT_feature.md.tmpl +83 -0
- package/src/templates/prompts/PROMPT_review.md.tmpl +167 -0
- package/src/templates/prompts/PROMPT_verify.md.tmpl +72 -0
- package/src/templates/root/.gitignore.tmpl +5 -0
- package/src/templates/root/LEARNINGS.md.tmpl +24 -0
- package/src/templates/root/README.md.tmpl +61 -0
- package/src/templates/scripts/feature-loop.sh.tmpl +267 -0
- package/src/templates/scripts/loop.sh.tmpl +59 -0
- package/src/templates/scripts/ralph-monitor.sh.tmpl +244 -0
- package/src/templates/specs/README.md.tmpl +57 -0
- package/src/templates/specs/_example.md.tmpl +71 -0
- package/src/utils/config.ts +221 -0
- package/src/utils/header.ts +15 -0
- package/src/utils/logger.ts +28 -0
- 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"}
|