loredata 0.2.0 → 0.4.1

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 (110) hide show
  1. package/README.md +126 -65
  2. package/data/avengers/addresses.json +27 -0
  3. package/data/avengers/characters.json +305 -0
  4. package/data/avengers/meta.json +13 -0
  5. package/data/better-call-saul/addresses.json +37 -0
  6. package/data/better-call-saul/characters.json +268 -0
  7. package/data/better-call-saul/meta.json +13 -0
  8. package/data/big-bang-theory/addresses.json +31 -0
  9. package/data/big-bang-theory/characters.json +198 -0
  10. package/data/big-bang-theory/meta.json +13 -0
  11. package/data/breaking-bad/characters.json +249 -148
  12. package/data/breaking-bad/meta.json +8 -1
  13. package/data/fast-and-furious/addresses.json +1 -2
  14. package/data/fast-and-furious/characters.json +226 -133
  15. package/data/fast-and-furious/meta.json +13 -1
  16. package/data/friends/characters.json +402 -281
  17. package/data/friends/meta.json +8 -1
  18. package/data/game-of-thrones/addresses.json +6 -22
  19. package/data/game-of-thrones/characters.json +507 -299
  20. package/data/game-of-thrones/meta.json +8 -1
  21. package/data/guardians-of-the-galaxy/addresses.json +17 -0
  22. package/data/guardians-of-the-galaxy/characters.json +226 -0
  23. package/data/guardians-of-the-galaxy/meta.json +13 -0
  24. package/data/harry-potter/addresses.json +6 -11
  25. package/data/harry-potter/characters.json +239 -147
  26. package/data/harry-potter/meta.json +8 -1
  27. package/data/house-md/characters.json +184 -52
  28. package/data/house-md/meta.json +8 -1
  29. package/data/lost/characters.json +420 -299
  30. package/data/lost/meta.json +8 -1
  31. package/data/matrix/characters.json +144 -34
  32. package/data/matrix/meta.json +13 -1
  33. package/data/peaky-blinders/characters.json +191 -37
  34. package/data/peaky-blinders/meta.json +8 -1
  35. package/data/prison-break/addresses.json +24 -0
  36. package/data/prison-break/characters.json +188 -0
  37. package/data/prison-break/meta.json +13 -0
  38. package/data/sherlock/characters.json +369 -263
  39. package/data/sherlock/meta.json +8 -1
  40. package/data/simpsons/addresses.json +21 -0
  41. package/data/simpsons/characters.json +383 -0
  42. package/data/simpsons/meta.json +13 -0
  43. package/data/sopranos/addresses.json +37 -0
  44. package/data/sopranos/characters.json +292 -0
  45. package/data/sopranos/meta.json +13 -0
  46. package/data/south-park/addresses.json +31 -0
  47. package/data/south-park/characters.json +372 -0
  48. package/data/south-park/meta.json +13 -0
  49. package/data/spider-man/addresses.json +31 -0
  50. package/data/spider-man/characters.json +219 -0
  51. package/data/spider-man/meta.json +13 -0
  52. package/data/star-wars/addresses.json +19 -0
  53. package/data/star-wars/characters.json +254 -0
  54. package/data/star-wars/meta.json +13 -0
  55. package/data/stranger-things/addresses.json +31 -0
  56. package/data/stranger-things/characters.json +226 -0
  57. package/data/stranger-things/meta.json +13 -0
  58. package/data/supernatural/addresses.json +25 -0
  59. package/data/supernatural/characters.json +190 -0
  60. package/data/supernatural/meta.json +13 -0
  61. package/data/the-crown/addresses.json +27 -0
  62. package/data/the-crown/characters.json +275 -0
  63. package/data/the-crown/meta.json +13 -0
  64. package/data/the-office/characters.json +478 -283
  65. package/data/the-office/meta.json +8 -1
  66. package/data/the-walking-dead/addresses.json +25 -0
  67. package/data/the-walking-dead/characters.json +186 -0
  68. package/data/the-walking-dead/meta.json +13 -0
  69. package/data/the-witcher/addresses.json +22 -0
  70. package/data/the-witcher/characters.json +272 -0
  71. package/data/the-witcher/meta.json +13 -0
  72. package/data/vikings/addresses.json +26 -0
  73. package/data/vikings/characters.json +240 -0
  74. package/data/vikings/meta.json +13 -0
  75. package/data/westworld/addresses.json +19 -0
  76. package/data/westworld/characters.json +161 -0
  77. package/data/westworld/meta.json +13 -0
  78. package/data/x-men/addresses.json +24 -0
  79. package/data/x-men/characters.json +242 -0
  80. package/data/x-men/meta.json +18 -0
  81. package/dist/browser.cjs +18 -72
  82. package/dist/browser.cjs.map +1 -1
  83. package/dist/browser.d.cts +3 -3
  84. package/dist/browser.d.ts +3 -3
  85. package/dist/browser.js +18 -72
  86. package/dist/browser.js.map +1 -1
  87. package/dist/cli/cli.cjs +41 -73
  88. package/dist/cli/cli.cjs.map +1 -1
  89. package/dist/cli/cli.js +41 -73
  90. package/dist/cli/cli.js.map +1 -1
  91. package/dist/index.cjs +41 -72
  92. package/dist/index.cjs.map +1 -1
  93. package/dist/index.d.cts +5 -4
  94. package/dist/index.d.ts +5 -4
  95. package/dist/index.js +41 -72
  96. package/dist/index.js.map +1 -1
  97. package/dist/{universe-store-Del1UHgn.d.cts → universe-store-CWhCn3U6.d.cts} +21 -11
  98. package/dist/{universe-store-Del1UHgn.d.ts → universe-store-CWhCn3U6.d.ts} +21 -11
  99. package/package.json +85 -81
  100. package/data/breaking-bad/domains.json +0 -6
  101. package/data/fast-and-furious/domains.json +0 -6
  102. package/data/friends/domains.json +0 -6
  103. package/data/game-of-thrones/domains.json +0 -6
  104. package/data/harry-potter/domains.json +0 -6
  105. package/data/house-md/domains.json +0 -6
  106. package/data/lost/domains.json +0 -6
  107. package/data/matrix/domains.json +0 -6
  108. package/data/peaky-blinders/domains.json +0 -6
  109. package/data/sherlock/domains.json +0 -6
  110. package/data/the-office/domains.json +0 -6
@@ -0,0 +1,242 @@
1
+ [
2
+ {
3
+ "id": "logan",
4
+ "firstName": "Logan",
5
+ "usernames": [
6
+ "wolverine",
7
+ "weaponx_program",
8
+ "yellow_spandex"
9
+ ],
10
+ "profession": "Soldier",
11
+ "interests": [
12
+ "motorcycles",
13
+ "cigars",
14
+ "cage fighting",
15
+ "wilderness"
16
+ ],
17
+ "quotes": [
18
+ "I'm the best there is at what I do. But what I do best isn't very nice.",
19
+ "You gonna tell me to stay away from your girl?",
20
+ "You actually go outside in these things?",
21
+ "Nature made me a freak. Man made me a weapon. And God made it last too long.",
22
+ "Don't be what they made you."
23
+ ],
24
+ "gender": "male",
25
+ "address": {
26
+ "street": "1407 Graymalkin Lane",
27
+ "city": "Salem Center",
28
+ "state": "NY",
29
+ "country": "US"
30
+ },
31
+ "symbol": "🐺",
32
+ "color": "#4a1942",
33
+ "emailDomains": [
34
+ "xavier-institute.edu",
35
+ "canada-mail.net"
36
+ ]
37
+ },
38
+ {
39
+ "id": "charles-xavier",
40
+ "firstName": "Charles",
41
+ "lastName": "Xavier",
42
+ "usernames": [
43
+ "cerebro_founder",
44
+ "cerebro_mind",
45
+ "hope_remains"
46
+ ],
47
+ "profession": "Professor",
48
+ "interests": [
49
+ "genetics",
50
+ "chess",
51
+ "education",
52
+ "mutant advocacy"
53
+ ],
54
+ "quotes": [
55
+ "Mutation: it is the key to our evolution.",
56
+ "Just because someone stumbles and loses their way, it doesn't mean they're lost forever.",
57
+ "I don't want your suffering. I don't want your future!",
58
+ "I feel a great swell of pity for the poor soul who comes to that school looking for trouble.",
59
+ "Please, Charles, we need you to hope again."
60
+ ],
61
+ "gender": "male",
62
+ "address": {
63
+ "street": "1407 Graymalkin Lane",
64
+ "city": "Salem Center",
65
+ "state": "NY",
66
+ "country": "US"
67
+ },
68
+ "symbol": "♟️",
69
+ "color": "#1e3a5f",
70
+ "emailDomains": [
71
+ "xavier-institute.edu",
72
+ "xaviers-school.org"
73
+ ]
74
+ },
75
+ {
76
+ "id": "erik-lehnsherr",
77
+ "firstName": "Erik",
78
+ "lastName": "Lehnsherr",
79
+ "usernames": [
80
+ "magneto",
81
+ "plastic_prison",
82
+ "homo_superior"
83
+ ],
84
+ "profession": "Mutant leader",
85
+ "interests": [
86
+ "chess",
87
+ "mutant rights",
88
+ "history",
89
+ "political strategy"
90
+ ],
91
+ "quotes": [
92
+ "Peace was never an option.",
93
+ "We are the future, Charles, not them. They no longer matter.",
94
+ "Mankind has always feared what it doesn't understand.",
95
+ "We are the future. We are the ones who inherit this earth.",
96
+ "If there's one thing I'm guilty of, it's fighting for people like us."
97
+ ],
98
+ "gender": "male",
99
+ "symbol": "🧲",
100
+ "color": "#7f1d1d",
101
+ "emailDomains": [
102
+ "brotherhood-mutants.net",
103
+ "genosha-post.org"
104
+ ]
105
+ },
106
+ {
107
+ "id": "jean-grey",
108
+ "firstName": "Jean",
109
+ "lastName": "Grey",
110
+ "usernames": [
111
+ "phoenix_force",
112
+ "dark_phoenix",
113
+ "grey_matter"
114
+ ],
115
+ "profession": "Doctor",
116
+ "interests": [
117
+ "genetics",
118
+ "research",
119
+ "psychology",
120
+ "patient care"
121
+ ],
122
+ "quotes": [
123
+ "I am not the woman I was. I am something more.",
124
+ "When I lose control, bad things happen. But it feels good.",
125
+ "I can see inside their minds. What they truly feel.",
126
+ "I don't want to fix it. This is who I am.",
127
+ "You shouldn't have to hide."
128
+ ],
129
+ "gender": "female",
130
+ "address": {
131
+ "street": "1407 Graymalkin Lane",
132
+ "city": "Salem Center",
133
+ "state": "NY",
134
+ "country": "US"
135
+ },
136
+ "symbol": "🔥",
137
+ "color": "#1e3a5f",
138
+ "emailDomains": [
139
+ "xavier-institute.edu",
140
+ "xaviers-school.org"
141
+ ]
142
+ },
143
+ {
144
+ "id": "storm",
145
+ "firstName": "Ororo",
146
+ "lastName": "Munroe",
147
+ "usernames": [
148
+ "storm_goddess",
149
+ "wind_rider",
150
+ "toad_lightning"
151
+ ],
152
+ "profession": "Teacher",
153
+ "interests": [
154
+ "Africa",
155
+ "gardening",
156
+ "leadership",
157
+ "aviation"
158
+ ],
159
+ "quotes": [
160
+ "Do you know what happens to a toad when it's struck by lightning? The same thing that happens to everything else.",
161
+ "Sometimes anger can help you survive.",
162
+ "I am a goddess. I will not be caged.",
163
+ "You must have faith.",
164
+ "The weather is not something you control. It's something you feel."
165
+ ],
166
+ "gender": "female",
167
+ "symbol": "⚡",
168
+ "color": "#1d4ed8",
169
+ "emailDomains": [
170
+ "xavier-institute.edu",
171
+ "xaviers-school.org"
172
+ ]
173
+ },
174
+ {
175
+ "id": "mystique",
176
+ "firstName": "Raven",
177
+ "lastName": "Darkhölme",
178
+ "usernames": [
179
+ "shapeshifter",
180
+ "natural_blue",
181
+ "mutant_and_proud"
182
+ ],
183
+ "profession": "Spy",
184
+ "interests": [
185
+ "espionage",
186
+ "disguise",
187
+ "martial arts",
188
+ "mutant liberation"
189
+ ],
190
+ "quotes": [
191
+ "Mutant and proud.",
192
+ "I shouldn't have to. I'm a natural blue.",
193
+ "We should be running this country.",
194
+ "I know what I have to do. It's not their pain. It's ours.",
195
+ "You know, sometimes I wonder what my life would have been like if you hadn't found me here that night."
196
+ ],
197
+ "gender": "female",
198
+ "symbol": "🦎",
199
+ "color": "#4a1942",
200
+ "emailDomains": [
201
+ "brotherhood-mutants.net",
202
+ "shape-shift.net"
203
+ ]
204
+ },
205
+ {
206
+ "id": "cyclops",
207
+ "firstName": "Scott",
208
+ "lastName": "Summers",
209
+ "usernames": [
210
+ "optic_blast",
211
+ "visor_on",
212
+ "prove_it"
213
+ ],
214
+ "profession": "Team leader",
215
+ "interests": [
216
+ "tactics",
217
+ "aviation",
218
+ "leadership",
219
+ "motorcycles"
220
+ ],
221
+ "quotes": [
222
+ "We're a team, Professor. We take care of each other.",
223
+ "She did make a choice. It was you.",
224
+ "You can't just keep running from this.",
225
+ "I would die for any one of them.",
226
+ "Prove it."
227
+ ],
228
+ "gender": "male",
229
+ "address": {
230
+ "street": "1407 Graymalkin Lane",
231
+ "city": "Salem Center",
232
+ "state": "NY",
233
+ "country": "US"
234
+ },
235
+ "symbol": "🕶️",
236
+ "color": "#166534",
237
+ "emailDomains": [
238
+ "xavier-institute.edu",
239
+ "x-men-ops.net"
240
+ ]
241
+ }
242
+ ]
@@ -0,0 +1,18 @@
1
+ {
2
+ "id": "x-men",
3
+ "name": "X-Men",
4
+ "genre": ["action", "sci-fi", "drama"],
5
+ "description": "Mutants with extraordinary powers fight for coexistence with humanity while facing threats from those who fear and persecute them.",
6
+ "tmdbId": 36657,
7
+ "mediaType": "movie",
8
+ "year": 2000,
9
+ "rating": 7,
10
+ "networks": [
11
+ "The Donners' Company",
12
+ "Bad Hat Harry Productions",
13
+ "20th Century Fox",
14
+ "Marvel Entertainment Group"
15
+ ],
16
+ "posterPath": "/bRDAc4GogyS9ci3ow7UnInOcriN.jpg",
17
+ "backdropPath": "/3QUVzbcNyfGe3ocWkYAT8emK8Co.jpg"
18
+ }
package/dist/browser.cjs CHANGED
@@ -54,55 +54,12 @@ function pickRandom(array, rng) {
54
54
 
55
55
  // src/generators/email.ts
56
56
  var EmailGenerator = class {
57
- static generate(firstName, lastName, domains, rng) {
58
- const domain = pickRandom(domains.emailDomains, rng);
59
- const first = firstName.toLowerCase();
60
- const last = lastName.toLowerCase();
61
- return `${first}.${last}@${domain}`;
62
- }
63
- static generateFromUsername(username, domains, rng) {
64
- const domain = pickRandom(domains.emailDomains, rng);
57
+ static generateFromUsername(username, emailDomains, rng) {
58
+ const domain = pickRandom(emailDomains, rng);
65
59
  return `${username}@${domain}`;
66
60
  }
67
61
  };
68
62
 
69
- // src/generators/phone.ts
70
- var PhoneGenerator = class {
71
- static generate(domains, rng) {
72
- if (domains.phoneEasterEggs && domains.phoneEasterEggs.length > 0 && rng() < 0.2) {
73
- return pickRandom(domains.phoneEasterEggs, rng);
74
- }
75
- const prefix = pickRandom(domains.phonePrefixes, rng);
76
- const suffix = this.randomDigits(7, rng);
77
- return `${prefix}-${suffix.slice(0, 3)}-${suffix.slice(3)}`;
78
- }
79
- static randomDigits(count, rng) {
80
- let result = "";
81
- for (let i = 0; i < count; i++) {
82
- result += Math.floor(rng() * 10).toString();
83
- }
84
- return result;
85
- }
86
- };
87
-
88
- // src/generators/password.ts
89
- var PasswordGenerator = class {
90
- static generate(domains, rng) {
91
- if (domains.passwordEasterEggs && domains.passwordEasterEggs.length > 0 && rng() < 0.3) {
92
- return pickRandom(domains.passwordEasterEggs, rng);
93
- }
94
- return this.randomPassword(12, rng);
95
- }
96
- static randomPassword(length, rng) {
97
- const chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$";
98
- let result = "";
99
- for (let i = 0; i < length; i++) {
100
- result += chars[Math.floor(rng() * chars.length)];
101
- }
102
- return result;
103
- }
104
- };
105
-
106
63
  // src/engine/person-factory.ts
107
64
  var PersonFactory = class {
108
65
  static build(universe, seed) {
@@ -125,11 +82,8 @@ var PersonFactory = class {
125
82
  }
126
83
  const address = character.address ?? universe.addresses[0];
127
84
  const username = character.usernames[0];
128
- const domains = character.emailDomain ? { ...universe.domains, emailDomains: [character.emailDomain] } : universe.domains;
129
85
  const rng = createRng(0);
130
- const email = EmailGenerator.generateFromUsername(username, domains, rng);
131
- const phone = PhoneGenerator.generate(universe.domains, rng);
132
- const password = PasswordGenerator.generate(universe.domains, rng);
86
+ const email = EmailGenerator.generateFromUsername(username, character.emailDomains, rng);
133
87
  const quote = character.quotes[0];
134
88
  const person = {
135
89
  id: crypto.randomUUID(),
@@ -138,8 +92,6 @@ var PersonFactory = class {
138
92
  lastName: character.lastName,
139
93
  username,
140
94
  email,
141
- password,
142
- phone,
143
95
  address: {
144
96
  street: address.street,
145
97
  city: address.city,
@@ -160,10 +112,7 @@ var PersonFactory = class {
160
112
  static buildFromCharacter(character, universe, rng) {
161
113
  const address = character.address ?? pickRandom(universe.addresses, rng);
162
114
  const username = pickRandom(character.usernames, rng);
163
- const domains = character.emailDomain ? { ...universe.domains, emailDomains: [character.emailDomain] } : universe.domains;
164
- const email = EmailGenerator.generateFromUsername(username, domains, rng);
165
- const phone = PhoneGenerator.generate(universe.domains, rng);
166
- const password = PasswordGenerator.generate(universe.domains, rng);
115
+ const email = EmailGenerator.generateFromUsername(username, character.emailDomains, rng);
167
116
  const quote = pickRandom(character.quotes, rng);
168
117
  const person = {
169
118
  id: crypto.randomUUID(),
@@ -172,8 +121,6 @@ var PersonFactory = class {
172
121
  lastName: character.lastName,
173
122
  username,
174
123
  email,
175
- password,
176
- phone,
177
124
  address: {
178
125
  street: address.street,
179
126
  city: address.city,
@@ -303,7 +250,6 @@ var import_meta = {};
303
250
  var metaModules = import_meta.glob("../data/*/meta.json", { eager: false });
304
251
  var characterModules = import_meta.glob("../data/*/characters.json", { eager: false });
305
252
  var addressModules = import_meta.glob("../data/*/addresses.json", { eager: false });
306
- var domainModules = import_meta.glob("../data/*/domains.json", { eager: false });
307
253
  function extractId(path) {
308
254
  const parts = path.split("/");
309
255
  return parts[parts.length - 2];
@@ -336,32 +282,27 @@ async function loadUniverse(id) {
336
282
  const metaPath = `../data/${id}/meta.json`;
337
283
  const charactersPath = `../data/${id}/characters.json`;
338
284
  const addressesPath = `../data/${id}/addresses.json`;
339
- const domainsPath = `../data/${id}/domains.json`;
340
285
  const metaLoader = metaModules[metaPath];
341
286
  const charactersLoader = characterModules[charactersPath];
342
287
  const addressesLoader = addressModules[addressesPath];
343
- const domainsLoader = domainModules[domainsPath];
344
- if (!metaLoader || !charactersLoader || !addressesLoader || !domainsLoader) {
288
+ if (!metaLoader || !charactersLoader || !addressesLoader) {
345
289
  throw new Error(`Universe "${id}" not found`);
346
290
  }
347
- const [metaModule, charactersModule, addressesModule, domainsModule] = await Promise.all([
291
+ const [metaModule, charactersModule, addressesModule] = await Promise.all([
348
292
  metaLoader(),
349
293
  charactersLoader(),
350
- addressesLoader(),
351
- domainsLoader()
294
+ addressesLoader()
352
295
  ]);
353
296
  const meta = metaModule.default;
354
297
  const characters = charactersModule.default;
355
298
  const addresses = addressesModule.default;
356
- const domains = domainsModule.default;
357
299
  const universeData = {
358
300
  id: meta.id,
359
301
  name: meta.name,
360
302
  genre: meta.genre,
361
303
  description: meta.description,
362
304
  characters,
363
- addresses,
364
- domains
305
+ addresses
365
306
  };
366
307
  return universeData;
367
308
  }
@@ -388,16 +329,21 @@ async function getAllInterests() {
388
329
  }
389
330
  async function getAllLocations() {
390
331
  const universes = await loadAllUniverses();
391
- const citySet = /* @__PURE__ */ new Set();
332
+ const seen = /* @__PURE__ */ new Map();
392
333
  for (const universe of universes) {
393
334
  for (const address of universe.addresses) {
394
- if (address.city) {
395
- citySet.add(address.city);
335
+ if (address.city && !seen.has(`city:${address.city}`)) {
336
+ seen.set(`city:${address.city}`, { name: address.city, type: "city" });
337
+ }
338
+ if (address.state && !seen.has(`state:${address.state}`)) {
339
+ seen.set(`state:${address.state}`, { name: address.state, type: "state" });
340
+ }
341
+ if (address.country && !seen.has(`country:${address.country}`)) {
342
+ seen.set(`country:${address.country}`, { name: address.country, type: "country" });
396
343
  }
397
344
  }
398
345
  }
399
- const result = Array.from(citySet).sort();
400
- return result;
346
+ return Array.from(seen.values()).sort((a, b) => a.name.localeCompare(b.name));
401
347
  }
402
348
 
403
349
  // src/browser.ts
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/browser.ts","../src/generators/random.ts","../src/generators/email.ts","../src/generators/phone.ts","../src/generators/password.ts","../src/engine/person-factory.ts","../src/engine/universe-store.ts","../src/universes/browser-loader.ts"],"sourcesContent":["import { PersonFactory } from '@/engine/person-factory';\nimport { UniverseStore } from '@/engine/universe-store';\n\nimport type { Person, UniverseData } from '@/types';\n\nexport { UniverseStore };\nexport {\n\tloadUniverse,\n\tloadUniverses,\n\tloadAllUniverses,\n\tloadUniverseMeta,\n\tgetManifest,\n\tgetAllInterests,\n\tgetAllLocations,\n\tgetAvailableIds\n} from '@/universes/browser-loader';\n\nexport function personFromData(universe: UniverseData, seed?: number): Person {\n\treturn PersonFactory.build(universe, seed);\n}\n\nexport type { Person, UniverseMeta } from '@/types';\nexport type { Address, UniverseData, CharacterData, AddressData, DomainsData } from '@/types';\nexport type { CharacterEntry, CharacterQuery } from '@/types';\n","/**\n * Seeded pseudo-random number generator (mulberry32).\n * Returns a function that produces values in [0, 1).\n */\nexport function createRng(seed?: number): () => number {\n\tif (seed === undefined) {\n\t\treturn Math.random;\n\t}\n\n\tlet s = seed;\n\n\treturn function rng(): number {\n\t\ts += 0x6d2b79f5;\n\t\tlet z = s;\n\t\tz = Math.imul(z ^ (z >>> 15), z | 1);\n\t\tz ^= z + Math.imul(z ^ (z >>> 7), z | 61);\n\n\t\treturn ((z ^ (z >>> 14)) >>> 0) / 4294967296;\n\t};\n}\n\nexport function pickRandom<T>(array: T[], rng: () => number): T {\n\tconst index = Math.floor(rng() * array.length);\n\n\treturn array[index];\n}\n","import { pickRandom } from './random';\n\nimport type { DomainsData } from '@/types';\n\nexport class EmailGenerator {\n\tstatic generate(firstName: string, lastName: string, domains: DomainsData, rng: () => number): string {\n\t\tconst domain = pickRandom(domains.emailDomains, rng);\n\t\tconst first = firstName.toLowerCase();\n\t\tconst last = lastName.toLowerCase();\n\n\t\treturn `${first}.${last}@${domain}`;\n\t}\n\n\tstatic generateFromUsername(username: string, domains: DomainsData, rng: () => number): string {\n\t\tconst domain = pickRandom(domains.emailDomains, rng);\n\n\t\treturn `${username}@${domain}`;\n\t}\n}\n","import { pickRandom } from './random';\n\nimport type { DomainsData } from '@/types';\n\nexport class PhoneGenerator {\n\tstatic generate(domains: DomainsData, rng: () => number): string {\n\t\tif (domains.phoneEasterEggs && domains.phoneEasterEggs.length > 0 && rng() < 0.2) {\n\t\t\treturn pickRandom(domains.phoneEasterEggs, rng);\n\t\t}\n\n\t\tconst prefix = pickRandom(domains.phonePrefixes, rng);\n\t\tconst suffix = this.randomDigits(7, rng);\n\n\t\treturn `${prefix}-${suffix.slice(0, 3)}-${suffix.slice(3)}`;\n\t}\n\n\tprivate static randomDigits(count: number, rng: () => number): string {\n\t\tlet result = '';\n\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tresult += Math.floor(rng() * 10).toString();\n\t\t}\n\n\t\treturn result;\n\t}\n}\n","import { pickRandom } from './random';\n\nimport type { DomainsData } from '@/types';\n\nexport class PasswordGenerator {\n\tstatic generate(domains: DomainsData, rng: () => number): string {\n\t\tif (domains.passwordEasterEggs && domains.passwordEasterEggs.length > 0 && rng() < 0.3) {\n\t\t\treturn pickRandom(domains.passwordEasterEggs, rng);\n\t\t}\n\n\t\treturn this.randomPassword(12, rng);\n\t}\n\n\tprivate static randomPassword(length: number, rng: () => number): string {\n\t\tconst chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$';\n\t\tlet result = '';\n\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tresult += chars[Math.floor(rng() * chars.length)];\n\t\t}\n\n\t\treturn result;\n\t}\n}\n","import { createRng, pickRandom, EmailGenerator, PhoneGenerator, PasswordGenerator } from '@/generators';\n\nimport type { Person, UniverseData, CharacterData } from '@/types';\n\nexport class PersonFactory {\n\tstatic build(universe: UniverseData, seed?: number): Person {\n\t\tconst rng = createRng(seed);\n\n\t\tconst character = pickRandom(universe.characters, rng);\n\n\t\treturn this.buildFromCharacter(character, universe, rng);\n\t}\n\n\tstatic buildByCharacterId(characterId: string, universe: UniverseData, seed?: number): Person {\n\t\tconst character = universe.characters.find((c) => c.id === characterId);\n\n\t\tif (!character) {\n\t\t\tthrow new Error(`Character \"${characterId}\" not found in universe \"${universe.id}\"`);\n\t\t}\n\n\t\tconst rng = createRng(seed);\n\n\t\treturn this.buildFromCharacter(character, universe, rng);\n\t}\n\n\tstatic buildCanonical(characterId: string, universe: UniverseData): Person {\n\t\tconst character = universe.characters.find((c) => c.id === characterId);\n\n\t\tif (!character) {\n\t\t\tthrow new Error(`Character \"${characterId}\" not found in universe \"${universe.id}\"`);\n\t\t}\n\n\t\tconst address = character.address ?? universe.addresses[0];\n\t\tconst username = character.usernames[0];\n\t\tconst domains = character.emailDomain ? { ...universe.domains, emailDomains: [character.emailDomain] } : universe.domains;\n\t\tconst rng = createRng(0);\n\t\tconst email = EmailGenerator.generateFromUsername(username, domains, rng);\n\t\tconst phone = PhoneGenerator.generate(universe.domains, rng);\n\t\tconst password = PasswordGenerator.generate(universe.domains, rng);\n\t\tconst quote = character.quotes[0];\n\n\t\tconst person: Person = {\n\t\t\tid: crypto.randomUUID(),\n\t\t\tcharacterId: character.id,\n\t\t\tfirstName: character.firstName,\n\t\t\tlastName: character.lastName,\n\t\t\tusername,\n\t\t\temail,\n\t\t\tpassword,\n\t\t\tphone,\n\t\t\taddress: {\n\t\t\t\tstreet: address.street,\n\t\t\t\tcity: address.city,\n\t\t\t\tstate: address.state ?? '',\n\t\t\t\tzip: address.zip ?? '',\n\t\t\t\tcountry: address.country\n\t\t\t},\n\t\t\tprofession: character.profession,\n\t\t\tinterests: character.interests,\n\t\t\tquote,\n\t\t\tuniverse: universe.id,\n\t\t\tuniverseName: universe.name,\n\t\t\t...(character.symbol ? { symbol: character.symbol } : {}),\n\t\t\t...(character.color ? { color: character.color } : {})\n\t\t};\n\n\t\treturn person;\n\t}\n\n\tprivate static buildFromCharacter(character: CharacterData, universe: UniverseData, rng: () => number): Person {\n\t\tconst address = character.address ?? pickRandom(universe.addresses, rng);\n\n\t\tconst username = pickRandom(character.usernames, rng);\n\n\t\tconst domains = character.emailDomain ? { ...universe.domains, emailDomains: [character.emailDomain] } : universe.domains;\n\n\t\tconst email = EmailGenerator.generateFromUsername(username, domains, rng);\n\t\tconst phone = PhoneGenerator.generate(universe.domains, rng);\n\t\tconst password = PasswordGenerator.generate(universe.domains, rng);\n\t\tconst quote = pickRandom(character.quotes, rng);\n\n\t\tconst person: Person = {\n\t\t\tid: crypto.randomUUID(),\n\t\t\tcharacterId: character.id,\n\t\t\tfirstName: character.firstName,\n\t\t\tlastName: character.lastName,\n\t\t\tusername,\n\t\t\temail,\n\t\t\tpassword,\n\t\t\tphone,\n\t\t\taddress: {\n\t\t\t\tstreet: address.street,\n\t\t\t\tcity: address.city,\n\t\t\t\tstate: address.state ?? '',\n\t\t\t\tzip: address.zip ?? '',\n\t\t\t\tcountry: address.country\n\t\t\t},\n\t\t\tprofession: character.profession,\n\t\t\tinterests: character.interests,\n\t\t\tquote,\n\t\t\tuniverse: universe.id,\n\t\t\tuniverseName: universe.name,\n\t\t\t...(character.symbol ? { symbol: character.symbol } : {}),\n\t\t\t...(character.color ? { color: character.color } : {})\n\t\t};\n\n\t\treturn person;\n\t}\n}\n","import { createRng } from '@/generators';\n\nimport { PersonFactory } from './person-factory';\n\nimport type { UniverseData, UniverseMeta, Person, CharacterEntry, CharacterQuery } from '@/types';\n\nexport class UniverseStore {\n\tprivate universes: UniverseData[];\n\tprivate characterIndex: CharacterEntry[];\n\n\tconstructor(universes: UniverseData[]) {\n\t\tthis.universes = universes;\n\t\tthis.characterIndex = this.buildIndex(universes);\n\t}\n\n\tget index(): CharacterEntry[] {\n\t\treturn this.characterIndex;\n\t}\n\n\tgetInterests(universeIds?: string[]): string[] {\n\t\tconst entries =\n\t\t\tuniverseIds && universeIds.length > 0\n\t\t\t\t? this.characterIndex.filter((e) => universeIds.includes(e.universeId))\n\t\t\t\t: this.characterIndex;\n\n\t\tconst interestSet = new Set<string>();\n\n\t\tfor (const entry of entries) {\n\t\t\tfor (const interest of entry.interests) {\n\t\t\t\tinterestSet.add(interest);\n\t\t\t}\n\t\t}\n\n\t\tconst result = Array.from(interestSet).sort();\n\n\t\treturn result;\n\t}\n\n\tgetUniverses(): UniverseMeta[] {\n\t\tconst result = this.universes.map((u) => {\n\t\t\tconst meta: UniverseMeta = {\n\t\t\t\tid: u.id,\n\t\t\t\tname: u.name,\n\t\t\t\tgenre: u.genre,\n\t\t\t\tdescription: u.description\n\t\t\t};\n\n\t\t\treturn meta;\n\t\t});\n\n\t\treturn result;\n\t}\n\n\tfindCharacters(query: CharacterQuery): CharacterEntry[] {\n\t\tlet entries = this.characterIndex;\n\n\t\tif (query.universes && query.universes.length > 0) {\n\t\t\tentries = entries.filter((e) => query.universes!.includes(e.universeId));\n\t\t}\n\n\t\tif (query.name && query.name.trim().length > 0) {\n\t\t\tconst needle = query.name.toLowerCase();\n\n\t\t\tentries = entries.filter((e) => {\n\t\t\t\tconst fullName = `${e.firstName} ${e.lastName}`.toLowerCase();\n\n\t\t\t\treturn fullName.includes(needle);\n\t\t\t});\n\t\t}\n\n\t\tif (query.interests && query.interests.length > 0) {\n\t\t\tconst mode = query.interestsMode ?? 'or';\n\n\t\t\tif (mode === 'and') {\n\t\t\t\tentries = entries.filter((e) => query.interests!.every((interest) => e.interests.includes(interest)));\n\t\t\t} else {\n\t\t\t\tentries = entries.filter((e) => query.interests!.some((interest) => e.interests.includes(interest)));\n\t\t\t}\n\t\t}\n\n\t\treturn entries;\n\t}\n\n\tpersonByCharacterId(characterId: string, seed?: number): Person {\n\t\tconst entry = this.characterIndex.find((e) => e.characterId === characterId);\n\n\t\tif (!entry) {\n\t\t\tthrow new Error(`Character \"${characterId}\" not found in store`);\n\t\t}\n\n\t\tconst universe = this.universes.find((u) => u.id === entry.universeId);\n\n\t\tif (!universe) {\n\t\t\tthrow new Error(`Universe \"${entry.universeId}\" not found in store`);\n\t\t}\n\n\t\treturn PersonFactory.buildByCharacterId(characterId, universe, seed);\n\t}\n\n\tgeneratePersonas(query: CharacterQuery, count: number, seed?: number): Person[] {\n\t\tconst matching = this.findCharacters(query);\n\n\t\tif (matching.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst rng = createRng(seed);\n\t\tconst actualCount = Math.min(count, matching.length);\n\n\t\tconst shuffled = [...matching].sort(() => rng() - 0.5);\n\t\tconst selected = shuffled.slice(0, actualCount);\n\t\tconst personas: Person[] = [];\n\n\t\tfor (let i = 0; i < selected.length; i++) {\n\t\t\tconst entry = selected[i];\n\t\t\tconst universe = this.universes.find((u) => u.id === entry.universeId)!;\n\t\t\tconst personSeed = seed !== undefined ? seed + i : undefined;\n\n\t\t\tpersonas.push(PersonFactory.buildByCharacterId(entry.characterId, universe, personSeed));\n\t\t}\n\n\t\treturn personas;\n\t}\n\n\tprivate buildIndex(universes: UniverseData[]): CharacterEntry[] {\n\t\tconst index: CharacterEntry[] = [];\n\n\t\tfor (const universe of universes) {\n\t\t\tfor (const character of universe.characters) {\n\t\t\t\tconst entry: CharacterEntry = {\n\t\t\t\t\tcharacterId: character.id,\n\t\t\t\t\tuniverseId: universe.id,\n\t\t\t\t\tuniverseName: universe.name,\n\t\t\t\t\tfirstName: character.firstName,\n\t\t\t\t\tlastName: character.lastName,\n\t\t\t\t\tinterests: character.interests,\n\t\t\t\t\tprofession: character.profession\n\t\t\t\t};\n\n\t\t\t\tindex.push(entry);\n\t\t\t}\n\t\t}\n\n\t\treturn index;\n\t}\n}\n","import type { UniverseData, UniverseMeta, CharacterData, AddressData, DomainsData } from '@/types';\n\ninterface MetaJson {\n\tid: string;\n\tname: string;\n\tgenre: string[];\n\tdescription: string;\n}\n\nconst metaModules = import.meta.glob('../data/*/meta.json', { eager: false });\nconst characterModules = import.meta.glob('../data/*/characters.json', { eager: false });\nconst addressModules = import.meta.glob('../data/*/addresses.json', { eager: false });\nconst domainModules = import.meta.glob('../data/*/domains.json', { eager: false });\n\nfunction extractId(path: string): string {\n\tconst parts = path.split('/');\n\n\treturn parts[parts.length - 2];\n}\n\nexport function getAvailableIds(): string[] {\n\treturn Object.keys(metaModules).map(extractId);\n}\n\nexport async function loadUniverseMeta(id: string): Promise<UniverseMeta> {\n\tconst metaPath = `../data/${id}/meta.json`;\n\tconst metaLoader = metaModules[metaPath];\n\n\tif (!metaLoader) {\n\t\tthrow new Error(`Universe \"${id}\" not found`);\n\t}\n\n\tconst metaModule = await metaLoader();\n\tconst meta = (metaModule as { default: MetaJson }).default;\n\n\tconst result: UniverseMeta = {\n\t\tid: meta.id,\n\t\tname: meta.name,\n\t\tgenre: meta.genre,\n\t\tdescription: meta.description\n\t};\n\n\treturn result;\n}\n\nexport async function getManifest(): Promise<UniverseMeta[]> {\n\tconst ids = getAvailableIds();\n\tconst result = await Promise.all(ids.map((id) => loadUniverseMeta(id)));\n\n\treturn result;\n}\n\nexport async function loadUniverse(id: string): Promise<UniverseData> {\n\tconst metaPath = `../data/${id}/meta.json`;\n\tconst charactersPath = `../data/${id}/characters.json`;\n\tconst addressesPath = `../data/${id}/addresses.json`;\n\tconst domainsPath = `../data/${id}/domains.json`;\n\n\tconst metaLoader = metaModules[metaPath];\n\tconst charactersLoader = characterModules[charactersPath];\n\tconst addressesLoader = addressModules[addressesPath];\n\tconst domainsLoader = domainModules[domainsPath];\n\n\tif (!metaLoader || !charactersLoader || !addressesLoader || !domainsLoader) {\n\t\tthrow new Error(`Universe \"${id}\" not found`);\n\t}\n\n\tconst [metaModule, charactersModule, addressesModule, domainsModule] = await Promise.all([\n\t\tmetaLoader(),\n\t\tcharactersLoader(),\n\t\taddressesLoader(),\n\t\tdomainsLoader()\n\t]);\n\n\tconst meta = (metaModule as { default: MetaJson }).default;\n\tconst characters = (charactersModule as { default: CharacterData[] }).default;\n\tconst addresses = (addressesModule as { default: AddressData[] }).default;\n\tconst domains = (domainsModule as { default: DomainsData }).default;\n\n\tconst universeData: UniverseData = {\n\t\tid: meta.id,\n\t\tname: meta.name,\n\t\tgenre: meta.genre,\n\t\tdescription: meta.description,\n\t\tcharacters,\n\t\taddresses,\n\t\tdomains\n\t};\n\n\treturn universeData;\n}\n\nexport async function loadUniverses(ids: string[]): Promise<UniverseData[]> {\n\tconst result = await Promise.all(ids.map((id) => loadUniverse(id)));\n\n\treturn result;\n}\n\nexport async function loadAllUniverses(): Promise<UniverseData[]> {\n\tconst ids = getAvailableIds();\n\n\treturn loadUniverses(ids);\n}\n\nexport async function getAllInterests(): Promise<string[]> {\n\tconst universes = await loadAllUniverses();\n\tconst interestSet = new Set<string>();\n\n\tfor (const universe of universes) {\n\t\tfor (const character of universe.characters) {\n\t\t\tfor (const interest of character.interests) {\n\t\t\t\tinterestSet.add(interest);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst result = Array.from(interestSet).sort();\n\n\treturn result;\n}\n\nexport async function getAllLocations(): Promise<string[]> {\n\tconst universes = await loadAllUniverses();\n\tconst citySet = new Set<string>();\n\n\tfor (const universe of universes) {\n\t\tfor (const address of universe.addresses) {\n\t\t\tif (address.city) {\n\t\t\t\tcitySet.add(address.city);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst result = Array.from(citySet).sort();\n\n\treturn result;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/browser.ts","../src/generators/random.ts","../src/generators/email.ts","../src/engine/person-factory.ts","../src/engine/universe-store.ts","../src/universes/browser-loader.ts"],"sourcesContent":["import { PersonFactory } from '@/engine/person-factory';\nimport { UniverseStore } from '@/engine/universe-store';\n\nimport type { Person, UniverseData } from '@/types';\n\nexport { UniverseStore };\nexport {\n\tloadUniverse,\n\tloadUniverses,\n\tloadAllUniverses,\n\tloadUniverseMeta,\n\tgetManifest,\n\tgetAllInterests,\n\tgetAllLocations,\n\tgetAvailableIds\n} from '@/universes/browser-loader';\n\nexport function personFromData(universe: UniverseData, seed?: number): Person {\n\treturn PersonFactory.build(universe, seed);\n}\n\nexport type { Person, UniverseMeta } from '@/types';\nexport type { Address, UniverseData, CharacterData, AddressData } from '@/types';\nexport type { CharacterEntry, CharacterQuery } from '@/types';\n","/**\n * Seeded pseudo-random number generator (mulberry32).\n * Returns a function that produces values in [0, 1).\n */\nexport function createRng(seed?: number): () => number {\n\tif (seed === undefined) {\n\t\treturn Math.random;\n\t}\n\n\tlet s = seed;\n\n\treturn function rng(): number {\n\t\ts += 0x6d2b79f5;\n\t\tlet z = s;\n\t\tz = Math.imul(z ^ (z >>> 15), z | 1);\n\t\tz ^= z + Math.imul(z ^ (z >>> 7), z | 61);\n\n\t\treturn ((z ^ (z >>> 14)) >>> 0) / 4294967296;\n\t};\n}\n\nexport function pickRandom<T>(array: T[], rng: () => number): T {\n\tconst index = Math.floor(rng() * array.length);\n\n\treturn array[index];\n}\n","import { pickRandom } from './random';\n\nexport class EmailGenerator {\n\tstatic generateFromUsername(username: string, emailDomains: string[], rng: () => number): string {\n\t\tconst domain = pickRandom(emailDomains, rng);\n\n\t\treturn `${username}@${domain}`;\n\t}\n}\n","import { createRng, pickRandom, EmailGenerator } from '@/generators';\n\nimport type { Person, UniverseData, CharacterData } from '@/types';\n\nexport class PersonFactory {\n\tstatic build(universe: UniverseData, seed?: number): Person {\n\t\tconst rng = createRng(seed);\n\n\t\tconst character = pickRandom(universe.characters, rng);\n\n\t\treturn this.buildFromCharacter(character, universe, rng);\n\t}\n\n\tstatic buildByCharacterId(characterId: string, universe: UniverseData, seed?: number): Person {\n\t\tconst character = universe.characters.find((c) => c.id === characterId);\n\n\t\tif (!character) {\n\t\t\tthrow new Error(`Character \"${characterId}\" not found in universe \"${universe.id}\"`);\n\t\t}\n\n\t\tconst rng = createRng(seed);\n\n\t\treturn this.buildFromCharacter(character, universe, rng);\n\t}\n\n\tstatic buildCanonical(characterId: string, universe: UniverseData): Person {\n\t\tconst character = universe.characters.find((c) => c.id === characterId);\n\n\t\tif (!character) {\n\t\t\tthrow new Error(`Character \"${characterId}\" not found in universe \"${universe.id}\"`);\n\t\t}\n\n\t\tconst address = character.address ?? universe.addresses[0];\n\t\tconst username = character.usernames[0];\n\t\tconst rng = createRng(0);\n\t\tconst email = EmailGenerator.generateFromUsername(username, character.emailDomains, rng);\n\t\tconst quote = character.quotes[0];\n\n\t\tconst person: Person = {\n\t\t\tid: crypto.randomUUID(),\n\t\t\tcharacterId: character.id,\n\t\t\tfirstName: character.firstName,\n\t\t\tlastName: character.lastName,\n\t\t\tusername,\n\t\t\temail,\n\t\t\taddress: {\n\t\t\t\tstreet: address.street,\n\t\t\t\tcity: address.city,\n\t\t\t\tstate: address.state ?? '',\n\t\t\t\tzip: address.zip ?? '',\n\t\t\t\tcountry: address.country\n\t\t\t},\n\t\t\tprofession: character.profession,\n\t\t\tinterests: character.interests,\n\t\t\tquote,\n\t\t\tuniverse: universe.id,\n\t\t\tuniverseName: universe.name,\n\t\t\t...(character.symbol ? { symbol: character.symbol } : {}),\n\t\t\t...(character.color ? { color: character.color } : {})\n\t\t};\n\n\t\treturn person;\n\t}\n\n\tprivate static buildFromCharacter(character: CharacterData, universe: UniverseData, rng: () => number): Person {\n\t\tconst address = character.address ?? pickRandom(universe.addresses, rng);\n\t\tconst username = pickRandom(character.usernames, rng);\n\t\tconst email = EmailGenerator.generateFromUsername(username, character.emailDomains, rng);\n\t\tconst quote = pickRandom(character.quotes, rng);\n\n\t\tconst person: Person = {\n\t\t\tid: crypto.randomUUID(),\n\t\t\tcharacterId: character.id,\n\t\t\tfirstName: character.firstName,\n\t\t\tlastName: character.lastName,\n\t\t\tusername,\n\t\t\temail,\n\t\t\taddress: {\n\t\t\t\tstreet: address.street,\n\t\t\t\tcity: address.city,\n\t\t\t\tstate: address.state ?? '',\n\t\t\t\tzip: address.zip ?? '',\n\t\t\t\tcountry: address.country\n\t\t\t},\n\t\t\tprofession: character.profession,\n\t\t\tinterests: character.interests,\n\t\t\tquote,\n\t\t\tuniverse: universe.id,\n\t\t\tuniverseName: universe.name,\n\t\t\t...(character.symbol ? { symbol: character.symbol } : {}),\n\t\t\t...(character.color ? { color: character.color } : {})\n\t\t};\n\n\t\treturn person;\n\t}\n}\n","import { createRng } from '@/generators';\n\nimport { PersonFactory } from './person-factory';\n\nimport type { UniverseData, UniverseMeta, Person, CharacterEntry, CharacterQuery } from '@/types';\n\nexport class UniverseStore {\n\tprivate universes: UniverseData[];\n\tprivate characterIndex: CharacterEntry[];\n\n\tconstructor(universes: UniverseData[]) {\n\t\tthis.universes = universes;\n\t\tthis.characterIndex = this.buildIndex(universes);\n\t}\n\n\tget index(): CharacterEntry[] {\n\t\treturn this.characterIndex;\n\t}\n\n\tgetInterests(universeIds?: string[]): string[] {\n\t\tconst entries =\n\t\t\tuniverseIds && universeIds.length > 0\n\t\t\t\t? this.characterIndex.filter((e) => universeIds.includes(e.universeId))\n\t\t\t\t: this.characterIndex;\n\n\t\tconst interestSet = new Set<string>();\n\n\t\tfor (const entry of entries) {\n\t\t\tfor (const interest of entry.interests) {\n\t\t\t\tinterestSet.add(interest);\n\t\t\t}\n\t\t}\n\n\t\tconst result = Array.from(interestSet).sort();\n\n\t\treturn result;\n\t}\n\n\tgetUniverses(): UniverseMeta[] {\n\t\tconst result = this.universes.map((u) => {\n\t\t\tconst meta: UniverseMeta = {\n\t\t\t\tid: u.id,\n\t\t\t\tname: u.name,\n\t\t\t\tgenre: u.genre,\n\t\t\t\tdescription: u.description\n\t\t\t};\n\n\t\t\treturn meta;\n\t\t});\n\n\t\treturn result;\n\t}\n\n\tfindCharacters(query: CharacterQuery): CharacterEntry[] {\n\t\tlet entries = this.characterIndex;\n\n\t\tif (query.universes && query.universes.length > 0) {\n\t\t\tentries = entries.filter((e) => query.universes!.includes(e.universeId));\n\t\t}\n\n\t\tif (query.name && query.name.trim().length > 0) {\n\t\t\tconst needle = query.name.toLowerCase();\n\n\t\t\tentries = entries.filter((e) => {\n\t\t\t\tconst fullName = `${e.firstName} ${e.lastName}`.toLowerCase();\n\n\t\t\t\treturn fullName.includes(needle);\n\t\t\t});\n\t\t}\n\n\t\tif (query.interests && query.interests.length > 0) {\n\t\t\tconst mode = query.interestsMode ?? 'or';\n\n\t\t\tif (mode === 'and') {\n\t\t\t\tentries = entries.filter((e) => query.interests!.every((interest) => e.interests.includes(interest)));\n\t\t\t} else {\n\t\t\t\tentries = entries.filter((e) => query.interests!.some((interest) => e.interests.includes(interest)));\n\t\t\t}\n\t\t}\n\n\t\treturn entries;\n\t}\n\n\tpersonByCharacterId(characterId: string, seed?: number): Person {\n\t\tconst entry = this.characterIndex.find((e) => e.characterId === characterId);\n\n\t\tif (!entry) {\n\t\t\tthrow new Error(`Character \"${characterId}\" not found in store`);\n\t\t}\n\n\t\tconst universe = this.universes.find((u) => u.id === entry.universeId);\n\n\t\tif (!universe) {\n\t\t\tthrow new Error(`Universe \"${entry.universeId}\" not found in store`);\n\t\t}\n\n\t\treturn PersonFactory.buildByCharacterId(characterId, universe, seed);\n\t}\n\n\tgeneratePersonas(query: CharacterQuery, count: number, seed?: number): Person[] {\n\t\tconst matching = this.findCharacters(query);\n\n\t\tif (matching.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst rng = createRng(seed);\n\t\tconst actualCount = Math.min(count, matching.length);\n\n\t\tconst shuffled = [...matching].sort(() => rng() - 0.5);\n\t\tconst selected = shuffled.slice(0, actualCount);\n\t\tconst personas: Person[] = [];\n\n\t\tfor (let i = 0; i < selected.length; i++) {\n\t\t\tconst entry = selected[i];\n\t\t\tconst universe = this.universes.find((u) => u.id === entry.universeId)!;\n\t\t\tconst personSeed = seed !== undefined ? seed + i : undefined;\n\n\t\t\tpersonas.push(PersonFactory.buildByCharacterId(entry.characterId, universe, personSeed));\n\t\t}\n\n\t\treturn personas;\n\t}\n\n\tprivate buildIndex(universes: UniverseData[]): CharacterEntry[] {\n\t\tconst index: CharacterEntry[] = [];\n\n\t\tfor (const universe of universes) {\n\t\t\tfor (const character of universe.characters) {\n\t\t\t\tconst entry: CharacterEntry = {\n\t\t\t\t\tcharacterId: character.id,\n\t\t\t\t\tuniverseId: universe.id,\n\t\t\t\t\tuniverseName: universe.name,\n\t\t\t\t\tfirstName: character.firstName,\n\t\t\t\t\tlastName: character.lastName,\n\t\t\t\t\tinterests: character.interests,\n\t\t\t\t\tprofession: character.profession\n\t\t\t\t};\n\n\t\t\t\tindex.push(entry);\n\t\t\t}\n\t\t}\n\n\t\treturn index;\n\t}\n}\n","import type { UniverseData, UniverseMeta, CharacterData, AddressData, LocationEntry } from '@/types';\n\ninterface MetaJson {\n\tid: string;\n\tname: string;\n\tgenre: string[];\n\tdescription: string;\n}\n\nconst metaModules = import.meta.glob('../data/*/meta.json', { eager: false });\nconst characterModules = import.meta.glob('../data/*/characters.json', { eager: false });\nconst addressModules = import.meta.glob('../data/*/addresses.json', { eager: false });\n\nfunction extractId(path: string): string {\n\tconst parts = path.split('/');\n\n\treturn parts[parts.length - 2];\n}\n\nexport function getAvailableIds(): string[] {\n\treturn Object.keys(metaModules).map(extractId);\n}\n\nexport async function loadUniverseMeta(id: string): Promise<UniverseMeta> {\n\tconst metaPath = `../data/${id}/meta.json`;\n\tconst metaLoader = metaModules[metaPath];\n\n\tif (!metaLoader) {\n\t\tthrow new Error(`Universe \"${id}\" not found`);\n\t}\n\n\tconst metaModule = await metaLoader();\n\tconst meta = (metaModule as { default: MetaJson }).default;\n\n\tconst result: UniverseMeta = {\n\t\tid: meta.id,\n\t\tname: meta.name,\n\t\tgenre: meta.genre,\n\t\tdescription: meta.description\n\t};\n\n\treturn result;\n}\n\nexport async function getManifest(): Promise<UniverseMeta[]> {\n\tconst ids = getAvailableIds();\n\tconst result = await Promise.all(ids.map((id) => loadUniverseMeta(id)));\n\n\treturn result;\n}\n\nexport async function loadUniverse(id: string): Promise<UniverseData> {\n\tconst metaPath = `../data/${id}/meta.json`;\n\tconst charactersPath = `../data/${id}/characters.json`;\n\tconst addressesPath = `../data/${id}/addresses.json`;\n\n\tconst metaLoader = metaModules[metaPath];\n\tconst charactersLoader = characterModules[charactersPath];\n\tconst addressesLoader = addressModules[addressesPath];\n\n\tif (!metaLoader || !charactersLoader || !addressesLoader) {\n\t\tthrow new Error(`Universe \"${id}\" not found`);\n\t}\n\n\tconst [metaModule, charactersModule, addressesModule] = await Promise.all([\n\t\tmetaLoader(),\n\t\tcharactersLoader(),\n\t\taddressesLoader()\n\t]);\n\n\tconst meta = (metaModule as { default: MetaJson }).default;\n\tconst characters = (charactersModule as { default: CharacterData[] }).default;\n\tconst addresses = (addressesModule as { default: AddressData[] }).default;\n\n\tconst universeData: UniverseData = {\n\t\tid: meta.id,\n\t\tname: meta.name,\n\t\tgenre: meta.genre,\n\t\tdescription: meta.description,\n\t\tcharacters,\n\t\taddresses\n\t};\n\n\treturn universeData;\n}\n\nexport async function loadUniverses(ids: string[]): Promise<UniverseData[]> {\n\tconst result = await Promise.all(ids.map((id) => loadUniverse(id)));\n\n\treturn result;\n}\n\nexport async function loadAllUniverses(): Promise<UniverseData[]> {\n\tconst ids = getAvailableIds();\n\n\treturn loadUniverses(ids);\n}\n\nexport async function getAllInterests(): Promise<string[]> {\n\tconst universes = await loadAllUniverses();\n\tconst interestSet = new Set<string>();\n\n\tfor (const universe of universes) {\n\t\tfor (const character of universe.characters) {\n\t\t\tfor (const interest of character.interests) {\n\t\t\t\tinterestSet.add(interest);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst result = Array.from(interestSet).sort();\n\n\treturn result;\n}\n\nexport async function getAllLocations(): Promise<LocationEntry[]> {\n\tconst universes = await loadAllUniverses();\n\tconst seen = new Map<string, LocationEntry>();\n\n\tfor (const universe of universes) {\n\t\tfor (const address of universe.addresses) {\n\t\t\tif (address.city && !seen.has(`city:${address.city}`)) {\n\t\t\t\tseen.set(`city:${address.city}`, { name: address.city, type: 'city' });\n\t\t\t}\n\n\t\t\tif (address.state && !seen.has(`state:${address.state}`)) {\n\t\t\t\tseen.set(`state:${address.state}`, { name: address.state, type: 'state' });\n\t\t\t}\n\n\t\t\tif (address.country && !seen.has(`country:${address.country}`)) {\n\t\t\t\tseen.set(`country:${address.country}`, { name: address.country, type: 'country' });\n\t\t\t}\n\t\t}\n\t}\n\n\treturn Array.from(seen.values()).sort((a, b) => a.name.localeCompare(b.name));\n}\n"],"mappings":"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","names":[]}
@@ -1,5 +1,5 @@
1
- import { U as UniverseMeta, a as UniverseData, P as Person } from './universe-store-Del1UHgn.cjs';
2
- export { A as Address, b as AddressData, C as CharacterData, c as CharacterEntry, d as CharacterQuery, D as DomainsData, e as UniverseStore } from './universe-store-Del1UHgn.cjs';
1
+ import { L as LocationEntry, U as UniverseMeta, a as UniverseData, P as Person } from './universe-store-CWhCn3U6.cjs';
2
+ export { A as Address, b as AddressData, C as CharacterData, c as CharacterEntry, d as CharacterQuery, e as UniverseStore } from './universe-store-CWhCn3U6.cjs';
3
3
 
4
4
  declare function getAvailableIds(): string[];
5
5
  declare function loadUniverseMeta(id: string): Promise<UniverseMeta>;
@@ -8,7 +8,7 @@ declare function loadUniverse(id: string): Promise<UniverseData>;
8
8
  declare function loadUniverses(ids: string[]): Promise<UniverseData[]>;
9
9
  declare function loadAllUniverses(): Promise<UniverseData[]>;
10
10
  declare function getAllInterests(): Promise<string[]>;
11
- declare function getAllLocations(): Promise<string[]>;
11
+ declare function getAllLocations(): Promise<LocationEntry[]>;
12
12
 
13
13
  declare function personFromData(universe: UniverseData, seed?: number): Person;
14
14
 
package/dist/browser.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { U as UniverseMeta, a as UniverseData, P as Person } from './universe-store-Del1UHgn.js';
2
- export { A as Address, b as AddressData, C as CharacterData, c as CharacterEntry, d as CharacterQuery, D as DomainsData, e as UniverseStore } from './universe-store-Del1UHgn.js';
1
+ import { L as LocationEntry, U as UniverseMeta, a as UniverseData, P as Person } from './universe-store-CWhCn3U6.js';
2
+ export { A as Address, b as AddressData, C as CharacterData, c as CharacterEntry, d as CharacterQuery, e as UniverseStore } from './universe-store-CWhCn3U6.js';
3
3
 
4
4
  declare function getAvailableIds(): string[];
5
5
  declare function loadUniverseMeta(id: string): Promise<UniverseMeta>;
@@ -8,7 +8,7 @@ declare function loadUniverse(id: string): Promise<UniverseData>;
8
8
  declare function loadUniverses(ids: string[]): Promise<UniverseData[]>;
9
9
  declare function loadAllUniverses(): Promise<UniverseData[]>;
10
10
  declare function getAllInterests(): Promise<string[]>;
11
- declare function getAllLocations(): Promise<string[]>;
11
+ declare function getAllLocations(): Promise<LocationEntry[]>;
12
12
 
13
13
  declare function personFromData(universe: UniverseData, seed?: number): Person;
14
14