make-mp-data 2.0.0 → 2.0.2

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 (64) hide show
  1. package/dungeons/adspend.js +96 -0
  2. package/dungeons/anon.js +104 -0
  3. package/dungeons/big.js +225 -0
  4. package/dungeons/business.js +345 -0
  5. package/dungeons/complex.js +396 -0
  6. package/dungeons/experiments.js +125 -0
  7. package/dungeons/foobar.js +241 -0
  8. package/dungeons/funnels.js +272 -0
  9. package/dungeons/gaming.js +315 -0
  10. package/dungeons/media.js +7 -7
  11. package/dungeons/mirror.js +129 -0
  12. package/dungeons/sanity.js +113 -0
  13. package/dungeons/scd.js +205 -0
  14. package/dungeons/simple.js +195 -0
  15. package/dungeons/userAgent.js +190 -0
  16. package/entry.js +57 -0
  17. package/index.js +96 -68
  18. package/lib/cli/cli.js +10 -5
  19. package/lib/core/config-validator.js +28 -12
  20. package/lib/core/context.js +147 -130
  21. package/lib/core/storage.js +45 -31
  22. package/lib/data/defaults.js +2 -2
  23. package/lib/generators/adspend.js +1 -2
  24. package/lib/generators/events.js +35 -24
  25. package/lib/generators/funnels.js +1 -2
  26. package/lib/generators/mirror.js +1 -2
  27. package/lib/orchestrators/mixpanel-sender.js +15 -7
  28. package/lib/orchestrators/user-loop.js +21 -10
  29. package/lib/orchestrators/worker-manager.js +5 -2
  30. package/lib/utils/ai.js +36 -63
  31. package/lib/utils/chart.js +5 -0
  32. package/lib/utils/instructions.txt +593 -0
  33. package/lib/utils/utils.js +162 -38
  34. package/package.json +23 -9
  35. package/types.d.ts +376 -376
  36. package/.claude/settings.local.json +0 -20
  37. package/.gcloudignore +0 -18
  38. package/.gitattributes +0 -2
  39. package/.prettierrc +0 -0
  40. package/.vscode/launch.json +0 -80
  41. package/.vscode/settings.json +0 -69
  42. package/.vscode/tasks.json +0 -12
  43. package/dungeons/customers/.gitkeep +0 -0
  44. package/env.yaml +0 -1
  45. package/lib/cloud-function.js +0 -20
  46. package/scratch.mjs +0 -62
  47. package/scripts/dana.mjs +0 -137
  48. package/scripts/deploy.sh +0 -15
  49. package/scripts/jsdoctest.js +0 -5
  50. package/scripts/new-dungeon.sh +0 -98
  51. package/scripts/new-project.mjs +0 -14
  52. package/scripts/run-index.sh +0 -2
  53. package/scripts/update-deps.sh +0 -5
  54. package/tests/benchmark/concurrency.mjs +0 -52
  55. package/tests/cli.test.js +0 -124
  56. package/tests/coverage/.gitkeep +0 -0
  57. package/tests/e2e.test.js +0 -379
  58. package/tests/int.test.js +0 -715
  59. package/tests/testCases.mjs +0 -229
  60. package/tests/testSoup.mjs +0 -28
  61. package/tests/unit.test.js +0 -910
  62. package/tmp/.gitkeep +0 -0
  63. package/tsconfig.json +0 -18
  64. package/vitest.config.js +0 -47
@@ -0,0 +1,205 @@
1
+ /**
2
+ * This is the default configuration file for the data generator in SIMPLE mode
3
+ * notice how the config object is structured, and see it's type definition in ./types.d.ts
4
+ * feel free to modify this file to customize the data you generate
5
+ * see helper functions in utils.js for more ways to generate data
6
+ */
7
+
8
+
9
+
10
+
11
+ import Chance from 'chance';
12
+ const chance = new Chance();
13
+ import dayjs from "dayjs";
14
+ import utc from "dayjs/plugin/utc.js";
15
+ dayjs.extend(utc);
16
+ import { uid, comma } from 'ak-tools';
17
+ import { pickAWinner, weighNumRange, date, integer, weighChoices } from '../lib/utils/utils.js';
18
+
19
+ const itemCategories = ["Books", "Movies", "Music", "Games", "Electronics", "Computers", "Smart Home", "Home", "Garden", "Pet", "Beauty", "Health", "Toys", "Kids", "Baby", "Handmade", "Sports", "Outdoors", "Automotive", "Industrial", "Entertainment", "Art", "Food", "Appliances", "Office", "Wedding", "Software"];
20
+
21
+ const videoCategories = ["funny", "educational", "inspirational", "music", "news", "sports", "cooking", "DIY", "travel", "gaming"];
22
+
23
+ /** @type {import('../types').Dungeon} */
24
+ const config = {
25
+ token: "",
26
+ seed: "simple is best",
27
+ numDays: 30, //how many days worth1 of data
28
+ numEvents: 50000, //how many events
29
+ numUsers: 500, //how many users
30
+ format: 'csv', //csv or json
31
+ region: "US",
32
+ hasAnonIds: false, //if true, anonymousIds are created for each user
33
+ hasSessionIds: false, //if true, hasSessionIds are created for each user
34
+ hasAdSpend: false,
35
+ makeChart: false,
36
+ hasLocation: true,
37
+ hasAndroidDevices: true,
38
+ hasIOSDevices: true,
39
+ hasDesktopDevices: true,
40
+ hasBrowser: true,
41
+ hasCampaigns: true,
42
+ isAnonymous: false,
43
+
44
+
45
+ events: [
46
+ {
47
+ event: "checkout",
48
+ weight: 2,
49
+ properties: {
50
+ amount: weighNumRange(5, 500, .25),
51
+ currency: pickAWinner(["USD", "CAD", "EUR", "BTC", "ETH", "JPY"], 0),
52
+ coupon: weighChoices(["none", "none", "none", "none", "10%OFF", "20%OFF", "10%OFF", "20%OFF", "30%OFF", "40%OFF", "50%OFF"]),
53
+ numItems: weighNumRange(1, 10),
54
+
55
+ }
56
+ },
57
+ {
58
+ event: "add to cart",
59
+ weight: 4,
60
+ properties: {
61
+ amount: weighNumRange(5, 500, .25),
62
+ rating: weighNumRange(1, 5),
63
+ reviews: weighNumRange(0, 35),
64
+ isFeaturedItem: [true, false, false],
65
+ itemCategory: pickAWinner(itemCategories, integer(0, 27)),
66
+ dateItemListed: date(30, true, 'YYYY-MM-DD'),
67
+ }
68
+ },
69
+ {
70
+ event: "page view",
71
+ weight: 10,
72
+ properties: {
73
+ page: pickAWinner(["/", "/", "/help", "/account", "/watch", "/listen", "/product", "/people", "/peace"]),
74
+ utm_source: pickAWinner(["$organic", "$organic", "$organic", "$organic", "google", "google", "google", "facebook", "facebook", "twitter", "linkedin"]),
75
+ }
76
+ },
77
+ {
78
+ event: "watch video",
79
+ weight: 8,
80
+ properties: {
81
+ videoCategory: pickAWinner(videoCategories, integer(0, 9)),
82
+ isFeaturedItem: [true, false, false],
83
+ watchTimeSec: weighNumRange(10, 600, .25),
84
+ quality: ["2160p", "1440p", "1080p", "720p", "480p", "360p", "240p"],
85
+ format: ["mp4", "avi", "mov", "mpg"],
86
+ uploader_id: chance.guid.bind(chance)
87
+
88
+ }
89
+ },
90
+ {
91
+ event: "view item",
92
+ weight: 8,
93
+ properties: {
94
+ isFeaturedItem: [true, false, false],
95
+ itemCategory: pickAWinner(itemCategories, integer(0, 27)),
96
+ dateItemListed: date(30, true, 'YYYY-MM-DD'),
97
+ }
98
+ },
99
+ {
100
+ event: "save item",
101
+ weight: 5,
102
+ properties: {
103
+ isFeaturedItem: [true, false, false],
104
+ itemCategory: pickAWinner(itemCategories, integer(0, 27)),
105
+ dateItemListed: date(30, true, 'YYYY-MM-DD'),
106
+ }
107
+ },
108
+ {
109
+ event: "sign up",
110
+ isFirstEvent: true,
111
+ weight: 0,
112
+ properties: {
113
+ variants: ["A", "B", "C", "Control"],
114
+ flows: ["new", "existing", "loyal", "churned"],
115
+ flags: ["on", "off"],
116
+ experiment_ids: ["1234", "5678", "9012", "3456", "7890"],
117
+ multiVariate: [true, false]
118
+ }
119
+ }
120
+ ],
121
+ superProps: {
122
+ platform: ["web", "mobile", "web", "mobile", "web", "web", "kiosk", "smartTV"],
123
+ currentTheme: weighChoices(["light", "dark", "custom", "light", "dark"]),
124
+ },
125
+ /*
126
+ user properties work the same as event properties
127
+ each key should be an array or function reference
128
+ */
129
+ userProps: {
130
+ title: chance.profession.bind(chance),
131
+ luckyNumber: weighNumRange(42, 420, .3),
132
+ spiritAnimal: pickAWinner(["duck", "dog", "otter", "penguin", "cat", "elephant", "lion", "cheetah", "giraffe", "zebra", "rhino", "hippo", "whale", "dolphin", "shark", "octopus", "squid", "jellyfish", "starfish", "seahorse", "crab", "lobster", "shrimp", "clam", "snail", "slug", "butterfly", "moth", "bee", "wasp", "ant", "beetle", "ladybug", "caterpillar", "centipede", "millipede", "scorpion", "spider", "tarantula", "tick", "mite", "mosquito", "fly", "dragonfly", "damselfly", "grasshopper", "cricket", "locust", "mantis", "cockroach", "termite", "praying mantis", "walking stick", "stick bug", "leaf insect", "lacewing", "aphid", "cicada", "thrips", "psyllid", "scale insect", "whitefly", "mealybug", "planthopper", "leafhopper", "treehopper", "flea", "louse", "bedbug", "flea beetle", "weevil", "longhorn beetle", "leaf beetle", "tiger beetle", "ground beetle", "lady beetle", "firefly", "click beetle", "rove beetle", "scarab beetle", "dung beetle", "stag beetle", "rhinoceros beetle", "hercules beetle", "goliath beetle", "jewel beetle", "tortoise beetle"])
133
+ },
134
+ scdProps: {
135
+ role: {
136
+ type: "user",
137
+ frequency: "week",
138
+ values: ["admin", "collaborator", "user", "view only", "no access"],
139
+ timing: 'fuzzy',
140
+ max: 10
141
+ },
142
+ NPS: {
143
+ type: "user",
144
+ frequency: "day",
145
+ values: weighNumRange(1, 10, 2, 150),
146
+ timing: 'fuzzy',
147
+ max: 10
148
+ },
149
+ MRR: {
150
+ type: "company_id",
151
+ frequency: "month",
152
+ values: weighNumRange(0, 10000, .15),
153
+ timing: 'fixed',
154
+ max: 10
155
+ },
156
+ AccountHealthScore: {
157
+ type: "company_id",
158
+ frequency: "week",
159
+ values: weighNumRange(1, 10, .15),
160
+ timing: 'fixed',
161
+ max: 40
162
+ },
163
+ plan: {
164
+ type: "company_id",
165
+ frequency: "month",
166
+ values: ["free", "basic", "premium", "enterprise"],
167
+ timing: 'fixed',
168
+ max: 10
169
+ }
170
+ },
171
+ groupKeys: [["company_id", 1_000]],
172
+ groupProps: {
173
+ company_id: {
174
+ name: () => { return chance.name(); },
175
+ email: () => { return `CSM: ${chance.pickone(["AK", "Neha", "Rajiv", "Deepak", "Justin", "Hans", "Katie", "Somya", "Tony", "Kaan"])}`; },
176
+ industry: pickAWinner([
177
+ "technology",
178
+ "education",
179
+ "finance",
180
+ "healthcare",
181
+ "retail",
182
+ "manufacturing",
183
+ "transportation",
184
+ "entertainment",
185
+ "media",
186
+ "real estate",
187
+ "construction",
188
+ "hospitality",
189
+ "energy",
190
+ "utilities",
191
+ "agriculture",
192
+ "other",
193
+ ]),
194
+ segment: ["SMB", "SMB", "SMB", "Mid Market", "Mid Market", "Enterprise"],
195
+ "# active users": chance.integer({ min: 2, max: 20 })
196
+ }
197
+ },
198
+ hook: function (record, type, meta) {
199
+ return record;
200
+ }
201
+ };
202
+
203
+
204
+
205
+ export default config;
@@ -0,0 +1,195 @@
1
+ /**
2
+ * This is the default configuration file for the data generator in SIMPLE mode
3
+ * notice how the config object is structured, and see it's type definition in ./types.d.ts
4
+ * feel free to modify this file to customize the data you generate
5
+ * see helper functions in utils.js for more ways to generate data
6
+ */
7
+
8
+
9
+
10
+
11
+ import Chance from 'chance';
12
+ const chance = new Chance();
13
+ import dayjs from "dayjs";
14
+ import utc from "dayjs/plugin/utc.js";
15
+ dayjs.extend(utc);
16
+ import { uid, comma } from 'ak-tools';
17
+ import { pickAWinner, weighNumRange, date, integer, weighChoices } from '../lib/utils/utils.js';
18
+
19
+ const itemCategories = ["Books", "Movies", "Music", "Games", "Electronics", "Computers", "Smart Home", "Home", "Garden", "Pet", "Beauty", "Health", "Toys", "Kids", "Baby", "Handmade", "Sports", "Outdoors", "Automotive", "Industrial", "Entertainment", "Art", "Food", "Appliances", "Office", "Wedding", "Software"];
20
+
21
+ const videoCategories = ["funny", "educational", "inspirational", "music", "news", "sports", "cooking", "DIY", "travel", "gaming"];
22
+
23
+ /** @type {import('../types').Dungeon} */
24
+ const config = {
25
+ token: "",
26
+ seed: "simple is best",
27
+ numDays: 30, //how many days worth1 of data
28
+ numEvents: 50000, //how many events
29
+ numUsers: 500, //how many users
30
+ format: 'csv', //csv or json
31
+ region: "US",
32
+ hasAnonIds: false, //if true, anonymousIds are created for each user
33
+ hasSessionIds: false, //if true, hasSessionIds are created for each user
34
+ hasAdSpend: false,
35
+ makeChart: false,
36
+ hasLocation: true,
37
+ hasAndroidDevices: true,
38
+ hasIOSDevices: true,
39
+ hasDesktopDevices: true,
40
+ hasBrowser: true,
41
+ hasCampaigns: true,
42
+ isAnonymous: false,
43
+ concurrency: 10,
44
+ batchSize: 1_500_000,
45
+
46
+
47
+ events: [
48
+ {
49
+ event: "checkout",
50
+ weight: 2,
51
+ properties: {
52
+ amount: weighNumRange(5, 500, .25),
53
+ currency: pickAWinner(["USD", "CAD", "EUR", "BTC", "ETH", "JPY"], 0),
54
+ coupon: weighChoices(["none", "none", "none", "none", "10%OFF", "20%OFF", "10%OFF", "20%OFF", "30%OFF", "40%OFF", "50%OFF"]),
55
+ numItems: weighNumRange(1, 10),
56
+
57
+ }
58
+ },
59
+ {
60
+ event: "add to cart",
61
+ weight: 4,
62
+ properties: {
63
+ amount: weighNumRange(5, 500, .25),
64
+ rating: weighNumRange(1, 5),
65
+ reviews: weighNumRange(0, 35),
66
+ isFeaturedItem: [true, false, false],
67
+ itemCategory: pickAWinner(itemCategories, integer(0, 27)),
68
+ dateItemListed: date(30, true, 'YYYY-MM-DD'),
69
+ }
70
+ },
71
+ {
72
+ event: "page view",
73
+ weight: 10,
74
+ properties: {
75
+ page: pickAWinner(["/", "/", "/help", "/account", "/watch", "/listen", "/product", "/people", "/peace"]),
76
+ utm_source: pickAWinner(["$organic", "$organic", "$organic", "$organic", "google", "google", "google", "facebook", "facebook", "twitter", "linkedin"]),
77
+ }
78
+ },
79
+ {
80
+ event: "watch video",
81
+ weight: 8,
82
+ properties: {
83
+ videoCategory: pickAWinner(videoCategories, integer(0, 9)),
84
+ isFeaturedItem: [true, false, false],
85
+ watchTimeSec: weighNumRange(10, 600, .25),
86
+ quality: ["2160p", "1440p", "1080p", "720p", "480p", "360p", "240p"],
87
+ format: ["mp4", "avi", "mov", "mpg"],
88
+ uploader_id: chance.guid.bind(chance)
89
+
90
+ }
91
+ },
92
+ {
93
+ event: "view item",
94
+ weight: 8,
95
+ properties: {
96
+ isFeaturedItem: [true, false, false],
97
+ itemCategory: pickAWinner(itemCategories, integer(0, 27)),
98
+ dateItemListed: date(30, true, 'YYYY-MM-DD'),
99
+ }
100
+ },
101
+ {
102
+ event: "save item",
103
+ weight: 5,
104
+ properties: {
105
+ isFeaturedItem: [true, false, false],
106
+ itemCategory: pickAWinner(itemCategories, integer(0, 27)),
107
+ dateItemListed: date(30, true, 'YYYY-MM-DD'),
108
+ }
109
+ },
110
+ {
111
+ event: "sign up",
112
+ isFirstEvent: true,
113
+ weight: 0,
114
+ properties: {
115
+ variants: ["A", "B", "C", "Control"],
116
+ flows: ["new", "existing", "loyal", "churned"],
117
+ flags: ["on", "off"],
118
+ experiment_ids: ["1234", "5678", "9012", "3456", "7890"],
119
+ multiVariate: [true, false]
120
+ }
121
+ }
122
+ ],
123
+ superProps: {
124
+ theme: pickAWinner(["light", "dark", "custom", "light", "dark"]),
125
+ },
126
+ /*
127
+ user properties work the same as event properties
128
+ each key should be an array or function reference
129
+ */
130
+ userProps: {
131
+ title: chance.profession.bind(chance),
132
+ luckyNumber: weighNumRange(42, 420, .3),
133
+ spiritAnimal: pickAWinner(["duck", "dog", "otter", "penguin", "cat", "elephant", "lion", "cheetah", "giraffe", "zebra", "rhino", "hippo", "whale", "dolphin", "shark", "octopus", "squid", "jellyfish", "starfish", "seahorse", "crab", "lobster", "shrimp", "clam", "snail", "slug", "butterfly", "moth", "bee", "wasp", "ant", "beetle", "ladybug", "caterpillar", "centipede", "millipede", "scorpion", "spider", "tarantula", "tick", "mite", "mosquito", "fly", "dragonfly", "damselfly", "grasshopper", "cricket", "locust", "mantis", "cockroach", "termite", "praying mantis", "walking stick", "stick bug", "leaf insect", "lacewing", "aphid", "cicada", "thrips", "psyllid", "scale insect", "whitefly", "mealybug", "planthopper", "leafhopper", "treehopper", "flea", "louse", "bedbug", "flea beetle", "weevil", "longhorn beetle", "leaf beetle", "tiger beetle", "ground beetle", "lady beetle", "firefly", "click beetle", "rove beetle", "scarab beetle", "dung beetle", "stag beetle", "rhinoceros beetle", "hercules beetle", "goliath beetle", "jewel beetle", "tortoise beetle"])
134
+ },
135
+ scdProps: {},
136
+ mirrorProps: {},
137
+
138
+ /*
139
+ for group analytics keys, we need an array of arrays [[],[],[]]
140
+ each pair represents a group_key and the number of profiles for that key
141
+ */
142
+ groupKeys: [],
143
+ groupProps: {},
144
+ lookupTables: [],
145
+ hook: function (record, type, meta) {
146
+ if (type === "everything") {
147
+
148
+ //custom themers purchase more:
149
+ const numCustomMode = record.filter(a => a.theme === 'custom').length;
150
+ const numLightMode = record.filter(a => a.theme === 'light').length;
151
+ const numDarkMode = record.filter(a => a.theme === 'dark').length;
152
+ if (numCustomMode > numLightMode || numCustomMode > numDarkMode) {
153
+ //triple their checkout events
154
+ const checkoutEvents = record.filter(a => a.event === 'checkout');
155
+ const newCheckouts = checkoutEvents.map(a => {
156
+ const randomInt = integer(-48, 48);
157
+ const newCheckout = {
158
+ ...a,
159
+ time: dayjs(a.time).add(randomInt, 'hour').toISOString(),
160
+ event: "checkout",
161
+ amount: a.amount * 2,
162
+ coupon: "50%OFF"
163
+ };
164
+ return newCheckout;
165
+ });
166
+ record.push(...newCheckouts);
167
+ }
168
+
169
+ //users who watch low quality videos churn more:
170
+ const loQuality = ["480p", "360p", "240p"];
171
+ const lowQualityWatches = record.filter(a => a.event === 'watch video' && loQuality.includes(a.quality));
172
+ const highQualityWatches = record.filter(a => a.event === 'watch video' && !loQuality.includes(a.quality));
173
+ if (lowQualityWatches.length > highQualityWatches.length) {
174
+ if (flip()) {
175
+ // find midpoint of records
176
+ const midpoint = Math.floor(record.length / 2);
177
+ record = record.slice(0, midpoint);
178
+
179
+ }
180
+ }
181
+
182
+ }
183
+
184
+
185
+
186
+ return record;
187
+ }
188
+ };
189
+
190
+ function flip(likelihood = 50) {
191
+ return chance.bool({ likelihood });
192
+ }
193
+
194
+
195
+ export default config;
@@ -0,0 +1,190 @@
1
+
2
+ const SEED = "my-seed";
3
+ import dayjs from 'dayjs';
4
+ import utc from 'dayjs/plugin/utc';
5
+ dayjs.extend(utc);
6
+ import 'dotenv/config';
7
+ import * as u from '../lib/utils/utils.js';
8
+ import * as v from 'ak-tools';
9
+ const chance = u.initChance(SEED);
10
+ const num_users = 1000;
11
+ const days = 30;
12
+
13
+ /** @typedef {import("../types.js").Dungeon} Config */
14
+
15
+ /** @type {Config} */
16
+ const config = {
17
+ token: "a854e82c2c91ada31c502139d99e8e0d",
18
+ seed: SEED,
19
+ numDays: days,
20
+ numEvents: num_users * 100,
21
+ numUsers: num_users,
22
+ hasAnonIds: false,
23
+ hasSessionIds: false,
24
+ format: "json",
25
+ alsoInferFunnels: true,
26
+ hasLocation: true,
27
+ hasAndroidDevices: true,
28
+ hasIOSDevices: true,
29
+ hasDesktopDevices: true,
30
+ hasBrowser: true,
31
+ hasCampaigns: true,
32
+ isAnonymous: false,
33
+ hasAdSpend: true,
34
+
35
+ hasAvatar: true,
36
+ makeChart: false,
37
+
38
+ batchSize: 500_000,
39
+ concurrency: 500,
40
+ writeToDisk: false,
41
+
42
+ funnels: [],
43
+ events: [{
44
+ event: "foo",
45
+ weight: 10
46
+ },
47
+ {
48
+ event: "bar",
49
+ weight: 5
50
+ },
51
+ {
52
+ event: "baz",
53
+ weight: 2
54
+ }],
55
+ superProps: {
56
+ "user_agent": u.pickAWinner([
57
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36",
58
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/600.7.12 (KHTML, like Gecko) Version/8.0.7 Safari/600.7.12",
59
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36",
60
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/600.8.9 (KHTML, like Gecko) Version/8.0.8 Safari/600.8.9",
61
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 8_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) CriOS/44.0.2403.67 Mobile/12D508 Safari/600.1.4",
62
+ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36",
63
+ "Mozilla/5.0 (Windows NT 6.1; rv:38.0) Gecko/20100101 Firefox/38.0",
64
+ "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36",
65
+ "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240",
66
+ "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.65 Safari/537.36",
67
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/42.0 Safari/537.31",
68
+ "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0",
69
+ "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)",
70
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.59.10 (KHTML, like Gecko) Version/5.1.9 Safari/534.59.10",
71
+ "Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)",
72
+ "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)",
73
+ "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) coc_coc_browser/50.0.125 Chrome/44.0.2403.125 Safari/537.36",
74
+ "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)",
75
+ "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0",
76
+ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0",
77
+ "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0",
78
+ "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; GTB7.5; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C)",
79
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240",
80
+ "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko",
81
+ "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0) LinkCheck by Siteimprove.com",
82
+ "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.65 Safari/537.36",
83
+ "Mozilla/5.0 (Windows NT 6.3; Win64; x64; Trident/7.0; rv:11.0) like Gecko",
84
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 8_4 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12H143 Safari/600.1.4",
85
+ "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36",
86
+ "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0",
87
+ "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36",
88
+ "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36",
89
+ "Mozilla/5.0 (BB10; Touch) AppleWebKit/537.35+ (KHTML, like Gecko) Version/10.3.2.2339 Mobile Safari/537.35+",
90
+ "Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.65 Safari/537.36",
91
+ "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko",
92
+ "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0",
93
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:40.0) Gecko/20100101 Firefox/40.0",
94
+ "Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 525) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537",
95
+ "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.107 Safari/537.36",
96
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:37.0) Gecko/20100101 Firefox/37.0",
97
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/44.0.2403.89 Chrome/44.0.2403.89 Safari/537.36",
98
+ "Mozilla/5.0 (iPad; CPU OS 8_4 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12H143 Safari/600.1.4",
99
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10) AppleWebKit/600.1.25 (KHTML, like Gecko) QuickLook/5.0",
100
+ "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:40.0) Gecko/20100101 Firefox/40.0",
101
+ "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; MATBJS; rv:11.0) like Gecko",
102
+ "Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36",
103
+ "Mozilla/5.0 (Windows NT 10.0; Trident/7.0; rv:11.0) like Gecko",
104
+ "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)",
105
+ "Mozilla/5.0 (Windows NT 6.0; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0",
106
+ "Mozilla/5.0 (Linux; U; Android 4.3; en-us; ZTE-Z667G Build/JLS36C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
107
+ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36",
108
+ "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; ASU2JS; rv:11.0) like Gecko",
109
+ "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0",
110
+ "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko",
111
+ "Mozilla/5.0 (Windows NT 5.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.65 Safari/537.36",
112
+ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.65 Safari/537.36",
113
+ "Mozilla/5.0 (iPad; CPU OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12F69 Safari/600.1.4",
114
+ "Mozilla/5.0 (Windows NT 6.0; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0",
115
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 8_4_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12H321 Safari/600.1.4",
116
+ "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; TNJB; rv:11.0) like Gecko",
117
+ "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0",
118
+ "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.2)",
119
+ "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko",
120
+ "Mozilla/5.0 (iPad; CPU OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53",
121
+ "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36",
122
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12F70 Safari/600.1.4",
123
+ "Mozilla/5.0 (X11; Linux x86_64; rv:36.0) Gecko/20100101 Firefox/36.0",
124
+ "Mozilla/5.0 (iPad; CPU OS 8_4_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12H321 Safari/600.1.4",
125
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) Gecko/20100101 Firefox/21.0",
126
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:35.0) Gecko/20100101 Firefox/35.0",
127
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.78.2 (KHTML, like Gecko) Version/6.1.6 Safari/537.78.2",
128
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.130 Safari/537.36",
129
+ "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)",
130
+ "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0",
131
+ "Mozilla/5.0 (Mobile; rv:32.0) Gecko/32.0 Firefox/32.0",
132
+ "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; Tablet PC 2.0; McAfee; AmericasCardroom; BRI/2; GWX:DOWNLOADED)",
133
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36",
134
+ "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/7.0)",
135
+ "Mozilla/5.0 (iPad; CPU OS 8_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12D508 Safari/600.1.4",
136
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2483.0 Safari/537.36",
137
+ "Mozilla/5.0 (Windows NT 5.1; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0",
138
+ "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; MS-RTC LM 8)",
139
+ "Mozilla/5.0 (Android; Linux armv7l; rv:5.0) Gecko/20110615 Firefox/5.0 Fennec/5.0",
140
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B466 [FBAN/FBIOS;FBAV/37.0.0.21.273;FBBV/13822349;FBDV/iPhone6,1;FBMD/iPhone;FBSN/iPhone OS;FBSV/8.1.3;FBSS/2; FBCR/fido;FBID/phone;FBLC/fr_FR;FBOP/5]",
141
+ "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:40.0) Gecko/20100101 Firefox/40.0 Cyberfox/40.0",
142
+ "Mozilla/5.0 (iPad; CPU OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Mercury/8.7 Mobile/11B554a Safari/9537.53",
143
+ "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; GWX:QUALIFIED; MASMJS)",
144
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 7_1 like Mac OS X) AppleWebKit (KHTML, like Gecko) Mobile (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)",
145
+ "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; NP06; rv:11.0) like Gecko",
146
+ "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; ARM; Trident/7.0; Touch; .NET4.0E; .NET4.0C; Tablet PC 2.0)",
147
+ "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.0.19) Gecko/2010062819 Firefox/3.0.19 Flock/2.6.1",
148
+ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36",
149
+ "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko",
150
+ "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)",
151
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10) AppleWebKit/600.1.25 (KHTML, like Gecko) Version/8.0 Safari/600.1.25",
152
+ "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36",
153
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/600.1.25 (KHTML, like Gecko) Version/8.0 Safari/600.1.25",
154
+ "Mozilla/4.0 (compatible; MSIE 6.1; Windows XP; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
155
+ ])
156
+ },
157
+ userProps: {},
158
+ scdProps: {},
159
+ mirrorProps: {},
160
+ groupKeys: [],
161
+ groupProps: {},
162
+ lookupTables: [],
163
+ hook: function (record, type, meta) {
164
+ const NOW = dayjs.unix(global.NOW);
165
+
166
+ if (type === "event") {
167
+ const EVENT_TIME = dayjs(record.time);
168
+ }
169
+
170
+ if (type === "user") {
171
+
172
+ }
173
+
174
+ if (type === "funnel-post") {
175
+
176
+ }
177
+
178
+ if (type === "funnel-pre") {
179
+
180
+ }
181
+
182
+ if (type === "scd") {
183
+
184
+ }
185
+
186
+ return record;
187
+ }
188
+ };
189
+
190
+ export default config;
package/entry.js ADDED
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * CLI entry point for make-mp-data
5
+ * This file is only used when running via CLI/npx
6
+ */
7
+
8
+ import main from './index.js';
9
+ import getCliParams from './lib/cli/cli.js';
10
+
11
+ (async () => {
12
+ try {
13
+ const cliConfig = getCliParams();
14
+
15
+ // Load dungeon config - default to simple mode if no mode specified
16
+ let finalConfig = cliConfig;
17
+ if (cliConfig.complex) {
18
+ const complexConfig = await import('./dungeons/complex.js');
19
+ finalConfig = { ...complexConfig.default, ...cliConfig };
20
+ } else if (cliConfig.simple || (!cliConfig.complex && !cliConfig.simple)) {
21
+ // Default to simple mode when no flags or when --simple is explicitly set
22
+ const simpleConfig = await import('./dungeons/simple.js');
23
+ finalConfig = { ...simpleConfig.default, ...cliConfig };
24
+ }
25
+
26
+
27
+ const result = await main(finalConfig);
28
+ console.log(`šŸ“Š Generated ${(result.eventCount || 0).toLocaleString()} events for ${(result.userCount || 0).toLocaleString()} users`);
29
+ console.log(`ā±ļø Total time: ${result.time?.human || 'unknown'}`);
30
+ const recordsPerSecond = result.eventCount / result.time.delta * 1000;
31
+ console.log(`⚔ Records per second: ${recordsPerSecond.toFixed(2)}`);
32
+
33
+ if (result.errors?.length) {
34
+ console.error(`\nā— Errors encountered: ${result.errors.length}`);
35
+ if (cliConfig.verbose) {
36
+ result.errors.forEach(err => console.error(` ${err}`));
37
+ }
38
+ } else {
39
+ console.log(`\nšŸ™Œ No errors encountered.`);
40
+ }
41
+
42
+ if (result.files?.length) {
43
+ console.log(`šŸ“ Files written: ${result.files.length}`);
44
+ if (cliConfig.verbose) {
45
+ result.files.forEach(file => console.log(` ${file}`));
46
+ }
47
+ }
48
+ console.log(`\nšŸ‘‹ Job completed successfully!\n`);
49
+ process.exit(0);
50
+ } catch (error) {
51
+ console.error(`\nāŒ Job failed: ${error.message}`);
52
+ if (process.env.NODE_ENV === 'development') {
53
+ console.error(error.stack);
54
+ }
55
+ process.exit(1);
56
+ }
57
+ })();