make-mp-data 3.0.2 → 3.0.4

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 (47) hide show
  1. package/dungeons/adspend.js +13 -26
  2. package/dungeons/anon.js +1 -1
  3. package/dungeons/array-of-object-lookup.js +1 -2
  4. package/dungeons/benchmark-heavy.js +5 -6
  5. package/dungeons/benchmark-light.js +13 -28
  6. package/dungeons/big.js +3 -3
  7. package/dungeons/business.js +11 -12
  8. package/dungeons/complex.js +1 -2
  9. package/dungeons/copilot.js +8 -6
  10. package/dungeons/education.js +21 -22
  11. package/dungeons/experiments.js +4 -5
  12. package/dungeons/fintech.js +25 -26
  13. package/dungeons/foobar.js +1 -1
  14. package/dungeons/food.js +24 -25
  15. package/dungeons/funnels.js +2 -2
  16. package/dungeons/gaming.js +39 -40
  17. package/dungeons/media.js +30 -31
  18. package/dungeons/mil.js +17 -18
  19. package/dungeons/mirror.js +2 -3
  20. package/dungeons/retention-cadence.js +1 -2
  21. package/dungeons/rpg.js +42 -43
  22. package/dungeons/sanity.js +1 -2
  23. package/dungeons/sass.js +32 -33
  24. package/dungeons/scd.js +3 -4
  25. package/dungeons/simple.js +13 -14
  26. package/dungeons/social.js +27 -28
  27. package/dungeons/soup-test.js +52 -0
  28. package/dungeons/streaming.js +17 -18
  29. package/dungeons/student-teacher.js +0 -1
  30. package/dungeons/text-generation.js +0 -1
  31. package/dungeons/user-agent.js +1 -2
  32. package/index.js +18 -6
  33. package/lib/core/config-validator.js +22 -33
  34. package/lib/core/context.js +6 -3
  35. package/lib/generators/events.js +13 -10
  36. package/lib/generators/funnels.js +7 -4
  37. package/lib/generators/scd.js +29 -17
  38. package/lib/generators/text.js +18 -12
  39. package/lib/orchestrators/mixpanel-sender.js +26 -38
  40. package/lib/orchestrators/user-loop.js +68 -15
  41. package/lib/templates/phrases.js +8 -5
  42. package/lib/utils/function-registry.js +17 -0
  43. package/lib/utils/utils.js +15 -84
  44. package/package.json +3 -1
  45. package/types.d.ts +86 -19
  46. package/lib/templates/verbose-schema.js +0 -272
  47. package/lib/utils/chart.js +0 -210
package/dungeons/sass.js CHANGED
@@ -98,9 +98,8 @@ const config = {
98
98
  hasAdSpend: false,
99
99
  percentUsersBornInDataset: 50,
100
100
  hasAvatar: true,
101
- makeChart: false,
102
101
  batchSize: 2_500_000,
103
- concurrency: 10,
102
+ concurrency: 1,
104
103
  writeToDisk: false,
105
104
  scdProps: {},
106
105
 
@@ -168,8 +167,8 @@ const config = {
168
167
  weight: 1,
169
168
  isFirstEvent: true,
170
169
  properties: {
171
- company_size: u.pickAWinner(["startup", "smb", "mid_market", "enterprise"]),
172
- industry: u.pickAWinner(["tech", "finance", "healthcare", "retail", "media"]),
170
+ company_size: ["startup", "smb", "mid_market", "enterprise"],
171
+ industry: ["tech", "finance", "healthcare", "retail", "media"],
173
172
  }
174
173
  },
175
174
  {
@@ -177,17 +176,17 @@ const config = {
177
176
  weight: 10,
178
177
  properties: {
179
178
  service_id: u.pickAWinner(serviceIds),
180
- service_type: u.pickAWinner(["web_app", "api", "database", "cache", "queue", "ml_model"]),
181
- environment: u.pickAWinner(["production", "staging", "dev"]),
182
- cloud_provider: u.pickAWinner(["aws", "gcp", "azure"]),
179
+ service_type: ["web_app", "api", "database", "cache", "queue", "ml_model"],
180
+ environment: ["production", "staging", "dev"],
181
+ cloud_provider: ["aws", "gcp", "azure"],
183
182
  }
184
183
  },
185
184
  {
186
185
  event: "dashboard viewed",
187
186
  weight: 20,
188
187
  properties: {
189
- dashboard_type: u.pickAWinner(["overview", "cost", "performance", "security", "custom"]),
190
- time_range: u.pickAWinner(["1h", "6h", "24h", "7d", "30d"]),
188
+ dashboard_type: ["overview", "cost", "performance", "security", "custom"],
189
+ time_range: ["1h", "6h", "24h", "7d", "30d"],
191
190
  }
192
191
  },
193
192
  {
@@ -195,8 +194,8 @@ const config = {
195
194
  weight: 12,
196
195
  properties: {
197
196
  alert_id: u.pickAWinner(alertIds),
198
- severity: u.pickAWinner(["info", "warning", "critical", "emergency"]),
199
- alert_type: u.pickAWinner(["cpu", "memory", "latency", "error_rate", "disk", "network"]),
197
+ severity: ["info", "warning", "critical", "emergency"],
198
+ alert_type: ["cpu", "memory", "latency", "error_rate", "disk", "network"],
200
199
  service_id: u.pickAWinner(serviceIds),
201
200
  }
202
201
  },
@@ -206,7 +205,7 @@ const config = {
206
205
  properties: {
207
206
  alert_id: u.pickAWinner(alertIds),
208
207
  response_time_mins: u.weighNumRange(1, 120),
209
- acknowledged_by_role: u.pickAWinner(["engineer", "sre", "manager", "oncall"]),
208
+ acknowledged_by_role: ["engineer", "sre", "manager", "oncall"],
210
209
  }
211
210
  },
212
211
  {
@@ -215,7 +214,7 @@ const config = {
215
214
  properties: {
216
215
  alert_id: u.pickAWinner(alertIds),
217
216
  resolution_time_mins: u.weighNumRange(5, 1440),
218
- root_cause: u.pickAWinner(["config_change", "capacity", "bug", "dependency", "network"]),
217
+ root_cause: ["config_change", "capacity", "bug", "dependency", "network"],
219
218
  }
220
219
  },
221
220
  {
@@ -223,7 +222,7 @@ const config = {
223
222
  weight: 9,
224
223
  properties: {
225
224
  pipeline_id: u.pickAWinner(pipelineIds),
226
- status: u.pickAWinner(["success", "failed", "cancelled"]),
225
+ status: ["success", "failed", "cancelled"],
227
226
  duration_sec: u.weighNumRange(30, 1800),
228
227
  commit_count: u.weighNumRange(1, 20),
229
228
  }
@@ -243,7 +242,7 @@ const config = {
243
242
  event: "cost report generated",
244
243
  weight: 4,
245
244
  properties: {
246
- report_period: u.pickAWinner(["daily", "weekly", "monthly"]),
245
+ report_period: ["daily", "weekly", "monthly"],
247
246
  total_cost: u.weighNumRange(100, 50000),
248
247
  cost_change_percent: u.weighNumRange(-30, 50),
249
248
  }
@@ -252,23 +251,23 @@ const config = {
252
251
  event: "team member invited",
253
252
  weight: 3,
254
253
  properties: {
255
- role: u.pickAWinner(["admin", "editor", "viewer", "billing"]),
256
- invitation_method: u.pickAWinner(["email", "sso", "slack"]),
254
+ role: ["admin", "editor", "viewer", "billing"],
255
+ invitation_method: ["email", "sso", "slack"],
257
256
  }
258
257
  },
259
258
  {
260
259
  event: "integration configured",
261
260
  weight: 4,
262
261
  properties: {
263
- integration_type: u.pickAWinner(["slack", "pagerduty", "jira", "github", "datadog", "terraform"]),
264
- status: u.pickAWinner(["active", "paused", "error"]),
262
+ integration_type: ["slack", "pagerduty", "jira", "github", "datadog", "terraform"],
263
+ status: ["active", "paused", "error"],
265
264
  }
266
265
  },
267
266
  {
268
267
  event: "query executed",
269
268
  weight: 15,
270
269
  properties: {
271
- query_type: u.pickAWinner(["metrics", "logs", "traces"]),
270
+ query_type: ["metrics", "logs", "traces"],
272
271
  time_range_hours: u.weighNumRange(1, 720),
273
272
  result_count: u.weighNumRange(0, 10000),
274
273
  }
@@ -278,7 +277,7 @@ const config = {
278
277
  weight: 3,
279
278
  properties: {
280
279
  runbook_id: u.pickAWinner(runbookIds),
281
- trigger: u.pickAWinner(["manual", "automated", "alert_triggered"]),
280
+ trigger: ["manual", "automated", "alert_triggered"],
282
281
  success: u.pickAWinner([true, false], 0.15),
283
282
  }
284
283
  },
@@ -286,7 +285,7 @@ const config = {
286
285
  event: "billing event",
287
286
  weight: 3,
288
287
  properties: {
289
- event_type: u.pickAWinner(["invoice_generated", "payment_received", "payment_failed", "plan_upgraded", "plan_downgraded"]),
288
+ event_type: ["invoice_generated", "payment_received", "payment_failed", "plan_upgraded", "plan_downgraded"],
290
289
  amount: u.weighNumRange(99, 25000),
291
290
  }
292
291
  },
@@ -294,7 +293,7 @@ const config = {
294
293
  event: "security scan",
295
294
  weight: 6,
296
295
  properties: {
297
- scan_type: u.pickAWinner(["vulnerability", "compliance", "access_audit"]),
296
+ scan_type: ["vulnerability", "compliance", "access_audit"],
298
297
  findings_count: u.weighNumRange(0, 50),
299
298
  critical_findings: u.weighNumRange(0, 10),
300
299
  }
@@ -303,8 +302,8 @@ const config = {
303
302
  event: "api call",
304
303
  weight: 16,
305
304
  properties: {
306
- endpoint: u.pickAWinner(["/deploy", "/status", "/metrics", "/alerts", "/config", "/billing"]),
307
- method: u.pickAWinner(["GET", "POST", "PUT", "DELETE"]),
305
+ endpoint: ["/deploy", "/status", "/metrics", "/alerts", "/config", "/billing"],
306
+ method: ["GET", "POST", "PUT", "DELETE"],
308
307
  response_time_ms: u.weighNumRange(10, 5000),
309
308
  status_code: u.pickAWinner([200, 201, 400, 401, 403, 500, 503]),
310
309
  }
@@ -313,7 +312,7 @@ const config = {
313
312
  event: "documentation viewed",
314
313
  weight: 7,
315
314
  properties: {
316
- doc_section: u.pickAWinner(["getting_started", "api_reference", "best_practices", "troubleshooting", "changelog"]),
315
+ doc_section: ["getting_started", "api_reference", "best_practices", "troubleshooting", "changelog"],
317
316
  time_on_page_sec: u.weighNumRange(5, 600),
318
317
  }
319
318
  },
@@ -323,20 +322,20 @@ const config = {
323
322
  properties: {
324
323
  flag_name: () => `flag_${chance.word()}`,
325
324
  new_state: u.pickAWinner(["enabled", "disabled"], 0.15),
326
- environment: u.pickAWinner(["production", "staging", "dev"]),
325
+ environment: ["production", "staging", "dev"],
327
326
  }
328
327
  },
329
328
  ],
330
329
 
331
330
  superProps: {
332
331
  plan_tier: u.pickAWinner(["free", "free", "team", "team", "business", "enterprise"]),
333
- cloud_provider: u.pickAWinner(["aws", "gcp", "azure", "multi_cloud"]),
332
+ cloud_provider: ["aws", "gcp", "azure", "multi_cloud"],
334
333
  },
335
334
 
336
335
  userProps: {
337
336
  company_size: u.pickAWinner(["startup", "startup", "smb", "mid_market", "enterprise"]),
338
- primary_role: u.pickAWinner(["engineer", "sre", "devops", "manager", "executive"]),
339
- team_name: u.pickAWinner(["Platform", "Backend", "Frontend", "Data", "Security", "Infrastructure"]),
337
+ primary_role: ["engineer", "sre", "devops", "manager", "executive"],
338
+ team_name: ["Platform", "Backend", "Frontend", "Data", "Security", "Infrastructure"],
340
339
  },
341
340
 
342
341
  groupKeys: [
@@ -346,9 +345,9 @@ const config = {
346
345
  groupProps: {
347
346
  company_id: {
348
347
  name: () => `${chance.word({ capitalize: true })} ${chance.pickone(["Systems", "Technologies", "Labs", "Cloud", "Digital", "Networks", "Solutions"])}`,
349
- industry: u.pickAWinner(["tech", "finance", "healthcare", "retail", "media", "manufacturing", "logistics"]),
350
- employee_count: u.pickAWinner(["1-10", "11-50", "51-200", "201-1000", "1001-5000", "5000+"]),
351
- arr_bucket: u.pickAWinner(["<10k", "10k-50k", "50k-200k", "200k-1M", "1M+"]),
348
+ industry: ["tech", "finance", "healthcare", "retail", "media", "manufacturing", "logistics"],
349
+ employee_count: ["1-10", "11-50", "51-200", "201-1000", "1001-5000", "5000+"],
350
+ arr_bucket: ["<10k", "10k-50k", "50k-200k", "200k-1M", "1M+"],
352
351
  }
353
352
  },
354
353
 
package/dungeons/scd.js CHANGED
@@ -32,7 +32,6 @@ const config = {
32
32
  hasAnonIds: false, //if true, anonymousIds are created for each user
33
33
  hasSessionIds: false, //if true, hasSessionIds are created for each user
34
34
  hasAdSpend: false,
35
- makeChart: false,
36
35
  hasLocation: true,
37
36
  hasAndroidDevices: true,
38
37
  hasIOSDevices: true,
@@ -48,7 +47,7 @@ const config = {
48
47
  weight: 2,
49
48
  properties: {
50
49
  amount: weighNumRange(5, 500, .25),
51
- currency: pickAWinner(["USD", "CAD", "EUR", "BTC", "ETH", "JPY"], 0),
50
+ currency: ["USD", "CAD", "EUR", "BTC", "ETH", "JPY"],
52
51
  coupon: weighChoices(["none", "none", "none", "none", "10%OFF", "20%OFF", "10%OFF", "20%OFF", "30%OFF", "40%OFF", "50%OFF"]),
53
52
  numItems: weighNumRange(1, 10),
54
53
 
@@ -173,7 +172,7 @@ const config = {
173
172
  company_id: {
174
173
  name: () => { return chance.name(); },
175
174
  email: () => { return `CSM: ${chance.pickone(["AK", "Neha", "Rajiv", "Deepak", "Justin", "Hans", "Katie", "Somya", "Tony", "Kaan"])}`; },
176
- industry: pickAWinner([
175
+ industry: [
177
176
  "technology",
178
177
  "education",
179
178
  "finance",
@@ -190,7 +189,7 @@ const config = {
190
189
  "utilities",
191
190
  "agriculture",
192
191
  "other",
193
- ]),
192
+ ],
194
193
  segment: ["SMB", "SMB", "SMB", "Mid Market", "Mid Market", "Enterprise"],
195
194
  "# active users": chance.integer({ min: 2, max: 20 })
196
195
  }
@@ -22,17 +22,16 @@ const videoCategories = ["funny", "educational", "inspirational", "music", "news
22
22
 
23
23
  /** @type {import('../types').Dungeon} */
24
24
  const config = {
25
- token: "",
25
+ token: "c63e5bca7d459fad276354ea9ddbaaeb",
26
26
  seed: "simple is best",
27
27
  numDays: 100, //how many days worth1 of data
28
- numEvents: 1_000_000, //how many events
29
- numUsers: 10_000, //how many users
28
+ numEvents: 500_000, //how many events
29
+ numUsers: 5_000, //how many users
30
30
  format: 'json', //csv or json
31
31
  region: "US",
32
32
  hasAnonIds: true, //if true, anonymousIds are created for each user
33
33
  hasSessionIds: true, //if true, hasSessionIds are created for each user
34
- hasAdSpend: true,
35
- makeChart: false,
34
+ hasAdSpend: false,
36
35
  hasLocation: true,
37
36
  hasAndroidDevices: true,
38
37
  hasIOSDevices: true,
@@ -41,7 +40,7 @@ const config = {
41
40
  hasCampaigns: true,
42
41
  isAnonymous: false,
43
42
  alsoInferFunnels: true,
44
- concurrency: 10,
43
+ concurrency: 1,
45
44
  batchSize: 2_500_000,
46
45
 
47
46
 
@@ -50,14 +49,14 @@ const config = {
50
49
  event: "ad impression",
51
50
  weight: 15,
52
51
  properties: {
53
- partner: pickAWinner(["google", "facebook", "twitter", "linkedin", "bing", "taboola", "outbrain", "quora", "pinterest"]),
52
+ partner: ["google", "facebook", "twitter", "linkedin", "bing", "taboola", "outbrain", "quora", "pinterest"],
54
53
  }
55
54
  },
56
55
  {
57
56
  event: "ad click",
58
57
  weight: 10,
59
58
  properties: {
60
- partner: pickAWinner(["google", "facebook", "twitter", "linkedin", "bing", "taboola", "outbrain", "quora", "pinterest"]),
59
+ partner: ["google", "facebook", "twitter", "linkedin", "bing", "taboola", "outbrain", "quora", "pinterest"],
61
60
  }
62
61
  },
63
62
  {
@@ -65,7 +64,7 @@ const config = {
65
64
  weight: 2,
66
65
  properties: {
67
66
  amount: weighNumRange(5, 500, .25),
68
- currency: pickAWinner(["USD", "CAD", "EUR", "BTC", "ETH", "JPY"], 0),
67
+ currency: ["USD", "CAD", "EUR", "BTC", "ETH", "JPY"],
69
68
  coupon: weighChoices(["none", "none", "none", "none", "10%OFF", "20%OFF", "10%OFF", "20%OFF", "30%OFF", "40%OFF", "50%OFF"]),
70
69
  numItems: weighNumRange(1, 10),
71
70
 
@@ -127,7 +126,7 @@ const config = {
127
126
  weight: 1,
128
127
  isFirstEvent: true,
129
128
  properties: {
130
- signupMethod: pickAWinner(["email", "google", "facebook", "twitter", "linkedin", "github"]),
129
+ signupMethod: ["email", "google", "facebook", "twitter", "linkedin", "github"],
131
130
  referral: weighChoices(["none", "none", "none", "friend", "ad", "ad", "ad", "friend", "friend", "friend", "friend"]),
132
131
  }
133
132
  },
@@ -192,8 +191,8 @@ const config = {
192
191
  }
193
192
 
194
193
  if (EVENT_TIME.isBefore(OVER_THINGS_GET_BETTER)) {
195
- // kill 33% of all volume
196
- if (chance.bool({ likelihood: 33 })) return null;
194
+ // tag 33% for removal (filtered in "everything" hook)
195
+ if (chance.bool({ likelihood: 33 })) record._drop = true;
197
196
  }
198
197
  }
199
198
 
@@ -233,10 +232,10 @@ const config = {
233
232
  }
234
233
  }
235
234
 
235
+ // Filter out events tagged for removal in the event hook
236
+ record = record.filter(e => !e._drop);
236
237
  }
237
238
 
238
-
239
-
240
239
  return record;
241
240
  }
242
241
  };
@@ -118,9 +118,8 @@ const config = {
118
118
  hasAdSpend: false,
119
119
  percentUsersBornInDataset: 50,
120
120
  hasAvatar: true,
121
- makeChart: false,
122
121
  batchSize: 2_500_000,
123
- concurrency: 10,
122
+ concurrency: 1,
124
123
  writeToDisk: false,
125
124
  scdProps: {},
126
125
 
@@ -188,15 +187,15 @@ const config = {
188
187
  weight: 1,
189
188
  isFirstEvent: true,
190
189
  properties: {
191
- "signup_method": u.pickAWinner(["email", "google", "apple", "sso"]),
192
- "referred_by": u.pickAWinner(["organic", "friend", "ad", "influencer"]),
190
+ "signup_method": ["email", "google", "apple", "sso"],
191
+ "referred_by": ["organic", "friend", "ad", "influencer"],
193
192
  }
194
193
  },
195
194
  {
196
195
  event: "post created",
197
196
  weight: 12,
198
197
  properties: {
199
- "post_type": u.pickAWinner(["text", "image", "video", "poll", "link"]),
198
+ "post_type": ["text", "image", "video", "poll", "link"],
200
199
  "character_count": u.weighNumRange(1, 280),
201
200
  "has_media": u.pickAWinner([true, false], 0.4),
202
201
  "hashtag_count": u.weighNumRange(0, 10, 0.5),
@@ -206,23 +205,23 @@ const config = {
206
205
  event: "post viewed",
207
206
  weight: 30,
208
207
  properties: {
209
- "post_type": u.pickAWinner(["text", "image", "video", "poll", "link"]),
208
+ "post_type": ["text", "image", "video", "poll", "link"],
210
209
  "view_duration_sec": u.weighNumRange(1, 120, 0.3, 5),
211
- "source": u.pickAWinner(["feed", "explore", "search", "profile", "notification"]),
210
+ "source": ["feed", "explore", "search", "profile", "notification"],
212
211
  }
213
212
  },
214
213
  {
215
214
  event: "post liked",
216
215
  weight: 18,
217
216
  properties: {
218
- "post_type": u.pickAWinner(["text", "image", "video", "poll", "link"]),
217
+ "post_type": ["text", "image", "video", "poll", "link"],
219
218
  }
220
219
  },
221
220
  {
222
221
  event: "post shared",
223
222
  weight: 6,
224
223
  properties: {
225
- "share_destination": u.pickAWinner(["repost", "dm", "external", "copy_link"]),
224
+ "share_destination": ["repost", "dm", "external", "copy_link"],
226
225
  }
227
226
  },
228
227
  {
@@ -237,21 +236,21 @@ const config = {
237
236
  event: "user followed",
238
237
  weight: 8,
239
238
  properties: {
240
- "discovery_source": u.pickAWinner(["suggested", "search", "post", "profile", "mutual"]),
239
+ "discovery_source": ["suggested", "search", "post", "profile", "mutual"],
241
240
  }
242
241
  },
243
242
  {
244
243
  event: "user unfollowed",
245
244
  weight: 2,
246
245
  properties: {
247
- "reason": u.pickAWinner(["content_quality", "too_frequent", "lost_interest", "offensive"]),
246
+ "reason": ["content_quality", "too_frequent", "lost_interest", "offensive"],
248
247
  }
249
248
  },
250
249
  {
251
250
  event: "story viewed",
252
251
  weight: 15,
253
252
  properties: {
254
- "story_type": u.pickAWinner(["photo", "video", "text"]),
253
+ "story_type": ["photo", "video", "text"],
255
254
  "view_duration_sec": u.weighNumRange(1, 30, 0.5, 5),
256
255
  "completed": u.pickAWinner([true, false], 0.6),
257
256
  }
@@ -260,7 +259,7 @@ const config = {
260
259
  event: "story created",
261
260
  weight: 5,
262
261
  properties: {
263
- "story_type": u.pickAWinner(["photo", "video", "text"]),
262
+ "story_type": ["photo", "video", "text"],
264
263
  "has_filter": u.pickAWinner([true, false], 0.5),
265
264
  "has_sticker": u.pickAWinner([true, false], 0.3),
266
265
  }
@@ -269,7 +268,7 @@ const config = {
269
268
  event: "search performed",
270
269
  weight: 7,
271
270
  properties: {
272
- "search_type": u.pickAWinner(["users", "hashtags", "posts"]),
271
+ "search_type": ["users", "hashtags", "posts"],
273
272
  "results_count": u.weighNumRange(0, 50, 0.5, 10),
274
273
  }
275
274
  },
@@ -277,7 +276,7 @@ const config = {
277
276
  event: "notification received",
278
277
  weight: 12,
279
278
  properties: {
280
- "notification_type": u.pickAWinner(["like", "follow", "comment", "mention", "trending"]),
279
+ "notification_type": ["like", "follow", "comment", "mention", "trending"],
281
280
  "clicked": u.pickAWinner([true, false], 0.4),
282
281
  }
283
282
  },
@@ -285,7 +284,7 @@ const config = {
285
284
  event: "dm sent",
286
285
  weight: 8,
287
286
  properties: {
288
- "message_type": u.pickAWinner(["text", "image", "voice", "link"]),
287
+ "message_type": ["text", "image", "voice", "link"],
289
288
  "conversation_length": u.weighNumRange(1, 100),
290
289
  }
291
290
  },
@@ -293,8 +292,8 @@ const config = {
293
292
  event: "ad viewed",
294
293
  weight: 10,
295
294
  properties: {
296
- "ad_format": u.pickAWinner(["feed_native", "story", "banner", "video"]),
297
- "ad_category": u.pickAWinner(["retail", "tech", "food", "finance", "entertainment"]),
295
+ "ad_format": ["feed_native", "story", "banner", "video"],
296
+ "ad_category": ["retail", "tech", "food", "finance", "entertainment"],
298
297
  "view_duration_sec": u.weighNumRange(1, 30, 0.3),
299
298
  }
300
299
  },
@@ -302,38 +301,38 @@ const config = {
302
301
  event: "ad clicked",
303
302
  weight: 2,
304
303
  properties: {
305
- "ad_format": u.pickAWinner(["feed_native", "story", "banner", "video"]),
306
- "ad_category": u.pickAWinner(["retail", "tech", "food", "finance", "entertainment"]),
304
+ "ad_format": ["feed_native", "story", "banner", "video"],
305
+ "ad_category": ["retail", "tech", "food", "finance", "entertainment"],
307
306
  }
308
307
  },
309
308
  {
310
309
  event: "report submitted",
311
310
  weight: 1,
312
311
  properties: {
313
- "report_type": u.pickAWinner(["spam", "harassment", "misinformation", "hate_speech", "other"]),
314
- "content_type": u.pickAWinner(["post", "comment", "user", "dm"]),
312
+ "report_type": ["spam", "harassment", "misinformation", "hate_speech", "other"],
313
+ "content_type": ["post", "comment", "user", "dm"],
315
314
  }
316
315
  },
317
316
  {
318
317
  event: "profile updated",
319
318
  weight: 3,
320
319
  properties: {
321
- "field_updated": u.pickAWinner(["bio", "avatar", "display_name", "privacy_settings", "interests"]),
320
+ "field_updated": ["bio", "avatar", "display_name", "privacy_settings", "interests"],
322
321
  }
323
322
  },
324
323
  {
325
324
  event: "creator subscription started",
326
325
  weight: 2,
327
326
  properties: {
328
- "tier": u.pickAWinner(["basic", "premium", "vip"]),
327
+ "tier": ["basic", "premium", "vip"],
329
328
  "price_usd": u.pickAWinner([4.99, 9.99, 19.99]),
330
329
  }
331
330
  },
332
331
  ],
333
332
 
334
333
  superProps: {
335
- app_version: u.pickAWinner(["4.0", "4.1", "4.2", "4.3", "5.0"]),
336
- account_type: u.pickAWinner(["personal", "creator", "business"]),
334
+ app_version: ["4.0", "4.1", "4.2", "4.3", "5.0"],
335
+ account_type: ["personal", "creator", "business"],
337
336
  },
338
337
 
339
338
  userProps: {
@@ -341,7 +340,7 @@ const config = {
341
340
  "following_count": u.weighNumRange(0, 5000, 0.3, 100),
342
341
  "bio_length": u.weighNumRange(0, 160),
343
342
  "verified": u.pickAWinner([true, false], 0.05),
344
- "content_niche": u.pickAWinner(["lifestyle", "tech", "food", "fitness", "travel", "comedy", "news", "art"]),
343
+ "content_niche": ["lifestyle", "tech", "food", "fitness", "travel", "comedy", "news", "art"],
345
344
  },
346
345
 
347
346
  groupKeys: [
@@ -352,7 +351,7 @@ const config = {
352
351
  community_id: {
353
352
  "name": () => `${chance.word()} ${chance.pickone(["Hub", "Circle", "Squad", "Zone", "Space"])}`,
354
353
  "member_count": u.weighNumRange(50, 5000, 0.3, 200),
355
- "category": u.pickAWinner(["technology", "entertainment", "sports", "politics", "art", "science"]),
354
+ "category": ["technology", "entertainment", "sports", "politics", "art", "science"],
356
355
  "is_moderated": u.pickAWinner([true, false], 0.7),
357
356
  }
358
357
  },
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Bare dungeon for testing TimeSoup time distribution.
3
+ * No hooks, no funnels, no ad spend — pure event generation
4
+ * so TimeSoup's distribution is the only thing shaping the data.
5
+ */
6
+
7
+ /** @type {import('../types').Dungeon} */
8
+ const config = {
9
+ token: "",
10
+ seed: "soup-test",
11
+ numDays: 100,
12
+ numEvents: 50_000,
13
+ numUsers: 500,
14
+ format: "json",
15
+ writeToDisk: true,
16
+ concurrency: 1,
17
+ hasAdSpend: false,
18
+ hasCampaigns: false,
19
+ hasLocation: false,
20
+ hasAvatar: false,
21
+ hasBrowser: false,
22
+ hasAnonIds: false,
23
+ hasSessionIds: false,
24
+ hasAndroidDevices: true,
25
+ hasIOSDevices: true,
26
+ hasDesktopDevices: true,
27
+ isAnonymous: false,
28
+ alsoInferFunnels: false,
29
+ verbose: true,
30
+ batchSize: 2_500_000,
31
+ name: "soup-test",
32
+
33
+ // Uses default soup params — change these to test different distributions
34
+ // soup: { peaks: 5, deviation: 2, mean: 0 },
35
+
36
+ events: [
37
+ { event: "page_view", weight: 5, isFirstEvent: true, properties: {} },
38
+ { event: "click", weight: 3, properties: {} },
39
+ { event: "purchase", weight: 1, properties: {} },
40
+ ],
41
+
42
+ superProps: {},
43
+ userProps: {},
44
+ funnels: [],
45
+ scdProps: {},
46
+ mirrorProps: {},
47
+ groupKeys: [],
48
+ groupProps: {},
49
+ lookupTables: [],
50
+ };
51
+
52
+ export default config;