@dromney/mapthis 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +56 -0
  3. package/dist/ai/index.cjs +474 -0
  4. package/dist/ai/index.cjs.map +1 -0
  5. package/dist/ai/index.d.cts +117 -0
  6. package/dist/ai/index.d.ts +117 -0
  7. package/dist/ai/index.js +447 -0
  8. package/dist/ai/index.js.map +1 -0
  9. package/dist/domain-CZ-L-ntu.d.ts +163 -0
  10. package/dist/domain-Dc1wSTkf.d.cts +163 -0
  11. package/dist/errors-Bw97z_4m.d.cts +12 -0
  12. package/dist/errors-Bw97z_4m.d.ts +12 -0
  13. package/dist/generate/index.cjs +222 -0
  14. package/dist/generate/index.cjs.map +1 -0
  15. package/dist/generate/index.d.cts +140 -0
  16. package/dist/generate/index.d.ts +140 -0
  17. package/dist/generate/index.js +220 -0
  18. package/dist/generate/index.js.map +1 -0
  19. package/dist/geocoding/index.cjs +90 -0
  20. package/dist/geocoding/index.cjs.map +1 -0
  21. package/dist/geocoding/index.d.cts +36 -0
  22. package/dist/geocoding/index.d.ts +36 -0
  23. package/dist/geocoding/index.js +86 -0
  24. package/dist/geocoding/index.js.map +1 -0
  25. package/dist/index.cjs +546 -0
  26. package/dist/index.cjs.map +1 -0
  27. package/dist/index.d.cts +5 -0
  28. package/dist/index.d.ts +5 -0
  29. package/dist/index.js +469 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/parser-CzXzpmVv.d.cts +111 -0
  32. package/dist/parser-N7-fNxeu.d.ts +111 -0
  33. package/dist/react/index.cjs +394 -0
  34. package/dist/react/index.cjs.map +1 -0
  35. package/dist/react/index.js +383 -0
  36. package/dist/react/index.js.map +1 -0
  37. package/dist/schemas-Dy5coqXo.d.cts +484 -0
  38. package/dist/schemas-Dy5coqXo.d.ts +484 -0
  39. package/dist/scrape/index.cjs +133 -0
  40. package/dist/scrape/index.cjs.map +1 -0
  41. package/dist/scrape/index.d.cts +60 -0
  42. package/dist/scrape/index.d.ts +60 -0
  43. package/dist/scrape/index.js +125 -0
  44. package/dist/scrape/index.js.map +1 -0
  45. package/dist/search/index.cjs +76 -0
  46. package/dist/search/index.cjs.map +1 -0
  47. package/dist/search/index.d.cts +75 -0
  48. package/dist/search/index.d.ts +75 -0
  49. package/dist/search/index.js +71 -0
  50. package/dist/search/index.js.map +1 -0
  51. package/dist/types/index.cjs +215 -0
  52. package/dist/types/index.cjs.map +1 -0
  53. package/dist/types/index.d.cts +4 -0
  54. package/dist/types/index.d.ts +4 -0
  55. package/dist/types/index.js +171 -0
  56. package/dist/types/index.js.map +1 -0
  57. package/dist/types-BhqKlq0k.d.ts +31 -0
  58. package/dist/types-rFjK5YcJ.d.cts +31 -0
  59. package/dist/utils/index.cjs +335 -0
  60. package/dist/utils/index.cjs.map +1 -0
  61. package/dist/utils/index.d.cts +363 -0
  62. package/dist/utils/index.d.ts +363 -0
  63. package/dist/utils/index.js +301 -0
  64. package/dist/utils/index.js.map +1 -0
  65. package/package.json +150 -0
package/dist/index.js ADDED
@@ -0,0 +1,469 @@
1
+ import { z } from 'zod';
2
+
3
+ // src/types/schemas.ts
4
+ var llmProvider = z.literal("openai");
5
+ var placeProvider = z.union([z.literal("google"), z.literal("locationiq")]);
6
+ var generationSourceType = z.union([
7
+ z.literal("blank"),
8
+ z.literal("autocomplete"),
9
+ z.literal("url"),
10
+ z.literal("text"),
11
+ z.literal("list")
12
+ ]);
13
+ var latitude = z.coerce.number().min(-90, "Min latitude is -90").max(90, "Max latitude is 90");
14
+ var longitude = z.coerce.number().min(-180, "Min longitude is -180").max(180, "Max longitude is 180");
15
+ var coordinates = z.object({
16
+ lat: latitude,
17
+ lng: longitude
18
+ });
19
+ var placesFromUrl = z.string().url({ message: "Invalid url" }).min(6).max(2048);
20
+ var placesFromList = z.preprocess(
21
+ (v) => String(v).split("\n").map((line) => line.trim()).filter((line) => !!line).join("\n"),
22
+ z.string().min(6, "Must be at least 6 characters").max(1e3, "List too long")
23
+ ).refine(
24
+ (v) => !v.split("\n").find((line) => line.length < 2),
25
+ "All lines must be at least 2 characters"
26
+ );
27
+ var placesFromText = z.string().min(6, "Must be at least 6 characters").max(2e3, "Over character limit");
28
+ var mapExternalId = z.string().min(6).max(100);
29
+ var mapTitle = z.string().min(3, { message: "Title must be at least 3 characters" }).max(100, { message: "Title must be at most 100 characters" });
30
+ var mapDescription = z.string().max(1e3, { message: "Limit is 1000 characters" });
31
+ var mapCreationQuery = z.string().min(10, "Minimum 10 characters for search").max(200, "Maximum 200 characters");
32
+ var groupName = z.string().min(3, { message: "Name must be at least 3 characters" }).max(200, { message: "Name must be at most 200 characters" });
33
+ var groupDescription = z.string().max(400, { message: "Limit is 400 characters" });
34
+ var groupColor = z.string().startsWith("#").length(7);
35
+ var placeName = z.string().min(2, { message: "Name must be at least 2 characters" }).max(200, { message: "Name must be at most 200 characters" });
36
+ var placeDescription = z.string().max(400, { message: "Limit is 400 characters" });
37
+ var createMapBase = z.object({
38
+ title: mapTitle.optional(),
39
+ description: mapDescription.optional(),
40
+ externalId: mapExternalId.optional()
41
+ });
42
+ var createMapSchema = createMapBase.extend({
43
+ sourceType: generationSourceType,
44
+ source: z.string().optional()
45
+ });
46
+ var createBlankMapSchema = createMapBase;
47
+ var createMapFromUrlSchema = createMapBase.extend({
48
+ url: placesFromUrl
49
+ });
50
+ var createMapFromListSchema = createMapBase.extend({
51
+ list: placesFromList
52
+ });
53
+ var createMapFromTextSchema = createMapBase.extend({
54
+ text: placesFromText
55
+ });
56
+ var createMapFromQueryOrUrlSchema = createMapBase.extend({
57
+ queryOrUrl: z.union([mapCreationQuery, placesFromUrl])
58
+ });
59
+ var addPlacesBaseSchema = z.object({
60
+ sourceType: generationSourceType,
61
+ source: z.string()
62
+ });
63
+ var addPlacesFromSourceSchema = addPlacesBaseSchema.extend({
64
+ mapId: z.string(),
65
+ groupId: z.string().optional()
66
+ });
67
+ var addPlacesFromUrlSchema = z.object({
68
+ url: placesFromUrl
69
+ });
70
+ var addPlacesFromListSchema = z.object({
71
+ list: placesFromList
72
+ });
73
+ var addPlacesFromTextSchema = z.object({
74
+ text: placesFromText
75
+ });
76
+ var providerAutocompletePlace = z.object({
77
+ query: z.string(),
78
+ provider: z.literal("google"),
79
+ providerId: z.string(),
80
+ name: z.string(),
81
+ description: z.string().optional(),
82
+ address: z.string(),
83
+ lat: z.number().min(-90).max(90),
84
+ lng: z.number().min(-180).max(180)
85
+ });
86
+ var addPlacesFromClientAutocompleteSchema = providerAutocompletePlace.extend({
87
+ mapId: z.string(),
88
+ groupId: z.string().optional()
89
+ });
90
+ var updateMapSchema = z.object({
91
+ title: mapTitle,
92
+ description: mapDescription.optional(),
93
+ userPublic: z.boolean().optional(),
94
+ partnerPublic: z.boolean().optional(),
95
+ url: z.string().url().nullable().optional()
96
+ });
97
+ var reorderMapSchema = z.object({
98
+ groups: z.array(
99
+ z.object({
100
+ id: z.string().uuid().nullable(),
101
+ position: z.number()
102
+ })
103
+ ),
104
+ places: z.array(
105
+ z.object({
106
+ id: z.string(),
107
+ groupId: z.string().uuid().nullable(),
108
+ position: z.number()
109
+ })
110
+ )
111
+ });
112
+ var updatePlaceFormSchema = z.object({
113
+ id: z.string(),
114
+ name: placeName,
115
+ description: placeDescription.optional(),
116
+ hidden: z.boolean()
117
+ });
118
+ var searchSchema = z.object({
119
+ query: mapCreationQuery
120
+ });
121
+ var createGroupSchema = z.object({
122
+ name: groupName,
123
+ description: groupDescription.optional(),
124
+ parentGroupId: z.string().optional(),
125
+ color: groupColor.optional()
126
+ });
127
+ var editGroupSchema = z.object({
128
+ id: z.string().uuid(),
129
+ color: groupColor.nullable(),
130
+ hidden: z.boolean(),
131
+ name: groupName,
132
+ description: groupDescription.optional()
133
+ });
134
+ var placeMeta = z.object({
135
+ id: z.string(),
136
+ updatedAt: z.coerce.date(),
137
+ groupId: z.string().nullable(),
138
+ position: z.number().nullable(),
139
+ error: z.string().nullable(),
140
+ lat: z.number().nullable(),
141
+ lon: z.number().nullable(),
142
+ name: z.string().nullable()
143
+ });
144
+ var positionedPlaceMeta = placeMeta.extend({
145
+ position: z.number()
146
+ });
147
+ var mappablePlaceMeta = placeMeta.extend({
148
+ lat: z.number(),
149
+ lon: z.number(),
150
+ error: z.null()
151
+ });
152
+ function getMappablePlaceMetas(places) {
153
+ const good = [];
154
+ for (const p of places) {
155
+ const parsed = mappablePlaceMeta.safeParse(p);
156
+ if (parsed.success) good.push(parsed.data);
157
+ }
158
+ return good;
159
+ }
160
+
161
+ // src/types/errors.ts
162
+ var MapthisError = class extends Error {
163
+ constructor(message, options) {
164
+ super(message, options);
165
+ this.name = "MapthisError";
166
+ }
167
+ };
168
+
169
+ // src/utils/text.ts
170
+ var capitalizeFirstLetter = (s) => s ? s.charAt(0).toUpperCase() + s.slice(1) : s;
171
+ function objectMap(obj, func) {
172
+ return Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, func(k, v)]));
173
+ }
174
+ var enforceListTextInput = (val) => {
175
+ if (val === "\n") return "";
176
+ const inner = val.trim().split("\n\n").map((line) => line.trim()).filter((line) => line !== "").join("\n\n");
177
+ return inner + (val.endsWith("\n") ? "\n" : "");
178
+ };
179
+ var preventMultipleBlankLines = enforceListTextInput;
180
+
181
+ // src/utils/number.ts
182
+ function randomIntBetween(from, to) {
183
+ return Math.floor(from + Math.random() * (to - from));
184
+ }
185
+
186
+ // src/utils/color.ts
187
+ function rgbToHex(r, g, b) {
188
+ return `#${r.toString(16).padStart(2, "0")}${g.toString(16).padStart(2, "0")}${b.toString(16).padStart(2, "0")}`;
189
+ }
190
+ function hueToRGB(m, n, o) {
191
+ if (o < 0) o += 1;
192
+ if (o > 1) o -= 1;
193
+ if (o < 1 / 6) return m + (n - m) * 6 * o;
194
+ if (o < 1 / 2) return n;
195
+ if (o < 2 / 3) return m + (n - m) * (2 / 3 - o) * 6;
196
+ return m;
197
+ }
198
+ function hslToRgb(H, S, L) {
199
+ const h = H / 360;
200
+ const s = S / 100;
201
+ const l = L / 100;
202
+ const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
203
+ const p = 2 * l - q;
204
+ const r = hueToRGB(p, q, h + 1 / 3);
205
+ const g = hueToRGB(p, q, h);
206
+ const b = hueToRGB(p, q, h - 1 / 3);
207
+ const rd = (a) => Math.floor(Math.max(Math.min(a * 256, 255), 0));
208
+ return [rd(r), rd(g), rd(b)];
209
+ }
210
+ var H_MIN = 50;
211
+ var H_MAX = 300;
212
+ var L_MIN = 90;
213
+ var L_MAX = 95;
214
+ var seedOffset = 50;
215
+ function randomPastelHsl() {
216
+ const h = randomIntBetween(H_MIN, H_MAX);
217
+ const s = 100;
218
+ const l = randomIntBetween(L_MIN, L_MAX);
219
+ return [h, s, l];
220
+ }
221
+ function randomPastelHslString() {
222
+ const [h, s, l] = randomPastelHsl();
223
+ return `hsl(${h}, ${s}%, ${l}%)`;
224
+ }
225
+ function randomPastelRgb() {
226
+ const [h, s, l] = randomPastelHsl();
227
+ return hslToRgb(h, s, l);
228
+ }
229
+ function randomPastelHex() {
230
+ const [r, g, b] = randomPastelRgb();
231
+ return rgbToHex(r, g, b);
232
+ }
233
+ function seededHslH(seed, min = H_MIN, max = H_MAX) {
234
+ if (seed < 0) throw new Error("Seed must be a positive number");
235
+ if (seed === 0) return min + seedOffset;
236
+ const segmentsAtLevel = 2 ** Math.floor(Math.log2(seed));
237
+ const indexWithinLevel = seed - segmentsAtLevel;
238
+ const range = max - min;
239
+ const hueFromMin = (indexWithinLevel + 0.5) * (range / segmentsAtLevel);
240
+ return (hueFromMin + seedOffset) % range + min;
241
+ }
242
+ function seededPastelHsl(seed) {
243
+ const h = seededHslH(seed);
244
+ const s = 100;
245
+ const l = 87;
246
+ return [h, s, l];
247
+ }
248
+ function seededPastelRgb(seed) {
249
+ const [h, s, l] = seededPastelHsl(seed);
250
+ return hslToRgb(h, s, l);
251
+ }
252
+ function seededPastelRgbA(seed, alpha) {
253
+ const [r, g, b] = seededPastelRgb(seed);
254
+ return `rgba(${r}, ${g}, ${b}, ${alpha})`;
255
+ }
256
+ function seededPastelHex(seed) {
257
+ const [r, g, b] = seededPastelRgb(seed);
258
+ return rgbToHex(r, g, b);
259
+ }
260
+ function randomPastelHslDocColors() {
261
+ const [h, s, l] = randomPastelHsl();
262
+ return {
263
+ bgColor: `hsl(${h}, ${s}%, ${l}%)`,
264
+ txtColor: `hsl(${h}, ${s}%, 5%)`,
265
+ primaryColor: `hsl(${h}, ${s}%, 98%)`,
266
+ focusFocus: `hsl(${h}, ${s}%, 95%)`
267
+ };
268
+ }
269
+ var DARK_COLOR = "#000000";
270
+ var LIGHT_COLOR = "#f2f2f2";
271
+ function uuidPastelHsl(uuid) {
272
+ const val = BigInt("0x" + uuid.replace(/-/g, ""));
273
+ const h = val % BigInt(360);
274
+ const s = 100;
275
+ const l = 87;
276
+ return [Number(h), s, l];
277
+ }
278
+ function uuidPastelRgb(uuid) {
279
+ const [h, s, l] = uuidPastelHsl(uuid);
280
+ return hslToRgb(h, s, l);
281
+ }
282
+ function uuidPastelRgbA(uuid, alpha) {
283
+ const [r, g, b] = uuidPastelRgb(uuid);
284
+ return `rgba(${r}, ${g}, ${b}, ${alpha})`;
285
+ }
286
+ function uuidPastelHex(uuid) {
287
+ const [r, g, b] = uuidPastelRgb(uuid);
288
+ return rgbToHex(r, g, b);
289
+ }
290
+ function getTextColor(bgColor) {
291
+ if (bgColor.length !== 7) return DARK_COLOR;
292
+ const color = bgColor.startsWith("#") ? bgColor.substring(1, 7) : bgColor;
293
+ const r = parseInt(color.substring(0, 2), 16);
294
+ const g = parseInt(color.substring(2, 4), 16);
295
+ const b = parseInt(color.substring(4, 6), 16);
296
+ return r * 0.299 + g * 0.587 + b * 0.114 > 186 ? DARK_COLOR : LIGHT_COLOR;
297
+ }
298
+
299
+ // src/utils/stopwatch.ts
300
+ var StopwatchLapped = class {
301
+ name;
302
+ startTime = void 0;
303
+ endTime = void 0;
304
+ _currentLap = 0;
305
+ laps = [];
306
+ log;
307
+ constructor(name = "Stopwatch", log = true) {
308
+ this.name = name;
309
+ this.log = log;
310
+ }
311
+ get elapsed() {
312
+ if (!this.startTime) throw new Error("Stopwatch not running");
313
+ if (this.endTime) return this.endTime - this.startTime;
314
+ return Date.now() - this.startTime;
315
+ }
316
+ get currentLap() {
317
+ return this._currentLap;
318
+ }
319
+ checkStopped() {
320
+ if (this.endTime !== void 0) {
321
+ throw new Error("Stopwatch already stopped. Start a new stopwatch");
322
+ }
323
+ }
324
+ addLap(name, start, absoluteStart) {
325
+ this._currentLap++;
326
+ this.laps[this._currentLap] = {
327
+ name,
328
+ start,
329
+ absoluteStart
330
+ };
331
+ if (this.log) console.log(`${this.name}: Starting ${name}`);
332
+ }
333
+ completeLap(now) {
334
+ if (this.startTime === void 0) throw new Error("Stopwatch not running");
335
+ const currentLap = this.laps[this._currentLap];
336
+ if (!currentLap) throw new Error("No current lap");
337
+ const duration = now - currentLap.absoluteStart;
338
+ const cumulative = now - this.startTime;
339
+ currentLap.absoluteEnd = now;
340
+ currentLap.end = cumulative;
341
+ currentLap.duration = duration;
342
+ if (this.log) {
343
+ console.log(
344
+ `${this.name}: ${currentLap.name} took ${duration}ms, total elapsed = ${cumulative}ms)`
345
+ );
346
+ }
347
+ return cumulative;
348
+ }
349
+ start(firstLapName = "Lap") {
350
+ this.checkStopped();
351
+ if (this.startTime) throw new Error("Stopwatch already running");
352
+ const now = Date.now();
353
+ this.startTime = now;
354
+ this._currentLap = 0;
355
+ if (this.log) console.log(`${this.name}: Starting`);
356
+ this.addLap(firstLapName, 0, now);
357
+ return this;
358
+ }
359
+ lap(newLapName = "Lap") {
360
+ this.checkStopped();
361
+ if (this.startTime === void 0) throw new Error("Stopwatch not running");
362
+ const now = Date.now();
363
+ const cumulative = this.completeLap(now);
364
+ this.addLap(newLapName, cumulative, now);
365
+ return this;
366
+ }
367
+ stop() {
368
+ this.checkStopped();
369
+ if (this.startTime === void 0) throw new Error("Stopwatch not running");
370
+ const now = Date.now();
371
+ const total = now - this.startTime;
372
+ this.completeLap(now);
373
+ this.endTime = now;
374
+ if (this.log) console.log(`${this.name}: Completed in ${total}ms)`);
375
+ return this;
376
+ }
377
+ };
378
+ var Stopwatch = class {
379
+ name;
380
+ startTime;
381
+ constructor(name) {
382
+ this.name = name;
383
+ this.startTime = Date.now();
384
+ }
385
+ stop() {
386
+ const now = Date.now();
387
+ const elapsedTime = now - this.startTime;
388
+ console.log(`${this.name} took ${elapsedTime} ms`);
389
+ this.startTime = now;
390
+ return elapsedTime;
391
+ }
392
+ };
393
+
394
+ // src/utils/geo.ts
395
+ var cities = {
396
+ london: { lat: 51.5074, lng: -0.1278 },
397
+ washingtonDC: { lat: 38.9072, lng: -77.0369 },
398
+ newYorkCity: { lat: 40.7128, lng: -74.006 },
399
+ losAngeles: { lat: 34.0522, lng: -118.2437 },
400
+ tokyo: { lat: 35.6895, lng: 139.6917 },
401
+ paris: { lat: 48.8566, lng: 2.3522 },
402
+ sydney: { lat: -33.8688, lng: 151.2093 },
403
+ saoPaulo: { lat: -23.5505, lng: -46.6333 },
404
+ moscow: { lat: 55.7558, lng: 37.6173 },
405
+ beijing: { lat: 39.9042, lng: 116.4074 },
406
+ buenosAires: { lat: -34.6037, lng: -58.3816 },
407
+ rome: { lat: 41.9028, lng: 12.4964 },
408
+ sanFrancisco: { lat: 37.7749, lng: -122.4194 },
409
+ mexicoCity: { lat: 19.4326, lng: -99.1332 },
410
+ newDelhi: { lat: 28.6139, lng: 77.209 },
411
+ toronto: { lat: 43.6532, lng: -79.3832 },
412
+ berlin: { lat: 52.52, lng: 13.405 },
413
+ shanghai: { lat: 31.2304, lng: 121.4737 },
414
+ bangkok: { lat: 13.7563, lng: 100.5018 },
415
+ rioDeJaneiro: { lat: -22.9068, lng: -43.1729 },
416
+ singapore: { lat: 1.3521, lng: 103.8198 },
417
+ istanbul: { lat: 41.0082, lng: 28.9784 },
418
+ melbourne: { lat: -37.8136, lng: 144.9631 },
419
+ frankfurt: { lat: 50.1109, lng: 8.6821 },
420
+ johannesburg: { lat: -26.2041, lng: 28.0473 },
421
+ madrid: { lat: 40.4168, lng: -3.7038 },
422
+ kualaLumpur: { lat: 3.139, lng: 101.6869 },
423
+ helsinki: { lat: 60.1699, lng: 24.9384 },
424
+ copenhagen: { lat: 55.6761, lng: 12.5683 },
425
+ budapest: { lat: 47.4979, lng: 19.0402 },
426
+ ankara: { lat: 39.9334, lng: 32.8597 },
427
+ cairo: { lat: 30.0444, lng: 31.2357 },
428
+ osaka: { lat: 34.6937, lng: 135.5023 },
429
+ athens: { lat: 37.9838, lng: 23.7275 },
430
+ seoul: { lat: 37.5665, lng: 126.978 },
431
+ jakarta: { lat: -6.2088, lng: 106.8456 },
432
+ dubai: { lat: 25.276987, lng: 55.296249 },
433
+ telAviv: { lat: 32.0853, lng: 34.7818 },
434
+ mumbai: { lat: 19.075983, lng: 72.877655 },
435
+ nairobi: { lat: -1.2921, lng: 36.8219 },
436
+ casablanca: { lat: 33.5731, lng: -7.5898 },
437
+ calgary: { lat: 51.0447, lng: -114.0719 },
438
+ montreal: { lat: 45.5017, lng: -73.5673 },
439
+ zagreb: { lat: 45.815, lng: 15.9819 },
440
+ stockholm: { lat: 59.3293, lng: 18.0686 },
441
+ brasilia: { lat: -15.8267, lng: -47.9218 },
442
+ canberra: { lat: -35.282, lng: 149.1286 },
443
+ amman: { lat: 30.5852, lng: 36.2384 },
444
+ dublin: { lat: 53.3498, lng: -6.2603 },
445
+ phoenix: { lat: 33.4484, lng: -112.074 },
446
+ portLouis: { lat: -20.1609, lng: 57.5012 },
447
+ riyadh: { lat: 24.7136, lng: 46.6753 },
448
+ bucharest: { lat: 44.4268, lng: 26.1025 },
449
+ vancouver: { lat: 49.2827, lng: -123.1207 },
450
+ baghdad: { lat: 33.3128, lng: 44.3615 },
451
+ cancun: { lat: 21.1619, lng: -86.8515 },
452
+ denpasar: { lat: -8.4095, lng: 115.1889 },
453
+ vientiane: { lat: 17.9714, lng: 102.6141 },
454
+ pune: { lat: 18.5204, lng: 73.8567 },
455
+ karachi: { lat: 24.8607, lng: 67.0011 },
456
+ denver: { lat: 39.7392, lng: -104.9903 }
457
+ };
458
+ var randomLat = () => randomIntBetween(-90, 90);
459
+ var randomLng = () => randomIntBetween(-180, 180);
460
+ var randomLatDev = () => randomIntBetween(40, 50);
461
+ var randomLngDev = () => randomIntBetween(-5, 5);
462
+ var randomDevCoordinates = () => ({
463
+ lat: randomLatDev(),
464
+ lng: randomLngDev()
465
+ });
466
+
467
+ export { H_MAX, H_MIN, L_MAX, L_MIN, MapthisError, Stopwatch, StopwatchLapped, addPlacesBaseSchema, addPlacesFromClientAutocompleteSchema, addPlacesFromListSchema, addPlacesFromSourceSchema, addPlacesFromTextSchema, addPlacesFromUrlSchema, capitalizeFirstLetter, cities, coordinates, createBlankMapSchema, createGroupSchema, createMapBase, createMapFromListSchema, createMapFromQueryOrUrlSchema, createMapFromTextSchema, createMapFromUrlSchema, createMapSchema, editGroupSchema, enforceListTextInput, generationSourceType, getMappablePlaceMetas, getTextColor, groupColor, groupDescription, groupName, latitude, llmProvider, longitude, mapCreationQuery, mapDescription, mapExternalId, mapTitle, mappablePlaceMeta, objectMap, placeDescription, placeMeta, placeName, placeProvider, placesFromList, placesFromText, placesFromUrl, positionedPlaceMeta, preventMultipleBlankLines, providerAutocompletePlace, randomDevCoordinates, randomIntBetween, randomLat, randomLatDev, randomLng, randomLngDev, randomPastelHex, randomPastelHsl, randomPastelHslDocColors, randomPastelHslString, randomPastelRgb, reorderMapSchema, searchSchema, seedOffset, seededHslH, seededPastelHex, seededPastelHsl, seededPastelRgb, seededPastelRgbA, updateMapSchema, updatePlaceFormSchema, uuidPastelHex, uuidPastelHsl, uuidPastelRgb, uuidPastelRgbA };
468
+ //# sourceMappingURL=index.js.map
469
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/schemas.ts","../src/types/errors.ts","../src/utils/text.ts","../src/utils/number.ts","../src/utils/color.ts","../src/utils/stopwatch.ts","../src/utils/geo.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { z } from \"zod\"\n\n/**\n * Runtime validation schemas and their inferred types.\n *\n * These schemas define the public contract between producers and consumers of\n * mapthis data. They are intentionally framework-agnostic — no Prisma, no\n * Next.js, no auth assumptions.\n */\n\n// --- Providers & source types ------------------------------------------------\n\nexport const llmProvider = z.literal(\"openai\") // TODO: add other LLM support\nexport type LlmProvider = z.infer<typeof llmProvider>\n\nexport const placeProvider = z.union([z.literal(\"google\"), z.literal(\"locationiq\")])\nexport type PlaceProvider = z.infer<typeof placeProvider>\n\nexport const generationSourceType = z.union([\n z.literal(\"blank\"),\n z.literal(\"autocomplete\"),\n z.literal(\"url\"),\n z.literal(\"text\"),\n z.literal(\"list\"),\n])\nexport type GenerationSourceType = z.infer<typeof generationSourceType>\n\n// --- Geographic primitives ---------------------------------------------------\n\nexport const latitude = z.coerce.number().min(-90, \"Min latitude is -90\").max(90, \"Max latitude is 90\")\nexport const longitude = z.coerce.number().min(-180, \"Min longitude is -180\").max(180, \"Max longitude is 180\")\n\nexport const coordinates = z.object({\n lat: latitude,\n lng: longitude,\n})\nexport type Coordinates = z.infer<typeof coordinates>\n\n// --- Input schemas (freeform sources) ----------------------------------------\n\nexport const placesFromUrl = z.string().url({ message: \"Invalid url\" }).min(6).max(2048)\n\nexport const placesFromList = z\n .preprocess(\n (v) =>\n String(v)\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => !!line)\n .join(\"\\n\"),\n z.string().min(6, \"Must be at least 6 characters\").max(1000, \"List too long\"),\n )\n .refine(\n (v) => !v.split(\"\\n\").find((line) => line.length < 2),\n \"All lines must be at least 2 characters\",\n )\n\nexport const placesFromText = z\n .string()\n .min(6, \"Must be at least 6 characters\")\n .max(2000, \"Over character limit\")\n\n// --- Map field schemas -------------------------------------------------------\n\nexport const mapExternalId = z.string().min(6).max(100)\nexport const mapTitle = z\n .string()\n .min(3, { message: \"Title must be at least 3 characters\" })\n .max(100, { message: \"Title must be at most 100 characters\" })\nexport const mapDescription = z.string().max(1000, { message: \"Limit is 1000 characters\" })\nexport const mapCreationQuery = z\n .string()\n .min(10, \"Minimum 10 characters for search\")\n .max(200, \"Maximum 200 characters\")\n\n// --- Group field schemas -----------------------------------------------------\n\nexport const groupName = z\n .string()\n .min(3, { message: \"Name must be at least 3 characters\" })\n .max(200, { message: \"Name must be at most 200 characters\" })\nexport const groupDescription = z.string().max(400, { message: \"Limit is 400 characters\" })\nexport const groupColor = z.string().startsWith(\"#\").length(7)\n\n// --- Place field schemas -----------------------------------------------------\n\nexport const placeName = z\n .string()\n .min(2, { message: \"Name must be at least 2 characters\" })\n .max(200, { message: \"Name must be at most 200 characters\" })\nexport const placeDescription = z.string().max(400, { message: \"Limit is 400 characters\" })\n\n// --- Map creation composites -------------------------------------------------\n\nexport const createMapBase = z.object({\n title: mapTitle.optional(),\n description: mapDescription.optional(),\n externalId: mapExternalId.optional(),\n})\n\nexport const createMapSchema = createMapBase.extend({\n sourceType: generationSourceType,\n source: z.string().optional(),\n})\n\nexport const createBlankMapSchema = createMapBase\n\nexport const createMapFromUrlSchema = createMapBase.extend({\n url: placesFromUrl,\n})\nexport const createMapFromListSchema = createMapBase.extend({\n list: placesFromList,\n})\nexport const createMapFromTextSchema = createMapBase.extend({\n text: placesFromText,\n})\nexport const createMapFromQueryOrUrlSchema = createMapBase.extend({\n queryOrUrl: z.union([mapCreationQuery, placesFromUrl]),\n})\n\n// --- Adding places -----------------------------------------------------------\n\nexport const addPlacesBaseSchema = z.object({\n sourceType: generationSourceType,\n source: z.string(),\n})\n\nexport const addPlacesFromSourceSchema = addPlacesBaseSchema.extend({\n mapId: z.string(),\n groupId: z.string().optional(),\n})\n\nexport const addPlacesFromUrlSchema = z.object({\n url: placesFromUrl,\n})\nexport const addPlacesFromListSchema = z.object({\n list: placesFromList,\n})\nexport const addPlacesFromTextSchema = z.object({\n text: placesFromText,\n})\n\nexport const providerAutocompletePlace = z.object({\n query: z.string(),\n provider: z.literal(\"google\"),\n providerId: z.string(),\n name: z.string(),\n description: z.string().optional(),\n address: z.string(),\n lat: z.number().min(-90).max(90),\n lng: z.number().min(-180).max(180),\n})\nexport type ProviderAutocompletePlace = z.infer<typeof providerAutocompletePlace>\n\nexport const addPlacesFromClientAutocompleteSchema = providerAutocompletePlace.extend({\n mapId: z.string(),\n groupId: z.string().optional(),\n})\n\n// --- Updates -----------------------------------------------------------------\n\nexport const updateMapSchema = z.object({\n title: mapTitle,\n description: mapDescription.optional(),\n userPublic: z.boolean().optional(),\n partnerPublic: z.boolean().optional(),\n url: z.string().url().nullable().optional(),\n})\n\nexport const reorderMapSchema = z.object({\n groups: z.array(\n z.object({\n id: z.string().uuid().nullable(),\n position: z.number(),\n }),\n ),\n places: z.array(\n z.object({\n id: z.string(),\n groupId: z.string().uuid().nullable(),\n position: z.number(),\n }),\n ),\n})\n\nexport const updatePlaceFormSchema = z.object({\n id: z.string(),\n name: placeName,\n description: placeDescription.optional(),\n hidden: z.boolean(),\n})\n\nexport const searchSchema = z.object({\n query: mapCreationQuery,\n})\n\nexport const createGroupSchema = z.object({\n name: groupName,\n description: groupDescription.optional(),\n parentGroupId: z.string().optional(),\n color: groupColor.optional(),\n})\n\nexport const editGroupSchema = z.object({\n id: z.string().uuid(),\n color: groupColor.nullable(),\n hidden: z.boolean(),\n name: groupName,\n description: groupDescription.optional(),\n})\n\n// --- Place metadata (lightweight projections) --------------------------------\n\nexport const placeMeta = z.object({\n id: z.string(),\n updatedAt: z.coerce.date(),\n groupId: z.string().nullable(),\n position: z.number().nullable(),\n error: z.string().nullable(),\n lat: z.number().nullable(),\n lon: z.number().nullable(),\n name: z.string().nullable(),\n})\nexport type PlaceMeta = z.infer<typeof placeMeta>\n\nexport const positionedPlaceMeta = placeMeta.extend({\n position: z.number(),\n})\nexport type PositionedPlaceMeta = z.infer<typeof positionedPlaceMeta>\n\nexport const mappablePlaceMeta = placeMeta.extend({\n lat: z.number(),\n lon: z.number(),\n error: z.null(),\n})\nexport type MappablePlaceMeta = z.infer<typeof mappablePlaceMeta>\n\n/**\n * Filter a list of place projections down to those that are mappable\n * (have coordinates and no error).\n */\nexport function getMappablePlaceMetas(\n places: (PlaceMeta | null | undefined)[],\n): MappablePlaceMeta[] {\n const good: MappablePlaceMeta[] = []\n for (const p of places) {\n const parsed = mappablePlaceMeta.safeParse(p)\n if (parsed.success) good.push(parsed.data)\n }\n return good\n}\n","/**\n * Base error class for every error thrown by the mapthis package.\n *\n * All feature-specific error classes (scrape, search, ai, geocoding) extend\n * this, so consumers can do `catch (e) { if (e instanceof MapthisError) ... }`\n * to distinguish library errors from other exceptions.\n */\nexport class MapthisError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options)\n this.name = \"MapthisError\"\n }\n}\n","/**\n * Capitalize the first character of a string, passing through null/undefined.\n */\nexport const capitalizeFirstLetter = <T extends string | null | undefined>(s: T): T =>\n (s ? s.charAt(0).toUpperCase() + s.slice(1) : s) as T\n\n/**\n * Map the values of a plain object while preserving keys.\n */\nexport function objectMap<T>(\n obj: Record<string, T>,\n func: (key: string, val: T) => T,\n): Record<string, T> {\n return Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, func(k, v)]))\n}\n\n/**\n * Normalize freeform list input for a textarea that expects one item per line.\n *\n * - Leading newline is swallowed so users cannot start a list with blank lines.\n * - Internal blank lines are collapsed.\n * - A trailing newline is preserved so the user can keep typing the next line.\n */\nexport const enforceListTextInput = (val: string): string => {\n if (val === \"\\n\") return \"\"\n const inner = val\n .trim()\n .split(\"\\n\\n\")\n .map((line) => line.trim())\n .filter((line) => line !== \"\")\n .join(\"\\n\\n\")\n return inner + (val.endsWith(\"\\n\") ? \"\\n\" : \"\")\n}\n\n/**\n * Alias of {@link enforceListTextInput} kept for semantic clarity in call sites.\n */\nexport const preventMultipleBlankLines = enforceListTextInput\n","/**\n * Random integer in the half-open range [from, to).\n */\nexport function randomIntBetween(from: number, to: number): number {\n return Math.floor(from + Math.random() * (to - from))\n}\n","import { randomIntBetween } from \"./number\"\n\n/**\n * Pastel color utilities for coloring map markers, group pills, and seeds\n * derived from UUIDs.\n *\n * All functions are pure and deterministic when given a seed.\n */\n\nfunction rgbToHex(r: number, g: number, b: number): string {\n return `#${r.toString(16).padStart(2, \"0\")}${g.toString(16).padStart(2, \"0\")}${b.toString(16).padStart(2, \"0\")}`\n}\n\nfunction hueToRGB(m: number, n: number, o: number): number {\n if (o < 0) o += 1\n if (o > 1) o -= 1\n if (o < 1 / 6) return m + (n - m) * 6 * o\n if (o < 1 / 2) return n\n if (o < 2 / 3) return m + (n - m) * (2 / 3 - o) * 6\n return m\n}\n\n// HSL to RGB formula adapted from:\n// https://gist.github.com/mjackson/5311256\n// https://codepen.io/pliu/pen/BLEKwr\nfunction hslToRgb(H: number, S: number, L: number): [number, number, number] {\n const h = H / 360\n const s = S / 100\n const l = L / 100\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s\n const p = 2 * l - q\n\n const r = hueToRGB(p, q, h + 1 / 3)\n const g = hueToRGB(p, q, h)\n const b = hueToRGB(p, q, h - 1 / 3)\n\n const rd = (a: number) => Math.floor(Math.max(Math.min(a * 256, 255), 0))\n\n return [rd(r), rd(g), rd(b)]\n}\n\nexport const H_MIN = 50 // 0-360\nexport const H_MAX = 300 // 0-360\nexport const L_MIN = 90 // 75-95\nexport const L_MAX = 95 // 75-95\nexport const seedOffset = 50\n\nexport function randomPastelHsl(): [number, number, number] {\n const h = randomIntBetween(H_MIN, H_MAX)\n const s = 100\n const l = randomIntBetween(L_MIN, L_MAX)\n return [h, s, l]\n}\n\nexport function randomPastelHslString(): string {\n const [h, s, l] = randomPastelHsl()\n return `hsl(${h}, ${s}%, ${l}%)`\n}\n\nexport function randomPastelRgb(): [number, number, number] {\n const [h, s, l] = randomPastelHsl()\n return hslToRgb(h, s, l)\n}\n\nexport function randomPastelHex(): string {\n const [r, g, b] = randomPastelRgb()\n return rgbToHex(r, g, b)\n}\n\n/**\n * Deterministically map a non-negative integer seed to a hue in [min, max).\n *\n * The algorithm uses a base-2 level decomposition so that successive seeds\n * (0, 1, 2, 3, ...) stay maximally spaced within the hue range.\n */\nexport function seededHslH(seed: number, min: number = H_MIN, max: number = H_MAX): number {\n if (seed < 0) throw new Error(\"Seed must be a positive number\")\n\n if (seed === 0) return min + seedOffset\n\n const segmentsAtLevel = 2 ** Math.floor(Math.log2(seed))\n const indexWithinLevel = seed - segmentsAtLevel\n const range = max - min\n\n const hueFromMin = (indexWithinLevel + 0.5) * (range / segmentsAtLevel)\n return ((hueFromMin + seedOffset) % range) + min\n}\n\nexport function seededPastelHsl(seed: number): [number, number, number] {\n const h = seededHslH(seed)\n const s = 100\n const l = 87\n return [h, s, l]\n}\n\nexport function seededPastelRgb(seed: number): [number, number, number] {\n const [h, s, l] = seededPastelHsl(seed)\n return hslToRgb(h, s, l)\n}\n\nexport function seededPastelRgbA(seed: number, alpha: number): string {\n const [r, g, b] = seededPastelRgb(seed)\n return `rgba(${r}, ${g}, ${b}, ${alpha})`\n}\n\nexport function seededPastelHex(seed: number): string {\n const [r, g, b] = seededPastelRgb(seed)\n return rgbToHex(r, g, b)\n}\n\nexport interface PastelDocColors {\n bgColor: string\n txtColor: string\n primaryColor: string\n focusFocus: string\n}\n\nexport function randomPastelHslDocColors(): PastelDocColors {\n const [h, s, l] = randomPastelHsl()\n return {\n bgColor: `hsl(${h}, ${s}%, ${l}%)`,\n txtColor: `hsl(${h}, ${s}%, 5%)`,\n primaryColor: `hsl(${h}, ${s}%, 98%)`,\n focusFocus: `hsl(${h}, ${s}%, 95%)`,\n }\n}\n\nconst DARK_COLOR = \"#000000\"\nconst LIGHT_COLOR = \"#f2f2f2\"\n\n/**\n * Deterministic pastel hue derived from a UUID by interpreting its hex as a\n * big integer mod 360.\n */\nexport function uuidPastelHsl(uuid: string): [number, number, number] {\n const val = BigInt(\"0x\" + uuid.replace(/-/g, \"\"))\n const h = val % BigInt(360)\n const s = 100\n const l = 87\n return [Number(h), s, l]\n}\n\nexport function uuidPastelRgb(uuid: string): [number, number, number] {\n const [h, s, l] = uuidPastelHsl(uuid)\n return hslToRgb(h, s, l)\n}\n\nexport function uuidPastelRgbA(uuid: string, alpha: number): string {\n const [r, g, b] = uuidPastelRgb(uuid)\n return `rgba(${r}, ${g}, ${b}, ${alpha})`\n}\n\nexport function uuidPastelHex(uuid: string): string {\n const [r, g, b] = uuidPastelRgb(uuid)\n return rgbToHex(r, g, b)\n}\n\n/**\n * Choose a readable text color (dark or light) for a given hex background,\n * using the standard ITU-R BT.601 luminance coefficients.\n */\nexport function getTextColor(bgColor: string): string {\n if (bgColor.length !== 7) return DARK_COLOR\n const color = bgColor.startsWith(\"#\") ? bgColor.substring(1, 7) : bgColor\n const r = parseInt(color.substring(0, 2), 16)\n const g = parseInt(color.substring(2, 4), 16)\n const b = parseInt(color.substring(4, 6), 16)\n return r * 0.299 + g * 0.587 + b * 0.114 > 186 ? DARK_COLOR : LIGHT_COLOR\n}\n","interface Lap {\n name?: string\n start: number\n end?: number\n absoluteStart: number\n absoluteEnd?: number\n duration?: number\n}\n\n/**\n * Stopwatch that supports named laps. Useful for instrumenting multi-stage\n * pipelines (e.g. URL fetch → summarize → LLM parse → geocode).\n */\nexport class StopwatchLapped {\n private name: string\n private startTime: number | undefined = undefined\n private endTime: number | undefined = undefined\n private _currentLap = 0\n private laps: Lap[] = []\n log: boolean\n\n constructor(name = \"Stopwatch\", log = true) {\n this.name = name\n this.log = log\n }\n\n get elapsed(): number {\n if (!this.startTime) throw new Error(\"Stopwatch not running\")\n if (this.endTime) return this.endTime - this.startTime\n return Date.now() - this.startTime\n }\n\n get currentLap(): number {\n return this._currentLap\n }\n\n private checkStopped(): void {\n if (this.endTime !== undefined) {\n throw new Error(\"Stopwatch already stopped. Start a new stopwatch\")\n }\n }\n\n private addLap(name: string, start: number, absoluteStart: number): void {\n this._currentLap++\n this.laps[this._currentLap] = {\n name,\n start,\n absoluteStart,\n }\n\n if (this.log) console.log(`${this.name}:\\tStarting ${name}`)\n }\n\n private completeLap(now: number): number {\n if (this.startTime === undefined) throw new Error(\"Stopwatch not running\")\n\n const currentLap = this.laps[this._currentLap]\n if (!currentLap) throw new Error(\"No current lap\")\n\n const duration = now - currentLap.absoluteStart\n const cumulative = now - this.startTime\n\n currentLap.absoluteEnd = now\n currentLap.end = cumulative\n currentLap.duration = duration\n\n if (this.log) {\n console.log(\n `${this.name}:\\t${currentLap.name} took ${duration}ms, total elapsed = ${cumulative}ms)`,\n )\n }\n\n return cumulative\n }\n\n start(firstLapName = \"Lap\"): this {\n this.checkStopped()\n if (this.startTime) throw new Error(\"Stopwatch already running\")\n\n const now = Date.now()\n this.startTime = now\n this._currentLap = 0\n\n if (this.log) console.log(`${this.name}: Starting`)\n\n this.addLap(firstLapName, 0, now)\n return this\n }\n\n lap(newLapName = \"Lap\"): this {\n this.checkStopped()\n if (this.startTime === undefined) throw new Error(\"Stopwatch not running\")\n\n const now = Date.now()\n const cumulative = this.completeLap(now)\n\n this.addLap(newLapName, cumulative, now)\n return this\n }\n\n stop(): this {\n this.checkStopped()\n if (this.startTime === undefined) throw new Error(\"Stopwatch not running\")\n\n const now = Date.now()\n const total = now - this.startTime\n\n this.completeLap(now)\n this.endTime = now\n\n if (this.log) console.log(`${this.name}: Completed in ${total}ms)`)\n\n return this\n }\n}\n\n/**\n * Minimal stopwatch for quick one-shot timing.\n */\nexport class Stopwatch {\n private name: string\n private startTime: number\n\n constructor(name: string) {\n this.name = name\n this.startTime = Date.now()\n }\n\n stop(): number {\n const now = Date.now()\n const elapsedTime = now - this.startTime\n console.log(`${this.name} took ${elapsedTime} ms`)\n this.startTime = now\n return elapsedTime\n }\n}\n","import type { Coordinates } from \"../types/schemas\"\nimport { randomIntBetween } from \"./number\"\n\n/**\n * Known lat/lng for major cities. Useful as default map centers, test\n * fixtures, and fallback coordinates.\n */\nexport const cities = {\n london: { lat: 51.5074, lng: -0.1278 },\n washingtonDC: { lat: 38.9072, lng: -77.0369 },\n newYorkCity: { lat: 40.7128, lng: -74.006 },\n losAngeles: { lat: 34.0522, lng: -118.2437 },\n tokyo: { lat: 35.6895, lng: 139.6917 },\n paris: { lat: 48.8566, lng: 2.3522 },\n sydney: { lat: -33.8688, lng: 151.2093 },\n saoPaulo: { lat: -23.5505, lng: -46.6333 },\n moscow: { lat: 55.7558, lng: 37.6173 },\n beijing: { lat: 39.9042, lng: 116.4074 },\n buenosAires: { lat: -34.6037, lng: -58.3816 },\n rome: { lat: 41.9028, lng: 12.4964 },\n sanFrancisco: { lat: 37.7749, lng: -122.4194 },\n mexicoCity: { lat: 19.4326, lng: -99.1332 },\n newDelhi: { lat: 28.6139, lng: 77.209 },\n toronto: { lat: 43.6532, lng: -79.3832 },\n berlin: { lat: 52.52, lng: 13.405 },\n shanghai: { lat: 31.2304, lng: 121.4737 },\n bangkok: { lat: 13.7563, lng: 100.5018 },\n rioDeJaneiro: { lat: -22.9068, lng: -43.1729 },\n singapore: { lat: 1.3521, lng: 103.8198 },\n istanbul: { lat: 41.0082, lng: 28.9784 },\n melbourne: { lat: -37.8136, lng: 144.9631 },\n frankfurt: { lat: 50.1109, lng: 8.6821 },\n johannesburg: { lat: -26.2041, lng: 28.0473 },\n madrid: { lat: 40.4168, lng: -3.7038 },\n kualaLumpur: { lat: 3.139, lng: 101.6869 },\n helsinki: { lat: 60.1699, lng: 24.9384 },\n copenhagen: { lat: 55.6761, lng: 12.5683 },\n budapest: { lat: 47.4979, lng: 19.0402 },\n ankara: { lat: 39.9334, lng: 32.8597 },\n cairo: { lat: 30.0444, lng: 31.2357 },\n osaka: { lat: 34.6937, lng: 135.5023 },\n athens: { lat: 37.9838, lng: 23.7275 },\n seoul: { lat: 37.5665, lng: 126.978 },\n jakarta: { lat: -6.2088, lng: 106.8456 },\n dubai: { lat: 25.276987, lng: 55.296249 },\n telAviv: { lat: 32.0853, lng: 34.7818 },\n mumbai: { lat: 19.075983, lng: 72.877655 },\n nairobi: { lat: -1.2921, lng: 36.8219 },\n casablanca: { lat: 33.5731, lng: -7.5898 },\n calgary: { lat: 51.0447, lng: -114.0719 },\n montreal: { lat: 45.5017, lng: -73.5673 },\n zagreb: { lat: 45.815, lng: 15.9819 },\n stockholm: { lat: 59.3293, lng: 18.0686 },\n brasilia: { lat: -15.8267, lng: -47.9218 },\n canberra: { lat: -35.282, lng: 149.1286 },\n amman: { lat: 30.5852, lng: 36.2384 },\n dublin: { lat: 53.3498, lng: -6.2603 },\n phoenix: { lat: 33.4484, lng: -112.074 },\n portLouis: { lat: -20.1609, lng: 57.5012 },\n riyadh: { lat: 24.7136, lng: 46.6753 },\n bucharest: { lat: 44.4268, lng: 26.1025 },\n vancouver: { lat: 49.2827, lng: -123.1207 },\n baghdad: { lat: 33.3128, lng: 44.3615 },\n cancun: { lat: 21.1619, lng: -86.8515 },\n denpasar: { lat: -8.4095, lng: 115.1889 },\n vientiane: { lat: 17.9714, lng: 102.6141 },\n pune: { lat: 18.5204, lng: 73.8567 },\n karachi: { lat: 24.8607, lng: 67.0011 },\n denver: { lat: 39.7392, lng: -104.9903 },\n} as const satisfies Record<string, Coordinates>\n\nexport type KnownCity = keyof typeof cities\n\nexport const randomLat = (): number => randomIntBetween(-90, 90)\nexport const randomLng = (): number => randomIntBetween(-180, 180)\n\n/**\n * Development-friendly coordinates (centered over central Europe) so seeded\n * data never lands in the ocean during local testing.\n */\nexport const randomLatDev = (): number => randomIntBetween(40, 50)\nexport const randomLngDev = (): number => randomIntBetween(-5, 5)\n\nexport const randomDevCoordinates = (): Coordinates => ({\n lat: randomLatDev(),\n lng: randomLngDev(),\n})\n"]}
@@ -0,0 +1,111 @@
1
+ import { JSONSchema7Object } from 'json-schema';
2
+ import { a as ParsedLocations } from './domain-Dc1wSTkf.cjs';
3
+
4
+ /**
5
+ * Generic LLM output envelope with token accounting.
6
+ */
7
+ interface OpenAIOutput<T> {
8
+ output: T;
9
+ inputTokens: number;
10
+ outputTokens: number;
11
+ }
12
+ /**
13
+ * Request shape for a function-calling JSON completion.
14
+ */
15
+ interface GenericAIJsonRequest {
16
+ schema: JSONSchema7Object;
17
+ systemMessage: string;
18
+ userMessage: string;
19
+ functionName: string;
20
+ }
21
+ /**
22
+ * Result of summarizing a text blob prior to a final extraction call.
23
+ */
24
+ interface SummarizedText {
25
+ text: string;
26
+ textTokens: number;
27
+ summarized: string;
28
+ summarizedTokens: number;
29
+ chunks: number;
30
+ inputTokens: number;
31
+ outputTokens: number;
32
+ summarizePromptVersion: string;
33
+ }
34
+ /**
35
+ * Result of parsing locations from any source. Includes full token
36
+ * accounting so callers can bill usage to their own users.
37
+ */
38
+ interface GetLocationsResponse {
39
+ output: ParsedLocations;
40
+ textTokens: number;
41
+ summarizedTokens: number;
42
+ summaryInputTokens: number;
43
+ summaryOutputTokens: number;
44
+ locationInputTokens: number;
45
+ locationOutputTokens: number;
46
+ inputTokens: number;
47
+ outputTokens: number;
48
+ summaryPromptVersion: string;
49
+ locationPromptVersion: string;
50
+ }
51
+
52
+ declare const DEFAULT_MODEL = "gpt-4o-mini";
53
+ declare const DEFAULT_TOKEN_LIMIT = 128000;
54
+ /**
55
+ * An OpenAI-backed inference context shared by the summarizer and location
56
+ * parser. Instances are produced by {@link createOpenAiBackend} so API keys
57
+ * and model choices live in the consumer's code, never in module-level state.
58
+ */
59
+ interface OpenAiBackend {
60
+ readonly model: string;
61
+ readonly tokenLimit: number;
62
+ countTokens(text: string): number;
63
+ chatCompletion(content: string): Promise<OpenAIOutput<string>>;
64
+ chatFunctionJson<T>(systemMessage: string, userMessage: string, schema: JSONSchema7Object, functionName: string): Promise<OpenAIOutput<T>>;
65
+ }
66
+ interface OpenAiBackendConfig {
67
+ /** OpenAI API key. Passed directly to the SDK. */
68
+ apiKey: string;
69
+ /** Model name passed to the completions API. Defaults to `gpt-4o-mini`. */
70
+ model?: string;
71
+ /** Context-window budget used by the summarizer. Defaults to 128k. */
72
+ tokenLimit?: number;
73
+ /**
74
+ * Optional base URL for the OpenAI API. Use this to route through an
75
+ * OpenAI-compatible gateway (Azure, Together, etc.).
76
+ */
77
+ baseURL?: string;
78
+ }
79
+ /**
80
+ * Construct an {@link OpenAiBackend} bound to a specific API key and model.
81
+ */
82
+ declare function createOpenAiBackend(config: OpenAiBackendConfig): OpenAiBackend;
83
+
84
+ /**
85
+ * A configured location-extraction pipeline. Hold onto one of these for the
86
+ * lifetime of your app — it wraps an OpenAI client and a tiktoken encoder.
87
+ */
88
+ interface LocationParser {
89
+ parseLocationsFromText(text: string): Promise<GetLocationsResponse>;
90
+ parseLocationsFromHtml(html: string): Promise<GetLocationsResponse>;
91
+ parseLocationsFromUrl(url: string): Promise<GetLocationsResponse>;
92
+ }
93
+ type LocationParserConfig = OpenAiBackendConfig;
94
+ /**
95
+ * Create a {@link LocationParser} bound to an OpenAI API key.
96
+ *
97
+ * @example
98
+ * ```ts
99
+ * const parser = createLocationParser({
100
+ * apiKey: process.env.OPENAI_API_KEY!,
101
+ * model: "gpt-4o-mini",
102
+ * })
103
+ * const { output } = await parser.parseLocationsFromUrl(
104
+ * "https://example.com/best-restaurants-tokyo",
105
+ * )
106
+ * console.log(output.title, output.locations)
107
+ * ```
108
+ */
109
+ declare function createLocationParser(config: LocationParserConfig): LocationParser;
110
+
111
+ export { DEFAULT_MODEL as D, type GetLocationsResponse as G, type LocationParser as L, type OpenAiBackend as O, type SummarizedText as S, DEFAULT_TOKEN_LIMIT as a, type GenericAIJsonRequest as b, type LocationParserConfig as c, type OpenAIOutput as d, type OpenAiBackendConfig as e, createLocationParser as f, createOpenAiBackend as g };