@dromney/mapthis 0.1.0 → 0.2.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 (42) hide show
  1. package/README.md +108 -27
  2. package/dist/ai/index.cjs +105 -1
  3. package/dist/ai/index.cjs.map +1 -1
  4. package/dist/ai/index.d.cts +9 -9
  5. package/dist/ai/index.d.ts +9 -9
  6. package/dist/ai/index.js +101 -2
  7. package/dist/ai/index.js.map +1 -1
  8. package/dist/{domain-Dc1wSTkf.d.cts → domain-CL4ro2YW.d.cts} +1 -1
  9. package/dist/{domain-CZ-L-ntu.d.ts → domain-Dh8cPBVp.d.ts} +1 -1
  10. package/dist/generate/index.cjs +1 -1
  11. package/dist/generate/index.cjs.map +1 -1
  12. package/dist/generate/index.d.cts +4 -4
  13. package/dist/generate/index.d.ts +4 -4
  14. package/dist/generate/index.js +1 -1
  15. package/dist/generate/index.js.map +1 -1
  16. package/dist/geocoding/index.d.cts +3 -3
  17. package/dist/geocoding/index.d.ts +3 -3
  18. package/dist/index.cjs +1 -1
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.d.cts +2 -2
  21. package/dist/index.d.ts +2 -2
  22. package/dist/index.js +1 -1
  23. package/dist/index.js.map +1 -1
  24. package/dist/parser-CrG1A6dD.d.ts +176 -0
  25. package/dist/parser-DsIwIsHK.d.cts +176 -0
  26. package/dist/react/index.d.cts +197 -0
  27. package/dist/react/index.d.ts +197 -0
  28. package/dist/{schemas-Dy5coqXo.d.cts → schemas-CZao45EU.d.cts} +1 -1
  29. package/dist/{schemas-Dy5coqXo.d.ts → schemas-CZao45EU.d.ts} +1 -1
  30. package/dist/types/index.cjs +1 -1
  31. package/dist/types/index.cjs.map +1 -1
  32. package/dist/types/index.d.cts +2 -2
  33. package/dist/types/index.d.ts +2 -2
  34. package/dist/types/index.js +1 -1
  35. package/dist/types/index.js.map +1 -1
  36. package/dist/{types-BhqKlq0k.d.ts → types-BhPqZwOj.d.ts} +2 -2
  37. package/dist/{types-rFjK5YcJ.d.cts → types-C-xqh9Sh.d.cts} +2 -2
  38. package/dist/utils/index.d.cts +1 -1
  39. package/dist/utils/index.d.ts +1 -1
  40. package/package.json +10 -6
  41. package/dist/parser-CzXzpmVv.d.cts +0 -111
  42. package/dist/parser-N7-fNxeu.d.ts +0 -111
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types/schemas.ts","../../src/generate/generator.ts"],"names":[],"mappings":";;;AAY2B,CAAA,CAAE,OAAA,CAAQ,QAAQ;AAGhB,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,YAAY,CAAC,CAAC;AAG5E,IAAM,oBAAA,GAAuB,EAAE,KAAA,CAAM;AAAA,EACxC,CAAA,CAAE,QAAQ,OAAO,CAAA;AAAA,EACjB,CAAA,CAAE,QAAQ,cAAc,CAAA;AAAA,EACxB,CAAA,CAAE,QAAQ,KAAK,CAAA;AAAA,EACf,CAAA,CAAE,QAAQ,MAAM,CAAA;AAAA,EAChB,CAAA,CAAE,QAAQ,MAAM;AACpB,CAAC,CAAA;AAKM,IAAM,QAAA,GAAW,CAAA,CAAE,MAAA,CAAO,MAAA,EAAO,CAAE,GAAA,CAAI,GAAA,EAAK,qBAAqB,CAAA,CAAE,GAAA,CAAI,EAAA,EAAI,oBAAoB,CAAA;AAC/F,IAAM,SAAA,GAAY,CAAA,CAAE,MAAA,CAAO,MAAA,EAAO,CAAE,GAAA,CAAI,IAAA,EAAM,uBAAuB,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,sBAAsB,CAAA;AAElF,EAAE,MAAA,CAAO;AAAA,EAChC,GAAA,EAAK,QAAA;AAAA,EACL,GAAA,EAAK;AACT,CAAC;AAKM,IAAM,aAAA,GAAgB,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,EAAE,OAAA,EAAS,aAAA,EAAe,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,IAAI,IAAI,CAAA;AAEhF,IAAM,iBAAiB,CAAA,CACzB,UAAA;AAAA,EACG,CAAC,MACG,MAAA,CAAO,CAAC,EACH,KAAA,CAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,IAAA,EAAM,CAAA,CACzB,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,CAAC,IAAI,CAAA,CACvB,IAAA,CAAK,IAAI,CAAA;AAAA,EAClB,CAAA,CAAE,QAAO,CAAE,GAAA,CAAI,GAAG,+BAA+B,CAAA,CAAE,GAAA,CAAI,GAAA,EAAM,eAAe;AAChF,CAAA,CACC,MAAA;AAAA,EACG,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,KAAA,CAAM,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AAAA,EACpD;AACJ,CAAA;AAEG,IAAM,cAAA,GAAiB,CAAA,CACzB,MAAA,EAAO,CACP,GAAA,CAAI,GAAG,+BAA+B,CAAA,CACtC,GAAA,CAAI,GAAA,EAAM,sBAAsB,CAAA;AAI9B,IAAM,aAAA,GAAgB,EAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,GAAG,CAAA;AAC/C,IAAM,WAAW,CAAA,CACnB,MAAA,EAAO,CACP,GAAA,CAAI,GAAG,EAAE,OAAA,EAAS,qCAAA,EAAuC,EACzD,GAAA,CAAI,GAAA,EAAK,EAAE,OAAA,EAAS,wCAAwC,CAAA;AAC1D,IAAM,cAAA,GAAiB,EAAE,MAAA,EAAO,CAAE,IAAI,GAAA,EAAM,EAAE,OAAA,EAAS,0BAAA,EAA4B,CAAA;AACnF,IAAM,gBAAA,GAAmB,CAAA,CAC3B,MAAA,EAAO,CACP,GAAA,CAAI,IAAI,kCAAkC,CAAA,CAC1C,GAAA,CAAI,GAAA,EAAK,wBAAwB,CAAA;AAI/B,IAAM,YAAY,CAAA,CACpB,MAAA,EAAO,CACP,GAAA,CAAI,GAAG,EAAE,OAAA,EAAS,oCAAA,EAAsC,EACxD,GAAA,CAAI,GAAA,EAAK,EAAE,OAAA,EAAS,uCAAuC,CAAA;AACzD,IAAM,gBAAA,GAAmB,EAAE,MAAA,EAAO,CAAE,IAAI,GAAA,EAAK,EAAE,OAAA,EAAS,yBAAA,EAA2B,CAAA;AACnF,IAAM,UAAA,GAAa,EAAE,MAAA,EAAO,CAAE,WAAW,GAAG,CAAA,CAAE,OAAO,CAAC,CAAA;AAItD,IAAM,YAAY,CAAA,CACpB,MAAA,EAAO,CACP,GAAA,CAAI,GAAG,EAAE,OAAA,EAAS,oCAAA,EAAsC,EACxD,GAAA,CAAI,GAAA,EAAK,EAAE,OAAA,EAAS,uCAAuC,CAAA;AACzD,IAAM,gBAAA,GAAmB,EAAE,MAAA,EAAO,CAAE,IAAI,GAAA,EAAK,EAAE,OAAA,EAAS,yBAAA,EAA2B,CAAA;AAInF,IAAM,aAAA,GAAgB,EAAE,MAAA,CAAO;AAAA,EAClC,KAAA,EAAO,SAAS,QAAA,EAAS;AAAA,EACzB,WAAA,EAAa,eAAe,QAAA,EAAS;AAAA,EACrC,UAAA,EAAY,cAAc,QAAA;AAC9B,CAAC,CAAA;AAE8B,cAAc,MAAA,CAAO;AAAA,EAChD,UAAA,EAAY,oBAAA;AAAA,EACZ,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACvB,CAAC;AAIqC,cAAc,MAAA,CAAO;AAAA,EACvD,GAAA,EAAK;AACT,CAAC;AACsC,cAAc,MAAA,CAAO;AAAA,EACxD,IAAA,EAAM;AACV,CAAC;AACsC,cAAc,MAAA,CAAO;AAAA,EACxD,IAAA,EAAM;AACV,CAAC;AAC4C,cAAc,MAAA,CAAO;AAAA,EAC9D,YAAY,CAAA,CAAE,KAAA,CAAM,CAAC,gBAAA,EAAkB,aAAa,CAAC;AACzD,CAAC;AAIM,IAAM,mBAAA,GAAsB,EAAE,MAAA,CAAO;AAAA,EACxC,UAAA,EAAY,oBAAA;AAAA,EACZ,MAAA,EAAQ,EAAE,MAAA;AACd,CAAC,CAAA;AAEwC,oBAAoB,MAAA,CAAO;AAAA,EAChE,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,EAChB,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACxB,CAAC;AAEqC,EAAE,MAAA,CAAO;AAAA,EAC3C,GAAA,EAAK;AACT,CAAC;AACsC,EAAE,MAAA,CAAO;AAAA,EAC5C,IAAA,EAAM;AACV,CAAC;AACsC,EAAE,MAAA,CAAO;AAAA,EAC5C,IAAA,EAAM;AACV,CAAC;AAEM,IAAM,yBAAA,GAA4B,EAAE,MAAA,CAAO;AAAA,EAC9C,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,EAChB,QAAA,EAAU,CAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAAA,EAC5B,UAAA,EAAY,EAAE,MAAA,EAAO;AAAA,EACrB,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,EACf,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,OAAA,EAAS,EAAE,MAAA,EAAO;AAAA,EAClB,GAAA,EAAK,EAAE,MAAA,EAAO,CAAE,IAAI,GAAG,CAAA,CAAE,IAAI,EAAE,CAAA;AAAA,EAC/B,GAAA,EAAK,EAAE,MAAA,EAAO,CAAE,IAAI,IAAI,CAAA,CAAE,IAAI,GAAG;AACrC,CAAC,CAAA;AAGoD,0BAA0B,MAAA,CAAO;AAAA,EAClF,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,EAChB,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACxB,CAAC;AAI8B,EAAE,MAAA,CAAO;AAAA,EACpC,KAAA,EAAO,QAAA;AAAA,EACP,WAAA,EAAa,eAAe,QAAA,EAAS;AAAA,EACrC,UAAA,EAAY,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EACjC,aAAA,EAAe,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EACpC,GAAA,EAAK,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,GAAW,QAAA;AACrC,CAAC;AAE+B,EAAE,MAAA,CAAO;AAAA,EACrC,QAAQ,CAAA,CAAE,KAAA;AAAA,IACN,EAAE,MAAA,CAAO;AAAA,MACL,IAAI,CAAA,CAAE,MAAA,EAAO,CAAE,IAAA,GAAO,QAAA,EAAS;AAAA,MAC/B,QAAA,EAAU,EAAE,MAAA;AAAO,KACtB;AAAA,GACL;AAAA,EACA,QAAQ,CAAA,CAAE,KAAA;AAAA,IACN,EAAE,MAAA,CAAO;AAAA,MACL,EAAA,EAAI,EAAE,MAAA,EAAO;AAAA,MACb,SAAS,CAAA,CAAE,MAAA,EAAO,CAAE,IAAA,GAAO,QAAA,EAAS;AAAA,MACpC,QAAA,EAAU,EAAE,MAAA;AAAO,KACtB;AAAA;AAET,CAAC;AAEoC,EAAE,MAAA,CAAO;AAAA,EAC1C,EAAA,EAAI,EAAE,MAAA,EAAO;AAAA,EACb,IAAA,EAAM,SAAA;AAAA,EACN,WAAA,EAAa,iBAAiB,QAAA,EAAS;AAAA,EACvC,MAAA,EAAQ,EAAE,OAAA;AACd,CAAC;AAE2B,EAAE,MAAA,CAAO;AAAA,EACjC,KAAA,EAAO;AACX,CAAC;AAEgC,EAAE,MAAA,CAAO;AAAA,EACtC,IAAA,EAAM,SAAA;AAAA,EACN,WAAA,EAAa,iBAAiB,QAAA,EAAS;AAAA,EACvC,aAAA,EAAe,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACnC,KAAA,EAAO,WAAW,QAAA;AACtB,CAAC;AAE8B,EAAE,MAAA,CAAO;AAAA,EACpC,EAAA,EAAI,CAAA,CAAE,MAAA,EAAO,CAAE,IAAA,EAAK;AAAA,EACpB,KAAA,EAAO,WAAW,QAAA,EAAS;AAAA,EAC3B,MAAA,EAAQ,EAAE,OAAA,EAAQ;AAAA,EAClB,IAAA,EAAM,SAAA;AAAA,EACN,WAAA,EAAa,iBAAiB,QAAA;AAClC,CAAC;AAIM,IAAM,SAAA,GAAY,EAAE,MAAA,CAAO;AAAA,EAC9B,EAAA,EAAI,EAAE,MAAA,EAAO;AAAA,EACb,SAAA,EAAW,CAAA,CAAE,MAAA,CAAO,IAAA,EAAK;AAAA,EACzB,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC3B,GAAA,EAAK,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACzB,GAAA,EAAK,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACzB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACrB,CAAC,CAAA;AAGkC,UAAU,MAAA,CAAO;AAAA,EAChD,QAAA,EAAU,EAAE,MAAA;AAChB,CAAC;AAGgC,UAAU,MAAA,CAAO;AAAA,EAC9C,GAAA,EAAK,EAAE,MAAA,EAAO;AAAA,EACd,GAAA,EAAK,EAAE,MAAA,EAAO;AAAA,EACd,KAAA,EAAO,EAAE,IAAA;AACb,CAAC;;;AC3ND,IAAM,cAAA,GAA0E;AAAA,EAC5E,GAAA,EAAK,eAAA;AAAA,EACL,IAAA,EAAM,eAAA;AAAA,EACN,IAAA,EAAM;AACV,CAAA;AAEA,SAAS,QAAQ,CAAA,EAAmC;AAChD,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,GAAG,MAAK,GAAI,CAAA;AACrC,EAAA,OAAO,IAAA;AACX;AA+CO,SAAS,mBAAmB,MAAA,EAA0C;AACzE,EAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAS,GAAI,MAAA;AAE7B,EAAA,OAAO;AAAA,IACH,MAAM,mBACF,OAAA,EACiC;AACjC,MAAA,IAAI,aAA+B,EAAC;AACpC,MAAA,IAAI,KAAA,GAAgB,cAAA,CAAe,OAAA,CAAQ,UAAU,CAAA;AACrD,MAAA,IAAI,KAAA,GAA8B,MAAA;AAClC,MAAA,IAAI,qBAAA,GAA4C,MAAA;AAChD,MAAA,IAAI,oBAAA,GAA2C,MAAA;AAE/C,MAAA,QAAQ,QAAQ,UAAA;AAAY,QACxB,KAAK,KAAA,EAAO;AACR,UAAA,MAAM,GAAA,GAAM,aAAA,CAAc,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AAC9C,UAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,qBAAA,CAAsB,GAAG,CAAA;AAClD,UAAA,UAAA,GAAa,IAAI,MAAA,CAAO,SAAA;AACxB,UAAA,IAAI,GAAA,CAAI,MAAA,CAAO,KAAA,EAAO,KAAA,GAAQ,IAAI,MAAA,CAAO,KAAA;AACzC,UAAA,qBAAA,GAAwB,GAAA,CAAI,qBAAA;AAC5B,UAAA,oBAAA,GAAuB,GAAA,CAAI,oBAAA;AAC3B,UAAA,KAAA,GAAQ,QAAQ,GAAG,CAAA;AACnB,UAAA;AAAA,QACJ;AAAA,QACA,KAAK,MAAA,EAAQ;AACT,UAAA,MAAM,IAAA,GAAO,cAAA,CAAe,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AAChD,UAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,sBAAA,CAAuB,IAAI,CAAA;AACpD,UAAA,UAAA,GAAa,IAAI,MAAA,CAAO,SAAA;AACxB,UAAA,IAAI,GAAA,CAAI,MAAA,CAAO,KAAA,EAAO,KAAA,GAAQ,IAAI,MAAA,CAAO,KAAA;AACzC,UAAA,qBAAA,GAAwB,GAAA,CAAI,qBAAA;AAC5B,UAAA,oBAAA,GAAuB,GAAA,CAAI,oBAAA;AAC3B,UAAA,KAAA,GAAQ,QAAQ,GAAG,CAAA;AACnB,UAAA;AAAA,QACJ;AAAA,QACA,KAAK,MAAA,EAAQ;AACT,UAAA,MAAM,IAAA,GAAO,cAAA,CAAe,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AAChD,UAAA,UAAA,GAAa,IAAA,CACR,IAAA,EAAK,CACL,KAAA,CAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAC,IAAA,MAAU,EAAE,OAAA,EAAS,IAAA,EAAM,WAAA,EAAa,IAAG,CAAE,CAAA;AACvD,UAAA;AAAA,QACJ;AAAA,QACA,SAAS;AACL,UAAA,MAAM,WAAA,GAAqB,OAAA;AAC3B,UAAA,MAAM,IAAI,KAAA;AAAA,YACN,CAAA,wBAAA,EAA4B,YAAuC,UAAU,CAAA;AAAA,WACjF;AAAA,QACJ;AAAA;AAGJ,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,WAAA,CAAY,UAAU,CAAA;AAEpD,MAAA,OAAO;AAAA,QACH,KAAA;AAAA,QACA,MAAA;AAAA,QACA,YAAY,OAAA,CAAQ,UAAA;AAAA,QACpB,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,qBAAA;AAAA,QACA,oBAAA;AAAA,QACA;AAAA,OACJ;AAAA,IACJ;AAAA,GACJ;AACJ","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","import type { GetLocationsResponse } from \"../ai\"\nimport type { ParsedLocation } from \"../types/domain\"\nimport { placesFromList, placesFromText, placesFromUrl } from \"../types/schemas\"\nimport type {\n GenerateFromSourceOptions,\n GenerateFromSourceResult,\n LlmUsage,\n MapGenerator,\n MapGeneratorConfig,\n} from \"./types\"\n\n/**\n * Default titles when the LLM does not return one. These match what the\n * private app has historically used so migrated data stays consistent.\n */\nconst DEFAULT_TITLES: Record<GenerateFromSourceOptions[\"sourceType\"], string> = {\n url: \"Map from Site\",\n text: \"Map from Text\",\n list: \"Map from List\",\n}\n\nfunction toUsage(r: GetLocationsResponse): LlmUsage {\n const { output: _output, ...rest } = r\n return rest\n}\n\n/**\n * Create a {@link MapGenerator} that wires a {@link LocationParser} and\n * {@link GeocodingProvider} together.\n *\n * @example\n * ```ts\n * import { createLocationParser } from \"mapthis/ai\"\n * import { createGeocoder } from \"mapthis/geocoding\"\n * import { createMapGenerator } from \"mapthis/generate\"\n *\n * const generator = createMapGenerator({\n * parser: createLocationParser({ apiKey: process.env.OPENAI_API_KEY! }),\n * geocoder: createGeocoder({ provider: \"google\", apiKey: process.env.GOOGLE_MAPS_KEY! }),\n * })\n *\n * const result = await generator.generateFromSource({\n * sourceType: \"url\",\n * source: \"https://example.com/best-restaurants-tokyo\",\n * })\n *\n * // Persist in your own DB:\n * await db.$transaction(async (tx) => {\n * const map = await tx.map.create({ data: { title: result.title, ... } })\n * const group = await tx.placeGroup.create({ data: { mapId: map.id, ... } })\n * await tx.place.createMany({\n * data: result.places.map((p, i) => ({\n * mapId: map.id,\n * groupId: group.id,\n * position: i,\n * query: p.input.address,\n * description: p.input.description,\n * name: p.data?.name,\n * address: p.data?.address,\n * lat: p.data?.lat,\n * lon: p.data?.lng,\n * provider: p.data?.provider,\n * providerId: p.data?.providerId,\n * error: p.error,\n * locationPromptVersion: result.locationPromptVersion,\n * summaryPromptVersion: result.summaryPromptVersion,\n * })),\n * })\n * })\n * ```\n */\nexport function createMapGenerator(config: MapGeneratorConfig): MapGenerator {\n const { parser, geocoder } = config\n\n return {\n async generateFromSource(\n options: GenerateFromSourceOptions,\n ): Promise<GenerateFromSourceResult> {\n let parsedLocs: ParsedLocation[] = []\n let title: string = DEFAULT_TITLES[options.sourceType]\n let usage: LlmUsage | undefined = undefined\n let locationPromptVersion: string | undefined = undefined\n let summaryPromptVersion: string | undefined = undefined\n\n switch (options.sourceType) {\n case \"url\": {\n const url = placesFromUrl.parse(options.source)\n const llm = await parser.parseLocationsFromUrl(url)\n parsedLocs = llm.output.locations\n if (llm.output.title) title = llm.output.title\n locationPromptVersion = llm.locationPromptVersion\n summaryPromptVersion = llm.summaryPromptVersion\n usage = toUsage(llm)\n break\n }\n case \"text\": {\n const text = placesFromText.parse(options.source)\n const llm = await parser.parseLocationsFromText(text)\n parsedLocs = llm.output.locations\n if (llm.output.title) title = llm.output.title\n locationPromptVersion = llm.locationPromptVersion\n summaryPromptVersion = llm.summaryPromptVersion\n usage = toUsage(llm)\n break\n }\n case \"list\": {\n const list = placesFromList.parse(options.source)\n parsedLocs = list\n .trim()\n .split(\"\\n\")\n .map((line) => ({ address: line, description: \"\" }))\n break\n }\n default: {\n const _exhaustive: never = options\n throw new Error(\n `Unsupported sourceType: ${(_exhaustive as { sourceType: string }).sourceType}`,\n )\n }\n }\n\n const places = await geocoder.geocodeMany(parsedLocs)\n\n return {\n title,\n places,\n sourceType: options.sourceType,\n source: options.source,\n locationPromptVersion,\n summaryPromptVersion,\n usage,\n }\n },\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/types/schemas.ts","../../src/generate/generator.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.union([z.literal(\"openai\"), z.literal(\"anthropic\")])\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","import type { GetLocationsResponse } from \"../ai\"\nimport type { ParsedLocation } from \"../types/domain\"\nimport { placesFromList, placesFromText, placesFromUrl } from \"../types/schemas\"\nimport type {\n GenerateFromSourceOptions,\n GenerateFromSourceResult,\n LlmUsage,\n MapGenerator,\n MapGeneratorConfig,\n} from \"./types\"\n\n/**\n * Default titles when the LLM does not return one. These match what the\n * private app has historically used so migrated data stays consistent.\n */\nconst DEFAULT_TITLES: Record<GenerateFromSourceOptions[\"sourceType\"], string> = {\n url: \"Map from Site\",\n text: \"Map from Text\",\n list: \"Map from List\",\n}\n\nfunction toUsage(r: GetLocationsResponse): LlmUsage {\n const { output: _output, ...rest } = r\n return rest\n}\n\n/**\n * Create a {@link MapGenerator} that wires a {@link LocationParser} and\n * {@link GeocodingProvider} together.\n *\n * @example\n * ```ts\n * import { createLocationParser } from \"mapthis/ai\"\n * import { createGeocoder } from \"mapthis/geocoding\"\n * import { createMapGenerator } from \"mapthis/generate\"\n *\n * const generator = createMapGenerator({\n * parser: createLocationParser({ apiKey: process.env.OPENAI_API_KEY! }),\n * geocoder: createGeocoder({ provider: \"google\", apiKey: process.env.GOOGLE_MAPS_KEY! }),\n * })\n *\n * const result = await generator.generateFromSource({\n * sourceType: \"url\",\n * source: \"https://example.com/best-restaurants-tokyo\",\n * })\n *\n * // Persist in your own DB:\n * await db.$transaction(async (tx) => {\n * const map = await tx.map.create({ data: { title: result.title, ... } })\n * const group = await tx.placeGroup.create({ data: { mapId: map.id, ... } })\n * await tx.place.createMany({\n * data: result.places.map((p, i) => ({\n * mapId: map.id,\n * groupId: group.id,\n * position: i,\n * query: p.input.address,\n * description: p.input.description,\n * name: p.data?.name,\n * address: p.data?.address,\n * lat: p.data?.lat,\n * lon: p.data?.lng,\n * provider: p.data?.provider,\n * providerId: p.data?.providerId,\n * error: p.error,\n * locationPromptVersion: result.locationPromptVersion,\n * summaryPromptVersion: result.summaryPromptVersion,\n * })),\n * })\n * })\n * ```\n */\nexport function createMapGenerator(config: MapGeneratorConfig): MapGenerator {\n const { parser, geocoder } = config\n\n return {\n async generateFromSource(\n options: GenerateFromSourceOptions,\n ): Promise<GenerateFromSourceResult> {\n let parsedLocs: ParsedLocation[] = []\n let title: string = DEFAULT_TITLES[options.sourceType]\n let usage: LlmUsage | undefined = undefined\n let locationPromptVersion: string | undefined = undefined\n let summaryPromptVersion: string | undefined = undefined\n\n switch (options.sourceType) {\n case \"url\": {\n const url = placesFromUrl.parse(options.source)\n const llm = await parser.parseLocationsFromUrl(url)\n parsedLocs = llm.output.locations\n if (llm.output.title) title = llm.output.title\n locationPromptVersion = llm.locationPromptVersion\n summaryPromptVersion = llm.summaryPromptVersion\n usage = toUsage(llm)\n break\n }\n case \"text\": {\n const text = placesFromText.parse(options.source)\n const llm = await parser.parseLocationsFromText(text)\n parsedLocs = llm.output.locations\n if (llm.output.title) title = llm.output.title\n locationPromptVersion = llm.locationPromptVersion\n summaryPromptVersion = llm.summaryPromptVersion\n usage = toUsage(llm)\n break\n }\n case \"list\": {\n const list = placesFromList.parse(options.source)\n parsedLocs = list\n .trim()\n .split(\"\\n\")\n .map((line) => ({ address: line, description: \"\" }))\n break\n }\n default: {\n const _exhaustive: never = options\n throw new Error(\n `Unsupported sourceType: ${(_exhaustive as { sourceType: string }).sourceType}`,\n )\n }\n }\n\n const places = await geocoder.geocodeMany(parsedLocs)\n\n return {\n title,\n places,\n sourceType: options.sourceType,\n source: options.source,\n locationPromptVersion,\n summaryPromptVersion,\n usage,\n }\n },\n }\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { M as MapthisError } from '../errors-Bw97z_4m.cjs';
2
- import { a as GeocoderConfig, G as GeocodingProvider, b as GoogleGeocoderConfig } from '../types-rFjK5YcJ.cjs';
3
- import '../domain-Dc1wSTkf.cjs';
4
- import '../schemas-Dy5coqXo.cjs';
2
+ import { a as GeocoderConfig, G as GeocodingProvider, b as GoogleGeocoderConfig } from '../types-C-xqh9Sh.cjs';
3
+ import '../domain-CL4ro2YW.cjs';
4
+ import '../schemas-CZao45EU.cjs';
5
5
  import 'zod';
6
6
 
7
7
  declare class GeocodingError extends MapthisError {
@@ -1,7 +1,7 @@
1
1
  import { M as MapthisError } from '../errors-Bw97z_4m.js';
2
- import { a as GeocoderConfig, G as GeocodingProvider, b as GoogleGeocoderConfig } from '../types-BhqKlq0k.js';
3
- import '../domain-CZ-L-ntu.js';
4
- import '../schemas-Dy5coqXo.js';
2
+ import { a as GeocoderConfig, G as GeocodingProvider, b as GoogleGeocoderConfig } from '../types-BhPqZwOj.js';
3
+ import '../domain-Dh8cPBVp.js';
4
+ import '../schemas-CZao45EU.js';
5
5
  import 'zod';
6
6
 
7
7
  declare class GeocodingError extends MapthisError {
package/dist/index.cjs CHANGED
@@ -3,7 +3,7 @@
3
3
  var zod = require('zod');
4
4
 
5
5
  // src/types/schemas.ts
6
- var llmProvider = zod.z.literal("openai");
6
+ var llmProvider = zod.z.union([zod.z.literal("openai"), zod.z.literal("anthropic")]);
7
7
  var placeProvider = zod.z.union([zod.z.literal("google"), zod.z.literal("locationiq")]);
8
8
  var generationSourceType = zod.z.union([
9
9
  zod.z.literal("blank"),
@@ -1 +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":["z"],"mappings":"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","file":"index.cjs","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"]}
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":["z"],"mappings":"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","file":"index.cjs","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.union([z.literal(\"openai\"), z.literal(\"anthropic\")])\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"]}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- export { C as Coordinates, G as GenerationSourceType, L as LlmProvider, M as MappablePlaceMeta, P as PlaceMeta, a as PlaceProvider, b as PositionedPlaceMeta, c as ProviderAutocompletePlace, d as addPlacesBaseSchema, e as addPlacesFromClientAutocompleteSchema, f as addPlacesFromListSchema, g as addPlacesFromSourceSchema, h as addPlacesFromTextSchema, i as addPlacesFromUrlSchema, j as coordinates, k as createBlankMapSchema, l as createGroupSchema, m as createMapBase, n as createMapFromListSchema, o as createMapFromQueryOrUrlSchema, p as createMapFromTextSchema, q as createMapFromUrlSchema, r as createMapSchema, s as editGroupSchema, t as generationSourceType, u as getMappablePlaceMetas, v as groupColor, w as groupDescription, x as groupName, y as latitude, z as llmProvider, A as longitude, B as mapCreationQuery, D as mapDescription, E as mapExternalId, F as mapTitle, H as mappablePlaceMeta, I as placeDescription, J as placeMeta, K as placeName, N as placeProvider, O as placesFromList, Q as placesFromText, R as placesFromUrl, S as positionedPlaceMeta, T as providerAutocompletePlace, U as reorderMapSchema, V as searchSchema, W as updateMapSchema, X as updatePlaceFormSchema } from './schemas-Dy5coqXo.cjs';
2
- export { A as Audited, D as DefaultPlaceMap, P as ParsedLocation, a as ParsedLocations, b as Partner, c as PartnerUrl, d as PartnerUser, e as PartnerUserRole, f as Place, g as PlaceGroup, h as PlaceMap, i as PlaceQueryResult, j as PopulatedPlaceMap, k as PositionedPlaceGroup, T as Timestamped } from './domain-Dc1wSTkf.cjs';
1
+ export { C as Coordinates, G as GenerationSourceType, L as LlmProvider, M as MappablePlaceMeta, P as PlaceMeta, a as PlaceProvider, b as PositionedPlaceMeta, c as ProviderAutocompletePlace, d as addPlacesBaseSchema, e as addPlacesFromClientAutocompleteSchema, f as addPlacesFromListSchema, g as addPlacesFromSourceSchema, h as addPlacesFromTextSchema, i as addPlacesFromUrlSchema, j as coordinates, k as createBlankMapSchema, l as createGroupSchema, m as createMapBase, n as createMapFromListSchema, o as createMapFromQueryOrUrlSchema, p as createMapFromTextSchema, q as createMapFromUrlSchema, r as createMapSchema, s as editGroupSchema, t as generationSourceType, u as getMappablePlaceMetas, v as groupColor, w as groupDescription, x as groupName, y as latitude, z as llmProvider, A as longitude, B as mapCreationQuery, D as mapDescription, E as mapExternalId, F as mapTitle, H as mappablePlaceMeta, I as placeDescription, J as placeMeta, K as placeName, N as placeProvider, O as placesFromList, Q as placesFromText, R as placesFromUrl, S as positionedPlaceMeta, T as providerAutocompletePlace, U as reorderMapSchema, V as searchSchema, W as updateMapSchema, X as updatePlaceFormSchema } from './schemas-CZao45EU.cjs';
2
+ export { A as Audited, D as DefaultPlaceMap, P as ParsedLocation, a as ParsedLocations, b as Partner, c as PartnerUrl, d as PartnerUser, e as PartnerUserRole, f as Place, g as PlaceGroup, h as PlaceMap, i as PlaceQueryResult, j as PopulatedPlaceMap, k as PositionedPlaceGroup, T as Timestamped } from './domain-CL4ro2YW.cjs';
3
3
  export { M as MapthisError } from './errors-Bw97z_4m.cjs';
4
4
  export { H_MAX, H_MIN, KnownCity, L_MAX, L_MIN, PastelDocColors, Stopwatch, StopwatchLapped, capitalizeFirstLetter, cities, enforceListTextInput, getTextColor, objectMap, preventMultipleBlankLines, randomDevCoordinates, randomIntBetween, randomLat, randomLatDev, randomLng, randomLngDev, randomPastelHex, randomPastelHsl, randomPastelHslDocColors, randomPastelHslString, randomPastelRgb, seedOffset, seededHslH, seededPastelHex, seededPastelHsl, seededPastelRgb, seededPastelRgbA, uuidPastelHex, uuidPastelHsl, uuidPastelRgb, uuidPastelRgbA } from './utils/index.cjs';
5
5
  import 'zod';
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- export { C as Coordinates, G as GenerationSourceType, L as LlmProvider, M as MappablePlaceMeta, P as PlaceMeta, a as PlaceProvider, b as PositionedPlaceMeta, c as ProviderAutocompletePlace, d as addPlacesBaseSchema, e as addPlacesFromClientAutocompleteSchema, f as addPlacesFromListSchema, g as addPlacesFromSourceSchema, h as addPlacesFromTextSchema, i as addPlacesFromUrlSchema, j as coordinates, k as createBlankMapSchema, l as createGroupSchema, m as createMapBase, n as createMapFromListSchema, o as createMapFromQueryOrUrlSchema, p as createMapFromTextSchema, q as createMapFromUrlSchema, r as createMapSchema, s as editGroupSchema, t as generationSourceType, u as getMappablePlaceMetas, v as groupColor, w as groupDescription, x as groupName, y as latitude, z as llmProvider, A as longitude, B as mapCreationQuery, D as mapDescription, E as mapExternalId, F as mapTitle, H as mappablePlaceMeta, I as placeDescription, J as placeMeta, K as placeName, N as placeProvider, O as placesFromList, Q as placesFromText, R as placesFromUrl, S as positionedPlaceMeta, T as providerAutocompletePlace, U as reorderMapSchema, V as searchSchema, W as updateMapSchema, X as updatePlaceFormSchema } from './schemas-Dy5coqXo.js';
2
- export { A as Audited, D as DefaultPlaceMap, P as ParsedLocation, a as ParsedLocations, b as Partner, c as PartnerUrl, d as PartnerUser, e as PartnerUserRole, f as Place, g as PlaceGroup, h as PlaceMap, i as PlaceQueryResult, j as PopulatedPlaceMap, k as PositionedPlaceGroup, T as Timestamped } from './domain-CZ-L-ntu.js';
1
+ export { C as Coordinates, G as GenerationSourceType, L as LlmProvider, M as MappablePlaceMeta, P as PlaceMeta, a as PlaceProvider, b as PositionedPlaceMeta, c as ProviderAutocompletePlace, d as addPlacesBaseSchema, e as addPlacesFromClientAutocompleteSchema, f as addPlacesFromListSchema, g as addPlacesFromSourceSchema, h as addPlacesFromTextSchema, i as addPlacesFromUrlSchema, j as coordinates, k as createBlankMapSchema, l as createGroupSchema, m as createMapBase, n as createMapFromListSchema, o as createMapFromQueryOrUrlSchema, p as createMapFromTextSchema, q as createMapFromUrlSchema, r as createMapSchema, s as editGroupSchema, t as generationSourceType, u as getMappablePlaceMetas, v as groupColor, w as groupDescription, x as groupName, y as latitude, z as llmProvider, A as longitude, B as mapCreationQuery, D as mapDescription, E as mapExternalId, F as mapTitle, H as mappablePlaceMeta, I as placeDescription, J as placeMeta, K as placeName, N as placeProvider, O as placesFromList, Q as placesFromText, R as placesFromUrl, S as positionedPlaceMeta, T as providerAutocompletePlace, U as reorderMapSchema, V as searchSchema, W as updateMapSchema, X as updatePlaceFormSchema } from './schemas-CZao45EU.js';
2
+ export { A as Audited, D as DefaultPlaceMap, P as ParsedLocation, a as ParsedLocations, b as Partner, c as PartnerUrl, d as PartnerUser, e as PartnerUserRole, f as Place, g as PlaceGroup, h as PlaceMap, i as PlaceQueryResult, j as PopulatedPlaceMap, k as PositionedPlaceGroup, T as Timestamped } from './domain-Dh8cPBVp.js';
3
3
  export { M as MapthisError } from './errors-Bw97z_4m.js';
4
4
  export { H_MAX, H_MIN, KnownCity, L_MAX, L_MIN, PastelDocColors, Stopwatch, StopwatchLapped, capitalizeFirstLetter, cities, enforceListTextInput, getTextColor, objectMap, preventMultipleBlankLines, randomDevCoordinates, randomIntBetween, randomLat, randomLatDev, randomLng, randomLngDev, randomPastelHex, randomPastelHsl, randomPastelHslDocColors, randomPastelHslString, randomPastelRgb, seedOffset, seededHslH, seededPastelHex, seededPastelHsl, seededPastelRgb, seededPastelRgbA, uuidPastelHex, uuidPastelHsl, uuidPastelRgb, uuidPastelRgbA } from './utils/index.js';
5
5
  import 'zod';
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { z } from 'zod';
2
2
 
3
3
  // src/types/schemas.ts
4
- var llmProvider = z.literal("openai");
4
+ var llmProvider = z.union([z.literal("openai"), z.literal("anthropic")]);
5
5
  var placeProvider = z.union([z.literal("google"), z.literal("locationiq")]);
6
6
  var generationSourceType = z.union([
7
7
  z.literal("blank"),