founder-schema 0.18.0 → 0.20.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 (156) hide show
  1. package/README.md +110 -3
  2. package/dist/access/permissions.d.ts +3 -3
  3. package/dist/access/permissions.d.ts.map +1 -1
  4. package/dist/access/permissions.js.map +1 -1
  5. package/dist/core/common.d.ts +49 -28
  6. package/dist/core/common.d.ts.map +1 -1
  7. package/dist/core/common.js +65 -26
  8. package/dist/core/common.js.map +1 -1
  9. package/dist/core/deletion.d.ts +40 -0
  10. package/dist/core/deletion.d.ts.map +1 -0
  11. package/dist/core/deletion.js +39 -0
  12. package/dist/core/deletion.js.map +1 -0
  13. package/dist/core/limits.d.ts +25 -0
  14. package/dist/core/limits.d.ts.map +1 -1
  15. package/dist/core/limits.js +25 -0
  16. package/dist/core/limits.js.map +1 -1
  17. package/dist/core/validation.d.ts +13 -0
  18. package/dist/core/validation.d.ts.map +1 -1
  19. package/dist/core/validation.js +13 -0
  20. package/dist/core/validation.js.map +1 -1
  21. package/dist/domains/audit/audit.d.ts +36 -12
  22. package/dist/domains/audit/audit.d.ts.map +1 -1
  23. package/dist/domains/audit/audit.js +9 -10
  24. package/dist/domains/audit/audit.js.map +1 -1
  25. package/dist/domains/billing/billing.d.ts +29 -13
  26. package/dist/domains/billing/billing.d.ts.map +1 -1
  27. package/dist/domains/billing/billing.js +2 -3
  28. package/dist/domains/billing/billing.js.map +1 -1
  29. package/dist/domains/chat/chat.d.ts +19 -5
  30. package/dist/domains/chat/chat.d.ts.map +1 -1
  31. package/dist/domains/chat/chat.js +10 -10
  32. package/dist/domains/chat/chat.js.map +1 -1
  33. package/dist/domains/communities/communities.d.ts +95 -57
  34. package/dist/domains/communities/communities.d.ts.map +1 -1
  35. package/dist/domains/contributions/contributions.d.ts +28 -12
  36. package/dist/domains/contributions/contributions.d.ts.map +1 -1
  37. package/dist/domains/contributions/contributions.js +3 -0
  38. package/dist/domains/contributions/contributions.js.map +1 -1
  39. package/dist/domains/discover/discover.d.ts +2 -2
  40. package/dist/domains/feed/feed.d.ts +111 -63
  41. package/dist/domains/feed/feed.d.ts.map +1 -1
  42. package/dist/domains/feed/feed.js +3 -0
  43. package/dist/domains/feed/feed.js.map +1 -1
  44. package/dist/domains/location/areas.d.ts +338 -0
  45. package/dist/domains/location/areas.d.ts.map +1 -0
  46. package/dist/domains/location/areas.js +241 -0
  47. package/dist/domains/location/areas.js.map +1 -0
  48. package/dist/domains/location/india.d.ts +31 -123
  49. package/dist/domains/location/india.d.ts.map +1 -1
  50. package/dist/domains/location/india.js +98 -64
  51. package/dist/domains/location/india.js.map +1 -1
  52. package/dist/domains/media/media.d.ts +22 -0
  53. package/dist/domains/media/media.d.ts.map +1 -1
  54. package/dist/domains/media/media.js +20 -0
  55. package/dist/domains/media/media.js.map +1 -1
  56. package/dist/domains/members/members.d.ts +26 -9
  57. package/dist/domains/members/members.d.ts.map +1 -1
  58. package/dist/domains/members/members.js +9 -10
  59. package/dist/domains/members/members.js.map +1 -1
  60. package/dist/domains/membership/membership.d.ts +19 -0
  61. package/dist/domains/membership/membership.d.ts.map +1 -1
  62. package/dist/domains/membership/membership.js +10 -0
  63. package/dist/domains/membership/membership.js.map +1 -1
  64. package/dist/domains/moderation/moderation.d.ts +8 -2
  65. package/dist/domains/moderation/moderation.d.ts.map +1 -1
  66. package/dist/domains/moderation/moderation.js +3 -6
  67. package/dist/domains/moderation/moderation.js.map +1 -1
  68. package/dist/domains/notifications/notifications.d.ts +10 -6
  69. package/dist/domains/notifications/notifications.d.ts.map +1 -1
  70. package/dist/domains/onboarding/onboarding-answers.d.ts +9 -12
  71. package/dist/domains/onboarding/onboarding-answers.d.ts.map +1 -1
  72. package/dist/domains/onboarding/onboarding-answers.js +12 -19
  73. package/dist/domains/onboarding/onboarding-answers.js.map +1 -1
  74. package/dist/domains/onboarding/onboarding.d.ts +121 -98
  75. package/dist/domains/onboarding/onboarding.d.ts.map +1 -1
  76. package/dist/domains/onboarding/onboarding.js +30 -28
  77. package/dist/domains/onboarding/onboarding.js.map +1 -1
  78. package/dist/domains/people/person.d.ts +54 -0
  79. package/dist/domains/people/person.d.ts.map +1 -0
  80. package/dist/domains/people/person.js +73 -0
  81. package/dist/domains/people/person.js.map +1 -0
  82. package/dist/domains/products/products.d.ts +62 -33
  83. package/dist/domains/products/products.d.ts.map +1 -1
  84. package/dist/domains/products/products.js +3 -0
  85. package/dist/domains/products/products.js.map +1 -1
  86. package/dist/domains/profile/founder-profile.d.ts +93 -60
  87. package/dist/domains/profile/founder-profile.d.ts.map +1 -1
  88. package/dist/domains/profile/founder-profile.js +55 -25
  89. package/dist/domains/profile/founder-profile.js.map +1 -1
  90. package/dist/domains/reviews/reviews.d.ts +25 -15
  91. package/dist/domains/reviews/reviews.d.ts.map +1 -1
  92. package/dist/domains/support/support.d.ts +47 -10
  93. package/dist/domains/support/support.d.ts.map +1 -1
  94. package/dist/domains/support/support.js +4 -2
  95. package/dist/domains/support/support.js.map +1 -1
  96. package/dist/domains/team/team.d.ts +9 -3
  97. package/dist/domains/team/team.d.ts.map +1 -1
  98. package/dist/domains/team/team.js +3 -6
  99. package/dist/domains/team/team.js.map +1 -1
  100. package/dist/index.d.ts +13 -10
  101. package/dist/index.d.ts.map +1 -1
  102. package/dist/index.js +17 -11
  103. package/dist/index.js.map +1 -1
  104. package/package.json +3 -2
  105. package/dist/account.d.ts +0 -40
  106. package/dist/account.d.ts.map +0 -1
  107. package/dist/account.js +0 -39
  108. package/dist/account.js.map +0 -1
  109. package/dist/chat.d.ts +0 -187
  110. package/dist/chat.d.ts.map +0 -1
  111. package/dist/chat.js +0 -189
  112. package/dist/chat.js.map +0 -1
  113. package/dist/common.d.ts +0 -304
  114. package/dist/common.d.ts.map +0 -1
  115. package/dist/common.js +0 -340
  116. package/dist/common.js.map +0 -1
  117. package/dist/discover.d.ts +0 -245
  118. package/dist/discover.d.ts.map +0 -1
  119. package/dist/discover.js +0 -68
  120. package/dist/discover.js.map +0 -1
  121. package/dist/errors.d.ts +0 -85
  122. package/dist/errors.d.ts.map +0 -1
  123. package/dist/errors.js +0 -89
  124. package/dist/errors.js.map +0 -1
  125. package/dist/feed.d.ts +0 -1658
  126. package/dist/feed.d.ts.map +0 -1
  127. package/dist/feed.js +0 -623
  128. package/dist/feed.js.map +0 -1
  129. package/dist/founder-profile.d.ts +0 -387
  130. package/dist/founder-profile.d.ts.map +0 -1
  131. package/dist/founder-profile.js +0 -180
  132. package/dist/founder-profile.js.map +0 -1
  133. package/dist/limits.d.ts +0 -76
  134. package/dist/limits.d.ts.map +0 -1
  135. package/dist/limits.js +0 -84
  136. package/dist/limits.js.map +0 -1
  137. package/dist/onboarding.d.ts +0 -1018
  138. package/dist/onboarding.d.ts.map +0 -1
  139. package/dist/onboarding.js +0 -717
  140. package/dist/onboarding.js.map +0 -1
  141. package/dist/responses/common.d.ts +0 -167
  142. package/dist/responses/common.d.ts.map +0 -1
  143. package/dist/responses/common.js +0 -67
  144. package/dist/responses/common.js.map +0 -1
  145. package/dist/responses/index.d.ts +0 -7
  146. package/dist/responses/index.d.ts.map +0 -1
  147. package/dist/responses/index.js +0 -7
  148. package/dist/responses/index.js.map +0 -1
  149. package/dist/uploads.d.ts +0 -113
  150. package/dist/uploads.d.ts.map +0 -1
  151. package/dist/uploads.js +0 -106
  152. package/dist/uploads.js.map +0 -1
  153. package/dist/validation.d.ts +0 -136
  154. package/dist/validation.d.ts.map +0 -1
  155. package/dist/validation.js +0 -142
  156. package/dist/validation.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"india.js","sourceRoot":"","sources":["../../../src/domains/location/india.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * founder-schema — Where a founder is based: India's states, union territories\n * and cities (0.17.0, moved here from the web client, where the location step's\n * lists lived in the screen).\n *\n * Founder Circle is in India for now (the user, 2026-10-18: the country is\n * shown locked to India and a state and city are chosen from lists). The RULE\n * is `indiaLocationSchema` below; this file is its data, read by every side:\n *\n * states all 28 states and 8 union territories, by their current names: a\n * CLOSED list, so a state is one of these or refused (`stateUnknown`)\n * cities per state, the larger cities first, the rest A to Z. A HELP, NOT A\n * RULE: the profile stores the city as text and Discover matches\n * text, so the list spares members the typing and the spelling\n * variants, and the picker also takes a town it does not hold\n * aliases older or other names a member may search by (\"Bangalore\" finds\n * Bengaluru), and the district names the location lookup answers\n * with (\"Bengaluru Urban\"), so the server's suggestion and a member's\n * search land on the list's own spelling\n *\n * Written for this product from public knowledge of India's cities; no\n * third-party dataset is copied in.\n *\n * @module founder-schema/domains/location/india\n */\n\nimport { z } from 'zod';\nimport { CITY_MAX } from '../../core/limits.js';\nimport { VALIDATION_MESSAGE } from '../../core/validation.js';\nimport type { GST_STATES } from '../billing/gst.js';\n\n/**\n * A state or union territory, by the ONE list of their names: GST's\n * (`GST_STATES`, billing), which already held all 36. This module adds each\n * one's cities and other names; it never spells a state on its own, and a\n * test holds the two sets equal.\n */\nexport type IndiaStateName = (typeof GST_STATES)[number]['name'];\n\nexport interface IndiaState {\n name: IndiaStateName;\n /** Other names the state is searched or answered by. */\n aliases?: readonly string[];\n cities: readonly string[];\n}\n\n/** The one country a location may be in, for now. */\nexport const INDIA = 'India' as const;\n\n/** India's international dialing code: what a phone number is shown with (the stored number has none). */\nexport const INDIA_DIALING_CODE = '+91' as const;\n\nexport const INDIA_STATES: readonly IndiaState[] = [\n {\n name: 'Andhra Pradesh',\n cities: [\n 'Visakhapatnam',\n 'Vijayawada',\n 'Guntur',\n 'Nellore',\n 'Kurnool',\n 'Rajamahendravaram',\n 'Tirupati',\n 'Kakinada',\n 'Kadapa',\n 'Anantapur',\n 'Amaravati',\n 'Adoni',\n 'Bhimavaram',\n 'Chilakaluripet',\n 'Chittoor',\n 'Dharmavaram',\n 'Eluru',\n 'Gudivada',\n 'Guntakal',\n 'Hindupur',\n 'Machilipatnam',\n 'Madanapalle',\n 'Nandyal',\n 'Narasaraopet',\n 'Ongole',\n 'Proddatur',\n 'Puttaparthi',\n 'Srikakulam',\n 'Tadepalligudem',\n 'Tenali',\n 'Vizianagaram',\n ],\n },\n {\n name: 'Arunachal Pradesh',\n cities: [\n 'Itanagar',\n 'Naharlagun',\n 'Pasighat',\n 'Aalo',\n 'Bomdila',\n 'Changlang',\n 'Daporijo',\n 'Khonsa',\n 'Namsai',\n 'Roing',\n 'Seppa',\n 'Tawang',\n 'Tezu',\n 'Ziro',\n ],\n },\n {\n name: 'Assam',\n cities: [\n 'Guwahati',\n 'Dibrugarh',\n 'Silchar',\n 'Jorhat',\n 'Tezpur',\n 'Nagaon',\n 'Tinsukia',\n 'Barpeta',\n 'Bongaigaon',\n 'Dhubri',\n 'Diphu',\n 'Goalpara',\n 'Golaghat',\n 'Haflong',\n 'Hailakandi',\n 'Karimganj',\n 'Kokrajhar',\n 'Mangaldoi',\n 'Nalbari',\n 'North Lakhimpur',\n 'Sivasagar',\n ],\n },\n {\n name: 'Bihar',\n cities: [\n 'Patna',\n 'Gaya Ji',\n 'Bhagalpur',\n 'Muzaffarpur',\n 'Darbhanga',\n 'Purnia',\n 'Arrah',\n 'Aurangabad',\n 'Begusarai',\n 'Bettiah',\n 'Bihar Sharif',\n 'Bodh Gaya',\n 'Buxar',\n 'Chapra',\n 'Dehri',\n 'Hajipur',\n 'Jamalpur',\n 'Jehanabad',\n 'Katihar',\n 'Kishanganj',\n 'Motihari',\n 'Munger',\n 'Nawada',\n 'Saharsa',\n 'Sasaram',\n 'Sitamarhi',\n 'Siwan',\n ],\n },\n {\n name: 'Chhattisgarh',\n cities: [\n 'Raipur',\n 'Bhilai',\n 'Bilaspur',\n 'Korba',\n 'Durg',\n 'Ambikapur',\n 'Bhatapara',\n 'Chirmiri',\n 'Dhamtari',\n 'Jagdalpur',\n 'Janjgir',\n 'Kanker',\n 'Mahasamund',\n 'Nava Raipur',\n 'Raigarh',\n 'Rajnandgaon',\n ],\n },\n {\n name: 'Goa',\n cities: [\n 'Panaji',\n 'Margao',\n 'Vasco da Gama',\n 'Mapusa',\n 'Ponda',\n 'Bicholim',\n 'Canacona',\n 'Curchorem',\n 'Pernem',\n 'Porvorim',\n 'Quepem',\n 'Sanguem',\n 'Valpoi',\n ],\n },\n {\n name: 'Gujarat',\n cities: [\n 'Ahmedabad',\n 'Surat',\n 'Vadodara',\n 'Rajkot',\n 'Gandhinagar',\n 'Bhavnagar',\n 'Jamnagar',\n 'Junagadh',\n 'Amreli',\n 'Anand',\n 'Ankleshwar',\n 'Bharuch',\n 'Bhuj',\n 'Botad',\n 'Dahod',\n 'Deesa',\n 'Gandhidham',\n 'Godhra',\n 'Himmatnagar',\n 'Kalol',\n 'Mehsana',\n 'Morbi',\n 'Nadiad',\n 'Navsari',\n 'Palanpur',\n 'Patan',\n 'Porbandar',\n 'Surendranagar',\n 'Valsad',\n 'Vapi',\n 'Veraval',\n ],\n },\n {\n name: 'Haryana',\n cities: [\n 'Gurugram',\n 'Faridabad',\n 'Panipat',\n 'Ambala',\n 'Karnal',\n 'Rohtak',\n 'Hisar',\n 'Sonipat',\n 'Panchkula',\n 'Bahadurgarh',\n 'Bhiwani',\n 'Charkhi Dadri',\n 'Fatehabad',\n 'Hansi',\n 'Jhajjar',\n 'Jind',\n 'Kaithal',\n 'Kurukshetra',\n 'Manesar',\n 'Narnaul',\n 'Nuh',\n 'Palwal',\n 'Rewari',\n 'Sirsa',\n 'Yamunanagar',\n ],\n },\n {\n name: 'Himachal Pradesh',\n cities: [\n 'Shimla',\n 'Dharamshala',\n 'Solan',\n 'Mandi',\n 'Baddi',\n 'Bilaspur',\n 'Chamba',\n 'Hamirpur',\n 'Kangra',\n 'Keylong',\n 'Kullu',\n 'Manali',\n 'Nahan',\n 'Palampur',\n 'Paonta Sahib',\n 'Reckong Peo',\n 'Sundernagar',\n 'Una',\n ],\n },\n {\n name: 'Jharkhand',\n cities: [\n 'Ranchi',\n 'Jamshedpur',\n 'Dhanbad',\n 'Bokaro',\n 'Deoghar',\n 'Hazaribagh',\n 'Adityapur',\n 'Chaibasa',\n 'Chatra',\n 'Dumka',\n 'Garhwa',\n 'Giridih',\n 'Godda',\n 'Gumla',\n 'Jamtara',\n 'Khunti',\n 'Koderma',\n 'Latehar',\n 'Lohardaga',\n 'Medininagar',\n 'Pakur',\n 'Phusro',\n 'Ramgarh',\n 'Sahibganj',\n 'Saraikela',\n 'Simdega',\n ],\n },\n {\n name: 'Karnataka',\n cities: [\n 'Bengaluru',\n 'Mysuru',\n 'Mangaluru',\n 'Hubballi',\n 'Dharwad',\n 'Belagavi',\n 'Kalaburagi',\n 'Davanagere',\n 'Bagalkot',\n 'Ballari',\n 'Bidar',\n 'Chamarajanagar',\n 'Chikkaballapur',\n 'Chikkamagaluru',\n 'Chitradurga',\n 'Gadag',\n 'Hassan',\n 'Haveri',\n 'Hosapete',\n 'Karwar',\n 'Kolar',\n 'Koppal',\n 'Madikeri',\n 'Mandya',\n 'Manipal',\n 'Raichur',\n 'Ramanagara',\n 'Shivamogga',\n 'Tumakuru',\n 'Udupi',\n 'Vijayapura',\n 'Yadgir',\n ],\n },\n {\n name: 'Kerala',\n cities: [\n 'Thiruvananthapuram',\n 'Kochi',\n 'Kozhikode',\n 'Thrissur',\n 'Kollam',\n 'Kannur',\n 'Alappuzha',\n 'Palakkad',\n 'Kottayam',\n 'Malappuram',\n 'Aluva',\n 'Changanassery',\n 'Guruvayur',\n 'Kalpetta',\n 'Kanhangad',\n 'Kasaragod',\n 'Kayamkulam',\n 'Manjeri',\n 'Munnar',\n 'Pathanamthitta',\n 'Perinthalmanna',\n 'Ponnani',\n 'Thalassery',\n 'Thodupuzha',\n 'Tirur',\n 'Vatakara',\n ],\n },\n {\n name: 'Madhya Pradesh',\n cities: [\n 'Indore',\n 'Bhopal',\n 'Jabalpur',\n 'Gwalior',\n 'Ujjain',\n 'Sagar',\n 'Dewas',\n 'Satna',\n 'Ratlam',\n 'Rewa',\n 'Agar',\n 'Anuppur',\n 'Ashoknagar',\n 'Balaghat',\n 'Barwani',\n 'Betul',\n 'Bhind',\n 'Burhanpur',\n 'Chhatarpur',\n 'Chhindwara',\n 'Damoh',\n 'Datia',\n 'Dhar',\n 'Dindori',\n 'Guna',\n 'Itarsi',\n 'Jhabua',\n 'Katni',\n 'Khandwa',\n 'Khargone',\n 'Mandla',\n 'Mandsaur',\n 'Morena',\n 'Narmadapuram',\n 'Neemuch',\n 'Panna',\n 'Pithampur',\n 'Rajgarh',\n 'Sehore',\n 'Seoni',\n 'Shahdol',\n 'Shajapur',\n 'Shivpuri',\n 'Sidhi',\n 'Singrauli',\n 'Tikamgarh',\n 'Umaria',\n 'Vidisha',\n ],\n },\n {\n name: 'Maharashtra',\n cities: [\n 'Mumbai',\n 'Pune',\n 'Nagpur',\n 'Thane',\n 'Navi Mumbai',\n 'Nashik',\n 'Chhatrapati Sambhajinagar',\n 'Solapur',\n 'Kolhapur',\n 'Pimpri-Chinchwad',\n 'Ahilyanagar',\n 'Akola',\n 'Alibag',\n 'Amravati',\n 'Baramati',\n 'Beed',\n 'Bhandara',\n 'Bhiwandi',\n 'Buldhana',\n 'Chandrapur',\n 'Dharashiv',\n 'Dhule',\n 'Gadchiroli',\n 'Gondia',\n 'Hingoli',\n 'Ichalkaranji',\n 'Jalgaon',\n 'Jalna',\n 'Kalyan',\n 'Latur',\n 'Lonavala',\n 'Malegaon',\n 'Mira-Bhayandar',\n 'Nanded',\n 'Nandurbar',\n 'Palghar',\n 'Panvel',\n 'Parbhani',\n 'Ratnagiri',\n 'Sangli',\n 'Satara',\n 'Ulhasnagar',\n 'Vasai-Virar',\n 'Wardha',\n 'Washim',\n 'Yavatmal',\n ],\n },\n {\n name: 'Manipur',\n cities: [\n 'Imphal',\n 'Thoubal',\n 'Bishnupur',\n 'Chandel',\n 'Churachandpur',\n 'Jiribam',\n 'Kakching',\n 'Moreh',\n 'Senapati',\n 'Tamenglong',\n 'Ukhrul',\n ],\n },\n {\n name: 'Meghalaya',\n cities: [\n 'Shillong',\n 'Tura',\n 'Jowai',\n 'Baghmara',\n 'Mairang',\n 'Nongpoh',\n 'Nongstoin',\n 'Resubelpara',\n 'Sohra',\n 'Williamnagar',\n ],\n },\n {\n name: 'Mizoram',\n cities: [\n 'Aizawl',\n 'Lunglei',\n 'Champhai',\n 'Hnahthial',\n 'Khawzawl',\n 'Kolasib',\n 'Lawngtlai',\n 'Mamit',\n 'Saitual',\n 'Serchhip',\n 'Siaha',\n ],\n },\n {\n name: 'Nagaland',\n cities: [\n 'Kohima',\n 'Dimapur',\n 'Mokokchung',\n 'Chumoukedima',\n 'Kiphire',\n 'Longleng',\n 'Mon',\n 'Niuland',\n 'Noklak',\n 'Peren',\n 'Phek',\n 'Shamator',\n 'Tseminyu',\n 'Tuensang',\n 'Wokha',\n 'Zunheboto',\n ],\n },\n {\n name: 'Odisha',\n aliases: ['Orissa'],\n cities: [\n 'Bhubaneswar',\n 'Cuttack',\n 'Rourkela',\n 'Berhampur',\n 'Sambalpur',\n 'Puri',\n 'Balasore',\n 'Angul',\n 'Balangir',\n 'Bargarh',\n 'Baripada',\n 'Bhadrak',\n 'Bhawanipatna',\n 'Dhenkanal',\n 'Jagatsinghpur',\n 'Jajpur',\n 'Jeypore',\n 'Jharsuguda',\n 'Kendrapara',\n 'Keonjhar',\n 'Khordha',\n 'Koraput',\n 'Malkangiri',\n 'Nabarangpur',\n 'Nayagarh',\n 'Paradip',\n 'Phulbani',\n 'Rayagada',\n 'Sundargarh',\n 'Talcher',\n ],\n },\n {\n name: 'Punjab',\n cities: [\n 'Ludhiana',\n 'Amritsar',\n 'Jalandhar',\n 'Patiala',\n 'Mohali',\n 'Bathinda',\n 'Abohar',\n 'Barnala',\n 'Batala',\n 'Faridkot',\n 'Fazilka',\n 'Firozpur',\n 'Gurdaspur',\n 'Hoshiarpur',\n 'Kapurthala',\n 'Khanna',\n 'Malerkotla',\n 'Mansa',\n 'Moga',\n 'Muktsar',\n 'Nawanshahr',\n 'Pathankot',\n 'Phagwara',\n 'Rajpura',\n 'Rupnagar',\n 'Sangrur',\n 'Tarn Taran',\n 'Zirakpur',\n ],\n },\n {\n name: 'Rajasthan',\n cities: [\n 'Jaipur',\n 'Jodhpur',\n 'Kota',\n 'Udaipur',\n 'Bikaner',\n 'Ajmer',\n 'Alwar',\n 'Bhilwara',\n 'Banswara',\n 'Baran',\n 'Barmer',\n 'Beawar',\n 'Bharatpur',\n 'Bhiwadi',\n 'Bundi',\n 'Chittorgarh',\n 'Churu',\n 'Dausa',\n 'Dhaulpur',\n 'Dungarpur',\n 'Gangapur City',\n 'Hanumangarh',\n 'Jaisalmer',\n 'Jalore',\n 'Jhalawar',\n 'Jhunjhunu',\n 'Karauli',\n 'Kishangarh',\n 'Mount Abu',\n 'Nagaur',\n 'Neemrana',\n 'Pali',\n 'Pratapgarh',\n 'Rajsamand',\n 'Sawai Madhopur',\n 'Sikar',\n 'Sirohi',\n 'Sri Ganganagar',\n 'Tonk',\n ],\n },\n {\n name: 'Sikkim',\n cities: [\n 'Gangtok',\n 'Namchi',\n 'Gyalshing',\n 'Jorethang',\n 'Mangan',\n 'Pakyong',\n 'Rangpo',\n 'Ravangla',\n 'Singtam',\n 'Soreng',\n ],\n },\n {\n name: 'Tamil Nadu',\n cities: [\n 'Chennai',\n 'Coimbatore',\n 'Madurai',\n 'Tiruchirappalli',\n 'Salem',\n 'Tiruppur',\n 'Erode',\n 'Tirunelveli',\n 'Vellore',\n 'Hosur',\n 'Ambur',\n 'Ariyalur',\n 'Chengalpattu',\n 'Cuddalore',\n 'Dharmapuri',\n 'Dindigul',\n 'Gudiyatham',\n 'Kallakurichi',\n 'Kanchipuram',\n 'Kanyakumari',\n 'Karaikudi',\n 'Karur',\n 'Krishnagiri',\n 'Kumbakonam',\n 'Mayiladuthurai',\n 'Nagapattinam',\n 'Nagercoil',\n 'Namakkal',\n 'Ooty',\n 'Perambalur',\n 'Pollachi',\n 'Pudukkottai',\n 'Rajapalayam',\n 'Ramanathapuram',\n 'Ranipet',\n 'Sivaganga',\n 'Sivakasi',\n 'Tenkasi',\n 'Thanjavur',\n 'Theni',\n 'Thoothukudi',\n 'Tirupattur',\n 'Tiruvallur',\n 'Tiruvannamalai',\n 'Tiruvarur',\n 'Viluppuram',\n 'Virudhunagar',\n ],\n },\n {\n name: 'Telangana',\n cities: [\n 'Hyderabad',\n 'Warangal',\n 'Nizamabad',\n 'Karimnagar',\n 'Khammam',\n 'Secunderabad',\n 'Adilabad',\n 'Bhongir',\n 'Jagtial',\n 'Kamareddy',\n 'Kothagudem',\n 'Mahbubnagar',\n 'Mancherial',\n 'Medak',\n 'Miryalaguda',\n 'Nalgonda',\n 'Nirmal',\n 'Ramagundam',\n 'Sangareddy',\n 'Siddipet',\n 'Suryapet',\n 'Vikarabad',\n 'Wanaparthy',\n 'Zahirabad',\n ],\n },\n {\n name: 'Tripura',\n cities: [\n 'Agartala',\n 'Dharmanagar',\n 'Udaipur',\n 'Ambassa',\n 'Belonia',\n 'Bishalgarh',\n 'Kailashahar',\n 'Kamalpur',\n 'Khowai',\n 'Sabroom',\n 'Sonamura',\n 'Teliamura',\n ],\n },\n {\n name: 'Uttar Pradesh',\n cities: [\n 'Lucknow',\n 'Kanpur',\n 'Noida',\n 'Ghaziabad',\n 'Agra',\n 'Varanasi',\n 'Prayagraj',\n 'Meerut',\n 'Greater Noida',\n 'Bareilly',\n 'Aligarh',\n 'Moradabad',\n 'Gorakhpur',\n 'Amroha',\n 'Ayodhya',\n 'Azamgarh',\n 'Bahraich',\n 'Ballia',\n 'Banda',\n 'Barabanki',\n 'Basti',\n 'Bulandshahr',\n 'Chandausi',\n 'Deoria',\n 'Etah',\n 'Etawah',\n 'Farrukhabad',\n 'Fatehpur',\n 'Firozabad',\n 'Gonda',\n 'Hapur',\n 'Hardoi',\n 'Hathras',\n 'Jaunpur',\n 'Jhansi',\n 'Kasganj',\n 'Lakhimpur',\n 'Lalitpur',\n 'Mainpuri',\n 'Mathura',\n 'Mau',\n 'Mirzapur',\n 'Modinagar',\n 'Muzaffarnagar',\n 'Orai',\n 'Pilibhit',\n 'Raebareli',\n 'Rampur',\n 'Saharanpur',\n 'Sambhal',\n 'Shahjahanpur',\n 'Sitapur',\n 'Sultanpur',\n 'Unnao',\n 'Vrindavan',\n ],\n },\n {\n name: 'Uttarakhand',\n aliases: ['Uttaranchal'],\n cities: [\n 'Dehradun',\n 'Haridwar',\n 'Roorkee',\n 'Haldwani',\n 'Rudrapur',\n 'Kashipur',\n 'Rishikesh',\n 'Almora',\n 'Bageshwar',\n 'Champawat',\n 'Gopeshwar',\n 'Khatima',\n 'Kotdwar',\n 'Mussoorie',\n 'Nainital',\n 'Pauri',\n 'Pithoragarh',\n 'Ramnagar',\n 'Rudraprayag',\n 'Sitarganj',\n 'Srinagar',\n 'Tehri',\n 'Uttarkashi',\n ],\n },\n {\n name: 'West Bengal',\n cities: [\n 'Kolkata',\n 'Howrah',\n 'Siliguri',\n 'Durgapur',\n 'Asansol',\n 'Bardhaman',\n 'Bidhannagar',\n 'New Town',\n 'Kharagpur',\n 'Haldia',\n 'Alipurduar',\n 'Baharampur',\n 'Balurghat',\n 'Bally',\n 'Bankura',\n 'Barasat',\n 'Barrackpore',\n 'Bolpur',\n 'Chandannagar',\n 'Chinsurah',\n 'Contai',\n 'Cooch Behar',\n 'Darjeeling',\n 'Digha',\n 'Habra',\n 'Jalpaiguri',\n 'Kalimpong',\n 'Kalyani',\n 'Krishnanagar',\n 'Malda',\n 'Medinipur',\n 'Purulia',\n 'Raiganj',\n 'Serampore',\n 'Shantipur',\n 'Tamluk',\n ],\n },\n {\n name: 'Andaman and Nicobar Islands',\n aliases: ['Andaman & Nicobar Islands', 'Andaman and Nicobar'],\n cities: [\n 'Sri Vijaya Puram',\n 'Campbell Bay',\n 'Car Nicobar',\n 'Diglipur',\n 'Mayabunder',\n 'Rangat',\n 'Shaheed Dweep',\n 'Swaraj Dweep',\n ],\n },\n { name: 'Chandigarh', cities: ['Chandigarh'] },\n {\n name: 'Dadra and Nagar Haveli and Daman and Diu',\n aliases: [\n 'The Dadra and Nagar Haveli and Daman and Diu',\n 'Dadra and Nagar Haveli',\n 'Daman and Diu',\n ],\n cities: ['Silvassa', 'Daman', 'Diu'],\n },\n {\n name: 'Delhi',\n aliases: ['NCT of Delhi', 'National Capital Territory of Delhi'],\n cities: ['Delhi', 'New Delhi'],\n },\n {\n name: 'Jammu and Kashmir',\n aliases: ['Jammu & Kashmir', 'J&K'],\n cities: [\n 'Srinagar',\n 'Jammu',\n 'Anantnag',\n 'Bandipora',\n 'Baramulla',\n 'Budgam',\n 'Doda',\n 'Ganderbal',\n 'Kathua',\n 'Katra',\n 'Kishtwar',\n 'Kulgam',\n 'Kupwara',\n 'Poonch',\n 'Pulwama',\n 'Rajouri',\n 'Ramban',\n 'Reasi',\n 'Samba',\n 'Shopian',\n 'Sopore',\n 'Udhampur',\n ],\n },\n { name: 'Ladakh', cities: ['Leh', 'Kargil'] },\n {\n name: 'Lakshadweep',\n cities: ['Kavaratti', 'Agatti', 'Amini', 'Andrott', 'Kadmat', 'Kalpeni', 'Minicoy'],\n },\n {\n name: 'Puducherry',\n aliases: ['Pondicherry'],\n cities: ['Puducherry', 'Karaikal', 'Mahe', 'Yanam'],\n },\n];\n\n/**\n * Other names a city is searched by, keyed by the list's name: the older name,\n * the district name the location lookup answers with, or both. A search for\n * any of them shows the city as the list writes it.\n */\nexport const CITY_ALIASES: Readonly<Record<string, readonly string[]>> = {\n Bengaluru: ['Bangalore', 'Bengaluru Urban', 'Bangalore Urban'],\n Mumbai: ['Bombay', 'Mumbai Suburban', 'Mumbai City'],\n Chennai: ['Madras'],\n Kolkata: ['Calcutta'],\n Gurugram: ['Gurgaon'],\n Noida: ['Gautam Buddha Nagar'],\n Pune: ['Poona'],\n Vadodara: ['Baroda'],\n Visakhapatnam: ['Vizag', 'Vishakhapatnam'],\n Mysuru: ['Mysore'],\n Mangaluru: ['Mangalore', 'Dakshina Kannada'],\n Hubballi: ['Hubli'],\n Belagavi: ['Belgaum'],\n Kalaburagi: ['Gulbarga'],\n Vijayapura: ['Bijapur'],\n Shivamogga: ['Shimoga'],\n Tumakuru: ['Tumkur'],\n Ballari: ['Bellary'],\n Davanagere: ['Davangere'],\n Chikkamagaluru: ['Chikmagalur'],\n Hosapete: ['Hospet', 'Vijayanagara'],\n Thiruvananthapuram: ['Trivandrum'],\n Kochi: ['Cochin', 'Ernakulam'],\n Kozhikode: ['Calicut'],\n Thrissur: ['Trichur'],\n Alappuzha: ['Alleppey'],\n Kollam: ['Quilon'],\n Kannur: ['Cannanore'],\n Palakkad: ['Palghat'],\n Prayagraj: ['Allahabad'],\n Ayodhya: ['Faizabad'],\n Varanasi: ['Banaras', 'Benares', 'Kashi'],\n Tiruchirappalli: ['Trichy'],\n Thoothukudi: ['Tuticorin'],\n Ooty: ['Udhagamandalam', 'The Nilgiris'],\n Kanchipuram: ['Kanchi'],\n Puducherry: ['Pondicherry'],\n 'Chhatrapati Sambhajinagar': ['Aurangabad'],\n Ahilyanagar: ['Ahmednagar'],\n Dharashiv: ['Osmanabad'],\n Nashik: ['Nasik'],\n 'Pimpri-Chinchwad': ['Pimpri', 'Chinchwad', 'PCMC'],\n 'Vasai-Virar': ['Vasai', 'Virar'],\n Narmadapuram: ['Hoshangabad'],\n Medininagar: ['Daltonganj'],\n Bokaro: ['Bokaro Steel City'],\n Rajamahendravaram: ['Rajahmundry', 'Rajahmahendravaram'],\n Anantapur: ['Anantapuramu'],\n Kadapa: ['Cuddapah'],\n Berhampur: ['Brahmapur'],\n Balasore: ['Baleswar'],\n Keonjhar: ['Kendujhar'],\n Bidhannagar: ['Salt Lake'],\n Malda: ['English Bazar'],\n Baharampur: ['Berhampore'],\n Bardhaman: ['Burdwan', 'Purba Bardhaman'],\n Sohra: ['Cherrapunji'],\n 'Sri Vijaya Puram': ['Port Blair', 'South Andaman'],\n Mohali: ['SAS Nagar', 'Sahibzada Ajit Singh Nagar'],\n Kurukshetra: ['Thanesar'],\n Gyalshing: ['Geyzing'],\n Siaha: ['Saiha'],\n Aalo: ['Along'],\n 'Gaya Ji': ['Gaya'],\n Karimganj: ['Sribhumi'],\n // District names the location lookup answers with, for the city people name.\n Guwahati: ['Kamrup Metropolitan'],\n Vijayawada: ['NTR'],\n Hyderabad: ['Rangareddy', 'Ranga Reddy', 'Medchal Malkajgiri'],\n Panaji: ['Panjim', 'North Goa'],\n Margao: ['Madgaon', 'South Goa'],\n Shillong: ['East Khasi Hills'],\n Itanagar: ['Papum Pare'],\n Agartala: ['West Tripura'],\n Imphal: ['Imphal West', 'Imphal East'],\n Jamshedpur: ['East Singhbhum', 'Purbi Singhbhum'],\n Rudrapur: ['Udham Singh Nagar'],\n Asansol: ['Paschim Bardhaman'],\n Delhi: [\n 'Central Delhi',\n 'East Delhi',\n 'North Delhi',\n 'North East Delhi',\n 'North West Delhi',\n 'Shahdara',\n 'South Delhi',\n 'South East Delhi',\n 'South West Delhi',\n 'West Delhi',\n ],\n // Spellings people also use.\n Chapra: ['Chhapra'],\n Dhaulpur: ['Dholpur'],\n Mangaldoi: ['Mangaldai'],\n Rupnagar: ['Ropar'],\n 'Shaheed Dweep': ['Neil Island'],\n 'Swaraj Dweep': ['Havelock'],\n};\n\nconst key = (text: string) =>\n text\n .toLowerCase()\n .replace(/[.\\s&]+/g, ' ')\n .replace(/\\band\\b/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n/**\n * The state a name means, by its own name or an alias, ignoring case, dots,\n * \"&\" and \"and\" (\"JAMMU AND KASHMIR\", \"Jammu & Kashmir\"). `undefined` when it\n * is not an Indian state or union territory this list knows.\n */\nexport function findIndiaState(name: string | null | undefined): IndiaState | undefined {\n if (!name) return undefined;\n const wanted = key(name);\n if (!wanted) return undefined;\n return INDIA_STATES.find(\n (state) => key(state.name) === wanted || state.aliases?.some((a) => key(a) === wanted),\n );\n}\n\n/**\n * The names the state picker lists, in its order (states A to Z, then union\n * territories A to Z): the closed list a written state is checked against.\n */\nexport const INDIA_STATE_NAMES = INDIA_STATES.map((state) => state.name) as unknown as readonly [\n IndiaStateName,\n ...IndiaStateName[],\n];\n\n/** The state pickers' other names, by the list's name: \"Orissa\" finds Odisha. */\nexport const STATE_ALIASES: Readonly<Record<string, readonly string[]>> = Object.fromEntries(\n INDIA_STATES.filter((state) => state.aliases).map((state) => [state.name, state.aliases ?? []]),\n);\n\n/**\n * A city as the list writes it, when `name` is one of the state's cities or\n * another name of one (\"Bengaluru Urban\", the location lookup's district, is\n * Bengaluru). Anything else comes back as it was given: never guessed.\n */\nexport function listedCityName(state: IndiaState | undefined, name: string): string {\n if (!state) return name;\n const wanted = key(name);\n const city = state.cities.find(\n (c) => key(c) === wanted || CITY_ALIASES[c]?.some((alias) => key(alias) === wanted),\n );\n return city ?? name;\n}\n\n/**\n * A city as the list writes it from its name ALONE (0.18.0), for where no\n * state comes with it (Discover's `?city=` from a shared link): the list's\n * spelling when the name, or another name of a city, matches exactly ONE\n * spelling in the list (\"Bangalore\" is Bengaluru; \"BILASPUR\", a city of two\n * states, is \"Bilaspur\" either way), and the name unchanged when it matches\n * none or two different spellings (never guessed between them). `states` is\n * the list, India's unless a test hands it another.\n */\nexport function canonicalCityName(\n name: string,\n states: readonly Pick<IndiaState, 'cities'>[] = INDIA_STATES,\n): string {\n const wanted = key(name);\n if (!wanted) return name;\n const found = new Set<string>();\n for (const state of states) {\n for (const c of state.cities) {\n if (key(c) === wanted || CITY_ALIASES[c]?.some((alias) => key(alias) === wanted))\n found.add(c);\n }\n }\n const [only] = found;\n return found.size === 1 && only ? only : name;\n}\n\n/**\n * A place as the list writes it, from however it arrived: a member's older\n * draft (\"karnataka\"), the location lookup (\"Bengaluru Urban\" in \"KARNATAKA\"),\n * or another client. The state becomes the list's name when the list knows it\n * (else stays as given, trimmed, for the rule to refuse); the city becomes the\n * list's spelling when it is one of that state's cities or another name of\n * one, and is never guessed otherwise; the country is India.\n *\n * The SERVER applies it to every location it stores, so Discover's exact match\n * finds \"Bengaluru\" however a client spelled it; a client applies it when it\n * restores or suggests a place, so the member sees the spelling they will get.\n */\nexport function canonicalIndiaLocation(place: { city: string; state?: string | null }): {\n city: string;\n state: string;\n country: typeof INDIA;\n} {\n const listed = findIndiaState(place.state);\n return {\n city: listedCityName(listed, place.city.trim()),\n state: listed?.name ?? (place.state ?? '').trim(),\n country: INDIA,\n };\n}\n\n// ─── The rule ────────────────────────────────────────────────────────────────\n\n/**\n * A location as it is WRITTEN (0.17.0): onboarding's finish, the Me tab's\n * personal details, and the server's own suggestion. India only, one of its\n * states and union territories, and a city of any name within it.\n *\n * Until 0.17.0 the schema took any country and any state text while the web\n * locked the country to India and chose the state from this list, so another\n * client could store what no screen can show. The read side keeps\n * `locationSchema`: a location stored before this rule is still read as it is.\n *\n * The STATE is required: every Indian city has one, and the picker lists a\n * state's cities only once it is chosen. It is read the way people and the\n * location lookup write it (\"KARNATAKA\", \"Orissa\", \"Jammu & Kashmir\" are the\n * list's Karnataka, Odisha, Jammu and Kashmir: `findIndiaState`), so any client\n * may send another spelling and the list's name is what is kept. Left empty it\n * is `stateRequired`; one the list does not know is `stateUnknown`.\n */\nexport const indiaLocationSchema = z.object({\n city: z.string().trim().min(1).max(CITY_MAX),\n // A typed string in, the list's name out: never a preprocess (0.18.0: its\n // input read as `unknown`, so a caller typing the body by `z.input` could\n // send anything and still compile).\n // Missing, blank and unknown all reach the CHOICE (`invalid_value`, as a\n // picker's refusal always was): a form words an unchosen state \"Choose your\n // state\", not \"fill this in\" (0.18.0, ram's suite: a length check, then a\n // missing key, each changed that). Typed in: a string, or left out.\n state: z\n .string({ error: VALIDATION_MESSAGE.stateUnknown })\n .default('')\n .transform((given) => findIndiaState(given)?.name ?? given.trim())\n .pipe(\n z.enum(INDIA_STATE_NAMES, {\n error: (issue) =>\n issue.input === '' ? VALIDATION_MESSAGE.stateRequired : VALIDATION_MESSAGE.stateUnknown,\n }),\n ),\n country: z.literal(INDIA),\n});\nexport type IndiaLocation = z.infer<typeof indiaLocationSchema>;\n\n/**\n * The city these coordinates look like, for the member to CONFIRM, or `null`\n * when the lookup could not place them confidently (or they are outside India,\n * whose area data is all there is). A suggestion, never a write: only what the\n * member then submits becomes their location.\n *\n * In the WRITE shape (0.17.0): the server names the state and city the way\n * this list does (`findIndiaState`, `listedCityName`: the lookup's \"Bengaluru\n * Urban\" is Bengaluru), so what it suggests is what the member could have\n * picked, and saving it unchanged can never be refused.\n */\nexport const suggestedLocationSchema = indiaLocationSchema.nullable();\nexport type SuggestedLocation = z.infer<typeof suggestedLocationSchema>;\n"]}
1
+ {"version":3,"file":"india.js","sourceRoot":"","sources":["../../../src/domains/location/india.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * founder-schema — Where a founder is based: India's states, union territories\n * and cities (0.17.0, moved here from the web client, where the location step's\n * lists lived in the screen).\n *\n * Founder Circle is in India for now (the user, 2026-10-18). Since 0.19.0 a\n * member's location is picked from `master_db`'s area tree (`./areas.ts`), so\n * this file no longer holds a write rule; it is the data that names a place\n * the way members say it, read by every side:\n *\n * states all 28 states and 8 union territories, by their current names: a\n * CLOSED list, so a state is one of these or refused (`stateUnknown`)\n * cities per state, the larger cities first, the rest A to Z: the\n * spellings Discover's city filter and a stored city are matched in\n * aliases older or other names a member may search by (\"Bangalore\" finds\n * Bengaluru), and the district names the location lookup answers\n * with (\"Bengaluru Urban\"), so a district's public city and a member's\n * search land on the list's own spelling\n *\n * Written for this product from public knowledge of India's cities; no\n * third-party dataset is copied in.\n *\n * @module founder-schema/domains/location/india\n */\n\nimport { CITY_MAX } from '../../core/limits.js';\nimport type { GST_STATES } from '../billing/gst.js';\n\n/**\n * A state or union territory, by the ONE list of their names: GST's\n * (`GST_STATES`, billing), which already held all 36. This module adds each\n * one's cities and other names; it never spells a state on its own, and a\n * test holds the two sets equal.\n */\nexport type IndiaStateName = (typeof GST_STATES)[number]['name'];\n\nexport interface IndiaState {\n name: IndiaStateName;\n /** Other names the state is searched or answered by. */\n aliases?: readonly string[];\n cities: readonly string[];\n}\n\n/** The one country a location may be in, for now. */\nexport const INDIA = 'India' as const;\n\n/** India's international dialing code: what a phone number is shown with (the stored number has none). */\nexport const INDIA_DIALING_CODE = '+91' as const;\n\nexport const INDIA_STATES: readonly IndiaState[] = [\n {\n name: 'Andhra Pradesh',\n cities: [\n 'Visakhapatnam',\n 'Vijayawada',\n 'Guntur',\n 'Nellore',\n 'Kurnool',\n 'Rajamahendravaram',\n 'Tirupati',\n 'Kakinada',\n 'Kadapa',\n 'Anantapur',\n 'Amaravati',\n 'Adoni',\n 'Bhimavaram',\n 'Chilakaluripet',\n 'Chittoor',\n 'Dharmavaram',\n 'Eluru',\n 'Gudivada',\n 'Guntakal',\n 'Hindupur',\n 'Machilipatnam',\n 'Madanapalle',\n 'Nandyal',\n 'Narasaraopet',\n 'Ongole',\n 'Proddatur',\n 'Puttaparthi',\n 'Srikakulam',\n 'Tadepalligudem',\n 'Tenali',\n 'Vizianagaram',\n ],\n },\n {\n name: 'Arunachal Pradesh',\n cities: [\n 'Itanagar',\n 'Naharlagun',\n 'Pasighat',\n 'Aalo',\n 'Bomdila',\n 'Changlang',\n 'Daporijo',\n 'Khonsa',\n 'Namsai',\n 'Roing',\n 'Seppa',\n 'Tawang',\n 'Tezu',\n 'Ziro',\n ],\n },\n {\n name: 'Assam',\n cities: [\n 'Guwahati',\n 'Dibrugarh',\n 'Silchar',\n 'Jorhat',\n 'Tezpur',\n 'Nagaon',\n 'Tinsukia',\n 'Barpeta',\n 'Bongaigaon',\n 'Dhubri',\n 'Diphu',\n 'Goalpara',\n 'Golaghat',\n 'Haflong',\n 'Hailakandi',\n 'Karimganj',\n 'Kokrajhar',\n 'Mangaldoi',\n 'Nalbari',\n 'North Lakhimpur',\n 'Sivasagar',\n ],\n },\n {\n name: 'Bihar',\n cities: [\n 'Patna',\n 'Gaya Ji',\n 'Bhagalpur',\n 'Muzaffarpur',\n 'Darbhanga',\n 'Purnia',\n 'Arrah',\n 'Aurangabad',\n 'Begusarai',\n 'Bettiah',\n 'Bihar Sharif',\n 'Bodh Gaya',\n 'Buxar',\n 'Chapra',\n 'Dehri',\n 'Hajipur',\n 'Jamalpur',\n 'Jehanabad',\n 'Katihar',\n 'Kishanganj',\n 'Motihari',\n 'Munger',\n 'Nawada',\n 'Saharsa',\n 'Sasaram',\n 'Sitamarhi',\n 'Siwan',\n ],\n },\n {\n name: 'Chhattisgarh',\n cities: [\n 'Raipur',\n 'Bhilai',\n 'Bilaspur',\n 'Korba',\n 'Durg',\n 'Ambikapur',\n 'Bhatapara',\n 'Bijapur',\n 'Chirmiri',\n 'Dhamtari',\n 'Jagdalpur',\n 'Janjgir',\n 'Kanker',\n 'Mahasamund',\n 'Nava Raipur',\n 'Raigarh',\n 'Rajnandgaon',\n ],\n },\n {\n name: 'Goa',\n cities: [\n 'Panaji',\n 'Margao',\n 'Vasco da Gama',\n 'Mapusa',\n 'Ponda',\n 'Bicholim',\n 'Canacona',\n 'Curchorem',\n 'Pernem',\n 'Porvorim',\n 'Quepem',\n 'Sanguem',\n 'Valpoi',\n ],\n },\n {\n name: 'Gujarat',\n cities: [\n 'Ahmedabad',\n 'Surat',\n 'Vadodara',\n 'Rajkot',\n 'Gandhinagar',\n 'Bhavnagar',\n 'Jamnagar',\n 'Junagadh',\n 'Amreli',\n 'Anand',\n 'Ankleshwar',\n 'Bharuch',\n 'Bhuj',\n 'Botad',\n 'Dahod',\n 'Deesa',\n 'Gandhidham',\n 'Godhra',\n 'Himmatnagar',\n 'Kalol',\n 'Mehsana',\n 'Morbi',\n 'Nadiad',\n 'Navsari',\n 'Palanpur',\n 'Patan',\n 'Porbandar',\n 'Surendranagar',\n 'Valsad',\n 'Vapi',\n 'Veraval',\n ],\n },\n {\n name: 'Haryana',\n cities: [\n 'Gurugram',\n 'Faridabad',\n 'Panipat',\n 'Ambala',\n 'Karnal',\n 'Rohtak',\n 'Hisar',\n 'Sonipat',\n 'Panchkula',\n 'Bahadurgarh',\n 'Bhiwani',\n 'Charkhi Dadri',\n 'Fatehabad',\n 'Hansi',\n 'Jhajjar',\n 'Jind',\n 'Kaithal',\n 'Kurukshetra',\n 'Manesar',\n 'Narnaul',\n 'Nuh',\n 'Palwal',\n 'Rewari',\n 'Sirsa',\n 'Yamunanagar',\n ],\n },\n {\n name: 'Himachal Pradesh',\n cities: [\n 'Shimla',\n 'Dharamshala',\n 'Solan',\n 'Mandi',\n 'Baddi',\n 'Bilaspur',\n 'Chamba',\n 'Hamirpur',\n 'Kangra',\n 'Keylong',\n 'Kullu',\n 'Manali',\n 'Nahan',\n 'Palampur',\n 'Paonta Sahib',\n 'Reckong Peo',\n 'Sundernagar',\n 'Una',\n ],\n },\n {\n name: 'Jharkhand',\n cities: [\n 'Ranchi',\n 'Jamshedpur',\n 'Dhanbad',\n 'Bokaro',\n 'Deoghar',\n 'Hazaribagh',\n 'Adityapur',\n 'Chaibasa',\n 'Chatra',\n 'Dumka',\n 'Garhwa',\n 'Giridih',\n 'Godda',\n 'Gumla',\n 'Jamtara',\n 'Khunti',\n 'Koderma',\n 'Latehar',\n 'Lohardaga',\n 'Medininagar',\n 'Pakur',\n 'Phusro',\n 'Ramgarh',\n 'Sahibganj',\n 'Saraikela',\n 'Simdega',\n ],\n },\n {\n name: 'Karnataka',\n cities: [\n 'Bengaluru',\n 'Mysuru',\n 'Mangaluru',\n 'Hubballi',\n 'Dharwad',\n 'Belagavi',\n 'Kalaburagi',\n 'Davanagere',\n 'Bagalkot',\n 'Ballari',\n 'Bidar',\n 'Chamarajanagar',\n 'Chikkaballapur',\n 'Chikkamagaluru',\n 'Chitradurga',\n 'Gadag',\n 'Hassan',\n 'Haveri',\n 'Hosapete',\n 'Karwar',\n 'Kolar',\n 'Koppal',\n 'Madikeri',\n 'Mandya',\n 'Manipal',\n 'Raichur',\n 'Ramanagara',\n 'Shivamogga',\n 'Tumakuru',\n 'Udupi',\n 'Vijayapura',\n 'Yadgir',\n ],\n },\n {\n name: 'Kerala',\n cities: [\n 'Thiruvananthapuram',\n 'Kochi',\n 'Kozhikode',\n 'Thrissur',\n 'Kollam',\n 'Kannur',\n 'Alappuzha',\n 'Palakkad',\n 'Kottayam',\n 'Malappuram',\n 'Aluva',\n 'Changanassery',\n 'Guruvayur',\n 'Kalpetta',\n 'Kanhangad',\n 'Kasaragod',\n 'Kayamkulam',\n 'Manjeri',\n 'Munnar',\n 'Pathanamthitta',\n 'Perinthalmanna',\n 'Ponnani',\n 'Thalassery',\n 'Thodupuzha',\n 'Tirur',\n 'Vatakara',\n ],\n },\n {\n name: 'Madhya Pradesh',\n cities: [\n 'Indore',\n 'Bhopal',\n 'Jabalpur',\n 'Gwalior',\n 'Ujjain',\n 'Sagar',\n 'Dewas',\n 'Satna',\n 'Ratlam',\n 'Rewa',\n 'Agar',\n 'Anuppur',\n 'Ashoknagar',\n 'Balaghat',\n 'Barwani',\n 'Betul',\n 'Bhind',\n 'Burhanpur',\n 'Chhatarpur',\n 'Chhindwara',\n 'Damoh',\n 'Datia',\n 'Dhar',\n 'Dindori',\n 'Guna',\n 'Itarsi',\n 'Jhabua',\n 'Katni',\n 'Khandwa',\n 'Khargone',\n 'Mandla',\n 'Mandsaur',\n 'Morena',\n 'Narmadapuram',\n 'Neemuch',\n 'Panna',\n 'Pithampur',\n 'Rajgarh',\n 'Sehore',\n 'Seoni',\n 'Shahdol',\n 'Shajapur',\n 'Shivpuri',\n 'Sidhi',\n 'Singrauli',\n 'Tikamgarh',\n 'Umaria',\n 'Vidisha',\n ],\n },\n {\n name: 'Maharashtra',\n cities: [\n 'Mumbai',\n 'Pune',\n 'Nagpur',\n 'Thane',\n 'Navi Mumbai',\n 'Nashik',\n 'Chhatrapati Sambhajinagar',\n 'Solapur',\n 'Kolhapur',\n 'Pimpri-Chinchwad',\n 'Ahilyanagar',\n 'Akola',\n 'Alibag',\n 'Amravati',\n 'Baramati',\n 'Beed',\n 'Bhandara',\n 'Bhiwandi',\n 'Buldhana',\n 'Chandrapur',\n 'Dharashiv',\n 'Dhule',\n 'Gadchiroli',\n 'Gondia',\n 'Hingoli',\n 'Ichalkaranji',\n 'Jalgaon',\n 'Jalna',\n 'Kalyan',\n 'Latur',\n 'Lonavala',\n 'Malegaon',\n 'Mira-Bhayandar',\n 'Nanded',\n 'Nandurbar',\n 'Palghar',\n 'Panvel',\n 'Parbhani',\n 'Ratnagiri',\n 'Sangli',\n 'Satara',\n 'Ulhasnagar',\n 'Vasai-Virar',\n 'Wardha',\n 'Washim',\n 'Yavatmal',\n ],\n },\n {\n name: 'Manipur',\n cities: [\n 'Imphal',\n 'Thoubal',\n 'Bishnupur',\n 'Chandel',\n 'Churachandpur',\n 'Jiribam',\n 'Kakching',\n 'Moreh',\n 'Senapati',\n 'Tamenglong',\n 'Ukhrul',\n ],\n },\n {\n name: 'Meghalaya',\n cities: [\n 'Shillong',\n 'Tura',\n 'Jowai',\n 'Baghmara',\n 'Mairang',\n 'Nongpoh',\n 'Nongstoin',\n 'Resubelpara',\n 'Sohra',\n 'Williamnagar',\n ],\n },\n {\n name: 'Mizoram',\n cities: [\n 'Aizawl',\n 'Lunglei',\n 'Champhai',\n 'Hnahthial',\n 'Khawzawl',\n 'Kolasib',\n 'Lawngtlai',\n 'Mamit',\n 'Saitual',\n 'Serchhip',\n 'Siaha',\n ],\n },\n {\n name: 'Nagaland',\n cities: [\n 'Kohima',\n 'Dimapur',\n 'Mokokchung',\n 'Chumoukedima',\n 'Kiphire',\n 'Longleng',\n 'Mon',\n 'Niuland',\n 'Noklak',\n 'Peren',\n 'Phek',\n 'Shamator',\n 'Tseminyu',\n 'Tuensang',\n 'Wokha',\n 'Zunheboto',\n ],\n },\n {\n name: 'Odisha',\n aliases: ['Orissa'],\n cities: [\n 'Bhubaneswar',\n 'Cuttack',\n 'Rourkela',\n 'Berhampur',\n 'Sambalpur',\n 'Puri',\n 'Balasore',\n 'Angul',\n 'Balangir',\n 'Bargarh',\n 'Baripada',\n 'Bhadrak',\n 'Bhawanipatna',\n 'Dhenkanal',\n 'Jagatsinghpur',\n 'Jajpur',\n 'Jeypore',\n 'Jharsuguda',\n 'Kendrapara',\n 'Keonjhar',\n 'Khordha',\n 'Koraput',\n 'Malkangiri',\n 'Nabarangpur',\n 'Nayagarh',\n 'Paradip',\n 'Phulbani',\n 'Rayagada',\n 'Sundargarh',\n 'Talcher',\n ],\n },\n {\n name: 'Punjab',\n cities: [\n 'Ludhiana',\n 'Amritsar',\n 'Jalandhar',\n 'Patiala',\n 'Mohali',\n 'Bathinda',\n 'Abohar',\n 'Barnala',\n 'Batala',\n 'Faridkot',\n 'Fazilka',\n 'Firozpur',\n 'Gurdaspur',\n 'Hoshiarpur',\n 'Kapurthala',\n 'Khanna',\n 'Malerkotla',\n 'Mansa',\n 'Moga',\n 'Muktsar',\n 'Nawanshahr',\n 'Pathankot',\n 'Phagwara',\n 'Rajpura',\n 'Rupnagar',\n 'Sangrur',\n 'Tarn Taran',\n 'Zirakpur',\n ],\n },\n {\n name: 'Rajasthan',\n cities: [\n 'Jaipur',\n 'Jodhpur',\n 'Kota',\n 'Udaipur',\n 'Bikaner',\n 'Ajmer',\n 'Alwar',\n 'Bhilwara',\n 'Banswara',\n 'Baran',\n 'Barmer',\n 'Beawar',\n 'Bharatpur',\n 'Bhiwadi',\n 'Bundi',\n 'Chittorgarh',\n 'Churu',\n 'Dausa',\n 'Dhaulpur',\n 'Dungarpur',\n 'Gangapur City',\n 'Hanumangarh',\n 'Jaisalmer',\n 'Jalore',\n 'Jhalawar',\n 'Jhunjhunu',\n 'Karauli',\n 'Kishangarh',\n 'Mount Abu',\n 'Nagaur',\n 'Neemrana',\n 'Pali',\n 'Pratapgarh',\n 'Rajsamand',\n 'Sawai Madhopur',\n 'Sikar',\n 'Sirohi',\n 'Sri Ganganagar',\n 'Tonk',\n ],\n },\n {\n name: 'Sikkim',\n cities: [\n 'Gangtok',\n 'Namchi',\n 'Gyalshing',\n 'Jorethang',\n 'Mangan',\n 'Pakyong',\n 'Rangpo',\n 'Ravangla',\n 'Singtam',\n 'Soreng',\n ],\n },\n {\n name: 'Tamil Nadu',\n cities: [\n 'Chennai',\n 'Coimbatore',\n 'Madurai',\n 'Tiruchirappalli',\n 'Salem',\n 'Tiruppur',\n 'Erode',\n 'Tirunelveli',\n 'Vellore',\n 'Hosur',\n 'Ambur',\n 'Ariyalur',\n 'Chengalpattu',\n 'Cuddalore',\n 'Dharmapuri',\n 'Dindigul',\n 'Gudiyatham',\n 'Kallakurichi',\n 'Kanchipuram',\n 'Kanyakumari',\n 'Karaikudi',\n 'Karur',\n 'Krishnagiri',\n 'Kumbakonam',\n 'Mayiladuthurai',\n 'Nagapattinam',\n 'Nagercoil',\n 'Namakkal',\n 'Ooty',\n 'Perambalur',\n 'Pollachi',\n 'Pudukkottai',\n 'Rajapalayam',\n 'Ramanathapuram',\n 'Ranipet',\n 'Sivaganga',\n 'Sivakasi',\n 'Tenkasi',\n 'Thanjavur',\n 'Theni',\n 'Thoothukudi',\n 'Tirupattur',\n 'Tiruvallur',\n 'Tiruvannamalai',\n 'Tiruvarur',\n 'Viluppuram',\n 'Virudhunagar',\n ],\n },\n {\n name: 'Telangana',\n cities: [\n 'Hyderabad',\n 'Warangal',\n 'Nizamabad',\n 'Karimnagar',\n 'Khammam',\n 'Secunderabad',\n 'Adilabad',\n 'Bhongir',\n 'Jagtial',\n 'Kamareddy',\n 'Kothagudem',\n 'Mahbubnagar',\n 'Mancherial',\n 'Medak',\n 'Miryalaguda',\n 'Nalgonda',\n 'Nirmal',\n 'Ramagundam',\n 'Sangareddy',\n 'Siddipet',\n 'Suryapet',\n 'Vikarabad',\n 'Wanaparthy',\n 'Zahirabad',\n ],\n },\n {\n name: 'Tripura',\n cities: [\n 'Agartala',\n 'Dharmanagar',\n 'Udaipur',\n 'Ambassa',\n 'Belonia',\n 'Bishalgarh',\n 'Kailashahar',\n 'Kamalpur',\n 'Khowai',\n 'Sabroom',\n 'Sonamura',\n 'Teliamura',\n ],\n },\n {\n name: 'Uttar Pradesh',\n cities: [\n 'Lucknow',\n 'Kanpur',\n 'Noida',\n 'Ghaziabad',\n 'Agra',\n 'Varanasi',\n 'Prayagraj',\n 'Meerut',\n 'Greater Noida',\n 'Bareilly',\n 'Aligarh',\n 'Moradabad',\n 'Gorakhpur',\n 'Amroha',\n 'Ayodhya',\n 'Azamgarh',\n 'Bahraich',\n 'Ballia',\n 'Banda',\n 'Barabanki',\n 'Basti',\n 'Bulandshahr',\n 'Chandausi',\n 'Deoria',\n 'Etah',\n 'Etawah',\n 'Farrukhabad',\n 'Fatehpur',\n 'Firozabad',\n 'Gonda',\n 'Hapur',\n 'Hardoi',\n 'Hathras',\n 'Jaunpur',\n 'Jhansi',\n 'Kasganj',\n 'Lakhimpur',\n 'Lalitpur',\n 'Mainpuri',\n 'Mathura',\n 'Mau',\n 'Mirzapur',\n 'Modinagar',\n 'Muzaffarnagar',\n 'Orai',\n 'Pilibhit',\n 'Raebareli',\n 'Rampur',\n 'Saharanpur',\n 'Sambhal',\n 'Shahjahanpur',\n 'Sitapur',\n 'Sultanpur',\n 'Unnao',\n 'Vrindavan',\n ],\n },\n {\n name: 'Uttarakhand',\n aliases: ['Uttaranchal'],\n cities: [\n 'Dehradun',\n 'Haridwar',\n 'Roorkee',\n 'Haldwani',\n 'Rudrapur',\n 'Kashipur',\n 'Rishikesh',\n 'Almora',\n 'Bageshwar',\n 'Champawat',\n 'Gopeshwar',\n 'Khatima',\n 'Kotdwar',\n 'Mussoorie',\n 'Nainital',\n 'Pauri',\n 'Pithoragarh',\n 'Ramnagar',\n 'Rudraprayag',\n 'Sitarganj',\n 'Srinagar',\n 'Tehri',\n 'Uttarkashi',\n ],\n },\n {\n name: 'West Bengal',\n cities: [\n 'Kolkata',\n 'Howrah',\n 'Siliguri',\n 'Durgapur',\n 'Asansol',\n 'Bardhaman',\n 'Bidhannagar',\n 'New Town',\n 'Kharagpur',\n 'Haldia',\n 'Alipurduar',\n 'Baharampur',\n 'Balurghat',\n 'Bally',\n 'Bankura',\n 'Barasat',\n 'Barrackpore',\n 'Bolpur',\n 'Chandannagar',\n 'Chinsurah',\n 'Contai',\n 'Cooch Behar',\n 'Darjeeling',\n 'Digha',\n 'Habra',\n 'Jalpaiguri',\n 'Kalimpong',\n 'Kalyani',\n 'Krishnanagar',\n 'Malda',\n 'Medinipur',\n 'Purulia',\n 'Raiganj',\n 'Serampore',\n 'Shantipur',\n 'Tamluk',\n ],\n },\n {\n name: 'Andaman and Nicobar Islands',\n aliases: ['Andaman & Nicobar Islands', 'Andaman and Nicobar'],\n cities: [\n 'Sri Vijaya Puram',\n 'Campbell Bay',\n 'Car Nicobar',\n 'Diglipur',\n 'Mayabunder',\n 'Rangat',\n 'Shaheed Dweep',\n 'Swaraj Dweep',\n ],\n },\n { name: 'Chandigarh', cities: ['Chandigarh'] },\n {\n name: 'Dadra and Nagar Haveli and Daman and Diu',\n aliases: [\n 'The Dadra and Nagar Haveli and Daman and Diu',\n 'Dadra and Nagar Haveli',\n 'Daman and Diu',\n ],\n cities: ['Silvassa', 'Daman', 'Diu'],\n },\n {\n name: 'Delhi',\n aliases: ['NCT of Delhi', 'National Capital Territory of Delhi'],\n cities: ['Delhi', 'New Delhi'],\n },\n {\n name: 'Jammu and Kashmir',\n aliases: ['Jammu & Kashmir', 'J&K'],\n cities: [\n 'Srinagar',\n 'Jammu',\n 'Anantnag',\n 'Bandipora',\n 'Baramulla',\n 'Budgam',\n 'Doda',\n 'Ganderbal',\n 'Kathua',\n 'Katra',\n 'Kishtwar',\n 'Kulgam',\n 'Kupwara',\n 'Poonch',\n 'Pulwama',\n 'Rajouri',\n 'Ramban',\n 'Reasi',\n 'Samba',\n 'Shopian',\n 'Sopore',\n 'Udhampur',\n ],\n },\n { name: 'Ladakh', cities: ['Leh', 'Kargil'] },\n {\n name: 'Lakshadweep',\n cities: ['Kavaratti', 'Agatti', 'Amini', 'Andrott', 'Kadmat', 'Kalpeni', 'Minicoy'],\n },\n {\n name: 'Puducherry',\n aliases: ['Pondicherry'],\n cities: ['Puducherry', 'Karaikal', 'Mahe', 'Yanam'],\n },\n];\n\n/**\n * Other names a city is searched by, keyed by the list's name: the older name,\n * the district name the location lookup answers with, or both. A search for\n * any of them shows the city as the list writes it.\n */\nexport const CITY_ALIASES: Readonly<Record<string, readonly string[]>> = {\n // `Bbmp`: how the area tree names Bengaluru's council (0.19.0).\n Bengaluru: ['Bangalore', 'Bengaluru Urban', 'Bangalore Urban', 'Bbmp', 'Bruhat Bengaluru'],\n Mumbai: ['Bombay', 'Mumbai Suburban', 'Mumbai City', 'Greater Mumbai'],\n Chennai: ['Madras', 'Greater Chennai'],\n // The area tree's spelling (LGD).\n Ahmedabad: ['Ahmadabad'],\n Kolkata: ['Calcutta'],\n Gurugram: ['Gurgaon'],\n Noida: ['Gautam Buddha Nagar'],\n Pune: ['Poona'],\n Vadodara: ['Baroda'],\n Visakhapatnam: ['Vizag', 'Vishakhapatnam'],\n Mysuru: ['Mysore'],\n Mangaluru: ['Mangalore', 'Dakshina Kannada'],\n Hubballi: ['Hubli'],\n Belagavi: ['Belgaum'],\n Kalaburagi: ['Gulbarga'],\n Vijayapura: ['Bijapur'],\n Shivamogga: ['Shimoga'],\n Tumakuru: ['Tumkur'],\n Ballari: ['Bellary'],\n Davanagere: ['Davangere'],\n Chikkamagaluru: ['Chikmagalur'],\n Hosapete: ['Hospet', 'Vijayanagara'],\n Thiruvananthapuram: ['Trivandrum'],\n Kochi: ['Cochin', 'Ernakulam'],\n Kozhikode: ['Calicut'],\n Thrissur: ['Trichur'],\n Alappuzha: ['Alleppey'],\n Kollam: ['Quilon'],\n Kannur: ['Cannanore'],\n Palakkad: ['Palghat'],\n Prayagraj: ['Allahabad'],\n Ayodhya: ['Faizabad'],\n Varanasi: ['Banaras', 'Benares', 'Kashi'],\n Tiruchirappalli: ['Trichy'],\n Thoothukudi: ['Tuticorin'],\n Ooty: ['Udhagamandalam', 'The Nilgiris'],\n Kanchipuram: ['Kanchi'],\n Puducherry: ['Pondicherry'],\n 'Chhatrapati Sambhajinagar': ['Aurangabad'],\n Ahilyanagar: ['Ahmednagar'],\n Dharashiv: ['Osmanabad'],\n Nashik: ['Nasik'],\n 'Pimpri-Chinchwad': ['Pimpri', 'Chinchwad', 'PCMC'],\n 'Vasai-Virar': ['Vasai', 'Virar'],\n Narmadapuram: ['Hoshangabad'],\n Medininagar: ['Daltonganj'],\n Bokaro: ['Bokaro Steel City'],\n Rajamahendravaram: ['Rajahmundry', 'Rajahmahendravaram'],\n Anantapur: ['Anantapuramu'],\n Kadapa: ['Cuddapah'],\n Berhampur: ['Brahmapur'],\n Balasore: ['Baleswar'],\n Keonjhar: ['Kendujhar'],\n Bidhannagar: ['Salt Lake'],\n Malda: ['English Bazar'],\n Baharampur: ['Berhampore'],\n Bardhaman: ['Burdwan', 'Purba Bardhaman'],\n Sohra: ['Cherrapunji'],\n 'Sri Vijaya Puram': ['Port Blair', 'South Andaman', 'South Andamans'],\n Mohali: ['SAS Nagar', 'Sahibzada Ajit Singh Nagar', 'S.A.S Nagar'],\n Kurukshetra: ['Thanesar'],\n Gyalshing: ['Geyzing'],\n Siaha: ['Saiha'],\n Aalo: ['Along'],\n 'Gaya Ji': ['Gaya'],\n Karimganj: ['Sribhumi'],\n // District names the location lookup answers with, for the city people name.\n Guwahati: ['Kamrup Metropolitan'],\n Vijayawada: ['NTR'],\n Hyderabad: ['Rangareddy', 'Ranga Reddy', 'Medchal Malkajgiri'],\n Panaji: ['Panjim', 'North Goa'],\n Margao: ['Madgaon', 'South Goa'],\n Shillong: ['East Khasi Hills'],\n Itanagar: ['Papum Pare'],\n Agartala: ['West Tripura'],\n Imphal: ['Imphal West', 'Imphal East'],\n Jamshedpur: ['East Singhbhum', 'Purbi Singhbhum'],\n Rudrapur: ['Udham Singh Nagar'],\n Asansol: ['Paschim Bardhaman'],\n Delhi: [\n 'Central Delhi',\n 'East Delhi',\n 'North Delhi',\n 'North East Delhi',\n 'North West Delhi',\n 'Shahdara',\n 'South Delhi',\n 'South East Delhi',\n 'South West Delhi',\n 'West Delhi',\n ],\n // Spellings people also use.\n Chapra: ['Chhapra'],\n Dhaulpur: ['Dholpur'],\n Mangaldoi: ['Mangaldai'],\n Rupnagar: ['Ropar'],\n 'Shaheed Dweep': ['Neil Island'],\n 'Swaraj Dweep': ['Havelock'],\n};\n\nconst key = (text: string) =>\n text\n .toLowerCase()\n .replace(/[.\\s&-]+/g, ' ')\n .replace(/\\band\\b/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n/**\n * The state a name means, by its own name or an alias, ignoring case, dots,\n * \"&\" and \"and\" (\"JAMMU AND KASHMIR\", \"Jammu & Kashmir\"). `undefined` when it\n * is not an Indian state or union territory this list knows.\n */\nexport function findIndiaState(name: string | null | undefined): IndiaState | undefined {\n if (!name) return undefined;\n const wanted = key(name);\n if (!wanted) return undefined;\n return INDIA_STATES.find(\n (state) => key(state.name) === wanted || state.aliases?.some((a) => key(a) === wanted),\n );\n}\n\n/**\n * The names the state picker lists, in its order (states A to Z, then union\n * territories A to Z): the closed list a written state is checked against.\n */\nexport const INDIA_STATE_NAMES = INDIA_STATES.map((state) => state.name) as unknown as readonly [\n IndiaStateName,\n ...IndiaStateName[],\n];\n\n/** The state pickers' other names, by the list's name: \"Orissa\" finds Odisha. */\nexport const STATE_ALIASES: Readonly<Record<string, readonly string[]>> = Object.fromEntries(\n INDIA_STATES.filter((state) => state.aliases).map((state) => [state.name, state.aliases ?? []]),\n);\n\n/**\n * A city as the list writes it, when `name` is one of the state's cities or\n * another name of one (\"Bengaluru Urban\", the location lookup's district, is\n * Bengaluru). Anything else comes back as it was given: never guessed.\n */\nexport function listedCityName(state: IndiaState | undefined, name: string): string {\n if (!state) return name;\n const wanted = key(name);\n const city = state.cities.find(\n (c) => key(c) === wanted || CITY_ALIASES[c]?.some((alias) => key(alias) === wanted),\n );\n return city ?? name;\n}\n\n/**\n * A city as the list writes it from its name ALONE (0.18.0), for where no\n * state comes with it (Discover's `?city=` from a shared link): the list's\n * spelling when the name, or another name of a city, matches exactly ONE\n * spelling in the list (\"Bangalore\" is Bengaluru; \"BILASPUR\", a city of two\n * states, is \"Bilaspur\" either way), and the name unchanged when it matches\n * none or two different spellings (never guessed between them). `states` is\n * the list, India's unless a test hands it another.\n */\nexport function canonicalCityName(\n name: string,\n states: readonly Pick<IndiaState, 'cities'>[] = INDIA_STATES,\n): string {\n const wanted = key(name);\n if (!wanted) return name;\n const found = new Set<string>();\n for (const state of states) {\n for (const c of state.cities) {\n if (key(c) === wanted || CITY_ALIASES[c]?.some((alias) => key(alias) === wanted))\n found.add(c);\n }\n }\n const [only] = found;\n return found.size === 1 && only ? only : name;\n}\n\n/**\n * The town an urban body is, from the area tree's name for its council\n * (0.19.0): \"Gangtok (M Corp.)\", \"Kohima Municipal Council\", \"City Corporation\n * Panaji\", \"Municipal Committee Akhnoor\", \"Rajgarh (Alwar)\" (a bracket that\n * tells two towns apart) are Gangtok, Kohima, Panaji, Akhnoor, Rajgarh. What\n * is left is the town's own name; one the tree wrote in capitals (\"MAUGANJ\")\n * reads like the rest (Mauganj).\n */\nexport function townName(council: string): string {\n const name = council\n .replace(/\\([^)]*\\)/g, ' ')\n .replace(/\\.{2,}/g, ' ')\n .replace(\n /^\\s*(city corporation|municipal committee|municipal council|municipal board|notified area committee|town area committee|nagar palika,)\\s*/i,\n '',\n )\n .replace(\n /\\s+(municipal corporation|municipal council|municipal committee|municipal board|municipal co-?operation|muncipal council|town council|town committee|town area committee|notified area committee|cantonment board|corporation|municipality|nagar nigam|nagar palika parishad|nagar palika|nagar parishad|nagar panchayat|nagarpanchayat|mahanagara palike|mahanagar palika|mahanagarpalika)\\s*$/i,\n '',\n )\n // A twin town is one hyphen however the tree spaced it (\"Murwara - Katni\" is\n // Murwara-Katni), as the list writes its own (Pimpri-Chinchwad, Vasai-Virar).\n .replace(/\\s*-\\s*/g, '-')\n .replace(/\\s+/g, ' ')\n .trim()\n .replace(/\\.+$/, '');\n return /\\p{Ll}/u.test(name)\n ? name\n : name\n .toLowerCase()\n .replace(/(^|[\\s-])(\\p{L})/gu, (_, gap: string, c: string) => gap + c.toUpperCase());\n}\n\n/**\n * States that are one city for the public (0.19.0): the area tree splits\n * Delhi into districts named by compass point (\"South\", \"Central North\"),\n * which no one calls their city. Any district not itself a listed city (New\n * Delhi is) is the state's city.\n */\nconst ONE_CITY_STATES: Partial<Record<IndiaStateName, string>> = {\n Delhi: 'Delhi',\n Chandigarh: 'Chandigarh',\n};\n\n/**\n * The PUBLIC city of a place picked from the area tree (0.19.0): what cards\n * show and Discover's city filter and facets match. A member in a town (they\n * picked the town, or a ward in it) is in that town; anyone else is in their\n * district (a village, a block, the whole district). Either way in the\n * state's own spelling (`listedCityName`: \"Bbmp\" is Bengaluru, \"Greater\n * Mumbai\" is Mumbai), else the name as the tree has it, cleaned\n * (`townName`; \"Lakshadweep District\" is Lakshadweep). A town or district\n * this list does not hold is still a real place, shown as it is.\n *\n * Always fits a stored city (`CITY_MAX`): a town named longer is shown as its\n * district, and a district longer still is cut at a word. The all-India tree\n * has none (its longest town or district is 35, 2026-10-22); a later tree may.\n */\nexport function publicCityOf(stateName: string, district: string, town?: string | null): string {\n const city = cityOf(stateName, district, town);\n if (city.length <= CITY_MAX) return city;\n if (town) return publicCityOf(stateName, district);\n return city\n .slice(0, CITY_MAX + 1)\n .replace(/\\s+\\S*$/, '')\n .slice(0, CITY_MAX);\n}\n\nfunction cityOf(stateName: string, district: string, town?: string | null): string {\n const state = findIndiaState(stateName);\n const listed = (name: string) => listedCityName(state, name);\n const onList = (name: string) => Boolean(state?.cities.includes(name));\n const townCity = town ? townName(town) : '';\n if (townCity) {\n const named = listed(townCity);\n if (onList(named)) return named;\n const oneCity = state ? ONE_CITY_STATES[state.name] : undefined;\n // A Delhi council named by compass (\"East Delhi\") is Delhi: listed above.\n return oneCity && /delhi/i.test(townCity) ? oneCity : named;\n }\n // A district's own brackets too (\"Khandwa (East Nimar)\" is Khandwa).\n const districtCity = listed(townName(district.replace(/\\s+district\\s*$/i, '')));\n if (onList(districtCity)) return districtCity;\n const oneCity = state ? ONE_CITY_STATES[state.name] : undefined;\n return oneCity ?? districtCity;\n}\n\n/**\n * A place as the list writes it, from however it arrived: a member's older\n * draft (\"karnataka\"), the location lookup (\"Bengaluru Urban\" in \"KARNATAKA\"),\n * or another client. The state becomes the list's name when the list knows it\n * (else stays as given, trimmed, for the rule to refuse); the city becomes the\n * list's spelling when it is one of that state's cities or another name of\n * one, and is never guessed otherwise; the country is India.\n *\n * The SERVER applies it to every location it stores, so Discover's exact match\n * finds \"Bengaluru\" however a client spelled it; a client applies it when it\n * restores or suggests a place, so the member sees the spelling they will get.\n */\nexport function canonicalIndiaLocation(place: { city: string; state?: string | null }): {\n city: string;\n state: string;\n country: typeof INDIA;\n} {\n const listed = findIndiaState(place.state);\n return {\n city: listedCityName(listed, place.city.trim()),\n state: listed?.name ?? (place.state ?? '').trim(),\n country: INDIA,\n };\n}\n"]}
@@ -48,6 +48,28 @@ export declare const mediaPurposeSchema: z.ZodEnum<{
48
48
  community_icon: "community_icon";
49
49
  }>;
50
50
  export type MediaPurpose = z.infer<typeof mediaPurposeSchema>;
51
+ /**
52
+ * An upload's life (pending, processing, ready, attached, detached) and what
53
+ * it is attached to. The backend's storage's own values, from here like every other list (0.20.0).
54
+ */
55
+ export declare const MEDIA_STATUS_VALUES: readonly ["pending", "processing", "ready", "attached", "detached"];
56
+ export declare const mediaStatusSchema: z.ZodEnum<{
57
+ pending: "pending";
58
+ processing: "processing";
59
+ ready: "ready";
60
+ attached: "attached";
61
+ detached: "detached";
62
+ }>;
63
+ export type MediaStatus = z.infer<typeof mediaStatusSchema>;
64
+ export declare const MEDIA_ATTACHMENT_KIND_VALUES: readonly ["post", "avatar", "product", "community", "onboarding"];
65
+ export declare const mediaAttachmentKindSchema: z.ZodEnum<{
66
+ onboarding: "onboarding";
67
+ product: "product";
68
+ community: "community";
69
+ post: "post";
70
+ avatar: "avatar";
71
+ }>;
72
+ export type MediaAttachmentKind = z.infer<typeof mediaAttachmentKindSchema>;
51
73
  /**
52
74
  * The content types a member may upload. Every one is decoded and re-encoded
53
75
  * to WebP before anyone sees it, so this list is about what the server can
@@ -1 +1 @@
1
- {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../../src/domains/media/media.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;GAGG;AACH,eAAO,MAAM,oBAAoB,qFAMvB,CAAC;AACX,eAAO,MAAM,kBAAkB;;;;;;EAA+B,CAAC;AAC/D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B,iEAK7B,CAAC;AACX,eAAO,MAAM,4BAA4B;;;;;EAAqC,CAAC;AAC/E,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,WAAW;;;;;;CAMoC,CAAC;AAE7D,kEAAkE;AAClE,eAAO,MAAM,kBAAkB,QAE9B,CAAC;AAEF,mCAAmC;AACnC,eAAO,MAAM,kBAAkB;;;;iBAI7B,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;iBAO3B,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;iBAG9B,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
1
+ {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../../src/domains/media/media.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;GAGG;AACH,eAAO,MAAM,oBAAoB,qFAMvB,CAAC;AACX,eAAO,MAAM,kBAAkB;;;;;;EAA+B,CAAC;AAC/D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;;GAGG;AACH,eAAO,MAAM,mBAAmB,qEAMtB,CAAC;AACX,eAAO,MAAM,iBAAiB;;;;;;EAA8B,CAAC;AAC7D,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,eAAO,MAAM,4BAA4B,mEAM/B,CAAC;AACX,eAAO,MAAM,yBAAyB;;;;;;EAAuC,CAAC;AAC9E,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B,iEAK7B,CAAC;AACX,eAAO,MAAM,4BAA4B;;;;;EAAqC,CAAC;AAC/E,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,WAAW;;;;;;CAMoC,CAAC;AAE7D,kEAAkE;AAClE,eAAO,MAAM,kBAAkB,QAE9B,CAAC;AAEF,mCAAmC;AACnC,eAAO,MAAM,kBAAkB;;;;iBAI7B,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;iBAO3B,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;iBAG9B,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
@@ -48,6 +48,26 @@ export const MEDIA_PURPOSE_VALUES = [
48
48
  'community_icon',
49
49
  ];
50
50
  export const mediaPurposeSchema = z.enum(MEDIA_PURPOSE_VALUES);
51
+ /**
52
+ * An upload's life (pending, processing, ready, attached, detached) and what
53
+ * it is attached to. The backend's storage's own values, from here like every other list (0.20.0).
54
+ */
55
+ export const MEDIA_STATUS_VALUES = [
56
+ 'pending',
57
+ 'processing',
58
+ 'ready',
59
+ 'attached',
60
+ 'detached',
61
+ ];
62
+ export const mediaStatusSchema = z.enum(MEDIA_STATUS_VALUES);
63
+ export const MEDIA_ATTACHMENT_KIND_VALUES = [
64
+ 'post',
65
+ 'avatar',
66
+ 'product',
67
+ 'community',
68
+ 'onboarding',
69
+ ];
70
+ export const mediaAttachmentKindSchema = z.enum(MEDIA_ATTACHMENT_KIND_VALUES);
51
71
  /**
52
72
  * The content types a member may upload. Every one is decoded and re-encoded
53
73
  * to WebP before anyone sees it, so this list is about what the server can
@@ -1 +1 @@
1
- {"version":3,"file":"media.js","sourceRoot":"","sources":["../../../src/domains/media/media.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,MAAM;IACN,QAAQ;IACR,cAAc;IACd,oBAAoB;IACpB,gBAAgB;CACR,CAAC;AACX,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;AAG/D;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,WAAW;CACH,CAAC;AACX,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;AAG/E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC;IACvB,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,YAAY,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;IAC5B,kBAAkB,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC;IACrC,cAAc,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;CAC4B,CAAC;AAE7D,kEAAkE;AAClE,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,CACxC,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAC3D,CAAC;AAEF,mCAAmC;AACnC,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAClC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACnC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE;CACb,CAAC,CAAC;AAGH;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE;IACZ,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAClC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACnC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACpE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,QAAQ,EAAE;CAC9D,CAAC,CAAC;AAGH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,MAAM,CAAC;IACzD,OAAO,EAAE,kBAAkB;IAC3B,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE;CAC5B,CAAC,CAAC","sourcesContent":["/**\n * founder-schema — Media: what an uploaded image becomes\n *\n * THE PIPELINE, end to end (0.5.0):\n *\n * 1. The client shrinks the photo (long edge at most the largest size in\n * `MEDIA_SIZES`, WebP or JPEG) and asks for an upload slot:\n * `POST /api/v1/uploads/presign` with a purpose, a content type and the\n * exact byte count (`uploadPresignBodySchema`).\n * 2. It PUTs the bytes straight to storage, with the headers it was given.\n * Nothing passes through the API server.\n * 3. It calls `POST /api/v1/uploads/:mediaId/complete`. The server checks the\n * file, decodes it fully, applies the photo's rotation, REMOVES EVERY\n * PIECE OF METADATA (GPS position, camera, timestamps), re-encodes it as\n * WebP at each size in `MEDIA_SIZES`, deletes the raw upload, and answers\n * with `uploadedMediaSchema`.\n * 4. A post (`attachedMediaSchema`), the avatar (`setAvatarBodySchema`,\n * onboarding's `avatarMediaId`), or a product's logo and screenshots\n * (`setProductLogoBodySchema`, `setProductScreenshotsBodySchema`, 0.6.0)\n * takes the media id. One upload is used once, by its owner, for the\n * purpose it was uploaded for.\n *\n * A product's images belong to the PRODUCT, not to whoever on the team uploaded\n * them: they stay when that person leaves or deletes their account, and go when\n * the product is deleted.\n *\n * What nobody sees: the raw upload. It sits in a folder the CDN cannot reach\n * and is deleted when processing finishes, or by storage itself after a day.\n * Only the re-encoded sizes are ever served.\n *\n * An image never attached is deleted after `MEDIA_UNATTACHED_TTL_HOURS`; a\n * deleted post's images, a replaced avatar, and an erased account's images are\n * deleted from storage by the server, so a copied link stops working.\n *\n * @module founder-schema/domains/media\n */\n\nimport { z } from 'zod';\nimport { MEDIA_PLACEHOLDER_MAX } from '../../core/limits.js';\n\n/**\n * What an upload is for. It decides the sizes made and where it may be attached.\n * Append only: every stored upload names one.\n */\nexport const MEDIA_PURPOSE_VALUES = [\n 'post',\n 'avatar',\n 'product_logo',\n 'product_screenshot',\n 'community_icon',\n] as const;\nexport const mediaPurposeSchema = z.enum(MEDIA_PURPOSE_VALUES);\nexport type MediaPurpose = z.infer<typeof mediaPurposeSchema>;\n\n/**\n * The content types a member may upload. Every one is decoded and re-encoded\n * to WebP before anyone sees it, so this list is about what the server can\n * DECODE safely, not what it serves.\n *\n * Not HEIC: an iPhone's photo picker converts HEIC to JPEG for the web, and a\n * client that shrinks the photo first re-encodes it anyway. SVG never: it is a\n * document that can carry script, not an image.\n */\nexport const MEDIA_UPLOAD_CONTENT_TYPES = [\n 'image/jpeg',\n 'image/png',\n 'image/webp',\n 'image/gif',\n] as const;\nexport const mediaUploadContentTypeSchema = z.enum(MEDIA_UPLOAD_CONTENT_TYPES);\nexport type MediaUploadContentType = z.infer<typeof mediaUploadContentTypeSchema>;\n\n/**\n * The sizes each purpose is stored at, smallest first.\n *\n * - post: the LONG edge, aspect kept. 540 for a feed card on a plain screen,\n * 1080 for the same card on a phone's dense screen, 2048 for the full-screen\n * view. An image smaller than a size is never enlarged, so a small image\n * has fewer sizes.\n * - avatar: a SQUARE, cropped around the most interesting region (usually a\n * face). 192 for every small circle (bylines, lists, chat) up to 64 CSS\n * pixels on a 3x screen, 512 for a profile header.\n * - product_logo: a SQUARE, but NEVER CROPPED: the whole logo is fitted\n * inside it and the rest is transparent, because cropping a wordmark the\n * way an avatar is cropped cuts letters off. Transparency is kept. 96 for\n * the product chip on a post (32 CSS pixels at 3x), 256 for a Discover card,\n * 512 for the product page.\n * - product_screenshot: as a post's image (long edge, aspect kept); a phone\n * screenshot is tall, a desktop one wide. An animated GIF (a short demo)\n * stays animated, within the same limits as a post's.\n * - community_icon (0.9.0): as a product logo, a SQUARE fitted, never\n * cropped. 96 for the \"in <community>\" chip, 256 for a card, 512 for the\n * community page. It belongs to the community, not its uploader.\n *\n * A client shrinks a photo to the largest size here before uploading: anything\n * bigger is thrown away by the server anyway, and costs the member data.\n */\nexport const MEDIA_SIZES = {\n post: [540, 1080, 2048],\n avatar: [192, 512],\n product_logo: [96, 256, 512],\n product_screenshot: [540, 1080, 2048],\n community_icon: [96, 256, 512],\n} as const satisfies Record<MediaPurpose, readonly number[]>;\n\n/** The most sizes any purpose stores: the bound on `variants`. */\nexport const MEDIA_VARIANTS_MAX = Math.max(\n ...Object.values(MEDIA_SIZES).map((sizes) => sizes.length),\n);\n\n/** One stored size of an image. */\nexport const mediaVariantSchema = z.object({\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n url: z.url(),\n});\nexport type MediaVariant = z.infer<typeof mediaVariantSchema>;\n\n/**\n * A processed image, as every read shows it.\n *\n * `variants` is a ready-made `srcset`: smallest first, each with its own pixel\n * width. `url`, `width` and `height` repeat the largest one, so a client that\n * ignores `variants` still renders correctly and can reserve the image's box\n * from the aspect ratio before it loads (no layout shift).\n *\n * `placeholder` is a ThumbHash (base64): a ~30 character blurred preview a\n * client can paint instantly while the image loads.\n *\n * URLs point at our media CDN. They come from our own pipeline, never from a\n * member, so a plain `z.url()`.\n */\nexport const mediaImageSchema = z.object({\n id: z.string(),\n url: z.url(),\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n variants: z.array(mediaVariantSchema).min(1).max(MEDIA_VARIANTS_MAX),\n placeholder: z.string().max(MEDIA_PLACEHOLDER_MAX).optional(),\n});\nexport type MediaImage = z.infer<typeof mediaImageSchema>;\n\n/**\n * `POST /api/v1/uploads/:mediaId/complete` answers with this: the image as it\n * will appear, not yet attached to anything.\n *\n * `expiresAt` is when the server deletes it if it is still unattached\n * (`MEDIA_UNATTACHED_TTL_HOURS` after the slot was issued). A composer left\n * open longer than that must upload again.\n */\nexport const uploadedMediaSchema = mediaImageSchema.extend({\n purpose: mediaPurposeSchema,\n expiresAt: z.iso.datetime(),\n});\nexport type UploadedMedia = z.infer<typeof uploadedMediaSchema>;\n"]}
1
+ {"version":3,"file":"media.js","sourceRoot":"","sources":["../../../src/domains/media/media.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * founder-schema — Media: what an uploaded image becomes\n *\n * THE PIPELINE, end to end (0.5.0):\n *\n * 1. The client shrinks the photo (long edge at most the largest size in\n * `MEDIA_SIZES`, WebP or JPEG) and asks for an upload slot:\n * `POST /api/v1/uploads/presign` with a purpose, a content type and the\n * exact byte count (`uploadPresignBodySchema`).\n * 2. It PUTs the bytes straight to storage, with the headers it was given.\n * Nothing passes through the API server.\n * 3. It calls `POST /api/v1/uploads/:mediaId/complete`. The server checks the\n * file, decodes it fully, applies the photo's rotation, REMOVES EVERY\n * PIECE OF METADATA (GPS position, camera, timestamps), re-encodes it as\n * WebP at each size in `MEDIA_SIZES`, deletes the raw upload, and answers\n * with `uploadedMediaSchema`.\n * 4. A post (`attachedMediaSchema`), the avatar (`setAvatarBodySchema`,\n * onboarding's `avatarMediaId`), or a product's logo and screenshots\n * (`setProductLogoBodySchema`, `setProductScreenshotsBodySchema`, 0.6.0)\n * takes the media id. One upload is used once, by its owner, for the\n * purpose it was uploaded for.\n *\n * A product's images belong to the PRODUCT, not to whoever on the team uploaded\n * them: they stay when that person leaves or deletes their account, and go when\n * the product is deleted.\n *\n * What nobody sees: the raw upload. It sits in a folder the CDN cannot reach\n * and is deleted when processing finishes, or by storage itself after a day.\n * Only the re-encoded sizes are ever served.\n *\n * An image never attached is deleted after `MEDIA_UNATTACHED_TTL_HOURS`; a\n * deleted post's images, a replaced avatar, and an erased account's images are\n * deleted from storage by the server, so a copied link stops working.\n *\n * @module founder-schema/domains/media\n */\n\nimport { z } from 'zod';\nimport { MEDIA_PLACEHOLDER_MAX } from '../../core/limits.js';\n\n/**\n * What an upload is for. It decides the sizes made and where it may be attached.\n * Append only: every stored upload names one.\n */\nexport const MEDIA_PURPOSE_VALUES = [\n 'post',\n 'avatar',\n 'product_logo',\n 'product_screenshot',\n 'community_icon',\n] as const;\nexport const mediaPurposeSchema = z.enum(MEDIA_PURPOSE_VALUES);\nexport type MediaPurpose = z.infer<typeof mediaPurposeSchema>;\n\n/**\n * An upload's life (pending, processing, ready, attached, detached) and what\n * it is attached to. The backend's storage's own values, from here like every other list (0.20.0).\n */\nexport const MEDIA_STATUS_VALUES = [\n 'pending',\n 'processing',\n 'ready',\n 'attached',\n 'detached',\n] as const;\nexport const mediaStatusSchema = z.enum(MEDIA_STATUS_VALUES);\nexport type MediaStatus = z.infer<typeof mediaStatusSchema>;\nexport const MEDIA_ATTACHMENT_KIND_VALUES = [\n 'post',\n 'avatar',\n 'product',\n 'community',\n 'onboarding',\n] as const;\nexport const mediaAttachmentKindSchema = z.enum(MEDIA_ATTACHMENT_KIND_VALUES);\nexport type MediaAttachmentKind = z.infer<typeof mediaAttachmentKindSchema>;\n\n/**\n * The content types a member may upload. Every one is decoded and re-encoded\n * to WebP before anyone sees it, so this list is about what the server can\n * DECODE safely, not what it serves.\n *\n * Not HEIC: an iPhone's photo picker converts HEIC to JPEG for the web, and a\n * client that shrinks the photo first re-encodes it anyway. SVG never: it is a\n * document that can carry script, not an image.\n */\nexport const MEDIA_UPLOAD_CONTENT_TYPES = [\n 'image/jpeg',\n 'image/png',\n 'image/webp',\n 'image/gif',\n] as const;\nexport const mediaUploadContentTypeSchema = z.enum(MEDIA_UPLOAD_CONTENT_TYPES);\nexport type MediaUploadContentType = z.infer<typeof mediaUploadContentTypeSchema>;\n\n/**\n * The sizes each purpose is stored at, smallest first.\n *\n * - post: the LONG edge, aspect kept. 540 for a feed card on a plain screen,\n * 1080 for the same card on a phone's dense screen, 2048 for the full-screen\n * view. An image smaller than a size is never enlarged, so a small image\n * has fewer sizes.\n * - avatar: a SQUARE, cropped around the most interesting region (usually a\n * face). 192 for every small circle (bylines, lists, chat) up to 64 CSS\n * pixels on a 3x screen, 512 for a profile header.\n * - product_logo: a SQUARE, but NEVER CROPPED: the whole logo is fitted\n * inside it and the rest is transparent, because cropping a wordmark the\n * way an avatar is cropped cuts letters off. Transparency is kept. 96 for\n * the product chip on a post (32 CSS pixels at 3x), 256 for a Discover card,\n * 512 for the product page.\n * - product_screenshot: as a post's image (long edge, aspect kept); a phone\n * screenshot is tall, a desktop one wide. An animated GIF (a short demo)\n * stays animated, within the same limits as a post's.\n * - community_icon (0.9.0): as a product logo, a SQUARE fitted, never\n * cropped. 96 for the \"in <community>\" chip, 256 for a card, 512 for the\n * community page. It belongs to the community, not its uploader.\n *\n * A client shrinks a photo to the largest size here before uploading: anything\n * bigger is thrown away by the server anyway, and costs the member data.\n */\nexport const MEDIA_SIZES = {\n post: [540, 1080, 2048],\n avatar: [192, 512],\n product_logo: [96, 256, 512],\n product_screenshot: [540, 1080, 2048],\n community_icon: [96, 256, 512],\n} as const satisfies Record<MediaPurpose, readonly number[]>;\n\n/** The most sizes any purpose stores: the bound on `variants`. */\nexport const MEDIA_VARIANTS_MAX = Math.max(\n ...Object.values(MEDIA_SIZES).map((sizes) => sizes.length),\n);\n\n/** One stored size of an image. */\nexport const mediaVariantSchema = z.object({\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n url: z.url(),\n});\nexport type MediaVariant = z.infer<typeof mediaVariantSchema>;\n\n/**\n * A processed image, as every read shows it.\n *\n * `variants` is a ready-made `srcset`: smallest first, each with its own pixel\n * width. `url`, `width` and `height` repeat the largest one, so a client that\n * ignores `variants` still renders correctly and can reserve the image's box\n * from the aspect ratio before it loads (no layout shift).\n *\n * `placeholder` is a ThumbHash (base64): a ~30 character blurred preview a\n * client can paint instantly while the image loads.\n *\n * URLs point at our media CDN. They come from our own pipeline, never from a\n * member, so a plain `z.url()`.\n */\nexport const mediaImageSchema = z.object({\n id: z.string(),\n url: z.url(),\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n variants: z.array(mediaVariantSchema).min(1).max(MEDIA_VARIANTS_MAX),\n placeholder: z.string().max(MEDIA_PLACEHOLDER_MAX).optional(),\n});\nexport type MediaImage = z.infer<typeof mediaImageSchema>;\n\n/**\n * `POST /api/v1/uploads/:mediaId/complete` answers with this: the image as it\n * will appear, not yet attached to anything.\n *\n * `expiresAt` is when the server deletes it if it is still unattached\n * (`MEDIA_UNATTACHED_TTL_HOURS` after the slot was issued). A composer left\n * open longer than that must upload again.\n */\nexport const uploadedMediaSchema = mediaImageSchema.extend({\n purpose: mediaPurposeSchema,\n expiresAt: z.iso.datetime(),\n});\nexport type UploadedMedia = z.infer<typeof uploadedMediaSchema>;\n"]}
@@ -64,12 +64,17 @@ export declare const memberDirectoryQuerySchema: z.ZodObject<{
64
64
  }, z.core.$strip>;
65
65
  export type MemberDirectoryQuery = z.infer<typeof memberDirectoryQuerySchema>;
66
66
  export type MemberDirectoryQueryInput = z.input<typeof memberDirectoryQuerySchema>;
67
- /** One row of the directory. */
67
+ /**
68
+ * One row of the directory: the person (0.20.0, `personSchema`, so `userId`
69
+ * where it was `id`) and what staff see beside them.
70
+ */
68
71
  export declare const memberSummarySchema: z.ZodObject<{
69
- id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
70
- displayName: z.ZodString;
72
+ userId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
71
73
  username: z.ZodNullable<z.ZodString>;
74
+ displayName: z.ZodString;
75
+ firstName: z.ZodString;
72
76
  avatarUrl: z.ZodNullable<z.ZodURL>;
77
+ former: z.ZodBoolean;
73
78
  email: z.ZodNullable<z.ZodString>;
74
79
  status: z.ZodEnum<{
75
80
  active: "active";
@@ -87,10 +92,12 @@ export declare const memberSummarySchema: z.ZodObject<{
87
92
  export type MemberSummary = z.infer<typeof memberSummarySchema>;
88
93
  export declare const memberDirectoryPageSchema: z.ZodObject<{
89
94
  items: z.ZodArray<z.ZodObject<{
90
- id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
91
- displayName: z.ZodString;
95
+ userId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
92
96
  username: z.ZodNullable<z.ZodString>;
97
+ displayName: z.ZodString;
98
+ firstName: z.ZodString;
93
99
  avatarUrl: z.ZodNullable<z.ZodURL>;
100
+ former: z.ZodBoolean;
94
101
  email: z.ZodNullable<z.ZodString>;
95
102
  status: z.ZodEnum<{
96
103
  active: "active";
@@ -113,17 +120,23 @@ export declare const suspensionSchema: z.ZodObject<{
113
120
  since: z.ZodISODateTime;
114
121
  reason: z.ZodString;
115
122
  by: z.ZodNullable<z.ZodObject<{
116
- id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
123
+ userId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
124
+ username: z.ZodNullable<z.ZodString>;
117
125
  displayName: z.ZodString;
126
+ firstName: z.ZodString;
127
+ avatarUrl: z.ZodNullable<z.ZodURL>;
128
+ former: z.ZodBoolean;
118
129
  }, z.core.$strip>>;
119
130
  }, z.core.$strip>;
120
131
  export type Suspension = z.infer<typeof suspensionSchema>;
121
132
  /** One member, as staff see them. */
122
133
  export declare const memberDetailSchema: z.ZodObject<{
123
- id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
124
- displayName: z.ZodString;
134
+ userId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
125
135
  username: z.ZodNullable<z.ZodString>;
136
+ displayName: z.ZodString;
137
+ firstName: z.ZodString;
126
138
  avatarUrl: z.ZodNullable<z.ZodURL>;
139
+ former: z.ZodBoolean;
127
140
  email: z.ZodNullable<z.ZodString>;
128
141
  status: z.ZodEnum<{
129
142
  active: "active";
@@ -150,8 +163,12 @@ export declare const memberDetailSchema: z.ZodObject<{
150
163
  since: z.ZodISODateTime;
151
164
  reason: z.ZodString;
152
165
  by: z.ZodNullable<z.ZodObject<{
153
- id: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
166
+ userId: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
167
+ username: z.ZodNullable<z.ZodString>;
154
168
  displayName: z.ZodString;
169
+ firstName: z.ZodString;
170
+ avatarUrl: z.ZodNullable<z.ZodURL>;
171
+ former: z.ZodBoolean;
155
172
  }, z.core.$strip>>;
156
173
  }, z.core.$strip>>;
157
174
  viewer: z.ZodObject<{
@@ -1 +1 @@
1
- {"version":3,"file":"members.d.ts","sourceRoot":"","sources":["../../../src/domains/members/members.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAmBxB,iFAAiF;AACjF,eAAO,MAAM,oBAAoB,kCAAmC,CAAC;AACrE,eAAO,MAAM,kBAAkB;;;EAA+B,CAAC;AAC/D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,sCAAsC;AACtC,eAAO,MAAM,kBAAkB;;iBAAyC,CAAC;AACzE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;;;GAIG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;iBAKrC,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC9E,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAEnF,gCAAgC;AAChC,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;iBAa9B,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;iBAAuC,CAAC;AAC9E,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,6BAA6B;AAC7B,eAAO,MAAM,gBAAgB;;;;;;;iBAK3B,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,qCAAqC;AACrC,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAiD7B,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,sFAAsF;AACtF,eAAO,MAAM,uBAAuB;;iBAElC,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC"}
1
+ {"version":3,"file":"members.d.ts","sourceRoot":"","sources":["../../../src/domains/members/members.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAmBxB,iFAAiF;AACjF,eAAO,MAAM,oBAAoB,kCAAmC,CAAC;AACrE,eAAO,MAAM,kBAAkB;;;EAA+B,CAAC;AAC/D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,sCAAsC;AACtC,eAAO,MAAM,kBAAkB;;iBAAyC,CAAC;AACzE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;;;GAIG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;iBAKrC,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC9E,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAEnF;;;GAGG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;iBAQ9B,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;iBAAuC,CAAC;AAC9E,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,6BAA6B;AAC7B,eAAO,MAAM,gBAAgB;;;;;;;;;;;iBAK3B,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,qCAAqC;AACrC,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAiD7B,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,sFAAsF;AACtF,eAAO,MAAM,uBAAuB;;iBAElC,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC"}
@@ -33,10 +33,11 @@ import { z } from 'zod';
33
33
  import { capabilitySchema } from '../../access/capabilities.js';
34
34
  import { platformRoleSchema } from '../../access/roles.js';
35
35
  import { standingSchema } from '../../access/standing.js';
36
- import { emptyStringToUndefined, objectIdSchema, optionalTrimmedString, paginationQuerySchema, usernameSchema, } from '../../core/common.js';
36
+ import { emptyStringToUndefined, objectIdSchema, optionalTrimmedString, paginationQuerySchema, } from '../../core/common.js';
37
37
  import { MEMBER_SEARCH_MAX, SUSPENSION_REASON_MAX, SUSPENSION_REASON_MIN, } from '../../core/limits.js';
38
38
  import { paginatedSchema } from '../../core/responses.js';
39
39
  import { membershipSchema, planTierSchema } from '../membership/membership.js';
40
+ import { personSchema } from '../people/person.js';
40
41
  /** What staff can see an account's state as. A deleted account is not listed. */
41
42
  export const MEMBER_STATUS_VALUES = ['active', 'suspended'];
42
43
  export const memberStatusSchema = z.enum(MEMBER_STATUS_VALUES);
@@ -53,13 +54,11 @@ export const memberDirectoryQuerySchema = paginationQuerySchema.extend({
53
54
  /** Only people holding this staff role. */
54
55
  role: z.preprocess(emptyStringToUndefined, platformRoleSchema.optional()),
55
56
  });
56
- /** One row of the directory. */
57
- export const memberSummarySchema = z.object({
58
- id: objectIdSchema,
59
- displayName: z.string(),
60
- /** Null when they have no founder profile (never finished onboarding). */
61
- username: usernameSchema.nullable(),
62
- avatarUrl: z.url().nullable(),
57
+ /**
58
+ * One row of the directory: the person (0.20.0, `personSchema`, so `userId`
59
+ * where it was `id`) and what staff see beside them.
60
+ */
61
+ export const memberSummarySchema = personSchema.extend({
63
62
  /** Null when the asking role may not see it. */
64
63
  email: z.string().nullable(),
65
64
  status: memberStatusSchema,
@@ -73,8 +72,8 @@ export const memberDirectoryPageSchema = paginatedSchema(memberSummarySchema);
73
72
  export const suspensionSchema = z.object({
74
73
  since: z.iso.datetime(),
75
74
  reason: z.string(),
76
- /** Who suspended them, by name at the time. */
77
- by: z.object({ id: objectIdSchema, displayName: z.string() }).nullable(),
75
+ /** Who suspended them (0.20.0: the person, live); null when a script did. */
76
+ by: personSchema.nullable(),
78
77
  });
79
78
  /** One member, as staff see them. */
80
79
  export const memberDetailSchema = memberSummarySchema.extend({
@@ -1 +1 @@
1
- {"version":3,"file":"members.js","sourceRoot":"","sources":["../../../src/domains/members/members.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * founder-schema: the staff member directory\n *\n * GET /api/v1/members ?q&status&role&limit&cursor\n * GET /api/v1/members/:memberId one member, as staff see them\n * POST /api/v1/members/:memberId/suspension { reason } suspend\n * DELETE /api/v1/members/:memberId/suspension lift it\n *\n * Every staff role has a Members tab: a moderator looks up who wrote\n * something, a support agent finds the person who wrote in, a manager decides\n * on a suspension. What each sees is the server's call, per field: a\n * moderator gets no email (`email: null`), because finding a member's\n * address is support's job, not moderation's.\n *\n * A SUSPENDED member cannot use the product at all, on any device, from the\n * next request on (every call answers `ACCOUNT_SUSPENDED`); their posts stay\n * up unless moderated separately, and a staff role they were acting in is\n * switched off. Lifting it restores everything else.\n *\n * SEARCH (`q`) finds people by the start of their name or handle among listed\n * founders, or by their exact email among everyone (only for a role that may\n * see emails: a moderator's email search finds nothing). It returns up to\n * `limit` matches in one page (type more to narrow), not a pageable list. Who may suspend whom is the access policy's: never\n * yourself, never a superadmin, and a manager never a fellow manager.\n *\n * Each detail carries a `viewer` block of what the asking staff member may do\n * to THIS member, worked out by the server, so the screen shows only the\n * buttons that will work.\n *\n * @module founder-schema/domains/members\n */\n\nimport { z } from 'zod';\nimport { capabilitySchema } from '../../access/capabilities.js';\nimport { platformRoleSchema } from '../../access/roles.js';\nimport { standingSchema } from '../../access/standing.js';\nimport {\n emptyStringToUndefined,\n objectIdSchema,\n optionalTrimmedString,\n paginationQuerySchema,\n usernameSchema,\n} from '../../core/common.js';\nimport {\n MEMBER_SEARCH_MAX,\n SUSPENSION_REASON_MAX,\n SUSPENSION_REASON_MIN,\n} from '../../core/limits.js';\nimport { paginatedSchema } from '../../core/responses.js';\nimport { membershipSchema, planTierSchema } from '../membership/membership.js';\n\n/** What staff can see an account's state as. A deleted account is not listed. */\nexport const MEMBER_STATUS_VALUES = ['active', 'suspended'] as const;\nexport const memberStatusSchema = z.enum(MEMBER_STATUS_VALUES);\nexport type MemberStatus = z.infer<typeof memberStatusSchema>;\n\n/** `:memberId` in the paths above. */\nexport const memberParamsSchema = z.object({ memberId: objectIdSchema });\nexport type MemberParams = z.infer<typeof memberParamsSchema>;\n\n/**\n * The directory's query. `q` is a name or handle prefix, or a whole email\n * address (anything with an `@` is matched as an email, exactly). An emptied\n * box is \"no search\", not an error.\n */\nexport const memberDirectoryQuerySchema = paginationQuerySchema.extend({\n q: optionalTrimmedString(MEMBER_SEARCH_MAX),\n status: z.preprocess(emptyStringToUndefined, memberStatusSchema.optional()),\n /** Only people holding this staff role. */\n role: z.preprocess(emptyStringToUndefined, platformRoleSchema.optional()),\n});\nexport type MemberDirectoryQuery = z.infer<typeof memberDirectoryQuerySchema>;\nexport type MemberDirectoryQueryInput = z.input<typeof memberDirectoryQuerySchema>;\n\n/** One row of the directory. */\nexport const memberSummarySchema = z.object({\n id: objectIdSchema,\n displayName: z.string(),\n /** Null when they have no founder profile (never finished onboarding). */\n username: usernameSchema.nullable(),\n avatarUrl: z.url().nullable(),\n /** Null when the asking role may not see it. */\n email: z.string().nullable(),\n status: memberStatusSchema,\n /** Staff roles held, highest first. Empty for an ordinary member. */\n roles: z.array(platformRoleSchema),\n joinedAt: z.iso.datetime(),\n lastActiveAt: z.iso.datetime().nullable(),\n});\nexport type MemberSummary = z.infer<typeof memberSummarySchema>;\n\nexport const memberDirectoryPageSchema = paginatedSchema(memberSummarySchema);\nexport type MemberDirectoryPage = z.infer<typeof memberDirectoryPageSchema>;\n\n/** A suspension in force. */\nexport const suspensionSchema = z.object({\n since: z.iso.datetime(),\n reason: z.string(),\n /** Who suspended them, by name at the time. */\n by: z.object({ id: objectIdSchema, displayName: z.string() }).nullable(),\n});\nexport type Suspension = z.infer<typeof suspensionSchema>;\n\n/** One member, as staff see them. */\nexport const memberDetailSchema = memberSummarySchema.extend({\n headline: z.string().nullable(),\n /** Their city, as declared on their profile. */\n city: z.string().nullable(),\n counts: z.object({\n posts: z.number().int().min(0),\n polls: z.number().int().min(0),\n comments: z.number().int().min(0),\n /** Reports filed about their posts, polls and comments that are still up. */\n reportsAgainst: z.number().int().min(0),\n /** Tickets they have raised. */\n tickets: z.number().int().min(0),\n }),\n suspension: suspensionSchema.nullable(),\n /** What the asking staff member may do to this member. */\n viewer: z.object({\n canSuspend: z.boolean(),\n /** Roles the asker may grant or revoke on this member (never their own). */\n grantableRoles: z.array(platformRoleSchema),\n /** May clear this member's forgotten MPIN (superadmin, someone else). */\n canResetMpin: z.boolean(),\n /** Capabilities the asker may grant or revoke on this member (never their own) (0.9.0). */\n grantableCapabilities: z.array(capabilitySchema),\n /** May give them a membership (0.12.0): they hold none, and the asker may, and it is not themselves. */\n canGrantMembership: z.boolean(),\n /**\n * May take their membership away (0.12.0): founding, coupon or granted\n * (a paid one is refunded instead), and the asker may, and not their own.\n */\n canRevokeMembership: z.boolean(),\n /** May list their payments (0.12.0): support, managers, superadmin. */\n canReadPayments: z.boolean(),\n /**\n * May see their membership and plan (0.12.0): support, managers,\n * superadmin. Moderators may not: `membership` and `plan` come null to\n * them, which is not \"not a member\".\n */\n canReadMembership: z.boolean(),\n }),\n /** Whether they take part (0.12.0). Staff always do. */\n standing: standingSchema,\n /** Their membership (0.12.0), or null (a viewer, staff holding none, or an asker who may not see it). */\n membership: membershipSchema.nullable(),\n /** The plan in force now and when all their plan time ends (0.12.0), or null (none, or not the asker's to see). */\n plan: z.object({ tier: planTierSchema, endsAt: z.iso.datetime() }).nullable(),\n /** The capabilities they hold (0.9.0), e.g. `create_communities`. */\n capabilities: z.array(capabilitySchema),\n /** Whether they have set an MPIN. Only meaningful for staff. */\n mpinSet: z.boolean(),\n});\nexport type MemberDetail = z.infer<typeof memberDetailSchema>;\n\n/** `POST /members/:memberId/suspension`. The reason is on record in the audit log. */\nexport const suspendMemberBodySchema = z.object({\n reason: z.string().trim().min(SUSPENSION_REASON_MIN).max(SUSPENSION_REASON_MAX),\n});\nexport type SuspendMemberBody = z.infer<typeof suspendMemberBodySchema>;\n"]}
1
+ {"version":3,"file":"members.js","sourceRoot":"","sources":["../../../src/domains/members/members.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * founder-schema: the staff member directory\n *\n * GET /api/v1/members ?q&status&role&limit&cursor\n * GET /api/v1/members/:memberId one member, as staff see them\n * POST /api/v1/members/:memberId/suspension { reason } suspend\n * DELETE /api/v1/members/:memberId/suspension lift it\n *\n * Every staff role has a Members tab: a moderator looks up who wrote\n * something, a support agent finds the person who wrote in, a manager decides\n * on a suspension. What each sees is the server's call, per field: a\n * moderator gets no email (`email: null`), because finding a member's\n * address is support's job, not moderation's.\n *\n * A SUSPENDED member cannot use the product at all, on any device, from the\n * next request on (every call answers `ACCOUNT_SUSPENDED`); their posts stay\n * up unless moderated separately, and a staff role they were acting in is\n * switched off. Lifting it restores everything else.\n *\n * SEARCH (`q`) finds people by the start of their name or handle among listed\n * founders, or by their exact email among everyone (only for a role that may\n * see emails: a moderator's email search finds nothing). It returns up to\n * `limit` matches in one page (type more to narrow), not a pageable list. Who may suspend whom is the access policy's: never\n * yourself, never a superadmin, and a manager never a fellow manager.\n *\n * Each detail carries a `viewer` block of what the asking staff member may do\n * to THIS member, worked out by the server, so the screen shows only the\n * buttons that will work.\n *\n * @module founder-schema/domains/members\n */\n\nimport { z } from 'zod';\nimport { capabilitySchema } from '../../access/capabilities.js';\nimport { platformRoleSchema } from '../../access/roles.js';\nimport { standingSchema } from '../../access/standing.js';\nimport {\n emptyStringToUndefined,\n objectIdSchema,\n optionalTrimmedString,\n paginationQuerySchema,\n} from '../../core/common.js';\nimport {\n MEMBER_SEARCH_MAX,\n SUSPENSION_REASON_MAX,\n SUSPENSION_REASON_MIN,\n} from '../../core/limits.js';\nimport { paginatedSchema } from '../../core/responses.js';\nimport { membershipSchema, planTierSchema } from '../membership/membership.js';\nimport { personSchema } from '../people/person.js';\n\n/** What staff can see an account's state as. A deleted account is not listed. */\nexport const MEMBER_STATUS_VALUES = ['active', 'suspended'] as const;\nexport const memberStatusSchema = z.enum(MEMBER_STATUS_VALUES);\nexport type MemberStatus = z.infer<typeof memberStatusSchema>;\n\n/** `:memberId` in the paths above. */\nexport const memberParamsSchema = z.object({ memberId: objectIdSchema });\nexport type MemberParams = z.infer<typeof memberParamsSchema>;\n\n/**\n * The directory's query. `q` is a name or handle prefix, or a whole email\n * address (anything with an `@` is matched as an email, exactly). An emptied\n * box is \"no search\", not an error.\n */\nexport const memberDirectoryQuerySchema = paginationQuerySchema.extend({\n q: optionalTrimmedString(MEMBER_SEARCH_MAX),\n status: z.preprocess(emptyStringToUndefined, memberStatusSchema.optional()),\n /** Only people holding this staff role. */\n role: z.preprocess(emptyStringToUndefined, platformRoleSchema.optional()),\n});\nexport type MemberDirectoryQuery = z.infer<typeof memberDirectoryQuerySchema>;\nexport type MemberDirectoryQueryInput = z.input<typeof memberDirectoryQuerySchema>;\n\n/**\n * One row of the directory: the person (0.20.0, `personSchema`, so `userId`\n * where it was `id`) and what staff see beside them.\n */\nexport const memberSummarySchema = personSchema.extend({\n /** Null when the asking role may not see it. */\n email: z.string().nullable(),\n status: memberStatusSchema,\n /** Staff roles held, highest first. Empty for an ordinary member. */\n roles: z.array(platformRoleSchema),\n joinedAt: z.iso.datetime(),\n lastActiveAt: z.iso.datetime().nullable(),\n});\nexport type MemberSummary = z.infer<typeof memberSummarySchema>;\n\nexport const memberDirectoryPageSchema = paginatedSchema(memberSummarySchema);\nexport type MemberDirectoryPage = z.infer<typeof memberDirectoryPageSchema>;\n\n/** A suspension in force. */\nexport const suspensionSchema = z.object({\n since: z.iso.datetime(),\n reason: z.string(),\n /** Who suspended them (0.20.0: the person, live); null when a script did. */\n by: personSchema.nullable(),\n});\nexport type Suspension = z.infer<typeof suspensionSchema>;\n\n/** One member, as staff see them. */\nexport const memberDetailSchema = memberSummarySchema.extend({\n headline: z.string().nullable(),\n /** Their city, as declared on their profile. */\n city: z.string().nullable(),\n counts: z.object({\n posts: z.number().int().min(0),\n polls: z.number().int().min(0),\n comments: z.number().int().min(0),\n /** Reports filed about their posts, polls and comments that are still up. */\n reportsAgainst: z.number().int().min(0),\n /** Tickets they have raised. */\n tickets: z.number().int().min(0),\n }),\n suspension: suspensionSchema.nullable(),\n /** What the asking staff member may do to this member. */\n viewer: z.object({\n canSuspend: z.boolean(),\n /** Roles the asker may grant or revoke on this member (never their own). */\n grantableRoles: z.array(platformRoleSchema),\n /** May clear this member's forgotten MPIN (superadmin, someone else). */\n canResetMpin: z.boolean(),\n /** Capabilities the asker may grant or revoke on this member (never their own) (0.9.0). */\n grantableCapabilities: z.array(capabilitySchema),\n /** May give them a membership (0.12.0): they hold none, and the asker may, and it is not themselves. */\n canGrantMembership: z.boolean(),\n /**\n * May take their membership away (0.12.0): founding, coupon or granted\n * (a paid one is refunded instead), and the asker may, and not their own.\n */\n canRevokeMembership: z.boolean(),\n /** May list their payments (0.12.0): support, managers, superadmin. */\n canReadPayments: z.boolean(),\n /**\n * May see their membership and plan (0.12.0): support, managers,\n * superadmin. Moderators may not: `membership` and `plan` come null to\n * them, which is not \"not a member\".\n */\n canReadMembership: z.boolean(),\n }),\n /** Whether they take part (0.12.0). Staff always do. */\n standing: standingSchema,\n /** Their membership (0.12.0), or null (a viewer, staff holding none, or an asker who may not see it). */\n membership: membershipSchema.nullable(),\n /** The plan in force now and when all their plan time ends (0.12.0), or null (none, or not the asker's to see). */\n plan: z.object({ tier: planTierSchema, endsAt: z.iso.datetime() }).nullable(),\n /** The capabilities they hold (0.9.0), e.g. `create_communities`. */\n capabilities: z.array(capabilitySchema),\n /** Whether they have set an MPIN. Only meaningful for staff. */\n mpinSet: z.boolean(),\n});\nexport type MemberDetail = z.infer<typeof memberDetailSchema>;\n\n/** `POST /members/:memberId/suspension`. The reason is on record in the audit log. */\nexport const suspendMemberBodySchema = z.object({\n reason: z.string().trim().min(SUSPENSION_REASON_MIN).max(SUSPENSION_REASON_MAX),\n});\nexport type SuspendMemberBody = z.infer<typeof suspendMemberBodySchema>;\n"]}
@@ -40,6 +40,25 @@ export declare const membershipKindSchema: z.ZodEnum<{
40
40
  granted: "granted";
41
41
  }>;
42
42
  export type MembershipKind = z.infer<typeof membershipKindSchema>;
43
+ /**
44
+ * A stored membership's state (0.20.0: memberships are their own rows, so
45
+ * none is ever erased). `active` is held now, at most one per member; `ended`
46
+ * is history: a refunded payment, a staff revoke, or the account's deletion,
47
+ * said by `MEMBERSHIP_END_REASON_VALUES`.
48
+ */
49
+ export declare const MEMBERSHIP_STATUS_VALUES: readonly ["active", "ended"];
50
+ export declare const membershipStatusSchema: z.ZodEnum<{
51
+ active: "active";
52
+ ended: "ended";
53
+ }>;
54
+ export type MembershipStatus = z.infer<typeof membershipStatusSchema>;
55
+ export declare const MEMBERSHIP_END_REASON_VALUES: readonly ["refunded", "revoked", "account_deleted"];
56
+ export declare const membershipEndReasonSchema: z.ZodEnum<{
57
+ refunded: "refunded";
58
+ revoked: "revoked";
59
+ account_deleted: "account_deleted";
60
+ }>;
61
+ export type MembershipEndReason = z.infer<typeof membershipEndReasonSchema>;
43
62
  /** ⚠ Stored: append only. Highest last is NOT implied: compare with `PLAN_TIER_RANK`. */
44
63
  export declare const PLAN_TIER_VALUES: readonly ["premium", "business"];
45
64
  export declare const planTierSchema: z.ZodEnum<{