code-secret-handler 1.0.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 (171) hide show
  1. package/LICENSE +79 -0
  2. package/README.md +221 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +121 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/env/envWriter.d.ts +9 -0
  8. package/dist/env/envWriter.d.ts.map +1 -0
  9. package/dist/env/envWriter.js +76 -0
  10. package/dist/env/envWriter.js.map +1 -0
  11. package/dist/env/keyNamer.d.ts +13 -0
  12. package/dist/env/keyNamer.d.ts.map +1 -0
  13. package/dist/env/keyNamer.js +33 -0
  14. package/dist/env/keyNamer.js.map +1 -0
  15. package/dist/interactive/confirm.d.ts +16 -0
  16. package/dist/interactive/confirm.d.ts.map +1 -0
  17. package/dist/interactive/confirm.js +72 -0
  18. package/dist/interactive/confirm.js.map +1 -0
  19. package/dist/license/gitContext.d.ts +16 -0
  20. package/dist/license/gitContext.d.ts.map +1 -0
  21. package/dist/license/gitContext.js +117 -0
  22. package/dist/license/gitContext.js.map +1 -0
  23. package/dist/license/licenseCheck.d.ts +22 -0
  24. package/dist/license/licenseCheck.d.ts.map +1 -0
  25. package/dist/license/licenseCheck.js +119 -0
  26. package/dist/license/licenseCheck.js.map +1 -0
  27. package/dist/license/telemetry.d.ts +17 -0
  28. package/dist/license/telemetry.d.ts.map +1 -0
  29. package/dist/license/telemetry.js +87 -0
  30. package/dist/license/telemetry.js.map +1 -0
  31. package/dist/reporter/console.d.ts +3 -0
  32. package/dist/reporter/console.d.ts.map +1 -0
  33. package/dist/reporter/console.js +96 -0
  34. package/dist/reporter/console.js.map +1 -0
  35. package/dist/reporter/csv.d.ts +6 -0
  36. package/dist/reporter/csv.d.ts.map +1 -0
  37. package/dist/reporter/csv.js +56 -0
  38. package/dist/reporter/csv.js.map +1 -0
  39. package/dist/reporter/index.d.ts +13 -0
  40. package/dist/reporter/index.d.ts.map +1 -0
  41. package/dist/reporter/index.js +52 -0
  42. package/dist/reporter/index.js.map +1 -0
  43. package/dist/reporter/json.d.ts +7 -0
  44. package/dist/reporter/json.d.ts.map +1 -0
  45. package/dist/reporter/json.js +39 -0
  46. package/dist/reporter/json.js.map +1 -0
  47. package/dist/reporter/markdown.d.ts +6 -0
  48. package/dist/reporter/markdown.d.ts.map +1 -0
  49. package/dist/reporter/markdown.js +106 -0
  50. package/dist/reporter/markdown.js.map +1 -0
  51. package/dist/rewriter/index.d.ts +9 -0
  52. package/dist/rewriter/index.d.ts.map +1 -0
  53. package/dist/rewriter/index.js +95 -0
  54. package/dist/rewriter/index.js.map +1 -0
  55. package/dist/rewriter/langDetector.d.ts +7 -0
  56. package/dist/rewriter/langDetector.d.ts.map +1 -0
  57. package/dist/rewriter/langDetector.js +96 -0
  58. package/dist/rewriter/langDetector.js.map +1 -0
  59. package/dist/rewriter/templates/csharp.d.ts +8 -0
  60. package/dist/rewriter/templates/csharp.d.ts.map +1 -0
  61. package/dist/rewriter/templates/csharp.js +36 -0
  62. package/dist/rewriter/templates/csharp.js.map +1 -0
  63. package/dist/rewriter/templates/generic.d.ts +7 -0
  64. package/dist/rewriter/templates/generic.d.ts.map +1 -0
  65. package/dist/rewriter/templates/generic.js +40 -0
  66. package/dist/rewriter/templates/generic.js.map +1 -0
  67. package/dist/rewriter/templates/go.d.ts +8 -0
  68. package/dist/rewriter/templates/go.d.ts.map +1 -0
  69. package/dist/rewriter/templates/go.js +56 -0
  70. package/dist/rewriter/templates/go.js.map +1 -0
  71. package/dist/rewriter/templates/java.d.ts +7 -0
  72. package/dist/rewriter/templates/java.d.ts.map +1 -0
  73. package/dist/rewriter/templates/java.js +31 -0
  74. package/dist/rewriter/templates/java.js.map +1 -0
  75. package/dist/rewriter/templates/javascript.d.ts +10 -0
  76. package/dist/rewriter/templates/javascript.d.ts.map +1 -0
  77. package/dist/rewriter/templates/javascript.js +54 -0
  78. package/dist/rewriter/templates/javascript.js.map +1 -0
  79. package/dist/rewriter/templates/php.d.ts +8 -0
  80. package/dist/rewriter/templates/php.d.ts.map +1 -0
  81. package/dist/rewriter/templates/php.js +41 -0
  82. package/dist/rewriter/templates/php.js.map +1 -0
  83. package/dist/rewriter/templates/properties.d.ts +9 -0
  84. package/dist/rewriter/templates/properties.d.ts.map +1 -0
  85. package/dist/rewriter/templates/properties.js +39 -0
  86. package/dist/rewriter/templates/properties.js.map +1 -0
  87. package/dist/rewriter/templates/python.d.ts +8 -0
  88. package/dist/rewriter/templates/python.d.ts.map +1 -0
  89. package/dist/rewriter/templates/python.js +48 -0
  90. package/dist/rewriter/templates/python.js.map +1 -0
  91. package/dist/rewriter/templates/ruby.d.ts +8 -0
  92. package/dist/rewriter/templates/ruby.d.ts.map +1 -0
  93. package/dist/rewriter/templates/ruby.js +40 -0
  94. package/dist/rewriter/templates/ruby.js.map +1 -0
  95. package/dist/rewriter/templates/rust.d.ts +7 -0
  96. package/dist/rewriter/templates/rust.d.ts.map +1 -0
  97. package/dist/rewriter/templates/rust.js +27 -0
  98. package/dist/rewriter/templates/rust.js.map +1 -0
  99. package/dist/rewriter/templates/shell.d.ts +7 -0
  100. package/dist/rewriter/templates/shell.d.ts.map +1 -0
  101. package/dist/rewriter/templates/shell.js +42 -0
  102. package/dist/rewriter/templates/shell.js.map +1 -0
  103. package/dist/rewriter/templates/toml.d.ts +9 -0
  104. package/dist/rewriter/templates/toml.d.ts.map +1 -0
  105. package/dist/rewriter/templates/toml.js +34 -0
  106. package/dist/rewriter/templates/toml.js.map +1 -0
  107. package/dist/rewriter/templates/yaml.d.ts +8 -0
  108. package/dist/rewriter/templates/yaml.d.ts.map +1 -0
  109. package/dist/rewriter/templates/yaml.js +37 -0
  110. package/dist/rewriter/templates/yaml.js.map +1 -0
  111. package/dist/scanner/detector.d.ts +18 -0
  112. package/dist/scanner/detector.d.ts.map +1 -0
  113. package/dist/scanner/detector.js +156 -0
  114. package/dist/scanner/detector.js.map +1 -0
  115. package/dist/scanner/fileWalker.d.ts +6 -0
  116. package/dist/scanner/fileWalker.d.ts.map +1 -0
  117. package/dist/scanner/fileWalker.js +146 -0
  118. package/dist/scanner/fileWalker.js.map +1 -0
  119. package/dist/scanner/index.d.ts +8 -0
  120. package/dist/scanner/index.d.ts.map +1 -0
  121. package/dist/scanner/index.js +74 -0
  122. package/dist/scanner/index.js.map +1 -0
  123. package/dist/scanner/rules/aws.d.ts +6 -0
  124. package/dist/scanner/rules/aws.d.ts.map +1 -0
  125. package/dist/scanner/rules/aws.js +90 -0
  126. package/dist/scanner/rules/aws.js.map +1 -0
  127. package/dist/scanner/rules/azure.d.ts +6 -0
  128. package/dist/scanner/rules/azure.d.ts.map +1 -0
  129. package/dist/scanner/rules/azure.js +86 -0
  130. package/dist/scanner/rules/azure.js.map +1 -0
  131. package/dist/scanner/rules/cloud.d.ts +11 -0
  132. package/dist/scanner/rules/cloud.d.ts.map +1 -0
  133. package/dist/scanner/rules/cloud.js +1066 -0
  134. package/dist/scanner/rules/cloud.js.map +1 -0
  135. package/dist/scanner/rules/database.d.ts +6 -0
  136. package/dist/scanner/rules/database.d.ts.map +1 -0
  137. package/dist/scanner/rules/database.js +283 -0
  138. package/dist/scanner/rules/database.js.map +1 -0
  139. package/dist/scanner/rules/gcp.d.ts +6 -0
  140. package/dist/scanner/rules/gcp.d.ts.map +1 -0
  141. package/dist/scanner/rules/gcp.js +108 -0
  142. package/dist/scanner/rules/gcp.js.map +1 -0
  143. package/dist/scanner/rules/generic.d.ts +13 -0
  144. package/dist/scanner/rules/generic.d.ts.map +1 -0
  145. package/dist/scanner/rules/generic.js +305 -0
  146. package/dist/scanner/rules/generic.js.map +1 -0
  147. package/dist/scanner/rules/index.d.ts +18 -0
  148. package/dist/scanner/rules/index.d.ts.map +1 -0
  149. package/dist/scanner/rules/index.js +40 -0
  150. package/dist/scanner/rules/index.js.map +1 -0
  151. package/dist/scanner/rules/jwt.d.ts +6 -0
  152. package/dist/scanner/rules/jwt.d.ts.map +1 -0
  153. package/dist/scanner/rules/jwt.js +97 -0
  154. package/dist/scanner/rules/jwt.js.map +1 -0
  155. package/dist/scanner/rules/network.d.ts +7 -0
  156. package/dist/scanner/rules/network.d.ts.map +1 -0
  157. package/dist/scanner/rules/network.js +166 -0
  158. package/dist/scanner/rules/network.js.map +1 -0
  159. package/dist/scanner/rules/privateKey.d.ts +6 -0
  160. package/dist/scanner/rules/privateKey.d.ts.map +1 -0
  161. package/dist/scanner/rules/privateKey.js +60 -0
  162. package/dist/scanner/rules/privateKey.js.map +1 -0
  163. package/dist/scanner/rules/ssh.d.ts +6 -0
  164. package/dist/scanner/rules/ssh.d.ts.map +1 -0
  165. package/dist/scanner/rules/ssh.js +49 -0
  166. package/dist/scanner/rules/ssh.js.map +1 -0
  167. package/dist/types.d.ts +78 -0
  168. package/dist/types.d.ts.map +1 -0
  169. package/dist/types.js +3 -0
  170. package/dist/types.js.map +1 -0
  171. package/package.json +54 -0
@@ -0,0 +1,1066 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cloudRules = void 0;
4
+ /**
5
+ * Third-party cloud / SaaS service credential patterns.
6
+ * Covers: GitHub, Stripe, Twilio, SendGrid, Slack, Heroku,
7
+ * Mailgun, Cloudflare, Datadog, NPM, Docker Hub,
8
+ * OpenAI, Anthropic, Telegram, Discord, Supabase,
9
+ * Vercel, DigitalOcean, Algolia, Mapbox, Pinecone,
10
+ * Vault, Airtable, HubSpot, Square, Razorpay, Plaid, etc.
11
+ */
12
+ exports.cloudRules = [
13
+ // ── GitHub ──────────────────────────────────────────────────────────────────
14
+ {
15
+ id: 'github-personal-access-token',
16
+ description: 'GitHub Personal Access Token (classic ghp_)',
17
+ pattern: /['"\`](ghp_[A-Za-z0-9]{36,})['"\`]/,
18
+ valueGroup: 1,
19
+ envKeyPrefix: 'GITHUB_TOKEN',
20
+ severity: 'critical',
21
+ },
22
+ {
23
+ id: 'github-oauth-token',
24
+ description: 'GitHub OAuth Token (gho_)',
25
+ pattern: /['"\`](gho_[A-Za-z0-9]{36,})['"\`]/,
26
+ valueGroup: 1,
27
+ envKeyPrefix: 'GITHUB_OAUTH_TOKEN',
28
+ severity: 'critical',
29
+ },
30
+ {
31
+ id: 'github-app-token',
32
+ description: 'GitHub App Installation Token (ghs_ / ghu_)',
33
+ pattern: /['"\`](gh[su]_[A-Za-z0-9]{36,})['"\`]/,
34
+ valueGroup: 1,
35
+ envKeyPrefix: 'GITHUB_APP_TOKEN',
36
+ severity: 'critical',
37
+ },
38
+ {
39
+ id: 'github-fine-grained-token',
40
+ description: 'GitHub Fine-Grained Personal Access Token (github_pat_)',
41
+ pattern: /['"\`](github_pat_[A-Za-z0-9_]{82,})['"\`]/,
42
+ valueGroup: 1,
43
+ envKeyPrefix: 'GITHUB_PAT',
44
+ severity: 'critical',
45
+ },
46
+ // ── GitLab ───────────────────────────────────────────────────────────────────
47
+ {
48
+ id: 'gitlab-personal-access-token',
49
+ description: 'GitLab Personal Access Token (glpat-)',
50
+ pattern: /['"\`](glpat-[A-Za-z0-9\-_]{20,})['"\`]/,
51
+ valueGroup: 1,
52
+ envKeyPrefix: 'GITLAB_TOKEN',
53
+ severity: 'critical',
54
+ },
55
+ {
56
+ id: 'gitlab-runner-token',
57
+ description: 'GitLab Runner Registration Token',
58
+ pattern: /(?:gitlab[_-]?runner[_-]?token|GITLAB_RUNNER_TOKEN|CI_REGISTRATION_TOKEN)\s*[:=]\s*['"\`]([A-Za-z0-9\-_]{20,})['"\`]/i,
59
+ valueGroup: 1,
60
+ envKeyPrefix: 'GITLAB_RUNNER_TOKEN',
61
+ severity: 'critical',
62
+ },
63
+ // ── Stripe ───────────────────────────────────────────────────────────────────
64
+ {
65
+ id: 'stripe-secret-key',
66
+ description: 'Stripe Secret Key (sk_live_ or sk_test_)',
67
+ pattern: /['"\`](sk_(?:live|test)_[A-Za-z0-9]{24,})['"\`]/,
68
+ valueGroup: 1,
69
+ envKeyPrefix: 'STRIPE_SECRET_KEY',
70
+ severity: 'critical',
71
+ },
72
+ {
73
+ id: 'stripe-publishable-key',
74
+ description: 'Stripe Publishable Key (pk_live_ or pk_test_)',
75
+ pattern: /['"\`](pk_(?:live|test)_[A-Za-z0-9]{24,})['"\`]/,
76
+ valueGroup: 1,
77
+ envKeyPrefix: 'STRIPE_PUBLISHABLE_KEY',
78
+ severity: 'high',
79
+ },
80
+ {
81
+ id: 'stripe-webhook-secret',
82
+ description: 'Stripe Webhook Signing Secret (whsec_)',
83
+ pattern: /['"\`](whsec_[A-Za-z0-9]{32,})['"\`]/,
84
+ valueGroup: 1,
85
+ envKeyPrefix: 'STRIPE_WEBHOOK_SECRET',
86
+ severity: 'critical',
87
+ },
88
+ {
89
+ id: 'stripe-restricted-key',
90
+ description: 'Stripe Restricted Key (rk_live_ or rk_test_)',
91
+ pattern: /['"\`](rk_(?:live|test)_[A-Za-z0-9]{24,})['"\`]/,
92
+ valueGroup: 1,
93
+ envKeyPrefix: 'STRIPE_RESTRICTED_KEY',
94
+ severity: 'critical',
95
+ },
96
+ // ── Twilio ───────────────────────────────────────────────────────────────────
97
+ {
98
+ id: 'twilio-account-sid',
99
+ description: 'Twilio Account SID',
100
+ pattern: /['"\`](AC[a-f0-9]{32})['"\`]/,
101
+ valueGroup: 1,
102
+ envKeyPrefix: 'TWILIO_ACCOUNT_SID',
103
+ severity: 'high',
104
+ },
105
+ {
106
+ id: 'twilio-auth-token',
107
+ description: 'Twilio Auth Token',
108
+ pattern: /(?:twilio[_-]?auth[_-]?token|TWILIO_AUTH_TOKEN)\s*[:=]\s*['"\`]([a-f0-9]{32})['"\`]/i,
109
+ valueGroup: 1,
110
+ envKeyPrefix: 'TWILIO_AUTH_TOKEN',
111
+ severity: 'critical',
112
+ },
113
+ {
114
+ id: 'twilio-api-key',
115
+ description: 'Twilio API Key SID (SK prefix)',
116
+ pattern: /['"\`](SK[a-f0-9]{32})['"\`]/,
117
+ valueGroup: 1,
118
+ envKeyPrefix: 'TWILIO_API_KEY',
119
+ severity: 'critical',
120
+ },
121
+ // ── SendGrid ─────────────────────────────────────────────────────────────────
122
+ {
123
+ id: 'sendgrid-api-key',
124
+ description: 'SendGrid API Key',
125
+ pattern: /['"\`](SG\.[A-Za-z0-9\-_]{22}\.[A-Za-z0-9\-_]{43})['"\`]/,
126
+ valueGroup: 1,
127
+ envKeyPrefix: 'SENDGRID_API_KEY',
128
+ severity: 'critical',
129
+ },
130
+ // ── Slack ─────────────────────────────────────────────────────────────────────
131
+ {
132
+ id: 'slack-bot-token',
133
+ description: 'Slack Bot / User Token (xoxb- / xoxp-)',
134
+ pattern: /['"\`](xox[bpoa]-[A-Za-z0-9\-]{10,})['"\`]/,
135
+ valueGroup: 1,
136
+ envKeyPrefix: 'SLACK_TOKEN',
137
+ severity: 'critical',
138
+ },
139
+ {
140
+ id: 'slack-webhook-url',
141
+ description: 'Slack Incoming Webhook URL',
142
+ pattern: /['"\`](https:\/\/hooks\.slack\.com\/services\/T[A-Z0-9]+\/B[A-Z0-9]+\/[A-Za-z0-9]+)['"\`]/,
143
+ valueGroup: 1,
144
+ envKeyPrefix: 'SLACK_WEBHOOK_URL',
145
+ severity: 'high',
146
+ },
147
+ {
148
+ id: 'slack-signing-secret',
149
+ description: 'Slack Signing Secret',
150
+ pattern: /(?:slack[_-]?signing[_-]?secret|SLACK_SIGNING_SECRET)\s*[:=]\s*['"\`]([a-f0-9]{32})['"\`]/i,
151
+ valueGroup: 1,
152
+ envKeyPrefix: 'SLACK_SIGNING_SECRET',
153
+ severity: 'critical',
154
+ },
155
+ // ── Mailgun ───────────────────────────────────────────────────────────────────
156
+ {
157
+ id: 'mailgun-api-key',
158
+ description: 'Mailgun API Key',
159
+ pattern: /['"\`](key-[A-Za-z0-9]{32})['"\`]/,
160
+ valueGroup: 1,
161
+ envKeyPrefix: 'MAILGUN_API_KEY',
162
+ severity: 'critical',
163
+ },
164
+ // ── Cloudflare ────────────────────────────────────────────────────────────────
165
+ {
166
+ id: 'cloudflare-api-token',
167
+ description: 'Cloudflare API Token',
168
+ pattern: /(?:cloudflare[_-]?api[_-]?token|CF_API_TOKEN|CLOUDFLARE_API_TOKEN)\s*[:=]\s*['"\`]([A-Za-z0-9\-_]{40})['"\`]/i,
169
+ valueGroup: 1,
170
+ envKeyPrefix: 'CLOUDFLARE_API_TOKEN',
171
+ severity: 'critical',
172
+ },
173
+ {
174
+ id: 'cloudflare-global-api-key',
175
+ description: 'Cloudflare Global API Key',
176
+ pattern: /(?:cloudflare[_-]?(?:global[_-]?)?(?:api[_-]?)?key|CF_API_KEY|CLOUDFLARE_API_KEY)\s*[:=]\s*['"\`]([a-f0-9]{37})['"\`]/i,
177
+ valueGroup: 1,
178
+ envKeyPrefix: 'CLOUDFLARE_API_KEY',
179
+ severity: 'critical',
180
+ },
181
+ // ── Datadog ───────────────────────────────────────────────────────────────────
182
+ {
183
+ id: 'datadog-api-key',
184
+ description: 'Datadog API Key',
185
+ pattern: /(?:dd[_-]?api[_-]?key|datadog[_-]?api[_-]?key|DD_API_KEY)\s*[:=]\s*['"\`]([a-f0-9]{32})['"\`]/i,
186
+ valueGroup: 1,
187
+ envKeyPrefix: 'DD_API_KEY',
188
+ severity: 'critical',
189
+ },
190
+ {
191
+ id: 'datadog-app-key',
192
+ description: 'Datadog Application Key',
193
+ pattern: /(?:dd[_-]?app[_-]?key|datadog[_-]?app[_-]?key|DD_APP_KEY)\s*[:=]\s*['"\`]([a-f0-9]{40})['"\`]/i,
194
+ valueGroup: 1,
195
+ envKeyPrefix: 'DD_APP_KEY',
196
+ severity: 'critical',
197
+ },
198
+ // ── NPM ───────────────────────────────────────────────────────────────────────
199
+ {
200
+ id: 'npm-auth-token',
201
+ description: 'NPM Auth Token',
202
+ pattern: /(?:npm[_-]?(?:auth[_-]?)?token|NPM_TOKEN|NODE_AUTH_TOKEN)\s*[:=]\s*['"\`]([A-Za-z0-9\-]{36,})['"\`]/i,
203
+ valueGroup: 1,
204
+ envKeyPrefix: 'NPM_TOKEN',
205
+ severity: 'critical',
206
+ },
207
+ // ── Heroku ────────────────────────────────────────────────────────────────────
208
+ {
209
+ id: 'heroku-api-key',
210
+ description: 'Heroku API Key (UUID)',
211
+ pattern: /(?:heroku[_-]?api[_-]?key|HEROKU_API_KEY)\s*[:=]\s*['"\`]([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})['"\`]/i,
212
+ valueGroup: 1,
213
+ envKeyPrefix: 'HEROKU_API_KEY',
214
+ severity: 'critical',
215
+ },
216
+ // ── Shopify ───────────────────────────────────────────────────────────────────
217
+ {
218
+ id: 'shopify-access-token',
219
+ description: 'Shopify Private App Access Token (shpat_)',
220
+ pattern: /(?:shopify[_-]?(?:access[_-]?)?token|SHOPIFY_ACCESS_TOKEN)\s*[:=]\s*['"\`](shpat_[A-Za-z0-9]{32})['"\`]/i,
221
+ valueGroup: 1,
222
+ envKeyPrefix: 'SHOPIFY_ACCESS_TOKEN',
223
+ severity: 'critical',
224
+ },
225
+ {
226
+ id: 'shopify-shared-secret',
227
+ description: 'Shopify App Shared Secret',
228
+ pattern: /(?:shopify[_-]?(?:shared[_-]?|api[_-]?)?secret|SHOPIFY_API_SECRET)\s*[:=]\s*['"\`]([A-Za-z0-9]{32})['"\`]/i,
229
+ valueGroup: 1,
230
+ envKeyPrefix: 'SHOPIFY_SECRET',
231
+ severity: 'critical',
232
+ },
233
+ // ── Firebase ─────────────────────────────────────────────────────────────────
234
+ {
235
+ id: 'firebase-server-key',
236
+ description: 'Firebase Cloud Messaging Server Key',
237
+ pattern: /(?:firebase[_-]?server[_-]?key|FCM_SERVER_KEY)\s*[:=]\s*['"\`](AAAA[A-Za-z0-9\-_]{7}:[A-Za-z0-9\-_]{140})['"\`]/i,
238
+ valueGroup: 1,
239
+ envKeyPrefix: 'FCM_SERVER_KEY',
240
+ severity: 'critical',
241
+ },
242
+ // ── Auth0 ─────────────────────────────────────────────────────────────────────
243
+ {
244
+ id: 'auth0-client-secret',
245
+ description: 'Auth0 Client Secret',
246
+ pattern: /(?:auth0[_-]?client[_-]?secret|AUTH0_CLIENT_SECRET)\s*[:=]\s*['"\`]([A-Za-z0-9\-_]{43})['"\`]/i,
247
+ valueGroup: 1,
248
+ envKeyPrefix: 'AUTH0_CLIENT_SECRET',
249
+ severity: 'critical',
250
+ },
251
+ // ── Sentry ────────────────────────────────────────────────────────────────────
252
+ {
253
+ id: 'sentry-dsn',
254
+ description: 'Sentry DSN (contains secret)',
255
+ pattern: /(?:sentry[_-]?dsn|SENTRY_DSN)\s*[:=]\s*['"\`](https?:\/\/[a-f0-9]+@[^'"\`\s]+)['"\`]/i,
256
+ valueGroup: 1,
257
+ envKeyPrefix: 'SENTRY_DSN',
258
+ severity: 'high',
259
+ },
260
+ // ── Mailchimp ─────────────────────────────────────────────────────────────────
261
+ {
262
+ id: 'mailchimp-api-key',
263
+ description: 'Mailchimp API Key',
264
+ pattern: /['"\`]([A-Za-z0-9]{32}-us\d{1,2})['"\`]/,
265
+ valueGroup: 1,
266
+ envKeyPrefix: 'MAILCHIMP_API_KEY',
267
+ severity: 'critical',
268
+ },
269
+ // ── PayPal ────────────────────────────────────────────────────────────────────
270
+ {
271
+ id: 'paypal-client-secret',
272
+ description: 'PayPal Client Secret',
273
+ pattern: /(?:paypal[_-]?client[_-]?secret|PAYPAL_CLIENT_SECRET)\s*[:=]\s*['"\`]([A-Za-z0-9\-_]{64,})['"\`]/i,
274
+ valueGroup: 1,
275
+ envKeyPrefix: 'PAYPAL_CLIENT_SECRET',
276
+ severity: 'critical',
277
+ },
278
+ // ── Pusher ────────────────────────────────────────────────────────────────────
279
+ {
280
+ id: 'pusher-app-secret',
281
+ description: 'Pusher App Secret',
282
+ pattern: /(?:pusher[_-]?(?:app[_-]?)?secret|PUSHER_APP_SECRET)\s*[:=]\s*['"\`]([a-f0-9]{20})['"\`]/i,
283
+ valueGroup: 1,
284
+ envKeyPrefix: 'PUSHER_APP_SECRET',
285
+ severity: 'critical',
286
+ },
287
+ // ── Okta ─────────────────────────────────────────────────────────────────────
288
+ {
289
+ id: 'okta-api-token',
290
+ description: 'Okta API Token',
291
+ pattern: /(?:okta[_-]?(?:api[_-]?)?token|OKTA_API_TOKEN)\s*[:=]\s*['"\`]([A-Za-z0-9\-_]{42})['"\`]/i,
292
+ valueGroup: 1,
293
+ envKeyPrefix: 'OKTA_API_TOKEN',
294
+ severity: 'critical',
295
+ },
296
+ // ── OpenAI ───────────────────────────────────────────────────────────────────
297
+ {
298
+ id: 'openai-api-key',
299
+ description: 'OpenAI API Key (sk-...)',
300
+ pattern: /['"\`](sk-[A-Za-z0-9]{48,})['"\`]/,
301
+ valueGroup: 1,
302
+ envKeyPrefix: 'OPENAI_API_KEY',
303
+ severity: 'critical',
304
+ },
305
+ {
306
+ id: 'openai-org-id',
307
+ description: 'OpenAI Organization ID',
308
+ pattern: /(?:openai[_-]?org(?:anization)?[_-]?id|OPENAI_ORG_ID)\s*[:=]\s*['"\`](org-[A-Za-z0-9]{24,})['"\`]/i,
309
+ valueGroup: 1,
310
+ envKeyPrefix: 'OPENAI_ORG_ID',
311
+ severity: 'high',
312
+ },
313
+ // ── Anthropic ────────────────────────────────────────────────────────────────
314
+ {
315
+ id: 'anthropic-api-key',
316
+ description: 'Anthropic Claude API Key (sk-ant-...)',
317
+ pattern: /['"\`](sk-ant-[A-Za-z0-9\-_]{93,})['"\`]/,
318
+ valueGroup: 1,
319
+ envKeyPrefix: 'ANTHROPIC_API_KEY',
320
+ severity: 'critical',
321
+ },
322
+ // ── Hugging Face ─────────────────────────────────────────────────────────────
323
+ {
324
+ id: 'huggingface-token',
325
+ description: 'Hugging Face User Access Token (hf_)',
326
+ pattern: /['"\`](hf_[A-Za-z0-9]{34,})['"\`]/,
327
+ valueGroup: 1,
328
+ envKeyPrefix: 'HUGGINGFACE_TOKEN',
329
+ severity: 'critical',
330
+ },
331
+ // ── Pinecone ─────────────────────────────────────────────────────────────────
332
+ {
333
+ id: 'pinecone-api-key',
334
+ description: 'Pinecone API Key',
335
+ pattern: /(?:pinecone[_-]?api[_-]?key|PINECONE_API_KEY)\s*[:=]\s*['"\`]([a-f0-9\-]{36,})['"\`]/i,
336
+ valueGroup: 1,
337
+ envKeyPrefix: 'PINECONE_API_KEY',
338
+ severity: 'critical',
339
+ },
340
+ // ── Supabase ─────────────────────────────────────────────────────────────────
341
+ {
342
+ id: 'supabase-service-role-key',
343
+ description: 'Supabase Service Role Key (JWT)',
344
+ pattern: /(?:supabase[_-]?service[_-]?(?:role[_-]?)?key|SUPABASE_SERVICE_ROLE_KEY|SUPABASE_SERVICE_KEY)\s*[:=]\s*['"\`]([A-Za-z0-9\-_.]{20,})['"\`]/i,
345
+ valueGroup: 1,
346
+ envKeyPrefix: 'SUPABASE_SERVICE_ROLE_KEY',
347
+ severity: 'critical',
348
+ },
349
+ {
350
+ id: 'supabase-anon-key',
351
+ description: 'Supabase Anon / Public Key (JWT)',
352
+ pattern: /(?:supabase[_-]?anon[_-]?key|supabase[_-]?public[_-]?key|SUPABASE_ANON_KEY|NEXT_PUBLIC_SUPABASE_ANON_KEY)\s*[:=]\s*['"\`]([A-Za-z0-9\-_.]{20,})['"\`]/i,
353
+ valueGroup: 1,
354
+ envKeyPrefix: 'SUPABASE_ANON_KEY',
355
+ severity: 'high',
356
+ },
357
+ // ── Vercel ───────────────────────────────────────────────────────────────────
358
+ {
359
+ id: 'vercel-token',
360
+ description: 'Vercel Personal Access Token',
361
+ pattern: /(?:vercel[_-]?(?:api[_-]?)?token|VERCEL_TOKEN)\s*[:=]\s*['"\`]([A-Za-z0-9]{24,})['"\`]/i,
362
+ valueGroup: 1,
363
+ envKeyPrefix: 'VERCEL_TOKEN',
364
+ severity: 'critical',
365
+ },
366
+ // ── DigitalOcean ─────────────────────────────────────────────────────────────
367
+ {
368
+ id: 'digitalocean-token',
369
+ description: 'DigitalOcean Personal Access Token',
370
+ pattern: /(?:digitalocean[_-]?(?:api[_-]?)?token|do[_-]?token|DIGITALOCEAN_TOKEN|DO_API_TOKEN)\s*[:=]\s*['"\`]([A-Za-z0-9]{64,})['"\`]/i,
371
+ valueGroup: 1,
372
+ envKeyPrefix: 'DIGITALOCEAN_TOKEN',
373
+ severity: 'critical',
374
+ },
375
+ {
376
+ id: 'digitalocean-spaces-key',
377
+ description: 'DigitalOcean Spaces Access Key',
378
+ pattern: /(?:spaces[_-]?(?:access[_-]?)?key|DO_SPACES_KEY|SPACES_KEY)\s*[:=]\s*['"\`]([A-Za-z0-9]{20})['"\`]/i,
379
+ valueGroup: 1,
380
+ envKeyPrefix: 'DO_SPACES_KEY',
381
+ severity: 'critical',
382
+ },
383
+ // ── Algolia ───────────────────────────────────────────────────────────────────
384
+ {
385
+ id: 'algolia-admin-api-key',
386
+ description: 'Algolia Admin API Key',
387
+ pattern: /(?:algolia[_-]?admin[_-]?(?:api[_-]?)?key|ALGOLIA_ADMIN_API_KEY|ALGOLIA_API_KEY)\s*[:=]\s*['"\`]([A-Za-z0-9]{32})['"\`]/i,
388
+ valueGroup: 1,
389
+ envKeyPrefix: 'ALGOLIA_ADMIN_API_KEY',
390
+ severity: 'critical',
391
+ },
392
+ {
393
+ id: 'algolia-app-id',
394
+ description: 'Algolia Application ID',
395
+ pattern: /(?:algolia[_-]?app(?:lication)?[_-]?id|ALGOLIA_APP_ID)\s*[:=]\s*['"\`]([A-Z0-9]{10})['"\`]/i,
396
+ valueGroup: 1,
397
+ envKeyPrefix: 'ALGOLIA_APP_ID',
398
+ severity: 'medium',
399
+ },
400
+ // ── Mapbox ───────────────────────────────────────────────────────────────────
401
+ {
402
+ id: 'mapbox-access-token',
403
+ description: 'Mapbox Access Token (pk.eyJ... or sk.eyJ...)',
404
+ pattern: /['"\`]([ps]k\.eyJ[A-Za-z0-9\-_]+\.[A-Za-z0-9\-_.]+)['"\`]/,
405
+ valueGroup: 1,
406
+ envKeyPrefix: 'MAPBOX_ACCESS_TOKEN',
407
+ severity: 'critical',
408
+ },
409
+ // ── Telegram ─────────────────────────────────────────────────────────────────
410
+ {
411
+ id: 'telegram-bot-token',
412
+ description: 'Telegram Bot API Token',
413
+ pattern: /(?:telegram[_-]?(?:bot[_-]?)?token|TELEGRAM_BOT_TOKEN|BOT_TOKEN)\s*[:=]\s*['"\`](\d{8,10}:[A-Za-z0-9\-_]{35})['"\`]/i,
414
+ valueGroup: 1,
415
+ envKeyPrefix: 'TELEGRAM_BOT_TOKEN',
416
+ severity: 'critical',
417
+ },
418
+ // ── Discord ───────────────────────────────────────────────────────────────────
419
+ {
420
+ id: 'discord-bot-token',
421
+ description: 'Discord Bot Token',
422
+ pattern: /(?:discord[_-]?(?:bot[_-]?)?token|DISCORD_TOKEN|DISCORD_BOT_TOKEN)\s*[:=]\s*['"\`]([A-Za-z0-9\-_]{24}\.[A-Za-z0-9\-_]{6}\.[A-Za-z0-9\-_]{27,})['"\`]/i,
423
+ valueGroup: 1,
424
+ envKeyPrefix: 'DISCORD_BOT_TOKEN',
425
+ severity: 'critical',
426
+ },
427
+ {
428
+ id: 'discord-webhook-url',
429
+ description: 'Discord Incoming Webhook URL',
430
+ pattern: /['"\`](https:\/\/discord(?:app)?\.com\/api\/webhooks\/\d+\/[A-Za-z0-9\-_]+)['"\`]/,
431
+ valueGroup: 1,
432
+ envKeyPrefix: 'DISCORD_WEBHOOK_URL',
433
+ severity: 'high',
434
+ },
435
+ {
436
+ id: 'discord-client-secret',
437
+ description: 'Discord OAuth2 Client Secret',
438
+ pattern: /(?:discord[_-]?client[_-]?secret|DISCORD_CLIENT_SECRET)\s*[:=]\s*['"\`]([A-Za-z0-9\-_]{32,})['"\`]/i,
439
+ valueGroup: 1,
440
+ envKeyPrefix: 'DISCORD_CLIENT_SECRET',
441
+ severity: 'critical',
442
+ },
443
+ // ── Notion ────────────────────────────────────────────────────────────────────
444
+ {
445
+ id: 'notion-integration-token',
446
+ description: 'Notion Internal Integration Token (secret_...)',
447
+ pattern: /['"\`](secret_[A-Za-z0-9]{43,})['"\`]/,
448
+ valueGroup: 1,
449
+ envKeyPrefix: 'NOTION_TOKEN',
450
+ severity: 'critical',
451
+ },
452
+ // ── Linear ───────────────────────────────────────────────────────────────────
453
+ {
454
+ id: 'linear-api-key',
455
+ description: 'Linear API Key (lin_api_...)',
456
+ pattern: /['"\`](lin_api_[A-Za-z0-9]{40,})['"\`]/,
457
+ valueGroup: 1,
458
+ envKeyPrefix: 'LINEAR_API_KEY',
459
+ severity: 'critical',
460
+ },
461
+ // ── Airtable ─────────────────────────────────────────────────────────────────
462
+ {
463
+ id: 'airtable-api-key',
464
+ description: 'Airtable API Key or Personal Access Token',
465
+ pattern: /(?:airtable[_-]?(?:api[_-]?)?key|airtable[_-]?(?:pat|token)|AIRTABLE_API_KEY)\s*[:=]\s*['"\`]([A-Za-z0-9.]{14,})['"\`]/i,
466
+ valueGroup: 1,
467
+ envKeyPrefix: 'AIRTABLE_API_KEY',
468
+ severity: 'critical',
469
+ },
470
+ // ── HubSpot ───────────────────────────────────────────────────────────────────
471
+ {
472
+ id: 'hubspot-api-key',
473
+ description: 'HubSpot API Key or Private App Token (pat-...)',
474
+ pattern: /(?:hubspot[_-]?(?:api[_-]?)?(?:key|token)|HUBSPOT_API_KEY)\s*[:=]\s*['"\`]([A-Za-z0-9\-_]{8,})['"\`]/i,
475
+ valueGroup: 1,
476
+ envKeyPrefix: 'HUBSPOT_API_KEY',
477
+ severity: 'critical',
478
+ },
479
+ // ── Zendesk ───────────────────────────────────────────────────────────────────
480
+ {
481
+ id: 'zendesk-api-token',
482
+ description: 'Zendesk API Token',
483
+ pattern: /(?:zendesk[_-]?(?:api[_-]?)?token|ZENDESK_API_TOKEN|ZENDESK_TOKEN)\s*[:=]\s*['"\`]([A-Za-z0-9]{40,})['"\`]/i,
484
+ valueGroup: 1,
485
+ envKeyPrefix: 'ZENDESK_API_TOKEN',
486
+ severity: 'critical',
487
+ },
488
+ // ── Intercom ─────────────────────────────────────────────────────────────────
489
+ {
490
+ id: 'intercom-access-token',
491
+ description: 'Intercom Access Token',
492
+ pattern: /(?:intercom[_-]?(?:access[_-]?)?token|INTERCOM_TOKEN|INTERCOM_ACCESS_TOKEN)\s*[:=]\s*['"\`]([A-Za-z0-9_\-]{20,})['"\`]/i,
493
+ valueGroup: 1,
494
+ envKeyPrefix: 'INTERCOM_TOKEN',
495
+ severity: 'critical',
496
+ },
497
+ // ── Braintree ─────────────────────────────────────────────────────────────────
498
+ {
499
+ id: 'braintree-private-key',
500
+ description: 'Braintree Private Key',
501
+ pattern: /(?:braintree[_-]?private[_-]?key|BRAINTREE_PRIVATE_KEY)\s*[:=]\s*['"\`]([A-Za-z0-9]{32})['"\`]/i,
502
+ valueGroup: 1,
503
+ envKeyPrefix: 'BRAINTREE_PRIVATE_KEY',
504
+ severity: 'critical',
505
+ },
506
+ // ── Square ────────────────────────────────────────────────────────────────────
507
+ {
508
+ id: 'square-access-token',
509
+ description: 'Square Access Token',
510
+ pattern: /(?:square[_-]?(?:access[_-]?)?token|SQUARE_ACCESS_TOKEN)\s*[:=]\s*['"\`](EAA[A-Za-z0-9]{60,})['"\`]/i,
511
+ valueGroup: 1,
512
+ envKeyPrefix: 'SQUARE_ACCESS_TOKEN',
513
+ severity: 'critical',
514
+ },
515
+ // ── Razorpay ─────────────────────────────────────────────────────────────────
516
+ {
517
+ id: 'razorpay-key-secret',
518
+ description: 'Razorpay Key Secret',
519
+ pattern: /(?:razorpay[_-]?(?:key[_-]?)?secret|RAZORPAY_KEY_SECRET)\s*[:=]\s*['"\`]([A-Za-z0-9]{20,})['"\`]/i,
520
+ valueGroup: 1,
521
+ envKeyPrefix: 'RAZORPAY_KEY_SECRET',
522
+ severity: 'critical',
523
+ },
524
+ // ── Plaid ─────────────────────────────────────────────────────────────────────
525
+ {
526
+ id: 'plaid-client-secret',
527
+ description: 'Plaid Client Secret',
528
+ pattern: /(?:plaid[_-]?client[_-]?secret|plaid[_-]?secret|PLAID_SECRET)\s*[:=]\s*['"\`]([A-Za-z0-9]{30,})['"\`]/i,
529
+ valueGroup: 1,
530
+ envKeyPrefix: 'PLAID_SECRET',
531
+ severity: 'critical',
532
+ },
533
+ // ── Cloudinary ────────────────────────────────────────────────────────────────
534
+ {
535
+ id: 'cloudinary-api-secret',
536
+ description: 'Cloudinary API Secret',
537
+ pattern: /(?:cloudinary[_-]?api[_-]?secret|CLOUDINARY_API_SECRET)\s*[:=]\s*['"\`]([A-Za-z0-9\-_]{27,})['"\`]/i,
538
+ valueGroup: 1,
539
+ envKeyPrefix: 'CLOUDINARY_API_SECRET',
540
+ severity: 'critical',
541
+ },
542
+ {
543
+ id: 'cloudinary-url',
544
+ description: 'Cloudinary URL with embedded credentials',
545
+ pattern: /(?:cloudinary[_-]?url|CLOUDINARY_URL)\s*[:=]\s*['"\`](cloudinary:\/\/[^'"\`\s]+:[^'"\`\s]+@[^'"\`\s]+)['"\`]/i,
546
+ valueGroup: 1,
547
+ envKeyPrefix: 'CLOUDINARY_URL',
548
+ severity: 'critical',
549
+ },
550
+ // ── Amplitude ────────────────────────────────────────────────────────────────
551
+ {
552
+ id: 'amplitude-api-key',
553
+ description: 'Amplitude API Key or Secret Key',
554
+ pattern: /(?:amplitude[_-]?(?:api[_-]?|secret[_-]?)?key|AMPLITUDE_API_KEY|AMPLITUDE_SECRET_KEY)\s*[:=]\s*['"\`]([A-Za-z0-9]{32})['"\`]/i,
555
+ valueGroup: 1,
556
+ envKeyPrefix: 'AMPLITUDE_API_KEY',
557
+ severity: 'high',
558
+ },
559
+ // ── MixPanel ─────────────────────────────────────────────────────────────────
560
+ {
561
+ id: 'mixpanel-token',
562
+ description: 'Mixpanel Project Token or API Secret',
563
+ pattern: /(?:mixpanel[_-]?(?:(?:project[_-]?)?token|secret|api[_-]?secret)|MIXPANEL_TOKEN|MIXPANEL_SECRET)\s*[:=]\s*['"\`]([A-Za-z0-9]{32})['"\`]/i,
564
+ valueGroup: 1,
565
+ envKeyPrefix: 'MIXPANEL_TOKEN',
566
+ severity: 'high',
567
+ },
568
+ // ── Segment ───────────────────────────────────────────────────────────────────
569
+ {
570
+ id: 'segment-write-key',
571
+ description: 'Segment Write Key',
572
+ pattern: /(?:segment[_-]?write[_-]?key|SEGMENT_WRITE_KEY)\s*[:=]\s*['"\`]([A-Za-z0-9]{32,})['"\`]/i,
573
+ valueGroup: 1,
574
+ envKeyPrefix: 'SEGMENT_WRITE_KEY',
575
+ severity: 'high',
576
+ },
577
+ // ── LaunchDarkly ─────────────────────────────────────────────────────────────
578
+ {
579
+ id: 'launchdarkly-sdk-key',
580
+ description: 'LaunchDarkly SDK Key (sdk-...)',
581
+ pattern: /['"\`](sdk-[A-Za-z0-9\-_]{40,})['"\`]/,
582
+ valueGroup: 1,
583
+ envKeyPrefix: 'LAUNCHDARKLY_SDK_KEY',
584
+ severity: 'critical',
585
+ },
586
+ // ── Terraform Cloud ───────────────────────────────────────────────────────────
587
+ {
588
+ id: 'terraform-cloud-token',
589
+ description: 'Terraform Cloud / HCP API Token',
590
+ pattern: /(?:terraform[_-]?(?:cloud[_-]?)?token|TFC_TOKEN|TF_TOKEN|TERRAFORM_TOKEN)\s*[:=]\s*['"\`]([A-Za-z0-9.]{14,})['"\`]/i,
591
+ valueGroup: 1,
592
+ envKeyPrefix: 'TERRAFORM_CLOUD_TOKEN',
593
+ severity: 'critical',
594
+ },
595
+ // ── HashiCorp Vault ───────────────────────────────────────────────────────────
596
+ {
597
+ id: 'vault-token',
598
+ description: 'HashiCorp Vault Token (s. prefix or root token)',
599
+ pattern: /(?:vault[_-]?token|VAULT_TOKEN)\s*[:=]\s*['"\`](s\.[A-Za-z0-9]{24,}|hvs\.[A-Za-z0-9]{90,}|root)['"\`]/i,
600
+ valueGroup: 1,
601
+ envKeyPrefix: 'VAULT_TOKEN',
602
+ severity: 'critical',
603
+ },
604
+ // ── Confluent / Kafka ─────────────────────────────────────────────────────────
605
+ {
606
+ id: 'confluent-api-secret',
607
+ description: 'Confluent Cloud API Secret',
608
+ pattern: /(?:confluent[_-]?(?:api[_-]?)?secret|CONFLUENT_SECRET|CONFLUENT_API_SECRET)\s*[:=]\s*['"\`]([A-Za-z0-9+/=]{52,})['"\`]/i,
609
+ valueGroup: 1,
610
+ envKeyPrefix: 'CONFLUENT_API_SECRET',
611
+ severity: 'critical',
612
+ },
613
+ // ── Docker Hub ───────────────────────────────────────────────────────────────
614
+ {
615
+ id: 'dockerhub-password',
616
+ description: 'Docker Hub password or access token',
617
+ pattern: /(?:docker(?:hub)?[_-]?(?:password|pass|token|pat)|DOCKER_PASSWORD|DOCKERHUB_TOKEN)\s*[:=]\s*['"\`]([^'"\`\n]{8,})['"\`]/i,
618
+ valueGroup: 1,
619
+ envKeyPrefix: 'DOCKERHUB_TOKEN',
620
+ severity: 'critical',
621
+ },
622
+ // ── Jira / Atlassian ─────────────────────────────────────────────────────────
623
+ {
624
+ id: 'jira-api-token',
625
+ description: 'Jira / Atlassian API Token',
626
+ pattern: /(?:jira[_-]?(?:api[_-]?)?token|atlassian[_-]?(?:api[_-]?)?token|JIRA_API_TOKEN|ATLASSIAN_TOKEN)\s*[:=]\s*['"\`]([A-Za-z0-9]{24,})['"\`]/i,
627
+ valueGroup: 1,
628
+ envKeyPrefix: 'JIRA_API_TOKEN',
629
+ severity: 'critical',
630
+ },
631
+ // ── PagerDuty ────────────────────────────────────────────────────────────────
632
+ {
633
+ id: 'pagerduty-api-key',
634
+ description: 'PagerDuty API Key',
635
+ pattern: /(?:pagerduty[_-]?(?:api[_-]?)?(?:key|token)|PAGERDUTY_TOKEN|PAGERDUTY_API_KEY)\s*[:=]\s*['"\`]([A-Za-z0-9+/\-_]{20,})['"\`]/i,
636
+ valueGroup: 1,
637
+ envKeyPrefix: 'PAGERDUTY_API_KEY',
638
+ severity: 'critical',
639
+ },
640
+ // ── Grafana ───────────────────────────────────────────────────────────────────
641
+ {
642
+ id: 'grafana-api-key',
643
+ description: 'Grafana API Key or Service Account Token (glsa_)',
644
+ pattern: /(?:grafana[_-]?(?:api[_-]?)?(?:key|token)|GRAFANA_API_KEY)\s*[:=]\s*['"\`]([A-Za-z0-9\-_.=]{32,}|glsa_[A-Za-z0-9]{32}_[A-Za-z0-9]{8})['"\`]/i,
645
+ valueGroup: 1,
646
+ envKeyPrefix: 'GRAFANA_API_KEY',
647
+ severity: 'critical',
648
+ },
649
+ // ── New Relic ─────────────────────────────────────────────────────────────────
650
+ {
651
+ id: 'newrelic-api-key',
652
+ description: 'New Relic API Key (NRAK- or NRAA-)',
653
+ pattern: /['"\`]((?:NRAK|NRAA)-[A-Z0-9]{27})['"\`]/,
654
+ valueGroup: 1,
655
+ envKeyPrefix: 'NEW_RELIC_API_KEY',
656
+ severity: 'critical',
657
+ },
658
+ // ── Dynatrace ─────────────────────────────────────────────────────────────────
659
+ {
660
+ id: 'dynatrace-api-token',
661
+ description: 'Dynatrace API Token (dt0c01. prefix)',
662
+ pattern: /['"\`](dt0[a-zA-Z0-9]{2}\.[A-Z0-9]{24}\.[A-Z0-9]{64})['"\`]/,
663
+ valueGroup: 1,
664
+ envKeyPrefix: 'DYNATRACE_API_TOKEN',
665
+ severity: 'critical',
666
+ },
667
+ // ── Cohere ───────────────────────────────────────────────────────────────────
668
+ {
669
+ id: 'cohere-api-key',
670
+ description: 'Cohere API Key',
671
+ pattern: /(?:cohere[_-]?(?:api[_-]?)?key|COHERE_API_KEY)\s*[:=]\s*['"\`]([A-Za-z0-9]{40,})['"\`]/i,
672
+ valueGroup: 1,
673
+ envKeyPrefix: 'COHERE_API_KEY',
674
+ severity: 'critical',
675
+ },
676
+ // ── Replicate ────────────────────────────────────────────────────────────────
677
+ {
678
+ id: 'replicate-api-token',
679
+ description: 'Replicate API Token (r8_...)',
680
+ pattern: /['"\`](r8_[A-Za-z0-9]{40,})['"\`]/,
681
+ valueGroup: 1,
682
+ envKeyPrefix: 'REPLICATE_API_TOKEN',
683
+ severity: 'critical',
684
+ },
685
+ // ── PayPal ────────────────────────────────────────────────────────────────────
686
+ {
687
+ id: 'paypal-client-id',
688
+ description: 'PayPal Client ID (hardcoded)',
689
+ pattern: /(?:define\s*\(\s*[''"](PAYPAL_CLIENT_ID)[''"\`]\s*,\s*|(?:paypal[_-]?client[_-]?id|PAYPAL_CLIENT_ID)\s*[:=]\s*)[''"\`]([A-Za-z0-9\-_]{20,})[''"\`]/i,
690
+ valueGroup: 1,
691
+ envKeyPrefix: 'PAYPAL_CLIENT_ID',
692
+ severity: 'high',
693
+ },
694
+ // ── PagerDuty Integration Key ─────────────────────────────────────────────────
695
+ {
696
+ id: 'pagerduty-integration-key',
697
+ description: 'PagerDuty Events API / Integration Key (32 hex chars)',
698
+ pattern: /(?:pagerduty[_-]?(?:integration[_-]?|events?[_-]?)?key|PAGERDUTY_INTEGRATION_KEY|PAGERDUTY_EVENTS_KEY)\s*[:=,]\s*[''"\`]([a-f0-9]{32})[''"\`]/i,
699
+ valueGroup: 1,
700
+ envKeyPrefix: 'PAGERDUTY_INTEGRATION_KEY',
701
+ severity: 'critical',
702
+ },
703
+ // ── JFrog Artifactory ─────────────────────────────────────────────────────────
704
+ {
705
+ id: 'artifactory-secret',
706
+ description: 'JFrog Artifactory Identity Token or Secret',
707
+ pattern: /(?:artifactory[_-]?(?:secret|identity[_-]?token)|ARTIFACTORY_SECRET)\s*[:=,]\s*[''"\`]([A-Za-z0-9]{20,})[''"\`]/i,
708
+ valueGroup: 1,
709
+ envKeyPrefix: 'ARTIFACTORY_SECRET',
710
+ severity: 'critical',
711
+ },
712
+ {
713
+ id: 'artifactory-api-key',
714
+ description: 'JFrog Artifactory API Key',
715
+ pattern: /(?:artifactory[_-]?api[_-]?key|ARTIFACTORY_API_KEY)\s*[:=,]\s*[''"\`]([A-Za-z0-9]{20,})[''"\`]/i,
716
+ valueGroup: 1,
717
+ envKeyPrefix: 'ARTIFACTORY_API_KEY',
718
+ severity: 'critical',
719
+ },
720
+ {
721
+ id: 'artifactory-akc-token-bare',
722
+ description: 'JFrog Artifactory AKC-prefixed token (bare)',
723
+ pattern: /[''"\`](AKC[A-Za-z0-9]{20,})[''"\`]/,
724
+ valueGroup: 1,
725
+ envKeyPrefix: 'ARTIFACTORY_TOKEN',
726
+ severity: 'critical',
727
+ },
728
+ // ── AWS Secret Access Key bare ────────────────────────────────────────────────
729
+ {
730
+ id: 'aws-secret-access-key-bare',
731
+ description: 'AWS Secret Access Key (bare, named variable without full aws_ prefix)',
732
+ pattern: /(?:aws[_-]?secret|SECRET_ACCESS_KEY|secret_access_key)\s*[:=,]\s*[''"\`]([A-Za-z0-9+\/]{40})[''"\`]/i,
733
+ valueGroup: 1,
734
+ envKeyPrefix: 'AWS_SECRET_ACCESS_KEY',
735
+ severity: 'critical',
736
+ },
737
+ // ── Bitbucket ─────────────────────────────────────────────────────────────────
738
+ {
739
+ id: 'bitbucket-app-password',
740
+ description: 'Bitbucket App Password used for REST API authentication',
741
+ pattern: /(?:bitbucket[_-]?(?:app[_-]?)?password|BITBUCKET_APP_PASSWORD)\s*[:=]\s*['"`]([A-Za-z0-9+/]{20,})['"`]/i,
742
+ valueGroup: 1,
743
+ envKeyPrefix: 'BITBUCKET_APP_PASSWORD',
744
+ severity: 'critical',
745
+ },
746
+ {
747
+ id: 'bitbucket-client-secret',
748
+ description: 'Bitbucket OAuth Consumer Secret',
749
+ pattern: /(?:bitbucket[_-]?(?:client[_-]?|oauth[_-]?)?secret|BITBUCKET_CLIENT_SECRET)\s*[:=]\s*['"`]([A-Za-z0-9+/]{20,})['"`]/i,
750
+ valueGroup: 1,
751
+ envKeyPrefix: 'BITBUCKET_CLIENT_SECRET',
752
+ severity: 'critical',
753
+ },
754
+ // DigitalOcean PAT
755
+ {
756
+ id: 'digitalocean-personal-access-token',
757
+ description: 'DigitalOcean Personal Access Token (dop_v1_ prefix)',
758
+ pattern: /['"\`](dop_v1_[A-Za-z0-9]{64,})['"\`]/,
759
+ valueGroup: 1,
760
+ envKeyPrefix: 'DO_TOKEN',
761
+ severity: 'critical',
762
+ },
763
+ // DigitalOcean Spaces Secret
764
+ {
765
+ id: 'digitalocean-spaces-secret',
766
+ description: 'DigitalOcean Spaces Secret Access Key',
767
+ pattern: /(?:do[_-]?spaces[_-]?secret|DO_SPACES_SECRET)\s*[:=]\s*['"\`]([A-Za-z0-9\/+]{40})['"\`]/i,
768
+ valueGroup: 1,
769
+ envKeyPrefix: 'DO_SPACES_SECRET',
770
+ severity: 'critical',
771
+ },
772
+ // Linear API Key
773
+ {
774
+ id: 'linear-api-key',
775
+ description: 'Linear.app API Key (lin_api_ prefix)',
776
+ pattern: /['"\`](lin_api_[A-Za-z0-9]{40,})['"\`]/,
777
+ valueGroup: 1,
778
+ envKeyPrefix: 'LINEAR_API_KEY',
779
+ severity: 'critical',
780
+ },
781
+ // Notion Integration Token
782
+ {
783
+ id: 'notion-api-key',
784
+ description: 'Notion Integration Token (secret_ prefix)',
785
+ pattern: /(?:notion[_-]?(?:api[_-]?)?(?:key|token|secret)|NOTION_TOKEN|NOTION_API_KEY)\s*[:=]\s*['"\`](secret_[A-Za-z0-9]{43,})['"\`]/i,
786
+ valueGroup: 1,
787
+ envKeyPrefix: 'NOTION_TOKEN',
788
+ severity: 'critical',
789
+ },
790
+ // HubSpot API Key
791
+ {
792
+ id: 'hubspot-api-key',
793
+ description: 'HubSpot API Key or Private App Access Token',
794
+ pattern: /(?:hubspot[_-]?(?:api[_-]?key|private[_-]?app[_-]?token|access[_-]?token)|HUBSPOT_API_KEY|HUBSPOT_TOKEN)\s*[:=]\s*['"\`]([A-Za-z0-9\-_]{32,}|pat-na1-[A-Za-z0-9\-]{36,})['"\`]/i,
795
+ valueGroup: 1,
796
+ envKeyPrefix: 'HUBSPOT_API_KEY',
797
+ severity: 'critical',
798
+ },
799
+ // Zendesk API Token
800
+ {
801
+ id: 'zendesk-api-token',
802
+ description: 'Zendesk API Token',
803
+ pattern: /(?:zendesk[_-]?(?:api[_-]?)?token|ZENDESK_TOKEN|ZENDESK_API_TOKEN)\s*[:=]\s*['"\`]([A-Za-z0-9]{40,})['"\`]/i,
804
+ valueGroup: 1,
805
+ envKeyPrefix: 'ZENDESK_API_TOKEN',
806
+ severity: 'critical',
807
+ },
808
+ // Freshdesk API Key
809
+ {
810
+ id: 'freshdesk-api-key',
811
+ description: 'Freshdesk API Key',
812
+ pattern: /(?:freshdesk[_-]?(?:api[_-]?)?key|FRESHDESK_API_KEY)\s*[:=]\s*['"\`]([A-Za-z0-9]{20,})['"\`]/i,
813
+ valueGroup: 1,
814
+ envKeyPrefix: 'FRESHDESK_API_KEY',
815
+ severity: 'critical',
816
+ },
817
+ // Zoom API Secret
818
+ {
819
+ id: 'zoom-api-secret',
820
+ description: 'Zoom API Secret Key or Client Secret',
821
+ pattern: /(?:zoom[_-]?(?:api[_-]?)?secret|ZOOM_API_SECRET|ZOOM_CLIENT_SECRET)\s*[:=]\s*['"\`]([A-Za-z0-9]{20,})['"\`]/i,
822
+ valueGroup: 1,
823
+ envKeyPrefix: 'ZOOM_API_SECRET',
824
+ severity: 'critical',
825
+ },
826
+ // Asana PAT
827
+ {
828
+ id: 'asana-personal-access-token',
829
+ description: 'Asana Personal Access Token',
830
+ pattern: /(?:asana[_-]?(?:personal[_-]?access[_-]?)?token|ASANA_TOKEN|ASANA_PAT)\s*[:=]\s*['"\`]([0-9]{1,}\/[A-Za-z0-9:]{30,})['"\`]/i,
831
+ valueGroup: 1,
832
+ envKeyPrefix: 'ASANA_TOKEN',
833
+ severity: 'critical',
834
+ },
835
+ // Monday.com API Token
836
+ {
837
+ id: 'monday-api-token',
838
+ description: 'Monday.com API Token',
839
+ pattern: /(?:monday[_-]?(?:api[_-]?)?token|MONDAY_TOKEN|MONDAY_API_TOKEN)\s*[:=]\s*['"\`]([A-Za-z0-9]{60,})['"\`]/i,
840
+ valueGroup: 1,
841
+ envKeyPrefix: 'MONDAY_API_TOKEN',
842
+ severity: 'critical',
843
+ },
844
+ // Spotify Client Secret
845
+ {
846
+ id: 'spotify-client-secret',
847
+ description: 'Spotify API Client Secret',
848
+ pattern: /(?:spotify[_-]?client[_-]?secret|SPOTIFY_CLIENT_SECRET)\s*[:=]\s*['"\`]([a-f0-9]{32})['"\`]/i,
849
+ valueGroup: 1,
850
+ envKeyPrefix: 'SPOTIFY_CLIENT_SECRET',
851
+ severity: 'critical',
852
+ },
853
+ // Twitter/X API Secret
854
+ {
855
+ id: 'twitter-api-secret',
856
+ description: 'Twitter/X API Secret Key, Consumer Secret, or Bearer Token',
857
+ pattern: /(?:twitter[_-]?(?:api[_-]?)?(?:secret|consumer[_-]?secret|bearer[_-]?token)|TWITTER_API_SECRET|TWITTER_CONSUMER_SECRET|TWITTER_BEARER_TOKEN)\s*[:=]\s*['"\`]([A-Za-z0-9%\-_]{30,})['"\`]/i,
858
+ valueGroup: 1,
859
+ envKeyPrefix: 'TWITTER_API_SECRET',
860
+ severity: 'critical',
861
+ },
862
+ // Facebook/Meta App Secret
863
+ {
864
+ id: 'facebook-app-secret',
865
+ description: 'Facebook / Meta App Secret',
866
+ pattern: /(?:facebook[_-]?(?:app[_-]?)?secret|fb[_-]?app[_-]?secret|FACEBOOK_APP_SECRET|FB_APP_SECRET|META_APP_SECRET)\s*[:=]\s*['"\`]([a-f0-9]{32})['"\`]/i,
867
+ valueGroup: 1,
868
+ envKeyPrefix: 'FACEBOOK_APP_SECRET',
869
+ severity: 'critical',
870
+ },
871
+ // Instagram Access Token
872
+ {
873
+ id: 'instagram-access-token',
874
+ description: 'Instagram Graph API Access Token',
875
+ pattern: /(?:instagram[_-]?(?:access[_-]?)?token|INSTAGRAM_ACCESS_TOKEN|IG_ACCESS_TOKEN)\s*[:=]\s*['"\`]([A-Za-z0-9]{20,}\.[A-Za-z0-9\-_]{40,})['"\`]/i,
876
+ valueGroup: 1,
877
+ envKeyPrefix: 'INSTAGRAM_ACCESS_TOKEN',
878
+ severity: 'high',
879
+ },
880
+ // Dropbox Access Token
881
+ {
882
+ id: 'dropbox-access-token',
883
+ description: 'Dropbox OAuth2 Access Token (sl. prefix)',
884
+ pattern: /(?:dropbox[_-]?(?:access[_-]?)?token|DROPBOX_TOKEN|DROPBOX_ACCESS_TOKEN)\s*[:=]\s*['"\`](sl\.[A-Za-z0-9\-_]{130,})['"\`]/i,
885
+ valueGroup: 1,
886
+ envKeyPrefix: 'DROPBOX_ACCESS_TOKEN',
887
+ severity: 'critical',
888
+ },
889
+ // Box Developer Token
890
+ {
891
+ id: 'box-developer-token',
892
+ description: 'Box.com Developer Token or App Access Token',
893
+ pattern: /(?:box[_-]?(?:developer[_-]?|access[_-]?)?token|BOX_TOKEN|BOX_ACCESS_TOKEN|BOX_DEVELOPER_TOKEN)\s*[:=]\s*['"\`]([A-Za-z0-9]{32,})['"\`]/i,
894
+ valueGroup: 1,
895
+ envKeyPrefix: 'BOX_ACCESS_TOKEN',
896
+ severity: 'critical',
897
+ },
898
+ // ── Shopify ───────────────────────────────────────────────────────────────────
899
+ {
900
+ id: 'shopify-access-token',
901
+ description: 'Shopify Private App or Custom App Admin API Access Token (shpat_ / shpca_ prefix)',
902
+ pattern: /['"`](shp(?:at|ca)_[A-Za-z0-9]{32})['"`]/,
903
+ valueGroup: 1,
904
+ envKeyPrefix: 'SHOPIFY_ACCESS_TOKEN',
905
+ severity: 'critical',
906
+ },
907
+ {
908
+ id: 'shopify-shared-secret',
909
+ description: 'Shopify Partner / App Shared Secret used to verify webhook signatures',
910
+ pattern: /(?:shopify[_-]?(?:shared[_-]?|webhook[_-]?)?secret|SHOPIFY_SHARED_SECRET|SHOPIFY_WEBHOOK_SECRET)\s*[:=]\s*['"`]([a-f0-9]{32})['"`]/i,
911
+ valueGroup: 1,
912
+ envKeyPrefix: 'SHOPIFY_SHARED_SECRET',
913
+ severity: 'critical',
914
+ },
915
+ // ── PayPal ────────────────────────────────────────────────────────────────────
916
+ {
917
+ id: 'paypal-client-secret',
918
+ description: 'PayPal OAuth2 Client Secret',
919
+ pattern: /(?:paypal[_-]?client[_-]?secret|PAYPAL_CLIENT_SECRET)\s*[:=]\s*['"`]([A-Za-z0-9\-_.~]{20,})['"`]/i,
920
+ valueGroup: 1,
921
+ envKeyPrefix: 'PAYPAL_CLIENT_SECRET',
922
+ severity: 'critical',
923
+ },
924
+ {
925
+ id: 'paypal-client-id',
926
+ description: 'PayPal OAuth2 Client ID (App ID)',
927
+ pattern: /(?:paypal[_-]?client[_-]?id|PAYPAL_CLIENT_ID)\s*[:=]\s*['"`]([A-Za-z0-9\-_.~]{40,})['"`]/i,
928
+ valueGroup: 1,
929
+ envKeyPrefix: 'PAYPAL_CLIENT_ID',
930
+ severity: 'high',
931
+ },
932
+ // ── npm / Registry ────────────────────────────────────────────────────────────
933
+ {
934
+ id: 'npmrc-auth-token',
935
+ description: 'npm _authToken in .npmrc (new npm_... format or legacy UUID token)',
936
+ pattern: /(?:_authToken\s*=\s*|authToken\s*[:=]\s*['"`]?)([A-Za-z0-9\-_.~]{8,}|npm_[A-Za-z0-9]{36})(?:['"`]|\s|$)/,
937
+ valueGroup: 1,
938
+ envKeyPrefix: 'NPM_AUTH_TOKEN',
939
+ severity: 'critical',
940
+ },
941
+ // ── Sentry ────────────────────────────────────────────────────────────────────
942
+ {
943
+ id: 'sentry-dsn',
944
+ description: 'Sentry DSN with embedded public key (exposes project endpoint)',
945
+ pattern: /(?:sentry[_-]?dsn|SENTRY_DSN)\s*[:=]\s*['"`](https?:\/\/[A-Za-z0-9]+@o\d+\.ingest(?:\.us)?\.sentry\.io\/\d+)['"`]/i,
946
+ valueGroup: 1,
947
+ envKeyPrefix: 'SENTRY_DSN',
948
+ severity: 'high',
949
+ },
950
+ {
951
+ id: 'sentry-auth-token',
952
+ description: 'Sentry Auth Token (sntrys_ prefix — used for CI releases and source maps)',
953
+ pattern: /['"`](sntrys_[A-Za-z0-9_]{64,})['"`]/,
954
+ valueGroup: 1,
955
+ envKeyPrefix: 'SENTRY_AUTH_TOKEN',
956
+ severity: 'critical',
957
+ },
958
+ // ── Pusher ────────────────────────────────────────────────────────────────────
959
+ {
960
+ id: 'pusher-app-secret',
961
+ description: 'Pusher Channels App Secret',
962
+ pattern: /(?:pusher[_-]?(?:app[_-]?)?secret|PUSHER_APP_SECRET)\s*[:=]\s*['"`]([A-Za-z0-9]{20,})['"`]/i,
963
+ valueGroup: 1,
964
+ envKeyPrefix: 'PUSHER_APP_SECRET',
965
+ severity: 'critical',
966
+ },
967
+ {
968
+ id: 'pusher-app-key',
969
+ description: 'Pusher Channels App Key',
970
+ pattern: /(?:pusher[_-]?app[_-]?key|PUSHER_APP_KEY)\s*[:=]\s*['"`]([A-Za-z0-9]{20,})['"`]/i,
971
+ valueGroup: 1,
972
+ envKeyPrefix: 'PUSHER_APP_KEY',
973
+ severity: 'high',
974
+ },
975
+ // ── Postmark ──────────────────────────────────────────────────────────────────
976
+ {
977
+ id: 'postmark-server-token',
978
+ description: 'Postmark Server API Token (UUID format)',
979
+ pattern: /(?:postmark[_-]?(?:server[_-]?)?(?:token|api[_-]?key)|POSTMARK_SERVER_TOKEN|POSTMARK_API_KEY)\s*[:=]\s*['"`]([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})['"`]/i,
980
+ valueGroup: 1,
981
+ envKeyPrefix: 'POSTMARK_SERVER_TOKEN',
982
+ severity: 'critical',
983
+ },
984
+ // ── Mailchimp ─────────────────────────────────────────────────────────────────
985
+ {
986
+ id: 'mailchimp-api-key',
987
+ description: 'Mailchimp API Key (xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-usN format)',
988
+ pattern: /['"`]([A-Za-z0-9]{32}-us\d{1,2})['"`]/,
989
+ valueGroup: 1,
990
+ envKeyPrefix: 'MAILCHIMP_API_KEY',
991
+ severity: 'critical',
992
+ },
993
+ // ── Adyen ─────────────────────────────────────────────────────────────────────
994
+ {
995
+ id: 'adyen-api-key',
996
+ description: 'Adyen Payment Gateway API Key',
997
+ pattern: /(?:adyen[_-]?(?:api[_-]?)?key|ADYEN_API_KEY)\s*[:=]\s*['"`]([A-Za-z0-9+/=]{32,})['"`]/i,
998
+ valueGroup: 1,
999
+ envKeyPrefix: 'ADYEN_API_KEY',
1000
+ severity: 'critical',
1001
+ },
1002
+ // ── Braintree Merchant ID ─────────────────────────────────────────────────────
1003
+ {
1004
+ id: 'braintree-merchant-id',
1005
+ description: 'Braintree Merchant ID',
1006
+ pattern: /(?:braintree[_-]?merchant[_-]?id|BRAINTREE_MERCHANT_ID)\s*[:=]\s*['"`]([A-Za-z0-9]{16,})['"`]/i,
1007
+ valueGroup: 1,
1008
+ envKeyPrefix: 'BRAINTREE_MERCHANT_ID',
1009
+ severity: 'medium',
1010
+ },
1011
+ // ── Linode / Akamai Cloud ─────────────────────────────────────────────────────
1012
+ {
1013
+ id: 'linode-personal-access-token',
1014
+ description: 'Linode / Akamai Cloud API Personal Access Token',
1015
+ pattern: /(?:linode[_-]?(?:api[_-]?)?token|LINODE_TOKEN|LINODE_API_TOKEN)\s*[:=]\s*['"`]([A-Za-z0-9]{64})['"`]/i,
1016
+ valueGroup: 1,
1017
+ envKeyPrefix: 'LINODE_TOKEN',
1018
+ severity: 'critical',
1019
+ },
1020
+ // ── Vultr ─────────────────────────────────────────────────────────────────────
1021
+ {
1022
+ id: 'vultr-api-key',
1023
+ description: 'Vultr Cloud API Key (UUID v4 format)',
1024
+ pattern: /(?:vultr[_-]?(?:api[_-]?)?key|VULTR_API_KEY)\s*[:=]\s*['"`]([0-9A-Z]{8}-[0-9A-Z]{4}-[0-9A-Z]{4}-[0-9A-Z]{4}-[0-9A-Z]{12})['"`]/i,
1025
+ valueGroup: 1,
1026
+ envKeyPrefix: 'VULTR_API_KEY',
1027
+ severity: 'critical',
1028
+ },
1029
+ // ── Scaleway ──────────────────────────────────────────────────────────────────
1030
+ {
1031
+ id: 'scaleway-secret-key',
1032
+ description: 'Scaleway Secret Key (UUID v4 — used with SCW_SECRET_KEY env var)',
1033
+ pattern: /(?:scaleway[_-]?secret[_-]?key|SCW_SECRET_KEY)\s*[:=]\s*['"`]([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})['"`]/i,
1034
+ valueGroup: 1,
1035
+ envKeyPrefix: 'SCW_SECRET_KEY',
1036
+ severity: 'critical',
1037
+ },
1038
+ // ── Fly.io ────────────────────────────────────────────────────────────────────
1039
+ {
1040
+ id: 'fly-io-api-token',
1041
+ description: 'Fly.io Deploy / API Token (FlyV1 prefix)',
1042
+ pattern: /['"`](FlyV1\s[A-Za-z0-9+/=]{20,})['"`]/,
1043
+ valueGroup: 1,
1044
+ envKeyPrefix: 'FLY_API_TOKEN',
1045
+ severity: 'critical',
1046
+ },
1047
+ // ── Render ────────────────────────────────────────────────────────────────────
1048
+ {
1049
+ id: 'render-api-key',
1050
+ description: 'Render.com API Key (rnd_ prefix)',
1051
+ pattern: /['"`](rnd_[A-Za-z0-9]{40,})['"`]/,
1052
+ valueGroup: 1,
1053
+ envKeyPrefix: 'RENDER_API_KEY',
1054
+ severity: 'critical',
1055
+ },
1056
+ // ── Expo ──────────────────────────────────────────────────────────────────────
1057
+ {
1058
+ id: 'expo-access-token',
1059
+ description: 'Expo (React Native / EAS) Access Token (expo_ prefix)',
1060
+ pattern: /(?:['"`](expo_[A-Za-z0-9_]{40,})['"`]|(?:expo[_-]?(?:access[_-]?)?token|EXPO_TOKEN|EXPO_ACCESS_TOKEN)\s*[:=]\s*['"`]([A-Za-z0-9_]{20,})['"`])/i,
1061
+ valueGroup: 1,
1062
+ envKeyPrefix: 'EXPO_ACCESS_TOKEN',
1063
+ severity: 'critical',
1064
+ },
1065
+ ];
1066
+ //# sourceMappingURL=cloud.js.map